summaryrefslogtreecommitdiffstats
path: root/lld
diff options
context:
space:
mode:
authorMartin Storsjo <martin@martin.st>2018-07-20 18:43:35 +0000
committerMartin Storsjo <martin@martin.st>2018-07-20 18:43:35 +0000
commit98ff9f845ded3df23b5c0a6386e3bba96d9bb557 (patch)
treec2add5dca3b9c0272d16fc8ffd622f4e47114b62 /lld
parentd463453d815bee1d69739ba94934ffc7f538e97f (diff)
downloadbcm5719-llvm-98ff9f845ded3df23b5c0a6386e3bba96d9bb557.tar.gz
bcm5719-llvm-98ff9f845ded3df23b5c0a6386e3bba96d9bb557.zip
[COFF] Sort .reloc before all other discardable sections
If a binary is stripped, which can remove discardable sections (except for the .reloc section, which also is marked as discardable as it isn't loaded at runtime, only read by the loader), the .reloc section should be first of them, in order not to create gaps in the image. Previously, binaries with relocations were broken if they were stripped by GNU binutils strip. Trying to execute such binaries produces an error about "xx is not a valid win32 application". This fixes GNU binutils bug 23348. Prior to SVN r329370 (which didn't intend to have functional changes), the code for moving discardable sections to the end didn't clearly express how other discardable sections should be ordered compared to .reloc, but the change retained the exact same end result as before. After SVN r329370, the code (and comments) more clearly indicate that it tries to make the .reloc section the absolutely last one; this patch changes that. This matches how GNU binutils ld sorts .reloc compared to dwarf debug info sections. Differential Revision: https://reviews.llvm.org/D49351 Signed-off-by: Martin Storsjö <martin@martin.st> llvm-svn: 337598
Diffstat (limited to 'lld')
-rw-r--r--lld/COFF/Writer.cpp7
-rw-r--r--lld/test/COFF/sort-debug.test4
2 files changed, 4 insertions, 7 deletions
diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp
index 607a1d1c8ee..d17405ec26a 100644
--- a/lld/COFF/Writer.cpp
+++ b/lld/COFF/Writer.cpp
@@ -470,12 +470,9 @@ void Writer::createSections() {
// Finally, move some output sections to the end.
auto SectionOrder = [&](OutputSection *S) {
- // .reloc should come last of all since it refers to RVAs of data in the
- // previous sections.
- if (S == RelocSec)
- return 3;
// Move DISCARDABLE (or non-memory-mapped) sections to the end of file because
- // the loader cannot handle holes.
+ // the loader cannot handle holes. Stripping can remove other discardable ones
+ // than .reloc, which is first of them (created early).
if (S->Header.Characteristics & IMAGE_SCN_MEM_DISCARDABLE)
return 2;
// .rsrc should come at the end of the non-discardable sections because its
diff --git a/lld/test/COFF/sort-debug.test b/lld/test/COFF/sort-debug.test
index e11b8b48a7f..5e2701b6610 100644
--- a/lld/test/COFF/sort-debug.test
+++ b/lld/test/COFF/sort-debug.test
@@ -9,20 +9,20 @@
# RUN: llvm-readobj -sections %t.exe | FileCheck -check-prefix=NODEBUG %s
# CHECK: Name: .text
+# CHECK: Name: .reloc
# CHECK: Name: .debug_abbrev
# CHECK: Name: .debug_info
# CHECK: Name: .debug_line
# CHECK: Name: .debug_pubnames
# CHECK: Name: .debug_pubtypes
-# CHECK: Name: .reloc
# NODEBUG: Name: .text
+# NODEBUG: Name: .reloc
# NODEBUG-NOT: Name: .debug_abbrev
# NODEBUG-NOT: Name: .debug_info
# NODEBUG-NOT: Name: .debug_line
# NODEBUG-NOT: Name: .debug_pubnames
# NODEBUG-NOT: Name: .debug_pubtypes
-# NODEBUG: Name: .reloc
--- !COFF
header:
OpenPOWER on IntegriCloud