Subject: Building GLIBC 2.3.4 on MIPS

From: Jim Gifford <[email-masked]>
Date: Tue, 22 Feb 2005 16:32:52 -0800

I'm trying to build the current glibc with my RaQ2, everything builds 
ok, until I start compiling strace.

syscall.c: In function `dumpio':
syscall.c:449: error: `SYS_read' undeclared (first use in this function)
syscall.c:449: error: (Each undeclared identifier is reported only once
syscall.c:449: error: for each function it appears in.)
syscall.c:465: error: `SYS_write' undeclared (first use in this function)
syscall.c: In function `syscall_fixup':
syscall.c:1265: warning: unused variable `pid'
syscall.c: In function `trace_syscall':
syscall.c:2481: error: `SYS_exit' undeclared (first use in this function)
make[1]: *** [syscall.o] Error 1
make[1]: Leaving directory `/usr/src/strace-4.5.9'
make: *** [all] Error 2

Which leads me to check syscall.h, then I noticed a big difference from 
my x86 version to this version, all the SYS_ entries are missing.  Did I 
build it wrong or is this a glibc issue, due to the addition of the 
mips32 and mips64 directories.

Here is my bug report with the glibc folks for everyone's reference.
http://sources.redhat.com/bugzilla/show_bug.cgi?id=758

-- 
----
Jim Gifford
[email-masked]

---

From: Kumba <[email-masked]>
Date: Tue, 22 Feb 2005 19:53:59 -0500

> http://sources.redhat.com/bugzilla/show_bug.cgi?id=758

We've bumped into this on the gentoo-side of things.  The fix we're using (for 
now) is this a modified version of this patch here: 
http://lists.debian.org/debian-mips/2004/01/msg00036.html

The above patch wasn't intended for 2.3.4 by default I believe, so it doesn't 
apply cleanly.  It had to be re-diffed for 2.3.4.  You can find this version 
here: http://dev.gentoo.org/~kumba/tmp/6630_mips_fix-syscall_h-again.patch

The resulting bits/syscall.h isn't the cleanest thing, but strace will build 
against it and it does appear to work.

--Kumba

-- 
"Such is oft the course of deeds that move the wheels of the world: small 
hands do them because they must, while the eyes of the great are elsewhere." 
--Elrond

---

From: David Daney <[email-masked]>
Date: Tue, 22 Feb 2005 17:02:14 -0800

> http://sources.redhat.com/bugzilla/show_bug.cgi?id=758

It seems that you might need some (but not all) of the patch I posted here:

http://www.linux-mips.org/archives/linux-mips/2004-10/msg00068.html

Specifically I think you will need at least the parts that add

#include <sgidefs.h>

To many of the .h files.  Basically any file that uses the symbol 
_MIPS_SIM and friends needs to either directly or indirectly include 
sgidefs.h

You may also need:

http://www.linux-mips.org/archives/linux-mips/2004-10/msg00142.html

And something like this:

http://sources.redhat.com/ml/libc-alpha/2004-11/msg00165.html

David Daney.

---

From: Jim Gifford <[email-masked]>
Date: Tue, 22 Feb 2005 18:42:01 -0800

Thanx Kumba and David I really appreciate the help.

Got one other question for you, this was brought up on my LFS for the RaQ2.

http://sources.redhat.com/ml/libc-alpha/2005-01/msg00063.html

Here is the message for those who don't want to link.

A user attempting to build glibc kept getting "getconf" missing errors, 
upon checking /usr/bin/getconf, he found the getconf was a directory 
with 2 files in it

POSIX_V6_ILP32_OFFBIG
POSIX_V6_ILP32_OFF32

Now, I've been able to recreate this issue, but haven't figured out the 
root cause.

---

From: Ralf Baechle <[email-masked]>
Date: Wed, 23 Feb 2005 11:38:16 +0000

> http://www.linux-mips.org/archives/linux-mips/2004-10/msg00068.html

A little request - when posting references to mailing list postings
or otherwise referecing them, please use the address that can be obtained
by clicking at the "Permanent Link" neary the upper right of the posting.
The resulting URL may be quite ugly but at least it won't change unlike
the .../msg<somenumber>.html links that may change if I occasinally
remove a posting from the archive such as spam.

  Ralf

---

From: "Maciej W. Rozycki" <[email-masked]>
Date: Wed, 23 Feb 2005 14:05:28 +0000 (GMT)

On Tue, 22 Feb 2005, David Daney wrote:

> > I'm trying to build the current glibc with my RaQ2, everything builds ok,
> > until I start compiling strace.
> > 
> To many of the .h files.  Basically any file that uses the symbol _MIPS_SIM
> and friends needs to either directly or indirectly include sgidefs.h
> 
> You may also need:
> 

 The culprit is elsewhere.  The glibc's syscall number translator script 
doesn't work with asm-mips/unistd.h as of Linux 2.6 (you could have 
probably used 2.4 headers instead; I'm not sure if that is compatible with 
"--enable-kernel=2.6.0", though).  A correct fix has been prepared and 
proposed by Richard Sandiford and is available here: 
"http://sourceware.org/ml/libc-alpha/2004-11/msg00097.html".  I would 
expect this patch to have been applied before 2.3.4, but apparently this 
hasn't happened.  That's regrettable and I fear it's the result of glibc 
being somewhat inadequately maintained for MIPS/Linux these days, sigh...

 I'm not sure what the maintenance plan is for the 2.3 branch of glibc, 
but if 2.3.5 is ever going to happen, the Richard's patch is one of the 
must-have additions.

  Maciej

---

From: Kumba <[email-masked]>
Date: Thu, 24 Feb 2005 09:36:54 -0500

> but if 2.3.5 is ever going to happen, the Richard's patch is one of the 

The debian patch I referenced is what we require for glibc to generate a 
proper syscalls.h for 2.4 kernels.  Unknown on the 2.6 kernel front how that 
patch affects things.  I'll have to see if this patch affects/changes anything 
for either headers version.

--Kumba

---

From: Jim Gifford <[email-masked]>
Date: Thu, 24 Feb 2005 09:21:12 -0800

I updated the patch, that was posted in libc-alpha and I have tested it. 
Thanx to you all for your assistance.

http://ftp.jg555.com/patches/raq2/glibc/glibc-2.3.4-mips_syscall-2.patch

Submitted By: Jim Gifford (patches at jg555 dot com)
Date: 2005-02-23
Initial Package Version: 2.3.4
Origin: Richard Sandiford
Upstream Status: Unknown
Description: Fixes Syscall.h generation
 
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/Makefile	2004-11-24 04:38:15 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/Makefile	2005-02-23 18:21:54 +0000
@@ -9,11 +9,73 @@
 
 no_syscall_list_h = 1
 
-# Generate the list of SYS_* macros for the system calls (__NR_* macros).
-# We generate not only SYS_<syscall>, pointing at SYS_<abi>_<syscall> if
-# it exists, but also define SYS_<abi>_<syscall> for all ABIs.
+# A callable macro that expands to a shell command.  Preprocess file $(1)
+# using ABI option $(2) and see which macros it defines.  Print FOO for each
+# macro of the form __NR$(3)_FOO, filtering out ABI-specific __NR macros
+# that have a prefix other than $(3).
+mips_list_syscalls =	$(filter-out -m%,$(CC)) -E -x c $(+includes) \
+			    $(sysincludes) -D_LIBC -dM -mabi=$(2) $(1) | \
+			sed -n 's@^\#define __NR$(3)_\([^ ]*\) .*@\1@p' | \
+			sed -e '/^[ON]32_/d' -e '/^N64_/d' -e '/^64_/d' | \
+			LC_ALL=C sort
+
+# Generate a list of SYS_* macros from the linux __NR macros.
+#
+# Before version 2.6, linux had separate 32-bit and 64-bit MIPS ports,
+# each with its own set of headers.  The ports were merged for 2.6 and
+# this merged port defines the syscalls in a slightly different way.
+# There are therefore three sets of headers that we need to consider:
+#
+#    (1) Headers from the separate 32-bit MIPS port.  They just define
+#	 a single list of __NR macros.
+#
+#    (2) Headers from the separate 64-bit MIPS port.  They unconditionally
+#	 define syscalls for all three ABIs, with o32 syscalls prefixed
+#	 by __NR_O32, n32 syscalls prefixed by __NR_N32 and n64 syscalls
+#	 prefixed by plain __NR.
+#
+#    (3) Headers from the combined port.  They use the _MIPS_SIM macro to
+#	 define the right set of syscalls for the current ABI.  The syscalls
+#	 themselves have no special ABI prefix, but the headers also define:
+#
+#	    __NR_O32_Linux{,_syscalls}
+#	    __NR_N32_Linux{,_syscalls}
+#	    __NR_64_Linux{,_syscalls}
+#
+# In case (1) we just want a simple list of SYS_* macros.  In cases (2)
+# and (3) we want a file that will work for all three ABIs, regardless
+# of which ABI we are currently using.  We also want the file to work
+# if the user later moves from (2) to (3).  Thus the file we create
+# for (2) and (3) has the form:
+#
+#    #if _MIPS_SIM == _MIPS_SIM_NABI32
+#    # ifdef __NR_N32_open
+#    #  define SYS_n32syscall1 __NR_N32_n32syscall1
+#    #  ...
+#    # else
+#    #  define SYS_n32syscall1 __NR_n32syscall1
+#    #  ...
+#    # endif
+#    #elif _MIPS_SIM == _MIPS_SIM_ABI64
+#    # define SYS_n64syscall1 __NR_n64syscall1
+#    # ...
+#    #else
+#    # ifdef __NR_O32_open
+#    #  define SYS_o32syscall1 __NR_O32_o32syscall1
+#    #  ...
+#    # else
+#    #  define SYS_o32syscall1 __NR_o32syscall1
+#    #  ...
+#    # endif
+#    #endif
+#
+# Here, __NR_N32_open and __NR_O32_open are used to detect case (2)
+# over case (3).  The n64 SYS_* macros can always use the normal
+# ABI-less names.
 $(objpfx)syscall-%.h $(objpfx)syscall-%.d: ../sysdeps/unix/sysv/linux/mips/sys/syscall.h
 	$(make-target-directory)
+	$(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC $< -MD -MP \
+	      -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' > /dev/null
 	{ \
 	 echo '/* Generated at libc build time from kernel syscall list.  */';\
 	 echo ''; \
@@ -22,28 +84,38 @@
 	 echo '#endif'; \
 	 echo ''; \
 	 echo '#include <sgidefs.h>'; \
-	 rm -f $(@:.d=.h).newt; \
-	 $(CC) -E -MD -MP -MF $(@:.h=.d)-t -MT '$(@:.d=.h) $(@:.h=.d)' \
-	       -x c $(+includes) $(sysincludes) $< -D_LIBC -dM | \
-	 sed -n 's@^#define __NR_\([^ ]*\) .*$$@#define SYS_\1 __NR_\1@p' \
-	     > $(@:.d=.h).newt; \
-	 if grep SYS_O32_ $(@:.d=.h).newt > /dev/null; then \
+ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
+ 	 $(call mips_list_syscalls,$<,n32,_N32) > $(@:.d=.h).newn32; \
+ 	 if test -s $(@:.d=.h).newn32; then \
+ 	   if grep open $(@:.d=.h).newn32 > /dev/null; then \
+ 	     $(call mips_list_syscalls,$<,32,_O32) > $(@:.d=.h).new32; \
+ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
+ 	   else \
+ 	     $(call mips_list_syscalls,$<,32,) > $(@:.d=.h).new32; \
+ 	     $(call mips_list_syscalls,$<,n32,) > $(@:.d=.h).newn32; \
+ 	     $(call mips_list_syscalls,$<,64,) > $(@:.d=.h).new64; \
+ 	   fi; \
 	   echo '#if _MIPS_SIM == _ABIN32'; \
-	   sed -n 's/^\(#define SYS_\)N32_/\1/p' < $(@:.d=.h).newt | \
-		LC_ALL=C sort; \
+ 	   echo '# ifdef __NR_N32_open'; \
+ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_N32_\1@' < $(@:.d=.h).newn32; \
+ 	   echo '# else'; \
+ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).newn32; \
+ 	   echo '# endif'; \
 	   echo '#elif _MIPS_SIM == _ABI64'; \
-	   sed -n 's/^\(#define SYS_\)N64_/\1/p' < $(@:.d=.h).newt | \
-		LC_ALL=C sort; \
+ 	   sed 's@\(.*\)@# define SYS_\1 __NR_\1@' < $(@:.d=.h).new64; \
 	   echo '#else'; \
-	   sed -n 's/^\(#define SYS_\)O32_/\1/p' < $(@:.d=.h).newt | \
-		LC_ALL=C sort; \
+ 	   echo '# ifdef __NR_O32_open'; \
+ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_O32_\1@' < $(@:.d=.h).new32; \
+ 	   echo '# else'; \
+ 	   sed 's@\(.*\)@#  define SYS_\1 __NR_\1@' < $(@:.d=.h).new32; \
+ 	   echo '# endif'; \
 	   echo '#endif'; \
-	   sed -n '/^#define SYS_\([ON]32\|N64\)_/p' < $(@:.d=.h).newt | \
-		LC_ALL=C sort +1.8; \
 	 else \
-	   cat $(@:.d=.h).newt; \
+ 	   $(CC) -E -x c $(+includes) $(sysincludes) -D_LIBC -dM $< | \
+ 	   sed -n 's@^\#define __NR_\([^ ]*\) .*@\#define SYS_\1 __NR_\1@p' | \
+ 	   LC_ALL=C sort; \
 	 fi; \
-	 rm $(@:.d=.h).newt; \
+ 	 rm -f $(@:.d=.h).new32 $(@:.d=.h).newn32 $(@:.d=.h).new64; \
 	} > $(@:.d=.h).new
 	mv -f $(@:.d=.h).new $(@:.d=.h)
 ifneq (,$(objpfx))
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure	2004-11-24 04:42:45 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure	2005-02-23 18:10:11 +0000
@@ -18,7 +18,7 @@
     { echo "$as_me:$LINENO: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&5
 echo "$as_me: WARNING: *** asm/unistd.h not found, it will not be pre-processed" >&2;}
     echo '#include <asm/unistd.h>' > asm-unistd.h
-  else
+  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
     # The point of this preprocessing is to turn __NR_<syscall> into
     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
@@ -68,6 +68,8 @@
 {
 	print;
 }'
+  else
+    echo '#include <asm/unistd.h>' > asm-unistd.h
   fi ;;
 mips*)
   rm -f asm-unistd.h
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/configure.in	2004-11-24 04:38:31 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/configure.in	2005-02-23 18:10:11 +0000
@@ -18,7 +18,7 @@
   if test ! -f "$asm_unistd_h"; then
     AC_MSG_WARN([*** asm/unistd.h not found, it will not be pre-processed])
     echo '#include <asm/unistd.h>' > asm-unistd.h
-  else
+  elif grep __NR_N32_open "$asm_unistd_h" > /dev/null; then
     # The point of this preprocessing is to turn __NR_<syscall> into
     # __NR_N64_<syscall>, as well as to define __NR_<syscall> to
     # __NR_<abi>_<syscall>, if __NR_<abi>_<syscall> is defined
@@ -68,6 +68,8 @@
 {
 	print;
 }'
+  else
+    echo '#include <asm/unistd.h>' > asm-unistd.h
   fi ;;
 mips*)
   rm -f asm-unistd.h
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2003-03-29 08:15:29 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips32/kern64/sysdep.h	2005-02-23 18:10:11 +0000
@@ -1,36 +0,0 @@
-/* Copyright (C) 2000, 2002, 2003 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
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
-   02111-1307 USA.  */
-
-#ifndef _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H
-#define _LINUX_MIPS_MIPS32_KERN64_SYSDEP_H 1
-
-/* There is some commonality.  */
-#include <sysdeps/unix/sysv/linux/mips/mips32/sysdep.h>
-
-/* For Linux we can use the system call table in the header file
-	/usr/include/asm/unistd.h
-   of the kernel.  But these symbols do not follow the SYS_* syntax
-   so we have to redefine the `SYS_ify' macro here.  */
-#undef SYS_ify
-#ifdef __STDC__
-# define SYS_ify(syscall_name)	__NR_O32_##syscall_name
-#else
-# define SYS_ify(syscall_name)	__NR_O32_/**/syscall_name
-#endif
-
-#endif /* linux/mips/mips32/kern64/sysdep.h */
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2004-10-18 05:16:07 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h	2005-02-23 18:10:11 +0000
@@ -28,9 +28,9 @@
    so we have to redefine the `SYS_ify' macro here.  */
 #undef SYS_ify
 #ifdef __STDC__
-# define SYS_ify(syscall_name)	__NR_N32_##syscall_name
+# define SYS_ify(syscall_name)	__NR_##syscall_name
 #else
-# define SYS_ify(syscall_name)	__NR_N32_/**/syscall_name
+# define SYS_ify(syscall_name)	__NR_/**/syscall_name
 #endif
 
 #ifdef __ASSEMBLER__
diff -Naur glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
--- glibc-2.3.4.orig/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2004-10-18 05:16:08 +0000
+++ glibc-2.3.4/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h	2005-02-23 18:10:11 +0000
@@ -28,9 +28,9 @@
    so we have to redefine the `SYS_ify' macro here.  */
 #undef SYS_ify
 #ifdef __STDC__
-# define SYS_ify(syscall_name)	__NR_N64_##syscall_name
+# define SYS_ify(syscall_name)	__NR_##syscall_name
 #else
-# define SYS_ify(syscall_name)	__NR_N64_/**/syscall_name
+# define SYS_ify(syscall_name)	__NR_/**/syscall_name
 #endif
 
 #ifdef __ASSEMBLER__

---

From: "Maciej W. Rozycki" <[email-masked]>
Date: Thu, 24 Feb 2005 19:51:26 +0000 (GMT)

> proper syscalls.h for 2.4 kernels.  Unknown on the 2.6 kernel front how that

 Well, glibc 2.3.4 works out of the box with 2.4.  Perhaps you've had 
problems with an older revision.

> for either headers version.

 It works for me with current 2.6.  It requires a small obvious update due 
to changes to _MIPS_SIM macros.

  Maciej