libtool-patches
[Top][All Lists]
Advanced

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

Re: 12-gary-solaris-no-undefined.patch [Was Re: 5-gary-solaris-no-undefi


From: libtool-patches
Subject: Re: 12-gary-solaris-no-undefined.patch [Was Re: 5-gary-solaris-no-undefined.patch]
Date: Sun, 9 Sep 2001 19:35:25 -0500
User-agent: Mutt/1.2.5i

On Mon, Sep 10, 2001 at 12:35:46AM +0100, Gary V. Vaughan wrote:
> On Sun, Sep 09, 2001 at 01:39:34PM -0500, address@hidden wrote:
> > On Sun, Sep 09, 2001 at 12:41:48PM -0500, address@hidden wrote:
> > > My results:
> > >   1. GCC 2.95.3 without binutils on Solaris 8/SPARC fails (1.4.1)
> > >   2. GCC 3.0.1 without binutils on Solaris 8/SPARC succeeds (1.4.1)
> > > 
> > >   3. GCC 2.95.3 with binutils on Solaris 2.6/SPARC succeeds (1.4.1)
> > > 
> > >   4. GCC 2.95.3 without binutils on Solaris 8/SPARC succeeds (1.3.5)
> > > 
> > > Because of #4, I say we reject the patch and find out why 1.3.5
> > > succeeded.
> > 
> > Further research:
> >   (from gcc/libgcc2.c in GCC 2.95.3)
> > /* This is used by the `assert' macro.  */
> > extern void __eprintf (const char *, const char *, unsigned int, const
> > char *)
> >   __attribute__ ((__noreturn__));
> > 
> >   (from gcc/libgcc2.c in GCC 3.0)
> > /* __eprintf used to be used by GCC's private version of <assert.h>.
> >    We no longer provide that header, but this routine remains in libgcc.a
> >    for binary backward compatibility.  Note that it is not included in
> >    the shared version of libgcc.  */
> > 
> > I looked at libltdl/ltdl.c in 1.3.5 and it makes *no* calls to assert.
> > However, the libltdl/ltdl.c in 1.4.1 does. Remove the assert calls in
> > 1.4.1 and we don't have problems :)
> > 
> > Even if an assert() is added to ltdl.c from 1.3.5, you'll never get an
> > error because "-z defs" is not used the build the shared library. I
> > inserted an assert() in 1.3.5 and had the same error as with 1.4.1.
> > So, it seems the "ugly hack" is needed only when GCC < 3.0 is used and
> > GCC has been compiled *without* binutils. Can you incorporate this
> > into your patch so the ugliness is localized?
> > 
> > BTW, have you tried using GCC to created the shared library? I did a
> > quick test with 2.95.3 for 1.4.1:
> >   $ gcc -shared -Wl,-h,libltdl.so.3 -o .libs/libltdl.so.3.0.0 ltdl.lo -ldl 
> > -lc
> >   $ nm .libs/libltdl.so.3.0.0 | grep eprintf
> >   [242]   |     27140|      72|FUNC |GLOB |0    |10     |__eprintf
> > If gcc creating the shared library works, I say use it instead of
> > Solaris ld (barring any problem).
> 
> According to comments in libtool.m4:
> 
>     # $CC -shared without GNU ld will not create a library from C++
>     # object files and a static libstdc++, better avoid it by now
> 
> I'm proposing the following patch (pending tests), which takes a
> slightly different tack.  I'll test it tomorrow, and release it as
> part of 1.4.2 if it works.
> 
> Cheers,
>       Gary.
> 
> Index: ChangeLog
> from  Gary V. Vaughan  <address@hidden>, Albert Chin <address@hidden>, Tim 
> Van Holder <address@hidden>
> 
>       * libtool.m4 (no_undefined_flag) [solaris*}: Set this flag to
>       unsupported for GCC < 3.0 without binutils.
> 
> Index: libtool.m4
> ===================================================================
> RCS file: /cvsroot/libtool/libtool/libtool.m4,v
> retrieving revision 1.166.2.23
> diff -u -p -u -r1.166.2.23 libtool.m4
> --- libtool.m4 2001/09/09 17:20:33 1.166.2.23
> +++ libtool.m4 2001/09/09 23:26:29
> @@ -1707,7 +1707,33 @@ else
>      ;;
>  
>    solaris*)
> -    no_undefined_flag=' -z text'
> +    # gcc --version < 3.0 without binutils cannot create self contained
> +    # shared libraries reliably, requiring libgcc.a to resolve some of
> +    # the object symbols generated in some cases.  Libraries that use
> +    # assert need libgcc.a to resolve __eprintf, for example.  Linking
> +    # a copy of libgcc.a into every shared library to guarantee resolving
> +    # such symbols causes other problems:  According to Tim Van Holder
> +    # <address@hidden>, C++ libraries end up with a separate
> +    # exception stack for one thing.
> +    if test "$GCC" = yes; then
> +      case `$CC --version 2>/dev/null` in
> +      [12].*)
> +     no_undefined_flag=unsupported
> +     cat <<EOF 1>&2
> +
> +*** Warning: Releases of GCC earlier than version 3.0 cannot reliably
> +*** create self contained shared libraries on Solaris systems.  Therefore,
> +*** libtool is disabling the -no-undefined support.  We urge you to upgrade
> +*** to a newer version of GCC.  Another option is to rebuild your current
> +*** GCC to use the GNU linker from GNU binutils 2.9.1 or newer.

And, if they do what you outline in the last sentence, your case
statement will still bite them because you don't check if they are
using GNU binutils. You only check for the version of GCC.

-- 
albert chin (address@hidden)



reply via email to

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