libtool
[Top][All Lists]
Advanced

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

Re: libtool rearranging library paths


From: Ralf Wildenhues
Subject: Re: libtool rearranging library paths
Date: Fri, 2 Dec 2005 16:34:51 +0100
User-agent: Mutt/1.5.11

Hi Christopher,

* Christopher Hulbert wrote on Fri, Dec 02, 2005 at 01:29:52PM CET:
> On 12/2/05, Ralf Wildenhues <address@hidden> wrote:
> > * Christopher Hulbert wrote on Fri, Dec 02, 2005 at 12:48:13PM CET:
> >
> > > The other problem I have is I have to set FCFLAGS to -fpic so when
> > > autoconf gets the Fortran libraries to link with pgf90 puts the
> > > libso first.  Is there another way to do that?

> No I don't think it's a libtool problem.   Basiclly  I call the
> AC_FC_LIBRARY_LDFLAGS macro to get the fortran  libraries to link with.
> Due to the behavior of  pgf90, it either  puts the libso (for PIC code)
> first  or the lib directory first.  Both directories contain the same
> libraries just compiled differently.  So, I have to set LDFLAGS=-fpic before
> calling configure so that in the macro it passes the -fpic flags to
> pgcc/pgf90 and I get the libso directory first.  Autoconf doesn't use
> libtool to get that information.

Ahh, now I understand what you mean.

Do I gather correctly that ideally
- you don't want to use LDFLAGS=-fpic at all,
- you do it because otherwise libtool will try to put the non-PIC
  objects of /usr/local/pgi/linux86-64/6.0/lib into a shared library,
  because the AC_FC_LIBRARY_LDFLAGS causes this path to appear early in
  an `-L' argument?

Then, my line of thought would be: libtool may not trust the result of
AC_FC_LIBRARY_LDFLAGS here.  We have fixing of _LT_SYS_HIDDEN_LIBDEPS
for Fortran (both F77 and FC) on the TODO list anyway.

*time passes, testing a bit*

This issue is a bit more complicated:

- If we change libtool.m4 to do the detection itself, it will
  (hopefully) decide to use the /../libso directory.  But will pgf90
  also be smart enough to link against the shared libs in there
  (libpgf90.so etc) rather than putting the PIC objects frm libpgf90.a
  etc into the library?  Testing says: yes.

- Testing also reveals: the PGI driver adds rpath arguments for both
  paths.  Oh well. :-/

- One remaining question is whether creating a program that links
  against our new shared library will, independent of the -L flags
  given, use the shared libpgf90.so etc.  If not, you get issues with
  duplicate symbols.  And possible version skew issues later on.
  Testing reveals that the rpaths added by PGI depend on whether you
  link with -fPIC or not.  Which set of objects or libs you link in
  depends on the -L paths (libso first?) given.  Hrmpf, so this may
  lead to possible subtle breakage, or even duplicate symbols during
  linking.

Oh my.  I wish PGI had an extra option to specify whether to link
against the non-PIC or PIC archives or the shared libs.

Well, this is yet another problem setting which calls for an Autoconf/
Libtool effort to provide portable ways to decide whether shared or
static runtime libraries, and of what flavor if more than one, should be
used for creating some code (see some discussions about -static-libgcc,
or -lstdc++ vs. -lsupc++, for example; or Solaris -lCstd -lCrun..).

At the moment I think no such thing exists -- the available macros are
incomplete at best and inconsistent at worst, as you had to learn.

I must say that I don't feel up to this task at the moment, not only by
time constraints.  So, unless somebody feels brave, I guess you'll have
to live with the workaround for now:

> LDLFAGS=-fpic ./configure

By the way, Autoconf suggests to pass also the variable settings as
arguments to configure: that way it can know for sure which ones you
have set:
  ./configure LDFLAGS=-fpic

(If that workaround in fact does not work for you, maybe because you
don't want or can't use -fpic for other reasons, you should still be
able to set the bunch of libraries manually, as in
  ./configure FLIBS='...'
or
  ./configure FCLIBS='...
to get things working as desired)

>  -L/usr/local/pgi/linux86-64/6.0/libso -L/usr/local/pgi/linux86-64/6.0/lib
> -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.0 -lpgmp -lpgthread
> -lpgf90 -lpgf90_rpm1 -lpgf902 -lpgf90rtl -lpgftnrtl -lnspgc -lpgc -lm
> 
> ./configure
>  -L/usr/local/pgi/linux86-64/6.0/lib -L/usr/local/pgi/linux86-64/6.0/libso
> -L/usr/lib64 -L/usr/lib/gcc/x86_64-redhat-linux/4.0.0 -lpgmp -lpgthread
> -lpgf90 -lpgf90_rpm1 -lpgf902 -lpgf90rtl -lpgftnrtl -lnspgc -lpgc -lm

Cheers,
Ralf




reply via email to

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