完全动态链接的 Rust 二进制文件:一个实验

主要观点:

  • 在 Rust 世界中,默认情况下 crates 是静态链接到生成的二进制文件中的,dylib有动态链接支持但未像 C ABI 那样稳定,其主要用于加速增量编译。
  • 虽然 dylib未被广泛支持和使用,但通过创建包装 dylib crate 并添加 rlib crate 作为依赖项可实现完全动态链接的 Rust 二进制文件,如使用cargo-add-dynamic工具。
  • 为实现完全动态链接,需对 Cargo 进行修改使其默认支持 dylib,对 Rustc 进行修改以转移内存分配器的责任等操作,还需解决如 core多次出现等问题。
  • 经过一系列操作后,成功构建了完全动态链接的 Rust 二进制文件,但仍存在一些如文件路径冲突等警告和偶尔的编译错误。
  • 性能评估显示,动态链接在增量构建时比静态链接稍快约 0.2 秒,节省约 11%的时间;在实际代码更改时节省约 0.25 秒,约 5%。

关键信息:

  • 对 Cargo 和 Rustc 的修改补丁及操作步骤,如在manifest.rsweak_lang_items.rs等文件中的修改。
  • 各种 crate 的依赖关系及格式设置,如compiler-builtins等 crate 的处理。
  • 构建过程中的错误及解决方法,如多个 rlib导致的问题及通过补丁解决。
  • 性能评估的结果及对比,包括全构建时间和增量构建时间的差异。

重要细节:

  • 详细列出了各个文件的修改内容及差异,如Cargo.toml等文件的修改。
  • 展示了构建过程中出现的各种错误信息及对应的原因,如链接错误等。
  • 给出了运行时设置LD_LIBRARY_PATH的方法及相关输出。
阅读 6
0 条评论