summary refs log tree commit diff
path: root/sysdeps/i386/elf/start.S
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1997-01-30 04:09:36 +0000
committerUlrich Drepper <drepper@redhat.com>1997-01-30 04:09:36 +0000
commit19361cb768c280e47f2ca69ed63e1d75f332e592 (patch)
tree785385b6029dfd47c9d2b6309b9eb6c5b3b4f59f /sysdeps/i386/elf/start.S
parent56552e4257910954051f3ff02c0ee2609c7ca688 (diff)
downloadglibc-19361cb768c280e47f2ca69ed63e1d75f332e592.tar.gz
glibc-19361cb768c280e47f2ca69ed63e1d75f332e592.tar.xz
glibc-19361cb768c280e47f2ca69ed63e1d75f332e592.zip
update from main archive 970129 cvs/libc-970201 cvs/libc-970131 cvs/libc-970130
1997-01-30 03:24  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/i386/elf/start.S (_start): Align stack pointer to
	double word boundary before pushing args for main.  This way we
	don't get penalties for misaligned memory accesses.  Reported by
	Edward Seidl <seidl@janed.com>.

	* Makefile: Correct *my* changes of Richards patch of 1997-01-28 10:51.
	Patch by HJ Lu.

	* misc/bsd-compat.c: Update copyright.
	* misc/efgcvt.c: Likewise.
	* misc/efgcvt_r.c: Likewise.
	* misc/error.c: Likewise.
	* misc/error.h: Likewise.
	* misc/fstab.c: Likewise.
	* misc/init-misc.c: Likewise.
	* misc/lsearch.c: Likewise.
	* misc/mntent.c: Likewise.
	* misc/qefgcvt.c: Likewise.
	* misc/qefgcvt_r.c: Likewise.
	* nss/databases.def: Likewise.
	* nss/db-Makefile: Likewise.
	* nss/ethers-lookup.c: Likewise.
	* nss/hosts-lookup.c: Likewise.
	* nss/netgrp-lookup.c: Likewise.
	* nss/nsswitch.h: Likewise.
	* nss/proto-lookup.c: Likewise.
	* nss/rpc-lookup.c: Likewise.
	* nss/service-lookup.c: Likewise.
	* nss/nss_db/db-netgrp.c: Likewise.
	* nss/nss_files/files-grp.c: Likewise.
	* nss/nss_files/files-hosts.c: Likewise.
	* nss/nss_files/files-network.c: Likewise.
	* nss/nss_files/files-proto.c: Likewise.
	* nss/nss_files/files-pwd.c: Likewise.
	* nss/nss_files/files-rpc.c: Likewise.
	* nss/nss_files/files-service.c: Likewise.
	* nss/nss_files/files-spwd.c: Likewise.
	* shadow/fgetspent.c: Likewise.
	* shadow/fgetspent_r.c: Likewise.
	* shadow/getspent.c: Likewise.
	* shadow/getspent_r.c: Likewise.
	* shadow/getspnam.c: Likewise.
	* shadow/getspnam_r.c: Likewise.
	* shadow/putspent.c: Likewise.
	* shadow/sgetspent.c: Likewise.
	* shadow/sgetspent_r.c: Likewise.
	* sysdeps/i386/init-first.c: Likewise.
	* sysdeps/unix/i386/sysdep.S: Likewise.

	* shadow/shadow.h: Don't use __USE_REENTRENT.  All code must be
	prepared to be running in a multi-threaded environment.  Change
	to __USE_MISC unless the function is defined in POSIX.1 (in this
	case also test for __USE_POSIX).
	* dirent/dirent.h: Likewise.
	* grp/grp.h: Likewise.
	* inet/aliases.h: Likewise.
	* libio/libio.h: Likewise.
	* libio/stdio.h: Likewise.
	* login/utmp.h: Likewise.
	* math/mathcalls.h: Likewise.
	* misc/mntent.h: Likewise.
	* pwd/pwd.h: Likewise.
	* resolv/netdb.h: Likewise.
	* stdlib/stdlib.h: Likewise.
	* string/string.h: Likewise.
	* sunrpc/rpc/netdb.h: Likewise.
	* sysdeps/generic/crypt.h: Likewise.
	* sysdeps/unix/sysv/linux/errnos.h: Likewise.
	* time/time.h: Likewise.

1997-01-30 00:27  Fila Kolodny  <fila@ibi.com>

	* sunrpc/Makefile (install-others): Add rpcsvc/bootparam_prot.h
	only if not cross compiling.

1997-01-29 16:16  Fila Kolodny  <fila@ibi.com>

	* sysdeps/posix/sigpause.c: Include <stddef.h> to get definition of
	NULL.
	* sysdeps/posix/sigwait.c: Likewise.

1997-01-28 23:42  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makeconfig ($(common-objpfx)config.make): Depend on
	$(..)config.make.in.
Diffstat (limited to 'sysdeps/i386/elf/start.S')
-rw-r--r--sysdeps/i386/elf/start.S51
1 files changed, 29 insertions, 22 deletions
diff --git a/sysdeps/i386/elf/start.S b/sysdeps/i386/elf/start.S
index c5796e8db9..53e324b91b 100644
--- a/sysdeps/i386/elf/start.S
+++ b/sysdeps/i386/elf/start.S
@@ -1,21 +1,21 @@
 /* Startup code compliant to the ELF i386 ABI.
-Copyright (C) 1995 Free Software Foundation, Inc.
-This file is part of the GNU C Library.
+   Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
 
-The GNU C Library is free software; you can redistribute it and/or
-modify it under the terms of the GNU Library General Public License as
-published by the Free Software Foundation; either version 2 of the
-License, or (at your option) any later version.
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
 
-The GNU C Library is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-Library General Public License for more details.
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
 
-You should have received a copy of the GNU Library General Public
-License along with the GNU C Library; see the file COPYING.LIB.  If
-not, write to the Free Software Foundation, Inc., 675 Mass Ave,
-Cambridge, MA 02139, USA.  */
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
 
 /* This is the canonical entry point, usually the first thing in the text
    segment.  The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry
@@ -36,12 +36,12 @@ Cambridge, MA 02139, USA.  */
 					NULL
 */
 
-	.text	
+	.text
 	.globl _start
 _start:
 	/* Clear the frame pointer.  The ABI suggests this be done, to mark
 	   the outermost frame obviously.  */
-	movl $0, %ebp
+	xorl %ebp, %ebp
 
 	/* %edx contains the address of the shared library termination
 	   function, which we will register with `atexit' to be called by
@@ -53,7 +53,8 @@ _start:
 	jz nofini
 	pushl %edx
 	call atexit
-	addl $4, %esp
+	popl %eax		/* Pop value to unused register to remove
+				   argument from stack.  */
 nofini:
 
 	/* Do essential libc initialization.  In statically linked
@@ -66,9 +67,15 @@ nofini:
 	popl %esi		/* Pop the argument count.  */
 	leal 4(%esp,%esi,4), %eax /* envp = &argv[argc + 1] */
 	movl %eax, _environ	/* Store it in the global variable.  */
+	movl %esp, %edx		/* argv starts just at the current stack top.*/
+
+	/* Before pushing the arguments align the stack to a double word
+	   boundary to avoid penalties from misaligned accesses.  Thanks
+	   to Edward Seidl <seidl@janed.com> for pointing this out.  */
+	andl $0xfffffff8, %esp
+
 	pushl %eax		/* Push third argument: envp.  */
-	leal 4(%esp), %eax	/* argv starts just above that word.  */
-	pushl %eax		/* Push second argument: argv.  */
+	pushl %edx		/* Push second argument: argv.  */
 	pushl %esi		/* Push first argument: argc.  */
 
 	/* Call `_init', which is the entry point to our own `.init'
@@ -77,13 +84,13 @@ nofini:
 	call _init
 	pushl $_fini
 	call atexit
-	addl $4, %esp
+	popl %eax
 
 	/* Call the user's main function, and exit with its value.  */
 	call main
 	pushl %eax
-	call exit		/* This should never return.  */
-	hlt			/* Crash if somehow it does return.  */
+	call exit
+	hlt			/* Crash if somehow `exit' does return.  */
 
 /* Define a symbol for the first piece of initialized data.  */
 	.data