2017-10-10 9 views
5

emcc -O3 -s WASM=1 -s SIDE_MODULE=1 -o sum.wasm sum.cを実行して、次のCコードからかなり小さい(203バイト)wasmファイルを生成できます。Rustで最小限の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 ... 
) 

しかし、次の錆コード

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」私に

入力ファイルのような警告の数を与えるが、適切なLLVMのビットコードファイルではありませんでしたEmscriptenのために。おそらく誤ってEmscriptenでネイティブの組み込みオブジェクトファイルを混在させるでしょうか?

リンクできません。

私の錆のバージョンは1.22.0-nightly (c6884b12d 2017-09-30)で、emccのバージョンは1.37.21です。

私は間違っていますか?

+0

ほら、検索し、私は何を見つけることの週。それから、この質問を投稿してから数分後に、私は[これ](https://gist.github.com/LukasKalbertodt/821ab8b85a25f4c54544cc43bed2c39f)を見つけました。私はそれをテストして戻ってきます。 – zakm

+0

[このファイル](https://github.com/rust-lang/rust/blob/0defa208dcb5a0f3c1ca5bc4df7acf52759ece44/src/librustc_back/target/wasm32_unknown_emscripten.rs)では、Rustのemscriptenターゲットに関するほとんどすべてが定義されています。また、ここでは(https://github.com/rust-lang/rust/blob/b2f67c8d5676d13d83523316ac95a7056dbd19c6/src/librustc_back/target/mod.rs)、このコメントによれば、JSONファイルを書き込むことによってターゲットを追加することができます(再コンパイルせずにさとうきび!)。ですから、 'SIDE_MODULE'フラグをemccに渡すカスタムターゲットを追加することができます。私は適切な答えを書くだろうが、今は時間がない。申し訳ありません:< –

答えて

3

wasm32-unknown-emscriptenターゲットでは、Emscriptenベースのコンパイラツールチェーンを使用しています。 Emscriptenは、実行時にこれと統合するための追加のJavaScriptコードと同様に、かなり多くの追加のランタイムコードをwasmモジュールに追加します。また、Emscriptenはこのランタイムコードの大部分を削除するSIDE_MODULEオプションでコンパイルできます。これは、wasmバイナリサイズを減らしますが、複雑な型のバインディングなどの処理を自分で処理する必要があることを意味します。

最近(11月、2017)新しいwasm32-unknown-unknown target was added to Rustは、(Emscriptenとその高速コンパイルフォークではなく)LLVMバックエンドを使用しているため、出力が最小限に抑えられています。 setup guideで説明したように

このターゲットは使用することができます。

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

私はちょっと見つけました。このコンセプトを基にしたツールキットがあります。https://github.com/dcodeIO/webassembly – ColinE

+0

@Shepmaster公正地点 - 回答を完全に書き直しました – ColinE

関連する問題