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/Writer.cpp | |
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/Writer.cpp')
-rw-r--r-- | lld/ELF/Writer.cpp | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 7c2a3fe..e3e39ac 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -1420,9 +1420,15 @@ template <class ELFT> void Writer<ELFT>::sortSections() { llvm::find_if(script->sectionCommands, isSection), llvm::find_if(llvm::reverse(script->sectionCommands), isSection).base(), compareSections); + + // Process INSERT commands. From this point onwards the order of + // script->sectionCommands is fixed. + script->processInsertCommands(); return; } + script->processInsertCommands(); + // Orphan sections are sections present in the input files which are // not explicitly placed into the output file by the linker script. // |