韦东山Linux嵌入式课程社区
直播中

蒋进如

7年用户 186经验值
私信 关注

移植最新u-boot连接地址该如何指定?

在学习移植最新u-boot课程中,使用的u-boot版本为:u-boot-2014-04-01,它的链接脚本如下:
OUTPUT_FORMAT("elf32-littleARM", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECtiONS
{
        . = 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,难道是通过这里指定的?尝试改变该变量的值,改变该变量的值,重新编译,发现链接地址重新变化了!
所以目标文件的链接地址确实是在代码里面指定的,哪这又是如何实现的呢???

回帖(1)

李华

2019-9-10 11:38:47
大体搜了一下代码
LDFLAGS := -T $(nandobj)u-boot.lds -Ttext $(CONFIG_SYS_TEXT_BASE) $(LDFLAGS)
makefile里边有这样一句
举报

更多回帖

发帖
×
20
完善资料,
赚取积分