
Многие ответы на другие вопросы помогают решить ошибку вида "не удалось сопоставить сегмент из общего объекта", но они обычно имеют очень конкретные ответы, которые мне сложно применить к другим проблемам. С другой стороны, я не могу найти ничего об этой ошибке в целом.
Может ли кто-нибудь дать базовое описание этой ошибки и (в идеале) некоторые распространенные причины ее возникновения?
Было бы неплохо узнать, например, какая сущность вызывает ошибку (ядро, процесс, программа?) и общие причины этого (например, почти каждая библиотека помечена как доступная для чтения, так почему я не могу выполнить отображение из нее?).
В настоящее время я использую Ubuntu, хотя подозреваю, что это применимо ко многим дистрибутивам.
решение1
Это сообщение генерируется динамическим компоновщиком ( ld.so(8)
) или средствами динамической загрузки ( dlopen(3)
).
Чтобы ответить на ваши вопросы напрямую:а)егонетиз ядраб)это из процесса в пользовательском режимев)обычно он генерируется не основным кодом программы, а динамическим компоновщиком, который его загружает, или динамической библиотекой, которую он использует ( libdl.so
) иг)Тот факт, что сегмент может быть прочитан из файла, не означает, что его можно mmap
открыть с правильной защитой (например, как исполняемый файл) или что его можно mmap
открыть по требуемому адресу (если используется MAP_FIXED
поддельный адрес вместо адреса известного сопоставления, которое следует заменить).
Если вам нужны подробности, вы увидите, что это определено в исходном коде glibc elf/dl-load.h
какDL_MAP_SEGMENTS_ERROR_MAP_SEGMENT
, и может быть возвращен_dl_map_segments()
статическая функция, которая сама вызывается через _dl_map_object()
=> _dl_map_object_from_fd()
и _dl_map_object()
вызывается либо напрямую из динамического компоновщика, либо через ее .dl_open
обратный вызов, в конечном итоге вызываемый dlopen(3)
.