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

时间:2017-07-17 18:53:10

标签: c++ c webassembly

将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 from the host environment。但是,我没有找到主机环境应该命名为env的文档。

是否可以对这些主机导入施加一些控制?  具体来说,

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

1 个答案:

答案 0 :(得分:1)

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

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