链接与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格式的文 ...
随机推荐
- 《UCD火花集1-2》读后感
一个多月的时间都没有更新博客了,只因为9月份有了其他的任务,耽搁了一 ...
- aspjpeg组件在2008R2下“ActiveX 部件不能创建对象”
64位要用 C:\Windows\SysWow64下的 regist32注册另外 IIS下要设置应用是32位的
- JAVA+FlexPaper+OpenOffice+SWFTools文档预览
http://blog.csdn.net/core_star/article/details/10148047 1.软件环境: openoffice:启动openoffice服务:soffice.ex ...
- mysql主从复制详解
http://blog.csdn.net/hguisu/article/details/7325124
- 在ascx中调用另一个ascx的写法
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.We ...
- 一款基于jQuery底部带缩略图的焦点图
之前我们已经分享过不少实用的jQuery焦点图插件了,今天我们要介绍的这款jQuery焦点图插件是带有缩略图的,我们只需点击缩略图即可切换至相应的图片,图片切换的时候出现淡入淡出的动画效果. 在线预览 ...
- MUI功能列表
打开App引导页面 - http://www.bcty365.com/content-146-4970-1.html 页面传值 - http://www.bcty365.com/content-1 ...
- Java String Class Example--reference
reference:http://examples.javacodegeeks.com/core-java/lang/string/java-string-class-example/ 1. Intr ...
- ES6新特性以及一些规范
1.let:使变量成为块级变量,类似于C++,java类的变量 b = 2 if (b == 2) { let c = 2; } console.log(c) // 报错,因为c是一个块级变量,只存在 ...
- 使用docker-hub
使用docker hub 需要其账号 基本操作 查找镜像 sudo docker search centos 每个用户有自己的命名空间,如:centos是存仓库中的镜像文件,admln/centos则 ...