Como descubro o que todos os símbolos são exportados de um objeto compartilhado?

131

Eu tenho um objeto compartilhado (dll). Como descubro o que todos os símbolos são exportados?

chappar
fonte
1
Todos os símbolos no objeto são exportados - mesmo as funções "internas". Você apenas precisa declará-los para o compilador para que estejam prontos para o vinculador. Isso geralmente é feito com um arquivo de cabeçalho, como Ryan Fox disse abaixo.
6309 Chris Lutz
6
Chris Lutz está enganado: nem todos os símbolos são exportados de arquivos de objetos realocáveis, muito menos de bibliotecas compartilhadas.
Empregado russo

Respostas:

218

Você tem um "objeto compartilhado" (geralmente uma biblioteca compartilhada no AIX), uma biblioteca compartilhada UNIX ou uma DLL do Windows? Todas essas são coisas diferentes, e sua pergunta confunde todas elas :-(

  • Para um objeto compartilhado do AIX, use dump -Tv /path/to/foo.o.
  • Para uma biblioteca compartilhada ELF, use readelf -Ws /path/to/libfoo.soou (se você tiver GNU nm) nm -D /path/to/libfoo.so.
  • Para uma biblioteca compartilhada não-ELF UNIX, indique em que UNIX você está interessado.
  • Para uma DLL do Windows, use dumpbin /EXPORTS foo.dll.
Russo empregado
fonte
7
No GNU / Linux não existe esse utilitário «dumpbin». E a pergunta está marcada como linux.
Hi-Angel
3
Muito útil, é bom ter essa visão geral. nmtambém funciona no MacOSX, exceto a -Dopção Ou brew install binutilsuse a versão GNU via gnm. Para o GNU nm, --demangletambém é útil. Também gobjdump.
Albert
Na verdade, você pode trabalhar com bibliotecas compartilhadas, dlls e preenchimentos de objetos a partir de um único utilitário, veja esta resposta .
Hi-Angel
A pergunta está marcada, linuxentão acho que é seguro dizer que @chappar tem uma biblioteca compartilhada do Linux.
JWW
Suponho que não há API para fazer isso em tempo de execução, certo? Descobri que no Windows você tem GetProcAddress (), mas não pode usá-lo sem executar a biblioteca (o que é muito perigoso se o aplicativo pai tiver muitos direitos de acesso).
21818 Pablo Ariel
23

O objdump é outro bom no linux.

smcameron
fonte
Também disponível no AIX
pitseeker
17

Se for um arquivo DLL do Windows e seu sistema operacional for Linux, use o 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
fonte
12

Em * nix, verifique nm. No Windows, use o programa Dependency Walker

AllDayCpp
fonte
2
Especificamente, nm --defined-only -g something.soimprimirá os símbolos definidos na biblioteca e símbolos externos, o que provavelmente é o que o OP deseja.
David Grayson
8

veja homem nm

O GNU nm lista os símbolos dos arquivos de objeto objfile .... Se nenhum arquivo de objeto estiver listado como argumento, o nm assume o arquivo a.out.
VolkerK
fonte
8
btw: para objetos compartilhados, você precisa da opção -D / - dynamic. por exemplo nm -D libmagic.so
VolkerK
8

Usar: nm --demangle <libname>.so

codebin
fonte
2
nm: /usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6: no symbols. readelfou -Dbandeira funciona.
Janus Troelsen
5

A maneira de plataforma cruzada (não apenas a plataforma cruzada em si, mas também trabalhando, no mínimo, com ambos *.soe *.dll) está usando o radare da estrutura de engenharia reversa2 . Por exemplo:

$ 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 bônus, rabin2reconhece a manipulação de nomes C ++, por exemplo (e também com o .soarquivo) :

$ 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

Também funciona com arquivos 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
Olá anjo
fonte
1

Você pode usar o gnu objdump. objdump -p your.dll. Em seguida, selecione o .edataconteúdo da seção e você encontrará as funções exportadas em [Ordinal/Name Pointer] Table.

Don F
fonte
0

Normalmente, você também teria um arquivo de cabeçalho incluído no seu código para acessar os símbolos.

Ryan Fox
fonte