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文件的格式和加载过程的更多相关文章

  1. tensorflow保存数据为.pb格式和加载pb文件

    转自:https://blog.csdn.net/u014264373/article/details/79943389 https://blog.csdn.net/fu6543210/article ...

  2. 整理ViewController的生命周期和加载过程

    按照执行顺序排列 - initWithCoder:通过nib文件初始化时触发 - awakeFromNib:nib文件被加载的时候,会发送一个awakeFromNib的消息到nib文件中的每个对象 p ...

  3. 浏览器打开URL的方式和加载过程

    不同浏览器的工作方式不完全一样,大体上,浏览器的核心是浏览器引擎,目前市场占有率最高的几种浏览器几乎都使用了不同的浏览器引擎:IE使用的是Trident.Firefox使用的是Gecko.Safari ...

  4. SpringMVC DispatcherServlet 启动和加载过程(源码调试)

    在阅读本文前,最好先阅读以下内容(当然,如果对 Servlet 已经有所了解,则可跳过): http://www.cnblogs.com/cyhbyw/p/8682078.html http://ww ...

  5. [NumPy]文件的保存和加载

    如果想看.ipynb文件,那就借一步说话!

  6. 重温.NET下Assembly的加载过程

    最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没能解决我的问题,有些点写的不是特别详 ...

  7. 重温.NET下Assembly的加载过程 ASP.NET Core Web API下事件驱动型架构的实现(三):基于RabbitMQ的事件总线

    重温.NET下Assembly的加载过程   最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后 ...

  8. NET下Assembly的加载过程

    NET下Assembly的加载过程 最近在工作中牵涉到了.NET下的一个古老的问题:Assembly的加载过程.虽然网上有很多文章介绍这部分内容,很多文章也是很久以前就已经出现了,但阅读之后发现,并没 ...

  9. linux 编译,链接和加载

    1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍 ...

随机推荐

  1. 对 React Context 的理解以及应用

    在React的官方文档中,Context被归类为高级部分(Advanced),属于React的高级API,但官方并不建议在稳定版的App中使用Context. 很多优秀的React组件都通过Conte ...

  2. cf779D(记忆化dp)

    题目链接: http://codeforces.com/problemset/problem/799/D 题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中 ...

  3. [Xcode 实际操作]四、常用控件-(12)环形进度条控件的使用

    目录:[Swift]Xcode实际操作 本文将演示环形进度条控件的使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class Vi ...

  4. 《H5+移动应用实战开发》已出版

    <H5+移动应用实战开发>终于出版了,最近在忙着Vue和Webpack相关的前端书籍写稿.本书面向的读者为:从后端转前端,或零基础开始学习移动端开发的人.前后端完全分离的开发方式越来越成为 ...

  5. P3379 【模板】最近公共祖先(LCA)(倍增)

    这题有毒!!!!!!!!!! TM我重新打的板子,然而...... 5分钟打完 debug两小时 我的写法常数太大了 每次DFS都要For去更新F 最后写了快读才A 改: 只处理f[i][0] dfs ...

  6. .net core webapi框架

    折腾了一段时间..还是用ef比较熟,哈哈 参考地址:https://www.cnblogs.com/danvic712/p/10331976.html --jwt 参考地址:https://www.c ...

  7. css奇技淫巧—border-radius

    官方介绍: 浏览器支持:IE9+, Firefox 4+, Chrome, Safari 5+,和Opera支持border-radius属性. border-radius 属性是一个最多可指定四个 ...

  8. F. Relatively Prime Powers (求([2,n],内不是次方的数量)

    题目:经过提炼后, 题目的意思就是问[2,n] 内,不是次方数的数量 ,: 思路: 答案就是 原理是利用容斥,注意n开i次根是向下取整(这题巨卡精度) 这是大神的思路 ,, 我还没有理解, 先放着,等 ...

  9. Django-- CRM1客户建表与装饰器

    一.CRM项目(1) 引入三个表:用户表,客户表,校区表,班级表,梳理逻辑关系并迁移数据库,生成表. 使用admin插入数据,admin是Django提供的web形式的后台数据管理页面,它是和用户认证 ...

  10. Python Unittest - 根据不同测试环境跳过用例详解

    本文章会讲述以下几个内容: 1.Unittest 如何跳过用例 2.如何使用sys.argv 3.自动化测试项目中如何一套代码多套环境运行 一.Unittest跳过用例 @unittest.skip( ...