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 関数名があります。今考えられる理由は何ですか?