如何找出从共享对象导出的所有符号?

cha*_*par 123 linux shared-libraries

我有一个共享对象(DLL).如何找出从中导出的所有符号?

Emp*_*ian 199

您是否有"共享对象"(通常是AIX上的共享库),UNIX共享库或Windows DLL?这些都是不同的东西,你的问题将它们全部混为一谈:-(

  • 对于AIX共享对象,请使用dump -Tv /path/to/foo.o.
  • 对于ELF共享库,请使用readelf -Ws /path/to/libfoo.so或(如果您有GNU nm)nm -D /path/to/libfoo.so.
  • 对于非UNIX ELF共享库,请注明你是UNIX感兴趣的内容.
  • 对于Windows DLL,请使用dumpbin /EXPORTS foo.dll.

  • 在GNU/Linux中没有这样的实用程序«dumpbin».这个问题被标记为linux. (7认同)
  • 非常有帮助,很高兴有这样的概述.`nm`也适用于MacOSX,除了`-D`选项.或者`brew install binutils`并通过`gnm`使用GNU版本.对于GNU`nm`,`--dengngle`也很有用.还有`gobjdump`. (3认同)

smc*_*ron 21

objdump是另一个很好的Linux版本.


All*_*Cpp 12

在*nix检查nm.在Windows上使用程序Dependency Walker

  • 具体来说,`nm --defined-only -g something.so`将打印在库和外部符号中定义的符号,这可能是OP想要的. (2认同)

Bjö*_*ist 12

如果它是Windows DLL文件而您的操作系统是Linux,则使用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
...
Run Code Online (Sandbox Code Playgroud)


Vol*_*erK 8

男人纳米

GNU nm列出来自目标文件objfile的符号....如果没有列出任何目标文件作为参数,则nm假定文件为a.out.

  • 顺便说一句:对于共享对象,您需要-D/ - 动态选项.例如nm -D libmagic.so (8认同)

cod*_*bin 7

使用: nm --demangle <libname>.so

  • nm:/usr/lib/i386-linux-gnu/libtemplates_parser.so.11.6:无符号。`readelf`或`-D`标志起作用。 (2认同)

Hi-*_*gel 5

跨平台的方式(不仅跨平台本身,而且至少与*.soand*.dll都可以使用是使用反向工程框架radare2。例如:

$ 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
Run Code Online (Sandbox Code Playgroud)

另外,可以rabin2识别C ++名称修饰,例如(以及.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
Run Code Online (Sandbox Code Playgroud)

也适用于目标文件:

$ 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
Run Code Online (Sandbox Code Playgroud)