ELF文件的格式和加载过程
http://blog.csdn.net/lingfong_cool/article/details/7832896
(一) ELF 文件的格式
ELF 文件类型 (1) 可重定位文件( .o 目标文件) : 用于链接创建可执行文件或 so 文件
(2) 可执行文件 : 用于执行
(3)so( 共享对象 ) 文件 : 用于链接
注 : 一个 Program Header 对应一个 Segment
一个 Section Header 对应一个 Section
Segment 由 Section 构成
Segment 类型 :#define PT_NULL 0 unused
#define PT_LOAD 1 可加载段 ( 代码节和数据节 )
#define PT_DYNAMIC 2 动态链接段 ( 动态链接信息 )
#define PT_INTERP 3 解释器段 ( 动态链接器路径 )
#define PT_NOTE 4 auxiliary information
#define PT_SHLIB 5 reserved - purpose undefined
#define PT_PHDR 6 program header
#define PT_NUM 7 Number of segment types
#define PT_LOOS 0x60000000 reserved range for OS
#define PT_HIOS 0x6fffffff specific segment types
#define PT_LOPROC 0x70000000 reserved range for processor
#define PT_HIPROC 0x7fffffff specific segment types
Section 类型 : #define ELF_BSS ".bss" uninitialized data
#define ELF_DATA ".data " 数据节 initialized data
#define ELF_DEBUG ".debug" debug
#define ELF_DYNAMIC ".dynamic " 动态链接节 dynamic linking information
#define ELF_DYNSTR ".dynstr" dynamic string table
#define ELF_DYNSYM ".dynsym" dynamic symbol table
#define ELF_FINI ".fini" termination code
#define ELF_GOT ".got" global offset table
#define ELF_HASH ".hash" symbol hash table
#define ELF_INIT ".init" initialization code
#define ELF_REL_DATA ".rel.data" relocation data
#define ELF_REL_FINI ".rel.fini" relocation termination code
#define ELF_REL_INIT ".rel.init" relocation initialization code
#define ELF_REL_DYN ".rel.dyn" relocaltion dynamic link info
#define ELF_REL_RODATA ".rel.rodata" relocation read-only data
#define ELF_REL_TEXT ".rel.text" relocation code
#define ELF_RODATA ".rodata" read-only data
#define ELF_SHSTRTAB ".shstrtab" section header string table
#define ELF_STRTAB ".strtab" string table
#define ELF_SYMTAB ".symtab" symbol table
#define ELF_TEXT ".text " 代码节 code

(二) ELF 文件的加载过程
源文件 Trunk/System/ElfLoader/dll/elfloader.c
LoadElfExec() 函数
加载的具体过程
1. 打开文件 open_library(char* filename)
系统调用 open(): 创建 File 结构体 , 放入进程打开文件表 , 返回 ( 打开文件表 ) 下标
2. 读出文件头和程序头表 IsElfFormat(FILE)
读出 ELF 文件头 ( 同时读出了程序头表 Program Header Table), 判断 ELF 格式根据文件头中的e_ident 来比较判断 .
3. 加载文件 load_library(char * filename,int fd)
(1) 计算所有 segment 占用内存大小 get_lib_extents()
通过遍历程序头表 (Program Header Table), 算出所有 segment 将占用的内存大小extents_size
(2) 分配内存 alloc_mem_region(extents_size)
匿名映射一块非共享的私有内存 ( 不涉及文件 )
(3) 分配 soinfo 结构体 alloc_info(char *filename)
从全局静态 soinfo 结构体数组中分配 soinfo 结构体 ( 描述整个 ELF 文件 )
(4) 加载 segment
load_segment(int fd,void* header,soinfo*si)
(1) 可加载段 (PT_LOAD): 映射到内存
mmap(void * start,size_t len, int prot,int flags,int fd,off_t offsize)
把 ELF 文件 offsize 处的 segment 映射到已分配内存的 start 处
(2) 动态链接段
由动态链接节设置 soinfo 中的动态链接信息
(5) 设置 soinfo 结构体
4. 加载依赖的动态链接库
5.重定位(自身符号)
重定位表项: Elf32_Addr r_offset (重定位)内存地址(offset of relocation)
Elf32_Word r_info 符号表下标和类型(symbol table index and type)
符号表项: Elf32_Word st_name 符号名(name - index into string table)
Elf32_Addr st_value 符号值(symbol value)
Elf32_Word st_size symbol size
unsigned char st_info type and binding
unsigned char st_other 0 - no defined meaning
Elf32_Half st_shndx; section header index
根据重定位表(表项)查符号表,得到符号内存地址,修改(重定位)内存值
最后得到soinfo结构体数组描述了所有加载的文件
6.如果入口地址不为零,调用入口函数
ELF文件的格式和加载过程的更多相关文章
- tensorflow保存数据为.pb格式和加载pb文件
转自:https://blog.csdn.net/u014264373/article/details/79943389 https://blog.csdn.net/fu6543210/article ...
- 整理ViewController的生命周期和加载过程
按照执行顺序排列 - initWithCoder:通过nib文件初始化时触发 - awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象 p ...
- 浏览器打开URL的方式和加载过程
不同浏览器的工作方式不完全一样,大体上,浏览器的核心是浏览器引擎,目前市场占有率最高的几种浏览器几乎都使用了不同的浏览器引擎:IE使用的是Trident.Firefox使用的是Gecko.Safari ...
- SpringMVC DispatcherServlet 启动和加载过程(源码调试)
在阅读本文前,最好先阅读以下内容(当然,如果对 Servlet 已经有所了解,则可跳过): http://www.cnblogs.com/cyhbyw/p/8682078.html http://ww ...
- [NumPy]文件的保存和加载
如果想看.ipynb文件,那就借一步说话!
- 重温.NET下Assembly的加载过程
最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详 ...
- 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线
重温.NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...
- NET下Assembly的加载过程
NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...
- linux 编译,链接和加载
1. 序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...
随机推荐
- JavaScript -- 常用的日期对象和数学对象
创建一个时间对象 var time=new Date(); //当前时间,()内可写入字符串 ,如'2017-10-10',可转为响应的时间 常用方法 time.getFullYear(); //从 ...
- webpack@3.6.0(1) -- 快速开始
本篇内容 前言 配置入口和输出 热更新 loader配置 js代码压缩 html的打包与发布 前言 //全局安装 npm install -g webpack(3.6.0) npm init //安装 ...
- Codeforces Round #517 (Div. 2, based on Technocup 2019 Elimination Round 2)D(思维,DP,字符串)
#include<bits/stdc++.h>using namespace std;char c[2007][2007];char ans[4007];int s[2007][2007] ...
- 从零开始安装 Ambari (2) -- 准备本地 repository
安装 Ambari,最后是为了用它部署 hadoop 集群.安装时默认使用的是 hortonworks 远程的资源,用它部署集群时,需要下载 Hadoop.Hive.HBase 的安装包,速度很慢.我 ...
- Oracle 12c登陆sys用户的方法
本机安装过oracle 12c之后,发现用sql plus执行命令conn sys/change_on_install as sysdba; 提示如下图: 后在网上搜索此问题,需要先登陆system账 ...
- 洛谷P1054 等价表达式
P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...
- 华东交通大学2017年ACM“双基”程序设计竞赛 1005
Problem Description 假设你有一个矩阵,有这样的运算A^(n+1) = A^(n)*A (*代表矩阵乘法)现在已知一个n*n矩阵A,S = A+A^2+A^3+...+A^k,输出S ...
- mysql中 if语句的使用
Mysql的if既可以作为表达式用,也可在存储过程中作为流程控制语句使用,如下是做为表达式使用: IF(expr1,expr2,expr3) IF表达式 代码如下: 如果 expr1 是TRUE (e ...
- 练习六:斐波那契数列(fibonacci)
题目:斐波那契数列. 程序分析:斐波那契数列(Fibonacci sequence),又称黄金分割数列,指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.……. 在数学上,斐波那契数列 ...
- 注意ie6的盒模型
浏览器版本多了,也是一个累,特别是ie家族的. 网上搜罗了一大堆,发现说的和我看到的不一样啊,结果才发现原来是对方表述有问题,省略了几个字就产生了歧义了. 按照网上说的ie6对盒模型解释不符合W3C标 ...