리눅스에서 간단한 사용자 공간 ELF 로더를 쓰고 있습니다 (왜? for 'fun'). 현재 나의 로더는 아주 간단하며 위치 독립적 코드가 포함 된 정적으로 링크 된 ELF 파일 만로드하도록 설계되었습니다.로딩 시간 ELF 재배치
일반적으로 프로그램이 커널의 ELF 로더에 의해로드되면 해당 주소 공간에로드됩니다. 따라서 데이터 세그먼트 및 코드 세그먼트는 ELF 세그먼트에 지정된 올바른 가상 주소로로드 될 수 있습니다.
그러나 제 경우에는 mmap
을 통해 커널 주소를 요청하고 ELF 세그먼트에서 요청 된 주소를 얻거나받지 못할 수 있습니다. 이것은 위치 독립적이기 때문에 코드 세그먼트에는 문제가되지 않습니다. 그러나 데이터 세그먼트가 예상 주소에로드되지 않으면 코드가 데이터 세그먼트에 저장된 내용을 제대로 참조 할 수 없습니다.
사실, 로더는 데이터가 포함되지 않은 간단한 어셈블리 실행 파일로 제대로 작동하는 것으로 보입니다. 그러나 데이터 세그먼트를 추가하고 참조하는 즉시 실행 파일이 올바르게 실행되지 않거나 SEGFAULT가 실행되지 않습니다.
가능한 경우 데이터 세그먼트에 대한 참조가 올바른 위치를 가리 키도록 수정하는 방법은 무엇입니까? 이 목적을 위해 (정적) ELF 파일에 재배치 섹션이 저장되어 있습니까?
mmap() 호출 프로세스가 요청 된 주소를 제공 할 때 mmap()이 실패하는 이유는 이미 해당 주소 공간에 페이지가 할당되어 있기 때문입니다. –
예, 이것이 이유 일 수 있습니다. 내 코드/데이터를 어딘가에 배치하는'ld'에 대해 생각해 보았습니다. 그러나 제네릭 솔루션이 먼저 가능했는지 궁금합니다. 여기서 내가 어떤 반응을 얻지 못한다면 나는 그것을 시도하고 그것을 시도 할 것입니다. –