1//===- Config.h -------------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLD_ELF_CONFIG_H
10#define LLD_ELF_CONFIG_H
11
12#include "lld/Common/ErrorHandler.h"
13#include "llvm/ADT/MapVector.h"
14#include "llvm/ADT/StringRef.h"
15#include "llvm/ADT/StringSet.h"
16#include "llvm/BinaryFormat/ELF.h"
17#include "llvm/Support/CachePruning.h"
18#include "llvm/Support/CodeGen.h"
19#include "llvm/Support/Endian.h"
20#include <atomic>
21#include <vector>
22
23namespace lld {
24namespace elf {
25
26class InputFile;
27class InputSectionBase;
28
29enum ELFKind {
30  ELFNoneKind,
31  ELF32LEKind,
32  ELF32BEKind,
33  ELF64LEKind,
34  ELF64BEKind
35};
36
37// For --build-id.
38enum class BuildIdKind { None, Fast, Md5, Sha1, Hexstring, Uuid };
39
40// For --discard-{all,locals,none}.
41enum class DiscardPolicy { Default, All, Locals, None };
42
43// For --icf={none,safe,all}.
44enum class ICFLevel { None, Safe, All };
45
46// For --strip-{all,debug}.
47enum class StripPolicy { None, All, Debug };
48
49// For --unresolved-symbols.
50enum class UnresolvedPolicy { ReportError, Warn, Ignore };
51
52// For --orphan-handling.
53enum class OrphanHandlingPolicy { Place, Warn, Error };
54
55// For --sort-section and linkerscript sorting rules.
56enum class SortSectionPolicy { Default, None, Alignment, Name, Priority };
57
58// For --target2
59enum class Target2Policy { Abs, Rel, GotRel };
60
61// For tracking ARM Float Argument PCS
62enum class ARMVFPArgKind { Default, Base, VFP, ToolChain };
63
64// For -z noseparate-code, -z separate-code and -z separate-loadable-segments.
65enum class SeparateSegmentKind { None, Code, Loadable };
66
67// For -z *stack
68enum class GnuStackKind { None, Exec, NoExec };
69
70struct SymbolVersion {
71  llvm::StringRef name;
72  bool isExternCpp;
73  bool hasWildcard;
74};
75
76// This struct contains symbols version definition that
77// can be found in version script if it is used for link.
78struct VersionDefinition {
79  llvm::StringRef name;
80  uint16_t id;
81  std::vector<SymbolVersion> patterns;
82};
83
84// This struct contains the global configuration for the linker.
85// Most fields are direct mapping from the command line options
86// and such fields have the same name as the corresponding options.
87// Most fields are initialized by the driver.
88struct Configuration {
89  uint8_t osabi = 0;
90  uint32_t andFeatures = 0;
91  llvm::CachePruningPolicy thinLTOCachePolicy;
92  llvm::StringMap<uint64_t> sectionStartMap;
93  llvm::StringRef chroot;
94  llvm::StringRef dynamicLinker;
95  llvm::StringRef dwoDir;
96  llvm::StringRef entry;
97  llvm::StringRef emulation;
98  llvm::StringRef fini;
99  llvm::StringRef init;
100  llvm::StringRef ltoAAPipeline;
101  llvm::StringRef ltoCSProfileFile;
102  llvm::StringRef ltoNewPmPasses;
103  llvm::StringRef ltoObjPath;
104  llvm::StringRef ltoSampleProfile;
105  llvm::StringRef mapFile;
106  llvm::StringRef outputFile;
107  llvm::StringRef optRemarksFilename;
108  llvm::StringRef optRemarksPasses;
109  llvm::StringRef optRemarksFormat;
110  llvm::StringRef progName;
111  llvm::StringRef printSymbolOrder;
112  llvm::StringRef soName;
113  llvm::StringRef sysroot;
114  llvm::StringRef thinLTOCacheDir;
115  llvm::StringRef thinLTOIndexOnlyArg;
116  std::pair<llvm::StringRef, llvm::StringRef> thinLTOObjectSuffixReplace;
117  std::pair<llvm::StringRef, llvm::StringRef> thinLTOPrefixReplace;
118  std::string rpath;
119  std::vector<VersionDefinition> versionDefinitions;
120  std::vector<llvm::StringRef> auxiliaryList;
121  std::vector<llvm::StringRef> filterList;
122  std::vector<llvm::StringRef> searchPaths;
123  std::vector<llvm::StringRef> symbolOrderingFile;
124  std::vector<llvm::StringRef> undefined;
125  std::vector<SymbolVersion> dynamicList;
126  std::vector<uint8_t> buildIdVector;
127  llvm::MapVector<std::pair<const InputSectionBase *, const InputSectionBase *>,
128                  uint64_t>
129      callGraphProfile;
130  bool allowMultipleDefinition;
131  bool allowShlibUndefined;
132  bool androidPackDynRelocs;
133  bool armHasBlx = false;
134  bool armHasMovtMovw = false;
135  bool armJ1J2BranchEncoding = false;
136  bool asNeeded = false;
137  bool bsymbolic;
138  bool bsymbolicFunctions;
139  bool callGraphProfileSort;
140  bool checkSections;
141  bool compressDebugSections;
142  bool cref;
143  bool defineCommon;
144  bool demangle = true;
145  bool dependentLibraries;
146  bool disableVerify;
147  bool ehFrameHdr;
148  bool emitLLVM;
149  bool emitRelocs;
150  bool enableNewDtags;
151  bool executeOnly;
152  bool exportDynamic;
153  bool fixCortexA53Errata843419;
154  bool fixCortexA8;
155  bool forceBTI;
156  bool formatBinary = false;
157  bool gcSections;
158  bool gdbIndex;
159  bool gnuHash = false;
160  bool gnuUnique;
161  bool hasDynamicList = false;
162  bool hasDynSymTab;
163  bool ignoreDataAddressEquality;
164  bool ignoreFunctionAddressEquality;
165  bool ltoCSProfileGenerate;
166  bool ltoDebugPassManager;
167  bool ltoNewPassManager;
168  bool mergeArmExidx;
169  bool mipsN32Abi = false;
170  bool mmapOutputFile;
171  bool nmagic;
172  bool noDynamicLinker = false;
173  bool noinhibitExec;
174  bool nostdlib;
175  bool oFormatBinary;
176  bool omagic;
177  bool optRemarksWithHotness;
178  bool pacPlt;
179  bool picThunk;
180  bool pie;
181  bool printGcSections;
182  bool printIcfSections;
183  bool relocatable;
184  bool relrPackDynRelocs;
185  bool saveTemps;
186  bool singleRoRx;
187  bool shared;
188  bool isStatic = false;
189  bool sysvHash = false;
190  bool target1Rel;
191  bool trace;
192  bool thinLTOEmitImportsFiles;
193  bool thinLTOIndexOnly;
194  bool tocOptimize;
195  bool undefinedVersion;
196  bool useAndroidRelrTags = false;
197  bool warnBackrefs;
198  bool warnCommon;
199  bool warnIfuncTextrel;
200  bool warnMissingEntry;
201  bool warnSymbolOrdering;
202  bool writeAddends;
203  bool zCombreloc;
204  bool zCopyreloc;
205  bool zForceIbt;
206  bool zGlobal;
207  bool zHazardplt;
208  bool zIfuncNoplt;
209  bool zInitfirst;
210  bool zInterpose;
211  bool zKeepTextSectionPrefix;
212  bool zNodefaultlib;
213  bool zNodelete;
214  bool zNodlopen;
215  bool zNow;
216  bool zOrigin;
217  bool zRelro;
218  bool zRodynamic;
219  bool zShstk;
220  bool zText;
221  bool zRetpolineplt;
222  bool zWxneeded;
223  DiscardPolicy discard;
224  GnuStackKind zGnustack;
225  ICFLevel icf;
226  OrphanHandlingPolicy orphanHandling;
227  SortSectionPolicy sortSection;
228  StripPolicy strip;
229  UnresolvedPolicy unresolvedSymbols;
230  Target2Policy target2;
231  ARMVFPArgKind armVFPArgs = ARMVFPArgKind::Default;
232  BuildIdKind buildId = BuildIdKind::None;
233  SeparateSegmentKind zSeparate;
234  ELFKind ekind = ELFNoneKind;
235  uint16_t emachine = llvm::ELF::EM_NONE;
236  llvm::Optional<uint64_t> imageBase;
237  uint64_t commonPageSize;
238  uint64_t maxPageSize;
239  uint64_t mipsGotSize;
240  uint64_t zStackSize;
241  unsigned ltoPartitions;
242  unsigned ltoo;
243  unsigned optimize;
244  unsigned thinLTOJobs;
245  int32_t splitStackAdjustSize;
246
247  // The following config options do not directly correspond to any
248  // particular command line options.
249
250  // True if we need to pass through relocations in input files to the
251  // output file. Usually false because we consume relocations.
252  bool copyRelocs;
253
254  // True if the target is ELF64. False if ELF32.
255  bool is64;
256
257  // True if the target is little-endian. False if big-endian.
258  bool isLE;
259
260  // endianness::little if isLE is true. endianness::big otherwise.
261  llvm::support::endianness endianness;
262
263  // True if the target is the little-endian MIPS64.
264  //
265  // The reason why we have this variable only for the MIPS is because
266  // we use this often.  Some ELF headers for MIPS64EL are in a
267  // mixed-endian (which is horrible and I'd say that's a serious spec
268  // bug), and we need to know whether we are reading MIPS ELF files or
269  // not in various places.
270  //
271  // (Note that MIPS64EL is not a typo for MIPS64LE. This is the official
272  // name whatever that means. A fun hypothesis is that "EL" is short for
273  // little-endian written in the little-endian order, but I don't know
274  // if that's true.)
275  bool isMips64EL;
276
277  // True if we need to set the DF_STATIC_TLS flag to an output file,
278  // which works as a hint to the dynamic loader that the file contains
279  // code compiled with the static TLS model. The thread-local variable
280  // compiled with the static TLS model is faster but less flexible, and
281  // it may not be loaded using dlopen().
282  //
283  // We set this flag to true when we see a relocation for the static TLS
284  // model. Once this becomes true, it will never become false.
285  //
286  // Since the flag is updated by multi-threaded code, we use std::atomic.
287  // (Writing to a variable is not considered thread-safe even if the
288  // variable is boolean and we always set the same value from all threads.)
289  std::atomic<bool> hasStaticTlsModel{false};
290
291  // Holds set of ELF header flags for the target.
292  uint32_t eflags = 0;
293
294  // The ELF spec defines two types of relocation table entries, RELA and
295  // REL. RELA is a triplet of (offset, info, addend) while REL is a
296  // tuple of (offset, info). Addends for REL are implicit and read from
297  // the location where the relocations are applied. So, REL is more
298  // compact than RELA but requires a bit of more work to process.
299  //
300  // (From the linker writer's view, this distinction is not necessary.
301  // If the ELF had chosen whichever and sticked with it, it would have
302  // been easier to write code to process relocations, but it's too late
303  // to change the spec.)
304  //
305  // Each ABI defines its relocation type. IsRela is true if target
306  // uses RELA. As far as we know, all 64-bit ABIs are using RELA. A
307  // few 32-bit ABIs are using RELA too.
308  bool isRela;
309
310  // True if we are creating position-independent code.
311  bool isPic;
312
313  // 4 for ELF32, 8 for ELF64.
314  int wordsize;
315};
316
317// The only instance of Configuration struct.
318extern Configuration *config;
319
320// The first two elements of versionDefinitions represent VER_NDX_LOCAL and
321// VER_NDX_GLOBAL. This helper returns other elements.
322static inline ArrayRef<VersionDefinition> namedVersionDefs() {
323  return llvm::makeArrayRef(config->versionDefinitions).slice(2);
324}
325
326static inline void errorOrWarn(const Twine &msg) {
327  if (!config->noinhibitExec)
328    error(msg);
329  else
330    warn(msg);
331}
332} // namespace elf
333} // namespace lld
334
335#endif
336