Hi Ralf, On Mon, 2006-08-07 at 18:07 +0200, Ralf Wildenhues wrote:
> OK. Here's a stripped-down case that tries to replicate your situation. > It does not fail for me, and I think it's portable (to non-w32 hosts > that support dlopen(); I did not use libltdl in this case; and I did > use one internal detail by referring to lt_cv_dlopen_libs). > > Could you change it in a way so that it exposes the issue you are > seeing (or show how you can make it fail)? Thanks. Okay, I was able to build your stripped-down case. It produced the output that you expected (8 and 0). I tried out our situation, which is a little different: 1. We don't use automake (we'll ignore that for now) 2. We do use libltdl and I've changed the stripped-down case to reflect that. 3. We need more than one object in libfoo.la so I created a libfooY.c 4. libfooY.c just contains the Y function from libfoo.c. 5. The diffs for all this are below. After making my changes, it works. I was expecting to get something like: ./bar /proj/libtool/test/.libs/lt-bar: symbol lookup error: /proj/libtool/test/.libs/barmod.so: undefined symbol: Y But instead, it just works. So, it seems, that linking all the libraries into the module doesn't cause duplicate symbols, at least for simple C programs. Our problem may actually be C++. I'll look at that before taking any more of your time. Thanks for your help! Reid. Here' are the diffs if you care to see what I did .. diff -u test.orig/configure.ac test/configure.ac --- test.orig/configure.ac 2006-08-07 13:00:03.000000000 -0700 +++ test/configure.ac 2006-08-07 12:45:22.000000000 -0700 @@ -1,8 +1,7 @@ -AC_INIT(dup,1,devnull) +AC_INIT([dup],[1],[devnull]) AM_INIT_AUTOMAKE(foreign) AC_PROG_CC AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL -AC_SUBST([LIBDL], [$lt_cv_dlopen_libs]) AC_CONFIG_FILES(Makefile) AC_OUTPUT diff -u test.orig/Makefile.am test/Makefile.am --- test.orig/Makefile.am 2006-08-07 13:00:25.000000000 -0700 +++ test/Makefile.am 2006-08-07 12:57:42.000000000 -0700 @@ -1,7 +1,7 @@ lib_LTLIBRARIES = libfoo.la bin_PROGRAMS = bar -bar_LDADD = libfoo.la -bar_LDADD = libfoo.la $(LIBDL) +bar_LDADD = libfoo.la -lltdl +bar_LDFLAGS = pkglib_LTLIBRARIES = barmod.la barmod_la_LDFLAGS = -module barmod_la_LIBADD = libfoo.la diff -u test.orig/bar.c test/bar.c --- test.orig/bar.c 2006-08-07 12:59:14.000000000 -0700 +++ test/bar.c 2006-08-07 12:57:14.000000000 -0700 @@ -1,28 +1,32 @@ -#include <dlfcn.h> +#include <ltdl.h> #include <stdio.h> #include <stdlib.h> extern int X (void); +typedef int (*intfunc_t)(void); + int main (int argc, char **argv) { - void *handle; - int (*barmod)(void); - char *error; + lt_dlhandle handle; + intfunc_t barmod; + const char *error; + + lt_dlinit(); - handle = dlopen ("barmod.so", RTLD_LAZY); + handle = lt_dlopen ("barmod.so"); if (!handle) { - fprintf (stderr, "%s\n", dlerror ()); + fprintf (stderr, "%s\n", lt_dlerror ()); exit(EXIT_FAILURE); } - *(void **) (&barmod) = dlsym (handle, "barmod"); - if ((error = dlerror()) != NULL) { + barmod = (intfunc_t) lt_dlsym (handle, "barmod"); + if ((error = lt_dlerror()) != NULL) { fprintf (stderr, "%s\n", error); exit (EXIT_FAILURE); } printf ("%d\n", (*barmod) ()); - dlclose (handle); + lt_dlclose (handle); return X () - 2; } diff -u test.orig/libfoo.c test/libfoo.c --- test.orig/libfoo.c 2006-08-07 12:59:14.000000000 -0700 +++ test/libfoo.c 2006-08-07 12:47:13.000000000 -0700 @@ -1,2 +1 @@ int X (void) { return 2; } -double Y (void) { return 3.14; } cat test/libfooY.c double Y (void) { return 3.14; } _______________________________________________ http://lists.gnu.org/mailman/listinfo/libtool