在学习移植最新u-boot课程中,使用的u-boot版本为:u-boot-2014-04-01,它的链接脚本如下:
OUTPUT_FORMAT("elf32-little
ARM", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SEC
tiONS
{
. = 0x00000000;
. = ALIGN(4);
.text :
{
__image_copy_start = .;
CPUDIR/start.o (.text)
board/samsung/smdk2440/libsmdk2440.o (.text)
*(.text)
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
.data : {
*(.data)
}
***...(后面省略)
链接脚本指定的链接地址是 0x00000000。
u-boot代码作部分修改后,编译出 bin文件和反汇编文件,反汇编文件文件如下:
u-boot: file format elf32-littlearm
Disassembly of section .text:
33f00000 <__image_copy_start>:
33f00000: ea000014 b 33f00058
33f00004: e59ff014 ldr pc, [pc, #20] ; 33f00020 <_undefined_instruction>
33f00008: e59ff014 ldr pc, [pc, #20] ; 33f00024 <_software_interrupt>
33f0000c: e59ff014 ldr pc, [pc, #20] ; 33f00028 <_prefetch_abort>
33f00010: e59ff014 ldr pc, [pc, #20] ; 33f0002c <_data_abort>
33f00014: e59ff014 ldr pc, [pc, #20] ; 33f00030 <_not_used>
33f00018: e59ff014 ldr pc, [pc, #20] ; 33f00034 <_irq>
33f0001c: e59ff014 ldr pc, [pc, #20] ; 33f00038 <_fiq>
***... (后面省略)
可以看到链接起始地址是在 0x33f00000,那这是哪里指定的呢!?只记得有处全局变被用作重定代码的起始地址,如下:
.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE
***... (后面省略)
CONFIG_SYS_TEXT_BASE的值为0x33f00000,难道是通过这里指定的?尝试改变该变量的值,改变该变量的值,重新编译,发现链接地址重新变化了!
所以目标文件的链接地址确实是在代码里面指定的,哪这又是如何实现的呢???