后加入/TSAWARE标志连接到我的一个项目(Visual Studio6)中,我惊讶地发现一个新的章节在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 只有DLL特点领域在PE可选择的标题而改变。

任何人都可以解释这样对我?这是一个错误的连接,或可以执行改变过editbin最终没有工作上的某些系统吗?

有帮助吗?

解决方案

只有猜测:在终端服务器系统,你想要一个像有几页书面为可能。如果存储页相对应的图像的不是修改,一个单页的物理RAM可映射入eash届会议使用的形象。如果网页的图像是修改后,该系统已经为执行复制在写作的每个实例的网页之间所有的会议和使用不同的模块的物理存储代表的网页在各个会议。

由于进口的图像常常需要固定了如果DLL,正在进口的被迫迁移,该页面,保持进口经常得到修改,因此不能参加在共享之间的会议。如果连接合并的进口与其他数据,通常没有修改,这可能增加的数量复制编写的网页不必要的。

这可能是一种优化,有助于减少复制的页面的会议。

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

其他提示

该意见从@WarrenP是正确的。根据 MSDN文件:

这/TSAWARE选项设置一个标志在IMAGE_OPTIONAL_HEADER DllCharacteristics领域中的程序图像的可选标题。时 这标志设置、终端服务器将不会使某些改变 应用程序。

当一个应用程序是不知道终端服务器(也称为 遗留的应用程序)、终端服务器将使某些修改 遗留的应用程序,使其工作适当地在一个多用户 环境。例如,终端服务器将创建一个虚拟的 Windows文件夹,这样,每个用户得到Windows文件夹代替 得到系统的Windows的目录。这使用户访问 他们自己的INI文件。此外,终端服务器,使一些 调整登记册有遗留的应用程序。这些 修改慢载的遗产应用程序对终端 服务器。

如果应用程序服务器的终端意识到,它必须既不依靠 INI文件,也没有写入注册表记册在建立。

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

一件事只暗示在这里是那影子的钥匙是用于进程的不TS知道。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top