使用GCC ARM嵌入式编译器编译时,代码大小会翻倍?

3
我刚把一个STM32微控制器项目从Keil uVision(使用Keil ARM编译器)移植到了CooCox CoIDE(使用GCC ARM嵌入式编译器)。问题是,用GCC在CoIDE中编译时,代码大小是Keil uVision的两倍。这怎么可能?我该怎么办?
Keil中的代码大小为:54632b(.text) CoIDE中的代码大小为:100844b(.text)
GCC编译器标志:
arm-none-eabi-gcc -mcpu=cortex-m3 -mthumb -g2 -Wl,-Map=project.map -Os 
-Wl,--gc-sections -Wl,-TC:\arm-gcc-link.ld -g -o project.elf -L -lm

我怀疑CoIDE和GCC编译了很多函数和文件,这些函数和文件存在于项目中,但尚未被使用。即使我只在其中使用了20个函数中的1个,它是否可能编译整个文件?(即使我已经使用了 -Os 选项)


1
除了@greydet的答案之外,您还可以在链接器命令行中添加“--specs = nano.specs”。 - Andy Brown
查看地图文件以查看其内容。 - M.M
提醒一下:我们刚刚通过将某个库中的静态方法局部变量转换为类局部变量,使得我们的ARM代码从180K降至50K,使用的是arm-none-eabi-g++ v10。GCC无法正确优化它,并引入了大量代码来处理不可能发生的条件。优化器是微妙的魔法! - SusanW
2个回答

1
很难根据您提供的信息确定哪些文件确实在最终二进制文件中编译/链接。如果没有明确指定要编译哪个文件或者没有使用自己的Makefile,我想它会获取您项目中找到的所有C文件。
但是根据您给出的编译器选项,如果您没有以下编译器标志:-ffunction-sections -fdata-sections,那么连接器标志--gc-sections就不会清除太多垃圾。尝试添加这些选项以剥离链接时未使用的所有函数和数据。

很不幸,没有运气。 - Jolle

0

由于该问题标记为C ++,我想知道您是否想禁用异常和RTTI。它们需要相当多的代码。将-fno-exceptions -fno-rtti添加到链接器标志中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接