u-boot常用编译选项

来源:互联网 发布:ios淘宝历史版本 编辑:程序博客网 时间:2024/04/29 20:35
-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
原创粉丝点击