about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog30
-rw-r--r--Makeconfig23
-rw-r--r--configure.in46
-rw-r--r--elf/Makefile2
-rw-r--r--elf/dl-open.c7
-rw-r--r--elf/rtld.c4
-rw-r--r--sysdeps/mach/hurd/dl-sysdep.c2
-rw-r--r--version.c27
8 files changed, 90 insertions, 51 deletions
diff --git a/ChangeLog b/ChangeLog
index 9fc9e2ae4b..be289c27cc 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Fri Jun 14 01:51:47 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* version.c (banner): New static const variable, complete version
+	banner text.
+	(__libc_print_version): Use it, and use __write instead of printf.
+
+	* configure.in (sysnames): Don't cache the value, because it
+ 	depends only on libc sources.  Merge uniquifying third pass into
+	Implies/parent expansion second pass.  Report each unique name as
+	it is added in partial report string, terminated when finished.
+
+	* Makeconfig (sysdep_dir): Move defn before config.status rule that
+	expands it.
+	(sysdep-configures): Variable removed.
+	(config.status): Use its contents directly, tighten up a bit, and
+	include Implies files.
+
+	* elf/dl-open.c (_dl_open) [PIC]: Set PARENT to _dl_loaded if null.
+
+	* elf/Makefile ($(objpfx)$(rtld-installed-name)): Make a symlink.
+
 Thu Jun 13 14:29:56 1996  Miles Bader  <miles@gnu.ai.mit.edu>
 
 	* hurd/hurdsig.c (_hurd_internal_post_signal): Rename `deliver:'
@@ -5,6 +26,15 @@ Thu Jun 13 14:29:56 1996  Miles Bader  <miles@gnu.ai.mit.edu>
 
 Thu Jun 13 00:02:25 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
 
+	* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_open_zero_fill):
+	Add comment.
+
+	* elf/rtld.c (dl_main): Close _dl_zerofd after mapping deps.
+
+	* sysdeps/generic/machine-gmon.h [NO_UNDERSCORES]: Define mcount as
+	weak alias for _mcount.
+	* sysdeps/alpha/_mcount.S (mcount): Define as weak alias.
+
 	* elf/dl-lookup.c (_dl_lookup_symbol): If no value and *REF is
 	null, consider it a strong reference and give the error.
 
diff --git a/Makeconfig b/Makeconfig
index 1d534580b1..afbb31f2fa 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -74,6 +74,10 @@ common-objdir = .
 endif
 endif
 
+# Root of the sysdeps tree.
+sysdep_dir := $(..)sysdeps
+export sysdep_dir := $(sysdep_dir)
+
 
 # Get the values defined by options to `configure'.
 include $(common-objpfx)config.make
@@ -86,17 +90,15 @@ include $(common-objpfx)config.make
 $(common-objpfx)config.make: $(common-objpfx)config.status $(..)config.h.in
 	cd $(<D); $(SHELL) $(<F)
 
+sysdep-configures = \
+
 # Find all the sysdeps configure fragments, to make sure we re-run
 # configure when any of them changes.
-sysdep-configures = \
-  $(foreach dir,$(config-sysdirs),\
-	    $(patsubst %.in,%,\
-		       $(firstword $(wildcard \
-		         $(sysdep_dir)/$(dir)/configure \
-			 $(sysdep_dir)/$(dir)/configure.in))))
-
-# Force the user to configure before making.
-$(common-objpfx)config.status: $(..)configure $(sysdep-configures)
+$(common-objpfx)config.status: $(..)configure \
+			       $(foreach dir,$(config-sysdirs),\
+					 $(patsubst %.in,%,\
+						    $(firstword $(wildcard \
+ $(addprefix $(sysdep_dir)/$(dir)/,configure configure.in Implies)))))
 	@cd $(@D); if test -f $(@F); then exec $(SHELL) $(@F) --recheck; else \
 	 echo The GNU C library has not been configured. >&2; \
 	 echo Run \`configure\' to configure it before building. >&2; \
@@ -112,9 +114,6 @@ ifneq ($(wildcard $(objpfx)configparms),)
 include $(objpfx)configparms
 endif
 endif
-
-sysdep_dir := $(..)sysdeps
-export sysdep_dir := $(sysdep_dir)
 
 ####
 ####	These are the configuration variables.  You can define values for
diff --git a/configure.in b/configure.in
index e3154b6a7c..eceb4da989 100644
--- a/configure.in
+++ b/configure.in
@@ -118,8 +118,9 @@ changequote([,])dnl
 AC_SUBST(base_machine)
 
 # Compute the list of sysdep directories for this configuration.
+# This can take a while to compute.
 sysdep_dir=$srcdir/sysdeps
-AC_CACHE_CHECK(sysdep dirs, libc_cv_sysdirs, [dnl
+AC_MSG_CHECKING(sysdep dirs)
 dnl We need to use [ and ] for other purposes for a while now.
 changequote(,)dnl
 # Make sco3.2v4 become sco3.2.4 and sunos4.1.1_U1 become sunos4.1.1.U1.
@@ -232,15 +233,26 @@ sysnames="`echo $sysnames | sed -e 's@^/@@' -e 's@ /@ @g'`"
 # Expand the list of system names into a full list of directories
 # from each element's parent name and Implies file (if present).
 set $sysnames
+names= seen=
 while test $# -gt 0; do
   name=$1
   shift
 
+  if echo "$seen" | fgrep -x $name >/dev/null; then
+    # Already in the list.
+    continue
+  fi
+
+  # Report each name as we discover it, so there is no long pause in output.
+  echo $ac_n "$name $ac_c" >&AC_FD_MSG
+
   if test -f $sysdep_dir/$name/Implies; then
     # Collect more names from the `Implies' file (removing comments).
     implied="`sed 's/#.*$//' < $sysdep_dir/$name/Implies`"
     for x in $implied; do
-      test -d $sysdep_dir/$x || echo "Warning: $name implies nonexistent $x">&2
+      test -d $sysdep_dir/$x || {
+        AC_MSG_WARN(sysdeps/$name/Implies specifies nonexistent $x)
+      }
     done
   else
     implied=
@@ -248,6 +260,9 @@ while test $# -gt 0; do
 
   # Add NAME to the list of names.
   names="$names $name"
+  # We maintain a parallel newline-separated list for the fgrep check above.
+  seen="$seen
+$name"
 
   # Find the parent of NAME, using the empty string if it has none.
 changequote(,)dnl
@@ -266,28 +281,13 @@ changequote([,])dnl
 done
 
 # Add the default directories.
-names="$names generic stub"
+sysnames="$names generic stub"
+AC_SUBST(sysnames)
+# The other names were emitted during the scan.
+AC_MSG_RESULT(generic stub)
 
-# Now uniquize the list.
-seen=
-sysnames=
-for name in $names; do
-  if echo "$seen" | fgrep -x $name >/dev/null; then
-    # Already in the list.
-    true;
-  else
-    # A new one.
-    if test -z "$seen"; then
-      seen="$name" sysnames="$name"
-    else
-      seen="$seen
-$name"
-      sysnames="$sysnames $name"
-    fi
-  fi
-done
-libc_cv_sysdirs="$sysnames"])
-AC_SUBST(sysnames) sysnames="$libc_cv_sysdirs"
+
+### Locate tools.
 
 AC_PROG_INSTALL
 if test "$INSTALL" = "${srcdir}/install-sh"; then
diff --git a/elf/Makefile b/elf/Makefile
index be7604de8e..712fd99a57 100644
--- a/elf/Makefile
+++ b/elf/Makefile
@@ -99,7 +99,7 @@ ifneq (ld.so, $(rtld-installed-name))
 # against it.
 $(objpfx)$(rtld-installed-name): $(objpfx)ld.so
 	rm -f $@
-	ln $< $@
+	ln -s $(<F) $@
 endif
 
 # The Linux-compatible dynamic linker shared object is just the same
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 373d32dd79..8171837236 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -32,6 +32,13 @@ _dl_open (struct link_map *parent, const char *file, int mode)
   struct r_debug *r;
 
 
+#ifdef PIC
+  if (! parent)
+    /* If no particular dependent object caused this load,
+       then use the DT_RPATH of the executable itself.  */
+      parent = _dl_loaded;
+#endif
+
   /* Load the named object.  */
   new = _dl_map_object (parent, file, lt_loaded);
   if (new->l_searchlist)
diff --git a/elf/rtld.c b/elf/rtld.c
index 7befc0a82f..fb92809ff5 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -239,6 +239,10 @@ of this helper program; chances are you did not intend to run this program.\n",
   /* Load all the libraries specified by DT_NEEDED entries.  */
   _dl_map_object_deps (l);
 
+  /* We are done mapping things, so close the zero-fill descriptor.  */
+  __close (_dl_zerofd);
+  _dl_zerofd = -1;
+
   /* XXX if kept, move it so l_next list is in dep order because
      it will determine gdb's search order.
      Perhaps do this always, so later dlopen by name finds it?
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 503feaf962..ec53e2f36e 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -213,6 +213,8 @@ _dl_sysdep_start_cleanup (void)
 int
 _dl_sysdep_open_zero_fill (void)
 {
+  /* The minimal mmap below uses the fd as a memory object port.
+     The real mmap used for dlopen ignores the fd for MAP_ANON.  */
   return (int) MACH_PORT_NULL;
 }
 
diff --git a/version.c b/version.c
index e62504d2f9..9366673c93 100644
--- a/version.c
+++ b/version.c
@@ -16,38 +16,35 @@ 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.  */
 
-#include <stdio.h>
-
 #include "version.h"
 const char __libc_release[] = RELEASE;
 const char __libc_version[] = VERSION;
 
-void
-__libc_print_version (void)
-{
-  printf ("GNU C Library %s release version %s, by Roland McGrath et al.\n",
-	  __libc_release, __libc_version);
-#ifdef	__VERSION__
-  printf ("Compiled by GNU CC version %s.\n", __VERSION__);
-#endif
-  puts ("\
+static const char banner[] =
+"GNU C Library "RELEASE" release version "VERSION", by Roland McGrath et al.\n\
+Compiled by GNU CC version "__VERSION__".\n\
 Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.\n\
 This is free software; see the source for copying conditions.\n\
 There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A\n\
-PARTICULAR PURPOSE.");
+PARTICULAR PURPOSE.";
+
+#include <unistd.h>
+
+void
+__libc_print_version (void)
+{
+  __write (STDOUT_FILENO, banner, sizeof banner - 1);
 }
 
 #ifdef HAVE_ELF
 /* This function is the entry point for the shared object.
    Running the library as a program will get here.  */
 
-#include <stdlib.h>
-
 void
 __libc_main (void)
 {
   __libc_print_version ();
-  exit (0);
+  _exit (0);
 }
 #endif