在 Linux 上编译二进制文件时,有一个称为 RPATH 的东西,它告诉动态加载器在哪里查找共享对象。我喜欢 RPATH 的一点是,.so
如果需要,您可以使用该$ORIGIN
属性来提供特定文件,其中加载程序在相对于可执行路径的路径中搜索它。因此,如果我的二进制文件有一个 RPATH,$ORIGIN/.
加载程序将在其目录中搜索,这对于分发软件非常有用。
有一个问题,加载器本身必须是硬编码的,所以即使我可以传送所有依赖项,如果加载器错误,也是没有用的。如果我以 musl 加载程序为例,我可以使用类似ld
或patchelf
to be 的内容设置解释器路径./musl-ld.so
,问题是,只有从其自己的目录调用可执行文件时,这才会起作用,使用$ORIGIN
会导致内核搜索名为的文字路径$ORIGIN/./musl-ld.so
。有什么原因可以解释为什么解释器可以做到这一点,但内核似乎不能?修复这样的限制是否符合内核维护者的利益?这将大大简化向 Linux 制作可移植可执行文件的过程,而无需使用 AppImage 等黑客手段,因为系统确实具有稳定的系统调用接口。