小编tem*_*lar的帖子

减少.rodata的大小

我在Gentoo中为ARM Cortex M3(Maple Mini)交叉编译C++,但在链接elf文件时似乎已经占据了内存资源的顶峰

/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
Run Code Online (Sandbox Code Playgroud)

这篇文章是关于如何减少.rodata内容大小的问题,以便能够完成elf文件的链接.

我已经删除了包含的代码,并使用以下相关选项进行编译.

CXXFLAGS = -fno-rtti -fno-exceptions -Os -fdata-sections -ffunction-sections -Wl,-gc-sections ...
LDFLAGS = -Wl,-gc-sections -fno-exceptions -fno-rtti ...
Run Code Online (Sandbox Code Playgroud)

仍然,map-file中的.rodata(我很陌生)包含了程序中每个类的某种类型信息.一些地图文件摘录(注意.MPU6050是一个SuperSensor <>,它是一个传感器<>,在C++意义上)

    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 …
Run Code Online (Sandbox Code Playgroud)

c++ embedded linker

7
推荐指数
2
解决办法
3276
查看次数

标签 统计

c++ ×1

embedded ×1

linker ×1