Libraries
動態庫的程式碼如何知道它在哪個程序中被呼叫?
如果我理解正確,一個 dylib 實例在載入時儲存在一個記憶體段中,然後它會在需要它的多個程序虛擬記憶體之間共享**而不是複制。**但是它如何知道執行時誰在呼叫呢?
例如,我問一些依賴於我的程序名稱的庫的類建構子(不直接傳遞名稱,因為我可以傳遞任何真正的名稱),它如何知道它所附加的多個程序的確切呼叫是什麼?
(忽略在這個例子中元資訊不是秘密並且可以通過簡單的系統呼叫來檢索的事實)/庫的程式碼甚至不能依賴它理論上可以依賴的每個程序記憶體的資訊,因為相同的記憶體共享方案肯定不能向後應用(一個庫<-同時有許多程序)——這將是一個很大的安全漏洞。
當一個庫需要將一些特定於程序的資訊作為靜態屬性儲存在它的類中,以便在某個特定程序中共享,和/但不是它所附加的每個程序時,情況甚至會變得更加複雜。我假設,事實上,數據將以類將視為它自己的正常欄位的格式寫入程序記憶體,但是再次 - 我們回到了庫程式碼級別的程序辨識問題。
通常,指向堆棧(返回地址來自何處)、堆(數據儲存)和一些變數值或地址的指針在 CPU 寄存器中傳遞。所有這些地址都在呼叫者的虛擬記憶體中。動態庫程式碼在呼叫者的上下文中執行,因此所有系統呼叫的行為就像呼叫者完成了它們一樣。
我在我的虛擬空間中用指向我的東西的指針呼叫共享庫,而在虛擬空間中用指針呼叫共享庫。