Skip to content

Commit 8f9f7e9

Browse files
committed
In EMSCRIPTEN_STRICT mode, stop autolinking to all system provided JS libraries, but instead require explicitly specifying which ones to link to on command line.
1 parent 305bbe4 commit 8f9f7e9

File tree

3 files changed

+80
-29
lines changed

3 files changed

+80
-29
lines changed

emcc.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -922,6 +922,8 @@ def detect_fixed_language_mode(args):
922922
if separate_asm:
923923
shared.Settings.SEPARATE_ASM = os.path.basename(asm_target)
924924

925+
system_js_libraries = []
926+
925927
# Find library files
926928
for i, lib in libs:
927929
logging.debug('looking for library "%s"', lib)
@@ -938,14 +940,39 @@ def detect_fixed_language_mode(args):
938940
break
939941
if found: break
940942
if found: break
941-
if not found and lib not in ['GL', 'GLU', 'glut', 'm', 'c', 'SDL', 'stdc++', 'pthread']: # whitelist our default libraries
942-
emscripten_strict_mode = (os.environ.get('EMSCRIPTEN_STRICT') and int(os.environ.get('EMSCRIPTEN_STRICT')) != 0) or 'EMSCRIPTEN_STRICT=1' in settings_changes
943-
error_on_missing_libraries = (emscripten_strict_mode and not 'ERROR_ON_MISSING_LIBRARIES=0' in settings_changes) or 'ERROR_ON_MISSING_LIBRARIES=1' in settings_changes
944-
if error_on_missing_libraries:
945-
logging.fatal('emcc: cannot find library "%s"', lib)
946-
exit(1)
943+
if not found:
944+
# Some native libraries are implemented in Emscripten as system side JS libraries
945+
js_system_libraries = {
946+
'c': '',
947+
'EGL': 'library_egl.js',
948+
'GL': 'library_gl.js',
949+
'GLESv2': 'library_gl.js',
950+
'GLEW': 'library_glew.js',
951+
'glfw': 'library_glfw.js',
952+
'glfw3': 'library_glfw.js',
953+
'GLU': '',
954+
'glut': 'library_glut.js',
955+
'm': '',
956+
'openal': 'library_openal.js',
957+
'pthread': '',
958+
'SDL': 'library_sdl.js',
959+
'stdc++': ''
960+
}
961+
if lib in js_system_libraries:
962+
if len(js_system_libraries[lib]) > 0:
963+
system_js_libraries += [js_system_libraries[lib]]
964+
elif lib.endswith('.js') and os.path.isfile(shared.path_from_root('src', 'library_' + lib)):
965+
system_js_libraries += ['library_' + lib]
947966
else:
948-
logging.warning('emcc: cannot find library "%s"', lib)
967+
emscripten_strict_mode = (os.environ.get('EMSCRIPTEN_STRICT') and int(os.environ.get('EMSCRIPTEN_STRICT')) != 0) or 'EMSCRIPTEN_STRICT=1' in settings_changes
968+
error_on_missing_libraries = (emscripten_strict_mode and not 'ERROR_ON_MISSING_LIBRARIES=0' in settings_changes) or 'ERROR_ON_MISSING_LIBRARIES=1' in settings_changes
969+
if error_on_missing_libraries:
970+
logging.fatal('emcc: cannot find library "%s"', lib)
971+
exit(1)
972+
else:
973+
logging.warning('emcc: cannot find library "%s"', lib)
974+
975+
settings_changes.append('SYSTEM_JS_LIBRARIES="' + ','.join(system_js_libraries) + '"')
949976

950977
# If not compiling to JS, then we are compiling to an intermediate bitcode objects or library, so
951978
# ignore dynamic linking, since multiple dynamic linkings can interfere with each other

src/modules.js

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -96,41 +96,62 @@ var LibraryManager = {
9696
load: function() {
9797
if (this.library) return;
9898

99+
// Core system libraries (always linked against)
99100
var libraries = [
100101
'library.js',
101102
'library_browser.js',
102103
'library_formatString.js',
103104
'library_path.js',
104-
'library_syscall.js'
105+
'library_syscall.js',
106+
'library_html5.js'
105107
];
108+
106109
if (!NO_FILESYSTEM) {
110+
// Core filesystem libraries (always linked against, unless -s NO_FILESYSTEM=1 is specified)
107111
libraries = libraries.concat([
108112
'library_fs.js',
109-
'library_idbfs.js',
110113
'library_memfs.js',
111-
'library_nodefs.js',
112-
'library_sockfs.js',
113-
'library_workerfs.js',
114114
'library_tty.js',
115-
'library_lz4.js',
115+
]);
116+
117+
// Additional filesystem libraries (in strict mode, link to these explicitly via -lxxx.js)
118+
if (!EMSCRIPTEN_STRICT) {
119+
libraries = libraries.concat([
120+
'library_idbfs.js',
121+
'library_nodefs.js',
122+
'library_sockfs.js',
123+
'library_workerfs.js',
124+
'library_lz4.js',
125+
]);
126+
}
127+
}
128+
129+
// Additional JS libraries (in strict mode, link to these explicitly via -lxxx.js)
130+
if (!EMSCRIPTEN_STRICT) {
131+
libraries = libraries.concat([
132+
'library_sdl.js',
133+
'library_gl.js',
134+
'library_glut.js',
135+
'library_xlib.js',
136+
'library_egl.js',
137+
'library_openal.js',
138+
'library_glfw.js',
139+
'library_uuid.js',
140+
'library_glew.js',
141+
'library_signals.js',
142+
'library_idbstore.js',
143+
'library_async.js',
144+
'library_vr.js'
116145
]);
117146
}
118-
libraries = libraries.concat([
119-
'library_sdl.js',
120-
'library_gl.js',
121-
'library_glut.js',
122-
'library_xlib.js',
123-
'library_egl.js',
124-
'library_openal.js',
125-
'library_glfw.js',
126-
'library_uuid.js',
127-
'library_glew.js',
128-
'library_html5.js',
129-
'library_signals.js',
130-
'library_idbstore.js',
131-
'library_async.js',
132-
'library_vr.js'
133-
]).concat(additionalLibraries);
147+
148+
// If there are any explicitly specified system JS libraries to link to, add those to link.
149+
if (SYSTEM_JS_LIBRARIES) {
150+
SYSTEM_JS_LIBRARIES = SYSTEM_JS_LIBRARIES.split(',');
151+
libraries = libraries.concat(SYSTEM_JS_LIBRARIES);
152+
}
153+
154+
libraries = libraries.concat(additionalLibraries);
134155

135156
if (BOOTSTRAPPING_STRUCT_INFO) libraries = ['library_bootstrap_structInfo.js', 'library_formatString.js'];
136157
if (ONLY_MY_CODE) {

src/settings.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -513,6 +513,9 @@ var ERROR_ON_MISSING_LIBRARIES = 0; // If set to 1, any -lfoo directives pointin
513513
// building with -s ERROR_ON_MISSING_LIBRARIES=0 setting,
514514
// prefer to set that option explicitly in your build system.
515515

516+
var SYSTEM_JS_LIBRARIES = []; // Specifies a list of Emscripten-provided JS libraries to link against.
517+
// (internal, use -lfoo or -lfoo.js to link to Emscripten system JS libraries)
518+
516519
var SMALL_XHR_CHUNKS = 0; // Use small chunk size for binary synchronous XHR's in Web Workers.
517520
// Used for testing.
518521
// See test_chunked_synchronous_xhr in runner.py and library.js.

0 commit comments

Comments
 (0)