Я не очень разбираюсь в ассемблере x86 и пытаюсь отладить проблему, связанную с ошибкой в mach_inject .
Исходный код выглядит следующим образом (функция mach_inject
в mach_inject.c):
#if defined(__x86_64__)
imageOffset = 0; // RIP-relative addressing
#else
ASSERT_CAST( void*, remoteCode );
imageOffset = ((void*) remoteCode) - image;
#endif
, а затем несколько позже (функция INJECT_ENTRY
mach_inject_bundle_stub.c):
pthread_create( &thread,
&attr,
(void* (*)(void*))((long)some_local_function + imageOffset),
(void*) param );
Кажется, для меня, когда я компилирую это для x86, это терпит неудачу. Если я изменю код так, чтобы у меня была imageOffset = 0;
только для каждой архитектуры (то есть также для x86), все это прекрасно работает.
Итак, несколько вопросов:
- RIP-относительная адресация также доступна для режима 32-бит / x86?
- Каково было (вероятно) первоначальное намерение для этого кода, если мы в любом случае имеем также RIP-относительную адресацию для 32-битного режима?
- Относится ли RIP-отношение к настройке компилятора? Или каким образом я могу контролировать, использует ли мой код RIP-относительную адресацию или нет? (Или больше относится к этой ошибке:
imageOffset = 0;
всегда правильно? Или когда это не так?)