diff options
| -rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
| -rw-r--r-- | lld/test/ELF/Inputs/duplicated-plt-entry.s | 3 | ||||
| -rw-r--r-- | lld/test/ELF/duplicated-plt-entry.s | 17 |
3 files changed, 21 insertions, 1 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index 30fec493cc9..6ff50a80aef 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -339,7 +339,7 @@ void Writer<ELFT>::scanRelocs( // to the symbol go through the PLT. This is true even for a local // symbol, although local symbols normally do not require PLT entries. if (Body && isGnuIFunc<ELFT>(*Body)) { - if (Body->isInGot()) + if (Body->isInPlt()) continue; Out<ELFT>::Plt->addEntry(Body); bool CBP = canBePreempted(Body, /*NeedsGot=*/true); diff --git a/lld/test/ELF/Inputs/duplicated-plt-entry.s b/lld/test/ELF/Inputs/duplicated-plt-entry.s new file mode 100644 index 00000000000..689f3af0ef4 --- /dev/null +++ b/lld/test/ELF/Inputs/duplicated-plt-entry.s @@ -0,0 +1,3 @@ +.global bar +.type bar, @gnu_indirect_function +bar: diff --git a/lld/test/ELF/duplicated-plt-entry.s b/lld/test/ELF/duplicated-plt-entry.s new file mode 100644 index 00000000000..4644bed0ca8 --- /dev/null +++ b/lld/test/ELF/duplicated-plt-entry.s @@ -0,0 +1,17 @@ +// REQUIRES: x86 + +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/duplicated-plt-entry.s -o %t.o +// RUN: ld.lld -shared %t.o -o %t.so + +// RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t2.o +// RUN: ld.lld %t2.o %t.so -o %t2.so -shared + +// RUN: llvm-readobj -r %t2.so | FileCheck %s +// CHECK: Relocations [ +// CHECK-NEXT: Section ({{.*}}) .rela.plt { +// CHECK-NEXT: R_X86_64_JUMP_SLOT bar 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: ] + +callq bar@PLT +callq bar@PLT |

