C语言的预处理、编译与链接

2 C语言预处理

3 C语言编译

4 C语言链接、可执行文件的布局

4.1 静态链接及可执行文件的布局

4.1.1 静态链接

4.1.2 可执行文件的布局

4.1.2.1 Linux可执行文件的布局

以Linux的ELF文件为例,其可执行文件的存储布局主要如下:

  1. ELF文件头,存储有ELF Majic Number、文件类型(可执行、共享库等)、目标架构等基础信息。具体应当见Linux开发笔记。
  2. 可执行文件段,其主要分为如下的Section:
Sections
(地址从低到高排列)
内容
内存映射关系
.text 可执行指令(如函数代码) 代码段(Text Segment)
.rodata 只读数据(如字符串常量、const 变量) 数据段(只读部分)
.data 已初始化的全局变量、静态变量 数据段(可写部分)
.bss 未初始化的全局变量、静态变量(不占空间,加载时分配) 数据段(运行时清零)
.symtab 符号表(调试或静态链接用),通常只出现在 .o 文件中 不加载到内存
.strtab 字符串表(符号名称等) 不加载到内存
.rel.* 重定位表( .o 文件包含链接后不再需要) 不加载到内存
.dynamic 动态链接信息(如依赖的共享库) 动态段
.interp 动态链接器路径(如 /lib64/ld-linux-x86-64.so.2) 动态段