2017-05-31 23 views
1

在將共享庫(.so)與dlopen鏈接起來之後,我們如何知道鏈接共享對象的大小,即直到dlopen返回的句柄的偏移量是分配的共享庫。如何知道在運行時鏈接的共享對象的內存分配大小?

+0

爲什麼你需要知道這個? – Barmar

+0

共享對象不必是單個內存塊。對於文本,數據,BSS,它可以具有不同的片段,就像可執行的對象文件一樣。 – Barmar

+0

我們可以知道數據的偏移嗎?我想爲共享庫的函數和數據創建一個偏移表。 –

回答

0

共享庫的動態鏈接是一個完整的用戶空間進程。你可以自己做:解析文件的ELF頭文件,將文件映射到內存中,用共享庫的未定義符號等進行動態鏈接。然後你就知道庫部件的確切位置。但是GNU libdl並沒有提供任何有關這方面的信息。

另一種選擇是對庫進行dlopen()併爲它解析/ proc/self/maps。它通常有幾個映射與根據這樣的ELF頭不同的訪問權限(代碼RODATA,rwdata等):

7fd6298f0000-7fd6298f5000 r-xp 00000000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so 
7fd6298f5000-7fd629af4000 ---p 00005000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so 
7fd629af4000-7fd629af5000 r--p 00004000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so 
7fd629af5000-7fd629af6000 rw-p 00005000 fd:00 393441 /lib/x86_64-linux-gnu/libnss_dns-2.19.so 

這應該提供您所需要的所有信息。