diff options
author | Fangrui Song <maskray@google.com> | 2020-02-10 15:58:29 -0800 |
---|---|---|
committer | Fangrui Song <maskray@google.com> | 2020-02-12 08:21:52 -0800 |
commit | 7c426fb1a6d4b7db2517529ec5d863b380479249 (patch) | |
tree | a2429abe1e6aa04bceaf56cc0d60dc29efc871b1 /lld/ELF/LinkerScript.h | |
parent | b498d99338f868bcab3384b4e58f8a4d764fa48b (diff) | |
download | llvm-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.h | 13 |
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; |