【发布时间】:2010-11-18 16:16:32
【问题描述】:
将 /TSAWARE 链接器标志添加到我的一个项目 (Visual Studio 6) 后,我惊讶地发现 PE 文件 (.idata) 中有一个新部分。如果我不设置标志,则导入将合并到 .rdata 中。
为了说明“问题”,我们从一个简单的控制台程序开始:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
并编译为:cl /Og /O1 /GF /WX /c main.c
然后用
链接link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.objlink /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj
让我们比较一下dumpbin的输出:
Dump of file a.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .rdata
5000 .text
Dump of file b.exe
File Type: EXECUTABLE IMAGE
Summary
4000 .data
1000 .idata
1000 .rdata
5000 .text
因此,由于某种原因,链接器决定无法合并导入。
但如果我们运行editbin /TSAWARE a.exe,则只有 PE 可选标头中的 DLL 特性字段会发生变化。
谁能给我解释一下?这是链接器中的错误,还是 editbin 更改的可执行文件最终无法在某些系统上运行?
【问题讨论】:
标签: windows visual-c++ linker visual-c++-6 portable-executable