문제

.so 파일에서 내보내는 기호를 어떻게 나열합니까?가능하다면 출처도 알고 싶습니다(예:정적 라이브러리에서 가져온 경우).

차이점이 있다면 gcc 4.0.2를 사용하고 있습니다.

도움이 되었습니까?

해결책

기호를 나열하는 표준 도구는 다음과 같습니다. nm, 다음과 같이 간단하게 사용할 수 있습니다.

nm -g yourLib.so

C++ 라이브러리의 기호를 보려면 기호를 demangle하는 "-C" 옵션을 추가하세요(훨씬 더 읽기 쉽습니다).

nm -gC yourLib.so

.so 파일이 elf 형식인 경우 다음 두 가지 옵션이 있습니다.

어느 하나 objdump (-C C++ 해체에도 유용합니다):

$ objdump -TC libz.so

libz.so:     file format elf64-x86-64

DYNAMIC SYMBOL TABLE:
0000000000002010 l    d  .init  0000000000000000              .init
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000  w   D  *UND*  0000000000000000              _ITM_deregisterTMCloneTable

또는 사용 readelf:

$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND
     1: 0000000000002010     0 SECTION LOCAL  DEFAULT   10
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (14)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __errno_location@GLIBC_2.2.5 (14)
     4: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND _ITM_deregisterTMCloneTable

다른 팁

만약 당신의 .so 파일이 elf 형식인 경우 readelf 프로그램을 사용하여 바이너리에서 기호 정보를 추출할 수 있습니다.이 명령은 기호 테이블을 제공합니다.

readelf -Ws /usr/lib/libexample.so

여기에 정의된 항목만 추출해야 합니다. .so 파일이 참조하는 라이브러리에는 없습니다.이 경우 일곱 번째 열에는 숫자가 포함되어야 합니다.간단한 정규식을 사용하여 추출할 수 있습니다.

readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'

또는 제안한대로 카스핀,:

readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
objdump -TC /usr/lib/libexample.so

공유 라이브러리 libNAME.so의 경우 Linux에서 기호를 보려면 -D 스위치가 필요했습니다.

nm -D libNAME.so

그리고 다른 사람들이 보고한 정적 라이브러리의 경우

nm -g libNAME.a

왜인지 계속 궁금했는데 -f가시성=숨김 그리고 #pragma GCC 가시성 모든 기호가 항상 표시되어 있기 때문에 아무런 영향을 미치지 않는 것 같습니다. nm - 나를 가리키는 이 게시물을 찾을 때까지 읽기 그리고 objdump, 실제로 존재하는 것 같다는 것을 깨달았습니다. 기호 테이블:

  • 당신이 나열 할 수있는 것 nm
  • 당신이 나열 할 수있는 것 읽기 그리고 objdump

전자에는 제거할 수 있는 디버깅 기호가 포함되어 있다고 생각합니다. 조각 또는 링커에 제공할 수 있는 -s 스위치 또는 설치하다 명령.그리고 nm이 더 이상 아무 것도 나열하지 않더라도 내보낸 기호는 후자인 ELF "동적 기호 테이블"에 있기 때문에 계속 내보내집니다.

각 기호의 소스를 얻으려면 nm 플래그에 -l을 추가해 보십시오.라이브러리가 디버깅 정보(gcc -g)로 컴파일된 경우 이는 소스 파일과 줄 번호여야 합니다.Konrad가 말했듯이 개체 파일/정적 라이브러리는 현재로서는 알려지지 않았을 것입니다.

안드로이드의 경우 .so 파일을 사용하는 경우 NDK 툴체인에는 다른 답변에 언급된 필수 도구가 함께 제공됩니다. readelf, objdump 그리고 nm.

C++의 경우 .so 파일, 궁극의 nm 명령은 nm --demangle --dynamic --defined-only --extern-only <my.so>

# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)

원천: https://stackoverflow.com/a/43257338

당신은 사용할 수 있습니다 nm -g binutils 툴체인의 도구입니다.그러나 해당 소스를 항상 쉽게 사용할 수 있는 것은 아닙니다.그리고 실제로 이 정보가 항상 검색될 수 있는지조차 확신할 수 없습니다.아마도 objcopy 추가 정보를 공개합니다.

/편집하다:도구 이름은 당연히 nm.깃발 -g 내보낸 기호만 표시하는 데 사용됩니다.

nm -g 내보낸 기호가 필요하지 않은 extern 변수를 나열합니다.비정적 파일 범위 변수(C에서)는 모두 외부 변수입니다.

nm -D는 동적 테이블의 기호를 나열하며, dlsym을 통해 해당 주소를 찾을 수 있습니다.

nm --버전

GNU nm 2.17.50.0.6-12.el5 20061020

기호가 있는지 알고 싶다면 현재의 당신이 사용할 수있는

objdump -h /path/to/object

또는 디버그 정보를 나열하려면

objdump -g /path/to/object
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top