endbr64指令实际上是做什么的?

时间:2019-07-05 15:28:00

标签: assembly x86-64 intel

我一直试图理解GCC生成的汇编语言代码,并经常在包括_start()在内的许多函数启动时遇到此指令,但找不到任何说明其用途的指南

31-0000000000001040 <_start>:
32:    1040:    f3 0f 1e fa             endbr64 
33-    1044:    31 ed                   xor    ebp,ebp

1 个答案:

答案 0 :(得分:4)

它代表“ 64位结束分支”-更准确地说,是终止64位间接分支

Intel has a document about this instruction

以下是操作:

IF EndbranchEnabled(CPL) & EFER.LMA = 1 & CS.L = 1
  IF CPL = 3
  THEN
    IA32_U_CET.TRACKER = IDLE
    IA32_U_CET.SUPPRESS = 0
  ELSE
    IA32_S_CET.TRACKER = IDLE
    IA32_S_CET.SUPPRESS = 0
  FI
FI;

否则该指令将被视为NOP

CET功能用于确保您的间接分支实际到达有效位置。这样可以增加安全性。这是英特尔关于它的一段:

  

ENDBRANCH(有关详细信息,请参见第73节)是一条新指令,用于标记程序中间接调用和跳转的有效跳转目标地址。该指令操作码被选择为旧机器上的NOP,以便使用ENDBRANCH新指令编译的程序继续运行   没有执行CET的旧计算机上。在支持CET的处理器上,ENDBRANCH仍然是NOP,并且主要由处理器管道用作标记指令以检测违反控制流的行为。 CPU实现了一个状态机,该状态机跟踪间接的jmp和调用指令。当其中之一   看到指令,状态机从IDLE移到WAIT_FOR_ENDBRANCH状态。在WAIT_FOR_ENDBRANCH状态下,程序流中的下一条指令必须为ENDBRANCH。如果未看到ENDBRANCH,则处理器会导致控制保护异常(#CP),否则状态机将返回IDLE状态。