链接与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格式的文 ...
随机推荐
- 关于删除7z历史解压路径
目前7zip尚无此功能,只能从注册表入手了,7zip历史记录保存在注册表 HKEY_CURRENT_USER\Software\7-Zip\FM 下的CopyHistory和FolderHistory ...
- jquery学习笔记2
1.点击时文字消失,失去焦点时文字再出现 <input type="text" value="郭强" onfocus="if(value=='郭 ...
- Solr 删除数据的几种方式
原文出处:http://blog.chenlb.com/2010/03/solr-delete-data.html 有时候需要删除 Solr 中的数据(特别是不重做索引的系统中,在重做索引期间).删除 ...
- 3. Android框架和工具之 xUtils(HttpUtils)
1. HttpUtils 作用: 支持同步,异步方式的请求: 支持大文件上传,上传大文件不会oom: 支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD请求: 下载支持301/3 ...
- 【阿里云产品公测】OTS使用之简单线上产品实践基于PythonSDK
阿里云用户:morenocjm 实践是检验真理的唯一标准,学习技术需要通过实践过程中的不断尝试,才能够快速掌握要领.OTS是构建在阿里云飞天分布式系统之上的NoSQL数据库服务,提供海量结构化数据的存 ...
- java程序执行内存处理过程
我们学习知识,不仅要知其然,还要知其所以然,你的工资必定和你学习的深度成正比. 在以往.net的学习过程中,我们了解了怎么去开发一个程序,并有了一定的开发经验,但是一个程序具体是怎么在内存中运行的呢? ...
- JAVA中的deflate压缩实现
在文件的传输过程中,为了使大文件能够更加方便快速的传输,一般采用压缩的办法来对文件压缩后再传输,JAVA中的java.util.zip包中的Deflater和Inflater类为使用者提供了DEFLA ...
- ReactNative学习-滑动查看图片第三方组件react-native-swiper
滑动查看图片第三方组件:react-native-swiper,现在的版本为:1.4.3,该版本还不支持Android. 下面介绍的是该组件的一些用法,可能总结的不完整,希望大家一起来共同完善. 官方 ...
- hdu-5714 拍照(二分)
题目链接: 拍照 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Proble ...
- git之添加ssh
1.ssh-keygen 2.cat ~/.ssh/id_rsa.pub 3.git config user.email "huangsy13@gmail.com" 4.git c ...