在arm64汇编中,"adrp x0, idmap_pg_dir;"指令是什么意思?

In arm64 assembly, what does "adrp x0, idmap_pg_dir;" instruction mean?

一个关于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 只是一个绝对地址。 (不是吗?)所以我很困惑。请大家指正。

在 ARMv8 架构参考手册中,在 ADRP 指令部分,它说,

Is the program label whose 4KB page address is to be calculated. Its offset from the page address of this instruction, in the range +/-4GB, is encoded as "immhi:immlo" times 4096.

所以编译器'calculates'了'offset'到'label'。因此,使用当前指令中的 'offset' 而不是标签的绝对地址。