のサイズを小さくするが、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セクションを減らす(またはコードを再構成する)ために何ができるのですか。正確にそこに格納されているものは何ですか?どんな提案も歓迎です!私は編集とリンクのより深い働きにはかなり新しいですが、学習します。
これらは、CおよびC++ランタイムライブラリからリンクされたエラーメッセージ文字列です。彼らはあなたのプログラムがクラッシュした理由をユーザーに伝えます。それらを取り除くには、正確には実用的ではないが、実行時ライブラリを書き直す必要がありますが、完了しています。 –