在 emscripten 中禁用链接 libc
Disable linking libc in emscripten
我很好奇是否可以让 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 实现吗?
Emscripten 目前 well-suited 不适用于此用例。 object文件是bitcode,任何时候使用linking,都想包含一些库和JS模块代码。
对于 WebAssembly,可以使用来自上游 LLVM 主干的 clang 以及来自 Binaryen. Clang (optionally in conjunction with LLVM's llc
tool) can generate a .s
assembly file which s2wasm
can convert into wast
(WebAssembly's text format). This file can be converted to wasm binary using Binaryen's wasm-as
tool or the wast2wasm
tool from WABT 的 s2wasm
工具。此管道会将 C 文件中对函数的任何未定义引用转换为 wasm 导入,您需要手动将其连接到 JavaScript 函数。
互联网上流传着一些这样的例子(我通过谷歌搜索 "webassembly clang s2wasm" 找到了一些)。另请注意,s2wasm
完成链接器布置 wasm 线性内存的工作,它有几个您需要注意的选项;查看其帮助输出及其来源,例如tool and linker 代码。
您可以使用选项 -s ONLY_MY_CODE=1
获取仅包含编译代码的文件。
参见 the possible options 你可以传递给 emscripten。
请参阅 WebAssembly Standalone,此页面中还有一个 link 示例。
emcc simple.c -Os -s WASM=1 -s SIDE_MODULE=1 -o simple.wasm
要在 html/js 中 运行 它,您必须提供一个带有 imports.env={memoryBase, tableBase, memory, table}
的 imports
对象。但是如果你通过 wabt 将 wasm 文件转换为 wat 格式,你可以去掉导入部分,因为你既不需要内存也不需要 table 然后将它编译回 wasm。
这是一个exemple
您有 2 个选项来构建独立的 wasm 模块。通过 emsdk
或通过 llvm
。请注意,现在 emsdk 通过 asm.js 后端生成代码,并且本身不支持某些 i64 操作,例如乘法。
emsdk
emcc your_module.c -v -O3 -s WASM=1 -s SIDE_MODULE=1 -o your_module.wasm
原生 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
我很好奇是否可以让 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 实现吗?
Emscripten 目前 well-suited 不适用于此用例。 object文件是bitcode,任何时候使用linking,都想包含一些库和JS模块代码。
对于 WebAssembly,可以使用来自上游 LLVM 主干的 clang 以及来自 Binaryen. Clang (optionally in conjunction with LLVM's llc
tool) can generate a .s
assembly file which s2wasm
can convert into wast
(WebAssembly's text format). This file can be converted to wasm binary using Binaryen's wasm-as
tool or the wast2wasm
tool from WABT 的 s2wasm
工具。此管道会将 C 文件中对函数的任何未定义引用转换为 wasm 导入,您需要手动将其连接到 JavaScript 函数。
互联网上流传着一些这样的例子(我通过谷歌搜索 "webassembly clang s2wasm" 找到了一些)。另请注意,s2wasm
完成链接器布置 wasm 线性内存的工作,它有几个您需要注意的选项;查看其帮助输出及其来源,例如tool and linker 代码。
您可以使用选项 -s ONLY_MY_CODE=1
获取仅包含编译代码的文件。
参见 the possible options 你可以传递给 emscripten。
请参阅 WebAssembly Standalone,此页面中还有一个 link 示例。
emcc simple.c -Os -s WASM=1 -s SIDE_MODULE=1 -o simple.wasm
要在 html/js 中 运行 它,您必须提供一个带有 imports.env={memoryBase, tableBase, memory, table}
的 imports
对象。但是如果你通过 wabt 将 wasm 文件转换为 wat 格式,你可以去掉导入部分,因为你既不需要内存也不需要 table 然后将它编译回 wasm。
这是一个exemple
您有 2 个选项来构建独立的 wasm 模块。通过 emsdk
或通过 llvm
。请注意,现在 emsdk 通过 asm.js 后端生成代码,并且本身不支持某些 i64 操作,例如乘法。
emsdk
emcc your_module.c -v -O3 -s WASM=1 -s SIDE_MODULE=1 -o your_module.wasm
原生 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