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



当我对共享库(如libphp5.so)运行ldd时,我看到它依赖于libmysqlclient.so.16:

<>之前$ LDD ./libphp5.solibmysqlclient.so。16 =>/usr/lib/mysql/libmysqlclient.so.16[删除其他依赖项]之前

这些依赖文件名和路径(/usr/lib/mysql/libmysqlclient.so.16)被烤到共享库二进制文件吗?或者这个路径是由其他方式确定的,比如通过/etc/ld.so.conf.d/mysql-i386.conf,顺便包含:

/usr/lib/mysql/

还有一件事让我很困惑:

有一个我从源代码编译的共享库。这依赖于libmysqlclient_rgcc编译器切换到生成如下这个库:

<>之前-lmysqlclient_r[+其他开关]之前

当我执行ldd mylib.so时,我看到:

<>之前libmysqlclient_r.so。16 =>/usr/lib/mysql/libmysqlclient_r.so.16(0 x0055c000)之前

但是在/usr/lib/mysql目录中我看到:

<>之前-rwxr-xr-x。libmysqlclient_r。So -> libmysqlclient_r.s So .16.0.0lrwxrwxrwx。libmysqlclient_r.so。16 -> libmysqlclient_r.so.16.0.0-rwxr-xr-x。libmysqlclient_r.so.16.0.0lrwxrwxrwx。libmysqlclient。libmysqlclient.so.16.0.0lrwxrwxrwx。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.

您可以通过运行

查看路径来自何处
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设置,等等。

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

是的,它们可以而且经常是。这里的关键字是-rpath。但是,ld.conf也有它的发言权。遗憾的是,整个系统相当复杂。

最新更新