为什么对于不同的图像类型需要不同的dumpbin选项?

时间:2018-12-20 00:36:14

标签: c++ windows dumpbin

我最近一直在使用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似乎会转储一些符号。

任何人都可以解释这里的内幕是什么吗?

1 个答案:

答案 0 :(得分:2)

用于转储的参数告诉它要转储文件的哪些部分。

您需要使用不同参数的原因是,您正在查看恰好彼此非常相似的数据片段,但是(从PE文件的角度来看)却完全不同数据存储在文件的不同部分。

因此,在创建目标文件时,它定义了一些符号,这些符号进入了PE文件的符号部分。当您链接这些文件以创建DLL / exe文件时,它导出的所有符号都会在文件的“导出”部分中创建记录。从我们的角度来看,它们看起来很相似(实际上,导出的名称通常是某个目标文件的Symbols部分中某个符号的名称),但仍存储在其他部分中。

当编译器执行其操作时,它将数据写入Symbols部分,但是(至少通常)根本不创建imports或exports部分。然后,链接器执行其操作,主要是从符号部分读取,然后写入导入和导出部分。然后,加载程序执行其操作,主要是从进出口部分读取,而忽略符号部分。