ELF文件格式理解

  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节中的符号表,以及节头部中的节名字
         
            描述目标文件
         
            节头部表
         
            由相同大小的表目组成,每个表目描述上面的一个节
         

   

原文地址:https://www.cnblogs.com/jourluohua/p/6506435.html