已编译的 getter 中的无用指令

逆向工程 艾达 部件 反编译 C
2021-07-01 20:14:34

这是我今天第二次看到这种功能:

.text:00000000000010B0 sub_10B0        proc near               ; CODE XREF: sub_1120:loc_1143↓p
.text:00000000000010B0                 lea     rdi, byte_4418
.text:00000000000010B7                 lea     rax, byte_4418
.text:00000000000010BE                 cmp     rax, rdi
.text:00000000000010C1                 jz      short locret_10D8
.text:00000000000010C3                 mov     rax, cs:_ITM_deregisterTMCloneTable_ptr
.text:00000000000010CA                 test    rax, rax
.text:00000000000010CD                 jz      short locret_10D8
.text:00000000000010CF                 jmp     rax
.text:00000000000010CF ; ------------------------------------------------------------------
.text:00000000000010D1                 align 8
.text:00000000000010D8
.text:00000000000010D8 locret_10D8:                            ; CODE XREF: sub_10B0+11↑j
.text:00000000000010D8                                         ; sub_10B0+1D↑j
.text:00000000000010D8                 retn
.text:00000000000010D8 sub_10B0        endp

据我了解,jz无论如何,两者都会跳转,所以第一个jz总是会跳转到ret.

为什么这个函数不写得更简单,就像一个单一的return &byte_4418

lea     rax, byte_4418
retn

我希望我的英语足够好,可以被理解。

谢谢,

最大限度

PS:对不起,我不知道用的是哪个编译器。

1个回答

我希望编译器在两条 LEA 指令中发出两个不同的符号引用,并使用比较指令在运行时检测这两个符号是否在链接时解析为相同的地址。许多现代编译器/链接器提供“链接时代码生成”又名“整个程序优化”,编译器的优化器在链接时运行。在这样的系统中,不需要运行时检查,但是编译器在链接时被(重新)调用并且可以优化(在这种情况下:消除/不生成死路径)以响应看到所有模块获得联系在一起。