Gcc和Open64中的-fPIC选项

2019-04-15 15:16发布

转自:http://www.lingcc.com/2009/11/20/10065/
选项 -fPIC PICPosition-Independent Code的缩写。在计算机系统中,PICPIE(Position-Independent Executable)是可以在主存中不同位置执行的目标代码。PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。 要想实现位置无关,代码必须通过特定的方式编写、编译才行。比如对于固定地址的绝对跳转指令,就需要使用相对应的相对跳转指令代替,相对位置的计算通过对指令计数器的计算得到。在某些特定的体系结构上(AMD64),共享库就必须支持PIC 另外位置独立还需要与重分配(reallocate)区分,后者是指在计算机中将符号因引用或者库的名字用主存中的可用地址代替。虽然能在运行时通过装载器(loader)完成,但通常是在编译阶段由连接器(linker)完成。编译器或者汇编器通常会生成从0位置开始的可执行代码,在代码运行之前,这些相对地址将修改为正确的运行时地址。 通常congfigure能够检测出编译器是否支持-fPIC,是通过编译一个小程序,并且检查stderr输出实现的。若此时编译器输出了任何的警告,就视为不支持。此时如果用户在CFLAGS或者CXXFLAGS中指定了一个错误的flag,那编译任何程序都会出警告,于是就会被判为-fPIC不可用。 现在我们就可以考虑以下三种情况需要-fPIC

  1. 不需要动态链接库的可执行程序:
    因为通常可执行程序会被装载到固定的地址,并从此处开始运行,所以普通可执行程序不需要-fPIC
  2. 静态链接库:相当于一个大.o文件结合,又被称作可充分配对象。它们包含了一些可将它们在内存中改变位置的信息(使用重分配移动),所以静态链接库也不需要-fPIC
  3. 动态链接库:因为动态链接库就是为了实现位置无关,所以需要使用-fPIC.
参考文献