私はオブジェクトレベルについてはよく分からないんだけど、私はあなたがCFLAGS="-fdata-sections -ffunction-sections"
とLDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"
を使用してシンボルレベルでこれに取り組むことができるかもしれないと考えています。これにより、参照されていないすべてのシンボルのコードが取り除かれ、削除されたシンボルが表示されるはずです。何らかの理由でオブジェクトファイルレベルに戻り、削除されたシンボルのみを含むオブジェクトファイルを特定する場合に便利です。
私が引用したコンパイラフラグは、各関数またはグローバル変数をセクションに配置するようにコンパイラに要求し、--gc-sections
リンカフラグは使用されていないセクションをすべて削除します。各オブジェクトファイルには、その中の関数がすべて単一のセクションを共有していても、独自のセクションが含まれていることがあります。その場合、リンカーのフラグだけで、あなたが求めていることをする必要があります:使用されていないオブジェクト全体を削除します。 gccのマニュアルでは、コンパイラのフラグがオブジェクトのサイズを増やすと述べていますが、最終的な実行ファイルがこの影響を受けてはならないことを願っていますが、私は確かに分かりません。だから、LDFLAGS="-Wl,--gc-sections
。
リストされたオプション名は、バイナリのサイズを縮小する方法に関する他の提案については、stackoverflowで検索するのに便利なキーワードです。例えば、gc-sections
。現在では62試合が行われます。
出典
2012-06-26 17:46:22
MvG
AFAIK ldは、実際に使用されている関数でのみリンクする必要があります。 Sidenote:-O最適化を使用していますか? – dbrank0
はい、今は-O3までになっています。なぜldが追加のコードを引っ張るのかわかりませんが、大きなライブラリの1つを分割すると、バイナリサイズが大幅に縮小されます。 –
結果の実行可能ファイルに 'nm -a'を使います。これは*ソース*ファイルの名前を含むデバッグシンボルをリストします。 –