2009-08-06 3 views
101

공유 개체 (dll)가 있습니다. 어떻게하면 모든 기호가 수출되는지 알 수 있습니까?공유 객체에서 모든 심볼을 내보내는 방법을 어떻게 알 수 있습니까?

+1

개체의 모든 기호가 내보내집니다 ("내부"기능조차도). 링커를 준비 할 수 있도록 컴파일러에 선언해야합니다. Ryan Fox와 같이 헤더 파일을 사용하여이 작업을 수행합니다. –

+4

Chris Lutz는 실수로 모든 심볼을 재배치 가능한 오브젝트 파일에서 내보내는 것이 아니라 공유 라이브러리에서 가져 오는 것이 아니라고 오인됩니다. –

+0

http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams

답변

161

"공유 오브젝트"(보통 AIX의 공유 라이브러리), UNIX 공유 라이브러리 또는 Windows DLL이 있습니까? 이 모든 다른 것들, 그리고 귀하의 질문은 AIX 공유 오브젝트를 들어 그들에게 모든 :-(

  • 을 conflates, 엘프 공유 라이브러리를 들어.
  • dump -Tv /path/to/foo.o를 사용 readelf -Ws /path/to/libfoo.so, 또는 사용 (당신이 GNU의 나노있는 경우) nm -D /path/to/libfoo.so. 비 ELF UNIX 공유 라이브러리에 대한
  • , UNIX 당신이에 관심이있는 을 명시하시기 바랍니다.
  • 를 윈도우 DLL를 들어, dumpbin /EXPORTS foo.dll를 사용합니다.
+6

GNU/Linux에서는 그러한 유틸리티가 없습니다.«dumpbin». 그리고 질문은 리눅스로 태그가 붙어 있습니다. –

+2

매우 유용합니다. 그런 개요가 좋습니다. 'nm' 또한'-D' 옵션을 제외하고 MacOSX에서 작동합니다. 아니면'blu install binutils'을 설치하고'gnm'을 통해 GNU 버전을 사용하십시오.GNU'nm'의 경우'--demangle'도 유용합니다. 또한'gobjdump'. – Albert

+0

사실, 하나의 유틸리티에서 공유 라이브러리, dll 및 개체 채우기로 모두 작업 할 수 있습니다. [이 답변보기] (https://stackoverflow.com/a/46772557/2388257). –

8

는 파일 a.out의 가정 nm의 오브젝트 파일의 기호를 나열 나노 man nm

GNU는 .... 어떤 물체 경우 파일을 인수로 표시됩니다 objfile 참조하십시오.
+7

btw : 공유 객체의 경우 -D/- dynamic 옵션이 필요합니다. 예 : nm -D libmagic.so – VolkerK

0

일반적으로 심볼에 액세스하기 위해 코드에 포함시키는 헤더 파일도 있습니다.

19

objdump는 리눅스에서 좋은 또 하나입니다.

+0

또한 AIX – pitseeker

11

On * nix 확인 nm. 윈도우 프로그램을 사용에 Dependency Walker

+2

에서 사용 가능합니다. 특히, nm -defined-only -g something.so'는 라이브러리와 extern 심볼에 정의 된 심볼을 출력합니다. 이것은 OP가 원하는 것일 것입니다. –

6

사용 : nm --demangle <libname>.so

+1

'nm : /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6 : no symbols'. 'readelf' 또는'-D' 플래그가 작동합니다. –

10

는 윈도우 DLL 파일입니다 당신의 OS는 리눅스가 다음 winedump 사용하는 경우 :

$ winedump -j export pcre.dll 

Contents of pcre.dll: 229888 bytes 

Exports table: 

    Name:   pcre.dll 
    Characteristics: 00000000 
    TimeDateStamp: 53BBA519 Tue Jul 8 10:00:25 2014 
    Version:   0.00 
    Ordinal base: 1 
    # of functions: 31 
    # of Names:  31 
Addresses of functions: 000375C8 
Addresses of name ordinals: 000376C0 
Addresses of names: 00037644 

    Entry Pt Ordn Name 
    0001FDA0  1 pcre_assign_jit_stack 
    000380B8  2 pcre_callout 
    00009030  3 pcre_compile 
... 
3

크로스 플랫폼 방식 (뿐만 아니라 십자가를 플랫폼 자체는 물론 최소한 *.so*.dll 모두 사용)reverse-engineering framework radare2을 사용합니다. 예 : 보너스로

$ rabin2 -s glew32.dll | head -n 5 
[Symbols] 
vaddr=0x62afda8d paddr=0x0005ba8d ord=000 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_multisample 
vaddr=0x62afda8e paddr=0x0005ba8e ord=001 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_tbuffer 
vaddr=0x62afda8f paddr=0x0005ba8f ord=002 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_3DFX_texture_compression_FXT1 
vaddr=0x62afdab8 paddr=0x0005bab8 ord=003 fwd=NONE sz=0 bind=GLOBAL type=FUNC name=glew32.dll___GLEW_AMD_blend_minmax_factor 

, rabin2 예를 를 들어, C++ 이름 맹 글링을 인식 (도 .so 파일) : 객체

$ rabin2 -s /usr/lib/libabw-0.1.so.1.0.1 | head -n 5 
[Symbols] 
vaddr=0x00027590 paddr=0x00027590 ord=124 fwd=NONE sz=430 bind=GLOBAL type=FUNC name=libabw::AbiDocument::isFileFormatSupported 
vaddr=0x0000a730 paddr=0x0000a730 ord=125 fwd=NONE sz=58 bind=UNKNOWN type=FUNC name=boost::exception::~exception 
vaddr=0x00232680 paddr=0x00032680 ord=126 fwd=NONE sz=16 bind=UNKNOWN type=OBJECT name=typeinfoforboost::exception_detail::clone_base 
vaddr=0x00027740 paddr=0x00027740 ord=127 fwd=NONE sz=235 bind=GLOBAL type=FUNC name=libabw::AbiDocument::parse 

작품이 너무 파일 :

$ g++ test.cpp -c -o a.o 
$ rabin2 -s a.o | head -n 5 
Warning: Cannot initialize program headers 
Warning: Cannot initialize dynamic strings 
Warning: Cannot initialize dynamic section 
[Symbols] 
vaddr=0x08000149 paddr=0x00000149 ord=006 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::piecewise_construct 
vaddr=0x08000149 paddr=0x00000149 ord=007 fwd=NONE sz=1 bind=LOCAL type=OBJECT name=std::__ioinit 
vaddr=0x080000eb paddr=0x000000eb ord=017 fwd=NONE sz=73 bind=LOCAL type=FUNC name=__static_initialization_and_destruction_0 
vaddr=0x08000134 paddr=0x00000134 ord=018 fwd=NONE sz=21 bind=LOCAL type=FUNC name=_GLOBAL__sub_I__Z4funcP6Animal 
관련 문제