This is the mail archive of the
mailing list for the GCC project.
Serious regressions due to newlib's HAVE_INITFINI_ARRAY (Re: [PATCH] Fix up --enable-initfini-array autodetection in configure (PR bootstrap/50237))
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: jakub at redhat dot com
- Cc: bonzini at gnu dot org (Paolo Bonzini), aoliva at redhat dot com (Alexandre Oliva), hjl dot tools at gmail dot com (H.J. Lu), gcc-patches at gcc dot gnu dot org, newlib at sourceware dot org
- Date: Wed, 22 Feb 2012 15:55:34 +0100 (CET)
- Subject: Serious regressions due to newlib's HAVE_INITFINI_ARRAY (Re: [PATCH] Fix up --enable-initfini-array autodetection in configure (PR bootstrap/50237))
Jakub Jelinek wrote:
> PR bootstrap/50237
> * config/initfini-array.h: Guard content of the header
> with #ifdef HAVE_INITFINI_ARRAY.
> * configure.ac: Move gcc_AC_INITFINI_ARRAY much later into the file.
> Add initfini-array.h to tm_file here.
> * acinclude.m4 (gcc_AC_INITFINI_ARRAY): For non-ia64 do a linker
> * config.gcc: Don't add initfini-array.h to tm_file here.
> * configure: Regenerated.
This patch causes serious regressions on spu-elf, and presumably other
newlib targets. The effect of the patch is to switch GCC to use
.init_array/.fini_array instead of .init/.fini; but the former is
not actually supported by newlib startup code (at least on SPU and
most other platforms supported by newlib), so that constructors and
destructors end up simply being ignored.
This occurs due to combination of GCC configury changes introduced
by the patch and a bug in newlib system headers. Before the patch,
initfini-array.h was not included into tm.h when building a cross-
compiler to spu-elf, and after the patch it is. Now, the patch
also inserts a #ifdef HAVE_INITFINI_ARRAY check, and the configure
check does not define this macro for cross-compilers, so in theory
that should not cause any change in behaviour.
However, the macro HAVE_INITFINI_ARRAY is defined anyway; this
definition is done by an internal "newlib.h" header that is pulled
in via the <stdio.h> include in GCC's "tsystem.h". [ This is clearly
a violation of C namespace rules, but this has been the situation
for all newlib releases since about 2005 ... ]
Since initfini-array.h is now pulled in and HAVE_INITFINI_ARRAY
is defined, we get USE_INITFINI_ARRAY defined as well, which
causes the crtstuff files to be build for .init_array support.
Now, I guess the newlib headers should be fixed to no longer
pollute the namespace by defining HAVE_INITFINI_ARRAY.
However, I'm wondering whether there is a way to change
GCC to fix that regression even with existing newlib headers.
For example, I guess GCC configury could rename its instance of
HAVE_INITFINI_ARRAY (maybe define USE_INITFINI_ARRAY to begin
Any suggestions how to proceed with this welcome! I'd really
like to see this fixed for 4.7, otherwise the compiler will be
seriously broken ...
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE