本章以 如何将a.c文件与b.c文件链接成一个可执行文件 来探讨如何进行静态链接
其中a.c和b.c文件如下:
a.c文件
extern int shared;
int main()
{
int a = 100;
swap(&a,&shared);
}
b.c文件
int shared = 1;
void swap(int* a, int* b)
{
*a ^= *b ^= *a ^= *b;
}
首先将他们编译成目标文件“a.o”和“b.o”
从代码中可以看到,b.c中定义了两个全局符号:变量shared和函数swap();a.c中定义了一个全局符号main;a.c引入了b.c中的shared和swap。接下来把a.o和b.o两个目标文件链接成一个可执行文件ab.
4.1 空间地址分配
对于多个输入目标文件,链接器如何将它们的各个段合并到一个输出文件?
方法一:按序叠加
缺点:由于地址和空间对齐的关系,会造成内存空间大量的碎片
方法二:相似段合并(现在链接器基本都采用这个方法)
”链接器为目标文件分配地址和空间“:这里既指在输出的可执行文件中的空间、也指装载后的虚拟地址的空间。
但对.bss段来说只限于后者。
一般分两步:
(1)空间与地址分配
扫描所有输入文件,并获得