我现在正在学习WebAssembly
,发现Wasm world无法轻松访问外部功能(libc或第三方功能)(使用导入是一种通用解决方案)。
我正在尝试使用emcc
将源代码编译为wasm,但是malloc
和free
在我的源代码中得到了广泛使用。我认为从现实世界中导入malloc
和free
是不可行的。
因此,我很好奇如何在wasm世界中实现malloc
。我已经知道malloc在glibc
中是如何工作的:使用brk()或sbrk()扩展堆和班轮地址的某些内存管理。但是在wasm世界中,我认为无法致电brk()
或sbrk()
来获取班轮地址。
使用全局变量来实现malloc
是否合理?
u_char mem[10240];
void *wasm_malloc(size_t num)
{
/*get the free mem idx*/
return &mem[idx];
}
答案 0 :(得分:0)
等等,您不需要这样做。
我认为导入malloc并从现实世界中解放出来是不可行的。
不正确。这正是使用Emscripten的重点。 Emscripten不仅是一个从C / C ++到Wasm的编译器,而且是一个完整的工具链,其中包括一个Web运行时和它自己的libc,专门为运行Web浏览器的C / C ++程序而设计,而对源代码的修改最少。
Emscripten libc是musl的经过大量修改的分支。它实现/模拟了多种标准C库(包括malloc
,sbrk
)和POSIX API(例如pthread和BSD套接字),但某些在Wasm环境中没有意义的API除外,例如{ {1}}和exec
。通过使用fork
命令,您可以直接连接那些libc端口。因此,只需使用emcc
就可以了-您无需执行任何操作!
如果您仍然想知道如何为Emscripten实现malloc
,则Emscripten具有two options of malloc
implementations-dlmalloc和emmalloc。
dlmalloc是著名的malloc实现。 glibc也使用它的分叉版本。您可以看到Emscripten的dlmalloc here版本。
emmalloc对您可能更有趣。这是Emscripten团队设计的用于Web环境的简单紧凑的malloc实现。您可以看到源代码here。