u-boot常用編譯選項

-isystem path  指定系統的頭文件,U-boot指定的是編譯器的頭文件
在host主機運行 arm-linux-gnueabihf-gcc --print-file-name=include 命令會打印出當前交叉編譯器的頭文件路徑
/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/include
參考config.mk


-ffreestanding 這個選項隱含着-fno-built_in選項,表示不要使用內建函數,表示系統處於自由獨立的環境,沒有主機系統,沒有標準庫,程序的啓動不一定從main函數啓動,比如OS系統內核的代碼。
-nostdinc      表示不要搜索系統標準頭文件,比如使用交叉編譯時host的/usr/include目錄下的頭文件,而只搜索-I指定的頭文件


-pipe  表示不同編譯階段使用管道文件,而不使用臨時文件,在某些系統上可能不能正常運行,某些彙編器不能從管道里讀數據,但是在gnu系統上不會有問題。


-msoft-float 如果指定該選項,會使用交叉編譯器的libgcc.a中的軟浮點庫編譯,否則會生成硬件浮點指令。
/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/lib/gcc/arm-linux-gnueabihf/4.7.3/libgcc.a


-fno-common 和fcommon選項相反,該選項控制C代碼的全局未初始化變量的位置,在傳統的GNU的C編譯器中,允許在幾個不同編譯模塊中重複定義變量,是通過把變量放到公共塊中實現的(-fcommon)。但是標準C不支持該特性,並在某些系統上會出現代碼性能和大小的問題。使用-fno-common選項,如果出現多處定義的未初始化變量並且沒有用extern聲明,將會出現重複定義錯誤,爲了保證可移植性,建議定義該選項。


-ffixed-r8 表示r8寄存器用作特定用途,u-boot中用來保存global_data指針的,而不會輕易改變它的內容。


-march=armv7-a 指定CPU的架構名稱,對於ARM合法名稱有:
               ‘armv2’,‘armv2a’,‘armv3’,‘armv3m’,‘armv4’,
               ‘armv4t’,‘armv5’,‘armv5t’,‘armv5e’,‘armv5te’,‘armv6’,‘armv6j’,‘armv6t2’,
               ‘armv6z’,‘armv6zk’,‘armv6-m’,‘armv7’,‘armv7-a’,‘armv7-r’,‘armv7-m’,
               ‘iwmmxt’,‘iwmmxt2’,‘ep9312’.
-mcpu=name    合法的有:
              ‘arm2’,‘arm250’,‘arm3’,‘arm6’,‘arm60’,‘arm600’,
              ‘arm610’,‘arm620’,‘arm7’,‘arm7m’,‘arm7d’,‘arm7dm’,‘arm7di’,‘arm7dmi’,
              ‘arm70’,‘arm700’,‘arm700i’,‘arm710’,‘arm710c’,‘arm7100’,‘arm720’,
              ‘arm7500’,‘arm7500fe’,‘arm7tdmi’,‘arm7tdmi-s’,‘arm710t’,‘arm720t’,
              ‘arm740t’,‘strongarm’,‘strongarm110’,‘strongarm1100’,‘strongarm1110’,
              ‘arm8’,‘arm810’,‘arm9’,‘arm9e’,‘arm920’,‘arm920t’,‘arm922t’,‘arm946e-s’,
              ‘arm966e-s’,‘arm968e-s’,‘arm926ej-s’,‘arm940t’,‘arm9tdmi’,‘arm10tdmi’,
              ‘arm1020t’,‘arm1026ej-s’,‘arm10e’,‘arm1020e’,‘arm1022e’,‘arm1136j-s’,
              ‘arm1136jf-s’,‘mpcore’,‘mpcorenovfp’,‘arm1156t2-s’,‘arm1156t2f-s’,
              ‘arm1176jz-s’,‘arm1176jzf-s’,‘cortex-a5’,‘cortex-a7’,‘cortex-a8’,
              ‘cortex-a9’,‘cortex-a15’,‘cortex-r4’,‘cortex-r4f’,‘cortex-r5’,
              ‘cortex-m4’,‘cortex-m3’,‘cortex-m1’,‘cortex-m0’,‘xscale’,‘iwmmxt’,
              ‘iwmmxt2’,‘ep9312’,‘fa526’,‘fa626’,‘fa606te’,‘fa626te’,‘fmp626’,
              ‘fa726te’.
-mtune=name  對於arm,可以指定generic-arch,這樣可以根據CPU的arch調整性能,同時也能保證生成的代碼在大部分的CPU上運行,可以在性能和兼容性上取得平衡。


-march     指定生成ARM態指令,而不是thumb指令。對應地有-mthumb選項。
-mabi=aapcs-linux  指定ABI版本,可以有:
             ‘apcs-gnu’,
             ‘atpcs’,‘aapcs’,‘aapcs-linux’,‘iwmmxt’


-ffunction-sections -fdata-sections   data和function放到.o文件的各自section中。
-mno-thumb-interwork 不產生混合arm和thumb指令。因爲ARM-V5之前的版本同一個代碼裏不能既含有arm又含有thumb指令,所以該選項可以保證兼容性。


-fstack-usage  生成對應編譯文件中的函數堆棧使用情況說明文件,對應的文件名稱一般爲.su文件。
  比如crc16.c:97:1:cyg_crc16 8static  表示靜態地使用8個字節的堆棧
  
-Wstrict-prototypes 表示函數聲明時要指定變量的類型,否則會報警。
     
-MQ target.o  生成target.o的對應的依賴文件列表。     


最後看生成uboot的命令:
GEN_UBOOT = \
cd $(LNDIR) && $(CC) $(SYMS) -T $(obj)u-boot.lds \
-Wl,--start-group $(__LIBS) -Wl,--end-group \
$(PLATFORM_LIBS) -Wl,-Map -Wl,u-boot.map -o u-boot


最後u-boot使用的連接腳本是TOPDIR的u-boot.lds腳本,該腳本由arch/arm/cpu/u-boot.lds腳本展開其中部分目錄得到的。
PLATFORM_LIBS += $(PLATFORM_LIBGCC)
PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(CFLAGS) -print-libgcc-file-name`) -lgcc
在host主機中執行arm-linux-gnueabihf-gcc --print-libgcc-file-name,可以找到當前需要的libgcc庫的路徑
/opt/altera-linux/linaro/gcc-linaro-arm-linux-gnueabihf-4.7-2012.11-20121123_linux/bin/../lib/gcc/arm-linux-gnueabihf/4.7.3/libgcc.a
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章