¿Cómo averiguo qué todos los símbolos se exportan desde un objeto compartido?


131

Tengo un objeto compartido (dll). ¿Cómo puedo saber de qué se exportan todos los símbolos?



1
Todos los símbolos en el objeto se exportan, incluso las funciones "internas". Solo tiene que declararlos al compilador para que estén listos para el vinculador. Esto generalmente se hace con un archivo de encabezado, como Ryan Fox dijo a continuación.
Chris Lutz

66
Chris Lutz se equivoca: no todos los símbolos se exportan desde archivos de objetos reubicables, y mucho menos desde bibliotecas compartidas.
Empleado ruso el

Respuestas:


218

¿Tiene un "objeto compartido" (generalmente una biblioteca compartida en AIX), una biblioteca compartida UNIX o una DLL de Windows? Todas estas son cosas diferentes, y su pregunta las combina todas :-(

  • Para un objeto compartido AIX, use dump -Tv /path/to/foo.o.
  • Para una biblioteca compartida ELF, use readelf -Ws /path/to/libfoo.so, o (si tiene GNU nm) nm -D /path/to/libfoo.so.
  • Para una biblioteca compartida UNIX que no sea ELF, indique en qué UNIX está interesado.
  • Para una DLL de Windows, use dumpbin /EXPORTS foo.dll.

77
En GNU / Linux no existe tal utilidad «dumpbin». Y la pregunta está etiquetada como Linux.
Hi-Angel

3
Muy útil, bueno tener esa visión general. nmTambién funciona en MacOSX, excepto la -Dopción. O brew install binutilsy use la versión GNU a través de gnm. Para GNU nm, --demangletambién es útil. También gobjdump.
Albert

En realidad, puede trabajar con bibliotecas compartidas, archivos DLL y archivos de objetos desde una única utilidad, vea esta respuesta .
Hola Angel

La pregunta está etiquetada, linuxasí que creo que es seguro decir que @chappar tiene una biblioteca compartida de Linux.
jww

Supongo que no hay API para hacer esto en tiempo de ejecución, ¿verdad? Descubrí que en Windows tienes GetProcAddress () pero no puedes usarlo sin ejecutar realmente la biblioteca (lo cual es muy peligroso si la aplicación principal tiene demasiados derechos de acceso).
Pablo Ariel


17

Si es un archivo DLL de Windows y su sistema operativo es Linux, utilice 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

En * nix verifique nm. En Windows use el programa Dependency Walker


2
Específicamente, nm --defined-only -g something.soimprimirá los símbolos que están definidos en la biblioteca y los símbolos externos, que es probablemente lo que quiere el OP.
David Grayson

8

ver hombre nm

GNU nm enumera los símbolos de los archivos de objetos objfile .... Si no hay archivos de objetos listados como argumentos, nm asume el archivo a.out.

8
por cierto: para los objetos compartidos necesita la opción dinámica -D / -. por ejemplo, nm -D libmagic.so
VolkerK

8

Utilizar: nm --demangle <libname>.so


2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelfo la -Dbandera funciona.
Janus Troelsen

5

El modo multiplataforma (no solo multiplataforma en sí, sino que también funciona, como mínimo, con ambos *.soy *.dll) está utilizando el marco de ingeniería inversa radare2 . P.ej:

$ 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

Como rabin2beneficio adicional, reconoce el cambio de nombre de C ++, por ejemplo (y también con el .soarchivo) :

$ 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

Funciona también con archivos de objetos:

$ 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

Puedes usar gnu objdump. objdump -p your.dll. Luego desplácese al .edatacontenido de la sección y encontrará las funciones exportadas en [Ordinal/Name Pointer] Table.


0

Por lo general, también tendrá un archivo de encabezado que incluya en su código para acceder a los símbolos.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.