OSDN Git Service

FDDブートに変更
[tryos/TryOS.git] / Boot / Source / Elf.h
diff --git a/Boot/Source/Elf.h b/Boot/Source/Elf.h
new file mode 100644 (file)
index 0000000..4d5e203
--- /dev/null
@@ -0,0 +1,482 @@
+#ifndef _LINUX_ELF_H
+#define _LINUX_ELF_H
+
+//#include <asm/elf.h>
+
+//typedef unsigned long        Elf32_Addr;
+//typedef unsigned short       Elf32_Half;
+//typedef unsigned long        Elf32_Off;
+//typedef long         Elf32_Sword;
+//typedef unsigned long        Elf32_Word;
+
+/* These constants are for the segment types stored in the image headers */
+#define PT_NULL    0
+#define PT_LOAD    1
+#define PT_DYNAMIC 2
+#define PT_INTERP  3
+#define PT_NOTE    4
+#define PT_SHLIB   5
+#define PT_PHDR    6
+#define PT_LOPROC  0x70000000
+#define PT_HIPROC  0x7fffffff
+
+/* These constants define the different elf file types */
+#define ET_NONE   0
+#define ET_REL    1
+#define ET_EXEC   2
+#define ET_DYN    3
+#define ET_CORE   4
+#define ET_LOPROC 5
+#define ET_HIPROC 6
+
+/* These constants define the various ELF target machines */
+#define EM_NONE  0
+#define EM_M32   1
+#define EM_SPARC 2
+#define EM_386   3
+#define EM_68K   4
+#define EM_88K   5
+#define EM_486   6   /* Perhaps disused */
+#define EM_860   7
+
+#define EM_MIPS                8       /* MIPS R3000 (officially, big-endian only) */
+
+#define EM_MIPS_RS4_BE 10      /* MIPS R4000 big-endian */
+
+#define EM_SPARC64     11      /* SPARC v9 (not official) 64-bit */
+
+#define EM_PARISC      15      /* HPPA */
+
+#define EM_SPARC32PLUS 18      /* Sun's "v8plus" */
+
+#define EM_PPC        20       /* PowerPC */
+
+/*
+ * This is an interim value that we will use until the committee comes
+ * up with a final number.
+ */
+#define EM_ALPHA       0x9026
+
+
+/* This is the info that is needed to parse the dynamic section of the file */
+#define DT_NULL                0
+#define DT_NEEDED      1
+#define DT_PLTRELSZ    2
+#define DT_PLTGOT      3
+#define DT_HASH                4
+#define DT_STRTAB      5
+#define DT_SYMTAB      6
+#define DT_RELA                7
+#define DT_RELASZ      8
+#define DT_RELAENT     9
+#define DT_STRSZ       10
+#define DT_SYMENT      11
+#define DT_INIT                12
+#define DT_FINI                13
+#define DT_SONAME      14
+#define DT_RPATH       15
+#define DT_SYMBOLIC    16
+#define DT_REL         17
+#define DT_RELSZ       18
+#define DT_RELENT      19
+#define DT_PLTREL      20
+#define DT_DEBUG       21
+#define DT_TEXTREL     22
+#define DT_JMPREL      23
+#define DT_LOPROC      0x70000000
+#define DT_HIPROC      0x7fffffff
+
+/* This info is needed when parsing the symbol table */
+#define STB_LOCAL  0
+#define STB_GLOBAL 1
+#define STB_WEAK   2
+
+#define STT_NOTYPE  0
+#define STT_OBJECT  1
+#define STT_FUNC    2
+#define STT_SECTION 3
+#define STT_FILE    4
+
+#define ELF32_ST_BIND(x) ((x) >> 4)
+#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
+
+/* Symbolic values for the entries in the auxiliary table
+   put on the initial stack */
+#define AT_NULL   0    /* end of vector */
+#define AT_IGNORE 1    /* entry should be ignored */
+#define AT_EXECFD 2    /* file descriptor of program */
+#define AT_PHDR   3    /* program headers for program */
+#define AT_PHENT  4    /* size of program header entry */
+#define AT_PHNUM  5    /* number of program headers */
+#define AT_PAGESZ 6    /* system page size */
+#define AT_BASE   7    /* base address of interpreter */
+#define AT_FLAGS  8    /* flags */
+#define AT_ENTRY  9    /* entry point of program */
+#define AT_NOTELF 10   /* program is not ELF */
+#define AT_UID    11   /* real uid */
+#define AT_EUID   12   /* effective uid */
+#define AT_GID    13   /* real gid */
+#define AT_EGID   14   /* effective gid */
+
+
+//typedef struct dynamic{
+//  Elf32_Sword d_tag;
+//  union{
+//    Elf32_Sword      d_val;
+//    Elf32_Addr       d_ptr;
+//  } d_un;
+//} Elf32_Dyn;
+
+//typedef struct {
+//  unsigned long long d_tag;          /* entry tag value */
+//  union {
+//    unsigned long long d_val;
+//    unsigned long long d_ptr;
+//  } d_un;
+//} Elf64_Dyn;
+
+/* The following are used with relocations */
+#define ELF32_R_SYM(x) ((x) >> 8)
+#define ELF32_R_TYPE(x) ((x) & 0xff)
+
+#define R_386_NONE     0
+#define R_386_32       1
+#define R_386_PC32     2
+#define R_386_GOT32    3
+#define R_386_PLT32    4
+#define R_386_COPY     5
+#define R_386_GLOB_DAT 6
+#define R_386_JMP_SLOT 7
+#define R_386_RELATIVE 8
+#define R_386_GOTOFF   9
+#define R_386_GOTPC    10
+#define R_386_NUM      11
+
+//typedef struct elf32_rel {
+//  Elf32_Addr r_offset;
+//  Elf32_Word r_info;
+//} Elf32_Rel;
+
+//typedef struct elf64_rel {
+//  unsigned long long r_offset;       /* Location at which to apply the action */
+//  unsigned long long r_info; /* index and type of relocation */
+//} Elf64_Rel;
+
+//typedef struct elf32_rela{
+//  Elf32_Addr r_offset;
+//  Elf32_Word r_info;
+//  Elf32_Sword        r_addend;
+//} Elf32_Rela;
+
+//typedef struct elf64_rela {
+//  unsigned long long r_offset;       /* Location at which to apply the action */
+//  unsigned long long r_info; /* index and type of relocation */
+//  unsigned long long r_addend;       /* Constant addend used to compute value */
+//} Elf64_Rela;
+
+//typedef struct elf32_sym{
+//  Elf32_Word st_name;
+//  Elf32_Addr st_value;
+//  Elf32_Word st_size;
+//  unsigned char      st_info;
+//  unsigned char      st_other;
+//  Elf32_Half st_shndx;
+//} Elf32_Sym;
+
+//typedef struct elf64_sym {
+//  unsigned int       st_name;                /* Symbol name, index in string tbl */
+//  unsigned char      st_info;                /* Type and binding attributes */
+//  unsigned char      st_other;               /* No defined meaning, 0 */
+//  unsigned short st_shndx;           /* Associated section index */
+//  unsigned long long st_value;               /* Value of the symbol */
+//  unsigned long long st_size;                /* Associated symbol size */
+//} Elf64_Sym;
+
+
+#define EI_NIDENT      16
+
+// ELFヘッダ
+//typedef struct elf32_hdr{
+//  unsigned char      e_ident[EI_NIDENT];
+//  Elf32_Half e_type;
+//  Elf32_Half e_machine;
+//  Elf32_Word e_version;
+//  Elf32_Addr e_entry;  /* Entry point */
+//  Elf32_Off  e_phoff;
+//  Elf32_Off  e_shoff;
+//  Elf32_Word e_flags;
+//  Elf32_Half e_ehsize;
+//  Elf32_Half e_phentsize;
+//  Elf32_Half e_phnum;
+//  Elf32_Half e_shentsize;
+//  Elf32_Half e_shnum;
+//  Elf32_Half e_shstrndx;
+//} Elf32_Ehdr;
+// シグネチャ 0x7f, 'E', 'L', 'F'
+#define EH_ID_SIGNATURE (0)
+#define EH_ID_SIGNATURE_SIZE (4)
+// 32, 64区分
+#define EH_ID_CLASS (EH_ID_SIGNATURE + EH_ID_SIGNATURE_SIZE)
+#define EH_ID_CLASS_SIZE (1)
+// エンディアン
+#define EH_ID_ENDIAN (EH_ID_CLASS + EH_ID_CLASS_SIZE)
+#define EH_ID_ENDIAN_SIZE (1)
+// バージョン
+#define EH_ID_VERSION (EH_ID_ENDIAN + EH_ID_ENDIAN_SIZE)
+#define EH_ID_VERSION_SIZE (1)
+// ABIタイプ
+#define EH_ID_ABI (EH_ID_VERSION + EH_ID_VERSION_SIZE)
+#define EH_ID_ABI_SIZE (1)
+// ABIバージョン
+#define EH_ID_ABI_VERSION (EH_ID_ABI + EH_ID_ABI_SIZE)
+#define EH_ID_ABI_VERSION_SIZE (1)
+// 予約
+#define EH_ID_RESERVED (EH_ID_ABI_VERSION + EH_ID_ABI_VERSION_SIZE)
+#define EH_ID_RESERVED_SIZE (7)
+// ファイルタイプ
+#define EH_FILE_TYPE (EH_ID_RESERVED + EH_ID_RESERVED_SIZE)
+#define EH_FILE_TYPE_SIZE (2)
+// アーキテクチャ
+#define EH_ARCHITECTURE (EH_FILE_TYPE + EH_FILE_TYPE_SIZE)
+#define EH_ARCHITECTURE_SIZE (2)
+// バージョン
+#define EH_VERSION (EH_ARCHITECTURE + EH_ARCHITECTURE_SIZE)
+#define EH_VERSION_SIZE (4)
+// エントリポイント
+#define EH_ENTRYPOINT (EH_VERSION + EH_VERSION_SIZE)
+#define EH_ENTRYPOINT_SIZE (4)
+// プログラム・ヘッダ・オフセット
+#define EH_PROGRAM_HEADER_OFFSET (EH_ENTRYPOINT + EH_ENTRYPOINT_SIZE)
+#define EH_PROGRAM_HEADER_OFFSET_SIZE (4)
+// セクション・ヘッダ・オフセット
+#define EH_SECTION_HEADER_OFFSET (EH_PROGRAM_HEADER_OFFSET + EH_PROGRAM_HEADER_OFFSET_SIZE)
+#define EH_SECTION_HEADER_OFFSET_SIZE (4)
+// フラグ(未使用らしい。)
+#define EH_FLAGS (EH_SECTION_HEADER_OFFSET + EH_SECTION_HEADER_OFFSET_SIZE)
+#define EH_FLAGS_SIZE (4)
+// ELFヘッダサイズ
+#define EH_EH_SIZE (EH_FLAGS + EH_FLAGS_SIZE)
+#define EH_EH_SIZE_SIZE (2)
+// プログラム・ヘッダ・サイズ
+#define EH_PROGRAM_HEADER_SIZE (EH_EH_SIZE + EH_EH_SIZE_SIZE)
+#define EH_PROGRAM_HEADER_SIZE_SIZE (2)
+// プログラム・ヘッダ数
+#define EH_NUM_PROGRAM_HEADER (EH_PROGRAM_HEADER_SIZE + EH_PROGRAM_HEADER_SIZE_SIZE)
+#define EH_NUM_PH_SIZE (2)
+// セクション・ヘッダ・サイズ
+#define EH_SECTION_HEADER_SIZE (EH_NUM_PROGRAM_HEADER + EH_NUM_PH_SIZE)
+#define EH_SECTION_HEADER_SIZE_SIZE (2)
+// セクション・ヘッダ数
+#define EH_NUM_SECTION_HEADER (EH_SECTION_HEADER_SIZE + EH_SECTION_HEADER_SIZE_SIZE)
+#define EH_NUM_SECTION_HEADER_SIZE (2)
+// セクション名番号
+#define EH_SECTION_STRING_INDEX (EH_NUM_SECTION_HEADER + EH_NUM_SECTION_HEADER_SIZE)
+#define EH_SECTION_STRING_INDEX_SIZE (2)
+
+
+
+
+//typedef struct elf64_hdr {
+//  unsigned char      e_ident[16];            /* ELF "magic number" */
+//  short int e_type;
+//  short unsigned int e_machine;
+//  int   e_version;
+//  unsigned long long e_entry;                /* Entry point virtual address */
+//  unsigned long long e_phoff;                /* Program header table file offset */
+//  unsigned long long e_shoff;                /* Section header table file offset */
+//  int   e_flags;
+//  short int e_ehsize;
+//  short int e_phentsize;
+//  short int e_phnum;
+//  short int e_shentsize;
+//  short int e_shnum;
+//  short int e_shstrndx;
+//} Elf64_Ehdr;
+
+/* These constants define the permissions on sections in the program
+   header, p_flags. */
+#define PF_R           0x4
+#define PF_W           0x2
+#define PF_X           0x1
+
+//typedef struct elf32_phdr{
+//  Elf32_Word p_type;
+//  Elf32_Off  p_offset;
+//  Elf32_Addr p_vaddr;
+//  Elf32_Addr p_paddr;
+//  Elf32_Word p_filesz;
+//  Elf32_Word p_memsz;
+//  Elf32_Word p_flags;
+//  Elf32_Word p_align;
+//} Elf32_Phdr;
+
+// セグメント・タイプ
+#define PH_TYPE (0)
+#define PH_TYPE_SIZE (4)
+// セグメント位置
+#define PH_OFFSET (PH_TYPE + PH_TYPE_SIZE)
+#define PH_OFFSET_SIZE (4)
+// 仮想アドレス
+#define PH_VIRTUAL_ADDRESS (PH_OFFSET + PH_OFFSET_SIZE)
+#define PH_VIRTUAL_ADDRESS_SIZE (4)
+// 物理アドレス
+#define PH_PHYSICAL_ADDRESS (PH_VIRTUAL_ADDRESS + PH_VIRTUAL_ADDRESS_SIZE)
+#define PH_PHYSICAL_ADDRESS_SIZE (4)
+// セグメント・サイズ
+#define PH_SEGMENT_SIZE (PH_PHYSICAL_ADDRESS + PH_PHYSICAL_ADDRESS_SIZE)
+#define PH_SEGMENT_SIZE_SIZE (4)
+// メモリ・サイズ
+#define PH_MEMORY_SIZE (PH_SEGMENT_SIZE + PH_SEGMENT_SIZE_SIZE)
+#define PH_MEMORY_SIZE_SIZE (4)
+// フラグ
+#define PH_FLAGS (PH_MEMORY_SIZE + PH_MEMORY_SIZE_SIZE)
+#define PH_FLAGS_SIZE (4)
+// アライメント
+#define PH_ALIGN (PH_FLAGS + PH_FLAGS_SIZE)
+#define PH_ALIGN_SIZE (4)
+
+//typedef struct elf64_phdr {
+//  int p_type;
+//  int p_flags;
+//  unsigned long long p_offset;               /* Segment file offset */
+//  unsigned long long p_vaddr;                /* Segment virtual address */
+//  unsigned long long p_paddr;                /* Segment physical address */
+//  unsigned long long p_filesz;               /* Segment size in file */
+//  unsigned long long p_memsz;                /* Segment size in memory */
+//  unsigned long long p_align;                /* Segment alignment, file & memory */
+//} Elf64_Phdr;
+
+/* sh_type */
+#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
+#define SHT_NUM                12
+#define SHT_LOPROC     0x70000000
+#define SHT_HIPROC     0x7fffffff
+#define SHT_LOUSER     0x80000000
+#define SHT_HIUSER     0xffffffff
+
+/* sh_flags */
+#define SHF_WRITE      0x1
+#define SHF_ALLOC      0x2
+#define SHF_EXECINSTR  0x4
+#define SHF_MASKPROC   0xf0000000
+
+/* special section indexes */
+#define SHN_UNDEF      0
+#define SHN_LORESERVE  0xff00
+#define SHN_LOPROC     0xff00
+#define SHN_HIPROC     0xff1f
+#define SHN_ABS                0xfff1
+#define SHN_COMMON     0xfff2
+#define SHN_HIRESERVE  0xffff
+
+//typedef struct {
+//  Elf32_Word sh_name;
+//  Elf32_Word sh_type;
+//  Elf32_Word sh_flags;
+//  Elf32_Addr sh_addr;
+//  Elf32_Off  sh_offset;
+//  Elf32_Word sh_size;
+//  Elf32_Word sh_link;
+//  Elf32_Word sh_info;
+//  Elf32_Word sh_addralign;
+//  Elf32_Word sh_entsize;
+//} Elf32_Shdr;
+
+//typedef struct elf64_shdr {
+//  unsigned int       sh_name;                /* Section name, index in string tbl */
+//  unsigned int       sh_type;                /* Type of section */
+//  unsigned long long sh_flags;               /* Miscellaneous section attributes */
+//  unsigned long long sh_addr;                /* Section virtual addr at execution */
+//  unsigned long long sh_offset;              /* Section file offset */
+//  unsigned long long sh_size;                /* Size of section in bytes */
+//  unsigned int       sh_link;                /* Index of another section */
+//  unsigned int       sh_info;                /* Additional section information */
+//  unsigned long long sh_addralign;   /* Section alignment */
+//  unsigned long long sh_entsize;     /* Entry size if section holds table */
+//} Elf64_Shdr;
+
+#define        EI_MAG0         0               /* e_ident[] indexes */
+#define        EI_MAG1         1
+#define        EI_MAG2         2
+#define        EI_MAG3         3
+#define        EI_CLASS        4
+#define        EI_DATA         5
+#define        EI_VERSION      6
+#define        EI_PAD          7
+
+#define        ELFMAG0         0x7f            /* EI_MAG */
+#define        ELFMAG1         'E'
+#define        ELFMAG2         'L'
+#define        ELFMAG3         'F'
+#define        ELFMAG          "\177ELF"
+#define        SELFMAG         4
+
+#define        ELFCLASSNONE    0               /* EI_CLASS */
+#define        ELFCLASS32      1
+#define        ELFCLASS64      2
+#define        ELFCLASSNUM     3
+
+#define ELFDATANONE    0               /* e_ident[EI_DATA] */
+#define ELFDATA2LSB    1
+#define ELFDATA2MSB    2
+
+#define EV_NONE                0               /* e_version, EI_VERSION */
+#define EV_CURRENT     1
+#define EV_NUM         2
+
+/* Notes used in ET_CORE */
+#define NT_PRSTATUS    1
+#define NT_PRFPREG     2
+#define NT_PRPSINFO    3
+#define NT_TASKSTRUCT  4
+
+/* Note header in a PT_NOTE section */
+//typedef struct elf32_note {
+//  Elf32_Word n_namesz;       /* Name size */
+//  Elf32_Word n_descsz;       /* Content size */
+//  Elf32_Word n_type;         /* Content type */
+//} Elf32_Nhdr;
+
+/* Note header in a PT_NOTE section */
+/*
+ * For now we use the 32 bit version of the structure until we figure
+ * out whether we need anything better.  Note - on the Alpha, "unsigned int"
+ * is only 32 bits.
+ */
+//typedef struct elf64_note {
+//  unsigned int       n_namesz;       /* Name size */
+//  unsigned int       n_descsz;       /* Content size */
+//  unsigned int       n_type;         /* Content type */
+//} Elf64_Nhdr;
+
+#define ELF_START_MMAP 0x80000000
+
+#if ELF_CLASS == ELFCLASS32
+
+extern Elf32_Dyn _DYNAMIC [];
+#define elfhdr         elf32_hdr
+#define elf_phdr       elf32_phdr
+#define elf_note       elf32_note
+
+#else
+
+//extern Elf64_Dyn _DYNAMIC [];
+#define elfhdr         elf64_hdr
+#define elf_phdr       elf64_phdr
+#define elf_note       elf64_note
+
+#endif
+
+
+#endif /* _LINUX_ELF_H */