diff options
Diffstat (limited to 'lld')
| -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  | 

