【发布时间】:2011-04-14 21:43:32
【问题描述】:
以下代码无法按预期工作,但希望能说明我的尝试:
long foo (int a, int b) {
return a + b;
}
void call_foo_from_stack (void) {
/* reserve space on the stack to store foo's code */
char code[sizeof(*foo)];
/* have a pointer to the beginning of the code */
long (*fooptr)(int, int) = (long (*)(int, int)) code;
/* copy foo's code to the stack */
memcpy(code, foo, sizeof(*foo));
/* execute foo from the stack */
fooptr(3, 5);
}
显然,sizeof(*foo) 不会返回 foo() 函数的代码大小。
我知道在某些 CPU 上执行堆栈受到限制(或者至少在设置了限制标志的情况下)。除了 GCC 的嵌套函数最终可以存储在堆栈中之外,在标准 C 中是否有办法做到这一点?
【问题讨论】:
-
这通常是邪恶的。
-
+1:这是一个可怕的想法,但却是一个有趣的问题。
-
@Steven Sudit:这确实是邪恶的,不便携,但我很好奇它是否可能。
-
有可能,但很邪恶。在很多平台上都会失败,这是一件非常好的事情。
-
@R.. c编译器和链接器一般都是c程序,所以可以很清楚的从标准c生成机器码。应该生成什么机器代码以及将其加载到内存中并使其运行取决于平台(并且在某些机器上根本不可能,例如哈佛架构),并且将其“放在堆栈上”是一个更复杂的问题(并且可能是不必要的一个)。
标签: c stack executable