Force emit a relocation for @gnu_indirect_function symbols so that the indirect
authorRoman Divacky <rdivacky@freebsd.org>
Wed, 8 Jan 2014 18:50:32 +0000 (18:50 +0000)
committerRoman Divacky <rdivacky@freebsd.org>
Wed, 8 Jan 2014 18:50:32 +0000 (18:50 +0000)
resolution works.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198780 91177308-0d34-0410-b5e6-96231b3b80d8

lib/MC/ELFObjectWriter.cpp
test/MC/ELF/ifunc-reloc.s [new file with mode: 0644]

index 9490a9941ac8d29880ac0ab7b57c6aea56405f4f..f6dbfced54012ff67ca5ab96222f9267f265faff 100644 (file)
@@ -1645,7 +1645,7 @@ ELFObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(const MCAssembler &Asm,
                                                       const MCFragment &FB,
                                                       bool InSet,
                                                       bool IsPCRel) const {
-  if (DataA.getFlags() & ELF_STB_Weak)
+  if (DataA.getFlags() & ELF_STB_Weak || MCELF::GetType(DataA) == ELF::STT_GNU_IFUNC)
     return false;
   return MCObjectWriter::IsSymbolRefDifferenceFullyResolvedImpl(
                                                  Asm, DataA, FB,InSet, IsPCRel);
diff --git a/test/MC/ELF/ifunc-reloc.s b/test/MC/ELF/ifunc-reloc.s
new file mode 100644 (file)
index 0000000..0195463
--- /dev/null
@@ -0,0 +1,16 @@
+// RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r | FileCheck %s
+        .global sym
+        .type sym, @gnu_indirect_function
+alias: 
+        .global alias
+        .type alias, @function
+        .set sym, alias
+
+
+        callq sym
+
+// CHECK: Relocations [
+// CHECK-NEXT:   Section (2) .rela.text {
+// CHECK-NEXT:     0x1 R_X86_64_PC32 sym 0xFFFFFFFFFFFFFFFC
+// CHECK-NEXT:   }
+// CHECK-NEXT: ]