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

时间:2012-02-16 16:11:23

标签: linux code-generation signals jit

我要进行JIT代码生成,并且我想在流中插入无效的操作码以执行一些元调试。一切都很好,直到它达到指令,此时东西进入无限循环的非法指令信号处理程序和返回。

有什么方法可以设置简单地跳过坏指令的东西?

2 个答案:

答案 0 :(得分:10)

这非常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);

如果你知道跳过多远(可以工作)(并且它是Intel proc): - )

答案 1 :(得分:0)

您还可以尝试其他方法(如果适用于您的情况): 您可以使用易于管理的SIGTRAP。

void sigtrap_handler(int sig){
    printf("Process %d received sigtrap %d.\n", getpid(),sig);
}

signal(SIGTRAP,sigtrap_handler);
asm("int3"); // causes a SIGTRAP