在linux下一个二进制程序通常都会依赖于系统的动态链接库,它的原理是当程序运行的时候,动态地找到动态库并将其加载到自己的进程空间中去,本篇就来介绍一下动态库的搜索机制。
linux链接器为ld,它会在/etc/ld.so.conf文件中列出的目录中查找动态库,我本机的ld.so.conf文件内容如下:
include ld.so.conf.d/*.conf
可以看到,ld.so.conf支持用include指令引入其他配置,这样以来各个软件在安装时可以独立地添加库搜索路径,例如:
[leconte@localhost ~]$ ls /etc/ld.so.conf.d/
qt-i386.conf xorg-x11-i386.conf
可以看到qt和xorg分别将各自的配置放在ld.so.conf.d目录下,打开qt-i386.conf:
[leconte@localhost ~]$ cat /etc/ld.so.conf.d/qt-i386.conf
/usr/lib/qt-3.3/lib
可以看到,qt将/usr/lib/qt-3.3/lib/目录加入搜索路径。
另外,需要注意的是linux链接器在加载程序的时候不会总是先去解析一遍这些配置文件,ldconfig这个程序会事先负责解析ld.so.conf中的配置,将解析结果缓存在文件/etc/ld.so.cache中,链接器每次只需读取cache数据即可,这样可以大大加快加载的速度。
因此,每当你修改了ld.so.conf之后,都要记得手工执行一次ldconfig生成ld.so.cache,否则你的修改将不会生效。细心的话你会发现很多rpm包和deb包在新增了ld配置之后都会自动执行一次ldconfig的。
此外,如果没有在ld.so.conf中指定任何的路径,linux链接器也会默认在/usr/lib/和/lib/下进行寻找。