“无法从共享对象映射段”错误是什么意思?

“无法从共享对象映射段”错误是什么意思?

其他问题的许多答案有助于解决“无法从共享对象映射段”形式的错误,但它们通常有非常具体的答案,我发现很难应用于其他问题。另一方面,我一般找不到有关此错误的任何信息。

任何人都可以给出此错误的基本描述以及(理想情况下)一些常见原因吗?

例如,最好知道哪个实体引发错误(内核、进程、程序?)以及常见原因(例如,几乎每个库都标记为可读,那么为什么我不能从中映射?) 。

我目前正在运行 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)

相关内容