[linux] 공유 객체에서 모든 심볼을 내보내는 방법은 무엇입니까?

공유 객체 (dll)가 있습니다. 그로부터 모든 심볼이 내보내지는 것을 어떻게 알 수 있습니까?



답변

“공유 오브젝트”(일반적으로 AIX의 공유 라이브러리), UNIX 공유 라이브러리 또는 Windows DLL이 있습니까? 이것들은 모두 다른 것들이며, 당신의 질문은 그들 모두를 혼란시킵니다 🙁

  • AIX 공유 오브젝트의 경우을 사용하십시오 dump -Tv /path/to/foo.o.
  • ELF 공유 라이브러리의 경우 readelf -Ws /path/to/libfoo.so, 또는 (GNU nm가있는 경우)를 사용하십시오 nm -D /path/to/libfoo.so.
  • 비 ELF UNIX 라이브러리, 제발 상태 공유를 들어 UNIX 당신이에 관심이됩니다.
  • Windows DLL의 경우을 사용하십시오 dumpbin /EXPORTS foo.dll.

답변

objdump는 리눅스에서 또 다른 좋은 것입니다.


답변

Windows DLL 파일이고 OS가 Linux 인 경우 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
...


답변

* nix 점검 nm에서. Windows에서는 프로그램 Dependency Walker를 사용하십시오.


답변

man nm 참조

GNU nm은 객체 파일 objfile의 기호를 나열합니다 …. 객체 파일이 인수로 나열되지 않으면 nm는 파일을 a.out으로 가정합니다.


답변

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


답변

크로스 플랫폼 방식 (크로스 플랫폼 자체뿐만 아니라 적어도 둘 다 *.so와 함께 작동 *.dll)리버스 엔지니어링 프레임 워크 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