我有以下c程序
#include <stdio.h>
int main()
{
printf("hello');
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我编译这个文件
gcc -c rr2.c
Run Code Online (Sandbox Code Playgroud)
然后使用带有共享选项的链接器
/ld-new -shared -o tmpdir/dump rr2.o
Run Code Online (Sandbox Code Playgroud)
它给出以下错误
rr2.o:在创建共享对象时,不能使用针对`.rodata'的重定位R_X86_64_32; 用-fPIC重新编译
我不明白为什么会出现这种错误.任何人都可以帮我理解为什么会出现这个错误?
动态共享"对象"没有固定的地址,它们被加载到内存中.这意味着对函数和变量的所有引用都必须与位置无关.您必须创建位置无关代码(或简称PIC).
如链接器所建议的那样,通过-fPIC在编译时添加标志来完成:
> gcc -fPIC -c rr2.c
Run Code Online (Sandbox Code Playgroud)