仿真平台中的程序放在地址0中运行,改为DDR地址0x80000000。结果链接中 报错relocation truncated to fit : R_RISCV_PCREL_HI20 against symbol `j’ defined in .bss section 。
折腾了很久,没搞好,终于搞好了,记录一下

基准测试/common/test.ld链接器脚本将代码放在0x80000000处。这就是芯片放置DDR DRAM的地方。在0x80000000加载的代码只有在编译 -mcmodel=medany 时才能工作。如果指定了-mcmodel=medlow,这将不起作用。

对于使用-mcmodel=medany的64位架构,代码可以链接到任何基址,但链接的全局符号遵循类似的+/- 2GiB范围限制。取决于代码在某些情况下,通常不使用负范围。

(1)编译条件:

CFLAGS + = -I $ (DIR_INC)
CFLAGS + = -D_RISCV64
CFLAGS + = --specs=nano.specs -MD

解决:
CFLAGS + = -I$(DIR_INC)
CFLAGS + = -D_RISCV64
CFLAGS + = --specs=nano.specs -MD -mcmodel=medany
增加 -mcmodel=medany之后还是报错,但是报的错都是链接的工具链下的文件,于是乎重新编译工具链

此外,如果您正在链接任何预编译的库,如C库,那么工具链必须已经配置好了-cmodel=medany,否则C库将是medlow代码,无法工作。
(2)将riscv_gnu_toolchain下面的Makefile里-mcmodel=medlow改为 -mcmodel=medany,重新make工具链,使用这个工具链再重新进行链接就通过了。

工具链按照mcmodel=medany来进行编译是之前没尝试的,所以问题一直没有解决。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐