(一) 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. Android 文件的存储和加载

    Android 文件的存储和加载,主要用于请求网络中json文件的缓存,引入了一个简单的过期时间,供大家参考学习! 文件存储 1 private void saveLocal(String json, ...

  2. tensorflow保存数据为.pb格式和加载.pb文件(转)

    最近接触了tensorflow的object detection API发现里面读取的预先训练模型都是pb格式. 谷歌推荐的保存模型的方式是保存模型为 PB 文件,它具有语言独立性,可独立运行,封闭的 ...

  3. ofbiz下的ajax,ofbiz中的ofbiz-component.xml和加载过程

    在ofbiz中,有一个非常重要的配置文件ofbiz-component.xml,这个文件告诉ofbiz需要加载那些容器和类,在start.properties中有如下定义//ofbiz容器加载类,用来 ...

  4. python的HTML文件中使用和加载CSS文件

    目录 1.关于pycharm中CSS文件的创建 2.创建完成之后,进行测试 1.关于pycharm中CSS文件的创建 2.创建完成之后,进行测试 1.关于pycharm中CSS文件的创建: https ...

  5. ELF文件详解 ---- 初步认识

    一.  引言 在讲解ELF文件格式之前,我们来回顾一下,一个用C语言编写的高级语言程序是从编写到打包.再到编译执行的基本过程,我们知道在CPU上执行的是低级别的机器语言,从高级语言到低级别的机器语言肯 ...

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

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

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

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

  8. ELF文件的加载和动态链接过程

    本文的目的:大家对于Hello World程序应该非常熟悉,随便使用哪一种语言,即使还不熟悉的语言,写出一个Hello World程序应该毫不费力,但是如果让大家详细的说明这个程序加载和链接的过程,以 ...

  9. 认识目标文件的格式—— a.out COFF PE ELF

    1.目标文件的常用格式 目标文件是源代码编译后未进行链接的中间文件(Windows的 .obj 和 Linux 的 .o),与可执行文件(Windows 的 .exe 和 Linux 的 ELF)的结 ...

最新文章

  1. 零基础学python培训需要学习多久?
  2. Vue-员工管理系统
  3. C++ : STL常用算法: inner_product , sort ,itoa
  4. Training a classifier
  5. 小程序影藏溢出的gif_ScreenToGif:一款小巧实用动图gif制作神器
  6. 排序算法 - 快速排序(java)
  7. Carthage 安装与使用
  8. 翻译:YOLOv5 新版本——改进与评估
  9. 用友python模块_最新用友NC6.5文件上传漏洞
  10. linux 文件目录对比,文件/目录对比:diff命令
  11. 70个晨会激励哲理小故事
  12. 修饰器 TypeError: A() missing 1 required positional argument: ‘func‘
  13. 【福利贴】教你如何移动联通电信免流
  14. 基于java的奖学金_基于Java的奖学金评定系统设计与实现毕业设计论文.doc
  15. 0 -1 分布(两点分布)
  16. mysql数据库默认密码在哪看_怎么查看mysql数据库的登录名和密码
  17. Python 爬虫实战(1)
  18. 5V2A移动电源管理芯片脚位兼容IP5306
  19. cocos2d 传送门
  20. ev3和python哪个好_乐高教育EV3比SPIKE Prime更好的十个理由!

热门文章

  1. Spring错误小结
  2. 2017ICPCECIC C.A math problem(高次剩余)
  3. MongoDB基础之六 索引
  4. Ane技术大全 - Devil程序员
  5. Delphi编译指令说明
  6. [Ynoi2018]末日时在做什么?有没有空?可以来拯救吗?
  7. 如何保证用户登陆时提交密码已经加密
  8. Mybatis传递参数的三种方式
  9. 简单的使用Seajs
  10. 20佳带给你灵感的优秀个人博客设计案例