diff options
Diffstat (limited to 'elfcpp/elfcpp_internal.h')
-rw-r--r-- | elfcpp/elfcpp_internal.h | 213 |
1 files changed, 213 insertions, 0 deletions
diff --git a/elfcpp/elfcpp_internal.h b/elfcpp/elfcpp_internal.h new file mode 100644 index 000000000000..7a2b5d4836bd --- /dev/null +++ b/elfcpp/elfcpp_internal.h @@ -0,0 +1,213 @@ +// 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<int size> +struct Ehdr_data +{ + unsigned char e_ident[EI_NIDENT]; + Elf_Half e_type; + Elf_Half e_machine; + Elf_Word e_version; + typename Elf_types<size>::Elf_Addr e_entry; + typename Elf_types<size>::Elf_Off e_phoff; + typename Elf_types<size>::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<int size> +struct Shdr_data +{ + Elf_Word sh_name; + Elf_Word sh_type; + typename Elf_types<size>::Elf_WXword sh_flags; + typename Elf_types<size>::Elf_Addr sh_addr; + typename Elf_types<size>::Elf_Off sh_offset; + typename Elf_types<size>::Elf_WXword sh_size; + Elf_Word sh_link; + Elf_Word sh_info; + typename Elf_types<size>::Elf_WXword sh_addralign; + typename Elf_types<size>::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<int size> +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<int size> +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<int size> +struct Rel_data +{ + typename Elf_types<size>::Elf_Addr r_offset; + typename Elf_types<size>::Elf_WXword r_info; +}; + +template<int size> +struct Rela_data +{ + typename Elf_types<size>::Elf_Addr r_offset; + typename Elf_types<size>::Elf_WXword r_info; + typename Elf_types<size>::Elf_Swxword r_addend; +}; + +// An entry in the ELF SHT_DYNAMIC section aka PT_DYNAMIC segment. + +template<int size> +struct Dyn_data +{ + typename Elf_types<size>::Elf_Swxword d_tag; + typename Elf_types<size>::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) |