關(guān)于位置無關(guān)代碼

位置無關(guān)代碼是怎么產(chǎn)生的?
1 編譯時(shí)根據(jù)選項(xiàng)-fPIC,來決定是否生成位置無關(guān)代碼(實(shí)際上,只是對符號的重定位方式進(jìn)行不同的標(biāo)記而已)
2 鏈接時(shí)根據(jù)不同的重定位方式,生成真正的重定位代碼(例如,多了.got .plt等)
位置無關(guān)代碼的基本原理
在訪問變量或者函數(shù)的時(shí)候,使用相對地址來訪問(即當(dāng)前指令的偏移)
位置無關(guān)代碼的相關(guān)數(shù)據(jù)結(jié)構(gòu)
1 .got表(變量的查找)
2 .got.plt表(函數(shù)的查找)
3 .plt表(這東西是為了延遲綁定,準(zhǔn)備的)
位置無關(guān)代碼的重定位(程序啟動(dòng)的時(shí)候)
1 對.got表里面的每一個(gè)變量進(jìn)行重定位(值為變量的具體地址)
2 對.got.plt里面的每一個(gè)函數(shù)進(jìn)行重定位
    1 值為對應(yīng)的.plt表項(xiàng)的指令地址,即lazy binding)
    2 值為函數(shù)的具體地址(dlopen不延遲綁定的時(shí)候)
判斷一個(gè).so文件是否是位置無關(guān)代碼
readelf -d foo.so | grep TEXTREL(即判斷,是否具有代碼段重定位表)
位置無關(guān)代碼的編譯規(guī)則
1 如果是自己本地的靜態(tài)變量或函數(shù),則只需要相對rip的偏移量即可
    static void func(),不走got,就是相對地址,加快函數(shù)調(diào)用速度
2 如果是全局變量,或者是外部引用,則需要got表
    global void func(),走got,為了全局統(tǒng)一
3 如果可執(zhí)行文件是動(dòng)態(tài)鏈接的,則默認(rèn)生成位置無關(guān)代碼(不顯示指定fPIC的時(shí)候)
4 -Bsymbolic
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。