那个绕道有什么意义?

逆向工程 艾达
2021-06-28 18:11:16

在我选择的二进制文件中,我经常看到类似的东西

sub_593690      proc near               ; DATA XREF: .rdata:01456994o
                sub     ecx, [ecx-4]
                sub     ecx, 48h
                jmp     loc_4AE180  ; to usual looking method
sub_593690      endp

这是什么意思,为什么编译器会生成这样的东西?

1个回答

这看起来很像所谓的“此调整存根”。这些是与多重继承相关的需要,以将指向具有非零偏移量的基数之一的指针转换为更派生类的 this 指针。

注意:尾调用优化看起来非常相似,但在 32 位模式下它远不如在 64 位模式下普遍存在。在任何情况下,一旦编译器完成优化,就可以编写一个看起来与您的代码完全相同的函数调用,因此在此调整和尾调用优化之间的决定不会被削减和枯竭。异常处理也可能导致看起来非常相似的小 funclet,特别是如果只有一个对象要销毁/展开。根据情况,我提到的所有事情都可能导致完全相同的目标代码。

最好的概述可能是igorsk关于VC++类布局的文章: