使用Rust构建`.wasm`二进制文件时访问`__heap_base`



想要了解本文中的内容:https://surma.dev/things/c-to-webassembly/但是使用Rust并编写自定义分配器。

为此,我需要访问llvm添加的__heap_base变量,该变量作为线性内存中堆开始位置的指针。有没有办法在Rust中实现这一点?

我尝试了的变体

extern "C" {
static __heap_base: i32;
}
#[no_mangle]
pub unsafe extern "C" fn main() -> i32 {
__heap_base
}

但是它们返回0,而不是二进制中分配的实际值。

在处理了一点之后。答案的一个想法是,程序的值和编译器/链接器在wasm文件中定义的值之间似乎存在差异。原则上没有1比1的关系。

当你在C/Rust中定义一个变量时,你得到的是变量,而不是变量本身的地址。I.e:如果你定义了一个指针,你得到的是指针指向的数据的地址,而不是指针值存储的地址。

因此,通过指定static __heap_base: i32,您要求编译器将__heap_base值设置为i32,而不是堆基指针(无论您为__heap_base设置什么类型,llvm都会将其写入wasm i32(。该值的地址是指向__heap_base的实际指针

为什么你可以只导入__heap_base作为堆基所指向的值,我仍然不太清楚。也许符号总是意味着值,而像*__heap_base这样的东西只是指针,当被取消引用时,它会给你__heap_base(值(,在内部是这样处理的

相关内容

  • 没有找到相关文章

最新更新