Dynamic-Linking

“無法從共享對象映射段”錯誤是什麼意思?

  • October 21, 2020

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

誰能給出這個錯誤的基本描述和(理想情況下)一些常見原因?

很高興知道,例如,哪個實體引發了錯誤(核心、程序、程序?)以及常見原因(例如,幾乎每個庫都被標記為可讀,那麼為什麼我不能從中映射呢?) .

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

該消息由動態連結器 ( ld.so(8)) 或動態載入工具 ( dlopen(3)) 生成。

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

如果您想了解更多細節,您會看到它在 glibc 原始碼中的elf/dl-load.has中定義DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT,並且可以由_dl_map_segments()靜態函式返回,該函式本身通過_dl_map_object()=>呼叫_dl_map_object_from_fd()_dl_map_object()可以直接從動態連結器呼叫,也可以通過它的.dl_open回調最終由dlopen(3).

引用自:https://unix.stackexchange.com/questions/496292