問題タブ [webassembly]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
emscripten - WebAssembly LinkError: _sprintf 関数のインポートには呼び出し可能オブジェクトが必要です
sprintfへの呼び出しを含む Emscripten でコンパイルされた WASM から JS でWebAssembly.Instanceを作成すると、次のエラーが発生します。
キャッチされていない (約束) LinkError: WebAssembly.Instance(): インポート #1 module="env" function=" _sprintf " エラー: 関数のインポートには呼び出し可能なものが必要です...
sprintfはlibc の一部としてEmscripten に含まれていませんか?
コード:
コンパイル コマンド:
emccコンパイルはエラーなしで実行されます。
sprintf行をコメントアウトすると、期待どおり 0 を返すエラーなしで実行されます。
このエラーの理由は何ですか?また、sprintf を使用する場合に回避するにはどうすればよいですか?
emscripten - emscripten によって生成される invoke_* 関数の目的
WebAssembly にコンパイルすると、emscripten は のような関数を生成しますinvoke_vii
。彼らの目的は何ですか?
詳細:
C からコンパイルされた WebAssembly モジュールはemcc -s WASM=1 -g
、ホスト環境によってさまざまな機能が提供されることを期待しています。
私は C で書かれた WebAssembly インタープリターに取り組んでいます。そのため、これらの関数の提供に対処する必要がありますがinvoke_vii
、invoke_iiii
、 などの関数に唖然としています。
接尾辞は明らかに呼び出し署名に関連しています。たとえば、vii
returnvoid
と take some int
s を意味します。名前の呼び出しは、関数が何かを呼び出すことになっていることを示唆しています。
これらの関数に関する情報は、emscripten によって生成された Java Script コードでの実装以外には見つかりませんでした。
dynCall_ii
WebAssembly モジュールに存在します。
すべてのinvoke_*
関数が行うことは、対応する関数を実行するようにインタープリターに指示することだけのようdynCall_*
です。この間接化の目的は何ですか? dynCall_
WebAssembly コードが直接呼び出さないのはなぜですか?