主要观点:作者在 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
与链接器的交互,通过rustflags
和build.rs
来传递链接参数,可使用-C link-args
,但在不同环境中存在差异,如使用cargo rustc
而非cargo build
。 - 对于链接混合代码的问题,rustc 生成的版本脚本会限制符号导出,目前的解决方案并不理想,如使用
--exclude-libs
等选项存在限制,可通过-wrapper
选项来干预链接命令等。 - 最后提到后续计划使用 MMTk 的 VO 位实现对象基地址查找,以及将 MMTk 接口包装在“动态调度”层中以支持 liballocs 等。代码可在这里找到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。