【发布时间】: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