about summary refs log tree commit diff
path: root/sysdeps/unix/i386
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-07-22 10:48:43 +0000
committerRoland McGrath <roland@gnu.org>1995-07-22 10:48:43 +0000
commit439d1d4560aa3e261c065c43e3995779809b4cb2 (patch)
tree82be4196b9f9a0567b4210d818cacc53780b3030 /sysdeps/unix/i386
parent0bf9d0eb2bc40ee304e8ff0315112cde711fa1b2 (diff)
downloadglibc-439d1d4560aa3e261c065c43e3995779809b4cb2.tar.gz
glibc-439d1d4560aa3e261c065c43e3995779809b4cb2.tar.xz
glibc-439d1d4560aa3e261c065c43e3995779809b4cb2.zip
Sat Jul 22 01:56:03 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
	* sysdeps/unix/i386/sysdep.h (JUMPTARGET): New macro; use name@PLT
 	#ifdef PIC.
	(PSEUDO): Use JUMPTARGET(syscall_error) in jump insn.
	* sysdeps/unix/i386/syscall.S: Use JUMPTARGET(syscall_error) in
 	jump insn.

	* sysdeps/unix/sysv/sysv4/linux/i386/sysdep.h: Rewritten.
	* sysdeps/unix/sysv/sysv4/linux/i386/syscall.S: New file.
	* sysdeps/unix/sysv/sysv4/linux/i386/socket.S: Include
 	<sys/socketcall.h>.  Save %ebx in call-clobbered %edx instead of
 	stack.  Use JUMPTARGET(syscall_error) in jump insn.

	* Makeconfig (+gccwarn): Add -Wbad-function-cast -Wconversion.

	* sysdeps/unix/i386/sysdep.h (ENTRY): Use ASM_GLOBAL_DIRECTIVE and
 	ASM_TYPE_DIRECTIVE.
	(ASM_TYPE_DIRECTIVE): New macro; defined using `.type' #ifdef ELF.

	* sysdeps/unix/sysv/sysv4/linux/i386/sysdep.S (__syscall_error): 
	Rewritten, #include'ing unix/i386/sysdep.S for most of the code.
	* sysdeps/unix/i386/sysdep.S [PIC]: Store into `errno' through the GOT.

	Fixes to help Linux, inspired by drepper's work:
	* configure.in (os=linux*): Use unix/sysv/sysv4 for $base_os,
 	instead of unix/sysv.
	* sysdeps/posix/utimes.c: New file.
	* sysdeps/generic/getdomain.c: New file.
	* sysdeps/i386/init-first.c: Removed gratuitous #include <hurd.h>.
	* sysdeps/generic/dl-sysdep.c: Include <unistd.h> and declare
 	externals _dl_argc, _dl_argc, and _environ.
	* sysdeps/unix/sysv/linux/{accept,connect,getsockname,rename,
	socketpair,waitpid,bind,getpeername,listen,setsid,wait4}.S: Moved
	to new directory sysdeps/unix/sysv/sysv4/linux.
	* sysdeps/unix/sysv/linux: Directory removed.
	* sysdeps/unix/sysv/i386/linux/{socket.S,sysdep.h,sysdep.S}: Moved
	to new directory sysdeps/unix/sysv/sysv4/linux/i386.
	* sysdeps/unix/sysv/linux/i386: Directory removed.
Diffstat (limited to 'sysdeps/unix/i386')
-rw-r--r--sysdeps/unix/i386/syscall.S4
-rw-r--r--sysdeps/unix/i386/sysdep.S14
-rw-r--r--sysdeps/unix/i386/sysdep.h19
3 files changed, 31 insertions, 6 deletions
diff --git a/sysdeps/unix/i386/syscall.S b/sysdeps/unix/i386/syscall.S
index 5241ee4ac1..1db1e77d8d 100644
--- a/sysdeps/unix/i386/syscall.S
+++ b/sysdeps/unix/i386/syscall.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995 Free Software Foundation, Inc.
 This file is part of the GNU C Library.
 
 The GNU C Library is free software; you can redistribute it and/or
@@ -24,5 +24,5 @@ ENTRY (syscall)
 	popl %eax		/* Pop syscall number into %eax.  */
 	pushl %ecx		/* Push back return address.  */
 	.byte 0x9a, 0, 0, 0, 0, 7, 0 /* lcall $7, $0 -- gas bug */
-	jb syscall_error
+	jb JUMPTARGET(syscall_error)
 	ret
diff --git a/sysdeps/unix/i386/sysdep.S b/sysdeps/unix/i386/sysdep.S
index dae7153796..efe4f56e95 100644
--- a/sysdeps/unix/i386/sysdep.S
+++ b/sysdeps/unix/i386/sysdep.S
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1992, 1993, 1994, 1995 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
@@ -37,6 +37,16 @@ syscall_error:
 	jne notb		/* Branch if not.  */
 	movl $EAGAIN, %eax	/* Yes; translate it to EAGAIN.  */
 #endif
-notb:	movl %eax, C_SYMBOL_NAME(errno)
+notb:
+#ifndef	PIC
+	movl %eax, C_SYMBOL_NAME(errno)
+#else
+	/* Standard PIC nonsense to store into `errno' through the GOT.  */
+	call here
+here:	popl %ecx
+	addl $_GLOBAL_OFFSET_TABLE_+[.-here], %ecx
+	movl C_SYMBOL_NAME(errno@GOT)(%ecx), %ecx
+	movl %eax, (%ecx)
+#endif
 	movl $-1, %eax
 	ret
diff --git a/sysdeps/unix/i386/sysdep.h b/sysdeps/unix/i386/sysdep.h
index 38dd2378b5..4e4b6e6ab5 100644
--- a/sysdeps/unix/i386/sysdep.h
+++ b/sysdeps/unix/i386/sysdep.h
@@ -20,11 +20,20 @@ Cambridge, MA 02139, USA.  */
 
 #ifdef	ASSEMBLER
 
+/* Define an entry point visible from C.  */
 #define	ENTRY(name)							      \
-  .globl C_SYMBOL_NAME(name);						      \
+  ASM_GLOBAL_DIRECTIVE C_SYMBOL_NAME(name);				      \
+  ASM_TYPE_DIRECTIVE (C_SYMBOL_NAME(name),@function)			      \
   .align 4;								      \
   C_LABEL(name)
 
+/* For ELF we need the `.type' directive to make shared libs work right.  */
+#ifdef HAVE_ELF
+#define ASM_TYPE_DIRECTIVE(name,type)	.type name,type;
+#else
+#define ASM_TYPE_DIRECTIVE(name,type) /* Nothing is specified.  */
+#endif
+
 #ifdef	NO_UNDERSCORES
 /* Since C identifiers are not normally prefixed with an underscore
    on this system, the asm identifier `syscall_error' intrudes on the
@@ -36,7 +45,13 @@ Cambridge, MA 02139, USA.  */
   .globl syscall_error;							      \
   ENTRY (name)								      \
   DO_CALL (syscall_name, args);						      \
-  jb syscall_error
+  jb JUMPTARGET(syscall_error)
+
+#ifdef PIC
+#define JUMPTARGET(name) name@PLT
+#else
+#define JUMPTARGET(name) name
+#endif
 
 /* This is defined as a separate macro so that other sysdep.h files
    can include this one and then redefine DO_CALL.  */