升级 arm-none-eabi-gcc 后,text 部分将不适合
Section `text` will not fit after upgrading `arm-none-eabi-gcc`
我有一个open source micromouse robot project。为了更容易编译,我使用容器(Podman 和 Docker 都应该没问题):
make image
make libopencm3
make
这工作得很好,并生成了一个 main.elf
大小约为 874 kB 的文件。但只要我在 Docker 文件中将 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
上编译得很好,并生成一个 main.elf
大小约为 885 kB 的文件。但我想知道性能是否与以前相同(或等效)。
更新
当然,我预计会有一些性能差异,就像我预计二进制大小会有一些差异一样。但我想知道我是否可以预期性能差异超过 20%(特别是如果它现在可以慢 20%)。
新的二进制文件大了不到 2%,我认为这和以前一样是 "the same"。 :-D
我完全理解您想使用您首选的主流 Linux 发行版中最新最好的工具链,但这并不总是顺利。
以我拙见,你应该:
- 坚持使用 Linaro or ARM 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
请注意,ARM 的最新 GCC 工具链有一个 Docker 文件,目标是 cortex-m 配置文件 here。您可能想在自己的 Docker 文件中使用它并删除这两行:
arm-none-eabi-gcc-cs-7.4.0 \
arm-none-eabi-newlib-3.1.0-2.fc30 \
希望对您有所帮助。
我有一个open source micromouse robot project。为了更容易编译,我使用容器(Podman 和 Docker 都应该没问题):
make image
make libopencm3
make
这工作得很好,并生成了一个 main.elf
大小约为 874 kB 的文件。但只要我在 Docker 文件中将 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
上编译得很好,并生成一个 main.elf
大小约为 885 kB 的文件。但我想知道性能是否与以前相同(或等效)。
更新
当然,我预计会有一些性能差异,就像我预计二进制大小会有一些差异一样。但我想知道我是否可以预期性能差异超过 20%(特别是如果它现在可以慢 20%)。
新的二进制文件大了不到 2%,我认为这和以前一样是 "the same"。 :-D
我完全理解您想使用您首选的主流 Linux 发行版中最新最好的工具链,但这并不总是顺利。
以我拙见,你应该:
- 坚持使用 Linaro or ARM 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
请注意,ARM 的最新 GCC 工具链有一个 Docker 文件,目标是 cortex-m 配置文件 here。您可能想在自己的 Docker 文件中使用它并删除这两行:
arm-none-eabi-gcc-cs-7.4.0 \
arm-none-eabi-newlib-3.1.0-2.fc30 \
希望对您有所帮助。