在SIGILL处理程序中,如何跳过违规指令?

我要去JIT代码生成,我想插入无效的操作码到stream中,以执行一些元debugging。 一切都很好,直到它触及指令,在这一点上,事情进入一个无限循环的非法指令信号处理程序,并返回。

有什么办法可以让事情简单地跳过错误的指令?

Solutions Collecting From Web of "在SIGILL处理程序中,如何跳过违规指令?"

这是非常hacky和不容忍,但是:

void sighandler (int signo, siginfo_t si, void *data) { ucontext_t *uc = (ucontext_t *)data; int instruction_length = /* the length of the "instruction" to skip */ uc->uc_mcontext.gregs[REG_RIP] += instruction_length; } 

像这样安装sighandler

 struct sigaction sa, osa; sa.sa_flags = SA_ONSTACK | SA_RESTART | SA_SIGINFO; sa.sa_sigaction = sighandler; sigaction(SIGILL, &sa, &osa); 

可以工作,如果你知道要跳过多远(这是一个英特尔proc):-)