[Bug target/24959] Trampolines fail on i686-apple-darwin

gcc at microbizz dot nl gcc-bugzilla@gcc.gnu.org
Mon Nov 21 19:28:00 GMT 2005



------- Comment #2 from gcc at microbizz dot nl  2005-11-21 19:28 -------
Subject:  Trampolines fail on i686-apple-darwin

On closer inspection, the problem is that the stack is non-executable. 
Adding the following code (borrowed from gcc/config/netbsd.h) to 
darwin.h fixes the problem

Adriaan  van Os


/* Attempt to turn on execute permission for the stack.  This may be
    used by INITIALIZE_TRAMPOLINE of the target needs it (that is,
    if the target machine can change execute permissions on a page).

    There is no way to query the execute permission of the stack, so
    we always issue the mprotect() call.

    Note that we go out of our way to use namespace-non-invasive calls
    here.  Unfortunately, there is no libc-internal name for mprotect().

    Also note that no errors should be emitted by this code; it is 
considered
    dangerous for library calls to send messages to stdout/stderr.  */

#define 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);                               \
}


-- 


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24959



More information about the Gcc-bugs mailing list