Warning!  The powerpc patch (rs6000/linux.h) is hack-ish and would
definitely need to be improved to be acceptable upstream.  Also,
this patch isn't complete as it only supports i386, arm, mips, and
powerpc (rs6000).
diff -urN gcc-20011006/config.sub gcc-20011006-new/config.sub
--- gcc-20011006/config.sub	2004-01-13 06:15:28.000000000 -0600
+++ gcc-20011006-new/config.sub	2004-01-10 11:09:35.000000000 -0600
@@ -68,7 +68,7 @@
 # Here we must recognize all the valid KERNEL-OS combinations.
 maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
 case $maybe_os in
-  linux-gnu*)
+  linux-gnu* | linux-uclibc*)
     os=-$maybe_os
     basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
     ;;
@@ -936,7 +936,8 @@
 	      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
 	      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
 	      | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
-	      | -mingw32* | -linux-gnu* | -uxpv* | -beos* | -mpeix* | -udk* \
+	      | -mingw32* | -linux-gnu* | -linux-uclibc* \
+	      | -uxpv* | -beos* | -mpeix* | -udk* \
 	      | -interix* | -uwin* )
 	# Remember, each alternative MUST END IN *, to match a version number.
 		;;
diff -urN gcc-20011006/gcc/config/arm/linux-elf.h gcc-20011006-new/gcc/config/arm/linux-elf.h
--- gcc-20011006/gcc/config/arm/linux-elf.h	2004-01-13 06:15:28.000000000 -0600
+++ gcc-20011006-new/gcc/config/arm/linux-elf.h	2004-01-10 11:12:11.000000000 -0600
@@ -90,6 +90,18 @@
 #define ENDFILE_SPEC \
   "%{!shared:crtend.o%s} %{shared:crtendS.o%s} crtn.o%s"
 
+#ifdef USE_UCLIBC
+#define LINK_SPEC "%{h*} %{version:-v} \
+   %{b} %{Wl,*:%*} \
+   %{static:-Bstatic} \
+   %{shared:-shared} \
+   %{symbolic:-Bsymbolic} \
+   %{rdynamic:-export-dynamic} \
+   %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0} \
+   -X \
+   %{mbig-endian:-EB}" \
+   SUBTARGET_EXTRA_LINK_SPEC
+#else
 #define LINK_SPEC "%{h*} %{version:-v} \
    %{b} %{Wl,*:%*} \
    %{static:-Bstatic} \
@@ -100,6 +112,7 @@
    -X \
    %{mbig-endian:-EB}" \
    SUBTARGET_EXTRA_LINK_SPEC
+#endif
 
 #undef  CPP_PREDEFINES
 #define CPP_PREDEFINES \
diff -urN gcc-20011006/gcc/config/i386/linux.h gcc-20011006-new/gcc/config/i386/linux.h
--- gcc-20011006/gcc/config/i386/linux.h	2001-04-03 17:38:59.000000000 -0500
+++ gcc-20011006-new/gcc/config/i386/linux.h	2004-01-10 11:15:38.000000000 -0600
@@ -199,6 +199,15 @@
 	%{static:-static}}}"
 #endif
 #else
+#if defined USE_UCLIBC
+#define LINK_SPEC "-m elf_i386 %{shared:-shared} \
+  %{!shared: \
+    %{!ibcs: \
+      %{!static: \
+	%{rdynamic:-export-dynamic} \
+	%{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
+	%{static:-static}}}"
+#else
 #define LINK_SPEC "-m elf_i386 %{shared:-shared} \
   %{!shared: \
     %{!ibcs: \
@@ -207,6 +216,7 @@
 	%{!dynamic-linker:-dynamic-linker /lib/ld-linux.so.2}} \
 	%{static:-static}}}"
 #endif
+#endif
 
 /* Get perform_* macros to build libgcc.a.  */
 #include "i386/perform.h"
diff -urN gcc-20011006/gcc/config/mips/linux.h gcc-20011006-new/gcc/config/mips/linux.h
--- gcc-20011006/gcc/config/mips/linux.h	2004-01-13 06:15:28.000000000 -0600
+++ gcc-20011006-new/gcc/config/mips/linux.h	2004-01-10 11:16:39.000000000 -0600
@@ -154,6 +154,17 @@
 
 /* Borrowed from sparc/linux.h */
 #undef LINK_SPEC
+#ifdef USE_UCLIBC
+#define LINK_SPEC \
+ "%(endian_spec) \
+  %{shared:-shared} \
+  %{!shared: \
+    %{!ibcs: \
+      %{!static: \
+        %{rdynamic:-export-dynamic} \
+        %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
+        %{static:-static}}}"
+#else
 #define LINK_SPEC \
  "%(endian_spec) \
   %{shared:-shared} \
@@ -163,6 +174,7 @@
         %{rdynamic:-export-dynamic} \
         %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
         %{static:-static}}}"
+#endif
 
 
 #undef SUBTARGET_ASM_SPEC
diff -urN old/gcc-20011006/gcc/config/mips/t-linux-uclibc gcc-20011006/gcc/config/mips/t-linux-uclibc
--- old/gcc-20011006/gcc/config/mips/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600
+++ gcc-20011006/gcc/config/mips/t-linux-uclibc	2004-01-14 02:51:10.000000000 -0600
@@ -0,0 +1 @@
+T_CFLAGS = -DUSE_UCLIBC
diff -urN gcc-20011006/gcc/config/rs6000/linux.h gcc-20011006-new/gcc/config/rs6000/linux.h
--- gcc-20011006/gcc/config/rs6000/linux.h	2001-04-03 17:38:59.000000000 -0500
+++ gcc-20011006-new/gcc/config/rs6000/linux.h	2004-01-10 11:15:38.000000000 -0600
@@ -36,12 +36,21 @@
 #define CPP_OS_DEFAULT_SPEC "%(cpp_os_linux)"
 
 #undef LINK_SPEC
+#ifdef USE_UCLIBC
+#define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \
+  %{!shared: \
+    %{!static: \
+      %{rdynamic:-export-dynamic} \
+      %{!dynamic-linker:-dynamic-linker /lib/ld-uClibc.so.0}} \
+    %{static:-static}}"
+#else
 #define LINK_SPEC "-m elf32ppclinux %{G*} %{shared:-shared} \
   %{!shared: \
     %{!static: \
       %{rdynamic:-export-dynamic} \
       %{!dynamic-linker:-dynamic-linker /lib/ld.so.1}} \
     %{static:-static}}"
+#endif
 
 #undef	LIB_DEFAULT_SPEC
 #define LIB_DEFAULT_SPEC "%(lib_linux)"
diff -urN gcc-20011006/gcc/config/t-linux-uclibc gcc-20011006-new/gcc/config/t-linux-uclibc
--- gcc-20011006/gcc/config/t-linux-uclibc	1969-12-31 18:00:00.000000000 -0600
+++ gcc-20011006-new/gcc/config/t-linux-uclibc	2004-01-10 11:18:46.000000000 -0600
@@ -0,0 +1,18 @@
+T_CFLAGS = -DUSE_UCLIBC
+
+# Don't run fixproto
+STMP_FIXPROTO =
+
+# Don't install "assert.h" in gcc. We use the one in glibc.
+INSTALL_ASSERT_H =
+
+# Compile crtbeginS.o and crtendS.o with pic.
+CRTSTUFF_T_CFLAGS_S = -fPIC
+# Compile libgcc2.a with pic.
+TARGET_LIBGCC2_CFLAGS = -fPIC
+
+# Do not build libgcc1. Let gcc generate those functions. The GNU/Linux
+# C library can handle them.
+LIBGCC1 = 
+CROSS_LIBGCC1 =
+LIBGCC1_TEST =
diff -urN gcc-20011006/gcc/configure gcc-20011006-new/gcc/configure
--- gcc-20011006/gcc/configure	2004-01-13 06:15:28.000000000 -0600
+++ gcc-20011006-new/gcc/configure	2004-01-10 11:28:54.000000000 -0600
@@ -3219,6 +3219,24 @@
 			;;
 		esac
 		;;
+	arm*-*-linux-uclibc*)		# ARM GNU/Linux with ELF - uClibc
+		xm_file=arm/xm-linux.h
+		xmake_file=x-linux
+		tm_file="arm/linux-elf.h"
+		case $machine in
+		armv2*-*-*)
+			tm_file="arm/linux-elf26.h $tm_file"
+			;;
+		esac
+		tmake_file="t-linux-uclibc arm/t-linux"
+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+		gnu_ld=yes
+		case x${enable_threads} in
+		x | xyes | xpthreads | xposix)
+			thread_file='posix'
+			;;
+		esac
+		;;
 	arm*-*-aout)
 		tm_file=arm/aout.h
 		tmake_file=arm/t-bare
@@ -3631,6 +3649,18 @@
  			thread_file='single'
  		fi
 		;;
+	i[34567]86-*-linux*uclibc*)	# Intel 80386's running GNU/Linux
+					# with ELF format using uClibc
+		xmake_file=x-linux
+		tm_file=i386/linux.h
+		tmake_file="t-linux-uclibc i386/t-crtstuff"
+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+		gnu_ld=yes
+		float_format=i386
+ 		if test x$enable_threads = xyes; then
+ 			thread_file='posix'
+ 		fi
+		;;
 	i[34567]86-*-linux-gnu*)	# Intel 80386's running GNU/Linux
 					# aka GNU/Linux C library 6
 		xmake_file=x-linux
@@ -4696,7 +4726,19 @@
 		# On NetBSD, the headers are already okay, except for math.h.
 		tmake_file=t-netbsd
 		;;
-       mips*-*-linux*)                         # Linux MIPS, either endian.
+	mips*-*-linux-uclibc*)          # Linux (uclibc) MIPS, either endian.
+		tmake_file=mips/t-linux-uclibc
+		xmake_file=x-linux
+		xm_file="xm-siglist.h ${xm_file}"
+               case $machine in
+                       mipsel-*)  tm_file="mips/elfl.h mips/linux.h" ;;
+                       *)         tm_file="mips/elf.h mips/linux.h" ;;
+               esac
+		extra_parts="crtbegin.o crtend.o"
+		gnu_ld=yes
+		gas=yes
+		;;
+	mips*-*-linux*)                         # Linux MIPS, either endian.
 		xmake_file=x-linux
 		xm_file="xm-siglist.h ${xm_file}"
                case $machine in
@@ -5159,6 +5201,24 @@
 			thread_file='posix'
 		fi
 		;;
+	powerpc-*-linux-uclibc*)
+		tm_file=rs6000/linux.h
+		xm_file="xm-siglist.h rs6000/xm-sysv4.h"
+		xm_defines="USG ${xm_defines}"
+		out_file=rs6000/rs6000.c
+		if test x$gas = xyes
+		then
+			tmake_file="rs6000/t-ppcos t-linux-uclibc rs6000/t-ppccomm"
+		else
+			tmake_file="rs6000/t-ppc t-linux-uclibc rs6000/t-ppccomm"
+		fi
+		xmake_file=x-linux
+		extra_parts="crtbegin.o crtbeginS.o crtend.o crtendS.o"
+		extra_headers=ppc-asm.h
+		if test x$enable_threads = xyes; then
+			thread_file='posix'
+		fi
+		;;
         powerpc-wrs-vxworks*)
                 cpu_type=rs6000
 		xm_file="xm-siglist.h rs6000/xm-sysv4.h"
diff -urN gcc-20011006/ltconfig gcc-20011006-new/ltconfig
--- gcc-20011006/ltconfig	1999-06-21 21:35:12.000000000 -0500
+++ gcc-20011006-new/ltconfig	2004-01-10 11:34:23.000000000 -0600
@@ -436,6 +436,7 @@
 # Transform linux* to *-*-linux-gnu*, to support old configure scripts.
 case "$host_os" in
 linux-gnu*) ;;
+linux-uclibc*) ;;
 linux*) host=`echo $host | sed 's/^\(.*-.*-linux\)\(.*\)$/\1-gnu\2/'`
 esac
 
@@ -1773,6 +1774,22 @@
   fi
   ;;
 
+linux-uclibc*)
+  version_type=linux
+  need_lib_prefix=no
+  need_version=no
+  library_names_spec='${libname}${release}.so$versuffix ${libname}${release}.so$major $libname.so'
+  soname_spec='${libname}${release}.so$major'
+  finish_cmds='PATH="$PATH:/sbin" ldconfig -n $libdir'
+  shlibpath_var=LD_LIBRARY_PATH
+  shlibpath_overrides_runpath=no
+  deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'
+  file_magic_cmd=/usr/bin/file
+  file_magic_test_file=`echo /lib/libuClibc-*.so`
+  # Assume using the uClibc dynamic linker.
+  dynamic_linker="uClibc ld.so"
+  ;;
+
 netbsd*)
   version_type=sunos
   if echo __ELF__ | $CC -E - | grep __ELF__ >/dev/null; then
