Skip to content

Multiple symbols defined when using -fwasm-extensions #23974

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
here-abarany opened this issue Mar 24, 2025 · 3 comments
Closed

Multiple symbols defined when using -fwasm-extensions #23974

here-abarany opened this issue Mar 24, 2025 · 3 comments

Comments

@here-abarany
Copy link

This error appeared after updating emsdk, not 100% sure which version introduced it. The output given here is from Windows with Ninja, but it also fails when running on Linux with make. In both cases, the project is generated through cmake (with emcmake) and adding -fwasm-exceptions to the CXX and linker commands.

Version of emscripten/emsdk:

emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.5 (53b38d0c6f9fce1b62c55a8012bc6477f7a42711)
clang version 21.0.0git (https:/github.com/llvm/llvm-project 553da9634dc4bae215e6c850d2de3186d09f9da5)
Target: wasm32-unknown-emscripten
Thread model: posix

Failing command line in full:

C:\WINDOWS\system32\cmd.exe /C "cd . && emsdk\upstream\emscripten\em++.bat -fwasm-exceptions -O3 -DNDEBUG  util/geosop/CMakeFiles/geosop.dir/GeosOp.cpp.o util/geosop/CMakeFiles/geosop.dir/GeometryOp.cpp.o -o bin\geosop.js  lib/libgeos.a  lib/libgeos_c.a  lib/libgeos.a  -lc++-noexcept  -lc++abi-debug-noexcept && cd ."
wasm-ld: error: duplicate symbol: __cxxabiv1::__setExceptionClass(_Unwind_Exception*, unsigned long long)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxxabiv1::__getExceptionClass(_Unwind_Exception const*)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxxabiv1::__isOurExceptionClass(_Unwind_Exception const*)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_allocate_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_free_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_init_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_decrement_exception_refcount
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_get_exception_ptr
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(private_typeinfo.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_increment_exception_refcount
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_current_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_rethrow_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_uncaught_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_uncaught_exceptions
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)
em++: error: 'emsdk/upstream/bin\wasm-ld.exe -o bin\geosop.wasm util/geosop/CMakeFiles/geosop.dir/GeosOp.cpp.o util/geosop/CMakeFiles/geosop.dir/GeometryOp.cpp.o lib/libgeos.a lib/libgeos_c.a lib/libgeos.a -lc++-noexcept -lc++abi-debug-noexcept -Lemsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten -Lemsdk\upstream\emscripten\src\lib -lGL-getprocaddr -lal -lhtml5 -lstubs -lnoexit -lc -ldlmalloc -lcompiler_rt-legacysjlj -lc++-legacyexcept -lc++abi-legacyexcept -lunwind-legacyexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -wasm-enable-sjlj -mllvm -wasm-use-legacy-eh -mllvm -disable-lsr -mllvm -wasm-enable-eh -mllvm -wasm-use-legacy-eh -mllvm -exception-model=wasm C:\Users\abarany\AppData\Local\Temp\tmpm5z0y_a_libemscripten_js_symbols.so --strip-debug --export=_emscripten_stack_alloc --export=__trap --export=__wasm_call_ctors --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-table -z stack-size=65536 --no-growable-memory --initial-heap=16777216 --no-entry --table-base=1 --global-base=1024' failed (returned 1)

Full link command and output with -v appended:

C:\WINDOWS\system32\cmd.exe /C "cd . && emsdk\upstream\emscripten\em++.bat -fwasm-exceptions -v -O3 -DNDEBUG  util/geosop/CMakeFiles/geosop.dir/GeosOp.cpp.o util/geosop/CMakeFiles/geosop.dir/GeometryOp.cpp.o -o bin\geosop.js  lib/libgeos.a  lib/libgeos_c.a  lib/libgeos.a  -lc++-noexcept  -lc++abi-debug-noexcept && cd ."
 "emsdk/upstream/bin\clang.exe" --version
 "emsdk/upstream/bin\wasm-ld.exe" -o bin\geosop.wasm util/geosop/CMakeFiles/geosop.dir/GeosOp.cpp.o util/geosop/CMakeFiles/geosop.dir/GeometryOp.cpp.o lib/libgeos.a lib/libgeos_c.a lib/libgeos.a -lc++-noexcept -lc++abi-debug-noexcept -Lemsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten -Lemsdk\upstream\emscripten\src\lib -lGL-getprocaddr -lal -lhtml5 -lstubs -lnoexit -lc -ldlmalloc -lcompiler_rt-legacysjlj -lc++-legacyexcept -lc++abi-legacyexcept -lunwind-legacyexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -wasm-enable-sjlj -mllvm -wasm-use-legacy-eh -mllvm -disable-lsr -mllvm -wasm-enable-eh -mllvm -wasm-use-legacy-eh -mllvm -exception-model=wasm C:\Users\abarany\AppData\Local\Temp\tmp1pqfvuuilibemscripten_js_symbols.so --strip-debug --export=_emscripten_stack_alloc --export=__trap --export=__wasm_call_ctors --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-table -z stack-size=65536 --no-growable-memory --initial-heap=16777216 --no-entry --table-base=1 --global-base=1024
wasm-ld: error: duplicate symbol: __cxxabiv1::__setExceptionClass(_Unwind_Exception*, unsigned long long)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxxabiv1::__getExceptionClass(_Unwind_Exception const*)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxxabiv1::__isOurExceptionClass(_Unwind_Exception const*)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_allocate_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_free_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_init_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_decrement_exception_refcount
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_get_exception_ptr
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(private_typeinfo.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_increment_exception_refcount
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_current_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_rethrow_primary_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_uncaught_exception
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)

wasm-ld: error: duplicate symbol: __cxa_uncaught_exceptions
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-debug-noexcept.a(cxa_noexception.o)
>>> defined in emsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten\libc++abi-legacyexcept.a(cxa_exception.o)
em++: error: 'emsdk/upstream/bin\wasm-ld.exe -o bin\geosop.wasm util/geosop/CMakeFiles/geosop.dir/GeosOp.cpp.o util/geosop/CMakeFiles/geosop.dir/GeometryOp.cpp.o lib/libgeos.a lib/libgeos_c.a lib/libgeos.a -lc++-noexcept -lc++abi-debug-noexcept -Lemsdk\upstream\emscripten\cache\sysroot\lib\wasm32-emscripten -Lemsdk\upstream\emscripten\src\lib -lGL-getprocaddr -lal -lhtml5 -lstubs -lnoexit -lc -ldlmalloc -lcompiler_rt-legacysjlj -lc++-legacyexcept -lc++abi-legacyexcept -lunwind-legacyexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -wasm-enable-sjlj -mllvm -wasm-use-legacy-eh -mllvm -disable-lsr -mllvm -wasm-enable-eh -mllvm -wasm-use-legacy-eh -mllvm -exception-model=wasm C:\Users\abarany\AppData\Local\Temp\tmp1pqfvuuilibemscripten_js_symbols.so --strip-debug --export=_emscripten_stack_alloc --export=__trap --export=__wasm_call_ctors --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-table -z stack-size=65536 --no-growable-memory --initial-heap=16777216 --no-entry --table-base=1 --global-base=1024' failed (returned 1)
@sbc100
Copy link
Collaborator

sbc100 commented Mar 24, 2025

The command line you list shows -lc++-noexcept -lc++abi-debug-noexcept explicitly added, but those libraries should always be added automatically/implicitly by emcc, no added explicitly like that.

Could this perhaps be a duplicate of #23944? Does adding -DEMSCRIPTEN_FORCE_COMPILERS=ON to your cmake command fix the issue (you need to do a clean build, removing the cmake cache).

@here-abarany
Copy link
Author

Thanks for the quick reply, it looks like adding that option does work around the issue.

@sbc100
Copy link
Collaborator

sbc100 commented Mar 24, 2025

OK, lets close as a duplicate of #23944

@sbc100 sbc100 closed this as completed Mar 24, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants