From: Jason Thorpe Date: Fri, 18 Oct 2002 23:10:35 +0000 (+0000) Subject: netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define __enable_execute_stack function. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=90e021a061203481abb6d80e59e3b83ac26fb05d;p=gcc.git netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define __enable_execute_stack function. * config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define __enable_execute_stack function. * config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define as NETBSD_ENABLE_EXECUTE_STACK. * config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto. * config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto. * config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto. * config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto. * config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto. From-SVN: r58292 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 53bbe9a713c..5ca6ddd6bf0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2002-10-18 Jason Thorpe + + * config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Define + __enable_execute_stack function. + * config/alpha/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Define + as NETBSD_ENABLE_EXECUTE_STACK. + * config/i386/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto. + * config/i386/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto. + * config/i386/netbsd64.h (TRANSFER_FROM_TRAMPOLINE): Ditto. + * config/sparc/netbsd-elf.h (TRANSFER_FROM_TRAMPOLINE): Ditto. + * config/sparc/netbsd.h (TRANSFER_FROM_TRAMPOLINE): Ditto. + 2002-10-18 Jason Thorpe * config/i386/i386.c (x86_initialize_trampoline): Emit a call diff --git a/gcc/config/alpha/netbsd.h b/gcc/config/alpha/netbsd.h index 4769af88745..4dc713ba537 100644 --- a/gcc/config/alpha/netbsd.h +++ b/gcc/config/alpha/netbsd.h @@ -75,5 +75,10 @@ Boston, MA 02111-1307, USA. */ %{!shared:crtend%O%s} %{shared:crtendS%O%s}" +/* Attempt to enable execute permissions on the stack. */ + +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK + + #undef TARGET_VERSION #define TARGET_VERSION fprintf (stderr, " (NetBSD/alpha ELF)"); diff --git a/gcc/config/i386/netbsd-elf.h b/gcc/config/i386/netbsd-elf.h index a1591f732f1..4f49bd3e84f 100644 --- a/gcc/config/i386/netbsd-elf.h +++ b/gcc/config/i386/netbsd-elf.h @@ -121,4 +121,7 @@ Boston, MA 02111-1307, USA. */ we don't care about compatibility with older gcc versions. */ #define DEFAULT_PCC_STRUCT_RETURN 1 +/* Attempt to enable execute permissions on the stack. */ +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK + #define TARGET_VERSION fprintf (stderr, " (NetBSD/i386 ELF)"); diff --git a/gcc/config/i386/netbsd.h b/gcc/config/i386/netbsd.h index ab0af773bd1..45ae893595e 100644 --- a/gcc/config/i386/netbsd.h +++ b/gcc/config/i386/netbsd.h @@ -67,3 +67,6 @@ prefix is added. */ #undef GOT_SYMBOL_NAME #define GOT_SYMBOL_NAME "GLOBAL_OFFSET_TABLE_" + +/* Attempt to enable execute permissions on the stack. */ +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK diff --git a/gcc/config/i386/netbsd64.h b/gcc/config/i386/netbsd64.h index 89050bc540b..341b6d1189b 100644 --- a/gcc/config/i386/netbsd64.h +++ b/gcc/config/i386/netbsd64.h @@ -69,5 +69,7 @@ Boston, MA 02111-1307, USA. */ fprintf (FILE, "\tcall __mcount\n"); \ } +/* Attempt to enable execute permissions on the stack. */ +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK #define TARGET_VERSION fprintf (stderr, " (NetBSD/x86_64 ELF)"); diff --git a/gcc/config/netbsd.h b/gcc/config/netbsd.h index 19df77ffcd8..c83ff0f545e 100644 --- a/gcc/config/netbsd.h +++ b/gcc/config/netbsd.h @@ -161,3 +161,51 @@ Boston, MA 02111-1307, USA. */ #undef WINT_TYPE #define WINT_TYPE "int" + + +/* Attempt to turn on execute permission for the stack. This may be + used by TRANSFER_FROM_TRAMPOLINE of the target needs it (that is, + if the target machine can change execute permissions on a page). + + There is no way to query the execute permission of the stack, so + we always issue the mprotect() call. + + Note that we go out of our way to use namespace-non-invasive calls + here. Unfortunately, there is no libc-internal name for mprotect(). + + Also note that no errors should be emitted by this code; it is considered + dangerous for library calls to send messages to stdout/stderr. */ + +#define NETBSD_ENABLE_EXECUTE_STACK \ +extern void __enable_execute_stack (void *); \ +void \ +__enable_execute_stack (addr) \ + void *addr; \ +{ \ + extern int mprotect (void *, size_t, int); \ + extern int __sysctl (int *, unsigned int, void *, size_t *, \ + void *, size_t); \ + \ + static int size; \ + static long mask; \ + \ + char *page, *end; \ + \ + if (size == 0) \ + { \ + int mib[2]; \ + size_t len; \ + \ + mib[0] = 6; /* CTL_HW */ \ + mib[1] = 7; /* HW_PAGESIZE */ \ + len = sizeof (size); \ + (void) __sysctl (mib, 2, &size, &len, NULL, 0); \ + mask = ~((long) size - 1); \ + } \ + \ + page = (char *) (((long) addr) & mask); \ + end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \ + \ + /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \ + (void) mprotect (page, end - page, 7); \ +} diff --git a/gcc/config/sparc/netbsd-elf.h b/gcc/config/sparc/netbsd-elf.h index eaa801cf598..10788f2ae3b 100644 --- a/gcc/config/sparc/netbsd-elf.h +++ b/gcc/config/sparc/netbsd-elf.h @@ -102,6 +102,9 @@ Boston, MA 02111-1307, USA. */ #undef STDC_0_IN_SYSTEM_HEADERS +/* Attempt to enable execute permissions on the stack. */ +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK + #undef TARGET_VERSION #define TARGET_VERSION fprintf (stderr, " (%s)", TARGET_NAME); diff --git a/gcc/config/sparc/netbsd.h b/gcc/config/sparc/netbsd.h index f6a5244333a..284e288d5e4 100644 --- a/gcc/config/sparc/netbsd.h +++ b/gcc/config/sparc/netbsd.h @@ -44,3 +44,6 @@ /* Until they use ELF or something that handles dwarf2 unwinds and initialization stuff better. */ #define DWARF2_UNWIND_INFO 0 + +/* Attempt to enable execute permissions on the stack. */ +#define TRANSFER_FROM_TRAMPOLINE NETBSD_ENABLE_EXECUTE_STACK