「無法從共享物件映射段」錯誤是什麼意思?

「無法從共享物件映射段」錯誤是什麼意思?

其他問題的許多答案都有助於解決「無法從共享物件映射段」形式的錯誤,但它們通常有非常具體的答案,我發現很難應用於其他問題。另一方面,我一般找不到有關此錯誤的任何資訊。

任何人都可以給出此錯誤的基本描述以及(理想情況下)一些常見原因嗎?

例如,最好知道哪個實體引發錯誤(內核、進程、程式?)以及常見原因(例如,幾乎每個庫都標記為可讀,那麼為什麼我不能從中映射?) 。

我目前正在運行 Ubuntu,儘管我懷疑這適用於許多發行版。

答案1

ld.so(8)此訊息由動態連結器 ( ) 或動態載入工具 ( )產生dlopen(3)

直接回答您的問題:A)它是不是從內核b)它來自用戶模式的進程C)它通常不是由程式的主程式碼產生的,而是由載入它的動態連結器或它正在使用的動態程式庫產生的 ( libdl.so) 和d)可以從檔案中讀取段的事實並不意味著它可以mmap使用正確的保護(例如可執行檔)進行編輯,也不意味著可以mmap在所需的地址處進行編輯(如果使用MAP_FIXED虛假地址,而不是該地址)應替換的已知映射)。

如果您想要更多詳細信息,您會看到它在 glibc 原始程式碼中定義elf/dl-load.hDL_MAP_SEGMENTS_ERROR_MAP_SEGMENT,並且可以透過返回_dl_map_segments()靜態函數,它本身透過_dl_map_object()=>調用_dl_map_object_from_fd(),並且_dl_map_object()直接從動態連結器調用,或透過.dl_open最終由 調用的回調調用dlopen(3)

相關內容