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