1

ちょっとした背景:組み込みセンサー システム用の AVR バイナリをビルドしようとしていますが、サイズ制限に近づいています。私はいくつかの外部ライブラリを使用していますが、ライブラリごとに 1 つのオブジェクトにコンパイルするとかなり大きくなります。これらを小さなオブジェクトにまとめて、必要な機能だけがプログラムにリンクされるようにしたいと考えています。大きなライブラリを分割することで、バイナリ サイズを 2k 減らすことができました。

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

4

1 に答える 1

0

オブジェクトレベルについてはわかりませんが、 と を使用してシンボルレベルでこれに取り組むことができると思います。これにより、参照されていないすべてのシンボルのコードが削除され、削除されたシンボルも表示されます。これは、何らかの理由でオブジェクト ファイル レベルに戻り、削除されたシンボルのみを含むオブジェクト ファイルを識別したい場合に役立ちます。CFLAGS="-fdata-sections -ffunction-sections"LDFLAGS="-Wl,--gc-sections -Wl,--print-gc-sections"

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

リストされたオプション名は、バイナリのサイズを縮小する方法に関する他の提案を stackoverflow で検索するのに役立つキーワードになる場合があります。gc-sectionsたとえば、現時点で 62 件の一致が得られます。

于 2012-06-26T17:46:22.443 に答える