Skip to content

Commit a992932

Browse files
authored
Use locateFile in the dynamic module loader (#18382)
With this change, in `loadLibData` the path to `libFile` is passed through `locateFile` before attempting to download the data from an external source. Fixes #14502
1 parent aab32ef commit a992932

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

src/library_dylink.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,7 @@ var LibraryDylink = {
858858
return flags.loadAsync ? Promise.resolve(libData) : libData;
859859
}
860860

861+
libFile = locateFile(libFile);
861862
if (flags.loadAsync) {
862863
return new Promise(function(resolve, reject) {
863864
readAsync(libFile, (data) => resolve(new Uint8Array(data)), reject);

test/test_core.py

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3102,7 +3102,7 @@ def test_dlfcn_missing(self):
31023102
if self.js_engines == [config.V8_ENGINE]:
31033103
expected = "error: Could not load dynamic lib: libfoo.so\nError: Error reading file"
31043104
else:
3105-
expected = "error: Could not load dynamic lib: libfoo.so\nError: ENOENT: no such file or directory, open 'libfoo.so'"
3105+
expected = "error: Could not load dynamic lib: libfoo.so\nError: ENOENT: no such file or directory"
31063106
self.do_run(src, expected)
31073107

31083108
@needs_dylink
@@ -4071,6 +4071,7 @@ def dylink_test(self, main, side, expected=None, header=None, force_c=False,
40714071

40724072
def dylink_testf(self, main, side=None, expected=None, force_c=False, main_emcc_args=None,
40734073
main_module=2,
4074+
so_dir='',
40744075
so_name='liblib.so',
40754076
need_reverse=True, **kwargs):
40764077
main_emcc_args = main_emcc_args or []
@@ -4094,13 +4095,13 @@ def dylink_testf(self, main, side=None, expected=None, force_c=False, main_emcc_
40944095
self.run_process([EMCC] + side + self.get_emcc_args() + ['-o', out_file])
40954096
else:
40964097
out_file = self.build(side, js_outfile=(side_suffix == 'js'))
4097-
shutil.move(out_file, so_name)
4098+
shutil.move(out_file, os.path.join(so_dir, so_name))
40984099

40994100
# main settings
41004101
self.set_setting('MAIN_MODULE', main_module)
41014102
self.clear_setting('SIDE_MODULE')
41024103
self.emcc_args += main_emcc_args
4103-
self.emcc_args.append(so_name)
4104+
self.emcc_args.append(os.path.join(so_dir, so_name))
41044105

41054106
if force_c:
41064107
self.emcc_args.append('-nostdlib++')
@@ -4120,7 +4121,7 @@ def dylink_testf(self, main, side=None, expected=None, force_c=False, main_emcc_
41204121
# Test the reverse as well. There we flip the role of the side module and main module.
41214122
# - We add --no-entry since the side module doesn't have a `main`
41224123
self.dylink_testf(side, main, expected, force_c, main_emcc_args + ['--no-entry'],
4123-
need_reverse=False, **kwargs)
4124+
main_module, so_dir, so_name, need_reverse=False, **kwargs)
41244125

41254126
def do_basic_dylink_test(self, **kwargs):
41264127
self.dylink_test(r'''
@@ -4177,6 +4178,22 @@ def test_dylink_safe_heap(self):
41774178
self.set_setting('SAFE_HEAP')
41784179
self.do_basic_dylink_test()
41794180

4181+
@needs_dylink
4182+
def test_dylink_locate_file(self):
4183+
so_dir = 'so_dir'
4184+
so_name = 'liblib.so'
4185+
os.mkdir(so_dir)
4186+
create_file('pre.js', '''
4187+
Module['locateFile'] = function(f) {
4188+
if (f === '%s') {
4189+
return '%s/' + f;
4190+
} else {
4191+
return f;
4192+
}
4193+
};
4194+
''' % (so_name, so_dir))
4195+
self.do_basic_dylink_test(so_dir=so_dir, so_name=so_name, main_emcc_args=['--pre-js', 'pre.js'])
4196+
41804197
@needs_dylink
41814198
def test_dylink_function_pointer_equality(self):
41824199
self.dylink_test(r'''

0 commit comments

Comments
 (0)