Nai*_*Jay 4 emscripten webassembly
我现在正在学习WebAssembly,发现外部函数(libc 或第三方函数)无法被 Wasm 世界轻松访问(使用 import 是通用解决方案)。
我试图用emcc编译我的源代码到WASM但malloc并free广泛应用于我的源代码。我认为从现实世界中导入malloc和导入free是不可行的。
所以,我很好奇如何malloc在 wasm 世界中实现。我已经知道 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];
}
Run Code Online (Sandbox Code Playgroud)
等等,你不需要这样做。
我认为从现实世界中导入 malloc 和 free 是不可行的。
不正确。这正是使用 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 有两个malloc实现选项- dlmalloc 和 emmalloc。
dlmalloc是一个著名的 malloc 实现。glibc 也使用它的分叉版本。您可以在此处查看 Emscripten 的 dlmalloc 版本。
emmalloc 可能对您更有趣。它是由 Emscripten 团队设计的用于 Web 环境的简单紧凑的 malloc 实现。您可以在此处查看源代码。
| 归档时间: |
|
| 查看次数: |
2317 次 |
| 最近记录: |