binファイルを作成する際に、gnuコンパイラで未使用の変数と関数にスペースが割り当てられます。
2 に答える
依存します。たとえば、最適化レベルで。
バイナリに何かが表示されることを確認したい場合は、を使用してください__attribute__((used))
。
関数に付加されたこの属性は、関数が参照されていないように見える場合でも、関数のコードを発行する必要があることを意味します。これは、たとえば、関数がインラインアセンブリでのみ参照される場合に役立ちます。C ++クラステンプレートのメンバー関数に適用される場合、属性は、クラス自体がインスタンス化される場合に関数がインスタンス化されることも意味します。
src。特定のシンボルの存在に依存するバイナリに関連付けられたダイナミックリンクライブラリがある場合に非常に便利です。
未使用のものがバイナリに表示されないようにする場合は、デバッグシンボルを使用してコンパイルし、表示されないことを確認します。未使用のローカル変数が最適化されていることを確認するために、分解されたコンパイル済みバイナリをステップ実行するよりも良い方法はわかりません。
GCCは、グローバル変数とすべての外部関数を、使用されているかどうかに関係なく、オブジェクトコードに配置します。ただし、初期化されていないデータは通常、スペースを取りません。
自動変数は実行時に割り当てられるため、これらはバイナリに格納されません。
たとえば、GNU ldを使用して、リンカーにコードを削除するように依頼できる場合があります。
gcc -o foo foo.c -Wl,--gc-sections
これにより、未使用の変数と関数が最終的なコードから削除される可能性があります。