Author: Fangrui Song Date: 2020-12-16T08:59:38-08:00 New Revision: 16cb7910f51f0c2570b1f3406bcd8d4069e52a3e
URL: https://github.com/llvm/llvm-project/commit/16cb7910f51f0c2570b1f3406bcd8d4069e52a3e DIFF: https://github.com/llvm/llvm-project/commit/16cb7910f51f0c2570b1f3406bcd8d4069e52a3e.diff LOG: [ELF] --emit-relocs: fix a crash if .rela.dyn is an empty output section Fix 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 in a linker script. Don't crash. Reviewed By: grimar Differential Revision: https://reviews.llvm.org/D93367 Added: lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s Modified: lld/ELF/OutputSections.cpp Removed: ################################################################################ diff --git a/lld/ELF/OutputSections.cpp b/lld/ELF/OutputSections.cpp index 5eea3bc8f6a51..9fd226fbba2c8 100644 --- a/lld/ELF/OutputSections.cpp +++ b/lld/ELF/OutputSections.cpp @@ -418,7 +418,11 @@ void OutputSection::finalize() { 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; diff --git a/lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s b/lld/test/ELF/linkerscript/emit-relocs-rela-dyn.s new file mode 100644 index 0000000000000..a6c627fb18ce3 --- /dev/null +++ b/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)); +} _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits