linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘建议留言网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 专题栏目 > LPI >
栏目导栏
  LPI
  cisco
资料搜索
热门文章
·LPI 101认证学习1-硬件和体系结
· LPI 101认证学习7-Linux安装与
·LPI 101认证学习26-X Window 系
·LPI 101认证学习8-Linux安装与
·LPI 101认证学习15-GNU和UNIX命
·LPI 101认证学习28-X Window 系
·LPI 101认证学习10-Linux安装与
·LPI 101认证学习11-GNU和UNIX命
·LPI 101&102 2007年考试大纲
·LPI 101认证学习18-设备、Linu
·LPI 101认证学习27-X Window 系
·LPI 101认证学习14-GNU和UNIX命
·LPI 101认证学习12-GNU和UNIX命
·LPI考试流程
· LPI 101认证学习9-Linux安装与
最新文章
·LPI 101&102 2007年考试大纲
·LPI 302中文考试大纲
·LPI 301中文考试大纲
·LPIC-3认证考试内容最终确定
·LPI 101认证学习28-X Window 系
·LPI 101认证学习27-X Window 系
·LPI 101认证学习26-X Window 系
·LPI 101认证学习25-设备、Linu
·LPI 101认证学习24-设备、Linu
·LPI 101 学习指南:一.安装网络
·LPI 101 学习指南:一.安装 本地
· 安装光盘介绍(The Installati
·LPI 101认证学习23-设备、Linu
·LinuxWorld上海开展 LPI与众多
·LPI 和 Canonical 联合发布Ubu
Google
 
LPI 101认证学习8-Linux安装与包管理之管理共享库
[ 作者:  加入时间:2006-11-16 15:00:44  来自:Linux联盟 ]

LPI 101考试第二部分Linux安装与包管理的第四节:管理共享库TXRLinux联盟

管理共享库

本节讨论初级管理(LPIC-1)考试 101 的主题 1.102.4 的内容。这个主题的权值是 3

在本节中,您将学习如何确定可执行程序所依赖的共享库,了解放置系统库的位置。在本教程的下面几节中,我们将讨论安装包,包括共享库。

静态和动态可执行程序

Linux 系统有两类可执行程序。

1.      静态链接的 可执行程序包含它们所需的所有库函数。所有库函数都链接到可执行程序中。它们是完整的程序,不依赖于外部的库。静态链接程序的优点是它们不要求事先安装任何东西就可以运行。

2.      动态链接的 可执行程序要小得多,是不完整的,需要来自外部共享 库的函数才能运行。除了更小之外,动态链接还允许包指定依赖的库,而不需要将库包含在包中。使用动态链接还允许许多运行的程序共享库的一个副本,这就避免了相同代码的许多副本占据内存。由于这些原因,当今的大多数程序采用动态链接。

在典型的 Linux 系统上,一个有意思的例子是 ln/bin/ln)命令,它在文件之间创建链接,包括 链接和(或符号)链接。共享库常常涉及库的通用名和库的特定级别之间的符号链接,所以如果链接不起作用了,那么可能是 ln 命令出故障了。为了防止这种情况,Linux 系统包含 ln 程序的一个静态链接版本,即 sln 程序(/sbin/sln)。清单 19 展现这两个程序在大小方面的巨大差异。

TXRLinux联盟
清单 19. sln ln 的大小

 

                                     

[ian@lyrebird ian]$ ls -l /sbin/sln; ls -l /bin/ln

-rwxr-xr-x    1 root     root       457165 Feb 23  2005 /sbin/sln

-rwxr-xr-x    1 root     root        22204 Aug 12  2003 /bin/ln

ldd 命令

知道了静态链接的程序可能比较大之后,又如何判断程序是否是静态链接的呢?而且,如果程序是动态链接的,又如何知道它需要哪些库呢?这两个问题的答案都是使用 ldd 命令,这个命令显示可执行程序的库需求信息。清单 20 显示 ldd 命令对于 ln sln 可执行程序的输出。

TXRLinux联盟
清单 20. ldd 对于 sln ln 的输出

 

                                     

[ian@lyrebird ian]$ ldd /sbin/sln /bin/ln

/sbin/sln:

        not a dynamic executable

/bin/ln:

        libc.so.6 => /lib/tls/libc.so.6 (0x00ebd000)

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00194000)

 

因为 ldd 实际上关注动态链接,所以通过显示 “not a dynamic executable” 来表示 sln 是静态链接的;对于 ln 命令,它指出两个共享库的名称(libc.so.6 ld-linux.so.2)以及这些库的位置。注意,.so 表示这些是共享对象 或动态库。在清单 21 中,我们使用 ls -l 命令显示这些实际上是库的特定版本的符号链接。

TXRLinux联盟
清单 21. 库符号链接

 

                                     

[ian@lyrebird ian]$ ls -l /lib/tls/libc.so.6; ls -l /lib/ld-linux.so.2

lrwxrwxrwx    1 root   root       13 May 18 16:24 /lib/tls/libc.so.6 -> libc-2.3.2.so

lrwxrwxrwx    1 root   root       11 May 18 16:24 /lib/ld-linux.so.2 -> ld-2.3.2.so

动态装载

您可能会吃惊,ld-linux.so 看起来像共享库,但是实际上它本身就是一个可执行程序。这是负责执行动态装载的代码。它从可执行程序读取头信息,这些信息采用 Executable and Linking Format(即 ELF)格式。它通过这些信息判断必要的库和需要装载的库。然后,它执行动态链接,修改可执行程序和装载的库中的所有地址指针,使程序能够运行。

您找不到 ld-linux.so 的手册页,但是 ld.so 的手册页(man ld.so)中提到了它。清单 22 演示使用 ld-linux.so  --list 选项显示 ln 命令的库需求信息,这与清单 20 中用 ldd 命令显示的信息相同。

TXRLinux联盟
清单 22. 使用 ld-linux.so 显示库需求信息

 

                                     

[ian@lyrebird ian]$ /lib/ld-linux.so.2 --list /bin/ln

        libc.so.6 => /lib/tls/libc.so.6 (0x00a83000)

        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00f2c000)

 

注意,这两个清单中的十六进制地址是不同的,这在两次运行 ldd 时也可能不同。

动态库配置

那么,动态装载程序如何知道去哪里寻找可执行程序呢?与 Linux 上的许多东西一样,在 /etc 中有配置文件。实际上,有两个配置文件,即 /etc/ld/so/conf /etc/ld.so.cache。清单 23 显示两个不同系统上 /etc/ld.so.conf 的内容。注意,在 attic4 系统上(运行 fedora Core 4),/etc/ld.so.conf 指定应该包含来自子目录 ld.so.conf.d 的所有 .conf 文件。在您的系统上,/etc/ld.so.conf 文件的实际内容可能不一样。

TXRLinux联盟
清单 23. /etc/ld.so.conf 的内容

 

                                     

[ian@lyrebird ian]$ cat /etc/ld.so.conf

/usr/kerberos/lib

/usr/X11R6/lib

/usr/lib/qt-3.1/lib

[

[ian@attic4 ~]$ cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

 

程序的装载需要快速,所以 ld.so.conf 被传递给 ldconfig 命令,以便处理来自 ld.so.conf.d 的所有库以及来自受信任目录(/lib /usr/lib)的库。动态装载程序使用 ld.conf.cache 文件定位要动态装载和链接的文件。如果修改了 ld.so.conf(或者在 ld.so.conf.d 中添加了新的包含文件),那么必须运行 ldconfig 命令(作为根用户)来重新构建 ld.conf.cache 文件。

一般情况下,使用 ldconfig 命令(不带参数)来重新构建 ld.so.cache。可以指定几个参数来覆盖默认行为。与往常一样,使用 man ldconfig 获得更多信息。清单 24 使用 -p 参数显示 ld.so.cache 的内容。

TXRLinux联盟
清单 24. 使用 ldconfig 显示 ld.so.cache

 

                                     

[ian@lyrebird ian]$ /sbin/ldconfig -p | more

768 libs found in cache `/etc/ld.so.cache'

        libzvt.so.2 (libc6) => /usr/lib/libzvt.so.2

        libz.so.1 (libc6) => /usr/lib/libz.so.1

        libz.so (libc6) => /usr/lib/libz.so

        libx11globalcomm.so.1 (libc6) => /usr/lib/libx11globalcomm.so.1

        libxsltbreakpoint.so.1 (libc6) => /usr/lib/libxsltbreakpoint.so.1

        libxslt.so.1 (libc6) => /usr/lib/libxslt.so.1

        libxmms.so.1 (libc6) => /usr/lib/libxmms.so.1

        libxml2.so.2 (libc6) => /usr/lib/libxml2.so.2

        libxml2.so (libc6) => /usr/lib/libxml2.so

        libxmltok.so.0 (libc6) => /usr/lib/libxmltok.so.0

        libxmlparse.so.0 (libc6) => /usr/lib/libxmlparse.so.0

        libxml.so.1 (libc6) => /usr/lib/libxml.so.1

        libxerces-c.so.24 (libc6) => /usr/lib/libxerces-c.so.24

        ...

        lib-gnu-activation-20030319.so (libc6) => /usr/lib/lib-gnu-activation-20030319.so

        ld-linux.so.2 (ELF) => /lib/ld-linux.so.2

 

如果正在运行一个老式应用程序,它需要一个共享库的旧版本,或者您正在开发新的共享库或共享库的新版本,那么可能希望覆盖装载程序使用的默认搜索路径。在脚本使用产品特有的共享库(安装在 /opt 树中)时,也可能需要这么做。

正如可以通过设置 PATH 变量来指定可执行程序的搜索路径一样,可以将 LD_LIBRARY_PATH 变量设置为搜索共享库的目录列表(用冒号分隔),搜索这些目录之后才会搜索在 ld.so.cache 中指定的系统目录。例如,可以使用下面这样的命令:

export LD_LIBRARY_PATH=/usr/lib/oldstuff:/opt/IBM/AgentController/lib

在本教程的其余几节中,我们将讨论包管理。

Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论

评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 · LPI 101认证学习7-Linux安装与包管理之构建和安装程序  (2006-11-15 20:55:48)
 ·LPI 101认证学习6-Linux安装与包管理之安装引导管理程序  (2006-11-14 15:01:51)
 ·LPI 101认证学习5-Linux安装与包管理之硬盘布局  (2006-11-13 15:44:28)
 ·LPI 101认证学习4-硬件和体系结构之PC扩展卡,通信设备和USB设备  (2006-11-12 13:39:26)
 ·LPI 101认证学习3-硬件和体系结构之设置 SCSI 设备  (2006-11-11 13:44:55)
 ·LPI 101认证学习2-硬件和体系结构之调治解调器和声卡  (2006-11-10 13:47:00)
 ·LPI 101认证学习1-硬件和体系结构之基BIOS设置  (2006-11-09 14:39:48)