关于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 的静态变量和全局变量

 

posted @ 2014-03-11 09:52  吉吉的轨迹  阅读(358)  评论(0编辑  收藏  举报