* sysdeps/arm/dl-irel.h (elf_ifunc_invoke): Pass dl_hwcap. * sysdeps/arm/dl-machine.h (elf_machine_rel): Use elf_ifunc_invoke. (elf_machine_rela): Likewise. diff --git a/sysdeps/arm/dl-irel.h b/sysdeps/arm/dl-irel.h index 5141031..5b1964e 100644 --- a/sysdeps/arm/dl-irel.h +++ b/sysdeps/arm/dl-irel.h @@ -29,7 +29,7 @@ static inline Elf32_Addr __attribute ((always_inline)) elf_ifunc_invoke (Elf32_Addr addr) { - return ((Elf32_Addr (*) (void)) (addr)) (); + return ((Elf32_Addr (*) (unsigned long int)) (addr)) (GLRO(dl_hwcap)); } static inline void diff --git a/sysdeps/arm/dl-machine.h b/sysdeps/arm/dl-machine.h index 58cf418..8d905e8 100644 --- a/sysdeps/arm/dl-machine.h +++ b/sysdeps/arm/dl-machine.h @@ -25,6 +25,7 @@ #include #include #include +#include #define CLEAR_CACHE(BEG,END) \ INTERNAL_SYSCALL_ARM (cacheflush, , 3, (BEG), (END), 0) @@ -377,7 +378,7 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc, && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1) && __builtin_expect (!skip_ifunc, 1)) - value = ((Elf32_Addr (*) (void)) value) (); + value = elf_ifunc_invoke (value); switch (r_type) { @@ -551,7 +552,7 @@ elf_machine_rela (struct link_map *map, const Elf32_Rela *reloc, && __builtin_expect (ELFW(ST_TYPE) (sym->st_info) == STT_GNU_IFUNC, 0) && __builtin_expect (sym->st_shndx != SHN_UNDEF, 1) && __builtin_expect (!skip_ifunc, 1)) - value = ((Elf32_Addr (*) (void)) value) (); + value = elf_ifunc_invoke (value); switch (r_type) {