近年来,我的观察是,直到版本 11(Visual Studio 2012,_MSVC_VER 1700)的 MSVC 链接器默认将导入数据表与 .rdata 部分合并。从链接器版本 12(Visual Studio 2013,_MSVC_VER 1800)开始,该表被移至独立部分 .idata。我尝试让这些较新的链接器继续将导入数据与 .rdata 合并,但没有成功(例如,选项
/merge:.idata=.rdata
导致错误消息 fatal error LNK1272: cannot merge '.idata' with any section
)。
偶然我遇到了PySide2(版本5.13.0)的可执行文件,这些文件显然是使用链接器版本14.15创建的,但它再次将导入表与.rdata合并。这让我非常惊讶,现在我问自己:
如何获取最新的 MSVC 链接器以将导入表与 .rdata 合并?
顺便说一句:这不是解决任何问题。我只是好奇。
看来我自己也造成了我的困惑:很久以前我就开始使用
/merge:.rdata=.text
开关构建我的所有项目。而现在正是这个开关受到了不同的对待。对于较旧的链接器,导入表首先与 .rdata
合并。那么 /merge:.rdata=.text
开关仍然可以将 .rdata
与 .text
合并。对于较新的链接器,开关 /merge:.rdata=.text
似乎首先被处理。当链接器随后搜索导入表的存储位置时,.rdata
不再存在。然后必须为此表创建 .idata
部分。
免责声明:我对此没有“证据”。这些只是我的观察得出的结论。
可以使用GCC(MinGW)进行编译,其链接器脚本可以实现任意节的合并,包括.idata。