web-dev-qa-db-ja.com

コードベースのどの部分がバイナリを大きくしていますか?

シミュレータ用のコードをいくつか作成しました。現在、TIの無料ツールチェーンを使用して、64kbのnvramでターゲットにクロスコンパイルしようとしています。コンパイラは、私のコードがROMを約34 kb超えていると主張しています。

(...) msp430-elf/bin/ld: region `ROM' overflowed by 33716 bytes

別の行では、.textフィールドを割り当てられたスペースに入れます。私の追加が合計34kbであるとは信じられません。この量でバイナリがオーバーフローすることは言うまでもありません。

  • 私のコードがプロジェクトに追加した.oファイルは、プロジェクトの合計のわずかな部分(1.9MBの200kb)であり、最初からプロジェクトに含まれていた多くのコンポーネントを取り出しました。
  • 私はすでにコンパイラに_-Os -sフラグ。
  • 新しいコードには、約100文字の文字列リテラルがあります。
  • 私のコードは多くのmath.h関数(実際には浮動小数点演算を行う唯一の部分です)、strtodを呼び出し、sprintfを呼び出します

バイナリが非常に大きくなる原因を分解するツールまたは方法はありますか?

24
enthdegree

.mapファイルを表示するための小さくて簡単なguiであるAMAPもあります。 http://www.sikorskiy.net/prj/amap/

シンボルサイズを視覚的に比較できるkdirstatのようなツールがあれば良かったでしょう。

質問に対する直接的な答えではありませんが、私はVoidwareのCORDIC実装を使用して、<math.h>https://github.com/enthdegree/cordic_wrapped

0
enthdegree

GNU binutilsには、各シンボルまたは各オブジェクトファイルのサイズを決定するのに役立つツールがあります。

たとえばsizeを見てください: https://manpages.debian.org/jessie/binutils/size.1.en.html

nmも試してみる価値があります。オブジェクトコードの各シンボルのサイズを表示できるためです。 https://manpages.debian.org/jessie/binutils/nm.1.en。 html

sizenmの出力を注意深く調べると、何が多くのスペースを占有し、何が占有しないのかがわかります。

printfsprintf、およびより複雑なライブラリ関数の多くは、多くの場合、かなりの数キロバイトの余分なROMを占有することがあります。

ソフトフロートを使用した浮動小数点サポートは、ハードフロートを使用した場合、つまりソフトウェアエミュレーションとハードウェア命令を使用して浮動小数点を処理する場合と比較して、コードを膨張させます。

時にはコンパイラは驚くほどの肥大化を追加します:)

20
Morten Jensen

私はかつて、小さなMSP430コントローラーでメモリの問題も抱えていました。負の値が可能な場合、または浮動小数点が使用されている場合、TIツールチェーンは大きなライブラリをバイナリにリンクしています。私の場合、総メモリ使用量の約10%-20%でした。

TIの無料のコードcomposer Studioは非常に強力なメモリ視覚化を提供します(表示->メモリ割り当て)

リンカの設定やその他の最適化オプションで初期化モデルを変更することで大きな助けになりました。現在、MSP430コントローラーを使用していないため、詳細を説明することはできません。

6
A.R.C.