1 文件类型
在学习U-Boot源码时遇到了u-boot.lds文件[1]p256,经过查找发现U-Boot源码中有许多同名的u-boot.lds文件(在不同目录中),其中部分截图如下:
由于上图可见,在U-Boot中u-boot.lds分布在平台相关或者开发板相关的目录中。
在Linux Kernel中也使用了许多.lds文件,与U-Boot不同的是,Kernel中的.lds文件都是不同名的:
2 文件内容
根据参考资料[2]的说明可知,.lds是连接器ld的脚本,用于指引链接过程。根据参考资料[1]p256的相关说明可以进一步了解到,可以在.lds中指定目标文件(*.o)所被链接到的段(到底是链接到代码段、数据段开始别的段)以及链接循序(那个目标文件在被链接前面,那个在后面)。
3 实例分析
U-Boot-2011.12的arch/arm/cpu/arm920t/u-boot.lds内容如下:
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") OUTPUT_ARCH(arm) ENTRY(_start) SECTIONS { . = 0x00000000; . = ALIGN(4); .text : { arch/arm/cpu/arm920t/start.o (.text) *(.text) } . = ALIGN(4); .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) } . = ALIGN(4); .data : { *(.data) } . = ALIGN(4); . = .; __u_boot_cmd_start = .; .u_boot_cmd : { *(.u_boot_cmd) } __u_boot_cmd_end = .; . = ALIGN(4); .rel.dyn : { __rel_dyn_start = .; *(.rel*) __rel_dyn_end = .; } .dynsym : { __dynsym_start = .; *(.dynsym) } _end = .; .bss __rel_dyn_start (OVERLAY) : { __bss_start = .; *(.bss) . = ALIGN(4); __bss_end__ = .; } /DISCARD/ : { *(.dynstr*) } /DISCARD/ : { *(.dynamic*) } /DISCARD/ : { *(.plt*) } /DISCARD/ : { *(.interp*) } /DISCARD/ : { *(.gnu*) } }由上可见,u-boot.lds的内容比较简单,只是指定了链接文件的代码段(.text)、数据段(.data)等信息,其中指定了 arch/arm/cpu/arm920t/start.o被链接到代码段的最前面,因此U-Boot是从相应的 arch/arm/cpu/arm920t/start.S开始执行的,可以从这里开始着手分析U-Boot源码。
参考资料
[1]伟东山. 嵌入式Linux应用开发完全手册. 人民邮电出版社,2012
[2]Home : File Types : LDS File
[3].LDS 文件详解
[4]LDS文件格式分析
[5]u-boot lds文件详解
[6]连接脚本分析 (.lds)