update from main archive 970120
authordrepper <drepper>
Tue, 21 Jan 1997 06:08:23 +0000 (06:08 +0000)
committerdrepper <drepper>
Tue, 21 Jan 1997 06:08:23 +0000 (06:08 +0000)
26 files changed:
ChangeLog
Makeconfig
Makefile
README
config.h.in
configure
configure.in
elf/Makefile
elf/dl-error.c
elf/dl-load.c
elf/ldd.bash.in
elf/ldd.sh.in
elf/link.h
elf/rtld.c
libc-symbols.h
libio/Makefile
libio/iovdprintf.c [new file with mode: 0644]
libio/vdprintf.c [deleted file]
malloc/Makefile
manual/filesys.texi
nss/Makefile
resolv/Makefile
sysdeps/generic/dl-sysdep.c
sysdeps/generic/sockaddrcom.h
sysdeps/mach/hurd/dl-sysdep.c
version.h

index 4df0d56..a42b6d0 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,147 @@
+Tue Jan 21 04:05:20 1997  Ulrich Drepper  <drepper@cygnus.com>
+
+       * version.h (VERSION): Bump to 1.101.
+
+       Implement -d and -r option to `ldd' to check relocations.
+       * elf/dl-error.c: Add another method to intercept errors.
+       (_dl_receive_error): New function.  Install user defined handler.
+       (receiver): New variable.  Contains pointer to user provided handler.
+       (_dl_signal_error): If user provided handler is installed call this.
+       * elf/dl-load.c (_dl_map_object): When shared object is not found in
+       trace mode initialize a few more fields so that lookup can actually
+       happen but always fails.
+       * elf/ldd.sh.in: Rewrite argument handling.  Recognize new arguments
+       to trigger reloation test.  Return with appropriate error code if
+       a file wasn't found.  Print warning if object is not executable.
+       * elf/ldd.bash.in: Likewise.
+       * elf/link.h (receiver_fct): New type.  Used in _dl_receive_error.
+       (_dl_sysdep_error): New prototype.
+       (_dl_receive_error): New prototype.
+       (_dl_signal_error): Remove  __attribute__ ((__noreturn__)).
+       * elf/rtld.c (dl_main): Rewrite argument handling.  More than
+       one argument allowed.  Recognize --data-relocs and --function-relocs
+       arguments.
+       Don't determine `lazy' mode from LD_BIND_NOW environment variable
+       when in trace mode.
+       If in trace mode and either --data-relocs or --function-relocs is
+       given perform relocation.  Report errors using print_unresolved
+       function.
+       (print_unresolved): New function.  Print information about missing
+       symbol on stderr.
+       * sysdeps/generic/dl-sysdep.c (_dl_sysdep_error): New function.
+       Like _dl_sysdep_message but print to stderr.
+       * sysdeps/mach/hurd/dl-sysdep.c: Likewise.
+
+       * sysdeps/generic/sockaddrcom.h: Add definition of sa_family_t.
+       Reported by Andreas Schwab.
+       (__SOCKADDR_COMMON): Use sa_family_t for family member.
+       * sysdeps/unix/bsd/bsd4.4/sockaddrcom.h: Likewise.
+
+       Linux/Sparc support by Miguel de Icaza.
+       * sysdeps/sparc/fpu_control.h: New file.
+       * sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: New file.
+       * sysdeps/unix/sysv/linux/sparc/brk.c: New file.
+       * sysdeps/unix/sysv/linux/sparc/profil-counter.h: New file.
+       * sysdeps/unix/sysv/linux/sparc/sigaction.c: New file.
+       * sysdeps/unix/sysv/linux/sparc/socket.S: New file.
+       * sysdeps/unix/sysv/linux/sparc/syscall.S: New file.
+       * sysdeps/unix/sysv/linux/sparc/sysdep.h: New file.
+       * sysdeps/unix/sysv/linux/sparc/Dist: New file.
+       * sysdeps/unix/sysv/linux/sparc/Makefile: New file.
+
+       * sysdeps/unix/sysv/linux/net/if_arp.h: Don't use kernel header.
+       Provide own definition based on 4.4BSD and Linux.
+       * sysdeps/unix/sysv/linux/net/ppp_defs.h: Define __u32 before
+       including <linux/ppp_defs.h>.
+       * sysdeps/unix/sysv/linux/sys/msq_buf.h (struct msqid_ds): Don't
+       use __pid_t since the kernel might have a different size.
+       * sysdeps/unix/sysv/linux/sys/shm_buf.h (struct shmid_ds): Likewise.
+       Reported by Andreas Schwab.
+
+       * time/asctime.c: Update copyright.
+       * time/dysize.c: Likewise.
+       * time/gmtime.c: Likewise.
+       * time/timegm.c: Likewise.
+       * time/offtime.c: Likewise.  De-ANSI-declfy.
+
+       * time/tzset.c (__tzset_internal): When TZ envvar does not name a
+       DST timezone don't default to offset -1.
+
+       * sysdeps/unix/sysv/linux/net/route.h: Don't use kernel header.
+       Reported by a sun <asun@zoology.washington.edu>.
+
+       * resolv/Makefile: Correct spelling: subdirs-dirs -> subdir-dirs.
+
+       * sysdeps/stub/sysv_signal.c: New file.  Stub implementation.
+
+       * Makefile (distribute): Add mcheck.h.
+
+       * nis/Makefile (distribute): Add nss-nis.h.
+
+       * libio/Makefile (routines): Change vdprintf to iovdprintf to prevent
+       dist problem.
+
+       * nss/Makefile (distribute): Add digits_dots.c.
+
+       * sysdeps/unix/sysv/linux/Dist: Add kernel_sigaction.h.
+       * sysdeps/unix/sysv/linux/alpha/Dist: Add sys/procfs.h.
+       * sysdeps/unix/sysv/linux/sparc/Dist: Add clone.S.
+       * new-malloc/Makefile (distribute): Add mcheck-init.c and mcheck.h.
+
+Mon Jan 20 17:54:28 1997  Sven Verdoolaege  <skimo@breughel.ufsia.ac.be>
+
+       * manual/filesys.texi: Fix little problem (reentrant->readdir).
+
+Fri Jan 17 19:07:07 1997  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+       * configure.in [$elf=yes]: Check for support of .previous and
+       .popsection in the assembler.
+       * config.h.in: Add HAVE_ASM_PREVIOUS_DIRECTIVE and
+       HAVE_ASM_POPSECTION_DIRECTIVE.
+       * libc-symbols.h (__make_section_unallocated) [HAVE_ELF]: Define
+       appropriate if either .previous or .popsection is supported.
+       (libc_warning) [HAVE_ELF]: Use it here.
+
+Sat Jan 18 22:15:26 1997  Richard Henderson  <rth@tamu.edu>
+
+       * Makeconfig (CFLAGS-.so): Add -fno-common to prevent odd sorts of
+       errors that can occur when linking libc.so.
+
+Mon Jan 20 05:20:49 1997  Ulrich Drepper  <drepper@cygnus.com>
+
+       * elf/dl-load.c (open_path): When running setuid don't try
+       a directory if it is not given with the full name.
+
+       * elf/Makefile (before-compile): New variable.  Mention trusted-dirs.h.
+       (trusted-dirs.h): Construct file from $(default-rpath) and
+       $(user-defined-trusted-dirs) variables.
+       * elf/dl-load.c (_dl_map_object): Pass additional argument to open_path
+       which is NULL except for the LD_LIBRARY_PATH pass in which case it
+       is a pointer to the list of directories from the trusted-dirs.h
+       file.
+       (open_path): Accept additional argument with list of trusted dirs.
+       When running setuid and a list of trusted dirs is given only use
+       those which are mentioned in the list.
+
+       * elf/rtld.c (dl_main): Don't reject whole LD_LIBRARY_PATH when
+       running setuid.  Instead accept entries which do not contain a '/'.
+
+       * Makeconfig: Correct comment about +(default_cflags).
+
+Mon Jan 20 05:11:14 1997  Hrvoje Niksic  <hniksic@srce.hr>
+
+       * time/strptime.c (recursive): Use && not || to test for valid
+       argument.
+
+Mon Jan 20 05:06:50 1997  Ulrich Drepper  <drepper@cygnus.com>
+
+       * elf/ldd.sh.in: Exit with value 1 if an error occured.
+       * elf/ldd.bash.in: Likewise.
+
+       * elf/rtld.c (dl_main): Do not always ignore LD_PRELOAD when the
+       binary runs setuid.  It is save to use those entries which do not
+       contain a '/'.  This is compatible with Solaris-2.
+
 Mon Jan 20 03:02:50 1997  Ulrich Drepper  <drepper@cygnus.com>
 
        * Make-dist: Update and reformat copyright.
index 3c658bf..37d5f62 100644 (file)
@@ -421,7 +421,7 @@ ifdef               CFLAGS
 endif          # CFLAGS
 endif  # +cflags
 
-# If none of the above worked, default to "-g".
+# If none of the above worked, default to "-g -O".
 ifeq   "$(strip $(+cflags))" ""
 +cflags        := $(default_cflags)
 endif  # $(+cflags) == ""
@@ -470,7 +470,7 @@ ifeq (yes,$(build-shared))
 # The PIC object files are named foo.so.
 object-suffixes += .so
 CPPFLAGS-.so = -DPIC
-CFLAGS-.so = -fPIC
+CFLAGS-.so = -fPIC -fno-common
 libtype.so := lib%_pic.a
 endif
 ifeq (yes,$(build-profile))
index 6420be8..8f0a879 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -295,7 +295,8 @@ distribute  := README INSTALL FAQ NOTES NEWS PROJECTS                       \
               config.h.in config.make.in config-name.in Makefile.in    \
               autolock.sh rellns-sh munch-tmpl.c munch.awk interp.c    \
               sysdep.h set-hooks.h libc-symbols.h version.h shlib-versions \
-              rpm/Makefile rpm/template rpm/rpmrc nsswitch.h netgroup.h
+              rpm/Makefile rpm/template rpm/rpmrc nsswitch.h netgroup.h \
+              mcheck.h
 
 distribute := $(strip $(distribute))
 generated := $(generated) stubs.h version-info.h
diff --git a/README b/README
index 7f8b4a2..418d820 100644 (file)
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-This directory contains the version 1.96 test release of the GNU C Library.
+This directory contains the version 1.101 test release of the GNU C Library.
 Many bugs have been fixed since the last release.
 Some bugs surely remain.
 
@@ -46,7 +46,7 @@ provides the Unix `crypt' function, plus some other entry points.
 Because of the United States export restriction on DES implementations,
 we are distributing this code separately from the rest of the C
 library.  There is an extra distribution tar file just for crypt; it is
-called `glibc-1.96-crypt.tar.gz'.  You can just unpack the crypt
+called `glibc-1.101-crypt.tar.gz'.  You can just unpack the crypt
 distribution along with the rest of the C library and build; you can
 also build the library without getting crypt.  Users outside the USA
 can get the crypt distribution via anonymous FTP from ftp.uni-c.dk
index a02094a..e928eac 100644 (file)
    This is defined by configure under --enable-libio.  */
 #undef USE_IN_LIBIO
 
+/* Define if using ELF and the assembler supports the `.previous'
+   directive.  */
+#undef HAVE_ASM_PREVIOUS_DIRECTIVE
+
+/* Define if using ELF and the assembler supports the `.popsection'
+   directive.  */
+#undef HAVE_ASM_POPSECTION_DIRECTIVE
+
 /*
 \f */
 
index 048882c..64c9ea5 100755 (executable)
--- a/configure
+++ b/configure
@@ -1604,14 +1604,66 @@ EOF
 
 fi
 
+if test $elf = yes; then
+  echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
+echo "configure:1610: checking for .previous assembler directive" >&5
+if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    cat > conftest.s <<EOF
+.section foo_section
+.previous
+EOF
+  if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+    libc_cv_asm_previous_directive=yes
+  else
+    libc_cv_asm_previous_directive=no
+  fi
+  rm -f conftest*
+fi
+
+echo "$ac_t""$libc_cv_asm_previous_directive" 1>&6
+  if test $libc_cv_asm_previous_directive = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_ASM_PREVIOUS_DIRECTIVE 1
+EOF
+
+  else
+    echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
+echo "configure:1634: checking for .popsection assembler directive" >&5
+if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+      cat > conftest.s <<EOF
+.pushsection foo_section
+.popsection
+EOF
+    if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1642: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+      libc_cv_asm_popsection_directive=yes
+    else
+      libc_cv_asm_popsection_directive=no
+    fi
+    rm -f conftest*
+fi
+
+echo "$ac_t""$libc_cv_asm_popsection_directive" 1>&6
+    if test $libc_cv_asm_popsection_directive = yes; then
+      cat >> confdefs.h <<\EOF
+#define HAVE_ASM_POPSECTION_DIRECTIVE 1
+EOF
+
+    fi
+  fi
+fi
+
 if test $elf != yes; then
   echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
-echo "configure:1610: checking for .init and .fini sections" >&5
+echo "configure:1662: checking for .init and .fini sections" >&5
 if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1615 "configure"
+#line 1667 "configure"
 #include "confdefs.h"
 
 int main() {
@@ -1620,7 +1672,7 @@ asm (".section .init");
                                    asm (".text");
 ; return 0; }
 EOF
-if { (eval echo configure:1624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1676: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   libc_cv_have_initfini=yes
 else
@@ -1645,19 +1697,19 @@ if test $elf = yes; then
   libc_cv_asm_underscores=no
 else
   echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
-echo "configure:1649: checking for _ prefix on C symbol names" >&5
+echo "configure:1701: checking for _ prefix on C symbol names" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1654 "configure"
+#line 1706 "configure"
 #include "confdefs.h"
 asm ("_glibc_foobar:");
 int main() {
 glibc_foobar ();
 ; return 0; }
 EOF
-if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
+if { (eval echo configure:1713: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
   rm -rf conftest*
   libc_cv_asm_underscores=yes
 else
@@ -1684,7 +1736,7 @@ if test $elf = yes; then
   libc_cv_asm_weakext_directive=no
 else
   echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
-echo "configure:1688: checking for assembler .weak directive" >&5
+echo "configure:1740: checking for assembler .weak directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1707,7 +1759,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
 
 if test $libc_cv_asm_weak_directive = no; then
   echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
-echo "configure:1711: checking for assembler .weakext directive" >&5
+echo "configure:1763: checking for assembler .weakext directive" >&5
 if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1744,7 +1796,7 @@ EOF
 fi
 
 echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
-echo "configure:1748: checking for ld --no-whole-archive" >&5
+echo "configure:1800: checking for ld --no-whole-archive" >&5
 if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1755,7 +1807,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
                            -nostdlib -nostartfiles -Wl,--no-whole-archive
-                           -o conftest conftest.c'; { (eval echo configure:1759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+                           -o conftest conftest.c'; { (eval echo configure:1811: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_ld_no_whole_archive=yes
 else
   libc_cv_ld_no_whole_archive=no
@@ -1766,7 +1818,7 @@ fi
 echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
 
 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
-echo "configure:1770: checking for gcc -fno-exceptions" >&5
+echo "configure:1822: checking for gcc -fno-exceptions" >&5
 if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
@@ -1777,7 +1829,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
                            -nostdlib -nostartfiles -fno-exceptions
-                           -o conftest conftest.c'; { (eval echo configure:1781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+                           -o conftest conftest.c'; { (eval echo configure:1833: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_gcc_no_exceptions=yes
 else
   libc_cv_gcc_no_exceptions=no
@@ -1829,7 +1881,7 @@ if test "$uname" = generic; then
   fi
 
   echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
-echo "configure:1833: checking OS release for uname" >&5
+echo "configure:1885: 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
@@ -1851,7 +1903,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:1855: checking OS version for uname" >&5
+echo "configure:1907: 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
@@ -1873,7 +1925,7 @@ else
 fi
 
 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
-echo "configure:1877: checking stdio selection" >&5
+echo "configure:1929: checking stdio selection" >&5
 
 case $stdio in
 libio) cat >> confdefs.h <<\EOF
@@ -1885,7 +1937,7 @@ esac
 echo "$ac_t""$stdio" 1>&6
 
 echo $ac_n "checking malloc selection""... $ac_c" 1>&6
-echo "configure:1889: checking malloc selection" >&5
+echo "configure:1941: checking malloc selection" >&5
 
 case $malloc in
 new-malloc) USE_NEW_MALLOC=-DUSE_NEW_MALLOC ;;
index 7280c7a..6cd3291 100644 (file)
@@ -496,6 +496,40 @@ if test $libc_cv_asm_set_directive = yes; then
   AC_DEFINE(HAVE_ASM_SET_DIRECTIVE)
 fi
 
+if test $elf = yes; then
+  AC_CACHE_CHECK(for .previous assembler directive,
+                libc_cv_asm_previous_directive, [dnl
+  cat > conftest.s <<EOF
+.section foo_section
+.previous
+EOF
+  if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AC_FD_CC); then
+    libc_cv_asm_previous_directive=yes
+  else
+    libc_cv_asm_previous_directive=no
+  fi
+  rm -f conftest*])
+  if test $libc_cv_asm_previous_directive = yes; then
+    AC_DEFINE(HAVE_ASM_PREVIOUS_DIRECTIVE)
+  else
+    AC_CACHE_CHECK(for .popsection assembler directive,
+                  libc_cv_asm_popsection_directive, [dnl
+    cat > conftest.s <<EOF
+.pushsection foo_section
+.popsection
+EOF
+    if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AC_FD_CC); then
+      libc_cv_asm_popsection_directive=yes
+    else
+      libc_cv_asm_popsection_directive=no
+    fi
+    rm -f conftest*])
+    if test $libc_cv_asm_popsection_directive = yes; then
+      AC_DEFINE(HAVE_ASM_POPSECTION_DIRECTIVE)
+    fi
+  fi
+fi
+
 if test $elf != yes; then
   AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini,
                 [AC_TRY_COMPILE(, [asm (".section .init");
index 8f98cb8..87f2d0d 100644 (file)
@@ -41,6 +41,8 @@ extra-libs     = libdl
 extra-libs-others = $(extra-libs)
 libdl-routines := dlopen dlclose dlsym dlerror dladdr
 
+before-compile = $(objpfx)trusted-dirs.h
+
 
 all: # Make this the default target; it will be defined in Rules.
 
@@ -92,6 +94,17 @@ $(objpfx)$(rtld-installed-name): $(objpfx)ld.so
        ln -s $(<F) $@
 endif
 
+# Build a file mentioning all trustworthy directories to look for shared
+# libraries when using LD_LIBRARY_PATH in a setuid program.  The user can
+# add directories to the list by defining $(user-defined-trusted-dirs)
+# before starting make.
+$(objpfx)trusted-dirs.h: Makefile
+       (for dir in `echo "$(default-rpath) $(user-defined-trusted-dirs)" |   \
+                    sed 's/:/ /g'`; do                                       \
+          echo "  \"$$dir\",";                                               \
+        done;) > $@T
+       mv -f $@T $@
+CFLAGS-dl-load.c = -I$(objdir)/$(subdir)
 
 # Specify the dependencies of libdl.so; its commands come from the generic
 # rule to build a shared library.
index 52eb577..a19ccff 100644 (file)
@@ -37,6 +37,11 @@ struct catch
    this is null.  */
 static struct catch *catch;
 
+/* This points to a function which is called when an error is
+   received.  Unlike the handling of `catch' this function may return.
+   The arguments will be the `errstring' and `objname'.  */
+static receiver_fct receiver;
+
 
 void
 _dl_signal_error (int errcode,
@@ -58,6 +63,13 @@ _dl_signal_error (int errcode,
       catch->objname = objname;
       longjmp (catch->env, errcode ?: -1);
     }
+  else if (receiver)
+    {
+      /* We are inside _dl_receive_error.  Call the user supplied
+        handler and resume the work.  The receiver will still
+        installed.  */
+      (*receiver) (errstring, objname);
+    }
   else
     {
       /* Lossage while resolving the program's own symbols is always fatal.  */
@@ -77,6 +89,8 @@ _dl_catch_error (char **errstring,
 {
   int errcode;
   struct catch *old, c = { errstring: NULL, objname: NULL };
+  /* We need not handle `receiver' since setting a `catch' is handle
+     before it.  */
 
   old = catch;
   errcode = setjmp (c.env);
@@ -96,3 +110,22 @@ _dl_catch_error (char **errstring,
   *objname = c.objname;
   return errcode == -1 ? 0 : errcode;
 }
+
+void
+_dl_receive_error (receiver_fct fct, void (*operate) (void))
+{
+  struct catch *old_catch;
+  receiver_fct old_receiver;
+
+  old_catch = catch;
+  old_receiver = receiver;
+
+  /* Set the new values.  */
+  catch = NULL;
+  receiver = fct;
+
+  (*operate) ();
+
+  catch = old_catch;
+  receiver = old_receiver;
+}
index 7dc6d91..6a3d919 100644 (file)
@@ -1,5 +1,5 @@
 /* _dl_map_object -- Map in a shared object's segments from the file.
-   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997 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
@@ -409,7 +409,8 @@ _dl_map_object_from_fd (char *name, int fd, char *realname,
 static int
 open_path (const char *name, size_t namelen,
           const char *dirpath,
-          char **realname)
+          char **realname,
+          const char *trusted_dirs[])
 {
   char *buf;
   const char *p;
@@ -426,13 +427,42 @@ open_path (const char *name, size_t namelen,
   do
     {
       size_t buflen;
+      size_t this_len;
 
       dirpath = p;
       p = strpbrk (dirpath, ":;");
       if (p == NULL)
        p = strchr (dirpath, '\0');
 
-      if (p == dirpath)
+      this_len = p - dirpath;
+
+      /* When we run a setuid program we do not accept any directory.  */
+      if (__libc_enable_secure)
+       {
+         /* All trusted directory must be complete name.  */
+         if (dirpath[0] != '/')
+           continue;
+
+         /* If we got a list of trusted directories only accept one
+            of these.  */
+         if (trusted_dirs != NULL)
+           {
+             const char **trust = trusted_dirs;
+
+             while (*trust !=  NULL)
+               if (memcmp (dirpath, *trust, this_len) == 0
+                   && (*trust)[this_len] == '\0')
+                 break;
+               else
+                 ++trust;
+
+             /* If directory is not trusted, ignore this directory.  */
+             if (*trust == NULL)
+               continue;
+           }
+       }
+
+      if (this_len == 0)
        {
          /* Two adjacent colons, or a colon at the beginning or the end of
             the path means to search the current directory.  */
@@ -442,10 +472,10 @@ open_path (const char *name, size_t namelen,
       else
        {
          /* Construct the pathname to try.  */
-         (void) memcpy (buf, dirpath, p - dirpath);
-         buf[p - dirpath] = '/';
-         (void) memcpy (&buf[(p - dirpath) + 1], name, namelen);
-         buflen = p - dirpath + 1 + namelen;
+         (void) memcpy (buf, dirpath, this_len);
+         buf[this_len] = '/';
+         (void) memcpy (&buf[this_len + 1], name, namelen);
+         buflen = this_len + 1 + namelen;
        }
 
       fd = __open (buf, O_RDONLY);
@@ -508,9 +538,9 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
 
       size_t namelen = strlen (name) + 1;
 
-      inline void trypath (const char *dirpath)
+      inline void trypath (const char *dirpath, const char *trusted[])
        {
-         fd = open_path (name, namelen, dirpath, &realname);
+         fd = open_path (name, namelen, dirpath, &realname, trusted);
        }
 
       fd = -1;
@@ -521,16 +551,24 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
        if (l && l->l_info[DT_RPATH])
          trypath ((const char *) (l->l_addr +
                                   l->l_info[DT_STRTAB]->d_un.d_ptr +
-                                  l->l_info[DT_RPATH]->d_un.d_val));
+                                  l->l_info[DT_RPATH]->d_un.d_val), NULL);
       /* If dynamically linked, try the DT_RPATH of the executable itself.  */
       l = _dl_loaded;
       if (fd == -1 && l && l->l_type != lt_loaded && l->l_info[DT_RPATH])
        trypath ((const char *) (l->l_addr +
                                 l->l_info[DT_STRTAB]->d_un.d_ptr +
-                                l->l_info[DT_RPATH]->d_un.d_val));
+                                l->l_info[DT_RPATH]->d_un.d_val), NULL);
       /* Try an environment variable (unless setuid).  */
       if (fd == -1 && ! __libc_enable_secure)
-       trypath (getenv ("LD_LIBRARY_PATH"));
+       {
+         static const char *trusted_dirs[] =
+         {
+#include "trusted-dirs.h"
+           NULL
+         };
+
+         trypath (getenv ("LD_LIBRARY_PATH"), trusted_dirs);
+       }
       if (fd == -1)
        {
          /* Check the list of libraries in the file /etc/ld.so.cache,
@@ -555,7 +593,7 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
       if (fd == -1)
        {
          extern const char *_dl_rpath; /* Set in rtld.c. */
-         trypath (_dl_rpath);
+         trypath (_dl_rpath, NULL);
        }
     }
   else
@@ -590,6 +628,7 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
             are only interested in the list of libraries this isn't
             so severe.  Fake an entry with all the information we
             have (in fact only the name).  */
+         static const ElfW(Symndx) dummy_bucket = STN_UNDEF;
 
          /* Enter the new object in the list of loaded objects.  */
          if ((name_copy = local_strdup (name)) == NULL
@@ -599,6 +638,11 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
          /* We use an opencount of 0 as a sign for the faked entry.  */
          l->l_opencount = 0;
          l->l_reserved = 0;
+         l->l_buckets = &dummy_bucket;
+         l->l_nbuckets = 1;
+         l->l_relocated = 1;
+
+         return l;
        }
       else
        _dl_signal_error (errno, name, "cannot open shared object file");
index 6e2b515..d174709 100644 (file)
@@ -29,23 +29,39 @@ TEXTDOMAIN=libc
 TEXTDOMAINDIR=@TEXTDOMAINDIR@
 
 RTLD=@RTLD@
+RELOCS=
 
 while test $# -gt 0; do
   case "$1" in
-  --v*)
+  --v | --ve | --ver | --vers | --versi | --versio | --version)
     echo $"ldd (GNU libc) @VERSION@
 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
     exit 0 ;;
-  --h*)
+  --h | --he | --hel | --help)
     echo $"ldd [OPTION]... FILE...
-  --help           print this help and exit
-  --version        print version information and exit
+      --help              print this help and exit
+      --version           print version information and exit
+  -d, --data-relocs       process data relocations
+  -r, --function-relocs   process data and function relocations
 Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
     exit 0 ;;
+  -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
+  --data-rel | --data-relo | --data-reloc | --data-relocs)
+    RELOCS='--data-relocs'
+    shift ;;
+  -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
+  --function | --function- | --function-r | --function-re | --function-rel | \
+  --function-relo | --function-reloc | --function-relocs)
+    RELOCS='--function-relocs'
+    shift ;;
   --)          # Stop option processing.
     shift; break ;;
+  -*)
+    echo >&2 $"ldd: unrecognized option" "\`$1'"
+    echo >&2 $"Try \`ldd --help' for more information."
+    exit 1 ;;
   *)
     break ;;
   esac
@@ -53,9 +69,8 @@ done
 
 case $# in
 0)
-  echo >&2 $"\
-ldd: missing file arguments
-Try \`ldd --help' for more information."
+  echo >&2 $"ldd: missing file arguments"
+  echo >&2 $"Try \`ldd --help' for more information."
   exit 1 ;;
 1)
   # We don't list the file name when there is only one.
@@ -65,14 +80,21 @@ Try \`ldd --help' for more information."
   esac
   if test ! -f "$file"; then
     echo "${file}:" $"no such file"
-  elif ${RTLD} --verify "$file"; then
-    LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} "$file" && exit 1
+    exit 1
   else
-    echo $"    not a dynamic executable"
+    test -x "$file" ||
+      echo $"warning: you do not have execution permission for" "\`$file'"
+    if ${RTLD} --verify "$file"; then
+      LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} ${RELOCS} "$file" || exit 1
+    else
+      echo $"  not a dynamic executable"
+      exit 1
+    fi
   fi
   exit ;;
 *)
   set -e       # Bail out immediately if ${RTLD} loses on any argument.
+  result=0
   for file; do
     echo "${file}:"
     case "$file" in
@@ -80,16 +102,22 @@ Try \`ldd --help' for more information."
     *) file="./$file" ;;
     esac
     if test ! -f "$file"; then
-      echo "$file:" $"no such file"
-    elif ${RTLD} --verify "$file"; then
-      LD_TRACE_LOADED_OBJECTS=1 ${RTLD} "$file"
+      echo "${file}:" $"no such file"
+      result=1
     else
-      echo $"  not a dynamic executable"
+      test -x "$file" ||
+       echo $"warning: you do not have execution permission for" "\`$file'"
+      if ${RTLD} --verify "$file"; then
+       LD_TRACE_LOADED_OBJECTS=1 ${RTLD} ${RELOCS} "$file" || result=1
+      else
+       echo $" not a dynamic executable"
+       result=1
+      fi
     fi
   done
 esac
 
-exit 0
+exit $result
 # Local Variables:
 #  mode:ksh
 # End:
index 5b6cc3a..4351578 100644 (file)
 # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
 
 RTLD=@RTLD@
+RELOCS=
 
 while test $# -gt 0; do
   case "$1" in
-  --v*)
+  --v | --ve | --ver | --vers | --versi | --versio | --version)
     echo 'ldd (GNU libc) @VERSION@
 Copyright (C) 1996, 1997 Free Software Foundation, Inc.
 This is free software; see the source for copying conditions.  There is NO
 warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'
     exit 0 ;;
-  --h*)
+  --h | --he | --hel | --help)
     echo "ldd [OPTION]... FILE...
-  --help           print this help and exit
-  --version        print version information and exit
+      --help              print this help and exit
+      --version           print version information and exit
+  -d, --data-relocs       process data relocations
+  -r, --function-relocs   process data and function relocations
 Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
     exit 0 ;;
+  -d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
+  --data-rel | --data-relo | --data-reloc | --data-relocs)
+    RELOCS='--data-relocs'
+    shift ;;
+  -r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
+  --function | --function- | --function-r | --function-re | --function-rel | \
+  --function-relo | --function-reloc | --function-relocs)
+    RELOCS='--function-relocs'
+    shift ;;
   --)          # Stop option processing.
     shift; break ;;
+  -*)
+    echo >&2 "\
+ldd: unrecognized option \`$1'
+Try \`ldd --help' for more information."
+    exit 1 ;;
   *)
     break ;;
   esac
@@ -61,14 +78,21 @@ Try \`ldd --help' for more information."
   esac
   if test ! -f "$file"; then
     echo "${file}: no such file"
-  elif ${RTLD} --verify "$file"; then
-    LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} "$file" && exit 1
+    exit 1
   else
-    echo '     not a dynamic executable'
+    test -x "$file" ||
+      echo "warning: you do not have execution permission for \`$file'"
+    if ${RTLD} --verify "$file"; then
+      LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} ${RELOCS} "$file" || exit 1
+    else
+      echo '   not a dynamic executable'
+      exit 1
+    fi
   fi
   exit ;;
 *)
   set -e       # Bail out immediately if ${RTLD} loses on any argument.
+  result=0
   for file; do
     echo "${file}:"
     case "$file" in
@@ -76,13 +100,19 @@ Try \`ldd --help' for more information."
     *) file="./$file" ;;
     esac
     if test ! -f "$file"; then
-      echo "$file: no such file"
-    elif ${RTLD} --verify "$file"; then
-      LD_TRACE_LOADED_OBJECTS=1 ${RTLD} "$file"
+      echo "${file}: no such file"
+      result=1
     else
-      echo '   not a dynamic executable'
+      test -x "$file" ||
+       echo "warning: you do not have execution permission for \`$file'"
+      if ${RTLD} --verify "$file"; then
+       LD_TRACE_LOADED_OBJECTS=1 ${RTLD} ${RELOCS} "$file" || result=1
+      else
+       echo '  not a dynamic executable'
+       result=1
+      fi
     fi
   done
 esac
 
-exit 0
+exit $result
index 7e0b607..95d8f09 100644 (file)
@@ -137,6 +137,12 @@ struct link_map
     unsigned int l_global:1;   /* Nonzero if object in _dl_global_scope.  */
     unsigned int l_reserved:2; /* Reserved for internal use.  */
   };
+
+
+/* Function used as argument for `_dl_receive_error' function.  The
+   arguments are the error string and the objname the error occurred
+   in.  */
+typedef void (*receiver_fct) (const char *, const char *);
 \f
 /* Internal functions of the run-time dynamic linker.
    These can be accessed if you link again the dynamic linker
@@ -161,6 +167,11 @@ extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
    are concatenated to form the message to print.  */
 extern void _dl_sysdep_message (const char *string, ...);
 
+/* OS-dependent function to write a message on the standard error.
+   All arguments are `const char *'; args until a null pointer
+   are concatenated to form the message to print.  */
+extern void _dl_sysdep_error (const char *string, ...);
+
 /* OS-dependent function to give a fatal error message and exit
    when the dynamic linker fails before the program is fully linked.
    All arguments are `const char *'; args until a null pointer
@@ -177,11 +188,9 @@ extern int _dl_secure;
    zero; OBJECT is the name of the problematical shared object, or null if
    it is a general problem; ERRSTRING is a string describing the specific
    problem.  */
-
 extern void _dl_signal_error (int errcode,
                              const char *object,
-                             const char *errstring)
-     __attribute__ ((__noreturn__));
+                             const char *errstring);
 
 /* Call OPERATE, catching errors from `dl_signal_error'.  If there is no
    error, *ERRSTRING is set to null.  If there is an error, *ERRSTRING and
@@ -192,6 +201,11 @@ extern int _dl_catch_error (char **errstring,
                            const char **object,
                            void (*operate) (void));
 
+/* Call OPERATE, receiving errors from `dl_signal_error'.  Unlike
+   `_dl_catch_error' the operation is resumed after the OPERATE
+   function returns.  */
+extern void _dl_receive_error (receiver_fct fct, void (*operate) (void));
+
 
 /* Helper function for <dlfcn.h> functions.  Runs the OPERATE function via
    _dl_catch_error.  Returns zero for success, nonzero for failure; and
index 39435f8..f9a2cd3 100644 (file)
@@ -44,6 +44,10 @@ extern void *_dl_sysdep_read_whole_file (const char *filename,
                                         size_t *filesize_ptr,
                                         int mmap_prot);
 
+/* Helper function to handle errors while resolving symbols.  */
+static void print_unresolved (const char *errstring, const char *objname);
+
+
 int _dl_argc;
 char **_dl_argv;
 const char *_dl_rpath;
@@ -142,11 +146,19 @@ dl_main (const ElfW(Phdr) *phdr,
   enum { normal, list, verify, trace } mode;
   struct link_map **preloads;
   unsigned int npreloads;
+  const char *preloadlist;
   size_t file_size;
   char *file;
 
   mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal;
 
+  /* LAZY is determined by the parameters --datadeps and --function-deps
+     if we trace the binary.  */
+  if (mode == trace)
+    lazy = -1;
+  else
+    lazy = !__libc_enable_secure && *(getenv ("LD_BIND_NOW") ?: "") == '\0';
+
   /* Set up a flag which tells we are just starting.  */
   _dl_starting_up = 1;
 
@@ -186,22 +198,44 @@ of this helper program; chances are you did not intend to run this program.\n",
       /* Note the place where the dynamic linker actually came from.  */
       _dl_rtld_map.l_name = _dl_argv[0];
 
-      if (! strcmp (_dl_argv[1], "--list"))
-       {
-         mode = list;
+      while (_dl_argc > 1)
+       if (! strcmp (_dl_argv[1], "--list"))
+         {
+           mode = list;
+           lazy = -1;  /* This means do no dependency analysis.  */
 
-         ++_dl_skip_args;
-         --_dl_argc;
-         ++_dl_argv;
-       }
-      else if (! strcmp (_dl_argv[1], "--verify"))
-       {
-         mode = verify;
+           ++_dl_skip_args;
+           --_dl_argc;
+           ++_dl_argv;
+         }
+       else if (! strcmp (_dl_argv[1], "--verify"))
+         {
+           mode = verify;
 
-         ++_dl_skip_args;
-         --_dl_argc;
-         ++_dl_argv;
-       }
+           ++_dl_skip_args;
+           --_dl_argc;
+           ++_dl_argv;
+         }
+       else if (! strcmp (_dl_argv[1], "--data-relocs"))
+         {
+           mode = trace;
+           lazy = 1;   /* This means do only data relocation analysis.  */
+
+           ++_dl_skip_args;
+           --_dl_argc;
+           ++_dl_argv;
+         }
+       else if (! strcmp (_dl_argv[1], "--function-relocs"))
+         {
+           mode = trace;
+           lazy = 0;   /* This means do also function relocation analysis.  */
+
+           ++_dl_skip_args;
+           --_dl_argc;
+           ++_dl_argv;
+         }
+       else
+         break;
 
       ++_dl_skip_args;
       --_dl_argc;
@@ -311,23 +345,22 @@ of this helper program; chances are you did not intend to run this program.\n",
   preloads = NULL;
   npreloads = 0;
 
-  if (! __libc_enable_secure)
+  preloadlist = getenv ("LD_PRELOAD");
+  if (preloadlist)
     {
-      const char *preloadlist = getenv ("LD_PRELOAD");
-      if (preloadlist)
-       {
-         /* The LD_PRELOAD environment variable gives a white space
-            separated list of libraries that are loaded before the
-            executable's dependencies and prepended to the global
-            scope list.  */
-         char *list = strdupa (preloadlist);
-         char *p;
-         while ((p = strsep (&list, " ")) != NULL)
-           {
-             (void) _dl_map_object (NULL, p, lt_library, 0);
-             ++npreloads;
-           }
-       }
+      /* The LD_PRELOAD environment variable gives a white space
+        separated list of libraries that are loaded before the
+        executable's dependencies and prepended to the global scope
+        list.  If the binary is running setuid all elements
+        containing a '/' are ignored since it is insecure.  */
+      char *list = strdupa (preloadlist);
+      char *p;
+      while ((p = strsep (&list, " ")) != NULL)
+       if (! __libc_enable_secure || strchr (p, '/') == NULL)
+         {
+           (void) _dl_map_object (NULL, p, lt_library, 0);
+           ++npreloads;
+         }
     }
 
   /* Read the contents of the file.  */
@@ -496,12 +529,31 @@ of this helper program; chances are you did not intend to run this program.\n",
              *--bp = '0';
            _dl_sysdep_message (" in object at 0x", bp, "\n", NULL);
          }
+      else if (lazy >= 0)
+       {
+         /* We have to do symbol dependency testing.  */
+         void doit (void)
+           {
+             _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
+           }
+
+         l = _dl_loaded;
+         while (l->l_next)
+           l = l->l_next;
+         do
+           {
+             if (l != &_dl_rtld_map && l->l_opencount > 0)
+               {
+                 _dl_receive_error (print_unresolved, doit);
+                 *_dl_global_scope_end = NULL;
+               }
+             l = l->l_prev;
+           } while (l);
+       }
 
       _exit (0);
     }
 
-  lazy = !__libc_enable_secure && *(getenv ("LD_BIND_NOW") ?: "") == '\0';
-
   {
     /* Now we have all the objects loaded.  Relocate them all except for
        the dynamic linker itself.  We do this in reverse order so that copy
@@ -573,3 +625,11 @@ of this helper program; chances are you did not intend to run this program.\n",
   /* Once we return, _dl_sysdep_start will invoke
      the DT_INIT functions and then *USER_ENTRY.  */
 }
+\f
+/* This is a little helper function for resolving symbols while
+   tracing the binary.  */
+static void
+print_unresolved (const char *errstring, const char *objname)
+{
+  _dl_sysdep_error (errstring, "       (", objname, ")\n", NULL);
+}
index b583f33..07a35f1 100644 (file)
@@ -224,8 +224,20 @@ extern const char _libc_intl_domainname[];
    warning message MSG.  */
 #ifdef HAVE_GNU_LD
 #ifdef HAVE_ELF
+
+/* We want the .gnu.warning.SYMBOL section to be unallocated.  */
+#ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
+#define __make_section_unallocated(section_string)     \
+  asm(".section " section_string "; .previous");
+#elif defined (HAVE_ASM_POPSECTION_DIRECTIVE)
+#define __make_section_unallocated(section_string)     \
+  asm(".pushsection " section_string "; .popsection");
+#else
+#define __make_section_unallocated(section_string)
+#endif
+
 #define link_warning(symbol, msg)                      \
-  asm(".section .gnu.warning." #symbol "; .previous"); \
+  __make_section_unallocated (".gnu.warning." #symbol) \
   static const char __evoke_link_warning_##symbol[]    \
     __attribute__ ((section (".gnu.warning." #symbol))) = msg;
 #else
index 00eeb54..e24e6ff 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+# Copyright (C) 1995, 1996, 1997 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
@@ -32,7 +32,7 @@ routines      :=                                                            \
                                                                              \
        clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar    \
        memstream pclose putc putchar rewind setbuf setlinebuf vasprintf      \
-       vdprintf vscanf vsnprintf obprintf fcloseall                          \
+       iovdprintf vscanf vsnprintf obprintf fcloseall                        \
                                                                              \
        libc_fatal
 
diff --git a/libio/iovdprintf.c b/libio/iovdprintf.c
new file mode 100644 (file)
index 0000000..b4b1cc3
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+Copyright (C) 1995 Free Software Foundation
+
+This file is part of the GNU IO Library.  This library is free
+software; you can redistribute it and/or modify it under the
+terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this library; see the file COPYING.  If not, write to the Free
+Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+As a special exception, if you link this library with files
+compiled with a GNU compiler to produce an executable, this does not cause
+the resulting executable to be covered by the GNU General Public License.
+This exception does not however invalidate any other reasons why
+the executable file might be covered by the GNU General Public License. */
+
+#include "libioP.h"
+#include "libio.h"
+
+int
+_IO_vdprintf (d, format, arg)
+     int d;
+     const char *format;
+     _IO_va_list arg;
+{
+  struct _IO_FILE_plus tmpfil;
+#ifdef _IO_MTSAFE_IO
+  _IO_lock_t lock;
+#endif
+  int done;
+
+#ifdef _IO_MTSAFE_IO
+  tmpfil.file._lock = &lock;
+#endif
+  _IO_init (&tmpfil.file, 0);
+  _IO_JUMPS (&tmpfil.file) = &_IO_file_jumps;
+  _IO_file_init (&tmpfil.file);
+#if  !_IO_UNIFIED_JUMPTABLES
+  tmpfil.vtable = NULL;
+#endif
+  if (_IO_file_attach (&tmpfil.file, d) == NULL)
+    {
+      _IO_un_link (&tmpfil.file);
+      return EOF;
+    }
+  tmpfil.file._flags &= ~_IO_DELETE_DONT_CLOSE;
+
+  tmpfil.file._IO_file_flags =
+    _IO_mask_flags (&tmpfil.file, _IO_NO_READS,
+                   _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
+
+  done = _IO_vfprintf (&tmpfil.file, format, arg);
+
+  _IO_FINISH (&tmpfil.file);
+
+  return done;
+}
+weak_alias (_IO_vdprintf, vdprintf)
diff --git a/libio/vdprintf.c b/libio/vdprintf.c
deleted file mode 100644 (file)
index b4b1cc3..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
-Copyright (C) 1995 Free Software Foundation
-
-This file is part of the GNU IO Library.  This library is free
-software; you can redistribute it and/or modify it under the
-terms of the GNU General Public License as published by the
-Free Software Foundation; either version 2, or (at your option)
-any later version.
-
-This library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this library; see the file COPYING.  If not, write to the Free
-Software Foundation, 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
-
-As a special exception, if you link this library with files
-compiled with a GNU compiler to produce an executable, this does not cause
-the resulting executable to be covered by the GNU General Public License.
-This exception does not however invalidate any other reasons why
-the executable file might be covered by the GNU General Public License. */
-
-#include "libioP.h"
-#include "libio.h"
-
-int
-_IO_vdprintf (d, format, arg)
-     int d;
-     const char *format;
-     _IO_va_list arg;
-{
-  struct _IO_FILE_plus tmpfil;
-#ifdef _IO_MTSAFE_IO
-  _IO_lock_t lock;
-#endif
-  int done;
-
-#ifdef _IO_MTSAFE_IO
-  tmpfil.file._lock = &lock;
-#endif
-  _IO_init (&tmpfil.file, 0);
-  _IO_JUMPS (&tmpfil.file) = &_IO_file_jumps;
-  _IO_file_init (&tmpfil.file);
-#if  !_IO_UNIFIED_JUMPTABLES
-  tmpfil.vtable = NULL;
-#endif
-  if (_IO_file_attach (&tmpfil.file, d) == NULL)
-    {
-      _IO_un_link (&tmpfil.file);
-      return EOF;
-    }
-  tmpfil.file._flags &= ~_IO_DELETE_DONT_CLOSE;
-
-  tmpfil.file._IO_file_flags =
-    _IO_mask_flags (&tmpfil.file, _IO_NO_READS,
-                   _IO_NO_READS+_IO_NO_WRITES+_IO_IS_APPENDING);
-
-  done = _IO_vfprintf (&tmpfil.file, format, arg);
-
-  _IO_FINISH (&tmpfil.file);
-
-  return done;
-}
-weak_alias (_IO_vdprintf, vdprintf)
index c98bea6..449e45e 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc.
+# Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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 @@ dist-headers := malloc.h
 headers := $(dist-headers) obstack.h
 tests := mallocbug
 
-distribute = thread-m.h mtrace.awk
+distribute = thread-m.h mtrace.awk mcheck-init.c mcheck.h
 
 # Things which get pasted together into gmalloc.c.
 gmalloc-routines := malloc morecore
index 54ea99c..f5d94b9 100644 (file)
@@ -336,7 +336,7 @@ value.  Use @code{readdir_r} when this is critical.
 @comment dirent.h
 @comment GNU
 @deftypefun int readdir_r (DIR *@var{dirstream}, struct *@var{entry}, struct **@var{result})
-This function is the reentrant version of @code{reentrant}.  Like
+This function is the reentrant version of @code{readdir}.  Like
 @code{readdir} it returns the next entry from the directory.  But to
 prevent conflicts for simultaneously running threads the result is not
 stored in some internal memory.  Instead the argument @var{entry} has to
index a39f631..6f555af 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1996 Free Software Foundation, Inc.
+# Copyright (C) 1996, 1997 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 @@ subdir        := nss
 headers                        := nss.h
 distribute             := nsswitch.h XXX-lookup.c getXXbyYY.c getXXbyYY_r.c \
                           getXXent.c getXXent_r.c databases.def \
-                          nsswitch.conf db-Makefile
+                          nsswitch.conf db-Makefile digits_dots.c
 
 # This is the trivial part which goes into libc itself.
 routines               = nsswitch $(addsuffix -lookup,$(databases))
index 4590f26..41623cd 100644 (file)
@@ -1,4 +1,4 @@
-# Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc.
+# Copyright (C) 1994, 1995, 1996, 1997 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
@@ -33,7 +33,7 @@ libresolv-routines := gethnamaddr res_comp res_debug  \
                      res_data res_mkquery res_query res_send           \
                      inet_net_ntop inet_net_pton inet_neta base64
 
-subdirs-dirs = nss_dns
+subdir-dirs = nss_dns
 vpath %.c nss_dns
 
 libnss_dns-routines    := dns-host dns-network
index 0dfb499..32697e7 100644 (file)
@@ -1,21 +1,21 @@
 /* Operating system support for run-time dynamic linker.  Generic Unix version.
-Copyright (C) 1995, 96 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 #include <elf.h>
 #include <sys/types.h>
@@ -193,6 +193,22 @@ _dl_sysdep_fatal (const char *msg, ...)
 
 
 void
+_dl_sysdep_error (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      __write (STDERR_FILENO, msg, len);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
+
+
+void
 _dl_sysdep_message (const char *msg, ...)
 {
   va_list ap;
index a4e7698..8b1de11 100644 (file)
@@ -1,5 +1,5 @@
 /* Definition of `struct sockaddr_*' common members.  Generic/4.2 BSD version.
-   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997 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
 #define _SOCKADDRCOM_H 1
 
 
+/* POSIX.1g specifies this type name for the `sa_family' member.  */
+typedef unsigned short int sa_family_t;
+
 /* This macro is used to declare the initial common members
    of the data types used for socket addresses, `struct sockaddr',
    `struct sockaddr_in', `struct sockaddr_un', etc.  */
 
 #define        __SOCKADDR_COMMON(sa_prefix) \
-  unsigned short int sa_prefix##family
+  sa_family_t sa_prefix##family
 
 #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))
 
index f8d82a3..bf1462a 100644 (file)
@@ -1,5 +1,5 @@
 /* Operating system support for run-time dynamic linker.  Hurd version.
-   Copyright (C) 1995, 1996 Free Software Foundation, Inc.
+   Copyright (C) 1995, 1996, 1997 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
@@ -239,6 +239,29 @@ _dl_sysdep_fatal (const char *msg, ...)
 
 
 void
+_dl_sysdep_error (const char *msg, ...)
+{
+  va_list ap;
+
+  va_start (ap, msg);
+  do
+    {
+      size_t len = strlen (msg);
+      mach_msg_type_number_t nwrote;
+      do
+       {
+         if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
+           break;
+         len -= nwrote;
+         msg += nwrote;
+       } while (nwrote > 0);
+      msg = va_arg (ap, const char *);
+    } while (msg);
+  va_end (ap);
+}
+
+
+void
 _dl_sysdep_message (const char *msg, ...)
 {
   va_list ap;
index 7a7bcaa..3ce9ff8 100644 (file)
--- a/version.h
+++ b/version.h
@@ -1,4 +1,4 @@
 /* This file just defines the current version number of libc.  */
 
 #define RELEASE "alpha"
-#define VERSION "1.100"
+#define VERSION "1.101"