我是嵌入式的新手,目前打算将freeRTOS移植到starvision2上。
但是在链接的时候遇到一个问题。
main.c:74:(.text+0x26): relocation truncated to fit: R_RISCV_HI20 against `TaskBnum.5'
(这个main.c是我从一个移植教程里面偷来的)
我查了一下,说可能是链接脚本还是什么的问题。objdump后发现static变量的地址是0。
没太搞懂是为什么。下面是我的链接脚本
OUTPUT_ARCH("riscv") /*指定输出的架构*/
OUTPUT_FORMAT("elf64-littleriscv") /*指定输出的大小端*/
ENTRY(kernel_entry) /*指定入口点*/
SECTIONS /*配置节表*/
{
. = 0x80200000; /*.变量赋值为openSBI的入口地址0x80200000,.变量会随着后面节表的追加自动增加,即可以理解成.变量标识当前位置*/
PROVIDE(kernelstart = .); /*创建变量并赋值(仅方便编程、可没有)*/
.text /*配置代码节,代表内容存放的实际物理地址,但.自己也会跟着移动*/
{
textstart = .; /*创建变量并赋值(仅方便编程、可没有)*/
*(.text.entry) /*将满足这些条件的节都放到这里来*/
*(.text .stub .text.* .gnu.linkonce.t.*) /*将满足这些条件的节都放到这里来*/
textend = .; /*创建变量并赋值(仅方便编程、可没有)*/
}
.rodata : /*配置只读数据节*/
{
rodatastart = .;
*(.srodata .srodata.* .rodata .rodata.* .gnu.linkonce.r.*)
rodataend = .;
}
. = ALIGN(0x1000);/*将.对齐到4KB*/
.data : /*配置数据节*/
{
datastart = .;
*(.data)
*(.data.*)
dataend = .;
}
. = ALIGN(0x1000);
.bss : /*配置bss节*/
{
bssstart = .;
*(.bss)
*(.bss.*)
*(.sbss*)
bssend = .;
}
PROVIDE(kernel_end = .); /*创建变量并赋值,并对外提供kernelend符号,即在C/C++中可以调用这个量*/
. = ALIGN(0x1000);
PROVIDE(freememstart = .);
}