Jak mogę się dowiedzieć, jakie wszystkie symbole są eksportowane z udostępnionego obiektu?

137

Mam udostępniony obiekt (dll). Jak mogę się dowiedzieć, jakie są z tego eksportowane wszystkie symbole?

rozdz
źródło
1
Eksportowane są wszystkie symbole w obiekcie - nawet funkcje „wewnętrzne”. Wystarczy zadeklarować je kompilatorowi, aby były gotowe na konsolidator. Odbywa się to zwykle za pomocą pliku nagłówkowego, jak powiedział Ryan Fox poniżej.
Chris Lutz,
8
Chris Lutz się myli: nie wszystkie symbole są eksportowane z przenoszonych plików obiektów, a tym bardziej z bibliotek współdzielonych.
Zatrudniony w Rosji

Odpowiedzi:

222

Czy masz „obiekt współużytkowany” (zwykle bibliotekę współużytkowaną w systemie AIX), bibliotekę współużytkowaną UNIX lub bibliotekę DLL systemu Windows? To są różne rzeczy, a twoje pytanie łączy je wszystkie :-(

  • W przypadku obiektu współużytkowanego AIX użyj dump -Tv /path/to/foo.o.
  • W przypadku biblioteki współdzielonej ELF użyj readelf -Ws /path/to/libfoo.solub (jeśli masz GNU nm) nm -D /path/to/libfoo.so.
  • W przypadku współdzielonej biblioteki innej niż ELF UNIX, proszę podać, który system UNIX Cię interesuje.
  • W przypadku biblioteki DLL systemu Windows użyj dumpbin /EXPORTS foo.dll.
Zatrudniony Rosjanin
źródło
8
W systemie GNU / Linux nie ma takiego narzędzia „dumpbin”. A pytanie jest oznaczone jako linux.
Hi-Angel
3
Bardzo pomocny, dobrze mieć taki przegląd. nmdziała również na MacOSX, z wyjątkiem -Dopcji. Lub brew install binutilsi użyj wersji GNU przez gnm. Dla GNU nm, --demanglejest również przydatna. Również gobjdump.
Albert
Właściwie możesz pracować zarówno z bibliotekami współdzielonymi, bibliotekami dll, jak i wypełnieniami obiektów z jednego narzędzia, zobacz tę odpowiedź .
Hi-Angel
Pytanie jest otagowane, linuxwięc myślę, że można bezpiecznie powiedzieć, że @chappar ma współdzieloną bibliotekę Linuksa.
jww
Przypuszczam, że nie ma interfejsu API, który mógłby to zrobić w czasie wykonywania, prawda? Zauważyłem, że w systemie Windows masz GetProcAddress (), ale nie możesz go używać bez faktycznego wykonania biblioteki (co jest bardzo niebezpieczne, jeśli aplikacja nadrzędna ma zbyt duże prawa dostępu).
Pablo Ariel
23

objdump to kolejny dobry na Linuksa.

smcameron
źródło
Dostępne również w systemie AIX
pitseeker
17

Jeśli jest to plik DLL systemu Windows, a Twój system operacyjny to Linux, użyj 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
...
Björn Lindqvist
źródło
12

Na * nix sprawdź nm. W systemie Windows użyj programu Dependency Walker

AllDayCpp
źródło
2
W szczególności nm --defined-only -g something.sowydrukuje symbole, które są zarówno zdefiniowane w bibliotece, jak i symbole zewnętrzne, co prawdopodobnie jest tym, czego chce OP.
David Grayson,
8

zobacz man nm

GNU nm wyświetla symbole z plików obiektowych objfile .... Jeśli żadne pliki obiektowe nie są wymienione jako argumenty, nm przyjmuje plik a.out.
VolkerK
źródło
8
btw: dla współdzielonych obiektów potrzebujesz opcji -D / - dynamic. np. nm -D libmagic.so
VolkerK
8

Posługiwać się: nm --demangle <libname>.so

codebin
źródło
2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelflub -Dflaga działa.
Janus Troelsen
5

Sposób międzyplatformowy (nie tylko sam wieloplatformowy, ale także współpracujący przynajmniej z obydwoma *.soi *.dll) polega na użyciu radare inżynierii wstecznej2 . Na przykład:

$ 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

Jako bonus rabin2rozpoznaje na przykład zniekształcenie nazw w C ++ (a także z .soplikiem) :

$ 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

Działa również z plikami obiektowymi:

$ 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
Cześć aniele
źródło
1

Możesz użyć gnu objdump. objdump -p your.dll. Następnie przejdź do .edatazawartości sekcji, a wyeksportowane funkcje znajdziesz pod [Ordinal/Name Pointer] Table.

Don F
źródło
0

Zwykle masz również plik nagłówkowy, który dołączasz do kodu, aby uzyskać dostęp do symboli.

Ryan Fox
źródło