如何使最近的 MSVC 链接器将导入数据与 .rdata 部分合并?

问题描述 投票:0回答:2

近年来,我的观察是,直到版本 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 合并?

顺便说一句:这不是解决任何问题。我只是好奇。

qt visual-c++ linker
2个回答
3
投票

看来我自己也造成了我的困惑:很久以前我就开始使用

/merge:.rdata=.text
开关构建我的所有项目。而现在正是这个开关受到了不同的对待。对于较旧的链接器,导入表首先与
.rdata
合并。那么
/merge:.rdata=.text
开关仍然可以将
.rdata
.text
合并。对于较新的链接器,开关
/merge:.rdata=.text
似乎首先被处理。当链接器随后搜索导入表的存储位置时,
.rdata
不再存在。然后必须为此表创建
.idata
部分。

免责声明:我对此没有“证据”。这些只是我的观察得出的结论。


0
投票

可以使用GCC(MinGW)进行编译,其链接器脚本可以实现任意节的合并,包括.idata。

© www.soinside.com 2019 - 2024. All rights reserved.