プロジェクトの 1 つ (Visual Studio 6) に /TSAWARE リンカー フラグを追加した後、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
、PE オプション ヘッダーの DLL 特性フィールドのみを実行すると、変更されます。
誰かが私にこれを説明できますか? これはリンカのバグですか、それとも editbin によって変更された実行可能ファイルが特定のシステムで動作しなくなる可能性がありますか?