/* * Copyright 2002-2009, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ // No header guard: The file is included twice by and must not be // included elsewhere. The _ELFX_BITS macro must be define before inclusion. #undef ElfX #if _ELFX_BITS == 32 # define ElfX(x) Elf32_##x #elif _ELFX_BITS == 64 # define ElfX(x) Elf64_##x #endif // object file header typedef struct { unsigned char e_ident[EI_NIDENT]; ElfX(Half) e_type; ElfX(Half) e_machine; ElfX(Word) e_version; ElfX(Addr) e_entry; ElfX(Off) e_phoff; ElfX(Off) e_shoff; ElfX(Word) e_flags; ElfX(Half) e_ehsize; ElfX(Half) e_phentsize; ElfX(Half) e_phnum; ElfX(Half) e_shentsize; ElfX(Half) e_shnum; ElfX(Half) e_shstrndx; } ElfX(Ehdr); // program header typedef struct { ElfX(Word) p_type; #if _ELFX_BITS == 64 ElfX(Word) p_flags; #endif ElfX(Off) p_offset; ElfX(Addr) p_vaddr; ElfX(Addr) p_paddr; ElfX(Xword) p_filesz; ElfX(Xword) p_memsz; #if _ELFX_BITS == 32 ElfX(Word) p_flags; #endif ElfX(Xword) p_align; } ElfX(Phdr); // section header typedef struct { ElfX(Word) sh_name; ElfX(Word) sh_type; ElfX(Xword) sh_flags; ElfX(Addr) sh_addr; ElfX(Off) sh_offset; ElfX(Xword) sh_size; ElfX(Word) sh_link; ElfX(Word) sh_info; ElfX(Xword) sh_addralign; ElfX(Xword) sh_entsize; } ElfX(Shdr); #undef ElfX