什么是/ TSAWARE链接器标志做的PE可执行文件?(What does the /TSAWARE

2019-09-23 01:54发布

添加/ 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可选头只有DLL特征字段改变。

谁能解释这样对我? 这是一个错误的链接,或者可以通过改变EDITBIN可执行最终没有工作在某些系统上?

Answer 1:

只是一种猜测:终端服务器系统上,你要的影像具有写入尽可能几页。 如果对应于所述图像的存储器页不被修改,物理RAM的单个页面可以被映射到正在使用该图像eash会话。 如果是从图像的页被修改时,系统必须执行所有会话中的页面的每个实例写入时复制操作和使用的物理存储器中的不同的块来表示在每个会话中的页面。

由于对图像进口通常需要被固定了,如果要导入的DLL已经被重新定位,持有进口经常会修改,因此该页面无法参与会话之间共享。 如果连接器合并与通常不修改其他数据的进口,这可能会增加写入时复制的页数不必要的。

这可能是一种优化,有助于减少整个会话复制页面的数量。

就像我,虽然说 - 这纯粹是猜测。



Answer 2:

从@WarrenP的评论是正确的。 按照MSDN文档 :

的/ TSAWARE选项在节目图像的可选的报头中的IMAGE_OPTIONAL_HEADER DllCharacteristics字段设置一个标志。 当这个标志设置,终端服务器不会对应用程序的某些变化。

当一个应用程序是不是终端服务器感知(也称为遗留应用程序),终端服务器做一定的修改对旧版应用程序,使其在多用户环境中正常工作。 例如,终端服务器将创建一个虚拟的Windows文件夹,使得每个用户获得一个Windows文件夹,而不是让系统的Windows目录。 这使用户可以访问他们自己的INI文件。 此外,终端服务器做一些调整注册表中的遗留应用程序。 这些修改慢速终端服务器上的遗留应用程序的加载。

如果应用程序是终端服务器知道,它必须既不依赖于INI文件也不安装过程中写入HKEY_CURRENT_USER注册表。

如果使用/ TSAWARE和您的应用程序仍然使用INI文件,这些文件将被系统的所有用户共享。 如果这是可以接受的,你仍然可以链接与/ TSAWARE您的应用程序; 否则,你需要使用/ TSAWARE:NO。

只有在这里暗示一件事是,阴影密钥仅适用于不知道TS进程启用。



文章来源: What does the /TSAWARE linker flag do to the PE executable?