[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