.so 파일에 기호를 나열하려면 어떻게 해야 합니까?
.so 파일에서 내보내는 기호를 나열하려면 어떻게 해야 합니까?가능하면 소스도 알고 싶습니다(예를 들어 정적 라이브러리에서 불러오는 경우).
차이가 있다면 gcc 4.0.2를 사용하고 있습니다.
기호를 나열하는 표준 도구는 다음과 같습니다.nm
, 다음과 같이 간단하게 사용할 수 있습니다.
nm -gD yourLib.so
C++ 라이브러리의 심볼을 보려면 심볼을 분리하는 "-C" 옵션을 추가합니다(더 읽기 쉽게 분리).
nm -gDC yourLib.so
.so 파일이 엘프 형식인 경우 다음 두 가지 옵션이 있습니다.
어느 하나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
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
만약 당신이.so
파일은 엘프 형식입니다.readelf 프로그램을 사용하여 바이너리에서 기호 정보를 추출할 수 있습니다.이 명령어는 기호 테이블을 제공합니다.
readelf -Ws /usr/lib/libexample.so
여기서 정의된 것만 추출해야 합니다..so
파일이 참조하는 라이브러리가 아닌 파일입니다.이 경우 일곱 번째 열에는 숫자가 포함되어야 합니다.간단한 regex를 사용하여 추출할 수 있습니다.
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
또는 Caspin이 제안한 바와 같이:
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
Android용.so
NDK 툴 체인에는 다른 답변에서 언급한 필수 툴이 포함되어 있습니다.readelf
,objdump
그리고.nm
.
objdump -TC /usr/lib/libexample.so
공유 라이브러리 libNAME.so의 경우 Linux에서 기호를 표시하려면 -D 스위치가 필요했습니다.
nm -D libNAME.so
및 다른 사용자가 보고한 정적 라이브러리의 경우
nm -g libNAME.a
모든 기호가 항상 nm으로 표시되는데 왜 -fvisibility=hidden과 #visibilityma GCC visibility가 아무런 영향을 미치지 않는지 계속 고민하다가 readelf와 objdump를 안내하는 이 게시물이 발견되었고, 실제로 두 개의 기호 테이블이 있는 것 같다는 것을 깨닫게 되었습니다.
- nm과 함께 나열할 수 있는 것
- readelf 및 objdump와 함께 나열할 수 있는 것
전자는 strip 또는 -s 스위치로 제거할 수 있는 디버깅 기호를 포함하고 있으며, 링커 또는 install 명령어로 지정할 수 있습니다.또한 nm이 더 이상 아무것도 나열하지 않더라도 내보낸 기호는 ELF "동적 기호 테이블"(후자)에 있기 때문에 내보내집니다.
를 사용할 수 있습니다.nm -g
Binutils 툴 체인의 툴입니다.그러나 그 출처를 항상 쉽게 구할 수 있는 것은 아닙니다.이 정보가 항상 검색될 수 있을지는 잘 모르겠습니다.아마objcopy
에 자세한 내용을 나타냅니다.
/EDIT: 구구이 / / / / / / / / / / 。nm
... ★★★★★★★★★★★★.-g
이치노
기호가 존재하는지 알고 싶다면 다음을 사용할 수 있습니다.
objdump -h /path/to/object
또는 디버깅 정보를 표시합니다.
objdump -g /path/to/object
nm -g는 extern 변수를 나열합니다.export된 기호는 필요하지 않습니다.비정적 파일 범위 변수(C)는 모두 외부 변수입니다.
nm -D는 dlsym별로 주소를 찾을 수 있는 동적 테이블에 기호를 나열합니다.
nm --version
GNU nm 2.17.50.0.6-12.el5 20061020
nm 플래그에 -l을 추가하여 각 기호의 소스를 가져옵니다.라이브러리가 디버깅 정보(gcc - g)로 컴파일 되어 있는 경우는, 소스 파일과 행 번호가 됩니다.Konrad가 말했듯이 오브젝트 파일/스태틱 라이브러리는 현시점에서는 알 수 없습니다.
언급URL : https://stackoverflow.com/questions/34732/how-do-i-list-the-symbols-in-a-so-file
'programing' 카테고리의 다른 글
파일에 기록하고 stdout에 인쇄하는 로거 구성 (0) | 2022.10.26 |
---|---|
entity-manager가 있는 경우 session 개체를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.26 |
MariaDB 10의 FULLTEXT 색인 (0) | 2022.10.26 |
MySQL 데이터베이스에 있는 테이블의 스키마를 표시하려면 어떻게 해야 합니까? (0) | 2022.10.26 |
잘못된 매직 넘버 오류는 무엇입니까? (0) | 2022.10.26 |