gcc -fPIC编译选项分析
Posted zj_qianzi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gcc -fPIC编译选项分析相关的知识,希望对你有一定的参考价值。
1、-fPIC 作用于编译阶段,在编译动态库时(.so文件)告诉编译器产生与位置无关代码(Position-Independent Code),若未指定-fPIC选项编译.so文件,则在加载动态库时需进行重定向。
2、64位编译器下编译生成动态库时,出现以下错误:
/usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld: ../../CI/script/server/lib/libz.a(adler32.o): relocation R_X86_64_32 against `.text‘ can not be used when making a shared object; recompile with -fPIC
../../CI/script/server/lib/libz.a: could not read symbols: Bad value
原因:提示说需要-fPIC编译,然后在链接动态库的地方加上-fPIC的参数编译结果还是报错,需要把共享库所用到的所有静态库都采用-fPIC编译一遍,才可以成功的在64位环境下编译出动态库。
3、为何在32位的编译器下编译,就不会报错呢?
对于我们的32位环境来说, 编译时是否加上-fPIC, 都不会对链接产生影响, 只是一份代码的在内存中有几个副本的问题(而且对于静态库而言结果都是一样的).但在64位的环境下装载时重定位的方式存在一个问题就是在我们的64位环 境下用来进行位置偏移定位的cpu指令只支持32位的偏移, 但实际中位置的偏移是完全可能超过64位的,所以在这种情况下编译器要求用户必须采用fPIC的方式进行编译的程序才可以在共享库中使用。
以上是关于gcc -fPIC编译选项分析的主要内容,如果未能解决你的问题,请参考以下文章