在计算机科学领域漫步

主要观点:作者在 ANU 的 School of Computing 进行学术研究,将 liballocs 与 MMTk 集成,重点在 Rust 中创建可预加载的 malloc 并解决相关链接问题。
关键信息:

  • MMTk 现用 Rust 编写,可与多种语言运行时集成,已在 Julia、Ruby、OpenJDK、V8 和 ART 等中应用。
  • 要在 Rust 中创建可预加载的 malloc 并避免与全局 malloc 重入,需解决诸多链接问题,如处理 Rust 标准库对 malloc 的依赖、避免间接重入调用等。
  • 可通过静态链接第二个 C 库副本创建自包含共享库来解决部分问题,但存在一些限制和注意事项,如需要位置无关的库、版本脚本等。
  • 在 Rust 中链接混合的 C 和 Rust 代码时,存在符号导出和版本控制等问题,目前的解决方案并不完美,如 rustc 对版本脚本的使用限制等。
    重要细节:
  • 在 Rust 中通过#[global_allocator]jemallocator来处理全局 malloc 问题,使用 Cargo 时需在[dependencies]中添加jemalloc
  • 对于间接重入调用,可通过弱引用和强定义来处理__cxa_thread_atexit_impl符号,避免使用它并采取回退路径。
  • 在设置链接选项时,需注意rustc与链接器的交互,通过rustflagsbuild.rs来传递链接参数,可使用-C link-args,但在不同环境中存在差异,如使用cargo rustc而非cargo build
  • 对于链接混合代码的问题,rustc 生成的版本脚本会限制符号导出,目前的解决方案并不理想,如使用--exclude-libs等选项存在限制,可通过-wrapper选项来干预链接命令等。
  • 最后提到后续计划使用 MMTk 的 VO 位实现对象基地址查找,以及将 MMTk 接口包装在“动态调度”层中以支持 liballocs 等。代码可在这里找到。
阅读 10
0 条评论