链接与ELF文件格式的复习
在这里复习一下链接的知识:
什么是链接(linking):把源代码形成的模块独立编译后组装成一个整体的的过程叫做链接。
链接主要过程包括:地址和空间分配(address and storage allocation),符号决议 - 决定使用同名符号中的哪一个(symbol resolution),重定位 -为开始不能决定地址的符号重定位到正确地址(relocation)
ELF基本文件结构:

.text段 - 存放程序代码(与程序数据分开,好处1、提高缓存命中;2、保证代码只读防止被以外修改;3、多个程序使用一段代码 - 动态链接库)
.data段 - 存放已初始化的全局数据(因为默认值为0,因此初始化为0的数据被认为是未初始化的)
.bss段 - 存放未初始化的全局数据和局部数据(在ELF文件中不占位置,只提供一个长度为符号表保存的符号占位,这样可以节省磁盘空间)
ELF Header结构:
typedef struct {
unsigned char e_ident[16]; ELF魔数,用于操作系统识别文件
ELF32_Half e_type; ELF文件类型,有可重定位文件,可执行文件,共享文件
ELF32_Half e_machine; ELF文件的CPU平台属性
ELF32_Word e_version; ELF版本号,一般为常数1
ELF32_Addr e_entry; 入口地址,规定ELF程序的入口虚拟地址,可重定位文件一般没有入口地址,该值为0
ELF32_Off e_phoff; --
ELF32_Off e_shoff; 段表在文件中的偏移 -- 用于程序装载(知道每个段的信息才能装
载程序)
ELF32_Word e_flags; ELF标志位,用于标识一些ELF文件平台相关属性
ELF32_Half e_ehsize; 文件头大小
ELF32_Half e_phentsize; --
ELF32_Half e_phnum; --
ELF32_Half e_shentsize; 段表描述符的大小,一般等于sizeof(ELF32_Shdr) -- 用于程序装载
ELF32_Half e_shnum; 段表描述符的数量 -- 用于程序装载
ELF32_Half e_shstrndx; 段表字符串标所在的段在段表中的下标 -- 用于符号识别决议和重定位
} Elf32_Ehdr;
Elf32_Shdr段描述符结构
typedef struct
{
ELF32_Word sh_name; 段名,保存为string table段中偏移
ELF32_Word sh_type; 段类型,
ELF32_Word sh_flags; 段标志位,表示段 SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR
ELF32_Addr sh_addr; 段虚拟地址,如果段可以被加载,这位加载后在进程空间中的虚拟地址
ELF32_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;
ELF符号表结构:
typedef struct {
Elf32_Word st_name; 符号名,表示在string table中的偏移
Elf32_Addr st_value; 符号相对应的值,这个值跟符号有关,可能是一个绝对值,也可能是一个地址,不同
的符号所对应的值的含义不同
Elf32_Word st_size; 符号大小,对于保存数据的符号,该值为数据类型大小
unsigned char st_info; 符号类型和绑定信息
unsigned char st_other; 目前为0,不使用
Elf32_Half st_shndx; 符号所在段
} Elf32_Sym;
这里的st_info包含符号类型和绑定信息
ELF中符号类型包括:
| 符号类型 | ||
| 宏定义名 | 值 | 注释 |
| STB_LOCAL | 0 | 局部符号,对于外部模块不可见 |
| STB_GLOBAL | 1 | 全局符号,对于外部模块可见 |
| STB_WEAK | 2 | 弱引用符号,可被全局符号定义覆盖 |
ELF绑定信息包括:
| 绑定信息 | ||
| 宏定义名 | 值 | 注释 |
| STT_NOTYPE | 0 | 未知符号 |
| STT_OBJECT | 1 | 对象(变量,数组) |
| STT_FUNC | 2 | 函数 |
| STT_SECTION | 3 | 段 |
| STT_FILE | 4 | 目标文件名 |
链接与ELF文件格式的复习的更多相关文章
- Linux课程实践四:ELF文件格式分析
一.ELF文件格式概述 1. ELF文件 ELF:Executable and Linking Format,是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东 ...
- 实践2.4 ELF文件格式分析
实践2.4 ELF文件格式分析 1.ELF文件头 查看/usr/include/elf.h文件: #define EI_NIDENT (16) typedef struct { unsigned ch ...
- ELF文件格式
ELF--Linux下可执行文件格式 1.类型 常见的ELF格式文件包括: ...
- C语言的本质(30)——C语言与汇编之ELF文件格式
ELF(Executable and Linking Format)文件格式是一个开放标准,各种UNIX系统的可执行文件都采用ELF格式,ELF是一种对象文件的格式,用于定义不同类型的对象文件(Obj ...
- C语言的ELF文件格式学习
最近的lab里面有ELF文件相关的,所以成这个几乎,学点ELF的东西. ELF,是一种文件格式.暂时,只看可执行文件的ELF文件格式. 首先,给出文件的格式的布局图: 光看这个很难理解,所以写一个小的 ...
- elf 文件格式探秘——程序运行背后的故事
摘要:本文主要讲解elf文件格式,通过readelf命令结合底层的相关数据结构,讲解相关内容,分析程序运行的基本原理. 本文来源:elf 文件格式探秘——程序运行背后的故事 http://blog.c ...
- ELF文件格式分析--结构篇
ELF文件格式,全称为Excutable and Linking Format,是一个开放的可执行文件和链接文件格式,在LINUX上很流行,跨平台软件的设计也多以ELF格式作为标准,其结构扩展性兼容性 ...
- Linux课题实践四——ELF文件格式分析
2.4 ELF文件格式分析 20135318 刘浩晨 ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文件用于存储Linux程序.ELF文件(目 ...
- linux第三次实践:ELF文件格式分析
linux第三次实践:ELF文件格式分析 标签(空格分隔): 20135328陈都 一.概述 1.ELF全称Executable and Linkable Format,可执行连接格式,ELF格式的文 ...
随机推荐
- leetcode二分查找问题整理
自从做完leetcode上的三道关于二分查找的题后,我觉得它是比链表找环还恶心的题,首先能写出bugfree代码的人就不多,而且可以有各种变形,适合面试的时候不断挑战面试者,一个程序猿写代码解决问题的 ...
- [STAThread]的含义
Posted on 2007-07-07 10:06 桦林 阅读(33100) 评论(10) 编辑 收藏 [STAThread]STAThread:Single Thread Apar ...
- Debian中编译内核
转载: http://blog.163.com/libo_5/blog/static/156968520101016102051580/ http://hi.baidu.com/wg_wang/ite ...
- 一个对称加密、解密的方法C#工具类
封装了一个对称加解密的类,用私钥和密钥加解密 using System; using System.Collections.Generic; using System.Text; using Syst ...
- Asp.NET 之 路径浅析
比如你的工程是Web(url是:http://localhost/web/default.aspx) Request.ApplicationPath 就是/Web 如果是站点就直接返回"/& ...
- js技巧总结
很早以前看到的代码,同时加上一些我在项目中用到的代码,感觉很实用,在这里记录下来,怕忘记了,有些代码忘记在哪看到的了,所以就不贴网址了,感谢各位大神的分享!如果有其他的好的方法,欢迎留言~ 1.取整的 ...
- 【阿里云产品公测】ACE安装Discuz超详细图文教程
作者:阿里云用户51干警网 hello.今天我们来在阿里云ACE上安装discuz. 因为本人不喜欢X3.2的版本,这次我使用的是DZX2.5. 首先的是准备工作: 一.申请阿里云ACE内测 http ...
- vb6.0如何让窗体跟随鼠标运动
首先将form的boderstyle属性设为0 Dim movesScreen As Boolean Dim mousX As Integer Dim mousY As Integer Dim cur ...
- The requested URL Not Found问题
遇到这么一个问题: 最近刚转到linux下工作 在本地运行localhost下的thinkphp程序时,出现 一开始以为是权限问题,把目录以及文件权限都改为777依然不起作用 后来发现是rewrite ...
- Java跳出循环-break和continue语句
在实际编程中,有时需要在条件语句匹配的时候跳出循环.在Java里,由break和continue语句控制. “break”语句 “break”语句用来结束循环,即不再执行后边的所有循环. 示例:计算1 ...