1.Linux可执行程序
1.1静态链接
静态可执行程序包含所需的所有函数,换句话说,它们是“完整的”,因为这一原因,静态可执行程序不依赖任何外部库就可以运行
1.2动态链接
动态可执行程序是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。
1.3静态可执行程序和动态可执行程序的大小比较
1.3.1查看/sbin/sln是否为静态链接的
[root@bjzhonggc ~]# ldd /sbin/sln
1.3.2查看/bin/ln是否为静态的
[root@bjzhonggc ~]# ldd /bin/ln
1.3.3比较sln与其非静态同类ln的大小
[root@bjzhonggc ~]# ls -lh /bin/ln /sbin/sln
1.3.4结论
1)sln的大小超过ln十倍。动态可执行程序ln依赖外部共享库libc.so.6和ld-linux-x86-64.so.2。从而得知ln是不完整的程序,它依靠外部共享库来提供运行所需的许多函数。
2)ln通常动态链接的程序比其静态链接的等价程序小得多。不过,静态链接的程序可以在某些低级任务中发挥作用。例如,sln是修改位于/lib中的不同库符号链接的极佳工具。但通常几乎所有linux系统上的可执行程序都是某种动态链接的变体。
2动态装入器
动态装入器找到共享库要依靠两个文件 /etc/ld.so.conf和/etc/ld.so.cache。
ld.so.conf文件包含一个所有目录的清单,动态装入器将在其中查找共享库。
[root@bjzhonggc ~]# cat /etc/ld.so.conf
但在动态装入器能“看到”这一信息前,必须将它转换到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
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"