2012-11-15 00:39:56 +01:00
|
|
|
#pragma once
|
|
|
|
|
#include "Loader.h"
|
|
|
|
|
|
2014-08-25 16:56:13 +02:00
|
|
|
struct vfsStream;
|
|
|
|
|
class rFile;
|
|
|
|
|
|
2012-11-15 00:39:56 +01:00
|
|
|
struct Elf32_Ehdr
|
|
|
|
|
{
|
|
|
|
|
u32 e_magic;
|
|
|
|
|
u8 e_class;
|
|
|
|
|
u8 e_data;
|
|
|
|
|
u8 e_curver;
|
|
|
|
|
u8 e_os_abi;
|
|
|
|
|
u64 e_abi_ver;
|
|
|
|
|
u16 e_type;
|
|
|
|
|
u16 e_machine;
|
|
|
|
|
u32 e_version;
|
2014-11-03 12:35:50 +01:00
|
|
|
u32 e_entry;
|
2012-11-15 00:39:56 +01:00
|
|
|
u32 e_phoff;
|
|
|
|
|
u32 e_shoff;
|
|
|
|
|
u32 e_flags;
|
|
|
|
|
u16 e_ehsize;
|
|
|
|
|
u16 e_phentsize;
|
|
|
|
|
u16 e_phnum;
|
|
|
|
|
u16 e_shentsize;
|
|
|
|
|
u16 e_shnum;
|
|
|
|
|
u16 e_shstrndx;
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Show();
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2013-11-05 19:12:18 +01:00
|
|
|
bool IsLittleEndian() const
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
2013-11-05 19:12:18 +01:00
|
|
|
return e_data == 1;
|
2012-11-15 00:39:56 +01:00
|
|
|
}
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Load(vfsStream& f);
|
2013-10-28 22:58:03 +01:00
|
|
|
|
2012-11-15 00:39:56 +01:00
|
|
|
bool CheckMagic() const { return e_magic == 0x7F454C46; }
|
|
|
|
|
u32 GetEntry() const { return e_entry; }
|
|
|
|
|
};
|
|
|
|
|
|
2013-07-12 14:42:17 +02:00
|
|
|
struct Elf32_Desc
|
|
|
|
|
{
|
|
|
|
|
u32 revision;
|
|
|
|
|
u32 ls_size;
|
|
|
|
|
u32 stack_size;
|
|
|
|
|
u32 flags;
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Load(vfsStream& f);
|
2013-10-28 22:58:03 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void LoadLE(vfsStream& f);
|
2013-07-12 14:42:17 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Elf32_Note
|
|
|
|
|
{
|
|
|
|
|
u32 namesz;
|
|
|
|
|
u32 descsz;
|
|
|
|
|
u32 type;
|
|
|
|
|
u8 name[8];
|
2013-08-03 11:40:03 +02:00
|
|
|
union
|
|
|
|
|
{
|
|
|
|
|
Elf32_Desc desc;
|
|
|
|
|
char desc_text[32];
|
|
|
|
|
};
|
2013-07-12 14:42:17 +02:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Load(vfsStream& f);
|
2013-10-28 22:58:03 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void LoadLE(vfsStream& f);
|
2013-07-12 14:42:17 +02:00
|
|
|
};
|
|
|
|
|
|
2012-11-15 00:39:56 +01:00
|
|
|
struct Elf32_Shdr
|
|
|
|
|
{
|
|
|
|
|
u32 sh_name;
|
|
|
|
|
u32 sh_type;
|
|
|
|
|
u32 sh_flags;
|
|
|
|
|
u32 sh_addr;
|
|
|
|
|
u32 sh_offset;
|
|
|
|
|
u32 sh_size;
|
|
|
|
|
u32 sh_link;
|
|
|
|
|
u32 sh_info;
|
|
|
|
|
u32 sh_addralign;
|
|
|
|
|
u32 sh_entsize;
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Load(vfsStream& f);
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void LoadLE(vfsStream& f);
|
2013-10-28 22:58:03 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Show();
|
2012-11-15 00:39:56 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Elf32_Phdr
|
|
|
|
|
{
|
|
|
|
|
u32 p_type;
|
|
|
|
|
u32 p_offset;
|
|
|
|
|
u32 p_vaddr;
|
|
|
|
|
u32 p_paddr;
|
|
|
|
|
u32 p_filesz;
|
|
|
|
|
u32 p_memsz;
|
|
|
|
|
u32 p_flags;
|
|
|
|
|
u32 p_align;
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Load(vfsStream& f);
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void LoadLE(vfsStream& f);
|
2013-10-28 22:58:03 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
void Show();
|
2012-11-15 00:39:56 +01:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ELF32Loader : public LoaderBase
|
|
|
|
|
{
|
2013-06-30 10:46:29 +02:00
|
|
|
vfsStream& elf32_f;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
Elf32_Ehdr ehdr;
|
2014-04-01 02:33:55 +02:00
|
|
|
std::vector<std::string> shdr_name_arr;
|
2014-04-10 00:54:32 +02:00
|
|
|
std::vector<Elf32_Shdr> shdr_arr;
|
|
|
|
|
std::vector<Elf32_Phdr> phdr_arr;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2013-06-30 10:46:29 +02:00
|
|
|
ELF32Loader(vfsStream& f);
|
2012-11-15 00:39:56 +01:00
|
|
|
~ELF32Loader() {Close();}
|
|
|
|
|
|
|
|
|
|
virtual bool LoadInfo();
|
2013-06-30 10:46:29 +02:00
|
|
|
virtual bool LoadData(u64 offset);
|
2012-11-15 00:39:56 +01:00
|
|
|
virtual bool Close();
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
bool LoadEhdrInfo();
|
|
|
|
|
bool LoadPhdrInfo();
|
|
|
|
|
bool LoadShdrInfo();
|
2013-06-30 10:46:29 +02:00
|
|
|
|
|
|
|
|
bool LoadEhdrData(u64 offset);
|
|
|
|
|
bool LoadPhdrData(u64 offset);
|
|
|
|
|
bool LoadShdrData(u64 offset);
|
2014-03-03 05:48:07 +01:00
|
|
|
};
|
|
|
|
|
|
2014-05-02 08:30:32 +02:00
|
|
|
void WriteEhdr(rFile& f, Elf32_Ehdr& ehdr);
|
|
|
|
|
void WritePhdr(rFile& f, Elf32_Phdr& phdr);
|
|
|
|
|
void WriteShdr(rFile& f, Elf32_Shdr& shdr);
|