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的方式進行編譯的程序才可以在共享庫中使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM