2017-02-24 69 views
0

可以說我有一個名爲P的程序,它與庫動態鏈接。當調用一個函數,它是在與-fPIC我瞭解這些事情發生編譯共享庫爲什麼後續的動態鏈接函數調用需要通過PLT進行額外的間接尋址?

  1. 有類似call [email protected]P
  2. 這則跳轉到PLT表的代碼,以適當的條目
  3. 從那裏,我們跳轉到相應的GOT切入點
  4. 如果這是這個函數的第一個電話,那麼這是當組合開始發生的瞬間和GOT條目將指引我們回到在綁定代碼
  5. PLT條目所以綁定代碼然後查找函數的地址,並把該地址值到GOT條目並運行它

GOT中存儲了地址,其要麼是到結合如果函數還沒有被調用或者它指向functionName代碼地址,則在相應的PLT條目中的代碼。我的問題是爲什麼在步驟1的呼叫點P不存在像call [[email protected]]這樣的東西。

含義是加載GOT條目的值並直接跳到那裏。除了第一個函數以外,這個函數對於每個函數的調用都會減少間接性。如果它是第一個呼叫,它將跳轉到PLT綁定代碼,綁定將發生並且GOT的值將被更新。隨後的呼叫將直接指向功能代碼,因爲現在GOT條目指向該功能。

一個懷疑是因爲能夠接受函數的地址。這樣對嗎?

回答

0

如果是第一個調用它將跳轉到PLT綁定代碼,綁定將會發生並且GOT的值將被更新。

PLT綁定代碼如何知道要查找哪個函數?

在第一次通話中,PLT存根sets up parameters to the resolver,而這些參數對於每個 PLT存根不同(這就是爲什麼你需要爲每個導入函數一個PLT存根)。

+0

你的意思是文章中的「準備參數」解析器「例程」的部分?如果是,那麼不是GOT條目最初指向的地址,這個準備代碼的第一條指令又依次設置參數? – user183833

相關問題