由于 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 二进制文件?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法将 mex 文件链接到没有 -fPIC 编译的代码
Makefile:来自相同源的两个目标使用不同的标志编译两次