ELF(Executable and Linkable Format),是一种广泛应用于Linux等系统可执行文件、目标文件以及库文件组织格式。在Linux上,用户空间应用程序、库文件、内核模块以及内核本身都以ELF格式存在。Linkable和Executable文件格式稍有差异。
ELF文件格式
- ELF Header:指定文件格式和大小,或者文件在加载运行时的入口位置
- Program Header Table:主要用户可执行文件,对Linkable为非必须字段,指定可执行文件的各个段在进程虚拟地址空间中的分布,段的数量、位置以及每个段的作用
- Sections:实际的数据或者代码段等
- Section Header Table:提供了section的额外信息,对Executable文件为非必须字段
文章图片
ELF file Layout ELF实例
通过readelf工具可以解析ELF文件信息,file工具也可以识别ELF基本信息。下面c程序可以编译生成对应的object文件和executable文件,通过readelf可以对其进行解析:
#includeint add (int a, int b)
{
printf("Numbers are added together\n");
return a+b;
}int main(void)
{
int a,b;
a = 3;
b = 4;
int ret = add(a,b);
printf("Result: %u\n");
exit(0);
}
编译:
$ gcc main.c -o test
【ELF文件格式】$ gcc main.c -c -o test.o
$ ls可以看到编译结果以及file命令看到的信息,接下来可以通过readelf应用具体看看前面提到各个组成部分的具体信息。
main.ctesttest.o
$
$ file test*
test:ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=893f61a5f9e6714e1377e5a2d08925bccb35b446, not stripped
test.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
ELF Header
$ readelf -h testMagic:以0x7f开始,紧接着ELF的ASCII码信息E (0x45), L (0x4c), and F (0x46),作为ELF文件格式头部识别信息
ELF Header:
Magic:7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class:ELF64
Data:2's complement, little endian
Version:1 (current)
OS/ABI:UNIX - System V
ABI Version:0
Type:DYN (Shared object file)
Machine:Advanced Micro Devices X86-64
Version:0x1
Entry point address:0x5c0
Start of program headers:64 (bytes into file)
Start of section headers:6560 (bytes into file)
Flags:0x0
Size of this header:64 (bytes)
Size of program headers:56 (bytes)
Number of program headers:9
Size of section headers:64 (bytes)
Number of section headers:29
Section header string table index: 28
Class:此处为ELF64,这里的二进制是在x86_64机器上编译的,如果为IA32或者ARM等架构,则为ELF32
$ uname -aType:EXEC(Executable File)
Linux ubuntu 4.15.0-29-generic #31-Ubuntu SMP Tue Jul 17 15:39:52 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
推荐阅读
- Linux|109 个实用 shell 脚本
- linux笔记|linux 常用命令汇总(面向面试)
- Linux|Linux--网络基础
- linux|apt update和apt upgrade命令 - 有什么区别()
- linux|2022年云原生趋势
- Go|Docker后端部署详解(Go+Nginx)
- 开源生态|GPL、MIT、Apache...开发者如何选择开源协议(一文讲清根本区别)
- GitHub|7 款可替代 top 命令的工具