我正在为 ARM Cortex M3(Maple Mini)在 Gentoo 中交叉编译 C++,但在链接 Sprite 文件时似乎已经遇到了内存资源的问题/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这个帖子是一个关于如何减少.rodata内容大小的问题,以便能够完成elf-file的链接。我已经剥离了包含的代码,并使用以下相关选项进行编译。CXXFLAGS = -fno-rtti -fno-exceptions -Os -fdata-sections -ffunction-sections -Wl,-gc-sections ...LDFLAGS = -Wl,-gc-sections -fno-exceptions -fno-rtti ...尽管如此, map 文件中的 .rodata(我对它并不熟悉)似乎包含程序中每个类的某种类型信息。一些 map 文件摘录(注意。MPU6050 是一个 SuperSensor,它是一个 Sensor,在 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.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 部分,以及那里究竟存储了什么?欢迎任何建议!我对编译和链接的更深入的工作还很陌生,但是学习。 (adsbygoogle = window.adsbygoogle || []).push({}); 最佳答案 我认为您的问题可能不一定出在 rodata 部分 - 只是那个人没有在 muscal chairs 事件中及时坐下。换句话说,rodata 本身并不是太大,而是整个图像太大而无法容纳。解决方案是查看系统中的整个代码、数据和数据,看看是否有任何突出之处。通常删除不必要的代码(或字符串)将是这里的关键点。如果没有什么可以删除,那么您将不得不寻找不同的方法来解决问题。一种方法可能是压缩代码和数据,然后将其解压缩到 RAM 中(假设目标系统上的 RAM 比 ROM 多得多)。这不是一个闻所未闻的问题,但它从来没有那么容易修复 - 除非有人做了一些非常糟糕的编码并添加了数百 KB 的代码。如果你有一个版本控制系统,并且你知道一个适合的版本,那么检查一下有多少空闲空间可能是一件好事——如果它突然增加了很多,检查是否有人添加了一些大量的静态数据结构或一些类似的。 (adsbygoogle = window.adsbygoogle || []).push({});
10-06 10:41