赞
踩
ELF,全称Executable and Linking Format,旨在为不同操作环境下提供一组通用的ABI(二进制接口),也是目前Unix和类Unix操作系统使用的标准二进制格式。ELF文件格式定义了可执行程序的静态文件格式,包括文件信息头、段及节等结构,并约定了程序在运行时,程序文件的内容是如何动态加载到内存中以及起始运行地址。
ELF文件从字面的意义上来讲,描述的是可执行和链接格式,因此包括可执行文件、目标文件以及动态库都可以采用ELF文件格式进行存储。ELF标准中定义的ELF文件类型主要有以下四种:
ELF文件类型 | 类型标记 | 说明 |
---|---|---|
可重定位文件 | ET_REL | 可重定位目标文件通常是还未被链接到可执行程序的一段位置独立的代码,如.o 文件 |
可执行文件 | ET_EXEC | 即可运行的程序,是一个进程开始执行的入口,平时使用的shell、find等工具都属于此类 |
共享目标文件 | ET_DYN | 动态可链接目标文件,即共享库,会在程序运行时被装载并连接到程序的进程镜像中,如.so 文件 |
核心转储文件 | ET_CORE | 在程序崩溃或者进程传递了一个SIGSEGV 信号时,会在核心文件中记录整个进程的镜像信息,如Linux的进程Coredump文件 |
Linux下可以使用file命令来查看不同ELF文件类型的格式:
一个标准的ELF文件通常包含了如下几类信息:
为了管理上面的信息,ELF文件通常会将这些信息按照不同的属性,以段(Segment)或节(Section)的形式进行存储,常用的段或节包括代码段、数据段、.bss段等。
在实际的开发过程中,我们可能更加关心程序中使用的代码和数据在ELF文件中是如何存储的,对应于上面的指令和数据部分。如下是一个简单的程序被编译成ELF文件后的结构:
程序代码被编译后主要分为两种类型的数据:程序指令和程序数据,其中程序指令通常存储于代码段,程序数据按照其数据属性通常存储于数据段、.bss段等区域:
除了ELF文件格式外,还有一些其它的可执行文件格式:
a.out
作为程序的默认名称,算是一种致敬吧;.exe
。Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。