공유 개체 (dll)가 있습니다. 어떻게하면 모든 기호가 수출되는지 알 수 있습니까?공유 객체에서 모든 심볼을 내보내는 방법을 어떻게 알 수 있습니까?
답변
"공유 오브젝트"(보통 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
를 사용합니다.
GNU/Linux에서는 그러한 유틸리티가 없습니다.«dumpbin». 그리고 질문은 리눅스로 태그가 붙어 있습니다. –
매우 유용합니다. 그런 개요가 좋습니다. 'nm' 또한'-D' 옵션을 제외하고 MacOSX에서 작동합니다. 아니면'blu install binutils'을 설치하고'gnm'을 통해 GNU 버전을 사용하십시오.GNU'nm'의 경우'--demangle'도 유용합니다. 또한'gobjdump'. – Albert
사실, 하나의 유틸리티에서 공유 라이브러리, dll 및 개체 채우기로 모두 작업 할 수 있습니다. [이 답변보기] (https://stackoverflow.com/a/46772557/2388257). –
일반적으로 심볼에 액세스하기 위해 코드에 포함시키는 헤더 파일도 있습니다.
On * nix 확인 nm. 윈도우 프로그램을 사용에 Dependency Walker
에서 사용 가능합니다. 특히, nm -defined-only -g something.so'는 라이브러리와 extern 심볼에 정의 된 심볼을 출력합니다. 이것은 OP가 원하는 것일 것입니다. –
사용 : nm --demangle <libname>.so
'nm : /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6 : no symbols'. 'readelf' 또는'-D' 플래그가 작동합니다. –
는 윈도우 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
...
크로스 플랫폼 방식 (뿐만 아니라 십자가를 플랫폼 자체는 물론 최소한 *.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
- 1. 공유 라이브러리에서 심볼을 내보내는 방법
- 2. 심볼을 내보내는 두 개의 공유 라이브러리가있는 dlopen
- 3. Linux : 장치 노드를 내보내는 모듈을 어떻게 알 수 있습니까?
- 4. Wicket Page 객체에서 변경되었음을 어떻게 알 수 있습니까?
- 5. 모든 이미지가 문서에로드되었는지 어떻게 알 수 있습니까?
- 6. 어떻게 알 수 있습니까?
- 7. 어떻게 libpython.a에 링크 할 수 있습니까? 그런 런타임 링커는 libpython.a에있는 모든 심볼을 찾을 수 있습니까?
- 8. MSDN : 클래스/인터페이스를 상속/구현하는 방법을 어떻게 알 수 있습니까?
- 9. C#에서 이벤트를 구독하는 방법을 어떻게 알 수 있습니까?
- 10. WPF ValidationRule : 유효성 검사를하는 방법을 어떻게 알 수 있습니까?
- 11. Java는 배열을 반복하는 방법을 어떻게 알 수 있습니까?
- 12. 개체가 특정 방법을 구현하는지 어떻게 알 수 있습니까?
- 13. 공유 이벤트 핸들러는 처리중인 컨트롤의 이벤트를 어떻게 알 수 있습니까?
- 14. 어떻게 항상 Mercurial의 모든 태그에 대해 알 수 있습니까?
- 15. 우분투 리눅스에서 .la 파일의 심볼을 어떻게 덤프 할 수 있습니까?
- 16. mapView가로드되었는지 어떻게 알 수 있습니까?
- 17. 내 모든 조치 방법 이름이 정확한지 어떻게 알 수 있습니까?
- 18. 디렉토리의 모든 스크립트 유형을 어떻게 알 수 있습니까?
- 19. 안드로이드에서 main.xml 파일에있는 모든 ID를 어떻게 알 수 있습니까?
- 20. PHP : 문자열의 모든 문자가 대문자인지 어떻게 알 수 있습니까?
- 21. , formatblock 명령에 사용할 수있는 모든 파라를 어떻게 알 수 있습니까?
- 22. 응용 프로그램을 종료하는 방법을 알 수 있습니다.
- 23. 오브젝트 파일에서 어떤 심볼을 내보낼 지 알 수있는 방법이 있습니까?
- 24. 트리의 최소 깊이는 어떻게 알 수 있습니까?
- 25. 예외가있을 수 있음을 어떻게 알 수 있습니까?
- 26. 공유 포인트 포털 웹 사이트에서 어떤 공유 포인트 버전이 실행되고 있는지 어떻게 알 수 있습니까?
- 27. 변수가 Python으로 선언되었는지 어떻게 알 수 있습니까?
- 28. 최근에 오류가 급증했는지 어떻게 알 수 있습니까?
- 29. 프로그램은 ClickOnce인지 여부를 어떻게 알 수 있습니까?
- 30. Google지도는 내 위치를 어떻게 알 수 있습니까?
개체의 모든 기호가 내보내집니다 ("내부"기능조차도). 링커를 준비 할 수 있도록 컴파일러에 선언해야합니다. Ryan Fox와 같이 헤더 파일을 사용하여이 작업을 수행합니다. –
Chris Lutz는 실수로 모든 심볼을 재배치 가능한 오브젝트 파일에서 내보내는 것이 아니라 공유 라이브러리에서 가져 오는 것이 아니라고 오인됩니다. –
http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams