[PIC]: Store into `errno' through the GOT.
[kopensolaris-gnu/glibc.git] / sysdeps / unix / i386 / sysdep.S
index 35734ce..efe4f56 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1992, 1993 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
@@ -29,14 +29,24 @@ __syscall_error:
 #else
 syscall_error:
 #endif
-#ifdef EWOULDBLOCK_sys
+#if defined (EWOULDBLOCK_sys) && EWOULDBLOCK_sys != EAGAIN
        /* We translate the system's EWOULDBLOCK error into EAGAIN.
           The GNU C library always defines EWOULDBLOCK==EAGAIN.
           EWOULDBLOCK_sys is the original number.  */
-       cmpl %eax, $EWOULDBLOCK_sys /* Is it the old EWOULDBLOCK?  */
-       jne notb                        /* Branch if not.  */
-       move $EAGAIN, %eax      /* Yes; translate it to EAGAIN.  */
+       cmpl $EWOULDBLOCK_sys, %eax /* Is it the old EWOULDBLOCK?  */
+       jne notb                /* Branch if not.  */
+       movl $EAGAIN, %eax      /* Yes; translate it to EAGAIN.  */
+#endif
+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
-notb:  movl %eax, C_SYMBOL_NAME(errno)
        movl $-1, %eax
        ret