#alloc #vita #black-box #dealloc #system #play-station #newlib

已删除 vita-system-alloc-wrapper

std::alloc::System 的代理,它将 dealloc 包装在 std::hint::black_box 中

0.1.0 2023年5月21日

#6#vita

MIT 许可证

4KB

vita-system-alloc-wrapper

Rust 的标准库有一个 std::alloc::System 分配器,它内部调用 libc::malloclibc::free 进行分配。对于 PlayStation Vita,这些函数由 newlib 提供,它使用一个 预先分配的堆内存池

这应该可以正常工作,并且在大多数情况下都能工作。然而,不幸的是,当以专门为 PlayStation Vita 目标编译的 -O3 优化级别编译时,LLVM 可能会错误地优化 libc::free 调用,导致 Rust 中堆分配的结构体被丢弃时崩溃。

此软件包通过提供一个自定义分配器来解决这个问题,该分配器代理所有对 std::alloc::System 分配器的调用,并将 dealloc 调用包装在 std::hint::black_box 中,这阻止了 LLVM 对 libc::free 调用进行任何优化。

如果你在 PlayStation Vita 上遇到看似正确的代码中的 Drop 调用崩溃,请尝试将此软件包作为依赖项添加,并将提供的分配器注册为 GlobalAllocator

#[cfg(target_os = "vita")]
#[global_allocator]
static GLOBAL: vita_system_alloc_wrapper::SystemAllocWrapper = vita_system_alloc_wrapper::SystemAllocWrapper;

依赖项

~43KB