------- Comment #10 from jzb2 at aexorsyst dot com  2009-02-02 09:31 -------
I can confirm this is a real problem.  I have hit this exact same bug on
gcc-4.2.2.  However, one difference in my setup is that I _do_ have
libstdc++.so available as part of my cross toolchain, with the result the
libtool happily generates code that ends up linking the cross-toolchain's
libstdc++.so into the cross-native (not Canandian) libstdc++.so just being
built, and adds an ugly RPATH to it as well.  I've sent the following to
gcc-help mailing list, before I found this current bug on bugzilla:

I'm doing a cross-native of build gcc-4.2.2 on

--build=i686-pc-linux-gnu

using cross-compiler/toolchain built with

--build=i686-pc-linux-gnu
--host=i686-pc-linux-gnu
--target=i686-pc-linux-uclibc

and currently building gcc-4.2.2 for 

--build=i686-pc-linux-gnu
--host=i686-pc-linux-uclibc
--target=i686-pc-linux-uclibc

with

...
--enable-shared
--enable-languages=c,c++
--with-sysroot=/data/devo/builds/i686-pc-linux-gnu-cross-i686-pc-linux-uclibc/crucis-1/cross-rootfs
...

The generated libtool in

gcc_native-build/i686-pc-linux-uclibc/libstdc++v3/libtool ends up with

...
postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s"
...

which seems in error, as it creates a circular dependency of SONAME 
libstdc++.so on NEEDED libstdc++.so and makes for an ugly RPATH:

Dynamic section at offset 0xe789c contains 28 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libm.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgcc_s.so.1]
 0x00000001 (NEEDED)                     Shared library: [libc.so.0]
 0x00000001 (NEEDED)                     Shared library: [libintl.so.0]
 0x00000001 (NEEDED)                     Shared library: 
[libstdc++.so.6]
 0x0000000e (SONAME)                     Library soname: 
[libstdc++.so.6]
 0x0000000f (RPATH)                      Library rpath: 
[/data/devo/builds/i686-pc-linux-gnu-cross-i686-pc-linux-uclibc/crucis-1/cross-tools/i686-pc-linux-uclibc/lib]

Note that if instead of libstdc++.so I only have libstdc++.a in the toolchain,
then I get a bunch of duplicate symbols and the link fails (I suppose that's
expected at this point).

I'm pretty sure this used to work in earlier versions, but its broken in 4.2.2
and has nothing to do with (in 4.2.2) the --build option, as I do specify it. 
Here's my full cross-native configure command:

cd $(OBJDIR)/gcc_native-build ; \
          CXXFLAGS=-fpermissive \
            CC=$(ARCH)-$(CUSTOMER)-$(PLATFORM)-gcc \
            $(PKGDIR)/configure --prefix=/usr \
                                --libexecdir=/usr/lib \
                                --enable-shared \
                                --enable-threads=posix \
                                --enable-__cxa_atexit \
                                --enable-clocale=uclibc \
                                --with-cpu=pentium4 \
                                --with-local-prefix=$(TGTROOT)/usr \
                                --with-sysroot=$(TGTROOT) \
                                --enable-languages=c,c++ \
                                --disable-libstdcxx-pch \
                                --build=$(BUILDHOST) \
                                --host=$(ARCH)-$(CUSTOMER)-$(PLATFORM) \
                                --target=$(ARCH)-$(CUSTOMER)-$(PLATFORM)

And here's how the cross-compiler was built (prior to building gcc_native):

cd $(OBJDIR)/gcc_p2-build ; \
          CXXFLAGS=-fpermissive $(PKGDIR)/configure \
                   --prefix=$(PREFIX) \
                   --disable-werror \
                   --disable-multilib \
                   --enable-clocale=uclibc \
                   --enable-shared \
                   --libexecdir=$(PREFIX)/lib \
                   --with-headers=$(TGTROOT)/usr/include \
                   --with-sysroot=$(TGTROOT) \
                   --enable-threads=posix \
                   --enable-__cxa_atexit \
                   --with-cpu=pentium4 \
                   --enable-languages=c,c++ \
                   --target=$(ARCH)-$(CUSTOMER)-$(PLATFORM)

Note that -fpermissive flag is to overcome uClibc's gettext issues, and was
suggested by the gcc itself as it tried to build.  It works with, not without,
but probably has nothing to do this generated libtool issue.  The uclibc locale
was supplied via patches.

I am a programmer, but not a autoconf/automake/libtool expert, so if someone
could just please point out where that postdeps gets instantiated, and how it
has come to include -lstdc++, I'd be happy to run some tests.

Is it possible that this may have to do with the version(s) of the
autoconf/automake tools?  Is that where perhaps the postdeps gets its value? 
I'm just guessing, as I've grepped the whole gcc source tree, and couldn't find
anything useful.  That would also explain the unexpected difference in
behavior.

I'm running autoconf-2.61 and automake-1.10.1 and libtool-1.5.24 on the
$(BUILDHOST).


-- 

jzb2 at aexorsyst dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |jzb2 at aexorsyst dot com


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=35942

Reply via email to