about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog34
-rw-r--r--FAQ78
-rw-r--r--Rules28
-rw-r--r--inet/arpa/inet.h4
-rw-r--r--resolv/gethnamaddr.c27
-rw-r--r--resolv/inet_ntop.c10
-rw-r--r--resolv/inet_pton.c21
-rw-r--r--resolv/resolv.h3
-rw-r--r--stdlib/gmp-impl.h20
-rw-r--r--sysdeps/alpha/bsd-_setjmp.S8
-rw-r--r--sysdeps/generic/utmpbits.h1
-rw-r--r--sysdeps/unix/sysv/linux/alpha/Makefile2
-rw-r--r--sysdeps/unix/sysv/linux/alpha/sigsuspend.S8
-rw-r--r--sysdeps/unix/sysv/linux/alpha/start.S35
-rw-r--r--sysdeps/unix/sysv/linux/speed.c5
15 files changed, 201 insertions, 83 deletions
diff --git a/ChangeLog b/ChangeLog
index ebd7bebe14..3bf5a87dff 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,30 @@
+Fri May 24 02:31:36 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* sysdeps/unix/sysv/linux/speed.c: Add new speed value 460800.
+
+Thu May 23 23:09:33 1996  Ulrich Drepper  <drepper@cygnus.com>
+
+	* FAQ: Add answer for 100% source code compatibility to Linux
+	libc by David Mosberger-Tang.
+
+	Update from bind-4.3.4-T3B.
+	* inet/arpa/inet.h: Add prototypes for inet_pton, inet_ntop,
+	inet_nsap_addr, and inet_nsap_ntoa.
+	* resolv/gethnamaddr.c: Correct compatibility problems (sprintf),
+	remove fourth argument to inet_pton and correct handling of
+	host_addr passing.
+	* resolv/inet_ntop.c: Correct compatibility problems (sprintf).
+	* resolv/inet_pton.c: Remove fourth argument.
+	* resolv/resolv.h: Remove prototypes for inet_nsap_addr and
+	inet_nsap_ntoa.  Now on <arpa/inet.h>.
+
+	* stdlib/gmp-impl.h: Add prototypes for internal functions.
+
+Thu May 23 22:49:15 1996  Roland McGrath  <roland@delasyd.gnu.ai.mit.edu>
+
+	* Rules (subdir_install): Remove dep on sor-$(subdir).
+	(static-only-routines): Removed variable and associated rules.
+
 Wed May 22 00:40:50 1996  David Mosberger-Tang  <davidm@azstarnet.com>
 
 	* sysdeps/unix/sysv/linux/alpha/speed.c (speeds): Add entry for
@@ -5,7 +32,7 @@ Wed May 22 00:40:50 1996  David Mosberger-Tang  <davidm@azstarnet.com>
 
 	* sysdeps/unix/sysv/linux/alpha/statbuf.h: New file.
 
-	* sysdeps/unix/sysv/linux/Makefile (headers): Add
+	* sysdeps/unix/sysv/linux/alpha/Makefile (headers): Add
  	alpha/ptrace.h.
 	* sysdeps/unix/sysv/linux/alpha/alpha/ptrace.h: New file.
 
@@ -32,15 +59,16 @@ Wed May 22 00:40:50 1996  David Mosberger-Tang  <davidm@azstarnet.com>
 	to simplify declaration of leaf functions.
 
 	* sysdeps/alpha/_mcount.S, sysdeps/alpha/bb_init_func.S,
- 	sysdeps/alpha/bsd-setjmp.S, sysdeps/alpha/ffs.S,
+ 	sysdeps/alpha/bsd-_setjmp.S, sysdeps/alpha/ffs.S,
  	sysdeps/alpha/htonl.S, sysdeps/alpha/htons.S, sysdeps/alpha/memchr.S,
  	sysdeps/alpha/setjmp.S, sysdeps/alpha/strlen.S,
  	sysdeps/alpha/udiv_qrnnd.S, sysdeps/unix/sysv/linux/alpha/brk.S,
  	sysdeps/unix/sysv/linux/alpha/ieee_get_fp_control.S,
  	sysdeps/unix/sysv/linux/alpha/ieee_set_fp_control.S,
  	sysdeps/unix/sysv/linux/alpha/pipe.S,
- 	sysdeps/unix/sysv/linux/sigsuspend.S,
+ 	sysdeps/unix/sysv/linux/alpha/sigsuspend.S,
  	sysdeps/unix/sysv/linux/alpha/syscall.S,
+ 	sysdeps/unix/sysv/linux/alpha/start.S,
  	sysdeps/unix/sysv/linux/alpha/sysdep.S: Remove include of regdef.h.
   	sysdep.h includes it now. Replace ENTRY by LEAF with appropriate
  	framesize declaration.  Replace "lda pv,sym/jsr pv" by "jsr sym".
diff --git a/FAQ b/FAQ
index 9334108afa..91e531dbf1 100644
--- a/FAQ
+++ b/FAQ
@@ -19,6 +19,28 @@ this document let me know.
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
 [Q1]	``What systems the GNU C Library runs on?''
 
+[Q2]	``What compiler do I need to translate GNU libc?''
+
+[Q3]	``When starting make I get only errors messages.
+	  What's wrong?''
+
+[Q4]	``After I changed configure.in I get `Autoconf version X.Y.
+	  or higher is required for this script'.  What can I do?''
+
+[Q5]	``Do I need a special linker or archiver?''
+
+[Q6]	``Do I need some more things to compile GNU C Library?''
+
+[Q7]	``When I run `nm libc.so|grep " U "' on the produced library
+	  I still find unresolved symbols?  Can this be ok?''
+
+[Q8]	``I expect GNU libc to be 100% source code compatible with
+	  the old Linux based GNU libc.  Why isn't it like this?''
+
+
+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+[Q1]	``What systems the GNU C Library runs on?''
+
 [A1] {UD} This is difficult to answer.  The file `README' lists the
 architectures GNU libc is known to run *at some time*.  This does not
 mean that it still can be compiled and run on them in the moment.
@@ -128,11 +150,67 @@ errors while linking.
 
 
 ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+[Q8]	``I expect GNU libc to be 100% source code compatible with
+	  the old Linux based GNU libc.  Why isn't it like this?''
+
+[A8] {DMT} Not every extension in Linux libc's history was well
+thought.  In fact it had a lot of problems with standard compliance
+and cleanliness.  With the introduction of a new version number these
+errors now can be corrected.  The following list shows a list of the
+know source code incompatibilities.
+
+* _GNU_SOURCE: glibc does not automatically define _GNU_SOURCE.  Thus,
+  if a program depends on GNU extensions, it is necessary
+  to compile it with C compiler option -D_GNU_SOURCE.  This difference
+  normally mainfests itself in the form of missing prototypes and/or
+  data type definitions.  Thus, if you get such errors, the first thing you
+  should do is grep the header files in /usr/include and /usr/include/sys
+  to check whether the functions are really missing or whether it is
+  just necessary to add a define of _GNU_SOURCE.  Similar comments apply
+  to _BSD_SOURCE, _POSIX_SOURCE, _SVID_SOURCE etc (see
+  /usr/include/features.h).
+
+* reboot(): GNU libc sanitizes the interface of reboot() to be more
+  compatible with the interface used on other OSes.  In particular,
+  reboot() as implemented in glibc takes just one argument.  This argument
+  corresponds to the third argument of the Linux reboot system call.
+  That is, a call of the form reboot(a, b, c) needs to be changed into
+  reboot(c).
+
+* errno: If a program uses variable "errno", then it _must_ include header
+  file <errno.h>.  The old libc often (erroneously) declared this variable
+  implicitly as a side-effect of including other libc header files.  glibc
+  is careful to avoid such namespace pollution, which, in turn, means that
+  you really need to include the header files that you depend on.  This
+  difference normally manifests itself in the form of the compiler
+  complaining about the references of the undeclared symbol "errno".
+
+* Linux-specific syscalls: All Linux system calls now have appropriate
+  library wrappers and corresponding declarations in various header files.
+  This is because the syscall() macro that was traditionally used to
+  work around missing syscall wrappers are inherently non-portable and
+  error-prone.  The following tables lists all the new syscall stubs,
+  the header-file declaring their interface and the system call name.
+
+       syscall name:	wrapper name:	declaring header file:
+       -------------	-------------	----------------------
+       bdflush		bdflush		<unistd.h>
+       create_module	create_module	<sys/module.h>
+       delete_module	delete_module	<sys/module.h>
+       get_kernel_syms	get_kernel_syms	<sys/module.h>
+       init_module	init_module	<sys/module.h>
+       syslog		ksyslog_ctl	<unistd.h>
+
+  To get the Linux-specific declarations in <unistd.h>, you'll need
+  to define C pre-processor macro _LINUX_SOURCE during compilation.
 
 
+~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
+
 
 Answers were given by:
 {UD} Ulrich Drepper, <drepper@cygnus.com>
+{DMT} David Mosberger-Tang, <davidm@AZStarNet.com>
 
 
 Local Variables:
diff --git a/Rules b/Rules
index 2eddd6ecff..edfb1517d8 100644
--- a/Rules
+++ b/Rules
@@ -126,33 +126,7 @@ subdir_echo-distinfo:
 # our portions of the library because the parent make will install it later
 # (likewise the stubs file).
 .PHONY: subdir_install
-subdir_install: install-no-libc.a lib-noranlib stubs \
-		$(common-objpfx)sor-$(subdir)
-
-ifdef objpfx
-sor-objpfx = $(objpfx:../%=%)
-else
-sor-objpfx = $(subdir)
-endif
-
-ifndef libc.so-version
-# Undefine this because it can't work when we libc.so is unversioned.
-static-only-routines =
-endif
-
-# This communicates to the parent during install the set of routines that
-# need to be put into the special libc.so archive.
-$(common-objpfx)sor-$(subdir): Makefile
-	echo $(static-only-routines:%=$(sor-objpfx)%.o) > $@T
-	mv -f $@T $@
-
-ifdef static-only-routines
-# These routines are to be omitted from the shared library object,
-# so we replace the PIC objects for them with the empty object file.
-$(static-only-routines:%=$(objpfx)%.so): %.so: $(objpfx)empty.o
-	rm -f $@
-	ln $< $@
-endif
+subdir_install: install-no-libc.a lib-noranlib stubs
 
 .PHONY: subdir_TAGS subdir_dist
 subdir_TAGS: TAGS
diff --git a/inet/arpa/inet.h b/inet/arpa/inet.h
index 6cb672f336..b0a91312d3 100644
--- a/inet/arpa/inet.h
+++ b/inet/arpa/inet.h
@@ -49,6 +49,10 @@ struct in_addr	 inet_makeaddr __P((u_int32_t , u_int32_t));
 u_int32_t	 inet_netof __P((struct in_addr));
 u_int32_t	 inet_network __P((const char *));
 char		*inet_ntoa __P((struct in_addr));
+int		 inet_pton __P((int af, const char *src, void *dst));
+const char	*inet_ntop __P((int af, const void *src, char *dst, size_t s));
+u_int		 inet_nsap_addr __P((const char *, u_char *, int maxlen));
+char		*inet_nsap_ntoa __P((int, const u_char *, char *ascii));
 __END_DECLS
 
 #endif /* !_INET_H_ */
diff --git a/resolv/gethnamaddr.c b/resolv/gethnamaddr.c
index b80595b7d5..18f4764428 100644
--- a/resolv/gethnamaddr.c
+++ b/resolv/gethnamaddr.c
@@ -88,6 +88,12 @@ static char rcsid[] = "$Id$";
 # include <../conf/options.h>
 #endif
 
+#ifdef SPRINTF_CHAR
+# define SPRINTF(x) strlen(sprintf/**/x)
+#else
+# define SPRINTF(x) sprintf x
+#endif
+
 #define	MAXALIASES	35
 #define	MAXADDRS	35
 #define	MAXADDRBUFSIZE	8192
@@ -475,8 +481,7 @@ gethostbyname2(name, af)
 				 * Fake up a hostent as if we'd actually
 				 * done a lookup.
 				 */
-				if (inet_pton(af, name, host_addr,
-					       sizeof host_addr) <= 0) {
+				if (inet_pton(af, name, host_addr) <= 0) {
 					h_errno = HOST_NOT_FOUND;
 					return (NULL);
 				}
@@ -487,7 +492,7 @@ gethostbyname2(name, af)
 				host.h_name = hostbuf;
 				host.h_aliases = host_aliases;
 				host_aliases[0] = NULL;
-				h_addr_ptrs[0] = (char *)&host_addr;
+				h_addr_ptrs[0] = (char *)host_addr;
 				h_addr_ptrs[1] = NULL;
 				host.h_addr_list = h_addr_ptrs;
 				if (_res.options & RES_USE_INET6)
@@ -617,9 +622,9 @@ gethostbyaddr(addr, len, af)
 			case AF_INET6:
 				qp = qbuf;
 				for (n = IN6ADDRSZ - 1; n >= 0; n--) {
-					qp += sprintf(qp, "%x.%x.",
-						      uaddr[n] & 0xf,
-						      (uaddr[n] >> 4) & 0xf);
+					qp += SPRINTF((qp, "%x.%x.",
+						       uaddr[n] & 0xf,
+						       (uaddr[n] >> 4) & 0xf));
 				}
 				strcpy(qp, "ip6.int");
 				break;
@@ -770,12 +775,12 @@ _gethtent()
 		goto again;
 	*cp++ = '\0';
 	if ((_res.options & RES_USE_INET6) &&
-	    inet_pton(AF_INET6, p, host_addr, sizeof host_addr) > 0) {
+	    inet_pton(AF_INET6, p, host_addr) > 0) {
 		af = AF_INET6;
 		len = IN6ADDRSZ;
-	} else if (inet_pton(AF_INET, p, host_addr, sizeof host_addr) > 0) {
+	} else if (inet_pton(AF_INET, p, host_addr) > 0) {
 		if (_res.options & RES_USE_INET6) {
-			map_v4v6_address((char*)&host_addr, (char*)&host_addr);
+			map_v4v6_address((char*)host_addr, (char*)host_addr);
 			af = AF_INET6;
 			len = IN6ADDRSZ;
 		} else {
@@ -785,7 +790,7 @@ _gethtent()
 	} else {
 		goto again;
 	}
-	h_addr_ptrs[0] = (char *)&host_addr;
+	h_addr_ptrs[0] = (char *)host_addr;
 	h_addr_ptrs[1] = NULL;
 	host.h_addr_list = h_addr_ptrs;
 	host.h_length = len;
@@ -859,7 +864,7 @@ struct hostent *
 _gethtbyname(name)
 	const char *name;
 {
-	extern struct hostent *_gethtbyname2 __P((const char *, int));
+	extern struct hostent *_gethtbyname2();
 	struct hostent *hp;
 
 	if (_res.options & RES_USE_INET6) {
diff --git a/resolv/inet_ntop.c b/resolv/inet_ntop.c
index 71db06d845..3b5795f349 100644
--- a/resolv/inet_ntop.c
+++ b/resolv/inet_ntop.c
@@ -29,6 +29,12 @@ static char rcsid[] = "$Id$";
 #include <stdio.h>
 #include "../conf/portability.h"
 
+#ifdef SPRINTF_CHAR
+# define SPRINTF(x) strlen(sprintf/**/x)
+#else
+# define SPRINTF(x) sprintf x
+#endif
+
 /*
  * WARNING: Don't even consider trying to compile this on a system where
  * sizeof(int) < 4.  sizeof(int) > 4 is fine; all the world's not a VAX.
@@ -84,7 +90,7 @@ inet_ntop4(src, dst, size)
 	static const char fmt[] = "%u.%u.%u.%u";
 	char tmp[sizeof "255.255.255.255"];
 
-	if (sprintf(tmp, fmt, src[0], src[1], src[2], src[3]) > size) {
+	if (SPRINTF((tmp, fmt, src[0], src[1], src[2], src[3])) > size) {
 		errno = ENOSPC;
 		return (NULL);
 	}
@@ -170,7 +176,7 @@ inet_ntop6(src, dst, size)
 			tp += strlen(tp);
 			break;
 		}
-		tp += sprintf(tp, "%x", words[i]);
+		tp += SPRINTF((tp, "%x", words[i]));
 	}
 	/* Was it a trailing run of 0x00's? */
 	if (best.base != -1 && (best.base + best.len) == (IN6ADDRSZ / INT16SZ))
diff --git a/resolv/inet_pton.c b/resolv/inet_pton.c
index 385dc25337..cfc069d891 100644
--- a/resolv/inet_pton.c
+++ b/resolv/inet_pton.c
@@ -37,7 +37,7 @@ static int	inet_pton4 __P((const char *src, u_char *dst));
 static int	inet_pton6 __P((const char *src, u_char *dst));
 
 /* int
- * inet_pton(af, src, dst, size)
+ * inet_pton(af, src, dst)
  *	convert from presentation format (which usually means ASCII printable)
  *	to network format (which is usually some kind of binary format).
  * return:
@@ -48,24 +48,15 @@ static int	inet_pton6 __P((const char *src, u_char *dst));
  *	Paul Vixie, 1996.
  */
 int
-inet_pton(af, src, dst, size)
+inet_pton(af, src, dst)
 	int af;
 	const char *src;
 	void *dst;
-	size_t size;
 {
 	switch (af) {
 	case AF_INET:
-		if (size < INADDRSZ) {
-			errno = ENOSPC;
-			return (-1);
-		}
 		return (inet_pton4(src, dst));
 	case AF_INET6:
-		if (size < IN6ADDRSZ) {
-			errno = ENOSPC;
-			return (-1);
-		}
 		return (inet_pton6(src, dst));
 	default:
 		errno = EINVAL;
@@ -207,12 +198,12 @@ inet_pton6(src, dst)
 		 * Since some memmove()'s erroneously fail to handle
 		 * overlapping regions, we'll do the shift by hand.
 		 */
-		const howmany = tp - colonp;
+		const int n = tp - colonp;
 		int i;
 
-		for (i = 1; i <= howmany; i++) {
-			endp[- i] = colonp[howmany - i];
-			colonp[howmany - i] = 0;
+		for (i = 1; i <= n; i++) {
+			endp[- i] = colonp[n - i];
+			colonp[n - i] = 0;
 		}
 		tp = endp;
 	}
diff --git a/resolv/resolv.h b/resolv/resolv.h
index 0f5d5b855b..f4320ff1b3 100644
--- a/resolv/resolv.h
+++ b/resolv/resolv.h
@@ -245,9 +245,6 @@ int	 res_nameinquery __P((const char *, int, int,
 			      const u_char *, const u_char *));
 int	 res_queriesmatch __P((const u_char *, const u_char *,
 			       const u_char *, const u_char *));
-/* XXX - these last two don't belong in the resolver */
-u_int	 inet_nsap_addr __P((const char *, u_char *, int maxlen));
-char	*inet_nsap_ntoa __P((int, const u_char *, char *ascii));
 __END_DECLS
 
 #endif /* !_RESOLV_H_ */
diff --git a/stdlib/gmp-impl.h b/stdlib/gmp-impl.h
index 47a5d6e83d..62e96da952 100644
--- a/stdlib/gmp-impl.h
+++ b/stdlib/gmp-impl.h
@@ -299,6 +299,26 @@ typedef unsigned int UHWtype;
 #define impn_sqr_n_basecase	__MPN(impn_sqr_n_basecase)
 #define impn_sqr_n		__MPN(impn_sqr_n)
 
+#ifndef _PROTO
+#if defined (__STDC__) || defined (__cplusplus)
+#define _PROTO(x) x
+#else
+#define _PROTO(x) ()
+#endif
+#endif
+
+/* Prototypes for internal mpn calls.  */
+extern void impn_mul_n_basecase _PROTO ((mp_ptr prodp, mp_srcptr up,
+					 mp_srcptr vp, mp_size_t size));
+extern void impn_mul_n _PROTO ((mp_ptr prodp, mp_srcptr up, mp_srcptr vp,
+				mp_size_t size, mp_ptr tspace));
+extern void impn_sqr_n_basecase _PROTO ((mp_ptr prodp, mp_srcptr up,
+					 mp_size_t size));
+extern void impn_sqr_n _PROTO ((mp_ptr prodp, mp_srcptr up, mp_size_t size,
+				mp_ptr tspace));
+
+
+
 #ifndef IEEE_DOUBLE_BIG_ENDIAN
 #define IEEE_DOUBLE_BIG_ENDIAN 1
 #endif
diff --git a/sysdeps/alpha/bsd-_setjmp.S b/sysdeps/alpha/bsd-_setjmp.S
index 9947d8f45a..16709dfc09 100644
--- a/sysdeps/alpha/bsd-_setjmp.S
+++ b/sysdeps/alpha/bsd-_setjmp.S
@@ -23,8 +23,8 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-ENTRY (setjmp)
-	lda $27, __sigsetjmp	/* Load address to jump to.  */
-	bis $31, $31, $17	/* Pass a second argument of zero.  */
-	jmp $31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
+ENTRY(setjmp)
+	lda	$27, __sigsetjmp	/* Load address to jump to.  */
+	bis	$31, $31, $17		/* Pass a second argument of zero.  */
+	jmp	$31, ($27), __sigsetjmp /* Call __sigsetjmp.  */
 	.end setjmp
diff --git a/sysdeps/generic/utmpbits.h b/sysdeps/generic/utmpbits.h
index 3189ff0fdf..0cd8f1d238 100644
--- a/sysdeps/generic/utmpbits.h
+++ b/sysdeps/generic/utmpbits.h
@@ -49,4 +49,3 @@ struct utmp {
 __END_DECLS
 
 #endif /* utmpbits.h */
-
diff --git a/sysdeps/unix/sysv/linux/alpha/Makefile b/sysdeps/unix/sysv/linux/alpha/Makefile
index 9e12a0daa2..beb8441b46 100644
--- a/sysdeps/unix/sysv/linux/alpha/Makefile
+++ b/sysdeps/unix/sysv/linux/alpha/Makefile
@@ -1,5 +1,5 @@
 ifeq ($(subdir), misc)
-headers += alpha/regdef.h
+headers += alpha/ptrace.h alpha/regdef.h
 
 sysdep_routines := $(sysdep_routines) \
   ieee_get_fp_control ieee_set_fp_control fpu_control setfpucw \
diff --git a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
index 29cba8d312..00c02de72b 100644
--- a/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
+++ b/sysdeps/unix/sysv/linux/alpha/sigsuspend.S
@@ -17,12 +17,13 @@ not, write to the Free Software Foundation, Inc., 675 Mass Ave,
 Cambridge, MA 02139, USA.  */
 
 /* sigsuspend is a special syscall since it needs to dereference the
-sigset.  */
+   sigset.  */
 
 #include <sysdep.h>
 
 	.text
-ENTRY(sigsuspend)
+
+LEAF(sigsuspend, 0)
 	.prologue 0
 
 	ldq	a0, 0(a0)
@@ -33,7 +34,6 @@ ENTRY(sigsuspend)
 
 error:	br	gp, 1f
 1:	ldgp	gp, 0(gp)
-	lda	pv, syscall_error
-	jmp	zero, (pv)
+	jmp	zero, syscall_error
 
 	.end sigsuspend
diff --git a/sysdeps/unix/sysv/linux/alpha/start.S b/sysdeps/unix/sysv/linux/alpha/start.S
index d1966a82ba..a7099f6840 100644
--- a/sysdeps/unix/sysv/linux/alpha/start.S
+++ b/sysdeps/unix/sysv/linux/alpha/start.S
@@ -18,11 +18,16 @@ Cambridge, MA 02139, USA.  */
 
 #include <sysdep.h>
 
-.comm errno, 4
+	.comm errno, 4
+#ifdef __ELF__
+	.type errno, @object
+#endif
 
 	.text
-ENTRY(__start)
+LEAF(__start, 16)
 	lda	sp, -16(sp)
+	.prologue 0
+
 	stq	zero, 8(sp)		/* terminate frame chain */
 
 	br	t0, 1f
@@ -33,8 +38,7 @@ ENTRY(__start)
 	ldgp	gp, 0(ra)
 
 	/* clear out errno. */
-	lda	t0, errno
-	stl	zero, 0(t0)
+	stl	zero, (errno)
 
 	ldl	a0, 16(sp)	/* get argc */
 	lda	a1, 24(sp)	/* get argv */
@@ -45,26 +49,32 @@ ENTRY(__start)
 	addq	a2, 0x8, a2
 	stq	a2, 0(t0)
 
-#ifndef HAVE_INITFINI
 	mov	a0, s0
 	mov	a1, s1
 	mov	a2, s2
 
-	jsr	ra, __libc_init
+#ifdef HAVE_INITFINI
+	/* register the _fini sections to ensure destructors get run: */
+	lda	a0, _fini
+	jsr	ra, atexit
 	ldgp	gp, 0(ra)
 
-	mov	s0, a0
-	mov	s1, a1
-	mov	s2, a2
+	/* Now run the _init section of the program itself.  The _init
+	   sections of shared libraries will be run by the dynamic linker.  */
+	jsr	ra, _init
+	ldgp	gp, 0(ra)
 
 	/* initialize constructors: */
 	jsr	ra, __main
 	ldgp	gp, 0(ra)
+#else
+	jsr	ra, __libc_init
+	ldgp	gp, 0(ra)
+#endif
 
 	mov	s0, a0
 	mov	s1, a1
 	mov	s2, a2
-#endif
 
 	jsr	ra, main
 	ldgp	gp, 0(ra)
@@ -90,4 +100,9 @@ ENTRY(__start)
 __data_start:
 	.long 0
 
+#ifdef __ELF__
+	.size __data_start, 4
+	.type __data_start, @object
+#endif
+
 weak_alias(__data_start, data_start)
diff --git a/sysdeps/unix/sysv/linux/speed.c b/sysdeps/unix/sysv/linux/speed.c
index 84811deba6..d229f766f9 100644
--- a/sysdeps/unix/sysv/linux/speed.c
+++ b/sysdeps/unix/sysv/linux/speed.c
@@ -1,5 +1,5 @@
 /* `struct termios' speed frobnication functions.  Linux version.
-Copyright (C) 1991, 1992, 1993, 1995 Free Software Foundation, Inc.
+Copyright (C) 1991, 1992, 1993, 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
@@ -43,6 +43,7 @@ static const speed_t speeds[] =
     57600,
     115200,
     230400,
+    460800,
   };
 
 
@@ -68,7 +69,7 @@ strong_alias (cfgetospeed, cfgetispeed);
 
 /* Set the output baud rate stored in *TERMIOS_P to SPEED.  */
 int
-cfsetospeed  (termios_p, speed) 
+cfsetospeed  (termios_p, speed)
      struct termios *termios_p;
      speed_t speed;
 {