【问题标题】:How are shared library dependency paths determined on Linux?Linux 上的共享库依赖路径是如何确定的?
【发布时间】:2011-12-31 12:23:02
【问题描述】:

当我针对libphp5.so 等共享库运行ldd 时,我发现它依赖于libmysqlclient.so.16

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

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

/usr/lib/mysql/

还有一件事让我感到困惑:

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

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。

【问题讨论】:

    标签: linux gcc dependencies shared-libraries ldd


    【解决方案1】:

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

    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 设置等。等等

    【讨论】:

    • 你不知道,但我希望我能对此给予更多支持。我的问题源于无法加载 Python 奶酪店包(MySQL-Python)中使用的libmysqlclient_r,尽管它编译/构建得很好。 LD_DEBUG=libs ldd 让我的生活更安全。它发现保存在/etc/ld.co.conf.d 中的路径文件没有以.conf 结尾,而我的/etc/ld.so.conf 文件指定:include ld.so.conf.d/*.conf。所以/usr/lib/mysql 文件夹从未被搜索过。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-08-11
      • 1970-01-01
      • 2015-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-02-24
      相关资源
      最近更新 更多