主要观点:在 Linux 上分发动态链接的 ELF 可执行文件很困难,有多种分发方式及相关问题和解决方案。
关键信息:
- 分发方式包括以源代码形式、Docker 容器形式、依赖操作系统包管理器提供预构建包等。
- ELF 可执行文件可包含
rpath
或runpath
属性告知动态链接器查找共享对象依赖的位置。 - 可执行文件还包含告知内核查找动态链接器的属性,且该属性必须是绝对路径。
- 不同版本的 glibc 可能导致问题,如
my_executable
和libz.so.1
与系统 glibc 版本不匹配。 polyfill-glibc
项目提供了将可执行文件和库与所需版本的 glibc 一起分发的解决方案。- 还可通过添加启动脚本或使用
set_relative_interp
工具来解决相关问题,但都有各自的注意事项。
重要细节: - 例如
my_executable
依赖libz.so.1
,若rpath
或runpath
为$ORIGIN/libs
,可按特定目录结构分发。 - 当代 x86 - 64 系统中动态链接器路径通常为
/lib64/ld-linux-x86-64.so.2
。 - 常用解决方案是设置旧版本 glibc 的构建环境来构建可执行文件和库。
polyfill-glibc
可将可执行文件和库与特定版本 glibc 兼容。- 添加启动脚本虽可行但有一些弊端,如执行动态链接器是较偏门功能、
open
等操作会得到错误结果、 aesthetically 上不佳。 set_relative_interp
工具可使my_executable
使用相对路径的动态链接器。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。