链接器ld程序的脚本文件u-boot.lds(二)

目的:了解链接器用到的脚本文件u-boot.lds。

在开始这篇博文之前,需要先了解一些GNU linker script的基本知识,可以参考博主的另外一篇分享《GNU linker script,ld script,GNU链接脚本》

之前分析了u-boot的目录结构,提及到了程序入口start.S,但在开始了解start.S之前,我们先聊聊链接器ld程序的脚本文件u-boot.lds。

下面我们就来品味一下UT4418开发板的u-boot.lds脚本,即u-boot/arch/arm/cpu/slsiap/u-boot.lds。如果读者正好需要看source code,可以参看之前的文章《u-boot分析 一》中的源码分享。

/*指定输出可执行文件是elf格式,32位ARM指令,小端*/
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")/*指定输出可执行文件的平台为ARM*/
OUTPUT_ARCH(arm)/*指定输出可执行文件的起始代码段为_stext*/
ENTRY(_stext)/*分配各个段地址*/
SECTIONS
{/*指定可执行文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成,这里从0x0位置开始*/. = 0x00000000;/*保证text代码段以4字节对齐*/. = ALIGN(4);/*代码段*/    .text : {  *(.__image_copy_start)/*u-boot将自己copy到RAM,此为需要copy的程序的start*/  /*./arch/arm/cpu/slsiap/s5p4418/start.S,启动程序*/SOCDIR/start.o (.text*)/*./arch/arm/cpu/slsiap/s5p4418/vectors.S,异常向量表*/SOCDIR/vectors.o (.text*)/*其他的代码段放在这里,即start.S/vector.S之后*/*(.text*)}/*代码段结束后,有可能4bytes不对齐了,此时做好4bytes对齐,以开始后面的.rodata段*/    . = ALIGN(4);/*在代码段之后,存放.rodata数据段,其中ro:read only,表示只读数据段*/.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }/*和前面一样,4bytes对齐,以开始接下来的.data段*/. = ALIGN(4);/*可读写数据段*/  .data : {*(.data*)}. = ALIGN(4);/*和前面一样,4bytes对齐*/. = .;. = ALIGN(4);/*.data段结束后,紧接着存放u-boot自有的一些function,例如u-boot command等*/.u_boot_list : {KEEP(*(SORT(.u_boot_list*)));}. = ALIGN(4);/*至此,u-boot需要自拷贝的内容结束,总结一下,包括代码段,数据段,以及u_boot_list*/.image_copy_end :{*(.__image_copy_end)}/*在老的uboot中,如果我们想要uboot启动后把自己拷贝到内存中的某个地方,只要把要拷贝的地址写给TEXT_BASE即可,然后boot启动后就会把自己拷贝到TEXT_BASE内的地址处运行,在拷贝之前的代码都是相对的,不能出现绝对的跳转,否则会跑飞。在新版的uboot里(2013.07),TEXT_BASE的含义改变了。它表示用户要把这段代码加载到哪里,通常是通过串口等工具。然后搬移的时候由uboot自己计算一个地址来进行搬移。新版的uboot采用了动态链接技术,在lds文件中有__rel_dyn_start和__rel_dyn_end,这两个符号之间的区域存放着动态链接符号,只要给这里面的符号加上一定的偏移,拷贝到内存中代码的后面相应的位置处,就可以在绝对跳转中找到正确的函数。*/.rel_dyn_start : {*(.__rel_dyn_start)}/*动态链接符存放在的段*/.rel.dyn : {*(.rel*)     }/*动态链接符段结束*/.rel_dyn_end : {*(.__rel_dyn_end)}.end :{*(.__end)}/*bin文件结束*/_image_binary_end = .;/** Deprecated: this MMU section is used by pxa at present but* should not be used by new boards/CPUs.*/. = ALIGN(4096);.mmutable : {  /*for MMU*/*(.mmutable)}/** Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c* __bss_base and __bss_limit are for linker only (overlay ordering)*//*bss段的描述*/.bss_start (OVERLAY) : {KEEP(*(.__bss_start));__bss_base = .;}.bss __bss_base (OVERLAY) : {*(.bss*). = ALIGN(4);__bss_limit = .;}/*bss段的描述结束*/.bss_end __bss_limit (OVERLAY) : {KEEP(*(.__bss_end));}.dynsym _image_binary_end : { *(.dynsym) }.dynbss : { *(.dynbss) }.dynstr : { *(.dynstr*) }.dynamic : { *(.dynamic*) }.plt : { *(.plt*) }.interp : { *(.interp*) }.gnu.hash : { *(.gnu.hash) }.gnu : { *(.gnu*) }.ARM.exidx : { *(.ARM.exidx*) }.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
}

并结合其他博客理解:https://blog.csdn.net/dl0914791011/article/details/17299037 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部