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 二进制交叉编译器目标的主要内容,如果未能解决你的问题,请参考以下文章

使用 Clang 编译的可执行文件中的 emscripten

如何自托管 Clang?

使用 emscripten 找不到 Windows.h

Emscripten教程之emcc编译命令

用 emscripten 提升 bjam

emscripten链接全局命名符号多重定义