2012-11-15 00:39:56 +01:00
|
|
|
#pragma once
|
2014-09-11 00:59:50 +02:00
|
|
|
#include "Loader.h"
|
|
|
|
|
|
2014-09-15 00:17:24 +02:00
|
|
|
struct vfsStream;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
enum ElfClass
|
|
|
|
|
{
|
|
|
|
|
CLASS_Unknown,
|
|
|
|
|
CLASS_ELF32,
|
|
|
|
|
CLASS_ELF64,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
struct Elf_Ehdr
|
|
|
|
|
{
|
|
|
|
|
u32 e_magic;
|
|
|
|
|
u8 e_class;
|
|
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
virtual void Show();
|
2012-11-15 00:39:56 +01:00
|
|
|
|
2014-08-23 22:40:04 +02:00
|
|
|
virtual void Load(vfsStream& f);
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
bool CheckMagic() const { return e_magic == 0x7F454C46; }
|
|
|
|
|
|
2014-03-24 13:47:30 +01:00
|
|
|
ElfClass GetClass() const
|
2012-11-15 00:39:56 +01:00
|
|
|
{
|
|
|
|
|
switch(e_class)
|
|
|
|
|
{
|
|
|
|
|
case 1: return CLASS_ELF32;
|
|
|
|
|
case 2: return CLASS_ELF64;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return CLASS_Unknown;
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
class ELFLoader : public LoaderBase
|
|
|
|
|
{
|
2014-09-11 00:59:50 +02:00
|
|
|
vfsStream& m_elf_file;
|
|
|
|
|
LoaderBase* m_loader;
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
Elf_Ehdr ehdr;
|
|
|
|
|
|
2013-06-30 10:46:29 +02:00
|
|
|
ELFLoader(vfsStream& f);
|
2014-09-11 00:59:50 +02:00
|
|
|
virtual ~ELFLoader()
|
|
|
|
|
{
|
|
|
|
|
Close();
|
|
|
|
|
}
|
2012-11-15 00:39:56 +01:00
|
|
|
|
|
|
|
|
virtual bool LoadInfo();
|
2013-06-30 10:46:29 +02:00
|
|
|
virtual bool LoadData(u64 offset = 0);
|
2012-11-15 00:39:56 +01:00
|
|
|
virtual bool Close();
|
|
|
|
|
};
|