быстрый звонок на руку (Android NDK)

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 один сообщил МАР)?

2

Решение

IDA просто использует fastcall для любого соглашения о вызовах с участием регистров. В случае ARM fastcall в основном означает «соглашение о вызовах по умолчанию».

Добавление #define __fastcall к источнику должен позволить вам скомпилировать его. Однако есть дополнительная проблема для этой функции:

Обратите внимание, что QVariant::toULongLong() является методом C ++, поэтому первый аргумент, показанный декомпилятором, на самом деле является скрытым this указатель, который передается всем нестатическим методам классов C ++. Поскольку декомпилятор не поддерживает C ++, он преобразует его в явный аргумент. Возможно, вам придется отменить эту операцию, чтобы сделать ее действительным кодом C ++.

Или вы могли бы просто использовать фактический исходный код.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]