想要了解本文中的内容: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
(值(,在内部是这样处理的