// Copyright 2008 Dolphin Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

// ELF File Types
#define ET_NONE 0         // No file type
#define ET_REL 1          // Relocatable file
#define ET_EXEC 2         // Executable file
#define ET_DYN 3          // Shared object file
#define ET_CORE 4         // Core file
#define ET_LOPROC 0xFF00  // Processor specific
#define ET_HIPROC 0xFFFF  // Processor specific

// ELF Machine Types
#define EM_NONE 0         // No machine
#define EM_M32 1          // AT&T WE 32100
#define EM_SPARC 2        // SPARC
#define EM_386 3          // Intel Architecture
#define EM_68K 4          // Motorola 68000
#define EM_88K 5          // Motorola 88000
#define EM_860 6          // Intel 80860
#define EM_MIPS 7         // MIPS RS3000 Big-Endian
#define EM_MIPS_RS4_BE 8  // MIPS RS4000 Big-Endian
#define EM_ARM 40         // ARM/Thumb Architecture

// ELF Version Types
#define EV_NONE 0     // Invalid version
#define EV_CURRENT 1  // Current version

// ELF Section Header Types
#define SHT_NULL 0
#define SHT_PROGBITS 1
#define SHT_SYMTAB 2
#define SHT_STRTAB 3
#define SHT_RELA 4
#define SHT_HASH 5
#define SHT_DYNAMIC 6
#define SHT_NOTE 7
#define SHT_NOBITS 8
#define SHT_REL 9
#define SHT_SHLIB 10
#define SHT_DYNSYM 11

struct ELF_Header
{
  unsigned char ID[4];
  unsigned char clazz;
  unsigned char data;
  unsigned char version;
  unsigned char pad[9];
  unsigned short e_type;     // ELF file type
  unsigned short e_machine;  // ELF target machine
  unsigned int e_version;    // ELF file version number
  unsigned int e_entry;
  unsigned int e_phoff;
  unsigned int e_shoff;
  unsigned int e_flags;
  unsigned short e_ehsize;
  unsigned short e_phentsize;
  unsigned short e_phnum;
  unsigned short e_shentsize;
  unsigned short e_shnum;
  unsigned short e_shtrndx;
};

struct Program_Header
{
  unsigned int type;
  unsigned int offset;
  unsigned int vaddr;
  unsigned int paddr;
  unsigned int filesz;
  unsigned int memsz;
  unsigned int flags;
  unsigned int align;
};

struct Section_Header
{
  unsigned int name;
  unsigned int type;
  unsigned int flags;
  unsigned int addr;
  unsigned int offset;
  unsigned int size;
  unsigned int link;
  unsigned int info;
  unsigned int addralign;
  unsigned int entsize;
};

struct Symbol_Header
{
  unsigned int name;
  unsigned int value;
  unsigned int size;
  unsigned char info;
  unsigned char other;
  unsigned short shndx;
};

struct Rela_Header
{
  unsigned int offset;
  unsigned int info;
  signed int addend;
};

const char ELFID[4] = {0x7F, 'E', 'L', 'F'};
