Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

第4章 静态链接

4.1 空间与地址分配

4.2 符号解析与重定位

4.3 COMMON块

4.4 C++相关问题

4.5 静态库链接

4.6 链接过程控制

4.7 BFD库

4.8 本章小结

通过前面对ELF文件格式的介绍,使我们对ELF目标文件从整体轮廓到某些局部的细节都有了一定的了解。接下来的问题是:当我们有两个目标文件时,如何将它们链接起来形成一个可执行文件?这个过程中发生了什么?这基本上就是链接的核心内容:静态链接。在这一节里,我们将使用下面这两个源代码文件"a.c"和"b.c"作为例子展开分析:

假设我们的程序只有这两个模块"a.c"和"b.c"。首先我们使用gcc将"a.c"和"b.c"分别编译成目标文件"a.o"和"b.o":

gcc -c a.c b.c

经过编译以后我们就得到了"a.o"和"b.o"这两个目标文件。从代码中可以看到,"b.c"总共定义了两个全局符号,一个是变量"shared",另外一个是函数"swap";"a.c"里面定义了一个全局符号就是"main"。模块"a.c"里面引用到了"b.c"里面的"swap"和"shared"。我们接下来要做的就是把"a.o"和"b.o"这两个目标文件链接在一起并最终形成一个可执行文件"ab"。