【编译和链接九】静态链接
- 一、demo
- 二、空间与地址分配
-
- 1、相似段合并
- 三、即虚拟地址VMA(Virtual Memory Address)
- 四、重定位
-
- 1、add调用
- 2、printf调用——同add
- 2、shared
- 五、重定位表
- 六、符号解析
- 七、c++相关问题
-
- 1、重复代码消除
- 2、全局构造与析构
- 3、C++与ABI
- 八、静态库链接
一、demo
假设我们的程序只有这两个模块“main.c”和“add.c”。首先我们使用gcc将“main.c”和“add.c”分别编译成目标文件“main.o”和“add.o”:经过编译以后我们就得到了“main.o”和“add.o”这两个目标文件。
从代码中可以看到,“add.c”总共定义了两个全局符号,一个是变量“shared”,另外一个是函数“add”;“main.c”里面定义了一个全局符号就是“main”。模块“main.c”里面引用到了“add.c”里面的“add”和“shared”。我们接下来要做的就是把“main.o”和“add.o”这两个目标文件链接在一起并最终形成一个可执行文件“mainadd”。
- main.c
#include<stdio.h>
extern int shared;