链接与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格式的文 ...
随机推荐
- linux 体系结构知识 博客
http://blog.csdn.net/haiross/article/category/1488205/3
- PMP学习感想
经过一个多月的漫长等待,伴随着焦虑与激动,终于迎来了2016新年的第一个惊喜,PMP考试通过了! 三个多月的努力,利用休息时间,终于把这块硬骨头给啃了下来. 感谢慧翔天地的老师和学友们,是在你们的努力 ...
- Fedora 23如何安装LAMP服务器
LAMP 是开源系统上 Web 服务器的梦幻组合.LAMP 是 Linux. Apache HTTP 服务. MySQL/MariaDB 数据库和 PHP. Perl 或 Python 的简称. 下面 ...
- LeetCode31 Next Permutation
题目: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...
- c++ 设计模式1
从面向对象谈起 1) 底层思维:向下,如何把握及其底层,从微观理解对象构造 (语言构造.编译转换.内存模型.运行时机制) 抽象思维: 向上,如何将我们的周围世界抽象为程序代码 (面向对象.组件封装 ...
- 使用subversion搭建SVN
使用subversion搭建SVN需要用到的软件包有subversion,apr,apr-util,sqlite,zlib,因为在编译安装subversion时需要指明apr.apr-util.sql ...
- codeforces 434B B. Nanami's Digital Board(分治)
题目链接: B. Nanami's Digital Board time limit per test 1 second memory limit per test 256 megabytes inp ...
- codeforces 677B B. Vanya and Food Processor(模拟)
题目链接: B. Vanya and Food Processor time limit per test 1 second memory limit per test 256 megabytes i ...
- VS平台工具集版本
参考:http://blog.csdn.net/hillseas/article/details/47373313 VS从2010之后开始支持使用之前的版本进行编译,可以在工程属性->常规中进行 ...
- C++之环境搭建
1.安装g++ 下载https://sourceforge.net/projects/mingw/files/Installer/mingw-get/mingw-get-0.6.2-beta-2013 ...