我尝试编译一些rust代码,但rustc打印出此错误:
relocation R_X86_64_32S cannot be used against local symbol; recompile with -fPIC
但是rustc没有'-fPIC'标志,所以如何用rustc编译PIC二进制文件?
我尝试过'-C relocation-model = pic -C code-model = large',但仍然收到此错误。
编辑:
我发现了错误!我在汇编中使用了一些汇编代码!宏,它使用外部符号的某个地址,这就是为什么rust尝试使用'R_X86_64_32S'的原因,并且由于二进制文件链接到0xffff800000000000,因此会导致错误。
EDIT2:
这是引起类似错误的代码:
#![feature(asm)]
fn main ()
{
unsafe
{
asm! ("lea rax, [label]
label:"
:
:
:
: "intel");
}
}
错误:
= note: /usr/bin/ld: main.main.7rcbfp3g-cgu.0.rcgu.o: relocation R_X86_64_32S against `.text._ZN4main4main17h9e0ea2b04575dfdbE' can not be used when making a PIE object; recompile with -fPIE
可以通过以下方式解决错误:
固定代码:
#![feature(asm)]
fn main ()
{
unsafe
{
asm! ("call label
label:
pop rax"
:
:
:
: "intel");
}
}
重点是:您不能直接加载标签地址,但必须使用调用将该地址压入堆栈,然后弹出该地址。