链接文件(lds)可以决定一个可执行代码的各个段的存储位置、入口地址等,下面是s3c6410的uboot lds的详细注释 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ;OUTPUT_FORMAT(default, big, little),在链接的时候,如果使用了-EB的命令行参数,则使用这里的big参数指定的字节序,如果使用了-EL;的命令行参数,则使用这里的little参数指定的字节序,如果没有使用任何命令行参数,则使用这里的default参数指定的字节序。 ;由uboot.lds中的定义可见,不管在链接的时候使用了何种命令行参数,输出的目标文件都是使用elf32-littlearm方式的字节序。 //指定输出可执行文件是elf格式,32位ARM指令,小端 OUTPUT_ARCH(arm) //指定输出可执行文件的平台为ARM ENTRY(_start) //指定输出可执行文件的起始代码段为_start. SECTIONS { . = 0x00000000 //定位当前地址为0地址 . = ALIGN(4) //代码以4字节对齐 .text : //指定代码段 { cpu/arm920t/start.o (.text) //代码的第一个代码部分 *(.text) //其它代码部分 } . = ALIGN(4) .rodata : { *(.rodata) } //指定只读数据段 /* uboot目录下/include/u-boot/u-boot.lds.h文件定义SORT_BY_ALIGNMENT和SORT_BY_NAME,该目录下也有MD5和zlib的头文件 #ifndef __U_BOOT_LDS__ #ifndef __U_BOOT_LDS__ #define __U_BOOT_LDS__ /* See if the linker version is at least the specified version */ #define LD_AT_LEAST(major, minor) / ((major > LD_MAJOR) || (major == LD_MAJOR && minor <= LD_MINOR)) /* * Linker versions prior to 2.16 don't understand the builtin * functions SORT_BY_ALIGNMENT() and SORT_BY_NAME(), so disable these */ #if !LD_AT_LEAST(2, 16) # define SORT_BY_ALIGNMENT(x) x # define SORT_BY_NAME(x) x #endif #endif //2.16版本后上面的指定只读数据段也可以用下面的配置行代替 .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.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) } //指定bss段 _end = . //把_end赋值为当前位置,即bss段的结束位置 }