当我对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_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
的符号链接,为什么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也有说法。 不幸的是整个系统非常复杂。