目标文件ELF中的内容
2015-09-18 21:36
218 查看
1.目标文件格式简述
源文件经过编译器后生成目标文件,目标文件按照可执行文件的格式来存储,最初的可执行文件的格式为COFF,经过演变,现在的 windows下的可执行文件的格式为PE-COFF格式,而linux下的可执行文件的格式为ELF 格式。两种格式很类似。2.目标文件内容简述
目标文件是以段的形式存储的。目标文件中包含了很多段,其中,程序源代码编译后的机器指令被放置在代码段(.text)中。初始化的全局变量和局部静态对象则放置在.data段中,未初始化的全局变量和局部静态变量则存放在.bss 段中。其中.BSS段比较特殊,我在先前的博客中讨论过了:点击打开链接目标文件中最重要的两个部分:文件头与段表。文件头包含了描述整个文件的基本属性,如文件版本,目标机器型号等信息;而段表则描述了目标文件所包含的所有段的信息,比如每个段的段名,段的长度,段在文件中的偏移等。下面将分别说明目标文件中的几个重要组成部分
3.文件头
文件头中给出了整个文件的一些基本属性,其中能协助解析整个目标文件的两个信息分别是:段表偏移,段表字符串表在段表中的下标。3.1 段表在文件中的偏移:
段表也是ELF文件中的一个段,该段记录了该文件所有段的结构信息。它是由一个结构体数组组成的,其中每个数组元素对应ELF文件中的一个段,我们称这个描述段的结构体为段描述符。段描述符给出了段的偏移位置,段的属性,段的大小等重要信息,有助于解析整个文件。3.2 段表字符串表
段表字符串是一个字符串序列,只须给定字符串在该表中的偏移位置,就可以读取出该字符串,其中读取出的每个字符串对应一个段名。如“.text”,".data"等。4.段表
刚刚上面说了段表是一个结构体数组,其中结构体的内容如下:typedef struct { Elf32_Word sh_name; //给出该结构体对应段表在段表字符串表中的偏移。可以通过该偏移获得该段的段名 Elf32_Word sh_type; //指定该段是 无效段、程序段、无内容段、重定位段、符号表段 等类型 Elf32_Word sh_flags; //指出该段的属性,是 可写段、可执行段、需要分配空间的段 Elf32_Word sh_addr; //指出该段的虚拟地址 Elf32_Word sh_offset; //指出该段在目标文件中的偏移 Elf32_Word sh_size; //指出该段的大小 Elf32_Word sh_link; //该标志对重定位表有用,指明该段所使用的符号表在段表中的下标 Elf32_Word sh_info; //该标志对重定位表有用,指明该重定位段的作用段在段表中的下标,如:.text段在段表中的下标为1,则.ret.text段中该标志的值为1 Elf32_Word sh_addrlign; //该符号表虚拟地址的对齐要求 Elf32_Word sh_entsize; //若该段有固定项大小,则指定该大小 }
5.符号表
将函数与变量统称为符号,符号表是链接的接口,其记录了目标文件中所用到的所有符号。每个定义的符号有一个对应的值,叫做符号值,对于变量与函数而言,符号值就是它们的地址。符号可以分为以下几种:1.全局符号(全局变量与函数),可以被其他文件引用
2.外部符号(在目标文件中引用却未定义的全局符号)
3.段名
4.局部符号
5.行号信息
符号表与段表类似,是一个结构体组成的数组,每个数组元素对应一个符号的信息,其中包含信息有:该符号名在符号表中的偏移(符号表与段符号表功能类似,记录了目标文件中的符号字符串);符号对应的值,即符号值;该符号对应的大小,如果是double型的符号,则该大小为8字节;符号类型(说明该符号是变量名还是函数名还是文件名等)与绑定信息(说明该符号是局部符号还是全局符号还是弱引用);符号所在的段(指明其所在段在段表中的下标)
相关文章推荐
- iOS 核心动画-关键帧动画
- java环境配置
- java环境配置
- dumpsys input
- 常用软件测试技术
- 40 Combination Sum II
- MINE TYPE
- Java
- Network (hdu 3078 在线LCA)
- hdu2159 FATE(二维背包)
- 技术人生:故事之五 ODBC和C/S为何物
- iOS 核心动画 -基础动画
- HDU 4022 Bombing STL 模拟题
- 安装VS2013后与数据库的连接问题
- 送给半路出家的Pythoner
- 继续Set,Map起来
- Android设置透明、半透明等效果
- struts学习小结
- UVAoJ --401
- 自定义View之球体波浪形充满