WebAssembly - 动态链接
-
简述
动态链接是在运行时将两个或多个模块链接在一起的过程。为了演示动态链接的工作原理,我们将使用 C 程序并使用 Ecmascript sdk 将其编译为 wasm。所以我们在这里 -test1.ctest2.c主程序在 main.c 代码中,它使用了在 test1.c 和 test2.c 中定义的 test1() 和 test2()。让我们看看如何在 WebAssembly 中链接这些模块。编译上述代码的命令如下:使用 SIDE_MODULE =1 进行动态链接,如命令所示。使用 https://webassembly.github.io/wabt/demo/wasm2wat/ 上提供的 WasmtoWat ,将获得 maintest.wasm 的 WebAssembly 文本格式。WebAssembly 文本格式定义了一些导入,如下所示 -这是在 emcc(emscripten sdk) 编译代码时添加的,它处理 WebAssembly 中的内存管理。 -
使用导入和导出
现在要查看输出,我们必须定义您可以在 .wat 代码中看到的导入 -上述条款解释如下 --
env.stackSave - 它用于堆栈管理,这是由 emscripten 编译代码提供的功能。
-
env.stackRestore - 它用于堆栈管理,这是由 emscripten 编译代码提供的功能。
-
env.__memory_base - 它是一个不可变的 i32 全局偏移量,用于 env.memory 并为 wasm 模块保留。模块可以在其数据段的初始化程序中使用这个全局变量,以便将它们加载到正确的地址。
-
env.__table_base - 它是一个不可变的 i32 全局偏移量,用于 env.table 并为 wasm 模块保留。模块可以在其表元素段的初始化程序中使用这个全局变量,以便它们以正确的偏移量加载。
-
env.memory - 这将包含需要在 wasm 模块之间共享的内存详细信息。
-
env.table - 这将包含需要在 wasm 模块之间共享的表详细信息。
导入必须在 javascript 中定义如下 -例子
以下是在 WebAssembly.instantiate 中使用 importObj 的 javascript 代码。输出
输出如下 - -