2012-05-14 6 views
1

少し背景:私は組み込みセンサーシステム用のAVRバイナリを構築しようとしていますが、サイズ制限に近づいています。私はいくつかの外部ライブラリを使って私を助けていますが、ライブラリごとに1つのオブジェクトにコンパイルするとかなり大きくなります。私はこれを小さなオブジェクトに変換したいので、必要な機能だけが自分のプログラムにリンクされています。私は既に大きなライブラリを分割することによってバイナリサイズを2k減らすことができました。GNUはリンク中に必要な.oファイルを印刷するように指示できますか?

ゲームの各段階でどのオブジェクトが使用されているかを知ると、より効率的に分割できます。 ldがリンクしているオブジェクトを印刷する方法はありますか?

+0

AFAIK ldは、実際に使用されている関数でのみリンクする必要があります。 Sidenote:-O最適化を使用していますか? – dbrank0

+0

はい、今は-O3までになっています。なぜldが追加のコードを引っ張るのかわかりませんが、大きなライブラリの1つを分割すると、バイナリサイズが大幅に縮小されます。 –

+3

結果の実行可能ファイルに 'nm -a'を使います。これは*ソース*ファイルの名前を含むデバッグシンボルをリストします。 –

答えて

0

私はオブジェクトレベルについてはよく分からないんだけど、私はあなたがCFLAGS="-fdata-sections -ffunction-sections"LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"を使用してシンボルレベルでこれに取り組むことができるかもしれないと考えています。これにより、参照されていないすべてのシンボルのコードが取り除かれ、削除されたシンボルが表示されるはずです。何らかの理由でオブジェクトファイルレベルに戻り、削除されたシンボルのみを含むオブジェクトファイルを特定する場合に便利です。

私が引用したコンパイラフラグは、各関数またはグローバル変数をセクションに配置するようにコンパイラに要求し、--gc-sectionsリンカフラグは使用されていないセクションをすべて削除します。各オブジェクトファイルには、その中の関数がすべて単一のセクションを共有していても、独自のセクションが含まれていることがあります。その場合、リンカーのフラグだけで、あなたが求めていることをする必要があります:使用されていないオブジェクト全体を削除します。 gccのマニュアルでは、コンパイラのフラグがオブジェクトのサイズを増やすと述べていますが、最終的な実行ファイルがこの影響を受けてはならないことを願っていますが、私は確かに分かりません。だから、LDFLAGS="-Wl,--gc-sections

リストされたオプション名は、バイナリのサイズを縮小する方法に関する他の提案については、stackoverflowで検索するのに便利なキーワードです。例えば、gc-sections。現在では62試合が行われます。

関連する問題