uboot的lds文件分析
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*指定输出可执行文件是elf格式,32位ARM指令,小端*/
OUTPUT_ARCH(arm)
/*指定输出可执行文件的平台为ARM*/
ENTRY(_start)
/*指定输出可执行文件的起始代码段为_start*/
SECTIONS
{
/*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
. = 0x00000000;/*;从0x0位置开始*/
. = ALIGN();/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
. = ALIGN();
/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
/*指定只读数据段*/
. = ALIGN();
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN();
/*代码以4字节对齐*/
.got : { *(.got) }
/*指定got段, got段是uboot自定义的一个段, 非标准段*/
. = .;
__u_boot_cmd_start = .;
/*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/
.u_boot_cmd : { *(.u_boot_cmd) }
/*指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/
__u_boot_cmd_end = .;
/*把__u_boot_cmd_end赋值为当前位置,即结束位置*/
. = ALIGN();
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(); }
/*指定bss段,告诉加载器不要加载这个段*/
__bss_end = .;
/*把_end赋值为当前位置,即bss段的结束位置*/
}
看完上面的解析思路本来应该是很清晰的,于是乎编译u-boot,查看一下System.map,
T _start
t _undefined_instruction
t _software_interrupt
t _prefetch_abort
3010002c t _data_abort
t _not_used
t _irq
t _fiq
发现 _start 的链接地址不是u-boot.lds中.text 的当前地址0x00000000,而是0x30100000,这就产生很多疑问了:
() 为什么u-boot.lds指定的 .text 的首地址不起作用?
() 0x30100000是什么地址,由谁指定.text的首地址是0x30100000的呢?
() 假如有其他动作改变了 .text 的首地址,那么该动作跟u-boot.lds的优先级又是怎么决定的呢?
其实这三个问题都在Makefile的LDFLAGS 变量和u-boot.lds 中找到答案。我们不妨试着修改一下u-boot.lds,把u-boot.lds修改成如下(红色字体部分为修改过部分):
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
/*指定输出可执行文件是elf格式,32位ARM指令,小端*/
OUTPUT_ARCH(arm)
/*指定输出可执行文件的平台为ARM*/
ENTRY(_start)
/*指定输出可执行文件的起始代码段为_start*/
SECTIONS
{
/*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
. = 0x30000000;/*;从0x0位置开始*/
. = ALIGN();/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN();
/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
/*指定只读数据段*/
. = ALIGN();
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN();
/*代码以4字节对齐*/
.got : { *(.got) }
/*指定got段, got段是uboot自定义的一个段, 非标准段*/
. = .;
__u_boot_cmd_start = .;
/*把__u_boot_cmd_start赋值为当前位置, 即起始位置*/
.u_boot_cmd : { *(.u_boot_cmd) }
/*指定u_boot_cmd段, uboot把所有的uboot命令放在该段.*/
__u_boot_cmd_end = .;
/*把__u_boot_cmd_end赋值为当前位置,即结束位置*/
. = ALIGN();
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(); }
/*指定bss段,告诉加载器不要加载这个段*/
__bss_end = .;
/*把_end赋值为当前位置,即bss段的结束位置*/
}
上面对u-boot.lds主要做了两点修改
() 把0x00000000 改成 0x30000000。
() 把 .text 和 .rodata 存放的地址调换了位置。
重新编译 u-boot, 查看System.map
R version_string
r C.27.2365
.
.
.
T _start
t _undefined_instruction
.
.
.
从上面的System.map部分内容可以看出:
() u-boot.lds设定的地址(0x00000000或0x30000000)是有效的。
() .text的地址仍然是30100000
跟着我们查看Makefile中的LDFLAGS变量,发现一条指令
LDFLAGS += -Ttext $(TEXT_BASE) 其中TEXT_BASE 是在u-boot根目录的board文件夹的对应的开发板名字的子目录下的config.mk文件中定义的
TEXT_BASE = 0x30100000
看到这里我们应该明白为什么_start,也就是.text的首地址总是等于0x30100000了,在连接的时候ld命令会把参数-Ttext指定的地址赋给.text,所以.text在u-boot.lds中的默认地址(当前地址)不起作用了。
http://blog.csdn.net/qiaoliang328/article/details/5891913
uboot的lds文件分析的更多相关文章
- U-boot.lds文件分析
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") ...
- u-boot.lds文件简介
可执行文件由许多链接在一起的对象文件组成.对象文件有许多节,如文本.数据.init 数据.bss等.这些对象文件都是由一个称为 链接器脚本(*lds)的文件链接并装入的.这个链接器脚本的功能是将输入对 ...
- U-Boot启动过程完全分析
U-Boot启动过程完全分析 1.1 U-Boot工作过程 U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下: (1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段 ...
- 基于S3C2440的U-BOOT的start.S分析
基于S3C2440的U-BOOT的start.S分析 在了解了ARM相关的汇编指令后,同时结合网上各位大虾的提点开始阅读u-boot的启动代码,现将分析过程记录如下 可执行文件及内存映射 我们可以把可 ...
- U-Boot启动过程完全分析<转>
转载自:http://www.cnblogs.com/heaad/archive/2010/07/17/1779829.html 1.1 U-Boot工作过程 U-Boot启动内核的过程可 ...
- U-Boot编译过程完全分析
2.1 U-Boot Makefile分析 2.1.1 U-Boot编译命令 对于mini2440开发板,编译U-Boot需要执行如下的命令: $ make m ...
- ARM 链接配置.lds文件学习<转>
本文由Jacky原创,来自http://blog.chinaunix.net/u1/58780/showart.php?id=462971 对于.lds文件,它定义了整个程序编译之后的连接过程,决定了 ...
- 海思uboot启动流程详细分析(三)【转】
1. 前言 书接上文(u-boot启动流程分析(二)_平台相关部分),本文介绍u-boot启动流程中和具体版型(board)有关的部分,也即board_init_f/board_init_r所代表的. ...
- lds 文件说明
主要符号说明 OUTPUT_FORMAT(bfdname) 指定输出可执行文件格式. OUTPUT_ARCH(bfdname) 指定输出可执行文件所运行 CPU 平台 ENTRY(symbol) 指定 ...
随机推荐
- javascript 设计模式
了解JavaScript设计模式我们需要知道的一些必要知识点:(内容相对基础,高手请跳过) 闭包:关于闭包这个月在园子里有几篇不错的分享了,在这我也从最实际的地方出发,说说我的理解. 1.闭包最常用的 ...
- html5之canvas画图 1.写字板功能
写字板事例: 写字板分析:1.点击鼠标開始写字(onmosedown)2.按下鼠标写字(onmousemove)3.松开鼠标,停下写字(撤销onmousemove事件): 代 ...
- pip简单配置
pip安装Python模块的工具,等价于Redhat中的yum! 01.下载 百度云盘:http://pan.baidu.com/s/1eRHGBfk ###相关的 Linux ...
- STL容器 erase的使用陷井
http://www.cppblog.com/beautykingdom/archive/2008/07/09/55760.aspx?opt=admin 在STL(标准模板库)中经常会碰到要删除容器中 ...
- 关于 while(1)和for(;;)效率问题的一点想法
这几天看到好友的文章关于while(1)和for(;;)效率的讨论,手痒说了两句.回头一寻思,自己也仅仅是判断.没有做不论什么实验,我们就看看这两种写法究竟有什么差别: 实验环境:IAR EWARM ...
- Android API之android.provider.ContactsContract
android.provider.ContactsContract ContactsContract是联系人provider和app的contract.定义了已支持的URL和column.取代了之前的 ...
- VS:"64位调试操作花费的时间比预期要长"的一解决途径
解决办法之一: 在命令提示符那里打入如下命令: netsh winsock reset catalognetsh int ip reset reset.log hit 重启电脑后,即可
- MyEclipse 8.6插件下载
(源自网络:http://hi.baidu.com/%D4%B5%BA%A3%C7%E9%C9%EE/blog/item/ad86323d1e80a5e33d6d97c6.html 和 http:/ ...
- HDUOJ------(1272)小希的迷宫
小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- Java程序作linux服务并且开机自动启动[转]
以有个java应用名称为test,打包为test.jar,程序入口为cn.com.ppnote.SocketServer. 下面在linux的/opt下建立testapp目录,复制test.jar到/ ...