programing

.so 파일에 기호를 나열하려면 어떻게 해야 합니까?

newsource 2022. 10. 26. 21:05

.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용.soNDK 툴 체인에는 다른 답변에서 언급한 필수 툴이 포함되어 있습니다.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가 아무런 영향을 미치지 않는지 계속 고민하다가 readelfobjdump를 안내하는 이 게시물이 발견되었고, 실제로 두 개의 기호 테이블이 있는 것 같다는 것을 깨닫게 되었습니다.

  • nm과 함께 나열할 수 있는 것
  • readelfobjdump와 함께 나열할 수 있는 것

전자는 strip 또는 -s 스위치로 제거할 수 있는 디버깅 기호를 포함하고 있으며, 링커 또는 install 명령어로 지정할 수 있습니다.또한 nm이 더 이상 아무것도 나열하지 않더라도 내보낸 기호는 ELF "동적 기호 테이블"(후자)에 있기 때문에 내보내집니다.

를 사용할 수 있습니다.nm -gBinutils 툴 체인의 툴입니다.그러나 그 출처를 항상 쉽게 구할 수 있는 것은 아닙니다.이 정보가 항상 검색될 수 있을지는 잘 모르겠습니다.아마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