Index: lld/trunk/ELF/Symbols.h =================================================================== --- lld/trunk/ELF/Symbols.h +++ lld/trunk/ELF/Symbols.h @@ -349,7 +349,11 @@ SharedSymbol(SharedFile<ELFT> *F, StringRef Name, const Elf_Sym &Sym) : Defined(SymbolBody::SharedKind, Name, Sym.getBinding(), Sym.st_other, Sym.getType()), - File(F), Sym(Sym) {} + File(F), Sym(Sym) { + // IFuncs defined in DSOs are treated as functions by the static linker. + if (isGnuIFunc()) + Type = llvm::ELF::STT_FUNC; + } SharedFile<ELFT> *File; const Elf_Sym &Sym; Index: lld/trunk/test/ELF/Inputs/gnu-ifunc-gotpcrel.s =================================================================== --- lld/trunk/test/ELF/Inputs/gnu-ifunc-gotpcrel.s +++ lld/trunk/test/ELF/Inputs/gnu-ifunc-gotpcrel.s @@ -0,0 +1,4 @@ +.type foo STT_GNU_IFUNC +.globl foo +foo: +ret Index: lld/trunk/test/ELF/gnu-ifunc-gotpcrel.s =================================================================== --- lld/trunk/test/ELF/gnu-ifunc-gotpcrel.s +++ lld/trunk/test/ELF/gnu-ifunc-gotpcrel.s @@ -0,0 +1,14 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/gnu-ifunc-gotpcrel.s -o %t2.o +# RUN: ld.lld -shared %t2.o -o %t2.so +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o +# RUN: ld.lld %t.o %t2.so -o %t +# RUN: llvm-readobj -dyn-relocations %t | FileCheck %s + +# CHECK: Dynamic Relocations { +# CHECK-NEXT: 0x120B0 R_X86_64_GLOB_DAT foo 0x0 +# CHECK-NEXT: } + +.globl _start +_start: +mov foo@gotpcrel(%rip), %rax