C++ Linux中使用Intel Quark的共享库中的非法指令

C++ Linux中使用Intel Quark的共享库中的非法指令,c++,c,linux,assembly,intel,C++,C,Linux,Assembly,Intel,我有一个linux“.a”库,它是为x86编译的。我没有这个库的源代码,程序员也不会给我。我用这种体系结构在PC上运行我的程序没有问题,但是最近我买了一个带有Intel Quark处理器的嵌入式系统。这个处理器有一个精简的指令集,所以当我编译我的程序并试图运行它时,我得到了一个明确的信息:“非法指令” 我知道这不是内存冲突问题,因为当我使用GDB调试它时,它在带有操作码(如CMOVE)的指令中完全失败,CMOVxx指令集属于奔腾Pro处理器中引入的CMOVxx指令集。在我的嵌入式linux系统(

我有一个linux“.a”库,它是为x86编译的。我没有这个库的源代码,程序员也不会给我。我用这种体系结构在PC上运行我的程序没有问题,但是最近我买了一个带有Intel Quark处理器的嵌入式系统。这个处理器有一个精简的指令集,所以当我编译我的程序并试图运行它时,我得到了一个明确的信息:“非法指令”

我知道这不是内存冲突问题,因为当我使用GDB调试它时,它在带有操作码(如CMOVE)的指令中完全失败,CMOVxx指令集属于奔腾Pro处理器中引入的CMOVxx指令集。在我的嵌入式linux系统(Ubuntu14.04)/proc/cpuinfo“flags”字段中没有显示“cmov”,因此这一点得到了确认

那么,我如何克服这个问题呢

是否存在将此操作码转换为另一个quark友好指令的包装器?我知道如何在Windows中使用OllyDbg(它允许ASM修补和保存可执行文件)实现这一点,但据我所知,在Linux中没有类似的解决方案

欢迎提出任何建议

  • 您可以尝试在内核中模拟CMOV

  • 只能在程序中安装
    SIGILL
    信号处理程序


  • 您是否已经环顾四周,是否提供了任何有用的q/a?我个人可能会反汇编、更改指令并重新组装..难道你不能要求库的供应商为旧CPU重新编译库吗?@Plasmah:这是一个好方法,你有没有想过一个反汇编程序也能为Linux ELF生成可编译代码?我的意思是在ASM中,而不是C左右。@PaulR:这是不可能的,供应商似乎已经从地球上消失了。这是一个很大的帮助,第二个选项似乎适合我。您对管理此信号有什么额外的建议吗?基本上,您需要从上下文中获取EIP,读取指令,检查它是否为CMOV,并更改寄存器值以模拟其效果。请参阅内核补丁中标记为
    /*CMOV**/
    的代码。