瞭解動態連結(二)—— 地址無關代碼,動態連結

來源:互聯網
上載者:User

瞭解動態連結(二)—— 地址無關代碼,動態連結

把指令中需要修改的部分剝離出來,放到資料區,保持指令部分不變,資料部分可以由每個進程擁有一個副本。這就是——地址無關代碼 (Position-independent Code, PIC),好處是實現指令部分由多進程共用,節省記憶體。

要實現 PIC,就得解決指令中的地址定位問題。指令中的地址引用可分為:

1、模組內部的函數調用和變數訪問;

2、模組外部的函數調用和變數訪問。

第 1 種情況,由於大家都在同一個模組中定義,相互之間有一定的相對位置,所以可以通過相對位址調用解決問題。

第 2 種情況,也就是對於模組外部的訪問,需要在資料區建立一個全域位移表 (GOT),裡面存放外部變數或函數的地址。當然,GOT 表中的地址需要連結器在裝載模組,進行地址重定位時進行填充。這樣對於指令中的外部符號訪問,可以先通過相對位址找到 GOT 表中相關的項,再由其得到目標變數或函數的具體地址。

在 Android 系統中,針對外部的變數和函數引用會有兩個重定位表,所以連續調用 soinfo_relocate 兩次分別進行重定位:

最後,使用 “readelf –d xxx.so | grep TEXTREL” 命令可以查看 xxx.so 是否是 PIC 的,因為 PIC 的 so 不會包含任何程式碼片段重定位表,所以不會有任何輸出。

學習資料: 《程式員的自我修養——連結、裝載和庫》

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.