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
)?
fastcall
对于 ARM 来说没有意义,因为前几个函数参数已经通过寄存器传递了。您在使用此库时是否遇到了实际问题?否则,这可能只是 IDA 的问题,以及它如何向用户呈现信息的情况。 - Michael__fastcall
但没有属性记录?你尝试过自己声明它(和其他被反汇编为__fastcall
的函数)而不使用属性吗? - Arne Mertzvoid t1()
,报告为int __fastcall t1(int a1, int a2, int a3);
,并且参数数量不正确! - 18446744073709551615__fastcall
。但是,在您的'C'中不需要此注释。编译器会默认执行。IDA将有问题确定函数是否需要参数。它必须分析所有调用者以查看是什么mov r{0-3},rN
,以知道使用了多少寄存器,特别是在叶子函数中。 - artless noise