4

C++ プログラムをコンパイルして、EXE ファイルをリリース モードにしました。EXE ファイルをエディターで開くと、テキスト ブロックの断片が表示されます。これらのほとんどは、プログラムで使用されている低レベル関数の名前です。

コンピュータはバイナリの機械語コードしか理解できないと言われています。では、実行可能プログラム ファイル内に人間が読めるこれらのテキストが存在する目的は何でしょうか? プログラムを実行するためにコンピュータが関数名を必要とするのはなぜですか?

ここに画像の説明を入力

IDE: Visual Studio 2015 RC
プラットフォーム: Windows 8.1 x64

コンパイラ コマンド ライン オプション:

/GS /GL /W3 /Gy /Zc:wchar_t /Zi /Gm- /Ox /Ob2 /sdl
/Fd"x64\Release\vc140.pdb" /Zc:inline /fp:precise /D "_MBCS"
/errorReport:prompt /GT /WX- /Zc:forScope /Gd /Oy /Oi /MD
/Fa"x64\Release\" /EHsc /nologo /Fo"x64\Release\" /Ot
/Fp"x64\Release\<ProjectName>.pch"

リンカー コマンド ライン オプション:

/OUT:"<SolutionPath>\x64\Release\<ProjectName>.exe"
/MANIFEST /LTCG /NXCOMPAT
/PDB:"<SolutionPath>\x64\Release\<ProjectName>.pdb"
/DYNAMICBASE "kernel32.lib" "user32.lib" "gdi32.lib" "winspool.lib"
"comdlg32.lib" "advapi32.lib" "shell32.lib" "ole32.lib" "oleaut32.lib"
"uuid.lib" "odbc32.lib" "odbccp32.lib"
/MACHINE:X64 /OPT:REF /PGD:"<SolutionPath>\x64\Release\<ProjectName>.pgd"
/MANIFESTUAC:"level='asInvoker' uiAccess='false'"
/ManifestFile:"x64\Release\<ProjectName>.exe.intermediate.manifest"
/OPT:ICF /ERRORREPORT:PROMPT /NOLOGO /TLBID:1

編集:

rcgldr's answerで変更を行いました。\MDコマンド ライン スイッチを に変更するプロジェクト設定の変更を行いました\MT。実行ファイルのサイズが 56kb から 436kb に変更されました。必要なライブラリが実行時にリンクされていないためだと思いますが、最初から EXE ファイルに格納されています。しかし、下のスクリーン ショットに示すように、EXE ファイルにはまだテキストのブロックがあります。標準テンプレート ライブラリ (STL) からの関数名は完全になくなりましたが、多くの Win32 API 関数名があります。今考えられる理由は何ですか?

ここに画像の説明を入力

4

2 に答える 2

1

Windows 上に構築された実行可能ファイルは、Portable Executable 形式を使用しました: https://msdn.microsoft.com/en-us/library/ms809762.aspx

DLL 内の関数にリンクするために、実行時に使用される関数のアドレスを含むインポート テーブルとエクスポート テーブルを使用して EXE が作成されます。SDK (または VC++?) ユーティリティ "dumpbin" を /exports または /imports と共に使用すると、モジュールからインポートまたはエクスポートされた関数を確認できます。DLL のレイアウトは、新しいバージョンが公開されると変更される可能性があるため、インポート テーブルとエクスポート テーブルは、動的にリンクされている別のモジュール内の関数のアドレスを呼び出し元が取得する方法です。

于 2015-07-19T00:23:36.260 に答える