u-boot Makefile的一段话不是很能理解
$(obj)lib/asm-offsets.s: $(obj)include/autoconf.mk.dep \
$(src)lib/asm-offsets.c
@mkdir -p $(obj)lib
$(CC) -DDO_DEPS_ONLY \
$(CFLAGS) $(CFLAGS_$(BCURDIR)/$(@F)) $(CFLAGS_$(BCURDIR)) \
-o $@ $(src)lib/asm-offsets.c -c -S
这是u-boot-2012.07版本的顶层Makefile,根据GCC 参数解释 -DDO_DEPS_ONLY应该相当于#define DO_DEPS_ONLY "1"
而include/asm-offsets.h的内容为
#ifndef DO_DEPS_ONLY
#include <generated/generic-asm-offsets.h>
/* #include <generated/asm-offsets.h> */
#endif
在编译的时候已经定义了宏DO_DEPS_ONLY,那么asm-offset.h就不会被包含了。 但是start.s又必须包含generated/generic-asm-offsets.h这个头文件,感觉很迷惑?
希望有人能解答
------解决方案--------------------
编译之后,会发现 uboot利用asm-offsets.c 生成了asm-offset.s。
顶层Makefile里面里有一项的是
generated/generic-asm-offsets.h :asm-offset.s
当条件符合的时候,执行tool/scripts/make-asm-offsets
则生成了generated/generic-asm-offsets.h
里面其实主要是定义了两个宏GENERATED_GBL_DATA_SIZE (gd)和 GENERATED_BD_INFO_SIZE(bd)的大小
是为了利用C语言的SIZEOF来取得这2个全局变量的大小 最后转成让汇编可以识别的语句