mbed OS - gcc build option

續 : mbed OS user guide

看來是用這套 :Ninja Build System

在 blinky\build\stm32f429i-disco-gcc\ 下, 有一個 build.ninja, 可以看到 compiler options

-mcpu=cortex-m4 -mthumb
   ARM cortex-m4 的設定, 視平台調整

--std=gnu++11 :

   使用的 語法標準 C++11 with gnu extensions

-fno-exceptions -fno-unwind-tables
    Using Exceptions 
 
  1. All exception handling in STL libraries are removed; throws are replaced with abort() calls
  2. Stack unwind data and code is removed. This saves some code space, and may make register allocation marginally easier for the compiler (but I doubt it'll have much performance impact). Notably, however, if an exception is thrown, and the library tries to unwind through -fno-exceptions code, it will abort at that point, as there is no unwind data.
    風險

    DWARF based unwinding (.eh_frame)

-fno-rtti



-ffunction-sections -fdata-sections
     linker 移除不需要的程式

-fno-threadsafe-statics
     對於 local statics 變數, 為了做 thread safe, 會增加保護, 用此可以省些 code, 
     不做 thread safe 保護


-g -gstrict-dwarf -gdwarf-3

     Debug options; 使用 DWARF format 3, 且僅使用此,

-Wall -Wextra
  warning 類, all 全開, extra, 增開

-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.
-Os disables the following optimization flags:
          -falign-functions  -falign-jumps  -falign-loops 
          -falign-labels  -freorder-blocks  -freorder-blocks-and-partition -fprefetch-loop-arrays
-O2 turns on all optimization flags specified by -O. It also turns on the following optimization flags:
          -fthread-jumps 
          -fcrossjumping 
          -foptimize-sibling-calls 
          -fcse-follow-jumps  -fcse-skip-blocks 
          -fgcse  -fgcse-lm  
          -fexpensive-optimizations 
          -fstrength-reduce 
          -frerun-cse-after-loop  -frerun-loop-opt 
          -fcaller-saves 
          -fforce-mem 
          -fpeephole2 
          -fschedule-insns  -fschedule-insns2 
          -fsched-interblock  -fsched-spec 
          -fregmove 
          -fstrict-aliasing 
          -fdelete-null-pointer-checks 
          -freorder-blocks  -freorder-functions 
          -funit-at-a-time 
          -falign-functions  -falign-jumps 
          -falign-loops  -falign-labels 
          -ftree-pre
-O turns on the following optimization flags:
          -fdefer-pop 
          -fdelayed-branch 
          -fguess-branch-probability 
          -fcprop-registers 
          -floop-optimize 
          -fif-conversion 
          -fif-conversion2 
          -ftree-ccp 
          -ftree-dce 
          -ftree-dominator-opts 
          -ftree-dse 
          -ftree-ter 
          -ftree-lrs 
          -ftree-sra 
          -ftree-copyrename 
          -ftree-fre 
          -ftree-ch 
          -fmerge-constants     


之前自加的:

-nostartfiles
      連接的時候不使用標準系統的啟動文件。標準系統庫通常被使用,除非選項“-nostdlib”和“-nodefaultlibs” 被使用。
-nodefaultlibs
     連接的使用不使用標準系統庫。只有你指定的庫才能夠傳遞給連接器。與系統庫有關的特定的連接選項(例如-static-libgcc 和-shared-libgcc )將會被忽略。標準的啟動文件通常會被使用,除非-nostartfiles選項被使用。
    編譯器可能會生成memcmp,memset,memcpy和memmove的調用,這些entries通常會被標準庫libc中的相關的entries解決。當這個選項被使用的時候,這些入口點應該通過其他的方法被提供。
 -nostdlib
    鏈接的時候不使用標準的系統啟動文件和系統庫。沒有啟動文件和只用你指定的庫可以被傳遞給連接器。與系統庫有關的特定的連接選項(例如-static-libgcc和-shared-libgcc )將會被忽略。編譯器可能會生成memcmp,memset,memcpy和memmove的調用,這些entries通常會被標準庫libc中的相關的entries解決。當這個選項被使用的時候,這些入口點應該通過其他的方法被提供。

--save-temps : 同時產生 .i 和 .s 檔

-MMD : 生成文件關聯訊息, 輸出導入 .d 檔


其他想增加改進的:

http://blog.httrack.com/blog/2014/03/09/what-are-your-gcc-flags/

http://ptspts.blogspot.tw/2013/12/how-to-make-smaller-c-and-c-binaries.html


延伸閱讀:

pratical guild to bare metal c++

http://elinux.org/images/2/2d/ELC2010-gc-sections_Denys_Vlasenko.pdf


留言

熱門文章