为了模拟应用程序的完全重启(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);
}