emscripten-core / emscripten-core/emscripten
Static initializers of statically-linked libraries are not executed
- Dominant language
- C++
- Stars
- 27.6k
- Forks
- 3.6k
- Avg merge
- 1d 1h
- Merged PRs (30d)
- 105
Description
Hi,
I am currently porting a large C++ codebase to emscripten. This software has plug-ins that are statically linked. Registration of these plug-ins are done in a static initializer in the plug-in.
It appears that the static initializers of the plug-ins are not executed in the Emscripten port. I managed to create a minimal repro, which I have attached to this ticket.
[EmscriptenStaticInitializers.zip](https://github.com/emscripten-core/emscripten/files/8374971/EmscriptenStaticInitializers.zip)
**Version of emscripten/emsdk:**
```
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.8 (3ff7eff373d31d8c0179895165462019221f192e)
clang version 15.0.0 (https://github.com/llvm/llvm-project 80ec0ebfdc5692a58e0832125f2c6a991df9d63f)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/pmilot/emsdk/upstream/bin
```
**Failing command line in full:**
The command-line is not failing; rather, the generated program does not exhibit the expected output.
**Full link command and output with `-v` appended:**
Here is an excerpt of my shell, first demonstrating the POSIX build which works as expected:
```
pmilot@akm-pmilot-01: $ make
g++ -o "build/plugin-a.o" -c "plugin-a.cpp"
ar -rcs "build/plugin-a.a" "build/plugin-a.o"
g++ -o "build/plugin-b.o" -c "plugin-b.cpp"
ar -rcs "build/plugin-b.a" "build/plugin-b.o"
g++ -o "build/main.o" -c "main.cpp"
g++ -o "build/main.html" build/main.o build/plugin-a.a build/plugin-b.a
pmilot@akm-pmilot-01: $ build/main.html
Static initializer for main.
Static initializer for plug-in #1
Static initializer for plug-in #2
This is main.
```
And now the Emscripten build which does not (with the -v flag):
```
pmilot@akm-pmilot-01:$ emmake make
make: make
/home/pmilot/emsdk/upstream/emscripten/em++ -v -o "build/plugin-a.o" -c "plugin-a.cpp"
"/home/pmilot/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -DEMSCRIPTEN -D__EMSCRIPTEN_major__=3 -D__EMSCRIPTEN_minor__=1 -D__EMSCRIPTEN_tiny__=8 -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -Werror=implicit-function-declaration -Xclang -iwithsysroot/include/SDL --sysroot=/home/pmilot/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -v -c plugin-a.cpp -o build/plugin-a.o
clang version 15.0.0 (https://github.com/llvm/llvm-project 80ec0ebfdc5692a58e0832125f2c6a991df9d63f)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/pmilot/emsdk/upstream/bin
(in-process)
"/home/pmilot/emsdk/upstream/bin/clang-15" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name plugin-a.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -resource-dir /home/pmilot/emsdk/upstream/lib/clang/15.0.0 -D EMSCRIPTEN -D __EMSCRIPTEN_major__=3 -D __EMSCRIPTEN_minor__=1 -D __EMSCRIPTEN_tiny__=8 -isysroot /home/pmilot/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/lib/clang/15.0.0/include -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include -Werror=implicit-function-declaration -fdeprecated-macro -fdebug-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -ferror-limit 19 -fvisibility default -fgnuc-version=4.2.1 -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -iwithsysroot/include/SDL -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o build/plugin-a.o -x c++ plugin-a.cpp
clang -cc1 version 15.0.0 based upon LLVM 15.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/SDL
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/compat
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/home/pmilot/emsdk/upstream/lib/clang/15.0.0/include
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/home/pmilot/emsdk/upstream/emscripten/emar -v -rcs "build/plugin-a.a" "build/plugin-a.o"
/home/pmilot/emsdk/upstream/emscripten/em++ -v -o "build/plugin-b.o" -c "plugin-b.cpp"
"/home/pmilot/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -DEMSCRIPTEN -D__EMSCRIPTEN_major__=3 -D__EMSCRIPTEN_minor__=1 -D__EMSCRIPTEN_tiny__=8 -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -Werror=implicit-function-declaration -Xclang -iwithsysroot/include/SDL --sysroot=/home/pmilot/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -v -c plugin-b.cpp -o build/plugin-b.o
clang version 15.0.0 (https://github.com/llvm/llvm-project 80ec0ebfdc5692a58e0832125f2c6a991df9d63f)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/pmilot/emsdk/upstream/bin
(in-process)
"/home/pmilot/emsdk/upstream/bin/clang-15" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name plugin-b.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -resource-dir /home/pmilot/emsdk/upstream/lib/clang/15.0.0 -D EMSCRIPTEN -D __EMSCRIPTEN_major__=3 -D __EMSCRIPTEN_minor__=1 -D __EMSCRIPTEN_tiny__=8 -isysroot /home/pmilot/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/lib/clang/15.0.0/include -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include -Werror=implicit-function-declaration -fdeprecated-macro -fdebug-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -ferror-limit 19 -fvisibility default -fgnuc-version=4.2.1 -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -iwithsysroot/include/SDL -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o build/plugin-b.o -x c++ plugin-b.cpp
clang -cc1 version 15.0.0 based upon LLVM 15.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/SDL
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/compat
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/home/pmilot/emsdk/upstream/lib/clang/15.0.0/include
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/home/pmilot/emsdk/upstream/emscripten/emar -v -rcs "build/plugin-b.a" "build/plugin-b.o"
/home/pmilot/emsdk/upstream/emscripten/em++ -v -o "build/main.o" -c "main.cpp"
"/home/pmilot/emsdk/upstream/bin/clang++" -target wasm32-unknown-emscripten -DEMSCRIPTEN -D__EMSCRIPTEN_major__=3 -D__EMSCRIPTEN_minor__=1 -D__EMSCRIPTEN_tiny__=8 -fignore-exceptions -fvisibility=default -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -Werror=implicit-function-declaration -Xclang -iwithsysroot/include/SDL --sysroot=/home/pmilot/emsdk/upstream/emscripten/cache/sysroot -Xclang -iwithsysroot/include/compat -v -c main.cpp -o build/main.o
clang version 15.0.0 (https://github.com/llvm/llvm-project 80ec0ebfdc5692a58e0832125f2c6a991df9d63f)
Target: wasm32-unknown-emscripten
Thread model: posix
InstalledDir: /home/pmilot/emsdk/upstream/bin
(in-process)
"/home/pmilot/emsdk/upstream/bin/clang-15" -cc1 -triple wasm32-unknown-emscripten -emit-obj -mrelax-all --mrelax-relocations -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name main.cpp -mrelocation-model static -mframe-pointer=none -ffp-contract=on -fno-rounding-math -mconstructor-aliases -target-cpu generic -mllvm -treat-scalable-fixed-error-as-warning -debugger-tuning=gdb -v -fcoverage-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -resource-dir /home/pmilot/emsdk/upstream/lib/clang/15.0.0 -D EMSCRIPTEN -D __EMSCRIPTEN_major__=3 -D __EMSCRIPTEN_minor__=1 -D __EMSCRIPTEN_tiny__=8 -isysroot /home/pmilot/emsdk/upstream/emscripten/cache/sysroot -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1 -internal-isystem /home/pmilot/emsdk/upstream/lib/clang/15.0.0/include -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten -internal-isystem /home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include -Werror=implicit-function-declaration -fdeprecated-macro -fdebug-compilation-dir=/mnt/c/Users/pmilot/Documents/Audiokinetic/Repros/EmscriptenStaticInitializers -ferror-limit 19 -fvisibility default -fgnuc-version=4.2.1 -fcxx-exceptions -fignore-exceptions -fexceptions -fcolor-diagnostics -iwithsysroot/include/SDL -iwithsysroot/include/compat -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr -o build/main.o -x c++ main.cpp
clang -cc1 version 15.0.0 based upon LLVM 15.0.0git default target x86_64-unknown-linux-gnu
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten/c++/v1"
ignoring nonexistent directory "/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/wasm32-emscripten"
#include "..." search starts here:
#include <...> search starts here:
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/SDL
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/compat
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include/c++/v1
/home/pmilot/emsdk/upstream/lib/clang/15.0.0/include
/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/include
End of search list.
/home/pmilot/emsdk/upstream/emscripten/em++ -v -o "build/main.html" build/main.o build/plugin-a.a build/plugin-b.a
"/home/pmilot/emsdk/upstream/bin/wasm-ld" -o build/main.wasm build/main.o build/plugin-a.a build/plugin-b.a -L/home/pmilot/emsdk/upstream/emscripten/cache/sysroot/lib/wasm32-emscripten -lGL -lal -lhtml5 -lstubs-debug -lnoexit -lc-debug -ldlmalloc -lcompiler_rt -lc++-noexcept -lc++abi-noexcept -lsockets -mllvm -combiner-global-alias-analysis=false -mllvm -enable-emscripten-sjlj -mllvm -disable-lsr --import-undefined --strip-debug --export-if-defined=main --export-if-defined=__start_em_asm --export-if-defined=__stop_em_asm --export-if-defined=__stdio_exit --export=emscripten_stack_get_end --export=emscripten_stack_get_free --export=emscripten_stack_get_base --export=emscripten_stack_init --export=stackSave --export=stackRestore --export=stackAlloc --export=__wasm_call_ctors --export=__errno_location --export-table -z stack-size=5242880 --initial-memory=16777216 --no-entry --max-memory=16777216 --global-base=1024
"/home/pmilot/emsdk/upstream/bin/wasm-emscripten-finalize" --dyncalls-i64 build/main.wasm -o build/main.wasm --detect-features
"/home/pmilot/emsdk/node/14.18.2_64bit/bin/node" /home/pmilot/emsdk/upstream/emscripten/src/compiler.js /tmp/tmphxwu9kuk.json
"/home/pmilot/emsdk/upstream/bin/llvm-objcopy" build/main.wasm build/main.wasm --remove-section=.debug* --remove-section=producers
"/home/pmilot/emsdk/node/14.18.2_64bit/bin/node" /home/pmilot/emsdk/upstream/emscripten/tools/preprocessor.js /tmp/emscripten_temp_o2y_ay0m/settings.js shell.html
pmilot@akm-pmilot-01: $ node build/main.js
Static initializer for main.
This is main.
```
Contributor guide
Assessment
This issue has not been assessed yet.