Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows /TSAWARE链接器标志对PE可执行文件有什么作用?_Windows_Visual C++_Linker_Visual C++ 6_Portable Executable - Fatal编程技术网

Windows /TSAWARE链接器标志对PE可执行文件有什么作用?

Windows /TSAWARE链接器标志对PE可执行文件有什么作用?,windows,visual-c++,linker,visual-c++-6,portable-executable,Windows,Visual C++,Linker,Visual C++ 6,Portable Executable,将/TSAWARE链接器标志添加到我的一个项目(VisualStudio6)后,我惊讶地发现PE文件(.idata)中有一个新的部分。如果我没有设置标志,导入将合并到.rdata中 为了说明“问题”,我们从一个简单的控制台程序开始: #include <stdio.h> int main() { printf("hello world\n"); return 0; } 因此,出于某种原因,链接器决定无法合并导入 但是如果我们运行editbin/TSAWARE a.

将/TSAWARE链接器标志添加到我的一个项目(VisualStudio6)后,我惊讶地发现PE文件(.idata)中有一个新的部分。如果我没有设置标志,导入将合并到.rdata中

为了说明“问题”,我们从一个简单的控制台程序开始:

#include <stdio.h>
int main() 
{
    printf("hello world\n");
    return 0;
}
因此,出于某种原因,链接器决定无法合并导入

但是如果我们运行
editbin/TSAWARE a.exe
,只有PE可选头中的DLL特征字段会更改


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

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

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

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


正如我所说,这纯粹是猜测。

来自@WarrenP的评论是正确的。根据报告:

/TSAWARE选项在图像\u可选\u标题中设置标志 DllCharacteristics字段位于程序映像的可选标头中。什么时候 设置此标志后,终端服务器将不会对 应用程序

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

如果应用程序是终端服务器感知的,则它不能依赖于 INI文件,也不会在安装过程中写入HKEY_当前_用户注册表

如果使用/TSAWARE且应用程序仍使用INI文件,则 文件将由系统的所有用户共享。如果是的话 可以接受,您仍然可以将您的应用程序链接到/TSAWARE; 否则您需要使用/TSAWARE:NO


这里只提示的一件事是,阴影密钥仅对不支持TS的进程启用。

这也是我的猜测,除非MS有人响应,否则我们永远不会知道。根据Microsoft自己的文档,/TSAWARE linker标志设置EXE PE标志以禁用C:\Windows主目录重定向,注册表重定向和其他TS环境黑客,旨在保护您在TS环境中运行不支持TS的应用程序。此问题与文档描述的修改链接器行为有关
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