Dynamic-Linking
“無法從共享對象映射段”錯誤是什麼意思?
其他問題的許多答案有助於解決“無法從共享對象映射段”形式的錯誤,但它們通常有非常具體的答案,我發現很難將其應用於其他問題。另一方面,我一般找不到有關此錯誤的任何資訊。
誰能給出這個錯誤的基本描述和(理想情況下)一些常見原因?
很高興知道,例如,哪個實體引發了錯誤(核心、程序、程序?)以及常見原因(例如,幾乎每個庫都被標記為可讀,那麼為什麼我不能從中映射呢?) .
我目前正在執行 Ubuntu,儘管我懷疑這適用於許多發行版。
該消息由動態連結器 (
ld.so(8)
) 或動態載入工具 (dlopen(3)
) 生成。直接回答您的問題:a)它不是來自核心**b)它來自使用者模式下的程序c)它通常不是由程序的主程式碼生成,而是由正在載入它的動態連結器或它正在使用的動態庫生成(
libdl.so
) 和d)**可以從文件中讀取段這一事實並不意味著可以mmap
使用正確的保護(例如執行檔)對其進行編輯,或者可以mmap
在所需的地址處對其進行編輯(如果使用MAP_FIXED
虛假地址) ,而不是應該替換的已知映射)。如果您想了解更多細節,您會看到它在 glibc 原始碼中的
elf/dl-load.h
as中定義DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT
,並且可以由_dl_map_segments()
靜態函式返回,該函式本身通過_dl_map_object()
=>呼叫_dl_map_object_from_fd()
,_dl_map_object()
可以直接從動態連結器呼叫,也可以通過它的.dl_open
回調最終由dlopen(3)
.