This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[patch/rfc] building glibc fails when gcc is tuned by default to target i686+
- From: Mike Frysinger <vapier at gentoo dot org>
- To: libc-alpha at sourceware dot org
- Date: Tue, 25 Apr 2006 20:33:06 -0400
- Subject: [patch/rfc] building glibc fails when gcc is tuned by default to target i686+
- Geoman: IS A RETARD
if you configure gcc at build time with the '--with-arch' option and specify
i686 or better, then glibc will fail to build. the reason for this is that
gcc will automatically define '__i686' to '1' for all i686 and better
targets. so when an asm (.S) file that uses the SETUP_PIC_REG macro, the
build bombs because the '__i686' in the section name is replaced with a '1':
../sysdeps/i386/elf/setjmp.S: Assembler messages:
../sysdeps/i386/elf/setjmp.S:63: Error: junk at end of line, first
unrecognized character is `1'
this issue is not seen normally with a default gcc build as the default target
is i386 (or i486 for Debian users), and glibc ignores CFLAGS optimizations
when compiling .S files (so CFLAGS='-march=i686' is safe).
one way to fix this as proposed by Thomas <tg42@gmx.de> is to add '-U__i686'
to the toplevel Makeconfig. since i'm *pretty* sure this wont fly, i wrote a
patch that undefines __i686 in the x86-specific sysdep.h file. undefining
this preprocessor is OK as the glibc code looks at '__i686__', not '__i686'.
this covers everything but the code that generates the .init/.fini sections
for the threading lib (both nptl and linuxthreads). so i updated the common
pt-initfini.c to pull in the 'sysdep.h' file. of course, i'd like to see
what other solutions people have :)
-mike
If gcc is configured to generate i686 code or better by default (like
when using the --with-arch=pentium3 configure option), then the __i686
macro will always be defined automatically and thus screw up the
compilation of some .S files.
http://bugs.gentoo.org/131108
2006-04-25 Mike Frysinger <vapier@gentoo.org>
* sysdeps/i386/sysdep.h (__i686): Undefine.
--- sysdeps/i386/sysdep.h
+++ sysdeps/i386/sysdep.h
@@ -1,5 +1,6 @@
/* Assembler macros for i386.
- Copyright (C) 1991-93,95,96,98,2002,2003,2005 Free Software Foundation, Inc.
+ Copyright (C) 1991-93,95,96,98,2002,2003,2005,2006
+ Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
@@ -17,6 +18,14 @@
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+/*
+ * When building for i686 targets or better, gcc automatically defines
+ * '__i686' to '1' for us which causes trouble when using section names
+ * like '__i686.get_pc_thunk.reg'. Since we check for __i686__ in the
+ * code, killing '__i686' shouldn't be a problem.
+ */
+#undef __i686
+
#include <sysdeps/generic/sysdep.h>
#ifdef __ASSEMBLER__
2006-04-25 Mike Frysinger <vapier@gentoo.org>
* sysdeps/pthread/pt-initfini.c: Include sysdep.h.
--- nptl/sysdeps/pthread/pt-initfini.c
+++ nptl/sysdeps/pthread/pt-initfini.c
@@ -1,5 +1,5 @@
/* Special .init and .fini section support. Linuxthread version.
- Copyright (C) 1995,1996,1997,2000,2001,2002 Free Software Foundation, Inc.
+ Copyright (C) 1995-1997,2000-2002,2006 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it
@@ -45,6 +45,9 @@
/* Embed an #include to pull in the alignment and .end directives. */
asm ("\n#include \"defs.h\"");
+/* Embed an #include to pull in asm settings. */
+asm ("\n#include <sysdep.h>");
+
/* The initial common code ends here. */
asm ("\n/*@HEADER_ENDS*/");