1.Linux可执行程序

1.1静态链接

静态可执行程序包含所需的所有函数,换句话说,它们是“完整的”,因为这一原因,静态可执行程序不依赖任何外部库就可以运行

1.2动态链接

动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。

1.3静态可执行程序和动态可执行程序的大小比较

1.3.1查看/sbin/sln是否为静态链接的

[root@bjzhonggc ~]# ldd /sbin/sln

9551EFE36E1D4DB8BE2DDF5CB137CF3E

1.3.2查看/bin/ln是否为静态的

[root@bjzhonggc ~]# ldd /bin/ln

E02F3E6F088F4D4AAE9C9F9846B3DC79

1.3.3比较sln与其非静态同类ln的大小

[root@bjzhonggc ~]# ls -lh /bin/ln /sbin/sln

768FD5E2A15041F0BE3B42CCCB69EE6E

1.3.4结论

1sln的大小超过ln十倍。动态可执行程序ln依赖外部共享库libc.so.6ld-linux-x86-64.so.2。从而得知ln是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。

2ln通常动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级任务中发挥作用。例如,sln是修改位于/lib中的不同库符号链接的极佳工具。但通常几乎所有linux系统上的可执行程序都是某种动态链接的变体。

2动态装入器

动态装入器找到共享库要依靠两个文件 /etc/ld.so.conf/etc/ld.so.cache

ld.so.conf文件包含一个所有目录的清单,动态装入器将在其中查找共享库。

[root@bjzhonggc ~]# cat /etc/ld.so.conf

BFF02AB258B94C92B9AD724594300071

但在动态装入器能“看到”这一信息前,必须将它转换到ld.so.cache文件中。当ldconfig操作结束时,您会有一个最新的/etc/ld.so.cache文件,它反映您对/etc/ld.so.conf所做的更改。从这一刻起,动态装入器在寻找共享库时会查看/etc/ld.so.conf中指定的所有的新目录。

[root@bjzhonggc ~]# ldconfig

3ldconfig技巧

3.1使用ldconfig查看所有共享库

[root@bjzhonggc ~]# ldconfig -p |less

6D77581EA4E04FCAAB7B40D66A46BC88

3.2指定共享库路径

3.21原因

有时候需要动态装入器在尝试任何/etc/ld.so.conf路径以前先尝试使用特定目录中的共享库。在您运行较旧的应用程序不能与当前安装的版本库一起工作的情况下,这会比较方便。

3.2.2方法

LD_LIBRARY_PATH变量设置希望搜索的目录。多个路径之间要用冒号分割;导出LD_LIBRARY_PATH后,如有可能,所有从当前shell启动的可执行程序都将使用/usr/lib/old/opt/lib中的库,如果仍不能满足一些共享库相关性要求,则转回到/etc/ld.so.conf中指定的库。

[root@myweb ~]# export LD_LIBRARY_PATH="/usr/lib/old:/opt/lib"