Various bug fixes.  minips now seems to work!

diff --git a/include/stdlib.h b/include/stdlib.h
index b78ada0..0f8b0f5 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -30,10 +30,17 @@
   return (__n < 0L) ? -__n : __n;
 }
 
-static __inline__ long llabs(long __n) {
+static __inline__ long long llabs(long long __n) {
   return (__n < 0LL) ? -__n : __n;
 }
-__extern void *malloc(size_t);
+
+#if defined(__GNUC__) && __GNUC_MAJOR__ >= 3
+# define __attribute_malloc __attribute__((malloc))
+#else
+# define __attribute_malloc
+#endif
+
+__extern __attribute_malloc void *malloc(size_t);
 __extern void *realloc(void *, size_t);
 __extern long strtol(const char *, char **, int);
 __extern long long strtoll(const char *, char **, int);
diff --git a/klibc/Makefile b/klibc/Makefile
index c14bdf1..664ef09 100644
--- a/klibc/Makefile
+++ b/klibc/Makefile
@@ -12,7 +12,7 @@
 PERL    = perl
 
 TESTS   = testvsnp hello minihello microhello getenvtest \
-	  getopttest malloctest
+	  getopttest malloctest minips
 LIBOBJS = vsnprintf.o snprintf.o vsprintf.o sprintf.o \
 	  vsscanf.o sscanf.o ctypes.o \
 	  strntoumax.o strntoimax.o \
@@ -67,10 +67,7 @@
 .c.ls:
 	$(CC) $(CFLAGS) $(SOFLAGS) -S -o $@ $<
 
-# Kill implicit rule
-.o:
-
-% : %.o $(LIB) $(CRT0)
+% : %.o
 	$(LD) -o $@ $(CRT0) $< $(LIB) $(LIBGCC)
 	cp $@ $@.stripped
 	$(STRIP) $@.stripped
@@ -89,6 +86,8 @@
 
 malloctest: malloctest.o $(LIB) $(CRT0)
 
+minips: minips.o $(LIB) $(CRT0)
+
 $(LIB): $(LIBOBJS) syscalls.dir socketcalls.dir
 	rm -f $(LIB)
 	$(AR) cq $(LIB) $(LIBOBJS) syscalls/*.o socketcalls/*.o
@@ -99,6 +98,11 @@
 		$(SOOBJS) syscalls/*.lo socketcalls/*.lo \
 	        $(LIBGCC)
 
+# This one *HAS* to be compiled without a frame pointer, regardless of
+# OPTFLAGS!
+crt0.o: crt0.c
+	$(CC) $(CFLAGS) -fomit-frame-pointer -c -o $@ $<
+
 syscalls.dir: SYSCALLS syscalls.pl syscommon.h
 	rm -rf syscalls
 	mkdir syscalls
diff --git a/klibc/README b/klibc/README
index 2e26031..8d5c7e5 100644
--- a/klibc/README
+++ b/klibc/README
@@ -10,7 +10,7 @@
 a) Create a symlink called "linux" pointing to a reasonably recent
    Linux kernel tree (2.4 or 2.5 should be OK.)  This tree must have
    the include/asm symlink set up for the architecture you're
-   compiling for.
+   compiling for, and include/linux/autoconf.h must exist.
 
 b) Create a symlink in the include directory called "bitsize" pointing
    either to the "bits32" or the "bits64" directory, depending on the
diff --git a/klibc/include/stdlib.h b/klibc/include/stdlib.h
index b78ada0..0f8b0f5 100644
--- a/klibc/include/stdlib.h
+++ b/klibc/include/stdlib.h
@@ -30,10 +30,17 @@
   return (__n < 0L) ? -__n : __n;
 }
 
-static __inline__ long llabs(long __n) {
+static __inline__ long long llabs(long long __n) {
   return (__n < 0LL) ? -__n : __n;
 }
-__extern void *malloc(size_t);
+
+#if defined(__GNUC__) && __GNUC_MAJOR__ >= 3
+# define __attribute_malloc __attribute__((malloc))
+#else
+# define __attribute_malloc
+#endif
+
+__extern __attribute_malloc void *malloc(size_t);
 __extern void *realloc(void *, size_t);
 __extern long strtol(const char *, char **, int);
 __extern long long strtoll(const char *, char **, int);
diff --git a/klibc/minips.c b/klibc/minips.c
index fd031f5..c599150 100644
--- a/klibc/minips.c
+++ b/klibc/minips.c
@@ -369,7 +369,7 @@
     break;
   case 'u'|0x80:
     printf(
-      "%5d %5d    -    - %5ld %4ld %s %c   -   %s",
+      "%5d %5d    -    - %5ld %5ld %s %c   -   %s",
       P_euid, P_pid, P_vsize, P_rss, tty, P_state,
       do_time(P_utime+P_stime)
     );
@@ -415,7 +415,7 @@
     case 'l':      head = "  F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN    TTY       TIME CMD"; break;
     case 'f':      head = "  UID   PID  PPID  C STIME   TTY       TIME CMD"; break;
     case 'j':      head = "  PID  PGID   SID TTY         TIME CMD"; break;
-    case 'u'|0x80: head = "  UID   PID %CPU %MEM   VSZ  RSS   TTY   S START     TIME COMMAND"; break;
+    case 'u'|0x80: head = "  UID   PID %CPU %MEM   VSZ   RSS   TTY   S START     TIME COMMAND"; break;
     case 'v'|0x80: head = "  PID   TTY   S     TIME  MAJFL TRS DRS   RSS %MEM COMMAND"; break;
     case 'j'|0x80: head = " PPID   PID  PGID   SID   TTY   TPGID S   UID     TIME COMMAND"; break;
     case 'l'|0x80: head = "  F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  S   TTY       TIME COMMAND"; break;
diff --git a/klibc/vsscanf.c b/klibc/vsscanf.c
index be9f4da..7410556 100644
--- a/klibc/vsscanf.c
+++ b/klibc/vsscanf.c
@@ -64,7 +64,7 @@
   return (int)(bitmap[bit/LONG_BIT] >> (bit%LONG_BIT)) & 1;
 }
 
-int vsscanf(const char *buffer, size_t n, const char *format, va_list ap)
+int vsscanf(const char *buffer, const char *format, va_list ap)
 {
   const char *p = format;
   char ch;
@@ -228,6 +228,7 @@
 	    bail = bail_err;
 	    break;
 	  }
+	  q = qq;
 	  converted++;
 	  /* fall through */
 
@@ -305,6 +306,7 @@
 	  break;
 	}
       }
+      break;
     
     case st_match_init:		/* Initial state for %[ match */
       if ( ch == '^' && !(flags & FL_INV) ) {
diff --git a/minips.c b/minips.c
index fd031f5..c599150 100644
--- a/minips.c
+++ b/minips.c
@@ -369,7 +369,7 @@
     break;
   case 'u'|0x80:
     printf(
-      "%5d %5d    -    - %5ld %4ld %s %c   -   %s",
+      "%5d %5d    -    - %5ld %5ld %s %c   -   %s",
       P_euid, P_pid, P_vsize, P_rss, tty, P_state,
       do_time(P_utime+P_stime)
     );
@@ -415,7 +415,7 @@
     case 'l':      head = "  F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN    TTY       TIME CMD"; break;
     case 'f':      head = "  UID   PID  PPID  C STIME   TTY       TIME CMD"; break;
     case 'j':      head = "  PID  PGID   SID TTY         TIME CMD"; break;
-    case 'u'|0x80: head = "  UID   PID %CPU %MEM   VSZ  RSS   TTY   S START     TIME COMMAND"; break;
+    case 'u'|0x80: head = "  UID   PID %CPU %MEM   VSZ   RSS   TTY   S START     TIME COMMAND"; break;
     case 'v'|0x80: head = "  PID   TTY   S     TIME  MAJFL TRS DRS   RSS %MEM COMMAND"; break;
     case 'j'|0x80: head = " PPID   PID  PGID   SID   TTY   TPGID S   UID     TIME COMMAND"; break;
     case 'l'|0x80: head = "  F   UID   PID  PPID PRI  NI   VSZ  RSS WCHAN  S   TTY       TIME COMMAND"; break;
diff --git a/vsscanf.c b/vsscanf.c
index be9f4da..7410556 100644
--- a/vsscanf.c
+++ b/vsscanf.c
@@ -64,7 +64,7 @@
   return (int)(bitmap[bit/LONG_BIT] >> (bit%LONG_BIT)) & 1;
 }
 
-int vsscanf(const char *buffer, size_t n, const char *format, va_list ap)
+int vsscanf(const char *buffer, const char *format, va_list ap)
 {
   const char *p = format;
   char ch;
@@ -228,6 +228,7 @@
 	    bail = bail_err;
 	    break;
 	  }
+	  q = qq;
 	  converted++;
 	  /* fall through */
 
@@ -305,6 +306,7 @@
 	  break;
 	}
       }
+      break;
     
     case st_match_init:		/* Initial state for %[ match */
       if ( ch == '^' && !(flags & FL_INV) ) {