summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/MC/ELFObjectWriter.cpp6
-rw-r--r--llvm/test/MC/ELF/ifunc-reloc.s39
2 files changed, 32 insertions, 13 deletions
diff --git a/llvm/lib/MC/ELFObjectWriter.cpp b/llvm/lib/MC/ELFObjectWriter.cpp
index 95b0e274526..99cab4e8c5d 100644
--- a/llvm/lib/MC/ELFObjectWriter.cpp
+++ b/llvm/lib/MC/ELFObjectWriter.cpp
@@ -1373,6 +1373,12 @@ bool ELFObjectWriter::shouldRelocateWithSymbol(const MCAssembler &Asm,
return true;
}
+ // Keep symbol type for a local ifunc because it may result in an IRELATIVE
+ // reloc that the dynamic loader will use to resolve the address at startup
+ // time.
+ if (Sym->getType() == ELF::STT_GNU_IFUNC)
+ return true;
+
// If a relocation points to a mergeable section, we have to be careful.
// If the offset is zero, a relocation with the section will encode the
// same information. With a non-zero offset, the situation is different.
diff --git a/llvm/test/MC/ELF/ifunc-reloc.s b/llvm/test/MC/ELF/ifunc-reloc.s
index b4917371b0f..101e6b83f84 100644
--- a/llvm/test/MC/ELF/ifunc-reloc.s
+++ b/llvm/test/MC/ELF/ifunc-reloc.s
@@ -1,16 +1,29 @@
-// 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
+# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -r | FileCheck %s
+.global alias
+.type alias, @function
+alias:
+ callq global
+.global global
+.type global, @gnu_indirect_function
+.set global, alias
- callq sym
+.type local, @gnu_indirect_function
+.set local, alias
-// CHECK: Relocations [
-// CHECK-NEXT: Section {{.*}} .rela.text {
-// CHECK-NEXT: 0x1 R_X86_64_PLT32 sym 0xFFFFFFFFFFFFFFFC
-// CHECK-NEXT: }
-// CHECK-NEXT: ]
+## Check we don't create the relocations with a section symbol for both global
+## They may result in IRELATIVE relocs that the dynamic loader will use to
+## resolve addresses at startup time.
+.data
+.quad global
+.quad local
+
+# CHECK: Relocations [
+# CHECK-NEXT: Section {{.*}} .rela.text {
+# CHECK-NEXT: 0x1 R_X86_64_PLT32 global 0xFFFFFFFFFFFFFFFC
+# CHECK-NEXT: }
+# CHECK-NEXT: Section {{.*}} .rela.data {
+# CHECK-NEXT: 0x0 R_X86_64_64 global 0x0
+# CHECK-NEXT: 0x8 R_X86_64_64 local 0x0
+# CHECK-NEXT: }
+# CHECK-NEXT: ]
OpenPOWER on IntegriCloud