在ARM架构上使用fastcall(Android NDK)

3

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)?


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

2

IDA只是在涉及寄存器的任何调用约定中使用fastcall。对于ARM而言,fastcall基本上意味着“默认调用约定”。

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

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

或者您可以直接使用实际源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接