[patch] Fix array aliasing conftest

Hans-Peter Nilsson hans-peter.nilsson@axis.com
Fri Apr 17 15:40:00 GMT 2009

> From: Ken Werner <ken@linux.vnet.ibm.com>
> Date: Wed, 8 Apr 2009 16:57:35 +0200

> while looking at the autoconf scripts I noticed newlibs check for array 
> aliasing support (_HAVE_ARRAY_ALIASING). The configure.in specifies the 
> following conftest:
>   char x[3] = { 'a', 'b', 'c' };
>   extern char y[2] __attribute__((alias ("x+1")));
> This looks valid but autoconf strips the square brackets. The generated 
> configure states:
>   char x3 = { 'a', 'b', 'c' };
>   extern char y2 __attribute__((alias ("x+1")));
> I think this has never compiled as intended. Adding additional square brackets 
> in the configure.in seem to fix that.

Except that the construct as such is _invalid_ and must not be
used.  You can only alias to symbols, not offset expressions.
It accidentally worked for older gcc.  See
<http://sourceware.org/ml/newlib/2001/msg00466.html> and

I'm a bit surprised it's still used (even conditionally) and
apparently working somewhere, supposedly cygwin?

It seems the above fixing of the test now causes the build to
break for e.g. cris-elf:

checking for cris-elf-gcc... (cached) /tmp/newnewlib/gccobj/./gcc/xgcc -B/tmp/newnewlib/gccobj/./gcc/ -nostdinc -B/tmp/newnewlib/gccobj/cris-elf/v10/newlib/ -isystem /tmp/newnewlib/gccobj/cris-elf/v10/newlib/targ-include -isystem /tmp/newnewlib/gcc/newlib/libc/include -B/tmp/newnewlib/gccobj/cris-elf/v10/libgloss/cris -L/tmp/newnewlib/gccobj/cris-elf/v10/libgloss/libnosys -L/tmp/newnewlib/gcc/libgloss/cris -B/tmp/newnewlib/pre/cris-elf/bin/ -B/tmp/newnewlib/pre/cris-elf/lib/ -isystem /tmp/newnewlib/pre/cris-elf/include -isystem /tmp/newnewlib/pre/cris-elf/sys-include  -march=v10 -mbest-lib-options
checking for C compiler default output file name... configure: error: C compiler cannot create executables
See `config.log' for more details.
configure: error: /tmp/newnewlib/gcc/newlib/libm/configure failed for libm
make[1]: *** [configure-target-newlib] Error 1
make[1]: Leaving directory `/tmp/newnewlib/gccobj'
make: *** [all] Error 2

And in tmp/newnewlib/gcc/newlib/config.log, the last compile
test is:

configure:11916: /tmp/newnewlib/gccobj/./gcc/xgcc -B/tmp/newnewlib/gccobj/./gcc/ -nostdinc -B/tmp/newnewlib/gccobj/cris-elf/newlib/ -isystem /tmp/newnewlib/gccobj/cris-elf/newlib/targ-include -isystem /tmp/newnewlib/gcc/newlib/libc/include -B/tmp/newnewlib/gccobj/cris-elf/libgloss/cris -L/tmp/newnewlib/gccobj/cris-elf/libgloss/libnosys -L/tmp/newnewlib/gcc/libgloss/cris -B/tmp/newnewlib/pre/cris-elf/bin/ -B/tmp/newnewlib/pre/cris-elf/lib/ -isystem /tmp/newnewlib/pre/cris-elf/include -isystem /tmp/newnewlib/pre/cris-elf/sys-include   -c conftest.c
conftest.c:2: error: 'y' aliased to undefined symbol 'x+1'

Why is that?  Isn't it a test for an optional feature?  Is it
somehow an autoconf bug that the last feature test has to
succeed?  Am I barking up the wrong tree?

(Not that the tree isn't worthy of barking up against, but maybe
it's not *that* cat I'm chasing.)

brgds, H-P

More information about the Newlib mailing list