簡體   English   中英

共享庫中的全局變量如何鏈接?

[英]How are global variables in shared libraries linked?

假設我有這個函數的共享庫,其中“i”是一些全局變量。

int foo() {
return i++;
}

當我從多個進程調用此函數時,每個進程中“i”的值與其他進程無關。

這種行為是非常期待的。

我只是想知道鏈接器通常如何實現這種行為? 根據我的理解,代碼在進程之間共享,因此變量必須在使用此庫的每個程序的所有地址空間中具有相同的虛擬地址。 這種情況對我來說似乎很難完成,所以我想我在這里錯過了一些東西,並且做得與眾不同。

我可以獲得有關此主題的更詳細信息嗎?

運行時的動態鏈接過程(與靜態鏈接過程非常相似)為每個進程分配單獨的數據(和bss)段,並將這些段映射到進程地址空間。 只有進程之間共享文本段。 這樣,每個進程都獲得自己的靜態數據副本。

代碼在進程之間共享,因此變量必須在使用此庫的每個程序的所有地址空間中具有相同的虛擬地址

代碼不會以您的想法分享。 是動態共享對象被加載一次,但存儲器的引用或堆棧或在代碼中的堆so使用不共享。 僅共享包含代碼的部分。

每個進程都有自己唯一的地址空間,因此當進程訪問變量時,它可以具有與其他進程不同的值。 如果進程應共享相同的內存,則必須專門設置它。 共享庫是不夠的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM