// elfcpp_internal.h -- internals for elfcpp -*- C++ -*- // This is included by elfcpp.h, the external interface, but holds // information which we want to keep private. #include "elfcpp_config.h" #ifndef ELFCPP_INTERNAL_H #define ELFCPP_INTERNAL_H namespace elfcpp { namespace internal { // The ELF file header. template struct Ehdr_data { unsigned char e_ident[EI_NIDENT]; Elf_Half e_type; Elf_Half e_machine; Elf_Word e_version; typename Elf_types::Elf_Addr e_entry; typename Elf_types::Elf_Off e_phoff; typename Elf_types::Elf_Off e_shoff; Elf_Word e_flags; Elf_Half e_ehsize; Elf_Half e_phentsize; Elf_Half e_phnum; Elf_Half e_shentsize; Elf_Half e_shnum; Elf_Half e_shstrndx; }; // An ELF section header. template struct Shdr_data { Elf_Word sh_name; Elf_Word sh_type; typename Elf_types::Elf_WXword sh_flags; typename Elf_types::Elf_Addr sh_addr; typename Elf_types::Elf_Off sh_offset; typename Elf_types::Elf_WXword sh_size; Elf_Word sh_link; Elf_Word sh_info; typename Elf_types::Elf_WXword sh_addralign; typename Elf_types::Elf_WXword sh_entsize; }; // An ELF segment header. We use template specialization for the // 32-bit and 64-bit versions because the fields are in a different // order. template struct Phdr_data; template<> struct Phdr_data<32> { Elf_Word p_type; Elf_types<32>::Elf_Off p_offset; Elf_types<32>::Elf_Addr p_vaddr; Elf_types<32>::Elf_Addr p_paddr; Elf_Word p_filesz; Elf_Word p_memsz; Elf_Word p_flags; Elf_Word p_align; }; template<> struct Phdr_data<64> { Elf_Word p_type; Elf_Word p_flags; Elf_types<64>::Elf_Off p_offset; Elf_types<64>::Elf_Addr p_vaddr; Elf_types<64>::Elf_Addr p_paddr; Elf_Xword p_filesz; Elf_Xword p_memsz; Elf_Xword p_align; }; // An ELF symbol table entry. We use template specialization for the // 32-bit and 64-bit versions because the fields are in a different // order. template struct Sym_data; template<> struct Sym_data<32> { Elf_Word st_name; Elf_types<32>::Elf_Addr st_value; Elf_Word st_size; unsigned char st_info; unsigned char st_other; Elf_Half st_shndx; }; template<> struct Sym_data<64> { Elf_Word st_name; unsigned char st_info; unsigned char st_other; Elf_Half st_shndx; Elf_types<64>::Elf_Addr st_value; Elf_Xword st_size; }; // ELF relocation table entries. template struct Rel_data { typename Elf_types::Elf_Addr r_offset; typename Elf_types::Elf_WXword r_info; }; template struct Rela_data { typename Elf_types::Elf_Addr r_offset; typename Elf_types::Elf_WXword r_info; typename Elf_types::Elf_Swxword r_addend; }; // An entry in the ELF SHT_DYNAMIC section aka PT_DYNAMIC segment. template struct Dyn_data { typename Elf_types::Elf_Swxword d_tag; typename Elf_types::Elf_WXword d_val; }; // An entry in a SHT_GNU_verdef section. This structure is the same // in 32-bit and 64-bit ELF files. struct Verdef_data { // Version number of structure (VER_DEF_*). Elf_Half vd_version; // Bit flags (VER_FLG_*). Elf_Half vd_flags; // Version index. Elf_Half vd_ndx; // Number of auxiliary Verdaux entries. Elf_Half vd_cnt; // Hash of name. Elf_Word vd_hash; // Byte offset to first Verdaux entry. Elf_Word vd_aux; // Byte offset to next Verdef entry. Elf_Word vd_next; }; // An auxiliary entry in a SHT_GNU_verdef section. This structure is // the same in 32-bit and 64-bit ELF files. struct Verdaux_data { // Offset in string table of version name. Elf_Word vda_name; // Byte offset to next Verdaux entry. Elf_Word vda_next; }; // An entry in a SHT_GNU_verneed section. This structure is the same // in 32-bit and 64-bit ELF files. struct Verneed_data { // Version number of structure (VER_NEED_*). Elf_Half vn_version; // Number of auxiliary Vernaux entries. Elf_Half vn_cnt; // Offset in string table of library name. Elf_Word vn_file; // Byte offset to first Vernaux entry. Elf_Word vn_aux; // Byt eoffset to next Verneed entry. Elf_Word vn_next; }; // An auxiliary entry in a SHT_GNU_verneed section. This structure is // the same in 32-bit and 64-bit ELF files. struct Vernaux_data { // Hash of dependency name. Elf_Word vna_hash; // Bit flags (VER_FLG_*). Elf_Half vna_flags; // Version index used in SHT_GNU_versym entries. Elf_Half vna_other; // Offset in string table of version name. Elf_Word vna_name; // Byte offset to next Vernaux entry. Elf_Word vna_next; }; } // End namespace internal. } // End namespace elfcpp. #endif // !defined(ELFCPP_INTERNAL_H)