我正在尝试为cortex-M4设备创建一个裸机c++应用程序。我的工具链是ARM-GCC
我注意到代码大小激增了300kb,是可用闪存大小的30%。有一整卡车来自标准库的东西被链接到膨胀的TEXT、DATA和BSS区域。
这能减少吗?
该应用程序是一个古老的blinky程序,具有:-Blinky.c包含在while循环中切换端口引脚的c例程-Main.cpp包含Main()和一个带有构造函数的简单类-进行程序加载并将控制权交给main()的设备启动文件
c文件是使用gcc编译的,而cpp是使用g++编译的。链接器是通过g++调用的,以在stdlibc++中自动链接(假设只有来自stdlibc++的必要对象fies才会链接进来)。
我甚至有-fno-rtti和-fno异常作为g++的编译选项,但节省的钱很少。
顺便说一下,生成的二进制工作文件。
这是Main.cpp
#include <iostream>
using namespace std;
extern "C" void Toggle_Pin(uint8_t Speed);
void *__dso_handle = (void *)NULL;
void __cxa_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){}
void __cxa_guard_acquire(void){}
void __cxa_guard_release(void){}
void __aeabi_atexit(void (*Arg)(void *), void *Arg2, void *Arg3){}
class Computer
{
public:
uint32_t aa;
uint32_t bb;
Computer();
};
Computer::Computer()
{
aa=0;
bb=0;
for(uint8_t i=0;i < 10; i++)
{
Toggle_Pin((uint8_t)100);
}
}
Computer a;
int main(void)
{
a.aa = 10;
Toggle_Pin();
}
这些是我为g++提供的编译选项。
-O0 -ffunction-sections -Wall -fno-rtti -fno-exceptions -mfloat-abi=softfp -Wa,-adhlns="$@.lst" -c -fmessage-length=0 -mfpu=fpv4-sp-d16 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) $@" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "$@" "$<"
链接器选项提供给g++:
-T LinkerScript.ld" -nostartfiles -L"Path to libraries" -Wl,-Map,"Project.map" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "Project.elf" "@makefile.rsp" $(USER_OBJS) $(LIBS)
用移除零件
#include <iostream>
using namespace std;
你不需要它。我想它添加了额外的全局对象/变量,可能会留下一些二进制定义。
也使用-Os
-Os
优化尺寸-Os启用了通常不会增加代码大小的所有-O2优化。它还执行旨在减小代码大小的进一步优化。