正点原子uboot链接脚本分析,详见注释。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")//指定输出可执行文件是elf格式、32位ARM指令、小端
OUTPUT_ARCH(arm)//指定输出可执行文件所运行 CPU 平台
ENTRY(_start)//程序默认入口标号是_start 也可以在链接脚本中使用ENTRY指定程序入口标号
SECTIONS
{
. = 0x00000000;//指明目标代码起始地址从0x0开始,"."代表当前位置
. = ALIGN(4);//按 4 个字节的倍数对齐下一个符号,空隙默认用0 来填充
.text : //.text代码段,只读和可执行
{
*(.__image_copy_start)//映像文件复制起始地址 在System.map和u-boot.map中均有定义
*(.vectors)/中断向量表
arch/arm/cpu/armv7/start.o (.text*)
*(.text*)//其它代码部分.其中,*表示其它任意文件
}
. = ALIGN(4);
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }//指定只读数据段,RO段
. = ALIGN(4);
.data : { //指定读/写数据段,RW段
*(.data*)
}
. = ALIGN(4);
. = .;
. = ALIGN(4);
.u_boot_list : {
KEEP(*(SORT(.u_boot_list*)));
}
. = ALIGN(4);
.image_copy_end :
{
*(.__image_copy_end)
}
.rel_dyn_start :
{
*(.__rel_dyn_start)
}
.rel.dyn : {
*(.rel*)
}
.rel_dyn_end :
{
*(.__rel_dyn_end)
}
.end :
{
*(.__end)
}
_image_binary_end = .;
. = ALIGN(4096);
.mmutable : {
*(.mmutable)
}
.bss_start __rel_dyn_start (OVERLAY) : {
KEEP(*(.__bss_start));
__bss_base = .;
}
.bss __bss_base (OVERLAY) : {
*(.bss*)
. = ALIGN(4);
__bss_limit = .;
}
.bss_end __bss_limit (OVERLAY) : {
KEEP(*(.__bss_end));
}
.dynsym _image_binary_end : { *(.dynsym) }
.dynbss : { *(.dynbss) }
.dynstr : { *(.dynstr*) }
.dynamic : { *(.dynamic*) }
.plt : { *(.plt*) }
.interp : { *(.interp*) }
.gnu.hash : { *(.gnu.hash) }
.gnu : { *(.gnu*) }
.ARM.exidx : { *(.ARM.exidx*) }
.gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
}