linux中ELF格式文件介绍

ELF格式即可执行连接文件格式,是一种比较复杂的文件格式。但应用广泛,和其他可执行文件(a.out,cof)相比,它对节的定义和gnu工具链对它的支持使它十分灵活,它保存的足够的系统相关信息使它能够支持不同平台上的交叉编译和交叉链接
ELF格式文件的分类,组成,作用,以及其中包含的内容,常用的elf操作工具

  • 分类
    a)可重定位的对象文件(Relocatable file):
    这是由汇编器汇编生成的.o文件。后面的链接器(link editor)拿一个或一些Relocate object files作为输入,经链接处理后,生成一个可执行的对象文件,(Exeutable file)或者一个可被共享的对象文件(Share object file)
    b)可执行对象文件(Executable file)
    c)可被共享的对象文件(Shared object file):这就是所谓的动态库文件,也即.so文件:
    1)链接编辑器(link editor)拿它和其他Relocate object file 以及其他shared object file 作为输入,经链接处理后,生成另外的shared object file或者executable file.
    2)在运行时,动态链接器(dynamic linker)拿它和一个Executable file以及另外一些shared object file来一起处理,在linux系统里面创建一个进程映像。
    作用:
    是因为ELF格式需要使用在两种场合:
    在计算机科学中,是一种用于二进制文件、可执行文件、目标代码、共享库和核心转储格式文件。
    1)组成不同的可重定位文件,以参与可执行文件或者被共享的对象文件的链接构建;
    2)组成可执行文件或者可被共享的对象文件
    ,以在运行时内存中构建映像的构建

格式:是ELF头(ELF header)、程序头表(Program header table)、节(Section)和节头表(Section header table)

linux中ELF格式文件介绍_第1张图片

(1)文件头还包含了ELF头的大小,文件类型(可重定位,可执行和共享),机器类型,节头表的位置和大小。节头表中的每一项对应于文件中的一个节,用于描述节的位置和大小。
(2)一个典型的重定位目标文件包含下面的节:
.text:机器代码
.rodata:只读数据,例如printf的字符串常量参数,jump跳转表。
.data:已初始化的全局c变量,本地c变量在运行程序的栈中。
.bss:未初始化的全局变量,这个节在文件中并不占实际的空间
.symtab:符号表,包含了本模块定义和引用的全局符号信息,不包含局部变量的信息。
.rel.text:.text节中需要重定位的信息。一般,任何调用外部函数或者引用全局变量的值是一个全局变量地址或外部函数地址的情况下需要重新修改这个值,但是,如果指令调用本地函数,则不需要被修改,重定位信息在可执行文件中可以不需要。
.rel.data:重定位任何被这个模块定义和引用的全局变量信息。通常在一个全局变量的值是另一个全局变量地址或者外部函数地址的情况下需要重新修改中这个值。
.debug:包含调试信息
.line:在.text节中的机器指令与原始c代码所在行之间的映射
.strtab:在.symatab和.debug节中所用的字符串表

你可能感兴趣的:(linux中ELF格式文件介绍)