收藏 分享(赏)

c6000-elf文件格式.ppt

上传人:天天快乐 文档编号:763406 上传时间:2018-04-21 格式:PPT 页数:51 大小:2.21MB
下载 相关 举报
c6000-elf文件格式.ppt_第1页
第1页 / 共51页
c6000-elf文件格式.ppt_第2页
第2页 / 共51页
c6000-elf文件格式.ppt_第3页
第3页 / 共51页
c6000-elf文件格式.ppt_第4页
第4页 / 共51页
c6000-elf文件格式.ppt_第5页
第5页 / 共51页
点击查看更多>>
资源描述

1、TMS320C6000的生成文件格式ELF格式介绍,主要内容,1. 概述,不管何种可执行文件格式,一些基本的要素是必须的,显而易见地,文件中应包含代码和数据。因为文件可能引用外部文件定义的符号(变量和函数),因此重定位信息和符号信息也是需要的。一些辅助信息是可选的,如调试信息、硬件信息等。基本上任意一种可执行文件格式都是按区间保存上述信息,称为段(Segment)或节(Section)。不同的文件格式中段和节的含义可能有细微区别,但根据上下文关系可以很清楚的理解,这不是关键问题。最后,可执行文件通常都有一个文件头部以描述本文件的总体结构。,1. 概述,相对可执行文件有三个重要的概念:编译(co

2、mpile)、连接(link,也可称为链接、联接)、加载(load)。源程序文件被编译成目标文件,多个目标文件被连接成一个最终的可执行文件,可执行文件被加载到内存中运行。因为本文重点是讨论可执行文件格式,因此加载过程也相对重点讨论。下面是LINUX平台下ELF文件加载过程的一个简单描述(CCSv5中.out文件的加载过程与LINUX平台下可执行文件的加载过程相似)。,1. 概述,1)内核首先读ELF文件的头部,然后根据头部的数据指示分别读入各种数据结构,找到标记为可加载(loadable)的段,把段内容加载到内存中。段的标记指示该段在内存中是否可读、可写,可执行。显然,文本段(.text)是只

3、读可执行(-r -x),而数据段是可读可写(-r -w)。这种方式是利用了现代操作系统和处理器对内存的保护功能。2)内核分析出ELF文件标记为 PT_INTERP 的段中所对应的动态连接器名称,并加载动态连接器。3)内核在新进程的堆栈中设置一些标记-值对,以指示动态连接器的相关操作。4)内核把控制传递给动态连接器。5)动态连接器检查程序对外部文件(共享库)的依赖性,并在需要时对其进行加载。,1. 概述,6)态连接器对程序的外部引用进行重定位,通俗的讲,就是告诉程序其引用的外部变量/函数的地址,此地址位于共享库被加载在内存的区间内。动态连接还有一个延迟(Lazy)定位的特性,即只在真正需要引用符

4、号时才重定位,这对提高程序运行效率有极大帮助。7)动态连接器执行在ELF文件中标记为 .init 的节的代码,进行程序运行的初始化。8)动态连接器把控制传递给程序,从 ELF 文件头部中定义的程序进入点开始执行。在 ELF格式中,程序进入点的值是显式存在的,在 COFF 格式中则是由规范隐含定义。,1. 概述,从上面的描述可以看出,加载文件最重要的是完成两件事情:加载程序段和数据段到内存;进行外部定义符号的重定位。重定位是程序连接中一个重要概念。我们知道,一个可执行程序通常是由一个含有 main() 的主程序文件、若干目标文件、若干共享库(Shared Libraries)组成。一个 C 程序

5、可能引用共享库定义的变量或函数,因此程序运行时必须知道这些变量/函数的地址。在静态连接中,程序所有需要使用的外部定义都完全包含在可执行程序中,而动态连接则只在可执行文件中设置相关外部定义的一些引用信息,真正的重定位是在程序运行之时。静态连接方式有两个大问题:如果库中变量或函数有任何变化都必须重新编译连接程序;如果多个程序引用同样的变量/函数,则此变量/函数会在文件/内存中出现多次,浪费硬盘/内存空间。比较两种连接方式生成的可执行文件的大小,可以看出有明显的区别。,1. 概述,UNIX/LINUX 平台下三种主要的可执行文件格式:a.out(assembler and link editor o

6、utput 汇编器和链接编辑器的输出)、COFF(Common Object File Format 通用对象文件格式)、ELF(Executable and Linking Format 可执行和链接格式)。CCSV5平台与上述LINUX平台下可执行文件格式的概念略有区别:在CCSv5编译连接生成的可执行文件为.out后缀,该文件的格式可在编译连接之前设定,设置生成.out文件为COFF格式或者ELF格式。设定路径为Properties-General-Advanced setting-Output format,1. 概述,本文档仅详细说明ELF及COFF的格式标准,注意本文档附带Demo

7、例程,在CCSv5编程环境中编译汇编链接生成,并在TMS320C6678硬件平台进行了测试。Demo.out为该例程生成的加载可执行目标文件,该文件以ELF格式存储,是下文展示ELF格式内容时用到的样本文件。Demo.map为该例程编译过程中生成的数据存储映射文件,该文件详细列出了程序运行时的入口地址、所有字符地址、所有段数据存储地址及长度等信息。以上两个文件可在例程的Debug文件夹下找到。,1. 概述,2. ELF文件格式,2. ELF文件格式,ELF的总体布局如下,该格式文件大体分为四部分:ELF头,段数据(每段包含若干节(Section)),程序头表,节头表。其中节头表示可选的,将其全

8、部置为0,程序也可以正常运行。以下分别介绍各部分内容及格式。,2. ELF文件格式,typedef struct unsigned char e_identEI_NIDENT; /* 魔数和相关信息 */ Elf32_Half e_type; /* 目标文件类型 */ Elf32_Half e_machine; /* 硬件体系 */ Elf32_Word e_version; /* 目标文件版本 */ Elf32_Addr e_entry; /* 程序进入点 */ Elf32_Off e_phoff; /* 程序头部偏移量 */ Elf32_Off e_shoff; /* 节头部偏移量 */

9、Elf32_Word e_flags; /* 处理器特定标志 */ Elf32_Half e_ehsize; /* ELF头部长度 */ Elf32_Half e_phentsize; /* 程序头部中一个条目的长度 */ Elf32_Half e_phnum; /* 程序头部条目个数 */ Elf32_Half e_shentsize; /* 节头部中一个条目的长度 */ Elf32_Half e_shnum; /* 节头部条目个数 */ Elf32_Half e_shstrndx; /* 节头部字符表索引 */ Elf32_Ehdr;,ELF头: ELF头部是一个关于本文件的路线图(roa

10、d map),从总体上描述文件的结构,给出其他部分在文件中的相对位置及长度和数量信息。下面是ELF头部的数据结构:,数据结构中变量类型占用位宽分别为Elf32_Half: 16bitsElf32_Word: 32bitsElf32_Addr: 32bitsElf32_Off: 32bitsUnsigned char:8bits又:EI_NIDENT=16,2. ELF文件格式,e_identEI_NIDENT:魔数和相关信息(16Bytes),e_ident0-e_ident3包含了ELF文件的魔数,依次是0x7f(空格),E,L,F。注意,任何一个ELF文件必须包含此魔数;e_ident4表

11、示硬件系统的位数,1代表32位,2代表64位;e_ident5表示数据编码方式,1代表小端模式(最大值的字节占有最低的地址),2代表大端(最大值的字节占有最高的地址);e_ident6指定ELF头部的版本,当前必须为1;e_ident7到e_ident15是填充符,通常是0。,上表为在作者所用计算机上,使用CCSv5生成的.out文件数据起始段(ELF文件头),对照e_ident个字段的意义可知:本文件为ELF格式文件;硬件系统为32位;采用小端模式编码;ELF头部版本为1。,2. ELF文件格式,e_type:目标文件类型(2Bytes),ELF 文件的类型,1 表示此文件是重定位文件,2

12、表示可执行文件,3表示此文件是一个动态连接库。,在CCSv5中有三类文件可以采用ELF格式:重定位文件,例如各链接器输入文件(.obj);可执行文件,例如上图所示的加载可执行文件(.out);动态链接库文件。,2. ELF文件格式,e_machine :硬件体系(2Bytes),硬件体现(CPU类型),它指出了此文件使用何种指令集。如果是Intel 0x386 CPU此值为3,如果是AMD 64 CPU此值为62也就是16进制的0x3E。作者计算机CPU类型为0x8c。,2. ELF文件格式,e_version :目标文件版本(4Bytes),ELF文件版本,固定为1 。,2. ELF文件格式

13、,e_entry:程序进入点 (4Bytes),可执行文件的入口虚拟地址。此字段指出了该文件中第一条可执行机器指令在进程被正确加载后的内存地址。(注: 入口地址并不是可执行文件的第一个函数 - main函数的地址)。下图为与上图.out文件数据同时产生的内存映射文件.map,可以看出程序入口相同,只是在.out文件中入口地址是小端编码的。,2. ELF文件格式,e_phoff :程序头部偏移量(4Bytes),程序头在ELF格式的.out文件中的偏移量,指出了程序头数据起始的位置。在LINUX ELF格式数据中程序头数据在段数据之前,而CCSv5生成的.out中程序头数据在端数据之后,其具体位

14、置决定于e_phoff字段。由该字段值,在0x0004508d偏移地址下即可找到程序头。,2. ELF文件格式,e_shoff :节头部偏移量(4Bytes),节头部数据在ELF格式的.out文件中的偏移量,指出了节头数据起始的位置。如果节头不存在此值为0。由该字段值,在0x0004518d偏移地址下即可找到程序头。,2. ELF文件格式,e_flags :处理器特定标志(4Bytes),固定为0x00。,2. ELF文件格式,e_ehsize : ELF头部长度(2Bytes),本字段指示了本文件ELF头部的长度0x0034=52Bytes。,2. ELF文件格式,e_phentsize :

15、程序头部中一个条目的长度(2Bytes),程序头中的每一个结构占用的字节数。程序头也叫程序头表,可以被看做一个在文件中连续存储的结构数组,数组中每一项是一个结构,该结构体指出对应段的相关信息,此字段给出了这个结构占用的字节大小。e_phoff指出程序头在ELF文件中的起始偏移。本文件中程序头一个结构体条目的长度为0x0020=32。,2. ELF文件格式,e_phnum :程序头部条目个数(2Bytes),此字段给出了程序头中保存了多少个结构。如果程序头中有3个结构则程序头(程序头表)在文件中占用了(3e_phentsize)个字节的大小。本文件含有0x0008=8个段数据,因而相应的有8个程

16、序头结构体条目。,2. ELF文件格式,e_shentsize :节头部中一个条目的长度(2Bytes),节头中每个结构占用的字节大小。节头与程序头类似也是一个结构数组,ELF格式文件中的段数据也可以节来划分(节将在下文介绍),节头部描述了以节数据的相关信息。关于这两个结构的定义将分别在讲述程序头和节头的时候给出。本文件中节头部结构体长度为0x0028=56。,2. ELF文件格式,e_shnum :节头部条目个数(2Bytes),节头部数据中保存结构体数目。本文件中节头部中节结构体数目为0x0021=33。,2. ELF文件格式,e_shstrndx :节头部字符表节索引(2Bytes),这

17、是一个整数索引值。节头表可以看作是一个结构体数组,此索引值为数组中某个结构体的下标,节头表中的该结构体指定了一个名为“字符串表”的节(Section)的信息,而这个名为字符串表的节保存着节头表中描述的每一个节的名称。字符表索引规则参见下文节头表中sh_name字段介绍内容。,2. ELF文件格式,typedef struct Elf32_Word p_type; /* 段类型 */ Elf32_Off p_offset; /* 段位置相对于文件开始处的偏移量 */ Elf32_Addr p_vaddr; /* 段在内存中的地址 */ Elf32_Addr p_paddr; /* 段的物理地址

18、*/ Elf32_Word p_filesz; /* 段在文件中的长度 */ Elf32_Word p_memsz; /* 段在内存中的长度 */ Elf32_Word p_flags; /* 段的标记 */ Elf32_Word p_align; /* 段在内存中对齐标记 */ Elf32_Phdr;,程序头表:它是一个结构数组,包含了ELF头表中字段e_phnum定义个数的条目,结构体长度由e_phentsize给出,结构体描述一个段或其他系统准备执行该程序所需要的信息。,数据结构中变量类型占用位宽分别为Elf32_Half: 16bitsElf32_Word: 32bitsElf32_A

19、ddr: 32bitsElf32_Off: 32bitsUnsigned char:8bits,2. ELF文件格式,p_type :段类型 (4Bytes),段的类型,它能告诉我们这个段里存放着什么用途的数据。例如1(PT_LOAD)表示是可加载的段,这样的段将被读入程序的进程空间成为内存映像的一部分。该字段值对应类型如右图所示。,PT_NULL 0 PT_LOAD 1 PT_DYNAMIC2 PT_INTERP 3 PT_NOTE 4 PT_SHLIB 5 PT_PHDR 6 PT_LOPROC 0x70000000 PT_HIPROC 0x7fffffff,2. ELF文件格式,p_of

20、fset :段位置相对于文件开始处的偏移量(4Bytes),该段在文件中的偏移。这个偏移是相对于整个文件的。该文件中偏移地址为0x00000040=64。,2. ELF文件格式,p_vaddr :段在内存中的地址 (4Bytes),该段加载后在进程空间中占用的内存起始地址。本文件中该地址为0x00800000。本段是该文件中的第一个段,为.text段。如右图所示。,2. ELF文件格式,p_paddr :段的物理地址(4Bytes),该段的物理地地址,在C6000中,该地址与上一地址重合。,2. ELF文件格式,p_filesz :段在文件中的长度(4Bytes),该段在文件中占用的字节大小。

21、有些段可能在文件中不存在但却占用一定的内存空间,此时这个字段为0。,2. ELF文件格式,p_memsz :段在内存中的长度(4Bytes),该段在内存中占用的字节大小。有些段可能仅存在于文件中而不被加载到内存,此时这个字段为0。,2. ELF文件格式,p_flags :段的标记(4Bytes),段的属性。用每一个二进制位表示一种属性有无,相应位为1表示含有相应的属性,为0表示不含那种属性。其中第0位为可执行位(-x),第1位为可写位(-w),第2位为可读位(-r)。如果这个字段的最低三位同时为1那就表示这个段中的数据加载以后既可读也可写而且可执行的。本文件中.text段为可读和可执行段,所以

22、该字段为5=101b,2. ELF文件格式,p_align :段在内存中对齐标记(4Bytes),对齐。现代操作系统都使用虚拟内存为进程序提供更大的空间,分页技术功不可没,页就成了最小的内存分配单位,不足一页的按一页算。所以加载程序数据一般也从一页的起始地址开始,这就属于对齐。该成员给出了该段在内存和文件中排列值。 0 和 1 表示不需要排列。否则, p_align 必须为正的 2 的幂,并且 p_vaddr 应当等于 p_offset 模 p_align。,2. ELF文件格式,节头表: ELF头的e_shoff字段给出了节头在整个文件中的偏移(如果节头存在的话),节头可看做一个在文件中连续

23、存储的结构数组(Elf32_Shdr结构的数组),数组的长度由ELF头的e_shnum字段给出,数组中每个结构的字节大小由ELF头的e_shentsize字段给出。把文件指针移到在ELF头中e_shoff给出的位臵,然后读出的内容就是节头了。节头表是从连接角度看待ELF文件的结果,所以从节头的角度,ELF文件分成了许多的节,每个节保存着用于不同目的的数据,这些数据可能被前面提到的程序头重复引用。关于节的内容非常琐碎,完成一次任务所的需的信息往往被分散到不同的节里。 节的数据内容分散存储于各个段数据内。,2. ELF文件格式,由于节中数据的用途不同,节被分为不同的类型,每种类型的节都有自己组织数

24、据的方式。有的节存储着一些字符串,例如前面提过的字符串表就是一种类型的节;有的节保存一张符号表,程序从动态连接库中引入的函数和变量都会出现在一个叫做动态符号表的节中;重定位表则包含在重定位节中。 不管这些节是何种类型,在节头中都用相同的结构保存着与这些节有关的信息。本文档将以字符串表节为例介绍节头表结构。,2. ELF文件格式,typedef struct Elf32_Word sh_name; /*节名称索引*/Elf32_Word sh_type;/*节类型*/Elf32_Word sh_flags; /*节标记*/Elf32_Addr sh_addr; /*节在内存中起始地址*/Elf3

25、2_Off sh_offset; /*节在整个文件中的起始偏移量*/Elf32_Word sh_size; /*节在文件中的字节大小*/Elf32_Word sh_link; /*相关的节在节头中的索引*/Elf32_Word sh_info; /*附加信息*/Elf32_Word sh_addralign; /*地址对齐*/Elf32_Word sh_entsize; /*字节大小的数*/ Elf32_Shdr;,数据结构中变量类型占用位宽分别为Elf32_Half: 16bitsElf32_Word: 32bitsElf32_Addr: 32bitsElf32_Off: 32bitsUns

26、igned char:8bits,2. ELF文件格式,sh_name :节名称索引(4Bytes),每一个节都有一个字符串名。这些字符串名被连续存储在一个节(Section)中(包含在段数据中,称为字符串表节,见下页),并有相应的节头表结构体描述这个节。该结构体的索引值由ELF头部的字符表索引字段给出(参见本文档第26页)。该节名称索引值为0x00000139。本ELF格式.out文件的ELF部如下图所示,该字符串节索引字段为0x20=32,即描述字符串表节的节头表结构体索引值为32(33个节头表中的最后一个)。可以计算出该节头表存放地址偏移: 0x0004518d(e_shoff)+32(

27、e_shstrndx ) 40 (e_shentsize )=0x0004568d。本文档将以此字符串表节为例讲解节头表。,2. ELF文件格式,字符串表节(String Table Section):保存着以NULL终止的一系列字符。目标文件使用这些字符串来描绘符号和section名。一个字符串的参考是一个string table section的索引。第一个字节,即索引0,被定义保存着一个NULL字符。同样的,一个string table的最后一个字节保存着一个NULL字符,所有的字符串都是以NULL终止。索引0的字符串是没有名字或者说是NULL,它的解释依靠上下文。一个空的string

28、table section是允许的;它的section header的成员sh_size(下文介绍)将为0。对空的string table来说,非0的索引是没有用的。设字符串表节内容如下(Byte),对应节名称及索引如下0 none.text.switchnone,2. ELF文件格式,sh_type :节类型(4Bytes),指示这个节里存放的是什么样的数据。随着ELF的发展,用于不同目的的节会不断增多。例如字符串表是SHT_STRTAB,符号表是SHT_SYMTAB等。,SHT_NULL0 SHT_PROGBITS1 SHT_SYMTAB 2 SHT_STRTAB 3 SHT_RELA4

29、SHT_HASH5 SHT_DYNAMIC6 SHT_NOTE 7 SHT_NOBITS 8 SHT_REL 9,SHT_SHLIB10 SHT_DYNSYM11 SHT_LOPROC 0x70000000 SHT_HIPROC 0x7fffffff SHT_LOUSER 0x80000000 SHT_HIUSER 0xffffffffSHT_NULL以上各字段对应类型的意义参看参考文献4,2. ELF文件格式,sh_flags :节标志(4Bytes),与程序头中的p_flags字段一样,它用最低三个二进制位分别表示一种属性的有无。其中最低位如果为1表示此节在进程执行过程中可写(-w),次低

30、位为1表示此节的内容加载时要读到内存中去(-r),第三低位为1表示这个节中的数据是可执行的机器指令(-x)。字符串表节数据为只读数据,即仅次低位为1。,2. ELF文件格式,sh_addr :节在内存中起始地址(4Bytes),如果此节的内容将出现在进程空间里,这个字段给出了该节在内存中起始地址;否则为0x00。字符串表节不会出现在进程空间中,所以此字段为0。,2. ELF文件格式,sh_offset :节在整个文件中的起始偏移量(4Bytes),如果此节在文件中占用一定的字节,这个字段给出了该节在整个文件中的起始偏移量。本文件中字符串表节的起始地址为0x00044f4a,具体值如右图所示。,

31、2. ELF文件格式,sh_size :节在文件中的字节大小(4Bytes),如果此节在文件中占用一定的字节,这个字段给出了该节在文件中的字节大小,如果此节在文件中不存在但却存在于内存中那么此字段给出了此节在内存中的字节大小。本节占用0x0143字节,与右图所示相符。,2. ELF文件格式,sh_link :相关的节在节头表中的索引(4Bytes),如果另一个节与这个节相关联,这个字段给出了相关的节在节头表中的索引。,2. ELF文件格式,sh_info :附加信息(4Bytes),该成员保存着额外的信息,它的解释依靠该section的类型。具体意义不太了解。,2. ELF文件格式,sh_ad

32、dralign :地址对齐(4Bytes),地址对齐。这个数是2的整数次幂,对齐只能是2字节对齐、4字节对齐、8字节对齐等。如果这个数是0或1表示这个节不用对齐。,2. ELF文件格式,sh_entsize :字节大小(4Bytes),这个字段是一个代表字节大小的数,对某些节才有意义。例如对动态符号节来说这个字段就给出动态符号表中每个符号结构的字节大小。在本节的具体意义尚未了解清楚,2. ELF文件格式,段数据:ELF格式文件最主要的部分即为若干段(Segenment)数据,该数据包含了程序运行时所需要的全部信息;各段的起始位置及长度等信息由相应程序头表给出;同时节头表描述的节数据存在于段数据中。段数据的具体信息及生成过程较为复杂,具体参看参考文献3的相关内容。在此不对段数据内容做展开说明。本文件包含8个段数据,隔断名称、起始位置及长度如右图所示。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报