Bagaimana cara mengetahui semua simbol yang diekspor dari objek bersama?

131

Saya punya objek bersama (dll). Bagaimana cara mengetahui semua simbol yang diekspor dari sana?

chappar
sumber
1
Semua simbol dalam objek diekspor - bahkan fungsi "internal". Anda hanya perlu mendeklarasikannya ke kompiler sehingga mereka akan siap untuk penghubung. Ini biasanya dilakukan dengan file header, seperti kata Ryan Fox di bawah ini.
Chris Lutz
6
Chris Lutz salah: tidak semua simbol diekspor dari file objek yang dapat dipindahkan, apalagi dari pustaka bersama.
Dipekerjakan Rusia

Jawaban:

218

Apakah Anda memiliki "objek bersama" (biasanya perpustakaan bersama di AIX), perpustakaan bersama UNIX, atau Windows DLL? Ini semua adalah hal yang berbeda, dan pertanyaan Anda mengonfigurasikan semuanya :-(

  • Untuk objek yang dibagikan AIX, gunakan dump -Tv /path/to/foo.o.
  • Untuk perpustakaan bersama ELF, gunakan readelf -Ws /path/to/libfoo.so, atau (jika Anda memiliki GNU nm) nm -D /path/to/libfoo.so.
  • Untuk pustaka bersama non-ELF UNIX, sebutkan UNIX mana yang Anda minati.
  • Untuk Windows DLL, gunakan dumpbin /EXPORTS foo.dll.
Mempekerjakan bahasa Rusia
sumber
7
Di GNU / Linux tidak ada utilitas seperti «dumpbin». Dan pertanyaannya ditandai sebagai linux.
Hi-Angel
3
Sangat membantu, bagus untuk memiliki ikhtisar seperti itu. nmjuga berfungsi di MacOSX, kecuali -Dopsi. Atau brew install binutilsdan gunakan versi GNU via gnm. Untuk GNU nm, --demanglejuga bermanfaat. Juga gobjdump.
Albert
Sebenarnya, Anda dapat bekerja dengan pustaka bersama, dll, dan isi objek dari satu utilitas saja, lihat jawaban ini .
Hi-Angel
Pertanyaannya ditandai, linuxjadi saya pikir aman untuk mengatakan @ chappar memiliki pustaka bersama Linux.
jww
Saya kira tidak ada API untuk melakukan ini di runtime, kan? Saya telah menemukan bahwa di windows Anda memiliki GetProcAddress () tetapi Anda tidak dapat menggunakannya tanpa benar-benar menjalankan perpustakaan (yang sangat berbahaya jika aplikasi induk memiliki terlalu banyak hak akses).
Pablo Ariel
23

objdump adalah satu lagi yang bagus di linux.

smcameron
sumber
Juga tersedia di AIX
pitseeker
17

Jika itu adalah file Windows DLL dan OS Anda adalah Linux maka gunakan 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
sumber
12

Pada * nix periksa nm. Di windows gunakan program Dependency Walker

AllDayCpp
sumber
2
Secara khusus, nm --defined-only -g something.soakan mencetak simbol-simbol yang keduanya didefinisikan di perpustakaan dan simbol-simbol eksternal, yang mungkin merupakan apa yang diinginkan OP.
David Grayson
8

lihat man nm

GNU nm mencantumkan simbol dari file objek objfile .... Jika tidak ada file objek terdaftar sebagai argumen, nm mengasumsikan file a.out.
VolkerK
sumber
8
btw: untuk objek yang dibagikan Anda memerlukan opsi -D / - dinamis. misalnya nm -D libmagic.so
VolkerK
8

Menggunakan: nm --demangle <libname>.so

codebin
sumber
2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelfatau -Dkarya bendera.
Janus Troelsen
5

Cara lintas platform (tidak hanya lintas platform itu sendiri, tetapi juga bekerja, paling tidak, dengan keduanya *.sodan *.dll) menggunakan kerangka kerja reverse-engineering radare2 . Misalnya:

$ 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

Sebagai bonus, rabin2mengenali mangling nama C ++, misalnya (dan juga dengan .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

Bekerja dengan file objek juga:

$ 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
Hai Malaikat
sumber
1

Anda dapat menggunakan gnu objdump. objdump -p your.dll. Kemudian geser ke .edataisi bagian dan Anda akan menemukan fungsi yang diekspor di bawah [Ordinal/Name Pointer] Table.

Don F
sumber
0

Biasanya, Anda juga akan memiliki file header yang Anda sertakan dalam kode Anda untuk mengakses simbol.

Ryan Fox
sumber