about summary refs log tree commit diff
path: root/pkgs/development/libraries/glibc
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-02-17 22:02:37 +0000
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-02-17 22:02:37 +0000
commit0811db080e8ee73d1df01bef19fb6fb1613afe8b (patch)
tree544ddde63fff139ecd8350d7be097ee1328ceeb2 /pkgs/development/libraries/glibc
parent6c2de318ad40dc832c37b4b866a22b046151bc34 (diff)
downloadnixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar.gz
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar.bz2
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar.lz
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar.xz
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.tar.zst
nixlib-0811db080e8ee73d1df01bef19fb6fb1613afe8b.zip
* Move all glibc versions to development/libraries/glibc.
svn path=/nixpkgs/branches/stdenv-updates/; revision=32373
Diffstat (limited to 'pkgs/development/libraries/glibc')
-rw-r--r--pkgs/development/libraries/glibc/2.13/builder.sh55
-rw-r--r--pkgs/development/libraries/glibc/2.13/common.nix213
-rw-r--r--pkgs/development/libraries/glibc/2.13/default.nix83
-rw-r--r--pkgs/development/libraries/glibc/2.13/glibc-elf-localscope.patch82
-rw-r--r--pkgs/development/libraries/glibc/2.13/info.nix26
-rw-r--r--pkgs/development/libraries/glibc/2.13/locales-builder.sh17
-rw-r--r--pkgs/development/libraries/glibc/2.13/locales.nix47
-rw-r--r--pkgs/development/libraries/glibc/2.13/nix-locale-archive.patch116
-rw-r--r--pkgs/development/libraries/glibc/2.13/nss-skip-unavail.patch21
-rw-r--r--pkgs/development/libraries/glibc/2.13/rpcgen-path.patch72
-rw-r--r--pkgs/development/libraries/glibc/2.14/builder.sh55
-rw-r--r--pkgs/development/libraries/glibc/2.14/common.nix213
-rw-r--r--pkgs/development/libraries/glibc/2.14/default.nix83
-rw-r--r--pkgs/development/libraries/glibc/2.14/glibc-elf-localscope.patch82
-rw-r--r--pkgs/development/libraries/glibc/2.14/info.nix26
-rw-r--r--pkgs/development/libraries/glibc/2.14/locales-builder.sh17
-rw-r--r--pkgs/development/libraries/glibc/2.14/locales.nix47
-rw-r--r--pkgs/development/libraries/glibc/2.14/nix-locale-archive.patch116
-rw-r--r--pkgs/development/libraries/glibc/2.14/nss-skip-unavail.patch21
-rw-r--r--pkgs/development/libraries/glibc/2.14/rpcgen-path.patch72
-rw-r--r--pkgs/development/libraries/glibc/2.5/binutils-ld.patch27
-rw-r--r--pkgs/development/libraries/glibc/2.5/builder.sh57
-rw-r--r--pkgs/development/libraries/glibc/2.5/default.nix40
-rw-r--r--pkgs/development/libraries/glibc/2.5/glibc-getcwd-param-MAX.patch14
-rw-r--r--pkgs/development/libraries/glibc/2.5/glibc-inline.patch1822
-rw-r--r--pkgs/development/libraries/glibc/2.5/glibc-pwd.patch74
-rw-r--r--pkgs/development/libraries/glibc/2.5/make-3-82-fix.patch14
-rw-r--r--pkgs/development/libraries/glibc/2.5/x86-fnstsw.patch32
-rw-r--r--pkgs/development/libraries/glibc/2.7/builder.sh60
-rw-r--r--pkgs/development/libraries/glibc/2.7/default.nix57
-rw-r--r--pkgs/development/libraries/glibc/2.7/nss-skip-unavail.patch25
-rw-r--r--pkgs/development/libraries/glibc/2.9/binutils-2.20.patch42
-rw-r--r--pkgs/development/libraries/glibc/2.9/binutils-ld.patch33
-rw-r--r--pkgs/development/libraries/glibc/2.9/builder.sh85
-rw-r--r--pkgs/development/libraries/glibc/2.9/default.nix103
-rw-r--r--pkgs/development/libraries/glibc/2.9/headers.nix63
-rw-r--r--pkgs/development/libraries/glibc/2.9/headersbuilder.sh38
-rw-r--r--pkgs/development/libraries/glibc/2.9/info.nix47
-rw-r--r--pkgs/development/libraries/glibc/2.9/locale-override.patch72
-rw-r--r--pkgs/development/libraries/glibc/2.9/locales.nix67
-rw-r--r--pkgs/development/libraries/glibc/2.9/localesbuilder.sh50
-rw-r--r--pkgs/development/libraries/glibc/2.9/nss-skip-unavail.patch25
-rw-r--r--pkgs/development/libraries/glibc/2.9/rpcgen-path.patch72
43 files changed, 4383 insertions, 0 deletions
diff --git a/pkgs/development/libraries/glibc/2.13/builder.sh b/pkgs/development/libraries/glibc/2.13/builder.sh
new file mode 100644
index 000000000000..9a1c1490019a
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/builder.sh
@@ -0,0 +1,55 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make -j${NIX_BUILD_CORES:-1} -l${NIX_BUILD_CORES:-1} localedata/install-locales
+    fi
+    
+    test -f $out/etc/ld.so.cache && rm $out/etc/ld.so.cache
+
+    # FIXME: Use `test -n $linuxHeaders' when `kernelHeaders' has been
+    # renamed.
+    if test -z "$hurdHeaders"; then
+        # Include the Linux kernel headers in Glibc, except the `scsi'
+        # subdirectory, which Glibc provides itself.
+	(cd $out/include && \
+	 ln -sv $(ls -d $kernelHeaders/include/* | grep -v 'scsi$') .)
+    fi
+
+    if test -f "$out/lib/libhurduser.so"; then
+	# libc.so, libhurduser.so, and libmachuser.so depend on each
+	# other, so add them to libc.so (a RUNPATH on libc.so.0.3
+	# would be ignored by the cross-linker.)
+	echo "adding \`libhurduser.so' and \`libmachuser.so' to the \`libc.so' linker script..."
+	sed -i "$out/lib/libc.so" \
+	    -e"s|\(libc\.so\.[^ ]\+\>\)|\1 $out/lib/libhurduser.so $out/lib/libmachuser.so|g"
+    fi
+	
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+
+    # This file, that should not remain in the glibc derivation,
+    # may have not been created during the preInstall
+    rm -f $out/lib/libgcc_s.so.1
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.13/common.nix b/pkgs/development/libraries/glibc/2.13/common.nix
new file mode 100644
index 000000000000..d63e7e99e480
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/common.nix
@@ -0,0 +1,213 @@
+/* Build configuration used to build glibc, Info files, and locale
+   information.  */
+
+cross :
+
+{ name, fetchurl, stdenv, installLocales ? false
+, gccCross ? null, kernelHeaders ? null
+, machHeaders ? null, hurdHeaders ? null, mig ? null, fetchgit ? null
+, profilingLibraries ? false, meta
+, preConfigure ? "", ... }@args :
+
+let
+  # For GNU/Hurd, see below.
+  version = if hurdHeaders != null then "20100512" else "2.13";
+
+  needsPortsNative = stdenv.isMips || stdenv.isArm;
+  needsPortsCross = cross.arch == "mips" || cross.arch == "arm";
+  needsPorts = if (stdenv ? cross) && stdenv.cross != null then true
+    else if cross == null then needsPortsNative
+    else needsPortsCross;
+
+  srcPorts = fetchurl {
+    url = "mirror://gnu/glibc/glibc-ports-2.13.tar.bz2";
+    sha256 = "0npffql62m1xba15l1wkaqf2p0l2bvb33720gx28764jmq0la75i";
+  };
+
+in
+
+assert (cross != null) -> (gccCross != null);
+
+assert (mig != null) -> (machHeaders != null);
+assert (machHeaders != null) -> (hurdHeaders != null);
+assert (hurdHeaders != null) -> (fetchgit != null);
+
+stdenv.mkDerivation ({
+  inherit kernelHeaders installLocales;
+
+  # The host/target system.
+  crossConfig = if (cross != null) then cross.config else null;
+
+  inherit (stdenv) is64bit;
+
+  enableParallelBuilding = true;
+
+  patches =
+    stdenv.lib.optional (fetchgit == null)
+    /* Fix for NIXPKGS-79: when doing host name lookups, when
+       nsswitch.conf contains a line like
+
+         hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       don't return an error when mdns4_minimal can't be found.  This
+       is a bug in Glibc: when a service can't be found, NSS should
+       continue to the next service unless "UNAVAIL=return" is set.
+       ("NOTFOUND=return" refers to the service returning a NOTFOUND
+       error, not the service itself not being found.)  The reason is
+       that the "status" variable (while initialised to UNAVAIL) is
+       outside of the loop that iterates over the services, the
+       "files" service sets status to NOTFOUND.  So when the call to
+       find "mdns4_minimal" fails, "status" will still be NOTFOUND,
+       and it will return instead of continuing to "dns".  Thus, the
+       line
+
+         hosts: mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       does work because "status" will contain UNAVAIL after the
+       failure to find mdns4_minimal. */
+    ./nss-skip-unavail.patch
+  ++ [
+    /* Have rpcgen(1) look for cpp(1) in $PATH.  */
+    ./rpcgen-path.patch
+
+    /* Allow nixos and nix handle the locale-archive. */
+    ./nix-locale-archive.patch
+
+    /* Without this patch many KDE binaries crash. */
+    ./glibc-elf-localscope.patch
+  ];
+
+  postPatch = ''
+    # Needed for glibc to build with the gnumake 3.82
+    # http://comments.gmane.org/gmane.linux.lfs.support/31227
+    sed -i 's/ot \$/ot:\n\ttouch $@\n$/' manual/Makefile
+
+    # nscd needs libgcc, and we don't want it dynamically linked
+    # because we don't want it to depend on bootstrap-tools libs.
+    echo "LDFLAGS-nscd += -static-libgcc" >> nscd/Makefile
+  '';
+
+  configureFlags = [
+    "-C"
+    "--enable-add-ons"
+    "--sysconfdir=/etc"
+    "--localedir=/var/run/current-system/sw/lib/locale"
+    (if kernelHeaders != null
+     then "--with-headers=${kernelHeaders}/include"
+     else "--without-headers")
+    (if profilingLibraries
+     then "--enable-profile"
+     else "--disable-profile")
+  ] ++ stdenv.lib.optionals (cross != null) [
+    (if cross.withTLS then "--with-tls" else "--without-tls")
+    (if cross.float == "soft" then "--without-fp" else "--with-fp")
+    "--enable-kernel=2.6.0"
+    "--with-__thread"
+  ] ++ stdenv.lib.optionals (stdenv.system == "armv5tel-linux") [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+
+    # To avoid linking with -lgcc_s (dynamic link)
+    # so the glibc does not depend on its compiler store path
+    "libc_cv_as_needed=no"
+  ];
+
+  installFlags = [ "sysconfdir=$(out)/etc" ];
+  
+  buildInputs = stdenv.lib.optionals (cross != null) [ gccCross ]
+    ++ stdenv.lib.optional (mig != null) mig;
+
+  # Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+  # prevent a retained dependency on the bootstrap tools in the stdenv-linux
+  # bootstrap.
+  BASH_SHELL = "/bin/sh";
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = stdenv.lib.optionalString (stdenv.system == "i686-linux") "-U__i686";
+}
+
+# Remove the `gccCross' attribute so that the *native* glibc store path
+# doesn't depend on whether `gccCross' is null or not.
+// (removeAttrs args [ "gccCross" ]) //
+
+{
+  name = name + "-${version}" +
+    stdenv.lib.optionalString (cross != null) "-${cross.config}";
+
+  src =
+    if hurdHeaders != null
+    then fetchgit {
+      # Shamefully the "official" glibc won't build on GNU, so use the one
+      # maintained by the Hurd folks, `tschwinge/Roger_Whittaker' branch.
+      # See <http://www.gnu.org/software/hurd/source_repositories/glibc.html>.
+      url = "git://git.sv.gnu.org/hurd/glibc.git";
+      sha256 = "f3590a54a9d897d121f91113949edbaaf3e30cdeacbb8d0a44de7b6564f6643e";
+      rev = "df4c3faf0ccc848b5a8086c222bdb42679a9798f";
+    }
+    else fetchurl {
+      url = "mirror://gnu/glibc/glibc-${version}.tar.bz2";
+      sha256 = "1cnv319ysc8nkwpqw6f6ymb6b8hbl0nyvyx48sddkrj50lmcjwq1";
+    };
+
+  # `fetchurl' is a function and thus should not be passed to the
+  # `derivation' primitive.
+  fetchurl = null;
+
+  # Remove absolute paths from `configure' & co.; build out-of-tree.
+  preConfigure = ''
+    export PWD_P=$(type -tP pwd)
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    ${if needsPorts then "tar xvf ${srcPorts}" else ""}
+
+    mkdir ../build
+    cd ../build
+
+    configureScript="`pwd`/../$sourceRoot/configure"
+
+    ${preConfigure}
+  '';
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "The GNU C Library";
+
+    longDescription =
+      '' Any Unix-like operating system needs a C library: the library which
+         defines the "system calls" and other basic facilities such as
+         open, malloc, printf, exit...
+
+         The GNU C library is used as the C library in the GNU system and
+         most systems with the Linux kernel.
+      '';
+
+    license = "LGPLv2+";
+
+    maintainers = [ stdenv.lib.maintainers.ludo ];
+    platforms = stdenv.lib.platforms.linux;
+  } // meta;
+}
+
+//
+
+(if hurdHeaders != null
+ then {
+   # Work around the fact that the configure snippet that looks for
+   # <hurd/version.h> does not honor `--with-headers=$sysheaders' and that
+   # glibc expects both Mach and Hurd headers to be in the same place.
+   CPATH = "${hurdHeaders}/include:${machHeaders}/include";
+
+   # `fetchgit' is a function and thus should not be passed to the
+   # `derivation' primitive.
+   fetchgit = null;
+ }
+ else { }))
diff --git a/pkgs/development/libraries/glibc/2.13/default.nix b/pkgs/development/libraries/glibc/2.13/default.nix
new file mode 100644
index 000000000000..95778b50b70b
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/default.nix
@@ -0,0 +1,83 @@
+{ stdenv, fetchurl, kernelHeaders
+, machHeaders ? null, hurdHeaders ? null, mig ? null, fetchgit ? null
+, installLocales ? true
+, profilingLibraries ? false
+, gccCross ? null
+}:
+
+assert stdenv.gcc.gcc != null;
+
+let
+  build = import ./common.nix;
+  cross = if gccCross != null then gccCross.target else null;
+in
+  build cross ({
+    name = "glibc";
+
+    inherit fetchurl stdenv kernelHeaders installLocales profilingLibraries
+      gccCross;
+
+    builder = ./builder.sh;
+
+    # When building glibc from bootstrap-tools, we need libgcc_s at RPATH for
+    # any program we run, because the gcc will have been placed at a new
+    # store path than that determined when built (as a source for the
+    # bootstrap-tools tarball)
+    # Building from a proper gcc staying in the path where it was installed,
+    # libgcc_s will not be at {gcc}/lib, and gcc's libgcc will be found without
+    # any special hack.
+    preInstall = ''
+      if [ -f ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 ]; then
+          mkdir -p $out/lib
+          ln -s ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
+      fi
+    '';
+
+    meta.description = "The GNU C Library";
+  }
+
+  //
+
+  (if hurdHeaders != null
+   then rec {
+     inherit machHeaders hurdHeaders mig fetchgit;
+
+     propagatedBuildInputs = [ machHeaders hurdHeaders ];
+
+     passthru = {
+       # When building GCC itself `propagatedBuildInputs' above is not
+       # honored, so we pass it here so that the GCC builder can do the right
+       # thing.
+       inherit propagatedBuildInputs;
+     };
+   }
+   else { })
+
+  //
+
+  (if cross != null
+   then {
+      preConfigure = ''
+        sed -i s/-lgcc_eh//g "../$sourceRoot/Makeconfig"
+
+        cat > config.cache << "EOF"
+        libc_cv_forced_unwind=yes
+        libc_cv_c_cleanup=yes
+        libc_cv_gnu89_inline=yes
+        # Only due to a problem in gcc configure scripts:
+        libc_cv_sparc64_tls=${if cross.withTLS then "yes" else "no"}
+        EOF
+        export BUILD_CC=gcc
+        export CC="$crossConfig-gcc"
+        export AR="$crossConfig-ar"
+        export RANLIB="$crossConfig-ranlib"
+
+        dontStrip=1
+      '';
+
+      # To avoid a dependency on the build system 'bash'.
+      preFixup = ''
+        rm $out/bin/{ldd,tzselect,catchsegv,xtrace}
+      '';
+    }
+   else {}))
diff --git a/pkgs/development/libraries/glibc/2.13/glibc-elf-localscope.patch b/pkgs/development/libraries/glibc/2.13/glibc-elf-localscope.patch
new file mode 100644
index 000000000000..98f7f81087bb
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/glibc-elf-localscope.patch
@@ -0,0 +1,82 @@
+diff -ru a/elf/dl-close.c b/elf/dl-close.c
+--- a/elf/dl-close.c	2011-02-04 00:35:03.000000000 +0100
++++ b/elf/dl-close.c	2011-02-22 02:16:12.367883000 +0100
+@@ -180,24 +186,28 @@
+       /* Signal the object is still needed.  */
+       l->l_idx = IDX_STILL_USED;
+ 
++#define mark_used(dmap) \
++  do {								\
++    if ((dmap)->l_idx != IDX_STILL_USED)			\
++      {								\
++	assert ((dmap)->l_idx >= 0 && (dmap)->l_idx < nloaded);	\
++								\
++	if (!used[(dmap)->l_idx])				\
++	  {							\
++	    used[(dmap)->l_idx] = 1;				\
++	    if ((dmap)->l_idx - 1 < done_index)			\
++	      done_index = (dmap)->l_idx - 1;			\
++	  }							\
++      }								\
++  } while (0)
++
+       /* Mark all dependencies as used.  */
+       if (l->l_initfini != NULL)
+ 	{
+ 	  struct link_map **lp = &l->l_initfini[1];
+ 	  while (*lp != NULL)
+ 	    {
+-	      if ((*lp)->l_idx != IDX_STILL_USED)
+-		{
+-		  assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded);
+-
+-		  if (!used[(*lp)->l_idx])
+-		    {
+-		      used[(*lp)->l_idx] = 1;
+-		      if ((*lp)->l_idx - 1 < done_index)
+-			done_index = (*lp)->l_idx - 1;
+-		    }
+-		}
+-
++	      mark_used(*lp);
+ 	      ++lp;
+ 	    }
+ 	}
+@@ -206,19 +216,25 @@
+ 	for (unsigned int j = 0; j < l->l_reldeps->act; ++j)
+ 	  {
+ 	    struct link_map *jmap = l->l_reldeps->list[j];
+-
+-	    if (jmap->l_idx != IDX_STILL_USED)
+-	      {
+-		assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded);
+-
+-		if (!used[jmap->l_idx])
+-		  {
+-		    used[jmap->l_idx] = 1;
+-		    if (jmap->l_idx - 1 < done_index)
+-		      done_index = jmap->l_idx - 1;
+-		  }
+-	      }
++	    mark_used(jmap);
+ 	  }
++      /* And the same for owners of our scopes; normally, our last
++	 scope provider would render us unused, but this can be
++	 prevented by the NODELETE flag. */
++      if (__builtin_expect(l->l_type == lt_loaded
++	                   && (l->l_flags_1 & DF_1_NODELETE), 0))
++	for (size_t cnt = 0; l->l_scope[cnt] != NULL; ++cnt)
++	  /* This relies on l_scope[] entries being always set either
++	     to its own l_symbolic_searchlist address, or some map's
++	     l_searchlist address.  */
++	  if (l->l_scope[cnt] != &l->l_symbolic_searchlist)
++	    {
++	      struct link_map *ls = (struct link_map *)
++		((char *) l->l_scope[cnt]
++		 - offsetof (struct link_map, l_searchlist));
++	      assert (ls->l_ns == nsid);
++	      mark_used(ls);
++	    }
+     }
+ 
+   /* Sort the entries.  */
diff --git a/pkgs/development/libraries/glibc/2.13/info.nix b/pkgs/development/libraries/glibc/2.13/info.nix
new file mode 100644
index 000000000000..75bd996d9bc5
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/info.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, texinfo, perl }:
+
+let build = import ./common.nix;
+in
+  /* null cross builder */
+  build null {
+    name = "glibc-info";
+
+    inherit fetchurl stdenv;
+
+    configureFlags = [ "--enable-add-ons" ];
+
+    buildInputs = [ texinfo perl ];
+
+    buildPhase = "make info";
+
+    # I don't know why the info is not generated in 'build'
+    # Somehow building the info still does not work, because the final
+    # libc.info hasn't a Top node.
+    installPhase = ''
+      mkdir -p "$out/share/info"
+      cp -v "../$sourceRoot/manual/"*.info* "$out/share/info"
+    '';
+
+    meta.description = "GNU Info manual of the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc/2.13/locales-builder.sh b/pkgs/development/libraries/glibc/2.13/locales-builder.sh
new file mode 100644
index 000000000000..d732e208fa22
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/locales-builder.sh
@@ -0,0 +1,17 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.13/locales.nix b/pkgs/development/libraries/glibc/2.13/locales.nix
new file mode 100644
index 000000000000..b7eae50ca385
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/locales.nix
@@ -0,0 +1,47 @@
+/* This function builds just the `lib/locale/locale-archive' file from
+   Glibc and nothing else.  If `allLocales' is true, all supported
+   locales are included; otherwise, just the locales listed in
+   `locales'.  See localedata/SUPPORTED in the Glibc source tree for
+   the list of all supported locales:
+   http://sourceware.org/cgi-bin/cvsweb.cgi/libc/localedata/SUPPORTED?cvsroot=glibc
+*/
+
+{ stdenv, fetchurl, allLocales ? true, locales ? ["en_US.UTF-8/UTF-8"] }:
+
+let build = import ./common.nix;
+in
+  build null {
+    name = "glibc-locales";
+
+    inherit fetchurl stdenv;
+    installLocales = true;
+
+    builder = ./locales-builder.sh;
+
+    # Awful hack: `localedef' doesn't allow the path to `locale-archive'
+    # to be overriden, but you *can* specify a prefix, i.e. it will use
+    # <prefix>/<path-to-glibc>/lib/locale/locale-archive.  So we use
+    # $TMPDIR as a prefix, meaning that the locale-archive is placed in
+    # $TMPDIR/nix/store/...-glibc-.../lib/locale/locale-archive.
+    buildPhase =
+      ''
+        mkdir -p $TMPDIR/"$(dirname $(readlink -f $(type -p localedef)))/../lib/locale"
+
+        # Hack to allow building of the locales (needed since glibc-2.12)
+        sed -i -e "s,^LOCALEDEF=.*,LOCALEDEF=localedef --prefix=$TMPDIR," -e \
+            /library-path/d ../glibc-2*/localedata/Makefile
+        ${if allLocales then "" else
+            "echo SUPPORTED-LOCALES=\"${toString locales}\" > ../glibc-2*/localedata/SUPPORTED"}
+
+        make localedata/install-locales \
+            localedir=$out/lib/locale \
+      '';
+
+    installPhase =
+      ''
+        mkdir -p "$out/lib/locale"
+        cp -v "$TMPDIR/nix/store/"*"/lib/locale/locale-archive" "$out/lib/locale"
+      '';
+
+    meta.description = "Locale information for the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc/2.13/nix-locale-archive.patch b/pkgs/development/libraries/glibc/2.13/nix-locale-archive.patch
new file mode 100644
index 000000000000..aca904f7ff44
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/nix-locale-archive.patch
@@ -0,0 +1,116 @@
+diff --git a/locale/loadarchive.c b/locale/loadarchive.c
+index d545f17..0d8638a 100644
+--- a/locale/loadarchive.c
++++ b/locale/loadarchive.c
+@@ -124,6 +124,25 @@ calculate_head_size (const struct locarhead *h)
+ }
+ 
+ 
++static int
++open_locale_archive ()
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  const char *usualpath = "/usr/lib/locale/locale-archive";
++  if (path)
++    fd = open_not_cancel_2 (path, O_RDONLY|O_LARGEFILE);
++  if (path2 && fd < 0)
++    fd = open_not_cancel_2 (path2, O_RDONLY|O_LARGEFILE);
++  if (fd < 0)
++    fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++  if (fd < 0)
++    fd = open_not_cancel_2 (usualpath, O_RDONLY|O_LARGEFILE);
++  return fd;
++}
++
++
+ /* Find the locale *NAMEP in the locale archive, and return the
+    internalized data structure for its CATEGORY data.  If this locale has
+    already been loaded from the archive, just returns the existing data
+@@ -203,7 +222,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
+       archmapped = &headmap;
+ 
+       /* The archive has never been opened.  */
+-      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++      fd = open_locale_archive ();
+       if (fd < 0)
+ 	/* Cannot open the archive, for whatever reason.  */
+ 	return NULL;
+@@ -394,7 +413,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
+ 	  if (fd == -1)
+ 	    {
+ 	      struct stat64 st;
+-	      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++	      fd = open_locale_archive ();
+ 	      if (fd == -1)
+ 		/* Cannot open the archive, for whatever reason.  */
+ 		return NULL;
+diff --git a/locale/programs/locale.c b/locale/programs/locale.c
+index 77262b7..fddc00d 100644
+--- a/locale/programs/locale.c
++++ b/locale/programs/locale.c
+@@ -628,6 +628,20 @@ nameentcmp (const void *a, const void *b)
+ 		  ((const struct nameent *) b)->name);
+ }
+ 
++static int
++open_nix_locale_archive (const char * fname, int access)
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  if (path)
++    fd = open64 (path, access);
++  if (path2 && fd < 0)
++    fd = open64 (path2, access);
++  if (fd < 0)
++    fd = open64 (fname, access);
++  return fd;
++}
+ 
+ static int
+ write_archive_locales (void **all_datap, char *linebuf)
+@@ -641,7 +658,7 @@ write_archive_locales (void **all_datap, char *linebuf)
+   int fd, ret = 0;
+   uint32_t cnt;
+ 
+-  fd = open64 (ARCHIVE_NAME, O_RDONLY);
++  fd = open_nix_locale_archive (ARCHIVE_NAME, O_RDONLY);
+   if (fd < 0)
+     return 0;
+ 
+diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
+index 85ba77d..3ad2af8 100644
+--- a/locale/programs/locarchive.c
++++ b/locale/programs/locarchive.c
+@@ -512,6 +512,20 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
+   *ah = new_ah;
+ }
+ 
++static int
++open_nix_locale_archive (const char * fname, int access)
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  if (path)
++    fd = open64 (path, access);
++  if (path2 && fd < 0)
++    fd = open64 (path2, access);
++  if (fd < 0)
++    fd = open64 (fname, access);
++  return fd;
++}
+ 
+ void
+ open_archive (struct locarhandle *ah, bool readonly)
+@@ -531,7 +548,7 @@ open_archive (struct locarhandle *ah, bool readonly)
+   while (1)
+     {
+       /* Open the archive.  We must have exclusive write access.  */
+-      fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR);
++      fd = open_nix_locale_archive (archivefname, readonly ? O_RDONLY : O_RDWR);
+       if (fd == -1)
+ 	{
+ 	  /* Maybe the file does not yet exist.  */
diff --git a/pkgs/development/libraries/glibc/2.13/nss-skip-unavail.patch b/pkgs/development/libraries/glibc/2.13/nss-skip-unavail.patch
new file mode 100644
index 000000000000..e48dc2bc0a6e
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/nss-skip-unavail.patch
@@ -0,0 +1,21 @@
+diff -ru glibc-2.11.2-orig/sysdeps/posix/getaddrinfo.c glibc-2.11.2/sysdeps/posix/getaddrinfo.c
+--- glibc-2.11.2-orig/sysdeps/posix/getaddrinfo.c	2010-05-19 22:38:20.000000000 +0200
++++ glibc-2.11.2/sysdeps/posix/getaddrinfo.c	2010-08-05 18:39:54.259556327 +0200
+@@ -505,8 +505,6 @@
+ 	  int no_data = 0;
+ 	  int no_inet6_data = 0;
+ 	  service_user *nip = NULL;
+-	  enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
+-	  enum nss_status status = NSS_STATUS_UNAVAIL;
+ 	  int no_more;
+ 	  int old_res_options;
+ 
+@@ -702,6 +700,8 @@
+ 
+ 	  while (!no_more)
+ 	    {
++ 	      enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
++ 	      enum nss_status status = NSS_STATUS_UNAVAIL;
+ 	      no_data = 0;
+ 	      nss_gethostbyname4_r fct4
+ 		= __nss_lookup_function (nip, "gethostbyname4_r");
diff --git a/pkgs/development/libraries/glibc/2.13/rpcgen-path.patch b/pkgs/development/libraries/glibc/2.13/rpcgen-path.patch
new file mode 100644
index 000000000000..fbb03dd5fade
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.13/rpcgen-path.patch
@@ -0,0 +1,72 @@
+By default, rpcgen(1) looks for cpp(1) from a list of fixed absolute paths
+(`/lib/cpp', etc.), which may only be overrided with the `-Y' option.  This
+patch makes it run any `cpp' command found in $PATH.
+
+--- glibc-2.7/sunrpc/rpc_main.c	2006-11-10 21:54:46.000000000 +0100
++++ glibc-2.7/sunrpc/rpc_main.c	2009-04-22 14:32:10.000000000 +0200
+@@ -79,7 +79,7 @@ static const char *cmdname;
+ 
+ static const char *svcclosetime = "120";
+ static int cppDefined;	/* explicit path for C preprocessor */
+-static const char *CPP = SUNOS_CPP;
++static const char *CPP = "cpp";
+ static const char CPPFLAGS[] = "-C";
+ static char *pathbuf;
+ static int cpp_pid;
+@@ -108,7 +108,6 @@ static char *extendfile (const char *fil
+ static void open_output (const char *infile, const char *outfile);
+ static void add_warning (void);
+ static void clear_args (void);
+-static void find_cpp (void);
+ static void open_input (const char *infile, const char *define);
+ static int check_nettype (const char *name, const char *list_to_check[]);
+ static void c_output (const char *infile, const char *define,
+@@ -327,31 +326,6 @@ clear_args (void)
+   argcount = FIXEDARGS;
+ }
+ 
+-/* make sure that a CPP exists */
+-static void
+-find_cpp (void)
+-{
+-  struct stat buf;
+-
+-  if (stat (CPP, &buf) < 0)
+-    {				/* /lib/cpp or explicit cpp does not exist */
+-      if (cppDefined)
+-	{
+-	  fprintf (stderr, _ ("cannot find C preprocessor: %s \n"), CPP);
+-	  crash ();
+-	}
+-      else
+-	{			/* try the other one */
+-	  CPP = SVR4_CPP;
+-	  if (stat (CPP, &buf) < 0)
+-	    {			/* can't find any cpp */
+-	      fputs (_ ("cannot find any C preprocessor (cpp)\n"), stdout);
+-	      crash ();
+-	    }
+-	}
+-    }
+-}
+-
+ /*
+  * Open input file with given define for C-preprocessor
+  */
+@@ -370,7 +344,6 @@ open_input (const char *infile, const ch
+   switch (cpp_pid)
+     {
+     case 0:
+-      find_cpp ();
+       putarg (0, CPP);
+       putarg (1, CPPFLAGS);
+       addarg (define);
+@@ -380,7 +353,7 @@ open_input (const char *infile, const ch
+       close (1);
+       dup2 (pd[1], 1);
+       close (pd[0]);
+-      execv (arglist[0], (char **) arglist);
++      execvp (arglist[0], (char **) arglist);
+       perror ("execv");
+       exit (1);
+     case -1:
diff --git a/pkgs/development/libraries/glibc/2.14/builder.sh b/pkgs/development/libraries/glibc/2.14/builder.sh
new file mode 100644
index 000000000000..9a1c1490019a
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/builder.sh
@@ -0,0 +1,55 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make -j${NIX_BUILD_CORES:-1} -l${NIX_BUILD_CORES:-1} localedata/install-locales
+    fi
+    
+    test -f $out/etc/ld.so.cache && rm $out/etc/ld.so.cache
+
+    # FIXME: Use `test -n $linuxHeaders' when `kernelHeaders' has been
+    # renamed.
+    if test -z "$hurdHeaders"; then
+        # Include the Linux kernel headers in Glibc, except the `scsi'
+        # subdirectory, which Glibc provides itself.
+	(cd $out/include && \
+	 ln -sv $(ls -d $kernelHeaders/include/* | grep -v 'scsi$') .)
+    fi
+
+    if test -f "$out/lib/libhurduser.so"; then
+	# libc.so, libhurduser.so, and libmachuser.so depend on each
+	# other, so add them to libc.so (a RUNPATH on libc.so.0.3
+	# would be ignored by the cross-linker.)
+	echo "adding \`libhurduser.so' and \`libmachuser.so' to the \`libc.so' linker script..."
+	sed -i "$out/lib/libc.so" \
+	    -e"s|\(libc\.so\.[^ ]\+\>\)|\1 $out/lib/libhurduser.so $out/lib/libmachuser.so|g"
+    fi
+	
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+
+    # This file, that should not remain in the glibc derivation,
+    # may have not been created during the preInstall
+    rm -f $out/lib/libgcc_s.so.1
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.14/common.nix b/pkgs/development/libraries/glibc/2.14/common.nix
new file mode 100644
index 000000000000..e24089fd1920
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/common.nix
@@ -0,0 +1,213 @@
+/* Build configuration used to build glibc, Info files, and locale
+   information.  */
+
+cross :
+
+{ name, fetchurl, stdenv, installLocales ? false
+, gccCross ? null, kernelHeaders ? null
+, machHeaders ? null, hurdHeaders ? null, mig ? null, fetchgit ? null
+, profilingLibraries ? false, meta
+, preConfigure ? "", ... }@args :
+
+let
+  # For GNU/Hurd, see below.
+  version = if hurdHeaders != null then "20100512" else "2.14.1";
+
+  needsPortsNative = stdenv.isMips || stdenv.isArm;
+  needsPortsCross = cross.arch == "mips" || cross.arch == "arm";
+  needsPorts = if (stdenv ? cross) && stdenv.cross != null then true
+    else if cross == null then needsPortsNative
+    else needsPortsCross;
+
+  srcPorts = fetchurl {
+    url = "mirror://gnu/glibc/glibc-ports-2.14.1.tar.bz2";
+    sha256 = "1acs4sd5mjzmssmd0md6dfqwnziph2am7v09mbnnd8aadpxhm0qw";
+  };
+
+in
+
+assert (cross != null) -> (gccCross != null);
+
+assert (mig != null) -> (machHeaders != null);
+assert (machHeaders != null) -> (hurdHeaders != null);
+assert (hurdHeaders != null) -> (fetchgit != null);
+
+stdenv.mkDerivation ({
+  inherit kernelHeaders installLocales;
+
+  # The host/target system.
+  crossConfig = if (cross != null) then cross.config else null;
+
+  inherit (stdenv) is64bit;
+
+  enableParallelBuilding = true;
+
+  patches =
+    stdenv.lib.optional (fetchgit == null)
+    /* Fix for NIXPKGS-79: when doing host name lookups, when
+       nsswitch.conf contains a line like
+
+         hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       don't return an error when mdns4_minimal can't be found.  This
+       is a bug in Glibc: when a service can't be found, NSS should
+       continue to the next service unless "UNAVAIL=return" is set.
+       ("NOTFOUND=return" refers to the service returning a NOTFOUND
+       error, not the service itself not being found.)  The reason is
+       that the "status" variable (while initialised to UNAVAIL) is
+       outside of the loop that iterates over the services, the
+       "files" service sets status to NOTFOUND.  So when the call to
+       find "mdns4_minimal" fails, "status" will still be NOTFOUND,
+       and it will return instead of continuing to "dns".  Thus, the
+       line
+
+         hosts: mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       does work because "status" will contain UNAVAIL after the
+       failure to find mdns4_minimal. */
+    ./nss-skip-unavail.patch
+  ++ [
+    /* Have rpcgen(1) look for cpp(1) in $PATH.  */
+    ./rpcgen-path.patch
+
+    /* Allow nixos and nix handle the locale-archive. */
+    ./nix-locale-archive.patch
+
+    /* Without this patch many KDE binaries crash. */
+    ./glibc-elf-localscope.patch
+  ];
+
+  postPatch = ''
+    # Needed for glibc to build with the gnumake 3.82
+    # http://comments.gmane.org/gmane.linux.lfs.support/31227
+    sed -i 's/ot \$/ot:\n\ttouch $@\n$/' manual/Makefile
+
+    # nscd needs libgcc, and we don't want it dynamically linked
+    # because we don't want it to depend on bootstrap-tools libs.
+    echo "LDFLAGS-nscd += -static-libgcc" >> nscd/Makefile
+  '';
+
+  configureFlags = [
+    "-C"
+    "--enable-add-ons"
+    "--sysconfdir=/etc"
+    "--localedir=/var/run/current-system/sw/lib/locale"
+    (if kernelHeaders != null
+     then "--with-headers=${kernelHeaders}/include"
+     else "--without-headers")
+    (if profilingLibraries
+     then "--enable-profile"
+     else "--disable-profile")
+  ] ++ stdenv.lib.optionals (cross != null) [
+    (if cross.withTLS then "--with-tls" else "--without-tls")
+    (if cross.float == "soft" then "--without-fp" else "--with-fp")
+    "--enable-kernel=2.6.0"
+    "--with-__thread"
+  ] ++ stdenv.lib.optionals (stdenv.system == "armv5tel-linux") [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+
+    # To avoid linking with -lgcc_s (dynamic link)
+    # so the glibc does not depend on its compiler store path
+    "libc_cv_as_needed=no"
+  ];
+
+  installFlags = [ "sysconfdir=$(out)/etc" ];
+  
+  buildInputs = stdenv.lib.optionals (cross != null) [ gccCross ]
+    ++ stdenv.lib.optional (mig != null) mig;
+
+  # Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+  # prevent a retained dependency on the bootstrap tools in the stdenv-linux
+  # bootstrap.
+  BASH_SHELL = "/bin/sh";
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = stdenv.lib.optionalString (stdenv.system == "i686-linux") "-U__i686";
+}
+
+# Remove the `gccCross' attribute so that the *native* glibc store path
+# doesn't depend on whether `gccCross' is null or not.
+// (removeAttrs args [ "gccCross" ]) //
+
+{
+  name = name + "-${version}" +
+    stdenv.lib.optionalString (cross != null) "-${cross.config}";
+
+  src =
+    if hurdHeaders != null
+    then fetchgit {
+      # Shamefully the "official" glibc won't build on GNU, so use the one
+      # maintained by the Hurd folks, `tschwinge/Roger_Whittaker' branch.
+      # See <http://www.gnu.org/software/hurd/source_repositories/glibc.html>.
+      url = "git://git.sv.gnu.org/hurd/glibc.git";
+      sha256 = "f3590a54a9d897d121f91113949edbaaf3e30cdeacbb8d0a44de7b6564f6643e";
+      rev = "df4c3faf0ccc848b5a8086c222bdb42679a9798f";
+    }
+    else fetchurl {
+      url = "mirror://gnu/glibc/glibc-${version}.tar.bz2";
+      sha256 = "0fsvf5d6sib483rp7asdy8hs0dysxqkrvw316c82hsxy7vxa51bf";
+    };
+
+  # `fetchurl' is a function and thus should not be passed to the
+  # `derivation' primitive.
+  fetchurl = null;
+
+  # Remove absolute paths from `configure' & co.; build out-of-tree.
+  preConfigure = ''
+    export PWD_P=$(type -tP pwd)
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    ${if needsPorts then "tar xvf ${srcPorts}" else ""}
+
+    mkdir ../build
+    cd ../build
+
+    configureScript="`pwd`/../$sourceRoot/configure"
+
+    ${preConfigure}
+  '';
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "The GNU C Library";
+
+    longDescription =
+      '' Any Unix-like operating system needs a C library: the library which
+         defines the "system calls" and other basic facilities such as
+         open, malloc, printf, exit...
+
+         The GNU C library is used as the C library in the GNU system and
+         most systems with the Linux kernel.
+      '';
+
+    license = "LGPLv2+";
+
+    maintainers = [ stdenv.lib.maintainers.ludo ];
+    platforms = stdenv.lib.platforms.linux;
+  } // meta;
+}
+
+//
+
+(if hurdHeaders != null
+ then {
+   # Work around the fact that the configure snippet that looks for
+   # <hurd/version.h> does not honor `--with-headers=$sysheaders' and that
+   # glibc expects both Mach and Hurd headers to be in the same place.
+   CPATH = "${hurdHeaders}/include:${machHeaders}/include";
+
+   # `fetchgit' is a function and thus should not be passed to the
+   # `derivation' primitive.
+   fetchgit = null;
+ }
+ else { }))
diff --git a/pkgs/development/libraries/glibc/2.14/default.nix b/pkgs/development/libraries/glibc/2.14/default.nix
new file mode 100644
index 000000000000..95778b50b70b
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/default.nix
@@ -0,0 +1,83 @@
+{ stdenv, fetchurl, kernelHeaders
+, machHeaders ? null, hurdHeaders ? null, mig ? null, fetchgit ? null
+, installLocales ? true
+, profilingLibraries ? false
+, gccCross ? null
+}:
+
+assert stdenv.gcc.gcc != null;
+
+let
+  build = import ./common.nix;
+  cross = if gccCross != null then gccCross.target else null;
+in
+  build cross ({
+    name = "glibc";
+
+    inherit fetchurl stdenv kernelHeaders installLocales profilingLibraries
+      gccCross;
+
+    builder = ./builder.sh;
+
+    # When building glibc from bootstrap-tools, we need libgcc_s at RPATH for
+    # any program we run, because the gcc will have been placed at a new
+    # store path than that determined when built (as a source for the
+    # bootstrap-tools tarball)
+    # Building from a proper gcc staying in the path where it was installed,
+    # libgcc_s will not be at {gcc}/lib, and gcc's libgcc will be found without
+    # any special hack.
+    preInstall = ''
+      if [ -f ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 ]; then
+          mkdir -p $out/lib
+          ln -s ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
+      fi
+    '';
+
+    meta.description = "The GNU C Library";
+  }
+
+  //
+
+  (if hurdHeaders != null
+   then rec {
+     inherit machHeaders hurdHeaders mig fetchgit;
+
+     propagatedBuildInputs = [ machHeaders hurdHeaders ];
+
+     passthru = {
+       # When building GCC itself `propagatedBuildInputs' above is not
+       # honored, so we pass it here so that the GCC builder can do the right
+       # thing.
+       inherit propagatedBuildInputs;
+     };
+   }
+   else { })
+
+  //
+
+  (if cross != null
+   then {
+      preConfigure = ''
+        sed -i s/-lgcc_eh//g "../$sourceRoot/Makeconfig"
+
+        cat > config.cache << "EOF"
+        libc_cv_forced_unwind=yes
+        libc_cv_c_cleanup=yes
+        libc_cv_gnu89_inline=yes
+        # Only due to a problem in gcc configure scripts:
+        libc_cv_sparc64_tls=${if cross.withTLS then "yes" else "no"}
+        EOF
+        export BUILD_CC=gcc
+        export CC="$crossConfig-gcc"
+        export AR="$crossConfig-ar"
+        export RANLIB="$crossConfig-ranlib"
+
+        dontStrip=1
+      '';
+
+      # To avoid a dependency on the build system 'bash'.
+      preFixup = ''
+        rm $out/bin/{ldd,tzselect,catchsegv,xtrace}
+      '';
+    }
+   else {}))
diff --git a/pkgs/development/libraries/glibc/2.14/glibc-elf-localscope.patch b/pkgs/development/libraries/glibc/2.14/glibc-elf-localscope.patch
new file mode 100644
index 000000000000..98f7f81087bb
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/glibc-elf-localscope.patch
@@ -0,0 +1,82 @@
+diff -ru a/elf/dl-close.c b/elf/dl-close.c
+--- a/elf/dl-close.c	2011-02-04 00:35:03.000000000 +0100
++++ b/elf/dl-close.c	2011-02-22 02:16:12.367883000 +0100
+@@ -180,24 +186,28 @@
+       /* Signal the object is still needed.  */
+       l->l_idx = IDX_STILL_USED;
+ 
++#define mark_used(dmap) \
++  do {								\
++    if ((dmap)->l_idx != IDX_STILL_USED)			\
++      {								\
++	assert ((dmap)->l_idx >= 0 && (dmap)->l_idx < nloaded);	\
++								\
++	if (!used[(dmap)->l_idx])				\
++	  {							\
++	    used[(dmap)->l_idx] = 1;				\
++	    if ((dmap)->l_idx - 1 < done_index)			\
++	      done_index = (dmap)->l_idx - 1;			\
++	  }							\
++      }								\
++  } while (0)
++
+       /* Mark all dependencies as used.  */
+       if (l->l_initfini != NULL)
+ 	{
+ 	  struct link_map **lp = &l->l_initfini[1];
+ 	  while (*lp != NULL)
+ 	    {
+-	      if ((*lp)->l_idx != IDX_STILL_USED)
+-		{
+-		  assert ((*lp)->l_idx >= 0 && (*lp)->l_idx < nloaded);
+-
+-		  if (!used[(*lp)->l_idx])
+-		    {
+-		      used[(*lp)->l_idx] = 1;
+-		      if ((*lp)->l_idx - 1 < done_index)
+-			done_index = (*lp)->l_idx - 1;
+-		    }
+-		}
+-
++	      mark_used(*lp);
+ 	      ++lp;
+ 	    }
+ 	}
+@@ -206,19 +216,25 @@
+ 	for (unsigned int j = 0; j < l->l_reldeps->act; ++j)
+ 	  {
+ 	    struct link_map *jmap = l->l_reldeps->list[j];
+-
+-	    if (jmap->l_idx != IDX_STILL_USED)
+-	      {
+-		assert (jmap->l_idx >= 0 && jmap->l_idx < nloaded);
+-
+-		if (!used[jmap->l_idx])
+-		  {
+-		    used[jmap->l_idx] = 1;
+-		    if (jmap->l_idx - 1 < done_index)
+-		      done_index = jmap->l_idx - 1;
+-		  }
+-	      }
++	    mark_used(jmap);
+ 	  }
++      /* And the same for owners of our scopes; normally, our last
++	 scope provider would render us unused, but this can be
++	 prevented by the NODELETE flag. */
++      if (__builtin_expect(l->l_type == lt_loaded
++	                   && (l->l_flags_1 & DF_1_NODELETE), 0))
++	for (size_t cnt = 0; l->l_scope[cnt] != NULL; ++cnt)
++	  /* This relies on l_scope[] entries being always set either
++	     to its own l_symbolic_searchlist address, or some map's
++	     l_searchlist address.  */
++	  if (l->l_scope[cnt] != &l->l_symbolic_searchlist)
++	    {
++	      struct link_map *ls = (struct link_map *)
++		((char *) l->l_scope[cnt]
++		 - offsetof (struct link_map, l_searchlist));
++	      assert (ls->l_ns == nsid);
++	      mark_used(ls);
++	    }
+     }
+ 
+   /* Sort the entries.  */
diff --git a/pkgs/development/libraries/glibc/2.14/info.nix b/pkgs/development/libraries/glibc/2.14/info.nix
new file mode 100644
index 000000000000..75bd996d9bc5
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/info.nix
@@ -0,0 +1,26 @@
+{ stdenv, fetchurl, texinfo, perl }:
+
+let build = import ./common.nix;
+in
+  /* null cross builder */
+  build null {
+    name = "glibc-info";
+
+    inherit fetchurl stdenv;
+
+    configureFlags = [ "--enable-add-ons" ];
+
+    buildInputs = [ texinfo perl ];
+
+    buildPhase = "make info";
+
+    # I don't know why the info is not generated in 'build'
+    # Somehow building the info still does not work, because the final
+    # libc.info hasn't a Top node.
+    installPhase = ''
+      mkdir -p "$out/share/info"
+      cp -v "../$sourceRoot/manual/"*.info* "$out/share/info"
+    '';
+
+    meta.description = "GNU Info manual of the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc/2.14/locales-builder.sh b/pkgs/development/libraries/glibc/2.14/locales-builder.sh
new file mode 100644
index 000000000000..d732e208fa22
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/locales-builder.sh
@@ -0,0 +1,17 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.14/locales.nix b/pkgs/development/libraries/glibc/2.14/locales.nix
new file mode 100644
index 000000000000..b7eae50ca385
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/locales.nix
@@ -0,0 +1,47 @@
+/* This function builds just the `lib/locale/locale-archive' file from
+   Glibc and nothing else.  If `allLocales' is true, all supported
+   locales are included; otherwise, just the locales listed in
+   `locales'.  See localedata/SUPPORTED in the Glibc source tree for
+   the list of all supported locales:
+   http://sourceware.org/cgi-bin/cvsweb.cgi/libc/localedata/SUPPORTED?cvsroot=glibc
+*/
+
+{ stdenv, fetchurl, allLocales ? true, locales ? ["en_US.UTF-8/UTF-8"] }:
+
+let build = import ./common.nix;
+in
+  build null {
+    name = "glibc-locales";
+
+    inherit fetchurl stdenv;
+    installLocales = true;
+
+    builder = ./locales-builder.sh;
+
+    # Awful hack: `localedef' doesn't allow the path to `locale-archive'
+    # to be overriden, but you *can* specify a prefix, i.e. it will use
+    # <prefix>/<path-to-glibc>/lib/locale/locale-archive.  So we use
+    # $TMPDIR as a prefix, meaning that the locale-archive is placed in
+    # $TMPDIR/nix/store/...-glibc-.../lib/locale/locale-archive.
+    buildPhase =
+      ''
+        mkdir -p $TMPDIR/"$(dirname $(readlink -f $(type -p localedef)))/../lib/locale"
+
+        # Hack to allow building of the locales (needed since glibc-2.12)
+        sed -i -e "s,^LOCALEDEF=.*,LOCALEDEF=localedef --prefix=$TMPDIR," -e \
+            /library-path/d ../glibc-2*/localedata/Makefile
+        ${if allLocales then "" else
+            "echo SUPPORTED-LOCALES=\"${toString locales}\" > ../glibc-2*/localedata/SUPPORTED"}
+
+        make localedata/install-locales \
+            localedir=$out/lib/locale \
+      '';
+
+    installPhase =
+      ''
+        mkdir -p "$out/lib/locale"
+        cp -v "$TMPDIR/nix/store/"*"/lib/locale/locale-archive" "$out/lib/locale"
+      '';
+
+    meta.description = "Locale information for the GNU C Library";
+  }
diff --git a/pkgs/development/libraries/glibc/2.14/nix-locale-archive.patch b/pkgs/development/libraries/glibc/2.14/nix-locale-archive.patch
new file mode 100644
index 000000000000..aca904f7ff44
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/nix-locale-archive.patch
@@ -0,0 +1,116 @@
+diff --git a/locale/loadarchive.c b/locale/loadarchive.c
+index d545f17..0d8638a 100644
+--- a/locale/loadarchive.c
++++ b/locale/loadarchive.c
+@@ -124,6 +124,25 @@ calculate_head_size (const struct locarhead *h)
+ }
+ 
+ 
++static int
++open_locale_archive ()
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  const char *usualpath = "/usr/lib/locale/locale-archive";
++  if (path)
++    fd = open_not_cancel_2 (path, O_RDONLY|O_LARGEFILE);
++  if (path2 && fd < 0)
++    fd = open_not_cancel_2 (path2, O_RDONLY|O_LARGEFILE);
++  if (fd < 0)
++    fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++  if (fd < 0)
++    fd = open_not_cancel_2 (usualpath, O_RDONLY|O_LARGEFILE);
++  return fd;
++}
++
++
+ /* Find the locale *NAMEP in the locale archive, and return the
+    internalized data structure for its CATEGORY data.  If this locale has
+    already been loaded from the archive, just returns the existing data
+@@ -203,7 +222,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
+       archmapped = &headmap;
+ 
+       /* The archive has never been opened.  */
+-      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++      fd = open_locale_archive ();
+       if (fd < 0)
+ 	/* Cannot open the archive, for whatever reason.  */
+ 	return NULL;
+@@ -394,7 +413,7 @@ _nl_load_locale_from_archive (int category, const char **namep)
+ 	  if (fd == -1)
+ 	    {
+ 	      struct stat64 st;
+-	      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++	      fd = open_locale_archive ();
+ 	      if (fd == -1)
+ 		/* Cannot open the archive, for whatever reason.  */
+ 		return NULL;
+diff --git a/locale/programs/locale.c b/locale/programs/locale.c
+index 77262b7..fddc00d 100644
+--- a/locale/programs/locale.c
++++ b/locale/programs/locale.c
+@@ -628,6 +628,20 @@ nameentcmp (const void *a, const void *b)
+ 		  ((const struct nameent *) b)->name);
+ }
+ 
++static int
++open_nix_locale_archive (const char * fname, int access)
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  if (path)
++    fd = open64 (path, access);
++  if (path2 && fd < 0)
++    fd = open64 (path2, access);
++  if (fd < 0)
++    fd = open64 (fname, access);
++  return fd;
++}
+ 
+ static int
+ write_archive_locales (void **all_datap, char *linebuf)
+@@ -641,7 +658,7 @@ write_archive_locales (void **all_datap, char *linebuf)
+   int fd, ret = 0;
+   uint32_t cnt;
+ 
+-  fd = open64 (ARCHIVE_NAME, O_RDONLY);
++  fd = open_nix_locale_archive (ARCHIVE_NAME, O_RDONLY);
+   if (fd < 0)
+     return 0;
+ 
+diff --git a/locale/programs/locarchive.c b/locale/programs/locarchive.c
+index 85ba77d..3ad2af8 100644
+--- a/locale/programs/locarchive.c
++++ b/locale/programs/locarchive.c
+@@ -512,6 +512,20 @@ enlarge_archive (struct locarhandle *ah, const struct locarhead *head)
+   *ah = new_ah;
+ }
+ 
++static int
++open_nix_locale_archive (const char * fname, int access)
++{
++  int fd = -1;
++  char *path = getenv ("LOCALE_ARCHIVE_2_11");
++  char *path2 = getenv ("LOCALE_ARCHIVE");
++  if (path)
++    fd = open64 (path, access);
++  if (path2 && fd < 0)
++    fd = open64 (path2, access);
++  if (fd < 0)
++    fd = open64 (fname, access);
++  return fd;
++}
+ 
+ void
+ open_archive (struct locarhandle *ah, bool readonly)
+@@ -531,7 +548,7 @@ open_archive (struct locarhandle *ah, bool readonly)
+   while (1)
+     {
+       /* Open the archive.  We must have exclusive write access.  */
+-      fd = open64 (archivefname, readonly ? O_RDONLY : O_RDWR);
++      fd = open_nix_locale_archive (archivefname, readonly ? O_RDONLY : O_RDWR);
+       if (fd == -1)
+ 	{
+ 	  /* Maybe the file does not yet exist.  */
diff --git a/pkgs/development/libraries/glibc/2.14/nss-skip-unavail.patch b/pkgs/development/libraries/glibc/2.14/nss-skip-unavail.patch
new file mode 100644
index 000000000000..e48dc2bc0a6e
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/nss-skip-unavail.patch
@@ -0,0 +1,21 @@
+diff -ru glibc-2.11.2-orig/sysdeps/posix/getaddrinfo.c glibc-2.11.2/sysdeps/posix/getaddrinfo.c
+--- glibc-2.11.2-orig/sysdeps/posix/getaddrinfo.c	2010-05-19 22:38:20.000000000 +0200
++++ glibc-2.11.2/sysdeps/posix/getaddrinfo.c	2010-08-05 18:39:54.259556327 +0200
+@@ -505,8 +505,6 @@
+ 	  int no_data = 0;
+ 	  int no_inet6_data = 0;
+ 	  service_user *nip = NULL;
+-	  enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
+-	  enum nss_status status = NSS_STATUS_UNAVAIL;
+ 	  int no_more;
+ 	  int old_res_options;
+ 
+@@ -702,6 +700,8 @@
+ 
+ 	  while (!no_more)
+ 	    {
++ 	      enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
++ 	      enum nss_status status = NSS_STATUS_UNAVAIL;
+ 	      no_data = 0;
+ 	      nss_gethostbyname4_r fct4
+ 		= __nss_lookup_function (nip, "gethostbyname4_r");
diff --git a/pkgs/development/libraries/glibc/2.14/rpcgen-path.patch b/pkgs/development/libraries/glibc/2.14/rpcgen-path.patch
new file mode 100644
index 000000000000..fbb03dd5fade
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.14/rpcgen-path.patch
@@ -0,0 +1,72 @@
+By default, rpcgen(1) looks for cpp(1) from a list of fixed absolute paths
+(`/lib/cpp', etc.), which may only be overrided with the `-Y' option.  This
+patch makes it run any `cpp' command found in $PATH.
+
+--- glibc-2.7/sunrpc/rpc_main.c	2006-11-10 21:54:46.000000000 +0100
++++ glibc-2.7/sunrpc/rpc_main.c	2009-04-22 14:32:10.000000000 +0200
+@@ -79,7 +79,7 @@ static const char *cmdname;
+ 
+ static const char *svcclosetime = "120";
+ static int cppDefined;	/* explicit path for C preprocessor */
+-static const char *CPP = SUNOS_CPP;
++static const char *CPP = "cpp";
+ static const char CPPFLAGS[] = "-C";
+ static char *pathbuf;
+ static int cpp_pid;
+@@ -108,7 +108,6 @@ static char *extendfile (const char *fil
+ static void open_output (const char *infile, const char *outfile);
+ static void add_warning (void);
+ static void clear_args (void);
+-static void find_cpp (void);
+ static void open_input (const char *infile, const char *define);
+ static int check_nettype (const char *name, const char *list_to_check[]);
+ static void c_output (const char *infile, const char *define,
+@@ -327,31 +326,6 @@ clear_args (void)
+   argcount = FIXEDARGS;
+ }
+ 
+-/* make sure that a CPP exists */
+-static void
+-find_cpp (void)
+-{
+-  struct stat buf;
+-
+-  if (stat (CPP, &buf) < 0)
+-    {				/* /lib/cpp or explicit cpp does not exist */
+-      if (cppDefined)
+-	{
+-	  fprintf (stderr, _ ("cannot find C preprocessor: %s \n"), CPP);
+-	  crash ();
+-	}
+-      else
+-	{			/* try the other one */
+-	  CPP = SVR4_CPP;
+-	  if (stat (CPP, &buf) < 0)
+-	    {			/* can't find any cpp */
+-	      fputs (_ ("cannot find any C preprocessor (cpp)\n"), stdout);
+-	      crash ();
+-	    }
+-	}
+-    }
+-}
+-
+ /*
+  * Open input file with given define for C-preprocessor
+  */
+@@ -370,7 +344,6 @@ open_input (const char *infile, const ch
+   switch (cpp_pid)
+     {
+     case 0:
+-      find_cpp ();
+       putarg (0, CPP);
+       putarg (1, CPPFLAGS);
+       addarg (define);
+@@ -380,7 +353,7 @@ open_input (const char *infile, const ch
+       close (1);
+       dup2 (pd[1], 1);
+       close (pd[0]);
+-      execv (arglist[0], (char **) arglist);
++      execvp (arglist[0], (char **) arglist);
+       perror ("execv");
+       exit (1);
+     case -1:
diff --git a/pkgs/development/libraries/glibc/2.5/binutils-ld.patch b/pkgs/development/libraries/glibc/2.5/binutils-ld.patch
new file mode 100644
index 000000000000..4cd7ab3cec34
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/binutils-ld.patch
@@ -0,0 +1,27 @@
+From 7c8a67320e26b8c11108bf0a3410d3aef9cf3486 Mon Sep 17 00:00:00 2001
+From: Ulrich Drepper <drepper@redhat.com>
+Date: Sat, 31 Jan 2009 00:21:15 +0000
+Subject: [PATCH] * elf/Makefile (ld.so): Adjust the sed script to insert _begin in to
+
+	newer linker scripts.
+---
+ ChangeLog    |    5 +++++
+ elf/Makefile |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/elf/Makefile b/elf/Makefile
+index 8079fe9..e44ff1d 100644
+--- a/elf/Makefile
++++ b/elf/Makefile
+@@ -304,7 +304,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
+ 		  $(LDFLAGS-rtld) -Wl,-z,defs -Wl,--verbose 2>&1 |	\
+ 		  LC_ALL=C \
+ 		  sed -e '/^=========/,/^=========/!d;/^=========/d'	\
+-		      -e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
++		      -e 's/\. = .* + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
+ 		  > $@.lds
+ 	$(LINK.o) -nostdlib -nostartfiles -shared -o $@			\
+ 		  $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now))	\
+--
+1.6.4
+
diff --git a/pkgs/development/libraries/glibc/2.5/builder.sh b/pkgs/development/libraries/glibc/2.5/builder.sh
new file mode 100644
index 000000000000..bc80af83b926
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/builder.sh
@@ -0,0 +1,57 @@
+# glibc cannot have itself in its rpath.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+# Explicitly tell glibc to use our pwd, not /bin/pwd.
+export PWD_P=$(type -tP pwd)
+
+
+postUnpack() {
+    cd $sourceRoot/..
+}
+
+
+preConfigure() {
+
+    for i in configure io/ftwtest-sh; do
+        substituteInPlace "$i" \
+            --replace "@PWD@" "pwd"
+    done
+
+    # Fix shell code that tries to determine whether GNU ld is recent enough.
+    substituteInPlace configure --replace '2.1[3-9]*)' '2.1[3-9]*|2.[2-9][0-9]*)'
+
+    mkdir ../build
+    cd ../build
+
+    configureScript=../$sourceRoot/configure
+}
+
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+    export NIX_DONT_SET_RPATH=1
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make -j${NIX_BUILD_CORES:-1} -l${NIX_BUILD_CORES:-1} localedata/install-locales
+    fi
+    rm $out/etc/ld.so.cache
+    (cd $out/include && ln -s $kernelHeaders/include/* .) || exit 1
+
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.5/default.nix b/pkgs/development/libraries/glibc/2.5/default.nix
new file mode 100644
index 000000000000..8b8c204a4803
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/default.nix
@@ -0,0 +1,40 @@
+{ stdenv, fetchurl, kernelHeaders
+, installLocales ? true
+, profilingLibraries ? false
+}:
+
+stdenv.mkDerivation {
+  name = "glibc-2.5";
+  builder = ./builder.sh;
+
+  src = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-2.5.tar.bz2;
+    md5 = "1fb29764a6a650a4d5b409dda227ac9f";
+  };
+
+  patches = [ ./glibc-pwd.patch ./glibc-getcwd-param-MAX.patch ./glibc-inline.patch
+              ./x86-fnstsw.patch ./binutils-ld.patch ./make-3-82-fix.patch ];
+
+  inherit kernelHeaders installLocales;
+
+  inherit (stdenv) is64bit;
+
+  configureFlags="--enable-add-ons
+    --with-headers=${kernelHeaders}/include
+    --disable-sanity-checks
+    ${if profilingLibraries then "--enable-profile" else "--disable-profile"}";
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = "-U__i686";
+
+  enableParallelBuilding = true;
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "The GNU C Library";
+  };
+}
diff --git a/pkgs/development/libraries/glibc/2.5/glibc-getcwd-param-MAX.patch b/pkgs/development/libraries/glibc/2.5/glibc-getcwd-param-MAX.patch
new file mode 100644
index 000000000000..8543dbbf1d76
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/glibc-getcwd-param-MAX.patch
@@ -0,0 +1,14 @@
+2006-06-18  Mike Frysinger  <vapier@gentoo.org>
+
+	* sysdeps/unix/sysv/linux/getcwd.c: Include sys/param.h.
+
+--- glibc-old/sysdeps/unix/sysv/linux/getcwd.c
++++ glibc-new/sysdeps/unix/sysv/linux/getcwd.c
+@@ -24,6 +24,7 @@
+ #include <limits.h>
+ #include <stdlib.h>
+ #include <unistd.h>
++#include <sys/param.h>
+ 
+ #include <sysdep.h>
+ #include <sys/syscall.h>
diff --git a/pkgs/development/libraries/glibc/2.5/glibc-inline.patch b/pkgs/development/libraries/glibc/2.5/glibc-inline.patch
new file mode 100644
index 000000000000..19e400e0d50f
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/glibc-inline.patch
@@ -0,0 +1,1822 @@
+--- libc/mach/mach/mig_support.h.jj	2001-07-06 06:55:35.000000000 +0200
++++ libc/mach/mach/mig_support.h	2006-11-07 11:18:32.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1993,94,97,99,2001 Free Software Foundation, Inc.
++/* Copyright (C) 1993,94,97,99,2001,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
+@@ -67,12 +67,12 @@ extern void mig_reply_setup (const mach_
+ /* Idiocy support function.  */
+ extern vm_size_t mig_strncpy (char *__dst, const char *__src, vm_size_t __len);
+ extern vm_size_t __mig_strncpy (char *__dst, const char *__src, vm_size_t);
+-extern __inline vm_size_t
++__extern_inline vm_size_t
+ __mig_strncpy (char *__dst, const char *__src, vm_size_t __len)
+ {
+   return __stpncpy (__dst, __src, __len) - __dst;
+ }
+-extern __inline vm_size_t
++__extern_inline vm_size_t
+ mig_strncpy (char *__dst, const char *__src, vm_size_t __len)
+ {
+   return __mig_strncpy (__dst, __src, __len);
+--- libc/mach/lock-intern.h.jj	2001-07-06 06:55:34.000000000 +0200
++++ libc/mach/lock-intern.h	2006-11-06 21:05:34.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1994, 1996 Free Software Foundation, Inc.
++/* Copyright (C) 1994, 1996, 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
+@@ -22,7 +22,7 @@
+ #include <machine-lock.h>
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/include/stdlib.h.jj	2006-01-14 13:08:56.000000000 +0100
++++ libc/include/stdlib.h	2006-11-06 21:08:02.000000000 +0100
+@@ -139,43 +139,43 @@ libc_hidden_proto (____strtoll_l_interna
+ libc_hidden_proto (____strtoul_l_internal)
+ libc_hidden_proto (____strtoull_l_internal)
+ 
+-extern __inline double
++__extern_inline double
+ __NTH (__strtod_l (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		   __locale_t __loc))
+ {
+   return ____strtod_l_internal (__nptr, __endptr, 0, __loc);
+ }
+-extern __inline long int
++__extern_inline long int
+ __NTH (__strtol_l (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		   int __base, __locale_t __loc))
+ {
+   return ____strtol_l_internal (__nptr, __endptr, __base, 0, __loc);
+ }
+-extern __inline unsigned long int
++__extern_inline unsigned long int
+ __NTH (__strtoul_l (__const char *__restrict __nptr,
+ 		    char **__restrict __endptr, int __base, __locale_t __loc))
+ {
+   return ____strtoul_l_internal (__nptr, __endptr, __base, 0, __loc);
+ }
+-extern __inline float
++__extern_inline float
+ __NTH (__strtof_l (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		   __locale_t __loc))
+ {
+   return ____strtof_l_internal (__nptr, __endptr, 0, __loc);
+ }
+-extern __inline long double
++__extern_inline long double
+ __NTH (__strtold_l (__const char *__restrict __nptr,
+ 		    char **__restrict __endptr, __locale_t __loc))
+ {
+   return ____strtold_l_internal (__nptr, __endptr, 0, __loc);
+ }
+-__extension__ extern __inline long long int
++__extension__ __extern_inline long long int
+ __NTH (__strtoll_l (__const char *__restrict __nptr,
+ 		    char **__restrict __endptr, int __base, __locale_t __loc))
+ {
+   return ____strtoll_l_internal (__nptr, __endptr, __base, 0, __loc);
+ }
+-__extension__ extern __inline unsigned long long int
++__extension__ __extern_inline unsigned long long int
+ __NTH (__strtoull_l (__const char * __restrict __nptr,
+ 		     char **__restrict __endptr, int __base, __locale_t __loc))
+ {
+--- libc/include/ctype.h.jj	2004-03-16 11:09:04.000000000 +0100
++++ libc/include/ctype.h	2006-11-06 21:06:24.000000000 +0100
+@@ -15,7 +15,7 @@ extern int __isctype (int __c, int __mas
+ #  include <bits/libc-tsd.h>
+ 
+ #  ifndef CTYPE_EXTERN_INLINE	/* Used by ctype/ctype-info.c, which see.  */
+-#   define CTYPE_EXTERN_INLINE extern inline
++#   define CTYPE_EXTERN_INLINE __extern_inline
+ #  endif
+ 
+ __libc_tsd_define (extern, CTYPE_B)
+--- libc/include/sys/stat.h.jj	2006-02-12 22:29:08.000000000 +0100
++++ libc/include/sys/stat.h	2006-11-06 21:07:01.000000000 +0100
+@@ -19,13 +19,13 @@ hidden_proto (__lxstat64)
+ hidden_proto (__xstat)
+ hidden_proto (__xstat64)
+ #endif
+-extern __inline__ int __stat (__const char *__path, struct stat *__statbuf)
++__extern_inline int __stat (__const char *__path, struct stat *__statbuf)
+ {
+   return __xstat (_STAT_VER, __path, __statbuf);
+ }
+ libc_hidden_proto (__xmknod)
+-extern __inline__ int __mknod (__const char *__path, __mode_t __mode,
+-			       __dev_t __dev)
++__extern_inline int __mknod (__const char *__path, __mode_t __mode,
++			     __dev_t __dev)
+ {
+   return __xmknod (_MKNOD_VER, __path, __mode, &__dev);
+ }
+--- libc/stdlib/stdlib.h.jj	2006-10-31 23:05:34.000000000 +0100
++++ libc/stdlib/stdlib.h	2006-11-06 21:16:09.000000000 +0100
+@@ -324,18 +324,18 @@ extern unsigned long long int __strtoull
+ /* Define inline functions which call the internal entry points.  */
+ 
+ __BEGIN_NAMESPACE_STD
+-extern __inline double
++__extern_inline double
+ __NTH (strtod (__const char *__restrict __nptr, char **__restrict __endptr))
+ {
+   return __strtod_internal (__nptr, __endptr, 0);
+ }
+-extern __inline long int
++__extern_inline long int
+ __NTH (strtol (__const char *__restrict __nptr, char **__restrict __endptr,
+ 	       int __base))
+ {
+   return __strtol_internal (__nptr, __endptr, __base, 0);
+ }
+-extern __inline unsigned long int
++__extern_inline unsigned long int
+ __NTH (strtoul (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		int __base))
+ {
+@@ -345,13 +345,13 @@ __END_NAMESPACE_STD
+ 
+ # ifdef __USE_ISOC99
+ __BEGIN_NAMESPACE_C99
+-extern __inline float
++__extern_inline float
+ __NTH (strtof (__const char *__restrict __nptr, char **__restrict __endptr))
+ {
+   return __strtof_internal (__nptr, __endptr, 0);
+ }
+ #  ifndef __LDBL_COMPAT
+-extern __inline long double
++__extern_inline long double
+ __NTH (strtold (__const char *__restrict __nptr, char **__restrict __endptr))
+ {
+   return __strtold_internal (__nptr, __endptr, 0);
+@@ -361,13 +361,13 @@ __END_NAMESPACE_C99
+ # endif
+ 
+ # ifdef __USE_BSD
+-__extension__ extern __inline long long int
++__extension__ __extern_inline long long int
+ __NTH (strtoq (__const char *__restrict __nptr, char **__restrict __endptr,
+ 	       int __base))
+ {
+   return __strtoll_internal (__nptr, __endptr, __base, 0);
+ }
+-__extension__ extern __inline unsigned long long int
++__extension__ __extern_inline unsigned long long int
+ __NTH (strtouq (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		int __base))
+ {
+@@ -377,13 +377,13 @@ __NTH (strtouq (__const char *__restrict
+ 
+ # if defined __USE_MISC || defined __USE_ISOC99
+ __BEGIN_NAMESPACE_C99
+-__extension__ extern __inline long long int
++__extension__ __extern_inline long long int
+ __NTH (strtoll (__const char *__restrict __nptr, char **__restrict __endptr,
+ 		int __base))
+ {
+   return __strtoll_internal (__nptr, __endptr, __base, 0);
+ }
+-__extension__ extern __inline unsigned long long int
++__extension__ __extern_inline unsigned long long int
+ __NTH (strtoull (__const char * __restrict __nptr, char **__restrict __endptr,
+ 		 int __base))
+ {
+@@ -393,17 +393,17 @@ __END_NAMESPACE_C99
+ # endif
+ 
+ __BEGIN_NAMESPACE_STD
+-extern __inline double
++__extern_inline double
+ __NTH (atof (__const char *__nptr))
+ {
+   return strtod (__nptr, (char **) NULL);
+ }
+-extern __inline int
++__extern_inline int
+ __NTH (atoi (__const char *__nptr))
+ {
+   return (int) strtol (__nptr, (char **) NULL, 10);
+ }
+-extern __inline long int
++__extern_inline long int
+ __NTH (atol (__const char *__nptr))
+ {
+   return strtol (__nptr, (char **) NULL, 10);
+@@ -412,7 +412,7 @@ __END_NAMESPACE_STD
+ 
+ # if defined __USE_MISC || defined __USE_ISOC99
+ __BEGIN_NAMESPACE_C99
+-__extension__ extern __inline long long int
++__extension__ __extern_inline long long int
+ __NTH (atoll (__const char *__nptr))
+ {
+   return strtoll (__nptr, (char **) NULL, 10);
+--- libc/stdlib/bits/stdlib.h.jj	2005-08-22 17:06:07.000000000 +0200
++++ libc/stdlib/bits/stdlib.h	2006-11-07 11:18:39.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Checking macros for stdlib functions.
+-   Copyright (C) 2005 Free Software Foundation, Inc.
++   Copyright (C) 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
+@@ -28,7 +28,7 @@ extern char *__REDIRECT_NTH (__realpath_
+ 			     (__const char *__restrict __name,
+ 			      char *__restrict __resolved), realpath) __wur;
+ 
+-extern __always_inline __wur char *
++__extern_always_inline __wur char *
+ __NTH (realpath (__const char *__restrict __name, char *__restrict __resolved))
+ {
+   if (__bos (__resolved) != (size_t) -1)
+@@ -44,7 +44,7 @@ extern int __REDIRECT_NTH (__ptsname_r_a
+ 					       size_t __buflen), ptsname_r)
+      __nonnull ((2));
+ 
+-extern __always_inline int
++__extern_always_inline int
+ __NTH (ptsname_r (int __fd, char *__buf, size_t __buflen))
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -59,7 +59,7 @@ extern int __wctomb_chk (char *__s, wcha
+ extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar),
+ 			   wctomb) __wur;
+ 
+-extern __always_inline __wur int
++__extern_always_inline __wur int
+ __NTH (wctomb (char *__s, wchar_t __wchar))
+ {
+   /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
+@@ -83,7 +83,7 @@ extern size_t __REDIRECT_NTH (__mbstowcs
+ 			       __const char *__restrict __src,
+ 			       size_t __len), mbstowcs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (mbstowcs (wchar_t *__restrict __dst, __const char *__restrict __src,
+ 		 size_t __len))
+ {
+@@ -104,7 +104,7 @@ extern size_t __REDIRECT_NTH (__wcstombs
+ 			       __const wchar_t *__restrict __src,
+ 			       size_t __len), wcstombs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (wcstombs (char *__restrict __dst, __const wchar_t *__restrict __src,
+ 		 size_t __len))
+ {
+     --- libc/stdlib/gmp.h.jj	2002-08-27 00:39:44.000000000 +0200
++++ libc/stdlib/gmp.h	2006-11-07 15:02:06.000000000 +0100
+@@ -1,6 +1,6 @@
+ /* gmp.h -- Definitions for GNU multiple precision functions.
+ 
+-Copyright (C) 1991, 1993, 1994, 1995, 1996 Free Software Foundation, Inc.
++Copyright (C) 1991, 1993, 1994, 1995, 1996, 2006 Free Software Foundation, Inc.
+ 
+ This file is part of the GNU MP Library.
+ 
+@@ -21,6 +21,8 @@ MA 02111-1307, USA. */
+ 
+ #ifndef __GMP_H__
+ 
++#include <features.h>
++
+ #ifndef __GNU_MP__
+ #define __GNU_MP__ 2
+ #define __need_size_t
+@@ -41,7 +43,7 @@ MA 02111-1307, USA. */
+ 
+ #ifndef _EXTERN_INLINE
+ #ifdef __GNUC__
+-#define _EXTERN_INLINE extern __inline__
++#define _EXTERN_INLINE __extern_inline
+ #else
+ #define _EXTERN_INLINE static
+ #endif
+--- libc/ctype/ctype.h.jj	2004-09-08 00:23:45.000000000 +0200
++++ libc/ctype/ctype.h	2006-11-07 11:18:56.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1991,92,93,95,96,97,98,99,2001,2002,2004
++/* Copyright (C) 1991,92,93,95,96,97,98,99,2001,2002,2004,2006
+    	Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+@@ -187,13 +187,13 @@ __exctype (_tolower);
+ # endif
+ 
+ # ifdef __USE_EXTERN_INLINES
+-extern __inline int
++__extern_inline int
+ __NTH (tolower (int __c))
+ {
+   return __c >= -128 && __c < 256 ? (*__ctype_tolower_loc ())[__c] : __c;
+ }
+ 
+-extern __inline int
++__extern_inline int
+ __NTH (toupper (int __c))
+ {
+   return __c >= -128 && __c < 256 ? (*__ctype_toupper_loc ())[__c] : __c;
+--- libc/nptl/sysdeps/pthread/bits/libc-lock.h.jj	2006-10-24 10:14:03.000000000 +0200
++++ libc/nptl/sysdeps/pthread/bits/libc-lock.h	2006-11-07 10:45:52.000000000 +0100
+@@ -1,5 +1,6 @@
+ /* libc-internal interface for mutex locks.  NPTL version.
+-   Copyright (C) 1996-2001, 2002, 2003, 2005 Free Software Foundation, Inc.
++   Copyright (C) 1996-2001, 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
+@@ -408,7 +409,7 @@ extern void _pthread_cleanup_pop_restore
+ 
+ 
+ /* Normal cleanup handling, based on C cleanup attribute.  */
+-extern __inline void
++__extern_inline void
+ __libc_cleanup_routine (struct __pthread_cleanup_frame *f)
+ {
+   if (f->__do_it)
+--- libc/nptl/sysdeps/pthread/pthread.h.jj	2006-06-05 01:59:07.000000000 +0200
++++ libc/nptl/sysdeps/pthread/pthread.h	2006-11-07 10:49:27.000000000 +0100
+@@ -572,7 +572,7 @@ class __pthread_cleanup_class
+    function the compiler is free to decide inlining the change when
+    needed or fall back on the copy which must exist somewhere
+    else.  */
+-extern __inline void
++__extern_inline void
+ __pthread_cleanup_routine (struct __pthread_cleanup_frame *__frame)
+ {
+   if (__frame->__do_it)
+@@ -1103,7 +1103,7 @@ extern int pthread_atfork (void (*__prep
+ 
+ #ifdef __USE_EXTERN_INLINES
+ /* Optimizations.  */
+-extern __inline int
++__extern_inline int
+ __NTH (pthread_equal (pthread_t __thread1, pthread_t __thread2))
+ {
+   return __thread1 == __thread2;
+--- libc/nptl/sysdeps/pthread/allocalim.h.jj	2006-05-02 08:16:07.000000000 +0200
++++ libc/nptl/sysdeps/pthread/allocalim.h	2006-11-07 10:46:28.000000000 +0100
+@@ -21,8 +21,7 @@
+ #include <limits.h>
+ 
+ 
+-extern int
+-__always_inline
++__extern_always_inline int
+ __libc_use_alloca (size_t size)
+ {
+   return (__builtin_expect (size <= PTHREAD_STACK_MIN / 4, 1)
+--- libc/nptl/sysdeps/pthread/gai_misc.h.jj	2006-09-05 17:23:12.000000000 +0200
++++ libc/nptl/sysdeps/pthread/gai_misc.h	2006-11-06 21:17:39.000000000 +0100
+@@ -76,7 +76,7 @@
+ #define gai_start_notify_thread __gai_start_notify_thread
+ #define gai_create_helper_thread __gai_create_helper_thread
+ 
+-extern inline void
++__extern_inline void
+ __gai_start_notify_thread (void)
+ {
+   sigset_t ss;
+@@ -85,7 +85,7 @@ __gai_start_notify_thread (void)
+   INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &ss, NULL, _NSIG / 8);
+ }
+ 
+-extern inline int
++__extern_inline int
+ __gai_create_helper_thread (pthread_t *threadp, void *(*tf) (void *),
+ 			    void *arg)
+ {
+--- libc/nptl/sysdeps/unix/sysv/linux/aio_misc.h.jj	2006-03-02 18:32:45.000000000 +0100
++++ libc/nptl/sysdeps/unix/sysv/linux/aio_misc.h	2006-11-06 21:18:34.000000000 +0100
+@@ -27,7 +27,7 @@
+ # define aio_start_notify_thread __aio_start_notify_thread
+ # define aio_create_helper_thread __aio_create_helper_thread
+ 
+-extern inline void
++__extern_inline void
+ __aio_start_notify_thread (void)
+ {
+   sigset_t ss;
+@@ -36,7 +36,7 @@ __aio_start_notify_thread (void)
+   INTERNAL_SYSCALL (rt_sigprocmask, err, 4, SIG_SETMASK, &ss, NULL, _NSIG / 8);
+ }
+ 
+-extern inline int
++__extern_inline int
+ __aio_create_helper_thread (pthread_t *threadp, void *(*tf) (void *),
+ 			    void *arg)
+ {
+--- libc/resolv/gai_misc.c.jj	2006-08-03 10:01:53.000000000 +0200
++++ libc/resolv/gai_misc.c	2006-11-07 10:49:55.000000000 +0100
+@@ -30,7 +30,7 @@
+ #ifndef gai_create_helper_thread
+ # define gai_create_helper_thread __gai_create_helper_thread
+ 
+-extern inline int
++__extern_inline int
+ __gai_create_helper_thread (pthread_t *threadp, void *(*tf) (void *),
+ 			    void *arg)
+ {
+--- libc/bits/mathinline.h.jj	1997-10-13 05:53:18.000000000 +0200
++++ libc/bits/mathinline.h	2006-11-07 10:51:05.000000000 +0100
+@@ -1,6 +1,6 @@
+ /* This file should provide inline versions of math functions.
+ 
+-   Surround GCC-specific parts with #ifdef __GNUC__, and use `extern __inline'.
++   Surround GCC-specific parts with #ifdef __GNUC__, and use `__extern_inline'.
+ 
+    This file should define __MATH_INLINES if functions are actually defined as
+    inlines.  */
+--- libc/bits/string.h.jj	1997-10-13 05:53:19.000000000 +0200
++++ libc/bits/string.h	2006-11-07 10:50:54.000000000 +0100
+@@ -1,6 +1,6 @@
+ /* This file should provide inline versions of string functions.
+ 
+-   Surround GCC-specific parts with #ifdef __GNUC__, and use `extern __inline'.
++   Surround GCC-specific parts with #ifdef __GNUC__, and use `__extern_inline'.
+ 
+    This file should define __STRING_INLINES if functions are actually defined
+    as inlines.  */
+--- libc/bits/sigset.h.jj	2001-07-06 06:55:50.000000000 +0200
++++ libc/bits/sigset.h	2006-11-07 11:19:08.000000000 +0100
+@@ -1,5 +1,6 @@
+ /* __sig_atomic_t, __sigset_t, and related definitions.  Generic/BSD version.
+-   Copyright (C) 1991, 1992, 1994, 1996, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1991, 1992, 1994, 1996, 1997, 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
+@@ -38,7 +39,7 @@ typedef unsigned long int __sigset_t;
+ #define _SIGSET_H_fns 1
+ 
+ #ifndef _EXTERN_INLINE
+-# define _EXTERN_INLINE extern __inline
++# define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Return a mask that includes SIG only.  The cast to `sigset_t' avoids
+--- libc/misc/sys/cdefs.h.jj	2006-01-14 21:14:36.000000000 +0100
++++ libc/misc/sys/cdefs.h	2006-11-06 21:00:45.000000000 +0100
+@@ -279,6 +279,18 @@
+ # define __always_inline __inline
+ #endif
+ 
++/* GCC 4.3 and above with -std=c99 or -std=gnu99 implements ISO C99
++   inline semantics.  */
++#if __GNUC_PREREQ (4,3) && defined (__STDC_VERSION__) \
++    && __STDC_VERSION__ >= 199901L
++# define __extern_inline extern __inline __attribute__ ((__gnu_inline__))
++# define __extern_always_inline \
++  extern __always_inline __inline __attribute__ ((__gnu_inline__))
++#else
++# define __extern_inline extern __inline
++# define __extern_always_inline extern __always_inline
++#endif
++
+ /* It is possible to compile containing GCC extensions even if GCC is
+    run in pedantic mode if the uses are carefully marked using the
+    `__extension__' keyword.  But this is not generally available before
+--- libc/libio/bits/stdio.h.jj	2004-09-08 00:23:44.000000000 +0200
++++ libc/libio/bits/stdio.h	2006-11-06 21:23:07.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Optimizing macros and inline functions for stdio functions.
+-   Copyright (C) 1998, 2000, 2001, 2004 Free Software Foundation, Inc.
++   Copyright (C) 1998, 2000, 2001, 2004, 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
+@@ -24,7 +24,7 @@
+ #ifdef __cplusplus
+ # define __STDIO_INLINE inline
+ #else
+-# define __STDIO_INLINE extern __inline
++# define __STDIO_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/libio/bits/stdio2.h.jj	2005-03-19 01:14:58.000000000 +0100
++++ libc/libio/bits/stdio2.h	2006-11-06 21:22:33.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Checking macros for stdio functions.
+-   Copyright (C) 2004, 2005 Free Software Foundation, Inc.
++   Copyright (C) 2004, 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
+@@ -75,7 +75,7 @@ extern int __vprintf_chk (int __flag, __
+ extern char *__gets_chk (char *__str, size_t) __wur;
+ extern char *__REDIRECT (__gets_alias, (char *__str), gets) __wur;
+ 
+-extern __always_inline __wur char *
++__extern_always_inline __wur char *
+ gets (char *__str)
+ {
+   if (__bos (__str) != (size_t) -1)
+@@ -89,7 +89,7 @@ extern char *__REDIRECT (__fgets_alias,
+ 			 (char *__restrict __s, int __n,
+ 			  FILE *__restrict __stream), fgets) __wur;
+ 
+-extern __always_inline __wur char *
++__extern_always_inline __wur char *
+ fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
+ {
+   if (__bos (__s) != (size_t) -1
+@@ -105,7 +105,7 @@ extern char *__REDIRECT (__fgets_unlocke
+ 			 (char *__restrict __s, int __n,
+ 			  FILE *__restrict __stream), fgets_unlocked) __wur;
+ 
+-extern __always_inline __wur char *
++__extern_always_inline __wur char *
+ fgets_unlocked (char *__restrict __s, int __n, FILE *__restrict __stream)
+ {
+   if (__bos (__s) != (size_t) -1
+--- libc/argp/argp.h.jj	2006-04-22 17:08:26.000000000 +0200
++++ libc/argp/argp.h	2006-11-06 21:24:08.000000000 +0100
+@@ -558,7 +558,7 @@ extern void *__argp_input (__const struc
+ # endif
+ 
+ # ifndef ARGP_EI
+-#  define ARGP_EI extern __inline__
++#  define ARGP_EI __extern_inline
+ # endif
+ 
+ ARGP_EI void
+--- libc/argp/argp-fmtstream.h.jj	2005-09-27 23:45:41.000000000 +0200
++++ libc/argp/argp-fmtstream.h	2006-11-07 11:19:12.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Word-wrapping and line-truncating streams.
+-   Copyright (C) 1997 Free Software Foundation, Inc.
++   Copyright (C) 1997, 2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Written by Miles Bader <miles@gnu.ai.mit.edu>.
+ 
+@@ -203,7 +203,7 @@ extern int __argp_fmtstream_ensure (argp
+ #endif
+ 
+ #ifndef ARGP_FS_EI
+-#define ARGP_FS_EI extern inline
++#define ARGP_FS_EI __extern_inline
+ #endif
+ 
+ ARGP_FS_EI size_t
+--- libc/locale/programs/locfile.c.jj	2006-05-10 04:12:39.000000000 +0200
++++ libc/locale/programs/locfile.c	2006-11-07 15:13:20.000000000 +0100
+@@ -33,6 +33,11 @@
+ #include "locfile.h"
+ #include "simple-hash.h"
+ 
++/* This prototype is needed to export locfile_hash from this object
++   when using ISO C99 inline semantics.  */
++struct keyword_t;
++const struct keyword_t *locfile_hash (const char *str, unsigned int len);
++
+ #include "locfile-kw.h"
+ 
+ 
+--- libc/locale/programs/charmap.c.jj	2006-08-19 19:50:52.000000000 +0200
++++ libc/locale/programs/charmap.c	2006-11-07 15:11:05.000000000 +0100
+@@ -35,6 +35,10 @@
+ 
+ #include <assert.h>
+ 
++/* This prototype is needed to export charmap_hash from this object
++   when using ISO C99 inline semantics.  */
++struct keyword_t;
++const struct keyword_t *charmap_hash (const char *str, unsigned int len);
+ 
+ /* Define the lookup function.  */
+ #include "charmap-kw.h"
+--- libc/io/sys/stat.h.jj	2006-01-06 13:14:05.000000000 +0100
++++ libc/io/sys/stat.h	2006-11-06 21:27:03.000000000 +0100
+@@ -430,28 +430,28 @@ extern int __xmknodat (int __ver, int __
+ #if defined __GNUC__ && __GNUC__ >= 2
+ /* Inlined versions of the real stat and mknod functions.  */
+ 
+-extern __inline__ int
++__extern_inline int
+ __NTH (stat (__const char *__path, struct stat *__statbuf))
+ {
+   return __xstat (_STAT_VER, __path, __statbuf);
+ }
+ 
+ # if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
+-extern __inline__ int
++__extern_inline int
+ __NTH (lstat (__const char *__path, struct stat *__statbuf))
+ {
+   return __lxstat (_STAT_VER, __path, __statbuf);
+ }
+ # endif
+ 
+-extern __inline__ int
++__extern_inline int
+ __NTH (fstat (int __fd, struct stat *__statbuf))
+ {
+   return __fxstat (_STAT_VER, __fd, __statbuf);
+ }
+ 
+ # ifdef __USE_ATFILE
+-extern __inline__ int
++__extern_inline int
+ __NTH (fstatat (int __fd, __const char *__filename, struct stat *__statbuf,
+ 		int __flag))
+ {
+@@ -460,7 +460,7 @@ __NTH (fstatat (int __fd, __const char *
+ # endif
+ 
+ # if defined __USE_MISC || defined __USE_BSD
+-extern __inline__ int
++__extern_inline int
+ __NTH (mknod (__const char *__path, __mode_t __mode, __dev_t __dev))
+ {
+   return __xmknod (_MKNOD_VER, __path, __mode, &__dev);
+@@ -468,7 +468,7 @@ __NTH (mknod (__const char *__path, __mo
+ # endif
+ 
+ # ifdef __USE_ATFILE
+-extern __inline__ int
++__extern_inline int
+ __NTH (mknodat (int __fd, __const char *__path, __mode_t __mode,
+ 		__dev_t __dev))
+ {
+@@ -479,28 +479,28 @@ __NTH (mknodat (int __fd, __const char *
+ # if defined __USE_LARGEFILE64 \
+   && (! defined __USE_FILE_OFFSET64 \
+       || (defined __REDIRECT_NTH && defined __OPTIMIZE__))
+-extern __inline__ int
++__extern_inline int
+ __NTH (stat64 (__const char *__path, struct stat64 *__statbuf))
+ {
+   return __xstat64 (_STAT_VER, __path, __statbuf);
+ }
+ 
+ #  if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
+-extern __inline__ int
++__extern_inline int
+ __NTH (lstat64 (__const char *__path, struct stat64 *__statbuf))
+ {
+   return __lxstat64 (_STAT_VER, __path, __statbuf);
+ }
+ #  endif
+ 
+-extern __inline__ int
++__extern_inline int
+ __NTH (fstat64 (int __fd, struct stat64 *__statbuf))
+ {
+   return __fxstat64 (_STAT_VER, __fd, __statbuf);
+ }
+ 
+ #  ifdef __USE_GNU
+-extern __inline__ int
++__extern_inline int
+ __NTH (fstatat64 (int __fd, __const char *__filename, struct stat64 *__statbuf,
+ 		  int __flag))
+ {
+--- libc/wcsmbs/wchar.h.jj	2006-09-27 17:56:30.000000000 +0200
++++ libc/wcsmbs/wchar.h	2006-11-06 21:28:28.000000000 +0100
+@@ -326,19 +326,19 @@ __END_NAMESPACE_C99
+    locales must use ASCII encoding for the values in the ASCII range
+    and because the wchar_t encoding is always ISO 10646.  */
+ extern wint_t __btowc_alias (int __c) __asm ("btowc");
+-extern __inline wint_t
++__extern_inline wint_t
+ __NTH (btowc (int __c))
+ { return (__builtin_constant_p (__c) && __c >= '\0' && __c <= '\x7f'
+ 	  ? (wint_t) __c : __btowc_alias (__c)); }
+ 
+ extern int __wctob_alias (wint_t __c) __asm ("wctob");
+-extern __inline int
++__extern_inline int
+ __NTH (wctob (wint_t __wc))
+ { return (__builtin_constant_p (__wc) && __wc >= L'\0' && __wc <= L'\x7f'
+ 	  ? (int) __wc : __wctob_alias (__wc)); }
+ # endif
+ 
+-extern __inline size_t
++__extern_inline size_t
+ __NTH (mbrlen (__const char *__restrict __s, size_t __n,
+ 	       mbstate_t *__restrict __ps))
+ { return (__ps != NULL
+@@ -548,38 +548,38 @@ extern unsigned long long int __wcstoull
+ /* Define inline functions which call the internal entry points.  */
+ __BEGIN_NAMESPACE_C99
+ 
+-extern __inline double
++__extern_inline double
+ __NTH (wcstod (__const wchar_t *__restrict __nptr,
+ 	       wchar_t **__restrict __endptr))
+ { return __wcstod_internal (__nptr, __endptr, 0); }
+-extern __inline long int
++__extern_inline long int
+ __NTH (wcstol (__const wchar_t *__restrict __nptr,
+ 	       wchar_t **__restrict __endptr, int __base))
+ { return __wcstol_internal (__nptr, __endptr, __base, 0); }
+-extern __inline unsigned long int
++__extern_inline unsigned long int
+ __NTH (wcstoul (__const wchar_t *__restrict __nptr,
+ 		wchar_t **__restrict __endptr, int __base))
+ { return __wcstoul_internal (__nptr, __endptr, __base, 0); }
+ __END_NAMESPACE_C99
+ 
+ # ifdef __USE_GNU
+-extern __inline float
++__extern_inline float
+ __NTH (wcstof (__const wchar_t *__restrict __nptr,
+ 	       wchar_t **__restrict __endptr))
+ { return __wcstof_internal (__nptr, __endptr, 0); }
+ #  ifndef __LDBL_COMPAT
+-extern __inline long double
++__extern_inline long double
+ __NTH (wcstold (__const wchar_t *__restrict __nptr,
+ 		wchar_t **__restrict __endptr))
+ { return __wcstold_internal (__nptr, __endptr, 0); }
+ #  endif
+ __extension__
+-extern __inline long long int
++__extern_inline long long int
+ __NTH (wcstoq (__const wchar_t *__restrict __nptr,
+ 	       wchar_t **__restrict __endptr, int __base))
+ { return __wcstoll_internal (__nptr, __endptr, __base, 0); }
+ __extension__
+-extern __inline unsigned long long int
++__extern_inline unsigned long long int
+ __NTH (wcstouq (__const wchar_t *__restrict __nptr,
+ 		wchar_t **__restrict __endptr, int __base))
+ { return __wcstoull_internal (__nptr, __endptr, __base, 0); }
+--- libc/wcsmbs/bits/wchar2.h.jj	2006-01-14 13:09:47.000000000 +0100
++++ libc/wcsmbs/bits/wchar2.h	2006-11-06 21:29:19.000000000 +0100
+@@ -30,7 +30,7 @@ extern wchar_t *__REDIRECT_NTH (__wmemcp
+ 				 __const wchar_t *__restrict __s2, size_t __n),
+ 				wmemcpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wmemcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
+ 		size_t __n))
+ {
+@@ -46,7 +46,7 @@ extern wchar_t *__REDIRECT_NTH (__wmemmo
+ 						   __const wchar_t *__s2,
+ 						   size_t __n), wmemmove);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wmemmove (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
+ 		 size_t __n))
+ {
+@@ -65,7 +65,7 @@ extern wchar_t *__REDIRECT_NTH (__wmempc
+ 				 __const wchar_t *__restrict __s2,
+ 				 size_t __n), wmempcpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wmempcpy (wchar_t *__restrict __s1, __const wchar_t *__restrict __s2,
+ 		 size_t __n))
+ {
+@@ -81,7 +81,7 @@ extern wchar_t *__wmemset_chk (wchar_t *
+ extern wchar_t *__REDIRECT_NTH (__wmemset_alias, (wchar_t *__s, wchar_t __c,
+ 						  size_t __n), wmemset);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wmemset (wchar_t *__restrict __s, wchar_t __c, size_t __n))
+ {
+   if (__bos0 (__s) != (size_t) -1)
+@@ -97,7 +97,7 @@ extern wchar_t *__REDIRECT_NTH (__wcscpy
+ 				(wchar_t *__restrict __dest,
+ 				 __const wchar_t *__restrict __src), wcscpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcscpy (wchar_t *__dest, __const wchar_t *__src))
+ {
+   if (__bos (__dest) != (size_t) -1)
+@@ -112,7 +112,7 @@ extern wchar_t *__REDIRECT_NTH (__wcpcpy
+ 						 __const wchar_t *__src),
+ 				wcpcpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcpcpy (wchar_t *__dest, __const wchar_t *__src))
+ {
+   if (__bos (__dest) != (size_t) -1)
+@@ -129,7 +129,7 @@ extern wchar_t *__REDIRECT_NTH (__wcsncp
+ 				 __const wchar_t *__restrict __src,
+ 				 size_t __n), wcsncpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcsncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
+ {
+   if (__bos (__dest) != (size_t) -1
+@@ -148,7 +148,7 @@ extern wchar_t *__REDIRECT_NTH (__wcpncp
+ 				 __const wchar_t *__restrict __src,
+ 				 size_t __n), wcpncpy);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcpncpy (wchar_t *__dest, __const wchar_t *__src, size_t __n))
+ {
+   if (__bos (__dest) != (size_t) -1
+@@ -166,7 +166,7 @@ extern wchar_t *__REDIRECT_NTH (__wcscat
+ 				(wchar_t *__restrict __dest,
+ 				 __const wchar_t *__restrict __src), wcscat);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcscat (wchar_t *__dest, __const wchar_t *__src))
+ {
+   if (__bos (__dest) != (size_t) -1)
+@@ -183,7 +183,7 @@ extern wchar_t *__REDIRECT_NTH (__wcsnca
+ 				 __const wchar_t *__restrict __src,
+ 				 size_t __n), wcsncat);
+ 
+-extern __always_inline wchar_t *
++__extern_always_inline wchar_t *
+ __NTH (wcsncat (wchar_t *__dest, __const wchar_t *__src, size_t __n))
+ {
+   if (__bos (__dest) != (size_t) -1)
+@@ -246,7 +246,7 @@ extern wchar_t *__REDIRECT (__fgetws_ali
+ 			    (wchar_t *__restrict __s, int __n,
+ 			     __FILE *__restrict __stream), fgetws) __wur;
+ 
+-extern __always_inline __wur wchar_t *
++__extern_always_inline __wur wchar_t *
+ fgetws (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
+ {
+   if (__bos (__s) != (size_t) -1
+@@ -264,7 +264,7 @@ extern wchar_t *__REDIRECT (__fgetws_unl
+ 			     __FILE *__restrict __stream), fgetws_unlocked)
+   __wur;
+ 
+-extern __always_inline __wur wchar_t *
++__extern_always_inline __wur wchar_t *
+ fgetws_unlocked (wchar_t *__restrict __s, int __n, __FILE *__restrict __stream)
+ {
+   if (__bos (__s) != (size_t) -1
+@@ -281,7 +281,7 @@ extern size_t __REDIRECT_NTH (__wcrtomb_
+ 			      (char *__restrict __s, wchar_t __wchar,
+ 			       mbstate_t *__restrict __ps), wcrtomb) __wur;
+ 
+-extern __always_inline __wur size_t
++__extern_always_inline __wur size_t
+ __NTH (wcrtomb (char *__s, wchar_t __wchar, mbstate_t *__ps))
+ {
+   /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.
+@@ -307,7 +307,7 @@ extern size_t __REDIRECT_NTH (__mbsrtowc
+ 			       size_t __len, mbstate_t *__restrict __ps),
+ 			      mbsrtowcs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (mbsrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src,
+ 		  size_t __len, mbstate_t *__restrict __ps))
+ {
+@@ -330,7 +330,7 @@ extern size_t __REDIRECT_NTH (__wcsrtomb
+ 			       size_t __len, mbstate_t *__restrict __ps),
+ 			      wcsrtombs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (wcsrtombs (char *__restrict __dst, __const wchar_t **__restrict __src,
+ 		  size_t __len, mbstate_t *__restrict __ps))
+ {
+@@ -352,7 +352,7 @@ extern size_t __REDIRECT_NTH (__mbsnrtow
+ 			       size_t __len, mbstate_t *__restrict __ps),
+ 			      mbsnrtowcs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (mbsnrtowcs (wchar_t *__restrict __dst, __const char **__restrict __src,
+ 		   size_t __nmc, size_t __len, mbstate_t *__restrict __ps))
+ {
+@@ -376,7 +376,7 @@ extern size_t __REDIRECT_NTH (__wcsnrtom
+ 			       size_t __nwc, size_t __len,
+ 			       mbstate_t *__restrict __ps), wcsnrtombs);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (wcsnrtombs (char *__restrict __dst, __const wchar_t **__restrict __src,
+ 		   size_t __nwc, size_t __len, mbstate_t *__restrict __ps))
+ {
+--- libc/socket/bits/socket2.h.jj	2005-08-08 21:00:53.000000000 +0200
++++ libc/socket/bits/socket2.h	2006-11-06 21:29:59.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Checking macros for socket functions.
+-   Copyright (C) 2005 Free Software Foundation, Inc.
++   Copyright (C) 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
+@@ -26,7 +26,7 @@ extern ssize_t __recv_chk (int __fd, voi
+ extern ssize_t __REDIRECT (__recv_alias, (int __fd, void *__buf, size_t __n,
+ 					  int __flags), recv);
+ 
+-extern __always_inline ssize_t
++__extern_always_inline ssize_t
+ recv (int __fd, void *__buf, size_t __n, int __flags)
+ {
+   if (__bos0 (__buf) != (size_t) -1
+@@ -44,7 +44,7 @@ extern ssize_t __REDIRECT (__recvfrom_al
+ 			    int __flags, __SOCKADDR_ARG __addr,
+ 			    socklen_t *__restrict __addr_len), recvfrom);
+ 
+-extern __always_inline ssize_t
++__extern_always_inline ssize_t
+ recvfrom (int __fd, void *__restrict __buf, size_t __n, int __flags,
+ 	  __SOCKADDR_ARG __addr, socklen_t *__restrict __addr_len)
+ {
+--- libc/posix/bits/unistd.h.jj	2006-08-24 08:47:31.000000000 +0200
++++ libc/posix/bits/unistd.h	2006-11-06 21:30:39.000000000 +0100
+@@ -26,7 +26,7 @@ extern ssize_t __read_chk (int __fd, voi
+ extern ssize_t __REDIRECT (__read_alias, (int __fd, void *__buf,
+ 					  size_t __nbytes), read) __wur;
+ 
+-extern __always_inline __wur ssize_t
++__extern_always_inline __wur ssize_t
+ read (int __fd, void *__buf, size_t __nbytes)
+ {
+   if (__bos0 (__buf) != (size_t) -1
+@@ -48,7 +48,7 @@ extern ssize_t __REDIRECT (__pread64_ali
+ 			    __off64_t __offset), pread64) __wur;
+ 
+ # ifndef __USE_FILE_OFFSET64
+-extern __always_inline __wur ssize_t
++__extern_always_inline __wur ssize_t
+ pread (int __fd, void *__buf, size_t __nbytes, __off_t __offset)
+ {
+   if (__bos0 (__buf) != (size_t) -1
+@@ -57,7 +57,7 @@ pread (int __fd, void *__buf, size_t __n
+   return __pread_alias (__fd, __buf, __nbytes, __offset);
+ }
+ # else
+-extern __always_inline __wur ssize_t
++__extern_always_inline __wur ssize_t
+ pread (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
+ {
+   if (__bos0 (__buf) != (size_t) -1
+@@ -68,7 +68,7 @@ pread (int __fd, void *__buf, size_t __n
+ # endif
+ 
+ # ifdef __USE_LARGEFILE64
+-extern __always_inline __wur ssize_t
++__extern_always_inline __wur ssize_t
+ pread64 (int __fd, void *__buf, size_t __nbytes, __off64_t __offset)
+ {
+   if (__bos0 (__buf) != (size_t) -1
+@@ -89,7 +89,7 @@ extern ssize_t __REDIRECT_NTH (__readlin
+ 				char *__restrict __buf, size_t __len), readlink)
+      __nonnull ((1, 2)) __wur;
+ 
+-extern __always_inline __nonnull ((1, 2)) __wur ssize_t
++__extern_always_inline __nonnull ((1, 2)) __wur ssize_t
+ __NTH (readlink (__const char *__restrict __path, char *__restrict __buf,
+ 		 size_t __len))
+ {
+@@ -111,7 +111,7 @@ extern ssize_t __REDIRECT_NTH (__readlin
+ 			       readlinkat)
+      __nonnull ((2, 3)) __wur;
+ 
+-extern __always_inline __nonnull ((2, 3)) __wur ssize_t
++__extern_always_inline __nonnull ((2, 3)) __wur ssize_t
+ __NTH (readlinkat (int __fd, __const char *__restrict __path,
+ 		   char *__restrict __buf, size_t __len))
+ {
+@@ -127,7 +127,7 @@ extern char *__getcwd_chk (char *__buf, 
+ extern char *__REDIRECT_NTH (__getcwd_alias,
+ 			     (char *__buf, size_t __size), getcwd) __wur;
+ 
+-extern __always_inline __wur char *
++__extern_always_inline __wur char *
+ __NTH (getcwd (char *__buf, size_t __size))
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -142,7 +142,7 @@ extern char *__getwd_chk (char *__buf, s
+ extern char *__REDIRECT_NTH (__getwd_alias, (char *__buf), getwd)
+      __nonnull ((1)) __wur;
+ 
+-extern __always_inline __nonnull ((1)) __attribute_deprecated__ __wur char *
++__extern_always_inline __nonnull ((1)) __attribute_deprecated__ __wur char *
+ __NTH (getwd (char *__buf))
+ {
+   if (__bos (__buf) != (size_t) -1)
+@@ -156,7 +156,7 @@ extern size_t __confstr_chk (int __name,
+ extern size_t __REDIRECT_NTH (__confstr_alias, (int __name, char *__buf,
+ 						size_t __len), confstr);
+ 
+-extern __always_inline size_t
++__extern_always_inline size_t
+ __NTH (confstr (int __name, char *__buf, size_t __len))
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -171,7 +171,7 @@ extern int __getgroups_chk (int __size, 
+ extern int __REDIRECT_NTH (__getgroups_alias, (int __size, __gid_t __list[]),
+ 			   getgroups) __wur;
+ 
+-extern __always_inline int
++__extern_always_inline int
+ __NTH (getgroups (int __size, __gid_t __list[]))
+ {
+   if (__bos (__list) != (size_t) -1
+@@ -188,7 +188,7 @@ extern int __REDIRECT_NTH (__ttyname_r_a
+ 					       size_t __buflen), ttyname_r)
+      __nonnull ((2));
+ 
+-extern __always_inline int
++__extern_always_inline int
+ __NTH (ttyname_r (int __fd, char *__buf, size_t __buflen))
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -204,7 +204,7 @@ extern int __getlogin_r_chk (char *__buf
+ extern int __REDIRECT (__getlogin_r_alias, (char *__buf, size_t __buflen),
+ 		       getlogin_r) __nonnull ((1));
+ 
+-extern __always_inline int
++__extern_always_inline int
+ getlogin_r (char *__buf, size_t __buflen)
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -221,7 +221,7 @@ extern int __gethostname_chk (char *__bu
+ extern int __REDIRECT_NTH (__gethostname_alias, (char *__buf, size_t __buflen),
+ 			   gethostname) __nonnull ((1));
+ 
+-extern __always_inline int
++__extern_always_inline int
+ __NTH (gethostname (char *__buf, size_t __buflen))
+ {
+   if (__bos (__buf) != (size_t) -1
+@@ -239,7 +239,7 @@ extern int __REDIRECT_NTH (__getdomainna
+ 						   size_t __buflen),
+ 			   getdomainname) __nonnull ((1)) __wur;
+ 
+-extern __always_inline int
++__extern_always_inline int
+ __NTH (getdomainname (char *__buf, size_t __buflen))
+ {
+   if (__bos (__buf) != (size_t) -1
+--- libc/string/bits/string3.h.jj	2005-08-08 21:02:31.000000000 +0200
++++ libc/string/bits/string3.h	2006-11-07 11:19:17.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 2004, 2005 Free Software Foundation, Inc.
++/* Copyright (C) 2004, 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
+@@ -151,7 +151,7 @@ extern char *__REDIRECT_NTH (__stpncpy_a
+ 					       __const char *__src,
+ 					       size_t __n), stpncpy);
+ 
+-extern __always_inline char *
++__extern_always_inline char *
+ __NTH (stpncpy (char *__dest, __const char *__src, size_t __n))
+ {
+   if (__bos (__dest) != (size_t) -1
+--- libc/string/bits/string2.h.jj	2004-05-28 08:39:13.000000000 +0200
++++ libc/string/bits/string2.h	2006-11-07 11:19:24.000000000 +0100
+@@ -0,0 +1,18 @@
++/*  DO NOT EDIT THIS FILE.
++
++    It has been auto-edited by fixincludes from:
++
++	"fixinc/tests/inc/bits/string2.h"
++
++    This had to be done to correct non-standard usages in the
++    original, manufacturer supplied header file.  */
++
++
++
++#if defined( GLIBC_C99_INLINE_3_CHECK )
++# if defined(__cplusplus) || __STDC_VERSION__ >= 19901L
++#  define __STRING_INLINE inline
++# else
++#  define __STRING_INLINE extern __inline
++# endif
++#endif  /* GLIBC_C99_INLINE_3_CHECK */
+@@ -1,5 +1,5 @@
+ /* Machine-independant string function optimizations.
+-   Copyright (C) 1997-2003, 2004 Free Software Foundation, Inc.
++   Copyright (C) 1997-2003, 2004, 2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
+ 
+@@ -43,7 +43,7 @@
+ # ifdef __cplusplus
+ #  define __STRING_INLINE inline
+ # else
+-#  define __STRING_INLINE extern __inline
++#  define __STRING_INLINE __extern_inline
+ # endif
+ #endif
+ 
+--- libc/string/argz.h.jj	2004-09-08 00:23:43.000000000 +0200
++++ libc/string/argz.h	2006-11-07 11:19:33.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Routines for dealing with '\0' separated arg vectors.
+-   Copyright (C) 1995,96,97,98,99,2000,2004 Free Software Foundation, Inc.
++   Copyright (C) 1995,96,97,98,99,2000,2004,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
+@@ -160,7 +160,7 @@ extern char *argz_next (__const char *__
+ 			__const char *__restrict __entry) __THROW;
+ 
+ #ifdef __USE_EXTERN_INLINES
+-extern inline char *
++__extern_inline char *
+ __NTH (__argz_next (__const char *__argz, size_t __argz_len,
+ 		    __const char *__entry))
+ {
+@@ -174,7 +174,7 @@ __NTH (__argz_next (__const char *__argz
+   else
+     return __argz_len > 0 ? (char *) __argz : 0;
+ }
+-extern inline char *
++__extern_inline char *
+ __NTH (argz_next (__const char *__argz, size_t __argz_len,
+ 		  __const char *__entry))
+ {
+--- libc/math/bits/cmathcalls.h.jj	2001-07-06 06:55:35.000000000 +0200
++++ libc/math/bits/cmathcalls.h	2006-11-07 11:19:39.000000000 +0100
+@@ -1,6 +1,6 @@
+ /* Prototype declarations for complex math functions;
+    helper file for <complex.h>.
+-   Copyright (C) 1997, 1998, 2001 Free Software Foundation, Inc.
++   Copyright (C) 1997, 1998, 2001, 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
+@@ -135,21 +135,21 @@ __MATHDECL (_Mdouble_,creal, (_Mdouble_c
+ #if defined __GNUC__ && !__GNUC_PREREQ (2, 97) && defined __OPTIMIZE__
+ 
+ /* Imaginary part of Z.  */
+-extern __inline _Mdouble_
++__extern_inline _Mdouble_
+ __MATH_PRECNAME(cimag) (_Mdouble_complex_ __z) __THROW
+ {
+   return __imag__ __z;
+ }
+ 
+ /* Real part of Z.  */
+-extern __inline _Mdouble_
++__extern_inline _Mdouble_
+ __MATH_PRECNAME(creal) (_Mdouble_complex_ __z) __THROW
+ {
+   return __real__ __z;
+ }
+ 
+ /* Complex conjugate of Z.  */
+-extern __inline _Mdouble_complex_
++__extern_inline _Mdouble_complex_
+ __MATH_PRECNAME(conj) (_Mdouble_complex_ __z) __THROW
+ {
+   return __extension__ ~__z;
+--- libc/math/math_private.h.jj	2005-11-21 16:43:03.000000000 +0100
++++ libc/math/math_private.h	2006-11-06 21:33:45.000000000 +0100
+@@ -192,7 +192,7 @@ extern int    __kernel_rem_pio2 (double*
+ extern double __copysign (double x, double __y);
+ 
+ #if __GNUC_PREREQ (4, 0)
+-extern inline double __copysign (double x, double y)
++__extern_inline double __copysign (double x, double y)
+ { return __builtin_copysign (x, y); }
+ #endif
+ 
+@@ -239,7 +239,7 @@ extern int   __kernel_rem_pio2f (float*,
+ extern float __copysignf (float x, float __y);
+ 
+ #if __GNUC_PREREQ (4, 0)
+-extern inline float __copysignf (float x, float y)
++__extern_inline float __copysignf (float x, float y)
+ { return __builtin_copysignf (x, y); }
+ #endif
+ 
+@@ -307,7 +307,7 @@ extern long double __logbl (long double 
+ extern long double __significandl (long double x);
+ 
+ #if __GNUC_PREREQ (4, 0)
+-extern inline long double __copysignl (long double x, long double y)
++__extern_inline long double __copysignl (long double x, long double y)
+ { return __builtin_copysignl (x, y); }
+ #endif
+ 
+--- libc/hurd/hurd.h.jj	2002-01-02 10:52:20.000000000 +0100
++++ libc/hurd/hurd.h	2006-11-07 11:19:51.000000000 +0100
+@@ -1,4 +1,5 @@
+-/* Copyright (C) 1993,94,95,96,97,98,99,2001,02 Free Software Foundation, Inc.
++/* Copyright (C) 1993,94,95,96,97,98,99,2001,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 and/or
+@@ -44,7 +45,7 @@
+ #include <errno.h>
+ 
+ #ifndef _HURD_H_EXTERN_INLINE
+-#define _HURD_H_EXTERN_INLINE extern __inline
++#define _HURD_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ _HURD_H_EXTERN_INLINE int
+--- libc/hurd/hurd/port.h.jj	2001-07-06 06:54:47.000000000 +0200
++++ libc/hurd/hurd/port.h	2006-11-07 11:19:58.000000000 +0100
+@@ -1,5 +1,6 @@
+ /* Lightweight user references for ports.
+-   Copyright (C) 1993, 1994, 1995, 1997, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1993, 1994, 1995, 1997, 1999, 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
+@@ -55,7 +56,7 @@ struct hurd_port
+ 
+ 
+ #ifndef _HURD_PORT_H_EXTERN_INLINE
+-#define _HURD_PORT_H_EXTERN_INLINE extern __inline
++#define _HURD_PORT_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/hurd/hurd/threadvar.h.jj	2002-09-02 09:08:53.000000000 +0200
++++ libc/hurd/hurd/threadvar.h	2006-11-07 10:54:40.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Internal per-thread variables for the Hurd.
+-   Copyright (C) 1994,95,97,98,99,2001,02 Free Software Foundation, Inc.
++   Copyright (C) 1994,95,97,98,99,2001,02,06 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
+@@ -74,7 +74,7 @@ enum __hurd_threadvar_index
+ 
+ 
+ #ifndef _HURD_THREADVAR_H_EXTERN_INLINE
+-#define _HURD_THREADVAR_H_EXTERN_INLINE extern __inline
++#define _HURD_THREADVAR_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Return the location of the value for the per-thread variable with index
+--- libc/hurd/hurd/fd.h.jj	2006-03-06 08:59:07.000000000 +0100
++++ libc/hurd/hurd/fd.h	2006-11-07 10:53:18.000000000 +0100
+@@ -52,7 +52,7 @@ extern struct mutex _hurd_dtable_lock; /
+ #include <hurd/signal.h>
+ 
+ #ifndef _HURD_FD_H_EXTERN_INLINE
+-#define _HURD_FD_H_EXTERN_INLINE extern __inline
++#define _HURD_FD_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Returns the descriptor cell for FD.  If FD is invalid or unused, return
+--- libc/hurd/hurd/signal.h.jj	2002-02-18 21:57:11.000000000 +0100
++++ libc/hurd/hurd/signal.h	2006-11-07 10:54:13.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Implementing POSIX.1 signals under the Hurd.
+-   Copyright (C) 1993,94,95,96,98,99,2002 Free Software Foundation, Inc.
++   Copyright (C) 1993,94,95,96,98,99,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 and/or
+@@ -126,7 +126,7 @@ extern struct hurd_sigstate *_hurd_self_
+      __attribute__ ((__const__));
+ 
+ #ifndef _HURD_SIGNAL_H_EXTERN_INLINE
+-#define _HURD_SIGNAL_H_EXTERN_INLINE extern __inline
++#define _HURD_SIGNAL_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ _HURD_SIGNAL_H_EXTERN_INLINE struct hurd_sigstate *
+--- libc/hurd/hurd/userlink.h.jj	2001-07-06 06:54:47.000000000 +0200
++++ libc/hurd/hurd/userlink.h	2006-11-07 10:53:37.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Support for chains recording users of a resource; `struct hurd_userlink'.
+-   Copyright (C) 1994, 1995, 1997, 1999 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1995, 1997, 1999, 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
+@@ -71,7 +71,7 @@ struct hurd_userlink
+ 
+ 
+ #ifndef _HURD_USERLINK_H_EXTERN_INLINE
+-#define _HURD_USERLINK_H_EXTERN_INLINE extern __inline
++#define _HURD_USERLINK_H_EXTERN_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/sysdeps/mach/alpha/machine-sp.h.jj	2001-07-06 06:55:56.000000000 +0200
++++ libc/sysdeps/mach/alpha/machine-sp.h	2006-11-07 10:55:42.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific function to return the stack pointer.  Alpha version.
+-   Copyright (C) 1994, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1997, 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
+@@ -23,7 +23,7 @@
+ /* Return the current stack pointer.  */
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ _EXTERN_INLINE void *
+--- libc/sysdeps/mach/alpha/machine-lock.h.jj	2003-02-26 01:01:15.000000000 +0100
++++ libc/sysdeps/mach/alpha/machine-lock.h	2006-11-07 11:20:04.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific definition for spin locks.  Alpha version.
+-   Copyright (C) 1994, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1997, 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
+@@ -30,7 +30,7 @@ typedef __volatile long int __spin_lock_
+ 
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Unlock LOCK.  */
+--- libc/sysdeps/mach/i386/machine-lock.h.jj	2001-07-06 06:56:00.000000000 +0200
++++ libc/sysdeps/mach/i386/machine-lock.h	2006-11-07 10:56:10.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific definition for spin locks.  i386 version.
+-   Copyright (C) 1994, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1997, 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
+@@ -30,7 +30,7 @@ typedef __volatile int __spin_lock_t;
+ 
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Unlock LOCK.  */
+--- libc/sysdeps/mach/powerpc/machine-sp.h.jj	2002-08-27 00:39:44.000000000 +0200
++++ libc/sysdeps/mach/powerpc/machine-sp.h	2006-11-07 10:56:59.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific function to return the stack pointer.  PowerPC version.
+-   Copyright (C) 2001 Free Software Foundation, Inc.
++   Copyright (C) 2001, 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
+@@ -27,7 +27,7 @@
+ # ifdef _HURD_THREADVAR_H_EXTERN_INLINE
+ #  define _EXTERN_INLINE _HURD_THREADVAR_H_EXTERN_INLINE
+ # else
+-#  define _EXTERN_INLINE extern __inline
++#  define _EXTERN_INLINE __extern_inline
+ # endif
+ #endif
+ 
+--- libc/sysdeps/mach/powerpc/machine-lock.h.jj	2002-02-17 08:13:25.000000000 +0100
++++ libc/sysdeps/mach/powerpc/machine-lock.h	2006-11-07 10:56:40.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific definition for spin locks.  PowerPC version.
+-   Copyright (C) 1994,97,2002 Free Software Foundation, Inc.
++   Copyright (C) 1994,97,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 and/or
+@@ -30,7 +30,7 @@ typedef __volatile long int __spin_lock_
+ 
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Unlock LOCK.  */
+--- libc/sysdeps/alpha/fpu/bits/mathinline.h.jj	2005-02-08 05:37:48.000000000 +0100
++++ libc/sysdeps/alpha/fpu/bits/mathinline.h	2006-11-07 10:59:08.000000000 +0100
+@@ -1,5 +1,6 @@
+ /* Inline math functions for Alpha.
+-   Copyright (C) 1996, 1997, 1999-2001, 2004 Free Software Foundation, Inc.
++   Copyright (C) 1996, 1997, 1999-2001, 2004, 2006
++   Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by David Mosberger-Tang.
+ 
+@@ -25,7 +26,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif
+ 
+ #if defined __USE_ISOC99 && defined __GNUC__ && !__GNUC_PREREQ(3,0)
+--- libc/sysdeps/ia64/fpu/bits/mathinline.h.jj	2004-09-08 23:44:02.000000000 +0200
++++ libc/sysdeps/ia64/fpu/bits/mathinline.h	2006-11-07 10:59:49.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Inline math functions for ia64.
+-   Copyright (C) 2004 Free Software Foundation, Inc.
++   Copyright (C) 2004, 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
+@@ -24,7 +24,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif
+ 
+ #if defined __USE_ISOC99 && defined __GNUC__ && __GNUC__ >= 2
+--- libc/sysdeps/i386/fpu/bits/mathinline.h.jj	2004-09-08 00:23:42.000000000 +0200
++++ libc/sysdeps/i386/fpu/bits/mathinline.h	2006-11-07 11:00:56.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Inline math functions for i387.
+-   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004
++   Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2006
+    Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by John C. Bowman <bowman@math.ualberta.ca>, 1995.
+@@ -26,7 +26,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/sysdeps/i386/i486/bits/string.h.jj	2004-12-15 21:30:16.000000000 +0100
++++ libc/sysdeps/i386/i486/bits/string.h	2006-11-07 11:01:34.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Optimized, inlined string functions.  i486 version.
+-   Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004
++   Copyright (C) 1997,1998,1999,2000,2001,2002,2003,2004,2006
+    	Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+ 
+@@ -35,7 +35,7 @@
+ # ifdef __cplusplus
+ #  define __STRING_INLINE inline
+ # else
+-#  define __STRING_INLINE extern __inline
++#  define __STRING_INLINE __extern_inline
+ # endif
+ #endif
+ 
+--- libc/sysdeps/generic/inttypes.h.jj	2004-09-08 00:23:42.000000000 +0200
++++ libc/sysdeps/generic/inttypes.h	2006-11-07 11:02:59.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1997-2001, 2004 Free Software Foundation, Inc.
++/* Copyright (C) 1997-2001, 2004, 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
+@@ -330,7 +330,7 @@ extern long int __strtol_internal (__con
+ 				   int __base, int __group) __THROW;
+ #   define __strtol_internal_defined	1
+ #  endif
+-extern __inline intmax_t
++__extern_inline intmax_t
+ __NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr,
+ 		  int base))
+ {
+@@ -345,7 +345,7 @@ extern unsigned long int __strtoul_inter
+ 					     int __base, int __group) __THROW;
+ #   define __strtoul_internal_defined	1
+ #  endif
+-extern __inline uintmax_t
++__extern_inline uintmax_t
+ __NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr,
+ 		  int base))
+ {
+@@ -359,7 +359,7 @@ extern long int __wcstol_internal (__con
+ 				   int __base, int __group) __THROW;
+ #   define __wcstol_internal_defined	1
+ #  endif
+-extern __inline intmax_t
++__extern_inline intmax_t
+ __NTH (wcstoimax (__const __gwchar_t *__restrict nptr,
+ 		  __gwchar_t **__restrict endptr, int base))
+ {
+@@ -376,7 +376,7 @@ extern unsigned long int __wcstoul_inter
+ 					     int __base, int __group) __THROW;
+ #   define __wcstoul_internal_defined	1
+ #  endif
+-extern __inline uintmax_t
++__extern_inline uintmax_t
+ __NTH (wcstoumax (__const __gwchar_t *__restrict nptr,
+ 		  __gwchar_t **__restrict endptr, int base))
+ {
+@@ -393,7 +393,7 @@ extern long long int __strtoll_internal 
+ 					 int __base, int __group) __THROW;
+ #   define __strtoll_internal_defined	1
+ #  endif
+-extern __inline intmax_t
++__extern_inline intmax_t
+ __NTH (strtoimax (__const char *__restrict nptr, char **__restrict endptr,
+ 		  int base))
+ {
+@@ -411,7 +411,7 @@ extern unsigned long long int __strtoull
+ 						   int __group) __THROW;
+ #   define __strtoull_internal_defined	1
+ #  endif
+-extern __inline uintmax_t
++__extern_inline uintmax_t
+ __NTH (strtoumax (__const char *__restrict nptr, char **__restrict endptr,
+ 		  int base))
+ {
+@@ -427,7 +427,7 @@ extern long long int __wcstoll_internal 
+ 					 int __base, int __group) __THROW;
+ #   define __wcstoll_internal_defined	1
+ #  endif
+-extern __inline intmax_t
++__extern_inline intmax_t
+ __NTH (wcstoimax (__const __gwchar_t *__restrict nptr,
+ 		  __gwchar_t **__restrict endptr, int base))
+ {
+@@ -446,7 +446,7 @@ extern unsigned long long int __wcstoull
+ 						   int __group) __THROW;
+ #   define __wcstoull_internal_defined	1
+ #  endif
+-extern __inline uintmax_t
++__extern_inline uintmax_t
+ __NTH (wcstoumax (__const __gwchar_t *__restrict nptr,
+ 		  __gwchar_t **__restrict endptr, int base))
+ {
+--- libc/sysdeps/generic/machine-sp.h.jj	2001-07-06 06:55:49.000000000 +0200
++++ libc/sysdeps/generic/machine-sp.h	2006-11-07 11:06:02.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific function to return the stack pointer.  Stub version.
+-   Copyright (C) 1994, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1997, 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
+@@ -23,7 +23,7 @@
+ /* Return the current stack pointer.  */
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ _EXTERN_INLINE void *
+--- libc/sysdeps/generic/machine-lock.h.jj	2001-07-06 06:55:49.000000000 +0200
++++ libc/sysdeps/generic/machine-lock.h	2006-11-07 11:02:08.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Machine-specific definition for spin locks.  Stub version.
+-   Copyright (C) 1994, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1994, 1997, 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
+@@ -30,7 +30,7 @@ typedef volatile int __spin_lock_t;
+ 
+ 
+ #ifndef _EXTERN_INLINE
+-#define _EXTERN_INLINE extern __inline
++#define _EXTERN_INLINE __extern_inline
+ #endif
+ 
+ /* Unlock LOCK.  */
+--- libc/sysdeps/generic/allocalim.h.jj	2002-10-09 11:19:59.000000000 +0200
++++ libc/sysdeps/generic/allocalim.h	2006-11-07 11:03:22.000000000 +0100
+@@ -1,4 +1,4 @@
+-extern inline int __libc_use_alloca (size_t size)
++__extern_inline int __libc_use_alloca (size_t size)
+ {
+   return size <= __MAX_ALLOCA_CUTOFF;
+ }
+--- libc/sysdeps/pthread/aio_misc.c.jj	2006-01-04 00:12:54.000000000 +0100
++++ libc/sysdeps/pthread/aio_misc.c	2006-11-07 11:06:31.000000000 +0100
+@@ -33,7 +33,7 @@
+ #ifndef aio_create_helper_thread
+ # define aio_create_helper_thread __aio_create_helper_thread
+ 
+-extern inline int
++__extern_inline int
+ __aio_create_helper_thread (pthread_t *threadp, void *(*tf) (void *), void *arg)
+ {
+   pthread_attr_t attr;
+--- libc/sysdeps/s390/bits/string.h.jj	2005-01-28 22:44:42.000000000 +0100
++++ libc/sysdeps/s390/bits/string.h	2006-11-07 11:07:05.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Optimized, inlined string functions.  S/390 version.
+-   Copyright (C) 2000, 2001 Free Software Foundation, Inc.
++   Copyright (C) 2000, 2001, 2006 Free Software Foundation, Inc.
+    Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com).
+    This file is part of the GNU C Library.
+ 
+@@ -34,7 +34,7 @@
+ # ifdef __cplusplus
+ #  define __STRING_INLINE inline
+ # else
+-#  define __STRING_INLINE extern __inline
++#  define __STRING_INLINE __extern_inline
+ # endif
+ #endif
+ 
+--- libc/sysdeps/s390/fpu/bits/mathinline.h.jj	2006-02-01 04:00:20.000000000 +0100
++++ libc/sysdeps/s390/fpu/bits/mathinline.h	2006-11-07 11:07:37.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Inline math functions for s390.
+-   Copyright (C) 2004 Free Software Foundation, Inc.
++   Copyright (C) 2004, 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
+@@ -24,7 +24,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif
+ 
+ #if (!defined __NO_MATH_INLINES || defined __LIBC_INTERNAL_MATH_INLINES) \
+--- libc/sysdeps/powerpc/fpu/bits/mathinline.h.jj	2006-11-06 20:53:15.000000000 +0100
++++ libc/sysdeps/powerpc/fpu/bits/mathinline.h	2006-11-07 11:08:04.000000000 +0100
+@@ -25,7 +25,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif  /* __cplusplus */
+ 
+ #if defined __GNUC__ && !defined _SOFT_FLOAT
+--- libc/sysdeps/x86_64/fpu/bits/mathinline.h.jj	2004-09-08 00:18:59.000000000 +0200
++++ libc/sysdeps/x86_64/fpu/bits/mathinline.h	2006-11-07 11:10:33.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* Inline math functions for x86-64.
+-   Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
++   Copyright (C) 2002, 2003, 2004, 2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by Andreas Jaeger <aj@suse.de>, 2002.
+ 
+@@ -25,7 +25,7 @@
+ #ifdef __cplusplus
+ # define __MATH_INLINE __inline
+ #else
+-# define __MATH_INLINE extern __inline
++# define __MATH_INLINE __extern_inline
+ #endif
+ 
+ 
+--- libc/sysdeps/sparc/fpu/bits/mathinline.h.jj	2006-01-14 13:09:02.000000000 +0100
++++ libc/sysdeps/sparc/fpu/bits/mathinline.h	2006-11-07 11:10:57.000000000 +0100
+@@ -131,7 +131,7 @@
+ # ifdef __cplusplus
+ #  define __MATH_INLINE __inline
+ # else
+-#  define __MATH_INLINE extern __inline
++#  define __MATH_INLINE __extern_inline
+ # endif  /* __cplusplus */
+ 
+ /* The gcc, version 2.7 or below, has problems with all this inlining
+--- libc/sysdeps/unix/bsd/bsd4.4/bits/socket.h.jj	2004-09-11 18:28:10.000000000 +0200
++++ libc/sysdeps/unix/bsd/bsd4.4/bits/socket.h	2006-11-07 11:12:07.000000000 +0100
+@@ -1,5 +1,5 @@
+ /* System-specific socket constants and types.  4.4 BSD version.
+-   Copyright (C) 1991,92,1994-2002,2004 Free Software Foundation, Inc.
++   Copyright (C) 1991,92,1994-2002,2004,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
+@@ -227,7 +227,7 @@ extern struct cmsghdr *__cmsg_nxthdr (st
+ 				      struct cmsghdr *__cmsg) __THROW;
+ #ifdef __USE_EXTERN_INLINES
+ # ifndef _EXTERN_INLINE
+-#  define _EXTERN_INLINE extern __inline
++#  define _EXTERN_INLINE __extern_inline
+ # endif
+ _EXTERN_INLINE struct cmsghdr *
+ __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
+--- libc/sysdeps/unix/sysv/linux/ia64/ioperm.c.jj	2004-03-18 00:17:58.000000000 +0100
++++ libc/sysdeps/unix/sysv/linux/ia64/ioperm.c	2006-11-07 11:13:23.000000000 +0100
+@@ -1,4 +1,4 @@
+-/* Copyright (C) 1999, 2000, 2001, 2004 Free Software Foundation, Inc.
++/* Copyright (C) 1999, 2000, 2001, 2004, 2006 Free Software Foundation, Inc.
+    This file is part of the GNU C Library.
+    Contributed by David Mosberger-Tang <davidm@hpl.hp.com>.
+ 
+@@ -51,7 +51,7 @@ static struct
+   }
+ io;
+ 
+-__inline__ unsigned long int
++static __always_inline unsigned long int
+ io_offset (unsigned long int port)
+ {
+ 	return ((port >> 2) << 12) | (port & 0xfff);
+--- libc/sysdeps/unix/sysv/linux/bits/socket.h.jj	2006-04-02 19:25:37.000000000 +0200
++++ libc/sysdeps/unix/sysv/linux/bits/socket.h	2006-11-07 11:15:04.000000000 +0100
+@@ -264,7 +264,7 @@ extern struct cmsghdr *__cmsg_nxthdr (st
+ 				      struct cmsghdr *__cmsg) __THROW;
+ #ifdef __USE_EXTERN_INLINES
+ # ifndef _EXTERN_INLINE
+-#  define _EXTERN_INLINE extern __inline
++#  define _EXTERN_INLINE __extern_inline
+ # endif
+ _EXTERN_INLINE struct cmsghdr *
+ __NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
+--- libc/sysdeps/unix/sysv/linux/bits/sigset.h.jj	2001-07-06 06:56:14.000000000 +0200
++++ libc/sysdeps/unix/sysv/linux/bits/sigset.h	2006-11-07 11:14:48.000000000 +0100
+@@ -1,5 +1,6 @@
+ /* __sig_atomic_t, __sigset_t, and related definitions.  Linux version.
+-   Copyright (C) 1991, 1992, 1994, 1996, 1997 Free Software Foundation, Inc.
++   Copyright (C) 1991, 1992, 1994, 1996, 1997, 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
+@@ -43,7 +44,7 @@ typedef struct
+ # define _SIGSET_H_fns 1
+ 
+ # ifndef _EXTERN_INLINE
+-#  define _EXTERN_INLINE extern __inline
++#  define _EXTERN_INLINE __extern_inline
+ # endif
+ 
+ /* Return a mask that includes the bit for SIG only.  */
+--- libc/sysdeps/unix/sysv/linux/sys/sysmacros.h.jj	2004-09-08 00:18:59.000000000 +0200
++++ libc/sysdeps/unix/sysv/linux/sys/sysmacros.h	2006-11-07 11:15:53.000000000 +0100
+@@ -0,0 +1,18 @@
++/*  DO NOT EDIT THIS FILE.
++
++    It has been auto-edited by fixincludes from:
++
++	"fixinc/tests/inc/sys/sysmacros.h"
++
++    This had to be done to correct non-standard usages in the
++    original, manufacturer supplied header file.  */
++
++
++
++#if defined( GLIBC_C99_INLINE_4_CHECK )
++__extension__ 
++#if __STDC_VERSION__ < 19901L
++extern
++#endif
++ __inline unsigned int
++#endif  /* GLIBC_C99_INLINE_4_CHECK */
+@@ -1,5 +1,6 @@
+ /* Definitions of macros to access `dev_t' values.
+-   Copyright (C) 1996, 1997, 1999, 2003, 2004 Free Software Foundation, Inc.
++   Copyright (C) 1996, 1997, 1999, 2003, 2004, 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
+@@ -27,30 +28,30 @@
+    they need.  */
+ #ifdef __GLIBC_HAVE_LONG_LONG
+ __extension__
+-extern __inline unsigned int gnu_dev_major (unsigned long long int __dev)
++__extern_inline unsigned int gnu_dev_major (unsigned long long int __dev)
+      __THROW;
+ __extension__
+-extern __inline unsigned int gnu_dev_minor (unsigned long long int __dev)
++__extern_inline unsigned int gnu_dev_minor (unsigned long long int __dev)
+      __THROW;
+ __extension__
+-extern __inline unsigned long long int gnu_dev_makedev (unsigned int __major,
++__extern_inline unsigned long long int gnu_dev_makedev (unsigned int __major,
+ 							unsigned int __minor)
+      __THROW;
+ 
+ # if defined __GNUC__ && __GNUC__ >= 2
+-__extension__ extern __inline unsigned int
++__extension__ __extern_inline unsigned int
+ __NTH (gnu_dev_major (unsigned long long int __dev))
+ {
+   return ((__dev >> 8) & 0xfff) | ((unsigned int) (__dev >> 32) & ~0xfff);
+ }
+ 
+-__extension__ extern __inline unsigned int
++__extension__ __extern_inline unsigned int
+ __NTH (gnu_dev_minor (unsigned long long int __dev))
+ {
+   return (__dev & 0xff) | ((unsigned int) (__dev >> 12) & ~0xff);
+ }
+ 
+-__extension__ extern __inline unsigned long long int
++__extension__ __extern_inline unsigned long long int
+ __NTH (gnu_dev_makedev (unsigned int __major, unsigned int __minor))
+ {
+   return ((__minor & 0xff) | ((__major & 0xfff) << 8)
diff --git a/pkgs/development/libraries/glibc/2.5/glibc-pwd.patch b/pkgs/development/libraries/glibc/2.5/glibc-pwd.patch
new file mode 100644
index 000000000000..07039718477f
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/glibc-pwd.patch
@@ -0,0 +1,74 @@
+diff -ruN glibc-20050110/configure glibc-20050110.patched/configure
+--- glibc-20050110/configure	2005-01-05 10:39:53.000000000 +0100
++++ glibc-20050110.patched/configure	2005-01-18 13:33:01.000000000 +0100
+@@ -1393,7 +1393,7 @@
+ ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+ 
+ 
+-if test "`cd $srcdir; /bin/pwd`" = "`/bin/pwd`"; then
++if test "`cd $srcdir; @PWD@`" = "`@PWD@`"; then
+   { { echo "$as_me:$LINENO: error: you must configure in a separate build directory" >&5
+ echo "$as_me: error: you must configure in a separate build directory" >&2;}
+    { (exit 1); exit 1; }; }
+diff -ruN glibc-20050110/io/ftwtest-sh glibc-20050110.patched/io/ftwtest-sh
+--- glibc-20050110/io/ftwtest-sh	2004-02-09 21:12:23.000000000 +0100
++++ glibc-20050110.patched/io/ftwtest-sh	2005-01-18 13:33:15.000000000 +0100
+@@ -120,7 +120,7 @@
+     sort > $testout
+ 
+ # perhaps $tmp involves some symlinks...
+-tmpreal=`cd $tmp; /bin/pwd 2>/dev/null || /usr/bin/pwd`
++tmpreal=`cd $tmp; @PWD@ 2>/dev/null || /usr/bin/pwd`
+ 
+ cat <<EOF | cmp $testout - || exit 1
+ base = "$tmp/", file = "ftwtest.d", flag = FTW_D, cwd = $tmpreal, level = 0
+@@ -138,7 +138,7 @@
+ EOF
+ rm $testout
+ 
+-curwd=`/bin/pwd 2>/dev/null || /usr/bin/pwd`
++curwd=`@PWD@ 2>/dev/null || /usr/bin/pwd`
+ cd "$tmp"
+ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir ftwtest.d |
+     sort > $testout
+@@ -160,7 +160,7 @@
+ EOF
+ rm $testout
+ 
+-curwd=`/bin/pwd 2>/dev/null || /usr/bin/pwd`
++curwd=`@PWD@ 2>/dev/null || /usr/bin/pwd`
+ cd "$tmp"
+ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir ftwtest.d/. |
+     sort > $testout
+@@ -182,7 +182,7 @@
+ EOF
+ rm $testout
+ 
+-curwd=`/bin/pwd 2>/dev/null || /usr/bin/pwd`
++curwd=`@PWD@ 2>/dev/null || /usr/bin/pwd`
+ cd "$tmp"
+ LD_LIBRARY_PATH=$objpfx $ldso $testprogram --chdir ftwtest.d/foo/lvl1/link@1 |
+     sort > $testout
+diff -ruN glibc-20050110/scripts/rellns-sh glibc-20050110.patched/scripts/rellns-sh
+--- glibc-20050110/scripts/rellns-sh	1999-12-19 00:40:25.000000000 +0100
++++ glibc-20050110.patched/scripts/rellns-sh	2005-01-18 13:35:53.245937423 +0100
+@@ -22,13 +22,13 @@
+   exit 1
+ fi
+ 
+-if test -x /bin/pwd; then
+-  pwd=/bin/pwd
+-elif test -x /usr/bin/pwd; then
+-  pwd=/usr/bin/pwd
+-else
++#if test -x /bin/pwd; then
++#  pwd=/bin/pwd
++#elif test -x /usr/bin/pwd; then
++#  pwd=/usr/bin/pwd
++#else
+   pwd='pwd'
+-fi
++#fi
+ 
+ # Make both paths absolute.
+ if test -d $1; then
diff --git a/pkgs/development/libraries/glibc/2.5/make-3-82-fix.patch b/pkgs/development/libraries/glibc/2.5/make-3-82-fix.patch
new file mode 100644
index 000000000000..816e0aa528be
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/make-3-82-fix.patch
@@ -0,0 +1,14 @@
+--- glibc-2.5/manual/Makefile.orig	2011-01-26 17:03:14.000000000 +0100
++++ glibc-2.5/manual/Makefile	2011-01-26 17:04:30.000000000 +0100
+@@ -232,7 +232,10 @@
+ .PHONY: stubs
+ stubs: $(objpfx)stubs
+ endif
+-$(objpfx)stubs ../po/manual.pot $(objpfx)stamp%:
++$(objpfx)stubs ../po/manual.pot:
++	$(make-target-directory)
++	touch $@
++$(objpfx)stamp%:
+ 	$(make-target-directory)
+ 	touch $@
+ 
diff --git a/pkgs/development/libraries/glibc/2.5/x86-fnstsw.patch b/pkgs/development/libraries/glibc/2.5/x86-fnstsw.patch
new file mode 100644
index 000000000000..45deb1d2d719
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.5/x86-fnstsw.patch
@@ -0,0 +1,32 @@
+# --- T2-COPYRIGHT-NOTE-BEGIN ---
+# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
+# 
+# T2 SDE: package/.../glibc/x86-fnstsw.patch
+# Copyright (C) 2008 The T2 SDE Project
+# 
+# More information can be found in the files COPYING and README.
+# 
+# This patch file is dual-licensed. It is available under the license the
+# patched project is licensed under, as long as it is an OpenSource license
+# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms
+# of the GNU General Public License as published by the Free Software
+# Foundation; either version 2 of the License, or (at your option) any later
+# version.
+# --- T2-COPYRIGHT-NOTE-END ---
+
+Fix more strict checking in binutils since 2.18.50.0.3:
+  sysdeps/i386/fpu/ftestexcept.c:33: Error: suffix or operands invalid for `fnstsw'
+
+  - Rene Rebe <rene@exactcode.de>
+
+--- glibc-2.6.1/sysdeps/i386/fpu/ftestexcept.c.vanilla	2008-09-02 12:45:07.000000000 +0200
++++ glibc-2.6.1/sysdeps/i386/fpu/ftestexcept.c	2008-09-02 12:46:37.000000000 +0200
+@@ -26,7 +26,7 @@
+ int
+ fetestexcept (int excepts)
+ {
+-  int temp;
++  short temp;
+   int xtemp = 0;
+ 
+   /* Get current exceptions.  */
diff --git a/pkgs/development/libraries/glibc/2.7/builder.sh b/pkgs/development/libraries/glibc/2.7/builder.sh
new file mode 100644
index 000000000000..d5a43229bfaf
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.7/builder.sh
@@ -0,0 +1,60 @@
+# glibc cannot have itself in its rpath.
+export NIX_NO_SELF_RPATH=1
+export NIX_DONT_SET_RPATH=1
+
+source $stdenv/setup
+
+# Explicitly tell glibc to use our pwd, not /bin/pwd.
+export PWD_P=$(type -tP pwd)
+
+# Needed to install share/zoneinfo/zone.tab.
+export BASH_SHELL=$SHELL
+
+
+preConfigure() {
+
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    # In the glibc 2.6/2.7 tarballs C-translit.h is a little bit older
+    # than C-translit.h.in, forcing Make to rebuild it unnecessarily.
+    # This wouldn't be problem except that it requires Perl, which we
+    # don't want as a dependency in the Nixpkgs bootstrap.  So force
+    # the output file to be newer.
+    touch locale/C-translit.h
+    
+    mkdir ../build
+    cd ../build
+    
+    configureScript=../$sourceRoot/configure
+}
+
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make localedata/install-locales
+    fi
+    rm $out/etc/ld.so.cache
+    (cd $out/include && ln -s $kernelHeaders/include/* .) || exit 1
+
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.7/default.nix b/pkgs/development/libraries/glibc/2.7/default.nix
new file mode 100644
index 000000000000..7eb34e88899a
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.7/default.nix
@@ -0,0 +1,57 @@
+{ stdenv, fetchurl, kernelHeaders
+, installLocales ? true
+, profilingLibraries ? false
+}:
+
+stdenv.mkDerivation {
+  name = "glibc-2.7";
+  builder = ./builder.sh;
+
+  src = fetchurl {
+    url = mirror://gnu/glibc/glibc-2.7.tar.bz2;
+    sha256 = "06j5q20l11x8kcrl9bg15xgb1pw0w82pazikxf4zvq2fmhiaa922";
+  };
+
+  inherit kernelHeaders installLocales;
+
+  inherit (stdenv) is64bit;
+
+  patches = [
+    /* Fix for NIXPKGS-79: when doing host name lookups, when
+       nsswitch.conf contains a line like
+       
+         hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       don't return an error when mdns4_minimal can't be found.  This
+       is a bug in Glibc: when a service can't be found, NSS should
+       continue to the next service unless "UNAVAIL=return" is set.
+       ("NOTFOUND=return" refers to the service returning a NOTFOUND
+       error, not the service itself not being found.)  The reason is
+       that the "status" variable (while initialised to UNAVAIL) is
+       outside of the loop that iterates over the services, the
+       "files" service sets status to NOTFOUND.  So when the call to
+       find "mdns4_minimal" fails, "status" will still be NOTFOUND,
+       and it will return instead of continuing to "dns".  Thus, the
+       line
+       
+         hosts: mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       does work because "status" will contain UNAVAIL after the
+       failure to find mdns4_minimal. */
+    ./nss-skip-unavail.patch
+  ];
+
+  # `--with-tls --without-__thread' enables support for TLS but causes
+  # it not to be used.  Required if we don't want to barf on 2.4
+  # kernels.  Or something.
+  configureFlags="--enable-add-ons
+    --with-headers=${kernelHeaders}/include
+    ${if profilingLibraries then "--enable-profile" else "--disable-profile"}";
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = "-U__i686";
+}
diff --git a/pkgs/development/libraries/glibc/2.7/nss-skip-unavail.patch b/pkgs/development/libraries/glibc/2.7/nss-skip-unavail.patch
new file mode 100644
index 000000000000..4d29082f9419
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.7/nss-skip-unavail.patch
@@ -0,0 +1,25 @@
+diff -rc glibc-2.7-orig/sysdeps/posix/getaddrinfo.c glibc-2.7/sysdeps/posix/getaddrinfo.c
+*** glibc-2.7-orig/sysdeps/posix/getaddrinfo.c	2007-10-17 18:05:12.000000000 +0200
+--- glibc-2.7/sysdeps/posix/getaddrinfo.c	2008-04-08 12:17:09.000000000 +0200
+***************
+*** 498,505 ****
+  	  int no_data = 0;
+  	  int no_inet6_data = 0;
+  	  service_user *nip = NULL;
+- 	  enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
+- 	  enum nss_status status = NSS_STATUS_UNAVAIL;
+  	  int no_more;
+  	  int old_res_options;
+  
+--- 498,503 ----
+***************
+*** 689,694 ****
+--- 687,694 ----
+  
+  	  while (!no_more)
+  	    {
++               enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
++               enum nss_status status = NSS_STATUS_UNAVAIL;
+  	      nss_gethostbyname3_r fct = NULL;
+  	      if (req->ai_flags & AI_CANONNAME)
+  		/* No need to use this function if we do not look for
diff --git a/pkgs/development/libraries/glibc/2.9/binutils-2.20.patch b/pkgs/development/libraries/glibc/2.9/binutils-2.20.patch
new file mode 100644
index 000000000000..ab3d6144d6ee
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/binutils-2.20.patch
@@ -0,0 +1,42 @@
+Support GNU Binutils 2.20 and beyond.  Patch from
+http://sourceware.org/ml/libc-alpha/2009-09/msg00009.html .
+
+diff --git a/configure b/configure
+index 48e6952..b1d84d7 100755
+--- a/configure
++++ b/configure
+@@ -4841,7 +4841,7 @@ $as_echo_n "checking version of $AS... " >&6; }
+   ac_prog_version=`$AS --version 2>&1 | sed -n 's/^.*GNU assembler.* \([0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    2.1[3-9]*)
++    2.1[3-9]*|[2-9].[2-9]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
+@@ -4904,7 +4904,7 @@ $as_echo_n "checking version of $LD... " >&6; }
+   ac_prog_version=`$LD --version 2>&1 | sed -n 's/^.*GNU ld.* \([0-9][0-9]*\.[0-9.]*\).*$/\1/p'`
+   case $ac_prog_version in
+     '') ac_prog_version="v. ?.??, bad"; ac_verc_fail=yes;;
+-    2.1[3-9]*)
++    2.1[3-9]*|[2-9].[2-9]*)
+        ac_prog_version="$ac_prog_version, ok"; ac_verc_fail=no;;
+     *) ac_prog_version="$ac_prog_version, bad"; ac_verc_fail=yes;;
+ 
+diff --git a/configure.in b/configure.in
+index 4584afe..7c4f71f 100644
+--- a/configure.in
++++ b/configure.in
+@@ -897,10 +897,10 @@ AC_SUBST(MIG)dnl Needed by sysdeps/mach/configure.in
+ # Accept binutils 2.13 or newer.
+ AC_CHECK_PROG_VER(AS, $AS, --version,
+ 		  [GNU assembler.* \([0-9]*\.[0-9.]*\)],
+-		  [2.1[3-9]*], AS=: critic_missing="$critic_missing as")
++		  [2.1[3-9]*|[2-9].[2-9]*], AS=: critic_missing="$critic_missing as")
+ AC_CHECK_PROG_VER(LD, $LD, --version,
+ 		  [GNU ld.* \([0-9][0-9]*\.[0-9.]*\)],
+-		  [2.1[3-9]*], LD=: critic_missing="$critic_missing ld")
++		  [2.1[3-9]*|[2-9].[2-9]*], LD=: critic_missing="$critic_missing ld")
+ 
+ # We need the physical current working directory.  We cannot use the
+ # "pwd -P" shell builtin since that's not portable.  Instead we try to
diff --git a/pkgs/development/libraries/glibc/2.9/binutils-ld.patch b/pkgs/development/libraries/glibc/2.9/binutils-ld.patch
new file mode 100644
index 000000000000..ae70f145ce0d
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/binutils-ld.patch
@@ -0,0 +1,33 @@
+From 7c8a67320e26b8c11108bf0a3410d3aef9cf3486 Mon Sep 17 00:00:00 2001
+From: Ulrich Drepper <drepper@redhat.com>
+Date: Sat, 31 Jan 2009 00:21:15 +0000
+Subject: [PATCH] * elf/Makefile (ld.so): Adjust the sed script to insert _begin in to
+
+	newer linker scripts.
+---
+ ChangeLog    |    5 +++++
+ elf/Makefile |    4 ++--
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/elf/Makefile b/elf/Makefile
+index 8079fe9..e44ff1d 100644
+--- a/elf/Makefile
++++ b/elf/Makefile
+@@ -1,4 +1,4 @@
+-# Copyright (C) 1995-2007, 2008 Free Software Foundation, Inc.
++# Copyright (C) 1995-2007, 2008, 2009 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
+@@ -304,7 +304,7 @@ $(objpfx)ld.so: $(objpfx)librtld.os $(ld-map)
+ 		  $(LDFLAGS-rtld) -Wl,-z,defs -Wl,--verbose 2>&1 |	\
+ 		  LC_ALL=C \
+ 		  sed -e '/^=========/,/^=========/!d;/^=========/d'	\
+-		      -e 's/\. = 0 + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
++		      -e 's/\. = .* + SIZEOF_HEADERS;/& _begin = . - SIZEOF_HEADERS;/' \
+ 		  > $@.lds
+ 	$(LINK.o) -nostdlib -nostartfiles -shared -o $@			\
+ 		  $(LDFLAGS-rtld) -Wl,-z,defs $(z-now-$(bind-now))	\
+-- 
+1.6.4
+
diff --git a/pkgs/development/libraries/glibc/2.9/builder.sh b/pkgs/development/libraries/glibc/2.9/builder.sh
new file mode 100644
index 000000000000..c81a3ac2a9e9
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/builder.sh
@@ -0,0 +1,85 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+# Explicitly tell glibc to use our pwd, not /bin/pwd.
+export PWD_P=$(type -tP pwd)
+
+# Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+# prevent a retained dependency on the bootstrap tools in the
+# stdenv-linux bootstrap.
+export BASH_SHELL=/bin/sh
+
+
+preConfigure() {
+
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    # In the glibc 2.6/2.7 tarballs C-translit.h is a little bit older
+    # than C-translit.h.in, forcing Make to rebuild it unnecessarily.
+    # This wouldn't be problem except that it requires Perl, which we
+    # don't want as a dependency in the Nixpkgs bootstrap.  So force
+    # the output file to be newer.
+    touch locale/C-translit.h
+
+    tar xvjf "$srcPorts"
+    
+    if test -n "$crossConfig"; then
+        sed -i s/-lgcc_eh//g Makeconfig
+    fi
+
+    mkdir build
+    cd build
+    
+    configureScript=../configure
+    if test -n "$crossConfig"; then
+        cat > config.cache << "EOF"
+libc_cv_forced_unwind=yes
+libc_cv_c_cleanup=yes
+libc_cv_gnu89_inline=yes
+EOF
+        export BUILD_CC=gcc
+        export CC="${crossConfig}-gcc"
+        export AR="${crossConfig}-ar"
+        export RANLIB="${crossConfig}-ranlib"
+        configureFlags="${configureFlags} --cache-file=config.cache"
+
+        # Disable the native stripping, because it breaks libc_nonshared.a
+        dontStrip=1
+    fi
+}
+
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+
+postInstall() {
+    if test -n "$installLocales"; then
+        make localedata/install-locales
+    fi
+    test -f $out/etc/ld.so.cache && rm $out/etc/ld.so.cache
+    (cd $out/include && ln -s $kernelHeaders/include/* .) || exit 1
+
+    # Fix for NIXOS-54 (ldd not working on x86_64).  Make a symlink
+    # "lib64" to "lib".
+    if test -n "$is64bit"; then
+        ln -s lib $out/lib64
+    fi
+}
+
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.9/default.nix b/pkgs/development/libraries/glibc/2.9/default.nix
new file mode 100644
index 000000000000..b778743147e6
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/default.nix
@@ -0,0 +1,103 @@
+{ stdenv, fetchurl, kernelHeaders
+, installLocales ? true
+, profilingLibraries ? false
+, gccCross ? null
+}:
+let
+    cross = if gccCross != null then gccCross.target else null;
+in
+stdenv.mkDerivation rec {
+  name = "glibc-2.9" +
+    stdenv.lib.optionalString (cross != null) "-${cross.config}";
+
+  builder = ./builder.sh;
+
+  src = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2;
+    sha256 = "0v53m7flx6qcx7cvrvvw6a4dx4x3y6k8nvpc4wfv5xaaqy2am2q9";
+  };
+
+  srcPorts = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-ports-2.9.tar.bz2;
+    sha256 = "0r2sn527wxqifi63di7ns9wbjh1cainxn978w178khhy7yw9fk42";
+  };
+
+  inherit kernelHeaders installLocales;
+  crossConfig = if (cross != null) then cross.config else null;
+
+  inherit (stdenv) is64bit;
+
+  patches = [
+    /* Fix for NIXPKGS-79: when doing host name lookups, when
+       nsswitch.conf contains a line like
+
+         hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       don't return an error when mdns4_minimal can't be found.  This
+       is a bug in Glibc: when a service can't be found, NSS should
+       continue to the next service unless "UNAVAIL=return" is set.
+       ("NOTFOUND=return" refers to the service returning a NOTFOUND
+       error, not the service itself not being found.)  The reason is
+       that the "status" variable (while initialised to UNAVAIL) is
+       outside of the loop that iterates over the services, the
+       "files" service sets status to NOTFOUND.  So when the call to
+       find "mdns4_minimal" fails, "status" will still be NOTFOUND,
+       and it will return instead of continuing to "dns".  Thus, the
+       line
+
+         hosts: mdns4_minimal [NOTFOUND=return] dns mdns4
+
+       does work because "status" will contain UNAVAIL after the
+       failure to find mdns4_minimal. */
+    ./nss-skip-unavail.patch
+
+    /* Make it possible to override the locale-archive in NixOS. */
+    ./locale-override.patch
+
+    /* Have rpcgen(1) look for cpp(1) in $PATH.  */
+    ./rpcgen-path.patch
+
+    /* Support GNU Binutils 2.20 and above.  */
+    ./binutils-2.20.patch
+
+    ./binutils-ld.patch
+  ];
+
+  configureFlags = [
+    "--enable-add-ons"
+    "--with-headers=${kernelHeaders}/include"
+    (if profilingLibraries then "--enable-profile" else "--disable-profile")
+  ] ++ stdenv.lib.optionals (cross != null) [
+    "--with-tls"
+    "--enable-kernel=2.6.0"
+    "--without-fp"
+    "--with-__thread"
+  ] ++ (if (stdenv.system == "armv5tel-linux") then [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+  ] else []);
+
+  buildNativeInputs = stdenv.lib.optionals (cross != null) [ gccCross ];
+
+  preInstall = if (cross != null) then ''
+    mkdir -p $out/lib
+    ln -s ${stdenv.gcc.gcc}/lib/libgcc_s.so.1 $out/lib/libgcc_s.so.1
+  '' else "";
+
+  postInstall = if (cross != null) then ''
+    rm $out/lib/libgcc_s.so.1
+  '' else "";
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = "-U__i686";
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "The GNU C Library";
+  };
+}
diff --git a/pkgs/development/libraries/glibc/2.9/headers.nix b/pkgs/development/libraries/glibc/2.9/headers.nix
new file mode 100644
index 000000000000..adb9a22f4810
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/headers.nix
@@ -0,0 +1,63 @@
+{ stdenv, fetchurl, kernelHeaders
+, profilingLibraries ? false
+}:
+
+stdenv.mkDerivation rec {
+  name = "glibc-headers-2.9";
+
+  builder = ./headersbuilder.sh;
+
+  src = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2;
+    sha256 = "0v53m7flx6qcx7cvrvvw6a4dx4x3y6k8nvpc4wfv5xaaqy2am2q9";
+  };
+
+  srcPorts = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-ports-2.9.tar.bz2;
+    sha256 = "0r2sn527wxqifi63di7ns9wbjh1cainxn978w178khhy7yw9fk42";
+  };
+
+  inherit kernelHeaders;
+
+  inherit (stdenv) is64bit;
+
+  patches = [
+    /* Support GNU Binutils 2.20 and above.  */
+    ./binutils-2.20.patch
+  ];
+
+  configureFlags = [
+    "--enable-add-ons"
+    "--with-headers=${kernelHeaders}/include"
+    "--disable-sanity-checks"
+    "--enable-hacker-mode"
+    (if profilingLibraries then "--enable-profile" else "--disable-profile")
+  ] ++ (if (stdenv.system == "armv5tel-linux") then [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+  ] else []);
+
+  buildPhase = "true";
+
+  # I took some tricks from crosstool-0.43
+  installPhase = ''
+    make cross-compiling=yes CFLAGS=-DBOOTSTRAP_GCC install-headers
+    mkdir -p $out/include/gnu
+    touch $out/include/gnu/stubs.h
+    cp ../include/features.h $out/include/features.h
+    (cd $out/include && ln -s $kernelHeaders/include/* .) || exit 1
+  '';
+
+  # Workaround for this bug:
+  #   http://sourceware.org/bugzilla/show_bug.cgi?id=411
+  # I.e. when gcc is compiled with --with-arch=i686, then the
+  # preprocessor symbol `__i686' will be defined to `1'.  This causes
+  # the symbol __i686.get_pc_thunk.dx to be mangled.
+  NIX_CFLAGS_COMPILE = "-U__i686";
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "The GNU C Library";
+  };
+}
diff --git a/pkgs/development/libraries/glibc/2.9/headersbuilder.sh b/pkgs/development/libraries/glibc/2.9/headersbuilder.sh
new file mode 100644
index 000000000000..23f4bd4cc619
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/headersbuilder.sh
@@ -0,0 +1,38 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+# Explicitly tell glibc to use our pwd, not /bin/pwd.
+export PWD_P=$(type -tP pwd)
+
+# Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+# prevent a retained dependency on the bootstrap tools in the
+# stdenv-linux bootstrap.
+export BASH_SHELL=/bin/sh
+
+
+preConfigure() {
+
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    # In the glibc 2.6/2.7 tarballs C-translit.h is a little bit older
+    # than C-translit.h.in, forcing Make to rebuild it unnecessarily.
+    # This wouldn't be problem except that it requires Perl, which we
+    # don't want as a dependency in the Nixpkgs bootstrap.  So force
+    # the output file to be newer.
+    touch locale/C-translit.h
+
+    tar xvjf "$srcPorts"
+    
+    mkdir build
+    cd build
+    
+    configureScript=../configure
+}
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.9/info.nix b/pkgs/development/libraries/glibc/2.9/info.nix
new file mode 100644
index 000000000000..cc79bbece3d2
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/info.nix
@@ -0,0 +1,47 @@
+{ stdenv, fetchurl, texinfo, perl }:
+
+stdenv.mkDerivation rec {
+  name = "glibc-info-2.9";
+  
+  src = fetchurl {
+    url = http://nixos.org/tarballs/glibc-2.9-20081208.tar.bz2;
+    sha256 = "0zhxbgcsl97pf349m0lz8d5ljvvzrcqc23yf08d888xlk4ms8m3h";
+  };
+
+  patches = [
+    /* Support GNU Binutils 2.20 and above.  */
+    ./binutils-2.20.patch
+  ];
+
+  preConfigure = ''
+    export PWD_P=$(type -tP pwd)
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+    mkdir ../build
+    cd ../build
+    
+    configureScript=../$sourceRoot/configure
+  '';
+
+  configureFlags = [ "--enable-add-ons" ];
+
+  buildInputs = [ texinfo perl ];
+
+  buildPhase = "make info";
+
+  # I don't know why the info is not generated in 'build'
+  # Somehow building the info still does not work, because the final
+  # libc.info hasn't a Top node.
+  installPhase = ''
+    mkdir -p $out/share/info
+    cp ../$sourceRoot/manual/*.info $out/share/info
+  '';
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "Locale information for the GNU C Library";
+  };
+}
diff --git a/pkgs/development/libraries/glibc/2.9/locale-override.patch b/pkgs/development/libraries/glibc/2.9/locale-override.patch
new file mode 100644
index 000000000000..108d0e35dacf
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/locale-override.patch
@@ -0,0 +1,72 @@
+diff -rc glibc-2.9-20081208-orig/locale/loadarchive.c glibc-2.9-20081208/locale/loadarchive.c
+*** glibc-2.9-20081208-orig/locale/loadarchive.c	2005-09-09 18:56:52.000000000 +0200
+--- glibc-2.9-20081208/locale/loadarchive.c	2009-04-19 13:54:26.000000000 +0200
+***************
+*** 124,129 ****
+--- 124,142 ----
+  }
+  
+  
++ static int
++ open_locale_archive ()
++ {
++   int fd = -1;
++   char *path = getenv ("LOCALE_ARCHIVE");
++   if (path)
++     fd = open_not_cancel_2 (path, O_RDONLY|O_LARGEFILE);
++   if (fd < 0)
++     fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
++   return fd;
++ }
++ 
++ 
+  /* Find the locale *NAMEP in the locale archive, and return the
+     internalized data structure for its CATEGORY data.  If this locale has
+     already been loaded from the archive, just returns the existing data
+***************
+*** 203,209 ****
+        archmapped = &headmap;
+  
+        /* The archive has never been opened.  */
+!       fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
+        if (fd < 0)
+  	/* Cannot open the archive, for whatever reason.  */
+  	return NULL;
+--- 216,222 ----
+        archmapped = &headmap;
+  
+        /* The archive has never been opened.  */
+!       fd = open_locale_archive ();
+        if (fd < 0)
+  	/* Cannot open the archive, for whatever reason.  */
+  	return NULL;
+***************
+*** 394,400 ****
+  	  if (fd == -1)
+  	    {
+  	      struct stat64 st;
+! 	      fd = open_not_cancel_2 (archfname, O_RDONLY|O_LARGEFILE);
+  	      if (fd == -1)
+  		/* Cannot open the archive, for whatever reason.  */
+  		return NULL;
+--- 407,413 ----
+  	  if (fd == -1)
+  	    {
+  	      struct stat64 st;
+! 	      fd = open_locale_archive ();
+  	      if (fd == -1)
+  		/* Cannot open the archive, for whatever reason.  */
+  		return NULL;
+diff -rc glibc-2.9-20081208-orig/sysdeps/generic/unsecvars.h glibc-2.9-20081208/sysdeps/generic/unsecvars.h
+*** glibc-2.9-20081208-orig/sysdeps/generic/unsecvars.h	2006-10-11 18:24:05.000000000 +0200
+--- glibc-2.9-20081208/sysdeps/generic/unsecvars.h	2009-04-19 13:55:34.000000000 +0200
+***************
+*** 16,21 ****
+--- 16,22 ----
+    "LD_SHOW_AUXV\0"							      \
+    "LD_USE_LOAD_BIAS\0"							      \
+    "LOCALDOMAIN\0"							      \
++   "LOCALE_ARCHIVE\0"							      \
+    "LOCPATH\0"								      \
+    "MALLOC_TRACE\0"							      \
+    "NIS_PATH\0"								      \
diff --git a/pkgs/development/libraries/glibc/2.9/locales.nix b/pkgs/development/libraries/glibc/2.9/locales.nix
new file mode 100644
index 000000000000..c7b1bb2bff0a
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/locales.nix
@@ -0,0 +1,67 @@
+/* This function builds just the `lib/locale/locale-archive' file from
+   Glibc and nothing else.  If `allLocales' is true, all supported
+   locales are included; otherwise, just the locales listed in
+   `locales'.  See localedata/SUPPORTED in the Glibc source tree for
+   the list of all supported locales:
+   http://sourceware.org/cgi-bin/cvsweb.cgi/libc/localedata/SUPPORTED?cvsroot=glibc
+*/
+
+{ stdenv, fetchurl, allLocales ? true, locales ? ["en_US.UTF-8/UTF-8"] }:
+
+stdenv.mkDerivation rec {
+  name = "glibc-locales-2.9";
+
+  builder = ./localesbuilder.sh;
+
+  src = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-2.9.tar.bz2;
+    sha256 = "0v53m7flx6qcx7cvrvvw6a4dx4x3y6k8nvpc4wfv5xaaqy2am2q9";
+  };
+
+  srcPorts = fetchurl {
+    url = http://ftp.gnu.org/gnu/glibc/glibc-ports-2.9.tar.bz2;
+    sha256 = "0r2sn527wxqifi63di7ns9wbjh1cainxn978w178khhy7yw9fk42";
+  };
+
+  inherit (stdenv) is64bit;
+
+  configureFlags = [
+    "--enable-add-ons"
+    "--without-headers"
+    "--disable-profile"
+  ] ++ (if (stdenv.system == "armv5tel-linux") then [
+    "--host=arm-linux-gnueabi"
+    "--build=arm-linux-gnueabi"
+    "--without-fp"
+  ] else []);
+
+  patches = [
+    /* Support GNU Binutils 2.20 and above.  */
+    ./binutils-2.20.patch
+  ];
+
+  # Awful hack: `localedef' doesn't allow the path to `locale-archive'
+  # to be overriden, but you *can* specify a prefix, i.e. it will use
+  # <prefix>/<path-to-glibc>/lib/locale/locale-archive.  So we use
+  # $TMPDIR as a prefix, meaning that the locale-archive is placed in
+  # $TMPDIR/nix/store/...-glibc-.../lib/locale/locale-archive.
+  buildPhase =
+    ''
+      mkdir -p $TMPDIR/"$(dirname $(readlink -f $(type -p localedef)))/../lib/locale"
+      make localedata/install-locales \
+          LOCALEDEF="localedef --prefix=$TMPDIR" \
+          localedir=$out/lib/locale \
+          ${if allLocales then "" else "SUPPORTED-LOCALES=\"${toString locales}\""}
+    '';
+
+  installPhase =
+    ''
+      mkdir -p $out/lib/locale
+      cp $TMPDIR/nix/store/*/lib/locale/locale-archive $out/lib/locale/
+    '';
+
+  meta = {
+    homepage = http://www.gnu.org/software/libc/;
+    description = "Locale information for the GNU C Library";
+  };
+}
diff --git a/pkgs/development/libraries/glibc/2.9/localesbuilder.sh b/pkgs/development/libraries/glibc/2.9/localesbuilder.sh
new file mode 100644
index 000000000000..a28f6bcbaeb3
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/localesbuilder.sh
@@ -0,0 +1,50 @@
+# Glibc cannot have itself in its RPATH.
+export NIX_NO_SELF_RPATH=1
+
+source $stdenv/setup
+
+# Explicitly tell glibc to use our pwd, not /bin/pwd.
+export PWD_P=$(type -tP pwd)
+
+# Needed to install share/zoneinfo/zone.tab.  Set to impure /bin/sh to
+# prevent a retained dependency on the bootstrap tools in the
+# stdenv-linux bootstrap.
+export BASH_SHELL=/bin/sh
+
+
+preConfigure() {
+
+    for i in configure io/ftwtest-sh; do
+        # Can't use substituteInPlace here because replace hasn't been
+        # built yet in the bootstrap.
+        sed -i "$i" -e "s^/bin/pwd^$PWD_P^g"
+    done
+
+    # In the glibc 2.6/2.7 tarballs C-translit.h is a little bit older
+    # than C-translit.h.in, forcing Make to rebuild it unnecessarily.
+    # This wouldn't be problem except that it requires Perl, which we
+    # don't want as a dependency in the Nixpkgs bootstrap.  So force
+    # the output file to be newer.
+    touch locale/C-translit.h
+
+    tar xvjf "$srcPorts"
+    
+    mkdir build
+    cd build
+    
+    configureScript=../configure
+}
+
+
+postConfigure() {
+    # Hack: get rid of the `-static' flag set by the bootstrap stdenv.
+    # This has to be done *after* `configure' because it builds some
+    # test binaries.
+    export NIX_CFLAGS_LINK=
+    export NIX_LDFLAGS_BEFORE=
+
+    export NIX_DONT_SET_RPATH=1
+    unset CFLAGS
+}
+
+genericBuild
diff --git a/pkgs/development/libraries/glibc/2.9/nss-skip-unavail.patch b/pkgs/development/libraries/glibc/2.9/nss-skip-unavail.patch
new file mode 100644
index 000000000000..dc09b5098707
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/nss-skip-unavail.patch
@@ -0,0 +1,25 @@
+diff -rc glibc-2.9-20081208-orig/sysdeps/posix/getaddrinfo.c glibc-2.9-20081208/sysdeps/posix/getaddrinfo.c
+*** glibc-2.9-20081208-orig/sysdeps/posix/getaddrinfo.c	2008-07-30 21:14:22.000000000 +0200
+--- glibc-2.9-20081208/sysdeps/posix/getaddrinfo.c	2008-12-10 11:39:32.000000000 +0100
+***************
+*** 505,512 ****
+  	  int no_data = 0;
+  	  int no_inet6_data = 0;
+  	  service_user *nip = NULL;
+- 	  enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
+- 	  enum nss_status status = NSS_STATUS_UNAVAIL;
+  	  int no_more;
+  	  int old_res_options;
+  
+--- 505,510 ----
+***************
+*** 702,707 ****
+--- 700,707 ----
+  
+  	  while (!no_more)
+  	    {
++ 	      enum nss_status inet6_status = NSS_STATUS_UNAVAIL;
++ 	      enum nss_status status = NSS_STATUS_UNAVAIL;
+  	      nss_gethostbyname4_r fct4
+  		= __nss_lookup_function (nip, "gethostbyname4_r");
+  	      if (fct4 != NULL)
diff --git a/pkgs/development/libraries/glibc/2.9/rpcgen-path.patch b/pkgs/development/libraries/glibc/2.9/rpcgen-path.patch
new file mode 100644
index 000000000000..fbb03dd5fade
--- /dev/null
+++ b/pkgs/development/libraries/glibc/2.9/rpcgen-path.patch
@@ -0,0 +1,72 @@
+By default, rpcgen(1) looks for cpp(1) from a list of fixed absolute paths
+(`/lib/cpp', etc.), which may only be overrided with the `-Y' option.  This
+patch makes it run any `cpp' command found in $PATH.
+
+--- glibc-2.7/sunrpc/rpc_main.c	2006-11-10 21:54:46.000000000 +0100
++++ glibc-2.7/sunrpc/rpc_main.c	2009-04-22 14:32:10.000000000 +0200
+@@ -79,7 +79,7 @@ static const char *cmdname;
+ 
+ static const char *svcclosetime = "120";
+ static int cppDefined;	/* explicit path for C preprocessor */
+-static const char *CPP = SUNOS_CPP;
++static const char *CPP = "cpp";
+ static const char CPPFLAGS[] = "-C";
+ static char *pathbuf;
+ static int cpp_pid;
+@@ -108,7 +108,6 @@ static char *extendfile (const char *fil
+ static void open_output (const char *infile, const char *outfile);
+ static void add_warning (void);
+ static void clear_args (void);
+-static void find_cpp (void);
+ static void open_input (const char *infile, const char *define);
+ static int check_nettype (const char *name, const char *list_to_check[]);
+ static void c_output (const char *infile, const char *define,
+@@ -327,31 +326,6 @@ clear_args (void)
+   argcount = FIXEDARGS;
+ }
+ 
+-/* make sure that a CPP exists */
+-static void
+-find_cpp (void)
+-{
+-  struct stat buf;
+-
+-  if (stat (CPP, &buf) < 0)
+-    {				/* /lib/cpp or explicit cpp does not exist */
+-      if (cppDefined)
+-	{
+-	  fprintf (stderr, _ ("cannot find C preprocessor: %s \n"), CPP);
+-	  crash ();
+-	}
+-      else
+-	{			/* try the other one */
+-	  CPP = SVR4_CPP;
+-	  if (stat (CPP, &buf) < 0)
+-	    {			/* can't find any cpp */
+-	      fputs (_ ("cannot find any C preprocessor (cpp)\n"), stdout);
+-	      crash ();
+-	    }
+-	}
+-    }
+-}
+-
+ /*
+  * Open input file with given define for C-preprocessor
+  */
+@@ -370,7 +344,6 @@ open_input (const char *infile, const ch
+   switch (cpp_pid)
+     {
+     case 0:
+-      find_cpp ();
+       putarg (0, CPP);
+       putarg (1, CPPFLAGS);
+       addarg (define);
+@@ -380,7 +353,7 @@ open_input (const char *infile, const ch
+       close (1);
+       dup2 (pd[1], 1);
+       close (pd[0]);
+-      execv (arglist[0], (char **) arglist);
++      execvp (arglist[0], (char **) arglist);
+       perror ("execv");
+       exit (1);
+     case -1: