Since #26276, val::throw_ produces a linker error when used with -fno-exceptions. This worked fine in the latest release (5.0.1). Note that val::throw_ is not just for C++ exceptions, but also regular JS exceptions.
emthrow.cpp:
#include <emscripten/bind.h>
#include <emscripten/val.h>
using namespace emscripten;
static void throwJsError() {
val::global("Error").new_(val("oopsie")).throw_();
}
EMSCRIPTEN_BINDINGS(myBindings) {
function("throwJsError", throwJsError);
}
em++ -v -lembind -fno-exceptions ./emthrow.cpp -o./emthrow.js
/home/swdv/emsdk/upstream/bin/clang --version
shared:INFO: (Emscripten: Running sanity checks)
"/home/swdv/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -fignore-exceptions -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --sysroot=/home/swdv/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -fno-exceptions -c ./emthrow.cpp -o /tmp/emscripten_temp_0w96ky0c/emthrow.o
clang version 23.0.0git (https:/github.com/llvm/llvm-project 6012aa1d4477b6d3aec8c022f4a2222834e6a0fc)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/swdv/emsdk/upstream/bin
Build config: +assertions
(in-process)
"/home/swdv/emsdk/upstream/bin/clang-23" -cc1 -triple wasm32-unknown-emscripten -emit-obj -disable-free -clear-ast-before-backend -main-file-name emthrow.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -fvisibility=hidden -debugger-tuning=gdb -fdebug-compilation-dir=/home/swdv/webtest -v -fcoverage-compilation-dir=/home/swdv/webtest -resource-dir /home/swdv/emsdk/upstream/lib/clang/23 -D EMSCRIPTEN -isysroot /home/swdv/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /home/swdv/emsdk/upstream/lib/clang/23/include -internal-isystem /home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /home/swdv/emsdk/upstream/emscripten/cache/sysroot/include -fdeprecated-macro -ferror-limit 19 -fmessage-length=336 -fgnuc-version=4.2.1 -fskip-odr-check-in-gmf -fignore-exceptions -fcolor-diagnostics -iwithsysroot/include/fakesdl -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o /tmp/emscripten_temp_0w96ky0c/emthrow.o -x c++ ./emthrow.cpp
clang -cc1 version 23.0.0git based upon LLVM 23.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/compat
/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/home/swdv/emsdk/upstream/lib/clang/23/include
/home/swdv/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/home/swdv/emsdk/node/22.16.0_64bit/bin/node /home/swdv/emsdk/upstream/emscripten/tools/compiler.mjs - --symbols-only
/home/swdv/emsdk/upstream/bin/wasm-ld -o ./emthrow.wasm /tmp/tmp_vlw6po6libemscripten_js_symbols.so --strip-debug --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=__getTypeName --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-heap=16777216 --no-entry --stack-first --table-base=1 -lembind-rtti /tmp/emscripten_temp_0w96ky0c/emthrow.o -L/home/swdv/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -L/home/swdv/emsdk/upstream/emscripten/src/lib -lGL-getprocaddr -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc-debug -lcompiler_rt -lc++-debug-noexcept -lc++abi-debug-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr
/home/swdv/emsdk/upstream/bin/llvm-objcopy ./emthrow.wasm ./emthrow.wasm '--remove-section=llvm.func_attr.annotate.*' --remove-section=producers --remove-section=name '--remove-section=.debug*'
/home/swdv/emsdk/node/22.16.0_64bit/bin/node /home/swdv/emsdk/upstream/emscripten/tools/compiler.mjs -
error: undefined symbol: $exceptionLast (referenced by _emval_throw, referenced by root reference (e.g. compiled C/C++ code))
warning: To disable errors for undefined symbols use `-sERROR_ON_UNDEFINED_SYMBOLS=0`
warning: exceptionLast may need to be added to EXPORTED_FUNCTIONS if it arrives from a system library
Error: Aborting compilation due to previous errors
at finalCombiner (file:///home/swdv/emsdk/upstream/emscripten/src/jsifier.mjs:926:13)
at Module.runJSify (file:///home/swdv/emsdk/upstream/emscripten/src/jsifier.mjs:962:5)
at file:///home/swdv/emsdk/upstream/emscripten/tools/compiler.mjs:108:17
em++: error: '/home/swdv/emsdk/node/22.16.0_64bit/bin/node /home/swdv/emsdk/upstream/emscripten/tools/compiler.mjs -' failed (returned 1)
Version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 5.0.2-git (8551146)
clang version 23.0.0git (llvm/llvm-project@6012aa1)
Since #26276,
val::throw_produces a linker error when used with-fno-exceptions. This worked fine in the latest release (5.0.1). Note thatval::throw_is not just for C++ exceptions, but also regular JS exceptions.emthrow.cpp:Version
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 5.0.2-git (8551146)
clang version 23.0.0git (llvm/llvm-project@6012aa1)