tiny210(S5PV210)uboot的顶层Makefile的连接命令理解——记tiny210之uboot移植

贴上Makefile中的连接规则:

$(obj)u-boot: depend version $(SUBDIRS) $(OBJS) $(LIBS) $(LDSCRIPT)
UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`;\
cd $(LNDIR) && $(LD) $(LDFLAGS) $$UNDEF_SYM $(__OBJS) \
--start-group $(__LIBS) --end-group $(PLATFORM_LIBS) \
-Map u-boot.map -o u-boot

上面的连接规则看起来很复杂的样子,也让我纠结了好一阵子,后来查了很多资料终于理解了。下面来逐个击破:

       目标和依赖不难理解,就不解释了。

      接下来,看看UNDEF_SYM=`$(OBJDUMP) -x $(LIBS) |sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`,注意了,这段命令是以TAB开头的,所以应该是shell里面执行命令。这命令应该是先执行“``”围起来的命令,然后将其得到的结果赋给shell变量UNDEF_SYM,强调一下,这是shell变量不是Makefile的变量。接下来拆分,各部分来理解。$(OBJDUMP) -x $(LIBS),展开来是:arm-linux-objdump -x $(LIBS),-x选项表示获取后面的库文件中所有可以获得的头部信息,包括符号表和重定位入口。

       这里介绍一下符号表,每个库文件目标文件都包含有未决符号表和导出符号表,未决符号表相当于记录了目标中引用的的外部函数或者变量,这些函数和变量就会被记录在未决符号表中,那未决符号表相当于告诉编译器我这里没有这些函数和变量的定义,你去别的目标文件中查找导出符号表查一下有没有。而导出符号表则记录了该目标中的全局变量和全局函数。故连接器根据这两个表就可以正确连接。更详细的相关解释看一下http://my.oschina.net/anyway/blog/11262

       $(OBJDUMP) -x $(LIBS)之后,其结果通过管道传送到sed作为其输入,sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p',sed是流编辑命令,-e表示将后面的's/.*\(__u_boot_cmd_.*\)/-u\1/p'添加到要执行的命令列表,也就是进行相关的编辑操作,-n表示不自动打印字符行,默认情况下,sed

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值