//===- LinkerScript.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 // //===----------------------------------------------------------------------===// #ifndef LLD_ELF_LINKER_SCRIPT_H #define LLD_ELF_LINKER_SCRIPT_H #include "Config.h" #include "InputSection.h" #include "Writer.h" #include "lld/Common/LLVM.h" #include "lld/Common/Strings.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseMap.h" #include "llvm/ADT/MapVector.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/Compiler.h" #include <cstddef> #include <cstdint> #include <functional> #include <memory> namespace lld::elf { class Defined; class InputFile; class InputSection; class InputSectionBase; class OutputSection; class SectionBase; class ThunkSection; struct OutputDesc; struct SectionClass; struct SectionClassDesc; // This represents an r-value in the linker script. struct ExprValue { … }; // This represents an expression in the linker script. // ScriptParser::readExpr reads an expression and returns an Expr. // Later, we evaluate the expression by calling the function. Expr; // This enum is used to implement linker script SECTIONS command. // https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS enum SectionsCommandKind { … }; struct SectionCommand { … }; // This represents ". = <expr>" or "<symbol> = <expr>". struct SymbolAssignment : SectionCommand { … }; // Linker scripts allow additional constraints to be put on output sections. // If an output section is marked as ONLY_IF_RO, the section is created // only if its input sections are read-only. Likewise, an output section // with ONLY_IF_RW is created if all input sections are RW. enum class ConstraintKind { … }; // This struct is used to represent the location and size of regions of // target memory. Instances of the struct are created by parsing the // MEMORY command. struct MemoryRegion { … }; // This struct represents one section match pattern in SECTIONS() command. // It can optionally have negative match pattern for EXCLUDED_FILE command. // Also it may be surrounded with SORT() command, so contains sorting rules. class SectionPattern { … }; class InputSectionDescription : public SectionCommand { … }; // Represents BYTE(), SHORT(), LONG(), or QUAD(). struct ByteCommand : SectionCommand { … }; struct InsertCommand { … }; // A NOCROSSREFS/NOCROSSREFS_TO command that prohibits references between // certain output sections. struct NoCrossRefCommand { … }; struct PhdrsCommand { … }; class LinkerScript final { … }; } // end namespace lld::elf #endif // LLD_ELF_LINKER_SCRIPT_H