gcc - 在 x86_64 上使用汇编 JMP 函数

标签 gcc assembly x86-64

我对编程真的很陌生(总的来说 - 这是可悲的),并且一些与 Python 相关的程序集突然出现在这个应用程序中,我正在破解它以在 64 位上运行。

本质上,代码是这样的:

#define FUNCTION(name)        \
  .globl _##name;             \
  _##name:                    \
    jmp *(_p_##name)

.text
  FUNCTION(name)

据我所知,FUNCTION(name) 语法大约被使用了 50 次来定义外部 Python 库的 header (我不会假装我完全理解它,我只是在修复错误)。

由于我正在针对 x86_64 进行编译,因此 GCC 对于每个 FUNCTION(name) 实例都会发出以下错误:

32-bit absolute addressing is not supported for x86-64

cannot do signed 4 byte relocation

我该如何“修复”它以在 x86_64 上运行?

最佳答案

获取 Intel Architecture Software Developer's Manuals 的副本。正如您所看到的,某些形式的 jmp 指令在 64 位模式下无效。特别是,两种“跳转远,绝对,操作数中给出的地址”形式将不起作用。您将需要更改为指令的相对寻址或绝对间接寻址形式。我的手册中的第 2A 卷第 3-549 页包含大量有关 jmp 的信息。

关于gcc - 在 x86_64 上使用汇编 JMP 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2267785/

相关文章:

c++ - gcc - 如何自动检测每个基本 block

c++ - 为什么Windows gcc(cygwin)不写ELF头?

assembly - 防止 GCC 使用动态跳转/函数调用

c++ - 如何在 NASM 中返回浮点值?

linux - LIDT的操作数是位移/绝对地址

linux - 如何对 64 位汇编中的列求和?

c - fork() 的执行顺序?

c - 为什么 fflush(stdin) 在 while 循环中执行两次以检查 scanf() 输入?

c - 为什么 setjmp 传统上保存寄存器?

assembly - 从寄存器中减去变量?错误 A2022 : instruction operands must be the same size