This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH] glibc 2.7 compilation failure with GCC 4.2.x due to 486+-specific memmove() redeclaration and _FORTIFY_SOURCEry
- From: Nix <nix at esperi dot org dot uk>
- To: libc-alpha at sources dot redhat dot com
- Cc: Jakub Jelinek <jakub at redhat dot com>
- Date: Sun, 21 Oct 2007 23:50:10 +0100
- Subject: [PATCH] glibc 2.7 compilation failure with GCC 4.2.x due to 486+-specific memmove() redeclaration and _FORTIFY_SOURCEry
(A bug may have been raised for this already, but glibc bugzilla appears
to be down: at least I'm getting zero results for *any* query, no matter
how broad...)
Compilation of glibc 2.7 with GCC 4.2.x fails with this error:
loki 14 /usr/packages/glibc/libc-patched/debug% gcc warning-nop.c -c -std=gnu99 -fgnu89-inline -O2 -Wall -Winline -Wwrite-strings -fmerge-all-constants -march=native -pipe -Wstrict-prototypes -mpreferred-stack-boundary=2 -g0 -O2 -fomit-frame-pointer -D__USE_STRING_INLINES -I../include -I/usr/packages/glibc/i686-esperi/debug -I/usr/packages/glibc/i686-esperi -I../sysdeps/i386/elf -I../nptl/sysdeps/unix/sysv/linux/i386/i686 -I../nptl/sysdeps/unix/sysv/linux/i386 -I../sysdeps/unix/sysv/linux/i386 -I../nptl/sysdeps/unix/sysv/linux -I../nptl/sysdeps/pthread -I../sysdeps/pthread -I../sysdeps/unix/sysv/linux -I../sysdeps/gnu -I../sysdeps/unix/common -I../sysdeps/unix/mman -I../sysdeps/unix/inet -I../sysdeps/unix/sysv/i386 -I../nptl/sysdeps/unix/sysv -I../sysdeps/unix/sysv -I../sysdeps/unix/i386 -I../nptl/sysdeps/unix -I../sysdeps/unix -I../sysdeps/posix -I../sysdeps/i386/i686/fpu -I../nptl/sysdeps/i386/i686 -I../sysdeps/i386/i686 -I../sysdeps/i386/i486 -I../nptl/sysdeps/i386/i486 -I../sysdeps/i386/fpu -I../nptl/sysdeps/i386 -I../sysdeps/i386 -I../sysdeps/wordsize-32 -I../sysdeps/ieee754/ldbl-96 -I../sysdeps/ieee754/dbl-64 -I../sysdeps/ieee754/flt-32 -I../sysdeps/ieee754 -I../sysdeps/generic/elf -I../sysdeps/generic -I../nptl -I.. -I../libio -I. -I /lib/modules/2.6.23.1-skas3-v9-pre9/build/include -D_LIBC_REENTRANT -include ../include/libc-symbols.h -o /usr/packages/glibc/i686-esperi/debug/warning-nop.o -MD -MP -MF /usr/packages/glibc/i686-esperi/debug/warning-nop.o.dt -MT /usr/packages/glibc/i686-esperi/debug/warning-nop.o
In file included from ../include/bits/string3.h:1,
from ../string/string.h:428,
from ../include/string.h:49,
from warning-nop.c:53:
../string/bits/string3.h:58: error: redefinition of ‘memmove’
../string/string.h:59: warning: ‘memset’ declared inline after being called
The cause of the error is quite obvious: memmove() is declared in
string/string.h as
/* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */
extern void *memmove (void *__dest, __const void *__src, size_t __n)
__THROW __nonnull ((1, 2));
__END_NAMESPACE_STD
and then defined in bits/i386/i486/bits/string.h as
__STRING_INLINE void *
memmove (void *__dest, __const void *__src, size_t __n)
{
...
}
and then *redefined* in string/bits/string3.h as
__extern_always_inline void *
__NTH (memmove (void *__restrict __dest, __const void *__restrict __src,
size_t __len))
{
return __builtin___memmove_chk (__dest, __src, __len, __bos0 (__dest));
}
This doesn't happen for any other string functions because all the other
functions in bits/i386/i486/string.h are either defined as macros that
call optimized functions with other names, or are not fortified
(e.g. memcmp()).
To be blunt I can't see how this would ever work: are gnu_inline
functions permitted to override functions with identical names declared
earlier in GCC HEAD, or something?
(The similar warning under _FORTIFY_SOURCE,
../string/string.h:59: warning: 'memset' declared inline after being called
is harder to avoid and doesn't break the build so I haven't fixed it here;
but it might break autoconf tests so probably should be fixed.)
A possible fix in the spirit of the other code in that file (tested on
i686-pc-linux-gnu, `make check' doesn't have any suspicious-looking
failures):
2007-10-21 Nix <nix@esperi.org.uk>
* sysdeps/i386/i486/bits/string.h (memmove): New macro.
Function of that name renamed to...
* sysdeps/i386/i486/bits/string.h (__memmove_g): ... this.
Index: libc-patched/sysdeps/i386/i486/bits/string.h
===================================================================
--- libc-patched.orig/sysdeps/i386/i486/bits/string.h 2007-10-20 19:46:17.000000000 +0100
+++ libc-patched/sysdeps/i386/i486/bits/string.h 2007-10-21 17:31:06.000000000 +0100
@@ -143,10 +143,13 @@
#define _HAVE_STRING_ARCH_memmove 1
#ifndef _FORCE_INLINES
+#define memmove(dest, src, n) \
+ __memmove_g ((dest), (src), (n))
+
/* Copy N bytes of SRC to DEST, guaranteeing
correct behavior for overlapping strings. */
__STRING_INLINE void *
-memmove (void *__dest, __const void *__src, size_t __n)
+__memmove_g (void *__dest, __const void *__src, size_t __n)
{
register unsigned long int __d0, __d1, __d2;
register void *__tmp = __dest;