diff options
| -rw-r--r-- | lld/ELF/SymbolTable.cpp | 3 | ||||
| -rw-r--r-- | lld/test/ELF/lto/pic.ll | 20 |
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 +} |

