u-boot.lds分析

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出的格式是32bits ARM 小端*/
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")指定输出的格式是32bits ARM 小端。
OUTPUT_FORMAT原型为 OUTPUT_FORMAT(default, big, little),在链接的时候,如果使用了-EB的命令行参数,则使用这里的big参数指定的字节序,
如果使用了-EL的命令行参数,则使用这里的little参数指定的字节序,如果没有使用任何命令行参数,则使用这里的default参数指定的字节序。
由uboot.lds中的定义可见,不管在链接的时候使用了何种命令行参数,输出的目标文件都是使用elf32-littlearm方式的字节序。
* OUTPUT_ARCH(arm)/*指出输出可执行文件的平台是arm*/ ENTRY(_start)/*指定输出可执行文件的起始代码段是_start,_start在cpu/arm920t/Start.S,
正的启动运行地址段在编译时在u-boot-1.1.6\board\100ask24x0\config.mk中由CONFIG_SYSTEXT_BASE宏定义,即TEXT_BASE = 0x33F80000
查看Makefile中的LDFLAGS变量,发现一条指令LDFLAGS += -Ttext $(TEXT_BASE) 
其中TEXT_BASE 是在u-boot根目录的board文件夹的对应的开发板名字的子目录下的config.mk文件中定义的0x33F80000*/
SECTIONS {
/*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/ .
= 0x00000000;/*这里的点”.”,是定位器符号(GNU风格的一个典型),把定位器符号置为0x00000000 (若不指定, 则该符号的初始值为0)。
指定系统启动从偏移地址零处开始。注意这只是个代码地址偏移值,真正的起始地址是由编译时指定的LDFLAGS指定的。实际中改动这个值对输出没有影响
*/ . = ALIGN(4);/*调整定位符号,使其4字节对齐*/ .text :/*.text为段名,这段脚本的意思是将所有输入文件的.text section,
以及cpu/arm920t/start.o、 board/100ask24x0/boot_init.o 合并成一个.text section,该section的地址由定位器符号的值指定
*/
{ cpu
/arm920t/start.o (.text) board/100ask24x0/boot_init.o (.text) *(.text) } . = ALIGN(4);/*修改当前定位寄存器,使的下面的.rodata输出节与4bytes对齐,定义.rodata输出节为所有文件的.rodata输入节,*表示通配符,(.rodata*)为所有rodata开头的段。*/ .rodata : { *(.rodata) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); .got : { *(.got) }/*指定got段, got段是uboot自定义的一个段, 非标准段*/ . = .; __u_boot_cmd_start = .;/*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/ .u_boot_cmd : { *(.u_boot_cmd) } /*指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/ __u_boot_cmd_end = .; /*把__u_boot_cmd_end赋值为当前位置,即结束位置*/ . = ALIGN(4); __bss_start = .; /*把__bss_start赋值为当前位置,即bss段的开始位置*/ .bss : { *(.bss) } _end = .;/*把_end赋值为当前位置,即bss段的结束位置*/ }

 

posted @ 2017-10-18 11:33  不明白就去明白  阅读(430)  评论(0编辑  收藏  举报