Raj
Raj

Reputation: 887

Preventing linking of unnecessary STDLIBC++ routines for Cortex-M4

I am trying to create a baremetal c++ application for a cortex-M4 device. My toolchain is ARM-GCC

I have noticed that the code size has shot up by 300kb which is 30% of the available flash size. There is a whole truckload of stuff from the standard libraries that gets linked in bloating TEXT, DATA and BSS areas.

Can this be reduced?

The application is the venerable blinky program with a : - Blinky.c containing the C routine to toggle a port pin in a while loop - Main.cpp containing the main() and a simple class with a constructor - Device startup file which does program loading and yields control to main()

The c file is compiled using gcc while the cpp is compiled using g++. The linker is invoked via g++ to automatically link in stdlibc++(with the assumption that only necessary object fies from the stdlibc++ will be linked in).

I even have -fno-rtti and -fno-exceptions as compile options to g++, but the savings are a pittiance.

By the way, the generated binary works file.

This is the 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();
  }

And these are my compilation options provided to g++.

 -O0 -ffunction-sections -Wall -fno-rtti -fno-exceptions -mfloat-abi=softfp -Wa,-adhlns="[email protected]" -c -fmessage-length=0 -mfpu=fpv4-sp-d16 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d) $@" -mcpu=cortex-m4 -mthumb -g3 -gdwarf-2 -o "$@" "$<"

Linker options provided to 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)

Upvotes: 1

Views: 1598

Answers (1)

auselen
auselen

Reputation: 28087

Remove part with

#include <iostream>
using namespace std;

you don't need it. I guess it adds extra global objects / variables and might leave some definitions in binary.

Also use -Os

-Os

Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

Upvotes: 3

Related Questions