URL: <https://savannah.gnu.org/support/?111193>
Summary: libtool misses adding `libclang_rt.builtins-x86_64.a` to c++ shared libraries Group: GNU Libtool Submitter: slyfox Submitted: Sun 23 Feb 2025 10:41:26 AM UTC Category: None Priority: 5 - Normal Severity: 3 - Normal Status: None Privacy: Public Assigned to: None Originator Email: Open/Closed: Open Discussion Lock: Any Operating System: None _______________________________________________________ Follow-up Comments: ------------------------------------------------------- Date: Sun 23 Feb 2025 10:41:26 AM UTC By: Sergei Trofimovich <slyfox> The downstream issue is `soundtouch` build failure on `clang` with `compiler-rt` as a compiler runtime implementation: https://codeberg.org/soundtouch/soundtouch/issues/47#issuecomment-2867506 Minimal reproducer is 3 files: configure.ac, Makefile.am, bug.cc. configure.ac: # cat configure.ac AC_INIT([rt-bug], [1.0]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_MACRO_DIRS([m4]) LT_INIT AC_PROG_CXX AC_LANG([C++]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT Makefile.am: ACLOCAL_AMFLAGS = -I m4 lib_LTLIBRARIES = libbug.la libbug_la_SOURCES = bug.cc libbug_la_LDFLAGS = -Wl,--no-undefined bug.cc: // to break: // $ autoreconf -ivf && ./configure CC=x86_64-pc-linux-gnu-clang CXX=x86_64-pc-linux-gnu-clang++ && make clean && make double bug(double a, int b) { // explicitly call the function from libgcc.a / libclang-builtins: return __builtin_powi(a,b); } Triggering the failure: $ autoreconf -ivf && ./configure CC=x86_64-pc-linux-gnu-clang CXX=x86_64-pc-linux-gnu-clang++ && make clean && make ... /bin/sh ./libtool --tag=CXX --mode=compile x86_64-pc-linux-gnu-clang++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"rt-bug\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c -o bug.lo bug.cc libtool: compile: x86_64-pc-linux-gnu-clang++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" "-DPACKAGE_STRING=\"rt-bug 1.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c bug.cc -fPIC -DPIC -o .libs/bug.o libtool: compile: x86_64-pc-linux-gnu-clang++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" "-DPACKAGE_STRING=\"rt-bug 1.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c bug.cc -o bug.o >/dev/null 2>&1 mv -f .deps/bug.Tpo .deps/bug.Plo /bin/sh ./libtool --tag=CXX --mode=link x86_64-pc-linux-gnu-clang++ -g -O2 -Wl,--no-undefined -o libbug.la -rpath /usr/local/lib bug.lo libtool: link: x86_64-pc-linux-gnu-clang++ -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crti.o /usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/clang_rt.crtbegin-x86_64.o .libs/bug.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/14 -L/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/lib -L/lib -L/usr/lib -lc++ -lm -lc -lunwind /usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/clang_rt.crtend-x86_64.o /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crtn.o -g -O2 -Wl,--no-undefined -Wl,-soname -Wl,libbug.so.0 -o .libs/libbug.so.0.0.0 ld.lld: error: undefined symbol: __powidf2 >>> referenced by bug.cc:6 (/root/libtool-missing-runtime/bug.cc:6) >>> .libs/bug.o:(bug(double, int)) x86_64-pc-linux-gnu-clang++: error: linker command failed with exit code 1 (use -v to see invocation) make: *** [Makefile:431: libbug.la] Error 1 Note: the problem here is that `libtool` uses `clang++` to link a shared library with `-nostdlib` but it lacks bits that define an implementation of `__powidf2`. Here for comparison how `clang++` without `libtool` pulls in needed runtime bits: $ x86_64-pc-linux-gnu-clang++ bug.cc -o libbug.so -shared -Wl,--no-undefined -Wl,-t /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crti.o /usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/clang_rt.crtbegin-x86_64.o /tmp/bug-15776c.o /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/libc++_shared.so /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/libc++abi.so /lib64/libm.so.6 /lib64/libmvec.so.1 /usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/libclang_rt.builtins-x86_64.a(powidf2.c.o) /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/libunwind.so /lib64/libc.so.6 /lib64/ld-linux-x86-64.so.2 /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/libunwind.so /usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/clang_rt.crtend-x86_64.o /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crtn.o Note how `/usr/lib/llvm/17/bin/../../../../lib/clang/17/lib/linux/libclang_rt.builtins-x86_64.a(powidf2.c.o)` is pulled in for missing bits. If I change C++ to C the above `libtool` example will just work. `-Wl,--no-undefined` is just a convenient way to detect that final shared library does not have it's all symbols satisfied. If I look at a successful `gcc` `libtool` based build `gcc_s` is pulled in as expected: $ autoreconf -ivf && ./configure CC=gcc CXX=g++ && make clean && make ... /bin/sh ./libtool --tag=CXX --mode=compile g++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" -DPACKAGE_STRING=\"rt-bug\ 1.0\" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c -o bug.lo bug.cc libtool: compile: g++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" "-DPACKAGE_STRING=\"rt-bug 1.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c bug.cc -fPIC -DPIC -o .libs/bug.o libtool: compile: g++ -DPACKAGE_NAME=\"rt-bug\" -DPACKAGE_TARNAME=\"rt-bug\" -DPACKAGE_VERSION=\"1.0\" "-DPACKAGE_STRING=\"rt-bug 1.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"rt-bug\" -DVERSION=\"1.0\" -DHAVE_STDIO_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_STRINGS_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_UNISTD_H=1 -DSTDC_HEADERS=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -g -O2 -MT bug.lo -MD -MP -MF .deps/bug.Tpo -c bug.cc -o bug.o >/dev/null 2>&1 mv -f .deps/bug.Tpo .deps/bug.Plo /bin/sh ./libtool --tag=CXX --mode=link g++ -g -O2 -Wl,--no-undefined -o libbug.la -rpath /usr/local/lib bug.lo libtool: link: g++ -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crti.o /usr/lib/gcc/x86_64-pc-linux-gnu/14/crtbeginS.o .libs/bug.o -L/usr/lib/gcc/x86_64-pc-linux-gnu/14 -L/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../x86_64-pc-linux-gnu/lib -L/usr/lib/gcc/x86_64-pc-linux-gnu/14/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/x86_64-pc-linux-gnu/14/crtendS.o /usr/lib/gcc/x86_64-pc-linux-gnu/14/../../../../lib64/crtn.o -g -O2 -Wl,--no-undefined -Wl,-soname -Wl,libbug.so.0 -o .libs/libbug.so.0.0.0 libtool: link: (cd ".libs" && rm -f "libbug.so.0" && ln -s "libbug.so.0.0.0" "libbug.so.0") libtool: link: (cd ".libs" && rm -f "libbug.so" && ln -s "libbug.so.0.0.0" "libbug.so") libtool: link: ar cr .libs/libbug.a bug.o libtool: link: ranlib .libs/libbug.a libtool: link: ( cd ".libs" && rm -f "libbug.la" && ln -s "../libbug.la" "libbug.la" ) Should `libtool` be amended to discover `libclang_rt.builtins-x86_64.a`? Or maybe avoid use of `-nostdlib` for this case? _______________________________________________________ Reply to this item at: <https://savannah.gnu.org/support/?111193> _______________________________________________ Message sent via Savannah https://savannah.gnu.org/
signature.asc
Description: PGP signature