Skip to content

Rust/Emscripten generates invalid JS from Rust-mangled symbols #24825

@nickpdemarco

Description

@nickpdemarco

See https://github.com/nickpdemarco/emsdk-export-bug for a minimum reproducible example (simply clone and run make test). The output of this example is appended to the bottom of this report.

Version of emscripten/emsdk:

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.12-git (40782fe7671409b64da6d73bc84aad3b2c5e4a07)
clang version 22.0.0git (https:/github.com/llvm/llvm-project 61500345787e6fc66e6b6b8a249feaf98c839fbe)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/demarco/repos/emsdk/upstream/bin
Build config: +assertions

Failing command line in full:
This is a run-time failure, but it is caused by the emission of invalid JavaScript.

Full link command and output with -v appended:

➜  emsdk-export-bug git:(main) ✗ make test
RUSTFLAGS="-C link-arg=--no-entry -C link-arg=-sSIDE_MODULE=1" cargo build --target wasm32-unknown-emscripten
   Compiling rust_lib v0.1.0 (/Users/demarco/repos/emsdk-export-bug)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.09s
em++ -v -s MAIN_MODULE=1 -o main.js main.cpp target/wasm32-unknown-emscripten/debug/rust_lib.wasm
 "/Users/demarco/repos/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -fignore-exceptions -fPIC -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=/Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -c main.cpp -o /var/folders/zm/ll4504dd6dgbvy20y9ls2_hr0000gq/T/emscripten_temp_w2qdgjzf/main_0.o
clang version 22.0.0git (https:/github.com/llvm/llvm-project 61500345787e6fc66e6b6b8a249feaf98c839fbe)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/demarco/repos/emsdk/upstream/bin
Build config: +assertions
 (in-process)
 "/Users/demarco/repos/emsdk/upstream/bin/clang-22" -cc1 -triple wasm32-unknown-emscripten -emit-obj -disable-free -clear-ast-before-backend -main-file-name main.cpp -mrelocation-model pic -pic-level 2 -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-feature +mutable-globals -target-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/Users/demarco/repos/emsdk-export-bug -v -fcoverage-compilation-dir=/Users/demarco/repos/emsdk-export-bug -resource-dir /Users/demarco/repos/emsdk/upstream/lib/clang/22 -D EMSCRIPTEN -isysroot /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /Users/demarco/repos/emsdk/upstream/lib/clang/22/include -internal-isystem /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include -fdeprecated-macro -ferror-limit 19 -fmessage-length=133 -fvisibility=default -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o /var/folders/zm/ll4504dd6dgbvy20y9ls2_hr0000gq/T/emscripten_temp_w2qdgjzf/main_0.o -x c++ main.cpp
clang -cc1 version 22.0.0git based upon LLVM 22.0.0git default target x86_64-apple-darwin24.5.0
ignoring nonexistent directory "/Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
 /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
 /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/compat
 /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
 /Users/demarco/repos/emsdk/upstream/lib/clang/22/include
 /Users/demarco/repos/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
 /Users/demarco/repos/emsdk/upstream/bin/clang --version
 /Users/demarco/repos/emsdk/upstream/bin/wasm-ld @/var/folders/zm/ll4504dd6dgbvy20y9ls2_hr0000gq/T/emscripten_fgot3vus.rsp.utf-8
 /Users/demarco/repos/emsdk/upstream/bin/wasm-ld @/var/folders/zm/ll4504dd6dgbvy20y9ls2_hr0000gq/T/emscripten_b3j8wp3w.rsp.utf-8
 /Users/demarco/repos/emsdk/upstream/bin/llvm-objcopy main.wasm main.wasm '--remove-section=.debug*' --remove-section=producers --remove-section=name
 /Users/demarco/repos/emsdk/node/22.16.0_64bit/bin/node /Users/demarco/repos/emsdk/upstream/emscripten/tools/compiler.mjs -
node main.js
/Users/demarco/repos/emsdk-export-bug/main.js:4572
  function __ZN102_$LT$std..panicking..begin_panic_handler..FormatStringPayload$u20$as$u20$core..panic..PanicPayload$GT$3get17hecee4b43e7ecbd58E(...args
                          ^

SyntaxError: Unexpected token '.'
    at wrapSafe (node:internal/modules/cjs/loader:1281:20)
    at Module._compile (node:internal/modules/cjs/loader:1321:27)
    at Module._extensions..js (node:internal/modules/cjs/loader:1416:10)
    at Module.load (node:internal/modules/cjs/loader:1208:32)
    at Module._load (node:internal/modules/cjs/loader:1024:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:174:12)
    at node:internal/main/run_main_module:28:49

Node.js v20.15.1
make: *** [test] Error 1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions