diff options
Diffstat (limited to 'include/elf.h')
-rw-r--r-- | include/elf.h | 306 |
1 files changed, 153 insertions, 153 deletions
diff --git a/include/elf.h b/include/elf.h index a43e5c3..bbd5e38 100644 --- a/include/elf.h +++ b/include/elf.h @@ -18,209 +18,209 @@ */ // ELF data types (TIS ELF Spec v1.2, May 1995 -typedef uint32_t e32_a; // 32-bit unsigned address -typedef uint16_t e32_h; // 16-bit unsigned "medium" integer -typedef uint32_t e32_o; // 32-bit unsigned offset -typedef int32_t e32_sw; // 32-bit signed "large" integer -typedef uint32_t e32_w; // 32-bit unsigned "large" integer -typedef uint8_t e32_si; // 8-bit unsigned "small" integer +typedef uint32_t e32_a; // 32-bit unsigned address +typedef uint16_t e32_h; // 16-bit unsigned "medium" integer +typedef uint32_t e32_o; // 32-bit unsigned offset +typedef int32_t e32_sw; // 32-bit signed "large" integer +typedef uint32_t e32_w; // 32-bit unsigned "large" integer +typedef uint8_t e32_si; // 8-bit unsigned "small" integer // ELF magic number - first four bytes -#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little-endian order -#define EI_NIDENT 16 +#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little-endian order +#define EI_NIDENT 16 union elfident_u { - uint8_t bytes[EI_NIDENT]; // array of 16 bytes + uint8_t bytes[EI_NIDENT]; // array of 16 bytes struct { - uint32_t magic; // magic number - uint8_t class; // file class - uint8_t data; // data encoding - uint8_t version; // file version - uint8_t osabi; // OS ABI identification - uint8_t abivers; // ABI version - uint8_t pad[7]; // padding to 16 bytes + uint32_t magic; // magic number + uint8_t class; // file class + uint8_t data; // data encoding + uint8_t version; // file version + uint8_t osabi; // OS ABI identification + uint8_t abivers; // ABI version + uint8_t pad[7]; // padding to 16 bytes } f; }; // indices for byte fields in the ident array -#define EI_MAGIC 0 -# define EI_MAG0 EI_MAGIC -# 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_OSABI 7 -#define EI_ABIVERSION 8 +#define EI_MAGIC 0 +#define EI_MAG0 EI_MAGIC +#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_OSABI 7 +#define EI_ABIVERSION 8 // ELF classes -#define ELF_CLASS_NONE 0 -#define ELF_CLASS_32 1 // 32-bit objects -#define ELF_CLASS_64 2 // 64-bit objects +#define ELF_CLASS_NONE 0 +#define ELF_CLASS_32 1 // 32-bit objects +#define ELF_CLASS_64 2 // 64-bit objects // ELF data encoding -#define ELF_DATA_NONE 0 // invalid data encoding -#define ELF_DATA_2LSB 1 // two's complement little-endian -#define ELF_DATA_2MSB 2 // two's complement big-endian +#define ELF_DATA_NONE 0 // invalid data encoding +#define ELF_DATA_2LSB 1 // two's complement little-endian +#define ELF_DATA_2MSB 2 // two's complement big-endian // ELF versions -#define ELF_VERSION__NONE 0 // invalid version -# define EV_NONE ELF_VERSION_NONE -#define ELF_VERSION__CURRENT 1 // current version -# define EV_CURRENT ELF_VERSION_CURRENT +#define ELF_VERSION__NONE 0 // invalid version +#define EV_NONE ELF_VERSION_NONE +#define ELF_VERSION__CURRENT 1 // current version +#define EV_CURRENT ELF_VERSION_CURRENT // ELF header // // field names are from the TIS ELF Spec v1.2, May 1995 typedef struct elfhdr_s { - union elfident_u e_ident; // file identification - e32_h e_type; // file type - e32_h e_machine; // required architecture - e32_w e_version; // object file version - e32_a e_entry; // entry point (VA) - e32_o e_phoff; // offset to program header table (PHT) - e32_o e_shoff; // offset to section header table (SHT) - e32_w e_flags; // processor-specific flags - e32_h e_ehsize; // ELF header size (bytes) - e32_h e_phentsize; // size of one PHT entry (bytes) - e32_h e_phnum; // number of PHT entries - e32_h e_shentsize; // size of one SHT entry (bytes) - e32_h e_shnum; // number of SHT entries - e32_h e_shstrndx; // SHT index of the sect. name string table + union elfident_u e_ident; // file identification + e32_h e_type; // file type + e32_h e_machine; // required architecture + e32_w e_version; // object file version + e32_a e_entry; // entry point (VA) + e32_o e_phoff; // offset to program header table (PHT) + e32_o e_shoff; // offset to section header table (SHT) + e32_w e_flags; // processor-specific flags + e32_h e_ehsize; // ELF header size (bytes) + e32_h e_phentsize; // size of one PHT entry (bytes) + e32_h e_phnum; // number of PHT entries + e32_h e_shentsize; // size of one SHT entry (bytes) + e32_h e_shnum; // number of SHT entries + e32_h e_shstrndx; // SHT index of the sect. name string table } elfhdr_t; -#define SZ_ELFHDR sizeof(elfhdr_t) +#define SZ_ELFHDR sizeof(elfhdr_t) // field values // e_type -#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_LO_OS 0xfe00 // processor-specific -#define ET_HI_OS 0xfeff // processor-specific -#define ET_LO_CP 0xff00 // processor-specific -#define ET_HI_CP 0xffff // processor-specific +#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_LO_OS 0xfe00 // processor-specific +#define ET_HI_OS 0xfeff // processor-specific +#define ET_LO_CP 0xff00 // processor-specific +#define ET_HI_CP 0xffff // processor-specific // e_machine -#define EM_NONE 0x00 // no machine type -#define EM_M32 0x01 // AT&T WE 32100 -#define EM_SPARC 0x02 // SUN SPARC -#define EM_386 0x03 // Intel Architecture -#define EM_68K 0x04 // Motorola 68000 -#define EM_88K 0x05 // Motorola 88000 -#define EM_IAMCU 0x06 // Intel MCU -#define EM_860 0x07 // Intel 80860 -#define EM_MIPS 0x08 // MIPS RS3000 Big-Endian -#define EM_S370 0x09 // IBM System/370 -#define EM_MIPS_RS3_LE 0x0a // MIPS RS3000 Big-Endian -#define EM_SPARC32PLLUS 0x12 // Sun "v8plus" -#define EM_PPC 0x14 // IBM PowerPC -#define EM_PPC64 0x15 // IBM PowerPC 64-bit -#define EM_S390 0x16 // IBM System/390 -#define EM_ARM 0x28 // ARM up to V7/AArch32 -#define EM_SPARCV9 0x2b // SPARC V9 64-bit -#define EM_IA_64 0x32 // Intel Itanium (Merced) -#define EM_MIPS_X 0x32 // Stanford MIPS-X -#define EM_X86_64 0x3E // AMD x86-64 (Intel64) -#define EM_PDP11 0x40 // DEC PDP-11 -#define EM_VAX 0x4b // DEC VAX -#define EM_AARCH64 0xb7 // ARM AArch64 -#define EM_Z80 0xec // Zilog Z-80 -#define EM_AMDGPU 0xf0 // AMD GPU -#define EM_RISCV 0xf3 // RISC-V -#define EM_BPF 0xf7 // Berkeley Packet Filter +#define EM_NONE 0x00 // no machine type +#define EM_M32 0x01 // AT&T WE 32100 +#define EM_SPARC 0x02 // SUN SPARC +#define EM_386 0x03 // Intel Architecture +#define EM_68K 0x04 // Motorola 68000 +#define EM_88K 0x05 // Motorola 88000 +#define EM_IAMCU 0x06 // Intel MCU +#define EM_860 0x07 // Intel 80860 +#define EM_MIPS 0x08 // MIPS RS3000 Big-Endian +#define EM_S370 0x09 // IBM System/370 +#define EM_MIPS_RS3_LE 0x0a // MIPS RS3000 Big-Endian +#define EM_SPARC32PLLUS 0x12 // Sun "v8plus" +#define EM_PPC 0x14 // IBM PowerPC +#define EM_PPC64 0x15 // IBM PowerPC 64-bit +#define EM_S390 0x16 // IBM System/390 +#define EM_ARM 0x28 // ARM up to V7/AArch32 +#define EM_SPARCV9 0x2b // SPARC V9 64-bit +#define EM_IA_64 0x32 // Intel Itanium (Merced) +#define EM_MIPS_X 0x32 // Stanford MIPS-X +#define EM_X86_64 0x3E // AMD x86-64 (Intel64) +#define EM_PDP11 0x40 // DEC PDP-11 +#define EM_VAX 0x4b // DEC VAX +#define EM_AARCH64 0xb7 // ARM AArch64 +#define EM_Z80 0xec // Zilog Z-80 +#define EM_AMDGPU 0xf0 // AMD GPU +#define EM_RISCV 0xf3 // RISC-V +#define EM_BPF 0xf7 // Berkeley Packet Filter // ELF section header // // field names are from the TIS ELF Spec v1.2, May 1995 typedef struct shdr_s { - e32_w sh_name; // section name (index into string table) - e32_w sh_type; // section contents/semantics - e32_w sh_flags; // attribute flag bits - e32_a sh_addr; // 0, or load point of this section in memory - e32_o sh_offset; // byte offset within the file - e32_w sh_size; // section size in bytes - e32_w sh_link; // section header index table link - e32_w sh_info; // "extra information" - e32_w sh_addralign; // required alignment - e32_w sh_entsize; // 0, or size of each entry in the section + e32_w sh_name; // section name (index into string table) + e32_w sh_type; // section contents/semantics + e32_w sh_flags; // attribute flag bits + e32_a sh_addr; // 0, or load point of this section in memory + e32_o sh_offset; // byte offset within the file + e32_w sh_size; // section size in bytes + e32_w sh_link; // section header index table link + e32_w sh_info; // "extra information" + e32_w sh_addralign; // required alignment + e32_w sh_entsize; // 0, or size of each entry in the section } elfsecthdr_t; -#define SZ_ELFSECTHDR sizeof(elfsecthdr_t) +#define SZ_ELFSECTHDR sizeof(elfsecthdr_t) // sh_name -#define SHN_UNDEF 0 +#define SHN_UNDEF 0 // sh_type -#define SHT_NULL 0x00 -#define SHT_PROGBITS 0x01 -#define SHT_SYMTAB 0x02 -#define SHT_STRTAB 0x03 -#define SHT_RELA 0x04 -#define SHT_HASH 0x05 -#define SHT_DYNAMIC 0x06 -#define SHT_NOTE 0x07 -#define SHT_NOBITS 0x08 -#define SHT_REL 0x09 -#define SHT_SHLIB 0x0a -#define SHT_DYNSYM 0x0b -#define SHT_LO_CP 0x70000000 -#define SHT_HI_CP 0x7fffffff -#define SHT_LO_US 0x80000000 -#define SHT_HI_US 0x8fffffff +#define SHT_NULL 0x00 +#define SHT_PROGBITS 0x01 +#define SHT_SYMTAB 0x02 +#define SHT_STRTAB 0x03 +#define SHT_RELA 0x04 +#define SHT_HASH 0x05 +#define SHT_DYNAMIC 0x06 +#define SHT_NOTE 0x07 +#define SHT_NOBITS 0x08 +#define SHT_REL 0x09 +#define SHT_SHLIB 0x0a +#define SHT_DYNSYM 0x0b +#define SHT_LO_CP 0x70000000 +#define SHT_HI_CP 0x7fffffff +#define SHT_LO_US 0x80000000 +#define SHT_HI_US 0x8fffffff // sh_flags -#define SHF_WRITE 0x001 -#define SHF_ALLOC 0x002 -#define SHF_EXECINSTR 0x004 -#define SHF_MERGE 0x010 -#define SHF_STRINGS 0x020 -#define SHF_INFO_LINK 0x040 -#define SHF_LINK_ORDER 0x080 -#define SHF_OS_NONCON 0x100 -#define SHF_GROUP 0x200 -#define SHF_TLS 0x400 -#define SHF_MASKOS 0x0ff00000 -#define SHF_MASKPROC 0xf0000000 +#define SHF_WRITE 0x001 +#define SHF_ALLOC 0x002 +#define SHF_EXECINSTR 0x004 +#define SHF_MERGE 0x010 +#define SHF_STRINGS 0x020 +#define SHF_INFO_LINK 0x040 +#define SHF_LINK_ORDER 0x080 +#define SHF_OS_NONCON 0x100 +#define SHF_GROUP 0x200 +#define SHF_TLS 0x400 +#define SHF_MASKOS 0x0ff00000 +#define SHF_MASKPROC 0xf0000000 // ELF program header // // field names are from the TIS ELF Spec v1.2, May 1995 typedef struct phdr_s { - e32_w p_type; // type of segment - e32_o p_offset; // byte offset in file - e32_a p_va; // load point in memory (virtual address) - e32_a p_pa; // load point in memory (physical address) - e32_w p_filesz; // number of bytes in this file - e32_w p_memsz; // number of bytes in memory - e32_w p_flags; // attribute flag bits - e32_w p_align; // required alignment + e32_w p_type; // type of segment + e32_o p_offset; // byte offset in file + e32_a p_va; // load point in memory (virtual address) + e32_a p_pa; // load point in memory (physical address) + e32_w p_filesz; // number of bytes in this file + e32_w p_memsz; // number of bytes in memory + e32_w p_flags; // attribute flag bits + e32_w p_align; // required alignment } elfproghdr_t; -#define SZ_ELFPROGHDR sizeof(elfproghdr_t) +#define SZ_ELFPROGHDR sizeof(elfproghdr_t) // p_type -#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_TLS 7 -#define PT_LO_OS 0x70000000 -#define PT_HI_OS 0x7fffffff -#define PT_LO_CP 0x70000000 -#define PT_HI_CP 0x7fffffff +#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_TLS 7 +#define PT_LO_OS 0x70000000 +#define PT_HI_OS 0x7fffffff +#define PT_LO_CP 0x70000000 +#define PT_HI_CP 0x7fffffff // p_flags -#define PF_E 0x1 -#define PF_W 0x2 -#define PF_R 0x4 -#define PF_MASKPROC 0xf0000000 +#define PF_E 0x1 +#define PF_W 0x2 +#define PF_R 0x4 +#define PF_MASKPROC 0xf0000000 /* ** Globals @@ -230,6 +230,6 @@ typedef struct phdr_s { ** Prototypes */ -#endif /* !ASM_SRC */ +#endif /* !ASM_SRC */ #endif |