ELF文件原名Executable and Linking Format,译为“可执行可连接格式”。是一种比较复杂的文件格式,但其应用广泛。与linux下的其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够了系统相关信息使它能支持不同平台上的交叉编译和交叉链接,可移植性很强.同时它在执行中支持动态链接共享库。分析elf文件有助于理解一些重要的系统概念,例如程序的编译和链接,程序的加载和运行等。
(1)ELF文件类型: 3种类型的ELF文件
a)可重定位文件:用户和其他目标文件一起创建可执行文件或者共享目标文件,例如lib*.a文件。
b)可执行文件:用于生成进程映像,载入内存执行,例如编译好的可执行文件a.out。
c)共享目标文件:用于和其他共享目标文件或者可重定位文件一起生成elf目标文件或者和执行文件一起创建进程映像,例如lib*.so文件。
gcc -c helloworld.c
file helloworld.o
helloworld.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped #可重定向文件##
file helloworld
helloworld: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped ##可执行文件##
file libc.so
libc.so: ELF 32-bit LSB shared object, ARM, version 1 (SYSV), dynamically linked, not stripped #共享目标文件##
(2)ELF文件作用:
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),所以可以从不同的角度来看待elf格式的文件:
a)-若其是可重定位文件,用于编译和链接,则编译器和链接器将把elf文件看作是节头表描述的节的集合,程序头表可选。
b)-若其是可执行文件,用于加载执行,则加载器将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头表可选。
c)-若其是共享文件,则两者都含有。
(3)ELF文件总体组成:
elf文件头描述elf文件的总体信息。包括:
系统相关,类型相关,加载相关,链接相关。
系统相关表示:elf文件标识的魔术数,以及硬件和平台等相关信息,增加了elf文件的移植性,使交叉编译成为可能。
类型相关就是前面说的那个类型。
加载相关:包括程序头表相关信息。
链接相关:节头表相关信息。
ELF文件参与程序的连接(建立一个程序)和程序的执行(运行一个程序),编译器和链接器将其视为节头表(section header table)描述的一些节(section)的集合,而加载器则将其视为程序头表(program header table)描述的段(segment)的集合,通常一个段可以包含多个节。可重定位文件都包含一个节头表,可执行文件都包含一个程序头表。共享文件两者都包含有。为此,ELF文件格式同时提供了两种看待文件内容的方式,反映了不同行为的不同要求。
从链接的角度看,ELF文件从开始到结束,可以看成是如下组成的:
a)ELF文件头
b)程序头表(可选)
c)第1节,第2节,...,第n节,...
d)节头表
从执行的角度看,ELF文件从开始到结束,可以看成是如下组成的:
a)ELF文件头
b)程序头表
c)第1段,第2段,...,
d)节头表(可选)