目录
1. imx6ul.lds
链接脚本文件的作用是:用于描述不同文件如何链接在一起形成最终的可执行文件,其主要目的是描述输入文件中的段如何被映射到输出文件中,并且控制输出文件中的内存排布,比如编译生成的文件一般都包含text段,data段,rodata段,bss段等。我们在imx6ull中要设定将程序文件链接到DDR的0x87800000地址。
在使用链接脚本之前,使用arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^设置链接地址,再把编译后的文件链接为elf格式的文件。
使用lds链接脚本后,使用arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^,程序链接地址,代码段数据段等都在imx6ul.lds中设置好了。
imx6ul.lds 1.0
SECTIONS{
. = 0X87800000;
.text :
{
obj/start.o
*(.text)
}
.rodata ALIGN(4) : {
*(.rodata*)}
.data ALIGN(4) : {
*(.data) }
__bss_start = .;
.bss ALIGN(4) : {
*(.bss) *(COMMON) }
__bss_end = .;
}
- 第2行对特殊符号“.”进行赋值,“.”在链接脚本中叫做定位计数器,默认为 0。我们要求代码链接到0X87800000。
- 第3行的“.text”是段名,后面的冒号是语法要求,大括号里填上要链接到“.text”这个段里面的所有文件,start.o要放在起始位置,“* (.text)”中的“ * ”是通配符,表示剩余所有输入文件的.text段都放到“.text”中start的后面。
- 定义了一个“.bss”段并进行4字节对齐,“.bss”数据就是那些定义了但是没有被初始化的变量,“.data”是全局变量,“.rodata”是全局常量。
- “__bss_start”和“__bss_end”是符号,赋值为定位符“.”,这两个符号用来保存.bss段的起始地址和结束地址。前面说了.bss段是定义了但是没有被初始化的变量,我们需要手动对.bss段的变量清零,需要知道.bss段的起始和结束地址,这样直接对这段内存赋0即可完成清零。可以直接在汇编或者C文件里面使用这两个符号。
2.start.S
start.S 1.0
.global _start /* 全局标号 */
/*
* 描述: _start函数,程序从此函数开始执行,此函数主要功能是设置C
* 运行环境。
*/
_start:
/* 进入SVC模式 */
mrs r0, cpsr
bic r0, r0, #0x1f /* 将r0寄存器中的低5位清零,也就是cpsr的M0~M4 */
orr r0,