自己写bootloader笔记4---uboot.lds分析

1、链接脚本格式

<SECTIONS>基本命令
SECTIONS 描述输出文件的映射图 -> 输出文件各段、各文件怎么放置
一个SECTIONS命令内部包含一个或多个段,段是连接脚本的基本单元,它 表示输入文件某部分怎么放置;

格式:
SECTIONS{
  ...
secname start ALIGN(align)(NOLOAD):AT(ldadr)
{contents}>region:phdr=fill
...
}
secname:命名这个段  
contents:用来确定代码的什么部分放在这个段
start:是这个段的重定位地址,也叫运行地址。如果代码中有位置无关的 指令,程序在运行时必须放在这个地址上。
ALIGN(align):虽然指定了运行地址,但仍可以使用ALIGN(align)来指定 对齐的要求---这个对齐的地址才是真正的地址
(NOLOAD):来告诉加载器,在运行时不用加载这个段
AT(ldadr):指定这个段在编译出来的映像文件中的地址——加载地址

2、链接脚本实例分析

SECTIONS {

    . = 0x33f80000;  //链接地址为 0x33f80000,因为较前的地址用于存储内核,且 0x33f80000跟最高地址0x34000000相差512K,程序不会超过512K
    .text : { *(.text) } //所有文件的代码段
    
    . = ALIGN(4);  //代码以4字节对齐
    .rodata : {*(.rodata*)}  //所有文件的只读数据段
    
    . = ALIGN(4);   //代码以4字节对齐
    .data : { *(.data) }  //所有文件的数据段
    
    . = ALIGN(4);  //代码以4字节对齐
    __bss_start = .;  //
    .bss : { *(.bss)  *(COMMON) } //所有文件的bss段,bss段是没有初始化的全局变量,或者初始化为0的全局变量,程序假设有一万个全局变量,这一万个全局变量初始值都是0,难道编译出来的程序里面要存放一万个0吗?编译出来的二进制文件不会含有初始值为0的变量。程序运行前先把bss段占用的内存清零,相当于把所有变量初始值设为0.
    __bss_end = .;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值