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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top