ELF可执行文件的理解

ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(object files)中都放了什么东西、以及都以什么样的格式去放这些东西。ELF是构成众多xNIX系统的基础之一。

1 对象文件的三个种类

1.1 可重定位的对象文件(Relocatable object file)

这是由汇编器汇编生成的.o文件。链接器(link editor)拿一个或一些Relocatable object files作为输入,经链接处理后,生成一个可执行的对象文件(Executable object file)或者一个可被共享的对象文件(Shared object file)。可以使用ar工具将众多的.o可重定位的对象文件归档成.a静态库文件。

1.2 可执行的对象文件(Executable object file)

文本编辑器vi、调试用的工具gdb、播放MP3歌曲的软件mplayer等等都是Executable object file,另外一种可执行的脚本(如shell脚本),不是可执行的对象文件,只是文本文件,但是执行这些脚本所用的解释器就是executable object file,比如bash shell程序。

1.3 可被共享的对象文件(Shared object file)

这些就是所谓的动态库文件,也即.so文件。如果拿前面的静态库来生成可执行程序,那每个生成的可执行程序中都会有一份库代码的拷贝。动态库在发挥作用的过程中,必须经过两个步骤:

  1. 链接编辑器(link editor)拿它和其他Relocatable object file以及其他shared object file作为输入,经链接处理后,生成另外的shared object file或者executable file。
  2. 在运行时,动态链接器(dynamic linker)拿它和一个executable file以及另外一些shared object file来一起处理,在Linux系统里面创建一个进程映像。

2 section

在ELF对象文件的最前面有一个ELF头文件,里面记载了所适用的处理器、对象文件类型等各种信息。下图描述了ELF对象文件的基本组成:

为什么左右两个类似的图来说明ELF的组成格式?这是因为ELF格式需要使用在两种场合:(1)组成不同的可重定位文件,以参与可执行文件或者可被共享的对象文件的连接构建;(2)组成可执行文件或者可被共享的对象文件,以在运行时内存中进程映像的构建。

Section是在ELF文件里头,用以装载内容数据的最小容器,是被链接器使用的。在ELF文件里面,每一个section内都装在了性质属性都一样的内容,比方:

1) .text section 里装载了可执行代码;

2) .data section 里面装载了被初始化的数据;

3) .bss section 里面装载了未被初始化的数据;

4) 以 .rec 打头的 sections 里面装载了重定位条目;

5) .symtab 或者 .dynsym section 里面装载了符号信息;

6) .strtab 或者 .dynstr section 里面装载了字符串信息;

7) 其他还有为满足不同目的所设置的section,比方满足调试的目的、满足动态链接与加载的目的等等。

一个ELF文件中到底有哪些具体的section,由包含在这个ELF文件的section head table(SHT)决定。在SHT中,针对每一个section,都设置一个条目,用来描述对应的这个section,其内容主要包括该section的名称、类型、大小以及在整个ELF文件中的字节偏移位置等等。

链接器在链接可执行文件或动态库的过程中,它会把来自不同可重定位对象文件中的相同名称的section合并起来构成同名的section。接着,它又会把带着相同属性(比方都是只读并可加载的)的section都合并成所谓segment(段)。Segment作为链接器的输出,常被称为输出section。开发者可以控制哪些不同.o文件的section来最后合并构成不同名称的segment。

一个单独的 segment 通常会包含几个不同的 sections,比方一个可被加载的、只读的segment 通常就会包括可执行代码section .text、只读的数据section .rodata以及给动态链接器使用的符号section .dymsym等等。section 是被链接器使用的,但是 segments 是被加载器所使用的。加载器会将所需要的 segment 加载到内存空间中运行。和用 sections header table 来指定一个可重定位文件中到底有哪些 sections 一样。在一个可执行文件或者动态库中,也需要有一种信息结构来指出包含有哪些 segments。这种信息结构就是 program header table,如ELF对象文件格式中右边的 execute view 所示的那样。

为什么会有这样的一个segment?这是因为我们写的应用程序通常都需要使用动态链接库.so。程序在Linux里面是怎样运行起来的?当在shell中敲入一个命令要执行时,内核会帮我们创建一个新的进程,它再往这个新进程的进程空间里面加载进可执行程序的代码段和数据段后,也会加载进动态链接器(在Linux里面通常就是 /lib/ld-linux.so 符号链接所指向的那个程序,它本身就是一个动态库)的代码段和数据。在这之后,内核将控制传递给动态链接库里面的代码。动态链接器接下来负责加载该命令应用程序所需要使用的各种动态库。加载完毕,动态链接器才将控制传递给应用程序的main函数。这样应用程序才得以运行。

头文件中最重要的三个segment是:代码段、数据段和堆栈段。

ELF可执行文件的理解相关推荐

  1. Linux下的ELF可执行文件学习总结

    Linux下的ELF可执行文件的格式解析 http://blog.csdn.net/xuchao1229/article/details/8915831 目录(?)[+] ELF(Executable ...

  2. 修改ELF可执行文件entry入口感染一个程序

    前面的文章在介绍如何将代码注入Linux内核模块的时候,我提到 "修改ELF文件或者PE文件的入口,让它跳到自己的逻辑"这件事很容易. 真的很容易吗?是的,真的很容易.本文就是要演 ...

  3. 一步步编写操作系统 46 linux的elf可执行文件格式1

    ELF文件格式依然是分为文件头和文件体两部分,只是该文件头相对稍显复杂,类似层次化结构,先用个ELF header从"全局上"给出程序文件的组织结构,概要出程序中其它头表的位置大小 ...

  4. 详解ELF可执行文件格式:读取头部信息和程序表头

    要想实现ELF文件的入口劫持,不深入掌握其运行原理与组成结构那是不可能的.ELF的内部结构复杂,加载逻辑难以理解,因此我们需要通过切香肠的方式,将这个困难的技术点一点一滴的去攻克. 这一节我们先掌握如 ...

  5. 探索ELF可执行文件的“干货”:段头表和段的基本介绍

    可执行文件的数据结构通常都很复杂和繁琐.原因在于程序在加载到内存中执行时需要经过一系列非常复杂的步骤.例如要计算数据或代码被加载到虚拟内存时的位置,计算重定向数值,实现不同代码的链接等. 本节我们一点 ...

  6. linux命令怎么查看dat格式的文件,Linux 查看 elf可执行文件格式的两个命令

    应用 objdump 和readelf 两个下令 ,我们可以看到elf的各个节段的 信息尚有 运行时必要 那些动态链接库,elf中的汇编代码等等. 我就是想用来查察 这个elf运行必要 哪些 *.so ...

  7. 一步步编写操作系统 45 linux的elf可执行文件中的段和节

    接上文,为了描述清楚文件格式的本质,咱们先从最基本的"段"说起. 程序中最重要的部分就是段(segment)和节(section),它们是真正的程序体,是真真切切的程序资源,所以下 ...

  8. elf文件反编译C语言,如何将ELF可执行文件转换为C代码?生成的C代码不需要是人类可读的...

    我有一个ELF文件,我想反编译成C代码,并对生成的C代码进行简单的更改,并将其重建为ELF. 反编译的C代码不需要完全是人类可读的.例如,如果变量和函数名称被混淆,那就没关系. 我可以使用哪些工具在L ...

  9. elf 取路径_利用libbfd获取elf可执行文件的section(节)及symbol(符号)信息

    一. 安装bfd库 libbfd(Binary File Descriptor library是binutils中附带的一个C库. 从 http://ftp.gnu.org/gnu/binutils ...

最新文章

  1. Dosbox+Masm汇编语言
  2. P1984 [SDOI2008]烧水问题
  3. libklel 1.1.0 发布,表达式语言
  4. GatewayMetricsFilter网关度量过滤器(服务监控)
  5. 劝你要看一些有门槛的机会
  6. (85)FPGA显示激励(monitor)
  7. MIS 740: Software Concepts Use different GUI components i
  8. Python编程中一定要注意的那些“坑”(二)
  9. 有什么好办法说服孩子不玩游戏?
  10. 分析报告生产器使用问题
  11. Cygwin的中文支持(解决乱码)
  12. Spoj REPEATS 后缀自动机+set
  13. ArcMap基本操作
  14. 6.Linux中的进程管理
  15. cad画正弦曲线lisp_cadlisp基础教程.pdf
  16. MindMeld中文文档--2.构建会话应用程序的不同方法[Different Approaches for Building Conversational Applications]
  17. 事件同时发生的相对性——思想实验推导狭义相对论(三)
  18. GEE主成分分析全解析
  19. 【每日力扣Leetcode】459-判断一个字符串是否由子字符串重复组成
  20. 数学建模——熵权法步骤及程序详解

热门文章

  1. JetBrains全家桶软件
  2. 如何查看Linux磁盘空间大小
  3. MySql各版本介绍
  4. 【算法】重新排序数组中正数和负数
  5. Cursor:GPT-4 免费的强大代码编辑器
  6. 南京廖华微型计算机原理答案,微机原理课后习题答案解析
  7. oracle日志如何查看,oracle如何查看日志
  8. 常微分方程组解稳定性的分析
  9. JAVA中类、对象、方法之间的关联关系
  10. Borland听我对你说