链接脚本.lds

1 文件类型

    在学习U-Boot源码时遇到了u-boot.lds文件[1]p256,经过查找发现U-Boot源码中有许多同名的u-boot.lds文件(在不同目录中),其中部分截图如下:

链接脚本.lds_第1张图片

    由于上图可见,在U-Boot中u-boot.lds分布在平台相关或者开发板相关的目录中。

    在Linux Kernel中也使用了许多.lds文件,与U-Boot不同的是,Kernel中的.lds文件都是不同名的:

链接脚本.lds_第2张图片

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) 

你可能感兴趣的:(链接脚本.lds)