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

Zac*_*oyd 4 dynamic-linking shared-library

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

谁能给出这个错误的基本描述和(理想情况下)一些常见原因?

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

我目前正在运行 Ubuntu,尽管我怀疑这适用于许多发行版。

mos*_*svy 5

该消息由动态链接器 ( ld.so(8)) 或动态加载工具 ( dlopen(3)) 生成。

直接回答您的问题:a)不是来自内核b)它来自用户模式下的进程c)它通常不是由程序的主代码生成,而是由加载它的动态链接器或它正在使用的动态库生成(libdl.so) 和d)可以从文件中读取段的事实并不意味着可以mmap使用正确的保护(例如可执行文件)对其进行mmap编辑,或者可以在所需的地址处对其进行编辑(如果使用MAP_FIXED虚假地址) ,而不是应该替换的已知映射)。

如果您想了解更多详细信息,您将看到它在elf/dl-load.has中的 glibc 源代码中定义DL_MAP_SEGMENTS_ERROR_MAP_SEGMENT,并且可以由_dl_map_segments()静态函数返回,该函数本身通过_dl_map_object()=>调用_dl_map_object_from_fd(),并_dl_map_object()直接从动态链接器调用,或通过它的.dl_open回调最终由dlopen(3).