我正在尝试使用Spike RISC-V模拟器和pk内核构建一个类似Forth的线程解释语言(TIL),我正在使用riscv 64-unknown-elf-gcc来构建ELF。
我在对齐方面遇到了很多问题-我认为代码应该是八字节对齐的,有一段时间我通过在头生成宏中添加一个nop来实现这一点(对于那些不了解TIL的人来说,命令通常是由具有标准结构的汇编块构建的-我使用宏来生成结构。
我刚刚扩展了很多代码-添加了更多的关键字等-对齐问题又回来了。
riscv64-unknown-elf-gcc -o riscyforth riscyforth.S
...... /../lib/gcc/riscv64-unknown-elf/8.3.0/../../../../riscv64-unknown-elf/bin/ld: /tmp/ccpobhjr.o(.text+0x679): 7 bytes required for alignment to 8-byte boundary, but only 6 present
..... /../lib/gcc/riscv64-unknown-elf/8.3.0/../../../../riscv64-unknown-elf/bin/ld: can't relax section: bad value
collect2: error: ld returned 1 exit status
这是生成函数头的宏:
.macro CODEHEADER Name, PrevName, flags
.balign 8
TIL_\Name:
.4byte \flags
.4byte \Name
ptr_\PrevName:
.4byte TIL_\PrevName
length_ASCII_\Name:
.4byte end_\Name - beg_\Name
beg_\Name:
.ascii "\Name"
end_\Name:
.balign 8
\Name:
.endm
可执行代码从\Name开始,这是我试图保证8字节对齐的地方--例如,一个典型的函数可能看起来像这样(这个函数在堆栈上放了一个1):
CODEHEADER 1, DOT
li t0, 1
PUSH t0
tail NEXT
并且li t0, 1
将在名称为1
的\Name
处找到。
有没有办法保证这种一致性?我在在线文档中找不到任何东西,但想知道是否有用户在这里有启发式?
3条答案
按热度按时间tez616oj1#
我是这样解决这个问题的:
看起来确实工作正常,但它不能保证FORTH中的所有指令都正确对齐,因为(如果您熟悉FORTH/TILs,这比您不熟悉更有意义)函数头具有可变大小的函数名,因此后面跟随的实际代码不一定对齐。
我通过为函数名保留一个固定的大小和-确保代码在一个对齐的地址上重新开始来解决这个问题。我还在每个函数的开始处发出一个nop以确保每个函数在一个对齐的地址上开始。
roejwanj2#
我在用
可以重新订购:)
arknldoa3#
使用pad作为.p2align 4,0x20 RISCV中的单元大小必须为4字节