J'ai un objet partagé (dll). Comment puis-je savoir quels sont les symboles exportés?Comment puis-je savoir quels sont les symboles exportés d'un objet partagé?
Répondre
Avez-vous un "objet partagé" (généralement une bibliothèque partagée sous AIX), une bibliothèque partagée UNIX ou une DLL Windows? Ce sont toutes des choses différentes, et votre question les tous :-(confond
- Pour un objet AIX partagé, utilisez
dump -Tv /path/to/foo.o
. - Pour une bibliothèque partagée ELF, utilisez
readelf -Ws /path/to/libfoo.so
, ou (si vous avez nm GNU)nm -D /path/to/libfoo.so
. - Pour une bibliothèque partagée UNIX non-ELF, s'il vous plaît indiquer qui UNIX vous intéresse.
- Pour une DLL Windows, utilisez
dumpbin /EXPORTS foo.dll
.
Dans GNU/Linux, pas un tel utilitaire «dumpbin». Et la question est marquée comme linux. –
Très utile, bon d'avoir une telle vue d'ensemble. 'nm' fonctionne aussi sur MacOSX, sauf l'option' -D'. Ou 'infuser install binutils' et utiliser la version GNU via' gnm'.Pour GNU 'nm',' --demangle' est également utile. Aussi 'gobjdump'. – Albert
En fait, vous pouvez très bien travailler avec les librairies partagées, les dll et les filles d'objets à partir d'un seul utilitaire, [voir cette réponse] (https://stackoverflow.com/a/46772557/2388257). –
Habituellement, vous auriez également un fichier d'en-tête que vous incluez dans votre code pour accéder aux symboles.
Vérification de * nix nm. Sur Windows, utilisez le programme Dependency Walker
Plus précisément, 'nm - defined-only -g something.so' affichera les symboles qui sont à la fois définis dans les symboles library et extern, ce qui est probablement ce que veut l'OP. –
Utilisation: nm --demangle <libname>.so
'nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: pas de symboles'. L'indicateur 'readelf' ou' -D' fonctionne. –
S'il est un fichier DLL Windows et votre système d'exploitation est Linux puis utilisez 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 façon multiplateformes (croix non seulement -plateforme elle-même, mais travaille également, à tout le moins, à la fois avec *.so
et *.dll
) utilise reverse-engineering framework radare2. Par exemple:
$ 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
En prime, rabin2
reconnaît le mutiler nom de C, par exemple (et aussi avec le fichier .so
):
$ 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
fonctionne avec les fichiers objet aussi:
$ 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. Quels sont les symboles soulignés dans une DLL VB?
- 2. GCC et ld ne peuvent pas trouver les symboles exportés ... mais ils sont là!
- 3. Comment puis-je savoir quels événements sont liés à un objet?
- 4. Quels sont les attributs?
- 5. Comment savoir quels types sont définis dans une DCU Delphi?
- 6. Comment charger un objet partagé en C++?
- 7. Comment lister les symboles dans un fichier .so
- 8. Quels sont les services .NET?
- 9. Quels sont les usages courants des bitarrays?
- 10. comment savoir rapidement quels fichiers diffèrent dans les révisions mercurielles
- 11. Quels sont les plugins jQuery "must have"?
- 12. Comment savoir quels modules ont été mélangés dans une classe?
- 13. Quelle est la meilleure façon de savoir quels éléments CSS sont supportés par tous les navigateurs?
- 14. je veux savoir quels sont tous les déclencheurs disponibles pour treeview
- 15. Quels sont les bons tutoriels Wireshark?
- 16. Quels sont les deuxièmes moments d'une région?
- 17. Quels sont les différents types d'échantillonneurs HLSL?
- 18. Quels sont les numéros de déchirure/rsp segfault et comment les utiliser
- 19. Comment savoir quels éléments sont dans la position actuelle de la souris?
- 20. Comment puis-je savoir quels opérateurs WQL sont pris en charge sur une classe utilisant powershell?
- 21. Comment savoir quels fichiers sont considérés comme «non sécurisés» par IE?
- 22. Comment savoir quels attributs sont stockés dans ControlState et lesquels dans ViewState?
- 23. Quels sont les plugins recommandés pour Trac?
- 24. Quels sont les avantages de Struts
- 25. Quels sont les avantages/inconvénients de py2exe
- 26. Quels sont les avantages des différentes endiannesses?
- 27. Quels sont les principaux concurrents de Servoy?
- 28. Quels sont les inconvénients des méthodes statiques?
- 29. Quels sont les navigateurs compatibles avec "! Important"?
- 30. Quels sont les symbos #if prédéfinis C#?
Tous les symboles de l'objet sont exportés - même les fonctions "internes". Vous avez juste à les déclarer au compilateur afin qu'ils soient prêts pour l'éditeur de liens. Ceci est généralement fait avec un fichier d'en-tête, comme Ryan Fox dit ci-dessous. –
Chris Lutz se trompe: tous les symboles ne sont pas exportés à partir de fichiers objets relogeables, et encore moins de bibliothèques partagées. –
http://en.wikipedia.org/wiki/Nm_%28Unix%29 – PaulJWilliams