netbsd.h (ENABLE_EXECUTE_STACK): Remove.

2011-05-29  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
	    Joseph Myers  <joseph@codesourcery.com>

	gcc:
	* 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.

	gcc/c-family:
	* c.opt (fbuilding-libgcc): New option.
	* c-cppbuiltin.c (c_cpp_builtins): Define
	__LIBGCC_TRAMPOLINE_SIZE__ if flag_building_libgcc.

	libgcc:
	* 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.

Co-Authored-By: Joseph Myers <joseph@codesourcery.com>

From-SVN: r174843
This commit is contained in:
Rainer Orth 2011-06-09 12:30:46 +00:00 committed by Rainer Orth
parent 9ef0b98eb6
commit 10e48e3927
31 changed files with 272 additions and 266 deletions

View File

@ -1,3 +1,39 @@
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> 2011-06-09 Jakub Jelinek <jakub@redhat.com>
PR middle-end/49308 PR middle-end/49308

View File

@ -661,7 +661,7 @@ LIBGCC2_DEBUG_CFLAGS = -g
LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) \ LIBGCC2_CFLAGS = -O2 $(LIBGCC2_INCLUDES) $(GCC_CFLAGS) $(TARGET_LIBGCC2_CFLAGS) \
$(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) \ $(LIBGCC2_DEBUG_CFLAGS) $(GTHREAD_FLAGS) \
-DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \ -DIN_LIBGCC2 -D__GCC_FLOAT_NOT_NEEDED \
-fno-stack-protector \ -fbuilding-libgcc -fno-stack-protector \
$(INHIBIT_LIBC_CFLAGS) $(INHIBIT_LIBC_CFLAGS)
# Additional options to use when compiling libgcc2.a. # Additional options to use when compiling libgcc2.a.

View File

@ -1,3 +1,10 @@
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> 2011-06-07 Jason Merrill <jason@redhat.com>
* c-common.c (max_tinst_depth): Lower default to 900. * c-common.c (max_tinst_depth): Lower default to 900.

View File

@ -1,5 +1,5 @@
/* Define builtin-in macros for the C family front ends. /* 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. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
@ -727,6 +727,12 @@ c_cpp_builtins (cpp_reader *pfile)
builtin_define_fixed_point_constants ("UTA", "", uta_type_node); 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. */ /* For use in assembly language. */
builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0); builtin_define_with_value ("__REGISTER_PREFIX__", REGISTER_PREFIX, 0);
builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0); builtin_define_with_value ("__USER_LABEL_PREFIX__", user_label_prefix, 0);

View File

@ -700,6 +700,10 @@ fasm
C ObjC C++ ObjC++ Var(flag_no_asm, 0) C ObjC C++ ObjC++ Var(flag_no_asm, 0)
Recognize the \"asm\" keyword Recognize the \"asm\" keyword
; Define extra predefined macros for use in libgcc.
fbuilding-libgcc
C ObjC C++ ObjC++ Undocumented Var(flag_building_libgcc)
fbuiltin fbuiltin
C ObjC C++ ObjC++ Var(flag_no_builtin, 0) C ObjC C++ ObjC++ Var(flag_no_builtin, 0)
Recognize built-in functions Recognize built-in functions

View File

@ -5395,7 +5395,7 @@ alpha_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
if (TARGET_ABI_OSF) if (TARGET_ABI_OSF)
{ {
emit_insn (gen_imb ()); emit_insn (gen_imb ());
#ifdef ENABLE_EXECUTE_STACK #ifdef HAVE_ENABLE_EXECUTE_STACK
emit_library_call (init_one_libfunc ("__enable_execute_stack"), emit_library_call (init_one_libfunc ("__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode); LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif #endif

View File

@ -73,7 +73,4 @@ along with GCC; see the file COPYING3. If not see
"%{Ofast|ffast-math|funsafe-math-optimizations:crtfm%O%s} \ "%{Ofast|ffast-math|funsafe-math-optimizations:crtfm%O%s} \
%(netbsd_endfile_spec)" %(netbsd_endfile_spec)"
#define HAVE_ENABLE_EXECUTE_STACK
/* Attempt to enable execute permissions on the stack. */
#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK

View File

@ -165,22 +165,7 @@ along with GCC; see the file COPYING3. If not see
#define HAVE_STAMP_H 1 #define HAVE_STAMP_H 1
#endif #endif
/* Attempt to turn on access permissions for the stack. */ #define HAVE_ENABLE_EXECUTE_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"); \
}
/* Digital UNIX V4.0E (1091)/usr/include/sys/types.h 4.3.49.9 1997/08/14 */ /* Digital UNIX V4.0E (1091)/usr/include/sys/types.h 4.3.49.9 1997/08/14 */
#define SIZE_TYPE "long unsigned int" #define SIZE_TYPE "long unsigned int"

View File

@ -919,43 +919,7 @@ void add_framework_path (char *);
#define TARGET_ASM_OUTPUT_ANCHOR NULL #define TARGET_ASM_OUTPUT_ANCHOR NULL
#define DARWIN_SECTION_ANCHORS 0 #define DARWIN_SECTION_ANCHORS 0
/* Attempt to turn on execute permission for the stack. This may be #define HAVE_ENABLE_EXECUTE_STACK
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); \
}
/* For Apple KEXTs, we make the constructors return this to match gcc /* For Apple KEXTs, we make the constructors return this to match gcc
2.95. */ 2.95. */

View File

@ -23387,7 +23387,7 @@ ix86_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value)
gcc_assert (offset <= TRAMPOLINE_SIZE); gcc_assert (offset <= TRAMPOLINE_SIZE);
} }
#ifdef ENABLE_EXECUTE_STACK #ifdef HAVE_ENABLE_EXECUTE_STACK
#ifdef CHECK_EXECUTE_STACK_ENABLED #ifdef CHECK_EXECUTE_STACK_ENABLED
if (CHECK_EXECUTE_STACK_ENABLED) if (CHECK_EXECUTE_STACK_ENABLED)
#endif #endif

View File

@ -219,28 +219,10 @@ do { \
/* Let defaults.h definition of TARGET_USE_JCR_SECTION apply. */ /* Let defaults.h definition of TARGET_USE_JCR_SECTION apply. */
#undef TARGET_USE_JCR_SECTION #undef TARGET_USE_JCR_SECTION
#undef MINGW_ENABLE_EXECUTE_STACK #define HAVE_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
#undef CHECK_EXECUTE_STACK_ENABLED #undef CHECK_EXECUTE_STACK_ENABLED
#define CHECK_EXECUTE_STACK_ENABLED flag_setstackexecutable #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-cygming. */
/* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygwin. */ /* This matches SHLIB_SONAME and SHLIB_SOVERSION in t-cygwin. */
#if DWARF2_UNWIND_INFO #if DWARF2_UNWIND_INFO

View File

@ -118,5 +118,4 @@ along with GCC; see the file COPYING3. If not see
we don't care about compatibility with older gcc versions. */ we don't care about compatibility with older gcc versions. */
#define DEFAULT_PCC_STRUCT_RETURN 1 #define DEFAULT_PCC_STRUCT_RETURN 1
/* Attempt to enable execute permissions on the stack. */ #define HAVE_ENABLE_EXECUTE_STACK
#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK

View File

@ -66,5 +66,4 @@ along with GCC; see the file COPYING3. If not see
fprintf (FILE, "\tcall __mcount\n"); \ fprintf (FILE, "\tcall __mcount\n"); \
} }
/* Attempt to enable execute permissions on the stack. */ #define HAVE_ENABLE_EXECUTE_STACK
#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK

View File

@ -1,6 +1,6 @@
/* Base configuration file for all NetBSD targets. /* Base configuration file for all NetBSD targets.
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 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. This file is part of GCC.
@ -173,50 +173,3 @@ along with GCC; see the file COPYING3. If not see
#undef WINT_TYPE #undef WINT_TYPE
#define WINT_TYPE "int" #define WINT_TYPE "int"
/* 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); \
}

View File

@ -281,20 +281,4 @@ do { \
/* Storage layout. */ /* Storage layout. */
/* Stack is explicitly denied execution rights on OpenBSD platforms. */ #define HAVE_ENABLE_EXECUTE_STACK
#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>

View File

@ -207,52 +207,7 @@ along with GCC; see the file COPYING3. If not see
#define STDC_0_IN_SYSTEM_HEADERS 1 #define STDC_0_IN_SYSTEM_HEADERS 1
/* #define HAVE_ENABLE_EXECUTE_STACK
* 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"); \
} \
}
/* Support Solaris-specific format checking for cmn_err. */ /* Support Solaris-specific format checking for cmn_err. */
#define TARGET_N_FORMAT_TYPES 1 #define TARGET_N_FORMAT_TYPES 1

View File

@ -98,31 +98,7 @@ along with GCC; see the file COPYING3. If not see
#undef SPARC_DEFAULT_CMODEL #undef SPARC_DEFAULT_CMODEL
#define SPARC_DEFAULT_CMODEL CM_MEDLOW #define SPARC_DEFAULT_CMODEL CM_MEDLOW
#define ENABLE_EXECUTE_STACK \ #define HAVE_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"); \
} \
}
/************************[ Assembler stuff ]********************************/ /************************[ Assembler stuff ]********************************/

View File

@ -74,8 +74,7 @@ along with GCC; see the file COPYING3. If not see
#undef STDC_0_IN_SYSTEM_HEADERS #undef STDC_0_IN_SYSTEM_HEADERS
/* Attempt to enable execute permissions on the stack. */ #define HAVE_ENABLE_EXECUTE_STACK
#define ENABLE_EXECUTE_STACK NETBSD_ENABLE_EXECUTE_STACK
/* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler /* Below here exists the merged NetBSD/sparc & NetBSD/sparc64 compiler
description, allowing one to build 32-bit or 64-bit applications description, allowing one to build 32-bit or 64-bit applications

View File

@ -8004,7 +8004,7 @@ sparc32_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
/* Call __enable_execute_stack after writing onto the stack to make sure /* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */ 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"), emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode); LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif #endif
@ -8047,7 +8047,7 @@ sparc64_initialize_trampoline (rtx m_tramp, rtx fnaddr, rtx cxt)
/* Call __enable_execute_stack after writing onto the stack to make sure /* Call __enable_execute_stack after writing onto the stack to make sure
the stack address is accessible. */ 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"), emit_library_call (gen_rtx_SYMBOL_REF (Pmode, "__enable_execute_stack"),
LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode); LCT_NORMAL, VOIDmode, 1, XEXP (m_tramp, 0), Pmode);
#endif #endif

View File

@ -5189,19 +5189,6 @@ typically be a series of @code{asm} statements. Both @var{beg} and
@var{end} are both pointer expressions. @var{end} are both pointer expressions.
@end defmac @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, To use a standard subroutine, define the following macro. In addition,
you must make sure that the instructions in a trampoline fill an entire you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the cache line with identical instructions, or else ensure that the

View File

@ -5141,19 +5141,6 @@ typically be a series of @code{asm} statements. Both @var{beg} and
@var{end} are both pointer expressions. @var{end} are both pointer expressions.
@end defmac @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, To use a standard subroutine, define the following macro. In addition,
you must make sure that the instructions in a trampoline fill an entire you must make sure that the instructions in a trampoline fill an entire
cache line with identical instructions, or else ensure that the cache line with identical instructions, or else ensure that the

View File

@ -1,7 +1,7 @@
/* More subroutines needed by GCC output code on some machines. */ /* More subroutines needed by GCC output code on some machines. */
/* Compile this one with gcc. */ /* Compile this one with gcc. */
/* Copyright (C) 1989, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, /* 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. Free Software Foundation, Inc.
This file is part of GCC. This file is part of GCC.
@ -2027,19 +2027,6 @@ __clear_cache (char *beg __attribute__((__unused__)),
#endif /* L_clear_cache */ #endif /* L_clear_cache */
#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 */
#ifdef L_trampoline #ifdef L_trampoline
/* Jump to a trampoline, loading the static chain address. */ /* Jump to a trampoline, loading the static chain address. */

View File

@ -764,7 +764,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
/* Target macros only used for code built for the target, that have /* Target macros only used for code built for the target, that have
moved to libgcc-tm.h or have never been present elsewhere. */ moved to libgcc-tm.h or have never been present elsewhere. */
#pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX \ #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 /* 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 headers and were not used, and may be obsolete or may never have

View File

@ -1,3 +1,16 @@
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> 2011-06-09 David S. Miller <davem@davemloft.net>
Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>

View File

@ -313,9 +313,11 @@ ifneq ($(GCC_EXTRA_PARTS),)
endif endif
endif endif
LIB2ADD += enable-execute-stack.c
# Library members defined in libgcc2.c. # Library members defined in libgcc2.c.
lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \ 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 \ _absvdi2 _addvsi3 _addvdi3 _subvsi3 _subvdi3 _mulvsi3 _mulvdi3 \
_negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \ _negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \
_ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \ _ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \

View File

@ -44,6 +44,8 @@
# The default is ".hidden". # The default is ".hidden".
# cpu_type The name of the cpu, if different from the first # cpu_type The name of the cpu, if different from the first
# chunk of the canonical host name. # 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 # extra_parts List of extra object files that should be compiled
# for this target machine. This may be overridden # for this target machine. This may be overridden
# by setting EXTRA_PARTS in a tmake_file fragment. # by setting EXTRA_PARTS in a tmake_file fragment.
@ -57,6 +59,7 @@
# "$cpu_type/t-$cpu_type". # "$cpu_type/t-$cpu_type".
asm_hidden_op=.hidden asm_hidden_op=.hidden
enable_execute_stack=
extra_parts= extra_parts=
tmake_file= tmake_file=
md_unwind_header=no-unwind.h md_unwind_header=no-unwind.h
@ -202,6 +205,19 @@ case ${host} in
;; ;;
esac 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 case ${host} in
# Support site-specific machine types. # Support site-specific machine types.
*local*) *local*)

View File

@ -0,0 +1,38 @@
/* 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);
}

3
libgcc/configure vendored
View File

@ -3962,6 +3962,8 @@ tmake_file="${tmake_file_}"
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" ac_config_links="$ac_config_links md-unwind-support.h:config/$md_unwind_header"
@ -4689,6 +4691,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
for ac_config_target in $ac_config_targets for ac_config_target in $ac_config_targets
do do
case $ac_config_target in 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" ;; "md-unwind-support.h") CONFIG_LINKS="$CONFIG_LINKS md-unwind-support.h:config/$md_unwind_header" ;;
"Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;;
"default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;; "default") CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;

View File

@ -278,6 +278,7 @@ AC_SUBST(tmake_file)
AC_SUBST(cpu_type) AC_SUBST(cpu_type)
AC_SUBST(extra_parts) AC_SUBST(extra_parts)
AC_SUBST(asm_hidden_op) 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]) AC_CONFIG_LINKS([md-unwind-support.h:config/$md_unwind_header])
# We need multilib support. # We need multilib support.

View File

@ -0,0 +1,7 @@
/* Dummy implementation of __enable_execute_stack. */
/* Attempt to turn on execute permission for the stack. */
void
__enable_execute_stack (void *addr __attribute__((__unused__)))
{
}

View File

@ -0,0 +1,119 @@
/* 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 ();
}
}