为依赖项的依赖项设置rpath?

时间:2020-06-14 16:09:13

标签: linux build dependencies dynamic-linking rpath

我已经有了一个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可执行文件的正确方法是什么,以便我可以找到我在同一目录中提供的任何依赖关系及其依赖关系?

1 个答案:

答案 0 :(得分: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以便正确加载它们。