.so 파일에 심볼을 나열하는 방법


486

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

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


플랫폼은 차이를 만듭니다. Apple은 GCC 4.0을 제공하지만 및 (IIRC) 와 nm같은 일부 옵션에는 응답하지 않습니다 . -D-g
jww

Mac OS에서는 아무 것도 인쇄하지 않습니다.
IgorGanapolsky

3
@jww 왜냐하면 nmGNU가 아닌 BSD이기 때문입니다 nm.
OrangeDog

답변:


576

기호를 나열하는 표준 도구는입니다 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

35
그러나 항상 .so 파일에서는 작동하지 않으므로 다른 답변에서 언급 한 "readelf"솔루션을 사용해야 할 수도 있습니다.
Brooks Moses

9
nm의 OS X 버전에는 심볼을 디맨 글링하는 '-C'옵션이 없습니다. c ++ filt를 대신 사용할 수 있습니다. 스크립트 예 : v8.googlecode.com/svn/branches/bleeding_edge/tools/mac-nm nm -g /usr/lib/libstdc++.6.dylib | c ++ filt -p -i
fredbaba

5
readelf -Ws당신에게 보여줄 것이다 모든 기호 및 nm -g단지 외부에서 볼 수 상징을 보여줍니다. 여러 심볼 파일을 검사하고 명령 교환을 시작하면 혼란 스러울 수 있습니다.
Andrew B

3
나는 또한 objectdump -TC목록에 추가 할 것 입니다. 와는 반대로 readelf -Ws맹 글링 된 이름은 표시되지 않습니다.
Yan Foto

2
대한 @BrooksMoses .so파일은 추가해야 할 수도 있습니다 --dynamicnm명령 줄.
user7610

84

귀하의 경우 .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}';

19
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $ 8}'; 정규 표현식은 훌륭하지만 때로는 약간의 어려움이 먼 길을갑니다.
deft_code


42

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

nm -D libNAME.so

다른 사람들이보고 한 정적 라이브러리

nm -g libNAME.a

35

-fvisibility = hidden#pragma GCC 가시성 이 영향을 미치지 않는지 궁금해 했습니다. 모든 기호가 nm 로 항상 표시 되었기 때문에이 게시물을 읽음으로써 readelfobjdump가 나타났습니다. 실제로 두 개의 기호 테이블 인 것 같습니다 .

  • nm로 나열 할 수있는 것
  • readelfobjdump로 나열 할 수있는 것

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


3
감사합니다! 이것은 때때로 "nm"에 .so 파일에 대한 기호가 표시되지 않는 이유를 설명합니다.
Brooks Moses

10
nm -D-동적 심볼 테이블을 나열 할 수 있습니다
pt123

19

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


11

각 심볼의 소스를 얻으려면 nm 플래그에 -l을 추가하십시오. 라이브러리가 디버깅 정보 (gcc -g)로 컴파일 된 경우 소스 파일 및 행 번호 여야합니다. Konrad가 말했듯이, 현재 객체 파일 / 정적 라이브러리는 알 수 없습니다.


11

Android .so파일의 경우 NDK 툴체인은 다른 답변에서 언급 된 필수 도구 인 readelf, objdump및을 제공 nm합니다.


9

nm -gbinutils 툴체인에서이 툴을 사용할 수 있습니다 . 그러나 해당 소스를 항상 쉽게 이용할 수있는 것은 아닙니다. 실제로이 정보를 항상 검색 할 수 있는지 잘 모르겠습니다. 아마도 objcopy더 많은 정보를 공개 할 것 입니다.

/ 편집 : 도구 이름은 물론 nm입니다. 이 플래그 -g는 내 보낸 심볼 만 표시하는 데 사용됩니다.


6

nm -g는 extern 변수를 나열하며, 이는 내 보낸 기호가 아닙니다. 정적이 아닌 파일 범위 변수 (C)는 모두 extern 변수입니다.

nm -D는 동적 테이블에 기호를 나열하며 dlsym로 주소를 찾을 수 있습니다.

nm-버전

GNU nm 2.17.50.0.6-12.el5 20061020


1

당신은 단지 문자가 있는지 알고 싶다면 제시 사용할 수

objdump -h /path/to/object

또는 디버그 정보를 나열하기 위해

objdump -g /path/to/object
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.