【问题标题】:Section `text` will not fit after upgrading `arm-none-eabi-gcc`升级 `arm-none-eabi-gcc` 后部分 `text` 将不适合
【发布时间】:2019-09-16 19:47:16
【问题描述】:

我有一个open source micromouse robot project。为了更容易编译,我使用容器(Podman 和 Docker 应该都可以):

make image
make libopencm3
make

这可以正常工作并生成一个大小约为 874 kB 的main.elf 文件。但只要我在 Dockerfile 中将 arm-none-eabi-gcc-cs 修复为 7.4.0

如果我删除特定版本或将其设置为9.2.0,则会收到以下错误:

$ make
/usr/lib/gcc/arm-none-eabi/9.2.0/../../../../arm-none-eabi/bin/ld: main.elf section `.text' will not fit in region `rom'
/usr/lib/gcc/arm-none-eabi/9.2.0/../../../../arm-none-eabi/bin/ld: region `rom' overflowed by 5288 bytes
collect2: error: ld returned 1 exit status
make: *** [opencm3/libopencm3.rules.mk:204: main.elf] Error 1

这些版本之间会发生什么变化?

如果我将此行添加到我的 Makefile:

LDFLAGS         += -specs=nano.specs

然后它可以使用版本9.2.0 编译并生成一个大小约为885 kB 的main.elf 文件。但我想知道性能是否会与以前相同(或相当)。

更新

当然,我期待一些性能差异,就像我期待二进制大小的一些差异一样。但我想知道我是否可以期望性能差异超过 20%(特别是如果它现在可以慢 20%)。

新的二进制文件比以前大了不到 2%,我认为这与以前“相同”。 :-D

【问题讨论】:

  • 性能预计会因使用不同的 gcc 版本而改变。 (不要假设更好)。由于您更改了编译器和设置,因此您只需测试它的功能和性能。性能取决于您的应用程序。
  • @old_timer 是的,我期待一些(希望很小,nano.specs 而现在 9.2.0 没有。或类似的东西。一个明显的变化可能会迫使我现在将规格设置为nano.specs。否则,仅从上面发布的更改中,我是否可以预期性能会有很大差异? (> 20%)。当然,我需要对其进行测试,但不确定何时可以进行测试,因此我一直在寻找猜测/估计是否可能。 :-)
  • 很有可能。还取决于您在何处以及如何获得工具链二进制文件。前一个可能有许多设置,或者默认的一种方式,或者构建器可以设置它们的一种方式。而这个可以有另一种方式的默认值,或者构建器以另一种方式设置它们。这可能是不同的。编译器的输出确实会随着时间的推移而变化,并且不一定会变得更好,因此预计会有一些差异,希望只有几个百分点,但您只需要尝试一下。
  • @old_timer 谢谢。将其发布为答案。如果没有人说,我会接受你的正确答案(即:没有办法知道,但尝试)。 :-D
  • @old_timer 如果你能谈谈你曾经(或你认识的人)发生过类似事情的经历会有所帮助:一个新的二进制文件大小大致相同( 20%。除非工具链中存在错误,否则我绝对不会想到这一点。由于 GCC 被广泛使用并且我的项目是一个“玩具项目”,我想说我不太可能在 GCC 的代码中发现错误。但是当然,我的经验非常有限,所以我可能完全错了! :-D

标签: gcc arm newlib libopencm3


【解决方案1】:

我完全理解您希望使用您喜欢的主流 Linux 发行版中最新最好的工具链,但这并不总是顺利。

依我的拙见,你应该:

  • 坚持使用LinaroARM gcc 工具链,
  • 对于您的特定 cortex-m 相关项目,请坚持使用更专门针对 cortex-m 的 gcc 工具链,即所谓的“GNU Arm Embedded Toolchain”。

一些备注:

  • ARM 本身为这两个配置文件提供两个特定工具链的原因可能很充分,
  • Linaro 提供的最新 GCC 工具链版本是 7.4.1,但如果他们过去在此 page 上默认指向它,他们现在指向版本 7.2.1,这可能(或不)敲响关于7.4.1 - 目前还没有正式的 9.2 版本。
  • ARM 提供的最新 GCC 工具链是用于 cortex-m 的 8.3.1 和用于 cortex-a 的 8.3 - 尚无可用的官方 9.2 版本。

现在回到您的具体问题:我能够使用以下步骤编译您的项目:

wget "https://developer.arm.com/-/media/Files/downloads/gnu-rm/8-2019q3/RC1.1/gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2?revision=c34d758a-be0c-476e-a2de-af8c6e16a8a2?product=GNU%20Arm%20Embedded%20Toolchain,64-bit,,Linux,8-2019-q3-update" -O gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2
mkdir -p /opt/arm
tar jxf gcc-arm-none-eabi-8-2019-q3-update-linux.tar.bz2 -C /opt/arm
export PATH=/opt/arm/gcc-arm-none-eabi-8-2019-q3-update/bin:$PATH

命令which arm-none-eabi-gcc 应该显示/opt/arm/gcc-arm-none-eabi-8-2019-q3-update/bin/arm-none-eabi-gcc

git clone --recurse-submodules https://github.com/Bulebots/bulebule.git
cd bulebule
scripts/setup_libopencm3.sh
make -s -C src/

命令arm-none-eabi-size ./src/main.elf 应该显示:

text    data     bss     dec     hex filename
55152    3336    7100   65588   10034 ./src/main.elf

请注意,针对 cortex-m 配置文件here 的 ARM 最新 GCC 工具链有一个 Docker 文件。您可能希望在自己的 Docker 文件中使用它并删除这两行:

arm-none-eabi-gcc-cs-7.4.0 \
arm-none-eabi-newlib-3.1.0-2.fc30 \

我希望这会有所帮助。

【讨论】:

  • 谢谢!我会看看 Linaro/ARM 工具链并尝试一下。
  • @Peque 在(假设的)情况下,您会对上述答案感到满意,请不要忘记接受它 - 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
相关资源
最近更新 更多