由于缺少相对路径

主要观点:在 Linux 上分发动态链接的 ELF 可执行文件很困难,有多种分发方式及相关问题和解决方案。
关键信息

  • 分发方式包括以源代码形式、Docker 容器形式、依赖操作系统包管理器提供预构建包等。
  • ELF 可执行文件可包含rpathrunpath属性告知动态链接器查找共享对象依赖的位置。
  • 可执行文件还包含告知内核查找动态链接器的属性,且该属性必须是绝对路径。
  • 不同版本的 glibc 可能导致问题,如my_executablelibz.so.1与系统 glibc 版本不匹配。
  • polyfill-glibc项目提供了将可执行文件和库与所需版本的 glibc 一起分发的解决方案。
  • 还可通过添加启动脚本或使用set_relative_interp工具来解决相关问题,但都有各自的注意事项。
    重要细节
  • 例如my_executable依赖libz.so.1,若rpathrunpath$ORIGIN/libs,可按特定目录结构分发。
  • 当代 x86 - 64 系统中动态链接器路径通常为/lib64/ld-linux-x86-64.so.2
  • 常用解决方案是设置旧版本 glibc 的构建环境来构建可执行文件和库。
  • polyfill-glibc可将可执行文件和库与特定版本 glibc 兼容。
  • 添加启动脚本虽可行但有一些弊端,如执行动态链接器是较偏门功能、open等操作会得到错误结果、 aesthetically 上不佳。
  • set_relative_interp工具可使my_executable使用相对路径的动态链接器。
阅读 7
0 条评论