From: Alexandre Janniaux Date: Tue, 10 Mar 2026 17:46:58 +0000 (+0100) Subject: m4/libtool.m4: fix emscripten CXX postdeps using non-PIC sysroot X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9ea17fa02dc91b981a1ef0a29f1d7e597b622afa;p=thirdparty%2Flibtool.git m4/libtool.m4: fix emscripten CXX postdeps using non-PIC sysroot Commit d8a934458b251b465b7d31da9ba9148a128a146d introduced shared libraries support for emscripten, using -sSIDE_MODULE=1, but the CXX dependency detection in _LT_SYS_HIDDEN_LIBDEPS will only try to use `-shared` link option to discover implicit dependencies. The libraries and search paths reported by em++ differ depending on whether -sSIDE_MODULE=2 is passed: em++ -shared -v conftest.o: -L/lib/wasm32-emscripten (<-- non-PIC) -lhtml5... (other -l flags) em++ -sSIDE_MODULE=2 -shared -v conftest.o -L/lib/wasm32-emscripten/pic (<-- PIC) (no -l flags) Without -sSIDE_MODULE=2, the detected postdeps contain the non-PIC sysroot path and system libraries. These get injected into the CXX shared library link line before emcc can append the PIC sysroot, causing wasm-ld to resolve system libraries from non-PIC archives, typically in VLC build system: error: R_WASM_MEMORY_ADDR_LEB cannot be used against symbol; recompile with -fPIC We resolved the issue in VLC by patching the postdeps but they were not generated properly in the first place. Fix by overriding output_verbose_link_cmd for emscripten in _LT_LANG_CXX_CONFIG. The override passes -sSIDE_MODULE=2, matching what archive_cmds actually uses at link time so that the detected paths point to the PIC sysroot. * NEWS: Update. --- diff --git a/NEWS b/NEWS index 091b99b60..813eb1a4f 100644 --- a/NEWS +++ b/NEWS @@ -30,6 +30,8 @@ NEWS - list of user-visible changes between releases of GNU Libtool - Recognise more static linking options for Clang. + - Fix emscripten CXX postdeps using non-PIC sysroot. + ** Changes in supported systems or compilers: - Add support for SlimCC compiler. diff --git a/m4/libtool.m4 b/m4/libtool.m4 index d8627ba26..84a34a128 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -7704,6 +7704,14 @@ if test yes != "$_lt_caught_CXX_error"; then _LT_TAGVAR(ld_shlibs, $1)=no ;; + emscripten*) + # Emscripten side modules (-sSIDE_MODULE=2) use a separate PIC sysroot + # and do not link system libraries (they are imported from the main module + # at runtime). Re-run the verbose link with -sSIDE_MODULE=2 so that the + # detected paths point to the PIC sysroot instead of the non-PIC one. + output_verbose_link_cmd='$CC -sSIDE_MODULE=2 -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP " [[-]]L"' + ;; + *) # FIXME: insert proper C++ library support _LT_TAGVAR(ld_shlibs, $1)=no