禁用emscripten中的链接libc

时间:2017-01-14 19:00:07

标签: emscripten asm.js webassembly

我很好奇是否有可能让emscripten构建一个没有libc的二进制文件。

如果我有simple.c:

int add1(int x) {
    return x + 1;
}

而且我不想包含任何libc,这可能吗?

到目前为止,我最好的尝试是:

emcc simple.c -s NO_FILESYSTEM=1 -s DISABLE_EXCEPTION_CATCHING=1 -s DEFAULT_LIBRARY_FUNCS_TO_INCLUDE='[]' -s LIBRARY_DEPS_TO_AUTOEXPORT='[]' -s EXPORTED_FUNCTIONS='["add1"]' -s USE_SDL=0 -o simple.js -nostdlib

但生成的输出仍包含malloc,字符串转换例程等符号。

我也对生成webassembly的过程感兴趣;也就是说,我的真正目标是生成一个只包含单个函数的webassembly模块。这可能与emscripten有关吗?

4 个答案:

答案 0 :(得分:4)

Emscripten目前还不适合此用例。对象文件是bitcode,无论何时使用链接,它都希望包含一些库和JS模块代码。

对于WebAssembly,可以使用来自上游LLVM中继的clang以及Binaryen中的s2wasm工具。 Clang(可选地与LLVM&llc工具结合使用)可生成.s汇编文件,s2wasm可将其转换为wast(WebAssembly的文本格式) )。可以使用Binaryen的wasm-as工具或WABT中的wast2wasm工具将此文件转换为wasm二进制文件。此管道会将对C函数中函数的任何未定义引用转换为wasm导入,您需要手动连接到JavaScript函数。 有一些例子在互联网上浮动(我通过谷歌搜索发现了一些" webassembly clang s2wasm")。另请注意,s2wasm执行链接器布置ism线性内存的工作,并且它有几个您想要注意的选项;查看其帮助输出及其来源,例如toollinker代码。

答案 1 :(得分:2)

您可以使用选项-s ONLY_MY_CODE=1来获取仅包含已编译代码的文件。

请参阅the possible options,您可以传递给emscripten。

答案 2 :(得分:2)

您有2个选项来构建独立的wasm模块。通过emsdkllvm。注意,现在emsdk通过asm.js后端生成代码,并且本身不支持某些i64操作,如乘法。

emsdk

emcc your_module.c -v -O3 -s WASM=1 -s SIDE_MODULE=1 -o your_module.wasm

native llvm + binaryen

注意,现在你需要来自trunk的最新llvm,用wasm支持编译。

clang -emit-llvm --target=wasm32 -O3 -c -o your_module.bc your_module.c
llc -asm-verbose=false -o your_module.s your_module.bc
s2wasm --emscripten-glue your_module.s > your_module.wast
wasm-opt -O3 your_module.wast -o your_module.wasm

答案 3 :(得分:1)

请参阅WebAssembly Standalone,此页面中还有指向示例的链接。

emcc simple.c -Os -s WASM=1 -s SIDE_MODULE=1 -o simple.wasm

要在html / js中运行它,您必须提供imports对象imports.env={memoryBase, tableBase, memory, table}。但是如果你通过wabt将wasm文件转换为wat格式,你可以剥离导入部分,因为你既不需要内存也不需要表,然后将其编译回wasm。 这是exemple

相关问题