如何使gcc为-fpatchable-function-entry发出多字节NOP?

时间:2018-08-16 15:51:38

标签: gcc assembly x86 x86-64

gcc确实可以使用多字节 NOP来对齐循环和函数。但是,当我尝试-fpatchable-function-entry option时,它总是发出单字节 NOPs

您可以在this example中看到gcc使函数与nop DWORD PTR [rax+rax*1+0x0]nop WORD PTR cs:[rax+rax*1+0x0]对齐,但是当我指定-fpatchable-function-entry=8,3时在函数入口使用了八个0x90 NOPs

我在文档中看到了

  

-fpatchable-function-entry=N[,M]

     
      
  • 在每个函数的开头立即生成N个NOP,函数入口点位于第M个NOP之前。如果省略M,则默认为0,因此函数入口指向第一个NOP处的地址。 NOP指令保留了额外的空间,只要代码段可写,就可以在运行时修补任何所需的仪器。空间的数量可以通过NOP的数量间接控制;使用的NOP指令对应于内部GCC后端接口gen_nop发出的指令。此行为是特定于目标的,并且可能还取决于体系结构变体和/或其他编译选项。
  •   

显然,将插入N个NOP。但是,我认为这应该是 N字节的NOP (或填充N字节空间的任何最佳NOP数)。同样,如果指定了M,则需要发出 M字节(N-M)字节NOP

那么为什么gcc会这样做?我们可以使其生成多字节NOP吗?并且两个0x90 NOP比微软的mov edi, edi好吗?

0 个答案:

没有答案