X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=elfcpp%2Felfcpp.h;h=339faadaf3f2b34b60996589b8b336a794241913;hb=43327b208ec6452c1a6accd40be965cdfa5c86a3;hp=e4f9f1fa73134fce3d1ede1f09e0d2c9294cc024;hpb=d3c258602e6f9151004bfed8226c36084087a307;p=deliverable%2Fbinutils-gdb.git diff --git a/elfcpp/elfcpp.h b/elfcpp/elfcpp.h index e4f9f1fa73..339faadaf3 100644 --- a/elfcpp/elfcpp.h +++ b/elfcpp/elfcpp.h @@ -1,7 +1,6 @@ // elfcpp.h -- main header file for elfcpp -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 -// Free Software Foundation, Inc. +// Copyright (C) 2006-2020 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of elfcpp. @@ -174,7 +173,7 @@ enum EM EM_386 = 3, EM_68K = 4, EM_88K = 5, - // 6 used to be EM_486 + EM_IAMCU = 6, EM_860 = 7, EM_MIPS = 8, EM_S370 = 9, @@ -247,7 +246,7 @@ enum EM EM_MN10300 = 89, EM_MN10200 = 90, EM_PJ = 91, - EM_OPENRISC = 92, + EM_OR1K = 92, EM_ARC_A5 = 93, EM_XTENSA = 94, EM_VIDEOCORE = 95, @@ -269,6 +268,9 @@ enum EM EM_UNICORE = 110, EM_ALTERA_NIOS2 = 113, EM_CRX = 114, + EM_TI_PRU = 144, + EM_AARCH64 = 183, + EM_TILEGX = 191, // The Morph MT. EM_MT = 0x2530, // DLX. @@ -288,7 +290,7 @@ enum EM // Old AVR objects used 0x1057 (EM_AVR is correct). // Old MSP430 objects used 0x1059 (EM_MSP430 is correct). // Old FR30 objects used 0x3330 (EM_FR30 is correct). - // Old OpenRISC objects used 0x3426 and 0x8472 (EM_OPENRISC is correct). + // Old OpenRISC objects used 0x3426 and 0x8472 (EM_OR1K is correct). // Old D10V objects used 0x7650 (EM_D10V is correct). // Old D30V objects used 0x7676 (EM_D30V is correct). // Old IP2X objects used 0x8217 (EM_IP2K is correct). @@ -400,9 +402,16 @@ enum SHT // x86_64 unwind information. SHT_X86_64_UNWIND = 0x70000001, - //MIPS-specific section types. - // Register info section + // MIPS-specific section types. + // Section contains register usage information. SHT_MIPS_REGINFO = 0x70000006, + // Section contains miscellaneous options. + SHT_MIPS_OPTIONS = 0x7000000d, + // ABI related flags section. + SHT_MIPS_ABIFLAGS = 0x7000002a, + + // AARCH64-specific section type. + SHT_AARCH64_ATTRIBUTES = 0x70000003, // Link editor is to sort the entries in this section based on the // address specified in the associated symbol table entry. @@ -423,6 +432,7 @@ enum SHF SHF_OS_NONCONFORMING = 0x100, SHF_GROUP = 0x200, SHF_TLS = 0x400, + SHF_COMPRESSED = 0x800, SHF_MASKOS = 0x0ff00000, SHF_MASKPROC = 0xf0000000, @@ -445,6 +455,17 @@ enum SHF SHF_X86_64_LARGE = 0x10000000 }; +// Values which appear in the first Elf_WXword of the section data +// of a SHF_COMPRESSED section. +enum +{ + ELFCOMPRESS_ZLIB = 1, + ELFCOMPRESS_LOOS = 0x60000000, + ELFCOMPRESS_HIOS = 0x6fffffff, + ELFCOMPRESS_LOPROC = 0x70000000, + ELFCOMPRESS_HIPROC = 0x7fffffff, +}; + // Bit flags which appear in the first 32-bit word of the section data // of a SHT_GROUP section. @@ -488,7 +509,15 @@ enum PT // Runtime procedure table. PT_MIPS_RTPROC = 0x70000001, // .MIPS.options section. - PT_MIPS_OPTIONS = 0x70000002 + PT_MIPS_OPTIONS = 0x70000002, + // .MIPS.abiflags section. + PT_MIPS_ABIFLAGS = 0x70000003, + // Platform architecture compatibility information + PT_AARCH64_ARCHEXT = 0x70000000, + // Exception unwind tables + PT_AARCH64_UNWIND = 0x70000001, + // 4k page table size + PT_S390_PGSTE = 0x70000000, }; // The valid bit flags found in the Phdr p_flags field. @@ -739,6 +768,9 @@ enum DT // Specify the value of _GLOBAL_OFFSET_TABLE_. DT_PPC_GOT = 0x70000000, + // Specify whether various optimisations are possible. + DT_PPC_OPT = 0x70000001, + // Specify the start of the .glink section. DT_PPC64_GLINK = 0x70000000, @@ -746,6 +778,9 @@ enum DT DT_PPC64_OPD = 0x70000001, DT_PPC64_OPDSZ = 0x70000002, + // Specify whether various optimisations are possible. + DT_PPC64_OPT = 0x70000003, + // The index of an STT_SPARC_REGISTER symbol within the DT_SYMTAB // symbol table. One dynamic entry exists for every STT_SPARC_REGISTER // symbol in the symbol table. @@ -842,6 +877,8 @@ enum DT DT_MIPS_PLTGOT = 0x70000032, // Points to the base of a writable PLT. DT_MIPS_RWPLT = 0x70000034, + // Relative offset of run time loader map, used for debugging. + DT_MIPS_RLD_MAP_REL = 0x70000035, DT_AUXILIARY = 0x7ffffffd, DT_USED = 0x7ffffffe, @@ -947,7 +984,9 @@ enum NT_GNU_BUILD_ID = 3, // The version of gold used to link. Th descriptor is just a // string. - NT_GNU_GOLD_VERSION = 4 + NT_GNU_GOLD_VERSION = 4, + // Program property note, as described in "Linux Extensions to the gABI". + NT_GNU_PROPERTY_TYPE_0 = 5 }; // The OS values which may appear in word 0 of a NT_GNU_ABI_TAG note. @@ -962,6 +1001,21 @@ enum ELF_NOTE_OS_SYLLABLE = 5 }; +// Program property types for NT_GNU_PROPERTY_TYPE_0. + +enum +{ + GNU_PROPERTY_STACK_SIZE = 1, + GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2, + GNU_PROPERTY_LOPROC = 0xc0000000, + GNU_PROPERTY_X86_ISA_1_USED = 0xc0000000, + GNU_PROPERTY_X86_ISA_1_NEEDED = 0xc0000001, + GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002, + GNU_PROPERTY_HIPROC = 0xdfffffff, + GNU_PROPERTY_LOUSER = 0xe0000000, + GNU_PROPERTY_HIUSER = 0xffffffff +}; + } // End namespace elfcpp. // Include internal details after defining the types. @@ -985,6 +1039,8 @@ struct Elf_sizes static const int phdr_size = sizeof(internal::Phdr_data); // Size of ELF section header. static const int shdr_size = sizeof(internal::Shdr_data); + // Size of ELF compression header. + static const int chdr_size = sizeof(internal::Chdr_data); // Size of ELF symbol table entry. static const int sym_size = sizeof(internal::Sym_data); // Sizes of ELF reloc entries. @@ -1260,6 +1316,82 @@ class Shdr_write internal::Shdr_data* p_; }; +// Accessor class for an ELF compression header. + +template +class Chdr +{ + public: + Chdr(const unsigned char* p) + : p_(reinterpret_cast*>(p)) + { } + + template + Chdr(File* file, typename File::Location loc) + : p_(reinterpret_cast*>( + file->view(loc.file_offset, loc.data_size).data())) + { } + + Elf_Word + get_ch_type() const + { return Convert::convert_host(this->p_->ch_type); } + + typename Elf_types::Elf_WXword + get_ch_size() const + { return Convert::convert_host(this->p_->ch_size); } + + typename Elf_types::Elf_WXword + get_ch_addralign() const + { return + Convert::convert_host(this->p_->ch_addralign); } + + private: + const internal::Chdr_data* p_; +}; + +// Write class for an ELF compression header. + +template +class Chdr_write +{ + public: + Chdr_write(unsigned char* p) + : p_(reinterpret_cast*>(p)) + { } + + void + put_ch_type(typename Elf_types::Elf_WXword v) + { this->p_->ch_type = Convert::convert_host(v); } + + void + put_ch_size(typename Elf_types::Elf_WXword v) + { this->p_->ch_size = Convert::convert_host(v); } + + void + put_ch_addralign(typename Elf_types::Elf_WXword v) + { this->p_->ch_addralign = Convert::convert_host(v); } + + void + put_ch_reserved(Elf_Word); + + private: + internal::Chdr_data* p_; +}; + +template<> +inline void +elfcpp::Chdr_write<64, true>::put_ch_reserved(Elf_Word v) +{ + this->p_->ch_reserved = v; +} + +template<> +inline void +elfcpp::Chdr_write<64, false>::put_ch_reserved(Elf_Word v) +{ + this->p_->ch_reserved = v; +} + // Accessor class for an ELF segment header. template @@ -1576,6 +1708,172 @@ class Rela_write internal::Rela_data* p_; }; +// MIPS-64 has a non-standard relocation layout. + +template +class Mips64_rel +{ + public: + Mips64_rel(const unsigned char* p) + : p_(reinterpret_cast(p)) + { } + + template + Mips64_rel(File* file, typename File::Location loc) + : p_(reinterpret_cast( + file->view(loc.file_offset, loc.data_size).data())) + { } + + typename Elf_types<64>::Elf_Addr + get_r_offset() const + { return Convert<64, big_endian>::convert_host(this->p_->r_offset); } + + Elf_Word + get_r_sym() const + { return Convert<32, big_endian>::convert_host(this->p_->r_sym); } + + unsigned char + get_r_ssym() const + { return this->p_->r_ssym; } + + unsigned char + get_r_type() const + { return this->p_->r_type; } + + unsigned char + get_r_type2() const + { return this->p_->r_type2; } + + unsigned char + get_r_type3() const + { return this->p_->r_type3; } + + private: + const internal::Mips64_rel_data* p_; +}; + +template +class Mips64_rel_write +{ + public: + Mips64_rel_write(unsigned char* p) + : p_(reinterpret_cast(p)) + { } + + void + put_r_offset(typename Elf_types<64>::Elf_Addr v) + { this->p_->r_offset = Convert<64, big_endian>::convert_host(v); } + + void + put_r_sym(Elf_Word v) + { this->p_->r_sym = Convert<32, big_endian>::convert_host(v); } + + void + put_r_ssym(unsigned char v) + { this->p_->r_ssym = v; } + + void + put_r_type(unsigned char v) + { this->p_->r_type = v; } + + void + put_r_type2(unsigned char v) + { this->p_->r_type2 = v; } + + void + put_r_type3(unsigned char v) + { this->p_->r_type3 = v; } + + private: + internal::Mips64_rel_data* p_; +}; + +template +class Mips64_rela +{ + public: + Mips64_rela(const unsigned char* p) + : p_(reinterpret_cast(p)) + { } + + template + Mips64_rela(File* file, typename File::Location loc) + : p_(reinterpret_cast( + file->view(loc.file_offset, loc.data_size).data())) + { } + + typename Elf_types<64>::Elf_Addr + get_r_offset() const + { return Convert<64, big_endian>::convert_host(this->p_->r_offset); } + + Elf_Word + get_r_sym() const + { return Convert<32, big_endian>::convert_host(this->p_->r_sym); } + + unsigned char + get_r_ssym() const + { return this->p_->r_ssym; } + + unsigned char + get_r_type() const + { return this->p_->r_type; } + + unsigned char + get_r_type2() const + { return this->p_->r_type2; } + + unsigned char + get_r_type3() const + { return this->p_->r_type3; } + + typename Elf_types<64>::Elf_Swxword + get_r_addend() const + { return Convert<64, big_endian>::convert_host(this->p_->r_addend); } + + private: + const internal::Mips64_rela_data* p_; +}; + +template +class Mips64_rela_write +{ + public: + Mips64_rela_write(unsigned char* p) + : p_(reinterpret_cast(p)) + { } + + void + put_r_offset(typename Elf_types<64>::Elf_Addr v) + { this->p_->r_offset = Convert<64, big_endian>::convert_host(v); } + + void + put_r_sym(Elf_Word v) + { this->p_->r_sym = Convert<32, big_endian>::convert_host(v); } + + void + put_r_ssym(unsigned char v) + { this->p_->r_ssym = v; } + + void + put_r_type(unsigned char v) + { this->p_->r_type = v; } + + void + put_r_type2(unsigned char v) + { this->p_->r_type2 = v; } + + void + put_r_type3(unsigned char v) + { this->p_->r_type3 = v; } + + void + put_r_addend(typename Elf_types<64>::Elf_Swxword v) + { this->p_->r_addend = Convert<64, big_endian>::convert_host(v); } + + private: + internal::Mips64_rela_data* p_; +}; + // Accessor classes for entries in the ELF SHT_DYNAMIC section aka // PT_DYNAMIC segment.