C语言-可执行文件组织形式

本文最后更新于:1 年前

综述

​ 主流的可执行文件格式主要是 Windows 下的 PE(Portable Executable)和 Linux 下的 ELF(Executable Linkable Format),它们都是 COFF(Common File Format)格式的变种,COFF 是 Unix V3首先提出的规范。其他不太常见的可执行文件格式还有 Intel/Microsoft 的 OMF(Object Module Format)、Unix a.out、MS-DOS .COM 等。

​ 从广义上讲,目标文件与可执行文件的存储格式几乎是一样的,动态链接库(DLL,Dynamic Linking Library)(Windows 下的.dll和 Linux 下的.so)和静态链接库(Static Linking Library)(Windows 下的.lib和 Linux 下的.a)也是按照可执行文件的格式存储的。

​ 静态链接库稍有不同,它是把多个目标文件捆绑在一起形成一个文件,再加上一些索引,可以简单地把它理解为一个包含了很多目标文件的包。

1
2
3
4
5
6
7
8
9
10
11
objdump -d demo.o 
可使用此指令查看目标文件,-d表示把所有包含指令的段反汇编

objdump -s -d demo.o
-s表示所有段以十六进制显示

objdump -h demo.o
可使用此指令查看文件组织形式

objdump -r demo.o
可使用此指令查看需要重定位的符号

文件类型

在 Linux 的 ELF 标准中,主要包含以下四类文件:

文件类型 说明 实例
可重定位文件 (Relocatable File) 这类文件包含了代码和数据,可以被用来链接成为可执行文件或动态链接库。静态链接库其实也是可重定位文件。 Linux 下的 .o 和 .a,Windows 下的 .obj 和 .lib。
可执行文件 (Executable File) 这类文件包含了可以直接执行的程序。 Windows 下的 .exe,Linux 下的可执行文件没有固定的后缀,一般不写。
共享目标文件 (Shared Object File) 这种文件包含了代码和数据,可以在以下两种情况下使用:一种是链接器可以使用这种文件跟其他的可重定位文件和共享目标文件链接,产生新的目标文件;第二种是动态连接器可以将几个共享目标文件与可执行文件结合,作为进程的一部分来运行。 Linux 下的 .so,Windows 下的 .dll。
核心转储文件 (Core Dump File) 当进程意外终止时,系统可以将该进程的地址空间的内容以及其他信息保存到核心转储文件。 Linux 下的 core dump。

可执行文件组织形式

text段在内存中被映射为只读,但date段与bss段是可写的

linux中的elf文件都是从虚拟地址0x08048000开始分配的

  • text段:代码段,就是放程序代码的,编译时确定,只读
  • date段:存放在编译阶段(而非运行时)就能确定的数据,可读可写。也就是通常所说的静态存储区,赋了初值的全局变量和赋初值的静态变量存放在这个区域,常量也存在这个区域
  • bss段:已经定义但没赋初值的全局变量和静态变量存放在这个区域。