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

Posted

技术标签:

【中文标题】由于 rustc 没有“-fPIC”标志,如何将 rust 代码编译为 PIC 二进制文件?【英文标题】:How to compile rust code as PIC binary since rustc don't have '-fPIC' flag? 【发布时间】:2020-04-11 06:37:02 【问题描述】:

我试图编译一些 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' 但仍然收到此错误。

编辑:

我发现了错误!我在 asm 中使用了一些汇编代码!宏并且它使用外部符号的一些地址,这就是为什么 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

【问题讨论】:

锈builds and links as position independent by default。可能正在发生其他事情。你是怎么得到这个错误的——你能举一个最小的可重现的例子吗? 我在搞乱裸机代码,所以除非你有交叉编译的核心板条箱,否则无法构建 你应该发布汇编!导致问题中错误的代码,然后将您的编辑作为答案发布,也许还有更多解释。 【参考方案1】:

错误可以这样修复:

固定代码:

#![feature(asm)]
fn main () 

    unsafe
    
        asm! ("call label
              label:
              pop rax"
              :
              :
              :
              : "intel");
    

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

【讨论】:

以上是关于由于 rustc 没有“-fPIC”标志,如何将 rust 代码编译为 PIC 二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OS/X 的编译时确定编译标志?

如何使用boost.python中的-fPIC编译静态库

有没有办法将 mex 文件链接到没有 -fPIC 编译的代码

Makefile:来自相同源的两个目标使用不同的标志编译两次

即使在构建可执行文件时,CMake 3.0 + Fortran + CUDA也需要-fPIC

如何配置 SublimeLinter-contrib-rustc 以找到“活塞”板条箱?