root/headers/private/storage/ElfX.h
/*
 * 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 <Elf.h> 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