我一直试图理解GCC生成的汇编语言代码,并经常在包括_start()在内的许多函数启动时遇到此指令,但找不到任何说明其用途的指南
31-0000000000001040 <_start>:
32: 1040: f3 0f 1e fa endbr64
33- 1044: 31 ed xor ebp,ebp
答案 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状态。