链接与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格式的文 ...
随机推荐
- java中十进制转二进制转换函数
十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...
- C++ Qt 访问权限总结
总结:C++的访问修饰符的作用是以类为单位,而不是以对象为单位. 通俗的讲,同类的对象间可以“互相访问”对方的数据成员,只不过访问途径不是直接访问. 步骤是:通过一个对象调用其public成员函数,此 ...
- Game: Map Design Considerations 游戏地图设计指南
依据前文伏击战场景手稿, 用Tile Studio "草草"制作出该场景的地图: 生成的C源码: #ifndef _open_war_1Gfx_c #define _open_wa ...
- 分布式缓存技术redis学习(四)——redis高级应用(集群搭建、集群分区原理、集群操作)
本文是redis学习系列的第四篇,前面我们学习了redis的数据结构和一些高级特性,点击下面链接可回看 <详细讲解redis数据结构(内存模型)以及常用命令> <redis高级应用( ...
- 用 Gearman 分发 PHP 应用程序的工作负载
尽管一个 Web 应用程序的大部分内容都与表示有关,但它的价值与竞争优势却可能体现在若干专有服务或算法方面.如果这类处理过于复杂或拖沓,最好是进行异步执行,以免 Web 服务器对传入的请求没有响应.实 ...
- .NET开发必备工具之-Reflector
第一步,下载 第二步,解压缩下载的包,双击Reflector应用程序打开 第三步,设置默认程序集,可以不设定 第四步,找到你要反编译dll文件 第五步,把dll文件拷贝到方便的位置(我在桌面上新建了T ...
- C# 程序集反射
namespace AssemblyLibrary { public class AssemblyLibrary { public static object LoadAssembly(string ...
- C++ atol
函数名: atol 功 能: 把字符串转换成长整型数 用 法: long atol(const char *nptr); 简介编辑 相关函数: atof,atoi,strtod,strtol,st ...
- BootStrap2学习日记16---选项卡内容
代码: <ul class="nav nav-tabs"> <li class="active"><a href="#t ...
- 实用技术——Eclipse 常用快捷键
Eclipse的编辑功能非常强大,掌握了Eclipse快捷键功能,能够大大提高开发效率. 和编辑相关的快捷键 Eclipse中有如下一些和编辑相关的快捷键. 1. [ALT+/] 此快捷键为用户编 ...