GCC 4.7を使用して、1つのC ++ソースファイルのみで構成される大きなアプリをコンパイルしているため、コンパイルユニットは1つだけですが、長いヘッダーが多数含まれています。最終的に最適化された実行可能ファイルmyappは40MBですが、最適化されたオブジェクトファイルmyapp.oは101MBです。オブジェクトファイルがバイナリよりも大きい可能性はありますか?
「nm-ACmyapp」と「nm-ACmyapp.o」を実行して、一方が他方よりも劇的に多くのシンボルを持っているかどうかを確認しました。約1000のシンボルの違いがありますが、ほとんどの場合、バイナリがシンボルを追加するように期待されます。標準の例外処理と静的初期化用。
次に、両方で「readelf -a」を実行し、myapp.o用にこれを取得しました。
Number of section headers: 29186
Section header string table index: 29183
しかし、これはmyappの場合:
Number of section headers: 40
Section header string table index: 37
だから、それがサイズの違いを説明していると思いますが、これが何を意味するのか、またはサイズを小さくする方法は実際にはわかりません。私は間違った木を吠えていますか?私の目標はmyappのコンパイル時間を短縮することですが、最初に何が問題なのかを理解する必要があります。シンボルが問題である場合、GCCの-fvisibility = hiddenオプションを使用して調べることができますが、それが問題である場合は、nmでより多くの違いが予想されます。
編集:追加情報、私のソースファイルで定義されていないものはすべて動的にリンクされたライブラリからのものです。