diff --git a/lld/ELF/SyntheticSections.h b/lld/ELF/SyntheticSections.h --- a/lld/ELF/SyntheticSections.h +++ b/lld/ELF/SyntheticSections.h @@ -761,6 +761,7 @@ public: IBTPltSection(); void writeTo(uint8_t *Buf) override; + bool isNeeded() const override; size_t getSize() const override; }; diff --git a/lld/ELF/SyntheticSections.cpp b/lld/ELF/SyntheticSections.cpp --- a/lld/ELF/SyntheticSections.cpp +++ b/lld/ELF/SyntheticSections.cpp @@ -2696,6 +2696,8 @@ return 16 + in.plt->getNumEntries() * target->pltEntrySize; } +bool IBTPltSection::isNeeded() const { return in.plt->getNumEntries() > 0; } + // The string hash function for .gdb_index. static uint32_t computeGdbHash(StringRef s) { uint32_t h = 0; diff --git a/lld/test/ELF/x86-64-feature-cet.s b/lld/test/ELF/x86-64-feature-cet.s --- a/lld/test/ELF/x86-64-feature-cet.s +++ b/lld/test/ELF/x86-64-feature-cet.s @@ -91,6 +91,17 @@ # DISASM-NEXT: jmpq *0x2126(%rip) # DISASM-NEXT: nopw (%rax,%rax) +## If there is no PLT entry, don't create .plt section. +# RUN: ld.lld -e 0 %t1.o -o %t.noplt +# RUN: llvm-readelf -S %t.noplt | FileCheck %s --check-prefix=NOPLT +# RUN: ld.lld -r %t1.o -o %t.noplt +# RUN: llvm-readelf -S %t.noplt | FileCheck %s --check-prefix=NOPLT + +# NOPLT: [Nr] Name +# NOPLT-NOT: .plt +# NOPLT: .note.gnu.property +# NOPLT-NOT: .plt + .section ".note.gnu.property", "a" .long 4 .long 0x10