g++로 컴파일하면 어떤 라이브러리를 참조하나요?

송지석의 이미지

gcc로는 잘 되는 헬로월드 소스를 g++로 컴파일 했습니다.

그런데 실행이 안되는군요. shared library 로딩에 실패했다면서..

실행하고 있는 데가 임베디드라..

일단 지금은 c용 라이브러리만 카피해논 것 같은데요

libstdc++.a를 /lib 디렉토리에 카피해보아도 같은 현상이 발생하네요.

그래서 라이브러리를 stdio를 쓰게 하려고 선언해줬는데도 같군요...

#include <stdio.h>

int main()
{
printf("hello!\n");
return 0;
}

어떤 라이브버리가 필요할까요? 무얼 카피해 넣어야 실행될 지...

respiro의 이미지

$ldd 실행파일이름

하시면 관련 라이브러리를 보여 줄겁니다.

보통 이런식으로 타겟에 올릴때는 관련 라이브러리만 찾아서
올려준다고 하더군요....

전투는 우리를 공격하는 외부의 적에 대항해서 뿐만 아니라
우리 자신의 내부에서 발견되는 적들의 사고와 모델에 대항해서 시작한다.
(솔라나스와 헤티노의 "제 3영화를 위하여" 中)

송지석의 이미지

답변 감사합니다.
그런데 그렇게 해보니까

[rommance@localhost test]$ ldd hello_new
not a dynamic executable

크로스컴파일러면 크로스로 ldd도 있어야 하나요?

제가 빌드한 컴파일러엔 arm-linux-ldd는 없는데요.. 음....

크로스로 안하고 하면
[rommance@localhost test]$ g++ hello.cc -o pc_h
[rommance@localhost test]$ ldd pc_h
libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0x40031000)
libm.so.6 => /lib/i686/libm.so.6 (0x40075000)
libc.so.6 => /lib/i686/libc.so.6 (0x42000000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
이렇게 하면 나옵니다만..
이것이 무슨 의미인지 조언해주실 수 있을까요?
libm을 hello가 사용한다는 것일까요?
libstdc++-libc6.2-2.so.3 는 타겟에다가 libstdc++-libc6.2-2.so.3를 /usr/lib/libstdc++-libc6.2-2.so.3로 링크걸고 /usr/lib/libstdc++-libc6.2-2.so.3에 libstdc++-libc6.2-2.so.3를 카피해놓으면 된다는 것일까요?
libm은 math 라이브러리인데 그건 사용하지 않아도 될것 같은데.. 사용하는가보군요...

============
되는군요.
libcstdc++-libc6.2.-2.so.3은 크로스 환경엔 없더군요.
일단 libm을 카피해놓으니 됩니다.
http://www.busybox.net/lists/busybox/2001-December/010568.html
위주소에서 관련 내용을 찾았습니다.
ldd가 없을 때는 objdump에서 x옵션으로 grep NEEDED로 찾으라고 하네요..
이렇게 찾았을 때 PC쪽 오브젝트에서는 libcstdc++-libc6.2.-2.so.3가 필요하다고 나오고 크로스용에서는 안나왔습니다.
[rommance@localhost test]$ arm-linux-objdump -x hello | grep NEEDED
NEEDED libm.so.6
NEEDED libc.so.6
[rommance@localhost test]$ arm-linux-objdump -x pc_h | grep NEEDED
NEEDED libstdc++-libc6.2-2.so.3
NEEDED libm.so.6
NEEDED libc.so.6

그런데 왜 저기에 math 라이브러리가 필요한지. -- 알수가 없네요. 스트립해도 500K나 되는데 ㅜㅜ

kslee80의 이미지

크로스로 ldd 도 있어야 확실하게 확인 가능합니다;
물론, CPU 만 틀리고 OS 는 똑같다면
크로스 ldd 대신 글에 쓰신 방법대로 확인해도 되긴 합니다만
CPU 에 따라서 라이브러리도 바뀌어야 되기에...확실한 방법은 아닙니다

그리고 ldd 의 아웃풋 해석하신거 맞게 해석하셨습니다.
조금 부연설명하자면,
앞에 나오는 이름이 바이너리에서 사용하는 라이브러리 이름이구
뒤에 패스가 현재 시스템상에 해당 라이브러리의 위치를 의미합니다.
타겟 시스템상에 꼭 똑같은 위치에 넣지 않아도 됩니다.
로더가 라이브러리를 찾는 디렉토리상에 넣어두면 됩니다.

그리고 libm 같은 경우에는....
libstdc++ 라이브러리가 libm 을 사용하는듯 합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.