| // elfcpp_internal.h -- internals for elfcpp -*- C++ -*- | |
| // Copyright (C) 2006-2021 Free Software Foundation, Inc. | |
| // Written by Ian Lance Taylor <iant@google.com>. | |
| // This file is part of elfcpp. | |
| // This program is free software; you can redistribute it and/or | |
| // modify it under the terms of the GNU Library General Public License | |
| // as published by the Free Software Foundation; either version 2, or | |
| // (at your option) any later version. | |
| // In addition to the permissions in the GNU Library General Public | |
| // License, the Free Software Foundation gives you unlimited | |
| // permission to link the compiled version of this file into | |
| // combinations with other programs, and to distribute those | |
| // combinations without any restriction coming from the use of this | |
| // file. (The Library Public License restrictions do apply in other | |
| // respects; for example, they cover modification of the file, and | |
| /// distribution when not linked into a combined executable.) | |
| // This program is distributed in the hope that it will be useful, but | |
| // WITHOUT ANY WARRANTY; without even the implied warranty of | |
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| // Library General Public License for more details. | |
| // You should have received a copy of the GNU Library General Public | |
| // License along with this program; if not, write to the Free Software | |
| // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA | |
| // 02110-1301, USA. | |
| // This is included by elfcpp.h, the external interface, but holds | |
| // information which we want to keep private. | |
| #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 compression header. | |
| template<int size> | |
| struct Chdr_data; | |
| template<> | |
| struct Chdr_data<32> | |
| { | |
| Elf_Word ch_type; | |
| Elf_Word ch_size; | |
| Elf_Word ch_addralign; | |
| }; | |
| template<> | |
| struct Chdr_data<64> | |
| { | |
| Elf_Word ch_type; | |
| Elf_Word ch_reserved; | |
| Elf_Xword ch_size; | |
| Elf_Xword ch_addralign; | |
| }; | |
| // 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; | |
| }; | |
| // MIPS-64 has a non-standard layout for relocations. | |
| struct Mips64_rel_data | |
| { | |
| Elf_types<64>::Elf_Addr r_offset; | |
| Elf_Word r_sym; | |
| unsigned char r_ssym; | |
| unsigned char r_type3; | |
| unsigned char r_type2; | |
| unsigned char r_type; | |
| }; | |
| struct Mips64_rela_data | |
| { | |
| Elf_types<64>::Elf_Addr r_offset; | |
| Elf_Word r_sym; | |
| unsigned char r_ssym; | |
| unsigned char r_type3; | |
| unsigned char r_type2; | |
| unsigned char r_type; | |
| Elf_types<64>::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) |