【发布时间】:2019-01-04 16:15:12
【问题描述】:
我最近将我的 Linux 笔记本电脑从 Ubuntu 16.04 更新到了 18.04。
我有一个基于 STM32 (Cortex-M4) Makefile 的项目,该项目使用 Ubuntu 提供的 arm-none-eabi g++ 版本正确编译。生成的文件在 .text 部分中需要 47620 字节。
通过 Ubuntu 升级,我还安装了最新版本的 gcc(来自 ARM website)。版本是 8.2.1。
当我编译同一个项目(make clean && make)时,生成的二进制文件不适合闪存(需要 97424 字节,超过两倍!)。项目完全相同(源代码、链接脚本、启动文件、Makefile)。
编译器选项是:-mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -DSTM32F303x8 -DARMCM4 -O0 -g -Wall -fexceptions -Wno-deprecated。
链接器选项是-mthumb -mcpu=cortex-m4 -Tstm32f303K8.ld -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nosys.specs -lm -Wl,--start-group -lm -Wl,--end-group -Wl,--gc-sections -Lsys -Xlinker -Map=test.elf.map
当我查看 .Map 生成的文件时,所有用户函数的大小大致相同(新版本节省了 8 个字节!)。但之后,它包括 C++ 特定部分,其中一个超过 26Kb(来自映射文件):
.text 0x00000000080079e8 0x683c /usr/local/gcc-arm-none-eabi-8-2018-q4-major/bin/../lib/gcc/arm-none-eabi/8.2.1/../../../../arm-none-eabi/lib/thumb/v7e-m+fp/hard/libstdc++.a(cp-demangle.o)
0x000000000800e13c __cxa_demangle
注意:只有 C 项目没有问题,只有 C++。包含的库是相同的(gcc 4.9.3 -> armv7e-m/fpu,和 gcc 8.2.1 -> thumb/v7e-m+fp/hard):
libm.a libstdc++.a libc.a libnosys.a libgcc.a
有没有办法摆脱它,以便我可以编译和刷新我的(不太旧的)项目?
问候,
【问题讨论】:
-
你试过剥离可执行文件吗?
-
你为什么使用
-O0而不是显而易见的-Os? -
我在第一种方法中没有使用任何优化。然后,我打开它(
-O3 -funroll-loops -fomit-frame-pointer -fno-strict-aliasing -pipe -ffast-math -fexceptions)。但是这两个二进制文件是使用相同的标志编译的。 (它也不适合我的 STM32 优化...... -
@user3582893 如果您想回复特定用户,请使用@user 以便通知他们。此外,
-O3 -funroll-loops可能会显着恶化代码大小。我推荐-Os。 -
感谢 Mathieu 的提示。我刚试过
-Wl,--strip-all,但它不适合:arm-none-eabi-g++ -o test.elf build/main.o build/mcp23s17.o build/Print.o build/Adafruit_GFX.o build/Adafruit_SPITFT.o build/Adafruit_ST7735.o build/Adafruit_ST77xx.o build/spi.o build/timer.o build/button.o build/adc.o build/codeur.o build/startup_ARMCM4.o build/startup_clock.o -mthumb -mcpu=cortex-m4 -Tstm32f303K8.ld -mfloat-abi=hard -mfpu=fpv4-sp-d16 --specs=nosys.specs -lm -Wl,--start-group -lm -Wl,--end-group -Wl,--gc-sections -Wl,--strip-all -Lsys -Xlinker -Map=test.elf.map