RIP-относительная адресация на x86 - PullRequest
0 голосов
/ 07 сентября 2011

Я не очень разбираюсь в ассемблере 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; всегда правильно? Или когда это не так?)
...