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

Kev*_*Kev 13 linux dependencies gcc 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/
Run Code Online (Sandbox Code Playgroud)

另一件事令我困惑:

我有一个共享库,我从源代码编译.这依赖于libmysqlclient_r.该gcc编译器开关,产生这个这个库的样子:

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

多年来一直是Windows开发人员,我gcc对Linux 有点新兴和开发.

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

Emp*_*ian 14

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

LD_DEBUG=libs ldd ./libphp5.so
Run Code Online (Sandbox Code Playgroud)

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

文件名几乎肯定是.路径通常不是.您可以看到烘焙到二进制文件中的内容

readelf -d ./libphp5.so
Run Code Online (Sandbox Code Playgroud)

寻找(NEEDED)(RPATH)参赛.

man ld.so请阅读.有许多因素会影响动态加载程序搜索共享库的方式:ld.so.conf,LD_LIBRARY_PATH是否可执行文件suid,glibc的配置方式,-rpath链接时给出的设置等.