
다른 질문에 대한 많은 답변은 "공유 개체에서 세그먼트를 매핑하지 못했습니다."라는 형식의 오류를 해결하는 데 도움이 되지만 일반적으로 다른 문제에 적용하기 어려운 매우 구체적인 답변이 있습니다. 반면에 일반적으로 이 오류에 대해서는 아무것도 찾을 수 없습니다.
누구든지 이 오류에 대한 기본 설명과 (이상적으로) 몇 가지 일반적인 원인을 제공할 수 있습니까?
예를 들어 오류를 발생시키는 엔터티(커널, 프로세스, 프로그램?)와 일반적인 이유(예: 거의 모든 라이브러리가 읽기 가능으로 표시되어 있는데 오류에서 매핑할 수 없는 이유)를 아는 것이 좋습니다. .
나는 현재 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)
.