blob: 1840978fdea7cf297c76a41d020723c28a8aa590 [file] [log] [blame]
Rui Ueyama717677a2016-02-11 21:17:59 +00001//===- LinkerScript.h -------------------------------------------*- C++ -*-===//
2//
3// The LLVM Linker
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef LLD_ELF_LINKER_SCRIPT_H
11#define LLD_ELF_LINKER_SCRIPT_H
12
George Rimarbe394db2016-09-16 20:21:55 +000013#include "Config.h"
George Rimarc91930a2016-09-02 21:17:20 +000014#include "Strings.h"
Eugene Leviantbbe38602016-07-19 09:25:43 +000015#include "Writer.h"
Rui Ueyama717677a2016-02-11 21:17:59 +000016#include "lld/Core/LLVM.h"
Eugene Zelenko22886a22016-11-05 01:00:56 +000017#include "llvm/ADT/ArrayRef.h"
Rafael Espindolad3190792016-09-16 15:10:23 +000018#include "llvm/ADT/DenseSet.h"
Eugene Zelenko22886a22016-11-05 01:00:56 +000019#include "llvm/ADT/StringRef.h"
Rui Ueyamaf9de0d62016-02-11 21:38:55 +000020#include "llvm/Support/MemoryBuffer.h"
Eugene Zelenko22886a22016-11-05 01:00:56 +000021#include <cstddef>
22#include <cstdint>
Rui Ueyama8c6a5aa2016-11-05 22:37:59 +000023#include <functional>
Eugene Zelenko22886a22016-11-05 01:00:56 +000024#include <memory>
25#include <vector>
Rui Ueyama717677a2016-02-11 21:17:59 +000026
27namespace lld {
Rafael Espindolae0df00b2016-02-28 00:25:54 +000028namespace elf {
Eugene Zelenko22886a22016-11-05 01:00:56 +000029
Rafael Espindolae7553e42016-08-31 13:28:33 +000030class DefinedCommon;
George Rimardbb76db2016-08-18 13:00:49 +000031class ScriptParser;
Rui Ueyama8d083e62016-07-29 05:48:39 +000032class SymbolBody;
Eugene Leviante63d81b2016-07-20 14:43:20 +000033template <class ELFT> class InputSectionBase;
Rafael Espindolad3190792016-09-16 15:10:23 +000034template <class ELFT> class InputSection;
Rafael Espindolae08e78d2016-11-09 23:23:45 +000035class OutputSectionBase;
Eugene Leviante63d81b2016-07-20 14:43:20 +000036template <class ELFT> class OutputSectionFactory;
Eugene Leviant97403d12016-09-01 09:55:57 +000037class InputSectionData;
Rui Ueyama717677a2016-02-11 21:17:59 +000038
Rui Ueyamab04af132016-10-13 23:08:33 +000039// This represents an expression in the linker script.
40// ScriptParser::readExpr reads an expression and returns an Expr.
41// Later, we evaluate the expression by calling the function
42// with the value of special context variable ".".
Rafael Espindolaf6613932016-10-31 17:43:38 +000043struct Expr {
44 std::function<uint64_t(uint64_t)> Val;
Rafael Espindola2f831dc2016-10-31 19:56:37 +000045 std::function<bool()> IsAbsolute;
Rafael Espindolaf6613932016-10-31 17:43:38 +000046 uint64_t operator()(uint64_t Dot) const { return Val(Dot); }
47 operator bool() const { return (bool)Val; }
48
Rafael Espindolab0de56b2016-10-31 21:36:23 +000049 Expr(std::function<uint64_t(uint64_t)> Val, std::function<bool()> IsAbsolute)
Rafael Espindola2f831dc2016-10-31 19:56:37 +000050 : Val(Val), IsAbsolute(IsAbsolute) {}
Rafael Espindolab0de56b2016-10-31 21:36:23 +000051 template <typename T> Expr(T V) : Expr(V, []() { return true; }) {}
Rafael Espindolaf6613932016-10-31 17:43:38 +000052 Expr() : Expr(nullptr) {}
53};
Rui Ueyama708019c2016-07-24 18:19:40 +000054
Rui Ueyama07320e42016-04-20 20:13:41 +000055// Parses a linker script. Calling this function updates
56// Config and ScriptConfig.
57void readLinkerScript(MemoryBufferRef MB);
58
Rui Ueyamab04af132016-10-13 23:08:33 +000059// Parses a version script.
George Rimar20b65982016-08-31 09:08:26 +000060void readVersionScript(MemoryBufferRef MB);
61
George Rimareea31142016-07-21 14:26:59 +000062// This enum is used to implement linker script SECTIONS command.
63// https://sourceware.org/binutils/docs/ld/SECTIONS.html#SECTIONS
64enum SectionsCommandKind {
George Rimare38cbab2016-09-26 19:22:50 +000065 AssignmentKind, // . = expr or <sym> = expr
George Rimareea31142016-07-21 14:26:59 +000066 OutputSectionKind,
George Rimareefa7582016-08-04 09:29:31 +000067 InputSectionKind,
George Rimare38cbab2016-09-26 19:22:50 +000068 AssertKind, // ASSERT(expr)
69 BytesDataKind // BYTE(expr), SHORT(expr), LONG(expr) or QUAD(expr)
Rui Ueyama1ebc8ed2016-02-12 21:47:28 +000070};
71
George Rimar076fe152016-07-21 06:43:01 +000072struct BaseCommand {
73 BaseCommand(int K) : Kind(K) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +000074
75 virtual ~BaseCommand() = default;
76
George Rimar076fe152016-07-21 06:43:01 +000077 int Kind;
78};
79
Rui Ueyamab04af132016-10-13 23:08:33 +000080// This represents ". = <expr>" or "<symbol> = <expr>".
George Rimar076fe152016-07-21 06:43:01 +000081struct SymbolAssignment : BaseCommand {
Rafael Espindolaf6613932016-10-31 17:43:38 +000082 SymbolAssignment(StringRef Name, Expr E)
83 : BaseCommand(AssignmentKind), Name(Name), Expression(E) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +000084
George Rimar076fe152016-07-21 06:43:01 +000085 static bool classof(const BaseCommand *C);
Rui Ueyama20204242016-07-29 05:52:33 +000086
87 // The LHS of an expression. Name is either a symbol name or ".".
George Rimar076fe152016-07-21 06:43:01 +000088 StringRef Name;
Rui Ueyama20204242016-07-29 05:52:33 +000089 SymbolBody *Sym = nullptr;
90
91 // The RHS of an expression.
Rui Ueyama708019c2016-07-24 18:19:40 +000092 Expr Expression;
Rui Ueyama20204242016-07-29 05:52:33 +000093
94 // Command attributes for PROVIDE, HIDDEN and PROVIDE_HIDDEN.
Eugene Levianta31c91b2016-07-22 07:38:40 +000095 bool Provide = false;
Eugene Levianta31c91b2016-07-22 07:38:40 +000096 bool Hidden = false;
George Rimar076fe152016-07-21 06:43:01 +000097};
98
Davide Italiano246f6812016-07-22 03:36:24 +000099// Linker scripts allow additional constraints to be put on ouput sections.
Rui Ueyamab04af132016-10-13 23:08:33 +0000100// If an output section is marked as ONLY_IF_RO, the section is created
101// only if its input sections are read-only. Likewise, an output section
102// with ONLY_IF_RW is created if all input sections are RW.
Rui Ueyamaefc40662016-07-25 22:00:10 +0000103enum class ConstraintKind { NoConstraint, ReadOnly, ReadWrite };
Davide Italiano246f6812016-07-22 03:36:24 +0000104
George Rimar076fe152016-07-21 06:43:01 +0000105struct OutputSectionCommand : BaseCommand {
106 OutputSectionCommand(StringRef Name)
107 : BaseCommand(OutputSectionKind), Name(Name) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +0000108
George Rimar076fe152016-07-21 06:43:01 +0000109 static bool classof(const BaseCommand *C);
Eugene Zelenko22886a22016-11-05 01:00:56 +0000110
Eugene Levianteda81a12016-07-12 06:39:48 +0000111 StringRef Name;
George Rimar58e5c4d2016-07-25 08:29:46 +0000112 Expr AddrExpr;
George Rimar630c6172016-07-26 18:06:29 +0000113 Expr AlignExpr;
Eugene Leviantb71d6f72016-10-06 09:39:28 +0000114 Expr LMAExpr;
George Rimardb24d9c2016-08-19 15:18:23 +0000115 Expr SubalignExpr;
George Rimareea31142016-07-21 14:26:59 +0000116 std::vector<std::unique_ptr<BaseCommand>> Commands;
Eugene Leviantbbe38602016-07-19 09:25:43 +0000117 std::vector<StringRef> Phdrs;
George Rimar076fe152016-07-21 06:43:01 +0000118 std::vector<uint8_t> Filler;
Rui Ueyamaefc40662016-07-25 22:00:10 +0000119 ConstraintKind Constraint = ConstraintKind::NoConstraint;
Eugene Leviantbbe38602016-07-19 09:25:43 +0000120};
121
George Rimar8034d492016-09-17 07:31:49 +0000122// This struct represents one section match pattern in SECTIONS() command.
Rui Ueyama4dc07be2016-09-17 02:23:40 +0000123// It can optionally have negative match pattern for EXCLUDED_FILE command.
George Rimar07171f22016-09-21 15:56:44 +0000124// Also it may be surrounded with SORT() command, so contains sorting rules.
Rui Ueyama4dc07be2016-09-17 02:23:40 +0000125struct SectionPattern {
Rui Ueyamaf91282e2016-11-03 17:57:38 +0000126 SectionPattern(StringMatcher &&Pat1, StringMatcher &&Pat2)
127 : ExcludedFilePat(Pat1), SectionPat(Pat2) {}
Rui Ueyamad1d7cfc2016-09-20 00:02:06 +0000128
Rui Ueyamaf91282e2016-11-03 17:57:38 +0000129 StringMatcher ExcludedFilePat;
130 StringMatcher SectionPat;
George Rimar07171f22016-09-21 15:56:44 +0000131 SortSectionPolicy SortOuter;
132 SortSectionPolicy SortInner;
Rui Ueyama4dc07be2016-09-17 02:23:40 +0000133};
134
George Rimareea31142016-07-21 14:26:59 +0000135struct InputSectionDescription : BaseCommand {
George Rimarc91930a2016-09-02 21:17:20 +0000136 InputSectionDescription(StringRef FilePattern)
Rui Ueyamaf91282e2016-11-03 17:57:38 +0000137 : BaseCommand(InputSectionKind), FilePat({FilePattern}) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +0000138
George Rimareea31142016-07-21 14:26:59 +0000139 static bool classof(const BaseCommand *C);
Eugene Zelenko22886a22016-11-05 01:00:56 +0000140
Rui Ueyamaf91282e2016-11-03 17:57:38 +0000141 StringMatcher FilePat;
Rui Ueyama4dc07be2016-09-17 02:23:40 +0000142
George Rimar8034d492016-09-17 07:31:49 +0000143 // Input sections that matches at least one of SectionPatterns
Rui Ueyama70efa2f2016-09-17 02:34:50 +0000144 // will be associated with this InputSectionDescription.
Rui Ueyamad1d7cfc2016-09-20 00:02:06 +0000145 std::vector<SectionPattern> SectionPatterns;
Rui Ueyama4dc07be2016-09-17 02:23:40 +0000146
Rafael Espindolad3190792016-09-16 15:10:23 +0000147 std::vector<InputSectionData *> Sections;
George Rimareea31142016-07-21 14:26:59 +0000148};
149
Rui Ueyamab04af132016-10-13 23:08:33 +0000150// Represents an ASSERT().
George Rimareefa7582016-08-04 09:29:31 +0000151struct AssertCommand : BaseCommand {
152 AssertCommand(Expr E) : BaseCommand(AssertKind), Expression(E) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +0000153
George Rimareefa7582016-08-04 09:29:31 +0000154 static bool classof(const BaseCommand *C);
Eugene Zelenko22886a22016-11-05 01:00:56 +0000155
George Rimareefa7582016-08-04 09:29:31 +0000156 Expr Expression;
157};
158
Rui Ueyamab04af132016-10-13 23:08:33 +0000159// Represents BYTE(), SHORT(), LONG(), or QUAD().
George Rimare38cbab2016-09-26 19:22:50 +0000160struct BytesDataCommand : BaseCommand {
161 BytesDataCommand(uint64_t Data, unsigned Size)
162 : BaseCommand(BytesDataKind), Data(Data), Size(Size) {}
Eugene Zelenko22886a22016-11-05 01:00:56 +0000163
George Rimare38cbab2016-09-26 19:22:50 +0000164 static bool classof(const BaseCommand *C);
Eugene Zelenko22886a22016-11-05 01:00:56 +0000165
George Rimare38cbab2016-09-26 19:22:50 +0000166 uint64_t Data;
167 unsigned Offset;
168 unsigned Size;
169};
170
Eugene Leviantbbe38602016-07-19 09:25:43 +0000171struct PhdrsCommand {
172 StringRef Name;
173 unsigned Type;
174 bool HasFilehdr;
175 bool HasPhdrs;
Eugene Leviant865bf862016-07-21 10:43:25 +0000176 unsigned Flags;
Eugene Leviant56b21c82016-09-09 09:46:16 +0000177 Expr LMAExpr;
George Rimar652852c2016-04-16 10:10:32 +0000178};
179
George Rimar884e7862016-09-08 08:19:13 +0000180class LinkerScriptBase {
Rafael Espindola4d1e4d72016-09-08 14:11:08 +0000181protected:
182 ~LinkerScriptBase() = default;
183
George Rimar884e7862016-09-08 08:19:13 +0000184public:
185 virtual uint64_t getOutputSectionAddress(StringRef Name) = 0;
186 virtual uint64_t getOutputSectionSize(StringRef Name) = 0;
Eugene Leviant36fac7f2016-09-08 09:08:30 +0000187 virtual uint64_t getOutputSectionAlign(StringRef Name) = 0;
Eugene Leviantb71d6f72016-10-06 09:39:28 +0000188 virtual uint64_t getOutputSectionLMA(StringRef Name) = 0;
George Rimar884e7862016-09-08 08:19:13 +0000189 virtual uint64_t getHeaderSize() = 0;
190 virtual uint64_t getSymbolValue(StringRef S) = 0;
George Rimarf34f45f2016-09-23 13:17:23 +0000191 virtual bool isDefined(StringRef S) = 0;
Rafael Espindola2f831dc2016-10-31 19:56:37 +0000192 virtual bool isAbsolute(StringRef S) = 0;
George Rimar884e7862016-09-08 08:19:13 +0000193};
194
Rui Ueyama07320e42016-04-20 20:13:41 +0000195// ScriptConfiguration holds linker script parse results.
196struct ScriptConfiguration {
George Rimar652852c2016-04-16 10:10:32 +0000197 // Used to assign addresses to sections.
George Rimar076fe152016-07-21 06:43:01 +0000198 std::vector<std::unique_ptr<BaseCommand>> Commands;
George Rimar652852c2016-04-16 10:10:32 +0000199
Eugene Leviantbbe38602016-07-19 09:25:43 +0000200 // Used to assign sections to headers.
George Rimar70ce0a92016-07-20 15:09:10 +0000201 std::vector<PhdrsCommand> PhdrsCommands;
202
Eugene Leviante05336ff2016-09-14 08:32:36 +0000203 bool HasSections = false;
Rui Ueyama07320e42016-04-20 20:13:41 +0000204
Rui Ueyama8ec77e62016-04-21 22:00:51 +0000205 // List of section patterns specified with KEEP commands. They will
206 // be kept even if they are unused and --gc-sections is specified.
Eugene Leviantcf43f172016-10-05 09:36:59 +0000207 std::vector<InputSectionDescription *> KeptSections;
Rui Ueyama717677a2016-02-11 21:17:59 +0000208};
209
Rui Ueyama07320e42016-04-20 20:13:41 +0000210extern ScriptConfiguration *ScriptConfig;
211
212// This is a runner of the linker script.
George Rimar884e7862016-09-08 08:19:13 +0000213template <class ELFT> class LinkerScript final : public LinkerScriptBase {
Rui Ueyama0b3868e2016-04-22 20:41:07 +0000214 typedef typename ELFT::uint uintX_t;
215
Rui Ueyama07320e42016-04-20 20:13:41 +0000216public:
Rui Ueyamaf34d0e02016-08-12 01:24:53 +0000217 LinkerScript();
218 ~LinkerScript();
Eugene Zelenko22886a22016-11-05 01:00:56 +0000219
Eugene Leviant20d03192016-09-16 15:30:47 +0000220 void processCommands(OutputSectionFactory<ELFT> &Factory);
Rafael Espindolaa4b41dc2016-08-04 12:13:05 +0000221 void createSections(OutputSectionFactory<ELFT> &Factory);
Rafael Espindola9546fff2016-09-22 14:40:50 +0000222 void adjustSectionsBeforeSorting();
Rui Ueyamaa7f78842016-07-20 17:19:03 +0000223
Rafael Espindolaa4b41dc2016-08-04 12:13:05 +0000224 std::vector<PhdrEntry<ELFT>> createPhdrs();
Eugene Leviantf9bc3bd2016-08-16 06:40:58 +0000225 bool ignoreInterpSection();
Rui Ueyamaadca2452016-07-23 14:18:48 +0000226
Rui Ueyama07320e42016-04-20 20:13:41 +0000227 ArrayRef<uint8_t> getFiller(StringRef Name);
George Rimare38cbab2016-09-26 19:22:50 +0000228 void writeDataBytes(StringRef Name, uint8_t *Buf);
Eugene Leviantb71d6f72016-10-06 09:39:28 +0000229 bool hasLMA(StringRef Name);
Rui Ueyama07320e42016-04-20 20:13:41 +0000230 bool shouldKeep(InputSectionBase<ELFT> *S);
Rafael Espindolad3190792016-09-16 15:10:23 +0000231 void assignOffsets(OutputSectionCommand *Cmd);
Rafael Espindola6d91fce2016-09-29 18:50:34 +0000232 void assignAddresses(std::vector<PhdrEntry<ELFT>> &Phdrs);
Eugene Leviantbbe38602016-07-19 09:25:43 +0000233 bool hasPhdrsCommands();
George Rimar884e7862016-09-08 08:19:13 +0000234 uint64_t getOutputSectionAddress(StringRef Name) override;
235 uint64_t getOutputSectionSize(StringRef Name) override;
Eugene Leviant36fac7f2016-09-08 09:08:30 +0000236 uint64_t getOutputSectionAlign(StringRef Name) override;
Eugene Leviantb71d6f72016-10-06 09:39:28 +0000237 uint64_t getOutputSectionLMA(StringRef Name) override;
George Rimar884e7862016-09-08 08:19:13 +0000238 uint64_t getHeaderSize() override;
239 uint64_t getSymbolValue(StringRef S) override;
George Rimarf34f45f2016-09-23 13:17:23 +0000240 bool isDefined(StringRef S) override;
Rafael Espindola2f831dc2016-10-31 19:56:37 +0000241 bool isAbsolute(StringRef S) override;
Rui Ueyama07320e42016-04-20 20:13:41 +0000242
Rafael Espindolae08e78d2016-11-09 23:23:45 +0000243 std::vector<OutputSectionBase *> *OutputSections;
Rafael Espindolaa4b41dc2016-08-04 12:13:05 +0000244
Rafael Espindolab6b8f6c2016-09-20 22:43:15 +0000245 int getSectionIndex(StringRef Name);
246
Rui Ueyama07320e42016-04-20 20:13:41 +0000247private:
Rafael Espindolae71a3f8a2016-09-16 20:34:02 +0000248 void computeInputSections(InputSectionDescription *);
Rui Ueyama6b274812016-07-25 22:51:07 +0000249
Eugene Leviant20d03192016-09-16 15:30:47 +0000250 void addSection(OutputSectionFactory<ELFT> &Factory,
251 InputSectionBase<ELFT> *Sec, StringRef Name);
Rafael Espindola7bd37872016-09-12 16:05:16 +0000252 void discard(ArrayRef<InputSectionBase<ELFT> *> V);
Rui Ueyama48c3f1c2016-08-12 00:27:23 +0000253
Rui Ueyama0b9ce6a2016-08-12 03:16:56 +0000254 std::vector<InputSectionBase<ELFT> *>
255 createInputSectionList(OutputSectionCommand &Cmd);
256
Rui Ueyamac998a8c2016-04-22 00:03:13 +0000257 // "ScriptConfig" is a bit too long, so define a short name for it.
258 ScriptConfiguration &Opt = *ScriptConfig;
259
Rui Ueyamaedebbdf2016-07-24 23:47:31 +0000260 std::vector<size_t> getPhdrIndices(StringRef SectionName);
Rui Ueyama29c5a2a2016-07-26 00:27:36 +0000261 size_t getPhdrIndex(StringRef PhdrName);
Rui Ueyama07320e42016-04-20 20:13:41 +0000262
Rui Ueyama0b3868e2016-04-22 20:41:07 +0000263 uintX_t Dot;
Eugene Leviantb71d6f72016-10-06 09:39:28 +0000264 uintX_t LMAOffset = 0;
Rafael Espindolae08e78d2016-11-09 23:23:45 +0000265 OutputSectionBase *CurOutSec = nullptr;
Rafael Espindolad3190792016-09-16 15:10:23 +0000266 uintX_t ThreadBssOffset = 0;
Rafael Espindolae08e78d2016-11-09 23:23:45 +0000267 void switchTo(OutputSectionBase *Sec);
Rafael Espindolad3190792016-09-16 15:10:23 +0000268 void flush();
269 void output(InputSection<ELFT> *Sec);
270 void process(BaseCommand &Base);
Rafael Espindolae08e78d2016-11-09 23:23:45 +0000271 llvm::DenseSet<OutputSectionBase *> AlreadyOutputOS;
Rafael Espindolad3190792016-09-16 15:10:23 +0000272 llvm::DenseSet<InputSectionData *> AlreadyOutputIS;
Rui Ueyama07320e42016-04-20 20:13:41 +0000273};
274
275// Variable template is a C++14 feature, so we can't template
276// a global variable. Use a struct to workaround.
277template <class ELFT> struct Script { static LinkerScript<ELFT> *X; };
278template <class ELFT> LinkerScript<ELFT> *Script<ELFT>::X;
Rui Ueyama717677a2016-02-11 21:17:59 +0000279
George Rimar884e7862016-09-08 08:19:13 +0000280extern LinkerScriptBase *ScriptBase;
281
Eugene Zelenko22886a22016-11-05 01:00:56 +0000282} // end namespace elf
283} // end namespace lld
Rui Ueyama717677a2016-02-11 21:17:59 +0000284
Eugene Zelenko22886a22016-11-05 01:00:56 +0000285#endif // LLD_ELF_LINKER_SCRIPT_H