#ifndef _ELFSPEC_H_INCLUDED_
#define _ELFSPEC_H_INCLUDED_
#define EI_NIDENT 16
typedef struct {
uint_8 e_ident[EI_NIDENT]; uint_16 e_type; uint_16 e_machine; uint_32 e_version; uint_32 e_entry; uint_32 e_phoff; uint_32 e_shoff; uint_32 e_flags; uint_16 e_ehsize; uint_16 e_phentsize; uint_16 e_phnum; uint_16 e_shentsize; uint_16 e_shnum; uint_16 e_shstrndx; } Elf32_Ehdr;
typedef struct {
uint_8 e_ident[EI_NIDENT]; uint_16 e_type; uint_16 e_machine; uint_32 e_version; uint_64 e_entry; uint_64 e_phoff; uint_64 e_shoff; uint_32 e_flags; uint_16 e_ehsize; uint_16 e_phentsize; uint_16 e_phnum; uint_16 e_shentsize; uint_16 e_shnum; uint_16 e_shstrndx; } Elf64_Ehdr;
#define ELF_SIGNATURE "\177ELF"
#define ELF_SIGNATURE_LEN 4
#define ELFMAG0 '\177'
#define ELFMAG1 'E'
#define ELFMAG2 'L'
#define ELFMAG3 'F'
#define EI_MAG0 0
#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_PAD 9
#define ELFCLASSNONE 0
#define ELFCLASS32 1
#define ELFCLASS64 2
#define ELFDATANONE 0
#define ELFDATA2LSB 1
#define ELFDATA2MSB 2
#define EV_CURRENT 1
#define ELFOSABI_NONE 0
#define ELFOSABI_HPUX 1
#define ELFOSABI_NETBSD 2
#define ELFOSABI_LINUX 3
#define ELFOSABI_SOLARIS 6
#define ELFOSABI_AIX 7
#define ELFOSABI_IRIX 8
#define ELFOSABI_FREEBSD 9
#define ELFOSABI_TRU64 10
#define ELFOSABI_MODESTO 11
#define ELFOSABI_OPENBSD 12
#define ELFOSABI_OPENVMS 13
#define ELFOSABI_NSK 14
#define ELFOSABI_AROS 15
#define ET_NONE 0
#define ET_REL 1
#define ET_EXEC 2
#define ET_DYN 3
#define ET_CORE 4
#define ET_LOPROC 0xff00
#define ET_HIPROC 0xffff
#define EM_NONE 0
#define EM_386 3
#define EM_IA_64 50
#define EM_X86_64 62
#define EV_NONE 0
#define EV_CURRENT 1
#define EV_WPIBM 2
#define EF_M32_MAU 0x1
#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 {
uint_32 sh_name; uint_32 sh_type; uint_32 sh_flags; uint_32 sh_addr; uint_32 sh_offset; uint_32 sh_size; uint_32 sh_link; uint_32 sh_info; uint_32 sh_addralign; uint_32 sh_entsize; } Elf32_Shdr;
typedef struct {
uint_32 sh_name; uint_32 sh_type; uint_64 sh_flags; uint_64 sh_addr; uint_64 sh_offset; uint_64 sh_size; uint_32 sh_link; uint_32 sh_info; uint_64 sh_addralign; uint_64 sh_entsize; } Elf64_Shdr;
#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_LOOS 0x60000000
#define SHT_OS 0x60000001
#define SHT_IMPORTS 0x60000002
#define SHT_EXPORTS 0x60000003
#define SHT_RES 0x60000004
#define SHT_PROGFRAGS 0x60001001
#define SHT_IDMDLL 0x60001002
#define SHT_DEFLIB 0x60001003
#define SHT_HIOS 0x6fffffff
#define SHT_LOPROC 0x70000000
#define SHT_X86_64_UNWIND 0x70000001
#define SHT_HIPROC 0x7fffffff
#define SHT_LOUSER 0x80000000
#define SHT_HIUSER 0xffffffff
#define SHT_OS_O 12
#define SHT_IMPORTS_O 13
#define SHT_EXPORTS_O 14
#define SHT_RES_O 15
#define SHF_WRITE 0x00000001
#define SHF_ALLOC 0x00000002
#define SHF_EXECINSTR 0x00000004
#define SHF_MERGE 0x00000010
#define SHF_STRINGS 0x00000020
#define SHF_BEGIN 0x01000000
#define SHF_END 0x02000000
#define SHF_MASKPROC 0xf0000000
#define SHF_X86_64_LARGE 0x1000000
#define SHF_ALPHA_GPREL 0x10000000
typedef struct {
uint_32 st_name; uint_32 st_value; uint_32 st_size; uint_8 st_info; uint_8 st_other; uint_16 st_shndx; } Elf32_Sym;
typedef struct {
uint_32 st_name; uint_8 st_info; uint_8 st_other; uint_16 st_shndx; uint_64 st_value; uint_64 st_size; } Elf64_Sym;
#define ELF32_ST_BIND(i) ((i)>>4)
#define ELF32_ST_TYPE(i) ((i)&0xf)
#define ELF32_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
#define ELF64_ST_BIND(i) ((i)>>4)
#define ELF64_ST_TYPE(i) ((i)&0xf)
#define ELF64_ST_INFO(b,t) (((b)<<4)+((t)&0xf))
#define STB_LOCAL 0
#define STB_GLOBAL 1
#define STB_WEAK 2
#define STB_ENTRY 12
#define STB_LOPROC 13
#define STB_HIPROC 15
#define STT_NOTYPE 0
#define STT_OBJECT 1
#define STT_FUNC 2
#define STT_SECTION 3
#define STT_FILE 4
#define STT_COMMON 5
#define STT_IMPORT 11
#define STT_LOPROC 13
#define STT_HIPROC 15
typedef struct {
uint_32 r_offset; uint_32 r_info; } Elf32_Rel;
typedef struct {
uint_32 r_offset; uint_32 r_info; int_32 r_addend; } Elf32_Rela;
typedef struct {
uint_64 r_offset; uint_64 r_info; } Elf64_Rel;
typedef struct {
uint_64 r_offset; uint_64 r_info; int_64 r_addend; } Elf64_Rela;
#define ELF32_R_SYM(i) ((i)>>8)
#define ELF32_R_TYPE(i) ((uint_8)(i))
#define ELF32_R_INFO(s,t) (((s)<<8)+(uint_8)(t))
#define ELF64_R_SYM(i) ((i)>>32)
#define ELF64_R_TYPE(i) ((i)&0xffffffffL)
#define ELF64_R_INFO(s,t) ((((uint_64)s)<<32)+((t)&0xffffffffL))
enum elf32_relocations {
R_386_NONE = 0,
R_386_32 = 1,
R_386_PC32 = 2,
R_386_GOT32 = 3,
R_386_PLT32 = 4,
R_386_COPY = 5,
R_386_GLOB_DAT = 6,
R_386_JMP_SLOT = 7,
R_386_RELATIVE = 8,
R_386_GOTOFF = 9,
R_386_GOTPC = 10,
R_386_32PLT = 11,
R_386_16 = 20,
R_386_PC16 = 21,
R_386_8 = 22,
R_386_PC8 = 23
};
enum elf64_relocations {
R_X86_64_NONE = 0,
R_X86_64_64 = 1,
R_X86_64_PC32 = 2,
R_X86_64_GOT32 = 3,
R_X86_64_PLT32 = 4,
R_X86_64_COPY = 5,
R_X86_64_GLOB_DAT = 6,
R_X86_64_JUMP_SLOT = 7,
R_X86_64_RELATIVE = 8,
R_X86_64_GOTPCREL = 9,
R_X86_64_32 = 10,
R_X86_64_32S = 11,
R_X86_64_16 = 12,
R_X86_64_PC16 = 13,
R_X86_64_8 = 14,
R_X86_64_PC8 = 15,
R_X86_64_DPTMOD64 = 16,
R_X86_64_DTPOFF64 = 17,
R_X86_64_TPOFF64 = 18,
R_X86_64_TLSGD = 19,
R_X86_64_TLSLD = 20,
R_X86_64_DTPOFF32 = 21,
R_X86_64_GOTTPOFF = 22,
R_X86_64_TPOFF32 = 23,
R_X86_64_PC64 = 24,
R_X86_64_GOTOFF64 = 25,
R_X86_64_GOTPC32 = 26,
R_X86_64_SIZE32 = 32,
R_X86_64_SIZE64 = 33
};
typedef struct {
uint_32 p_type; uint_32 p_offset; uint_32 p_vaddr; uint_32 p_paddr; uint_32 p_filesz; uint_32 p_memsz; uint_32 p_flags;
uint_32 p_align; } Elf32_Phdr;
#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_OS 0x60000001
#define PT_RES 0x60000002
#define PT_LOPROC 0x70000000
#define PT_HIPROC 0x7fffffff
#define PT_OS_O 7
#define PT_RES_O 9
typedef struct {
uint_32 n_namesz; uint_32 n_descsz; uint_32 n_type; } Elf_Note;
#define NT_PRSTATUS 1
#define NT_FPREGSET 2
#define NT_PRPSINFO 3
typedef struct {
int_32 d_tag;
union {
uint_32 d_val;
uint_32 d_ptr;
} d_un;
} Elf32_Dyn;
#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_SONAME 14
#define DT_REL 17
#define DT_RELSZ 18
#define DT_RELENT 19
#define DT_PLTREL 20
#define DT_DEBUG 21
#define DT_JMPREL 23
#define DT_EXPORT 0x60000001
#define DT_EXPORTSZ 0x60000002
#define DT_EXPENT 0x60000003
#define DT_IMPORT 0x60000004
#define DT_IMPORTSZ 0x60000005
#define DT_IMPENT 0x60000006
#define DT_IT 0x60000007
#define DT_ITPRTY 0x60000008
#define DT_INITTERM 0x60000009
#define DT_PPC_GOT 0x70000001
#define DT_PPC_GOTSZ 0x70000002
#define DT_PPC_PLTSZ 0x70000003
#define DT_LOPROC 0x70000000
#define DT_HIPROC 0x7FFFFFFF
#define DT_INIT_O 12
#define DT_FINI_O 13
#define DT_RPATH_O 15
#define DT_SYMBOLIC_O 16
#define DT_TEXTREL_O 22
#define DT_IT_O 24
#define DT_EXPORT_O 25
#define DT_EXPORTSZ_O 26
#define DT_IMPORT_O 27
#define DT_IMPORTSZ_O 28
#define DT_GOT_O 29
#define DT_GOTSZ_O 30
#define DT_PLTSZ_O 32
#define DT_ITPRTY_O 33
#define DT_LOUSER_O 0x60000000
#define DT_HIUSER_O 0x6FFFFFFF
#define ELF_32_IT_INIT(it) ((it) & 0x0f)
#define ELF_32_IT_TERM(it) (((it) >> 4) & 0x0f)
#define ELF_32_IT_INFO(i,t) (((i) & 0x0f)|(((t) & 0x0f) << 4))
#define IT_NONE 0
#define IT_GLOBAL 1
#define IT_INSTANCE 2
#define IT_THREAD 3
typedef unsigned long INITTERM ( unsigned long modhandle, unsigned long flag );
#define PF_X 0x1
#define PF_W 0x2
#define PF_R 0x4
#define PF_S 0x01000000
#define PF_MASKPROC 0xf0000000
typedef struct {
uint_32 os_type;
uint_32 os_size;
} Elf32_Os;
#define EOS_NONE 0
#define EOS_PN 1
#define EOS_SVR4 2
#define EOS_AIX 3
#define EOS_OS2 4
#define EOS_NT 5
#define EOS_VMS 6
#define EOS_OS400 7
#define EOS_NEXT 8
#define EOS_SYSTEM7 9
typedef struct {
unsigned char os2_sessiontype;
unsigned char os2_sessionflags;
unsigned char os2_reserved[14];
} Elf32_OS2Info;
#define OS2_SES_NONE 0
#define OS2_SES_FS 1
#define OS2_SES_PM 2
#define OS2_SES_VIO 3
typedef struct {
uint_32 imp_ordinal;
uint_32 imp_name;
uint_32 imp_info;
uint_32 imp_reserved;
} Elf32_Import;
#define ELF32_IMP_TYPE(i) ((i) >> 24)
#define ELF32_IMP_DLL(i) ((i) & 0x00FFFFFF)
#define ELF32_IMP_INFO(t,d) (((t)<<24) | ((d) & 0x00FFFFFF)))
#define IMP_IGNORED 0
#define IMP_STR_IDX 1
#define IMP_DT_IDX 2
typedef struct {
uint_32 exp_ordinal;
uint_32 exp_symbol;
uint_32 exp_name;
uint_32 exp_reserved;
} Elf32_Export;
#define RH_NIDENT 16
typedef struct {
unsigned char rh_ident[RH_NIDENT];
uint_32 rh_name;
uint_32 rh_itnum;
uint_32 rh_rhsize;
uint_32 rh_size;
uint_32 rh_strtab;
} Elf32_Rhdr;
#define ELFRESMAG0 '\002'
#define ELFRESMAG1 'R'
#define ELFRESMAG2 'E'
#define ELFRESMAG3 'S'
#define RH_MAG0 0
#define RH_MAG1 1
#define RH_MAG2 2
#define RH_MAG3 3
#define RH_CLASS 4
#define RH_DATA 5
#define RH_VERSION 6
#define RH_PAD 7
#define RESCLASSNONE 0
#define RESCLASS32 2
#define RESCLASS64 3
#define RESDATANONE 0
#define RESDATA2LSB 1
#define RESDATA2MSB 2
#define RV_NONE 0
#define RV_CURRENT 1
#define RI_NIDENT 4
typedef struct {
unsigned char ri_ident[RI_NIDENT];
uint_32 ri_type;
uint_32 ri_typename;
uint_32 ri_ordinal;
uint_32 ri_ordname;
uint_32 ri_data;
uint_32 ri_flags;
uint_32 ri_size;
uint_32 ri_reserved;
} Elf32_Ritem;
#define RI_VERSION 0
#define RI_PAD 1
#define IV_NONE 0
#define IV_CURRENT 1
typedef struct {
uint_32 idm_dllname;
uint_32 idm_initparms;
} Elf32_Demangle;
typedef struct {
uint_32 lib_name;
} Elf32_Library;
#endif