2017-07-17 33 views
1

将C或C++编译为Web程序集时(clang/llvm/binaryen)未定义的函数从“env”导入。从主机环境禁用/重命名导入“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)))意味着它会尝试请求功能afuncfrom the host environment。但是,我没有发现主机环境应该命名为env的文档。

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

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

你用什么命令将你的cpp文件编译成wast? – Tim

+0

[本答案](https://stackoverflow.com/a/45146557/3005167)中描述的命令。 – kazemakase

回答

1

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

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

+0

*默认行为*暗示它可以改变? – kazemakase

+0

没有标志,但您可以在https://github.com/WebAssembly/binaryen/blob/master/src/asmjs/shared-constants.cpp中更改'ENV'的值并重新编译它。 – Derek