diff options
author | Roland McGrath <roland@gnu.org> | 1995-07-22 10:48:43 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 1995-07-22 10:48:43 +0000 |
commit | 439d1d4560aa3e261c065c43e3995779809b4cb2 (patch) | |
tree | 82be4196b9f9a0567b4210d818cacc53780b3030 /sysdeps/unix/i386 | |
parent | 0bf9d0eb2bc40ee304e8ff0315112cde711fa1b2 (diff) | |
download | glibc-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.S | 4 | ||||
-rw-r--r-- | sysdeps/unix/i386/sysdep.S | 14 | ||||
-rw-r--r-- | sysdeps/unix/i386/sysdep.h | 19 |
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. */ |