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 表项里的地址,不是直接加载目标对象的值