about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog72
-rw-r--r--Makeconfig17
-rw-r--r--Makerules17
-rw-r--r--config.make.in3
-rwxr-xr-xconfigure15
-rw-r--r--configure.in4
-rw-r--r--elf/Makefile35
-rw-r--r--elf/ldd.bash.in15
-rw-r--r--elf/ldd.sh.in8
-rw-r--r--iconvdata/gap.pl2
-rw-r--r--iconvdata/gaptab.pl2
-rw-r--r--inet/rcmd.c168
-rw-r--r--intl/bindtextdom.c6
-rw-r--r--libc.map1
-rw-r--r--setjmp/tst-setjmp.c11
-rw-r--r--sysdeps/i386/i486/bits/string.h3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/readdir.c3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/syscalls.list1
-rw-r--r--sysdeps/unix/sysv/linux/configure11
-rw-r--r--sysdeps/unix/sysv/linux/configure.in11
-rw-r--r--sysdeps/unix/sysv/linux/i386/Makefile5
21 files changed, 296 insertions, 114 deletions
diff --git a/ChangeLog b/ChangeLog
index d7832876a1..830612b015 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,75 @@
+1998-03-29 16:50  Ulrich Drepper  <drepper@cygnus.com>
+
+	* config.make.in (ldd-rewrite-script): New variable.
+	* configure.in: Substitute ldd-rewrite-script.
+	* elf/Makefile: Rewrite rules to generate ldd script.
+	* elf/ldd.bash.in: Allow handling of non-ELF binaries.
+	* elf/ldd.sh.in: Likewise.
+	* sysdeps/unix/sysv/linux/Makefile: Remove rule to install lddlibc4.
+	* sysdeps/unix/sysv/linux/configure.in: Define ldd_rewrite_script to
+	point to sed script for libc4 handling insertion for ix86, m68, SPARC.
+	* sysdeps/unix/sysv/linux/i386/Makefile: Add rule to install lddlibc4.
+
+1998-03-26 15:20  Zack Weinberg  <zack@rabi.phys.columbia.edu>
+
+	* inet/rcmd.c (iruserok): Remain setuid to the local user
+	while .rhosts is actually read, to make .rhosts-over-NFS work
+	(PR libc/524).  Use iruserfopen() for security checks on both
+	hosts.equiv and .rhosts.  General cleanup.
+	(iruserfopen): New function, performs careful checking on
+	hosts.equiv/.rhosts files.  Disallows all the old forbidden
+	stuff plus hard links to files.
+
+1998-03-29 09:26  Ulrich Drepper  <drepper@cygnus.com>
+
+	* setjmp/tst-setjmp.c: Don't test __setjmp, test _setjmp instead.
+
+1998-03-29 02:02  H.J. Lu  <hjl@gnu.org>
+
+	* sysdeps/i386/i486/bits/string.h: Fix typos.
+
+	* nss/nsswitch.c (__nss_lookup): Fix the bogus checking for
+	"adjusted for next function".
+
+1998-03-28 00:13  H.J. Lu  <hjl@gnu.org>
+
+	* sysdeps/unix/sysv/linux/alpha/readdir.c (__readdir64): New
+	strong alias.
+
+	* sysdeps/unix/sysv/linux/alpha/syscalls.list (socket): Added.
+
+	* libc.map (__ieee_get_fp_control, __ieee_set_fp_control):
+	Added.  Used by libm.so on alpha.
+
+1998-03-28  Thorsten Kukuk  <kukuk@vt.uni-paderborn.de>
+
+	* intl/bindtextdom.c [_LIBC]: Define strdup only if not yet
+	defined.
+
+1998-03-27 07:29  H.J. Lu  <hjl@gnu.org>
+
+	* Makerules (object-suffixes-for-rules): Add .oS only for
+	building shared library.
+	Add ranlib rule for nonshared library.
+	(rmobjs): Fix typo.
+
+	* Makeconfig (libtype.oS, CFLAGS-.oS, CPPFLAGS-.oS): Moved
+	into for shared library only.
+	(CPPFLAGS-.oS): Add -DPIC.
+	(libtypes): Use $(object-suffixes-for-rules) instead of
+	$(object-suffixes).
+
+1998-03-28  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/Makefile (inhibit-stdio_lim): Compile
+	and install lddlibc4.
+
+1998-03-28 09:13  Zack Weinberg  <zack@rabi.phys.columbia.edu>
+
+	* iconvdata/gap.pl: Gobble rest of line with a scalar, not a
+	hash.
+	* iconvdata/gaptab.pl: Likewise.
+
 1998-03-27 22:46  Ulrich Drepper  <drepper@cygnus.com>
 
 	* Rules: Allow Makefiles to specify test-static for tests which
diff --git a/Makeconfig b/Makeconfig
index 18f978b900..e20056ecd4 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -571,7 +571,7 @@ endif
 # Various things use $(object-suffixes) to know what all to make.
 # The compilation rules use $(CPPFLAGS-${SUFFIX}) and $(CFLAGS-${SUFFIX})
 # to pass different flags for each flavor.
-libtypes = $(foreach o,$(object-suffixes),$(libtype$o))
+libtypes = $(foreach o,$(object-suffixes-for-rules),$(libtype$o))
 all-object-suffixes := .o .os .op .og .ob .oS
 object-suffixes :=
 ifeq (yes,$(build-static))
@@ -589,6 +589,13 @@ CFLAGS-.os = $(filter %frame-pointer,$(+cflags)) $(pic-ccflag)
 libtype.os := lib%_pic.a
 # This can be changed by a sysdep makefile
 pic-ccflag = -fPIC
+# Special library that contains the static-only routines for libc.
+libtype.oS = lib%_nonshared.a
+# Must build the routines as PIC, though, because they can end up in (users')
+# shared objects.  We don't want to use CFLAGS-os because users may, for
+# example, make that processor-specific.
+CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
+CPPFLAGS-.oS = $(CPPFLAGS-.o) -DPIC
 endif
 ifeq (yes,$(build-profile))
 # Under --enable-profile, we will build a static library of profiled objects.
@@ -618,14 +625,6 @@ CFLAGS-.ob = -g -fbounded-pointers
 libtype.ob = lib%_b.a
 endif
 
-# Special library that contains the static-only routines for libc.
-libtype.oS = lib%_nonshared.a
-# Must build the routines as PIC, though, because they can end up in (users')
-# shared objects.  We don't want to use CFLAGS-os because users may, for
-# example, make that processor-specific.
-CFLAGS-.oS = $(CFLAGS-.o) $(pic-ccflag)
-CPPFLAGS-.oS = $(CPPFLAGS-.o)
-
 +gnu-stabs = $(shell echo>&2 '*** BARF ON ME')
 
 ifndef BUILD_CC
diff --git a/Makerules b/Makerules
index 26f8398041..62cceac1c6 100644
--- a/Makerules
+++ b/Makerules
@@ -172,7 +172,11 @@ endef
 $(common-objpfx)dummy.d:
 	echo '# .s files cannot contain includes, so they need no deps.' > $@
 
-object-suffixes-for-rules = $(object-suffixes) .oS
+object-suffixes-for-rules := $(object-suffixes)
+
+ifeq (yes,$(build-shared))
+object-suffixes-for-rules += .oS
+endif
 
 # It matters that this set of rules, for compiling from sources in
 # the current directory (the $srcdir/$subdir) come before the
@@ -571,6 +575,15 @@ $(subdirs-stamps): subdir_lib;
 endif
 object-suffixes-left = $(object-suffixes)
 include $(o-iterator)
+ifeq (yes,$(build-shared))
+$(common-objpfx)$(patsubst %,$(libtype.oS),c)($(ar-symtab-name)): \
+	$(common-objpfx)$(patsubst %,$(libtype.oS),c)(\
+	  $(patsubst %,%.oS,$(static-only-routines))) \
+	$(wildcard $(foreach d,$(subdirs),$(common-objpfx)$d/stamp.oS))
+	$(SHELL) $(..)./autolock.sh \
+	  $(common-objpfx)$(patsubst %,$(libtype.oS),c).lck \
+	  $(RANLIB) $(common-objpfx)$(patsubst %,$(libtype.oS),c)
+endif
 
 
 # This makes all the object files.
@@ -914,7 +927,7 @@ common-mostlyclean:
 define rmobjs
 $(foreach o,$(object-suffixes),
 -rm -f $(objpfx)stamp$o $(o-objects))
--rm -f $(objpfx)stamp.oS $(patsubst %,$(static-only-routines),$(objpfx)%.oS)
+-rm -f $(objpfx)stamp.oS $(patsubst %,$(objpfx)%.oS,$(static-only-routines))
 endef
 
 # Also remove the dependencies and generated source files.
diff --git a/config.make.in b/config.make.in
index 8006adb45c..4c989c8335 100644
--- a/config.make.in
+++ b/config.make.in
@@ -15,6 +15,9 @@ rootsbindir = @libc_cv_rootsbindir@
 # in GNU libc.
 has-ldconfig = @has_ldconfig@
 
+# Maybe the `ldd' script must be rewritten.
+ldd-rewrite-script = @ldd_rewrite_script@
+
 # System configuration.
 config-machine = @host_cpu@
 base-machine = @base_machine@
diff --git a/configure b/configure
index 7776ef7e96..7e886b913b 100755
--- a/configure
+++ b/configure
@@ -2512,6 +2512,9 @@ esac
 libc_link_dests=
 libc_link_sources=
 
+# They also can set these variables.
+ldd_rewrite_script=no
+
 # Iterate over all the sysdep directories we will use, running their
 # configure fragments, and looking for a uname implementation.
 uname=
@@ -2547,7 +2550,7 @@ if test "$uname" = "sysdeps/generic"; then
   fi
 
   echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
-echo "configure:2551: checking OS release for uname" >&5
+echo "configure:2554: checking OS release for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2569,7 +2572,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
   uname_release="$libc_cv_uname_release"
 
   echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
-echo "configure:2573: checking OS version for uname" >&5
+echo "configure:2576: checking OS version for uname" >&5
 if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2591,7 +2594,7 @@ else
 fi
 
 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
-echo "configure:2595: checking stdio selection" >&5
+echo "configure:2598: checking stdio selection" >&5
 
 case $stdio in
 libio) cat >> confdefs.h <<\EOF
@@ -2603,7 +2606,7 @@ esac
 echo "$ac_t""$stdio" 1>&6
 
 echo $ac_n "checking ldap selection""... $ac_c" 1>&6
-echo "configure:2607: checking ldap selection" >&5
+echo "configure:2610: checking ldap selection" >&5
 
 case $add_ons in
 *ldap*)
@@ -2620,6 +2623,7 @@ echo "$ac_t""$ldap" 1>&6
 
 
 
+
   
 if test $gnu_ld = yes; then
   cat >> confdefs.h <<\EOF
@@ -2665,7 +2669,7 @@ if test $static = no && test $shared = yes; then
 fi
 
 echo $ac_n "checking whether -fPIC is default""... $ac_c" 1>&6
-echo "configure:2669: checking whether -fPIC is default" >&5
+echo "configure:2673: checking whether -fPIC is default" >&5
 if eval "test \"`echo '$''{'pic_default'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -2892,6 +2896,7 @@ s%@libc_cv_slibdir@%$libc_cv_slibdir%g
 s%@libc_cv_sysconfdir@%$libc_cv_sysconfdir%g
 s%@libc_cv_rootsbindir@%$libc_cv_rootsbindir%g
 s%@has_ldconfig@%$has_ldconfig%g
+s%@ldd_rewrite_script@%$ldd_rewrite_script%g
 s%@gnu_ld@%$gnu_ld%g
 s%@gnu_as@%$gnu_as%g
 s%@elf@%$elf%g
diff --git a/configure.in b/configure.in
index adc3381cba..fa8231931c 100644
--- a/configure.in
+++ b/configure.in
@@ -1000,6 +1000,9 @@ esac
 libc_link_dests=
 libc_link_sources=
 
+# They also can set these variables.
+ldd_rewrite_script=no
+
 # Iterate over all the sysdep directories we will use, running their
 # configure fragments, and looking for a uname implementation.
 uname=
@@ -1108,6 +1111,7 @@ AC_SUBST(libc_cv_sysconfdir)
 AC_SUBST(libc_cv_rootsbindir)
 
 AC_SUBST(has_ldconfig)
+AC_SUBST(ldd_rewrite_script)
 
 AC_SUBST(gnu_ld) AC_SUBST(gnu_as) AC_SUBST(elf)
 if test $gnu_ld = yes; then
diff --git a/elf/Makefile b/elf/Makefile
index 5e221ec352..33f60c52f1 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -164,23 +164,34 @@ $(inst_slibdir)/$(rtld-installed-name): \
 .PHONY: ldso_install
 ldso_install: $(inst_slibdir)/$(rtld-installed-name)
 
+
+sh-ldd-rewrite = -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
+		 -e 's%@VERSION@%$(version)%g'
+bash-ldd-rewrite = $(sh-ldd-rewrite) -e 's%@BASH@%$(BASH)%g' \
+		   -e 's%@TEXTDOMAINDIR@%$(localedir)%g'
+
 ifneq ($(have-bash2),yes)
-$(objpfx)ldd: ldd.sh.in $(common-objpfx)version.mk \
-	      $(common-objpfx)soversions.mk $(common-objpfx)config.make
-	sed -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
-	    -e 's%@VERSION@%$(version)%g' < $< > $@.new
-	chmod 555 $@.new
-	mv -f $@.new $@
+ldd-shell = bash
+else
+ldd-shell = sh
+endif
+
+ifeq ($(ldd-rewrite-script),no)
+define gen-ldd
+sed $($(ldd-shell)-ldd-rewrite) < $< > $@.new
+endef
 else
-$(objpfx)ldd: ldd.bash.in $(common-objpfx)version.mk \
+define gen-ldd
+sed $($(ldd-shell)-ldd-rewrite) < $< | sed -f $(ldd-rewrite-script) > $@.new
+endef
+endif
+
+$(objpfx)ldd: ldd.$(ldd-shell).in $(common-objpfx)version.mk \
 	      $(common-objpfx)soversions.mk $(common-objpfx)config.make
-	sed -e 's%@BASH@%$(BASH)%g' \
-	    -e 's%@RTLD@%$(slibdir)/$(rtld-installed-name)%g' \
-	    -e 's%@VERSION@%$(version)%g' \
-	    -e 's%@TEXTDOMAINDIR@%$(localedir)%g' < $< > $@.new
+	$(gen-ldd)
 	chmod 555 $@.new
 	mv -f $@.new $@
-endif
+
 
 ifeq ($(build-shared),yes)
 $(objpfx)sprof: $(objpfx)libdl.so$(libdl.so-version)
diff --git a/elf/ldd.bash.in b/elf/ldd.bash.in
index 54dc837d3e..5d4bb3cccc 100644
--- a/elf/ldd.bash.in
+++ b/elf/ldd.bash.in
@@ -87,6 +87,12 @@ Report bugs using the \`glibcbug' script to <bugs@gnu.org>."
   esac
 done
 
+nonelf ()
+{
+  # Maybe extra code for non-ELF binaries.
+  return 1;
+}
+
 add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
 add_env="$add_env LD_VERBOSE=$verbose"
 case $# in
@@ -115,6 +121,8 @@ case $# in
       eval $add_env exec '"$file"' || exit 1
       ;;
     1)
+      # This can be a non-ELF binary or no binary at all.
+      nonelf $file ||
       echo $"	not a dynamic executable"
       exit 1
       ;;
@@ -154,8 +162,11 @@ warning: you do not have execution permission for" "\`$file'"
 	eval $add_env '"$file"' || result=1
 	;;
       1)
-	echo $"	not a dynamic executable"
-	result=1
+	# This can be a non-ELF binary or no binary at all.
+	nonelf $file || {
+	  echo $"	not a dynamic executable"
+	  result=1
+	}
 	;;
       2)
         eval $add_env ${RTLD} '"$file"' || result=1
diff --git a/elf/ldd.sh.in b/elf/ldd.sh.in
index 884472f654..a82deb5cb7 100644
--- a/elf/ldd.sh.in
+++ b/elf/ldd.sh.in
@@ -83,6 +83,12 @@ Try \`ldd --help' for more information."
   esac
 done
 
+nonelf ()
+{
+  # Maybe extra code for non-ELF binaries.
+  return 1;
+}
+
 add_env="LD_TRACE_LOADED_OBJECTS=1 LD_WARN=$warn LD_BIND_NOW=$bind_now"
 add_env="$add_env LD_VERBOSE=$verbose"
 case $# in
@@ -113,6 +119,7 @@ Try \`ldd --help' for more information."
 	eval $add_env exec '"$file"' || exit 1
 	;;
       1)
+        nonelf $file ||
 	echo '	not a dynamic executable'
 	exit 1
 	;;
@@ -155,6 +162,7 @@ ldd: warning: you do not have execution permission for \`$file'"
 	  eval $add_env '"$file"' || result=1
 	  ;;
 	1)
+          nonelf $file ||
 	  echo '	not a dynamic executable'
 	  result=1
 	  ;;
diff --git a/iconvdata/gap.pl b/iconvdata/gap.pl
index 01ee9b2829..ed2d295c90 100644
--- a/iconvdata/gap.pl
+++ b/iconvdata/gap.pl
@@ -1,6 +1,6 @@
 $first=$last=$idx=0;
 while (<>) {
-  local($ucs,%rest) = split;
+  local($ucs,$rest) = split;
   local($u)=hex($ucs);
   if ($u - $last > 6) {
     if ($last != 0) {
diff --git a/iconvdata/gaptab.pl b/iconvdata/gaptab.pl
index 34eb2f9408..77df1c3aea 100644
--- a/iconvdata/gaptab.pl
+++ b/iconvdata/gaptab.pl
@@ -6,7 +6,7 @@ sub fmt {
   printf (" '\\x%02x',", $val);
 }
 while (<>) {
-  local($ucs,$char,%rest) = split;
+  local($ucs,$char,$rest) = split;
   local($u)=hex($ucs);
   local($c)=hex($char);
   if ($u - $last > 6) {
diff --git a/inet/rcmd.c b/inet/rcmd.c
index d496a7a8fa..05bd1d5e8b 100644
--- a/inet/rcmd.c
+++ b/inet/rcmd.c
@@ -287,6 +287,49 @@ ruserok(rhost, superuser, ruser, luser)
 	return -1;
 }
 
+/* Extremely paranoid file open function. */
+static FILE *
+iruserfopen (char *file, uid_t okuser)
+{
+  struct stat st;
+  char *cp = NULL;
+  FILE *res = NULL;
+
+  /* If not a regular file, if owned by someone other than user or
+     root, if writeable by anyone but the owner, or if hardlinked
+     anywhere, quit.  */
+  cp = NULL;
+  if (__lxstat (_STAT_VER, file, &st))
+    cp = _("lstat failed");
+  else if (!S_ISREG (st.st_mode))
+    cp = _("not regular file");
+  else
+    {
+      res = fopen (file, "r");
+      if (!res)
+	cp = _("cannot open");
+      else if (__fxstat (_STAT_VER, fileno (res), &st) < 0)
+	cp = _("fstat failed");
+      else if (st.st_uid && st.st_uid != okuser)
+	cp = _("bad owner");
+      else if (st.st_mode & (S_IWGRP|S_IWOTH))
+	cp = _("writeable by other than owner");
+      else if (st.st_nlink > 1)
+	cp = _("hard linked somewhere");
+    }
+
+  /* If there were any problems, quit.  */
+  if (cp != NULL)
+    {
+      __rcmd_errstr = cp;
+      if (res)
+	fclose (res);
+      return NULL;
+    }
+
+  return res;
+}
+
 /*
  * New .rhosts strategy: We are passed an ip address. We spin through
  * hosts.equiv and .rhosts looking for a match. When the .rhosts only
@@ -297,83 +340,60 @@ ruserok(rhost, superuser, ruser, luser)
  * Returns 0 if ok, -1 if not ok.
  */
 int
-iruserok(raddr, superuser, ruser, luser)
-	u_int32_t raddr;
-	int superuser;
-	const char *ruser, *luser;
+iruserok (raddr, superuser, ruser, luser)
+     u_int32_t raddr;
+     int superuser;
+     const char *ruser, *luser;
 {
-	register char *cp;
-	struct stat sbuf;
-	struct passwd pwdbuf, *pwd;
-	FILE *hostf;
-	int first;
-
-	first = 1;
-	hostf = superuser ? NULL : fopen(_PATH_HEQUIV, "r");
-again:
-	if (hostf) {
-		if (__ivaliduser(hostf, raddr, luser, ruser) == 0) {
-			(void)fclose(hostf);
-			return 0;
-		}
-		(void)fclose(hostf);
-	}
-	if (first == 1 && (__check_rhosts_file || superuser)) {
-		char *pbuf;
-		size_t dirlen;
-		size_t buflen = __sysconf (_SC_GETPW_R_SIZE_MAX);
-		char *buffer = __alloca (buflen);
-
-		first = 0;
-		if (__getpwnam_r (luser, &pwdbuf, buffer, buflen, &pwd) < 0)
-			return -1;
+  FILE *hostf;
+  int isbad;
 
-		dirlen = strlen (pwd->pw_dir);
-		pbuf = alloca (dirlen + sizeof "/.rhosts");
-		__mempcpy (__mempcpy (pbuf, pwd->pw_dir, dirlen),
-			   "/.rhosts", sizeof "/.rhosts");
-
-		/*
-		 * Change effective uid while opening .rhosts.  If root and
-		 * reading an NFS mounted file system, can't read files that
-		 * are protected read/write owner only.
-		 */
-		if (__access (pbuf, R_OK) != 0)
-		  hostf = NULL;
-		else
-		  {
-		    uid_t uid = geteuid ();
-		    seteuid (pwd->pw_uid);
-		    hostf = fopen (pbuf, "r");
-		    seteuid (uid);
-		  }
-
-		if (hostf == NULL)
-			return -1;
-		/*
-		 * If not a regular file, or is owned by someone other than
-		 * user or root or if writeable by anyone but the owner, quit.
-		 */
-		cp = NULL;
-		if (lstat(pbuf, &sbuf) < 0)
-			cp = _(".rhosts lstat failed");
-		else if (!S_ISREG(sbuf.st_mode))
-			cp = _(".rhosts not regular file");
-		else if (fstat(fileno(hostf), &sbuf) < 0)
-			cp = _(".rhosts fstat failed");
-		else if (sbuf.st_uid && sbuf.st_uid != pwd->pw_uid)
-			cp = _("bad .rhosts owner");
-		else if (sbuf.st_mode & (S_IWGRP|S_IWOTH))
-			cp = _(".rhosts writeable by other than owner");
-		/* If there were any problems, quit. */
-		if (cp) {
-			__rcmd_errstr = cp;
-			(void)fclose(hostf);
-			return -1;
-		}
-		goto again;
-	}
+  if (!superuser)
+    hostf = iruserfopen (_PATH_HEQUIV, 0);
+
+  if (hostf)
+    {
+      isbad = __ivaliduser (hostf, raddr, luser, ruser);
+      fclose (hostf);
+
+      if (!isbad)
+	return 0;
+    }
+
+  if (__check_rhosts_file || superuser)
+    {
+      char *pbuf;
+      struct passwd pwdbuf, *pwd;
+      size_t dirlen;
+      size_t buflen = __sysconf (_SC_GETPW_R_SIZE_MAX);
+      char *buffer = __alloca (buflen);
+      uid_t uid;
+
+      if (__getpwnam_r (luser, &pwdbuf, buffer, buflen, &pwd))
 	return -1;
+
+      dirlen = strlen (pwd->pw_dir);
+      pbuf = alloca (dirlen + sizeof "/.rhosts");
+      __mempcpy (__mempcpy (pbuf, pwd->pw_dir, dirlen),
+		 "/.rhosts", sizeof "/.rhosts");
+
+       /* Change effective uid while reading .rhosts.  If root and
+	  reading an NFS mounted file system, can't read files that
+	  are protected read/write owner only.  */
+       uid = geteuid ();
+       seteuid (pwd->pw_uid);
+       hostf = iruserfopen (pbuf, pwd->pw_uid);
+
+       if (hostf != NULL)
+	 {
+           isbad = __ivaliduser (hostf, raddr, luser, ruser);
+           fclose (hostf);
+	 }
+
+       seteuid (uid);
+       return isbad;
+    }
+  return -1;
 }
 
 /*
diff --git a/intl/bindtextdom.c b/intl/bindtextdom.c
index 0540d1e162..3862544575 100644
--- a/intl/bindtextdom.c
+++ b/intl/bindtextdom.c
@@ -1,5 +1,5 @@
 /* Implementation of the bindtextdomain(3) function
-   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
 
    This file is part of the GNU C Library.  Its master source is NOT part of
    the C library, however.
@@ -65,7 +65,9 @@ extern struct binding *_nl_domain_bindings;
    prefix.  So we have to make a difference here.  */
 #ifdef _LIBC
 # define BINDTEXTDOMAIN __bindtextdomain
-# define strdup(str) __strdup (str)
+# ifndef strdup
+#  define strdup(str) __strdup (str)
+# endif
 #else
 # define BINDTEXTDOMAIN bindtextdomain__
 #endif
diff --git a/libc.map b/libc.map
index 4ecb0f8884..e4a289de1e 100644
--- a/libc.map
+++ b/libc.map
@@ -104,6 +104,7 @@ GLIBC_2.0 {
     _dl_debug_message;
     __ffs;
     __close; __connect; __fcntl; __lseek; __open; __read; __send; __wait;
+    __ieee_get_fp_control; __ieee_set_fp_control;
 
     # Exception handling support functions from libgcc
     __register_frame; __register_frame_table; __deregister_frame;
diff --git a/setjmp/tst-setjmp.c b/setjmp/tst-setjmp.c
index b4cba1177d..3eb1516830 100644
--- a/setjmp/tst-setjmp.c
+++ b/setjmp/tst-setjmp.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1997, 1998 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
@@ -83,13 +83,14 @@ main (void)
 
   if (!lose && value == 10)
     {
-      /* And again for the `__setjmp' function.  */
-      extern int __setjmp (jmp_buf);
-
+      /* And again for the `_setjmp' function.  */
+#ifndef _setjmp
+      extern int _setjmp (jmp_buf);
+#endif
       last_value = -1;
       lose = 0;
 
-      value = __setjmp (env);
+      value = _setjmp (env);
       if (value != last_value + 1)
 	{
 	  fputs("Shouldn't have ", stdout);
diff --git a/sysdeps/i386/i486/bits/string.h b/sysdeps/i386/i486/bits/string.h
index 6690066d94..60148b7da5 100644
--- a/sysdeps/i386/i486/bits/string.h
+++ b/sysdeps/i386/i486/bits/string.h
@@ -235,7 +235,7 @@ __memset_cc_by2 (void *__s, int __c, size_t __n)
      "jnz	1b\n"
      "2:\n\t"
      "movw	%w2,(%0)"
-     : "=&r" (__tmp), "=&r" (__dummy)
+     : "=&r" (__tmp), "=&r" (__d0)
      : "q" (0x01010101UL * (unsigned char) __c), "0" (__tmp), "1" (__n / 2)
      : "memory", "cc");
   return __s;
@@ -1516,6 +1516,7 @@ __strstr_g (__const char *__haystack, __const char *__needle)
 __STRING_INLINE char *
 __strstr_g (__const char *__haystack, __const char *__needle)
 {
+  register unsigned long int __d0, __d1, __d2, __d3;
   register char *__res;
   __asm__ __volatile__
     ("cld\n\t"
diff --git a/sysdeps/unix/sysv/linux/alpha/readdir.c b/sysdeps/unix/sysv/linux/alpha/readdir.c
index 96a6a76945..300ebb2629 100644
--- a/sysdeps/unix/sysv/linux/alpha/readdir.c
+++ b/sysdeps/unix/sysv/linux/alpha/readdir.c
@@ -1,4 +1,7 @@
 #define readdir64 __no_readdir64_decl
+#define __readdir64 __no___readdir64_decl
 #include <sysdeps/unix/readdir.c>
+#undef __readdir64
+strong_alias (__readdir, __readdir64)
 #undef readdir64
 weak_alias (__readdir, readdir64)
diff --git a/sysdeps/unix/sysv/linux/alpha/syscalls.list b/sysdeps/unix/sysv/linux/alpha/syscalls.list
index 8b593a0162..ea3c9452d2 100644
--- a/sysdeps/unix/sysv/linux/alpha/syscalls.list
+++ b/sysdeps/unix/sysv/linux/alpha/syscalls.list
@@ -51,6 +51,7 @@ sendmsg		-	sendmsg		3	__libc_sendmsg	__sendmsg sendmsg
 sendto		-	sendto		6	__libc_sendto	__sendto sendto
 setsockopt	-	setsockopt	5	__setsockopt	setsockopt
 shutdown	-	shutdown	2	__shutdown	shutdown
+socket		-	socket		3	__socket	socket
 socketpair	-	socketpair	4	__socketpair	socketpair
 sysctl		-	_sysctl		6	sysctl
 
diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure
index 79dbf16912..dfee18f4eb 100644
--- a/sysdeps/unix/sysv/linux/configure
+++ b/sysdeps/unix/sysv/linux/configure
@@ -98,3 +98,14 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
+
+# We need some extensions to the `ldd' script.
+
+case "$machine" in
+  i[3456]86* | m68k | sparc/sparc32)
+    ldd_rewrite_script=../sysdeps/unix/sysv/linux/ldd-rewrite.sed
+    ;;
+  *)
+    ;;
+esac
+
diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in
index 18bb6dc469..fc332876bb 100644
--- a/sysdeps/unix/sysv/linux/configure.in
+++ b/sysdeps/unix/sysv/linux/configure.in
@@ -83,3 +83,14 @@ fi
 if test -f $srcdir/elf/ldconfig.c; then
   has_ldconfig=yes
 fi
+
+# We need some extensions to the `ldd' script.
+changequote(,)
+case "$machine" in
+  i[3456]86* | m68k | sparc/sparc32)
+    ldd_rewrite_script=../sysdeps/unix/sysv/linux/ldd-rewrite.sed
+    ;;
+  *)
+    ;;
+esac
+changequote([,])
diff --git a/sysdeps/unix/sysv/linux/i386/Makefile b/sysdeps/unix/sysv/linux/i386/Makefile
index 2ecedd4b15..d54c4cadbc 100644
--- a/sysdeps/unix/sysv/linux/i386/Makefile
+++ b/sysdeps/unix/sysv/linux/i386/Makefile
@@ -2,3 +2,8 @@ ifeq ($(subdir),misc)
 sysdep_routines += ioperm iopl vm86
 sysdep_headers += sys/perm.h sys/vm86.h
 endif
+
+ifeq ($(subdir),elf)
+others      += lddlibc4
+install-bin += lddlibc4
+endif