有没有一种简单的方法可以让 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 中工作?

有没有一种简单的方法可以让两个 jQuery 效果紧随其后?

emscripten webworker 的最小工作示例

从 EMSCRIPTEN 访问 DOM

是否可以像现在一样轻松编译 Emscripten,但没有控制台和 emscripten 徽标?