【发布时间】:2019-07-17 08:04:37
【问题描述】:
我想发布和归档与尽可能多的 Linux 发行版向后和向前兼容且整个包可重定位的二进制文件(带有库的可执行文件)。
据我了解,像libc 这样的系统库也需要交付,因为在不同版本的libc 下,可执行文件会崩溃。同时libc 似乎与ld-linux 相结合
(例如,在 Debian 测试中编译的二进制文件已经不能在 Ubuntu 18.04 LTS 上运行),所以我也需要打包 ld-linux。
我的解决方案是将所有可执行文件和库放在一个目录中,并将 rpath 设置为$ORIGIN(通过与-Wl,rpath=$ORIGIN 链接或使用chrpath 或patchelf 设置)。这使得库可以与可执行文件一起重定位,并且适用于除链接器本身的ld-linux 之外的所有库。
可以通过-Wl,--dynamic-linker=/my/path/ld-linux.so 更改动态链接器路径或使用patchelf 设置它,但路径必须是绝对路径:
-
$ORIGIN技巧不起作用 - 像
./这样的相对路径有效,但仅当当前目录与加载程序本身相同时(从其他地方启动时可执行文件因错误而崩溃) - 我可以编写一个 shell 脚本来检测所有路径并使用
/my/path/ld-linux.so /my/path/myexecutable $@启动可执行文件,但这意味着我想避免另一层间接和开销。
有没有办法将ld-linux相对于可执行文件的路径直接设置成可执行文件?
也许有办法静态链接 ld-linux 加载器?
【问题讨论】:
标签: linux installation elf dynamic-linking relocation