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