Linux上如何确定共享库依赖路径?

Linux上如何确定共享库依赖路径?,linux,gcc,dependencies,shared-libraries,ldd,Linux,Gcc,Dependencies,Shared Libraries,Ldd,当我对共享库(如libphp5.so运行ldd时,我发现它依赖于libmysqlclient.so.16: $ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [other dependencies snipped out] 还有一件事让我感到困惑: 我有一个从源代码编译的共享库。这依赖于libmysqlclient\r。生成此库的gcc编译器开关如下所示: gcc -shared -L/

当我对共享库(如
libphp5.so
运行
ldd
时,我发现它依赖于
libmysqlclient.so.16

$ ldd ./libphp5.so libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 [other dependencies snipped out] 还有一件事让我感到困惑:

我有一个从源代码编译的共享库。这依赖于
libmysqlclient\r
。生成此库的
gcc
编译器开关如下所示:

gcc -shared -L/usr/lib/mysql -lmysqlclient_r [+various other switches] 但是在
/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 -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\u r.so
是指向
libmysqlclient\u r.so.16.0.0
的符号链接,那么为什么
ldd
将依赖项显示为
libmysqlclient\u r.so.16
。这里有我错过的魔法吗

作为Windows开发人员多年,我对
gcc
和Linux上的开发有些陌生

我的Linux发行版是CentOS 6.0 x86-32位

这些依赖文件名和路径(/usr/lib/mysql/libmysqlclient.so.16)是否已烘焙到共享库二进制文件中


是的,他们可以而且经常是。这里的关键字是
-rpath
。然而,ld.conf也有自己的发言权。不幸的是,整个系统相当复杂。

通过运行,您可以看到哪些路径来自何处

LD_DEBUG=libs ldd ./libphp5.so
这些依赖文件名和路径(/usr/lib/mysql/libmysqlclient.so.16)是否已烘焙到共享库二进制文件中

文件名几乎肯定是。路径通常不是。你可以看到什么被烘焙到二进制文件中

readelf -d ./libphp5.so
查找
(需要)
(RPATH)
条目


还应读取
man-ld.so
。影响动态加载程序如何搜索共享库的因素有很多:
ld.so.conf
ld\u LIBRARY\u PATH
,可执行文件是否为
suid
,glibc是如何配置的,链接时给出了哪些
-rpath
设置,等等。

您不知道,但我希望我能投更多的票。我的问题源于无法加载Python cheese shop包(MySQL Python)中使用的
libmysqlclient\r
,尽管它编译/构建得很好
LD_DEBUG=libs ldd
我的生活更安全。结果表明,保存在
/etc/ld.co.conf.d
中的路径文件不是以
.conf
结尾的,我的
/etc/ld.so.conf
文件指定:
包含ld.so.conf.d/*.conf
。因此,
/usr/lib/mysql
文件夹从未被搜索过。
LD_DEBUG=libs ldd ./libphp5.so
readelf -d ./libphp5.so