簡體   English   中英

了解Linux中的動態庫加載

[英]Understanding Dynamic Library loading in Linux

我試圖從這里[1]了解Linux中的動態庫加載,並想澄清一下這個概念。 具體而言,在Linux環境中的進程中加載​​動態庫時,它會在地址空間中的任意位置加載。 現在,一個庫具有一個代碼段和一個數據段。 未預先定義代碼段的地址,因此它是0x0000000,而對於數據段,則將某個數字定義為地址。

但這是技巧,數據段的此地址實際上不是真實地址。 實際上,無論在什么位置加載代碼段,都會將數據段的預定義地址添加到其中。

我在這里正確嗎?

被引用的文章還有另外一件事。 這句話是什么意思?

但是,我們有一個限制,那就是共享庫在每個進程中仍然必須有一個unueue數據實例。 盡管可以在運行時將庫數據放置在我們想要的任何位置,但這將需要留下重定位以修補代碼並告知其實際查找數據的位置—破壞了代碼的始終只讀屬性,從而破壞了可共享性。

[1] http://www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html

實際上,無論在什么位置加載代碼段,都會將數據段的預定義地址添加到其中。

是。 數據段的“ VirtAddr”將被添加到基址。

這句話是什么意思?

這意味着當庫訪問其自身的靜態數據時,我們不應在庫代碼中使用重定位。 否則,鏈接程序可能需要修補二進制代碼,從而導致在進程之間取消共享庫代碼的某些部分(如果process1在0x40000000加載庫lib1,而process2在0x50000000加載lib1,則它們的數據重定位將有所不同)。

因此,現實生活中使用了不同的解決方案。 庫代碼和數據都一起加載,並且代碼和數據之間的偏移量對於所有情況都是固定的。 您引用的文字后有“解決方案”: http : //www.technovelty.org/linux/plt-and-got-the-key-to-code-sharing-and-dynamic-libraries.html

從上面的標頭中可以看到,解決方案是將讀寫數據節始終放在庫的代碼節的已知偏移處。 這樣,通過虛擬內存的魔力,每個進程都可以看到自己的數據部分,但是可以共享未修改的代碼。 訪問數據所需要做的只是一些簡單的數學運算。 我想要的東西的地址=我的當前地址+已知的固定偏移量。

暫無
暫無

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

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