//===- SyntheticSection.h ---------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Synthetic sections represent chunks of linker-created data. If you // need to create a chunk of data that to be included in some section // in the result, you probably want to create that as a synthetic section. // // Synthetic sections are designed as input sections as opposed to // output sections because we want to allow them to be manipulated // using linker scripts just like other input sections from regular // files. // //===----------------------------------------------------------------------===// #ifndef LLD_ELF_SYNTHETIC_SECTIONS_H #define LLD_ELF_SYNTHETIC_SECTIONS_H #include "Config.h" #include "DWARF.h" #include "InputSection.h" #include "Symbols.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/FoldingSet.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/STLFunctionalExtras.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/DebugInfo/DWARF/DWARFAcceleratorTable.h" #include "llvm/MC/StringTableBuilder.h" #include "llvm/Support/Allocator.h" #include "llvm/Support/Compiler.h" #include "llvm/Support/Endian.h" #include "llvm/Support/Parallel.h" #include "llvm/Support/Threading.h" namespace lld::elf { class Defined; struct PhdrEntry; class SymbolTableBaseSection; struct CieRecord { … }; // Section for .eh_frame. class EhFrameSection final : public SyntheticSection { … }; class GotSection final : public SyntheticSection { … }; // .note.GNU-stack section. class GnuStackSection : public SyntheticSection { … }; class GnuPropertySection final : public SyntheticSection { … }; // .note.gnu.build-id section. class BuildIdSection : public SyntheticSection { … }; // BssSection is used to reserve space for copy relocations and common symbols. // We create three instances of this class for .bss, .bss.rel.ro and "COMMON", // that are used for writable symbols, read-only symbols and common symbols, // respectively. class BssSection final : public SyntheticSection { … }; class MipsGotSection final : public SyntheticSection { … }; class GotPltSection final : public SyntheticSection { … }; // The IgotPltSection is a Got associated with the PltSection for GNU Ifunc // Symbols that will be relocated by Target->IRelativeRel. // On most Targets the IgotPltSection will immediately follow the GotPltSection // on ARM the IgotPltSection will immediately follow the GotSection. class IgotPltSection final : public SyntheticSection { … }; class StringTableSection final : public SyntheticSection { … }; class DynamicReloc { … }; template <class ELFT> class DynamicSection final : public SyntheticSection { … }; class RelocationBaseSection : public SyntheticSection { … }; template <> inline void RelocationBaseSection::addReloc<true>(const DynamicReloc &reloc) { … } template <class ELFT> class RelocationSection final : public RelocationBaseSection { … }; template <class ELFT> class AndroidPackedRelocationSection final : public RelocationBaseSection { … }; struct RelativeReloc { … }; class RelrBaseSection : public SyntheticSection { … }; // RelrSection is used to encode offsets for relative relocations. // Proposal for adding SHT_RELR sections to generic-abi is here: // https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg // For more details, see the comment in RelrSection::updateAllocSize(). template <class ELFT> class RelrSection final : public RelrBaseSection { … }; struct SymbolTableEntry { … }; class SymbolTableBaseSection : public SyntheticSection { … }; template <class ELFT> class SymbolTableSection final : public SymbolTableBaseSection { … }; class SymtabShndxSection final : public SyntheticSection { … }; // Outputs GNU Hash section. For detailed explanation see: // https://blogs.oracle.com/ali/entry/gnu_hash_elf_sections class GnuHashTableSection final : public SyntheticSection { … }; class HashTableSection final : public SyntheticSection { … }; // Used for PLT entries. It usually has a PLT header for lazy binding. Each PLT // entry is associated with a JUMP_SLOT relocation, which may be resolved lazily // at runtime. // // On PowerPC, this section contains lazy symbol resolvers. A branch instruction // jumps to a PLT call stub, which will then jump to the target (BIND_NOW) or a // lazy symbol resolver. // // On x86 when IBT is enabled, this section (.plt.sec) contains PLT call stubs. // A call instruction jumps to a .plt.sec entry, which will then jump to the // target (BIND_NOW) or a .plt entry. class PltSection : public SyntheticSection { … }; // Used for non-preemptible ifuncs. It does not have a header. Each entry is // associated with an IRELATIVE relocation, which will be resolved eagerly at // runtime. PltSection can only contain entries associated with JUMP_SLOT // relocations, so IPLT entries are in a separate section. class IpltSection final : public SyntheticSection { … }; class PPC32GlinkSection : public PltSection { … }; // This is x86-only. class IBTPltSection : public SyntheticSection { … }; // Used to align the end of the PT_GNU_RELRO segment and the associated PT_LOAD // segment to a common-page-size boundary. This padding section ensures that all // pages in the PT_LOAD segment is covered by at least one section. class RelroPaddingSection final : public SyntheticSection { … }; // Used by the merged DWARF32 .debug_names (a per-module index). If we // move to DWARF64, most of this data will need to be re-sized. class DebugNamesBaseSection : public SyntheticSection { … }; // Complement DebugNamesBaseSection for ELFT-aware code: reading offsets, // relocating string offsets, and writeTo. template <class ELFT> class DebugNamesSection final : public DebugNamesBaseSection { … }; class GdbIndexSection final : public SyntheticSection { … }; // --eh-frame-hdr option tells linker to construct a header for all the // .eh_frame sections. This header is placed to a section named .eh_frame_hdr // and also to a PT_GNU_EH_FRAME segment. // At runtime the unwinder then can find all the PT_GNU_EH_FRAME segments by // calling dl_iterate_phdr. // This section contains a lookup table for quick binary search of FDEs. // Detailed info about internals can be found in Ian Lance Taylor's blog: // http://www.airs.com/blog/archives/460 (".eh_frame") // http://www.airs.com/blog/archives/462 (".eh_frame_hdr") class EhFrameHeader final : public SyntheticSection { … }; // For more information about .gnu.version and .gnu.version_r see: // https://www.akkadia.org/drepper/symbol-versioning // The .gnu.version_d section which has a section type of SHT_GNU_verdef shall // contain symbol version definitions. The number of entries in this section // shall be contained in the DT_VERDEFNUM entry of the .dynamic section. // The section shall contain an array of Elf_Verdef structures, optionally // followed by an array of Elf_Verdaux structures. class VersionDefinitionSection final : public SyntheticSection { … }; // The .gnu.version section specifies the required version of each symbol in the // dynamic symbol table. It contains one Elf_Versym for each dynamic symbol // table entry. An Elf_Versym is just a 16-bit integer that refers to a version // identifier defined in the either .gnu.version_r or .gnu.version_d section. // The values 0 and 1 are reserved. All other values are used for versions in // the own object or in any of the dependencies. class VersionTableSection final : public SyntheticSection { … }; // The .gnu.version_r section defines the version identifiers used by // .gnu.version. It contains a linked list of Elf_Verneed data structures. Each // Elf_Verneed specifies the version requirements for a single DSO, and contains // a reference to a linked list of Elf_Vernaux data structures which define the // mapping from version identifiers to version names. template <class ELFT> class VersionNeedSection final : public SyntheticSection { … }; // MergeSyntheticSection is a class that allows us to put mergeable sections // with different attributes in a single output sections. To do that // we put them into MergeSyntheticSection synthetic input sections which are // attached to regular output sections. class MergeSyntheticSection : public SyntheticSection { … }; class MergeTailSection final : public MergeSyntheticSection { … }; class MergeNoTailSection final : public MergeSyntheticSection { … }; // .MIPS.abiflags section. template <class ELFT> class MipsAbiFlagsSection final : public SyntheticSection { … }; // .MIPS.options section. template <class ELFT> class MipsOptionsSection final : public SyntheticSection { … }; // MIPS .reginfo section. template <class ELFT> class MipsReginfoSection final : public SyntheticSection { … }; // This is a MIPS specific section to hold a space within the data segment // of executable file which is pointed to by the DT_MIPS_RLD_MAP entry. // See "Dynamic section" in Chapter 5 in the following document: // ftp://www.linux-mips.org/pub/linux/mips/doc/ABI/mipsabi.pdf class MipsRldMapSection final : public SyntheticSection { … }; // Representation of the combined .ARM.Exidx input sections. We process these // as a SyntheticSection like .eh_frame as we need to merge duplicate entries // and add terminating sentinel entries. // // The .ARM.exidx input sections after SHF_LINK_ORDER processing is done form // a table that the unwinder can derive (Addresses are encoded as offsets from // table): // | Address of function | Unwind instructions for function | // where the unwind instructions are either a small number of unwind or the // special EXIDX_CANTUNWIND entry representing no unwinding information. // When an exception is thrown from an address A, the unwinder searches the // table for the closest table entry with Address of function <= A. This means // that for two consecutive table entries: // | A1 | U1 | // | A2 | U2 | // The range of addresses described by U1 is [A1, A2) // // There are two cases where we need a linker generated table entry to fixup // the address ranges in the table // Case 1: // - A sentinel entry added with an address higher than all // executable sections. This was needed to work around libunwind bug pr31091. // - After address assignment we need to find the highest addressed executable // section and use the limit of that section so that the unwinder never // matches it. // Case 2: // - InputSections without a .ARM.exidx section (usually from Assembly) // need a table entry so that they terminate the range of the previously // function. This is pr40277. // // Instead of storing pointers to the .ARM.exidx InputSections from // InputObjects, we store pointers to the executable sections that need // .ARM.exidx sections. We can then use the dependentSections of these to // either find the .ARM.exidx section or know that we need to generate one. class ARMExidxSyntheticSection : public SyntheticSection { … }; // A container for one or more linker generated thunks. Instances of these // thunks including ARM interworking and Mips LA25 PI to non-PI thunks. class ThunkSection final : public SyntheticSection { … }; // Cortex-M Security Extensions. Prefix for functions that should be exported // for the non-secure world. const char ACLESESYM_PREFIX[] = …; const int ACLESESYM_SIZE = …; class ArmCmseSGVeneer; class ArmCmseSGSection final : public SyntheticSection { … }; // Used to compute outSecOff of .got2 in each object file. This is needed to // synthesize PLT entries for PPC32 Secure PLT ABI. class PPC32Got2Section final : public SyntheticSection { … }; // This section is used to store the addresses of functions that are called // in range-extending thunks on PowerPC64. When producing position dependent // code the addresses are link-time constants and the table is written out to // the binary. When producing position-dependent code the table is allocated and // filled in by the dynamic linker. class PPC64LongBranchTargetSection final : public SyntheticSection { … }; template <typename ELFT> class PartitionElfHeaderSection final : public SyntheticSection { … }; template <typename ELFT> class PartitionProgramHeadersSection final : public SyntheticSection { … }; class PartitionIndexSection final : public SyntheticSection { … }; // See the following link for the Android-specific loader code that operates on // this section: // https://cs.android.com/android/platform/superproject/+/master:bionic/libc/bionic/libc_init_static.cpp;drc=9425b16978f9c5aa8f2c50c873db470819480d1d;l=192 class MemtagAndroidNote final : public SyntheticSection { … }; class PackageMetadataNote final : public SyntheticSection { … }; class MemtagGlobalDescriptors final : public SyntheticSection { … }; template <class ELFT> void createSyntheticSections(); InputSection *createInterpSection(); MergeInputSection *createCommentSection(); template <class ELFT> void splitSections(); void combineEhSections(); bool hasMemtag(); bool canHaveMemtagGlobals(); template <typename ELFT> void writeEhdr(uint8_t *buf, Partition &part); template <typename ELFT> void writePhdrs(uint8_t *buf, Partition &part); Defined *addSyntheticLocal(StringRef name, uint8_t type, uint64_t value, uint64_t size, InputSectionBase §ion); void addVerneed(Symbol *ss); // Linker generated per-partition sections. struct Partition { … }; inline Partition &SectionBase::getPartition() const { … } // Linker generated sections which can be used as inputs and are not specific to // a partition. struct InStruct { … }; LLVM_LIBRARY_VISIBILITY extern InStruct in; } // namespace lld::elf #endif