[llvm] r362767 - [MC][ELF] Don't create relocations with section symbols for STB_LOCAL ifunc

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 6 20:47:22 PDT 2019


Author: maskray
Date: Thu Jun  6 20:47:22 2019
New Revision: 362767

URL: http://llvm.org/viewvc/llvm-project?rev=362767&view=rev
Log:
[MC][ELF] Don't create relocations with section symbols for STB_LOCAL ifunc

We should keep the symbol type (STT_GNU_IFUNC) 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.

There is another problem that is not fixed by this patch: a PC relative
relocation should also create a relocation with the ifunc symbol.

Modified:
    llvm/trunk/lib/MC/ELFObjectWriter.cpp
    llvm/trunk/test/MC/ELF/ifunc-reloc.s

Modified: llvm/trunk/lib/MC/ELFObjectWriter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/ELFObjectWriter.cpp?rev=362767&r1=362766&r2=362767&view=diff
==============================================================================
--- llvm/trunk/lib/MC/ELFObjectWriter.cpp (original)
+++ llvm/trunk/lib/MC/ELFObjectWriter.cpp Thu Jun  6 20:47:22 2019
@@ -1373,6 +1373,12 @@ bool ELFObjectWriter::shouldRelocateWith
     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.

Modified: llvm/trunk/test/MC/ELF/ifunc-reloc.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/ELF/ifunc-reloc.s?rev=362767&r1=362766&r2=362767&view=diff
==============================================================================
--- llvm/trunk/test/MC/ELF/ifunc-reloc.s (original)
+++ llvm/trunk/test/MC/ELF/ifunc-reloc.s Thu Jun  6 20:47:22 2019
@@ -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: ]




More information about the llvm-commits mailing list