日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gcc -fPIC选项

發(fā)布時間:2023/12/9 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 gcc -fPIC选项 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
使用 -fPIC 選項,會生成 PIC 代碼。.so 要求為 PIC,以達到動態(tài)鏈接的目的,否則,無法實現(xiàn)動態(tài)鏈接。
non-PIC 與 PIC 代碼的區(qū)別主要在于 access global data, jump label 的不同。 比如一條 access global data 的指令, non-PIC 的形勢是:ld r3, var1 PIC 的形式則是:ld r3, var1-offset@GOT,意思是從 GOT 表的 index 為 var1-offset 的地方處 指示的地址處裝載一個值,即 var1-offset@GOT 處的4個 byte 其實就是 var1 的地址。這個地址只有在運行的時候才知道, 是由 dynamic-loader(ld-linux.so) 填進去的。
再比如 jump label 指令 non-PIC 的形勢是:jump printf ,意思是調(diào)用 printf。 PIC 的形式則是:jump printf-offset@GOT,意思是跳到 GOT 表的 index 為 printf-offset 的地方處 指示的地址去執(zhí)行,這個地址處的代碼擺放在 .plt section,每個外部函數(shù)對應(yīng)一段這樣的代碼,其功能是呼叫 dynamic-loader(ld-linux.so) 來查找函數(shù)的地址(本例中是 printf),然后將其地址寫到 GOT 表的 index 為 printf-offset 的地方, 同時執(zhí)行這個函數(shù)。這樣,第2次呼叫 printf 的時候,就會直接跳到 printf 的地址,而不必再查找了。
GOT 是 data section, 是一個 table, 除專用的幾個 entry,每個 entry 的內(nèi)容可以再執(zhí)行的時候修改; PLT 是 text section, 是一段一段的 code,執(zhí)行中不需要修改。 每個 target 實現(xiàn) PIC 的機制不同,但大同小異。比如 MIPS 沒有 .plt, 而是叫 .stub,功能和 .plt 一樣。
可見,動態(tài)鏈接執(zhí)行很復(fù)雜,比靜態(tài)鏈接執(zhí)行時間長;但是,極大的節(jié)省了 size,PIC 和動態(tài)鏈接技術(shù)是計算機發(fā)展史上非常重要的一個里程碑。

總結(jié)

以上是生活随笔為你收集整理的gcc -fPIC选项的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。