赞
踩
Linux程序编译执行原理之二gcc编译出的elf文件分析
Linux程序编译执行原理之二:gcc编译出的elf文件分析
本系列导航:
Linux程序编译执行原理之一:预处理-编译-汇编-链接过程分析
Linux程序编译执行原理之二:gcc编译出的elf文件分析
使用gcc编译出的可执行程序是啥样的呢?使用编辑器打开只会看到一堆乱码^-^ 它又为何能够执行,如何执行的呢?今天我们以上一篇文章中编译出来的elf文件为例,来一起了解一下这其中的缘由。
Elf格式与bin格式的区别
首先来对比一下另一种二进制文件格式bin
1, bin文件是raw binary文件,其中只有机器码
2, elf文件除了含有机器码之外还有其它信息,如:段加载地址,运行入口地址,数据段等
3, 运行bin文件只需要将bin文件起始地址赋值pc指针即可
4, Elf程序需要专门的elf loader将其中的代码段、数据段解析加载到内存中指定的位置(此处使用的是4GB虚拟地址哦),再跳转到elf header指定的入口地址开始执行。
Linux下编译出来的程序是elf格式的,ELF全称Executable and Linkable Format,可执行链接格式。ELF文件(目标文件)格式主要三种:
可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件。(目标文件或者静态库文件,即linux通常后缀为.a和.o的文件)
可执行文件:文件保存着一个用来执行的程序。(例如bash,gcc等)
共享目标文件:共享库。文件保存着代码和合适的数据,用来被下连接编辑器和动态链接器链接。(linux下后缀为.so的文件。)
(ps:windows下的可执行文件格式是不是elf呢?以后有机会研究一下)
ELF文件组成:
1,ELF文件由4部分组成
分别是ELF头(ELF header)、程序头表(Program header
table)、节(Section)和节头表(Section header table)。实际上,一个文件中不一定包含全部内容,而且他们的位置也未必如同所示这样安排,只有ELF头的位置是固定的,其余各部分的位置、大小等信息由ELF头中的各项值来决定。
下面这3部分简单分布情况,上面这条横条可以看成ELF文件从头到尾。对于ELF头,节区表,节区都对应分布在文件里面,通过偏移来表示其对应在文件的位置。
2、ELF头对应字段的意义
简单用下图来说明,其他字段可以对应解析
3、节区相关信息
4、sh_info,sh_link段
对于节区经常使用的两个信息字段sh_info,sh_link对应字段意义
5、常见section
对于一个ELF目标文件,通常都会有以下几个节区,可以通readelf –S test
编译出的elf文件中的各种section
.text段是代码段。它用来放程序代码(code)。它通常是只读的
.data段是数据段。它用来存放初始化了的(initailized)全局变量(global)和初始化了的静态变量(static)。它是可读可写的。
.bss段是全局变量数据段。它用来存放未初始化的(uninitailized)全局变量(global)和未初始化的静态变量(static)。它也是可读可写的。bss是英文BlockStarted by Symbol的缩写。之所以把bss跟data分开来,是因为系统会为这些bss段的变量的初值清零。
.constdata段是常量数据段。它用来存放常量(const)。它也是只读的。
符号表:对应于.symtab,它保存着目标文件中所有的符号信息 字符串表:.strtab,保存字符窜信息。信息组织规则
对应符号信息:
6、重定位
上面列出的信息中,没有包含重定位信息段,因为test.o是一个简单的目标文件,就定义了一个函数,所有没有涉及重定位,其实在 绝大部门目标文件中,都存在这个重定位信息段。若一个目标文件引用了其他目标文件的符号,就会生成重定位信息段,方便在连接的 时候进行。重定位项信息如下:
7、对于一个ELF文件,重定位过程可以简单表示成下面过程
Linux程序编译执行原理之二gcc编译出的elf文件分析相关教程
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。