emscripten-core / emscripten-core/emscripten

emcc fails to create an executable if ASYNCIFY + EM_ASYNC_JS macro is used: the compiler doesn't find the function used within the EM_ASYNC_JS macro

Open
#26,179 4 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

I have an emscripten project which relies on the -sASYNCIFY features. Trying to compile it with fsanitize=address as additional argument to reveal problems fails because the functions wrapped with the EM_ASYNC_JS macro are then not seen by the compiler anymore.

I have a function addPersistentDirs exposed via the EM_ASYNC_JS macro
```EM_ASYNC_JS(void,addPersistentDirsInt,(),...```
and as soon as adding ```-fsanitize=address``` the linking fails with the function not found.
```-fsanitze=leak``` works fine btw.

**Version of emscripten/emsdk:**
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 4.0.22 (0f3d2e62bccf8e14497ff19e05a1202c51eb0c65)
clang version 22.0.0git (https:/github.com/llvm/llvm-project c7706d9472fe880ba1d3418919ad4185710c9559)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/leo/w/github/emsdk/upstream/bin

**Failing command line in full:**
emcc \
-O2 \
--pre-js pre.js \
-s MAIN_MODULE=1 \
-s FORCE_FILESYSTEM=1 \
-s EXPORT_ALL=1 \
-s ASSERTIONS=1 \
-s STACK_SIZE=200000 \
-s ASYNCIFY \
-s ASYNCIFY_STACK_SIZE=200000 \
-s MAXIMUM_MEMORY=4GB \
-s STACK_OVERFLOW_CHECK=2 \
-s EXIT_RUNTIME=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-lidbfs.js \
-lproxyfs.js \
-fsanitize=address \
main.c -o main.html
error: undefined symbol: addPersistentDirsInt (referenced by root reference (e.g. compiled C/C++ code))
warning: To disable errors for undefined symbols use `-sERROR_ON_UNDEFINED_SYMBOLS=0`
warning: _addPersistentDirsInt 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:///Users/leo/w/github/emsdk/upstream/emscripten/src/jsifier.mjs:889:13)
at Module.runJSify (file:///Users/leo/w/github/emsdk/upstream/emscripten/src/jsifier.mjs:925:5)
at file:///Users/leo/w/github/emsdk/upstream/emscripten/tools/compiler.mjs:108:17
emcc: error: '/Users/leo/w/github/emsdk/node/20.18.0_64bit/bin/node /Users/leo/w/github/emsdk/upstream/emscripten/tools/compiler.mjs -' failed (returned 1)
make: *** [main.html] Error 1

**Full link command and output with `-v` appended:**
emcc \
-v \
-O2 \
--pre-js pre.js \
-s MAIN_MODULE=1 \
-s FORCE_FILESYSTEM=1 \
-s EXPORT_ALL=1 \
-s ASSERTIONS=1 \
-s STACK_SIZE=200000 \
-s ASYNCIFY \
-s ASYNCIFY_STACK_SIZE=200000 \
-s MAXIMUM_MEMORY=4GB \
-s STACK_OVERFLOW_CHECK=2 \
-s EXIT_RUNTIME=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-lidbfs.js \
-lproxyfs.js \
-fsanitize=address \
main.c -o main.html
/Users/leo/w/github/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/leo/w/github/emsdk/upstream/emscripten/cache/sysroot -DEMSCRIPTEN -Xclang -iwithsysroot/include/fakesdl -Xclang -iwithsysroot/include/compat -v -O2 -fsanitize=address -c main.c -o /var/folders/fv/7l4yvm9d2bvbsvl80kmhp8b40000gn/T/emscripten_temp_mx_9x87n/main.o
clang version 22.0.0git (https:/github.com/llvm/llvm-project c7706d9472fe880ba1d3418919ad4185710c9559)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /Users/leo/w/github/emsdk/upstream/bin
(in-process)
"/Users/leo/w/github/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 main.c -mrelocation-model pic -pic-level 2 -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-feature +mutable-globals -target-cpu generic -debugger-tuning=gdb -fdebug-compilation-dir=/Users/leo/tmp/em_fsanitize_address -v -fcoverage-compilation-dir=/Users/leo/tmp/em_fsanitize_address -resource-dir /Users/leo/w/github/emsdk/upstream/lib/clang/22 -D EMSCRIPTEN -isysroot /Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /Users/leo/w/github/emsdk/upstream/lib/clang/22/include -internal-isystem /Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include -ferror-limit 19 -fmessage-length=98 -fvisibility=default -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 -fsanitize=address -fno-sanitize-memory-param-retval -fsanitize-address-use-after-scope -fsanitize-address-globals-dead-stripping -fno-assume-sane-operator-new -o /var/folders/fv/7l4yvm9d2bvbsvl80kmhp8b40000gn/T/emscripten_temp_mx_9x87n/main.o -x c main.c
clang -cc1 version 22.0.0git based upon LLVM 22.0.0git default target
ignoring nonexistent directory "/Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include/fakesdl
/Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include/compat
/Users/leo/w/github/emsdk/upstream/lib/clang/22/include
/Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/Users/leo/w/github/emsdk/upstream/bin/clang --version
/Users/leo/w/github/emsdk/upstream/bin/wasm-ld -o main.wasm -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --export-if-defined=setThrew --export-if-defined=_emscripten_stack_restore --export-if-defined=emscripten_stack_get_current --export-if-defined=_emscripten_find_dylib --export-if-defined=strerror --export-if-defined=_emscripten_stack_alloc --export-if-defined=emscripten_get_sbrk_ptr --export-if-defined=__heap_base --export-if-defined=calloc --export-if-defined=malloc --export-if-defined=free --export-if-defined=_emscripten_tempret_get --export-if-defined=_emscripten_tempret_set --export-if-defined=htons --export-if-defined=ntohs --export-if-defined=htonl --export-if-defined=_emscripten_timeout --export-if-defined=realloc --export-if-defined=memalign --export-if-defined=emscripten_builtin_malloc --export-if-defined=emscripten_builtin_free --export-if-defined=emscripten_builtin_memalign --export-if-defined=emscripten_builtin_calloc --export-if-defined=emscripten_builtin_realloc --export-if-defined=emscripten_stack_get_base --export-if-defined=emscripten_stack_get_end --export-if-defined=__cxa_can_catch --export-if-defined=__cxa_increment_exception_refcount --export-if-defined=__cxa_get_exception_ptr --export-if-defined=__cxa_decrement_exception_refcount --export-if-defined=fileno --export-if-defined=__dl_seterr --export-if-defined=memcmp --export-if-defined=memcpy --export-if-defined=emscripten_stack_set_limits --export-if-defined=__cxa_demangle /var/folders/fv/7l4yvm9d2bvbsvl80kmhp8b40000gn/T/tmp6yued_4mlibemscripten_js_symbols.so --export-dynamic -Bdynamic --export=__stack_pointer --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=malloc --export=calloc --export=realloc --export=memalign --export=free --export=emscripten_builtin_malloc --export=emscripten_builtin_calloc --export=emscripten_builtin_realloc --export=emscripten_builtin_memalign --export=emscripten_builtin_free --export=__asan_loadN --export=__asan_storeN --export=__funcs_on_exit --export=__wasm_call_ctors --export=setThrew --export=_emscripten_stack_restore --export=_emscripten_find_dylib --export=strerror --export=emscripten_get_sbrk_ptr --export=__heap_base --export=_emscripten_tempret_get --export=_emscripten_tempret_set --export=htons --export=ntohs --export=htonl --export=_emscripten_timeout --export=__cxa_can_catch --export=__cxa_increment_exception_refcount --export=__cxa_get_exception_ptr --export=__cxa_decrement_exception_refcount --export=fileno --export=__dl_seterr --export=memcmp --export=memcpy --export=emscripten_stack_set_limits --export=__cxa_demangle --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 --experimental-pic --unresolved-symbols=import-dynamic --export-table --growable-table -z stack-size=200000 --max-memory=4294967296 --initial-memory=630390784 --no-entry --no-stack-first --table-base=1 --global-base=613572608 --whole-archive /var/folders/fv/7l4yvm9d2bvbsvl80kmhp8b40000gn/T/emscripten_temp_mx_9x87n/main.o -L/Users/leo/w/github/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten/pic -L/Users/leo/w/github/emsdk/upstream/emscripten/src/lib -lGL-getprocaddr -lal -lhtml5 -lstubs-debug -lc-asan-debug -ldlmalloc-debug -lcompiler_rt -lc++-debug-noexcept -lc++abi-debug-noexcept -lsockets -lasan_rt -lubsan_rt -llsan_common_rt -lsanitizer_common_rt --no-whole-archive
/Users/leo/w/github/emsdk/upstream/bin/llvm-objcopy main.wasm main.wasm '--remove-section=.debug*' --remove-section=producers
/Users/leo/w/github/emsdk/upstream/bin/wasm-emscripten-finalize -g --bigint --no-legalize-javascript-ffi --check-stack-overflow main.wasm -o main.wasm --detect-features
/Users/leo/w/github/emsdk/node/20.18.0_64bit/bin/node /Users/leo/w/github/emsdk/upstream/emscripten/tools/compiler.mjs -
error: undefined symbol: addPersistentDirsInt (referenced by root reference (e.g. compiled C/C++ code))
warning: To disable errors for undefined symbols use `-sERROR_ON_UNDEFINED_SYMBOLS=0`
warning: _addPersistentDirsInt 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:///Users/leo/w/github/emsdk/upstream/emscripten/src/jsifier.mjs:889:13)
at Module.runJSify (file:///Users/leo/w/github/emsdk/upstream/emscripten/src/jsifier.mjs:925:5)
at file:///Users/leo/w/github/emsdk/upstream/emscripten/tools/compiler.mjs:108:17
emcc: error: '/Users/leo/w/github/emsdk/node/20.18.0_64bit/bin/node /Users/leo/w/github/emsdk/upstream/emscripten/tools/compiler.mjs -' failed (returned 1)

[em_fsanitize_address.zip](https://github.com/user-attachments/files/24894200/em_fsanitize_address.zip)

[github sample](https://github.com/leopatras/em_fsanitize_address)

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.