我在学习 WebAssembly
现在,我发现 Wasm 世界无法轻松访问外部函数(libc 或第三方函数)(使用 import 是通用解决方案)。
我正在尝试使用 emcc
将我的源代码编译成 wasm 但 malloc
和 free
在我的源代码中被广泛使用。我不认为导入 malloc
和 free
从现实世界是可行的。
所以,我很好奇如何实现 malloc
在wasm世界。我已经知道 malloc 在 glibc
中是如何工作的: 使用 brk() 或 sbrk() 来扩展堆和一些线性地址的内存管理。但是在wasm世界我认为不可能打电话brk()
或 sbrk()
获取类轮地址。
使用全局var来实现malloc
是否合理?像这样 ?
u_char mem[10240];
void *wasm_malloc(size_t num)
{
/*get the free mem idx*/
return &mem[idx];
}
最佳答案
等等,你不需要这样做。
I don't think that importing malloc and free from real world is practicable.
不正确。这正是使用 Emscripten 的重点。 Emscripten 不仅仅是一个 C/C++ 到 Wasm 的编译器,而是一个完整的工具链,其中包括一个 Web 运行时和它自己的 libc,专门设计用于以最少的源代码修改为 Web 浏览器运行 C/C++ 程序。
Emscripten libc 是 musl 的一个经过大量修改的分支.它实现/模拟了广泛的标准 C 库(包括
malloc
、 sbrk
)和 POSIX API(如 pthread 和 BSD 套接字),除了一些在 Wasm 环境中没有意义的 API,如 exec
和 fork
.通过使用 emcc
命令,您将开箱即用地链接这些 libc 端口。所以请随意使用 malloc
- 你什么都不用做!如果您仍然想知道如何实现
malloc
对于 Emscripten,Emscripten 有 two options of malloc
implementations - dlmalloc 和 emmalloc。dlmalloc是一个著名的 malloc 实现。 glibc 也使用它的 fork 版本。可以看到 Emscripten 的 dlmalloc 版本 here .
emmalloc 可能对您更有趣。它是由 Emscripten 团队设计的用于 Web 环境的简单紧凑的 malloc 实现。可以查看源码here .
关于emscripten - 如何在 Wasm 中实现 "malloc",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57032577/