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
好吗?