以下内容源于朱有鹏嵌入式的学习与整理,如有侵权,请告知删除。
九鼎uboot的链接脚本u-boot.lds位于uboot//board/samsung/x210目录。
它是本来就写好的,不像其他uboot那样在make的时候才生成。
xjh@ubuntu:~/iot/embedded_basic/uboot/uboot_jiuding-version$ make distclean
xjh@ubuntu:~/iot/embedded_basic/uboot/uboot_jiuding-version$ cd board/samsung/x210/
xjh@ubuntu:~/iot/embedded_basic/uboot/uboot_jiuding-version/board/samsung/x210$ ls
flash.c lowlevel_init.S Makefile smdkc110_val.h u-boot.lds#这里 x210.c
xjh@ubuntu:~/iot/embedded_basic/uboot/uboot_jiuding-version/board/samsung/x210$
九鼎uboot的链接脚本u-boot.lds内容与分析如下。
/*
* (C) Copyright 2002
* Gary Jennejohn, DENX Software Engineering, <gj@denx.de>
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
* MA 02111-1307 USA
*/
//指定输出的可执行文件是32位的ARM指令,小端模式,ELF格式。
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*OUTPUT_FORMAT("elf32-arm", "elf32-arm", "elf32-arm")*/
OUTPUT_ARCH(arm) //指定可执行平台是ARM平台
ENTRY(_start) //指定程序入口是标号_start
SECTIONS
{
//这里指定程序链接地址是0x0,但是会被Makefile文件中的-Ttext $(TEXT_BASE)覆盖掉,
//所以实际的链接地址是$(TEXT_BASE);“.”代表当前地址
. = 0x00000000;
//四字节对齐
. = ALIGN(4);
//代码段(即text段)中将某些文件靠前排列,因为这些文件都是和BL1相关的,负责启动的第一阶段。
.text :
{
cpu/s5pc11x/start.o (.text) //代码段的第一个.o文件
cpu/s5pc11x/s5pc110/cpu_init.o (.text)
board/samsung/x210/lowlevel_init.o (.text)
cpu/s5pc11x/onenand_cp.o (.text)
cpu/s5pc11x/nand_cp.o (.text)
cpu/s5pc11x/movi.o (.text)
common/secure_boot.o (.text)
common/ace_sha1.o (.text)
cpu/s5pc11x/pmic.o (.text)
*(.text) //表示代码段的其余部分
}
. = ALIGN(4);
.rodata : { *(.rodata) } //这是只读数据段
//格式其实也是用花括号包围起来,只是这里只有一行
. = ALIGN(4);
.data : { *(.data) }//这是数据段
. = ALIGN(4);
.got : { *(.got) }
//u_boot_cmd段是一个自定义段,将来uboot的命令结构体都会被赋予这个段属性,集中被链接在一起。
__u_boot_cmd_start = .;//这个表示__u_boot_cmd_start标号指向u_boot_cmd段起始地址
.u_boot_cmd : { *(.u_boot_cmd) }
__u_boot_cmd_end = .;//这个表示__u_boot_cmd_end标号指向u_boot_cmd段结束地址
. = ALIGN(4);
.mmudata : { *(.mmudata) }
. = ALIGN(4);
__bss_start = .;
.bss : { *(.bss) }
_end = .;
}