DUMPBIN /EXPORTS输出差异:Debug与Release二进制Name列疑问解析
理解DUMPBIN /EXPORTS输出中的Name列
以下是不同编译配置下DUMPBIN /EXPORTS的输出,重点关注Name列:
| 二进制文件 | Ordinal | Hint | RVA | Name |
|---|---|---|---|---|
| x86 Debug | 1 | 0 | 00090B67 | ??0ImBitVector@@QAE@$$QAU0@@Z = @ILT+7010(??0ImBitVector@@QAE@$$QAU0@@Z) |
| x64 Debug | 1 | 0 | 000958ED | ??0ImBitVector@@QEAA@$$QEAU0@@Z = @ILT+2280(??0ImBitVector@@QEAA@$$QEAU0@@Z) |
| x86 Release | 1 | 0 | 00001C80 | ??0ImBitVector@@QAE@$$QAU0@@Z = ??0ImBitVector@@QAE@$$QAU0@@Z (public: __thiscall ImBitVector::ImBitVector(struct ImBitVector &&)) |
| x64 Release | 1 | 0 | 00001900 | ??0ImBitVector@@QEAA@$$QEAU0@@Z = ??0ImBitVector@@QEAA@$$QEAU0@@Z (public: __cdecl ImBitVector::ImBitVector(struct ImBitVector &&)) |
当前理解
| 二进制文件 | 含义 |
|---|---|
| Debug | 入口点 = ILT中的某个索引?(再次指向入口点?) |
| Release | 入口点 = 再次指向入口点?(包含原型/声明) |
疑问解答
1. 等号后的名称为何重复?
这是DUMPBIN的标准输出格式:等号左侧是导出表中记录的导出符号名,右侧是该符号实际映射到的目标地址对应的符号。在这个场景里,导出符号直接指向自身(没有转发到其他模块或跳转桩),所以看起来是重复的。这不是冗余信息,而是明确展示了导出符号的映射关系——告诉读者这个导出符号最终指向的就是同名的函数实体。
2. Debug二进制文件中为何用@ILT包裹该名称?
@ILT是**增量链接表(Incremental Link Table)**的缩写。Debug编译模式下默认启用增量链接,此时链接器会生成一系列小的跳转桩(存放在ILT中),这些桩会跳转到实际的函数地址。增量链接的好处是后续修改代码重新编译时,不需要修改整个PE文件的代码段,只需要更新ILT里的跳转目标即可,大幅提升编译速度。
所以Debug版本的导出符号会指向ILT中的跳转桩(格式为@ILT+偏移量(符号名)),而Release版本默认关闭增量链接,导出符号会直接指向函数的实际地址,因此不会出现@ILT相关的内容。
内容的提问来源于stack exchange,提问作者aybe
相关产品推荐
相关产品推荐

