u-boot.lds文件诠释

来源:互联网 发布:linux如何查看内核日志 编辑:程序博客网 时间:2024/05/18 00:56

转载自http://blog.csdn.net/qiaoliang328/article/details/5891913

u-boot.lds文件诠释

 

网上大部分u-boot.lds文件的分析大部分都是千遍一律,例如下面就是本人在网上找到的关于u-boot.lds的资料。

OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm","elf32-littlearm")

/*指定输出可执行文件是elf格式,32ARM指令,小端*/
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,

 

30100000 T _start

30100020 t _undefined_instruction

30100024 t _software_interrupt

30100028 t _prefetch_abort

3010002c t _data_abort

30100030 t _not_used

30100034 t _irq

30100038 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格式,32ARM指令,小端*/
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

30000000 R version_string

30000028 r C.27.2365

.

.

.

30100000 T _start

30100020 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 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 刚做的系统玩cf卡屏怎么办 办健康证的资料掉了怎么办 刚刚办得的健康证掉了怎么办 房子都过户了银行贷不了款怎么办 我要办大病迁出应该怎么办啊? 遗产继承后户口没地迁出怎么办 安徽蒙城怎么办去韩国的签证的 夜间有人私自收停车费应该怎么办 上次摸不到环尾丝这次摸到了怎么办 法院判决书下来后对方不给钱怎么办 法院判决书下来了钱还保全么怎么办 深圳路边泊车不知道泊车编号怎么办 当事人进拘留所了我的工资怎么办 昆明公租房住满5年后怎么办 昆明公租房房子到期缴纳金怎么办 看守所犯人银行卡里钱没用完怎么办 中国邮政迟迟没有把信件寄到怎么办 拘留15天放出来还不肯还钱怎么办 人死在拘留所不让看监控怎么办 家人吸毒可他又不愿强戒怎么办 容留他人吸毒时签了强戒怎么办 拘留后发现被拘留是人大代表怎么办 执行局要拘留人找不到人怎么办 开设赌场罪拘留37天了该怎么办 对治安处罚光罚款不拘留怎么办 打架和解后警察不给消案怎么办 12个人片诈骗刑拘了28天怎么办 交警拘留几天后还是没钱赔偿怎么办 平安车主信用卡车牌号填错了怎么办 起诉借钱的人逮起来了怎么办 在法院查不到坐牢人的档案怎么办 人被冤枉敲诈勒索进看守所了怎么办 打架被拘留孩子怎么办三周了 技师被拘留她的家人该怎么办 我是担保人贷款人跑了我该怎么办 公司依旷工理由辞退我该怎么办 试工两天被辞退了不发工资怎么办 员工在单位被打监控调不出来怎么办 老师罚做60张试卷家长该怎么办 孩子在幼儿园被老师打该怎么办 孩子被孩子打了老师该怎么办?