LibELF: Add 32 bit support

This commit is contained in:
Bananymous
2023-04-22 18:57:24 +03:00
parent fb6add2b4a
commit 850ff93940
3 changed files with 332 additions and 71 deletions

View File

@@ -2,6 +2,7 @@
#include <BAN/StringView.h>
#include <BAN/Vector.h>
#include <kernel/Arch.h>
#include "Types.h"
namespace LibELF
@@ -11,16 +12,40 @@ namespace LibELF
{
public:
static BAN::ErrorOr<ELF*> load_from_file(BAN::StringView);
const Elf64FileHeader& file_header64() const;
const Elf64ProgramHeader& program_header64(size_t) const;
const Elf64SectionHeader& section_header64(size_t) const;
const char* lookup_section_name64(uint32_t) const;
const char* lookup_string64(size_t, uint32_t) const;
#if ARCH(x86_64)
const Elf64FileHeader& file_header_native() const { return file_header64(); }
const Elf64ProgramHeader& program_header_native(size_t index) const { return program_header64(index); }
const Elf64SectionHeader& section_header_native(size_t index) const { return section_header64(index); }
const char* lookup_section_name_native(uint32_t offset) const { return lookup_section_name64(offset); }
const char* lookup_string_native(size_t table_index, uint32_t offset) const { return lookup_string64(table_index, offset); }
bool is_native() const { return is_x86_64(); }
#endif
const char* lookup_section_name(uint32_t) const;
const char* lookup_string(size_t, uint32_t) const;
const Elf32FileHeader& file_header32() const;
const Elf32ProgramHeader& program_header32(size_t) const;
const Elf32SectionHeader& section_header32(size_t) const;
const char* lookup_section_name32(uint32_t) const;
const char* lookup_string32(size_t, uint32_t) const;
#if ARCH(i386)
const Elf32FileHeader& file_header_native() const { return file_header32(); }
const Elf32ProgramHeader& program_header_native(size_t index) const { return program_header32(index); }
const Elf32SectionHeader& section_header_native(size_t index) const { return section_header32(index); }
const char* lookup_section_name_native(uint32_t offset) const { return lookup_section_name32(offset); }
const char* lookup_string_native(size_t table_index, uint32_t offset) const { return lookup_string32(table_index, offset); }
bool is_native() const { return is_x86_32(); }
#endif
const uint8_t* data() const { return m_data.data(); }
bool is_x86_32() const;
bool is_x86_64() const;
private:
ELF(BAN::Vector<uint8_t>&& data)
: m_data(BAN::move(data))
@@ -31,6 +56,10 @@ namespace LibELF
bool parse_elf64_program_header(const Elf64ProgramHeader&);
bool parse_elf64_section_header(const Elf64SectionHeader&);
bool parse_elf32_file_header(const Elf32FileHeader&);
bool parse_elf32_program_header(const Elf32ProgramHeader&);
bool parse_elf32_section_header(const Elf32SectionHeader&);
private:
const BAN::Vector<uint8_t> m_data;
};

View File

@@ -5,6 +5,80 @@
namespace LibELF
{
using Elf32Addr = uint32_t;
using Elf32Off = uint32_t;
using Elf32Half = uint16_t;
using Elf32Word = uint32_t;
using Elf32Sword = int32_t;
struct Elf32FileHeader
{
unsigned char e_ident[16];
Elf32Half e_type;
Elf32Half e_machine;
Elf32Word e_version;
Elf32Addr e_entry;
Elf32Off e_phoff;
Elf32Off e_shoff;
Elf32Word e_flags;
Elf32Half e_ehsize;
Elf32Half e_phentsize;
Elf32Half e_phnum;
Elf32Half e_shentsize;
Elf32Half e_shnum;
Elf32Half e_shstrndx;
};
struct Elf32SectionHeader
{
Elf32Word sh_name;
Elf32Word sh_type;
Elf32Word sh_flags;
Elf32Addr sh_addr;
Elf32Off sh_offset;
Elf32Word sh_size;
Elf32Word sh_link;
Elf32Word sh_info;
Elf32Word sh_addralign;
Elf32Word sh_entsize;
};
struct Elf32Symbol
{
Elf32Word st_name;
Elf32Addr st_value;
Elf32Word st_size;
unsigned char st_info;
unsigned char st_other;
Elf32Half st_shndx;
};
struct Elf32Relocation
{
Elf32Addr r_offset;
Elf32Word r_info;
};
struct Elf32RelocationA
{
Elf32Addr r_offset;
Elf32Word r_info;
Elf32Sword r_addend;
};
struct Elf32ProgramHeader
{
Elf32Word p_type;
Elf32Off p_offset;
Elf32Addr p_vaddr;
Elf32Addr p_paddr;
Elf32Word p_filesz;
Elf32Word p_memsz;
Elf32Word p_flags;
Elf32Word p_align;
};
using Elf64Addr = uint64_t;
using Elf64Off = uint64_t;
using Elf64Half = uint16_t;