11

次の行を含むファイルを作成しました。

int main() { return 0; }

これをコンパイルした後、この単純なプログラムのバイナリーが 8328 バイトであることに驚きました。この 8328 バイトでバイナリは一体何をしているのでしょうか。確かにこのプログラムは数行のアセンブリで表現できます。

注:これを次の行でコンパイルしました:

g++ main.cpp

私のg ++​​バージョンはg++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

4

3 に答える 3

29

そのバイナリにはたくさんあります:

  • バイナリを自己記述型にするためのヘッダー(実行fileしてみてください)
  • stripツールが自動的に削除する(またはリンクするgcc -s)シンボルテーブル
  • 使用したことのない共有ライブラリの名前と場所(私のボックスには5つあり、ツールlddstringsツールを試してください)
  • これらのライブラリをロードしてセットアップargcargv、次に呼び出すスタートアップコードmain
  • mainオペレーティングシステムにの戻り値を返すシャットダウンコード。

コミック効果を得るには、そのプログラムを静的にリンクしてみてください。バイナリには、通常はDLLに動的にリンクされる関数が含まれます。(ただし、このオプションを使用すると、展開が簡素化されます)

于 2012-07-30T16:33:57.940 に答える
3

結果のファイルのバイナリダンプを実行し、それをチェックしてください!

それはほとんど空のスペースです。バイナリのデータはページに編成されます(通常、サイズは4096または8192バイト)。そのため、ページを効率的にメモリマップすることができます。通常、最初のページにはバイナリをロードする方法の説明が含まれています-コードはファイルのこの位置にあり、この場所にマップされ、データなどでも同じです。2番目のページはおそらくコードであり、3番目のページには記号が含まれますおよびデバッグ情報。各ページはおそらくほとんど空です。

于 2012-07-30T16:35:19.530 に答える
2

気にしないでください。

それほど単純ではないプログラムを作成しようとすると、コードが数百キロバイトになり始めるまで、サイズがそれほど変わらないことがわかります。

簡単に言うと、OSモジュール間の「インフラストラクチャ」を構成する標準ライブラリの一部と、プログラムの起動と終了を管理するC++セマンティクス(グローバル変数、標準入力と出力などを初期化および破棄するすべてのもの)があります。

さらに、C++ シンボルをメモリ アドレスにマップするすべてのもの (削除する必要がなかった場合は、オプションを試して削除-O3 -s-gます) により、デバッガーは実行中に適切なソース コード参照を表示できます。

また、メモリのレイアウト方法により、通常、バイナリは固定サイズのチャンクで構成されます。プログラムはさらに短くてもかまいませんが、少なくとも 1 つのコード セグメント、1 つのデータ セグメント初期化子、および 1 つの共有セグメント (定数値用) が存在する必要があります。

于 2012-07-30T16:43:30.157 に答える