As discussed in this thread:

<URL:http://gcc.gnu.org/ml/gcc-help/2005-12/msg00173.html>

Many GNU/Linux distributions (such as Debian, Ubuntu and RedHat) are planning
to prohibit executable stacks completely, regardless of the presence of the
executable stack flag. At the moment, GCC produces trampoline code for nested
functions on the stack, so the use of nested functions will disable programs,
thus nested functions won't be usable in reality.

Here is an example of producing trampoline code on the stack:

gcc -O1 -save-temps -c nested_test.c

# 1 "nested_test.c"
# 1 "<built-in>"
# 1 "<command line>"
# 1 "nested_test.c"
void f0(void (*f)());

long f1 (void)
{
        long i = 0;
        void f2(void)
        {
                i++;
        }
        f0(f2);
        return i;
}

void f0(void (*f)())
{
        (*f)();
}

int main()
{
        return f1();
}

As Ian suggested in <URL:http://gcc.gnu.org/ml/gcc-help/2005-12/msg00177>,
it would work on POSIX systems to put trampoline code on read-write pages
allocated by mmap then switch to read-exec by mprotect before jumping
to the trampoline code.


-- 
           Summary: the trampoline code of nested functions depends on
                    executable stacks
           Product: gcc
           Version: 4.0.1
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: okuji at enbug dot org
 GCC build triplet: i586-mandriva-linux-gnu
  GCC host triplet: i586-mandriva-linux-gnu
GCC target triplet: i586-mandriva-linux-gnu


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

Reply via email to