链接的一些代码实现

mac2022-07-05  27

1. ELF 的文件格式:

1.源代码:

/* main2.c */ /* $begin main2 */ #include <stdio.h> #include "vector.h" int x[2] = {1, 2}; int y[2] = {3, 4}; int z[2]; int main() { addvec(x, y, z, 2); printf("z = [%d %d]\n", z[0], z[1]); return 0; } /* $end main2 */

使用readelf -s main2.o可以查看可重定位目标文件的各条目: 条目是位于.text节偏移量为0处的24字节函数,位于data节偏移量0处的8字节目标,最后是外部符号sum的引用。

2.使用readelf -h main2.o查看ELF头

ELF头: 可以在里面查看ELF头的各种信息。

2. 链接的基本框架如图所示:

源代码:

/* main2.c */ /* $begin main2 */ #include <stdio.h> #include "vector.h" int x[2] = {1, 2}; int y[2] = {3, 4}; int z[2]; int main() { addvec(x, y, z, 2); printf("z = [%d %d]\n", z[0], z[1]); return 0; } /* $end main2 */ /* addvec.c */ /* $begin addvec */ int addcnt = 0; void addvec(int *x, int *y, int *z, int n) { int i; addcnt++; for (i = 0; i < n; i++) z[i] = x[i] + y[i]; } /* $end addvec */ /* multvec.c */ /* $begin multvec */ int multcnt = 0; void multvec(int *x, int *y, int *z, int n) { int i; multcnt++; for (i = 0; i < n; i++) z[i] = x[i] * y[i]; } /* $end multvec */

链接的时候,链接器对于栈里面的变量不感兴趣,即对局部变量不感兴趣,因为局部变量不会影响链接时候文件的依赖关系。 对于多重定义的全局变量有着以下是三个原则(强,弱全局变量原则,函数或者已经初始化的全局变量是强符号,未初始化的全局变量是弱符号): 1.规则一:不允许有多个弱符号。 2.规则二:如果有一个强符号和多个弱符号,那么选择强符号。 3.规则三:如果有多个弱符号,那么从弱符号里面随机选择一个。 (尽量使用static定义静态变量,而避免全局变量,避免出现不可预测的错误)

使用ar工具ar rcs libvector.a addvec.o multvec.o 创建一个静态库,名字为:libvector.a,之后其他程序就能调用这个静态库,使用方便 使用gcc -static -o prog2c main2.o ./libvector.a 创建可执行文件,名字为prog2c,之后可进行执行。

静态库必须出现在引用这个的目标文件之后,不然会出现:

最新回复(0)