uboot中start.S的_TEXT_BASE

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,这个整体作为一个编译选项,顾名思义猜测和链接地址有关。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值