转:u-boot分析 三 (u-boot.lds脚本)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了转:u-boot分析 三 (u-boot.lds脚本)相关的知识,希望对你有一定的参考价值。
转自:http://blog.csdn.net/itxiebo/article/details/50938753
目的,
了解链接器用到的脚本文件u-boot.lds。
在开始这篇博文之前,需要先了解一些GNU linker script的基本知识,可以参考博主的另外一篇分享《GNU linker script,ld script,GNU链接脚本》
在《u-boot分析 二》中,我们分析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分析 一》中的源码分享。
1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") 2 /*指定输出可执行文件是elf格式,32位ARM指令,小端*/ 3 OUTPUT_ARCH(arm) 4 /*指定输出可执行文件的平台为ARM*/ 5 ENTRY(_stext) 6 /*指定输出可执行文件的起始代码段为_stext*/ 7 SECTIONS 8 { 9 /*指定可执行文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/ 10 . = 0x00000000; 11 /*从0x0位置开始*/ 12 . = ALIGN(4); 13 /*代码以4字节对齐*/ 14 .text : 15 /*代码段*/ 16 { 17 *(.__image_copy_start) 18 /*u-boot将自己copy到RAM,此为需要copy的程序的start*/ 19 SOCDIR/start.o (.text*) 20 /*./arch/arm/cpu/slsiap/s5p4418/start.S*/ 21 SOCDIR/vectors.o (.text*) 22 /*./arch/arm/cpu/slsiap/s5p4418/vectors.S,异常向量表*/ 23 *(.text*) 24 /*其他的代码段放在这里,即start.S/vector.S之后*/ 25 } 26 27 . = ALIGN(4); 28 /*代码段结束后,有可能4bytes不对齐了,此时做好4bytes对齐,以开始后面的.rodata段*/ 29 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } 30 /*在代码段之后,存放read only数据段*/ 31 . = ALIGN(4); 32 /*和前面一样,4bytes对齐,以开始接下来的.data段*/ 33 .data : { 34 *(.data*) 35 /*可读写数据段*/ 36 } 37 38 . = ALIGN(4); 39 /*和前面一样,4bytes对齐*/ 40 . = .; 41 42 . = ALIGN(4); 43 .u_boot_list : { 44 KEEP(*(SORT(.u_boot_list*))); 45 /*.data段结束后,紧接着存放u-boot自有的一些function,例如u-boot command等*/ 46 } 47 48 . = ALIGN(4); 49 50 .image_copy_end : 51 { 52 *(.__image_copy_end) 53 /*至此,u-boot需要自拷贝的内容结束,总结一下,包括代码段,数据段,以及u_boot_list*/ 54 } 55 56 .rel_dyn_start : 57 /*在老的uboot中,如果我们想要uboot启动后把自己拷贝到内存中的某个地方,只要把要拷贝的地址写给TEXT_BASE即可,然后boot启动后就会把自己拷贝到TEXT_BASE内的地址处运行,在拷贝之前的代码都是相对的,不能出现绝对的跳转,否则会跑飞。在新版的uboot里(2013.07),TEXT_BASE的含义改变了。它表示用户要把这段代码加载到哪里,通常是通过串口等工具。然后搬移的时候由uboot自己计算一个地址来进行搬移。新版的uboot采用了动态链接技术,在lds文件中有__rel_dyn_start和__rel_dyn_end,这两个符号之间的区域存放着动态链接符号,只要给这里面的符号加上一定的偏移,拷贝到内存中代码的后面相应的位置处,就可以在绝对跳转中找到正确的函数。*/ 58 { 59 *(.__rel_dyn_start) 60 } 61 62 .rel.dyn : { 63 *(.rel*) 64 /*动态链接符存放在的段*/ 65 } 66 67 .rel_dyn_end : 68 { 69 *(.__rel_dyn_end) 70 /*动态链接符段结束*/ 71 } 72 73 .end : 74 { 75 *(.__end) 76 } 77 78 _image_binary_end = .; 79 /*bin文件结束*/ 80 81 /* 82 * Deprecated: this MMU section is used by pxa at present but 83 * should not be used by new boards/CPUs. 84 */ 85 . = ALIGN(4096); 86 .mmutable : { /*for MMU*/ 87 *(.mmutable) 88 } 89 90 /* 91 * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c 92 * __bss_base and __bss_limit are for linker only (overlay ordering) 93 */ 94 /*bss段的描述*/ 95 .bss_start (OVERLAY) : { 96 KEEP(*(.__bss_start)); 97 __bss_base = .; 98 } 99 100 .bss __bss_base (OVERLAY) : { 101 *(.bss*) 102 . = ALIGN(4); 103 __bss_limit = .; 104 } 105 106 .bss_end __bss_limit (OVERLAY) : { 107 KEEP(*(.__bss_end)); 108 } 109 /*bss段的描述结束*/ 110 .dynsym _image_binary_end : { *(.dynsym) } 111 .dynbss : { *(.dynbss) } 112 .dynstr : { *(.dynstr*) } 113 .dynamic : { *(.dynamic*) } 114 .plt : { *(.plt*) } 115 .interp : { *(.interp*) } 116 .gnu.hash : { *(.gnu.hash) } 117 .gnu : { *(.gnu*) } 118 .ARM.exidx : { *(.ARM.exidx*) } 119 .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) } 120 }
总结一下,u-boot.lds脚本文件告诉链接器linker如何布局代码段、数据段、bss段等,已经配置了u-boot自拷贝(从flash到RAM的copy)的内容。另外,还简要的涉及了动态链接技术等。
完
以上是关于转:u-boot分析 三 (u-boot.lds脚本)的主要内容,如果未能解决你的问题,请参考以下文章