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.
-// 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: ]