【问题标题】:GCC hotpatching?GCC 热补丁?
【发布时间】:2010-11-08 03:35:19
【问题描述】:

当我编译这段代码时

unsigned char A[] = {1, 2, 3, 4};

unsigned int
f (unsigned int x)
{
  return A[x];
}

gcc 输出

mov edi, edi
movzx  eax, BYTE PTR A[rdi]
ret

在 x86_64 机器上。

问题是:为什么有一个nop指令(mov edi,edi)呢?

我正在使用 gcc-4.4.4。

【问题讨论】:

  • 自然只是为了混淆代码!

标签: c gcc assembly


【解决方案1】:

在 64 位模式下,mov edi, edi 不是空操作。它的作用是将rdi的前32位设置为0。

这是所有 32 位操作在 64 位模式下清除目标寄存器的前 32 位这一一般事实的特殊情况。 (与保持它们不变相比,这允许更高效的 CPU,并且可能也更有用。)

【讨论】:

  • 哦..你能引用任何来源吗?
  • 好的。我认为你是对的。这只是清除 rdi 顶部的一种奇特方式。重新阅读问题后,我明白 OP 不是在问“为什么这个可热补丁函数以 mov edi, edi 开头”,而是像“为什么这个 x86-64 汇编代码看起来像一个可热补丁函数”之类的问题。此外,代码甚至没有指定ms_hook_prologue attriubte,最新版本的 gcc 不支持 x86-64 的 ms_hook_prologue,似乎在 x86-64 上它将使用leaq [%rsp + 0], %rsp 序言而不是mov edi, editinyurl.com/39fye3w)。我将删除我的答案
  • 我明白了,谢谢。但是如果 ABI 在寄存器中指定的 32 位参数应该已经清除了高位,那不是更有用吗?
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-21
相关资源
最近更新 更多