/TSAWARE リンカー フラグは PE 実行可能ファイルに対して何をしますか?
-
12-09-2019 - |
質問
/TSAWARE リンカー フラグをプロジェクトの 1 つ (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
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 によって変更された実行可能ファイルが特定のシステムで動作しなくなる可能性がありますか?
解決
のみの推測:ターミナル・サーバ・システム上で、あなたは画像が可能と書かれたいくつかのページを持っていると思います。画像に対応するメモリページが変更されていない場合、物理RAMの単一のページは、その画像を用いているeashセッションにマッピングすることができます。画像からページが変更された場合、システムは、すべてのセッションの中のページの各インスタンスのコピー・オン・ライト動作を実行し、各セッション内のページを表すために、物理メモリの異なるブロックを使用しなければならない。
インポートされているDLLが再配置されなければならなかった場合は、画像のための輸入は、多くの場合、輸入を保持するページは頻繁に変更されますので、セッション間での共有に参加できない、最高に固定する必要がありますので。リンカは通常は修正されていない他のデータと輸入をマージした場合、それが不必要にコピー・オン・ライトのページ数が増加する可能性があります。
このは、セッション間でコピーされたページの数を減らすことができます最適化の一種かもしれません。
私も言ったように - これは純粋に推測です。
。他のヒント
@WarrenPからのコメントは正しいです。 MSDNのドキュメントするによると:
/ TSAWAREオプションはIMAGE_OPTIONAL_HEADERにフラグを設定します 番組映像のオプションヘッダにDllCharacteristicsフィールド。いつ このフラグが設定され、ターミナルサーバーはに特定の変更をすることはありません アプリケーションます。
アプリケーションはまたとして知られている認識してターミナルサーバーは(ない場合 レガシー・アプリケーション)、ターミナルサーバーは、特定の変更を行います それは、マルチユーザーで正しく動作させるために、レガシー・アプリケーション 環境。たとえば、ターミナルサーバーは、仮想を作成します。 Windowsフォルダ、各ユーザが取得するようWindowsフォルダの代わりに、 システムのWindowsディレクトリを取得。これにより、ユーザーはにアクセスすることができます 自分のINIファイル。また、ターミナルサーバーは、いくつかを作ります レガシーアプリケーションのレジストリへの調整。これら 変更は、ターミナル上でレガシーアプリケーションの読み込みを遅らせます サーバーます。
アプリケーションは、ターミナルサーバーを認識している場合は、、それは頼りにはならない、どちらも INIファイルやセットアップ時にHKEY_CURRENT_USERレジストリへの書き込みます。
あなたが/ TSAWAREし、アプリケーションを使用する場合は、まだ、INIファイルを使用しています ファイルには、システムのすべてのユーザーによって共有されます。それがある場合 許容可能な、あなたはまだ/ TSAWAREを使用してアプリケーションをリンクすることができます。 そうでなければ、/ TSAWAREを使用する必要があります。NO
ここだけを示唆したことの一つは、シャドウキーのみを意識TSされていないプロセスに対して有効になっていることである。