|
发表于 2004-4-3 22:04:13
|
显示全部楼层
lfs文档对此有详细的说明。
首先引用一段文字来说明静态链接。
静态连接的说明
除了特殊的任务外,许多程序还要执行很多常用和琐碎的操作,比如分配内存,搜索目录,打开和关闭文件,读写它们,操作字符串,模式匹配,数学计算等等。为了避免让每个程序都“重新发明轮子”(意为重复的创新),GNU 系统以库文件的方式提供这些基本功能和函数。任何一个 Linux 系统中最重要的库都是 glibc。
将库文件中的函数连接到使用它们的程序中,有两种方法:静态连接或动态连接。当一个程序是静态连接时,它使用的函数会包含在可执行文件中,结果就是比较大的执行文件。当一个程序是动态连接时,可执行文件中包含的是针对连接器的引用,说明了要使用的库文件名称,以及使用的函数名称,结果就是执行文件要小多了。这个可执行文件在某种程度上比静态连接的要慢,因为在运行时连接要花一些时间。(还有第三种方法,是使用动态连接器的可编程接口,参见dlopen的man文档,以获得更多信息。)
至于静态链接的实现,在lfs文档的第五章几乎都是这类例子。我用"第五章binutils的第一次安装"来说明一下。
- ../binutils-2.14/configure \
- --prefix=/tools --disable-nls
复制代码
可见,静态编译对于不同的程序需要不同的configure配置(如果需要的话)。这里添加--disable-nls选项的出发点是"静态程序不需要国际化的特性,并且在静态连接时nls常常引起错误"。
- make configure-host
- make LDFLAGS="-all-static"
复制代码
make是静态链接最关键的一步,传递静态链接的参数。lfs的解释如下:
LDFLAGS="-all-static": 这个参数告诉连接器,把 Binutils 软件包中所有的程序都静态连接。然而,严格地说,首先是"-all-static" 被传递给libtool,libtool再把"-static" 传递给连接器。
总而言之,如果要静态编译一个源码包,除了上面的LDFLAGS外,还要参见源码包附带的文档跟进更详细的做法。
题外话地说,在下学Linux是从lfs开始入门的,它涉及了一个系统的很多细节,我建议大家有空的话,最好做一次lfs,把这些细节理清,为后续的学习扫清不必要障碍。 |
|