当前位置:嗨网首页>书籍在线阅读

19-总结

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

41.14 总结

目标库是一组编译过的目标模块的聚合,它可以用来与程序进行链接。与其他UNIX实现一样,Linux提供了两种目标库:一种是静态库,在早期的UNIX系统中只存在这种库,还有一种是更加现代的共享库。

由于与静态库相比,共享库存在很多优势,因此在当代UNIX系统上共享库用得最多。共享库的优势主要源自这样一个事实,即当一个程序与库进行链接时,程序所需的目标模块的副本不会被包含进结果可执行文件中。相反,(静态)链接器将会在可执行文件中添加与程序在运行时所需的共享库相关的信息。当文件被执行时,动态链接器会使用这些信息来加载所需的共享库。在运行时,所有使用同一共享库的程序共享该库在内存中的单个副本。由于共享库不会被复制到可执行文件中,并且在运行时所有程序都使用共享库在内存中的单个副本,因此共享库能够降低系统所需的磁盘空间和内存。

共享库soname为在运行时接续共享库引用提供了一层间接。如果一个共享库拥有一个soname,那么在由静态链接器产生的可执行文件中将会记录这个soname,而不是库的真实名称。根据共享库命名规范,其真实名称的形式为libname.so.major-id.minor-id,其soname的形式为libname.so.major-id。这种规范使得程序能够自动使用共享库的最新次要版本(无需重新链接程序),同时也允许创建库的新的不兼容的主要版本。

为了在运行时能够找到共享库,动态链接器遵循了一组标准的搜索规则,其中包括搜索一组大多数共享库安装的目录(如/lib和/usr/lib)。

更多信息

在ar(1)、gcc(1)、ld(1)、ldconfig(8)、ld.so(8)、dlopen(3)和objdump(1)手册以及ld和readelf的info文档中可以找到与静态库和共享库相关的各种信息。[Drepper, 2004 (b)]介绍了很多在Linux上编写共享库的细节信息。在David Wheeler撰写的“Program Library HOWTO”中可以找出更多有用的信息,该书的在线版本位于PDP网站http://www.tldp.org/上。GNU共享库模型与Solaris上的实现存在很多相似之处,因此阅读一下Sun的“Linker and Libraries Guide”(在http://docs.sun.com/上可以找到)以获取更多信息和例子是有必要的。[Levine, 2000]对静态和动态链接器的操作进行了介绍。

在在线站点http://www.gnu.org/software/libtool和[Vaughan et al., 2000]中可以找到有关GNU Libtool的信息,它是一个用来向程序员隐藏构建共享库时碰到的特定于实现的细节的工具。

Tools Interface Standards委员会撰写的“Executable and Linking Format”文档提供了ELF的细节,在http://refspecs.freestandards.org/elf/elf.pdf上能够找到这篇文档。[Lu, 1995]也提供了很多与ELF有关的有用细节。