.so 파일에서 내보내는 심볼을 어떻게 나열합니까? 가능하면 소스를 알고 싶습니다 (예 : 정적 라이브러리에서 가져온 경우).
차이가 있다면 gcc 4.0.2를 사용하고 있습니다.
nm
GNU가 아닌 BSD이기 때문입니다 nm
.
.so 파일에서 내보내는 심볼을 어떻게 나열합니까? 가능하면 소스를 알고 싶습니다 (예 : 정적 라이브러리에서 가져온 경우).
차이가 있다면 gcc 4.0.2를 사용하고 있습니다.
nm
GNU가 아닌 BSD이기 때문입니다 nm
.
답변:
기호를 나열하는 표준 도구는입니다 nm
. 간단히 다음과 같이 사용할 수 있습니다.
nm -gD yourLib.so
C ++ 라이브러리의 심볼을 보려면 심볼을 엉 키게하는 "-C"옵션을 추가하십시오 (더 읽기 쉬운 demangled).
nm -gDC 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
readelf -Ws
당신에게 보여줄 것이다 모든 기호 및 nm -g
단지 외부에서 볼 수 상징을 보여줍니다. 여러 심볼 파일을 검사하고 명령 교환을 시작하면 혼란 스러울 수 있습니다.
objectdump -TC
목록에 추가 할 것 입니다. 와는 반대로 readelf -Ws
맹 글링 된 이름은 표시되지 않습니다.
.so
파일은 추가해야 할 수도 있습니다 --dynamic
에 nm
명령 줄.
귀하의 경우 .so
파일이 ELF 형식으로, 당신은 바이너리에서 추출 심볼 정보에 readelf 프로그램을 사용할 수 있습니다. 이 명령은 심볼 테이블을 제공합니다.
readelf -Ws /usr/lib/libexample.so
이 .so
파일에 정의 된 라이브러리 만이 아니라이 파일에 정의 된 파일 만 추출해야 합니다. 이 경우 일곱 번째 열에는 숫자가 포함되어야합니다. 간단한 정규식을 사용하여 추출 할 수 있습니다.
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
또는 Caspin이 제안한대로 :
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
왜 -fvisibility = hidden 및 #pragma GCC 가시성 이 영향을 미치지 않는지 궁금해 했습니다. 모든 기호가 nm 로 항상 표시 되었기 때문에이 게시물을 읽음으로써 readelf 및 objdump가 나타났습니다. 실제로 두 개의 기호 테이블 인 것 같습니다 .
전자에는 링커 또는 설치 명령에 제공 할 수 있는 strip 또는 -s 스위치 로 제거 할 수있는 디버깅 기호가 포함되어 있다고 생각합니다 . nm에서 더 이상 아무 것도 나열하지 않더라도 내 보낸 심볼은 ELF "동적 심볼 테이블"에 있기 때문에 여전히 내보내집니다.
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)
Android .so
파일의 경우 NDK 툴체인은 다른 답변에서 언급 된 필수 도구 인 readelf
, objdump
및을 제공 nm
합니다.
nm
같은 일부 옵션에는 응답하지 않습니다 .-D
-g