Skip to content

Unexpected increase in javascript file size #20438

@wenhanchong

Description

@wenhanchong

Version of emscripten/emsdk: 3.1.41
emcc (Emscripten gcc/clang-like replacement + linker emulating GNU ld) 3.1.41 (71634e0)
clang version 17.0.0 (https://github.com/llvm/llvm-project 88421ea973916e60c34beb26597a5fc33f83dd8f)
Target: wasm32-unknown-emscripten
Thread model: posix

After upgrading from 3.1.16 to 3.1.41, I noticed a huge increase in the size of my application's javascript file generated by emscripten (1.2MB to 10.8MB). Seems to stem from a change in this PR: #18540 where the scope of included functions

settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.extend(strong_imports)

was changed to

settings.DEFAULT_LIBRARY_FUNCS_TO_INCLUDE.extend(sorted(imports))

Some examples of "extra" included functions in js file when using 3.1.41 (names removed):

function __Z10D3E_ABCDI10D3E_EFJHI_() { return wasmImports._Z10D3E_ABCDI10D3E_EFHJI_.apply(null, arguments) } __Z10D3E_ABCDI10D3E_EFHJI_.stub = !0;
function __Z10D3E_ABCDI10D3E_JKLMN_() { return wasmImports._Z10D3E_ABCDI10D3E_JKLMN_.apply(null, arguments) } __Z10D3E_ABCDI10D3E_JKLMN_.stub = !0;
...
var wasmImports = {
  _Z10D3E_ABCDI10D3E_EFJHI_: __Z10D3E_ABCDI10D3E_EFJHI_,
  _Z10D3E_ABCDI10D3E_JKLMN_: __Z10D3E_ABCDI10D3E_JKLMN_,
  ...
  }

Linker flags:

LINK_FLAGS =
-fPIC
-s WASM_BIGINT=1
-fwasm-exceptions
-s MAIN_MODULE=2
-s INCLUDE_FULL_LIBRARY=1
-s AUTOLOAD_DYLIBS=0
-s NO_EXIT_RUNTIME=0
-s INLINING_LIMIT=1
-s FORCE_FILESYSTEM=1
--emit-symbol-map
-s LEGACY_GL_EMULATION=0
-s INITIAL_MEMORY=1000MB
-s ENVIRONMENT=web,worker
-s USE_SDL=0
-s EXPORTED_RUNTIME_METHODS=['allocate','writeArrayToMemory']
-s EXPORT_EXCEPTION_HANDLING_HELPERS=1
-s USE_WEBGL2=1
-s USE_GLFW=3
-s FULL_ES3=1
-s USE_WEBGPU=1
-s WASM=1
-s ALLOW_MEMORY_GROWTH=1
-s EVAL_CTORS=0
WASM1.wasm
WASM2.wasm
WASM3.wasm
-s USE_ICU=1
-flto
-Os
-s GL_TRACK_ERRORS=0

Non-exhaustive list of libraries (names removed):

LINK_LIBRARIES =
--pre-js PREJS.js
--post-js POSTJS.js
-Wl,--whole-archive  LIB1.a
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB2.a
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB3.a
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB4.a
...
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB5.a
-Wl,--no-whole-archive  LIB6.a
LIB7.a
...
LIB8.a
-Wl,--whole-archive  LIB9.a
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB10.a
...
-Wl,--no-whole-archive  -Wl,--whole-archive  LIB11.a
-Wl,--no-whole-archive  LIB12.a
--js-library "JSLIB1.js"
LIB13.a
--js-library "JSLIB2.js"
LIB14.a
LIB15.a
LIB16.a
LIB17.a
...
LIB18.a
LIB2.a
LIB4.a
LIB5.a
LIB19.bc
LIB20.bc
LIB21.bc
LIB22.so
LIB23.a
...
LIB24.a
LIB1.a
LIB3.a
...

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions