From edc4b60fca0ee2bc33bb14acf739e8faeca26e45 Mon Sep 17 00:00:00 2001 From: Roman Divacky Date: Wed, 8 Jan 2014 18:50:32 +0000 Subject: [PATCH] Force emit a relocation for @gnu_indirect_function symbols so that the indirect resolution works. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@198780 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/MC/ELFObjectWriter.cpp | 2 +- test/MC/ELF/ifunc-reloc.s | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 test/MC/ELF/ifunc-reloc.s diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 9490a9941ac..f6dbfced540 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -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 index 00000000000..01954631cca --- /dev/null +++ b/test/MC/ELF/ifunc-reloc.s @@ -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: ] -- 2.34.1