ELF(Executable and Linking Format)是一种对象文件的格式,用于定义不同类型的对象文件(Object files)中都放了什么东西、以及都以什么样的格式去放这些东西。它自最早在 System V 系统上出现后,被 xNIX 世界所广泛接受,作为缺省的二进制文件格式来使用。可以说,ELF是构成众多xNIX系统的基础之一,所以作为嵌入式Linux系统乃至内核驱动程序开发人员,你最好熟悉并掌握它。换句话说,就是Windows上的EXE(Windows上其实不只EXE是可执行文件),嵌入式Linux上的ELF,它们比较相似。
一个可执行目标文件,从原代码,要经历预处理器、编译器、汇编器和加载器,才会加载到内存中执行。而目标文件,分为可重定位文件和可执行文件,目标中分成不同的节。
节 | ELF头 | 描述字的大小、生成该文件的系统的字节顺序、帮助链接解析和解释目标文件的信息(ELF头的大小、目标文件类型--可重定位/可执行/共享/机器类型/节头部表的文件偏移/节头部表中表目大小和数量) |
.text | 编译完后的机器码 | |
.rodata | 只读数据,如printf中的格式串和switch中的跳转表 | |
.data | 已初始化的全局C变量 | |
.bss | 未初始化的全局C变量 | |
.symtab | 符号表,存放在本文件中被定义和引用的函数和全局变量(此全局变量,包含自己定义全局变量和函数,即使带有static也包含,是在符号后加了个数字,另外还包含本文件中引用的其它文件的全局变量和函数,即使这个函数没有在外面用extern引用--变量不引用则编译报错),不包含局部变量(程序运行时,在栈中生成) | |
.rel.text | 可重定位的代码,一般是调用的外部函数或者引用全局的变量的指令,引用本地的不需要改 | |
.rel.data | 本模块定义或引用的全局变量 | |
.debug | 调试符号表 | |
.line | 原始C源程序中的等号和.text节中机器指令间的映射 | |
.strtab | 字符串表。包含.symtab和.debug节中的符号表,以及节头部中的节名字 | |
描述目标文件 | 节头部表 | 由相同大小的表目组成,每个表目描述上面的一个节 |