ELFLoader: Do not keep track of segments

This reduces calls to kmalloc() since segment data is heap-allocated, and the segments loaded will be deleted when deleting the page directory.
This commit is contained in:
apio 2023-01-05 21:46:03 +01:00
parent f0e14cf7e9
commit d3c414af4e
Signed by: asleepymoon
GPG Key ID: B8A7D06E42258954
2 changed files with 1 additions and 40 deletions

View File

@ -23,19 +23,11 @@ static bool can_write_segment(u32 flags)
return can_write_segment(flags) && can_execute_segment(flags);
}*/
ELFSegment::ELFSegment(u64 base, usize size) : m_base(base), m_size(size)
{
}
namespace ELFLoader
{
// FIXME: Check that all calls to read_contents() read the proper amount of bytes.
Result<ELFData> load(const TarStream::Entry& elf_entry, const TarStream& stream)
{
LinkedList<ELFSegment> segments;
auto guard = make_scope_guard([&] { segments.consume([](ELFSegment* segment) { delete segment; }); });
Elf64_Ehdr elf_header;
usize nread = stream.read_contents(elf_entry, &elf_header, 0, sizeof elf_header);
if (nread < sizeof elf_header)
@ -101,9 +93,6 @@ namespace ELFLoader
/*expect(!can_write_and_execute_segment(program_header.p_flags),
"Segment is both writable and executable");*/
ELFSegment* segment = TRY(make<ELFSegment>(program_header.p_vaddr, program_header.p_memsz));
segments.append(segment);
int flags = MMU::User | MMU::NoExecute;
if (can_write_segment(program_header.p_flags)) flags |= MMU::ReadWrite;
else if (can_execute_segment(program_header.p_flags))
@ -124,14 +113,6 @@ namespace ELFLoader
else { kdbgln("ELF: Encountered non-loadable program header, skipping"); }
}
if (segments.count() == 0)
{
kdbgln("Error while loading ELF: No loadable segments");
return err(ENOEXEC);
}
guard.deactivate();
return ELFData { segments, elf_header.e_entry };
return ELFData { elf_header.e_entry };
}
}

View File

@ -47,28 +47,8 @@ typedef struct
u64 p_align; /* Segment alignment */
} Elf64_Phdr;
struct ELFSegment : public LinkedListNode<ELFSegment>
{
u64 base() const
{
return m_base;
}
usize size() const
{
return m_size;
}
ELFSegment(u64 base, usize size);
private:
u64 m_base;
usize m_size;
};
struct ELFData
{
LinkedList<ELFSegment> segments;
u64 entry;
};