diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -1668,11 +1668,11 @@ else getParent()->link = 0; - if (in.relaPlt == this) { + if (in.relaPlt == this && in.gotPlt->getParent()) { getParent()->flags |= ELF::SHF_INFO_LINK; getParent()->info = in.gotPlt->getParent()->sectionIndex; } - if (in.relaIplt == this) { + if (in.relaIplt == this && in.igotPlt->getParent()) { getParent()->flags |= ELF::SHF_INFO_LINK; getParent()->info = in.igotPlt->getParent()->sectionIndex; } diff --git a/lld/test/ELF/linkerscript/discard-plt.s b/lld/test/ELF/linkerscript/discard-plt.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/linkerscript/discard-plt.s @@ -0,0 +1,37 @@ +# REQUIRES: x86 +# RUN: split-file %s %t +# RUN: llvm-mc -filetype=obj -triple=x86_64 %t/a.s -o %t/a.o + +## Discard .plt, .iplt, and .got.plt +# RUN: ld.lld -shared -T %t/t %t/a.o -o %t/a +# RUN: llvm-readelf -S -d %t/a > %t/readelf.txt +# RUN: FileCheck %s --input-file %t/readelf.txt +# RUN: FileCheck %s --input-file %t/readelf.txt --check-prefix=NEG + +# CHECK: [Nr] Name Type Address Off Size ES Flg Lk Inf Al +# CHECK: ] .rela.plt RELA [[#%x,]] [[#%x,]] 000018 18 A 1 0 8 + +# CHECK: (PLTGOT) 0x0 +# CHECK: (PLTREL) RELA + +# NEG-NOT: ] .plt +# NEG-NOT: ] .iplt +# NEG-NOT: ] .got.plt + +#--- a.s + call foo + call ifunc + +.type ifunc, @gnu_indirect_function +.hidden ifunc +ifunc: + ret + +.data +.quad ifunc + +#--- t +SECTIONS { + .text : { *(.text) } + /DISCARD/ : { *(.plt .iplt .got.plt) } +}