diff --git a/lld/ELF/Symbols.h b/lld/ELF/Symbols.h index 773e1ad9588a..b9c1477e54eb 100644 --- a/lld/ELF/Symbols.h +++ b/lld/ELF/Symbols.h @@ -218,7 +218,7 @@ public: Verdef(Verdef), ElfSym(ElfSym) { // IFuncs defined in DSOs are treated as functions by the static linker. if (isGnuIFunc()) - Type = llvm::ELF::STT_FUNC; + this->Type = llvm::ELF::STT_FUNC; this->File = File; } diff --git a/lld/test/ELF/Inputs/gnu-ifunc-dso.s b/lld/test/ELF/Inputs/gnu-ifunc-dso.s new file mode 100644 index 000000000000..bd82718718be --- /dev/null +++ b/lld/test/ELF/Inputs/gnu-ifunc-dso.s @@ -0,0 +1,3 @@ +.type foo STT_GNU_IFUNC +.globl foo +foo: diff --git a/lld/test/ELF/gnu-ifunc-dso.s b/lld/test/ELF/gnu-ifunc-dso.s new file mode 100644 index 000000000000..6ceff3b17d42 --- /dev/null +++ b/lld/test/ELF/gnu-ifunc-dso.s @@ -0,0 +1,13 @@ +# REQUIRES: x86 +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/gnu-ifunc-dso.s -o %t1.o +# RUN: ld.lld -shared %t1.o -o %t.so +# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t2.o +# RUN: ld.lld -shared %t2.o %t.so -o %t +# RUN: llvm-readobj -dyn-relocations %t | FileCheck %s + +# CHECK: Dynamic Relocations { +# CHECK-NEXT: 0x1000 R_X86_64_64 foo 0x0 +# CHECK-NEXT: } + +.data + .quad foo