#ifndef USERBOOT_ELF_H_ #define USERBOOT_ELF_H_ #include #include #include #define ELF_LOAD_ERR -1 #define ELF_LOADED_EXEC 0 #define ELF_LOADED_INTERP 1 #define ELF_MAG0 0x7f #define ELF_MAG1 'E' #define ELF_MAG2 'L' #define ELF_MAG3 'F' #define ELF_NIDENT 16 #define SHT_NONE 0 #define SHT_PROGBITS 1 #define SHT_SYMTAB 2 #define SHT_STRTAB 3 #define SHT_RELA 4 #define SHT_DYNAMIC 6 #define SHT_NOBITS 8 #define SHT_REL 9 #define SHT_DYNSYM 11 /** Little endian. */ #define ELFDATA2LSB (1) /** 64-bit. */ #define ELFCLASS64 (2) /** x86_64 machine type. */ #define EM_X86_64 (62) /** ELF current version. */ #define EV_CURRENT (1) /** Dynamic section tags. */ #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_REL 17 #define DT_RELSZ 18 #define DT_RELENT 19 #define DT_PLTREL 20 #define DT_JMPREL 23 #define DT_GNU_HASH 0x6ffffef5 #define DT_AUXILIARY 0x7ffffffd #define R_386_32 1 #define R_386_PC32 2 #define R_386_GOT32 3 #define R_386_PLT32 4 #define R_386_GOTOFF 9 #define R_386_GOTPC 10 #define R_386_GOT32X 43 #define R_X86_64_64 1 #define R_X86_64_PC32 2 #define R_X86_64_GOT32 3 #define R_X86_64_PLT32 4 #define R_X86_64_COPY 5 #define R_X86_64_GLOB_DAT 6 #define R_X86_64_JUMP_SLOT 7 #define R_X86_64_RELATIVE 8 #define R_X86_64_GOTPCREL 9 #define R_X86_64_32 10 #define STT_NOTYPE 0 #define STT_OBJECT 1 #define STT_FUNC 2 #define STT_SECTION 3 #define STT_FILE 4 #define STT_LOPROC 13 #define STT_HIPROC 15 /* Section flags */ #define SHF_WRITE 0x1 #define SHF_ALLOC 0x2 #define SHF_EXECINSTR 0x4 #define SHN_UNDEF 0 #define ELF64_R_SYM(i) ((i) >> 32) #define ELF64_R_TYPE(i) ((elf_word_t)(i)) #define ELF64_ST_BIND(i) ((i) >> 4) #define ELF64_ST_TYPE(i) ((i) & 0xf) #define STB_LOCAL 0 #define STB_GLOBAL 1 #define STB_WEAK 2 #define STB_NUM 3 typedef uint64_t elf_addr_t; typedef uint64_t elf_off_t; typedef uint16_t elf_half_t; typedef uint32_t elf_word_t; typedef int32_t elf_sword_t; typedef uint64_t elf_xword_t; typedef int64_t elf_sxword_t; /** * ELF file header. */ typedef struct { uint8_t e_ident[ELF_NIDENT]; elf_half_t e_type; elf_half_t e_machine; elf_word_t e_version; elf_addr_t e_entry; elf_off_t e_phoff; elf_off_t e_shoff; elf_word_t e_flags; elf_half_t e_ehsize; elf_half_t e_phentsize; elf_half_t e_phnum; elf_half_t e_shentsize; elf_half_t e_shnum; elf_half_t e_shstrndx; } elf_ehdr_t; /** * ELF section header. */ typedef struct { elf_word_t sh_name; elf_word_t sh_type; elf_xword_t sh_flags; elf_addr_t sh_addr; elf_off_t sh_offset; elf_xword_t sh_size; elf_word_t sh_link; elf_word_t sh_info; elf_xword_t sh_addralign; elf_xword_t sh_entsize; } elf_shdr_t; /** * ELF symbol. */ typedef struct { elf_word_t st_name; unsigned char st_info; unsigned char st_other; elf_half_t st_shndx; elf_addr_t st_value; elf_xword_t st_size; } elf_sym_t; /** * ELF program header. */ typedef struct { elf_word_t p_type; elf_word_t p_flags; elf_off_t p_offset; elf_addr_t p_vaddr; elf_addr_t p_paddr; elf_xword_t p_filesz; elf_xword_t p_memsz; elf_xword_t p_align; } elf_phdr_t; /** * Extended ELF relocation information. */ typedef struct { elf_addr_t r_offset; elf_xword_t r_info; elf_sxword_t r_addend; } elf_rela_t; /** * Dynamic section entries */ typedef struct { elf_sxword_t d_tag; union { elf_xword_t d_val; elf_addr_t d_ptr; } d_un; } elf_dyn_t; /** * Section header types. */ enum elf_stype { ST_NONE = 0, ST_PROGBITS = 1, ST_SYMTAB = 2, ST_STRTAB = 3, ST_NOBITS = 8, ST_REL = 9 }; /** * Program header types. */ enum elf_ptype { PT_NULL = 0, PT_LOAD = 1, PT_DYNAMIC = 2, PT_INTERP = 3, PT_NOTE = 4, PT_SHLIB = 5, PT_PHDR = 6 }; #define PF_X 0x1 #define PF_W 0x2 #define PF_R 0x4 #define PT_LOPROC 0x70000000 #define PT_HIPROC 0x7FFFFFFF /** * ELF identification byte locations. */ enum elf_ident { EI_MAG0 = 0, EI_MAG1 = 1, EI_MAG2 = 2, EI_MAG3 = 3, EI_CLASS = 4, EI_DATA = 5, EI_VERSION = 6, EI_OSABI = 7, EI_ABIVERSION = 8, EI_PAD = 9 }; enum elf_type { ET_NONE = 0, ET_REL = 1, ET_EXEC = 2, ET_DYN = 3, }; #define AT_NULL 0 #define AT_IGNORE 1 #define AT_EXECFD 2 #define AT_PHDR 3 #define AT_PHENT 4 #define AT_PHNUM 5 #define AT_PAGESZ 6 #define AT_BASE 7 #define AT_FLAGS 8 #define AT_ENTRY 9 #define AT_NOTELF 10 #define AT_UID 11 #define AT_EUID 12 #define AT_GID 13 #define AT_EGID 14 #define AT_CLKTCK 17 #define AT_PLATFORM 15 #define AT_HWCAP 16 #define AT_FPUCW 18 #define AT_DCACHEBSIZE 19 #define AT_ICACHEBSIZE 20 #define AT_UCACHEBSIZE 21 #define AT_IGNOREPPC 22 #define AT_SECURE 23 #define AT_BASE_PLATFORM 24 #define AT_RANDOM 25 #define AT_HWCAP2 26 #define AT_EXECFN 31 #define AT_SYSINFO 32 #define AT_SYSINFO_EHDR 33 #define AT_L1I_CACHESHAPE 34 #define AT_L1D_CACHESHAPE 35 #define AT_L2_CACHESHAPE 36 #define AT_L3_CACHESHAPE 37 #define AT_ENTRY_COUNT 38 struct bootdata; struct bootfs_file; struct elf_image { kern_handle_t e_image, e_data; kern_handle_t e_local_space, e_remote_space; kern_handle_t e_local_exec, e_remote_exec; virt_addr_t e_local_base, e_remote_base; elf_ehdr_t e_hdr; elf_phdr_t e_dynamic; off_t e_dynsym; size_t e_dynsym_entsize; char e_interp[256]; size_t e_total_size, e_data_size; }; extern void elf_image_init(struct elf_image *out); extern enum launch_status elf_image_load( struct elf_image *image, kern_handle_t exec_object, kern_handle_t local_space, kern_handle_t remote_space); extern void elf_image_cleanup(struct elf_image *image); #endif