.so 파일의 기호를 어떻게 나열합니까?
-
09-06-2019 - |
문제
.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)
당신은 사용할 수 있습니다 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