Source: libtool
Version: 2.4.6-14
Severity: normal
Hello.
When linking a shared library against another uninstalled shared
library missing libtool support,
-L. -lfoo -L. -l:libfoo.so libfoo.so
should be equivalent.
https://www.gnu.org/software/libtool/manual/libtool.html#FOOT2 and
https://www.gnu.org/software/automake/manual/automake.html#Linking
both recommend the third form because it is less ambiguous, but
libtool ignores it.
This results in the library containing undefined symbols, or an
immediate failure with --no-undefined.
A reproducer is attached.
#!/bin/sh
set -Cefu
cat > indirect.c <<EOF
#include <stdio.h>
void indirect (void) {
printf ("If you are reading this, all probably went OK.\n");
}
EOF
cat > direct.c <<EOF
void indirect (void);
void direct (void) {
indirect ();
}
EOF
cat > main.c <<EOF
void direct (void);
int main (void) {
direct ();
return 0;
}
EOF
cat > configure.ac <<EOF
AC_INIT([foo], [0.0.0])
AM_INIT_AUTOMAKE([foreign])
LT_INIT
AC_CONFIG_FILES([Makefile])
AC_OUTPUT
EOF
cat > Makefile.am <<EOF
bin_PROGRAMS = main
main_SOURCES = main.c
main_LDADD = libdirect.la
main_LDFLAGS = -Wl,-rpath-link=.
lib_LTLIBRARIES = libdirect.la
libdirect_la_SOURCES = direct.c
# This fails:
libdirect_la_LIBADD = libindirect.so
# This works:
# libdirect_la_LIBADD = -L. -l:libindirect.so
# EXTRA_libdirect_la_DEPENDENCIES = ./libindirect.so
# For unrelated reasons, libindirect is unable to use libtool.
libindirect.so: CFLAGS += -fPIC
libindirect.so: indirect.o
\$(LINK.c) -shared -o \$@ \$^
EOF
autoreconf -i
./configure
# --no-undefined forces the script to stop at the interesting lines.
# Without it, libtool would fail later when trying to link main.o.
make LDFLAGS=-Wl,--no-undefined
LD_LIBRARY_PATH=. ./main