1. 程式人生 > >android linker 淺析

android linker 淺析

不同映像間的函式和資料引用都是通過它們實現的。GOT(全域性偏移表)給出了映像中所有被引用符號(函式或變數)的值。每個普通PLT表項相當於一個函式的樁函式(stub),支援懶繫結的情況下,當發生對外部函式的呼叫時,程式會通過PLT表將控制交給動態聯結器,後者解析出函式的絕對地址,修改GOT中相應的值,之後的呼叫將不再需要聯結器的繫結。由於linker是不支援懶繫結的,所以在程序初始化時,動態連結器首先解析出外部過程引用的絕對地址,一次性的修改所有相應的GOT表項。對共享物件來說,由於GOTPLT節以及程式碼段和資料段之間的相對位置是固定的,所有引用都是基於一個固定地址(GOT)的偏移量,所以實現了
PIC程式碼,重定位時只需要修改可寫段中的GOT表。而可執行程式在連線過程中則可能發生對不可寫段的修改。如果只讀段和可寫段不是以固定的相對位置載入的,那麼在重定位是還需要修改所有指向GOT的指標。