7.7.共享库(Shared Libraries)
今天,大部分的UNIX系统都支持共享库。Arnold在System V下描述了一个早期的实现,后来Gingell et al在SunOS下描述了一个不同的实现。共享库从可执行文件中移走了common library routines,取而代之的是在内存中保留了一份所有进程都会涉及到的库的拷贝(a single copy of the library routine )。这种做法的一个优势是减少了每个可执行文件的大小,但是却增加了一些运行时的开销(runtime overhead),不论是一个程序第一次被执行还是一个共享库函数第一次被调用。共享库的另一个优势是当库函数被更新版本的库函数更新时,不需要去重新再次连接编辑每个用到共享库的程序。(This assumes that the number and type of arguments haven't changed.)
对于一个程序,也许它想使用或者不想使用共享库,不同的系统提供了不同的方式去实现。命令cc和ld的选项就是个典型。以一个a.out的大小为例子,经典的hello.c程序,第一次不使用共享库来创建a.out:
$ cc -static hello1.c 用选项-static阻止gcc使用共享库
$ ls -l a.out
-rwxrwxr-x 1 sar 475570 Feb 18 23:17 a.out
$ size a.out
text data bss dec hex filename
375657 3780 3220 382657 5d6c1 a.out
如果我们使用共享库来编译这个程序,可执行文件a.out的代码段和数据段的大小会有显著的降低:
$ cc hello1.c gcc默认是使用共享库的
$ ls -l a.out
-rwxrwxr-x 1 sar 11410 Feb 18 23:19 a.out
$ size a.out
text data bss dec hex filename
872 256 4 1132 46c a.out
-----------------------------
通过以上对比可以看到,共享库的确是能够显著地减少最后形成的可执行文件的大小。
需要补充的:
1.目标文件连接成一个可执行文件的过程,使用common library routines和使用共享库的。
2.命令size显示的单位是否是字节?