禁用/重命名从主机环境导入"env"



当将C或C++编译为Web汇编(clang/llvm/binaryen(时,未定义的函数是从"env"导入的。

例如

extern "C" int afunc();
int main() {
return afunc();
}

编译为

(module
(type $FUNCSIG$i (func (result i32)))
(import "env" "afunc" (func $afunc (result i32)))
(table 0 anyfunc)
(memory $0 1)
(export "memory" (memory $0))
(export "main" (func $main))
(func $main (result i32)
(call $afunc)
)
)

我想(import "env" "afunc" (func $afunc (result i32)))行意味着它尝试从主机环境请求函数afunc。但是,我没有发现任何文档表明主机环境应命名为env

是否可以对这些主机导入进行一些控制? 具体说来

  • 我可以将其重命名为env以外的名称吗?
  • 是否可以禁用此行为,以便在未定义函数时出现链接器错误(也许除非它是已知在主机中可用的函数(?

目前编译C 和 C++ 的最简单方法是使用 emscripten。你提到的组件都是组件,但 emscripten 是一个完整的工具链,支持端到端构建,包括你需要的所有部分,包括 libc/libc++ 和各种其他有用的库。它支持同时针对asm.js和wasm。

"env"位是s2wasm的默认行为,旨在与 emscripten 一起使用。Emscripten具有标准库(例如libc(并将它们链接到您的代码中,并且它还提供了一些作为JavaScript代码的功能,这些功能也自动包含在您的模块中。它设置env导入并自动实例化模块。

最新更新