[Top][All Lists]
[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; }