Memory management x86上的RIP相对寻址

Memory management x86上的RIP相对寻址,memory-management,assembly,x86,addressing,relative-addressing,Memory Management,Assembly,X86,Addressing,Relative Addressing,我对x86汇编程序并没有真正的经验,并尝试调试与之相关的问题 原始代码如下所示(mach_inject.c中的函数mach_inject): 然后稍晚(mach\u INJECT\u bundle\u stub.c的函数INJECT\u ENTRY): 对我来说,当我为x86编译这个时,它似乎失败了。如果我更改代码,使我的imageOffset=0在每种体系结构(即x86)上都可以正常工作 因此,有些问题: RIP相对寻址也可用于32位/x86模式 如果我们也有32位模式的RIP相对寻址,那么

我对x86汇编程序并没有真正的经验,并尝试调试与之相关的问题

原始代码如下所示(mach_inject.c中的函数
mach_inject
):

然后稍晚(mach\u INJECT\u bundle\u stub.c的函数
INJECT\u ENTRY
):

对我来说,当我为x86编译这个时,它似乎失败了。如果我更改代码,使我的
imageOffset=0
在每种体系结构(即x86)上都可以正常工作

因此,有些问题:

  • RIP相对寻址也可用于32位/x86模式
  • 如果我们也有32位模式的RIP相对寻址,那么(可能)这段代码的最初意图是什么
  • RIP相对寻址是编译器设置吗?或者,我可以通过什么方式控制我的代码是否使用RIP相对寻址?(或与此错误相关的更多信息:imageOffset=0;是否始终正确?或者何时不正确?)

对源代码的简要扫描似乎表明,
imageOffset
作为第一个参数传递给注入的代码,因此我不确定它与RIP相对寻址(在32位模式下不存在)有何关系。@user786653:我对它进行了一点扩展。也许我没有得到代码(您能添加一些文件:行号参考以便可以继续吗?),但用于确定入口点的不是
threadEntryOffset
而不是
imageOffset
?在我看来,imageOffset似乎只是用作
thread\u create\u running
@user786653的第一个参数。正确调用了
thread\u create\u running
调用的函数。在我的情况下,我这是mach_INJECT_bundle_stub.c的
INJECT_条目
。在该文件中,您可以看到一些地方,其中本地函数的地址由
imageOffset
修改(如发布的代码)。啊,现在我看到了。如果mach_INJECT_bundle_stub单独编译位置,我认为不需要
imageOffset
(虽然不是100%确定,但我不知道如何检查不同的内容是如何编译/链接的)。
#if defined(__x86_64__)
        imageOffset = 0; // RIP-relative addressing
#else
        ASSERT_CAST( void*, remoteCode );
        imageOffset = ((void*) remoteCode) - image;
#endif
pthread_create( &thread,
                &attr,
                (void* (*)(void*))((long)some_local_function + imageOffset),
                (void*) param );