日期:2014-05-16  浏览次数:20609 次

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个全局变量的大小 最后转成让汇编可以识别的语句