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

标签 qt visual-c++ linker

近年来,我观察到 MSVC 链接器直到版本 11(Visual Studio 2012,_MSVC_VER 1700)默认将导入数据表与 .rdata 部分合并。从链接器版本 12(Visual Studio 2013,_MSVC_VER 1800)开始,此表被移至独立部分 .idata。我试图让这些较新的链接器继续将导入数据与 .rdata 合并,但没有成功(例如,选项 /merge:.idata=.rdata 导致错误消息 fatal error LNK1272: cannot将“.idata”与任何部分合并)。

偶然发现了PySide2 (version 5.13.0)的可执行文件,显然是使用链接器版本 14.15 创建的,但它再次将导入表与 .rdata 合并。这让我非常惊讶,现在我问自己:

如何让最新的 MSVC 链接器将导入表与 .rdata 合并?

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

最佳答案

似乎是我自己造成了我的困惑:很久以前我就开始使用 /merge:.rdata=.text 开关构建我的所有项目。现在区别对待的正是这个开关。对于较旧的链接器,导入表首先与 .rdata 合并。然后 /merge:.rdata=.text 开关仍然可以将 .rdata.text 合并。对于较新的链接器,开关 /merge:.rdata=.text 似乎首先被处理。当链接器随后搜索导入表的存储位置时,.rdata 不再存在。然后必须为此表创建 .idata 部分。

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

关于qt - 如何使最近的 MSVC 链接器将导入数据与 .rdata 部分合并?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57424301/

相关文章:

c++ - Microsoft Integer Literal Extensions——记录在哪里?

c++ - 限制(放大器)功能的默认参数

c++ - 在 C++ 程序上使用 mpicc 链接失败

c++ - Qt 信号和槽传递数据

c++ - 主窗口打开后显示一个按钮

c++ - QProcess 的最佳实现方式是什么,它读取 "real time"中的 stdout 和 stderr?

visual-c++ - c_src\bcrypt_nif.c(94): error C2275: 'ERL_NIF_TERM' : illegal use of this type as an expression

android - 为 Android 编译 SDL2

c - 在不同的编译单元中以不同的大小声明与 extern 相同的数组是否是 UB

尝试打开 .ui 表单编辑器时 Qt Creator 崩溃