我们在链接代码的时候使用以下语句,就可以将所有的文件链接到以0x87800000为起始地址的地方。
arm-linux-gnueabihf-ld -Ttext 0X87800000 -o ledc.elf $^
但是在很多时候我们需要将一些文件链接到指定的区域,这是后就需要使用链接脚本了。
首先看一段代码:
imxul.lds:
SECTIONS{
. = 0X87800000;
.text :
{
start.o
main.o
*(.text)
}
.rodata ALIGN(4) : {*(.rodata*)}
.data ALIGN(4) : { *(.data) }
__bss_start = .;
.bss ALIGN(4) : { *(.bss) *(COMMON) }
__bss_end = .;
}
有了这个之后我们就可以这样链接
arm-linux-gnueabihf-ld -Timx6ul.lds -o ledc.elf $^
语法分解
1、基本框架:SECTIONS{}
每一个链接脚本必须有的
2、特殊符号 “.”
“.” 在链接脚本里面叫做定位计数器, 默认的定位计数器为 0。我们要求代码链接到以 0X10000000 为起始地址的地方,因此这一行给“.”赋值。
同时我们要特别注意:“.”与“=”之间有一个空格,不然会报错。
. = 0X10000000;
3、段名与段的内容
.text 即是段名,后面跟的冒号“:”是语法要求,大括号“{ }”内的文件就是要链接在.text的文件。*(.text) 中的符号 “ * ” 是通配符。代表所有输入文件的.text段都放到“.text”中。
.text :
{
start.o
main.o
*(.text)
}
4、字节对齐ALIGN
ALIGN(4)对 .rodata这个段的起始地址进行4字节对齐。
.rodata ALIGN(4) : {*(.rodata*)}
链接脚本里的段
我们一般编译出来的代码都包含在 text、data、bss 和 rodata 这四个段内
text
通常是指用来存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定。
bss
存放定义了但是没有被初始化的变量。
data
存放数据。
rodata (read only data)
存放只读数据(const)。rodata内的变量存放在ROM中,运行时直接读取ROM内存,无需要加载到RAM内存中
网友评论