uboot中start.S有以下语句:
_TEXT_BASE:
.word TEXT_BASE
但是他从哪来呢?我们可以自己写一个makefile和start.S来实验一下
猜测1:
主Makefile中有对其定义,并且export为环境变量,我一开始认为环境变量可以作用到整个工程,但其实不然,Makefile的make也是一个应用程序,其make的整个过程中环境变量是有效的,但是make之后,失效,并且只可以在上层Makefileexport供下层Makefile使用,同级别都不能使用。也就是说他export的变量只在当前这次运行的进程中有效。
和shell一样,shell的环境变量也只在当前进程中有效,也就是当前bash。
注意Makefile的export和shell的export是两个概念。你去看Makefile的代码就能发现。
那么有以上分析,说明源代码和makefile中的环境变量是无关的。实验证明也是无关的。
猜测2:
TEXT_BASE和.lds是指定链接的脚本和地址,那很有可能和ld有关,用uart来实验,加入语句:
${LD} -Tlink.lds -Ttext $(TEXT_BASE) -o uart.elf $^
实验发现失败,分析:ld的TEXT_BASE只是负责指定链接地址,不负责其他。
猜测3:
grep一下:
root@ubuntu:/mnt/linuxshare/arm/uboot/out_dir_uboot# grep -rwn TEXT_BASE
config.mk:80:ifneq ($(TEXT_BASE),)
config.mk:81:CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)
config.mk:108:ifneq ($(TEXT_BASE),)
config.mk:109:LDFLAGS += -Ttext $(TEXT_BASE)
config.mk:130:export TEXT_BASE PLATFORM_CPPFLAGS PLATFORM_RELFLAGS CPPFLAGS CFLAGS AFLAGS
board/samsung/x210/config.mk:1:TEXT_BASE = 0xc3e00000
board/samsung/x210/lowlevel_init.S:38: .word TEXT_BASE
tools/Makefile:127: -DTEXT_BASE=$(TEXT_BASE) -DUSE_HOSTCC
cpu/s5pc11x/start.S:100: .word TEXT_BASE
Makefile:183: -a $(TEXT_BASE) -e 0 \
Makefile:267: @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
Makefile:271: @echo "TEXT_BASE = 0xc3e00000" > $(obj)board/samsung/x210/config.mk
发现基本只能和CPPFLAGS挂钩了,将CPPFLAGS += -DTEXT_BASE=$(TEXT_BASE)添加到实验中,发现成功。
那么-DTEXT_BASE=$(TEXT_BASE)其实表示一个编译选项,其展开为:-DTEXT_BASE=0xc3e00000,这个整体作为一个编译选项,顾名思义猜测和链接地址有关。