From: Rafael Espindola Date: Thu, 3 Mar 2016 18:44:38 +0000 (+0000) Subject: Fix PR26818. X-Git-Tag: llvmorg-3.9.0-rc1~12543 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=005d84430dcfb54afdea5bc8543a9a214fc5169c;p=platform%2Fupstream%2Fllvm.git Fix PR26818. The hack of using a plt address as the address of an undefined function only works in executables. Don't try it with shared libraries. llvm-svn: 262642 --- diff --git a/lld/ELF/Target.cpp b/lld/ELF/Target.cpp index 893bb5e..9672723 100644 --- a/lld/ELF/Target.cpp +++ b/lld/ELF/Target.cpp @@ -328,7 +328,8 @@ TargetInfo::PltNeed TargetInfo::needsPlt(uint32_t Type, // plt. That is identified by special relocation types (R_X86_64_JUMP_SLOT, // R_386_JMP_SLOT, etc). if (auto *SS = dyn_cast>(&S)) - if (SS->Sym.getType() == STT_FUNC && !refersToGotEntry(Type)) + if (!Config->Shared && SS->Sym.getType() == STT_FUNC && + !refersToGotEntry(Type)) return Plt_Implicit; return Plt_No; diff --git a/lld/test/ELF/no-plt-shared.s b/lld/test/ELF/no-plt-shared.s new file mode 100644 index 0000000..ac45ed5 --- /dev/null +++ b/lld/test/ELF/no-plt-shared.s @@ -0,0 +1,17 @@ +// REQUIRES: x86 +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %p/Inputs/shared.s -o %t.o +// RUN: ld.lld %t.o -o %t.so -shared + +// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o +// RUN: ld.lld %t2.o %t.so -o %t2.so -shared +// RUN: llvm-readobj -r %t2.so | FileCheck %s + + .data +fp: + .quad bar + +// CHECK: Relocations [ +// CHECK-NEXT: Section ({{.*}}) .rela.dyn { +// CHECK-NEXT: R_X86_64_64 bar 0x0 +// CHECK-NEXT: } +// CHECK-NEXT: ]