
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 mmap
editarse con la protección adecuada (por ejemplo, ejecutable) o que pueda editarse mmap
en la dirección requerida (si se usa MAP_FIXED
con 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.h
comoDL_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_open
devolución de llamada finalmente llamada por dlopen(3)
.