I am currently making an ELF loader for my OS. It parses the program headers, and I know it does it correctly. How every, it #PFs when I launch the program. I know it is a loader problem because a simpler loader I used before worked fine. Here is the code
Code: Select all
VIRTUALADDR SchedElfLoadModule(VIRTUALADDR moduleBase, INT mod, PROCESS* proc)
{
MULTIBOOT_MODULE* moduleArray = (MULTIBOOT_MODULE*)moduleBase;
VIRTUALADDR base = (VIRTUALADDR)moduleArray[mod].modStart;
VIRTUALADDR vbase = (VIRTUALADDR)KePlacementAlloc(0x1000);
Elf64_Ehdr* hdr = (Elf64_Ehdr*)vbase;
HalMapAddress((VIRTUALADDR*)HalGetDirectory(), (VIRTUALADDR)hdr, base, PG_PRESENT | PG_WRITEABLE);
if(hdr->e_ident[EI_MAG0] == ELFMAG0 && hdr->e_ident[EI_MAG1] == ELFMAG1 && hdr->e_ident[EI_MAG2] == ELFMAG2 && hdr->e_ident[EI_MAG3] == ELFMAG3)
{
QWORD offset = hdr->e_phoff;
for(INT i = 0; i < hdr->e_phnum; i++)
{
VIRTUALADDR pbase = vbase + offset;
Elf64_Phdr* phdr = (Elf64_Phdr*)pbase;
if(phdr->p_type == PT_LOAD)
{
DWORD size = phdr->p_filesz;
if(!(size & 0xFFFFF000))
{
size &= 0xFFFFF000;
size += 0x1000;
}
else if(size & 0xFFFFF000)
{
size &= 0xFFFFF000;
size += 0x1000;
}
for(DWORD i = 0; i < size; i += 0x1000)
{
HalMapAddress((VIRTUALADDR*)proc->pdbr, phdr->p_vaddr + i, base + offset + i, PG_PRESENT | PG_WRITEABLE | PG_USER);
}
}
offset += hdr->e_phentsize;
}
return hdr->e_entry;
}
return 0;
}
nexos