Define elf_ifunc_invoke for ARM.
authorJoseph Myers <joseph@codesourcery.com>
Tue, 21 Jun 2011 14:19:45 +0000 (14:19 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Tue, 21 Jun 2011 14:19:45 +0000 (14:19 +0000)
ChangeLog.arm
sysdeps/arm/dl-irel.h

index 30405dd..1737b24 100644 (file)
@@ -1,3 +1,8 @@
+2011-06-21  Joseph Myers  <joseph@codesourcery.com>
+
+       * sysdeps/arm/dl-irel.h (elf_ifunc_invoke): New.
+       (elf_irel): Use it.
+
 2010-06-20  Joseph Myers  <joseph@codesourcery.com>
 
        * sysdeps/unix/sysv/linux/arm/eabi/internal_sendmmsg.S: New.
index 735e0a3..ab33ef8 100644 (file)
@@ -1,6 +1,6 @@
 /* Machine-dependent ELF indirect relocation inline functions.
    ARM version.
-   Copyright (C) 2009, 2010 Free Software Foundation, Inc.
+   Copyright (C) 2009, 2010, 2011 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
 
 #define ELF_MACHINE_IREL       1
 
+static inline Elf32_Addr
+__attribute ((always_inline))
+elf_ifunc_invoke (Elf32_Addr addr)
+{
+  return ((Elf32_Addr (*) (void)) (addr)) ();
+}
+
 static inline void
 __attribute ((always_inline))
 elf_irel (const Elf32_Rel *reloc)
@@ -35,7 +42,7 @@ elf_irel (const Elf32_Rel *reloc)
 
   if (__builtin_expect (r_type == R_ARM_IRELATIVE, 1))
     {
-      Elf32_Addr value = ((Elf32_Addr (*) (void)) (*reloc_addr)) ();
+      Elf32_Addr value = elf_ifunc_invoke (*reloc_addr);
       *reloc_addr = value;
     }
   else