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:
parent
9ef0b98eb6
commit
10e48e3927
@ -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
|
||||||
|
@ -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.
|
||||||
|
@ -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.
|
||||||
|
@ -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);
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
|
||||||
|
@ -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"
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
|
||||||
|
@ -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
|
|
||||||
|
@ -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); \
|
|
||||||
}
|
|
||||||
|
@ -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>
|
|
||||||
|
@ -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
|
||||||
|
@ -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 ]********************************/
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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. */
|
||||||
|
@ -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
|
||||||
|
@ -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>
|
||||||
|
|
||||||
|
@ -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 \
|
||||||
|
@ -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*)
|
||||||
|
38
libgcc/config/i386/enable-execute-stack-mingw32.c
Normal file
38
libgcc/config/i386/enable-execute-stack-mingw32.c
Normal 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
3
libgcc/configure
vendored
@ -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" ;;
|
||||||
|
@ -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.
|
||||||
|
7
libgcc/enable-execute-stack-empty.c
Normal file
7
libgcc/enable-execute-stack-empty.c
Normal 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__)))
|
||||||
|
{
|
||||||
|
}
|
119
libgcc/enable-execute-stack-mprotect.c
Normal file
119
libgcc/enable-execute-stack-mprotect.c
Normal 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 ();
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user