【发布时间】:2020-10-27 12:44:50
【问题描述】:
关于arm64汇编语言的问题。
比如在linux 5.9.15的源码中,在arch/arm64/kernel/vmlinux.lds.S(链接器脚本)中有一行idmap_pg_dir = .;。所以 idmap_pg_dir 是一个地址。现在,在arch/arm64/kernel/head.S 中有一行adrp x0, idmap_pg_dir。这是否意味着
1) x0 = PC + idmap_pg_dir or
2) x0 = idmap_pg_dir ?
我认为当我们执行adrp x0, addr1 时,通常addr1 是PC 相对地址偏移量,x0 变为PC + addr。但链接描述文件似乎说idmap_pg_dir 只是一个绝对地址。 (不是吗?)所以我很困惑。请有人纠正我。
【问题讨论】:
-
它将成为 PC 相对地址,但链接器会计算偏移量,以便最终给出正确的结果,因此
x0 = idmap_pg_dir(假设它是页面对齐的)。如果你在head.o上执行objdump -dr,你应该会看到重定位类型。 -
你的意思是编译器/链接器生成与位置无关的代码(PIC),所以即使链接器脚本中的变量地址被转换为PC相对值并且最终结果是正确的?似乎是这样。 (你可以回答,我可以选择)。我明天会检查 objdump -dr 的东西。谢谢!
标签: assembly linux-kernel arm64