U-boot.lds文件分析

1 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
2 OUTPUT_ARCH(arm)
3 ENTRY(_start)

lds文件位于board/samsung/smdk6410/u-boot-nand.lds下。

指定elf32-littlearm 格式,即指定输出文件是elf格式,32位ARM指令,小端模式;

紧接着OUTPUT_ARCH(arm) 指定的是输出可执行文件的运行平台为ARM;

ENTRY(_start)指定_start函数为程序的入口,_start在arch/arm/cpu/arm1176/start.S中定义,真正的启动运行地址段在编译时在board/samsung/smdk6410/config.mk中由CONFIG_SYSTEXT_BASE宏定义,即TEXT_BASE = 0x57E00000

1 SECTIONS
2 {
3     . = 0x00000000;
4
5     . = ALIGN(4);

SECTIONS开始定义程序段。

这里的点”.”,是定位器符号(GNU风格的一个典型)。

把定位器符号置为0x00000000 (若不指定, 则该符号的初始值为0)。

定系统启动从偏移地址零处开始。注意这只是个代码地址偏移值,真正的起始地址是由编译时指定的

CFLAGS指定的。

4字节对齐调整,那么ALIGN(0x10) 即16字节对齐后。

1 .text      :
2     {
3       arch/arm/cpu/arm1176/start.o    (.text)
4           board/samsung/smdk6410/libsmdk6410.o  (.text)
5       *(.text)
6     }

.text为段名,这段脚本的意思是将所有输入文件的.text section,以及arch/arm/cpu/arm1176/start.o、board/samsung/smdk6410/libsmdk6410.o合并成一个.text section,该section的地址由定位器符号的值指定(字节对齐后定位器符号的值)。

1 . = ALIGN(4);
2     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

修改当前定位寄存器,使的下面的.rodata输出节与4bytes对齐,定义.rodata输出节为所有文件的.rodata输入节,*表示通配符,(.rodata*)为所有rodata开头的段。

1 .rel.dyn : {
2         __rel_dyn_start = .;
3         *(.rel*)
4         __rel_dyn_end = .;
5     }

用于用于动态连接的重定位信息。

1 .dynsym : {
2         __dynsym_start = .;
3         *(.dynsym)
4     }

.dynsym动态符号表,这个表只保存了与动态链接相关的符号, __dynsym_start = . ;这是动态连接符号表的数据结构部分,须与.dynstr联用。

1 .bss __rel_dyn_start (OVERLAY) : {
2         __bss_start = .;
3         *(.bss)
4         . = ALIGN(4);
5         __bss_end__ = .;
6     }

bss,为什么会有__rel_dyn_start(OVERLAY),不知道原因。

这里说明一点:在没有对位置技术器进行赋值时,位置计数器会动态的增加,比如. = .;这一条语句,此时位置技术器的位置就是从0开始加上代码段,只读数据段,数据段,got段的大小,紧接着之后的位置。

时间: 2024-10-20 08:01:12

U-boot.lds文件分析的相关文章

arm处理器的u-boot.lds文件分析

1)u-boot的实现分为stage1与stage2两个阶段,其中依赖与CPU体系结构的代码通常都是放在stage1里,并且通常用汇编语言实现.stage2通常用C语言实现,可以实现更加复杂的功能,并且有更好的移植性与可读性. 2)U-Boot 的 Stage1 通常是在 start.S 文件中实现,并且都是用汇编语言编写.一个可执行性 image 文件必须有一个入口点, 并且只能有一个全局入口点, 通常这个入口点的地址放在 ROM(Flash)0x0 位置,因此必须使编译器知道这个入口地址,该

uboot之uboot.lds文件分析

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") /*指定输出可执行文件是elf格式,32位ARM指令,小端*/OUTPUT_ARCH(arm) /*指定输出可执行文件的平台为ARM*/ENTRY(_start) /*指定输出可执行文件的起始代码段为_start*/SECTIONS{ /*指定可执行image文件的全局入口点,通常这个地址都放在ROM(fl

u-boot start.S启动文件分析

u-boot start.S启动文件分析 u-bootstart.SBL1 u-boot start.S启动文件分析 一.start.S来源 1.为何要分析start.S 2.start.S的来源 3.头文件包含 二.start.S分析 1.Start.S分析 16字节校验头 异常向量表 16字节内存对齐 设置CPU为SVC模式 L2 cache操作 Invalidate L1 I/D 关掉MMU 读取启动引脚信息 第一次设置栈 ./board/samsung/x210/lowlevel_ini

u-boot.lds文件简介

可执行文件由许多链接在一起的对象文件组成.对象文件有许多节,如文本.数据.init 数据.bss等.这些对象文件都是由一个称为 链接器脚本(*lds)的文件链接并装入的.这个链接器脚本的功能是将输入对象文件的各节映射到输出文件中:换句话说,它将所有输入对象文件都链接到单一的可执行文件中,将该可执行文件的各节装入到指定地址处. 因此在分析u-boot代码是,首先应关注的是u-boot.lds文件,它位于$(U-BOOT_SRC_ROOT)/board/$(BOARD_NAME)目录下. 1 /*

nova boot代码流程分析(三):nova与neutron的交互(2)

继续<nova boot代码流程分析(三):nova与neutron的交互(1)>的分析. #/nova/virt/libvirt/driver.py:LibvirtDriver # NOTE(ilyaalekseyev): Implementation like in multinics # for xenapi(tr3buchet) def spawn(self, context, instance, image_meta, injected_files, admin_password,

nova boot代码流程分析(五):VM启动从neutron-dhcp-agent获取IP与MAC

1.   network和subnet创建代码流程 [[email protected] ~(keystone_user1)]# neutron net-create demo-net [[email protected] ~(keystone_user1)]# neutron subnet-create  demo-net 1.1.1.0/24 --name demo-subnet --gateway 1.1.1.1 --enable_dhcp true 这里,我们主要分析上面两个命令的代码流

Linux常用命令(十二)日志文件分析

? ? ? ? ? ? ? ? ? ? ? ? Linux常用命令(十二)日志文件分析 日志文件是用于记录Linux系统中各种运行消息的文件,相当于Linux主机的"日记".不同的日志文件记载了不同类型的信息,如Linux内核消息.用户登录事件.程序错误等. 一.主要日志文件 ???? ? ? ? 在Linux系统中,日志数据主要包括以下三种类型. ■ 内核及系统日志: 这种日志数据由系统服务rslslog统一管理,根据其主配置文件/etc/rsyslog.conf中的设置决定将内核消

10046 trace文件分析

SQL> create table t10046 as select * from dba_objects; Table created. SQL> select file_id,block_id,blocks from dba_extents where segment_name='T10046'; FILE_ID BLOCK_ID BLOCKS ---------- ---------- ---------- 1 94664 8 1 94672 8 1 94680 8 1 94688 8

/proc/cpuinfo 文件分析(查看CPU信息)

/proc/cpuinfo文件分析 根据以下内容,我们则可以很方便的知道当前系统关于CPU.CPU的核数.CPU是否启用超线程等信息. <1>查询系统具有多少个逻辑核:cat /proc/cpuinfo | grep "processor" | wc -l   //逻辑处理器的id(逻辑核数) <3>查询系统CPU的个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l