diff options
-rw-r--r-- | llvm/lib/MC/ELFObjectWriter.cpp | 6 | ||||
-rw-r--r-- | llvm/test/MC/ELF/ifunc-reloc.s | 39 |
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: ] |