由于rustc没有'-fPIC'标志,如何将rust代码编译为PIC二进制文件?

问题描述 投票:0回答:1

我尝试编译一些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
rust
1个回答
0
投票

可以通过以下方式解决错误:

固定代码:

#![feature(asm)]
fn main () 
{
    unsafe
    {
        asm! ("call label
              label:
              pop rax"
              :
              :
              :
              : "intel");
    }
}

重点是:您不能直接加载标签地址,但必须使用调用将该地址压入堆栈,然后弹出该地址。

© www.soinside.com 2019 - 2024. All rights reserved.