|
发表于 2004-1-12 22:32:15
|
显示全部楼层
静态连接的说明
除了特殊的任务外,许多程序还要执行很多常用和琐碎的操作,比如分配内存,搜索目录,打开和关闭文件,读写它们,操作字符串,模式匹配,数学计算等等。为了避免让每个程序都“重新发明轮子”(意为重复的创新),GNU 系统以库文件的方式提供这些基本功能和函数。任何一个 Linux 系统中最重要的库都是 glibc。
将库文件中的函数连接到使用它们的程序中,有两种方法:静态连接或动态连接。当一个程序是静态连接时,它使用的函数会包含在可执行文件中,结果就是比较大的执行文件。当一个程序是动态连接时,可执行文件中包含的是针对连接器的引用,说明了要使用的库文件名称,以及使用的函数名称,结果就是执行文件要小多了。这个可执行文件在某种程度上比静态连接的要慢,因为在运行时连接要花一些时间。(还有第三种方法,是使用动态连接器的可编程接口,参见dlopen的man文档,以获得更多信息。)
动态连接是Linux上的缺省用法,有三个主要的优点。首先,你只需要在硬盘上有一份可执行的库文件代码,而不是在不同程序里有很多份相同的代码 -- 这样就节省了硬盘空间。第二,当几个程序同时使用同样的库函数,只需要有一份函数代码存在于内存中 -- 这样就节省了内存。第三,当库函数修正了一个 bug 后,或是做了某种程度的改进后,你只需要重新编译这个库文件,而不是重新编译所有使用已改进函数的那些程序。
为什么我们要在本章的前两个软件包里使用静态连接呢?有三方面的原因,历史原因,教育价值和技术考虑。历史上来说,以前的LFS第五章里使用静态连接来编译每一个程序。教育价值在于了解动态连接和静态连接的区别是非常有用的。从技术上说,我们可以得到独立于主系统的可执行文件。然而,应该注意,即使前两个软件包是动态连接的,还是能成功的编译LFS系统。 |
|