While building a cross-compiler, the the libstdc++-v3 includes a copy of Libtool script, which includes a reference to libstdc++ itself. This prevent the user to build a new compiler without existing libstdc++ for the target triplet. The following is a patch that tested to be working for this problem, but I think it should be done in a better way. #######BEGIN OF PATCH CODE###### diff -Naur gcc-4.3-20080410.orig/libstdc++-v3/src/Makefile.in gcc-4.3-20080410/libstdc++-v3/src/Makefile.in --- gcc-4.3-20080410.orig/libstdc++-v3/src/Makefile.in 2008-03-01 05:26:50.000000000 +1100 +++ gcc-4.3-20080410/libstdc++-v3/src/Makefile.in 2008-04-14 23:16:35.000000000 +1000 @@ -212,6 +212,7 @@ LIBS = @LIBS@ LIBSUPCXX_PICFLAGS = @LIBSUPCXX_PICFLAGS@ LIBTOOL = @LIBTOOL@ +LIBTOOLLINK = @LIBTOOL@-link LN_S = @LN_S@ LTLIBICONV = @LTLIBICONV@ LTLIBOBJS = @LTLIBOBJS@ @@ -472,7 +473,7 @@ # course is problematic at this point. So, we get the top-level # directory to configure libstdc++-v3 to use gcc as the C++ # compilation driver. -CXXLINK = $(LIBTOOL) --tag CXX --mode=link $(CXX) \ +CXXLINK = $(LIBTOOLLINK) --tag CXX --mode=link $(CXX) \ $(OPT_LDFLAGS) $(SECTION_LDFLAGS) $(AM_CXXFLAGS) $(LTLDFLAGS) -o $@ debugdir = debug @@ -536,7 +537,8 @@ echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done -libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES) +libstdc++.la: $(libstdc___la_OBJECTS) $(libstdc___la_DEPENDENCIES) + sed '/postdeps=/s@\-.*\-lm@\-lm@' `echo $(LIBTOOL) | cut -d\ -f2` > `echo $(LIBTOOLLINK) | cut -d\ -f2` $(CXXLINK) -rpath $(toolexeclibdir) $(libstdc___la_LDFLAGS) $(libstdc___la_OBJECTS) $(libstdc___la_LIBADD) $(LIBS) mostlyclean-compile: #######END OF PATCH CODE######
Since there is no 4.3.1 release, only 4.3.0, can I assume you mean 4.3.0 for the "Reported Against" field? libtool issues should be fixed in libtool if possible, and not hacked around in src/Makefile.am. Editing src/Makefile.in is incorrect, as this is a generated file.
instead of AC_LIBTOOL_DLOPEN AM_PROG_LIBTOOL AC_SUBST(enable_shared) AC_SUBST(enable_static) libgomp/acinclude.m4 has sinclude(../libtool.m4) dnl The lines below arrange for aclocal not to bring an installed dnl libtool.m4 into aclocal.m4, while still arranging for automake to dnl add a definition of LIBTOOL to Makefile.in. ifelse(,,,[AC_SUBST(LIBTOOL) AC_DEFUN([AM_PROG_LIBTOOL]) AC_DEFUN([AC_LIBTOOL_DLOPEN]) AC_DEFUN([AC_PROG_LD]) ])
(In reply to comment #1) > Since there is no 4.3.1 release, only 4.3.0, can I assume you mean 4.3.0 for > the "Reported Against" field? > > libtool issues should be fixed in libtool if possible, and not hacked around in > src/Makefile.am. Editing src/Makefile.in is incorrect, as this is a generated > file. > I tested with a snapshot gcc-4.3-20080410, and the internal version is 4.3.1 This is why I reported this issue with 4.3.1 I post the hacked code is only for you to find out what happen I meet. I also know that the files are generated, but I am new to gcc source code and I need time to find out which file should be update.
Please post the link commands that expose the self reference (the libtool --mode=link stuff and whatever it generates). Also how exactly you configure GCC. Also please post cd $host/libstdc++-v3 && ./libtool --tag=CXX --config Thanks.
(In reply to comment #4) > Please post the link commands that expose the self reference > (the libtool --mode=link stuff and whatever it generates). > Also how exactly you configure GCC. Also please post > cd $host/libstdc++-v3 && ./libtool --tag=CXX --config > > Thanks. > ------------Error Report------------- libtool: link: x86_64-unknown-linux-gnu-g++ -shared -nostdlib /mnt/clfs/usr/lib/../lib64/crti.o /cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/crtbeginS.o .libs/bitmap_allocator.o .libs/pool_allocator.o .libs/mt_allocator.o .libs/codecvt.o .libs/compatibility.o .libs/complex_io.o .libs/ctype.o .libs/debug.o .libs/functexcept.o .libs/hash.o .libs/hash_c++0x.o .libs/globals_io.o .libs/hashtable.o .libs/hashtable_c++0x.o .libs/ios.o .libs/ios_failure.o .libs/ios_init.o .libs/ios_locale.o .libs/limits.o .libs/list.o .libs/debug_list.o .libs/locale.o .libs/locale_init.o .libs/locale_facets.o .libs/localename.o .libs/stdexcept.o .libs/strstream.o .libs/tree.o .libs/allocator-inst.o .libs/concept-inst.o .libs/fstream-inst.o .libs/ext-inst.o .libs/ios-inst.o .libs/iostream-inst.o .libs/istream-inst.o .libs/istream.o .libs/locale-inst.o .libs/misc-inst.o .libs/ostream-inst.o .libs/sstream-inst.o .libs/streambuf-inst.o .libs/streambuf.o .libs/string-inst.o .libs/valarray-inst.o .libs/wlocale-inst.o .libs/wstring-inst.o .libs/atomicity.o .libs/codecvt_members.o .libs/collate_members.o .libs/ctype_members.o .libs/messages_members.o .libs/monetary_members.o .libs/numeric_members.o .libs/time_members.o .libs/basic_file.o .libs/c++locale.o .libs/parallel_list.o .libs/parallel_settings.o -Wl,--whole-archive ../libmath/.libs/libmath.a ../libsupc++/.libs/libsupc++convenience.a -Wl,--no-whole-archive -L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1 -L/cross-tools/bin/../lib/gcc -L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/lib/../lib64 -L/mnt/clfs/lib/../lib64 -L/mnt/clfs/usr/lib/../lib64 -L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/lib -L/mnt/clfs/lib -L/mnt/clfs/usr/lib -lstdc++ -lm -lc -lgcc_s /cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/crtendS.o /mnt/clfs/usr/lib/../lib64/crtn.o -Wl,-O1 -Wl,-z -Wl,relro -Wl,--gc-sections -Wl,--version-script=libstdc++-symbols.ver -Wl,-soname -Wl,libstdc++.so.6 -o .libs/libstdc++.so.6.0.10 /cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/ld: cannot find -lstdc++ --------------Configure & build script------------- CLFS_TAEGET=x86_64-unknown-linux-gnu CLFS_HOST=x86_64-cross-linux-gnu CLFS=/mnt/clfs AR=ar CXX_FOR_TARGET="$CLFS_TARGET-g++" CC_FOR_TARGET="$CLFS_TARGET-gcc" ../gcc-4.3-20080417/configure --prefix=${CLFS}/cross-tools \ --host=${CLFS_HOST} --target=${CLFS_TARGET} \ --with-sysroot=${CLFS} --disable-nls --enable-shared \ --enable-languages=c,c++ --enable-__cxa_atexit \ --enable-c99 --enable-long-long --enable-threads=posix \ --with-gmp=$CLFS/cross-tools --with-mpfr=$CLFS/cross-tools && #I have only a static built gcc and if use it to build libgcc will fail make all-gcc && make install-gcc && #I do not have the share library installed, which is needed to built libstdc++ make all-target-libgcc && make install-target-libgcc && #the error is on the make command make && make install ----------------------Output of Libtool config---------------- # Which release of libtool.m4 was used? macro_version=2.1a macro_revision=1.2435 # Whether or not to build shared libraries. build_libtool_libs=yes # Whether or not to build static libraries. build_old_libs=yes # What type of objects to build. pic_mode=default # Whether or not to optimize for fast installation. fast_install=yes # The host system. host_alias=x86_64-unknown-linux-gnu host=x86_64-unknown-linux-gnu host_os=linux-gnu # The build system. build_alias=x86_64-unknown-linux-gnu build=x86_64-unknown-linux-gnu build_os=linux-gnu # A sed program that does not truncate output. SED="/bin/sed" # Sed that helps us avoid accidentally triggering echo(1) options like -n. Xsed="$SED -e 1s/^X//" # A grep program that handles long lines. GREP="grep" # An ERE matcher. EGREP="grep -E" # A literal string matcher. FGREP="grep -F" # A BSD- or MS-compatible name lister. NM="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/nm" # Whether we need soft or hard links. LN_S="ln -s" # What is the maximum length of a command? max_cmd_len=98304 # Object file suffix (normally "o"). objext=o # Executable file suffix (normally ""). exeext= # whether the shell understands "unset". lt_unset=unset # turn spaces into newlines. SP2NL="tr \\040 \\012" # turn newlines into spaces. NL2SP="tr \\015\\012 \\040\\040" # How to create reloadable object files. reload_flag=" -r" reload_cmds="\$LD\$reload_flag -o \$output\$reload_objs" # Method to check whether dependent libraries are shared objects. deplibs_check_method="pass_all" # Command to use when deplibs_check_method == "file_magic". file_magic_cmd="\$MAGIC_CMD" # The archiver. AR="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/ar" AR_FLAGS="rc" # A symbol stripping program. STRIP="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/strip" # Commands used to install an old-style archive. RANLIB="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/ranlib" old_postinstall_cmds="chmod 644 \$oldlib~\$RANLIB \$oldlib" old_postuninstall_cmds="" # A C compiler. LTCC="x86_64-unknown-linux-gnu-gcc " # LTCC compiler flags. LTCFLAGS="-O2 -g -g -O2 " # Take the output of nm and produce a listing of raw symbols and C names. global_symbol_pipe="sed -n -e 's/^.*[ ]\\([ABCDGIRSTW][ABCDGIRSTW]*\\)[ ][ ]*\\([_A-Za-z][_A-Za-z0-9]*\\)\$/\\1 \\2 \\2/p'" # Transform the output of nm in a proper C declaration. global_symbol_to_cdecl="sed -n -e 's/^T .* \\(.*\\)\$/extern int \\1();/p' -e 's/^[ABCDGIRSTW]* .* \\(.*\\)\$/extern char \\1;/p'" # Transform the output of nm in a C name address pair. global_symbol_to_c_name_address="sed -n -e 's/^: \\([^ ]*\\) \$/ {\\\"\\1\\\", (void *) 0},/p' -e 's/^[ABCDGIRSTW]* \\([^ ]*\\) \\([^ ]*\\)\$/ {\"\\2\", (void *) \\&\\2},/p'" # The name of the directory that contains temporary libtool files. objdir=.libs # Shell to use when invoking shell scripts. SHELL="/bin/bash" # An echo program that does not interpret backslashes. ECHO="echo" # Used to examine libraries when file_magic_cmd begins with "file". MAGIC_CMD=file # Must we lock files when doing compilation? need_locks="no" # Old archive suffix (normally "a"). libext=a # Shared library suffix (normally ".so"). shrext_cmds=".so" # The commands to extract the exported symbol list from a shared archive. extract_expsyms_cmds="" # Variables whose values should be saved in libtool wrapper scripts and # restored at link time. variables_saved_for_relink="PATH LD_LIBRARY_PATH LD_RUN_PATH GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH" # Do we need the "lib" prefix for modules? need_lib_prefix=no # Do we need a version for libraries? need_version=no # Library versioning type. version_type=linux # Shared library runtime path variable. runpath_var=LD_RUN_PATH # Shared library path variable. shlibpath_var=LD_LIBRARY_PATH # Is shlibpath searched before the hard-coded library search path? shlibpath_overrides_runpath=no # Format of library name prefix. libname_spec="lib\$name" # List of archive names. First name is the real one, the rest are links. # The last name is the one that the linker finds with -lNAME library_names_spec="\${libname}\${release}\${shared_ext}\$versuffix \${libname}\${release}\${shared_ext}\$major \$libname\${shared_ext}" # The coded name of the library, if different from the real name. soname_spec="\${libname}\${release}\${shared_ext}\$major" # Command to use after installation of a shared archive. postinstall_cmds="" # Command to use after uninstallation of a shared archive. postuninstall_cmds="" # Commands used to finish a libtool library installation in a directory. finish_cmds="PATH=\\\"\\\$PATH:/sbin\\\" ldconfig -n \$libdir" # As "finish_cmds", except a single script fragment to be evaled but # not shown. finish_eval="" # Whether we should hardcode library paths into libraries. hardcode_into_libs=yes # Compile-time system search path for libraries. sys_lib_search_path_spec="/cross-tools/lib/gcc/x86_64-unknown-linux-gnu/4.3.1 /cross-tools/lib/gcc /cross-tools/x86_64-unknown-linux-gnu/lib64 /mnt/clfs/lib64 /mnt/clfs/usr/lib64" # Run-time system search path for libraries. sys_lib_dlsearch_path_spec="/lib /usr/lib /usr/local/lib " # Whether dlopen is supported. dlopen_support=yes # Whether dlopen of programs is supported. dlopen_self=yes # Whether dlopen of statically linked programs is supported. dlopen_self_static=no # Commands to strip libraries. old_striplib="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/strip --strip-debug" striplib="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/strip --strip-unneeded" # The linker used to build libraries. LD="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/ld" # Commands used to build an old-style archive. old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" # A language specific compiler. CC="x86_64-unknown-linux-gnu-gcc " # Is the compiler the GNU compiler? with_gcc=yes # Compiler flag to turn off builtin functions. no_builtin_flag=" -fno-builtin" # How to pass a linker flag through the compiler. wl="-Wl," # Additional compiler flags for building library objects. pic_flag=" -fPIC -DPIC" # Compiler flag to prevent dynamic linking. link_static_flag="-static" # Does compiler simultaneously support -c and -o options? compiler_c_o="yes" # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=no # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=no # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec="\${wl}--export-dynamic" # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" # Whether the compiler copes with passing no objects directly. compiler_needs_object="no" # Create an old-style archive from a shared archive. old_archive_from_new_cmds="" # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds="" # Commands used to build a shared archive. archive_cmds="\$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" archive_expsym_cmds="echo \\\"{ global:\\\" > \$output_objdir/\$libname.ver~ cat \$export_symbols | sed -e \\\"s/\\\\(.*\\\\)/\\\\1;/\\\" >> \$output_objdir/\$libname.ver~ echo \\\"local: *; };\\\" >> \$output_objdir/\$libname.ver~ \$CC -shared \$libobjs \$deplibs \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-version-script \${wl}\$output_objdir/\$libname.ver -o \$lib" # Commands used to build a loadable module if different from building # a shared archive. module_cmds="" module_expsym_cmds="" # Whether we are building with GNU ld or not. with_gnu_ld="yes" # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag="" # Flag that enforces no undefined symbols. no_undefined_flag="" # Flag to hardcode $libdir into a binary during linking. # This must work even if $libdir does not exist hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir" # If ld is used when linking, flag to hardcode $libdir into a binary # during linking. This must work even if $libdir does not exist. hardcode_libdir_flag_spec_ld="" # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator="" # Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=no # Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting ${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=no # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=no # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=unsupported # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=no # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=no # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=unknown # Fix the shell variable $srcfile for the compiler. fix_srcfile_path="" # Set to "yes" if exported symbols are required. always_export_symbols=no # The commands to list exported symbols. export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" # Symbols that should not be listed in the preloaded symbols. exclude_expsyms="_GLOBAL_OFFSET_TABLE_" # Symbols that must always be exported. include_expsyms="" # Commands necessary for linking programs (against libraries) with templates. prelink_cmds="" # Specify filename containing input files. file_list_spec="" # How to hardcode a shared library path into an executable. hardcode_action=immediate # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects="" postdep_objects="" predeps="" postdeps="" # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path="" # ### BEGIN LIBTOOL TAG CONFIG: CXX # The linker used to build libraries. LD="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/bin/ld -m elf_x86_64" # Commands used to build an old-style archive. old_archive_cmds="\$AR \$AR_FLAGS \$oldlib\$oldobjs\$old_deplibs~\$RANLIB \$oldlib" # A language specific compiler. CC=" x86_64-unknown-linux-gnu-g++ " # Is the compiler the GNU compiler? with_gcc=yes # Compiler flag to turn off builtin functions. no_builtin_flag=" -fno-builtin" # How to pass a linker flag through the compiler. wl="-Wl," # Additional compiler flags for building library objects. pic_flag=" -fPIC -DPIC" # Compiler flag to prevent dynamic linking. link_static_flag="" # Does compiler simultaneously support -c and -o options? compiler_c_o="yes" # Whether or not to add -lc for building shared libraries. build_libtool_need_lc=no # Whether or not to disallow shared libs when runtime libs are static. allow_libtool_libs_with_static_runtimes=no # Compiler flag to allow reflexive dlopens. export_dynamic_flag_spec="\${wl}--export-dynamic" # Compiler flag to generate shared objects directly from archives. whole_archive_flag_spec="\${wl}--whole-archive\$convenience \${wl}--no-whole-archive" # Whether the compiler copes with passing no objects directly. compiler_needs_object="no" # Create an old-style archive from a shared archive. old_archive_from_new_cmds="" # Create a temporary old-style archive to link instead of a shared archive. old_archive_from_expsyms_cmds="" # Commands used to build a shared archive. archive_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname -o \$lib" archive_expsym_cmds="\$CC -shared -nostdlib \$predep_objects \$libobjs \$deplibs \$postdep_objects \$compiler_flags \${wl}-soname \$wl\$soname \${wl}-retain-symbols-file \$wl\$export_symbols -o \$lib" # Commands used to build a loadable module if different from building # a shared archive. module_cmds="" module_expsym_cmds="" # Whether we are building with GNU ld or not. with_gnu_ld="yes" # Flag that allows shared libraries with undefined symbols to be built. allow_undefined_flag="" # Flag that enforces no undefined symbols. no_undefined_flag="" # Flag to hardcode $libdir into a binary during linking. # This must work even if $libdir does not exist hardcode_libdir_flag_spec="\${wl}-rpath \${wl}\$libdir" # If ld is used when linking, flag to hardcode $libdir into a binary # during linking. This must work even if $libdir does not exist. hardcode_libdir_flag_spec_ld="" # Whether we need a single "-rpath" flag with a separated argument. hardcode_libdir_separator="" # Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes # DIR into the resulting binary. hardcode_direct=no # Set to "yes" if using DIR/libNAME${shared_ext} during linking hardcodes # DIR into the resulting binary and the resulting library dependency is # "absolute",i.e impossible to change by setting ${shlibpath_var} if the # library is relocated. hardcode_direct_absolute=no # Set to "yes" if using the -LDIR flag during linking hardcodes DIR # into the resulting binary. hardcode_minus_L=no # Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR # into the resulting binary. hardcode_shlibpath_var=unsupported # Set to "yes" if building a shared library automatically hardcodes DIR # into the library and all subsequent libraries and executables linked # against it. hardcode_automatic=no # Set to yes if linker adds runtime paths of dependent libraries # to runtime path list. inherit_rpath=no # Whether libtool must link a program against all its dependency libraries. link_all_deplibs=unknown # Fix the shell variable $srcfile for the compiler. fix_srcfile_path="" # Set to "yes" if exported symbols are required. always_export_symbols=no # The commands to list exported symbols. export_symbols_cmds="\$NM \$libobjs \$convenience | \$global_symbol_pipe | \$SED 's/.* //' | sort | uniq > \$export_symbols" # Symbols that should not be listed in the preloaded symbols. exclude_expsyms="" # Symbols that must always be exported. include_expsyms="" # Commands necessary for linking programs (against libraries) with templates. prelink_cmds="" # Specify filename containing input files. file_list_spec="" # How to hardcode a shared library path into an executable. hardcode_action=immediate # Dependencies to place before and after the objects being linked to # create a shared library. predep_objects="/mnt/clfs/usr/lib/../lib64/crti.o /cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/crtbeginS.o" postdep_objects="/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/crtendS.o /mnt/clfs/usr/lib/../lib64/crtn.o" predeps="" postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" # The library search path used internally by the compiler when linking # a shared library. compiler_lib_search_path="-L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1 -L/cross-tools/bin/../lib/gcc -L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/lib/../lib64 -L/mnt/clfs/lib/../lib64 -L/mnt/clfs/usr/lib/../lib64 -L/cross-tools/bin/../lib/gcc/x86_64-unknown-linux-gnu/4.3.1/../../../../x86_64-unknown-linux-gnu/lib -L/mnt/clfs/lib -L/mnt/clfs/usr/lib" # ### END LIBTOOL TAG CONFIG: CXX
Ralf, any feedback on this issue? Thanks!
Hi, We have found the reason of this problem. The GCC 4.3+ serials can automaticaly detect the --build parameter (i686-pc-linux-gnu, or something like that). However, the previous version will use --host parameter if it has been specified. In some case (especially mutilib-systems) when using configuring without --build, then the build system will wrongly detect the --build parameter, which will cause the libstdc++ to be detected should use a pre-build version. This causes many problems. We have solve it with explicitly specify the --build parameter. This should be written to the manual, and then this issue can be closed. Thank you.
Let me explain it more clearly. Suppose I am building a toolchain to be running on a x86 Linux machine, and it will generate code for mips Linux. With gcc 4.2.x, I can use --host=i686-pc-linux-gnu --target=mips-linux-gnu and it will work on both x86-64 marchines as well because the 4.2.x build system will use i686-pc-linux-gnu as the --build parameter, and then it will be a case of normal cross compile. However, the previous configuration does not work under 4.3+. The reason is under 4.3+ the build system will detect the --build parameter as well, so the configuration will become --build=x86_64-unknown-linux-gnu --host=i686-pc-linux-gnu --target=mips-linux-gnu This is a Canadian cross compile! Usually, to complete a Canadian cross compile, we need the libstdc++ for mips-linux-gnu already because it can not depending on the just-compiled compiler (it would not run on the build machine) to compile this library. This is why we have this problem. The solution is to explicitly use --build=i686-pc-linux-gnu --host-pc-linux-gnu --target=mips-linux-gnu to force a normal cross compile.
I don't think this is a libstdc++ bug per se, but configure/build and possibly libtool-related. But I don't see a configure/build category (only a keyword), so the current mis-categorization shall continue. I will add a documentation keyword to this bug though. And I'm also not convinced that the current (possibly changed) behaviour is a bug. I do believe that --build and --host flags should be explained better in the gcc docs, however. My understanding of this issue, which may be fatally flawed, is summarized as: It looks like some cross or canadian-cross configure or build behaviour changed between 4.2.x and 4.3.x. This change may or may not be for the better, I don't know. This configure snippet will work with 4.2.x and 4.3.x: --build=i686-pc-linux-gnu --host=i686-pc-linux-gnu -target=mips-linux-gnu whereas the --build part used to not be necessary. (Although I suppose omitting both host and build flags might work too, or just supplying --host=x86_64-unknown-linux-gnu when compiling on x86_64 so that auto-detected --build will be filled in equivalently.) Not quite sure what to do to "fix" this bug and close the bug report. Ralf, and ideas? Is my summary above correct? Note neither --build nor --host are documented here: http://gcc.gnu.org/install/configure.html or http://gcc.gnu.org/install/build.html This seems like something that should be clarified to me.
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).
Well, I answered my own question, sort of... In my /usr/bin/libtool, in the CXX tag section, I have postdeps="-lstdc++ -lm -lgcc_s -lc -lgcc_s" so voila, that's where it comes from, probably. So this issue can now be reduced to the following: Native builds and cross-compiles of libstdc++.so override this postdeps and zero it out. However, using a cross-compiler to generate host=target native compiler with build!=host leaves it pulled in, being responsible, I believe, for this bug. Whether that's a libtool bug or a libstdc++ configure bug remain unanswered... Maybe this is a new wrinkle that newish versions of libtool have and perhaps has not needed to be dealt with before.
So it appears that the root cause of this issue is the long standing libtool DESTDIR problem. I've reworked the original patch above into to following, which works with my ./configure options: Index: gcc_native-4.2.2/libstdc++-v3/src/Makefile.in =================================================================== RCS file: /data/scdb/PKGS/gcc_native/libstdc++-v3/src/Makefile.in,v retrieving revision 1.1.1.4 diff -r1.1.1.4 Makefile.in 460a461 > sed -i 's@^postdeps=.*$$@postdeps=""@' `echo $(LIBTOOL) | cut -d' ' -f2` 503a505 > sed -i 's@^postdeps=.*$$@postdeps=""@' `echo $(LIBTOOL) | cut -d' ' -f2` Index: gcc_native-4.2.2/libstdc++-v3/libsupc++/Makefile.in =================================================================== RCS file: /data/scdb/PKGS/gcc_native/libstdc++-v3/libsupc++/Makefile.in,v retrieving revision 1.1.1.3 diff -r1.1.1.3 Makefile.in 492a493 > sed -i 's@^postdeps=.*$$@postdeps=""@' `echo $(LIBTOOL) | cut -d' ' -f2` 494a496 > sed -i 's@^postdeps=.*$$@postdeps=""@' `echo $(LIBTOOL) | cut -d' ' -f2` Note that this patch drops the forced linking with -lc, -lm, -lintl, and -lgcc_s as well as the problem child -lstdc++. I have not noticed any ill effects. Also note that the -lm and -lintl are still included in the final link due to other reasons. If anybody knows which (if any) other shared libraries the libstdc++.so actually does need to link with, instead of just relying on the (buggy) libtool results (when used with a DESTDIR), could you please post that. I was under the impression that the libstdc++.so was a standalone library, like libc.so, but maybe that's not the case for newer versions of GCC.
> whereas the --build part used to not be necessary. (Although I suppose omitting > both host and build flags might work too, or just supplying > --host=x86_64-unknown-linux-gnu when compiling on x86_64 so that auto-detected > --build will be filled in equivalently.) No, you are wrong. If use --host=x86_64-unknown-linux-gnu and omitting the --build flag, in some machine the detected --build flag in 4.3.x is --build=core2-unknown-linux-gnu and in this case it is still a canadian cross build. I have seen it before.
Is this still an issue?
Created attachment 19463 [details] proposed patch (In reply to comment #14) > Is this still an issue? I have not tried to reproduce it, but I wouldn't know of a change that should have fixed the issue. Here's a patch that I would expect to fix^Wwork around the issue. Can you (somebody who experiences the issue) try it? Thanks.
Patch at <http://gcc.gnu.org/ml/gcc-patches/2010-01/msg00349.html>, it would be nice if someone could confirm that it fixes the issue. Thanks.
Subject: Bug 35942 Author: rwild Date: Sat Jan 16 14:46:57 2010 New Revision: 155965 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=155965 Log: Fix PR 35942: remove -lstdc++ from libtool postdeps for CXX. libstdc++-v3/: PR libstdc++/35942 * configure.ac: Remove -lstdc++ from libtool's postdeps_CXX. * configure: Regenerate. Modified: trunk/libstdc++-v3/ChangeLog trunk/libstdc++-v3/configure trunk/libstdc++-v3/configure.ac
Fixed for 4.5.
So, this is fixed.