当我对ldd
等共享库运行libphp5.so
时,我发现它依赖于libmysqlclient.so.16
:
$ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [other dependencies snipped out]
这些依赖项文件名和路径(/usr/lib/mysql/libmysqlclient.so.16
)是否已烘焙到共享库二进制文件中?或者这条路径是通过其他方式确定的,例如via /etc/ld.so.conf.d/mysql-i386.conf
,它偶然包含:
/usr/lib/mysql/
另一件令我困惑的是:
我有一个共享库,我从源代码编译。这依赖于libmysqlclient_r
。 gcc
编译器切换为生成此库,如下所示:
gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches]
当我ldd mylib.so
时,我看到了:
libmysqlclient_r.so.16 => /usr/lib/mysql/libmysqlclient_r.so.16 (0x0055c000)
但是在/usr/lib/mysql
目录中,我看到了:
-rwxr-xr-x. libmysqlclient_r.so -> libmysqlclient_r.so.16.0.0 lrwxrwxrwx. libmysqlclient_r.so.16 -> libmysqlclient_r.so.16.0.0 -rwxr-xr-x. libmysqlclient_r.so.16.0.0 lrwxrwxrwx. libmysqlclient.so -> libmysqlclient.so.16.0.0 lrwxrwxrwx. libmysqlclient.so.16 -> libmysqlclient.so.16.0.0 -rwxr-xr-x. libmysqlclient.so.16.0.0
libmysqlclient_r.so
是libmysqlclient_r.so.16.0.0
的符号链接,为什么ldd
将依赖关系显示为libmysqlclient_r.so.16
。我有什么魔法吗?
多年来一直是Windows开发人员,我对gcc
和Linux上的开发有点新鲜。
我的Linux发行版是CentOS 6.0 x86-32bit。
答案 0 :(得分:14)
您可以通过
查看哪些路径来自哪里LD_DEBUG=libs ldd ./libphp5.so
这些依赖文件名和路径(/usr/lib/mysql/libmysqlclient.so.16)是否已烘焙到共享库二进制文件中?
文件名几乎肯定是。路径通常不是。您可以使用
查看烘焙到二进制文件中的内容readelf -d ./libphp5.so
查找(NEEDED)
和(RPATH)
条目。
同时给man ld.so
一个读数。有许多因素会影响动态加载程序搜索共享库的方式:ld.so.conf
,LD_LIBRARY_PATH
,可执行文件是否为suid
,glibc是如何配置的,-rpath
设置在链接时等等给出。
答案 1 :(得分:1)
这些依赖文件名和路径(/usr/lib/mysql/libmysqlclient.so.16)是否已烘焙到共享库二进制文件中?
是的,他们可以而且往往是。此处的关键字为-rpath
。但是,ld.conf也有说法。不幸的是,整个系统非常复杂。