ELF文件格式

ELF(Executable and Linkable Format),是一种广泛应用于Linux等系统可执行文件、目标文件以及库文件组织格式。在Linux上,用户空间应用程序、库文件、内核模块以及内核本身都以ELF格式存在。Linkable和Executable文件格式稍有差异。

ELF文件格式

  • ELF Header:指定文件格式和大小,或者文件在加载运行时的入口位置
  • Program Header Table:主要用户可执行文件,对Linkable为非必须字段,指定可执行文件的各个段在进程虚拟地址空间中的分布,段的数量、位置以及每个段的作用
  • Sections:实际的数据或者代码段等
  • Section Header Table:提供了section的额外信息,对Executable文件为非必须字段
ELF文件格式_第1张图片 ELF file Layout

 ELF实例

通过readelf工具可以解析ELF文件信息,file工具也可以识别ELF基本信息。下面c程序可以编译生成对应的object文件和executable文件,通过readelf可以对其进行解析:

#include

int 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

$ gcc main.c -c -o test.o

$ ls
main.c  test  test.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

可以看到编译结果以及file命令看到的信息,接下来可以通过readelf应用具体看看前面提到各个组成部分的具体信息。

ELF Header

$ readelf -h test
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

Magic:以0x7f开始,紧接着ELF的ASCII码信息E (0x45), L (0x4c), and F (0x46),作为ELF文件格式头部识别信息

Class:此处为ELF64,这里的二进制是在x86_64机器上编译的,如果为IA32或者ARM等架构,则为ELF32

$ uname -a
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

Type:EXEC(Executable File)

你可能感兴趣的:(Linux)