diff options
Diffstat (limited to 'bfd/elf32-arm.c')
-rw-r--r-- | bfd/elf32-arm.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/bfd/elf32-arm.c b/bfd/elf32-arm.c index cd5a9bf..dacbc16 100644 --- a/bfd/elf32-arm.c +++ b/bfd/elf32-arm.c @@ -9430,6 +9430,7 @@ arm_elf_find_function (bfd * abfd ATTRIBUTE_UNUSED, filename = bfd_asymbol_name (&q->symbol); break; case STT_FUNC: + case STT_IFUNC: case STT_ARM_TFUNC: case STT_NOTYPE: /* Skip mapping symbols. */ @@ -9555,7 +9556,7 @@ elf32_arm_adjust_dynamic_symbol (struct bfd_link_info * info, /* If this is a function, put it in the procedure linkage table. We will fill in the contents of the procedure linkage table later, when we know the address of the .got section. */ - if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC + if (h->type == STT_FUNC || h->type == STT_ARM_TFUNC || h->type == STT_IFUNC || h->needs_plt) { if (h->plt.refcount <= 0 @@ -11729,7 +11730,8 @@ elf32_arm_swap_symbol_in (bfd * abfd, /* New EABI objects mark thumb function symbols by setting the low bit of the address. Turn these into STT_ARM_TFUNC. */ - if (ELF_ST_TYPE (dst->st_info) == STT_FUNC + if ((ELF_ST_TYPE (dst->st_info) == STT_FUNC + || ELF_ST_TYPE (dst->st_info) == STT_IFUNC) && (dst->st_value & 1)) { dst->st_info = ELF_ST_INFO (ELF_ST_BIND (dst->st_info), STT_ARM_TFUNC); @@ -11830,7 +11832,7 @@ elf32_arm_additional_program_headers (bfd *abfd, static bfd_boolean elf32_arm_is_function_type (unsigned int type) { - return (type == STT_FUNC) || (type == STT_ARM_TFUNC); + return (type == STT_FUNC) || (type == STT_ARM_TFUNC) || (type == STT_IFUNC); } /* We use this to override swap_symbol_in and swap_symbol_out. */ |