uboot lds文件分析
来源:互联网 发布:网络诽谤治安处罚 编辑:程序博客网 时间:2024/06/08 19:44
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);/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
. = ALIGN(4);
/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
/*指定只读数据段*/
. = ALIGN(4);
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN(4);
/*代码以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);
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
/*指定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,这就产生很多疑问了:
(1) 为什么u-boot.lds指定的 .text 的首地址不起作用?
(2) 0x30100000是什么地址,由谁指定.text的首地址是0x30100000的呢?
(3) 假如有其他动作改变了 .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);/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
/*指定只读数据段*/
. = ALIGN(4);
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN(4);
/*代码以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);
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
/*指定bss段,告诉加载器不要加载这个段*/
__bss_end = .;
/*把_end赋值为当前位置,即bss段的结束位置*/
}
上面对u-boot.lds主要做了两点修改
(1) 把0x00000000 改成 0x30000000。
(2) 把 .text 和 .rodata 存放的地址调换了位置。
重新编译 u-boot, 查看System.map
R version_string
r C.27.2365
.
.
.
T _start
t _undefined_instruction
.
.
.
从上面的System.map部分内容可以看出:
(1) u-boot.lds设定的地址(0x00000000或0x30000000)是有效的。
(2) .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中的默认地址(当前地址)不起作用了。
/*指定输出可执行文件是elf格式,32位ARM指令,小端*/
OUTPUT_ARCH(arm)
/*指定输出可执行文件的平台为ARM*/
ENTRY(_start)
/*指定输出可执行文件的起始代码段为_start*/
SECTIONS
{
/*指定可执行image文件的全局入口点,通常这个地址都放在ROM(flash)0x0位置。必须使编译器知道这个地址,通常都是修改此处来完成*/
. = 0x00000000;/*;从0x0位置开始*/
. = ALIGN(4);/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
. = ALIGN(4);
/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
/*指定只读数据段*/
. = ALIGN(4);
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN(4);
/*代码以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);
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
/*指定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,这就产生很多疑问了:
(1) 为什么u-boot.lds指定的 .text 的首地址不起作用?
(2) 0x30100000是什么地址,由谁指定.text的首地址是0x30100000的呢?
(3) 假如有其他动作改变了 .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);/*代码以4字节对齐*/
.rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }
. = ALIGN(4);
/*代码以4字节对齐*/
.text :
{
cpu/arm920t/start.o (.text)
/*代码的第一个代码部分*/
*(.text)
/*下面依次为各个text段函数*/
}
/*指定只读数据段*/
. = ALIGN(4);
/*代码以4字节对齐*/
.data : { *(.data) }
. = ALIGN(4);
/*代码以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);
/*代码以4字节对齐*/
__bss_start = .;
/*把__bss_start赋值为当前位置,即bss段的开始位置*/
.bss (NOLOAD) : { *(.bss) . = ALIGN(4); }
/*指定bss段,告诉加载器不要加载这个段*/
__bss_end = .;
/*把_end赋值为当前位置,即bss段的结束位置*/
}
上面对u-boot.lds主要做了两点修改
(1) 把0x00000000 改成 0x30000000。
(2) 把 .text 和 .rodata 存放的地址调换了位置。
重新编译 u-boot, 查看System.map
R version_string
r C.27.2365
.
.
.
T _start
t _undefined_instruction
.
.
.
从上面的System.map部分内容可以看出:
(1) u-boot.lds设定的地址(0x00000000或0x30000000)是有效的。
(2) .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中的默认地址(当前地址)不起作用了。
0
上一篇: uboot1.1.6/lowlevel.S详解
下一篇:lds文件基础
相关热门文章
- linux内核分析(四)——保护模...
- Contiki学习笔记:Rime协议栈...
- Makefile
- hp BL8x0i4刀片更换主板
- unix环境高级编程 代码编译 ...
- test123
- 编写安全代码——小心有符号数...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- sql relay的c++接口
- 支付宝公司客服电话是...
- shell怎么读取网页内容...
- ssh等待连接的超时问题...
- curl: (56) Recv failure: Con...
- CACTI 不能安装WINE,怎么办?...
给主人留下些什么吧!~~
评论热议
0 0
- uboot lds文件分析
- 6410 UBOOT lds文件分析
- uboot之uboot.lds文件分析
- 关于uboot.lds文件的分析
- 关于uboot.lds文件的分析
- 关于uboot.lds文件的分析
- 关于uboot.lds文件的分析
- 关于uboot.lds文件的分析
- UBOOT启动过程及uboot.lds文件分析
- Uboot.lds分析
- uboot.lds分析
- uboot.lds分析
- uboot.lds分析
- uboot 之uboot.lds分析
- uboot 之uboot.lds分析
- uboot 之uboot.lds分析
- uboot 之uboot.lds分析
- uboot 之uboot.lds分析
- UBOOT移植详细 很全面
- ubuntu上进行C/C++开发
- lowleve_init.S分析(转)
- uboot1.1.6/lowlevel.S详解
- C++求解
- uboot lds文件分析
- lds文件基础
- HDU 1030 Delta-wave 数学题解
- 统计文本中各单词出现的频率(JavaWeb)
- MDS(multidimensional scaling)多维尺度分析
- javascript里的条件判断
- 【智能车新手入门】-赛车行驶策略
- POJ 2456 Aggressive cows(二分+贪心)
- hdu-1527
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
怀旧服人口普查nga
魔兽世界人口普查
英国王室鹅口普查
魔兽世界人口普查2019
wow怀旧服人口普查
魔兽怀旧人口普查
第六次全国人口普查
178魔兽世界人口普查
魔兽世界服务器人口普查2018
魔兽世界怀旧服人口普查nga
2020几月开始人口普查
魔兽世界服务器人口普查
普格县
普格
普格县花店
西昌普格县酒店
大众新普桑
普桑报价
普桑论坛
改装普桑
老款普桑
普桑轮胎型号
普桑轮胎规格
上海大众普桑新款
上海大众普桑
普桑二手轿车
大众新普桑价格
二手普桑多少钱
老普桑保险盒示意图
普桑正时皮带安装图
普桑是什么车
桑塔纳普桑报价
大众桑塔纳180
桑塔纳多钱
图观
浩纳价格
桑塔纳两厢图和报价
大众浩纳
桑塔纳vista
桑塔纳4000
桑塔纳浩纳