
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 mmap
editado com a proteção correta (por exemplo, executável) ou que possa ser mmap
editado no endereço necessário (se estiver usando MAP_FIXED
um 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.h
comoDL_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_open
retorno de chamada chamado por dlopen(3)
.