diff options
author | Roman Divacky <rdivacky@freebsd.org> | 2014-01-08 18:50:32 +0000 |
---|---|---|
committer | Roman Divacky <rdivacky@freebsd.org> | 2014-01-08 18:50:32 +0000 |
commit | edc4b60fca0ee2bc33bb14acf739e8faeca26e45 (patch) | |
tree | 074a3ffb0dfad89d14771b7332c89b7d6468761d | |
parent | adc537e74b719db8abc42ec57f7bdb25176d8569 (diff) | |
download | llvm-edc4b60fca0ee2bc33bb14acf739e8faeca26e45.tar.gz llvm-edc4b60fca0ee2bc33bb14acf739e8faeca26e45.tar.bz2 llvm-edc4b60fca0ee2bc33bb14acf739e8faeca26e45.tar.xz |
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
-rw-r--r-- | lib/MC/ELFObjectWriter.cpp | 2 | ||||
-rw-r--r-- | test/MC/ELF/ifunc-reloc.s | 16 |
2 files changed, 17 insertions, 1 deletions
diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index 9490a9941a..f6dbfced54 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 0000000000..01954631cc --- /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: ] |