aboutsummaryrefslogtreecommitdiff
path: root/lld/ELF/LinkerScript.h
diff options
context:
space:
mode:
authorFangrui Song <maskray@google.com>2020-02-10 15:58:29 -0800
committerFangrui Song <maskray@google.com>2020-02-12 08:21:52 -0800
commit7c426fb1a6d4b7db2517529ec5d863b380479249 (patch)
treea2429abe1e6aa04bceaf56cc0d60dc29efc871b1 /lld/ELF/LinkerScript.h
parentb498d99338f868bcab3384b4e58f8a4d764fa48b (diff)
downloadllvm-7c426fb1a6d4b7db2517529ec5d863b380479249.zip
llvm-7c426fb1a6d4b7db2517529ec5d863b380479249.tar.gz
llvm-7c426fb1a6d4b7db2517529ec5d863b380479249.tar.bz2
[ELF] Support INSERT [AFTER|BEFORE] for orphan sections
D43468+D44380 added INSERT [AFTER|BEFORE] for non-orphan sections. This patch makes INSERT work for orphan sections as well. `SECTIONS {...} INSERT [AFTER|BEFORE] .foo` does not set `hasSectionCommands`, so the result will be similar to a regular link without a linker script. The differences when `hasSectionCommands` is set include: * image base is different * -z noseparate-code/-z noseparate-loadable-segments are unavailable * some special symbols such as `_end _etext _edata` are not defined The behavior is similar to GNU ld: INSERT is not considered an external linker script. This feature makes the section layout more flexible. It can be used to: * Place .nv_fatbin before other readonly SHT_PROGBITS sections to mitigate relocation overflows. * Disturb the layout to expose address sensitive application bugs. Reviewed By: grimar Differential Revision: https://reviews.llvm.org/D74375
Diffstat (limited to 'lld/ELF/LinkerScript.h')
-rw-r--r--lld/ELF/LinkerScript.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/lld/ELF/LinkerScript.h b/lld/ELF/LinkerScript.h
index f020552..848e3e4 100644
--- a/lld/ELF/LinkerScript.h
+++ b/lld/ELF/LinkerScript.h
@@ -208,6 +208,12 @@ struct ByteCommand : BaseCommand {
unsigned size;
};
+struct InsertCommand {
+ OutputSection *os;
+ bool isAfter;
+ StringRef where;
+};
+
struct PhdrsCommand {
StringRef name;
unsigned type = llvm::ELF::PT_NULL;
@@ -311,10 +317,9 @@ public:
// A list of symbols referenced by the script.
std::vector<llvm::StringRef> referencedSymbols;
- // Used to implement INSERT [AFTER|BEFORE]. Contains commands that need
- // to be inserted into SECTIONS commands list.
- llvm::DenseMap<StringRef, std::vector<BaseCommand *>> insertAfterCommands;
- llvm::DenseMap<StringRef, std::vector<BaseCommand *>> insertBeforeCommands;
+ // Used to implement INSERT [AFTER|BEFORE]. Contains output sections that need
+ // to be reordered.
+ std::vector<InsertCommand> insertCommands;
};
extern LinkerScript *script;