0
可以說我有一個名爲P
的程序,它與庫動態鏈接。當調用一個函數,它是在與-fPIC
我瞭解這些事情發生編譯共享庫爲什麼後續的動態鏈接函數調用需要通過PLT進行額外的間接尋址?
- 有類似
call [email protected]
在P
- 這則跳轉到
PLT
表的代碼,以適當的條目 - 從那裏,我們跳轉到相應的
GOT
切入點 - 如果這是這個函數的第一個電話,那麼這是當組合開始發生的瞬間和
GOT
條目將指引我們回到在綁定代碼 PLT
條目所以綁定代碼然後查找函數的地址,並把該地址值到GOT
條目並運行它
的GOT
中存儲了地址,其要麼是到結合如果函數還沒有被調用或者它指向functionName
代碼地址,則在相應的PLT
條目中的代碼。我的問題是爲什麼在步驟1的呼叫點P不存在像call [[email protected]]
這樣的東西。
含義是加載GOT
條目的值並直接跳到那裏。除了第一個函數以外,這個函數對於每個函數的調用都會減少間接性。如果它是第一個呼叫,它將跳轉到PLT
綁定代碼,綁定將發生並且GOT
的值將被更新。隨後的呼叫將直接指向功能代碼,因爲現在GOT
條目指向該功能。
一個懷疑是因爲能夠接受函數的地址。這樣對嗎?
你的意思是文章中的「準備參數」解析器「例程」的部分?如果是,那麼不是GOT條目最初指向的地址,這個準備代碼的第一條指令又依次設置參數? – user183833