ARM-ELF文件格式与GNU ARM Linker机制

这里所说的ARM系统基本文件格式,都在基于ARM的嵌入式系统开发中常会碰到文件格式。

ARM系统基本文件格式有三种:

1) BIN,平板式二进制格式,一般用于直接烧写到Flash中,也可以用于加载到monitor程序中。

2) ELF,EXECUTABLE AND LINKABLE FORMAT,一种通用的OBJECT文件格式,一般由GNU COMPILER COLLECTION (GCC)产生。

3) AXF,BIN格式的扩展版,主体部分同BIN,在文件头和尾加入了调试用的信息,用于AXD。

本文主要讨论BIN与ELF。

首先说明,ELF格式是一种OBJECT文件格式。一般OBJECT文件都可以分成三类:可重定位OBJECT文件,可执行OBJECT文件,共享OBJECT文件。ELF格式文件也可以分成这三种。

先说说可重定位OBJECT文件。这种OBJECT文件一般由GCC中的ASSEMBLER(as)产生(请不要认为GCC只是编译器),里面除了二进制

的机器代码,还有一些可用于进行重定位的信息。它主要是作为LINKER(ld)的输入,LINKER将跟据这些信息,将需要重定位的符号重定位,进而产

生可执行的OBJECT文件。ELF格式的可重定位OBJECT文件由header与section组成。

Header 包括

ELF header 与 section header. ELF header 位于文件的头部,用于存储目标机器的架构,大小端配

置,ELF header大小,object文件类型,section header 在文件中的偏移,section header    的大

小,section header 中的项目数等信息。Section header 则定义了文件中每个section 的类型,位置,大小等信息。

Linker就是通过查找ELF header,找到section header 的入口,再在section header 中找到相应的

section 入口,进而定位到目标section 的。

Section 包括

.text    :经过编译的机器代码。

.rodata  :只读的数据,例如printf(“hello!”)中的字符串hello。

.data    :已初始化的全局变量,局部变量将在运行时被存放在堆栈中,不会在.data或 .bss段中出现。

.bss     :未初始化的全局变量,在这里只是一个占位符,在object文件中并没有实际的存储空间。

.symtab  :符号表,用于存放程序中被定义的或被引用到的全局变量和函数的信息。

.rel.text  :

一个保存着一系列在.text中的位置的列表。这些位置将在linker把这个文件与其它object文件合并时被修改,一般来说,这些位置都是保存着一

些引用到全局变量或者外部函数的指令。引用局部变量或者本地函数的指令是不需要被修改的,因为局部变量和本地函数的地址一般都是使用PC相对偏移地址的。

需要注意的是,这个section 和下面的.rel.data在运行时并不需要,生成可执行的ELF object文件时会去掉这个section。

.rel.data :保存全局变量的重定位信息。一般来说,如果一个全局变量它的初 始化值是另一个全局变量的地址,或者是外部函数的地址,那么它就需要被重定位。

.debug  :保存debug信息。

.strtab  : 一

个字符串表,保存着.symtab和.debug ,和各个section的名字。.symtab,.debug 和section table里面,凡

是保存name的域,其实都是保存了一个偏移值,通过这个偏移值在这个字符串表里面可以找到相应得字符串。

下面仔细讨论一下.symtab:

每一个可重定位的object文件,都会有一个.symtab。这个符号表保存了在这个object文件中所有被定义的和被引用的符号。当源程序是C 语言程序时,.symtab 中的符号直接来源于C编译器(cc1)。这里所说的符号主要有三种:

1) 在这个object文件中被定义的可以被其他object文件全局符号。在C语言源程序中,主要就是那些非静态(没有static 修饰的)的全局变量和非静态的函数。在ARM汇编语言中,就是那些 被EXPORT 指令导出的变量。

2) 在这个object文件中引用到,但是在其他文件中定义的全局变量。在ARM汇编语言中就是通过IMPORT命令引入的变量

3) 本

地变量。本地变量只在本object文件内可见。这里的本地变量指的是连接器本地变量,应该和一般的程序本地变量作区别。这里所指的本地变量,包括用

static 修饰的全局变量,object文件中section名称,源代码文件名称。一般意义上的本地变量,是在运行时由系统的运行时环境管理

的,linker并不关心。

每个符合上面条件的符号在.symtab文件中都会有一个数据项。这个数据项的数据结构是:

Typedef struct{

int name;//符号名称,其实就是.strtab的偏移值

int value;//在section中的位置,以相对section地址的偏移表示

int size;//大小

char type;//类型,一般是数据或函数

char binding;//是本地变量还是全局变量

char reserved;//保留的位

char section;//符号所属的section。可选有:.text(用数字1代表),.data(用数

//3代表),ABS(不应被重定位的符号),UND(在本object文件

//中未定义的符号,可能在别的文件中定义),COM(一般的未初//始化的变量符号)。

}ELF_sym

ARM-ELF文件格式与GNU ARM Linker机制,布布扣,bubuko.com

时间: 2024-10-19 01:15:17

ARM-ELF文件格式与GNU ARM Linker机制的相关文章

GNU ARM汇编快速入门

以前用ARM的IDE工具,使用的是ARM标准的汇编语言.现在要使用GNU的工具,当然要了解一点GNU ARM汇编的不同之处.其实非常的简单,浏览一下文档然后再看看程序就完全可以搞定了,或者你硬着头皮看GNU ARM的汇编程序,用不了多少时间你就就可以无师自通了. ARM汇编语言源程序语句 ,一般由指令.伪操作.宏指令和伪指令作成.ARM汇编语言的设计基础是汇编伪指令,汇编伪操作和宏指令. 目前常用的ARM编译环境有2种: ARMASM: ARM公司的IDE中使用了CodeWarrior的编译器,

简单翻译和补充:1. GNU ARM Eclipse

原文链接: GNU ARM Eclipse GNU 介绍: GNU 计划,又称革奴计划,是由RichardStallman在1983年9月27日公开发起的.它的目标是创建一套完全自由的操作系统.RichardStallman最早是在net.unix-wizards新闻组上公布该消息,并附带一份<GNU宣言>等解释为何发起该计划的文章,其中一个理由就是要"重现当年软件界合作互助的团结精神".为保证GNU软件可以自由地"使用.复制.修改和发布",所有GNU软

嵌入式Linux ARM汇编(六)——GNU ARM汇编编程

嵌入式Linux ARM汇编(六)--GNU ARM汇编编程 不同的汇编器对汇编语言的语法要求不一样.目前常用的ARM汇编环境有以下两种: A.ARM ASM:ARM公司的汇编器,适合在Windows平台下使用 B.GNU ARM ASM:GNU交叉编译工具链中的汇编器,适合于Linux开发平台. GNU汇编器是GNU工具集的一部分,用于将汇编语言文件转化为二进制obj文件.GNU汇编器针对的是多种处理器架构,这意味着GNU汇编器的语法不同于ARM工具链的汇编器. 一.GUN ARM汇编指令格式

GNU ARM 汇编指令

http://blog.chinaunix.net/u2/87718/showart_1683402.html GNU ARM 汇编指令简介第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C代码执行.需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点(www.gnu.org)上下载有关规范. 一. Linux汇编行结构任何汇编行

GNU ARM汇编入门

第一部分 Linux下ARM汇编语法尽管在Linux下使用C或C++编写程序很方便,但汇编源程序用于系统最基本的初始化,如初始化堆栈指针.设置页表.操作 ARM的协处理器等.初始化完成后就可以跳转到C代码执行.需要注意的是,GNU的汇编器遵循AT&T的汇编语法,可以从GNU的站点 (www.gnu.org)上下载有关规范. 一. Linux汇编行结构 任何汇编行都是如下结构: [:] [} @ comment [:] [} @ 注释 Linux ARM 汇编中,任何以冒号结尾的标识符都被认为是一

GNU ARM汇编语法

http://wenku.baidu.com/view/812a698c84868762caaed55d.html?re=view ARM汇编源程序有两种风格: ARM官方推荐的风格,所有的指令都大写.常用在windows下的IDE中. GNU风格的汇编风格,所有的指令都小写.常用在与Linux相关的工具中. 注释符号: GNU arm汇编所采用的注释符号是@符号,同样c语言中的 // 和 /* */ 两种类型的注释方法在GNU arm汇编中也被支持. 宏定义: 在GNU arm汇编程序中可以使

Building the GNU ARM Toolchain for Bare Metal

kunen.org home OpenGL nve uC links Building the GNU ARM Toolchain for Bare Metal This is a quick guide to building the GCC toolchain for the ARM architecture.  I wrote this to cleanup some other instructions that I've seen floating around the web, an

GNU ARM Eclipse Plug-in

sourceforge的一个开源项目GNU ARM Eclipse Plug-in,适合Eclipse编译ARM,代替原来的命令行界面vim,累死Windows的集成开发环境,下面是主页链接很有用 http://sourceforge.net/projects/gnuarmeclipse/ GNU ARM Eclipse Plug-in,布布扣,bubuko.com

ARM ELF函数重定位

ARM ELF的函数重定位与x86是一致的,但由于汇编指令不同,再鼓捣一遍. 示例代码: #include <stdio.h> #include <stdlib.h> int main () { puts ("Hello world"); sleep (1); FILE *fp = fopen ("1.c", "r"); fclose (fp); exit (0); } 通过 readelf -r 可以查看ELF中所有需要