关于U-Boot源码的 .lds 文件
今天看《Linux应用开发完全手册》U-Boot部分,发现.lds文件不知道是什么,上网查了一下资料,总结如下,不过还是有些问题待解决,大家知道可以一起讨论哈!
参考资料:http://blog.csdn.net/wenjie345304221/article/details/6859272,谢谢原作者!
.lds文件的作用
- 决定可执行程序(这里是指U-Boot)各个段的 存储位置 和 入口地址,即设置U-Boot的链接地址
.lds文件的使用
- 编写好 .lds 文件后,在用arm-linux-ld连接命令时用选项”-T 文件名“来调用执行,也可用“-Ttext 地址”参数直接指定链接地址
- 例如:"arm-linux-ld -T board/smdk2440/U-Boot.lds -Ttext 0x33F80000",指定了程序的布局和地址
arm-linux-ld -T选项的说明
使用它来指定:
- 代码段:-Ttext startaddress
- 数据段:-Tdata staraddress
- bss段: -Tbss startaddress
的起始地址(运行地址)
- 作用:Bootloader、内核等程序刚开始执行时,它们所处的地址通常不等于运行地址。所以-T选项的作用是将代码从Flash等设备中复制到内存的运行地址上,再跳到这个运行地址上执行程序
U-Boot.lds源码分析
假设执行命令 "arm-linux-ld -T board/smdk2440/U-Boot.lds -Ttext 0x33F80000"
OUTPUT_ARCH(arm) //输出平台架构为arm
ENTRY(_start) //指定输出可执行文件的起始代码为_start
SECTIONS
{
. = 0x00000000; //设置当前地址(用.表示)为0地址,即U-Boot装载地址是0x00000000 + 0x33F80000
. = ALIGN(4); //设置代码以四字节对齐
.text : //命名这个段为.text
{ // {}内决定哪些内容放在本段,可以是整个目标文件,也可以是目标文件中的某段(代码段,数据段等)
cpu/arm920t/start.o (.text) //在装载地址排放第一个代码段,即设置最先执行的程序
*(.text) //其他所有代码段,*是通配符,表示所有文件
}
. = ALIGN(4);
.rodata : { *(.rodata) } //设置所有文件只读数据段(readonly data)
. = ALIGN(4);
.data : { *(.data) } //设置所有文件可读写的数据段
. = ALIGN(4);
.got : { *(.got) } //这个是U-Boot的自定义段,非标准段
. = .; //这是为啥呢?我也不知道哈~ 待讨论
__u_boot_cmd_start = .; //把__u_boot_cmd这个段的起始地址设置为当前地址(.),为什么要加__?
.u_boot_cmd : { *(.u_boot_cmd) } //这就是u_boot_cmd段,U-Boot把所有命令都放在此段,为什么要加.?
__u_boot_cmd_end = .; //把__u_boot_cmd这个段的结束地址设置为当前地址(.),为什么要加__?
. = ALIGN(4);
__bss_start = .; //把__bss这个段的起始地址设置为当前地址(.),为什么要加__?
.bss : { *(.bss) } //这就是bss段,为什么要加.?
_end = .; //把__bss这个段的结束地址设置为当前地址(.),为什么不是__bss_end?
}
说明
- 代码中的.表示当前地址,它会随着你装载的数据的增加而增加,所以start和end都要赋值为. ,就是因为.会增加
- 0x33F80000是在board/smdk2440/config.mk定义的TEXT_BASE变量
- 假如你想把U-Boot放在其他位置,可以修改TEXT_BASE
- 例子:内存如上图表示,假如你的U-Boot超过512K,你可以把TEXT_BASE移下来。 或者说内存不够大,也需要修改TEXT_BASE
- BSS段的作用:存放 未初始化 或者 初始值为0 的静态变量和全局变量