我正在尝试从机器代码中调用一个函数,该函数在编译和链接时应具有绝对地址。我正在创建一个指向所需函数的函数指针,并尝试将其传递给call指令,但我注意到call指令最多只能接受16或32位地址。是否有一种方法可以调用绝对的64位地址?
我正在部署x86-64架构,并使用NASM生成机器代码。
如果我可以确保可执行文件肯定映射到内存底部4GB,那么我可以使用32位地址,但我不确定在哪里可以找到这些信息。
编辑:我无法使用callf指令,因为这要求我禁用64位模式。
第二次编辑:我也不想将地址存储在寄存器中并调用寄存器,因为这对性能至关重要,我不能承受间接函数调用的开销和性能损失。
最后一次编辑:我通过确保我的机器代码映射到内存的前2GB来使用rel32 call指令。这是通过mmap和MAP_32BIT标志实现的(我正在使用linux):
我正在部署x86-64架构,并使用NASM生成机器代码。
如果我可以确保可执行文件肯定映射到内存底部4GB,那么我可以使用32位地址,但我不确定在哪里可以找到这些信息。
编辑:我无法使用callf指令,因为这要求我禁用64位模式。
第二次编辑:我也不想将地址存储在寄存器中并调用寄存器,因为这对性能至关重要,我不能承受间接函数调用的开销和性能损失。
最后一次编辑:我通过确保我的机器代码映射到内存的前2GB来使用rel32 call指令。这是通过mmap和MAP_32BIT标志实现的(我正在使用linux):