11

私は、楽しみと利益のために、C++のベアメタルcortex-M3に取り組んでいます。いくつかのコンテナが必要だったので、STLライブラリを使用します。アロケーターを提供するだけでは、使用するものだけが得られるため、最終的なバイナリに多くのコードを追加することはないと思いました。

それはすべてテンプレートコードだと思っていたので、実際には、STL(アロケータを与える)とのリンクプロセスをまったく期待していませんでした。

ちなみにコンパイル中です-fno-exception

残念ながら、私のバイナリには約600KB以上が追加されています。nmを使用して、最終的なバイナリに含まれている記号を調べましたが、それは冗談のようでした。リストはとても長いので、私はそれを通り過ぎようとはしません。いくつかの弱いシンボルがありますが。

リンカによって生成された.mapファイルも調べたところ、scanfシンボルも見つかりました。

.text
0x000158bc       0x30   /CodeSourcery/Sourcery_CodeBench_Lite_for_ARM_GNU_Linux/bin/../arm-none-linux-gnueabi/libc/usr/lib/libc.a(sscanf.o)
0x000158bc                __sscanf
0x000158bc                sscanf
0x000158bc                _IO_sscanf

と:

$ arm-none-linux-gnueabi-nm binary | grep scanf
000158bc T _IO_sscanf
0003e5f4 T _IO_vfscanf
0003e5f4 T _IO_vfscanf_internal
000164a8 T _IO_vsscanf
00046814 T ___vfscanf
000158bc T __sscanf
00046814 T __vfscanf
000164a8 W __vsscanf
000158bc T sscanf
00046814 W vfscanf
000164a8 W vsscanf

どうすればこれをデバッグできますか?最初に、GCCがリンクに何を使用しているのかを正確に理解したかった(私はGCCを介してリンクしている)。テキストセグメントで記号が見つかった場合、セグメント全体が使用されることは知っていますが、それでも多すぎます。

これに取り組む方法についての提案は本当にありがたいです。

ありがとう

4

2 に答える 2

6

GCC-v-Wl,-vオプションを使用すると、使用されているリンカーコマンド(およびリンカーのバージョン情報)が表示されます。

どのバージョンのGCCを使用していますか?GCC 4.6( PR44647およびPR43863を参照)にいくつかの変更を加えて、組み込みシステムを支援するためにコードサイズを縮小しました。表示されているIOシンボルの包含を無効にできるようにするための未解決の拡張要求(PR 43852)がまだあります。それらの一部は、アクティブな例外でプロセスが終了したときにメッセージを出力する冗長終了ハンドラーからのものです。execptionsを使用していない場合、そのコードの一部は役に立ちません。

于 2012-07-21T18:06:17.017 に答える
2

問題はSTLに関するものではなく、標準ライブラリに関するものです。

STL自体は(ある意味で)純粋ですが、標準ライブラリにはこれらすべてのストリームパッケージも含まれておりlibc、同様にプルすることができたようです...

問題は、標準ライブラリが分離されることを意図したものではなかったため、C標準ライブラリからのものを再利用することにあまり関心がなかったかもしれないということです...

最初に、コンパイル時に(strace たとえばを使用して)どのファイルが取り込まれるかを特定する必要があります。これにより、ヘッダーのみのファイルのみを使用していることを確認できます。

次に、発生したリンクを削除してみてください。たとえば、標準のライブラリフリービルドが必要であることを正確にgccに渡すオプションがありますが、--nostdlibここで正確に指示するのに十分な知識はありません。

于 2012-07-21T17:11:09.933 に答える