Tengo un objeto compartido (dll). ¿Cómo averiguo de qué se exportan todos los símbolos?¿Cómo averiguo qué se exportan todos los símbolos de un objeto compartido?
Respuesta
¿Tiene un "objeto compartido" (generalmente una biblioteca compartida en AIX), una biblioteca compartida de UNIX o una DLL de Windows? Estas son todas las cosas diferentes, y su pregunta les confunde todo :-(
- Para que un objeto compartida de AIX, utilice
dump -Tv /path/to/foo.o
. - Para una biblioteca compartida ELF, utilice
readelf -Ws /path/to/libfoo.so
, o (si tiene GNU nm)nm -D /path/to/libfoo.so
. - Para una biblioteca compartida no ELF de UNIX, indique cuales UNIX que están interesados en.
- Para una DLL de Windows, utilice
dumpbin /EXPORTS foo.dll
.
En GNU/Linux no hay tal utilidad «dumpbin». Y la pregunta está etiquetada como linux. –
Muy útil, es bueno tener una visión general. 'nm' también funciona en MacOSX, excepto en la opción' -D'. O bien, prepare los binutils de instalación y use la versión de GNU mediante 'gnm'.Para GNU 'nm',' --demangle' también es útil. También 'gobjdump'. – Albert
En realidad, puede trabajar tanto con librerías compartidas, dlls, y archivos de objetos desde una sola utilidad, [ver esta respuesta] (https://stackoverflow.com/a/46772557/2388257). –
Normalmente, también debe tener un archivo de encabezado que incluya en su código para acceder a los símbolos.
On * nix check nm. En las ventanas utilizan el programa Dependency Walker
Específicamente, 'nm --defined-only -g something.so' imprimirá los símbolos que están definidos en la biblioteca y en los símbolos externos, que es probablemente lo que quiere el OP. –
Uso: nm --demangle <libname>.so
'nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols'. La bandera 'readelf' o' -D' funciona. –
Si se trata de un archivo DLL de Windows y su sistema operativo es Linux a continuación, utilizar 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
...
La forma multiplataforma (no sólo cruz -plataforma en sí, pero también funciona, al menos, con *.so
y *.dll
) está usando reverse-engineering framework radare2. Por ejemplo:
$ 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 beneficio adicional, rabin2
reconoce C++ renombrado de nombres, por ejemplo (y también con .so
archivo):
$ 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 con archivos de objetos demasiado:
$ 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. ¿Cómo restringir el acceso a los símbolos en un objeto compartido?
- 2. ¿Cómo incluir todos los objetos de un archivo en un objeto compartido?
- 3. Acceda a los símbolos del kernel de Linux que no se exportan a través de EXPORT_SYMBOL *
- 4. Cómo se deletrean/pronuncian todos los caracteres y símbolos especiales
- 5. ¿Cómo averiguo qué dlls cargará un ejecutable?
- 6. Símbolos de la biblioteca de conveniencia no se exportan en el ejecutable
- 7. cmake crear un objeto compartido
- 8. LD_LIBRARY_PATH: cómo encontrar un objeto compartido
- 9. ¿Cómo cargo un objeto compartido en C++?
- 10. En GCC, ¿cómo puedo exportar todos los símbolos de typeinfo para una biblioteca compartida sin exportar todos los símbolos?
- 11. Cómo enumerar los símbolos en un archivo .so
- 12. ¿Cómo se ven los símbolos de depuración?
- 13. ¿Cómo puedo eliminar un símbolo de un objeto compartido?
- 14. ¿Cómo ver los símbolos en los archivos objeto?
- 15. No se puede abrir el archivo de objeto compartido
- 16. Cómo usar los símbolos + =, * =, - =
- 17. ¿Cómo enumerar todos los métodos para un objeto en Ruby?
- 18. Capturar todos los métodos/llamadas de mensajes en un objeto
- 19. ¿Cómo se han compartido los archivos de registro en Windows?
- 20. restricciones al cargar dinámicamente un objeto compartido desde otro objeto compartido?
- 21. objeto compartido no puede encontrar símbolos en el binario principal, C++
- 22. Xcode 4 Strip Todos los símbolos de error al Archivar
- 23. ¿Qué hacen los símbolos Clojure cuando se usan como funciones?
- 24. ¿Por qué los motores de búsqueda ignoran los símbolos?
- 25. ¿Cómo decirle al enlazador MinGW que no exporte todos los símbolos?
- 26. ¿Cómo averiguo qué javascript se ejecuta cuando hago clic en un elemento?
- 27. ¿Cómo crear un objeto compartido entre diferentes sesiones en PHP?
- 28. Cómo configurar un ccache compartido
- 29. jQuery se unen todos los eventos en el objeto
- 30. Django. Obtener valores para todos los campos de un objeto
Todos los símbolos del objeto se exportan, incluso las funciones "internas". Solo tiene que declararlos al compilador para que estén listos para el enlazador. Esto generalmente se hace con un archivo de encabezado, como Ryan Fox dice a continuación. –
Chris Lutz está equivocado: no todos los símbolos se exportan de los archivos de objetos reubicables, y mucho menos de las bibliotecas compartidas. –
http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams