O que significa um erro "falha ao mapear segmento do objeto compartilhado"?

O que significa um erro "falha ao mapear segmento do objeto compartilhado"?

Muitas respostas para outras perguntas ajudam a resolver um erro do tipo "falha ao mapear o segmento do objeto compartilhado", mas geralmente têm respostas muito específicas que considero difíceis de aplicar a outros problemas. Por outro lado, não consigo encontrar nada sobre esse erro em geral.

Alguém pode fornecer uma descrição básica desse erro e (idealmente) algumas causas comuns?

Seria bom saber, por exemplo, qual entidade gera o erro (o kernel, o processo, o programa?) E os motivos comuns (por exemplo, quase todas as bibliotecas estão marcadas como legíveis, então por que não consigo mapeá-las?) .

Atualmente estou executando o Ubuntu, embora suspeite que isso se aplique a muitas distribuições.

Responder1

Essa mensagem é gerada pelo vinculador dinâmico ( ld.so(8)) ou pelos recursos de carregamento dinâmico ( dlopen(3)).

Para responder diretamente às suas perguntas:a)isso énãodo núcleob)é de um processo em modo de usuárioc)geralmente não é gerado pelo código principal de um programa, mas pelo vinculador dinâmico que o está carregando ou por uma biblioteca dinâmica que ele está usando ( libdl.so) ee)o fato de um segmento poder ser lido de um arquivo não significa que ele possa ser mmapeditado com a proteção correta (por exemplo, executável) ou que possa ser mmapeditado no endereço necessário (se estiver usando MAP_FIXEDum endereço falso, em vez disso de um mapeamento conhecido que deve ser substituído).

Se você quiser mais detalhes, verá que ele está definido no código-fonte da glibc elf/dl-load.hcomoDL_MAP_SEGMENTS_ERROR_MAP_SEGMENT, e poderá ser devolvido pelo_dl_map_segments()função estática, que é chamada via _dl_map_object()=> _dl_map_object_from_fd()e _dl_map_object()é chamada diretamente do vinculador dinâmico ou por meio de seu .dl_openretorno de chamada chamado por dlopen(3).

informação relacionada