[PATCH] D93367: [ELF] --emit-relocs: fix a crash if .rela.dyn is an empty output section

Fangrui Song via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 16 08:59:48 PST 2020


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
MaskRay marked an inline comment as done.
Closed by commit rG16cb7910f51f: [ELF] --emit-relocs: fix a crash if .rela.dyn is an empty output section (authored by MaskRay).

Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D93367

Files:
  lld/ELF/OutputSections.cpp
  lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s


Index: lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s
===================================================================
--- /dev/null
+++ lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s
@@ -0,0 +1,17 @@
+# REQUIRES: x86
+## PR48357: If .rela.dyn appears as an output section description, its type may
+## be SHT_RELA (due to the empty synthetic .rela.plt) while there is no input
+## section. The empty .rela.dyn may be retained due to a reference. Don't crash.
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64 /dev/null -o %t.o
+# RUN: ld.lld -shared --emit-relocs -T %s %t.o -o %t
+# RUN: llvm-readelf -S %t | FileCheck %s
+
+## Note, sh_link of such an empty .rela.dyn is 0.
+# CHECK: Name      Type Address          Off    Size   ES Flg Lk Inf Al
+# CHECK: .rela.dyn RELA 0000000000000000 001000 000000 18   A  0   0  8
+
+SECTIONS {
+  .rela.dyn : { *(.rela*) }
+  __rela_offset = ABSOLUTE(ADDR(.rela.dyn));
+}
Index: lld/ELF/OutputSections.cpp
===================================================================
--- lld/ELF/OutputSections.cpp
+++ lld/ELF/OutputSections.cpp
@@ -418,7 +418,11 @@
   if (!config->copyRelocs || (type != SHT_RELA && type != SHT_REL))
     return;
 
-  if (isa<SyntheticSection>(first))
+  // Skip if 'first' is synthetic, i.e. not a section created by --emit-relocs.
+  // Normally 'type' was changed by 'first' so 'first' should be non-null.
+  // However, if the output section is .rela.dyn, 'type' can be set by the empty
+  // synthetic .rela.plt and first can be null.
+  if (!first || isa<SyntheticSection>(first))
     return;
 
   link = in.symTab->getParent()->sectionIndex;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D93367.312227.patch
Type: text/x-patch
Size: 1623 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20201216/28e52061/attachment-0001.bin>


More information about the llvm-commits mailing list