6

まったく何もしない C ファイルをコンパイルしました (main返される a だけで、"Hello, world" も出力されません)。さまざまなコンパイラ (MinGW GCC、Visual C++、Windows DDK、等。)。それらはすべて、標準の C ランタイムとリンクしています。

しかし、私が得られないのは、16 進エディター (または逆アセンブラー) でファイルを開くと、16 KB のほぼ半分が 0x00 バイトまたは 0xCC バイトの巨大なセクションであることがわかるのはなぜですか? 私にはかなりばかげているように思えます...これらの発生を防ぐ方法はありますか?そして、そもそもなぜ彼らはそこにいるのですか?

ありがとうございました!

4

2 に答える 2

10

通常、実行可能ファイルには、コード セグメントと少なくとも 1 つのデータ セグメントが含まれます。これらのそれぞれには標準の最小サイズがあり、8K になる可能性があると思います。また、未使用のスペースはゼロで埋められます。また、(アセンブリよりも) 高レベルの言語で記述された EXE には、独自のコードとデータの直接変換に加えて、いくつかの余分なものが含まれていることに注意してください。

  • 起動および終了コード (C およびその後継コードでは、これは入力引数を処理し、 を呼び出しmain()、終了後にクリーンアップしますmain())
  • スタブ コードとデータ (たとえば、Windows 実行可能ファイルには、「このプログラムは DOS では実行できません」というメッセージを表示することだけを目的とした小さな DOS プログラム スタブが含まれています)。

それでも、実行可能ファイルは通常何かを行うことになっているため (つまり、コードとデータセグメントには有用なものが含まれています)、ストレージは安価であるため、デフォルトでは誰もあなたのケースに合わせて最適化しません :-)

ただし、ほとんどのコンパイラには、強制的にスペースを最適化できるコマンド ライン パラメータがあると思います。その設定で結果を確認することをお勧めします。

EXE ファイル形式の詳細は次のとおりです。

于 2011-01-05T09:50:01.290 に答える
5

結局のところ、私はこれを事前に推測できたはずです...答えはデバッグシンボルとコードでした。それらはほとんどのスペースを占めていました。/DEBUG および /PDB を使用してコンパイルしない (私は常にデフォルトで実行しています) と、13 K が 3 K に減少しました。

于 2011-01-05T19:36:09.433 に答える