我发现当我们使用嵌套函数 http://en.wikipedia.org/wiki/Nested_function, GCC 需要一个可执行堆栈蹦床代码 http://gcc.gnu.org/onlinedocs/gccint/Trampolines.html。但是,使用 gcc 编译时,以下代码不会显示可执行堆栈。 (我用了执行堆栈 http://linux.die.net/man/8/execstack验证堆栈是否可执行)
#include <stdio.h>
#include <unistd.h>
int main()
{
int add( int a, int b)
{
return a + b;
}
return add(2, 3);
}
为什么这不会产生可执行堆栈?如果不应该,那么有人可以给出代码构造的示例吗does给出一个可执行堆栈?
如果嵌套函数根本不依赖于其“父”堆栈,那么它只是一个普通函数 - 嵌套是语法(和范围)糖。
如果您不获取嵌套函数的地址,则也不需要蹦床代码。所以你需要更多的东西来触发这一切。
这是一个虚拟示例:
// 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);
}
$ 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)