Nachdem ich das Linker-Flag /TSAWARE zu einem meiner Projekte (Visual Studio 6) hinzugefügt hatte, war ich überrascht, einen neuen Abschnitt in der PE-Datei (.idata) zu finden. Wenn ich das Flag nicht setze, werden die Importe in .rdata zusammengeführt.
Um das "Problem" zu veranschaulichen, beginnen wir mit einem einfachen Konsolenprogramm:
#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
und kompilieren mit: cl /Og /O1 /GF /WX /c main.c
Dann verlinken 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
Vergleichen wir die Dumpbin-Ausgabe:
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
Aus irgendeinem Grund entscheidet der Linker also, dass die Importe nicht zusammengeführt werden können.
Aber wenn wir die editbin /TSAWARE a.exe
wird nur das Feld DLL-Merkmale im optionalen PE-Header geändert.
Kann mir das jemand erklären? Ist dies ein Fehler im Linker oder kann die ausführbare Datei, die von editbin geändert wurde, auf bestimmten Systemen nicht mehr funktionieren?