防止为Cortex-M4链接不必要的STDLIBC ++例程

时间:2012-10-11 06:47:07

标签: c++ arm gnu std cortex-m3

我正在尝试为cortex-M4设备创建一个baremetal c ++应用程序。我的工具链是ARM-GCC

我注意到代码大小增加了300kb,这是可用闪存大小的30%。标准库中有大量的东西在膨胀的TEXT,DATA和BSS区域中链接。

这可以减少吗?

该应用程序是一个令人尊敬的眨眼程序: - Blinky.c包含用于在while循环中切换端口引脚的C例程 - Main.cpp包含main()和一个带构造函数的简单类 - 设备启动文件,它执行程序加载并将控制权交给main()

使用gcc编译c文件,而使用g ++编译cpp。通过g ++调用链接器以自动链接stdlibc ++(假设只链接stdlibc ++中的必需对象)。

我甚至将-fno-rtti和-fno-exceptions作为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)

1 个答案:

答案 0 :(得分:2)

使用

删除部分
#include <iostream>
using namespace std;
你不需要它。我想它会增加额外的全局对象/变量,并可能会留下一些二进制定义。

还可以使用-Os

  
    

-Os

         

优化尺寸。 -Os启用所有通常不会增加代码大小的-O2优化。它还执行旨在减少代码大小的进一步优化。