u-boot.lds 链接脚本分析(hi3515)
目录:/u-boot_hi3515/board/hi3515v100
OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm") //输出可执行文件是elf格式,32位ARM指令,小端
OUTPUT_ARCH(arm) //输出可执行文件的运行环境,是 arm 平台的
ENTRY(_start) //指定输出可执行文件的起始代码段为_start(在start.S中定义)
SECTIONS //section 命令用来设置段
{
. = 0x00000000; //将当前地址定位到 0x00000000 处,操作符用来表示当前地址
. = ALIGN(4); //代码以4字节对齐
.text : // 定义 .text 段
{
//段由start.o,libhi3515v100.a,dlmalloc.o,console.o,nand_boot.o等中的.text段所有段组成
cpu/arm926ejs/start.o (.text) //代码的第一个代码部分
board/hi3515v100/libhi3515v100.a (.text)
common/dlmalloc.o (.text)
common/console.o (.text)
common/nand_boot.o (.text)
drivers/mtd/libmtd.a (.text)
drivers/mtd/nand/libnand.a (.text)
lib_generic/libgeneric.a (.text)
cpu/arm926ejs/libarm926ejs.a (.text)
cpu/arm926ejs/hi3515v100/libhi3515v100.a (.text)
lib_arm/libarm.a (.text)
drivers/serial/libserial.a (.text)
}
. = ALIGN(4);
.rodata : { *(.rodata) } //指定.rodata段(只读数据段)由所有输入文件的.rodata段组成
. = ALIGN(4);
.data : { *(.data) } //指定.data段(读/写数据段)由所有输入文件的.rodata段组成
. = ALIGN(4);
.got : { *(.got) } //.got段由所有输入文件的. got段组成(got段式是uboot自定义的一个段, 非标准段)
. = ALIGN(4);
.text1 : //指定其他代码段
{
*(.text)
}
. = ALIGN(4);
. = .; //指定定位器为当前值(即为该语句相对段首偏移)
__u_boot_cmd_start = .; //__u_boot_cmd_start的值被设置为了当前地址
.u_boot_cmd : { *(.u_boot_cmd) } //.u_boot_cmd段由所有文件的.u_boot_cmd段组成
__u_boot_cmd_end = .; //__u_boot_cmd_end变量的值被赋值为了当前地址
__img_end = .;
. = _start + 0x100000; //指定定位器为开始地址+0x100000(偏移)处
. = ALIGN(32); //定位器当前地址,32位对齐
__bss_start = .; //把__bss_start赋值为当前位置,即bss段的开始位置
.bss1 (NOLOAD) : {*(.bss)} //.bss段由所有输入文件的.bss段组成
_end = .; //把_end赋值为当前位置,即bss段的结束位置
}
a.out 的头部根据 unix 版本的不同而略有变化, BSD 中的格式如下
int a_magic ; // 幻数
int a_text; // 文本段的大小
int a_data; // 初始化的数据段的大小
int a_bss; // 未初始化的数据段的大小
int a_syms; // 符号表的大小
int a_entry; // 入口点
int a_trsize; // 文本重定位段的大小
int a_drsize; // 数据重定位段的大小
text section: 存放程序代码
Data section: 存放数据
Bss section : 存放未初始化的数据,在镜像文件中,是不为 bss 段分配空间的,所以如果你开一个很大的全局的未初始化的数组,镜像文件的大小不会相应的变大。而只是在加载器将镜像加载进内存时,才会为 bss 段分配空间
链接器:把各个目标文件的各种段进行重新组合.
u-boot.lds 链接脚本分析(hi3515)的更多相关文章
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析
先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main.c这4个文件: 1.1 首先创建链接脚本nand.lds: SECTIONS { firtst ...
- 裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- arm裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- makefile使用.lds链接脚本以及 $@ ,$^, $,< 解析【转】
转自:http://www.cnblogs.com/lifexy/p/7089873.html 先来分析一个简单的.lds链接脚本 例1,假如现在有head.c init.c nand.c main. ...
- Linux下的lds链接脚本详解
1. 概论2. 基本概念3. 脚本格式4. 简单例子5. 简单脚本命令6. 对符号的赋值7. SECTIONS命令8. MEMORY命令9. PHDRS命令10. VERSION命令11. 脚本内的表 ...
- [转]Linux下的lds链接脚本详解
转载自:http://linux.chinaunix.net/techdoc/beginner/2009/08/12/1129972.shtml 一. 概论 每一个链接过程都由链接脚本(lin ...
- Linux下的lds链接脚本简介
转载:http://hubingforever.blog.163.com/blog/static/171040579201192472552886/ 一. 概论 每一个链接过程都由链接脚本(lin ...
- Linux下的lds链接脚本详解【转】
转自:http://www.cnblogs.com/li-hao/p/4107964.html 转载自:http://linux.chinaunix.net/techdoc/beginner/2009 ...
- Linux下的lds链接脚本简介(二)
七. SECTIONS命令 SECTIONS命令告诉ld如何把输入文件的sections映射到输出文件的各个section: 如何将输入section合为输出section; 如何把输出section ...
随机推荐
- JavaWeb学习总结第一篇--初识JavaWeb
JavaWeb学习总结(一)-- 初识JavaWeb 一:Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器和网络组成.Web程序的好处就是使用简单,不需要安装.学习,有一台电脑. ...
- 【JavaSE】Java问题总结
使用BufferedInputStream时OutOfMemoryError异常 eclipse Luna安装subversion(SVN) 使用BufferedInputStream时OutOfMe ...
- WPF学习之深入浅出话模板
图形用户界面应用程序较之控制台界面应用程序最大的好处就是界面友好.数据显示直观.CUI程序中数据只能以文本的形式线性显示,GUI程序则允许数据以文本.列表.图形等多种形式立体显示. 用户体验在GUI程 ...
- MySQL mysqlbinlog
MySQL binlog日志记录了MySQL数据库从启用日志以来所有对当前数据库的变更.binlog日志属于二进制文件,我们可以从binlog提取出来生成可读的文本或者SQL语句来重建当前数据库以及根 ...
- 怎么用cookie解决选项卡问题刷新后怎么保持原来的选项?
什么是cookie? Cookies虽然一般都以英文名呈现,但是它还是有一个可爱的中文名“小甜饼”.Cookies是指服务器暂存放在你的电脑里的txt格式的文本文件资料,主要用于网络服务器辨别电脑使用 ...
- 九度OJ 1035:找出直系亲属 (二叉树、递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2380 解决:934 题目描述: 如果A,B是C的父母亲,则A,B是C的parent,C是A,B的child,如果A,B是C的(外) ...
- cocos2d-js v3.1的坑
前几天因为要用到cc.pool,所以就换了v3.1版本,结果连生成apk的出错(cocos code ide), log显示为:error: relocation overflow in R_ARM_ ...
- linux c编程:进程间通信
进程间的通信包括管道,共享内存,信号量通信,消息队列,套借口(socket)和全双工管道通信 首先来看下管道的用法:管道顾名思义,就如同下水道管道一样,当从管道一端流水到另一端的时候,水流的方向是单方 ...
- STO到底是什么?
最近,链圈谈论最多的就是STO了,那STO到底是什么?现阶段发展得怎么样? 什么是STO STO英文全称Security Token Offering,即证券化通证发行,指在安全法律体系下受到约束的基 ...
- Android Studio快速添加Gson Gsonformat
一.Android Studio快速添加Gson 具体操作: 1.File->Project Structure: 2.app->Dependencies->" ...