有没有一种简单的方法可以让 emscripten 发出 wasm 而不是修改它的名字?
Posted
技术标签:
【中文标题】有没有一种简单的方法可以让 emscripten 发出 wasm 而不是修改它的名字?【英文标题】:Is there an easy way to ask emscripten emit wasm & not mangling its names? 【发布时间】:2021-12-04 14:49:38 【问题描述】:这是我的 C 代码:
#include <emscripten.h>
#ifdef __cplusplus
extern "C"
#endif
EMSCRIPTEN_KEEPALIVE int add(int a, int b)
return a + b;
#ifdef __cplusplus
#endif
我用这样的命令运行它:emcc -O3 add.c -s EXPORTED_FUNCTIONS=_add
,它给了
我的 wasm 输出与我想要的很接近,但是名称被破坏了,转储的输出如下所示:
Type[2]:
- type[0] () -> nil
- type[1] (i32, i32) -> i32
Function[2]:
- func[0] sig=0 <b>
- func[1] sig=1 <c>
Table[1]:
- table[0] type=funcref initial=1 max=1
Memory[1]:
- memory[0] pages: initial=256 max=256
Export[4]:
- memory[0] -> "a"
- func[0] <b> -> "b"
- func[1] <c> -> "c"
- table[0] -> "d"
Code[2]:
- func[0] size=3 <b>
- func[1] size=7 <c>
这里的c
是乱码的add
,有没有办法告诉 emcc 不要乱码它的名字?
【问题讨论】:
【参考方案1】:emscripten 输出的 JS 库会导出未修改的名称,所以你仍然可以在外部使用。
为了节省空间,从 wasm 导出到 JS 的名称被缩小,但 JS 知道然后将它们以原始名称导出到外部。您可以将 WebAssembly 的这些导出视为 JS 和 emscripten 生成的 WebAssembly 之间的内部契约。它们不是为您直接访问而设计的。
如果你想 emscripten 生成一个 为直接/外部使用而设计的 WebAssembly 模块,并且你不希望 emscripten 生成 JS 加载器代码,你可以使用 by 输出一个独立的 wasm 文件使用以下方法之一:
指定以.wasm
结尾的输出名称(例如-o out.wasm
)
通过-sSTANDALONE_WASM
在这种模式下,您应该看不到名为 minified 的导出。
【讨论】:
以上是关于有没有一种简单的方法可以让 emscripten 发出 wasm 而不是修改它的名字?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种简单的方法可以让 unicode 在 python 中工作?