所谓的 pc rel 的方式,比如说哈,我要传递第一个参数,是通过 auipc+addi 的方式来设置 a0.
我现在编译程序的时候,会遇到一个 trancated PCRELHI20 的链接错误。下面是一个,我的问题场景的简化场景:
extern int array[];// 这个数组的地址很高,在 0xFFFF_F000;这个符号来自于另一个 c 文件
//下面的函数,都是基于 0x0 的地址开始进行分配
int test(int a) {
return a*gType;
}
int main() {
test((int)array); //这里放置第一个参数的时候,就会报错
}
就是说,为了给 test 函数传递 array 这个实参,汇编指令使用了 auipc+addi 的方式,而且当前 pc 和 array 这个符号的地址太远了,导致了会报错。
__asm__ volatile (
"lui a0, %%hi(array)\n\t"
"addi a0, a0, %%lo(array)\n\t"
:
: "r"(array)
);
我尝试写了一个内嵌汇编,来模拟放置 a0 (也就是第一个参数),这里我用的是 lui+addi ,而不是 auipc+addi 的方式。但还是报一样的错。
我真的不理解了,这个问题到底怎么解
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.