在看本博文之前,先看下华嵌的一篇文章,写的十分简单明了(里面的VMA.LMA可能写混了)
http://www.embedu.org/Column/Column345.htm
看完之后,我们就明白了ldr r2, _armboot_start当中到底存放的是什么值了.
不过到底其中一个大概的处理过程是怎么样的呢??
我们来做一个实验.
先在U-BOOT.LDS当中再增加几个变量来显示(location counter)当时的值。
. = 0x00000000;
. = ALIGN(4);
_testa = .; //added
.text :
{
cpu/arm920t/start.o(.text)
*(.text)
}
_testb= .; //added
然后再在start.S当中添加
_TEST1:
.word _testa
_TEST2:
.word _testb
然后make all,再objdump
我们会发现
33000040 <_TEST1>:
33000040: 00000000 andeq r0, r0, r0
33000044 <_TEST2>:
33000044: 33018964 tstcc r1, #1638400 ; 0x190000
我们会发现location counter 从0x0瞬间变成了0X33000000(我们在CONFIG.MK当中定义的TEXT_BASE)
0x18964这个应该是我们.text段的大小。从_armboot_start跟_bss_start这里的值也能猜测出来.
然后我们试着把.text修改为.context(或者其他什么名字),再objdump,
之后我们会发现
00000040 <_TEST1>:
40: 00000000 andeq r0, r0, r0
00000044 <_TEST2>:
44: 00018964 andeq r8, r1, r4, ror #18
所以大概可以认为-Ttext $(TEXT_BASE)这个参数会去u-boot.lds中寻找.text这个段,如果找到,就将存放.text段当时的location counter修改为TEXT_BASE
http://www.embedu.org/Column/Column345.htm
看完之后,我们就明白了ldr r2, _armboot_start当中到底存放的是什么值了.
不过到底其中一个大概的处理过程是怎么样的呢??
我们来做一个实验.
先在U-BOOT.LDS当中再增加几个变量来显示(location counter)当时的值。
. = 0x00000000;
. = ALIGN(4);
_testa = .; //added
.text :
{
cpu/arm920t/start.o(.text)
*(.text)
}
_testb= .; //added
然后再在start.S当中添加
_TEST1:
.word _testa
_TEST2:
.word _testb
然后make all,再objdump
我们会发现
33000040 <_TEST1>:
33000040: 00000000 andeq r0, r0, r0
33000044 <_TEST2>:
33000044: 33018964 tstcc r1, #1638400 ; 0x190000
我们会发现location counter 从0x0瞬间变成了0X33000000(我们在CONFIG.MK当中定义的TEXT_BASE)
0x18964这个应该是我们.text段的大小。从_armboot_start跟_bss_start这里的值也能猜测出来.
然后我们试着把.text修改为.context(或者其他什么名字),再objdump,
之后我们会发现
00000040 <_TEST1>:
40: 00000000 andeq r0, r0, r0
00000044 <_TEST2>:
44: 00018964 andeq r8, r1, r4, ror #18
所以大概可以认为-Ttext $(TEXT_BASE)这个参数会去u-boot.lds中寻找.text这个段,如果找到,就将存放.text段当时的location counter修改为TEXT_BASE