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
链接时给出的设置等.
归档时间: |
|
查看次数: |
6917 次 |
最近记录: |