libstdc++ testsuite on cygwin. Please help me fix the -liconv problem (PR36211)
David Billinghurst
dbcygwin@gmail.com
Thu May 14 03:16:00 GMT 2009
I am looking at some libstdc++ testsuite failures on cygwin. One of
them is a simple link error with -liconv.
- http://gcc.gnu.org/ml/libstdc++/2007-06/msg00007.html
- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36211
The problem is that while -liconv is passed to linker, it is passed
*before* the objects and libraries that reference libiconv symbols (see
below). With PE-COFF, the order of objects really does matter and
since the libiconv symbols have not yet been referenced when the linker
looks at the lib, the symbols are not resolved. They are not resolved
lazily as is possible in ELF.
All we need to do is reordering the command line and place -liconv after
unicode.cc.
I have spent some time looking at the testsuite files. LIBICONV is
defined in "scripts/testsuite_flags --cxxldflags", and this is used to
define cxxldflags in libstdc++.exp(libstdc++_init).
Then, in libstdc++.exp(v3_target_compile), cxxldflags is appended to
cxx_final - the command used to compile the test. This is not correct,
as it places -liconv before the source files. The following patch does
the right thing on cygwin, but I am not sure if it is the best way. (I
got lost in the twisty maze of *.exp files.)
2009-04-14 David Billinghurst <billingd@gcc.gnu.org>
* testsuite/lib/libstdc++.exp(v3_target_compile): Add
cxxldflags to additional_flags rather than cxx_final.
--- libstdc++.exp (revision 147328)
+++ libstdc++.exp (working copy)
@@ -402,8 +402,7 @@
# Flag setting based on type argument.
if { $type == "executable" } {
# Link the support objects into executables.
- set cxx_final [concat $cxx_final $cxxldflags]
- lappend options "additional_flags=./libtestc++.a"
+ lappend options "additional_flags=./libtestc++.a $cxxldflags"
} else {
if { $type == "sharedlib" } {
# Don't link in anything.
======================================================================
Here is the command that the testsuite uses to generate to executables:
/usr/local/obj/gcc-20090510/./gcc/g++ -shared-libgcc
-B/usr/local/obj/gcc-20090510/./gcc -nostdinc++
-L/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/src
-L/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/src/.libs
-B/usr/local/gcc-4_5/i686-pc-cygwin/bin/
-B/usr/local/gcc-4_5/i686-pc-cygwin/lib/ -isystem
/usr/local/gcc-4_5/i686-pc-cygwin/include -isystem
/usr/local/gcc-4_5/i686-pc-cygwin/sys-include -g -O2 -D_GLIBCXX_ASSERT
-fmessage-length=0 -ffunction-sections -fdata-sections -g -O2 -g -O2
-DLOCALEDIR="." -nostdinc++
-I/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/i686-pc-cygwin
-I/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include
-I/usr/local/cvs/trunk/libstdc++-v3/libsupc++
-I/usr/local/cvs/trunk/libstdc++-v3/include/backward
-I/usr/local/cvs/trunk/libstdc++-v3/testsuite/util -Wl,--gc-sections
-liconv
/usr/local/cvs/trunk/libstdc++-v3/testsuite/22_locale/locale/cons/unicode.cc
-include bits/stdc++.h ./libtestc++.a -o ./unicode.exe
/cygdrive/c/DOCUME~1/DABILL~1/LOCALS~1/Temp/ccXfhduf.o: In function
`__iconv_adaptor<const char**>':
/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/ext/codecvt_specializations.h:297:
undefined reference to `_libiconv'
/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/ext/codecvt_specializations.h:297:
undefined reference to `_libiconv'
/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/ext/codecvt_specializations.h:297:
undefined reference to `_libiconv'
/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/ext/codecvt_specializations.h:297:
undefined reference to `_libiconv'
/usr/local/obj/gcc-20090510/i686-pc-cygwin/libstdc++-v3/include/ext/codecvt_specializations.h:297:
undefined reference to `_libiconv'
collect2: ld returned 1 exit status
More information about the Libstdc++
mailing list