Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标
Posted
技术标签:
【中文标题】Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标【英文标题】:Emscripten Clang produce ELF 64-bit executabel and wasm binary cross compiler targets 【发布时间】:2020-02-04 15:23:05 【问题描述】:我准备了一个最小的 Cmake 项目,其中包含一个代表主文件的 cpp 文件和一个代表共享库的 cpp 文件,它基本上打印 hello world。 https://github.com/courteous/wasmELF.git
目标是仅使用 emscripten/clang 编译此 miniaml 代码并生成
1) 一个 WebAssembly (wasm) 二进制模块版本 0x1 (MVP)
2) 一个 ELF 64 位 LSB
无需清除 cmake 构建目录并重新构建它。
目前我可以通过运行命令成功生产购买的它们
emconfigure cmake ../ -DCMAKE_BUILD_TYPE=WASM
make
和
cmake ../ -DCMAKE_BUILD_TYPE=Linux
make
但是问题是,为了做到这一点,我需要使用 Clang 编译第一个以删除构建,然后使用 GCC 进行第二次编译。我希望 Emscripten/Clang 生产它们,而不是购买。我不想删除构建目录,因为编译时间太长了。 (好吧,不在这个项目中,但想象一下这个项目是否更大)
我看到的是 emscripten/clang 总是选择一个目标“wasm32-unknown-emscripten”
clang++ -target wasm32-unknown-emscripten
如果我理解正确,目标应该改变
我确实看到该项目正在生成 LLVM IR 位码,因为我已发送标志“flto”
即
file TestSharedClass.cpp.o
TestSharedClass.cpp.o: LLVM IR bitcode
在 CMakeLists.txt 中
set(CMAKE_CXX_FLAGS "-flto")
x86_64-unknown-linux-gnu 是 emscripten/Clang 支持的目标
~/Projects/emscripten/emsdk/upstream/bin$ ./llc --version
LLVM (http://llvm.org/):
LLVM version 11.0.0git
Optimized build with assertions.
Default target: x86_64-unknown-linux-gnu
Host CPU: haswell
Registered Targets:
wasm32 - WebAssembly 32-bit
wasm64 - WebAssembly 64-bit
x86 - 32-bit X86: Pentium-Pro and above
x86-64 - 64-bit X86: EM64T and AMD64
在cmake中我确实有
SET(TARGET x86_64-unknown-linux-gnu)
但是当我跑步时
emconfigure cmake ../ -DCMAKE_BUILD_TYPE=Linux
make
我得到 mainTestFile.js 和 mainTestFile.wasm 而不是 ELF 64 位代码。
我在这里做错了什么。如何告诉 clang 从同一代码运行一次 ELF 和一次 wasm,而无需清除构建目录。这应该是可能的,因为 clang 正在生成 LLVM IR 位码。还是我理解错了?
https://github.com/emscripten-core/emscripten/issues/10361
【问题讨论】:
【参考方案1】:好吧,这似乎是不可能的,即来自 github 上的开发人员的回复指出 emcc 或 emmake 不能与 wasm32-unknown-emscripten 以外的其他目标一起使用。
【讨论】:
以上是关于Emscripten Clang 生成 ELF 64 位可执行文件和 wasm 二进制交叉编译器目标的主要内容,如果未能解决你的问题,请参考以下文章