其他问题的许多答案有助于解决“无法从共享对象映射段”形式的错误,但它们通常有非常具体的答案,我发现很难将其应用于其他问题。另一方面,我一般找不到有关此错误的任何信息。
谁能给出这个错误的基本描述和(理想情况下)一些常见原因?
很高兴知道,例如,哪个实体引发了错误(内核、进程、程序?)以及常见原因(例如,几乎每个库都被标记为可读,那么为什么我不能从中映射呢?) .
我目前正在运行 Ubuntu,尽管我怀疑这适用于许多发行版。
其他问题的许多答案有助于解决“无法从共享对象映射段”形式的错误,但它们通常有非常具体的答案,我发现很难将其应用于其他问题。另一方面,我一般找不到有关此错误的任何信息。
谁能给出这个错误的基本描述和(理想情况下)一些常见原因?
很高兴知道,例如,哪个实体引发了错误(内核、进程、程序?)以及常见原因(例如,几乎每个库都被标记为可读,那么为什么我不能从中映射呢?) .
我目前正在运行 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)
.