14

当我ldd针对一个共享库运行时,例如libphp5.so我看到它依赖于libmysqlclient.so.16

$ ldd ./libphp5.so
libmysqlclient.so.16 => /usr/lib/mysql/libmysqlclient.so.16
[其他依赖项被剪掉]

这些依赖文件名和路径 ( /usr/lib/mysql/libmysqlclient.so.16) 是否已包含在共享库二进制文件中?或者这条路径是由其他方式确定的,例如 via /etc/ld.so.conf.d/mysql-i386.conf,其中顺便包含:

/usr/lib/mysql/

还有一件事让我很困惑:

我有一个从源代码编译的共享库。这依赖于libmysqlclient_r. 编译器gcc切换以生成此库,如下所示:

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.so是一个符号链接libmysqlclient_r.so.16.0.0,那么为什么ldd将依赖项显示为libmysqlclient_r.so.16. 我在这里缺少一些魔法吗?

作为多年的 Windows 开发人员,我gcc对 Linux 的开发有点陌生。

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

4

2 回答 2

15

您可以通过运行查看哪些路径来自哪里

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链接时给出的设置等。

于 2011-11-17T17:24:29.133 回答
1

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

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

于 2011-11-17T16:21:03.727 回答