Refactor ELFObject class and remove unused functions

This commit is contained in:
EnderIce2 2024-02-01 16:25:32 +02:00
parent 96daa43d38
commit a0b98e8c57
Signed by untrusted user who does not match committer: enderice2
GPG Key ID: EACC3AD603BAB4DD
2 changed files with 73 additions and 59 deletions

View File

@ -32,36 +32,6 @@ using namespace vfs;
namespace Execute
{
void ELFObject::LoadPhdrs_x86_32(int fd,
Elf64_Ehdr ELFHeader,
Memory::VirtualMemoryArea *vma,
PCB *TargetProcess)
{
stub;
UNUSED(fd);
UNUSED(ELFHeader);
UNUSED(TargetProcess);
}
void ELFObject::LoadPhdrs_x86_64(int fd,
Elf64_Ehdr ELFHeader,
Memory::VirtualMemoryArea *vma,
PCB *TargetProcess)
{
#if defined(a64)
// assert(ELFHeader.e_phentsize == sizeof(Elf64_Phdr));
size_t size = ELFHeader.e_phnum * sizeof(Elf64_Phdr);
assert(size > 0);
assert(size < 65536);
assert(size < PAGE_SIZE);
ELFProgramHeaders = vma->RequestPages(TO_PAGES(size), true);
lseek(fd, ELFHeader.e_phoff, SEEK_SET);
fread(fd, (uint8_t *)ELFProgramHeaders, size);
#endif
}
void ELFObject::GenerateAuxiliaryVector_x86_32(Memory::VirtualMemoryArea *vma,
int fd,
Elf32_Ehdr ELFHeader,
@ -100,14 +70,28 @@ namespace Execute
Elfauxv.push_back({.archaux = {.a_type = AT_ENTRY, .a_un = {.a_val = (uint64_t)EntryPoint}}});
// AT_FLAGS 8
Elfauxv.push_back({.archaux = {.a_type = AT_BASE, .a_un = {.a_val = (uint64_t)BaseAddress}}});
Elfauxv.push_back({.archaux = {.a_type = AT_PHNUM, .a_un = {.a_val = (uint64_t)ELFHeader.e_phnum}}});
Elfauxv.push_back({.archaux = {.a_type = AT_PHENT, .a_un = {.a_val = (uint64_t)ELFHeader.e_phentsize}}});
Elfauxv.push_back({.archaux = {.a_type = AT_PHDR, .a_un = {.a_val = (uint64_t)ELFProgramHeaders}}});
if (ELFProgramHeaders)
{
Elfauxv.push_back({.archaux = {.a_type = AT_PHNUM, .a_un = {.a_val = (uint64_t)ELFHeader.e_phnum}}});
Elfauxv.push_back({.archaux = {.a_type = AT_PHENT, .a_un = {.a_val = (uint64_t)ELFHeader.e_phentsize}}});
Elfauxv.push_back({.archaux = {.a_type = AT_PHDR, .a_un = {.a_val = (uint64_t)ELFProgramHeaders}}});
}
// AT_CLKTCK 17
Elfauxv.push_back({.archaux = {.a_type = AT_PAGESZ, .a_un = {.a_val = (uint64_t)PAGE_SIZE}}});
// AT_HWCAP 16
// AT_MINSIGSTKSZ 51
// AT_SYSINFO_EHDR 33
// AT_HWCAP 16
// AT_SYSINFO_EHDR 33
// AT_MINSIGSTKSZ 51
#ifdef DEBUG
foreach (auto var in Elfauxv)
{
debug("auxv: %ld %#lx",
var.archaux.a_type,
var.archaux.a_un.a_val);
}
#endif
#endif
}
@ -165,8 +149,6 @@ namespace Execute
Memory::VirtualMemoryArea *vma = TargetProcess->vma;
debug("Target process page table is %#lx", TargetProcess->PageTable);
LoadPhdrs_x86_64(fd, ELFHeader, vma, TargetProcess);
/* Copy segments into memory */
{
Elf64_Phdr ProgramBreakHeader{};
@ -286,6 +268,12 @@ namespace Execute
};
break;
}
case PT_PHDR:
{
ELFProgramHeaders = (void *)ProgramHeader.p_vaddr;
debug("ELFProgramHeaders: %#lx", ELFProgramHeaders);
break;
}
case 0x6474E550: /* PT_GNU_EH_FRAME */
{
fixme("PT_GNU_EH_FRAME");
@ -306,6 +294,8 @@ namespace Execute
fixme("PT_GNU_PROPERTY");
break;
}
case PT_INTERP:
break;
default:
{
fixme("Unhandled program header type: %#lx",
@ -315,6 +305,9 @@ namespace Execute
}
}
if (!ELFProgramHeaders)
fixme("ELFProgramHeaders is null");
/* Set program break */
uintptr_t ProgramBreak = ROUND_UP(ProgramBreakHeader.p_vaddr +
ProgramBreakHeader.p_memsz,
@ -382,8 +375,6 @@ namespace Execute
if (LoadInterpreter(ifd, TargetProcess))
{
/* FIXME: specify argv[1] as the location for the interpreter */
debug("Interpreter loaded successfully");
fclose(ifd);
return;
@ -400,8 +391,6 @@ namespace Execute
Memory::VirtualMemoryArea *vma = TargetProcess->vma;
uintptr_t BaseAddress = 0;
LoadPhdrs_x86_64(fd, ELFHeader, vma, TargetProcess);
/* Copy segments into memory */
{
Elf64_Phdr ProgramBreakHeader{};
@ -493,6 +482,12 @@ namespace Execute
}
break;
}
case PT_PHDR:
{
ELFProgramHeaders = (void *)(BaseAddress + ProgramHeader.p_vaddr);
debug("ELFProgramHeaders: %#lx", ELFProgramHeaders);
break;
}
case 0x6474E550: /* PT_GNU_EH_FRAME */
{
fixme("PT_GNU_EH_FRAME");
@ -513,6 +508,8 @@ namespace Execute
fixme("PT_GNU_PROPERTY");
break;
}
case PT_INTERP:
break;
default:
{
fixme("Unhandled program header type: %#lx",
@ -522,6 +519,9 @@ namespace Execute
}
}
if (!ELFProgramHeaders)
ELFProgramHeaders = (void *)(BaseAddress + ELFHeader.e_phoff);
/* Set program break */
uintptr_t ProgramBreak = ROUND_UP(BaseAddress +
ProgramBreakHeader.p_vaddr +
@ -860,14 +860,41 @@ namespace Execute
while (envp[envc] != nullptr)
envc++;
Elf32_Ehdr ELFHeader;
fread(fd, &ELFHeader, sizeof(Elf32_Ehdr));
std::vector<Elf64_Phdr> PhdrINTERP = ELFGetSymbolType_x86_64(fd, PT_INTERP);
const char *ElfInterpPath = nullptr;
if (!PhdrINTERP.empty() && ELFHeader.e_type == ET_DYN)
{
lseek(fd, PhdrINTERP.front().p_offset, SEEK_SET);
ElfInterpPath = new char[256];
fread(fd, (void *)ElfInterpPath, 256);
debug("Interpreter: %s", ElfInterpPath);
lseek(fd, 0, SEEK_SET);
argc++;
}
// ELFargv = new const char *[argc + 2];
size_t argv_size = argc + 2 * sizeof(char *);
ELFargv = (const char **)TargetProcess->vma->RequestPages(TO_PAGES(argv_size));
for (int i = 0; i < argc; i++)
int interAdd = 0;
if (ElfInterpPath)
{
size_t arg_size = strlen(argv[i]) + 1;
size_t interp_size = strlen(ElfInterpPath) + 1;
ELFargv[0] = (const char *)TargetProcess->vma->RequestPages(TO_PAGES(interp_size));
strcpy((char *)ELFargv[0], ElfInterpPath);
delete[] ElfInterpPath;
interAdd++;
}
for (int i = interAdd; i < argc; i++)
{
assert(argv[i - interAdd] != nullptr);
size_t arg_size = strlen(argv[i - interAdd]) + 1;
ELFargv[i] = (const char *)TargetProcess->vma->RequestPages(TO_PAGES(arg_size));
strcpy((char *)ELFargv[i], argv[i]);
strcpy((char *)ELFargv[i], argv[i - interAdd]);
}
ELFargv[argc] = nullptr;
@ -876,15 +903,13 @@ namespace Execute
ELFenvp = (const char **)TargetProcess->vma->RequestPages(TO_PAGES(envp_size));
for (int i = 0; i < envc; i++)
{
assert(envp[i] != nullptr);
size_t env_size = strlen(envp[i]) + 1;
ELFenvp[i] = (const char *)TargetProcess->vma->RequestPages(TO_PAGES(env_size));
strcpy((char *)ELFenvp[i], envp[i]);
}
ELFenvp[envc] = nullptr;
Elf32_Ehdr ELFHeader;
fread(fd, &ELFHeader, sizeof(Elf32_Ehdr));
switch (ELFHeader.e_type)
{
case ET_REL:

View File

@ -64,19 +64,8 @@ namespace Execute
const char **ELFenvp;
std::vector<AuxiliaryVector> Elfauxv;
Tasking::IP ip;
void *ELFProgramHeaders;
void LoadPhdrs_x86_32(int fd,
Elf64_Ehdr ELFHeader,
Memory::VirtualMemoryArea *vma,
Tasking::PCB *TargetProcess);
void LoadPhdrs_x86_64(int fd,
Elf64_Ehdr ELFHeader,
Memory::VirtualMemoryArea *vma,
Tasking::PCB *TargetProcess);
void GenerateAuxiliaryVector_x86_32(Memory::VirtualMemoryArea *vma,
int fd,
Elf32_Ehdr ELFHeader,