lga

RISC-V lga 伪指令详解

汇编器伪指令

加载全局地址伪指令,通过 GOT PC 相对序列取得全局符号地址。官方汇编手册给出的基本形式是 AUIPC 加 RV32 的 LW 或 RV64 的 LD。

你写下的是
lga rd, symbol
常见真实展开
.Llga: auipc rd, %got_pcrel_hi(symbol) l{w|d} rd, %pcrel_lo(.Llga)(rd)

这条伪指令到底在帮你省什么

PIC 和动态链接环境下,全局符号地址可能在链接或装载时决定;lga 让工具链通过 GOT 表项取得最终地址。

lga 的核心作用是“经 GOT 加载全局符号地址”。它是汇编器层面的简写;调试、审计或阅读机器码时,应回到页面列出的真实展开指令和相关重定位语义来判断行为。

官方语义核对重点

官方汇编手册把 lga 作为汇编器层面的伪指令/别名处理,硬件执行的是展开后的真实指令序列。
真实语义以 AUIPC 等展开指令的 ISA 定义为准;本页不把 lga 当作独立硬件 opcode。
地址加载中的 %pcrel_hi/%pcrel_lo 或 %got_pcrel_hi 重定位必须按官方汇编手册和 psABI 的配对规则理解。

工具链与链接器边界

lga 表达经 GOT 取得全局符号地址;最终是否仍保留 GOT 加载可能受符号可见性和链接器松弛影响。
RV32/RV64 的 GOT 表项加载宽度不同,阅读机器码时要结合目标 XLEN。

展开过程怎么理解

步骤 1
AUIPC 以 .Llga 处的 PC 为基准,通过 GOT PC 相对重定位生成 GOT 表项地址的高位部分。
步骤 2
l{w|d} 使用匹配 .Llga 的低 12 位重定位从 GOT 表项加载符号地址;RV32 用 LW,RV64 用 LD。

在 objdump / 反汇编里可能看到什么

常见反汇编是 AUIPC + lw/ld;工具也可能恢复显示为 lga 或 la。RV32 使用 lw,RV64 使用 ld。

官方依据与阅读顺序

本页把伪指令当作汇编器层面的别名或宏来解释:先看它会展开成哪些真实指令,再回到官方 ISA 手册理解真实指令的行为。涉及 ABI、重定位或链接器松弛时,以 psABI 文档为准。

什么时候优先想到它

PIC 代码中获取全局变量地址
动态链接环境中访问可预占符号
需要通过 GOT 表项取得符号最终地址
解释 la 在 pic 模式下的真实路径

容易混淆 / 常见误区

lga 加载 GOT 表项里的地址,不是直接加载目标对象的值
RV32/RV64 的第二条加载指令宽度不同:lw 或 ld
不要把 GOT 重定位和普通 pcrel_hi/pcrel_lo 重定位混用
最终形式可能受链接器松弛和符号可见性影响

常见问题

lga 是真实 RISC-V 指令吗?

lga 是汇编器伪指令或别名,不是单独硬件 opcode。页面中的“常见真实展开”列出官方展开,真实行为由展开后的 ISA 指令决定。

使用 lga 时最容易误解什么?

lga 加载 GOT 表项里的地址,不是直接加载目标对象的值