Linux 系统上有两类根本不一样的 Linux 可执行程序。第一类是静态连接的可执行程序。静态可执行程序包含执行所需的全部函数 — 换句话说,它们是“完整的”。由于这一缘由,静态可执行程序不依赖任何外部库就能够运行。linux
第二类是动态连接的可执行程序。shell
静态可执行程序与动态可执行程序比较
咱们能够用 ldd 命令来肯定某一特定可执行程序是否为静态连接的:
# ldd /sbin/sln
not a dynamic executable
“not a dynamic executable”是 ldd 说明 sln 是静态连接的一种方式。如今,让咱们比较 sln 与其非静态同类 ln 的大小:
# ls -l /bin/ln /sbin/sln
-rwxr-xr-x 1 root root 23000 Jan 14 00:36 /bin/ln
-rwxr-xr-x 1 root root 381072 Jan 14 00:31 /sbin/sln
如您所见,sln 的大小超过 ln 十倍。ln 比 sln 小这么可能是由于它是动态可执行程序。动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。less
动态连接相关性函数
要查看 ln 依赖的全部共享库的列表,能够使用 ldd 命令:
# ldd /bin/ln
libc.so.6 => /lib/libc.so.6 (0x40021000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)工具
如您所见,ln 依赖外部共享库 libc.so.6 和 ld-linux.so.2。一般,动态连接的程序比其静态连接的等价程序小得多。不过,静态连接的程序能够在某些低级维护任务中发挥做用。例如,sln 是修改位于 /lib 中的不一样库符号连接的极佳工具。但一般您会发现几乎全部 Linux 系统上的可执行程序都是某种动态连接的变体。qt
动态装入器table
那么,若是动态可执行程序不包含运行所需的全部函数,Linux 的哪部分负责将这些程序和全部必需的共享库一块儿装入,以使它们能正确执行呢?答案是动态装入器(dynamic loader),它其实是您在 ln 的 ldd 清单中看到的做为共享库相关性列出的 ld-linux.so.2 库。动态装入器负责装入动态连接的可执行程序运行所需的共享库。如今,让咱们迅速查看一下动态装入器如何在系统上找到适当的共享库。变量
ld.so.confgcc
动态装入器找到共享库要依靠两个文件 — /etc/ld.so.conf 和 /etc/ld.so.cache。若是您对 /etc/ld.so.conf 文件进行 cat 操做,您可能会看到一个与下面相似的清单:配置
$ cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/lib/gcc-lib/i686-pc-linux-gnu/2.95.3
/usr/lib/mozilla
/usr/lib/qt-x11-2.3.1/lib
/usr/local/lib
ld.so.conf 文件包含一个全部目录(/lib 和 /usr/lib 除外,它们会自动包含在其中)的清单,动态装入器将在其中查找共享库。
ld.so.cache
可是在动态装入器能“看到”这一信息以前,必须将它转换到 ld.so.cache 文件中。能够经过运行 ldconfig 命令作到这一点:
# ldconfig
当 ldconfig 操做结束时,您会有一个最新的 /etc/ld.so.cache 文件,它反映您对 /etc/ld.so.conf 所作的更改。从这一刻起,动态装入器在寻找共享库时会查看您在 /etc/ld.so.conf 中指定的全部新目录。
ldconfig 技巧
要查看 ldconfig 能够“看到”的全部共享库,请输入:
# ldconfig -p | less
还有另外一个方便的技巧能够用来配置共享库路径。有时候您但愿告诉动态装入器在尝试任何 /etc/ld.so.conf 路径之前先尝试使用特定目录中的共享库。在您运行的较旧的应用程序不能与当前安装的库版本一块儿工做的状况下,这会比较方便。
LD_LIBRARY_PATH
要指示动态装入器首先检查某个目录,请将 LD_LIBRARY_PATH 变量设置成您但愿搜索的目录。多个路径之间用冒号分隔;例如:
# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"
导出 LD_LIBRARY_PATH 后,若有可能,全部从当前 shell 启动的可执行程序都将使用 /usr/lib/old 或 /opt/lib 中的库,若是仍不能知足一些共享库相关性要求,则转回到 /etc/ld.so.conf 中指定的库。