如何解决将链接描述文件与汇编文件 [risc-v] 连接起来
我正在使用 RISC-V compiler,我需要将我的链接器脚本“变量”连接到汇编文件指令,例如:
在我的链接描述文件 (.ld) 中有这一行:
ENTRY(_start)
_estack = 0x1FFFC; /* end of RAM */
...
由此,我需要在我的 start.S 文件中创建一个汇编指令,如下所示:
li sp,_estack
我尝试了很多东西,例如:
.word _estack
# - or -
.global _estack
li sp,_estack
但它们似乎都不起作用,并且显示了以下消息:
App/src/start.S: Assembler messages:
App/src/start.S:59: Error: illegal operands `li sp,_estack'
make: *** [build/start.o] Error 1
关于上下文,这是我的 start.S 文件:
.global _start
.section .text.prologue,"ax"
.word _estack
# .global _estack
_start:
li sp,_estack
jal ra,main
j _exit
_exit: j _exit
解决方法
这是“尝试一下”的事情之一。
extern unsigned int _estack;
unsigned int fun ( void )
{
return(_estack);
}
假设 gcc 检查编译器输出
fun:
lui a5,%hi(_estack)
lw a0,%lo(_estack)(a5)
ret
因此,对于 gnu 汇编程序(汇编语言特定于工具而非目标)
lui x15,%hi(_estack)
lw sp,%lo(_estack)(x15)
_estack = 0x1FFFC;
MEMORY
{
ram : ORIGIN = 0x00000000,LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > ram
}
Disassembly of section .text:
00000000 <.text>:
0: 000207b7 lui x15,0x20
4: ffc7a103 lw x2,-4(x15) # 1fffc <_estack>
这也应该有效:
lui sp,%hi(_estack)
addi sp,sp,%lo(_estack)
还有ori。
就像任何其他常量一样,您需要从 lui 开始设置高位,然后您可以在其他指令中处理低位。汇编程序可能有一个伪指令,他们可以在其中选择解决方案(例如,如果常量是 0x12340000,则您只需要 lui)。但是假设伪指令是特定于汇编程序而不是目标。
,在您的 crt0 文件中,您需要将:li sp,_estack
替换为 la sp,_estack
。 li
仅用于立即,因为 _estack
是您必须使用的符号 la
。
在您的链接描述文件中,您需要提供符号,否则您将收到未定义的引用错误。替换_estack = 0x1FFFC; /* end of RAM */
来自PROVIDE(_estack = 0x1FFFC); /* end of RAM */
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。