分类: 系统运维
2012-03-29 12:54:40
当今多数UNIX系统支持共享库。Arnold[1986]描述了一个在System
V下的早期实现,而Gingell等[1987]描述了在SunOS下的一个不同的实现。共享库从可执行文件中删除了通用的库程序,取而代之的是维护一个
所有进程引用的内存里某处的库程序的单一拷贝。这减少了每个可执行程序文件的尺寸,但增加了运行时的开销,当程序第一次被执行或每个共享库函数被调用时。
共享库的另一个好处是库函数可以用新的版本代替,而不用重链接每个使用这个库的程序。(这假设参数的数量和类型没有改变。)
不同的系统为一个程序提供了不同的方法来表明它是否想使用共享库。cc和ld命令的选项是典型的。作为一个尺寸区别的例子,下面的可执行文件--经典的hello world程序--不使用共享库而被创建:
$ cc -static hello_world.c
$ ls -l a.out
-rwxrwxr-x 1 tommy tommy 644429 2012-02-27 21:49 a.out
$ size a.out
text data bss dec hex filename
575523 2056 7048 584627 8ebb3 a.out
如果我们使用共享库来编译这个程序,这个可执行程序的代码和数据尺寸会大幅减少:
$ cc hello_world.c
$ ls -l a.out
-rwxrwxr-x 1 tommy tommy 7165 2012-02-27 21:51 a.out
$ size a.out
text data bss dec hex filename
1132 256 8 1396 574 a.out