Linux中可执行堆栈的示例(i386架构)

gja*_*ain 7 c linux x86 gcc elf

我发现当我们使用嵌套函数时,GCC需要一个用于trampoline代码的可执行堆栈.但是,下面的代码,使用gcc编译时不会显示可执行堆栈.(我使用execstack来验证堆栈是否可执行)

#include <stdio.h>
#include <unistd.h>

int main()
{
        int add( int a, int b)
        {
                return a + b;
        }
        return add(2, 3);
}
Run Code Online (Sandbox Code Playgroud)

为什么这不会导致可执行堆栈?如果它不应该,那么有人可以给出一个代码构造的例子,它确实给出了一个可执行的堆栈吗?

Mat*_*Mat 5

如果嵌套函数根本不依赖于它的"父"堆栈,那么它只是一个普通函数 - 嵌套是语法(和作用域)糖.

如果你不采用嵌套函数的地址,也不需要trampoline代码.所以你需要更多的东西来触发所有这些.

这是一个虚拟的例子:

// file t.c
int doit(int (*fun)(int), int x)
{
    return fun(x);
}

int foo(int a)
{
        int add(int b)
        {
                return a + b;
        }
        return doit(&add, 2);
}

int main(void)
{
    return foo(1);
}
Run Code Online (Sandbox Code Playgroud)
$ gcc -Wtrampolines t.c
t.c: In function 'foo':
t.c:8:13: warning: trampoline generated for nested function 'add'
$ ./a.out 
$ echo $?
3
$ execstack a.out 
X a.out
Run Code Online (Sandbox Code Playgroud)