当前位置: 首页 > C, C/C++ > 正文

目标文件ELF

                                                                                   目标文件ELF(Executable Linkable Format)

         可执行文件:主流上有两种,PE 和 ELF 。目标文件就是.o文件,它和可执行文件有相似几乎相同的文件结构,所以我们可以将他们两个看成是一种类型的文件,其实库文件就是.o文件,这足以说明它和可执行文件的关系。

     ELF文件类型                                   说明                                                                                                                           示例

  可重定位文件                          主要包含代码和数据,静态库也可以包含到这一类。                                       linux ->.o     windos->.obj

  可执行文件                               就是可执行文件,没有扩展名                                                                               /bin/bash 文件   exe文件

  共享目标文件                         连接器可以使用,动态链接库的实现                                                                    linux->.so 文件     DLL

  核心转储文件                         当进程终止时可以将进程的地址空间内容等信息转移到核心转储文件           core dump

  

目标文件的结构:

  目标文件中一般以段 或者 节来存放信息。大体上由四个部分。

                头文件部分,文本段,数据段,BSS段,只读数据段,注释信息段,堆栈段。

                现在来逐一解析这些段:

                  头文件:

                               目标文件的头文件包含有,系统平台信息,硬件信息,环境信息,函数的借口入口等最重要的时还包含一个名叫“段表”的东西。段表记录了目标文件中的各个段信息。

           text ,   rel.text , data, bss , rodata  ,comment  , not-GNU-stack,shstrtab ,symtab,strtab  这些段信息。

            可以通过readelf  -S XXX.o  来查看这些东西。

                  文本段:

                                   就是存放代码的段,一般以ASCII的形式来存放代码,使用gcc -s XXX.o   可以反汇编代码。

                  数据段:

                                 存放已经声明并且初始化过的数据,全局静态变量,局部静态变量,函数内的数据不会在这里边,一般在函数运行时才会生成在函数栈上。全局变量未初始化

或者初始化为0,则不再数据段中。

                BSS段:

                                存放未初始化的全局静态变量和局部静态变量,同时未初始化的全局变量也不会在BSS段存放而是作为一种符号的存在,被放在符号表中。

               comment(注释表):

                                用来存放我们所写的注释。

               堆栈段:

                               提示这个可执行文件的堆栈,一般来说堆栈应该是可重入的,

               其他段:

                            debug 调试信息,dynamic 动态链接信息,HASH 哈希表,line调试的行号表还有符号表等等。

                     

版权声明:本文为博主原创文章,未经博主允许不得转载。

]]>

本文固定链接: http://zmrlinux.com/2015/06/18/%e7%9b%ae%e6%a0%87%e6%96%87%e4%bb%b6elf/ | Kernel & Me

该日志由 root 于2015年06月18日发表在 C, C/C++ 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: 目标文件ELF | Kernel & Me
【上一篇】
【下一篇】