Linux 上的便携式、动态链接包

这是一篇关于在 Linux 上实现可移植包的技术文章,主要内容如下:

  • 魔法技巧示例:安装 Brioche 后,运行brioche build -r curl -o./output可获取 curl 副本,将其放入Dockerfile中可在scratch环境中运行,展示了可移植包的能力。
  • 为何这样做

    • 无需 root 权限安装 Brioche 或新包,需使包可移植,可在文件系统任何位置运行。
    • Brioche 应能打包使用 glibc 的软件,虽 musl 更易进行静态构建,但它不是 glibc 的替代品。
    • Brioche 包在运行时不应使用容器,已有 snap、Flatpak 和 AppImage 用容器,而作者希望专注于面向开发者的 CLI 工具,避免容器带来的文件系统视图问题和沙盒难题。
  • 创建自己的可移植包

    • 以 Rust 程序为例,通过cargo new lil-demo创建项目,ldd查看依赖,创建lil-demo-portable目录,复制程序和动态库,编写run.sh脚本设置环境变量,使程序可从便携式目录运行。
    • 进一步处理动态链接器ld-linux.so,通过设置$LD_LIBRARY_PATH让程序加载便携式目录中的动态库,直接调用ld-linux.so并传递lil-demo作为参数。
    • 解决/proc/self/exe问题,通过“userland exec”技术在 Rust 中处理,使用userland-execve crate 直接跳转到程序的起始地址执行,避免execve()调用导致的路径问题。
  • 秘密揭示./output/bin/curl实际上是一个替代程序,类似于run程序,真正的 curl 在./output/brioche-resources.d中,从外部看它像 curl 一样运行,即使程序关心/proc/self/exe也不会出错。
  • 总结:介绍了 Brioche 中“打包可执行文件”在 Linux 上的工作原理,展示了可移植包的优势,如无需 root 权限安装、可在不同环境中运行等,还给出了使用 Brioche 直接构建可移植包的配置示例。
阅读 10
0 条评论