¿Qué significa el error "no se pudo asignar el segmento del objeto compartido"?

¿Qué significa el error "no se pudo asignar el segmento del objeto compartido"?

Muchas respuestas a otras preguntas ayudan a resolver un error del tipo "no se pudo asignar el segmento del objeto compartido", pero generalmente tienen respuestas muy específicas que me resultan difíciles de aplicar a otros problemas. Por otro lado, no encuentro nada sobre este error en general.

¿Alguien puede dar una descripción básica de este error y (idealmente) algunas causas comunes?

Sería bueno saber, por ejemplo, qué entidad genera el error (¿el núcleo, el proceso, el programa?) y las razones comunes (por ejemplo, casi todas las bibliotecas están marcadas como legibles, entonces, ¿por qué no puedo asignarlas?) .

Actualmente estoy ejecutando Ubuntu, aunque sospecho que esto se aplica a muchas distribuciones.

Respuesta1

Ese mensaje es generado por el enlazador dinámico ( ld.so(8)) o las funciones de carga dinámica ( dlopen(3)).

Para responder a sus preguntas directamente:a)esnodel núcleob)es de un proceso en modo usuarioC)Por lo general, no lo genera el código principal de un programa, sino el vinculador dinámico que lo carga o una biblioteca dinámica que está usando ( libdl.so) yd)El hecho de que un segmento pueda leerse de un archivo no significa que pueda mmapeditarse con la protección adecuada (por ejemplo, ejecutable) o que pueda editarse mmapen la dirección requerida (si se usa MAP_FIXEDcon una dirección falsa, en lugar de esa). de un mapeo conocido que debe ser reemplazado).

Si quieres más detalles, verás que está definido en el código fuente de glibc elf/dl-load.hcomoDL_MAP_SEGMENTS_ERROR_MAP_SEGMENT, y podría ser devuelto por el_dl_map_segments()función estática, que a su vez se llama a través de _dl_map_object()=> _dl_map_object_from_fd(), y _dl_map_object()se llama directamente desde el vinculador dinámico o mediante su .dl_opendevolución de llamada finalmente llamada por dlopen(3).

información relacionada