我最近一直在使用dumpbin
来使用dumpbin foo.lib /symbols
在某些静态库中查看符号。我想看看如何将其用于可执行文件和DLL。
我的第一个观察结果是dumpbin foo.{exe|dll} /symbols
不返回任何内容。
对于DLL,我观察到export选项对于获取符号数据是必需的:
dumpbin foo.dll /exports
。为什么在这种情况下需要此选项?如果相应的* .iobj文件可用,我可以使用dumpbin foo.iobj /symbols
转储所有符号,而我假设DLL上的/ exports仅显示DLL公开的符号。
对于可执行文件,dumpbin bar.exe /symbols
不会产生任何结果,而dumpbin bar.exe /exports
似乎会转储一些符号。
任何人都可以解释这里的内幕是什么吗?
答案 0 :(得分:2)
用于转储的参数告诉它要转储文件的哪些部分。
您需要使用不同参数的原因是,您正在查看恰好彼此非常相似的数据片段,但是(从PE文件的角度来看)却完全不同数据存储在文件的不同部分。
因此,在创建目标文件时,它定义了一些符号,这些符号进入了PE文件的符号部分。当您链接这些文件以创建DLL / exe文件时,它导出的所有符号都会在文件的“导出”部分中创建记录。从我们的角度来看,它们看起来很相似(实际上,导出的名称通常是某个目标文件的Symbols部分中某个符号的名称),但仍存储在其他部分中。
当编译器执行其操作时,它将数据写入Symbols部分,但是(至少通常)根本不创建imports或exports部分。然后,链接器执行其操作,主要是从符号部分读取,然后写入导入和导出部分。然后,加载程序执行其操作,主要是从进出口部分读取,而忽略符号部分。