7.7.共享库(Shared Libraries)

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显示的单位是否是字节?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值