aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/i386
diff options
context:
space:
mode:
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. */