Was macht den / tsaware Linker-Flag an den PE ausführbaren?
-
12-09-2019 - |
Frage
den / tsaware Linker-Flag auf einen meiner Projekte (Visual Studio 6) Nach dem Hinzufügen, ich war überrascht, einen neuen Abschnitt in der PE-Datei zu finden (.idata). Wenn ich die Flagge nicht gesetzt ist, werden die Einfuhren in .rdata verschmolzen.
Um das „Problem“ zeigen wir mit einem einfachen Konsolenprogramm starten:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
und kompilieren mit: cl /Og /O1 /GF /WX /c main.c
Dann verknüpfen Sie mit
-
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:a.exe main.obj
-
link /MACHINE:IX86 /SUBSYSTEM:CONSOLE /RELEASE /OUT:b.exe /TSAWARE main.obj
Lassen Sie uns die dumpbin Ausgang vergleichen:
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
So aus irgendeinem Grund, der Linker entscheidet, dass die Einfuhren können nicht zusammengeführt werden.
Aber wenn wir editbin /TSAWARE a.exe
nur das DLL-Kennlinienfeld in den PE-Header optional ausgeführt wird geändert.
Kann mir jemand erklären, das für mich? Ist das ein Fehler in dem Linker oder kann die ausführbare Datei von EDITBIN geändert am Ende nicht auf bestimmte Systeme zu arbeiten?
Lösung
Nur eine Vermutung: auf einem Terminal-Server-System, mögen Sie ein Bild von ein paar Seiten zu wie möglich geschrieben haben. Wenn eine Speicherseite, die das Bild entspricht nicht verändert wird, kann eine einzelne Seite des physischen RAM in eash Sitzung zugeordnet werden, das das Bild verwendet. Wenn eine Seite aus einem Bild geändert, so hat das System eine Copy-on-Write-Operation unter allen Sitzungen für jede Instanz der Seite auszuführen und einen anderen Block des physikalischen Speichers verwenden, um die Seite in jeder Sitzung darstellen.
Da die Importe für ein Bild, oft müssen fixiert werden, wenn die DLL, die importiert wird haben verlegt werden, die Seiten, die die Importe oft halten geändert bekommen und deshalb nicht in Teilung zwischen den Sitzungen teilnehmen kann. Wenn der Linker, die Einfuhren mit anderen Daten übergeht, die in der Regel nicht geändert wird, kann es die Anzahl der Copy-on-Write-Seiten unnötig erhöhen.
Dies kann eine Art von Optimierung, die die Anzahl der kopierten Seiten über mehrere Sitzungen hinweg hilft reduzieren.
Wie ich schon sagte, obwohl -. Dies ist eine reine Vermutung
Andere Tipps
Der Kommentar von @WarrenP ist richtig. Nach dem MSDN-Dokumentation :
Der / tsaware Option setzt ein Flag im IMAGE_OPTIONAL_HEADER DllCharacteristics Feld im optionalen Header des Programmbildes. Wann dieser Flag gesetzt ist, wird nicht Terminalserver macht bestimmte Änderungen an den Anwendung.
Wenn eine Anwendung nicht Terminal Server bekannt ist (auch als bekannt Legacy-Anwendung), macht Terminal Server bestimmte Änderungen an die Legacy-Anwendung, um es ordnungsgemäß in einem Multi-User funktioniert Umgebung. Zum Beispiel wird erstellen Terminal Server eine virtuelle Windows-Ordner, so dass jeder Benutzer einen Windows-Ordner wird statt Holen Sie das Windows-Verzeichnis des Systems. Dies gibt dem Anwender den Zugang zu ihre eigenen INI-Dateien. Darüber hinaus macht Terminal Server einige Anpassung an die Registrierung für eine Legacy-Anwendung. Diese Änderungen verlangsamen das Laden der Legacy-Anwendung auf Terminal Server.
Wenn eine Anwendung Terminal Server bekannt ist, muss es weder verlassen sich auf INI-Dateien noch schreiben zu HKEY_CURRENT_USER Registry während der Installation.
Wenn Sie / tsaware und Ihre Anwendung noch INI-Dateien, die Dateien werden von allen Benutzern des Systems geteilt werden. Wenn das akzeptabel, können Sie verknüpfen Sie Ihre Anwendung mit / tsaware; sonst müssen Sie / tsaware benutzen. NO
Eine Sache, nur hier angedeutet ist, dass Schattenschlüssel werden nur für Prozesse aktiviert, die sich nicht bewusst sind, TS.