PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format),他们都是COFF(Common file format)格式的变种。
定义
目标文件就是源代码编译后但未进行连接的那些中间文件(Windows下的.obj和Linux下的.o)
它与动态链接库(DLL,Dynamic Linking Library)(Windows的.dll和Linux的.so)及静态链接库(Static Linking Library)(Windows的.lib和Linux的.a)文件都按照可执行文件格式存储。
ELF文件类型 | 说明 | 实例 |
可重定位文件 (Relocatable File) |
这类文件包含了代码和数据,可以被用来链接成可执行文件或共享目标文件,静态链接库也可以归为这一类 |
Linux的.o Windows的.obj |
可执行文件 (Executable File) |
这类文件包含了可以直接执行的程序,它的代表就是ELF可执行文件,它们一般都没有扩展名 |
/bin/bash文件 Windows的.exe |
共享目标文件 (Shared Object File) |
这种文件包含了代码和数据,可以在以下两种情况下使用。 一种是链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件。 第二种是动态链接器可以将几个这种共享目标文件与可执行文件结合,作为进程映像的一部分来运行。 |
Linux的.so Windows的DLL |
核心转储文件 (Core Dump File) |
当进程意外终止时,系统可以将该进行的地址空间的内容及终止时是一些其他信息转储到核心转储文件 | Linux下的core dump |
内容
段(Section) | 备注 |
File Header |
文件头,描述了整个文件的文件属性,包括文件是否可执行、是静态链接还是动态链接及入口地址(如果是可执行文件)、目标硬件、目标操作系统等信息, 文件头还包括一个段表,描述了文件中各个段在文件中的偏移位置及段的属性等。 |
.test section | 一般C语言的编译后执行语句都编译成机器代码,保存在代码段 |
.data section | 已初始化的全局变量和局部静态变量都保存在数据段 |
.bss section | 未初始化的全局变量和局部静态变量放在此段,只是预留位置,并没有内容,所以在文件中也不占空间。 |
实际上可能还有只读数据段(.rodata)、注释信息段(.comment)和堆栈提示段(.note.GNU-stack)等其他ELF段
这些段的名字都是由“.”作为前缀,表示这些表的名字是系统保留的,应用程序也可以使用一些非系统保留的名字作为段名。
$ objcopy -I binary -O elf32-i386 -B i386 image.jpg image.o
$ objdump -ht image.o
查看目标文件内容
工具:objdump
代码:$ objdump <参数> *.obj
-h:把ELF文件的各个段的基本信息打印出来
-x:把更多信息打印出来
-s:将所有段的内容以十六进制的方式打印出来
-d:将所有包含指令的段反汇编
自定义段
我们在全局变量或函数之前加上“__attribute__ ((section("name"))) ”属性就可以把相应的变量或函数放到以name为段名的段中