// elfcpp.h -- main header file for elfcpp -*- C++ -*-
-// Copyright (C) 2006-2017 Free Software Foundation, Inc.
+// Copyright (C) 2006-2021 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of elfcpp.
// AARCH64-specific section type.
SHT_AARCH64_ATTRIBUTES = 0x70000003,
+ // CSKY-specific section types.
+ // Object file compatibility attributes.
+ SHT_CSKY_ATTRIBUTES = 0x70000001,
+
// Link editor is to sort the entries in this section based on the
// address specified in the associated symbol table entry.
SHT_ORDERED = 0x7fffffff
SHF_TLS = 0x400,
SHF_COMPRESSED = 0x800,
SHF_MASKOS = 0x0ff00000,
+ SHF_GNU_RETAIN = 0x200000,
SHF_MASKPROC = 0xf0000000,
// Indicates this section requires ordering in relation to
// The remaining values are extensions used by GNU or Solaris.
DT_VALRNGLO = 0x6ffffd00,
+ DT_GNU_FLAGS_1 = 0x6ffffdf4,
DT_GNU_PRELINKED = 0x6ffffdf5,
DT_GNU_CONFLICTSZ = 0x6ffffdf6,
DT_GNU_LIBLISTSZ = 0x6ffffdf7,
// 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,
DF_1_INTERPOSE = 0x400,
DF_1_NODEFLIB = 0x800,
DF_1_NODUMP = 0x1000,
- DF_1_CONLFAT = 0x2000
+ DF_1_CONLFAT = 0x2000,
+ DF_1_PIE = 0x08000000
+};
+
+// Flags found in the DT_GNU_FLAGS_1 dynamic element.
+enum DF_GNU_1
+{
+ DF_GNU_1_UNIQUE = 0x1,
};
// Version numbers which appear in the vd_version field of a Verdef
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.
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_COMPAT_ISA_1_USED = 0xc0000000,
+ GNU_PROPERTY_X86_COMPAT_ISA_1_NEEDED = 0xc0000001,
+ GNU_PROPERTY_X86_UINT32_AND_LO = 0xc0000002,
+ GNU_PROPERTY_X86_UINT32_AND_HI = 0xc0007fff,
+ GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000,
+ GNU_PROPERTY_X86_UINT32_OR_HI = 0xc000ffff,
+ GNU_PROPERTY_X86_UINT32_OR_AND_LO = 0xc0010000,
+ GNU_PROPERTY_X86_UINT32_OR_AND_HI = 0xc0017fff,
+ GNU_PROPERTY_X86_COMPAT_2_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 0,
+ GNU_PROPERTY_X86_COMPAT_2_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 0,
+ GNU_PROPERTY_X86_FEATURE_1_AND = GNU_PROPERTY_X86_UINT32_AND_LO + 0,
+ GNU_PROPERTY_X86_ISA_1_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 2,
+ GNU_PROPERTY_X86_FEATURE_2_NEEDED = GNU_PROPERTY_X86_UINT32_OR_LO + 1,
+ GNU_PROPERTY_X86_ISA_1_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 2,
+ GNU_PROPERTY_X86_FEATURE_2_USED = GNU_PROPERTY_X86_UINT32_OR_AND_LO + 1,
+ GNU_PROPERTY_HIPROC = 0xdfffffff,
+ GNU_PROPERTY_LOUSER = 0xe0000000,
+ GNU_PROPERTY_HIUSER = 0xffffffff
+};
+
} // End namespace elfcpp.
// Include internal details after defining the types.
get_e_ident() const
{ return this->p_->e_ident; }
+ unsigned char
+ get_ei_osabi() const
+ { return this->p_->e_ident[EI_OSABI]; }
+
+ unsigned char
+ get_ei_abiversion() const
+ { return this->p_->e_ident[EI_ABIVERSION]; }
+
Elf_Half
get_e_type() const
{ return Convert<16, big_endian>::convert_host(this->p_->e_type); }
put_ch_addralign(typename Elf_types<size>::Elf_WXword v)
{ this->p_->ch_addralign = Convert<size, big_endian>::convert_host(v); }
+ void
+ put_ch_reserved(Elf_Word);
+
private:
internal::Chdr_data<size>* 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<int size, bool big_endian>