動態庫的程式碼如何知道它在哪個進程中被呼叫?

動態庫的程式碼如何知道它在哪個進程中被呼叫?

如果我理解正確的話,一個 dylib 實例在載入時儲存在一個記憶體段中,然後它就變成共享的並且沒有複製多個進程之間需要它的虛擬記憶體。但它如何知道誰在執行時調用呢?

例如,我詢問一些依賴我的進程名稱的函式庫的類別建構函式(無需直接傳遞名稱,因為我實際上可以傳遞任何名稱),它如何知道它所附加的多個進程到底呼叫了什麼?

(忽略了這樣一個事實,在這個例子中,元信息不是秘密,可以通過簡單的系統調用來檢索)/庫的代碼甚至不能依賴理論上可以依賴的每個進程內存的信息,就像相同的記憶體共享一樣方案肯定不能向後應用(一個庫<-同時有多個進程)-這將是一個很大的安全漏洞。

當庫需要在其類別中儲存一些特定於進程的資訊作為靜態屬性,以便在某些特定進程和/但不是每個進程中共享時,情況甚至會變得更加複雜英語它所附著的。我假設,實際上,資料將以類別將其視為自己的常規欄位的格式寫入進程記憶體中,但我們再次回到了庫程式碼層級的進程識別問題。

答案1

一般來說,指向堆疊(返回位址的來源)、堆疊(資料儲存)的指標以及一些變數值或位址都是在CPU暫存器中傳遞的。所有這些位址都在呼叫者的虛擬記憶體中。動態庫程式碼在呼叫者的上下文中運行,因此所有系統呼叫的行為就像呼叫者已經完成了它們一樣。

我在我的虛擬空間中用指向我的東西的指標來呼叫共享庫,而你在你的虛擬空間中用指向你的東西的指標來呼叫共享庫。

相關內容