+2011-06-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * config/alpha/netbsd.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/alpha/osf5.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/darwin.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/i386/mingw32.h (MINGW_ENABLE_EXECUTE_STACK): Remove.
+ (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ [IN_LIBGCC2]: Don't include <windows.h>.
+ * config/i386/netbsd-elf.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/i386/netbsd64.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/netbsd.h (NETBSD_ENABLE_EXECUTE_STACK): Remove.
+ * config/openbsd.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/sol2.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/sparc/freebsd.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/sparc/netbsd-elf.h (ENABLE_EXECUTE_STACK): Remove.
+ (HAVE_ENABLE_EXECUTE_STACK): Define.
+ * config/alpha/alpha.c (alpha_trampoline_init): Test
+ HAVE_ENABLE_EXECUTE_STACK.
+ * config/i386/i386.c (ix86_trampoline_init): Likewise.
+ * config/sparc/sparc.c (sparc32_initialize_trampoline): Likewise.
+ (sparc64_initialize_trampoline): Likewise.
+ * libgcc2.c [L_enable_execute_stack]: Remove.
+ * system.h (ENABLE_EXECUTE_STACK): Poison.
+ * doc/tm.texi.in (Trampolines, ENABLE_EXECUTE_STACK): Remove.
+ * doc/tm.texi: Regenerate.
+ * Makefile.in (LIBGCC2_CFLAGS): Add -fbuilding-libgcc.
+
2011-06-09 Jakub Jelinek <jakub@redhat.com>
PR middle-end/49308
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) \
$(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) \
-DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \
- -fno-stack-protector \
+ -fbuilding-libgcc -fno-stack-protector \
$(INHIBIT_LIBC_CFLAGS)
# Additional options to use when compiling libgcc2.a.
+2011-06-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+ Joseph Myers <joseph@codesourcery.com>
+
+ * c.opt (fbuilding-libgcc): New option.
+ * c-cppbuiltin.c (c_cpp_builtins): Define
+ __LIBGCC_TRAMPOLINE_SIZE__ if flag_building_libgcc.
+
2011-06-07 Jason Merrill <jason@redhat.com>
* c-common.c (max_tinst_depth): Lower default to 900.
/* Define builtin-in macros for the C family front ends.
- Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
+ Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
builtin_define_fixed_point_constants ("UTA", "", uta_type_node);
}
+ /* For libgcc-internal use only. */
+ if (flag_building_libgcc)
+ /* For libgcc enable-execute-stack.c. */
+ builtin_define_with_int_value ("__LIBGCC_TRAMPOLINE_SIZE__",
+ TRAMPOLINE_SIZE);
+
/* For use in assembly language. */
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);
C ObjC C++ ObjC++ Var(flag_no_asm, 0)
Recognize the \"asm\" keyword
+; Define extra predefined macros for use in libgcc.
+fbuilding-libgcc
+C ObjC C++ ObjC++ Undocumented Var(flag_building_libgcc)
+
fbuiltin
C ObjC C++ ObjC++ Var(flag_no_builtin, 0)
Recognize built-in functions
if (TARGET_ABI_OSF)
{
emit_insn (gen_imb ());
-#ifdef ENABLE_EXECUTE_STACK
+#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (init_one_libfunc ("__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfm%O%s} \
%(netbsd_endfile_spec)"
-
-/* Attempt to enable execute permissions on the stack. */
-
-#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK
+#define HAVE_ENABLE_EXECUTE_STACK
#define HAVE_STAMP_H 1
#endif
-/* Attempt to turn on access permissions for the stack. */
-
-#define ENABLE_EXECUTE_STACK \
-void \
-__enable_execute_stack (void *addr) \
-{ \
- extern int mprotect (const void *, size_t, int); \
- long size = getpagesize (); \
- long mask = ~(size-1); \
- char *page = (char *) (((long) addr) & mask); \
- char *end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
- \
- /* 7 is PROT_READ | PROT_WRITE | PROT_EXEC */ \
- if (mprotect (page, end - page, 7) < 0) \
- perror ("mprotect of trampoline code"); \
-}
+#define HAVE_ENABLE_EXECUTE_STACK
/* Digital UNIX V4.0E (1091)/usr/include/sys/types.h 4.3.49.9 1997/08/14 */
#define SIZE_TYPE "long unsigned int"
#define TARGET_ASM_OUTPUT_ANCHOR NULL
#define DARWIN_SECTION_ANCHORS 0
-/* Attempt to turn on execute permission for the stack. This may be
- used by TARGET_TRAMPOLINE_INIT if 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.
-
- Unfortunately it is not possible to make this namespace-clean.
-
- 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 ENABLE_EXECUTE_STACK \
-extern void __enable_execute_stack (void *); \
-void \
-__enable_execute_stack (void *addr) \
-{ \
- extern int mprotect (void *, size_t, int); \
- extern int getpagesize (void); \
- static int size; \
- static long mask; \
- \
- char *page, *end; \
- \
- if (size == 0) \
- { \
- size = getpagesize(); \
- mask = ~((long) size - 1); \
- } \
- \
- page = (char *) (((long) addr) & mask); \
- end = (char *) ((((long) (addr + (TARGET_64BIT ? 48 : 40))) & mask) + size); \
- \
- /* 7 == PROT_READ | PROT_WRITE | PROT_EXEC */ \
- (void) mprotect (page, end - page, 7); \
-}
+#define HAVE_ENABLE_EXECUTE_STACK
/* For Apple KEXTs, we make the constructors return this to match gcc
2.95. */
gcc_assert (offset <= TRAMPOLINE_SIZE);
}
-#ifdef ENABLE_EXECUTE_STACK
+#ifdef HAVE_ENABLE_EXECUTE_STACK
#ifdef CHECK_EXECUTE_STACK_ENABLED
if (CHECK_EXECUTE_STACK_ENABLED)
#endif
/* Let defaults.h definition of TARGET_USE_JCR_SECTION apply. */
#undef TARGET_USE_JCR_SECTION
-#undef MINGW_ENABLE_EXECUTE_STACK
-#define MINGW_ENABLE_EXECUTE_STACK \
-extern void __enable_execute_stack (void *); \
-void \
-__enable_execute_stack (void *addr) \
-{ \
- MEMORY_BASIC_INFORMATION b; \
- if (!VirtualQuery (addr, &b, sizeof(b))) \
- abort (); \
- VirtualProtect (b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE, \
- &b.Protect); \
-}
-
-#undef ENABLE_EXECUTE_STACK
-#define ENABLE_EXECUTE_STACK MINGW_ENABLE_EXECUTE_STACK
+#define HAVE_ENABLE_EXECUTE_STACK
#undef CHECK_EXECUTE_STACK_ENABLED
#define CHECK_EXECUTE_STACK_ENABLED flag_setstackexecutable
-#ifdef IN_LIBGCC2
-#include <windows.h>
-#endif
-
/* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygming. */
/* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygwin. */
#if DWARF2_UNWIND_INFO
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 ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK
+#define HAVE_ENABLE_EXECUTE_STACK
fprintf (FILE, "\tcall __mcount\n"); \
}
-/* Attempt to enable execute permissions on the stack. */
-#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK
+#define HAVE_ENABLE_EXECUTE_STACK
/* Base configuration file for all NetBSD targets.
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
- 2007, 2009, 2010 Free Software Foundation, Inc.
+ 2007, 2009, 2010, 2011 Free Software Foundation, Inc.
This file is part of GCC.
#undef WINT_TYPE
#define WINT_TYPE "int"
-\f
-
-/* Attempt to turn on execute permission for the stack. This may be
- used by TARGET_TRAMPOLINE_INIT if 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 (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); \
-}
/* Storage layout. */
\f
-/* Stack is explicitly denied execution rights on OpenBSD platforms. */
-#define ENABLE_EXECUTE_STACK \
-extern void __enable_execute_stack (void *); \
-void \
-__enable_execute_stack (void *addr) \
-{ \
- long size = getpagesize (); \
- long mask = ~(size-1); \
- char *page = (char *) (((long) addr) & mask); \
- char *end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
- \
- if (mprotect (page, end - page, PROT_READ | PROT_WRITE | PROT_EXEC) < 0) \
- perror ("mprotect of trampoline code"); \
-}
-
-#include <sys/types.h>
-#include <sys/mman.h>
+#define HAVE_ENABLE_EXECUTE_STACK
#define STDC_0_IN_SYSTEM_HEADERS 1
\f
-/*
- * Attempt to turn on access permissions for the stack.
- *
- * _SC_STACK_PROT is only defined for post 2.6, but we want this code
- * to run always. 2.6 can change the stack protection but has no way to
- * query it.
- *
- */
-
-/* sys/mman.h is not present on some non-Solaris configurations
- that use sol2.h, so ENABLE_EXECUTE_STACK must use a magic
- number instead of the appropriate PROT_* flags. */
-
-#define ENABLE_EXECUTE_STACK \
- \
-/* #define STACK_PROT_RWX (PROT_READ | PROT_WRITE | PROT_EXEC) */ \
- \
-static int need_enable_exec_stack; \
- \
-static void check_enabling(void) __attribute__ ((constructor)); \
-static void check_enabling(void) \
-{ \
- extern long sysconf(int); \
- \
- int prot = (int) sysconf(515 /* _SC_STACK_PROT */); \
- if (prot != 7 /* STACK_PROT_RWX */) \
- need_enable_exec_stack = 1; \
-} \
- \
-extern void __enable_execute_stack (void *); \
-void \
-__enable_execute_stack (void *addr) \
-{ \
- extern int mprotect(void *, size_t, int); \
- if (!need_enable_exec_stack) \
- return; \
- else { \
- long size = getpagesize (); \
- long mask = ~(size-1); \
- char *page = (char *) (((long) addr) & mask); \
- char *end = (char *) ((((long) (addr + TRAMPOLINE_SIZE)) & mask) + size); \
- \
- if (mprotect (page, end - page, 7 /* STACK_PROT_RWX */) < 0) \
- perror ("mprotect of trampoline code"); \
- } \
-}
+#define HAVE_ENABLE_EXECUTE_STACK
/* Support Solaris-specific format checking for cmn_err. */
#define TARGET_N_FORMAT_TYPES 1
#undef SPARC_DEFAULT_CMODEL
#define SPARC_DEFAULT_CMODEL CM_MEDLOW
-#define ENABLE_EXECUTE_STACK \
- static int need_enable_exec_stack; \
- static void check_enabling(void) __attribute__ ((constructor)); \
- static void check_enabling(void) \
- { \
- extern int sysctlbyname(const char *, void *, size_t *, void *, size_t);\
- int prot = 0; \
- size_t len = sizeof(prot); \
- \
- sysctlbyname ("kern.stackprot", &prot, &len, NULL, 0); \
- if (prot != 7) \
- need_enable_exec_stack = 1; \
- } \
- extern void __enable_execute_stack (void *); \
- void __enable_execute_stack (void *addr) \
- { \
- if (!need_enable_exec_stack) \
- return; \
- else { \
- /* 7 is PROT_READ | PROT_WRITE | PROT_EXEC */ \
- if (mprotect (addr, TRAMPOLINE_SIZE, 7) < 0) \
- perror ("mprotect of trampoline code"); \
- } \
- }
-
+#define HAVE_ENABLE_EXECUTE_STACK
/************************[ Assembler stuff ]********************************/
#undef STDC_0_IN_SYSTEM_HEADERS
-/* Attempt to enable execute permissions on the stack. */
-#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK
+#define HAVE_ENABLE_EXECUTE_STACK
/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler
description, allowing one to build 32-bit or 64-bit applications
/* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */
-#ifdef ENABLE_EXECUTE_STACK
+#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif
/* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */
-#ifdef ENABLE_EXECUTE_STACK
+#ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif
@var{end} are both pointer expressions.
@end defmac
-The operating system may also require the stack to be made executable
-before calling the trampoline. To implement this requirement, define
-the following macro.
-
-@defmac ENABLE_EXECUTE_STACK
-Define this macro if certain operations must be performed before executing
-code located on the stack. The macro should expand to a series of C
-file-scope constructs (e.g.@: functions) and provide a unique entry point
-named @code{__enable_execute_stack}. The target is responsible for
-emitting calls to the entry point in the code, for example from the
-@code{TARGET_TRAMPOLINE_INIT} hook.
-@end defmac
-
To use a standard subroutine, define the following macro. In addition,
you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the
@var{end} are both pointer expressions.
@end defmac
-The operating system may also require the stack to be made executable
-before calling the trampoline. To implement this requirement, define
-the following macro.
-
-@defmac ENABLE_EXECUTE_STACK
-Define this macro if certain operations must be performed before executing
-code located on the stack. The macro should expand to a series of C
-file-scope constructs (e.g.@: functions) and provide a unique entry point
-named @code{__enable_execute_stack}. The target is responsible for
-emitting calls to the entry point in the code, for example from the
-@code{TARGET_TRAMPOLINE_INIT} hook.
-@end defmac
-
To use a standard subroutine, define the following macro. In addition,
you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the
/* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */
/* Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
- 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
+ 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010, 2011
Free Software Foundation, Inc.
This file is part of GCC.
#endif /* L_clear_cache */
\f
-#ifdef L_enable_execute_stack
-/* Attempt to turn on execute permission for the stack. */
-
-#ifdef ENABLE_EXECUTE_STACK
- ENABLE_EXECUTE_STACK
-#else
-void
-__enable_execute_stack (void *addr __attribute__((__unused__)))
-{}
-#endif /* ENABLE_EXECUTE_STACK */
-
-#endif /* L_enable_execute_stack */
-\f
#ifdef L_trampoline
/* Jump to a trampoline, loading the static chain address. */
/* Target macros only used for code built for the target, that have
moved to libgcc-tm.h or have never been present elsewhere. */
#pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX \
- MD_UNWIND_SUPPORT
+ MD_UNWIND_SUPPORT ENABLE_EXECUTE_STACK
/* Other obsolete target macros, or macros that used to be in target
headers and were not used, and may be obsolete or may never have
+2011-06-09 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
+
+ * enable-execute-stack-empty.c: New file.
+ * enable-execute-stack-mprotect.c: New file.
+ * config/i386/enable-execute-stack-mingw32.c: New file.
+ * config.host (enable_execute_stack): New variable.
+ Select appropriate variants.
+ * configure.ac: Link enable-execute-stack.c to
+ $enable_execute_stack.
+ * configure: Regenerate.
+ * Makefile.in (LIB2ADD): Add enable-execute-stack.c.
+ (lib2funcs): Remove _enable_execute_stack.
+
2011-06-09 David S. Miller <davem@davemloft.net>
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
endif
endif
+LIB2ADD += enable-execute-stack.c
+
# Library members defined in libgcc2.c.
lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \
- _clear_cache _enable_execute_stack _trampoline __main _absvsi2 \
+ _clear_cache _trampoline __main _absvsi2 \
_absvdi2 _addvsi3 _addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 \
_negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \
_ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \
# The default is ".hidden".
# cpu_type The name of the cpu, if different from the first
# chunk of the canonical host name.
+# enable_execute_stack The name of a source file implementing
+# __enable_execute_stack.
# extra_parts List of extra object files that should be compiled
# for this target machine. This may be overridden
# by setting EXTRA_PARTS in a tmake_file fragment.
# "$cpu_type/t-$cpu_type".
asm_hidden_op=.hidden
+enable_execute_stack=
extra_parts=
tmake_file=
md_unwind_header=no-unwind.h
;;
esac
+case ${host} in
+*-*-darwin* | *-*-freebsd* | *-*-netbsd* | *-*-openbsd* | *-*-solaris2* | \
+ alpha*-dec-osf5.1*)
+ enable_execute_stack=enable-execute-stack-mprotect.c
+ ;;
+i[34567]86-*-mingw* | x86_64-*-mingw*)
+ enable_execute_stack=config/i386/enable-execute-stack-mingw32.c
+ ;;
+*)
+ enable_execute_stack=enable-execute-stack-empty.c;
+ ;;
+esac
+
case ${host} in
# Support site-specific machine types.
*local*)
--- /dev/null
+/* Implement __enable_execute_stack for Windows32.
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <windows.h>
+
+extern void __enable_execute_stack (void *);
+
+void
+__enable_execute_stack (void *addr)
+{
+ MEMORY_BASIC_INFORMATION b;
+
+ if (!VirtualQuery (addr, &b, sizeof(b)))
+ abort ();
+ VirtualProtect (b.BaseAddress, b.RegionSize, PAGE_EXECUTE_READWRITE,
+ &b.Protect);
+}
+ac_config_links="$ac_config_links enable-execute-stack.c:$enable_execute_stack"
+
ac_config_links="$ac_config_links md-unwind-support.h:config/$md_unwind_header"
for ac_config_target in $ac_config_targets
do
case $ac_config_target in
+ "enable-execute-stack.c") CONFIG_LINKS="$CONFIG_LINKS enable-execute-stack.c:$enable_execute_stack" ;;
"md-unwind-support.h") CONFIG_LINKS="$CONFIG_LINKS md-unwind-support.h:config/$md_unwind_header" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
AC_SUBST(cpu_type)
AC_SUBST(extra_parts)
AC_SUBST(asm_hidden_op)
+AC_CONFIG_LINKS([enable-execute-stack.c:$enable_execute_stack])
AC_CONFIG_LINKS([md-unwind-support.h:config/$md_unwind_header])
# We need multilib support.
--- /dev/null
+/* Dummy implementation of __enable_execute_stack. */
+
+/* Attempt to turn on execute permission for the stack. */
+void
+__enable_execute_stack (void *addr __attribute__((__unused__)))
+{
+}
--- /dev/null
+/* Implement __enable_execute_stack using mprotect(2).
+ Copyright (C) 2011 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License as published by the Free
+ Software Foundation; either version 3, or (at your option) any later
+ version.
+
+ GCC is distributed in the hope that it will be useful, but WITHOUT ANY
+ WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#include <sys/mman.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#define STACK_PROT_RWX (PROT_READ | PROT_WRITE | PROT_EXEC)
+
+static int need_enable_exec_stack;
+
+static void check_enabling (void) __attribute__ ((unused));
+extern void __enable_execute_stack (void *);
+
+#if defined __FreeBSD__
+#include <sys/sysctl.h>
+
+static void __attribute__ ((constructor))
+check_enabling (void)
+{
+ int prot = 0;
+ size_t len = sizeof (prot);
+
+ sysctlbyname ("kern.stackprot", &prot, &len, NULL, 0);
+ if (prot != STACK_PROT_RWX)
+ need_enable_exec_stack = 1;
+}
+#elif defined __sun__ && defined __svr4__
+static void __attribute__ ((constructor))
+check_enabling (void)
+{
+ int prot = (int) sysconf (_SC_STACK_PROT);
+
+ if (prot != STACK_PROT_RWX)
+ need_enable_exec_stack = 1;
+}
+#else
+/* There is no way to query the execute permission of the stack, so
+ we always issue the mprotect() call. */
+
+static int need_enable_exec_stack = 1;
+#endif
+
+#if defined __NetBSD__
+/* Note that we go out of our way to use namespace-non-invasive calls
+ here. Unfortunately, there is no libc-internal name for mprotect(). */
+
+#include <sys/sysctl.h>
+
+extern int __sysctl (int *, unsigned int, void *, size_t *, void *, size_t);
+
+static int
+getpagesize (void)
+{
+ static int size;
+
+ if (size == 0)
+ {
+ int mib[2];
+ size_t len;
+
+ mib[0] = CTL_HW;
+ mib[1] = HW_PAGESIZE;
+ len = sizeof (size);
+ (void) __sysctl (mib, 2, &size, &len, NULL, 0);
+ }
+ return size;
+}
+#endif /* __NetBSD__ */
+
+/* Attempt to turn on access permissions for the stack. Unfortunately it
+ is not possible to make this namespace-clean.*/
+
+void
+__enable_execute_stack (void *addr)
+{
+ if (!need_enable_exec_stack)
+ return;
+ else
+ {
+ static long size, mask;
+
+ if (size == 0) {
+ size = getpagesize ();
+ mask = ~(size - 1);
+ }
+
+ char *page = (char *) (((long) addr) & mask);
+ char *end = (char *)
+ ((((long) (addr + __LIBGCC_TRAMPOLINE_SIZE__)) & mask) + size);
+
+ if (mprotect (page, end - page, STACK_PROT_RWX) < 0)
+ /* Note that no errors should be emitted by this code; it is
+ considered dangerous for library calls to send messages to
+ stdout/stderr. */
+ abort ();
+ }
+}