为什么我的共享对象在没有 -fPIC 的情况下无法编译

问题描述

我写了一个简单的共享库,其中包含 stdio.h 中 stdout 的用法

#include <stdio.h>

...
  fflush(stdout);
...

在我使用下面的命令添加 fflush(stdout) 之前没有编译问题

$gcc -shared -o a.so a.c 

但是在添加了 fflush(stdout) 之后,编译器抱怨:

/usr/bin/ld: /tmp/ccK4npwc.o: relocation R_X86_64_PC32 against symbol `stdout@@GLIBC_2.2.5' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link Failed: bad value
collect2: error: ld returned 1 exit status

有人可以尽可能详细地解释这背后的原理吗?为什么这里必须是 -fPIC?

编辑: 一些评论建议我在 PIC 上阅读,但这遗漏了我的问题。我的问题是为什么我需要这个程序的 PIC。在我的程序中,我还使用了来自 libc 的 puts。我可以在没有 -fPIC 的情况下很好地编译它。但是为什么 stdout 变量需要 -fPIC 呢?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...