一、相关概念介绍
可执行文件(executable)格式:
windows平台下是PE(protable executable) linux平台下是ELF(executable linkable format)
目标文件:
源代码(.c .cpp)编译之后生成的文件(.o或.obj),从文件结构上讲,它是已经编译后的可执行文件格式,只是没有经过链接的过程,其中可能有些符号或有些地址还没有被调整。它本身是按照可执行文件格式存储的,跟真正的可执行文件在结构上稍有不同,因此目标文件和可执行文件看成是一种文件类型。动态链接库(.so .dll)和静态链接库(.a .lib)文件都是按照可执行文件格式存储。
二、ELF文件格式分析:
ELF文件格式的种类:
可重定位文件(relocatable) .o .a 可执行文件(executable) 共享目标文件(shared object) .so 核心转储文件 core dump file 文件名 该命令可以用来查看文件格式的具体类型。
ELF文件格式提供了两种不同的视角,在汇编器和链接器看来,ELF文件是由section header table描述的一系列section的集合,而执行一个ELF文件时,在加载器看来它是由program header table描述的一系列segment的集合。多个源代码编译之后成为多个elf可重定位文件,在链接时将多个elf可重定位文件中对应的section合并组成一个elf可执行文件,每个可执行文件由segment组成。
本文的讨论基于一个运行linux的x86系统环境,使用标准ELF文件格式。讨论集中在32位代码,在x86-64系统上用gcc -m32产生32位代码。
若编译时发生/usr/include/features.h:364:25: fatal error: sys/cdefs.h: 没有那个文件或目录,则使用命令sudo apt-get install libc6-dev-i386解决。ELF可重定位文件详解:
相关术语的说明:
ELF可执行文件大体按照图中的形式组织,不同的是在ELF可重定位文件中的内容称为节(section),对应的有section header table。在ELF可执行文件中的内容称为段(segment),对应的有program header table。可重定位文件中的节(section)在链接时对应节进行合并生成可执行文件中的段(segment)。