连接链接描述文件与汇编文件 [risc-v]
Connecting linker script with assembly file [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
但是其中 none 似乎有效,并且显示了这条消息:
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 */
.
我正在使用 RISC-V compiler,我需要将我的链接描述文件“变量”连接到汇编文件指令,例如:
在我的链接描述文件 (.ld) 中有这一行:
ENTRY(_start)
_estack = 0x1FFFC; /* end of RAM */
...
据此,我需要在我的 start.S 文件中创建一个汇编指令,如下所示:
li sp, _estack
我试过很多东西,比如:
.word _estack
# - or -
.global _estack
li sp, _estack
但是其中 none 似乎有效,并且显示了这条消息:
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 */
.