fastcall on arm (Android NDK)

fastcall on arm (Android NDK)

本文关键字:NDK Android on arm fastcall      更新时间:2023-10-16

IDA(hex-rays.com的交互式反汇编程序)将本机C++函数(Android NDK,arm)报告为__fastcall,例如:

// int __fastcall QVariant::toULongLong(_DWORD, _DWORD); weak

顺便说一下,这个函数在文档中被声明为

qulonglong QVariant::toULongLong ( bool * ok = 0 ) const

当我用__attribute__((fastcall))定义本机函数时,我得到

warning: 'fastcall' attribute directive ignored [-Wattributes]

问题:我需要调用一个库函数,我可以(希望)猜测它的原型。如何声明函数,以便使用正确的调用约定(即IDA报告的__fastcall约定)来调用它们?

IDA仅将fastcall用于任何涉及寄存器的调用约定。在ARM的情况下,fastcall基本上意味着"默认调用约定"。

#define __fastcall添加到源代码中应该可以编译它。然而,这个函数还有一个额外的问题:

请注意,QVariant::toULongLong()是一个C++方法,因此反编译器显示的第一个参数实际上是传递给C++类的所有非静态方法的隐藏的this指针。由于反编译器不支持C++,它将其转换为显式参数。您可能需要撤消此操作以使其成为有效的C++代码。

或者您可以只使用实际的源代码。