После добавления флага компоновщика / TSAWARE в один из моих проектов (Visual Studio 6) я с удивлением обнаружил новый раздел в файле 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
Давайте сравним вывод дампа:
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, не работает на некоторых системах?