如何使用emcc编译longjmp?

How to compile longjmp using emcc?

我正在尝试诊断 emcc 的链接器问题。我已将其归结为以下文件:

#include <setjmp.h>

jmp_buf error;

int main(int argc, char *argv[]) {
  int n = setjmp(error);
  if (n)
    return n;
  longjmp(error, 33);
  return 0;
}

当使用 gcc 编译时,此文件会生成 a.out 并按预期以代码 33 退出。但是当使用 emcc 编译时,它在链接步骤失败,并出现此错误:

nr@homedog ~/s/c [1]> emcc -s LLD_REPORT_UNDEFINED longjmp.c
error: undefined symbol: __invoke_void_$struct___jmp_buf_tag*_i32 (referenced by top-level compiled C/C++ code)
warning: To disable errors for undefined symbols use `-s ERROR_ON_UNDEFINED_SYMBOLS=0`
warning: ___invoke_void_$struct___jmp_buf_tag*_i32 may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
error: undefined symbol: emscripten_longjmp_jmpbuf (referenced by top-level compiled C/C++ code)
warning: _emscripten_longjmp_jmpbuf may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library

将其添加到 EXPORTED_FUNCTIONS 会导致此错误:

wasm-ld: error: symbol exported via --export not found: emscripten_longjmp_jmpbuf

我需要做什么来编译这个文件?

我是 运行 Debian 稳定版(bullseye),Emscripten 版本 2.0.12。


预计到达时间:emcc 报告版本如下:

nr@homedog ~/s/c [1]> emcc -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.12
Debian clang version 11.0.1-2
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /usr/bin

您的 llvm (clang) 和 emscripten 版本似乎不匹配。我们建议使用 emsdk 安装所有正确的依赖项(你是如何安装它们的?)。如果您不想使用 emsdk,则需要从源代码以正确的版本构建 llvm。

您的示例可以在最新版本的 emscripten 中找到:

$ emcc -v
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 2.0.29-git (6e9e10d3f78eb249bf09922a23e19c3f81a86d0f)
...
$ emcc -s LLD_REPORT_UNDEFINED setjmp.c