我最近将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
有没有办法摆脱它,以便我可以编译并刷新我的(没有那么旧的)项目?

问候,

最佳答案

我找到了使用libstdc++_nano(而不是隐式libstc++)的解决方案。这样,代码大小从84kb减少到26kb!
LDFLAGS += -lstdc++_nano
它就是有效的。感谢@ Henrik,@ Matthieu和@EOF的支持!

07-24 09:44
查看更多