【程序员的自我修养—目标文件中有什么】

目标文件定义与分类

目标文件:源代码编译后未经过链接的中间文件

  • Linux:.o 文件
  • Windows:.obj 文件

可执行文件和目标文件在内容和结构上很相似,广义上可以看作一种类型的文件

  • Linux:ELF文件(a.out)
  • Windows:PE文件(Intel/Microsoft的OMF文件,MS-DOS的 .COM文件)

动态链接库和静态链接库也按照这种格式存储

  • Linux:.so(动态链接库)、 .a(静态链接库)
  • Windows:.dll(动态链接库)、.lib(静态链接库)

ELF文件类型分类:

文件类型 说明 实例
可重定位文件(目标文件)

包含代码和数据;

被用来链接成可执行文件或者共享目标文件;

静态链接库可以归为这一类。

.o或.obj
可执行文件

可以直接执行的程序;

Linux下一般没有扩展名。

/bin/bash(变了)

.exe

共享目标文件

包含代码和数据;

1. 可以和其他可重定位文件或共享目标文件链接生成新的目标文件;

2. 动态连接器将该种类文件和可执行文件链接,作为进程映射的一部分

.so或.dll
核心转储文件 进程意外终止时,系统将该进程的地址空间和其他信息转储到该文件中 core dump文件
$ file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped
file /lib32/ld-2.31.so 
/lib32/ld-2.31.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=e43b0116e734c1e7959dbf0d04c808e40769f51f, stripped
$ file /bin/bash
/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=2a9f157890930ced4c3ad0e74fc1b1b84aad71e6, for GNU/Linux 3.2.0, stripped
// 这里和书上说的不太一样,应该后面改了吧,这里变成了共享目标文件

目标文件格式

目标文件的内容:

  • 机器指令代码、数据
  • 链接所需要的信息,包括:符号表、调试信息和字符串等

按照信息的不同属性分为不同的段:

  • 代码段:.code或.text,存放机器指令
  • 数据段:
    • .data,存放全局变量和局部静态变量(已初始化)
    • .bss,存放未初始化的全局变量和局部静态变量(预留位置,不占用空间)
  • 文件头:
    • 描述文件的属性,包括文件是否可执行、是静态链接还是动态链接以及入口地址、目标硬件和目标系统信息等;
    • 段表:描述各个段的信息

分段的好处:

  1. 将数据和程序指令映射到两个虚拟的区域,将指令区域设置成只读的,防止程序被改写;
  2. 将数据缓存和指令缓存分离,提供局部性,进而提高缓存命中率;
  3. 通过共享指令(程序有多个副本),节省大量的空间。

你可能感兴趣的:(c++)