Paylaşılan bir nesneden hangi sembollerin dışa aktarıldığını nasıl öğrenebilirim?


131

Paylaşılan bir nesnem (dll) var. Buradan hangi sembollerin dışa aktarıldığını nasıl öğrenebilirim?



1
Nesnedeki tüm semboller dışa aktarılır - "dahili" işlevler bile. Bunları derleyiciye bildirmeniz yeterlidir, böylece bağlayıcı için hazır olurlar. Bu genellikle Ryan Fox'un dediği gibi bir başlık dosyasıyla yapılır.
Chris Lutz

6
Chris Lutz yanılıyor: Tüm semboller yeniden konumlandırılabilir nesne dosyalarından dışa aktarılmaz, paylaşılan kütüphanelerden çok daha az.
çalışan Rus

Yanıtlar:


218

"Paylaşılan bir nesneniz" (genellikle AIX üzerinde paylaşılan bir kitaplık), bir UNIX paylaşılan kitaplığı veya bir Windows DLL var mı? Bunların hepsi farklı şeyler ve sorunuz hepsini birleştiriyor :-(

  • AIX paylaşılan nesnesi için kullanın dump -Tv /path/to/foo.o.
  • ELF paylaşılan kitaplığı için readelf -Ws /path/to/libfoo.so, veya kullanın (GNU nm'ye sahipseniz) nm -D /path/to/libfoo.so.
  • Olmayan bir ELF UNIX kütüphane, lütfen devlet paylaşılan için UNIX ilgilendiğiniz.
  • Windows DLL için dumpbin /EXPORTS foo.dll.

7
GNU / Linux'ta böyle bir "çöp kutusu" yardımcı programı yoktur. Ve soru linux olarak etiketlendi.
Hi-Angel

3
Çok yardımcı oldu, böyle bir genel bakışa sahip olmak güzel. seçeneği nmdışında MacOSX'te de çalışır -D. Veya brew install binutilsGNU sürümünü üzerinden kullanın gnm. GNU'da için nm, --demangleaynı zamanda yararlıdır. Ayrıca gobjdump.
Albert

Aslında, tek bir yardımcı programdan hem paylaşılan kitaplıklar, dll'ler hem de nesne dolguları ile çalışabilirsiniz, bu yanıta bakın .
Hi-Angel

Soru etiketlendi, linuxbu yüzden @chappar'ın Linux paylaşılan kitaplığına sahip olduğunu söylemenin güvenli olduğunu düşünüyorum.
jww

Sanırım bunu çalışma zamanında yapacak bir API yok, değil mi? Windows'ta GetProcAddress () 'e sahip olduğunuzu buldum, ancak kitaplığı gerçekten çalıştırmadan kullanamazsınız (bu, ana uygulamanın çok fazla erişim hakkına sahip olması durumunda çok tehlikelidir).
Pablo Ariel


17

Bir Windows DLL dosyasıysa ve işletim sisteminiz Linux ise, winedump kullanın :

$ 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

Açık * nix kontrolü nm. Windows'ta Dependency Walker programını kullanın


2
Özellikle, nm --defined-only -g something.sohem kitaplıkta hem de harici sembollerde tanımlanan sembolleri yazdıracaktır, ki bu muhtemelen OP'nin istediği şeydir.
David Grayson

8

adam görmek

GNU nm, objfile .... nesne dosyalarındaki sembolleri listeler. Hiçbir nesne dosyası bağımsız değişken olarak listelenmemişse, nm, a.out dosyasını varsayar.

8
btw: paylaşılan nesneler için -D / - dinamik seçeneğine ihtiyacınız vardır. örneğin mil -D libmagic.so
VolkerK

8

kullanın: nm --demangle <libname>.so


2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelfveya -Dbayrak çalışır.
Janus Troelsen

5

Platformlar arası yolu (sadece çapraz platform kendisi değil, aynı zamanda her ikisi de, en azından, çalışma *.sove *.dll) kullanıyor , ters-mühendislik çerçeve radare2 . Örneğin:

$ 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

Bonus olarak, rabin2örneğin C ++ adının karıştırılmasını tanır (ve ayrıca.so dosya ile) :

$ 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

Nesne dosyalarıyla da çalışır:

$ 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

Gnu objdump kullanabilirsiniz. objdump -p your.dll. Ardından .edatabölüm içeriğine kaydırın ve dışa aktarılan işlevleri altında bulacaksınız [Ordinal/Name Pointer] Table.


0

Genellikle, sembollere erişmek için kodunuza eklediğiniz bir başlık dosyanız da olur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.