libtool
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: How to use --whole-archive ld arg with libtool?


From: Reid Spencer
Subject: Re: How to use --whole-archive ld arg with libtool?
Date: Tue, 08 Aug 2006 22:03:21 -0700

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; }







reply via email to

[Prev in Thread] Current Thread [Next in Thread]