emscripten-core / emscripten-core/emscripten

emscripten 'web' environment stopped working on Cloudflare Workers in 4.0.16

Open
#25,892 9 comments 0 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
27.6k
Forks
3.6k
Avg merge
1d 1h
Merged PRs (30d)
105

Description

With emscripten 4.0.15 and earlier, I am able to run an emscripten-generated web assembly package in a Cloudflare Worker, if I pass `-s ENVIRONMENT=web` to the link command.

With emscripten 4.0.16 and later, this fails, and my code throws the exception
```
✘ [ERROR] Failed to create Opus decoder for tag 67ec9306-2172505094: Error: not compiled for this environment (did you build to HTML and try to run it not on the web, or set ENVIRONMENT to something - like node - and run it someplace else - like on the web?)

at null.
(file:///Users/jlennox/Git/opus-transcriber-proxy/dist/opus-decoder.js:31:11)
at OpusDecoderModule
```

The problem seems to have been introduced by the addition of `minimum-runtime-check.js` to emscripten.

Existing templates for using emscripten with Cloudflare Workers (e.g. https://github.com/cloudflare/worker-emscripten-template) all use `-s ENVIRONMENT=web`.

If instead I remove `-s ENVIRONMENT` entirely, it instead fails with
```
✘ [ERROR] Failed to create Opus decoder for tag 6e4958a3-1246524804: TypeError: Cannot read properties of undefined (reading 'href')

at OpusDecoderModule
(file:///Users/jlennox/Git/opus-transcriber-proxy/dist/opus-decoder.js:90:31)
```

where that section of the file is
```
86 if (typeof __filename != "undefined") {
87 // Node
88 _scriptName = __filename;
89 } else if (ENVIRONMENT_IS_WORKER) {
90 _scriptName = self.location.href;
91 }
```

**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.16 (09534bba7f0ee767bf6f6f8cb5b7bf9519b8d63a)
clang version 22.0.0git (https:/github.com/llvm/llvm-project c4e1bca407f4cca7644937c117890fad157fec4b)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/jlennox/Git/ThirdParty/emsdk/upstream/bin
```

**Full link command and output with `-v` appended:**
```
$ emcc -v -o "./build/EmscriptenWasm.tmp.js" -O2 -msimd128 --minify 0 -s WASM=1 -s TEXTDECODER=2 -s SINGLE_FILE=0 -s MALLOC="emmalloc" -s NO_FILESYSTEM=1 -s ENVIRONMENT=web -s ASSERTIONS=1 -s ABORTING_MALLOC=0 -s EXIT_RUNTIME=0 -s MODULARIZE=1 -s DYNAMIC_EXECUTION=0 -s EXPORT_NAME="OpusDecoderModule" -s INITIAL_MEMORY=28MB -s EXPORTED_FUNCTIONS="[ '_free', '_malloc' , '_opus_frame_decoder_reset' , '_opus_frame_decoder_destroy' , '_opus_frame_decode' , '_opus_frame_decoder_create' ]" -s EXPORTED_RUNTIME_METHODS="['wasmMemory']" -I "src/OpusDecoder/opus/include" src/OpusDecoder/opus_frame_decoder.c ./build/libopus.a
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/clang -target wasm32-unknown-emscripten -fignore-exceptions -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -O2 -msimd128 -Isrc/OpusDecoder/opus/include -c src/OpusDecoder/opus_frame_decoder.c -o /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/opus_frame_decoder.o
clang version 22.0.0git (https:/github.com/llvm/llvm-project c4e1bca407f4cca7644937c117890fad157fec4b)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/jlennox/Git/ThirdParty/emsdk/upstream/bin
(in-process)
"/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/clang-22" -cc1 -triple wasm32-unknown-emscripten -O2 -emit-obj -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name opus_frame_decoder.c -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -target-feature +simd128 -fvisibility=hidden -debugger-tuning=gdb -fdebug-compilation-dir=/Users/jlennox/Git/opus-transcriber-proxy -v -fcoverage-compilation-dir=/Users/jlennox/Git/opus-transcriber-proxy -resource-dir /Users/jlennox/Git/ThirdParty/emsdk/upstream/lib/clang/22 -D EMSCRIPTEN -I src/OpusDecoder/opus/include -isysroot /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/jlennox/Git/ThirdParty/emsdk/upstream/lib/clang/22/include -internal-isystem /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include -ferror-limit 19 -fmessage-length=139 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fignore-exceptions -fcolor-diagnostics -vectorize-loops -vectorize-slp -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/opus_frame_decoder.o -x c src/OpusDecoder/opus_frame_decoder.c
clang -cc1 version 22.0.0git based upon LLVM 22.0.0git default target
ignoring nonexistent directory "/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
src/OpusDecoder/opus/include
/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include/compat
/Users/jlennox/Git/ThirdParty/emsdk/upstream/lib/clang/22/include
/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/clang --version
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/wasm-ld -o ./build/EmscriptenWasm.tmp.wasm /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/opus_frame_decoder.o ./build/libopus.a -L/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -L/Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/src/lib -lGL-getprocaddr -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -lemmalloc-debug -lcompiler_rt -lc++-debug-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/tmpr1k6ytrklibemscripten_js_symbols.so --strip-debug --export=free --export=malloc --export=opus_frame_decoder_reset --export=opus_frame_decoder_destroy --export=opus_frame_decode --export=opus_frame_decoder_create --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_get_current --export=emscripten_stack_init --export=_emscripten_stack_alloc --export=__wasm_call_ctors --export=_emscripten_stack_restore --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__start_em_lib_deps --export-if-defined=__stop_em_lib_deps --export-if-defined=__start_em_js --export-if-defined=__stop_em_js --export-if-defined=main --export-if-defined=__main_argc_argv --export-if-defined=fflush --export-table -z stack-size=65536 --no-growable-memory --initial-memory=29360128 --no-entry --table-base=1 --global-base=1024
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/llvm-objcopy ./build/EmscriptenWasm.tmp.wasm ./build/EmscriptenWasm.tmp.wasm '--remove-section=.debug*' --remove-section=producers --remove-section=name
/Users/jlennox/Git/ThirdParty/emsdk/node/22.16.0_64bit/bin/node /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/tools/compiler.mjs -
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/wasm-opt --strip-target-features --post-emscripten -O2 --low-memory-unused --zero-filled-memory --pass-arg=directize-initial-contents-immutable ./build/EmscriptenWasm.tmp.wasm -o ./build/EmscriptenWasm.tmp.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext --enable-simd
/Users/jlennox/Git/ThirdParty/emsdk/upstream/bin/wasm-opt --strip-target-features --post-emscripten -O2 --low-memory-unused --zero-filled-memory --pass-arg=directize-initial-contents-immutable ./build/EmscriptenWasm.tmp.wasm -o ./build/EmscriptenWasm.tmp.wasm --mvp-features --enable-bulk-memory --enable-bulk-memory-opt --enable-call-indirect-overlong --enable-multivalue --enable-mutable-globals --enable-nontrapping-float-to-int --enable-reference-types --enable-sign-ext --enable-simd
/Users/jlennox/Git/ThirdParty/emsdk/node/22.16.0_64bit/bin/node /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/EmscriptenWasm.tmp.js JSDCE --closure-friendly -o /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/EmscriptenWasm.tmp.jso1.js
/Users/jlennox/Git/ThirdParty/emsdk/node/22.16.0_64bit/bin/node /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/tools/acorn-optimizer.mjs /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/EmscriptenWasm.tmp.js JSDCE --closure-friendly -o /var/folders/25/l5gkls9x1v92qzxgzv28w_zm0000gp/T/emscripten_temp_qos5ik1w/EmscriptenWasm.tmp.jso1.js
/Users/jlennox/Git/ThirdParty/emsdk/node/22.16.0_64bit/bin/node /Users/jlennox/Git/ThirdParty/emsdk/upstream/emscripten/tools/preprocessor.mjs - modularize.js --expand-macros
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.