【问题标题】:Setting rpath for dependencies of dependencies?为依赖项的依赖项设置 rpath?
【发布时间】:2020-06-15 03:12:44
【问题描述】:

我有一个 Linux 可执行版本,我通过链接器标志 "-Wl,-rpath,./ -Wl,--disable-new-dtags" 设置了 rpath,并且我通过 readelf -d 验证了 RPATH 被设置为 ./

这适用于直接依赖项,因为我的可执行文件在放置在同一目录中时能够找到它们。但是,这不适用于依赖关系:

46763:     find library=libpulsecommon-13.99.so [0]; searching
46763:     search path=/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/tls:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio/x86_64:/usr/lib/x86_64-linux-gnu/pulseaudio        
(RUNPATH from file ./libpulse.so.0)

在这里,libpulse 正在使用自己的运行路径查找 libpulsecommon,该运行路径不包含直接相对路径。我已经切换到使用 rpath 而不是 runpath,因为我看到它提到 rpath 应该传播到依赖项(而 runpath 是“每个二进制文件自己处理”)。不过,情况似乎并非如此。

设置 Linux 可执行文件的正确方法是什么,以便它及其依赖项可以找到我在同一目录中提供的任何依赖项?

【问题讨论】:

    标签: linux build dependencies dynamic-linking rpath


    【解决方案1】:

    我最终在构建时没有做任何事情,而是在我的 CMake 中添加了一个构建后步骤,在其中我运行 patchelf 以将所有 rpath 更改为 $ORIGIN:

    if (${CMAKE_SYSTEM_NAME} STREQUAL "Linux")
        add_custom_command(
                TARGET Client POST_BUILD
                    COMMAND find ${OUTPUT_DIR} -type f -maxdepth 1 -exec patchelf --set-rpath '\$\$ORIGIN' {} \\\;
        )
    endif()
    

    为了让阅读的人更完整,更正常的路径是有一个安装步骤,您将文件放在适当的目录中并使用已安装的系统共享库。在我的情况下,安装步骤不合适,因此我在构建步骤之后添加自定义命令,以将我的依赖项复制到包含可执行文件的目录中并修改 rpath,以便它们正确加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2011-10-20
      • 1970-01-01
      • 2014-08-20
      • 2016-02-18
      相关资源
      最近更新 更多