mam crosscompiling C++ w Gentoo dla ARM Cortex M3 (Maple Mini), ale wydaje się, że uderzył w dach z zasobów pamięci podczas łączenia się elf plikZmniejszenie rozmiaru .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
Ten post jest pytaniem o to, jak zmniejszyć rozmiar zawartości .rodata, aby móc zakończyć linkowanie pliku elfa.
Usunąłem załączony kod i kompiluję z następującymi właściwymi opcjami.
CXXFLAGS = -fno-rtti -fno-exceptions -Os -fdata-sections -ffunction-sections -Wl,-gc-sections ...
LDFLAGS = -Wl,-gc-sections -fno-exceptions -fno-rtti ...
Nadal, .rodata w MAP-pliku (z których jestem całkiem obcy) zawiera, co wydaje się być pewnego rodzaju informacji o typie dla każdej z klas w programie. Niektóre fragmenty map-file (uwaga. MPU6050 jest SuperSensor <> który jest czujnikiem <> w C++ sens)
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)
Więc lib_a-strerror.o i cp-demangle.o wydaje się być tym, co zajmuje najwięcej miejsca, choć wydaje mi się, że są one bardzo ważne.
Moje pytanie brzmi, jakie dalsze kroki mogę podjąć, aby zmniejszyć (lub zrestrukturyzować kod) sekcję .rodata i co dokładnie tam zapisano? Wszelkie sugestie są mile widziane! Jestem całkiem nowy w głębszym działaniu kompilacji i łączenia, ale w nauce.
Są to ciągi komunikatów o błędach połączone z bibliotekami wykonawczymi C i C++. Informują użytkownika, dlaczego program się zawiesił. Pozbycie się ich wymagałoby przepisania bibliotek uruchomieniowych, co nie jest praktycznie praktyczne, ale zostało już zrobione. –