【发布时间】:2013-12-12 22:18:04
【问题描述】:
为了模拟应用程序的完全重启(GNU C 版本 4.1.2 (arm-linux-gnueabi)),包括静态变量初始化,我尝试根据请求将 jmp/longjmp 设置为 gcc pre_init 挂钩函数。 longjmp 实际上到达了.preinit_array 函数,但是在退出时它会与 SIGSEGV 一起崩溃。
知道为什么这会出错吗?这通常应该可行吗?是否有其他方法可以在 gdbserver 的控制下将 Linux 应用程序回滚到其初始状态?
添加来源:
static jmp_buf reset_simulation_jumpbuf __attribute__ ((section (".noinit")));
int preinit(int argc, char **argv, char **envp)
{
// at this point no static variables shall be initialized
setjmp(reset_simulation_jumpbuf);
}
// gcc standard linker scripts are calling this function before initialization
__attribute__((section(".preinit_array"))) typeof(preinit) *__preinit = preinit;
int main(void)
{
// at this point all static variables are initialized
do_something();
if (reset)
longjmp(reset_simulation_jumpbuf,1);
}
【问题讨论】:
-
我宁愿建议你
exec这个程序。可以这么说,这与从“从头开始”重新启动程序相同。发生故障的可能性较小,并且它仍然是相同的过程,因此希望可以与 gdbserver 一起正常工作。 -
你怎么把
setjmp放在那里? -
我添加了一个代码 sn-p 来展示我的方法。
标签: c linux gcc embedded setjmp