S5PV210裸机程序之重定位与链接脚本

s5pv210开发板要求代码在0xD0020010处开始执行(BL1),但是有时我们的程序需要重定位在另外一个地址执行(如uboot),这个时候需要我们在汇编代码处加入重定位操作的代码,使得程序能够长跳转到另外一个地址继续执行代码而不会因为执行了与地址有关编码而导致执行错误。

链接脚本如下:

SECTIONS
{
    . = 0xD0024000;

    .text : {
        start.o
        * (.text)    
    }

    .data : {
        * (.data)
    }
    
    bss_start = .;
    .bss : {
        * (.bss)
    }

    bss_end = .;
}

汇编重定位代码如下:

    adr r0, _start        //load runtime _strat to r0
    ldr r1, =_start        //load link _strat to r1
    ldr r2, =bss_start    //
    cmp r0,r1        //
    bleq c_led_blink    //

copy_loop:
    ldr r3, [r0], #4    //
    str r3, [r1], #4    //
    cmp r2, r1         //if(tr_start == lk_strat)
    bne copy_loop        //
clean_bss:
    ldr r0, =bss_end
    cmp r0, r2
    beq run_on_dram
    mov r3, #0
bss_clean_loop:
    str r3, [r2], #4
    cmp r2, r0        //if(bss_start == bss_end)
    bne bss_clean_loop

run_on_dram:
    ldr pc, =c_led_blink

其中,c_led_blink为一个c文件编写的函数。

时间: 2024-10-13 23:39:49

S5PV210裸机程序之重定位与链接脚本的相关文章

第二部分:S5PV210_重定位和链接脚本_2

重定位和链接脚本 (1)重定位:分为静态重定位和动态重定位 静态重定位:静态重定位是在程序执行之前进行重定位,它根据装配模块将要装入的内存起始位置,直接修改装配模块中的有关使用地址的指令 我们下面要分析就是静态重定位的情况. 动态重定位:动态重定位是指,不是在程序执行之前而是在程序执行过程中进行地址重定位.更确切地说,是在每次访问内存单元前才进行地址变换.动态重定位可使装配模块不加任何修改而装入内存,但是它需要硬件——定位寄存器的支持. 图片的参考来源:http://c.biancheng.ne

S5pv210裸机实验——SDRAM重定位

一:为什么需要进行重定位 我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址).就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行.最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执行时必须放在当时编译链接时给定的那个地址(链接地址)下才行,否则不能运行(就叫位置有关代码).但是有个别特别的指令他可以跟指定的地址(链接地址)没有关系,也就是说这些代码实际运行时不管放在哪里都能正常运行. 二

重定位和链接脚本

大部分指令是"位置有关编码" 位置无关编码:汇编源文件编码成二进制可执行程序时,编码方式与位置无关. 在我们写程序时,必须给编译器链接器指定地址.将来的程序被执行时必须放在当时编译链接时给定的地址才能运行. 位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的. 但是也有一种特别的指令他可以跟指定的链接地址没有关系,这些代码不管放在哪里都可以正常运行. 分析: 之前的裸机程序中,makefile中用-Ttext 0x0来指定链接地址是0x0;这意味着我们认为将来这个程序会被

重定位与链接脚本

1.为什么需要重定位 位置无关编码(PIC,position independent code):汇编源文件被编码成二进制可执行程序时编码方式与位置(内存地址)无关. 位置有关编码:汇编源码编码成二进制可执行程序后和内存地址是有关的. 我们在设计一个程序时,会给这个程序指定一个运行地址(链接地址).就是说我们在编译程序时其实心里是知道我们程序将来被运行时的地址(运行地址)的,而且必须给编译器链接器指定这个地址(链接地址)才行.最后得到的二进制程序理论上是和你指定的运行地址有关的,将来这个程序被执

程序地址重定位和模块绑定

1.程序的构建 在构建程序的时候,链接器都会给程序设置一个默认的加载地址,即首选基地址,它表示该模块被映射到进程地址空间时最佳的内存地址.默认情况下,对于EXE程序而言,windows链接器会将它的首选基地址设置为0X400000(四十万),而DLL程序的首选基地址则被设置为0X10000000(1千万),然后链接器将该地址以及一些相关数据和代码的地址写入到PE文件中.首选基地址的是为了系统程序加载器设计的,作用是告诉加载器把程序优选加载到该首选基地址,然后就可以直接将其他的数据和代码加载到内存

[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口

1 平台 1.1 硬件 Table 1. 硬件(lscpu) Architecture: i686(Intel 80386) Byte Order: Little Endian 1.2 操作系统 Table 2. 操作系统类型 操作系统(cat /proc/version) 位数(uname -a) Linux version 3.2.0-4-686-pae i686(32bit) 1.3 编译器 Table 3. 编译器信息 编译器(gcc -v) gcc (Debian 4.7.2-5) 4

SDRAM和重定位(四)---链接地址和运行地址

在了解重定位之前,必须先区分开链接地址和运行地址,位置有关代码和位置无关代码 ========================================================= 链接地址和运行地址: 链接地址:指在链接时指定的地址,是我们设想的将来程序要运行的地址.程序中所有标号的地址在链接后便确定了,不管程序在哪运行,都不会改变.使用arm-linux-objdump反汇编查看的就是链接地址. 运行地址:指程序在板子中实际运行的地址 从上面的定义可以看出,链接地址和运行地址可以

S5PV210裸机程序之点亮LED【基于九鼎X2103BVS】

前期准备: 查阅x210bv3s.pdf得到开发板LED模块的原理图: 从原理图中了解到:其中三颗LED分别接在GPJ0_3.GPJ0_4.GPJ0_5,还有一颗LED接在PWMTOUT1.下面我们继续查阅手册 查阅x210cv3.pdf得到PWMTOUT1对应的引脚原理图: 由此我们得到了PWMTOUT1所对应的引脚为GPD0_1. 3.  查阅S5PV210_UM_REV1.1.pdf手册,得到引脚对应的寄存器地址以及相关寄存器的设置: 从手册中,我们可知一下三个重要的参数: 1. GPJ0

链接脚本与重定位

目录 链接脚本与重定位 总结 链接脚本格式 COMM段BSS段 elf和bin文件 获得链接脚本的值 重定位 1-直接指定数据段位置(代码黑洞) 2-分散加载(数据段) 3-全局重定位(一体式) BL跳转指令 bss段处理 汇编处理 C处理 位置无关码 title: 链接脚本与重定位 tags: ARM date: 2018-10-12 19:25:53 --- 链接脚本与重定位 学习视频 韦东山 总结 尽量使用一体式的链接脚本,方便简单,灵活 学会使用链接脚本的值 bss段和comm段是需要我