【问题标题】:How do I generate a minimal wasm file with Rust?如何使用 Rust 生成最小的 wasm 文件?
【发布时间】:2018-03-21 08:08:23
【问题描述】:

通过运行emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.c,我可以从以下 C 代码生成一个相当小的(203 字节)wasm 文件。

#include <emscripten/emscripten.h>

int EMSCRIPTEN_KEEPALIVE sum(int a, int b) {
    return a + b;
}

反汇编输出:

(module
 (type $0 (func (param i32 i32) (result i32)))
 ... trim 9 lines ...
 (export "_sum" (func $0))
 (func $0 (type $0) (param $var$0 i32) (param $var$1 i32) (result i32)
  (i32.add
   (get_local $var$1)
   (get_local $var$0)
  )   
 )   
 ... trim 17 lines ...
)

但鉴于以下 Rust 代码

pub fn main() {}

#[no_mangle]
pub extern fn sum(a: i32, b: i32) -> i32 {
    a + b
}

我似乎无法产生类似的东西。

rustc -O --target=wasm32-unknown-emscripten sum.rs 有效,但给了我一个 85k 的 wasm 文件和一个 128k 的 js 文件。

我尝试导出 EMMAKEN_CFLAGS='-s WASM=1 -s SIDE_MODULE=1' 但这给了我一些警告,例如

输入文件“/tmp/.../rust.metadata.bin”存在,但不是适合 Emscripten 的 LLVM 位码文件。也许不小心将原生构建的目标文件与 Emscripten 混合在一起?

然后链接失败。

我的 Rust 版本是 1.22.0-nightly (c6884b12d 2017-09-30),我的 emcc 版本是 1.37.21

我做错了什么?

【问题讨论】:

  • 哈,搜索了一个星期,我什么也没找到。然后在发布这个问题几分钟后,我发现this 可以回答它。一旦我测试它会报告。
  • this file 中几乎所有关于 Rust 的 emscripten 目标的东西都被定义了。而here,评论说可以通过编写 JSON 文件来添加目标(无需重新编译 rustc!)。因此,您可以尝试添加一个将SIDE_MODULE 标志传递给emcc 的自定义目标。我会写一个正确的答案,但我现在没有时间。对不起:

标签: rust webassembly


【解决方案1】:

使用wasm32-unknown-emscripten 目标,您使用的是基于 Emscripten 的编译器工具链。 Emscripten 在 wasm 模块中添加了相当多的额外运行时代码,以及在运行时与之集成的额外 JavaScript 代码。正如您还观察到的,Emscripten 可以使用SIDE_MODULE 选项进行编译,该选项删除了大部分运行时代码。这减少了 wasm 二进制文件的大小,但意味着您必须自己处理诸如绑定复杂类型之类的事情。

最近(2017 年 11 月)一个新的 wasm32-unknown-unknown target was added to Rust,它使用 LLVM 后端(而不是 Emscripten 及其 fastcomp 分支),导致输出最少。

这个目标可以像setup guide中描述的那样使用:

rustup update
rustup target add wasm32-unknown-unknown --toolchain nightly
rustc +nightly --target wasm32-unknown-unknown -O hello.rs

【讨论】:

  • 我刚刚发现,有一个围绕这个概念构建的工具包github.com/dcodeIO/webassembly
  • @Shepmaster 公平点 - 我已经完全重写了答案
猜你喜欢
  • 2021-09-01
  • 2020-09-11
  • 2023-01-07
  • 1970-01-01
  • 2021-08-28
  • 2023-02-24
  • 2022-10-06
  • 2019-09-16
  • 1970-01-01
相关资源
最近更新 更多