summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/Writer.cpp2
-rw-r--r--lld/test/ELF/Inputs/duplicated-plt-entry.s3
-rw-r--r--lld/test/ELF/duplicated-plt-entry.s17
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
OpenPOWER on IntegriCloud