深入理解计算机系统-----静态链接

1、创建两个C文件。

2、并通过gcc -c addvec.c multvec.c生成可重定位文件。可以看到生成了两个.o文件。

3、创建函数的静态库需要使用AR工具。

创建一个.h文件,声明这两个函数。

格式:ar rcs  libxxx.a xx1.o xx2.o

参数 r:在库中插入模块 (替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar 显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。【1】

参数 c:创建一个库。不管库是否存在,都将创建。

参数 s:创建目标文件索引,这在创建较大的库时能加快时间。(补充:如果不需要创建索引,可改成大写 S 参数;如果. a 文件缺少索引,可以使用 ranlib 命令添加)

4、编写应用程序,使用其中上面生成的静态库。

5、创建可执行文件,需要编译main2.c ,并且链接libvector.a。生成可执行文件。

下图是链接器的行为:

-static参数告诉编译器,链接器应该构建一个完全链接的可执行文件,可以加载到内存直接执行。当链接器运行时,他判定main2.o引用了addvec.o定义的addvec符号,所以链接器复制addvec.o到可执行文件,但是程序没有引用任何multvec.o的符号,所以链接器就不会复制这个模块到可执行文件。并且还会复制libc.a中的printf.o模块。

 

 

      

posted @ 2018-12-29 16:20  吾之求索  阅读(142)  评论(0)    收藏  举报