You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DUMPBIN /EXPORTS输出差异:Debug与Release二进制Name列疑问解析

理解DUMPBIN /EXPORTS输出中的Name列

以下是不同编译配置下DUMPBIN /EXPORTS的输出,重点关注Name列:

二进制文件OrdinalHintRVAName
x86 Debug1000090B67??0ImBitVector@@QAE@$$QAU0@@Z = @ILT+7010(??0ImBitVector@@QAE@$$QAU0@@Z)
x64 Debug10000958ED??0ImBitVector@@QEAA@$$QEAU0@@Z = @ILT+2280(??0ImBitVector@@QEAA@$$QEAU0@@Z)
x86 Release1000001C80??0ImBitVector@@QAE@$$QAU0@@Z = ??0ImBitVector@@QAE@$$QAU0@@Z (public: __thiscall ImBitVector::ImBitVector(struct ImBitVector &&))
x64 Release1000001900??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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 16:05:26