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]
Вопрос:
Мне нужно вызвать библиотечную функцию, чей прототип я могу (надеюсь) догадаться.
Как объявить функции, чтобы они вызывались с правильным соглашением о вызовах (а именно, __fastcall
один сообщил МАР)?
IDA
просто использует fastcall
для любого соглашения о вызовах с участием регистров. В случае ARM fastcall в основном означает «соглашение о вызовах по умолчанию».
Добавление #define __fastcall
к источнику должен позволить вам скомпилировать его. Однако есть дополнительная проблема для этой функции:
Обратите внимание, что QVariant::toULongLong()
является методом C ++, поэтому первый аргумент, показанный декомпилятором, на самом деле является скрытым this
указатель, который передается всем нестатическим методам классов C ++. Поскольку декомпилятор не поддерживает C ++, он преобразует его в явный аргумент. Возможно, вам придется отменить эту операцию, чтобы сделать ее действительным кодом C ++.
Или вы могли бы просто использовать фактический исходный код.
Других решений пока нет …