summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1996-09-05 02:49:18 +0000
committerUlrich Drepper <drepper@redhat.com>1996-09-05 02:49:18 +0000
commit57ba7bb47152ed3e50805db2bca137cb866a9a71 (patch)
tree66b02aa8c8f8a4a015316a3c3c6e984a2e2e1a94
parentdb813f25f26d17ba0b5e52411575ff930db7fac3 (diff)
downloadglibc-57ba7bb47152ed3e50805db2bca137cb866a9a71.tar.gz
glibc-57ba7bb47152ed3e50805db2bca137cb866a9a71.tar.xz
glibc-57ba7bb47152ed3e50805db2bca137cb866a9a71.zip
update from main archive 960904 cvs/libc-960905
Thu Sep  5 03:20:42 1996  Ulrich Drepper  <drepper@cygnus.com>

	Change configuration and Makefiles to allow add-ons to have a
	sysdeps/ directory hierachy.
	* configure.in: Test for sysdeps/ directory in add-ons.  Before
	all test and searches in these hierachies, too.
	* Makeconfig (full-config-subdirs): Define based on $(config-sysdirs).
	Extend with $(..) if not absolute path.
	Use $(full-config-subdirs) where $(config-sysdirs) was used.
	* Makefile ($(objpfx)sysd-dirs): Use config-sysdirs.
	* MakeTAGS: Use $(full-config-subdirs).
	* Makerules: Change comment to libc.so link script.
	(sysdirs): Define based on $(full-config-subdirs).
	(sysd-Makefile): Define using config-sysdirs.
	(sysd-rules): Likewise.
	* sysdeps/unix/Makefile (sysd-syscalls): Define based on +sysdep-dirs.
	* sysdeps/unix/make-syscalls.sh: Remove basedir argument.

Wed Sep  4 01:32:21 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/m68k/fpu/k_cos.c: Rewritten for better accuracy.
	* sysdeps/m68k/fpu/k_sin.c: Likewise.
	* sysdeps/m68k/fpu/k_tan.c: Likewise.

Thu Sep  5 01:06:09 1996  Richard Henderson  <rth@tamu.edu>

	* malloc/free.c (free): Protect by using __libc_malloc_lock.
	* malloc/malloc-find.c (malloc_find_object_address): Likewise.
	* malloc/malloc-size.c (malloc_usable_size): Likewise.
	* malloc/malloc-walk.c (malloc_walk): Likewise.
	* malloc/memalign.c (memalign): Likewise.
	* malloc/realloc.c (realloc): Likewise.
	* malloc/malloc.c: Define __libc_malloc_lock.
	(_malloc_internal): Don't use `malloc'.  Instead look for
	`__malloc_hook' or call `_malloc_internal'.
	(malloc): Protect by using `__libc_malloc_lock'.
	* malloc/malloc.h: Declare `__libc_malloc_lock'.

Mon Sep  2 22:42:59 1996  Richard Henderson  <rth@tamu.edu>

	* sysdeps/alpha/elf/start.S: Use weak_alias for __start
	instead of the hard definition.

	* sysdeps/alpha/dl-machine.h (RTLD_START): Add type info for
	_start and _dl_start_user.

	* sysdeps/unix/sysv/linux/alpha/init-first.h (SYSDEP_CALL_INIT):
	Make _dl_starting_up weak.  Add type info for NAME.

Mon Sep  2 22:15:14 1996  Richard Henderson  <rth@tamu.edu>

	* Makefile (all): Add extra_solibs pass.
	(+subdir_targets): Same.
	* Rules (extra_solibs): New phony empty target for subdirs without
	extra libs.
	* extra-lib.mk: Build lib*.so* in extra_solibs not lib-noranlib.
	* manual/Makefile: Add dummy extra_solibs target.

Sun Sep  1 15:41:22 1996  Richard Henderson  <rth@tamu.edu>

	* Makeconfig (+link): Add $(link-extra-libs).
	(link-extra-libs): New variable which expands to the full paths of
	the other libraries needed by a program, as controled by LDLIBS-$(@F).
	* db/Makefile: Use LDLIBS-makedb to link libdb not a dependency, as
	the later attempts to install the library before linking it.

	* sysdeps/unix/alpha/sysdep.S: Align errno.

	* sysdeps/unix/sysv/linux/alpha/ioperm.c (struct platform): Add
	hae_shift entry.
	(io): Move bus_memory_base and sparse_bus_memory_base into struct.
	(_hae_shift): New function.
	* sysdeps/unix/sysv/linux/alpha/sys/io.h: New file.  Prototypes
	for the bus query functions.

Sat Aug 31 18:14:54 1996  Richard Henderson  <rth@tamu.edu>

	* elf/dl-close.c (_dl_close): In static executables, map->l_prev
	can be NULL when unloading a library.

	* elf/dl-open.c (_dl_open): Pass __environ instead of __libc_envp
	to the library .init function.

	* sysdeps/alpha/dl-machine.h (elf_machine_rela):  Since we omitted
	part of the COPY reloc processing earlier, omit the rest now --
	we'll get into less trouble later when some fool does use a COPY.

	* sysdeps/unix/sysv/linux/init-first.c (init): Accept argc et al as
	parameters.  Move all argc and __libc_multiple_libcs calculation out
	to init-first.h.  Use __environ not __libc_envp.
	* sysdeps/unix/sysv/linux/alpha/init-first.h: Rewrite.
	* sysdeps/unix/sysv/linux/i386/init-first.h: Rewrite.

Thu Aug 29 20:26:40 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* sysdeps/posix/profil.c (profil): Don't clobber saved timer and
	signal settings when profiling was already turned on.

	* csu/gmon-start.c (__gmon_start__) [HAVE_INITFINI]: Protect from
	being called twice.

Wed Sep  4 01:31:50 1996  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/unix/sysv/linux/i386/mmap.S: Test for
	0 < return value < -4096 and not < 0 to decide about failure.
	Reported by Andreas Jaeger.

Tue Sep  3 19:04:05 1996  Ulrich Drepper  <drepper@cygnus.com>

	* stdio-common/vfscanf.c (__vfscanf): Don't count EOF char
	in %c format.

Sat Aug 31 18:10:51 1996  Ulrich Drepper  <drepper@cygnus.com>

	* wcsmbs/wchar.h: Define prototypes for wcstoq and wcstouq only
	#ifdef __USE_GNU.

Sat Aug 31 12:34:29 1996  Ulrich Drepper  <drepper@cygnus.com>

	* version.c: Add missing newline character in banner.

	* sysdeps/unix/sysv/linux/alpha/Dist: Correct typo.
	* sysdeps/unix/sysv/linux/i386/Dist: Likewise.

Sat Aug 31 03:07:39 1996  Ulrich Drepper  <drepper@cygnus.com>

	* intl/l10nflist.c (_nl_normalize_codeset): We convert to lower
 	case, so don't prepend uppercase `ISO' for only numeric arg.
-rw-r--r--ChangeLog129
-rw-r--r--MakeTAGS2
-rw-r--r--Makeconfig24
-rw-r--r--Makefile23
-rw-r--r--Makerules45
-rw-r--r--Rules4
-rwxr-xr-xconfigure121
-rw-r--r--configure.in97
-rw-r--r--csu/gmon-start.c10
-rw-r--r--db/Makefile2
-rw-r--r--elf/dl-close.c3
-rw-r--r--elf/dl-open.c4
-rw-r--r--extra-lib.mk4
-rw-r--r--intl/l10nflist.c2
-rw-r--r--manual/Makefile2
-rw-r--r--manual/nss.texi2
-rw-r--r--stdio/fseek.c2
-rw-r--r--sysdeps/alpha/dl-machine.h13
-rw-r--r--sysdeps/alpha/elf/start.S19
-rw-r--r--sysdeps/m68k/fpu/k_cos.c12
-rw-r--r--sysdeps/m68k/fpu/k_sin.c16
-rw-r--r--sysdeps/m68k/fpu/k_tan.c16
-rw-r--r--sysdeps/mach/hurd/send.c8
-rw-r--r--sysdeps/mach/hurd/sendto.c13
-rw-r--r--sysdeps/posix/profil.c9
-rw-r--r--sysdeps/stub/ustat.c2
-rw-r--r--sysdeps/unix/Makefile8
-rw-r--r--sysdeps/unix/alpha/sysdep.S3
-rw-r--r--sysdeps/unix/make-syscalls.sh15
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Dist3
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/init-first.h39
-rw-r--r--sysdeps/unix/sysv/linux/alpha/ioperm.c47
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sys/io.h59
-rw-r--r--sysdeps/unix/sysv/linux/i386/Dist2
-rw-r--r--sysdeps/unix/sysv/linux/i386/init-first.h38
-rw-r--r--sysdeps/unix/sysv/linux/i386/mmap.S8
-rw-r--r--sysdeps/unix/sysv/linux/init-first.c30
-rw-r--r--version.c2
-rw-r--r--wcsmbs/wchar.h9
40 files changed, 601 insertions, 248 deletions
diff --git a/ChangeLog b/ChangeLog
index 12724a5fb5..086524d670 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,132 @@
+Thu Sep  5 03:20:42 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	Change configuration and Makefiles to allow add-ons to have a
+	sysdeps/ directory hierachy.
+	* configure.in: Test for sysdeps/ directory in add-ons.  Before
+	all test and searches in these hierachies, too.
+	* Makeconfig (full-config-subdirs): Define based on $(config-sysdirs).
+	Extend with $(..) if not absolute path.
+	Use $(full-config-subdirs) where $(config-sysdirs) was used.
+	* Makefile ($(objpfx)sysd-dirs): Use config-sysdirs.
+	* MakeTAGS: Use $(full-config-subdirs).
+	* Makerules: Change comment to libc.so link script.
+	(sysdirs): Define based on $(full-config-subdirs).
+	(sysd-Makefile): Define using config-sysdirs.
+	(sysd-rules): Likewise.
+	* sysdeps/unix/Makefile (sysd-syscalls): Define based on +sysdep-dirs.
+	* sysdeps/unix/make-syscalls.sh: Remove basedir argument.
+
+Wed Sep  4 01:32:21 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/m68k/fpu/k_cos.c: Rewritten for better accuracy.
+	* sysdeps/m68k/fpu/k_sin.c: Likewise.
+	* sysdeps/m68k/fpu/k_tan.c: Likewise.
+
+Thu Sep  5 01:06:09 1996  Richard Henderson  <rth@tamu.edu>
+
+	* malloc/free.c (free): Protect by using __libc_malloc_lock.
+	* malloc/malloc-find.c (malloc_find_object_address): Likewise.
+	* malloc/malloc-size.c (malloc_usable_size): Likewise.
+	* malloc/malloc-walk.c (malloc_walk): Likewise.
+	* malloc/memalign.c (memalign): Likewise.
+	* malloc/realloc.c (realloc): Likewise.
+	* malloc/malloc.c: Define __libc_malloc_lock.
+	(_malloc_internal): Don't use `malloc'.  Instead look for
+	`__malloc_hook' or call `_malloc_internal'.
+	(malloc): Protect by using `__libc_malloc_lock'.
+	* malloc/malloc.h: Declare `__libc_malloc_lock'.
+
+Mon Sep  2 22:42:59 1996  Richard Henderson  <rth@tamu.edu>
+
+	* sysdeps/alpha/elf/start.S: Use weak_alias for __start
+	instead of the hard definition.
+
+	* sysdeps/alpha/dl-machine.h (RTLD_START): Add type info for
+	_start and _dl_start_user.
+
+	* sysdeps/unix/sysv/linux/alpha/init-first.h (SYSDEP_CALL_INIT):
+	Make _dl_starting_up weak.  Add type info for NAME.
+
+Mon Sep  2 22:15:14 1996  Richard Henderson  <rth@tamu.edu>
+
+	* Makefile (all): Add extra_solibs pass.
+	(+subdir_targets): Same.
+	* Rules (extra_solibs): New phony empty target for subdirs without
+	extra libs.
+	* extra-lib.mk: Build lib*.so* in extra_solibs not lib-noranlib.
+	* manual/Makefile: Add dummy extra_solibs target.
+
+Sun Sep  1 15:41:22 1996  Richard Henderson  <rth@tamu.edu>
+
+	* Makeconfig (+link): Add $(link-extra-libs).
+	(link-extra-libs): New variable which expands to the full paths of
+	the other libraries needed by a program, as controled by LDLIBS-$(@F).
+	* db/Makefile: Use LDLIBS-makedb to link libdb not a dependency, as
+	the later attempts to install the library before linking it.
+
+	* sysdeps/unix/alpha/sysdep.S: Align errno.
+
+	* sysdeps/unix/sysv/linux/alpha/ioperm.c (struct platform): Add
+	hae_shift entry.
+	(io): Move bus_memory_base and sparse_bus_memory_base into struct.
+	(_hae_shift): New function.
+	* sysdeps/unix/sysv/linux/alpha/sys/io.h: New file.  Prototypes
+	for the bus query functions.
+
+Sat Aug 31 18:14:54 1996  Richard Henderson  <rth@tamu.edu>
+
+	* elf/dl-close.c (_dl_close): In static executables, map->l_prev
+	can be NULL when unloading a library.
+
+	* elf/dl-open.c (_dl_open): Pass __environ instead of __libc_envp
+	to the library .init function.
+
+	* sysdeps/alpha/dl-machine.h (elf_machine_rela):  Since we omitted
+	part of the COPY reloc processing earlier, omit the rest now --
+	we'll get into less trouble later when some fool does use a COPY.
+
+	* sysdeps/unix/sysv/linux/init-first.c (init): Accept argc et al as
+	parameters.  Move all argc and __libc_multiple_libcs calculation out
+	to init-first.h.  Use __environ not __libc_envp.
+	* sysdeps/unix/sysv/linux/alpha/init-first.h: Rewrite.
+	* sysdeps/unix/sysv/linux/i386/init-first.h: Rewrite.
+
+Thu Aug 29 20:26:40 1996  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>
+
+	* sysdeps/posix/profil.c (profil): Don't clobber saved timer and
+	signal settings when profiling was already turned on.
+
+	* csu/gmon-start.c (__gmon_start__) [HAVE_INITFINI]: Protect from
+	being called twice.
+
+Wed Sep  4 01:31:50 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/i386/mmap.S: Test for
+	0 < return value < -4096 and not < 0 to decide about failure.
+	Reported by Andreas Jaeger.
+
+Tue Sep  3 19:04:05 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* stdio-common/vfscanf.c (__vfscanf): Don't count EOF char
+	in %c format.
+
+Sat Aug 31 18:10:51 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* wcsmbs/wchar.h: Define prototypes for wcstoq and wcstouq only
+	#ifdef __USE_GNU.
+
+Sat Aug 31 12:34:29 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* version.c: Add missing newline character in banner.
+
+	* sysdeps/unix/sysv/linux/alpha/Dist: Correct typo.
+	* sysdeps/unix/sysv/linux/i386/Dist: Likewise.
+
+Sat Aug 31 03:07:39 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* intl/l10nflist.c (_nl_normalize_codeset): We convert to lower
+ 	case, so don't prepend uppercase `ISO' for only numeric arg.
+
 Tue Sep  3 11:16:07 1996  Thomas Bushnell/ n/BSG  <thomas@gnu.ai.mit.edu>
 
 	* shadow/lckpwdf.c (__ulckpwdf): Don't take address of LOCK in
diff --git a/MakeTAGS b/MakeTAGS
index 0e7eecdb4f..dcbea9386f 100644
--- a/MakeTAGS
+++ b/MakeTAGS
@@ -39,7 +39,7 @@ tags_sources = $(all-sources) $(all-headers) $(all-dist)
 endif	# ctype
 endif	# No tags_sources
 
-sysdep-dirs := $(addprefix $(sysdep_dir)/,$(sysdirs))
+sysdep-dirs := $(full-config-subdirs)
 
 ifndef sysdep_dirs
 # Find all sysdep directories.
diff --git a/Makeconfig b/Makeconfig
index d3d7890903..e62608da45 100644
--- a/Makeconfig
+++ b/Makeconfig
@@ -78,10 +78,14 @@ endif
 sysdep_dir := $(..)sysdeps
 export sysdep_dir := $(sysdep_dir)
 
-
 # Get the values defined by options to `configure'.
 include $(common-objpfx)config.make
 
+# Complete path to sysdep dirs.
+full-config-sysdirs := $(filter /%, $(config-sysdirs)) \
+		       $(addprefix $(..), $(filter-out /%, $(config-sysdirs)))
+export full-config-sysdirs := $(full-config-sysdirs)
+
 # Run config.status to update config.make and config.h.  We don't show the
 # dependence of config.h to Make, because it is only touched when it
 # changes and so config.status would be run every time; the dependence of
@@ -93,12 +97,12 @@ $(common-objpfx)config.make: $(common-objpfx)config.status $(..)config.h.in
 # Find all the sysdeps configure fragments, to make sure we re-run
 # configure when any of them changes.
 $(common-objpfx)config.status: $(..)configure \
-			       $(foreach dir,$(config-sysdirs),\
+			       $(foreach dir,$(full-config-sysdirs),\
 					 $(wildcard \
-					   $(sysdep_dir)/$(dir)/Implies) \
+					   $(dir)/Implies) \
 					 $(patsubst %.in,%,\
 						    $(firstword $(wildcard \
- $(addprefix $(sysdep_dir)/$(dir)/,configure configure.in)))))
+ $(addprefix $(dir)/,configure configure.in)))))
 	@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; \
@@ -299,8 +303,8 @@ ifndef +link
 +link = $(CC) -nostdlib -nostartfiles -o $@ \
 	      $(sysdep-LDFLAGS) $(config-LDFLAGS) $(LDFLAGS)  \
 	      $(addprefix $(csu-objpfx),start.o) $(+preinit) \
-	      $(filter-out $(common-objpfx)libc%,$^) $(link-libc) \
-	      $(+postinit)
+	      $(filter-out $(common-objpfx)libc%,$^) \
+	      $(link-extra-libs) $(link-libc) $(+postinit)
 endif
 ifndef config-LDFLAGS
 ifeq (yes,$(build-shared))
@@ -330,6 +334,13 @@ else
 link-libc = $(common-objpfx)libc.a $(gnulib) $(common-objpfx)libc.a
 endif
 endif
+ifndef link-extra-libs
+ifeq (yes,$(build-shared))
+link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).so$($(notdir $(lib)).so-version))
+else
+link-extra-libs = $(foreach lib,$(LDLIBS-$(@F)),$(common-objpfx)$(lib).a)
+endif
+endif
 ifndef gnulib
 gnulib := -lgcc
 endif
@@ -339,6 +350,7 @@ ifeq ($(elf),yes)
 endif
 csu-objpfx = $(common-objpfx)csu/
 elf-objpfx = $(common-objpfx)elf/
+db-objpfx = $(common-objpfx)db/
 
 ifeq (yes,$(build-shared))
 # The name under which the run-time dynamic linker is installed.
diff --git a/Makefile b/Makefile
index d269a9f494..b502895f09 100644
--- a/Makefile
+++ b/Makefile
@@ -26,7 +26,7 @@ endif
 
 # This is the default target; it makes everything except the tests.
 .PHONY: all
-all: lib others
+all: lib extra_solibs others
 
 define autoconf-it
 @-rm -f $@.new
@@ -73,14 +73,13 @@ subdirs	:= $(filter mach,$(subdirs)) $(filter hurd,$(subdirs)) \
 
 
 # These are the targets that are made by making them in each subdirectory.
-+subdir_targets	:= subdir_lib objects objs others subdir_mostlyclean	\
-		   subdir_clean subdir_distclean subdir_realclean	\
-		   tests subdir_lint.out				\
++subdir_targets	:= subdir_lib extra_solibs objects objs others		\
+		   subdir_mostlyclean subdir_clean subdir_distclean	\
+		   subdir_realclean tests subdir_lint.out		\
 		   subdir_distinfo					\
 		   subdir_echo-headers subdir_echo-distinfo		\
-		   subdir_install $(addprefix install-,			\
-					      no-libc.a bin lib		\
-					      data headers others)
+		   subdir_install					\
+		   $(addprefix install-, no-libc.a bin lib data headers others)
 
 headers := errno.h sys/errno.h errnos.h limits.h values.h	\
 	   features.h gnu-versions.h libc-lock.h
@@ -117,9 +116,13 @@ endif
 
 $(objpfx)sysd-dirs: $(+sysdir_pfx)config.make
 	(echo define sysdep-subdirs;					      \
-	 for dir in $(sysdirs); do					      \
-	   if [ -r $(sysdep_dir)/$$dir/Subdirs ]; then			      \
-	     sed 's/#.*$$//' $(sysdep_dir)/$$dir/Subdirs;		      \
+	 for sysdir in $(config-sysdirs); do				      \
+	   case $$sysdir in						      \
+	     /*) dir=$$sysdir ;;					      \
+	     *)  dir=$(..)$$sysdir ;;					      \
+	   esac;							      \
+	   if [ -r $$dir/Subdirs ]; then				      \
+	     sed 's/#.*$$//' $$dir/Subdirs;				      \
 	   else true;							      \
 	   fi;								      \
 	 done;								      \
diff --git a/Makerules b/Makerules
index 2b75154453..441e24c34c 100644
--- a/Makerules
+++ b/Makerules
@@ -56,13 +56,13 @@ include $(..)Makeconfig
 endif
 
 # `configure' writes a definition of `config-sysdirs' in `config.make'.
-sysdirs = $(config-sysdirs)
+sysdirs = $(strip $(full-config-sysdirs))
 
 +sysdir_pfx = $(common-objpfx)
 
 export sysdirs := $(sysdirs)
 
-+sysdep_dirs := $(addprefix $(sysdep_dir)/,$(sysdirs))
++sysdep_dirs := $(full-config-sysdirs)
 ifdef objdir
 +sysdep_dirs := $(objdir) $(+sysdep_dirs)
 endif
@@ -86,8 +86,7 @@ endif
 # appropriate and not worry about where foo.h comes from, which may be
 # system dependent and not known by that Makefile.
 vpath %.h $(subst $(empty) ,:,$(strip $(common-objpfx) $(objpfx) \
-				      $(addprefix $(sysdep_dir)/,$(sysdirs)) \
-				      $(..)))
+				      $(+sysdep_dirs) $(..)))
 
 # Some sysdep makefiles use this to distinguish being included here from
 # being included individually by a subdir makefile (hurd/Makefile needs this).
@@ -95,18 +94,21 @@ in-Makerules := yes
 
 ifndef avoid-generated
 -include $(+sysdir_pfx)sysd-Makefile
-ifneq ($(sysd-Makefile-sysdirs),$(sysdirs))
+ifneq ($(sysd-Makefile-sysdirs),$(config-sysdirs))
 sysd-Makefile-force = FORCE
 FORCE:
 endif
 $(+sysdir_pfx)sysd-Makefile: $(+sysdir_pfx)config.make $(..)Makerules \
 			     $(sysd-Makefile-force)
 	-@rm -f $@T
-	(echo 'sysd-Makefile-sysdirs := $(sysdirs)';			      \
-	 for dir in $(sysdirs); do		   			      \
-	   file=sysdeps/$$dir/Makefile;					      \
-	   if [ -f $(..)$$file ]; then					      \
-	     echo include "\$$(..)$$file";				      \
+	(echo 'sysd-Makefile-sysdirs := $(config-sysdirs)';		      \
+	 for dir in $(config-sysdirs); do	   			      \
+	   file=$$dir/Makefile;						      \
+	   if [ -f $$file ]; then					      \
+	     case $$dir in						      \
+	       /*) echo include "$$file" ;;				      \
+	       *)  echo include "\$$(..)$$file" ;;			      \
+	     esac;							      \
 	   else true; fi;						      \
 	 done; \
 	 echo 'sysd-Makefile-done=t') > $@T
@@ -213,8 +215,8 @@ endif
 # contents of sysd-rules.
 ifdef sysd-Makefile-done
 -include $(+sysdir_pfx)sysd-rules
-ifneq ($(sysd-rules-sysdirs),$(sysdirs))
-# The value of $(sysdirs) the sysd-rules was computed for
+ifneq ($(sysd-rules-sysdirs),$(config-sysdirs))
+# The value of $(+sysdep_dirs) the sysd-rules was computed for
 # differs from the one we are using now.  So force a rebuild of sysd-rules.
 sysd-rules-force = FORCE
 FORCE:
@@ -222,12 +224,15 @@ endif
 endif
 $(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \
 			  $(wildcard $(foreach dir,$(sysdirs),\
-					       $(sysdep_dir)/$(dir)/Makefile))\
+					       $(dir)/Makefile))\
 			  $(sysd-rules-force)
 	-@rm -f $@T
-	(echo 'sysd-rules-sysdirs := $(sysdirs)';			      \
-	 for sysdir in $(sysdirs); do		   			      \
-	   dir="\$$(sysdep_dir)/$$sysdir";				      \
+	(echo 'sysd-rules-sysdirs := $(config-sysdirs)';		      \
+	 for sysdir in $(config-sysdirs); do				      \
+	   case $$sysdir in \
+	     /*) dir=$$sysdir ;; \
+	     *)  dir="\$$(..)$$sysdir" ;; \
+	   esac; \
 	   for o in $(object-suffixes); do \
 	     $(open-check-inhibit-asm) \
 	     echo "\$$(objpfx)%$$o: $$dir/%.S \$$(before-compile); \
@@ -596,10 +601,10 @@ $(slibdir)/libc-$(version).so: $(common-objpfx)libc.so; $(do-install-program)
 install: $(slibdir)/libc.so$(libc.so-version)
 
 ifndef subdir
-# What we install as libc.so for programs to link against is in fact an
-# archive.  It contains the various $(static-only-routines) objects, and
-# the special object libc-syms.so that contains just the dynamic symbol
-# table of the shared libc object.
+# What we install as libc.so for programs to link against is in fact a
+# link script.  It contains references for the various libraries we need.
+# The libc.so object is not complete since some functions are only defined
+# in libc.a and the dynamic linker is an etra object.
 install: $(libdir)/libc.so
 $(libdir)/libc.so: $(common-objpfx)libc.so$(libc.so-version) \
 		   $(elfobjdir)/$(rtld-installed-name) \
diff --git a/Rules b/Rules
index 8d4f51fa79..507ec45528 100644
--- a/Rules
+++ b/Rules
@@ -107,13 +107,14 @@ $(objpfx)%.out: /dev/null $(objpfx)%	# Make it 2nd arg for canned sequence.
 endif	# tests
 
 .PHONY: distclean realclean subdir_distclean subdir_realclean \
-	subdir_clean subdir_mostlyclean
+	subdir_clean subdir_mostlyclean extra_solibs
 subdir_mostlyclean: mostlyclean
 subdir_clean: clean
 subdir_distclean: distclean
 subdir_realclean: realclean
 realclean: distclean
 distclean: clean
+extra_solibs:
 
 .PHONY: subdir_echo-headers
 subdir_echo-headers: echo-headers
@@ -135,7 +136,6 @@ subdir_dist: dist
 
 # Convenient target to update all the generated source files.
 .PHONY: generated
-generated: $(addprefix $(objpfx),$(generated)) 
 generated: $(addprefix $(common-objpfx),$(common-generated))
 
 ifndef libc.so-version
diff --git a/configure b/configure
index 522d64fbf4..68aa0d7053 100755
--- a/configure
+++ b/configure
@@ -689,6 +689,12 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
 
 subdirs="$add_ons"
 
+add_ons_pfx=
+if test x$add_ons != x; then
+  for f in $add_ons; do
+    add_ons_pfx="$add_ons_pfx $f/"
+  done
+fi
 
 
 # Make sure we can run config.sub.
@@ -819,23 +825,34 @@ done
 
 # Find what sysdep directories exist.
 sysnames=
-for b in $base ''; do
-  for m0 in $mach ''; do
-    for v in /$vendor ''; do
-      for o in /$ostry ''; do
-	for m in $mach ''; do
-	  try="$m0$b$v$o$m"
-	  test -n "$enable_debug_configure" && echo "$0 DEBUG: try $try" >&2
-	  if test -d $sysdep_dir$try; then
-	    sysnames="$sysnames $try"
-	    { test -n "$o" || test -n "$b"; } && os_used=t
-	    { test -n "$m" || test -n "$m0"; } && machine_used=t
-	  fi
+IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+for d in $add_ons_pfx ''; do
+  for b in $base ''; do
+    for m0 in $mach ''; do
+      for v in /$vendor ''; do
+	for o in /$ostry ''; do
+	  for m in $mach ''; do
+	    if test "$m0$b$v$o$m"; then
+	      try="${d}sysdeps$m0$b$v$o$m"
+	      test -n "$enable_debug_configure" &&
+	      echo "$0 DEBUG: try $try" >&2
+	      case $try in
+		/*) dest=$try ;;
+		*)  dest=$srcdir/$try ;;
+	      esac
+	      if test -d $dest; then
+		sysnames="$sysnames $try"
+		{ test -n "$o" || test -n "$b"; } && os_used=t
+		{ test -n "$m" || test -n "$m0"; } && machine_used=t
+	      fi
+	    fi
+	  done
 	done
       done
     done
   done
 done
+IFS="$ac_save_ifs"
 
 if test -z "$os_used" && test "$os" != none; then
   { echo "configure: error: Operating system $os is not supported." 1>&2; exit 1; }
@@ -854,12 +871,18 @@ fi
 # machine (otherwise what's the point of an ABI?).
 if test "$elf" = yes; then
   elf_dirs=
-  for m in $mach; do
-    if test -d $sysdep_dir$m/elf; then
-      elf_dirs="$elf_dirs $m/elf"
-    fi
+  for d in $add_ons_pfx ''; do
+    case $d in
+      /*) xsrcdir= ;;
+      *)  xsrcdir=$srcdir/ ;;
+    esac
+    for m in $mach; do
+      if test -d $xsrcdir${d}sysdeps$m/elf; then
+	elf_dirs="$elf_dirs $d$m/elf"
+      fi
+    done
   done
-  sysnames="`echo $elf_dirs | sed -e 's,^/,,' -e 's, /,,g'` $sysnames"
+  sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
 fi
 
 
@@ -883,13 +906,25 @@ while test $# -gt 0; do
   # Report each name as we discover it, so there is no long pause in output.
   echo $ac_n "$name $ac_c" >&6
 
-  if test -f $sysdep_dir/$name/Implies; then
+  name_base=`echo $name | sed -e 's@\(.*sysdeps\)/.*@\1@'`
+
+  case $name in
+    /*) xsrcdir= ;;
+    *)  xsrcdir=$srcdir/ ;;
+  esac
+  test -n "$enable_debug_configure" &&
+  echo "DEBUG: name/Implies $xsrcdir$name/Implies" >&2
+
+  if test -f $xsrcdir$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 "configure: warning: sysdeps/$name/Implies specifies nonexistent $x" 1>&2
-      }
+    implied_candidate="`sed 's/#.*$//' < $xsrcdir$name/Implies`"
+    implied=
+    for x in $implied_candidate; do
+      if test -d $xsrcdir$name_base/$x; then
+	implied="$implied $name_base/$x";
+      else
+        echo "configure: warning: $name/Implies specifies nonexistent $x" 1>&2
+      fi
     done
   else
     implied=
@@ -899,7 +934,7 @@ while test $# -gt 0; do
   names="$names $name"
 
   # Find the parent of NAME, using the empty string if it has none.
-  parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
+  parent="`echo $name | sed -n -e 's=/[^/]*$==' -e '/sysdeps$/q' -e p`"
 
   # Add the names implied by NAME, and NAME's parent (if it has one), to
   # the list of names to be processed (the argument list).  We prepend the
@@ -913,10 +948,10 @@ while test $# -gt 0; do
 done
 
 # Add the default directories.
-sysnames="$names generic stub"
+sysnames="$names sysdeps/generic sysdeps/stub"
 
 # The other names were emitted during the scan.
-echo "$ac_t""generic stub" 1>&6
+echo "$ac_t""sysdeps/generic sysdeps/stub" 1>&6
 
 
 ### Locate tools.
@@ -1139,13 +1174,13 @@ else
   # On the NeXT, cc -E runs the code through the compiler's parser,
   # not just through cpp.
   cat > conftest.$ac_ext <<EOF
-#line 1143 "configure"
+#line 1178 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1184: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -1154,13 +1189,13 @@ else
   rm -rf conftest*
   CPP="${CC-cc} -E -traditional-cpp"
   cat > conftest.$ac_ext <<EOF
-#line 1158 "configure"
+#line 1193 "configure"
 #include "confdefs.h"
 #include <assert.h>
 Syntax Error
 EOF
 ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
-{ (eval echo configure:1164: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (eval echo configure:1199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
 ac_err=`grep -v '^ *+' conftest.out`
 if test -z "$ac_err"; then
   :
@@ -1302,7 +1337,7 @@ if eval "test \"`echo '$''{'libc_cv_friendly_stddef'+set}'`\" = set"; then
   echo $ac_n "(cached) $ac_c" 1>&6
 else
   cat > conftest.$ac_ext <<EOF
-#line 1306 "configure"
+#line 1341 "configure"
 #include "confdefs.h"
 #define __need_size_t
 #define __need_wchar_t
@@ -1318,7 +1353,7 @@ size_t size; wchar_t wchar;
 if (&size == NULL || &wchar == NULL) abort ();
 ; return 0; }
 EOF
-if { (eval echo configure:1322: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1357: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   libc_cv_friendly_stddef=yes
 else
@@ -1425,7 +1460,7 @@ 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 1429 "configure"
+#line 1464 "configure"
 #include "confdefs.h"
 
 int main() { return 0; }
@@ -1435,7 +1470,7 @@ asm (".section .init");
 				    asm (".text");
 ; return 0; }
 EOF
-if { (eval echo configure:1439: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+if { (eval echo configure:1474: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
   rm -rf conftest*
   libc_cv_have_initfini=yes
 else
@@ -1463,7 +1498,7 @@ 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 1467 "configure"
+#line 1502 "configure"
 #include "confdefs.h"
 asm ("_glibc_foobar:");
 int main() { return 0; }
@@ -1471,7 +1506,7 @@ int t() {
 glibc_foobar ();
 ; return 0; }
 EOF
-if { (eval echo configure:1475: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
+if { (eval echo configure:1510: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then
   rm -rf conftest*
   libc_cv_asm_underscores=yes
 else
@@ -1565,7 +1600,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
 			    -nostdlib -nostartfiles -Wl,--no-whole-archive
-			    -o conftest conftest.c'; { (eval echo configure:1569: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+			    -o conftest conftest.c'; { (eval echo configure:1604: \"$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
@@ -1586,7 +1621,7 @@ __throw () {}
 EOF
 if { ac_try='${CC-cc} $CFLAGS
 			    -nostdlib -nostartfiles -fno-exceptions
-			    -o conftest conftest.c'; { (eval echo configure:1590: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
+			    -o conftest conftest.c'; { (eval echo configure:1625: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
   libc_cv_gcc_no_exceptions=yes
 else
   libc_cv_gcc_no_exceptions=no
@@ -1607,9 +1642,13 @@ libc_link_sources=
 # configure fragments, and looking for a uname implementation.
 uname=
 for dir in $sysnames; do
-  if test -r $sysdep_dir/$dir/configure; then
-    echo "$ac_t""running configure fragment for $dir" 1>&6
-    . $sysdep_dir/$dir/configure
+  case $dir in
+    /*) dest=$dir ;;
+    *)  dest=$srcdir/$dir ;;
+  esac
+  if test -r $dest/configure; then
+    echo "$ac_t""running configure fragment for $dest" 1>&6
+    . $dest/configure
   fi
 
   if test -z "$uname"; then
diff --git a/configure.in b/configure.in
index 8939236641..d5370f897e 100644
--- a/configure.in
+++ b/configure.in
@@ -77,6 +77,12 @@ AC_ARG_ENABLE(add-ons, dnl
    	      [add_ons=`echo "$enableval" | sed 's/,/ /g'`],
 	      [add_ons=])
 AC_CONFIG_SUBDIRS($add_ons)
+add_ons_pfx=
+if test x$add_ons != x; then
+  for f in $add_ons; do
+    add_ons_pfx="$add_ons_pfx $f/"
+  done
+fi
 
 AC_CANONICAL_HOST
 # We keep the original values in `$config_*' and never modify them, so we
@@ -189,23 +195,34 @@ changequote([,])dnl
 
 # Find what sysdep directories exist.
 sysnames=
-for b in $base ''; do
-  for m0 in $mach ''; do
-    for v in /$vendor ''; do
-      for o in /$ostry ''; do
-	for m in $mach ''; do
-	  try="$m0$b$v$o$m"
-	  test -n "$enable_debug_configure" && echo "$0 [DEBUG]: try $try" >&2
-	  if test -d $sysdep_dir$try; then
-	    sysnames="$sysnames $try"
-	    { test -n "$o" || test -n "$b"; } && os_used=t
-	    { test -n "$m" || test -n "$m0"; } && machine_used=t
-	  fi
+IFS="${IFS= 	}"; ac_save_ifs="$IFS"; IFS="${IFS}:"
+for d in $add_ons_pfx ''; do
+  for b in $base ''; do
+    for m0 in $mach ''; do
+      for v in /$vendor ''; do
+	for o in /$ostry ''; do
+	  for m in $mach ''; do
+	    if test "$m0$b$v$o$m"; then
+	      try="${d}sysdeps$m0$b$v$o$m"
+	      test -n "$enable_debug_configure" &&
+	      echo "$0 [DEBUG]: try $try" >&2
+	      case $try in
+		/*) dest=$try ;;
+		*)  dest=$srcdir/$try ;;
+	      esac
+	      if test -d $dest; then
+		sysnames="$sysnames $try"
+		{ test -n "$o" || test -n "$b"; } && os_used=t
+		{ test -n "$m" || test -n "$m0"; } && machine_used=t
+	      fi
+	    fi
+	  done
 	done
       done
     done
   done
 done
+IFS="$ac_save_ifs"
 
 if test -z "$os_used" && test "$os" != none; then
   AC_MSG_ERROR(Operating system $os is not supported.)
@@ -224,12 +241,18 @@ fi
 # machine (otherwise what's the point of an ABI?).
 if test "$elf" = yes; then
   elf_dirs=
-  for m in $mach; do
-    if test -d $sysdep_dir$m/elf; then
-      elf_dirs="$elf_dirs $m/elf"
-    fi
+  for d in $add_ons_pfx ''; do
+    case $d in
+      /*) xsrcdir= ;;
+      *)  xsrcdir=$srcdir/ ;;
+    esac
+    for m in $mach; do
+      if test -d $xsrcdir${d}sysdeps$m/elf; then
+	elf_dirs="$elf_dirs $d$m/elf"
+      fi
+    done
   done
-  sysnames="`echo $elf_dirs | sed -e 's,^/,,' -e 's, /,,g'` $sysnames"
+  sysnames="`echo $elf_dirs | sed -e 's,//,/,g'` $sysnames"
 fi
 
 
@@ -253,13 +276,25 @@ while test $# -gt 0; do
   # 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
+  name_base=`echo $name | sed -e 's@\(.*sysdeps\)/.*@\1@'`
+
+  case $name in
+    /*) xsrcdir= ;;
+    *)  xsrcdir=$srcdir/ ;;
+  esac
+  test -n "$enable_debug_configure" &&
+  echo "[DEBUG]: name/Implies $xsrcdir$name/Implies" >&2
+
+  if test -f $xsrcdir$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 || {
-        AC_MSG_WARN(sysdeps/$name/Implies specifies nonexistent $x)
-      }
+    implied_candidate="`sed 's/#.*$//' < $xsrcdir$name/Implies`"
+    implied=
+    for x in $implied_candidate; do
+      if test -d $xsrcdir$name_base/$x; then
+	implied="$implied $name_base/$x";
+      else
+        AC_MSG_WARN($name/Implies specifies nonexistent $x)
+      fi
     done
   else
     implied=
@@ -270,7 +305,7 @@ while test $# -gt 0; do
 
   # Find the parent of NAME, using the empty string if it has none.
 changequote(,)dnl
-  parent="`echo $name | sed -n -e '/\//!q' -e 's=/[^/]*$==p'`"
+  parent="`echo $name | sed -n -e 's=/[^/]*$==' -e '/sysdeps$/q' -e p`"
 changequote([,])dnl
 
   # Add the names implied by NAME, and NAME's parent (if it has one), to
@@ -285,10 +320,10 @@ changequote([,])dnl
 done
 
 # Add the default directories.
-sysnames="$names generic stub"
+sysnames="$names sysdeps/generic sysdeps/stub"
 AC_SUBST(sysnames)
 # The other names were emitted during the scan.
-AC_MSG_RESULT(generic stub)
+AC_MSG_RESULT(sysdeps/generic sysdeps/stub)
 
 
 ### Locate tools.
@@ -525,9 +560,13 @@ libc_link_sources=
 # configure fragments, and looking for a uname implementation.
 uname=
 for dir in $sysnames; do
-  if test -r $sysdep_dir/$dir/configure; then
-    AC_MSG_RESULT(running configure fragment for $dir)
-    . $sysdep_dir/$dir/configure
+  case $dir in
+    /*) dest=$dir ;;
+    *)  dest=$srcdir/$dir ;;
+  esac
+  if test -r $dest/configure; then
+    AC_MSG_RESULT(running configure fragment for $dest)
+    . $dest/configure
   fi
 [
   if test -z "$uname"; then
diff --git a/csu/gmon-start.c b/csu/gmon-start.c
index aaff084fbd..9139306575 100644
--- a/csu/gmon-start.c
+++ b/csu/gmon-start.c
@@ -40,6 +40,15 @@ void __gmon_start__ (void) __attribute__ ((constructor));
 void
 __gmon_start__ (void)
 {
+#ifdef HAVE_INITFINI
+  /* Protect from being called more than once.  Since crti.o is linked
+     into every shared library, each of their init functions will call us.  */
+  static int called;
+
+  if (called++)
+    return;
+#endif
+
   /* Start keeping profiling records.  */
   monstartup ((u_long) &_start, (u_long) &etext);
 
@@ -47,4 +56,3 @@ __gmon_start__ (void)
      collected data.  */
   atexit (&_mcleanup);
 }
-
diff --git a/db/Makefile b/db/Makefile
index e5a60557dc..9613c2e370 100644
--- a/db/Makefile
+++ b/db/Makefile
@@ -39,4 +39,4 @@ CFLAGS-hash_func.c := -Wno-unused
 # The db code outsmarts the compiler frequently.
 override CFLAGS += -Wno-uninitialized
 
-$(objpfx)makedb: -ldb
+LDLIBS-makedb := db/libdb
diff --git a/elf/dl-close.c b/elf/dl-close.c
index 184d38298e..0a16d69f0d 100644
--- a/elf/dl-close.c
+++ b/elf/dl-close.c
@@ -99,7 +99,8 @@ _dl_close (struct link_map *map)
 	      }
 
 	  /* Finally, unlink the data structure and free it.  */
-	  map->l_prev->l_next = map->l_next;
+	  if (map->l_prev)
+	    map->l_prev->l_next = map->l_next;
 	  if (map->l_next)
 	    map->l_next->l_prev = map->l_prev;
 	  if (map->l_searchlist)
diff --git a/elf/dl-open.c b/elf/dl-open.c
index 76f6329762..ff19f811d5 100644
--- a/elf/dl-open.c
+++ b/elf/dl-open.c
@@ -29,8 +29,8 @@ extern int __libc_multiple_libcs;	/* Defined in init-first.c.  */
 
 extern int __libc_argc;
 extern char **__libc_argv;
-extern char **__libc_envp;
 
+extern char **__environ;
 
 size_t _dl_global_scope_alloc;
 
@@ -142,7 +142,7 @@ _dl_open (const char *file, int mode)
   /* Run the initializer functions of new objects.  */
   while (init = _dl_init_next (new))
     (*(void (*) (int, char **, char **)) init) (__libc_argc, __libc_argv,
-						__libc_envp);
+						__environ);
 
   if (dl_start_ptr == NULL)
     /* We must be the static _dl_open in libc.a because ld.so.1 is not
diff --git a/extra-lib.mk b/extra-lib.mk
index e6088943e2..1db7520a34 100644
--- a/extra-lib.mk
+++ b/extra-lib.mk
@@ -28,7 +28,7 @@ alltypes-$(lib) := $(foreach o,$(object-suffixes-$(lib)),\
 ifeq (,$(filter $(lib),$(extra-libs-others)))
 lib-noranlib: $(alltypes-$(lib))
 ifeq (yes,$(build-shared))
-lib-noranlib: $(objpfx)$(lib).so$($(lib).so-version)
+extra_solibs: $(objpfx)$(lib).so$($(lib).so-version)
 endif
 else
 others: $(alltypes-$(lib))
@@ -37,7 +37,7 @@ endif
 # The linked shared library is never a dependent of lib-noranlib,
 # because linking it will depend on libc.so already being built.
 ifneq (,$(filter .so,$(object-suffixes-$(lib))))
-others: $(objpfx)$(lib).so
+extra_solibs: $(objpfx)$(lib).so
 endif
 
 
diff --git a/intl/l10nflist.c b/intl/l10nflist.c
index 846465bffe..4608fe81f7 100644
--- a/intl/l10nflist.c
+++ b/intl/l10nflist.c
@@ -369,7 +369,7 @@ _nl_normalize_codeset (codeset, name_len)
   if (retval != NULL)
     {
       if (only_digit)
-	wp = stpcpy (retval, "ISO");
+	wp = stpcpy (retval, "iso");
       else
 	wp = retval;
 
diff --git a/manual/Makefile b/manual/Makefile
index c0a5782ea7..f8bd1cd87c 100644
--- a/manual/Makefile
+++ b/manual/Makefile
@@ -155,7 +155,7 @@ subdir_%: ;
 # ../Rules defines them for code subdirectories; for us, they are no-ops.
 # None of these should be `subdir_TARGET'; those targets are transformed
 # by the implicit rule above into `TARGET' deps.
-glibc-targets	:= lib objects objs others tests lint.out \
+glibc-targets	:= lib extra_solibs objects objs others tests lint.out \
 		   echo-headers echo-distinfo stubs
 .PHONY: $(glibc-targets)
 $(glibc-targets):
diff --git a/manual/nss.texi b/manual/nss.texi
index 45cbf46110..b2dc886a50 100644
--- a/manual/nss.texi
+++ b/manual/nss.texi
@@ -159,7 +159,7 @@ on the lookup process.  Action items are placed between two service
 names and are written within brackets.  The general form is
 
 @display
-@t{[} ( @t{!}? @var{status} @t{=} @var{action} )+ @t{]}
+@code{[} ( @code{!}? @var{status} @code{=} @var{action} )+ @code{]}
 @end display
 
 @noindent
diff --git a/stdio/fseek.c b/stdio/fseek.c
index 947e4657ca..2127c9757b 100644
--- a/stdio/fseek.c
+++ b/stdio/fseek.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 92, 93, 95, 96 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
diff --git a/sysdeps/alpha/dl-machine.h b/sysdeps/alpha/dl-machine.h
index 3704c25c3c..415549d205 100644
--- a/sysdeps/alpha/dl-machine.h
+++ b/sysdeps/alpha/dl-machine.h
@@ -186,13 +186,17 @@ _dl_runtime_resolve:
 #define RTLD_START asm ("\
 .text
 	.globl _start
-	.globl _dl_start_user
+	.ent _start
 _start:
-	br	$gp,0f
+	br	$gp, 0f
 0:	ldgp	$gp, 0($gp)
 	/* Pass pointer to argument block to _dl_start.  */
 	mov	$sp, $16
 	bsr	$26, _dl_start..ng
+	.end _start
+	/* FALLTHRU */
+	.globl _dl_start_user
+	.ent _dl_start_user
 _dl_start_user:
 	/* Save the user entry point address in s0.  */
 	mov	$0, $9
@@ -225,7 +229,8 @@ _dl_start_user:
 	lda	$0, _dl_fini
 	/* Jump to the user's entry point.  */
 	mov	$9, $27
-	jmp	($9)");
+	jmp	($9)
+	.end _dl_start_user");
 
 /* Nonzero iff TYPE describes relocation of a PLT entry, so
    PLT entries should not be allowed to define the value.  */
@@ -377,8 +382,6 @@ elf_machine_rela (struct link_map *map,
 	    sym_value += reloc->r_addend;
 	  *reloc_addr = sym_value;
 	}
-      else if (r_info == R_ALPHA_COPY)
-	memcpy (reloc_addr, (void *) sym_value, sym->st_size);
       else
 	assert (! "unexpected dynamic reloc type");
     }
diff --git a/sysdeps/alpha/elf/start.S b/sysdeps/alpha/elf/start.S
index 596cea6265..d20a009aa4 100644
--- a/sysdeps/alpha/elf/start.S
+++ b/sysdeps/alpha/elf/start.S
@@ -20,12 +20,9 @@ Cambridge, MA 02139, USA.  */
 #include <sysdep.h>
 
 	.text
-	.globl _start	/* what ELF wants */
-	.globl __start	/* for backwards (ECOFF) comatibility */
 	.align 3
-	.ent __start, 0
+	.ent _start, 0
 _start:
-__start:
 	.frame fp, 0, zero
 	mov	zero, fp
 	br	gp, 1f
@@ -62,7 +59,6 @@ __start:
 	mov	a1, s1
 	mov	a2, s2
 
-#ifdef HAVE_INITFINI
   /* Call _init, the entry point to our own .init section.  */
 	jsr	ra, _init
 	ldgp	gp, 0(ra)
@@ -71,16 +67,12 @@ __start:
 	lda	a0, _fini
 	jsr	ra, atexit
 	ldgp	gp, 0(ra)
-#else
-  /* initialize constructors: */
-	jsr	ra, __main
-	ldgp	gp, 0(ra)
-#endif
+
+  /* Call the user's main and exit with its return value.  */
 	mov	s0, a0
 	mov	s1, a1
 	mov	s2, a2
 
-  /* Call the user's main and exit with its return value.  */
 	jsr	ra, main
 	ldgp	gp, 0(ra)
 
@@ -90,7 +82,10 @@ __start:
   /* Die very horribly if exit returns.  Call_pal hlt is callable from
      kernel mode only; this will result in an illegal instruction trap.  */
 	call_pal 0
-END(__start)
+	.end _start
+
+/* For ECOFF backwards compatibility. */
+weak_alias(_start, __start)
 
 /* Define a symbol for the first piece of initialized data.  */
 	.data
diff --git a/sysdeps/m68k/fpu/k_cos.c b/sysdeps/m68k/fpu/k_cos.c
index 28406e8cba..61f566f6a1 100644
--- a/sysdeps/m68k/fpu/k_cos.c
+++ b/sysdeps/m68k/fpu/k_cos.c
@@ -16,7 +16,6 @@ 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 <ansidecl.h>
 #include <math.h>
 
 #ifndef FUNC
@@ -29,7 +28,14 @@ Cambridge, MA 02139, USA.  */
 #define __CONCATX(a,b) __CONCAT(a,b)
 
 float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y), float_type x AND float_type y)
+__CONCATX(__kernel_,FUNC) (x, y)
+     float_type x;
+     float_type y;
 {
-  return __CONCATX(__,FUNC) (x + y);
+  float_type sin_x, cos_x, sin_y, cos_y;
+  __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_x), "=f" (sin_x)
+			: "f" (x));
+  __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_y), "=f" (sin_y)
+			: "f" (y));
+  return cos_x * cos_y - sin_x * sin_y;
 }
diff --git a/sysdeps/m68k/fpu/k_sin.c b/sysdeps/m68k/fpu/k_sin.c
index 8c6dfef720..3eed1d466c 100644
--- a/sysdeps/m68k/fpu/k_sin.c
+++ b/sysdeps/m68k/fpu/k_sin.c
@@ -16,7 +16,6 @@ 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 <ansidecl.h>
 #include <math.h>
 
 #ifndef FUNC
@@ -29,8 +28,17 @@ Cambridge, MA 02139, USA.  */
 #define __CONCATX(a,b) __CONCAT(a,b)
 
 float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y, iy),
-      float_type x AND float_type y AND int iy)
+__CONCATX(__kernel_,FUNC) (x, y, iy)
+     float_type x;
+     float_type y;
+     int iy;
 {
-  return __CONCATX(__,FUNC) (x + y);
+  float_type sin_x, cos_x, sin_y, cos_y;
+  if (iy == 0)
+    return __m81_u_(__CONCATX(__,FUNC)) (x);
+  __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_x), "=f" (sin_x)
+			: "f" (x));
+  __asm__ __volatile__ ("fsincosx %2,%0:%1" : "=f" (cos_y), "=f" (sin_y)
+			: "f" (y));
+  return sin_x * cos_y + cos_x * sin_y;
 }
diff --git a/sysdeps/m68k/fpu/k_tan.c b/sysdeps/m68k/fpu/k_tan.c
index c8fa9b780e..7f1b729b96 100644
--- a/sysdeps/m68k/fpu/k_tan.c
+++ b/sysdeps/m68k/fpu/k_tan.c
@@ -16,7 +16,6 @@ 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 <ansidecl.h>
 #include <math.h>
 
 #ifndef FUNC
@@ -29,11 +28,16 @@ Cambridge, MA 02139, USA.  */
 #define __CONCATX(a,b) __CONCAT(a,b)
 
 float_type
-DEFUN(__CONCATX(__kernel_,FUNC), (x, y, iy),
-      float_type x AND float_type y AND int iy)
+__CONCATX(__kernel_,FUNC) (x, y, iy)
+     float_type x;
+     float_type y;
+     int iy;
 {
-  if (iy == 1)
-    return __CONCATX(__,FUNC) (x + y);
+  float_type tan_x, tan_y;
+  tan_x = __m81_u_(__CONCATX(__,FUNC)) (x);
+  tan_y = __m81_u_(__CONCATX(__,FUNC)) (y);
+  if (iy > 0)
+    return (tan_x + tan_y) / (1 - tan_x * tan_y);
   else
-    return ((float_type) -1.0) / __CONCATX(__,FUNC) (x + y);
+    return (tan_x * tan_y - 1) / (tan_x + tan_y);
 }
diff --git a/sysdeps/mach/hurd/send.c b/sysdeps/mach/hurd/send.c
index 79d76fa367..e18339a8fb 100644
--- a/sysdeps/mach/hurd/send.c
+++ b/sysdeps/mach/hurd/send.c
@@ -16,7 +16,6 @@ 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 <ansidecl.h>
 #include <errno.h>
 #include <sys/socket.h>
 #include <hurd.h>
@@ -25,8 +24,11 @@ Cambridge, MA 02139, USA.  */
 
 /* Send N bytes of BUF to socket FD.  Returns the number sent or -1.  */
 int
-DEFUN(__send, (fd, buf, n, flags),
-      int fd AND const PTR buf AND size_t n AND int flags)
+__send (fd, buf, n, flags)
+     int fd;
+     const void *buf;
+     size_t n;
+     int flags;
 {
   error_t err;
   int wrote;
diff --git a/sysdeps/mach/hurd/sendto.c b/sysdeps/mach/hurd/sendto.c
index 3621cd5dd5..88026b8cf5 100644
--- a/sysdeps/mach/hurd/sendto.c
+++ b/sysdeps/mach/hurd/sendto.c
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1994, 1995, 1996 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
@@ -16,7 +16,6 @@ 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 <ansidecl.h>
 #include <errno.h>
 #include <sys/socket.h>
 #include <hurd.h>
@@ -28,9 +27,13 @@ Cambridge, MA 02139, USA.  */
 /* Send N bytes of BUF on socket FD to peer at address ADDR (which is
    ADDR_LEN bytes long).  Returns the number sent, or -1 for errors.  */
 int
-DEFUN(sendto, (fd, buf, n, flags, addr, addr_len),
-      int fd AND const PTR buf AND size_t n AND int flags AND
-      const struct sockaddr_un *addr AND size_t addr_len)
+sendto (fd, buf, n, flags, addr, addr_len)
+     int fd;
+     const void *buf;
+     size_t n;
+     int flags;
+     const struct sockaddr_un *addr;
+     size_t addr_len;
 {
   addr_port_t aport;
   error_t err;
diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c
index a6786b1a13..ddbd80a505 100644
--- a/sysdeps/posix/profil.c
+++ b/sysdeps/posix/profil.c
@@ -78,6 +78,15 @@ profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale)
       return sigaction (SIGPROF, &oact, NULL);
     }
 
+ if (samples)
+    {
+      /* Was already turned on.  Restore old timer and signal handler
+	 first.  */
+      if (setitimer (ITIMER_PROF, &otimer, NULL) < 0
+	  || sigaction (SIGPROF, &oact, NULL) < 0)
+	return -1;
+    }
+
   samples = sample_buffer;
   nsamples = size / sizeof *samples;
   pc_offset = offset;
diff --git a/sysdeps/stub/ustat.c b/sysdeps/stub/ustat.c
index c90bd36a9d..baa98fd5e8 100644
--- a/sysdeps/stub/ustat.c
+++ b/sysdeps/stub/ustat.c
@@ -1,5 +1,5 @@
 /* Return info on filesystem.
-Copyright (C) 1995 Free Software Foundation, Inc.
+Copyright (C) 1995, 1996 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
diff --git a/sysdeps/unix/Makefile b/sysdeps/unix/Makefile
index 627b78c70c..d3cc46ab31 100644
--- a/sysdeps/unix/Makefile
+++ b/sysdeps/unix/Makefile
@@ -284,11 +284,11 @@ export asm_CPP := $(COMPILE.S) -E -x assembler-with-cpp
 
 $(common-objpfx)sysd-syscalls: $(..)sysdeps/unix/make-syscalls.sh \
 			       $(wildcard $(+sysdep_dirs:%=%/syscalls.list))
-	for dir in $$sysdirs; do \
-	  test -f $(..)sysdeps/$$dir/syscalls.list && \
+	for dir in $(+sysdep_dirs); do \
+	  test -f $$dir/syscalls.list && \
 	  { $(SHELL) $(dir $<)$(notdir $<) \
-		     $(..)sysdeps $$dir $(object-suffixes) || exit 1; }; \
-	  test $$dir = unix && break; \
+		     $$dir $(object-suffixes) || exit 1; }; \
+	  test $$dir = sysdeps/unix && break; \
 	done > $@T
 	mv -f $@T $@
 
diff --git a/sysdeps/unix/alpha/sysdep.S b/sysdeps/unix/alpha/sysdep.S
index 2d05305ce0..336eb02029 100644
--- a/sysdeps/unix/alpha/sysdep.S
+++ b/sysdeps/unix/alpha/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996 Free Software Foundation, Inc.
    Contributed by Brendan Kehoe (brendan@zen.org).
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -22,6 +22,7 @@ Cambridge, MA 02139, USA.  */
 
 	.section .bss
 	.globl errno
+	.align 2
 errno:	.space 4
 #ifdef __ELF__
 	.type errno, @object
diff --git a/sysdeps/unix/make-syscalls.sh b/sysdeps/unix/make-syscalls.sh
index e2c09905d0..58e31eb468 100644
--- a/sysdeps/unix/make-syscalls.sh
+++ b/sysdeps/unix/make-syscalls.sh
@@ -3,12 +3,11 @@
 # Usage: make-syscalls.sh ../sysdeps unix/common
 # Expects $sysdirs in environment.
 
-sysbase=$1; shift
 thisdir=$1; shift
 
 # Get the list of system calls for this directory.
 calls=`sed 's/#.*$//
-/^[ 	]*$/d' $sysbase/$thisdir/syscalls.list`
+/^[ 	]*$/d' $thisdir/syscalls.list`
 
 # Check each sysdep dir with higher priority than this one,
 # and remove from $calls all the functions found in other dirs.
@@ -21,13 +20,13 @@ for dir in $sysdirs; do
   # If a syscall specified a "caller", then only compile that syscall
   # if the caller function is also implemented in this directory.
   calls=`echo "$calls" | while read file caller rest; do
-	   test -f $sysbase/$dir/$file.c && continue
-	   test -f $sysbase/$dir/$file.S && continue
-	   test -f $sysbase/$dir/$file.s && continue
+	   test -f $dir/$file.c && continue
+	   test -f $dir/$file.S && continue
+	   test -f $dir/$file.s && continue
 	   if test x$caller != x-; then
-	     test -f $sysbase/$dir/$caller.c && continue
-	     test -f $sysbase/$dir/$caller.S && continue
-	     test -f $sysbase/$dir/$caller.s && continue
+	     test -f $dir/$caller.c && continue
+	     test -f $dir/$caller.S && continue
+	     test -f $dir/$caller.s && continue
 	   fi
 	   echo $file $caller $rest
          done`
diff --git a/sysdeps/unix/sysv/linux/alpha/Dist b/sysdeps/unix/sysv/linux/alpha/Dist
index 79ac03ff90..d898d041a2 100644
--- a/sysdeps/unix/sysv/linux/alpha/Dist
+++ b/sysdeps/unix/sysv/linux/alpha/Dist
@@ -1,5 +1,6 @@
-alpha/ptrace.halpha/regdef.h
+alpha/ptrace.h alpha/regdef.h
 ieee_get_fp_control.S ieee_set_fp_control.S
 ioperm.c
 init-first.h
 clone.S
+sys/io.h
diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index 3908b5703c..fa433e9d8b 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -1,5 +1,5 @@
 ifeq ($(subdir), misc)
-sysdep_headers += alpha/ptrace.h alpha/regdef.h
+sysdep_headers += alpha/ptrace.h alpha/regdef.h sys/io.h
 
 sysdep_routines += ieee_get_fp_control ieee_set_fp_control \
 		   sethae ioperm osf_sigprocmask fstatfs statfs llseek
diff --git a/sysdeps/unix/sysv/linux/alpha/init-first.h b/sysdeps/unix/sysv/linux/alpha/init-first.h
index c27c589a28..ffbcaf1521 100644
--- a/sysdeps/unix/sysv/linux/alpha/init-first.h
+++ b/sysdeps/unix/sysv/linux/alpha/init-first.h
@@ -1,12 +1,29 @@
-/* This fragment is invoked in the stack context of program start.
-   Its job is to set up a pointer to argc as an argument, pass
-   control to `INIT', and, if necessary, clean up after the call
-   to leave the stack in the same condition it was found in.  */
+/* The job of this fragment it to find argc and friends for INIT.
+   This is done in one of two ways: either in the stack context
+   of program start, or having dlopen pass them in.  */
 
-#define SYSDEP_CALL_INIT(NAME, INIT)	\
-    asm(".globl " #NAME "\n"		\
-	#NAME ":\n\t"			\
-	"ldgp $29, 0($27)\n\t"		\
-	".prologue 1\n\t"		\
-	"mov $30, $16\n\t"		\
-	"br $31, " #INIT "..ng");
+#define SYSDEP_CALL_INIT(NAME, INIT)		\
+    asm(".weak _dl_starting_up\n\t"		\
+        ".globl " #NAME "\n\t"			\
+	".ent " #NAME "\n"			\
+	#NAME ":\n\t"				\
+	"ldgp	$29, 0($27)\n\t"		\
+	".prologue 1\n\t"			\
+	".set at\n\t"				\
+	/* Are we a dynamic libc being loaded into a static program?  */ \
+	"lda	$0, _dl_starting_up\n\t"	\
+	"beq	$0, 1f\n\t"			\
+	"ldl	$0, 0($0)\n"			\
+	"cmpeq	$31, $0, $0\n"			\
+	"1:\t"					\
+	"stl	$0, __libc_multiple_libcs\n\t"	\
+	/* If so, argc et al are in a0-a2 already.  Otherwise, load them.  */ \
+	"bne	$0, 2f\n\t"			\
+	"ldl	$16, 0($30)\n\t"		\
+	"lda	$17, 8($30)\n\t"		\
+	"s8addq	$16, $17, $18\n\t"		\
+	"addq	$18, 8, $18\n"			\
+	"2:\t"					\
+	"br $31, " #INIT "..ng\n\t"		\
+	".set noat\n\t"				\
+	".end " #NAME);
diff --git a/sysdeps/unix/sysv/linux/alpha/ioperm.c b/sysdeps/unix/sysv/linux/alpha/ioperm.c
index a91608ff24..731059e600 100644
--- a/sysdeps/unix/sysv/linux/alpha/ioperm.c
+++ b/sysdeps/unix/sysv/linux/alpha/ioperm.c
@@ -84,20 +84,21 @@ struct ioswtch {
 static struct platform {
   const char	*name;
   int		io_sys;
+  int		hae_shift;
   unsigned long	bus_memory_base;
   unsigned long	sparse_bus_memory_base;
 } platform[] = {
-  {"Alcor",	IOSYS_CIA,	CIA_DENSE_MEM,		CIA_SPARSE_MEM},
-  {"Avanti",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"Cabriolet",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"EB164",	IOSYS_CIA,	CIA_DENSE_MEM,		CIA_SPARSE_MEM},
-  {"EB64+",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"EB66",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"EB66P",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"Jensen",	IOSYS_JENSEN,	0,			JENSEN_SPARSE_MEM},
-  {"Mikasa",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"Mustang",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
-  {"Noname",	IOSYS_APECS,	APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"Alcor",	IOSYS_CIA,	5, CIA_DENSE_MEM,	CIA_SPARSE_MEM},
+  {"Avanti",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"Cabriolet",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"EB164",	IOSYS_CIA,	5, CIA_DENSE_MEM,	CIA_SPARSE_MEM},
+  {"EB64+",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"EB66",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"EB66P",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"Jensen",	IOSYS_JENSEN,	7, 0,			JENSEN_SPARSE_MEM},
+  {"Mikasa",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"Mustang",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
+  {"Noname",	IOSYS_APECS,	5, APECS_DENSE_MEM,	APECS_SPARSE_MEM},
 };
 
 
@@ -109,11 +110,11 @@ static struct {
   unsigned long		base;
   struct ioswtch *	swp;
   int			sys;
+  int			hae_shift;
+  unsigned long		bus_memory_base;
+  unsigned long		sparse_bus_memory_base;
 } io;
 
-static unsigned long bus_memory_base = -1;
-static unsigned long sparse_bus_memory_base = -1;
-
 extern void __sethae (unsigned long);	/* we can't use asm/io.h */
 
 
@@ -335,8 +336,9 @@ init_iosys (void)
     {
       if (strcmp (platform[i].name, systype) == 0)
 	{
-	  bus_memory_base = platform[i].bus_memory_base;
-	  sparse_bus_memory_base = platform[i].sparse_bus_memory_base;
+	  io.hae_shift = platform[i].hae_shift;
+	  io.bus_memory_base = platform[i].bus_memory_base;
+	  io.sparse_bus_memory_base = platform[i].sparse_bus_memory_base;
 	  io.sys = platform[i].io_sys;
 	  if (io.sys == IOSYS_JENSEN)
 	    io.swp = &ioswtch[0];
@@ -500,7 +502,7 @@ _bus_base(void)
 {
   if (!io.swp && init_iosys () < 0)
     return -1;
-  return bus_memory_base;
+  return io.bus_memory_base;
 }
 
 unsigned long
@@ -508,7 +510,15 @@ _bus_base_sparse(void)
 {
   if (!io.swp && init_iosys () < 0)
     return -1;
-  return sparse_bus_memory_base;
+  return io.sparse_bus_memory_base;
+}
+
+int
+_hae_shift(void)
+{
+  if (!io.swp && init_iosys () < 0)
+    return -1;
+  return io.hae_shift;
 }
 
 weak_alias (_sethae, sethae);
@@ -522,3 +532,4 @@ weak_alias (_outw, outw);
 weak_alias (_outl, outl);
 weak_alias (_bus_base, bus_base);
 weak_alias (_bus_base_sparse, bus_base_sparse);
+weak_alias (_hae_shift, hae_shift);
diff --git a/sysdeps/unix/sysv/linux/alpha/sys/io.h b/sysdeps/unix/sysv/linux/alpha/sys/io.h
new file mode 100644
index 0000000000..a88073573c
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/alpha/sys/io.h
@@ -0,0 +1,59 @@
+/* Copyright (C) 1996 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 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.  */
+
+#ifndef	_SYS_IO_H
+
+#define	_SYS_IO_H	1
+#include <features.h>
+
+__BEGIN_DECLS
+
+/* Get constants from kernel header files. */
+#include <asm/io.h>
+
+/* If TURN_ON is TRUE, request for permission to do direct i/o on the
+   port numbers in the range [FROM,FROM+NUM-1].  Otherwise, turn I/O
+   permission off for that range.  This call requires root privileges.
+
+   Portability note: not all Linux platforms support this call.  Most
+   platforms based on the PC I/O architecture probably will, however.
+   E.g., Linux/Alpha for Alpha PCs supports this.  */
+extern int ioperm __P ((unsigned long int __from, unsigned long int __num,
+			int __turn_on));
+
+/* Set the I/O privilege level to LEVEL.  If LEVEL>3, permission to
+   access any I/O port is granted.  This call requires root
+   privileges. */
+extern int iopl __P ((int __level));
+
+/* Return the physical address of the DENSE I/O memory or NULL if none
+   is available (e.g. on a jensen).  */
+extern unsigned long _bus_base __P ((void)) __attribute__ ((const));
+extern unsigned long bus_base __P ((void)) __attribute__ ((const));
+
+/* Return the physical address of the SPARSE I/O memory.  */
+extern unsigned long _bus_base_sparse __P ((void)) __attribute__ ((const));
+extern unsigned long bus_base_sparse __P ((void)) __attribute__ ((const));
+
+/* Return the HAE shift used by the SPARSE I/O memory.  */
+extern int _hae_shift __P ((void)) __attribute__ ((const));
+extern int hae_shift __P ((void)) __attribute__ ((const));
+
+__END_DECLS
+
+#endif /* _SYS_IO_H */
diff --git a/sysdeps/unix/sysv/linux/i386/Dist b/sysdeps/unix/sysv/linux/i386/Dist
index 4e4f467392..780edfca50 100644
--- a/sysdeps/unix/sysv/linux/i386/Dist
+++ b/sysdeps/unix/sysv/linux/i386/Dist
@@ -1,3 +1,3 @@
 sys/perm.h sys/vm86.h
 init-first.h
-close.S
+clone.S
diff --git a/sysdeps/unix/sysv/linux/i386/init-first.h b/sysdeps/unix/sysv/linux/i386/init-first.h
index f42d7f2533..4c61f1b41e 100644
--- a/sysdeps/unix/sysv/linux/i386/init-first.h
+++ b/sysdeps/unix/sysv/linux/i386/init-first.h
@@ -1,13 +1,27 @@
-/* This fragment is invoked in the stack context of program start.
-   Its job is to set up a pointer to argc as an argument, pass
-   control to `INIT', and, if necessary, clean up after the call
-   to leave the stack in the same condition it was found in.  */
+/* The job of this fragment it to find argc and friends for INIT.
+   This is done in one of two ways: either in the stack context
+   of program start, or having dlopen pass them in.  */
 
-#define SYSDEP_CALL_INIT(NAME, INIT)	\
-    asm(".globl " #NAME "\n\t"		\
-	#NAME ":\n\t"			\
-	"lea 4(%esp), %eax\n\t"		\
-	"pushl %eax\n\t"		\
-	"call " #INIT "\n\t"		\
-	"popl %eax\n\t"			\
-	"ret");
+#define SYSDEP_CALL_INIT(NAME, INIT)					      \
+void NAME (void *arg)							      \
+{									      \
+  int argc;								      \
+  char **argv, **envp;							      \
+									      \
+  __libc_multiple_libcs = &_dl_starting_up && !_dl_starting_up;		      \
+									      \
+  if (!__libc_multiple_libcs)						      \
+    {									      \
+      argc = (int) arg;							      \
+      argv = (char **) &arg + 1;					      \
+      envp = &argv[argc+1];						      \
+    }									      \
+  else									      \
+    {									      \
+      argc = (int) arg;							      \
+      argv = ((char ***) &arg)[1];					      \
+      envp = ((char ***) &arg)[2];					      \
+    }									      \
+									      \
+  INIT (argc, argv, envp);						      \
+}
diff --git a/sysdeps/unix/sysv/linux/i386/mmap.S b/sysdeps/unix/sysv/linux/i386/mmap.S
index 90ac88c46f..638d548e00 100644
--- a/sysdeps/unix/sysv/linux/i386/mmap.S
+++ b/sysdeps/unix/sysv/linux/i386/mmap.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1995 Free Software Foundation, Inc.
+/* Copyright (C) 1995, 1996 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
@@ -36,9 +36,9 @@ ENTRY (__mmap)
 	/* Restore registers.  */
 	movl %edx, %ebx
 
-	/* %eax is < 0 if there was an error.  */
-	testl %eax, %eax
-	jl syscall_error
+	/* If 0 > %eax > -4096 there was an error.  */
+	cmpl $-4096, %eax
+	ja syscall_error
 
 	/* Successful; return the syscall's value.  */
 	ret
diff --git a/sysdeps/unix/sysv/linux/init-first.c b/sysdeps/unix/sysv/linux/init-first.c
index ae163bcd49..9f0a3c0f51 100644
--- a/sysdeps/unix/sysv/linux/init-first.c
+++ b/sysdeps/unix/sysv/linux/init-first.c
@@ -27,7 +27,7 @@ extern void __libc_init (int, char **, char **);
 extern void __libc_global_ctors (void);
 
 /* The function is called from assembly stubs the compiler can't see.  */
-static void init (void *) __attribute__ ((unused));
+static void init (int, char **, char **) __attribute__ ((unused));
 
 extern int _dl_starting_up;
 weak_extern (_dl_starting_up)
@@ -40,26 +40,16 @@ int __libc_multiple_libcs = 1;
    later calls of initializers for dynamic libraries.  */
 int __libc_argc;
 char **__libc_argv;
-char **__libc_envp;
 
 
 static void
-init (void *data)
+init (int argc, char **argv, char **envp)
 {
   extern int __personality (int);
 
-  __libc_multiple_libcs = &_dl_starting_up && ! _dl_starting_up;
-
-
   /* We must not call `personality' twice.  */
   if (!__libc_multiple_libcs)
     {
-      /* The argument we got points to the values describing the
-	 command line argument etc.  */
-      __libc_argc = *(int *)data;
-      __libc_argv = (char **)data + 1;
-      __libc_envp = &__libc_argv[__libc_argc + 1];
-
       /* The `personality' system call takes one argument that chooses
 	 the "personality", i.e. the set of system calls and such.  We
 	 must make this call first thing to disable emulation of some
@@ -70,17 +60,13 @@ init (void *data)
       /* Set the FPU control word to the proper default value.  */
       __setfpucw (__fpu_control);
     }
-  else
-    {
-      /* The argument we got points to the values describing the
-	 command line argument etc.  */
-      __libc_argc = *((int *)data)++;
-      __libc_argv = *((char ***)data)++;
-      __libc_envp = *(char ***)data;
-    }
 
-  __environ = __libc_envp;
-  __libc_init (__libc_argc, __libc_argv, __libc_envp);
+  /* Save the command-line arguments.  */
+  __libc_argc = argc;
+  __libc_argv = argv;
+  __environ = envp;
+
+  __libc_init (argc, argv, envp);
 
 #ifdef PIC
   __libc_global_ctors ();
diff --git a/version.c b/version.c
index 8fc5cfe0f1..c8f4ec5fe6 100644
--- a/version.c
+++ b/version.c
@@ -27,7 +27,7 @@ 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.\n\
-Report bugs to <bug-glibc@gnu.ai.mit.edu>.";
+Report bugs to <bug-glibc@gnu.ai.mit.edu>.\n";
 
 #include <unistd.h>
 
diff --git a/wcsmbs/wchar.h b/wcsmbs/wchar.h
index db3c08d833..ec222ea082 100644
--- a/wcsmbs/wchar.h
+++ b/wcsmbs/wchar.h
@@ -264,7 +264,7 @@ extern long int __wcstol_internal __P ((__const wchar_t *__nptr,
 extern unsigned long int __wcstoul_internal __P ((__const wchar_t *__nptr,
 						  wchar_t **__endptr,
 						  int __base, int __group));
-#ifdef __GNUC__
+#if defined __GNUC__ && defined __USE_GNU
 extern long long int __wcstoq_internal __P ((__const wchar_t *__nptr,
 					     wchar_t **__endptr, int __base,
 					     int __group));
@@ -272,7 +272,7 @@ extern unsigned long long int __wcstouq_internal __P ((__const wchar_t *__nptr,
 						       wchar_t **__endptr,
 						       int __base,
 						       int __group));
-#endif /* GCC */
+#endif /* GCC and use GNU.  */
 
 
 #if defined (__OPTIMIZE__) && __GNUC__ >= 2
@@ -293,16 +293,15 @@ extern __inline float wcstof (__const wchar_t *__nptr, wchar_t **__endptr)
 extern __inline __long_double_t wcstold (__const wchar_t *__nptr,
 					 wchar_t **__endptr)
 { return __wcstold_internal (__nptr, __endptr, 0); }
-#endif
 
-#ifdef __USE_BSD
+
 extern __inline long long int wcstoq (__const wchar_t *__nptr,
 				      wchar_t **__endptr, int __base)
 { return __wcstoq_internal (__nptr, __endptr, __base, 0); }
 extern __inline unsigned long long int wcstouq (__const wchar_t *__nptr,
 						wchar_t **__endptr, int __base)
 { return __wcstouq_internal (__nptr, __endptr, __base, 0); }
-#endif
+#endif /* Use GNU.  */
 #endif /* Optimizing GCC >=2.  */