Come faccio a sapere quali simboli vengono esportati da un oggetto condiviso?


131

Ho un oggetto condiviso (dll). Come faccio a sapere quali sono tutti i simboli esportati da quello?



1
Tutti i simboli nell'oggetto vengono esportati, anche le funzioni "interne". Devi solo dichiararli al compilatore in modo che siano pronti per il linker. Questo di solito viene fatto con un file di intestazione, come Ryan Fox ha detto di seguito.
Chris Lutz,

6
Chris Lutz si sbaglia: non tutti i simboli vengono esportati da file di oggetti trasferibili, tanto meno da librerie condivise.
Impiegato russo il

Risposte:


218

Hai un "oggetto condiviso" (di solito una libreria condivisa su AIX), una libreria condivisa UNIX o una DLL di Windows? Queste sono tutte cose diverse e la tua domanda le confonde tutte :-(

  • Per un oggetto condiviso AIX, utilizzare dump -Tv /path/to/foo.o.
  • Per una libreria condivisa ELF, utilizzare readelf -Ws /path/to/libfoo.soo (se si dispone di GNU nm) nm -D /path/to/libfoo.so.
  • Per una libreria condivisa UNIX non ELF, indicare quale UNIX è interessato.
  • Per una DLL di Windows, utilizzare dumpbin /EXPORTS foo.dll.

7
In GNU / Linux nessuna tale utilità «dumpbin». E la domanda è taggata come linux.
Ciao Angelo

3
Molto utile, bello avere una tale visione d'insieme. nmfunziona anche su MacOSX, ad eccezione -Ddell'opzione. Oppure brew install binutilsutilizza la versione GNU tramite gnm. Per GNU nm, --demangleè anche utile. Inoltre gobjdump.
Albert,

In realtà, puoi lavorare sia con librerie condivise, dll e riempimenti di oggetti da una singola utility, bene, vedi questa risposta .
Hi-Angel,

La domanda è taggata, linuxquindi penso che sia sicuro dire che @chappar ha una libreria condivisa Linux.
JWW

Suppongo che non ci sia API per farlo in runtime, giusto? Ho scoperto che su Windows hai GetProcAddress () ma non puoi usarlo senza effettivamente eseguire la libreria (il che è molto pericoloso se l'app padre ha troppi diritti di accesso).
Pablo Ariel,


17

Se si tratta di un file DLL di Windows e il tuo sistema operativo è Linux, usa 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
...

12

On * nix controlla nm. Su Windows utilizzare il programma Dependency Walker


2
In particolare, nm --defined-only -g something.sostamperanno i simboli che sono entrambi definiti nella libreria e i simboli esterni, che è probabilmente ciò che l'OP vuole.
David Grayson,

8

vedi amico nm

GNU nm elenca i simboli dai file oggetto objfile .... Se nessun file oggetto è elencato come argomento, nm assume il file a.out.

8
btw: per gli oggetti condivisi è necessaria l'opzione dinamica -D / -. es. nm -D libmagic.so
VolkerK,

8

Uso: nm --demangle <libname>.so


2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelfo -Dbandiera funziona.
Janus Troelsen,

5

Il metodo multipiattaforma (non solo multipiattaforma in sé, ma anche funzionante, almeno, con entrambi *.soe *.dll) sta utilizzando il framework di reverse engineering radare2 . Per esempio:

$ 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

Come bonus, rabin2riconosce la modifica del nome C ++, ad esempio (e anche con il .sofile) :

$ 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

Funziona anche con i file oggetto:

$ 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

Puoi usare gnu objdump. objdump -p your.dll. Quindi .edatafai una panoramica dei contenuti della sezione e troverai le funzioni esportate in [Ordinal/Name Pointer] Table.


0

Di solito, avresti anche un file di intestazione che includi nel tuo codice per accedere ai simboli.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.