summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lld/ELF/SymbolTable.cpp3
-rw-r--r--lld/test/ELF/lto/pic.ll20
2 files changed, 22 insertions, 1 deletions
diff --git a/lld/ELF/SymbolTable.cpp b/lld/ELF/SymbolTable.cpp
index 6892968cf04..68a28c184fe 100644
--- a/lld/ELF/SymbolTable.cpp
+++ b/lld/ELF/SymbolTable.cpp
@@ -112,8 +112,9 @@ std::unique_ptr<InputFile> SymbolTable<ELFT>::codegen(Module &M) {
fatal("Target not found: " + ErrMsg);
TargetOptions Options;
+ Reloc::Model R = Config->Shared ? Reloc::PIC_ : Reloc::Static;
std::unique_ptr<TargetMachine> TM(
- TheTarget->createTargetMachine(TripleStr, "", "", Options));
+ TheTarget->createTargetMachine(TripleStr, "", "", Options, R));
raw_svector_ostream OS(OwningLTOData);
legacy::PassManager CodeGenPasses;
diff --git a/lld/test/ELF/lto/pic.ll b/lld/test/ELF/lto/pic.ll
new file mode 100644
index 00000000000..0d61d6a629b
--- /dev/null
+++ b/lld/test/ELF/lto/pic.ll
@@ -0,0 +1,20 @@
+; REQUIRES: x86
+
+; RUN: llvm-as %s -o %t.o
+; RUN: ld.lld %t.o -m elf_x86_64 -o %t.so -shared
+; RUN: llvm-readobj -r %t.so | FileCheck %s
+
+; CHECK: Relocations [
+; CHECK-NEXT: Section ({{.*}}) .rela.plt {
+; CHECK-NEXT: R_X86_64_JUMP_SLOT bar 0x0
+; CHECK-NEXT: }
+; CHECK-NEXT: ]
+
+target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+declare void @bar()
+define void @foo() {
+ call void @bar()
+ ret void
+}
OpenPOWER on IntegriCloud