【发布时间】:2022-06-15 20:30:20
【问题描述】:
对于某些 RISC-V 代码,我绝对必须将初始化值传递给动态库/模块(一切都用汇编编写)。我似乎能够做到这一点的唯一方法是使用 gp 寄存器 - 我正在使用的代码运行并且没有崩溃(还)。它用于传递存储几个初始化值的堆栈的值。
70 PUSH gp
71 mv gp, s10
72 call dlopen
73 POP gp
(PUSH 和 POP 是我的主要堆栈宏,s10 指向我用来存储初始化值的堆栈)。一切都在 GNU libc/libdl 之上运行。
我尽可能快地恢复gp 的值:一切都说永远不要改变这个寄存器的值——所以可能出了什么问题,或者如果它有效,我可以放松一下吗?
【问题讨论】:
-
为什么不改用
a或t寄存器之一? -
因为它们是由操作系统操作的,所以当我们在库本身中出现时,调用代码中输入的值不会被保留。
-
如果您启用了中断,并且中断使用 GP 访问全局数据,那么事情将无法正常工作。
标签: riscv