LibELF: Add 32 bit support
This commit is contained in:
@@ -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;
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user