Zac*_*oyd 4 dynamic-linking shared-library
许多其他问题的答案有助于解决“无法从共享对象映射段”形式的错误,但它们通常有非常具体的答案,我发现这些答案很难应用于其他问题。另一方面,我一般找不到有关此错误的任何信息。
谁能给出这个错误的基本描述和(理想情况下)一些常见原因?
例如,很高兴知道哪个实体引发了错误(内核、进程、程序?)以及常见原因(例如,几乎每个库都被标记为可读,那么为什么我不能从中映射?) .
我目前正在运行 Ubuntu,尽管我怀疑这适用于许多发行版。
该消息由动态链接器 ( ld.so(8)
) 或动态加载工具 ( dlopen(3)
) 生成。
直接回答您的问题:a)它不是来自内核b)它来自用户模式下的进程c)它通常不是由程序的主代码生成,而是由加载它的动态链接器或它正在使用的动态库生成(libdl.so
) 和d)可以从文件中读取段的事实并不意味着可以mmap
使用正确的保护(例如可执行文件)对其进行mmap
编辑,或者可以在所需的地址处对其进行编辑(如果使用MAP_FIXED
虚假地址) ,而不是应该替换的已知映射)。
如果您想了解更多详细信息,您将看到它在elf/dl-load.h
as中的 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)
.