diff --git a/src/lib/libdylink.js b/src/lib/libdylink.js index fdfe2e6088c31..987b742f9cd64 100644 --- a/src/lib/libdylink.js +++ b/src/lib/libdylink.js @@ -908,13 +908,21 @@ var LibraryDylink = { // now load needed libraries and the module itself. if (flags.loadAsync) { return metadata.neededDynlibs - .reduce((chain, dynNeeded) => chain.then(() => - loadDynamicLibrary(dynNeeded, flags, localScope) - ), Promise.resolve()) + .reduce((chain, needed) => chain.then(() => { +#if FILESYSTEM + needed = findLibraryFS(needed, flags.rpath) ?? needed; +#endif + return loadDynamicLibrary(needed, flags, localScope); + }), Promise.resolve()) .then(loadModule); } - metadata.neededDynlibs.forEach((needed) => loadDynamicLibrary(needed, flags, localScope)); + metadata.neededDynlibs.forEach((needed) => { +#if FILESYSTEM + needed = findLibraryFS(needed, flags.rpath) ?? needed; +#endif + return loadDynamicLibrary(needed, flags, localScope); + }); return loadModule(); }, diff --git a/test/other/codesize/test_codesize_hello_dylink.gzsize b/test/other/codesize/test_codesize_hello_dylink.gzsize index 24d09039ee101..c32c6049908ed 100644 --- a/test/other/codesize/test_codesize_hello_dylink.gzsize +++ b/test/other/codesize/test_codesize_hello_dylink.gzsize @@ -1 +1 @@ -11676 +11696 diff --git a/test/other/codesize/test_codesize_hello_dylink.jssize b/test/other/codesize/test_codesize_hello_dylink.jssize index 0f1f70f75a5f6..f95e9327160ee 100644 --- a/test/other/codesize/test_codesize_hello_dylink.jssize +++ b/test/other/codesize/test_codesize_hello_dylink.jssize @@ -1 +1 @@ -27564 +27613 diff --git a/test/test_other.py b/test/test_other.py index 5e1168c96f224..0ec40203a2314 100644 --- a/test/test_other.py +++ b/test/test_other.py @@ -7748,11 +7748,22 @@ def test_ld_library_path(self, args): @also_with_wasmfs def test_dlopen_rpath(self): + create_file('hello_nested_dep.c', r''' + #include + + void hello_nested_dep() { + printf("Hello_nested_dep\n"); + return; + } + ''') create_file('hello_dep.c', r''' #include + void hello_nested_dep(); + void hello_dep() { printf("Hello_dep\n"); + hello_nested_dep(); return; } ''') @@ -7779,7 +7790,7 @@ def test_dlopen_rpath(self): void (*f)(); double (*f2)(double); - h = dlopen("/usr/lib/libhello.wasm", RTLD_NOW); + h = dlopen("/usr/lib/libhello.so", RTLD_NOW); assert(h); f = dlsym(h, "hello"); assert(f); @@ -7794,20 +7805,22 @@ def test_dlopen_rpath(self): os.mkdir('subdir') def _build(rpath_flag, expected, **kwds): - self.run_process([EMCC, '-o', 'subdir/libhello_dep.so', 'hello_dep.c', '-sSIDE_MODULE']) - self.run_process([EMCC, '-o', 'hello.wasm', 'hello.c', '-sSIDE_MODULE', 'subdir/libhello_dep.so'] + rpath_flag) + self.run_process([EMCC, '-o', 'subdir/libhello_nested_dep.so', 'hello_nested_dep.c', '-sSIDE_MODULE']) + self.run_process([EMCC, '-o', 'subdir/libhello_dep.so', 'hello_dep.c', '-sSIDE_MODULE', 'subdir/libhello_nested_dep.so'] + rpath_flag) + self.run_process([EMCC, '-o', 'hello.so', 'hello.c', '-sSIDE_MODULE', 'subdir/libhello_dep.so'] + rpath_flag) args = ['--profiling-funcs', '-sMAIN_MODULE=2', '-sINITIAL_MEMORY=32Mb', - '--embed-file', 'hello.wasm@/usr/lib/libhello.wasm', + '--embed-file', 'hello.so@/usr/lib/libhello.so', '--embed-file', 'subdir/libhello_dep.so@/usr/lib/subdir/libhello_dep.so', - 'hello.wasm', '-sNO_AUTOLOAD_DYLIBS', - '-L./subdir', '-lhello_dep'] + '--embed-file', 'subdir/libhello_nested_dep.so@/usr/lib/subdir/libhello_nested_dep.so', + 'hello.so', '-sNO_AUTOLOAD_DYLIBS', + '-L./subdir', '-lhello_dep', '-lhello_nested_dep'] self.do_runf('main.c', expected, emcc_args=args, **kwds) # case 1) without rpath: fail to locate the library _build([], r"no such file or directory, open '.*libhello_dep\.so'", regex=True, assert_returncode=NON_ZERO) # case 2) with rpath: success - _build(['-Wl,-rpath,$ORIGIN/subdir'], "Hello\nHello_dep\nOk\n") + _build(['-Wl,-rpath,$ORIGIN/subdir,-rpath,$ORIGIN'], "Hello\nHello_dep\nHello_nested_dep\nOk\n") def test_dlopen_bad_flags(self): create_file('main.c', r'''