Что означает ошибка «не удалось сопоставить сегмент из общего объекта»?

Что означает ошибка «не удалось сопоставить сегмент из общего объекта»?

Многие ответы на другие вопросы помогают решить ошибку вида "не удалось сопоставить сегмент из общего объекта", но они обычно имеют очень конкретные ответы, которые мне сложно применить к другим проблемам. С другой стороны, я не могу найти ничего об этой ошибке в целом.

Может ли кто-нибудь дать базовое описание этой ошибки и (в идеале) некоторые распространенные причины ее возникновения?

Было бы неплохо узнать, например, какая сущность вызывает ошибку (ядро, процесс, программа?) и общие причины этого (например, почти каждая библиотека помечена как доступная для чтения, так почему я не могу выполнить отображение из нее?).

В настоящее время я использую 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).

Связанный контент