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

时间:2011-11-17 16:18:20

标签: linux gcc dependencies shared-libraries ldd

当我对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_rgcc编译器切换为生成此库,如下所示:

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.solibmysqlclient_r.so.16.0.0的符号链接,为什么ldd将依赖关系显示为libmysqlclient_r.so.16。我有什么魔法吗?

多年来一直是Windows开发人员,我对gcc和Linux上的开发有点新鲜。

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

2 个答案:

答案 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.confLD_LIBRARY_PATH,可执行文件是否为suid,glibc是如何配置的,-rpath设置在链接时等等给出。

答案 1 :(得分:1)

  

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

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