我有一个适用于 x86_64 的 multiboot2 兼容 ELF 文件,其中开始符号在start.asm
NASM 程序集文件中定义。multiboot2 标头包含relocatable
标记。
因为 GRUB 不支持 multiboot2 + 可重定位的 ELF(至少在 2021 年 7 月 [ 3 ]),所以我想自己解决一些重定位问题以解决此问题并仅加载静态 ELF。
为此,我需要在运行时在我的第一个条目符号(在 ELF 标头中指定)中获取偏移量,以便手动解决重定位问题。偏移量是指 GRUB 在内存中定位二进制文件的位置与 ELF 文件中符号的静态地址之间的差异。
在我的输入符号中,我处于 64 位长模式。无法直接rip
以 NASM 语法访问,因此我需要某种解决方法。
[ 1 ] [ 2 ] 之类的解决方案不起作用,因为rip
关键字/寄存器在 NASM 中不可用。因此我不能使用
lea rax,[rip+0x1020304]
; rax contains offset
sub rax,0x1020304
我该如何解决这个问题?