我知道'-fPIC
'选项与解决地址和个别模块之间的独立性有关,但我不确定其确切含义。你能解释一下吗?
PIC代表位置无关代码。
引用自man gcc
:
如果目标机器支持,会生成适用于动态链接并避免全局偏移表大小限制的位置无关代码。这个选项在AArch64、m68k、PowerPC和SPARC上有区别。
在这些架构上构建共享对象(*.so)时,请使用该选项。
/usr/bin/ld: /tmp/cc7hXILq.o: relocation R_X86_64_32 against \
.rodata' can not be used when making a shared object; recompile with -fPIC`的错误提示,所以我添加了-fPIC选项,然后就成功构建了。 - chiliNUTf
是gcc选项的前缀,用于"控制代码生成中使用的接口约定"
PIC
代表"位置无关代码",它是m68K和SPARC的fpic
的一个特殊化。
编辑:阅读由0x6adb015引用的文档的第11页和coryan的评论后,我做了一些修改:
此选项仅对共享库有意义,并告诉操作系统你正在使用全局偏移表GOT。这意味着所有地址引用都相对于GOT,代码可以在多个进程之间共享。
否则,如果没有此选项,加载器必须自己修改所有偏移量。
不用说,我们几乎总是使用-fpic / PIC选项。
man gcc
说:
-fpic 生成适用于共享库的位置无关代码(PIC),如果目标机器支持的话,这种代码通过全局偏移表(GOT)访问所有常量地址。动态加载器在程序启动时解析GOT条目(动态加载器不是GCC的一部分;它是操作系统的一部分)。如果链接可执行文件的GOT大小超过了机器特定的最大大小,则会从链接器显示错误消息,指示-fpic不起作用;在这种情况下,请重新编译并使用-fPIC。(这些最大值分别为SPARC上的8k和m68k以及RS / 6000上的32k。386没有此限制。)
位置无关代码需要特殊的支持,因此仅适用于某些计算机。对于386,GCC支持System V的PIC,但不支持Sun 386i。生成IBM RS / 6000的代码始终是位置无关的。
-fPIC 如果目标机器支持,发出适用于动态链接并避免全局偏移表大小限制的位置无关代码。这个选项在m68k和SPARC上有区别。
位置无关代码需要特殊的支持,因此仅适用于某些计算机。