[PATCH] D69364: [ELF] -r: fix crash when processing a SHT_REL[A] that relocates a SHF_MERGE after D67504/r372734

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu Oct 24 11:36:00 PDT 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rG56d81104f145: [ELF] -r: fix crash when processing a SHT_REL[A] that relocates a SHF_MERGEā€¦ (authored by MaskRay).

Changed prior to commit:
  https://reviews.llvm.org/D69364?vs=226289&id=226307#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D69364/new/

https://reviews.llvm.org/D69364

Files:
  lld/ELF/InputFiles.cpp
  lld/test/ELF/merge-relocatable.s


Index: lld/test/ELF/merge-relocatable.s
===================================================================
--- /dev/null
+++ lld/test/ELF/merge-relocatable.s
@@ -0,0 +1,23 @@
+# REQUIRES: x86
+
+## Test that we keep a SHT_REL[A] section which relocates a SHF_MERGE section
+## in -r mode. The relocated SHF_MERGE section is handled as non-mergeable.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 %s -o %t.o
+# RUN: ld.lld -r %t.o -o %t
+# RUN: llvm-readobj -S %t | FileCheck %s
+
+# CHECK:     Name: .rodata.cst8
+# CHECK-NOT: }
+# CHECK:     Size: 16
+# CHECK:     Name: .rela.rodata.cst8
+# CHECK-NOT: }
+# CHECK:     Size: 48
+
+foo:
+
+.section .rodata.cst8,"aM", at progbits,8,unique,0
+.quad foo
+
+.section .rodata.cst8,"aM", at progbits,8,unique,1
+.quad foo
Index: lld/ELF/InputFiles.cpp
===================================================================
--- lld/ELF/InputFiles.cpp
+++ lld/ELF/InputFiles.cpp
@@ -838,6 +838,16 @@
     if (!target)
       return nullptr;
 
+    // ELF spec allows mergeable sections with relocations, but they are
+    // rare, and it is in practice hard to merge such sections by contents,
+    // because applying relocations at end of linking changes section
+    // contents. So, we simply handle such sections as non-mergeable ones.
+    // Degrading like this is acceptable because section merging is optional.
+    if (auto *ms = dyn_cast<MergeInputSection>(target)) {
+      target = toRegularSection(ms);
+      this->sections[sec.sh_info] = target;
+    }
+
     // This section contains relocation information.
     // If -r is given, we do not interpret or apply relocation
     // but just copy relocation sections to output.
@@ -856,16 +866,6 @@
       fatal(toString(this) +
             ": multiple relocation sections to one section are not supported");
 
-    // ELF spec allows mergeable sections with relocations, but they are
-    // rare, and it is in practice hard to merge such sections by contents,
-    // because applying relocations at end of linking changes section
-    // contents. So, we simply handle such sections as non-mergeable ones.
-    // Degrading like this is acceptable because section merging is optional.
-    if (auto *ms = dyn_cast<MergeInputSection>(target)) {
-      target = toRegularSection(ms);
-      this->sections[sec.sh_info] = target;
-    }
-
     if (sec.sh_type == SHT_RELA) {
       ArrayRef<Elf_Rela> rels = CHECK(getObj().relas(&sec), this);
       target->firstRelocation = rels.begin();


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D69364.226307.patch
Type: text/x-patch
Size: 2491 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191024/41c12aa8/attachment.bin>


More information about the llvm-commits mailing list