RISC-V 链接问题:relocation truncated to fit: R_RISCV_PCREL_HI20
问题
在一个基于 RISC-V 架构的项目里,遇到了如下的链接问题:
xxx/file:xxx:(.text.startup+0x74): relocation truncated to fit: R_RISCV_PCREL_HI20 against symbol xxx ...
collect2: error: ld returned 1 exit status
make: *** [Makefile:xx: xxx.elf] Error 1
从提示信息来看,是在链接某个全局变量时发生了错误。
原因
根据查找到的信息,从实际的项目配置来看,原因是这样的:代码段本身,被链接到 0x0 地址;而数据段,则被链接到 2G (0x8000_0000) 地址;并且,访问这个全局变量的代码的地址偏移,跟这个全局变量本身所在数据段里的地址偏移,两者之间的间隔超过了 2G 字节的范围限制,从而引起了链接错误。
解决
既然超过了范围限制,那调整链接地址就可以解决问题。
但实际项目里,代码段和数据段的地址受限于实际的情况,没有办法调整。
所以目前的办法是,指定某片物理内存区域,就当作是全局变量所在的地方;在代码里,通过栈上指针来指向这片区域并进行读写。