在Linux上如何确定共享库依赖path?

当我对libphp5.so这样的共享库运行ldd ,我发现它对libmysqlclient.so.16有依赖关系:

 $ ldd ./libphp5.so
 libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16 
 [其他依赖关系被删除]

这些依赖文件名和path( /usr/lib/mysql/libmysqlclient.so.16 )是否被烘焙到共享库二进制文件中? 或者这个path是通过/etc/ld.so.conf.d/mysql-i386.conf等其他方法来确定的,它偶然包含:

 /usr/lib/mysql/ 

另外一件令我困惑的事情是:

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

 gcc -shared -L / usr / lib / mysql -lmysqlclient_r [+其他各种开关]

当我做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.solibmysqlclient_r.so的符号链接,为什么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.confLD_LIBRARY_PATH ,可执行文件是否为suid ,glibc如何配置,在链接时给出哪些-rpath设置等。

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

是的,他们可以,而且往往是。 这里的关键字是-rpath 。 不过,ld.conf也有说法。 不幸的是整个系统非常复杂。