gpt4 book ai didi

windows -/TSAWARE 链接器标志对 PE 可执行文件有何作用?

转载 作者:可可西里 更新时间:2023-11-01 09:18:37 28 4
gpt4 key购买 nike

将/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.obj
  • link/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 可选 header 中的 DLL 特性字段被更改。

谁能给我解释一下?这是链接器中的错误还是由 editbin 更改的可执行文件最终无法在某些系统上运行?

最佳答案

只是一个猜测:在终端服务器系统上,您希望图像尽可能多地写入几页。如果与图像对应的内存页面未被修改,则可以将物理 RAM 的单页映射到使用该图像的 eash session 中。如果修改了图像中的页面,系统必须在所有 session 中为页面的每个实例执行写时复制操作,并使用不同的物理内存块来表示每个 session 中的页面。

如果导入的 DLL 必须重新定位,由于图像的导入通常需要修复,因此保存导入的页面经常会被修改,因此无法参与 session 之间的共享。如果链接器将导入与通常未修改的其他数据合并,则可能会不必要地增加写时复制页面的数量。

这可能是一种优化,有助于减少跨 session 复制页面的数量。

不过正如我所说 - 这纯粹是一个猜测。

关于windows -/TSAWARE 链接器标志对 PE 可执行文件有何作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1261291/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com