u-boot lds 分析

OUTPUT_FORMAT("elf64-littleaarch64", "elf64-littleaarch64", "elf64-littleaarch64")
OUTPUT_ARCH(aarch64)
ENTRY(_start)
SECTIONS
{
. = 0x00000000;
. = ALIGN(8);
.text :
{
*(.__image_copy_start)
arch/arm/cpu/armv8/start.o (.text*)
}
.efi_runtime : {
__efi_runtime_start = .;
*(.text.efi_runtime*)
*(.rodata.efi_runtime*)
*(.data.efi_runtime*)
__efi_runtime_stop = .;
}
.text_rest :
{
*(.text*)
}
. = ALIGN(8);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(8);
.data : {
*(.data*)
}
. = ALIGN(8);
. = .;
. = ALIGN(8);
__u_boot_list : {
KEEP(*(SORT(__u_boot_list*)));
}
. = ALIGN(8);
.efi_runtime_rel : {
__efi_runtime_rel_start = .;
*(.rel*.efi_runtime)
*(.rel*.efi_runtime.*)
__efi_runtime_rel_stop = .;
}
. = ALIGN(8);
.image_copy_end :
{
*(.__image_copy_end)
}
. = ALIGN(8);
.rel_dyn_start :
{
*(.__rel_dyn_start)
}
.rela.dyn : {
*(.rela*)
}
.rel_dyn_end :
{
*(.__rel_dyn_end)
}
_end = .;
. = ALIGN(8);
.bss_start : {
KEEP(*(.__bss_start));
}
.bss : {
*(.bss*)
. = ALIGN(8);
}
.bss_end : {
KEEP(*(.__bss_end));
}
/DISCARD/ : { *(.dynsym) }
/DISCARD/ : { *(.dynstr*) }
/DISCARD/ : { *(.dynamic*) }
/DISCARD/ : { *(.plt*) }
/DISCARD/ : { *(.interp*) }
/DISCARD/ : { *(.gnu*) }
}

 

 

. = ALIGN(8);
. = .;
. = ALIGN(8);
__u_boot_list : {
KEEP(*(SORT(__u_boot_list*)));
}

这段代码是链接脚本的一部分,具体是针对U-Boot的链接脚本。U-Boot是一个开源的启动引导程序,用于嵌入式系统。链接脚本是用来描述如何组织和布局代码、数据和堆栈的。

让我们逐行分析这段代码:

1. `. = ALIGN(8);`:这行代码确保接下来的地址是8字节对齐的。ALIGN宏确保下一个符号的地址是给定大小的倍数。
2. `. = .;`:这行代码将当前地址设置为上一个ALIGN指令之后的地址。这样,`.` 符号的地址就是上一个ALIGN指令之后8字节对齐的地址。
3. `. = ALIGN(8);`:再次确保下一个地址是8字节对齐的。
4. `__u_boot_list : {`:定义一个名为`__u_boot_list`的符号,这个符号通常表示一个段的起始地址。
5. `KEEP(*(SORT(__u_boot_list*)));`:这是一个特殊的指令,用于告诉链接器保持并排序所有以`__u_boot_list`为名的段。`KEEP`指令告诉链接器不要删除任何与该指令相关的符号或段,即使它们在某些输入文件中未被引用。`SORT`指令则按照字母顺序对段进行排序。

所有输出文件中,所有以__u_boot_list开头的段都需要保留下载,哪怕是代码中没有引用过的段
6. `}`:结束`__u_boot_list`段的定义。

总的来说,这段链接脚本定义了一个名为`__u_boot_list`的段,并确保其起始地址是8字节对齐的。然后,它保留并排序所有与该段相关的段,以确保它们在最终的二进制文件中按照字母顺序出现。这种布局和排序通常用于确保U-Boot能够正确地找到和加载其依赖的模块或其他资源。

posted on 2024-01-26 16:40  zxddesk  阅读(32)  评论(0编辑  收藏  举报

导航