Answers:
PIC代表位置独立代码
并引用man gcc
:
如果目标机器支持,则发出与位置无关的代码,该代码适用于动态链接并避免对全局偏移表的大小进行任何限制。此选项对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并构建了它。
的f
是选项“控制接口约定在代码生成中使用的”在gcc前缀
该PIC
代表“位置无关的代码”,它的一个专业化fpic
的M68K和SPARC。
编辑:在阅读了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支持PIC 系统V,但不适用于Sun 386i。为生成的代码 IBM RS / 6000始终与位置无关。 -fPIC 如果目标机器支持,则发出与位置无关的代码, 适用于动态链接并避免大小限制 全局偏移表。该选项对m68k有所不同 和SPARC。 与位置无关的代码需要特殊的支持,因此 仅适用于某些机器。