2012-12-25 5 views
7

のサイズを小さくするが、ELFファイルをリンクする際のメモリリソースと屋根を直撃しているように見える私はARMのCortex M3(メイプルミニ)のためにGentooにC++をクロスコンパイルしてい.rodataの

/usr/libexec/gcc/arm-none-eabi/ld: build/maple_mini.elf section `.rodata' will not fit in region `rom' 
/usr/libexec/gcc/arm-none-eabi/ld: region `rom' overflowed by 1508 bytes 

この投稿は、elf-fileのリンクを完了できるように、.rodataの内容のサイズを縮小する方法に関する質問です。

私は含まれているコードを削除し、以下の関連するオプションでコンパイルしています。

CXXFLAGS = -fno-rtti -fno-exceptions -Os -fdata-sections -ffunction-sections -Wl,-gc-sections ... 
LDFLAGS = -Wl,-gc-sections -fno-exceptions -fno-rtti ... 

それでも、マップ・ファイル内の.rodataのは(これで私は非常になじみのない午前)プログラム内の各クラスの型情報のいくつかの種類のようです何が含まれています。いくつかのマップ・ファイルの抜粋(ノート。MPU6050は、C++の意味で、センサー<あるSuperSensor <>>です)

0x000000000801d6c0  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d6c0 _ZTVN5syrup6SensorILi6EEE 
.rodata._ZTVN5syrup11SuperSensorILi6EEE 0x000000000801d6e8  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d6e8    _ZTVN5syrup11SuperSensorILi6EEE 
.rodata._ZTVN5syrup7MPU6050E 0x000000000801d710  0x28 .../libsyrup.a(MPU6050.o) 
    0x000000000801d710    _ZTVN5syrup7MPU6050E 
.rodata._ZTVN5syrup6SensorILi1EEE 
    0x000000000801d738     0x28 .../libsyrup.a(MS5611.o) 
    0x000000000801d738    _ZTVN5syrup6SensorILi1EEE 
.rodata._ZTVN5syrup11SuperSensorILi1EEE 
      0x000000000801d760   0x28 .../libsyrup.a(MS5611.o) 
      0x000000000801d760    _ZTVN5syrup11SuperSensorILi1EEE 
... 
      0x000000000801ee24   0x6f3 .../libstdc++.a(cp-demangle.o) 
             0x730 (size before relaxing) 
*fill*   0x000000000801f517  0x1 
.rodata  0x000000000801f518  0x14 .../libgcc.a(unwind-arm.o) 
.rodata  0x000000000801f52c  0x23c .../libc.a(lib_a-strerror.o) 
.rodata.str1.4 0x000000000801f768 0x635 .../libc.a(lib_a-strerror.o) 
             0x63c (size before relaxing) 

ので、 lib_a-strerror.o と CP-demangle.o 私はこれらが非常に重要だと思いますが、ほとんどのスペースを占めるものと思われます。

私の質問は、.rodataセクションを減らす(またはコードを再構成する)ために何ができるのですか。正確にそこに格納されているものは何ですか?どんな提案も歓迎です!私は編集とリンクのより深い働きにはかなり新しいですが、学習します。

+0

これらは、CおよびC++ランタイムライブラリからリンクされたエラーメッセージ文字列です。彼らはあなたのプログラムがクラッシュした理由をユーザーに伝えます。それらを取り除くには、正確には実用的ではないが、実行時ライブラリを書き直す必要がありますが、完了しています。 –

答えて

7

あなたの問題は必ずしもロッドセクションにあるとは限りません。それは、筋肉椅子のイベントで時間通りに座っていなかった人です。言い換えれば、ロナタ自体は大きすぎるものではありませんが、全体像は大きすぎてフィットしません。解決策は、システム内のコード、データ、棒グラフ全体を見て、目立つものがあるかどうかを確認することです。

一般的に不必要なコード(または文字列)を削除することが重要なポイントです。削除できるものがなければ、問題を解決する別の方法を見つけなければなりません。 1つの方法は、コードとデータを圧縮し、RAMに圧縮解除することです(ターゲットシステムのROMよりもRAMがかなり多いと仮定して)。これはあまり問題のないことではありませんが、誰かが本当に悪いコーディングを行い、数百キロバイトのコードを追加しない限り、修正するのは簡単ではありません。あなたがバージョンコントロールシステムを持っていて、それに合ったバージョンを知っているなら、スペアスペースがどれくらいあるかを正確にチェックするのが良いかもしれません。突然大きくなった場合、誰かが大量の静的データ構造物などがあります。

+1

ありがとう、 さらにクリーンアップで、私は自分自身を詰まらせた標準ライブラリの部分を含む主要ルートであるような迷惑なアサルトインクルードを見つけました。ここでの主なポイントは、stdlib(新規および削除演算子を含む)への依存を最小限に抑えることです。 – templar

6

基本的な問題は、.rodataセクションが大きすぎるということではなく、必ずしも一般的なROMスペースを使い果たしているということではありません。 (それはそのセクションにリンクている間のリンカーは、ちょうど限界を打つことを起こる。)あなたキロバイトを保存する必要がありますstrerror.oへの依存を落とす終わるべきで、そのようなperrorstrerror、そして会社としての機能への呼び出しを削除する

、半分はあなたが終わったところです。あなたがそれらの同じ貯蓄をすることができる他の、より簡単な方法があるかもしれません - あなたのアプリケーションに依存します。

関連する問題