aarch64: Revert AArch64 ifunc changes.

Message ID 51C17647.6090505@linaro.org
State Accepted
Headers show

Commit Message

Will Newton June 19, 2013, 9:13 a.m.
The AArch64 ifunc patch introduced a regression caused by incorrect
PLT layout. Revert it until a fix is verified.

bfd/ChangeLog:

2013-06-19  Will Newton  <will.newton@linaro.org>

	* configure: Regenerated.
	* configure.in: Remove aarch64 dependency on elf-ifunc.c.
	* elf64-aarch64.c: Remove objalloc.h include.
	(elf64_aarch64_howto_dynrelocs): Remove R_AARCH64_IRELATIVE howto.
	(struct elf64_aarch64_link_hash_table): Remove ifunc related
	members. (elf_aarch64_local_htab_hash): Remove function.
	(elf_aarch64_local_htab_eq): Remove function.
	(elf_aarch64_get_local_sym_hash): Remove function.
	(elf64_aarch64_link_hash_table_create): Remove local hash
	table initialization.
	(elf64_aarch64_final_link_relocate): Remove sym argument and
	handling of ifunc symbols.
	(elf64_aarch64_relocate_section): Don't pass sym argument to
	elf64_aarch64_final_link_relocate.
	(elf64_aarch64_gc_sweep_hook): Remove handling of ifunc symbols.
	(elf64_aarch64_adjust_dynamic_symbol): Likewise.
	(elf64_aarch64_check_relocs): Likewise.
	(elf64_aarch64_post_process_headers): Remove call to
	_bfd_elf_set_osabi.
	(elf64_aarch64_is_function_type): New function.
	(elf64_aarch64_allocate_dynrelocs): Remove handling of ifunc
	symbols. (elf_aarch64_allocate_local_dynrelocs): Remove function.
	(elf64_aarch64_size_dynamic_sections): Remove call to
	elf_aarch64_allocate_local_dynrelocs.
	(elf64_aarch64_create_small_pltn_entry): Remove info argument.
	Remove creation of R_AARCH64_IRELATIVE dynamic relocs.
	(elf64_aarch64_finish_dynamic_symbol): Remove handling of ifunc
	symbols. (elf_aarch64_finish_local_dynamic_symbol): Remove
	function. (elf64_aarch64_finish_dynamic_sections): Remove call to
	elf_aarch64_finish_local_dynamic_symbol.
	(elf64_aarch64_add_symbol_hook): Remove function.

include/elf/ChangeLog:

2013-06-19  Will Newton  <will.newton@linaro.org>

	* aarch64.h: Remove R_AARCH64_IRELATIVE.

ld/ChangeLog:

2013-06-19  Will Newton  <will.newton@linaro.org>

	* emulparams/aarch64elf.sh: Remove IREL_IN_PLT.

ld/testsuite/ChangeLog:

2013-06-19  Will Newton  <will.newton@linaro.org>

	* ld-aarch64/aarch64-elf.exp: Remove ifunc tests.
	* ld-ifunc/ifunc.exp: Disable ifunc tests on AArch64.
	* ld-aarch64/ifunc-1-local.d: Remove.
	* ld-aarch64/ifunc-1-local.s: Likewise.
	* ld-aarch64/ifunc-1.d: Likewise.
	* ld-aarch64/ifunc-1.s: Likewise.
	* ld-aarch64/ifunc-10.d: Likewise.
	* ld-aarch64/ifunc-10.s: Likewise.
	* ld-aarch64/ifunc-11.d: Likewise.
	* ld-aarch64/ifunc-11.s: Likewise.
	* ld-aarch64/ifunc-12.d: Likewise.
	* ld-aarch64/ifunc-12.s: Likewise.
	* ld-aarch64/ifunc-13.d: Likewise.
	* ld-aarch64/ifunc-13a.s: Likewise.
	* ld-aarch64/ifunc-13b.s: Likewise.
	* ld-aarch64/ifunc-14a.d: Likewise.
	* ld-aarch64/ifunc-14a.s: Likewise.
	* ld-aarch64/ifunc-14b.d: Likewise.
	* ld-aarch64/ifunc-14b.s: Likewise.
	* ld-aarch64/ifunc-14c.d: Likewise.
	* ld-aarch64/ifunc-14c.s: Likewise.
	* ld-aarch64/ifunc-14d.d: Likewise.
	* ld-aarch64/ifunc-14e.d: Likewise.
	* ld-aarch64/ifunc-14f.d: Likewise.
	* ld-aarch64/ifunc-15.d: Likewise.
	* ld-aarch64/ifunc-15.s: Likewise.
	* ld-aarch64/ifunc-16.d: Likewise.
	* ld-aarch64/ifunc-16.s: Likewise.
	* ld-aarch64/ifunc-17a.d: Likewise.
	* ld-aarch64/ifunc-17a.s: Likewise.
	* ld-aarch64/ifunc-17b.d: Likewise.
	* ld-aarch64/ifunc-17b.s: Likewise.
	* ld-aarch64/ifunc-18a.d: Likewise.
	* ld-aarch64/ifunc-18a.s: Likewise.
	* ld-aarch64/ifunc-18b.d: Likewise.
	* ld-aarch64/ifunc-18b.s: Likewise.
	* ld-aarch64/ifunc-19a.d: Likewise.
	* ld-aarch64/ifunc-19a.s: Likewise.
	* ld-aarch64/ifunc-19b.d: Likewise.
	* ld-aarch64/ifunc-19b.s: Likewise.
	* ld-aarch64/ifunc-2-local.d: Likewise.
	* ld-aarch64/ifunc-2-local.s: Likewise.
	* ld-aarch64/ifunc-2.d: Likewise.
	* ld-aarch64/ifunc-2.s: Likewise.
	* ld-aarch64/ifunc-20.d: Likewise.
	* ld-aarch64/ifunc-20.s: Likewise.
	* ld-aarch64/ifunc-3.s: Likewise.
	* ld-aarch64/ifunc-3a.d: Likewise.
	* ld-aarch64/ifunc-3b.d: Likewise.
	* ld-aarch64/ifunc-4.d: Likewise.
	* ld-aarch64/ifunc-4.s: Likewise.
	* ld-aarch64/ifunc-4a.d: Likewise.
	* ld-aarch64/ifunc-5-local.s: Likewise.
	* ld-aarch64/ifunc-5.s: Likewise.
	* ld-aarch64/ifunc-5a-local.d: Likewise.
	* ld-aarch64/ifunc-5a.d: Likewise.
	* ld-aarch64/ifunc-5b-local.d: Likewise.
	* ld-aarch64/ifunc-5b.d: Likewise.
	* ld-aarch64/ifunc-5r-local.d: Likewise.
	* ld-aarch64/ifunc-6.s: Likewise.
	* ld-aarch64/ifunc-6a.d: Likewise.
	* ld-aarch64/ifunc-6b.d: Likewise.
	* ld-aarch64/ifunc-7.s: Likewise.
	* ld-aarch64/ifunc-7a.d: Likewise.
	* ld-aarch64/ifunc-7b.d: Likewise.
	* ld-aarch64/ifunc-7c.d: Likewise.
	* ld-aarch64/ifunc-8.d: Likewise.
	* ld-aarch64/ifunc-8a.s: Likewise.
	* ld-aarch64/ifunc-8b.s: Likewise.
	* ld-aarch64/ifunc-9.d: Likewise.
	* ld-aarch64/ifunc-9.s: Likewise.
---
 bfd/configure.in                         |   4 +-
 bfd/elf64-aarch64.c                      | 663 ++++---------------------------
 include/elf/aarch64.h                    |   3 +-
 ld/emulparams/aarch64elf.sh              |   2 -
 ld/testsuite/ld-aarch64/aarch64-elf.exp  |  41 --
 ld/testsuite/ld-aarch64/ifunc-1-local.d  |   7 -
 ld/testsuite/ld-aarch64/ifunc-1-local.s  |  13 -
 ld/testsuite/ld-aarch64/ifunc-1.d        |   7 -
 ld/testsuite/ld-aarch64/ifunc-1.s        |  16 -
 ld/testsuite/ld-aarch64/ifunc-10.d       |   5 -
 ld/testsuite/ld-aarch64/ifunc-10.s       |  25 --
 ld/testsuite/ld-aarch64/ifunc-11.d       |   5 -
 ld/testsuite/ld-aarch64/ifunc-11.s       |  26 --
 ld/testsuite/ld-aarch64/ifunc-12.d       |   5 -
 ld/testsuite/ld-aarch64/ifunc-12.s       |  24 --
 ld/testsuite/ld-aarch64/ifunc-13.d       |  13 -
 ld/testsuite/ld-aarch64/ifunc-13a.s      |  11 -
 ld/testsuite/ld-aarch64/ifunc-13b.s      |   5 -
 ld/testsuite/ld-aarch64/ifunc-14a.d      |  10 -
 ld/testsuite/ld-aarch64/ifunc-14a.s      |   7 -
 ld/testsuite/ld-aarch64/ifunc-14b.d      |  10 -
 ld/testsuite/ld-aarch64/ifunc-14b.s      |   5 -
 ld/testsuite/ld-aarch64/ifunc-14c.d      |  10 -
 ld/testsuite/ld-aarch64/ifunc-14c.s      |   7 -
 ld/testsuite/ld-aarch64/ifunc-14d.d      |  10 -
 ld/testsuite/ld-aarch64/ifunc-14e.d      |  11 -
 ld/testsuite/ld-aarch64/ifunc-14f.d      |  11 -
 ld/testsuite/ld-aarch64/ifunc-15.d       |  12 -
 ld/testsuite/ld-aarch64/ifunc-15.s       |  11 -
 ld/testsuite/ld-aarch64/ifunc-16.d       |   9 -
 ld/testsuite/ld-aarch64/ifunc-16.s       |  17 -
 ld/testsuite/ld-aarch64/ifunc-17a.d      |   9 -
 ld/testsuite/ld-aarch64/ifunc-17a.s      |  11 -
 ld/testsuite/ld-aarch64/ifunc-17b.d      |   9 -
 ld/testsuite/ld-aarch64/ifunc-17b.s      |   6 -
 ld/testsuite/ld-aarch64/ifunc-18a.d      |  14 -
 ld/testsuite/ld-aarch64/ifunc-18a.s      |   5 -
 ld/testsuite/ld-aarch64/ifunc-18b.d      |  14 -
 ld/testsuite/ld-aarch64/ifunc-18b.s      |  15 -
 ld/testsuite/ld-aarch64/ifunc-19a.d      |  13 -
 ld/testsuite/ld-aarch64/ifunc-19a.s      |   5 -
 ld/testsuite/ld-aarch64/ifunc-19b.d      |  13 -
 ld/testsuite/ld-aarch64/ifunc-19b.s      |  15 -
 ld/testsuite/ld-aarch64/ifunc-2-local.d  |   9 -
 ld/testsuite/ld-aarch64/ifunc-2-local.s  |  15 -
 ld/testsuite/ld-aarch64/ifunc-2.d        |   9 -
 ld/testsuite/ld-aarch64/ifunc-2.s        |  18 -
 ld/testsuite/ld-aarch64/ifunc-20.d       |  12 -
 ld/testsuite/ld-aarch64/ifunc-20.s       |  16 -
 ld/testsuite/ld-aarch64/ifunc-3.s        |  16 -
 ld/testsuite/ld-aarch64/ifunc-3a.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-3b.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-4.d        |   7 -
 ld/testsuite/ld-aarch64/ifunc-4.s        |  18 -
 ld/testsuite/ld-aarch64/ifunc-4a.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-5-local.s  |  19 -
 ld/testsuite/ld-aarch64/ifunc-5.s        |  20 -
 ld/testsuite/ld-aarch64/ifunc-5a-local.d |   8 -
 ld/testsuite/ld-aarch64/ifunc-5a.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-5b-local.d |   8 -
 ld/testsuite/ld-aarch64/ifunc-5b.d       |  12 -
 ld/testsuite/ld-aarch64/ifunc-5r-local.d |  10 -
 ld/testsuite/ld-aarch64/ifunc-6.s        |  21 -
 ld/testsuite/ld-aarch64/ifunc-6a.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-6b.d       |  12 -
 ld/testsuite/ld-aarch64/ifunc-7.s        |  21 -
 ld/testsuite/ld-aarch64/ifunc-7a.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-7b.d       |   8 -
 ld/testsuite/ld-aarch64/ifunc-7c.d       |  19 -
 ld/testsuite/ld-aarch64/ifunc-8.d        |   9 -
 ld/testsuite/ld-aarch64/ifunc-8a.s       |  13 -
 ld/testsuite/ld-aarch64/ifunc-8b.s       |   7 -
 ld/testsuite/ld-aarch64/ifunc-9.d        |   3 -
 ld/testsuite/ld-aarch64/ifunc-9.s        |  23 --
 ld/testsuite/ld-ifunc/ifunc.exp          |   3 +-
 75 files changed, 76 insertions(+), 1442 deletions(-)
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1-local.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1-local.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-10.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-10.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-11.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-11.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-12.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-12.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14c.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14c.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14d.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14e.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14f.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-15.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-15.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-16.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-16.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2-local.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2-local.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-20.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-20.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5-local.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5a-local.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5b-local.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5r-local.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7a.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7b.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7c.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8a.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8b.s
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-9.d
 delete mode 100644 ld/testsuite/ld-aarch64/ifunc-9.s

Comments

Marcus Shawcroft June 19, 2013, 9:56 a.m. | #1
Will,  This is OK.  Thanks Marcus


On 19 June 2013 10:13, Will Newton <will.newton@linaro.org> wrote:
>
> The AArch64 ifunc patch introduced a regression caused by incorrect
> PLT layout. Revert it until a fix is verified.
>
> bfd/ChangeLog:
>
> 2013-06-19  Will Newton  <will.newton@linaro.org>
>
>         * configure: Regenerated.
>         * configure.in: Remove aarch64 dependency on elf-ifunc.c.
>         * elf64-aarch64.c: Remove objalloc.h include.
>         (elf64_aarch64_howto_dynrelocs): Remove R_AARCH64_IRELATIVE howto.
>         (struct elf64_aarch64_link_hash_table): Remove ifunc related
>         members. (elf_aarch64_local_htab_hash): Remove function.
>         (elf_aarch64_local_htab_eq): Remove function.
>         (elf_aarch64_get_local_sym_hash): Remove function.
>         (elf64_aarch64_link_hash_table_create): Remove local hash
>         table initialization.
>         (elf64_aarch64_final_link_relocate): Remove sym argument and
>         handling of ifunc symbols.
>         (elf64_aarch64_relocate_section): Don't pass sym argument to
>         elf64_aarch64_final_link_relocate.
>         (elf64_aarch64_gc_sweep_hook): Remove handling of ifunc symbols.
>         (elf64_aarch64_adjust_dynamic_symbol): Likewise.
>         (elf64_aarch64_check_relocs): Likewise.
>         (elf64_aarch64_post_process_headers): Remove call to
>         _bfd_elf_set_osabi.
>         (elf64_aarch64_is_function_type): New function.
>         (elf64_aarch64_allocate_dynrelocs): Remove handling of ifunc
>         symbols. (elf_aarch64_allocate_local_dynrelocs): Remove function.
>         (elf64_aarch64_size_dynamic_sections): Remove call to
>         elf_aarch64_allocate_local_dynrelocs.
>         (elf64_aarch64_create_small_pltn_entry): Remove info argument.
>         Remove creation of R_AARCH64_IRELATIVE dynamic relocs.
>         (elf64_aarch64_finish_dynamic_symbol): Remove handling of ifunc
>         symbols. (elf_aarch64_finish_local_dynamic_symbol): Remove
>         function. (elf64_aarch64_finish_dynamic_sections): Remove call to
>         elf_aarch64_finish_local_dynamic_symbol.
>         (elf64_aarch64_add_symbol_hook): Remove function.
>
> include/elf/ChangeLog:
>
> 2013-06-19  Will Newton  <will.newton@linaro.org>
>
>         * aarch64.h: Remove R_AARCH64_IRELATIVE.
>
> ld/ChangeLog:
>
> 2013-06-19  Will Newton  <will.newton@linaro.org>
>
>         * emulparams/aarch64elf.sh: Remove IREL_IN_PLT.
>
> ld/testsuite/ChangeLog:
>
> 2013-06-19  Will Newton  <will.newton@linaro.org>
>
>         * ld-aarch64/aarch64-elf.exp: Remove ifunc tests.
>         * ld-ifunc/ifunc.exp: Disable ifunc tests on AArch64.
>         * ld-aarch64/ifunc-1-local.d: Remove.
>         * ld-aarch64/ifunc-1-local.s: Likewise.
>         * ld-aarch64/ifunc-1.d: Likewise.
>         * ld-aarch64/ifunc-1.s: Likewise.
>         * ld-aarch64/ifunc-10.d: Likewise.
>         * ld-aarch64/ifunc-10.s: Likewise.
>         * ld-aarch64/ifunc-11.d: Likewise.
>         * ld-aarch64/ifunc-11.s: Likewise.
>         * ld-aarch64/ifunc-12.d: Likewise.
>         * ld-aarch64/ifunc-12.s: Likewise.
>         * ld-aarch64/ifunc-13.d: Likewise.
>         * ld-aarch64/ifunc-13a.s: Likewise.
>         * ld-aarch64/ifunc-13b.s: Likewise.
>         * ld-aarch64/ifunc-14a.d: Likewise.
>         * ld-aarch64/ifunc-14a.s: Likewise.
>         * ld-aarch64/ifunc-14b.d: Likewise.
>         * ld-aarch64/ifunc-14b.s: Likewise.
>         * ld-aarch64/ifunc-14c.d: Likewise.
>         * ld-aarch64/ifunc-14c.s: Likewise.
>         * ld-aarch64/ifunc-14d.d: Likewise.
>         * ld-aarch64/ifunc-14e.d: Likewise.
>         * ld-aarch64/ifunc-14f.d: Likewise.
>         * ld-aarch64/ifunc-15.d: Likewise.
>         * ld-aarch64/ifunc-15.s: Likewise.
>         * ld-aarch64/ifunc-16.d: Likewise.
>         * ld-aarch64/ifunc-16.s: Likewise.
>         * ld-aarch64/ifunc-17a.d: Likewise.
>         * ld-aarch64/ifunc-17a.s: Likewise.
>         * ld-aarch64/ifunc-17b.d: Likewise.
>         * ld-aarch64/ifunc-17b.s: Likewise.
>         * ld-aarch64/ifunc-18a.d: Likewise.
>         * ld-aarch64/ifunc-18a.s: Likewise.
>         * ld-aarch64/ifunc-18b.d: Likewise.
>         * ld-aarch64/ifunc-18b.s: Likewise.
>         * ld-aarch64/ifunc-19a.d: Likewise.
>         * ld-aarch64/ifunc-19a.s: Likewise.
>         * ld-aarch64/ifunc-19b.d: Likewise.
>         * ld-aarch64/ifunc-19b.s: Likewise.
>         * ld-aarch64/ifunc-2-local.d: Likewise.
>         * ld-aarch64/ifunc-2-local.s: Likewise.
>         * ld-aarch64/ifunc-2.d: Likewise.
>         * ld-aarch64/ifunc-2.s: Likewise.
>         * ld-aarch64/ifunc-20.d: Likewise.
>         * ld-aarch64/ifunc-20.s: Likewise.
>         * ld-aarch64/ifunc-3.s: Likewise.
>         * ld-aarch64/ifunc-3a.d: Likewise.
>         * ld-aarch64/ifunc-3b.d: Likewise.
>         * ld-aarch64/ifunc-4.d: Likewise.
>         * ld-aarch64/ifunc-4.s: Likewise.
>         * ld-aarch64/ifunc-4a.d: Likewise.
>         * ld-aarch64/ifunc-5-local.s: Likewise.
>         * ld-aarch64/ifunc-5.s: Likewise.
>         * ld-aarch64/ifunc-5a-local.d: Likewise.
>         * ld-aarch64/ifunc-5a.d: Likewise.
>         * ld-aarch64/ifunc-5b-local.d: Likewise.
>         * ld-aarch64/ifunc-5b.d: Likewise.
>         * ld-aarch64/ifunc-5r-local.d: Likewise.
>         * ld-aarch64/ifunc-6.s: Likewise.
>         * ld-aarch64/ifunc-6a.d: Likewise.
>         * ld-aarch64/ifunc-6b.d: Likewise.
>         * ld-aarch64/ifunc-7.s: Likewise.
>         * ld-aarch64/ifunc-7a.d: Likewise.
>         * ld-aarch64/ifunc-7b.d: Likewise.
>         * ld-aarch64/ifunc-7c.d: Likewise.
>         * ld-aarch64/ifunc-8.d: Likewise.
>         * ld-aarch64/ifunc-8a.s: Likewise.
>         * ld-aarch64/ifunc-8b.s: Likewise.
>         * ld-aarch64/ifunc-9.d: Likewise.
>         * ld-aarch64/ifunc-9.s: Likewise.
> ---
>  bfd/configure.in                         |   4 +-
>  bfd/elf64-aarch64.c                      | 663 ++++---------------------------
>  include/elf/aarch64.h                    |   3 +-
>  ld/emulparams/aarch64elf.sh              |   2 -
>  ld/testsuite/ld-aarch64/aarch64-elf.exp  |  41 --
>  ld/testsuite/ld-aarch64/ifunc-1-local.d  |   7 -
>  ld/testsuite/ld-aarch64/ifunc-1-local.s  |  13 -
>  ld/testsuite/ld-aarch64/ifunc-1.d        |   7 -
>  ld/testsuite/ld-aarch64/ifunc-1.s        |  16 -
>  ld/testsuite/ld-aarch64/ifunc-10.d       |   5 -
>  ld/testsuite/ld-aarch64/ifunc-10.s       |  25 --
>  ld/testsuite/ld-aarch64/ifunc-11.d       |   5 -
>  ld/testsuite/ld-aarch64/ifunc-11.s       |  26 --
>  ld/testsuite/ld-aarch64/ifunc-12.d       |   5 -
>  ld/testsuite/ld-aarch64/ifunc-12.s       |  24 --
>  ld/testsuite/ld-aarch64/ifunc-13.d       |  13 -
>  ld/testsuite/ld-aarch64/ifunc-13a.s      |  11 -
>  ld/testsuite/ld-aarch64/ifunc-13b.s      |   5 -
>  ld/testsuite/ld-aarch64/ifunc-14a.d      |  10 -
>  ld/testsuite/ld-aarch64/ifunc-14a.s      |   7 -
>  ld/testsuite/ld-aarch64/ifunc-14b.d      |  10 -
>  ld/testsuite/ld-aarch64/ifunc-14b.s      |   5 -
>  ld/testsuite/ld-aarch64/ifunc-14c.d      |  10 -
>  ld/testsuite/ld-aarch64/ifunc-14c.s      |   7 -
>  ld/testsuite/ld-aarch64/ifunc-14d.d      |  10 -
>  ld/testsuite/ld-aarch64/ifunc-14e.d      |  11 -
>  ld/testsuite/ld-aarch64/ifunc-14f.d      |  11 -
>  ld/testsuite/ld-aarch64/ifunc-15.d       |  12 -
>  ld/testsuite/ld-aarch64/ifunc-15.s       |  11 -
>  ld/testsuite/ld-aarch64/ifunc-16.d       |   9 -
>  ld/testsuite/ld-aarch64/ifunc-16.s       |  17 -
>  ld/testsuite/ld-aarch64/ifunc-17a.d      |   9 -
>  ld/testsuite/ld-aarch64/ifunc-17a.s      |  11 -
>  ld/testsuite/ld-aarch64/ifunc-17b.d      |   9 -
>  ld/testsuite/ld-aarch64/ifunc-17b.s      |   6 -
>  ld/testsuite/ld-aarch64/ifunc-18a.d      |  14 -
>  ld/testsuite/ld-aarch64/ifunc-18a.s      |   5 -
>  ld/testsuite/ld-aarch64/ifunc-18b.d      |  14 -
>  ld/testsuite/ld-aarch64/ifunc-18b.s      |  15 -
>  ld/testsuite/ld-aarch64/ifunc-19a.d      |  13 -
>  ld/testsuite/ld-aarch64/ifunc-19a.s      |   5 -
>  ld/testsuite/ld-aarch64/ifunc-19b.d      |  13 -
>  ld/testsuite/ld-aarch64/ifunc-19b.s      |  15 -
>  ld/testsuite/ld-aarch64/ifunc-2-local.d  |   9 -
>  ld/testsuite/ld-aarch64/ifunc-2-local.s  |  15 -
>  ld/testsuite/ld-aarch64/ifunc-2.d        |   9 -
>  ld/testsuite/ld-aarch64/ifunc-2.s        |  18 -
>  ld/testsuite/ld-aarch64/ifunc-20.d       |  12 -
>  ld/testsuite/ld-aarch64/ifunc-20.s       |  16 -
>  ld/testsuite/ld-aarch64/ifunc-3.s        |  16 -
>  ld/testsuite/ld-aarch64/ifunc-3a.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-3b.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-4.d        |   7 -
>  ld/testsuite/ld-aarch64/ifunc-4.s        |  18 -
>  ld/testsuite/ld-aarch64/ifunc-4a.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-5-local.s  |  19 -
>  ld/testsuite/ld-aarch64/ifunc-5.s        |  20 -
>  ld/testsuite/ld-aarch64/ifunc-5a-local.d |   8 -
>  ld/testsuite/ld-aarch64/ifunc-5a.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-5b-local.d |   8 -
>  ld/testsuite/ld-aarch64/ifunc-5b.d       |  12 -
>  ld/testsuite/ld-aarch64/ifunc-5r-local.d |  10 -
>  ld/testsuite/ld-aarch64/ifunc-6.s        |  21 -
>  ld/testsuite/ld-aarch64/ifunc-6a.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-6b.d       |  12 -
>  ld/testsuite/ld-aarch64/ifunc-7.s        |  21 -
>  ld/testsuite/ld-aarch64/ifunc-7a.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-7b.d       |   8 -
>  ld/testsuite/ld-aarch64/ifunc-7c.d       |  19 -
>  ld/testsuite/ld-aarch64/ifunc-8.d        |   9 -
>  ld/testsuite/ld-aarch64/ifunc-8a.s       |  13 -
>  ld/testsuite/ld-aarch64/ifunc-8b.s       |   7 -
>  ld/testsuite/ld-aarch64/ifunc-9.d        |   3 -
>  ld/testsuite/ld-aarch64/ifunc-9.s        |  23 --
>  ld/testsuite/ld-ifunc/ifunc.exp          |   3 +-
>  75 files changed, 76 insertions(+), 1442 deletions(-)
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1-local.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1-local.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-1.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-10.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-10.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-11.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-11.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-12.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-12.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-13b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14c.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14c.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14d.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14e.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-14f.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-15.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-15.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-16.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-16.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-17b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-18b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-19b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2-local.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2-local.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-2.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-20.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-20.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-3b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-4a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5-local.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5a-local.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5b-local.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-5r-local.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-6b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7a.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7b.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-7c.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8a.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-8b.s
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-9.d
>  delete mode 100644 ld/testsuite/ld-aarch64/ifunc-9.s
>
> diff --git a/bfd/configure.in b/bfd/configure.in
> index 89f68fd..ff14270 100644
> --- a/bfd/configure.in
> +++ b/bfd/configure.in
> @@ -859,7 +859,7 @@ do
>      bfd_elf32_xtensa_be_vec)   tb="$tb xtensa-isa.lo xtensa-modules.lo elf32-xtensa.lo elf32.lo $elf" ;;
>      bfd_elf64_alpha_freebsd_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_alpha_vec)       tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
> -    bfd_elf64_bigaarch64_vec)  tb="$tb elf64-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
> +    bfd_elf64_bigaarch64_vec)  tb="$tb elf64-aarch64.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_big_generic_vec)         tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_bigmips_vec)     tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
>      bfd_elf64_hppa_linux_vec)  tb="$tb elf64-hppa.lo elf64.lo $elf"; target_size=64 ;;
> @@ -868,7 +868,7 @@ do
>      bfd_elf64_ia64_hpux_big_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_ia64_little_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_ia64_vms_vec)    tb="$tb elf64-ia64-vms.lo elf64-ia64.lo elfxx-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
> -    bfd_elf64_littleaarch64_vec)tb="$tb elf64-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
> +    bfd_elf64_littleaarch64_vec)tb="$tb elf64-aarch64.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
>      bfd_elf64_littlemips_vec)  tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
>      bfd_elf64_mmix_vec)        tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
> diff --git a/bfd/elf64-aarch64.c b/bfd/elf64-aarch64.c
> index d6ecbb4..68f03fc 100644
> --- a/bfd/elf64-aarch64.c
> +++ b/bfd/elf64-aarch64.c
> @@ -142,7 +142,6 @@
>  #include "bfd_stdint.h"
>  #include "elf-bfd.h"
>  #include "bfdlink.h"
> -#include "objalloc.h"
>  #include "elf/aarch64.h"
>
>  static bfd_reloc_status_type
> @@ -399,20 +398,6 @@ static reloc_howto_type elf64_aarch64_howto_dynrelocs[] =
>          ALL_ONES,              /* dst_mask */
>          FALSE),                /* pcrel_offset */
>
> -  HOWTO (R_AARCH64_IRELATIVE,  /* type */
> -        0,                     /* rightshift */
> -        2,                     /* size (0 = byte, 1 = short, 2 = long) */
> -        64,                    /* bitsize */
> -        FALSE,                 /* pc_relative */
> -        0,                     /* bitpos */
> -        complain_overflow_bitfield,    /* complain_on_overflow */
> -        bfd_elf_generic_reloc, /* special_function */
> -        "R_AARCH64_IRELATIVE", /* name */
> -        FALSE,                 /* partial_inplace */
> -        0,                     /* src_mask */
> -        ALL_ONES,              /* dst_mask */
> -        FALSE),                /* pcrel_offset */
> -
>  };
>
>  /* Note: code such as elf64_aarch64_reloc_type_lookup expect to use e.g.
> @@ -1879,15 +1864,6 @@ struct elf64_aarch64_link_hash_table
>       loader via DT_TLSDESC_GOT.  The magic value (bfd_vma) -1
>       indicates an offset is not allocated.  */
>    bfd_vma dt_tlsdesc_got;
> -
> -  /* Used by local STT_GNU_IFUNC symbols.  */
> -  htab_t loc_hash_table;
> -  void * loc_hash_memory;
> -
> -  /* The index of the next R_AARCH64_JUMP_SLOT entry in .rela.plt.  */
> -  bfd_vma next_jump_slot_index;
> -  /* The index of the next R_AARCH64_IRELATIVE entry in .rela.plt.  */
> -  bfd_vma next_irelative_index;
>  };
>
>
> @@ -1997,72 +1973,6 @@ stub_hash_newfunc (struct bfd_hash_entry *entry,
>    return entry;
>  }
>
> -/* Compute a hash of a local hash entry.  We use elf_link_hash_entry
> -  for local symbol so that we can handle local STT_GNU_IFUNC symbols
> -  as global symbol.  We reuse indx and dynstr_index for local symbol
> -  hash since they aren't used by global symbols in this backend.  */
> -
> -static hashval_t
> -elf_aarch64_local_htab_hash (const void *ptr)
> -{
> -  struct elf_link_hash_entry *h
> -    = (struct elf_link_hash_entry *) ptr;
> -  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
> -}
> -
> -/* Compare local hash entries.  */
> -
> -static int
> -elf_aarch64_local_htab_eq (const void *ptr1, const void *ptr2)
> -{
> -  struct elf_link_hash_entry *h1
> -     = (struct elf_link_hash_entry *) ptr1;
> -  struct elf_link_hash_entry *h2
> -    = (struct elf_link_hash_entry *) ptr2;
> -
> -  return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
> -}
> -
> -/* Find and/or create a hash entry for local symbol.  */
> -
> -static struct elf_link_hash_entry *
> -elf_aarch64_get_local_sym_hash (struct elf64_aarch64_link_hash_table *htab,
> -                               bfd *abfd, const Elf_Internal_Rela *rel,
> -                               bfd_boolean create)
> -{
> -  struct elf64_aarch64_link_hash_entry e, *ret;
> -  asection *sec = abfd->sections;
> -  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
> -                                      ELF64_R_SYM (rel->r_info));
> -  void **slot;
> -
> -  e.root.indx = sec->id;
> -  e.root.dynstr_index = ELF64_R_SYM (rel->r_info);
> -  slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
> -                                  create ? INSERT : NO_INSERT);
> -
> -  if (!slot)
> -    return NULL;
> -
> -  if (*slot)
> -    {
> -      ret = (struct elf64_aarch64_link_hash_entry *) *slot;
> -      return &ret->root;
> -    }
> -
> -  ret = (struct elf64_aarch64_link_hash_entry *)
> -       objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
> -                       sizeof (struct elf64_aarch64_link_hash_entry));
> -  if (ret)
> -    {
> -      memset (ret, 0, sizeof (*ret));
> -      ret->root.indx = sec->id;
> -      ret->root.dynstr_index = ELF64_R_SYM (rel->r_info);
> -      ret->root.dynindx = -1;
> -      *slot = ret;
> -    }
> -  return &ret->root;
> -}
>
>  /* Copy the extra info we tack onto an elf_link_hash_entry.  */
>
> @@ -2152,17 +2062,6 @@ elf64_aarch64_link_hash_table_create (bfd *abfd)
>        return NULL;
>      }
>
> -  ret->loc_hash_table = htab_try_create (1024,
> -                                        elf_aarch64_local_htab_hash,
> -                                        elf_aarch64_local_htab_eq,
> -                                        NULL);
> -  ret->loc_hash_memory = objalloc_create ();
> -  if (!ret->loc_hash_table || !ret->loc_hash_memory)
> -    {
> -      free (ret);
> -      return NULL;
> -    }
> -
>    return &ret->root.root;
>  }
>
> @@ -2174,11 +2073,6 @@ elf64_aarch64_hash_table_free (struct bfd_link_hash_table *hash)
>    struct elf64_aarch64_link_hash_table *ret
>      = (struct elf64_aarch64_link_hash_table *) hash;
>
> -  if (ret->loc_hash_table)
> -    htab_delete (ret->loc_hash_table);
> -  if (ret->loc_hash_memory)
> -    objalloc_free ((struct objalloc *) ret->loc_hash_memory);
> -
>    bfd_hash_table_free (&ret->stub_hash_table);
>    _bfd_elf_link_hash_table_free (hash);
>  }
> @@ -3876,10 +3770,8 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
>                                    struct elf_link_hash_entry *h,
>                                    bfd_boolean *unresolved_reloc_p,
>                                    bfd_boolean save_addend,
> -                                  bfd_vma *saved_addend,
> -                                  Elf_Internal_Sym *sym)
> +                                  bfd_vma *saved_addend)
>  {
> -  Elf_Internal_Shdr *symtab_hdr;
>    unsigned int r_type = howto->type;
>    unsigned long r_symndx;
>    bfd_byte *hit_data = contents + rel->r_offset;
> @@ -3890,8 +3782,6 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
>
>    globals = elf64_aarch64_hash_table (info);
>
> -  symtab_hdr = &elf_symtab_hdr (input_bfd);
> -
>    BFD_ASSERT (is_aarch64_elf (input_bfd));
>
>    r_symndx = ELF64_R_SYM (rel->r_info);
> @@ -3913,184 +3803,6 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
>
>    weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
>                   : bfd_is_und_section (sym_sec));
> -
> -  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
> -     it here if it is defined in a non-shared object.  */
> -  if (h != NULL
> -      && h->type == STT_GNU_IFUNC
> -      && h->def_regular)
> -    {
> -      asection *plt;
> -      const char *name;
> -      asection *base_got;
> -      bfd_vma off;
> -
> -      if ((input_section->flags & SEC_ALLOC) == 0
> -         || h->plt.offset == (bfd_vma) -1)
> -       abort ();
> -
> -      /* STT_GNU_IFUNC symbol must go through PLT.  */
> -      plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
> -      value = (plt->output_section->vma + plt->output_offset + h->plt.offset);
> -
> -      switch (r_type)
> -       {
> -       default:
> -         if (h->root.root.string)
> -           name = h->root.root.string;
> -         else
> -           name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
> -                                    NULL);
> -         (*_bfd_error_handler)
> -           (_("%B: relocation %s against STT_GNU_IFUNC "
> -              "symbol `%s' isn't handled by %s"), input_bfd,
> -            howto->name, name, __FUNCTION__);
> -         bfd_set_error (bfd_error_bad_value);
> -         return FALSE;
> -
> -       case R_AARCH64_ABS64:
> -         if (rel->r_addend != 0)
> -           {
> -             if (h->root.root.string)
> -               name = h->root.root.string;
> -             else
> -               name = bfd_elf_sym_name (input_bfd, symtab_hdr,
> -                                        sym, NULL);
> -             (*_bfd_error_handler)
> -               (_("%B: relocation %s against STT_GNU_IFUNC "
> -                  "symbol `%s' has non-zero addend: %d"),
> -                input_bfd, howto->name, name, rel->r_addend);
> -             bfd_set_error (bfd_error_bad_value);
> -             return FALSE;
> -           }
> -
> -         /* Generate dynamic relocation only when there is a
> -            non-GOT reference in a shared object.  */
> -         if (info->shared && h->non_got_ref)
> -           {
> -             Elf_Internal_Rela outrel;
> -             asection *sreloc;
> -
> -             /* Need a dynamic relocation to get the real function
> -                address.  */
> -             outrel.r_offset = _bfd_elf_section_offset (output_bfd,
> -                                                        info,
> -                                                        input_section,
> -                                                        rel->r_offset);
> -             if (outrel.r_offset == (bfd_vma) -1
> -                 || outrel.r_offset == (bfd_vma) -2)
> -               abort ();
> -
> -             outrel.r_offset += (input_section->output_section->vma
> -                                 + input_section->output_offset);
> -
> -             if (h->dynindx == -1
> -                 || h->forced_local
> -                 || info->executable)
> -               {
> -                 /* This symbol is resolved locally.  */
> -                 outrel.r_info = ELF64_R_INFO (0, R_AARCH64_IRELATIVE);
> -                 outrel.r_addend = (h->root.u.def.value
> -                                    + h->root.u.def.section->output_section->vma
> -                                    + h->root.u.def.section->output_offset);
> -               }
> -             else
> -               {
> -                 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
> -                 outrel.r_addend = 0;
> -               }
> -
> -             sreloc = globals->root.irelifunc;
> -             elf_append_rela (output_bfd, sreloc, &outrel);
> -
> -             /* If this reloc is against an external symbol, we
> -                do not want to fiddle with the addend.  Otherwise,
> -                we need to include the symbol value so that it
> -                becomes an addend for the dynamic reloc.  For an
> -                internal symbol, we have updated addend.  */
> -             return bfd_reloc_ok;
> -           }
> -         return _bfd_final_link_relocate (howto, input_bfd, input_section,
> -                                          contents, rel->r_offset, value,
> -                                          signed_addend);
> -
> -       case R_AARCH64_JUMP26:
> -       case R_AARCH64_CALL26:
> -         value = aarch64_resolve_relocation (r_type, place, value,
> -                                             signed_addend, weak_undef_p);
> -         return bfd_elf_aarch64_put_addend (input_bfd, hit_data, howto, value);
> -
> -       case R_AARCH64_LD64_GOT_LO12_NC:
> -       case R_AARCH64_ADR_GOT_PAGE:
> -       case R_AARCH64_GOT_LD_PREL19:
> -         base_got = globals->root.sgot;
> -         off = h->got.offset;
> -
> -         if (base_got == NULL)
> -           abort ();
> -
> -         if (off == (bfd_vma) -1)
> -           {
> -             bfd_vma plt_index;
> -
> -             /* We can't use h->got.offset here to save state, or
> -                even just remember the offset, as finish_dynamic_symbol
> -                would use that as offset into .got.  */
> -
> -             if (globals->root.splt != NULL)
> -               {
> -                 plt_index = h->plt.offset / globals->plt_entry_size - 1;
> -                 off = (plt_index + 3) * GOT_ENTRY_SIZE;
> -                 base_got = globals->root.sgotplt;
> -               }
> -             else
> -               {
> -                 plt_index = h->plt.offset / globals->plt_entry_size;
> -                 off = plt_index * GOT_ENTRY_SIZE;
> -                 base_got = globals->root.igotplt;
> -               }
> -
> -             if (h->dynindx == -1
> -                 || h->forced_local
> -                 || info->symbolic)
> -               {
> -                 /* This references the local defitionion.  We must
> -                    initialize this entry in the global offset table.
> -                    Since the offset must always be a multiple of 8,
> -                    we use the least significant bit to record
> -                    whether we have initialized it already.
> -
> -                    When doing a dynamic link, we create a .rela.got
> -                    relocation entry to initialize the value.  This
> -                    is done in the finish_dynamic_symbol routine.       */
> -                 if ((off & 1) != 0)
> -                   off &= ~1;
> -                 else
> -                   {
> -                     bfd_put_64 (output_bfd, value,
> -                                 base_got->contents + off);
> -                     /* Note that this is harmless for the GOTPLT64
> -                        case, as -1 | 1 still is -1.  */
> -                     h->got.offset |= 1;
> -                   }
> -               }
> -             value = (base_got->output_section->vma
> -                      + base_got->output_offset + off);
> -           }
> -         else
> -           value = aarch64_calculate_got_entry_vma (h, globals, info,
> -                                                    value, output_bfd,
> -                                                    unresolved_reloc_p);
> -         value = aarch64_resolve_relocation (r_type, place, value,
> -                                             0, weak_undef_p);
> -         return bfd_elf_aarch64_put_addend (input_bfd, hit_data, howto, value);
> -
> -       case R_AARCH64_ADR_PREL_PG_HI21:
> -       case R_AARCH64_ADD_ABS_LO12_NC:
> -         break;
> -       }
> -    }
> -
>    switch (r_type)
>      {
>      case R_AARCH64_NONE:
> @@ -4117,6 +3829,11 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
>
>           *unresolved_reloc_p = FALSE;
>
> +         sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd,
> +                                                      input_section, 1);
> +         if (sreloc == NULL)
> +           return bfd_reloc_notsupported;
> +
>           skip = FALSE;
>           relocate = FALSE;
>
> @@ -4153,14 +3870,10 @@ elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
>               outrel.r_addend += value;
>             }
>
> -         sreloc = elf_section_data (input_section)->sreloc;
> -         if (sreloc == NULL || sreloc->contents == NULL)
> -           return bfd_reloc_notsupported;
> -
> -         loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (globals);
> +         loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (htab);
>           bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
>
> -         if (sreloc->reloc_count * RELOC_SIZE (globals) > sreloc->size)
> +         if (sreloc->reloc_count * RELOC_SIZE (htab) > sreloc->size)
>             {
>               /* Sanity to check that we have previously allocated
>                  sufficient space in the relocation section for the
> @@ -4571,20 +4284,6 @@ elf64_aarch64_relocate_section (bfd *output_bfd,
>             }
>
>           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
> -
> -         /* Relocate against local STT_GNU_IFUNC symbol.  */
> -         if (!info->relocatable
> -             && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
> -           {
> -             h = elf_aarch64_get_local_sym_hash (globals, input_bfd,
> -                                                 rel, FALSE);
> -             if (h == NULL)
> -               abort ();
> -
> -             /* Set STT_GNU_IFUNC symbol value.  */
> -             h->root.u.def.value = sym->st_value;
> -             h->root.u.def.section = sec;
> -           }
>         }
>        else
>         {
> @@ -4674,7 +4373,7 @@ elf64_aarch64_relocate_section (bfd *output_bfd,
>                                                input_section, contents, rel,
>                                                relocation, info, sec,
>                                                h, &unresolved_reloc,
> -                                              save_addend, &addend, sym);
> +                                              save_addend, &addend);
>
>        switch (r_type)
>         {
> @@ -5151,46 +4850,38 @@ elf64_aarch64_gc_sweep_hook (bfd *abfd,
>        struct elf_link_hash_entry *h = NULL;
>
>        r_symndx = ELF64_R_SYM (rel->r_info);
> +
>        if (r_symndx >= symtab_hdr->sh_info)
>         {
> +         struct elf64_aarch64_link_hash_entry *eh;
> +         struct elf_dyn_relocs **pp;
> +         struct elf_dyn_relocs *p;
> +
>           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
>           while (h->root.type == bfd_link_hash_indirect
>                  || h->root.type == bfd_link_hash_warning)
>             h = (struct elf_link_hash_entry *) h->root.u.i.link;
> +         eh = (struct elf64_aarch64_link_hash_entry *) h;
> +
> +         for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
> +           {
> +             if (p->sec == sec)
> +               {
> +                 /* Everything must go for SEC.  */
> +                 *pp = p->next;
> +                 break;
> +               }
> +           }
>          }
>        else
>         {
> -         /* A local symbol.  */
>           Elf_Internal_Sym *isym;
>
> +         /* A local symbol.  */
>           isym = bfd_sym_from_r_symndx (&htab->sym_cache,
>                                         abfd, r_symndx);
> -
> -         /* Check relocation against local STT_GNU_IFUNC symbol.  */
> -         if (isym != NULL
> -             && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
> -           {
> -             h = elf_aarch64_get_local_sym_hash (htab, abfd, rel, FALSE);
> -             if (h == NULL)
> -               abort ();
> -           }
> -       }
> -
> -      if (h)
> -       {
> -         struct elf64_aarch64_link_hash_entry *eh;
> -         struct elf_dyn_relocs **pp;
> -         struct elf_dyn_relocs *p;
> -
> -         eh = (struct elf64_aarch64_link_hash_entry *) h;
> -
> -         for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
> -           if (p->sec == sec)
> -             {
> -               /* Everything must go for SEC.  */
> -               *pp = p->next;
> -               break;
> -             }
> +         if (isym == NULL)
> +           return FALSE;
>         }
>
>        r_type = ELF64_R_TYPE (rel->r_info);
> @@ -5219,12 +4910,6 @@ elf64_aarch64_gc_sweep_hook (bfd *abfd,
>             {
>               if (h->got.refcount > 0)
>                 h->got.refcount -= 1;
> -
> -             if (h->type == STT_GNU_IFUNC)
> -               {
> -                 if (h->plt.refcount > 0)
> -                   h->plt.refcount -= 1;
> -               }
>             }
>           else if (locals != NULL)
>             {
> @@ -5255,7 +4940,7 @@ elf64_aarch64_gc_sweep_hook (bfd *abfd,
>           break;
>
>         case R_AARCH64_ABS64:
> -         if (h != NULL)
> +         if (h != NULL && info->executable)
>             {
>               if (h->plt.refcount > 0)
>                 h->plt.refcount -= 1;
> @@ -5286,13 +4971,12 @@ elf64_aarch64_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_GNU_IFUNC || h->needs_plt)
> +  if (h->type == STT_FUNC || h->needs_plt)
>      {
>        if (h->plt.refcount <= 0
> -         || (h->type != STT_GNU_IFUNC
> -             && (SYMBOL_CALLS_LOCAL (info, h)
> -                 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
> -                     && h->root.type == bfd_link_hash_undefweak))))
> +         || SYMBOL_CALLS_LOCAL (info, h)
> +         || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
> +             && h->root.type == bfd_link_hash_undefweak))
>         {
>           /* This case can occur if we saw a CALL26 reloc in
>              an input file, but the symbol wasn't referred to
> @@ -5421,7 +5105,6 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
>        struct elf_link_hash_entry *h;
>        unsigned long r_symndx;
>        unsigned int r_type;
> -      Elf_Internal_Sym *isym;
>
>        r_symndx = ELF64_R_SYM (rel->r_info);
>        r_type = ELF64_R_TYPE (rel->r_info);
> @@ -5434,31 +5117,7 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
>         }
>
>        if (r_symndx < symtab_hdr->sh_info)
> -       {
> -         /* A local symbol.  */
> -         isym = bfd_sym_from_r_symndx (&htab->sym_cache,
> -                                       abfd, r_symndx);
> -         if (isym == NULL)
> -           return FALSE;
> -
> -         /* Check relocation against local STT_GNU_IFUNC symbol.  */
> -         if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
> -           {
> -             h = elf_aarch64_get_local_sym_hash (htab, abfd, rel,
> -                                                 TRUE);
> -             if (h == NULL)
> -               return FALSE;
> -
> -             /* Fake a STT_GNU_IFUNC symbol.  */
> -             h->type = STT_GNU_IFUNC;
> -             h->def_regular = 1;
> -             h->ref_regular = 1;
> -             h->forced_local = 1;
> -             h->root.type = bfd_link_hash_defined;
> -           }
> -         else
> -           h = NULL;
> -       }
> +       h = NULL;
>        else
>         {
>           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
> @@ -5471,37 +5130,6 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
>           h->root.non_ir_ref = 1;
>         }
>
> -      if (h != NULL)
> -       {
> -         /* Create the ifunc sections for static executables.  If we
> -            never see an indirect function symbol nor we are building
> -            a static executable, those sections will be empty and
> -            won't appear in output.  */
> -         switch (r_type)
> -           {
> -           default:
> -             break;
> -
> -           case R_AARCH64_ABS64:
> -           case R_AARCH64_CALL26:
> -           case R_AARCH64_JUMP26:
> -           case R_AARCH64_LD64_GOT_LO12_NC:
> -           case R_AARCH64_ADR_GOT_PAGE:
> -           case R_AARCH64_GOT_LD_PREL19:
> -           case R_AARCH64_ADR_PREL_PG_HI21:
> -           case R_AARCH64_ADD_ABS_LO12_NC:
> -             if (htab->root.dynobj == NULL)
> -               htab->root.dynobj = abfd;
> -             if (!_bfd_elf_create_ifunc_sections (htab->root.dynobj, info))
> -               return FALSE;
> -             break;
> -           }
> -
> -         /* It is referenced by a non-shared object. */
> -         h->ref_regular = 1;
> -         h->root.non_ir_ref = 1;
> -       }
> -
>        /* Could be done earlier, if h were already available.  */
>        r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);
>
> @@ -5563,6 +5191,7 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
>
>                 asection *s;
>                 void **vpp;
> +               Elf_Internal_Sym *isym;
>
>                 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
>                                               abfd, r_symndx);
> @@ -5712,10 +5341,7 @@ elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
>             continue;
>
>           h->needs_plt = 1;
> -         if (h->plt.refcount <= 0)
> -           h->plt.refcount = 1;
> -         else
> -           h->plt.refcount += 1;
> +         h->plt.refcount += 1;
>           break;
>         }
>      }
> @@ -5859,14 +5485,14 @@ elf64_aarch64_find_inliner_info (bfd *abfd,
>
>  static void
>  elf64_aarch64_post_process_headers (bfd *abfd,
> -                                   struct bfd_link_info *link_info)
> +                                   struct bfd_link_info *link_info
> +                                   ATTRIBUTE_UNUSED)
>  {
>    Elf_Internal_Ehdr *i_ehdrp;  /* ELF file header, internal form.  */
>
>    i_ehdrp = elf_elfheader (abfd);
> +  i_ehdrp->e_ident[EI_OSABI] = 0;
>    i_ehdrp->e_ident[EI_ABIVERSION] = AARCH64_ELF_ABI_VERSION;
> -
> -  _bfd_elf_set_osabi (abfd, link_info);
>  }
>
>  static enum elf_reloc_type_class
> @@ -6258,6 +5884,12 @@ elf64_aarch64_bfd_free_cached_info (bfd *abfd)
>    return _bfd_free_cached_info (abfd);
>  }
>
> +static bfd_boolean
> +elf64_aarch64_is_function_type (unsigned int type)
> +{
> +  return type == STT_FUNC;
> +}
> +
>  /* Create dynamic sections. This is different from the ARM backend in that
>     the got, plt, gotplt and their relocation sections are all created in the
>     standard part of the bfd elf backend.  */
> @@ -6324,18 +5956,7 @@ elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
>    info = (struct bfd_link_info *) inf;
>    htab = elf64_aarch64_hash_table (info);
>
> -  eh = (struct elf64_aarch64_link_hash_entry *) h;
> -
> -  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
> -     here if it is defined and referenced in a non-shared object.  */
> -  if (h->type == STT_GNU_IFUNC
> -      && h->def_regular)
> -    return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
> -                                              &eh->dyn_relocs,
> -                                              htab->plt_entry_size,
> -                                              htab->plt_header_size,
> -                                              GOT_ENTRY_SIZE);
> -  else if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
> +  if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
>      {
>        /* Make sure this symbol is output as a dynamic symbol.
>           Undefined weak syms won't yet be marked as dynamic.  */
> @@ -6406,6 +6027,7 @@ elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
>        h->needs_plt = 0;
>      }
>
> +  eh = (struct elf64_aarch64_link_hash_entry *) h;
>    eh->tlsdesc_got_jump_table_offset = (bfd_vma) - 1;
>
>    if (h->got.refcount > 0)
> @@ -6590,24 +6212,6 @@ elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
>  }
>
>
> -/* Allocate space in .plt, .got and associated reloc sections for
> -   local dynamic relocs.  */
> -
> -static bfd_boolean
> -elf_aarch64_allocate_local_dynrelocs (void **slot, void *inf)
> -{
> -  struct elf_link_hash_entry *h
> -    = (struct elf_link_hash_entry *) *slot;
> -
> -  if (h->type != STT_GNU_IFUNC
> -      || !h->def_regular
> -      || !h->ref_regular
> -      || !h->forced_local
> -      || h->root.type != bfd_link_hash_defined)
> -    abort ();
> -
> -  return elf64_aarch64_allocate_dynrelocs (h, inf);
> -}
>
>
>  /* This is the most important function of all . Innocuosly named
> @@ -6747,10 +6351,6 @@ elf64_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
>    elf_link_hash_traverse (&htab->root, elf64_aarch64_allocate_dynrelocs,
>                           info);
>
> -  /* Allocate .plt and .got entries, and space for local symbols.  */
> -  htab_traverse (htab->loc_hash_table,
> -                elf_aarch64_allocate_local_dynrelocs,
> -                info);
>
>    /* For every jump slot reserved in the sgotplt, reloc_count is
>       incremented.  However, when we reserve space for TLS descriptors,
> @@ -6759,12 +6359,7 @@ elf64_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
>       slot size.  */
>
>    if (htab->root.srelplt)
> -    {
> -      htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);
> -      htab->next_irelative_index = htab->root.srelplt->reloc_count - 1;
> -    }
> -  else if (htab->root.irelplt)
> -    htab->next_irelative_index = htab->root.irelplt->reloc_count - 1;
> +    htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);
>
>    if (htab->tlsdesc_plt)
>      {
> @@ -6911,8 +6506,7 @@ elf64_aarch64_update_plt_entry (bfd *output_bfd,
>  static void
>  elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
>                                        struct elf64_aarch64_link_hash_table
> -                                      *htab, bfd *output_bfd,
> -                                      struct bfd_link_info *info)
> +                                      *htab, bfd *output_bfd)
>  {
>    bfd_byte *plt_entry;
>    bfd_vma plt_index;
> @@ -6921,50 +6515,17 @@ elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
>    bfd_vma plt_entry_address;
>    Elf_Internal_Rela rela;
>    bfd_byte *loc;
> -  asection *plt, *gotplt, *relplt;
>
> -  /* When building a static executable, use .iplt, .igot.plt and
> -     .rela.iplt sections for STT_GNU_IFUNC symbols.  */
> -  if (htab->root.splt != NULL)
> -    {
> -      plt = htab->root.splt;
> -      gotplt = htab->root.sgotplt;
> -      relplt = htab->root.srelplt;
> -    }
> -  else
> -    {
> -      plt = htab->root.iplt;
> -      gotplt = htab->root.igotplt;
> -      relplt = htab->root.irelplt;
> -    }
> -
> -  /* Get the index in the procedure linkage table which
> -     corresponds to this symbol.  This is the index of this symbol
> -     in all the symbols for which we are making plt entries.  The
> -     first entry in the procedure linkage table is reserved.
> +  plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
>
> -     Get the offset into the .got table of the entry that
> -     corresponds to this function.     Each .got entry is GOT_ENTRY_SIZE
> -     bytes. The first three are reserved for the dynamic linker.
> -
> -     For static executables, we don't reserve anything.  */
> -
> -  if (plt == htab->root.splt)
> -    {
> -      got_offset = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
> -      got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
> -    }
> -  else
> -    {
> -      got_offset = h->plt.offset / htab->plt_entry_size;
> -      got_offset = got_offset * GOT_ENTRY_SIZE;
> -    }
> -
> -  plt_entry = plt->contents + h->plt.offset;
> -  plt_entry_address = plt->output_section->vma
> -    + plt->output_section->output_offset + h->plt.offset;
> -  gotplt_entry_address = gotplt->output_section->vma +
> -    gotplt->output_offset + got_offset;
> +  /* Offset in the GOT is PLT index plus got GOT headers(3)
> +     times 8.  */
> +  got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
> +  plt_entry = htab->root.splt->contents + h->plt.offset;
> +  plt_entry_address = htab->root.splt->output_section->vma
> +    + htab->root.splt->output_section->output_offset + h->plt.offset;
> +  gotplt_entry_address = htab->root.sgotplt->output_section->vma +
> +    htab->root.sgotplt->output_offset + got_offset;
>
>    /* Copy in the boiler-plate for the PLTn entry.  */
>    memcpy (plt_entry, elf64_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
> @@ -6988,38 +6549,19 @@ elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
>
>    /* All the GOTPLT Entries are essentially initialized to PLT0.  */
>    bfd_put_64 (output_bfd,
> -             plt->output_section->vma + plt->output_offset,
> -             gotplt->contents + got_offset);
> +             (htab->root.splt->output_section->vma
> +              + htab->root.splt->output_offset),
> +             htab->root.sgotplt->contents + got_offset);
>
> +  /* Fill in the entry in the .rela.plt section.  */
>    rela.r_offset = gotplt_entry_address;
> -
> -  if (h->dynindx == -1
> -      || ((info->executable
> -          || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
> -         && h->def_regular
> -         && h->type == STT_GNU_IFUNC))
> -    {
> -      /* If an STT_GNU_IFUNC symbol is locally defined, generate
> -        R_AARCH64_IRELATIVE instead of R_AARCH64_JUMP_SLOT.  */
> -      rela.r_info = ELF64_R_INFO (0, R_AARCH64_IRELATIVE);
> -      rela.r_addend = (h->root.u.def.value
> -                      + h->root.u.def.section->output_section->vma
> -                      + h->root.u.def.section->output_offset);
> -      /* R_AARCH64_IRELATIVE comes last.  */
> -      plt_index = htab->next_irelative_index--;
> -    }
> -  else
> -    {
> -      /* Fill in the entry in the .rela.plt section.  */
> -      rela.r_info = ELF64_R_INFO (h->dynindx, R_AARCH64_JUMP_SLOT);
> -      rela.r_addend = 0;
> -      plt_index = htab->next_jump_slot_index++;
> -    }
> +  rela.r_info = ELF64_R_INFO (h->dynindx, R_AARCH64_JUMP_SLOT);
> +  rela.r_addend = 0;
>
>    /* Compute the relocation entry to used based on PLT index and do
>       not adjust reloc_count. The reloc_count has already been adjusted
>       to account for this entry.  */
> -  loc = relplt->contents + plt_index * RELOC_SIZE (htab);
> +  loc = htab->root.srelplt->contents + plt_index * RELOC_SIZE (htab);
>    bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
>  }
>
> @@ -7079,38 +6621,15 @@ elf64_aarch64_finish_dynamic_symbol (bfd *output_bfd,
>
>    if (h->plt.offset != (bfd_vma) - 1)
>      {
> -      asection *plt, *gotplt, *relplt;
> -
>        /* This symbol has an entry in the procedure linkage table.  Set
>           it up.  */
>
> -      /* When building a static executable, use .iplt, .igot.plt and
> -        .rela.iplt sections for STT_GNU_IFUNC symbols.  */
> -      if (htab->root.splt != NULL)
> -       {
> -         plt = htab->root.splt;
> -         gotplt = htab->root.sgotplt;
> -         relplt = htab->root.srelplt;
> -       }
> -      else
> -       {
> -         plt = htab->root.iplt;
> -         gotplt = htab->root.igotplt;
> -         relplt = htab->root.irelplt;
> -       }
> -
> -      /* This symbol has an entry in the procedure linkage table.  Set
> -        it up.  */
> -      if ((h->dynindx == -1
> -          && !((h->forced_local || info->executable)
> -               && h->def_regular
> -               && h->type == STT_GNU_IFUNC))
> -         || plt == NULL
> -         || gotplt == NULL
> -         || relplt == NULL)
> +      if (h->dynindx == -1
> +         || htab->root.splt == NULL
> +         || htab->root.sgotplt == NULL || htab->root.srelplt == NULL)
>         abort ();
>
> -      elf64_aarch64_create_small_pltn_entry (h, htab, output_bfd, info);
> +      elf64_aarch64_create_small_pltn_entry (h, htab, output_bfd);
>        if (!h->def_regular)
>         {
>           /* Mark the symbol as undefined, rather than as defined in
> @@ -7195,21 +6714,6 @@ elf64_aarch64_finish_dynamic_symbol (bfd *output_bfd,
>    return TRUE;
>  }
>
> -/* Finish up local dynamic symbol handling.  We set the contents of
> -   various dynamic sections here.  */
> -
> -static bfd_boolean
> -elf_aarch64_finish_local_dynamic_symbol (void **slot, void *inf)
> -{
> -  struct elf_link_hash_entry *h
> -    = (struct elf_link_hash_entry *) *slot;
> -  struct bfd_link_info *info
> -    = (struct bfd_link_info *) inf;
> -
> -  return elf64_aarch64_finish_dynamic_symbol (info->output_bfd,
> -                                             info, h, NULL);
> -}
> -
>  static void
>  elf64_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
>                                      struct elf64_aarch64_link_hash_table
> @@ -7452,11 +6956,6 @@ elf64_aarch64_finish_dynamic_sections (bfd *output_bfd,
>      elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize
>        = GOT_ENTRY_SIZE;
>
> -  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
> -  htab_traverse (htab->loc_hash_table,
> -                elf_aarch64_finish_local_dynamic_symbol,
> -                info);
> -
>    return TRUE;
>  }
>
> @@ -7470,24 +6969,6 @@ elf64_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
>    return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
>  }
>
> -/* Hook called by the linker routine which adds symbols from an object
> -   file.  */
> -
> -static bfd_boolean
> -elf64_aarch64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
> -                              Elf_Internal_Sym *sym,
> -                              const char **namep ATTRIBUTE_UNUSED,
> -                              flagword *flagsp ATTRIBUTE_UNUSED,
> -                              asection **secp ATTRIBUTE_UNUSED,
> -                              bfd_vma *valp ATTRIBUTE_UNUSED)
> -{
> -  if ((abfd->flags & DYNAMIC) == 0
> -      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
> -         || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
> -    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
> -
> -  return TRUE;
> -}
>
>  /* We use this so we can override certain functions
>     (though currently we don't).  */
> @@ -7594,6 +7075,9 @@ const struct elf_size_info elf64_aarch64_size_info =
>  #define elf_backend_init_index_section         \
>    _bfd_elf_init_2_index_sections
>
> +#define elf_backend_is_function_type           \
> +  elf64_aarch64_is_function_type
> +
>  #define elf_backend_finish_dynamic_sections    \
>    elf64_aarch64_finish_dynamic_sections
>
> @@ -7633,9 +7117,6 @@ const struct elf_size_info elf64_aarch64_size_info =
>  #define elf_backend_size_info                  \
>    elf64_aarch64_size_info
>
> -#define elf_backend_add_symbol_hook            \
> -  elf64_aarch64_add_symbol_hook
> -
>  #define elf_backend_can_refcount       1
>  #define elf_backend_can_gc_sections    1
>  #define elf_backend_plt_readonly       1
> diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h
> index ebbdf8c..a7b86c1 100644
> --- a/include/elf/aarch64.h
> +++ b/include/elf/aarch64.h
> @@ -208,8 +208,7 @@ RELOC_NUMBER (R_AARCH64_TLS_DTPMOD64, 1028)
>  RELOC_NUMBER (R_AARCH64_TLS_DTPREL64, 1029)
>  RELOC_NUMBER (R_AARCH64_TLS_TPREL64, 1030)
>  RELOC_NUMBER (R_AARCH64_TLSDESC, 1031)
> -RELOC_NUMBER (R_AARCH64_IRELATIVE, 1032)
> -FAKE_RELOC (R_AARCH64_dyn_max, 1033)
> +FAKE_RELOC (R_AARCH64_dyn_max, 1032)
>
>  END_RELOC_NUMBERS (R_AARCH64_end)
>
> diff --git a/ld/emulparams/aarch64elf.sh b/ld/emulparams/aarch64elf.sh
> index 99f4844..53ccd6a 100644
> --- a/ld/emulparams/aarch64elf.sh
> +++ b/ld/emulparams/aarch64elf.sh
> @@ -18,8 +18,6 @@ MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
>  ENTRY=_start
>  EMBEDDED=yes
>  SEPARATE_GOTPLT=24
> -IREL_IN_PLT=
> -
>  TEXT_START_ADDR=0x00400000
>
>  DATA_START_SYMBOLS='__data_start = . ;';
> diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> index 5c150dd..d687cc2 100644
> --- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
> +++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
> @@ -114,44 +114,3 @@ run_dump_test "gc-tls-relocs"
>  run_dump_test "gc-plt-relocs"
>  run_dump_test "gc-relocs-257-dyn"
>  run_dump_test "gc-relocs-257"
> -
> -# ifunc tests
> -run_dump_test "ifunc-1"
> -run_dump_test "ifunc-1-local"
> -run_dump_test "ifunc-2"
> -run_dump_test "ifunc-2-local"
> -run_dump_test "ifunc-3a"
> -run_dump_test "ifunc-3b"
> -run_dump_test "ifunc-4"
> -run_dump_test "ifunc-4a"
> -run_dump_test "ifunc-5a"
> -run_dump_test "ifunc-5b"
> -run_dump_test "ifunc-5a-local"
> -run_dump_test "ifunc-5b-local"
> -run_dump_test "ifunc-5r-local"
> -run_dump_test "ifunc-6a"
> -run_dump_test "ifunc-6b"
> -run_dump_test "ifunc-7a"
> -run_dump_test "ifunc-7b"
> -run_dump_test "ifunc-7c"
> -run_dump_test "ifunc-8"
> -run_dump_test "ifunc-9"
> -run_dump_test "ifunc-10"
> -run_dump_test "ifunc-11"
> -run_dump_test "ifunc-12"
> -run_dump_test "ifunc-13"
> -run_dump_test "ifunc-14a"
> -run_dump_test "ifunc-14b"
> -run_dump_test "ifunc-14c"
> -run_dump_test "ifunc-14d"
> -run_dump_test "ifunc-14e"
> -run_dump_test "ifunc-14f"
> -run_dump_test "ifunc-15"
> -run_dump_test "ifunc-16"
> -run_dump_test "ifunc-17a"
> -run_dump_test "ifunc-17b"
> -run_dump_test "ifunc-18a"
> -run_dump_test "ifunc-18b"
> -run_dump_test "ifunc-19a"
> -run_dump_test "ifunc-19b"
> -run_dump_test "ifunc-20"
> diff --git a/ld/testsuite/ld-aarch64/ifunc-1-local.d b/ld/testsuite/ld-aarch64/ifunc-1-local.d
> deleted file mode 100644
> index a3054bd..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-1-local.d
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ld: -shared
> -#objdump: -dw
> -#target: aarch64*-*-*
> -
> -#...
> -[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-1-local.s b/ld/testsuite/ld-aarch64/ifunc-1-local.s
> deleted file mode 100644
> index 7b9d117..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-1-local.s
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .set __GI_foo, foo
> -       .text
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -.globl bar
> -       .type   bar, @function
> -bar:
> -       bl      __GI_foo
> -       ret
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-1.d b/ld/testsuite/ld-aarch64/ifunc-1.d
> deleted file mode 100644
> index a3054bd..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-1.d
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ld: -shared
> -#objdump: -dw
> -#target: aarch64*-*-*
> -
> -#...
> -[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-1.s b/ld/testsuite/ld-aarch64/ifunc-1.s
> deleted file mode 100644
> index 6f86c8a..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-1.s
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .global __GI_foo
> -       .hidden __GI_foo
> -       .set __GI_foo, foo
> -       .text
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -.globl bar
> -       .type   bar, @function
> -bar:
> -       bl      __GI_foo
> -       ret
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-10.d b/ld/testsuite/ld-aarch64/ifunc-10.d
> deleted file mode 100644
> index 782b078..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-10.d
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#ld: -e bar --gc-sections
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -There are no relocations in this file.
> diff --git a/ld/testsuite/ld-aarch64/ifunc-10.s b/ld/testsuite/ld-aarch64/ifunc-10.s
> deleted file mode 100644
> index 10468c1..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-10.s
> +++ /dev/null
> @@ -1,25 +0,0 @@
> -        .section .text.foo,"ax",@progbits
> -        .type foo, @function
> -foo:
> -        .global foo
> -        adrp    x0, :got:ifunc
> -        ldr     x0, [x0, #:got_lo12:ifunc]
> -       bl ifunc
> -        adrp    x0, xxx
> -        add     x0, x0, :lo12:xxx
> -        ret
> -
> -        .section .text.bar,"ax",@progbits
> -        .type bar, @function
> -bar:
> -        .global bar
> -        ret
> -
> -        .section .text.ifunc,"ax",@progbits
> -        .type ifunc, @gnu_indirect_function
> -ifunc:
> -        ret
> -
> -        .section .data.foo,"aw",@progbits
> -xxx:
> -       .quad ifunc
> diff --git a/ld/testsuite/ld-aarch64/ifunc-11.d b/ld/testsuite/ld-aarch64/ifunc-11.d
> deleted file mode 100644
> index 782b078..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-11.d
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#ld: -e bar --gc-sections
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -There are no relocations in this file.
> diff --git a/ld/testsuite/ld-aarch64/ifunc-11.s b/ld/testsuite/ld-aarch64/ifunc-11.s
> deleted file mode 100644
> index e1820de..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-11.s
> +++ /dev/null
> @@ -1,26 +0,0 @@
> -        .section .text.foo,"ax",@progbits
> -        .type foo, @function
> -foo:
> -        .global foo
> -        adrp    x0, :got:ifunc
> -        ldr     x0, [x0, #:got_lo12:ifunc]
> -       bl ifunc
> -        adrp    x0, xxx
> -        add     x0, x0, :lo12:xxx
> -        ret
> -
> -        .section .text.bar,"ax",@progbits
> -        .type bar, @function
> -bar:
> -        .global bar
> -        ret
> -
> -        .section .text.ifunc,"ax",@progbits
> -        .type ifunc, @gnu_indirect_function
> -        .global ifunc
> -ifunc:
> -        ret
> -
> -        .section .data.foo,"aw",@progbits
> -xxx:
> -       .quad ifunc
> diff --git a/ld/testsuite/ld-aarch64/ifunc-12.d b/ld/testsuite/ld-aarch64/ifunc-12.d
> deleted file mode 100644
> index 8fa8ce0..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-12.d
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -#ld: -shared -e bar --gc-sections
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -There are no relocations in this file.
> diff --git a/ld/testsuite/ld-aarch64/ifunc-12.s b/ld/testsuite/ld-aarch64/ifunc-12.s
> deleted file mode 100644
> index aad30df..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-12.s
> +++ /dev/null
> @@ -1,24 +0,0 @@
> -        .section .text.foo,"ax",@progbits
> -        .type foo, @function
> -foo:
> -        adrp    x0, :got:ifunc
> -        ldr     x0, [x0, #:got_lo12:ifunc]
> -       bl ifunc
> -        adrp    x0, xxx
> -        add     x0, x0, :lo12:xxx
> -        ret
> -
> -        .section .text.bar,"ax",@progbits
> -        .type bar, @function
> -bar:
> -        .global bar
> -        ret
> -
> -        .section .text.ifunc,"ax",@progbits
> -        .type ifunc, @gnu_indirect_function
> -ifunc:
> -        ret
> -
> -        .section .data.foo,"aw",@progbits
> -xxx:
> -       .quad ifunc
> diff --git a/ld/testsuite/ld-aarch64/ifunc-13.d b/ld/testsuite/ld-aarch64/ifunc-13.d
> deleted file mode 100644
> index e1b5c10..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-13.d
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#source: ifunc-13a.s
> -#source: ifunc-13b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ABS64[ ]+ifunc\(\)[ ]+ifunc \+ 0
> -
> -Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
> diff --git a/ld/testsuite/ld-aarch64/ifunc-13a.s b/ld/testsuite/ld-aarch64/ifunc-13a.s
> deleted file mode 100644
> index 873e06e..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-13a.s
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -       .text
> -        .type foo, @function
> -       .global foo
> -foo:
> -       adrp    x0, xxx
> -        add     x0, x0, :lo12:xxx
> -        ret
> -
> -       .data
> -xxx:
> -       .quad ifunc
> diff --git a/ld/testsuite/ld-aarch64/ifunc-13b.s b/ld/testsuite/ld-aarch64/ifunc-13b.s
> deleted file mode 100644
> index 3560394..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-13b.s
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -       .text
> -        .type ifunc, @gnu_indirect_function
> -       .globl ifunc
> -ifunc:
> -        ret
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14a.d b/ld/testsuite/ld-aarch64/ifunc-14a.d
> deleted file mode 100644
> index ff580d0..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14a.d
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#source: ifunc-14a.s
> -#source: ifunc-14b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -d
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.*\(TEXTREL\).*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14a.s b/ld/testsuite/ld-aarch64/ifunc-14a.s
> deleted file mode 100644
> index 7d6183c..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14a.s
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -       .text
> -       .globl bar
> -       .type   bar, @function
> -bar:
> -       bl      foo
> -       .size   bar, .-bar
> -       .hidden foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14b.d b/ld/testsuite/ld-aarch64/ifunc-14b.d
> deleted file mode 100644
> index 52ed2b4..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14b.d
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#source: ifunc-14b.s
> -#source: ifunc-14a.s
> -#ld: -shared -z nocombreloc
> -#readelf: -d
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.*\(TEXTREL\).*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14b.s b/ld/testsuite/ld-aarch64/ifunc-14b.s
> deleted file mode 100644
> index bac22eb..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14b.s
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .globl foo
> -foo:
> -       ret
> -       .size   foo, .-foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14c.d b/ld/testsuite/ld-aarch64/ifunc-14c.d
> deleted file mode 100644
> index a83126f..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14c.d
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#source: ifunc-14a.s
> -#source: ifunc-14b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.* +R_AARCH64_NONE +.*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14c.s b/ld/testsuite/ld-aarch64/ifunc-14c.s
> deleted file mode 100644
> index 7853280..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14c.s
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -       .text
> -       .globl xxx
> -       .type   xxx, @function
> -xxx:
> -       bl      foo
> -       .size   xxx, .-xxx
> -       .hidden foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14d.d b/ld/testsuite/ld-aarch64/ifunc-14d.d
> deleted file mode 100644
> index 4ae88d2..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14d.d
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#source: ifunc-14b.s
> -#source: ifunc-14a.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.* +R_AARCH64_NONE +.*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14e.d b/ld/testsuite/ld-aarch64/ifunc-14e.d
> deleted file mode 100644
> index 62de35e..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14e.d
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -#source: ifunc-14a.s
> -#source: ifunc-14c.s
> -#source: ifunc-14b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.* +R_AARCH64_NONE +.*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-14f.d b/ld/testsuite/ld-aarch64/ifunc-14f.d
> deleted file mode 100644
> index ab8bdbf..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-14f.d
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -#source: ifunc-14a.s
> -#source: ifunc-14b.s
> -#source: ifunc-14c.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#failif
> -#...
> -.* +R_AARCH64_NONE +.*
> -#...
> diff --git a/ld/testsuite/ld-aarch64/ifunc-15.d b/ld/testsuite/ld-aarch64/ifunc-15.d
> deleted file mode 100644
> index 51d9242..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-15.d
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#source: ifunc-15.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.got' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0
> -
> -Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
> diff --git a/ld/testsuite/ld-aarch64/ifunc-15.s b/ld/testsuite/ld-aarch64/ifunc-15.s
> deleted file mode 100644
> index f94b4a6..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-15.s
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -       .text
> -        .type foo, @function
> -       .global foo
> -foo:
> -       adrp    x0, :got:ifunc
> -        ldr     x0, [x0, #:got_lo12:ifunc]
> -        ret
> -        .type ifunc, @gnu_indirect_function
> -       .globl ifunc
> -ifunc:
> -        ret
> diff --git a/ld/testsuite/ld-aarch64/ifunc-16.d b/ld/testsuite/ld-aarch64/ifunc-16.d
> deleted file mode 100644
> index 31ec162..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-16.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#source: ifunc-16.s
> -#ld: -shared
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+0+[ ]+ifunc \+ 0
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-16.s b/ld/testsuite/ld-aarch64/ifunc-16.s
> deleted file mode 100644
> index ded401a..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-16.s
> +++ /dev/null
> @@ -1,17 +0,0 @@
> -       .text
> -       .globl  fct
> -       .type   fct, @gnu_indirect_function
> -       .set    fct,resolve
> -       .hidden int_fct
> -       .globl  int_fct
> -       .set    int_fct,fct
> -       .p2align 4,,15
> -       .type   resolve, @function
> -resolve:
> -       bl      ifunc
> -       .size   resolve, .-resolve
> -       .globl  g
> -       .type   g, @function
> -g:
> -       bl      int_fct
> -       .size   g, .-g
> diff --git a/ld/testsuite/ld-aarch64/ifunc-17a.d b/ld/testsuite/ld-aarch64/ifunc-17a.d
> deleted file mode 100644
> index a87de7c..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-17a.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#source: ifunc-17a.s
> -#source: ifunc-17b.s
> -#ld: -static
> -#readelf: -s --wide
> -#target: aarch64*-*-*
> -
> -#...
> - +[0-9]+: +[0-9a-f]+ +4 +OBJECT +GLOBAL +DEFAULT +[1-9] foo
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-17a.s b/ld/testsuite/ld-aarch64/ifunc-17a.s
> deleted file mode 100644
> index e0bde49..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-17a.s
> +++ /dev/null
> @@ -1,11 +0,0 @@
> -       .globl main
> -       .globl start
> -       .globl _start
> -       .globl __start
> -       .text
> -main:
> -start:
> -_start:
> -__start:
> -       .byte 0
> -       .common foo,4,4
> diff --git a/ld/testsuite/ld-aarch64/ifunc-17b.d b/ld/testsuite/ld-aarch64/ifunc-17b.d
> deleted file mode 100644
> index 9286a9f..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-17b.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#source: ifunc-17b.s
> -#source: ifunc-17a.s
> -#ld: -static
> -#readelf: -s --wide
> -#target: aarch64*-*-*
> -
> -#...
> - +[0-9]+: +[0-9a-f]+ +4 +OBJECT +GLOBAL +DEFAULT +[1-9] foo
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-17b.s b/ld/testsuite/ld-aarch64/ifunc-17b.s
> deleted file mode 100644
> index 66abe04..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-17b.s
> +++ /dev/null
> @@ -1,6 +0,0 @@
> -       .weak   foo
> -       .type foo, %gnu_indirect_function
> -       .size   foo,1
> -       .text
> -foo:
> -       .byte   1
> diff --git a/ld/testsuite/ld-aarch64/ifunc-18a.d b/ld/testsuite/ld-aarch64/ifunc-18a.d
> deleted file mode 100644
> index 3db91d3..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-18a.d
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -#source: ifunc-18a.s
> -#source: ifunc-18b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-18a.s b/ld/testsuite/ld-aarch64/ifunc-18a.s
> deleted file mode 100644
> index c29c121..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-18a.s
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -       .section .data.rel,"aw",@progbits
> -       .globl foo_ptrt
> -       .type   foo_ptr, @object
> -foo_ptr:
> -       .dc.a foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-18b.d b/ld/testsuite/ld-aarch64/ifunc-18b.d
> deleted file mode 100644
> index b27f526..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-18b.d
> +++ /dev/null
> @@ -1,14 +0,0 @@
> -#source: ifunc-18b.s
> -#source: ifunc-18a.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-18b.s b/ld/testsuite/ld-aarch64/ifunc-18b.s
> deleted file mode 100644
> index 2e46c1e..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-18b.s
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -       .hidden foo
> -       .globl foo
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .globl bar
> -bar:
> -       bl      foo1
> -       ret
> -       .size   bar, .-bar
> -       .hidden foo1
> -       .globl foo1
> -       foo1 = foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-19a.d b/ld/testsuite/ld-aarch64/ifunc-19a.d
> deleted file mode 100644
> index dd82b24..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-19a.d
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#source: ifunc-19a.s
> -#source: ifunc-19b.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-19a.s b/ld/testsuite/ld-aarch64/ifunc-19a.s
> deleted file mode 100644
> index 3a3d0cd..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-19a.s
> +++ /dev/null
> @@ -1,5 +0,0 @@
> -       .section .data.rel,"aw",@progbits
> -       .globl foo_ptrt
> -       .type   foo_ptr, @object
> -foo_ptr:
> -       .dc.a foo1
> diff --git a/ld/testsuite/ld-aarch64/ifunc-19b.d b/ld/testsuite/ld-aarch64/ifunc-19b.d
> deleted file mode 100644
> index 1e0819c..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-19b.d
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -#source: ifunc-19b.s
> -#source: ifunc-19a.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-19b.s b/ld/testsuite/ld-aarch64/ifunc-19b.s
> deleted file mode 100644
> index 2e46c1e..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-19b.s
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -       .hidden foo
> -       .globl foo
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .globl bar
> -bar:
> -       bl      foo1
> -       ret
> -       .size   bar, .-bar
> -       .hidden foo1
> -       .globl foo1
> -       foo1 = foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-2-local.d b/ld/testsuite/ld-aarch64/ifunc-2-local.d
> deleted file mode 100644
> index 0bdeb270..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-2-local.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#ld: -shared
> -#objdump: -dw
> -#target: aarch64*-*-*
> -
> -#...
> -[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
> -[ \t0-9a-f]+:[ \t0-9a-f]+adrp[ \t]+x0, 0 <_GLOBAL_OFFSET_TABLE_>
> -[ \t0-9a-f]+:[ \t0-9a-f]+add[ \t]+x0, x0, #0x[0-9a-f]+
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-2-local.s b/ld/testsuite/ld-aarch64/ifunc-2-local.s
> deleted file mode 100644
> index 632c31f..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-2-local.s
> +++ /dev/null
> @@ -1,15 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .set __GI_foo, foo
> -       .text
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -.globl bar
> -       .type   bar, @function
> -bar:
> -       bl      __GI_foo
> -        adrp    x0, __GI_foo
> -        add     x0, x0, :lo12:__GI_foo
> -       ret
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-2.d b/ld/testsuite/ld-aarch64/ifunc-2.d
> deleted file mode 100644
> index 0bdeb270..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-2.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#ld: -shared
> -#objdump: -dw
> -#target: aarch64*-*-*
> -
> -#...
> -[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
> -[ \t0-9a-f]+:[ \t0-9a-f]+adrp[ \t]+x0, 0 <_GLOBAL_OFFSET_TABLE_>
> -[ \t0-9a-f]+:[ \t0-9a-f]+add[ \t]+x0, x0, #0x[0-9a-f]+
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-2.s b/ld/testsuite/ld-aarch64/ifunc-2.s
> deleted file mode 100644
> index da350df..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-2.s
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .global __GI_foo
> -       .hidden __GI_foo
> -       .set __GI_foo, foo
> -       .text
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -.globl bar
> -       .type   bar, @function
> -bar:
> -       bl      __GI_foo
> -        adrp    x0, __GI_foo
> -        add     x0, x0, :lo12:__GI_foo
> -       ret
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-20.d b/ld/testsuite/ld-aarch64/ifunc-20.d
> deleted file mode 100644
> index 3380479..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-20.d
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#source: ifunc-20.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ABS64[ ]+ifunc\(\)[ ]+ifunc \+ 0
> -
> -Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
> diff --git a/ld/testsuite/ld-aarch64/ifunc-20.s b/ld/testsuite/ld-aarch64/ifunc-20.s
> deleted file mode 100644
> index 17393cb..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-20.s
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -       .section .data.rel,"aw",@progbits
> -       .globl ifunc_ptrt
> -       .type   ifunc_ptr, @object
> -ifunc_ptr:
> -       .dc.a ifunc
> -       .text
> -       .type ifunc, @gnu_indirect_function
> -       .globl ifunc
> -ifunc:
> -       ret
> -       .size   ifunc, .-ifunc
> -       .type bar, @function
> -       .globl bar
> -bar:
> -       bl      ifunc
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-3.s b/ld/testsuite/ld-aarch64/ifunc-3.s
> deleted file mode 100644
> index c68b1b7..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-3.s
> +++ /dev/null
> @@ -1,16 +0,0 @@
> -       .type foo, %gnu_indirect_function
> -       .global __GI_foo
> -       .protected __GI_foo
> -       .set __GI_foo, foo
> -       .text
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -.globl bar
> -       .type   bar, @function
> -bar:
> -       bl      __GI_foo
> -       ret
> -       .size   bar, .-bar
> diff --git a/ld/testsuite/ld-aarch64/ifunc-3a.d b/ld/testsuite/ld-aarch64/ifunc-3a.d
> deleted file mode 100644
> index e8cc8d3..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-3a.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-3.s
> -#ld: -shared
> -#objdump: -dw
> -#target: aarch64*-*-*
> -
> -#...
> -[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-3b.d b/ld/testsuite/ld-aarch64/ifunc-3b.d
> deleted file mode 100644
> index 7e177a6..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-3b.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-3.s
> -#ld: -shared
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#...
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-4.d b/ld/testsuite/ld-aarch64/ifunc-4.d
> deleted file mode 100644
> index 5e69b05..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-4.d
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -#...
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-4.s b/ld/testsuite/ld-aarch64/ifunc-4.s
> deleted file mode 100644
> index c2b66f5..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-4.s
> +++ /dev/null
> @@ -1,18 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -       bl      foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-4a.d b/ld/testsuite/ld-aarch64/ifunc-4a.d
> deleted file mode 100644
> index 801e6cd..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-4a.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#ld: -s
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -#source: ifunc-4.s
> -
> -#...
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
> -#pass
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5-local.s b/ld/testsuite/ld-aarch64/ifunc-5-local.s
> deleted file mode 100644
> index 8d23bab..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5-local.s
> +++ /dev/null
> @@ -1,19 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -       bl      foo
> -        adrp    x0, :got:foo
> -        ldr     x0, [x0, #:got_lo12:foo]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5.s b/ld/testsuite/ld-aarch64/ifunc-5.s
> deleted file mode 100644
> index b1bbf1a..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5.s
> +++ /dev/null
> @@ -1,20 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -       bl      foo
> -        adrp    x0, :got:foo
> -        ldr     x0, [x0, #:got_lo12:foo]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5a-local.d b/ld/testsuite/ld-aarch64/ifunc-5a-local.d
> deleted file mode 100644
> index 9693585..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5a-local.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-5-local.s
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5a.d b/ld/testsuite/ld-aarch64/ifunc-5a.d
> deleted file mode 100644
> index f0ee59f..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5a.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-5.s
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5b-local.d b/ld/testsuite/ld-aarch64/ifunc-5b-local.d
> deleted file mode 100644
> index e8e620c..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5b-local.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-5-local.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5b.d b/ld/testsuite/ld-aarch64/ifunc-5b.d
> deleted file mode 100644
> index 0175982..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5b.d
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#source: ifunc-5.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.got' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0
> -#...
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+foo\(\)[ ]+foo \+ 0
> diff --git a/ld/testsuite/ld-aarch64/ifunc-5r-local.d b/ld/testsuite/ld-aarch64/ifunc-5r-local.d
> deleted file mode 100644
> index 463cd25..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-5r-local.d
> +++ /dev/null
> @@ -1,10 +0,0 @@
> -#source: ifunc-5-local.s
> -#ld: -r
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.text' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_CALL26[ ]+foo\(\)[ ]+foo \+ 0
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ADR_GOT_PAGE[ ]+foo\(\)[ ]+foo \+ 0
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_LD64_GOT_LO1[ ]+foo\(\)[ ]+foo \+ 0
> diff --git a/ld/testsuite/ld-aarch64/ifunc-6.s b/ld/testsuite/ld-aarch64/ifunc-6.s
> deleted file mode 100644
> index 56486d6..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-6.s
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .protected foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -       bl      foo
> -        adrp    x0, :got:foo
> -        ldr     x0, [x0, #:got_lo12:foo]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-6a.d b/ld/testsuite/ld-aarch64/ifunc-6a.d
> deleted file mode 100644
> index a50ad3a..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-6a.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-6.s
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-6b.d b/ld/testsuite/ld-aarch64/ifunc-6b.d
> deleted file mode 100644
> index c415bc3..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-6b.d
> +++ /dev/null
> @@ -1,12 +0,0 @@
> -#source: ifunc-6.s
> -#ld: -shared -z nocombreloc
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.got' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0
> -#...
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-7.s b/ld/testsuite/ld-aarch64/ifunc-7.s
> deleted file mode 100644
> index 51485af..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-7.s
> +++ /dev/null
> @@ -1,21 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .hidden foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -       bl      foo
> -        adrp    x0, :got:foo
> -        ldr     x0, [x0, #:got_lo12:foo]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-7a.d b/ld/testsuite/ld-aarch64/ifunc-7a.d
> deleted file mode 100644
> index c246c99..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-7a.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-7.s
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-7b.d b/ld/testsuite/ld-aarch64/ifunc-7b.d
> deleted file mode 100644
> index efdd379..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-7b.d
> +++ /dev/null
> @@ -1,8 +0,0 @@
> -#source: ifunc-7.s
> -#ld: -shared
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-7c.d b/ld/testsuite/ld-aarch64/ifunc-7c.d
> deleted file mode 100644
> index 1967742..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-7c.d
> +++ /dev/null
> @@ -1,19 +0,0 @@
> -#source: ifunc-7.s
> -#ld: -shared
> -#objdump: -dr -j .text
> -#target: aarch64*-*-*
> -
> -# Check if adrp and ldr have been relocated correctly.
> -
> -.*:     file format elf.+aarch64.*
> -
> -
> -Disassembly of section \.text:
> -
> -[0-9a-f]+ <foo>:
> - [0-9a-f]+:    d65f03c0        ret
> -
> -[0-9a-f]+ <__start>:
> - [0-9a-f]+:    [0-9a-f]+       bl      [0-9a-f]+ <\*ABS\*\+0x[0-9a-f]+@plt>
> - [0-9a-f]+:    [0-9a-f]+       adrp    x0, [0-9]+ <__start\+0x[0-9a-f]+>
> - [0-9a-f]+:    [0-9a-f]+       ldr     x0, \[x0,.+\]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-8.d b/ld/testsuite/ld-aarch64/ifunc-8.d
> deleted file mode 100644
> index 8aadc51..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-8.d
> +++ /dev/null
> @@ -1,9 +0,0 @@
> -#source: ifunc-8a.s
> -#source: ifunc-8b.s
> -#ld:
> -#readelf: -r --wide
> -#target: aarch64*-*-*
> -
> -Relocation section '.rela.plt' at .*
> -[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
> -[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-8a.s b/ld/testsuite/ld-aarch64/ifunc-8a.s
> deleted file mode 100644
> index 94c073a..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-8a.s
> +++ /dev/null
> @@ -1,13 +0,0 @@
> -       .text
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -        adrp    x0, :got:foo
> -        ldr     x0, [x0, #:got_lo12:foo]
> diff --git a/ld/testsuite/ld-aarch64/ifunc-8b.s b/ld/testsuite/ld-aarch64/ifunc-8b.s
> deleted file mode 100644
> index 1f108f8..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-8b.s
> +++ /dev/null
> @@ -1,7 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> diff --git a/ld/testsuite/ld-aarch64/ifunc-9.d b/ld/testsuite/ld-aarch64/ifunc-9.d
> deleted file mode 100644
> index 3b4e995..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-9.d
> +++ /dev/null
> @@ -1,3 +0,0 @@
> -#ld: --export-dynamic
> -#error: .*dynamic STT_GNU_IFUNC symbol `foo' with pointer equality in `.*.o' can not be used when making an executable; recompile with -fPIE and relink with -pie
> -#target: aarch64*-*-*
> diff --git a/ld/testsuite/ld-aarch64/ifunc-9.s b/ld/testsuite/ld-aarch64/ifunc-9.s
> deleted file mode 100644
> index 2e2f577..0000000
> --- a/ld/testsuite/ld-aarch64/ifunc-9.s
> +++ /dev/null
> @@ -1,23 +0,0 @@
> -       .text
> -       .type foo, %gnu_indirect_function
> -.globl foo
> -       .type   foo, @function
> -foo:
> -       ret
> -       .size   foo, .-foo
> -       .type start,"function"
> -       .global start
> -start:
> -       .type _start,"function"
> -       .global _start
> -_start:
> -       .type __start,"function"
> -       .global __start
> -__start:
> -       .type __start,"function"
> -        adrp    x0, .LANCHOR0
> -        add     x0, x0, :lo12:.LANCHOR0
> -        .data
> -        .align  3
> -.LANCHOR0 = . + 0
> -        .xword  foo
> diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
> index 1d64efc..df913d8 100644
> --- a/ld/testsuite/ld-ifunc/ifunc.exp
> +++ b/ld/testsuite/ld-ifunc/ifunc.exp
> @@ -24,11 +24,10 @@
>
>
>  # IFUNC support has only been implemented for the ix86, x86_64, powerpc,
> -# aarch64 and sparc so far.
> +# and sparc so far.
>  if {!(([istarget "i?86-*-*"]
>         || [istarget "x86_64-*-*"]
>         || [istarget "powerpc*-*-*"]
> -       || [istarget "aarch64*-*-*"]
>         || [istarget "sparc*-*-*"])
>        && ([istarget "*-*-elf*"]
>           || [istarget "*-*-nacl*"]
> --
> 1.8.1.4
>
Alan Modra June 24, 2013, 12:32 a.m. | #2
On Wed, Jun 19, 2013 at 10:56:03AM +0100, Marcus Shawcroft wrote:
> Will,  This is OK.  Thanks Marcus

Please don't quote a 2500 line email message when making a one line
reply.  Quoting an entire email might be appropriate for normal
private email, but this is a mailing list!  Replies ought to be
trimmed.  If people need the full context they can get it from the
list.

Patch

diff --git a/bfd/configure.in b/bfd/configure.in
index 89f68fd..ff14270 100644
--- a/bfd/configure.in
+++ b/bfd/configure.in
@@ -859,7 +859,7 @@  do
     bfd_elf32_xtensa_be_vec)	tb="$tb xtensa-isa.lo xtensa-modules.lo elf32-xtensa.lo elf32.lo $elf" ;;
     bfd_elf64_alpha_freebsd_vec) tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_alpha_vec)	tb="$tb elf64-alpha.lo elf64.lo $elf"; target_size=64 ;;
-    bfd_elf64_bigaarch64_vec)	tb="$tb elf64-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+    bfd_elf64_bigaarch64_vec)	tb="$tb elf64-aarch64.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_big_generic_vec) 	tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_bigmips_vec) 	tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
     bfd_elf64_hppa_linux_vec)	tb="$tb elf64-hppa.lo elf64.lo $elf"; target_size=64 ;;
@@ -868,7 +868,7 @@  do
     bfd_elf64_ia64_hpux_big_vec) tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_ia64_little_vec)	tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_ia64_vms_vec)	tb="$tb elf64-ia64-vms.lo elf64-ia64.lo elfxx-ia64.lo elf64.lo vms-lib.lo vms-misc.lo $elf"; target_size=64 ;;
-    bfd_elf64_littleaarch64_vec)tb="$tb elf64-aarch64.lo elf-ifunc.lo elf64.lo $elf"; target_size=64 ;;
+    bfd_elf64_littleaarch64_vec)tb="$tb elf64-aarch64.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_little_generic_vec) tb="$tb elf64-gen.lo elf64.lo $elf"; target_size=64 ;;
     bfd_elf64_littlemips_vec) 	tb="$tb elf64-mips.lo elf64.lo elfxx-mips.lo elf-vxworks.lo elf32.lo $elf ecofflink.lo"; target_size=64 ;;
     bfd_elf64_mmix_vec) 	tb="$tb elf64-mmix.lo elf64.lo $elf" target_size=64 ;;
diff --git a/bfd/elf64-aarch64.c b/bfd/elf64-aarch64.c
index d6ecbb4..68f03fc 100644
--- a/bfd/elf64-aarch64.c
+++ b/bfd/elf64-aarch64.c
@@ -142,7 +142,6 @@ 
 #include "bfd_stdint.h"
 #include "elf-bfd.h"
 #include "bfdlink.h"
-#include "objalloc.h"
 #include "elf/aarch64.h"

 static bfd_reloc_status_type
@@ -399,20 +398,6 @@  static reloc_howto_type elf64_aarch64_howto_dynrelocs[] =
 	 ALL_ONES,		/* dst_mask */
 	 FALSE),		/* pcrel_offset */

-  HOWTO (R_AARCH64_IRELATIVE,	/* type */
-	 0,			/* rightshift */
-	 2,			/* size (0 = byte, 1 = short, 2 = long) */
-	 64,			/* bitsize */
-	 FALSE,			/* pc_relative */
-	 0,			/* bitpos */
-	 complain_overflow_bitfield,	/* complain_on_overflow */
-	 bfd_elf_generic_reloc,	/* special_function */
-	 "R_AARCH64_IRELATIVE",	/* name */
-	 FALSE,			/* partial_inplace */
-	 0,			/* src_mask */
-	 ALL_ONES,		/* dst_mask */
-	 FALSE),		/* pcrel_offset */
-
 };

 /* Note: code such as elf64_aarch64_reloc_type_lookup expect to use e.g.
@@ -1879,15 +1864,6 @@  struct elf64_aarch64_link_hash_table
      loader via DT_TLSDESC_GOT.  The magic value (bfd_vma) -1
      indicates an offset is not allocated.  */
   bfd_vma dt_tlsdesc_got;
-
-  /* Used by local STT_GNU_IFUNC symbols.  */
-  htab_t loc_hash_table;
-  void * loc_hash_memory;
-
-  /* The index of the next R_AARCH64_JUMP_SLOT entry in .rela.plt.  */
-  bfd_vma next_jump_slot_index;
-  /* The index of the next R_AARCH64_IRELATIVE entry in .rela.plt.  */
-  bfd_vma next_irelative_index;
 };


@@ -1997,72 +1973,6 @@  stub_hash_newfunc (struct bfd_hash_entry *entry,
   return entry;
 }

-/* Compute a hash of a local hash entry.  We use elf_link_hash_entry
-  for local symbol so that we can handle local STT_GNU_IFUNC symbols
-  as global symbol.  We reuse indx and dynstr_index for local symbol
-  hash since they aren't used by global symbols in this backend.  */
-
-static hashval_t
-elf_aarch64_local_htab_hash (const void *ptr)
-{
-  struct elf_link_hash_entry *h
-    = (struct elf_link_hash_entry *) ptr;
-  return ELF_LOCAL_SYMBOL_HASH (h->indx, h->dynstr_index);
-}
-
-/* Compare local hash entries.  */
-
-static int
-elf_aarch64_local_htab_eq (const void *ptr1, const void *ptr2)
-{
-  struct elf_link_hash_entry *h1
-     = (struct elf_link_hash_entry *) ptr1;
-  struct elf_link_hash_entry *h2
-    = (struct elf_link_hash_entry *) ptr2;
-
-  return h1->indx == h2->indx && h1->dynstr_index == h2->dynstr_index;
-}
-
-/* Find and/or create a hash entry for local symbol.  */
-
-static struct elf_link_hash_entry *
-elf_aarch64_get_local_sym_hash (struct elf64_aarch64_link_hash_table *htab,
-				bfd *abfd, const Elf_Internal_Rela *rel,
-				bfd_boolean create)
-{
-  struct elf64_aarch64_link_hash_entry e, *ret;
-  asection *sec = abfd->sections;
-  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
-				       ELF64_R_SYM (rel->r_info));
-  void **slot;
-
-  e.root.indx = sec->id;
-  e.root.dynstr_index = ELF64_R_SYM (rel->r_info);
-  slot = htab_find_slot_with_hash (htab->loc_hash_table, &e, h,
-				   create ? INSERT : NO_INSERT);
-
-  if (!slot)
-    return NULL;
-
-  if (*slot)
-    {
-      ret = (struct elf64_aarch64_link_hash_entry *) *slot;
-      return &ret->root;
-    }
-
-  ret = (struct elf64_aarch64_link_hash_entry *)
-	objalloc_alloc ((struct objalloc *) htab->loc_hash_memory,
-			sizeof (struct elf64_aarch64_link_hash_entry));
-  if (ret)
-    {
-      memset (ret, 0, sizeof (*ret));
-      ret->root.indx = sec->id;
-      ret->root.dynstr_index = ELF64_R_SYM (rel->r_info);
-      ret->root.dynindx = -1;
-      *slot = ret;
-    }
-  return &ret->root;
-}

 /* Copy the extra info we tack onto an elf_link_hash_entry.  */

@@ -2152,17 +2062,6 @@  elf64_aarch64_link_hash_table_create (bfd *abfd)
       return NULL;
     }

-  ret->loc_hash_table = htab_try_create (1024,
-					 elf_aarch64_local_htab_hash,
-					 elf_aarch64_local_htab_eq,
-					 NULL);
-  ret->loc_hash_memory = objalloc_create ();
-  if (!ret->loc_hash_table || !ret->loc_hash_memory)
-    {
-      free (ret);
-      return NULL;
-    }
-
   return &ret->root.root;
 }

@@ -2174,11 +2073,6 @@  elf64_aarch64_hash_table_free (struct bfd_link_hash_table *hash)
   struct elf64_aarch64_link_hash_table *ret
     = (struct elf64_aarch64_link_hash_table *) hash;

-  if (ret->loc_hash_table)
-    htab_delete (ret->loc_hash_table);
-  if (ret->loc_hash_memory)
-    objalloc_free ((struct objalloc *) ret->loc_hash_memory);
-
   bfd_hash_table_free (&ret->stub_hash_table);
   _bfd_elf_link_hash_table_free (hash);
 }
@@ -3876,10 +3770,8 @@  elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
 				   struct elf_link_hash_entry *h,
 				   bfd_boolean *unresolved_reloc_p,
 				   bfd_boolean save_addend,
-				   bfd_vma *saved_addend,
-				   Elf_Internal_Sym *sym)
+				   bfd_vma *saved_addend)
 {
-  Elf_Internal_Shdr *symtab_hdr;
   unsigned int r_type = howto->type;
   unsigned long r_symndx;
   bfd_byte *hit_data = contents + rel->r_offset;
@@ -3890,8 +3782,6 @@  elf64_aarch64_final_link_relocate (reloc_howto_type *howto,

   globals = elf64_aarch64_hash_table (info);

-  symtab_hdr = &elf_symtab_hdr (input_bfd);
-
   BFD_ASSERT (is_aarch64_elf (input_bfd));

   r_symndx = ELF64_R_SYM (rel->r_info);
@@ -3913,184 +3803,6 @@  elf64_aarch64_final_link_relocate (reloc_howto_type *howto,

   weak_undef_p = (h ? h->root.type == bfd_link_hash_undefweak
 		  : bfd_is_und_section (sym_sec));
-
-  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle
-     it here if it is defined in a non-shared object.  */
-  if (h != NULL
-      && h->type == STT_GNU_IFUNC
-      && h->def_regular)
-    {
-      asection *plt;
-      const char *name;
-      asection *base_got;
-      bfd_vma off;
-
-      if ((input_section->flags & SEC_ALLOC) == 0
-	  || h->plt.offset == (bfd_vma) -1)
-	abort ();
-
-      /* STT_GNU_IFUNC symbol must go through PLT.  */
-      plt = globals->root.splt ? globals->root.splt : globals->root.iplt;
-      value = (plt->output_section->vma + plt->output_offset + h->plt.offset);
-
-      switch (r_type)
-	{
-	default:
-	  if (h->root.root.string)
-	    name = h->root.root.string;
-	  else
-	    name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				     NULL);
-	  (*_bfd_error_handler)
-	    (_("%B: relocation %s against STT_GNU_IFUNC "
-	       "symbol `%s' isn't handled by %s"), input_bfd,
-	     howto->name, name, __FUNCTION__);
-	  bfd_set_error (bfd_error_bad_value);
-	  return FALSE;
-
-	case R_AARCH64_ABS64:
-	  if (rel->r_addend != 0)
-	    {
-	      if (h->root.root.string)
-		name = h->root.root.string;
-	      else
-		name = bfd_elf_sym_name (input_bfd, symtab_hdr,
-					 sym, NULL);
-	      (*_bfd_error_handler)
-		(_("%B: relocation %s against STT_GNU_IFUNC "
-		   "symbol `%s' has non-zero addend: %d"),
-		 input_bfd, howto->name, name, rel->r_addend);
-	      bfd_set_error (bfd_error_bad_value);
-	      return FALSE;
-	    }
-
-	  /* Generate dynamic relocation only when there is a
-	     non-GOT reference in a shared object.  */
-	  if (info->shared && h->non_got_ref)
-	    {
-	      Elf_Internal_Rela outrel;
-	      asection *sreloc;
-
-	      /* Need a dynamic relocation to get the real function
-		 address.  */
-	      outrel.r_offset = _bfd_elf_section_offset (output_bfd,
-							 info,
-							 input_section,
-							 rel->r_offset);
-	      if (outrel.r_offset == (bfd_vma) -1
-		  || outrel.r_offset == (bfd_vma) -2)
-		abort ();
-
-	      outrel.r_offset += (input_section->output_section->vma
-				  + input_section->output_offset);
-
-	      if (h->dynindx == -1
-		  || h->forced_local
-		  || info->executable)
-		{
-		  /* This symbol is resolved locally.  */
-		  outrel.r_info = ELF64_R_INFO (0, R_AARCH64_IRELATIVE);
-		  outrel.r_addend = (h->root.u.def.value
-				     + h->root.u.def.section->output_section->vma
-				     + h->root.u.def.section->output_offset);
-		}
-	      else
-		{
-		  outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
-		  outrel.r_addend = 0;
-		}
-
-	      sreloc = globals->root.irelifunc;
-	      elf_append_rela (output_bfd, sreloc, &outrel);
-
-	      /* If this reloc is against an external symbol, we
-		 do not want to fiddle with the addend.  Otherwise,
-		 we need to include the symbol value so that it
-		 becomes an addend for the dynamic reloc.  For an
-		 internal symbol, we have updated addend.  */
-	      return bfd_reloc_ok;
-	    }
-	  return _bfd_final_link_relocate (howto, input_bfd, input_section,
-					   contents, rel->r_offset, value,
-					   signed_addend);
-
-	case R_AARCH64_JUMP26:
-	case R_AARCH64_CALL26:
-	  value = aarch64_resolve_relocation (r_type, place, value,
-					      signed_addend, weak_undef_p);
-	  return bfd_elf_aarch64_put_addend (input_bfd, hit_data, howto, value);
-
-	case R_AARCH64_LD64_GOT_LO12_NC:
-	case R_AARCH64_ADR_GOT_PAGE:
-	case R_AARCH64_GOT_LD_PREL19:
-	  base_got = globals->root.sgot;
-	  off = h->got.offset;
-
-	  if (base_got == NULL)
-	    abort ();
-
-	  if (off == (bfd_vma) -1)
-	    {
-	      bfd_vma plt_index;
-
-	      /* We can't use h->got.offset here to save state, or
-		 even just remember the offset, as finish_dynamic_symbol
-		 would use that as offset into .got.  */
-
-	      if (globals->root.splt != NULL)
-		{
-		  plt_index = h->plt.offset / globals->plt_entry_size - 1;
-		  off = (plt_index + 3) * GOT_ENTRY_SIZE;
-		  base_got = globals->root.sgotplt;
-		}
-	      else
-		{
-		  plt_index = h->plt.offset / globals->plt_entry_size;
-		  off = plt_index * GOT_ENTRY_SIZE;
-		  base_got = globals->root.igotplt;
-		}
-
-	      if (h->dynindx == -1
-		  || h->forced_local
-		  || info->symbolic)
-		{
-		  /* This references the local defitionion.  We must
-		     initialize this entry in the global offset table.
-		     Since the offset must always be a multiple of 8,
-		     we use the least significant bit to record
-		     whether we have initialized it already.
-
-		     When doing a dynamic link, we create a .rela.got
-		     relocation entry to initialize the value.  This
-		     is done in the finish_dynamic_symbol routine.	 */
-		  if ((off & 1) != 0)
-		    off &= ~1;
-		  else
-		    {
-		      bfd_put_64 (output_bfd, value,
-				  base_got->contents + off);
-		      /* Note that this is harmless for the GOTPLT64
-			 case, as -1 | 1 still is -1.  */
-		      h->got.offset |= 1;
-		    }
-		}
-	      value = (base_got->output_section->vma
-		       + base_got->output_offset + off);
-	    }
-	  else
-	    value = aarch64_calculate_got_entry_vma (h, globals, info,
-						     value, output_bfd,
-						     unresolved_reloc_p);
-	  value = aarch64_resolve_relocation (r_type, place, value,
-					      0, weak_undef_p);
-	  return bfd_elf_aarch64_put_addend (input_bfd, hit_data, howto, value);
-
-	case R_AARCH64_ADR_PREL_PG_HI21:
-	case R_AARCH64_ADD_ABS_LO12_NC:
-	  break;
-	}
-    }
-
   switch (r_type)
     {
     case R_AARCH64_NONE:
@@ -4117,6 +3829,11 @@  elf64_aarch64_final_link_relocate (reloc_howto_type *howto,

 	  *unresolved_reloc_p = FALSE;

+	  sreloc = _bfd_elf_get_dynamic_reloc_section (input_bfd,
+						       input_section, 1);
+	  if (sreloc == NULL)
+	    return bfd_reloc_notsupported;
+
 	  skip = FALSE;
 	  relocate = FALSE;

@@ -4153,14 +3870,10 @@  elf64_aarch64_final_link_relocate (reloc_howto_type *howto,
 	      outrel.r_addend += value;
 	    }

-	  sreloc = elf_section_data (input_section)->sreloc;
-	  if (sreloc == NULL || sreloc->contents == NULL)
-	    return bfd_reloc_notsupported;
-
-	  loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (globals);
+	  loc = sreloc->contents + sreloc->reloc_count++ * RELOC_SIZE (htab);
 	  bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);

-	  if (sreloc->reloc_count * RELOC_SIZE (globals) > sreloc->size)
+	  if (sreloc->reloc_count * RELOC_SIZE (htab) > sreloc->size)
 	    {
 	      /* Sanity to check that we have previously allocated
 		 sufficient space in the relocation section for the
@@ -4571,20 +4284,6 @@  elf64_aarch64_relocate_section (bfd *output_bfd,
 	    }

 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
-
-	  /* Relocate against local STT_GNU_IFUNC symbol.  */
-	  if (!info->relocatable
-	      && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
-	    {
-	      h = elf_aarch64_get_local_sym_hash (globals, input_bfd,
-						  rel, FALSE);
-	      if (h == NULL)
-		abort ();
-
-	      /* Set STT_GNU_IFUNC symbol value.  */
-	      h->root.u.def.value = sym->st_value;
-	      h->root.u.def.section = sec;
-	    }
 	}
       else
 	{
@@ -4674,7 +4373,7 @@  elf64_aarch64_relocate_section (bfd *output_bfd,
 					       input_section, contents, rel,
 					       relocation, info, sec,
 					       h, &unresolved_reloc,
-					       save_addend, &addend, sym);
+					       save_addend, &addend);

       switch (r_type)
 	{
@@ -5151,46 +4850,38 @@  elf64_aarch64_gc_sweep_hook (bfd *abfd,
       struct elf_link_hash_entry *h = NULL;

       r_symndx = ELF64_R_SYM (rel->r_info);
+
       if (r_symndx >= symtab_hdr->sh_info)
 	{
+	  struct elf64_aarch64_link_hash_entry *eh;
+	  struct elf_dyn_relocs **pp;
+	  struct elf_dyn_relocs *p;
+
 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
 	  while (h->root.type == bfd_link_hash_indirect
 		 || h->root.type == bfd_link_hash_warning)
 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
+	  eh = (struct elf64_aarch64_link_hash_entry *) h;
+
+	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
+	    {
+	      if (p->sec == sec)
+		{
+		  /* Everything must go for SEC.  */
+		  *pp = p->next;
+		  break;
+		}
+	    }
         }
       else
 	{
-	  /* A local symbol.  */
 	  Elf_Internal_Sym *isym;

+	  /* A local symbol.  */
 	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
 					abfd, r_symndx);
-
-	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
-	  if (isym != NULL
-	      && ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
-	    {
-	      h = elf_aarch64_get_local_sym_hash (htab, abfd, rel, FALSE);
-	      if (h == NULL)
-		abort ();
-	    }
-	}
-
-      if (h)
-	{
-	  struct elf64_aarch64_link_hash_entry *eh;
-	  struct elf_dyn_relocs **pp;
-	  struct elf_dyn_relocs *p;
-
-	  eh = (struct elf64_aarch64_link_hash_entry *) h;
-
-	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
-	    if (p->sec == sec)
-	      {
-		/* Everything must go for SEC.  */
-		*pp = p->next;
-		break;
-	      }
+	  if (isym == NULL)
+	    return FALSE;
 	}

       r_type = ELF64_R_TYPE (rel->r_info);
@@ -5219,12 +4910,6 @@  elf64_aarch64_gc_sweep_hook (bfd *abfd,
 	    {
 	      if (h->got.refcount > 0)
 		h->got.refcount -= 1;
-
-	      if (h->type == STT_GNU_IFUNC)
-		{
-		  if (h->plt.refcount > 0)
-		    h->plt.refcount -= 1;
-		}
 	    }
 	  else if (locals != NULL)
 	    {
@@ -5255,7 +4940,7 @@  elf64_aarch64_gc_sweep_hook (bfd *abfd,
 	  break;

 	case R_AARCH64_ABS64:
-	  if (h != NULL)
+	  if (h != NULL && info->executable)
 	    {
 	      if (h->plt.refcount > 0)
 		h->plt.refcount -= 1;
@@ -5286,13 +4971,12 @@  elf64_aarch64_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_GNU_IFUNC || h->needs_plt)
+  if (h->type == STT_FUNC || h->needs_plt)
     {
       if (h->plt.refcount <= 0
-	  || (h->type != STT_GNU_IFUNC
-	      && (SYMBOL_CALLS_LOCAL (info, h)
-		  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
-		      && h->root.type == bfd_link_hash_undefweak))))
+	  || SYMBOL_CALLS_LOCAL (info, h)
+	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
+	      && h->root.type == bfd_link_hash_undefweak))
 	{
 	  /* This case can occur if we saw a CALL26 reloc in
 	     an input file, but the symbol wasn't referred to
@@ -5421,7 +5105,6 @@  elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
       struct elf_link_hash_entry *h;
       unsigned long r_symndx;
       unsigned int r_type;
-      Elf_Internal_Sym *isym;

       r_symndx = ELF64_R_SYM (rel->r_info);
       r_type = ELF64_R_TYPE (rel->r_info);
@@ -5434,31 +5117,7 @@  elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 	}

       if (r_symndx < symtab_hdr->sh_info)
-	{
-	  /* A local symbol.  */
-	  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
-					abfd, r_symndx);
-	  if (isym == NULL)
-	    return FALSE;
-
-	  /* Check relocation against local STT_GNU_IFUNC symbol.  */
-	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
-	    {
-	      h = elf_aarch64_get_local_sym_hash (htab, abfd, rel,
-						  TRUE);
-	      if (h == NULL)
-		return FALSE;
-
-	      /* Fake a STT_GNU_IFUNC symbol.  */
-	      h->type = STT_GNU_IFUNC;
-	      h->def_regular = 1;
-	      h->ref_regular = 1;
-	      h->forced_local = 1;
-	      h->root.type = bfd_link_hash_defined;
-	    }
-	  else
-	    h = NULL;
-	}
+	h = NULL;
       else
 	{
 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
@@ -5471,37 +5130,6 @@  elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 	  h->root.non_ir_ref = 1;
 	}

-      if (h != NULL)
-	{
-	  /* Create the ifunc sections for static executables.  If we
-	     never see an indirect function symbol nor we are building
-	     a static executable, those sections will be empty and
-	     won't appear in output.  */
-	  switch (r_type)
-	    {
-	    default:
-	      break;
-
-	    case R_AARCH64_ABS64:
-	    case R_AARCH64_CALL26:
-	    case R_AARCH64_JUMP26:
-	    case R_AARCH64_LD64_GOT_LO12_NC:
-	    case R_AARCH64_ADR_GOT_PAGE:
-	    case R_AARCH64_GOT_LD_PREL19:
-	    case R_AARCH64_ADR_PREL_PG_HI21:
-	    case R_AARCH64_ADD_ABS_LO12_NC:
-	      if (htab->root.dynobj == NULL)
-		htab->root.dynobj = abfd;
-	      if (!_bfd_elf_create_ifunc_sections (htab->root.dynobj, info))
-		return FALSE;
-	      break;
-	    }
-
-	  /* It is referenced by a non-shared object. */
-	  h->ref_regular = 1;
-	  h->root.non_ir_ref = 1;
-	}
-
       /* Could be done earlier, if h were already available.  */
       r_type = aarch64_tls_transition (abfd, info, r_type, h, r_symndx);

@@ -5563,6 +5191,7 @@  elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,

 		asection *s;
 		void **vpp;
+		Elf_Internal_Sym *isym;

 		isym = bfd_sym_from_r_symndx (&htab->sym_cache,
 					      abfd, r_symndx);
@@ -5712,10 +5341,7 @@  elf64_aarch64_check_relocs (bfd *abfd, struct bfd_link_info *info,
 	    continue;

 	  h->needs_plt = 1;
-	  if (h->plt.refcount <= 0)
-	    h->plt.refcount = 1;
-	  else
-	    h->plt.refcount += 1;
+	  h->plt.refcount += 1;
 	  break;
 	}
     }
@@ -5859,14 +5485,14 @@  elf64_aarch64_find_inliner_info (bfd *abfd,

 static void
 elf64_aarch64_post_process_headers (bfd *abfd,
-				    struct bfd_link_info *link_info)
+				    struct bfd_link_info *link_info
+				    ATTRIBUTE_UNUSED)
 {
   Elf_Internal_Ehdr *i_ehdrp;	/* ELF file header, internal form.  */

   i_ehdrp = elf_elfheader (abfd);
+  i_ehdrp->e_ident[EI_OSABI] = 0;
   i_ehdrp->e_ident[EI_ABIVERSION] = AARCH64_ELF_ABI_VERSION;
-
-  _bfd_elf_set_osabi (abfd, link_info);
 }

 static enum elf_reloc_type_class
@@ -6258,6 +5884,12 @@  elf64_aarch64_bfd_free_cached_info (bfd *abfd)
   return _bfd_free_cached_info (abfd);
 }

+static bfd_boolean
+elf64_aarch64_is_function_type (unsigned int type)
+{
+  return type == STT_FUNC;
+}
+
 /* Create dynamic sections. This is different from the ARM backend in that
    the got, plt, gotplt and their relocation sections are all created in the
    standard part of the bfd elf backend.  */
@@ -6324,18 +5956,7 @@  elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
   info = (struct bfd_link_info *) inf;
   htab = elf64_aarch64_hash_table (info);

-  eh = (struct elf64_aarch64_link_hash_entry *) h;
-
-  /* Since STT_GNU_IFUNC symbol must go through PLT, we handle it
-     here if it is defined and referenced in a non-shared object.  */
-  if (h->type == STT_GNU_IFUNC
-      && h->def_regular)
-    return _bfd_elf_allocate_ifunc_dyn_relocs (info, h,
-					       &eh->dyn_relocs,
-					       htab->plt_entry_size,
-					       htab->plt_header_size,
-					       GOT_ENTRY_SIZE);
-  else if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
+  if (htab->root.dynamic_sections_created && h->plt.refcount > 0)
     {
       /* Make sure this symbol is output as a dynamic symbol.
          Undefined weak syms won't yet be marked as dynamic.  */
@@ -6406,6 +6027,7 @@  elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
       h->needs_plt = 0;
     }

+  eh = (struct elf64_aarch64_link_hash_entry *) h;
   eh->tlsdesc_got_jump_table_offset = (bfd_vma) - 1;

   if (h->got.refcount > 0)
@@ -6590,24 +6212,6 @@  elf64_aarch64_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
 }


-/* Allocate space in .plt, .got and associated reloc sections for
-   local dynamic relocs.  */
-
-static bfd_boolean
-elf_aarch64_allocate_local_dynrelocs (void **slot, void *inf)
-{
-  struct elf_link_hash_entry *h
-    = (struct elf_link_hash_entry *) *slot;
-
-  if (h->type != STT_GNU_IFUNC
-      || !h->def_regular
-      || !h->ref_regular
-      || !h->forced_local
-      || h->root.type != bfd_link_hash_defined)
-    abort ();
-
-  return elf64_aarch64_allocate_dynrelocs (h, inf);
-}


 /* This is the most important function of all . Innocuosly named
@@ -6747,10 +6351,6 @@  elf64_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   elf_link_hash_traverse (&htab->root, elf64_aarch64_allocate_dynrelocs,
 			  info);

-  /* Allocate .plt and .got entries, and space for local symbols.  */
-  htab_traverse (htab->loc_hash_table,
-		 elf_aarch64_allocate_local_dynrelocs,
-		 info);

   /* For every jump slot reserved in the sgotplt, reloc_count is
      incremented.  However, when we reserve space for TLS descriptors,
@@ -6759,12 +6359,7 @@  elf64_aarch64_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
      slot size.  */

   if (htab->root.srelplt)
-    {
-      htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);
-      htab->next_irelative_index = htab->root.srelplt->reloc_count - 1;
-    }
-  else if (htab->root.irelplt)
-    htab->next_irelative_index = htab->root.irelplt->reloc_count - 1;
+    htab->sgotplt_jump_table_size = aarch64_compute_jump_table_size (htab);

   if (htab->tlsdesc_plt)
     {
@@ -6911,8 +6506,7 @@  elf64_aarch64_update_plt_entry (bfd *output_bfd,
 static void
 elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
 				       struct elf64_aarch64_link_hash_table
-				       *htab, bfd *output_bfd,
-				       struct bfd_link_info *info)
+				       *htab, bfd *output_bfd)
 {
   bfd_byte *plt_entry;
   bfd_vma plt_index;
@@ -6921,50 +6515,17 @@  elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,
   bfd_vma plt_entry_address;
   Elf_Internal_Rela rela;
   bfd_byte *loc;
-  asection *plt, *gotplt, *relplt;

-  /* When building a static executable, use .iplt, .igot.plt and
-     .rela.iplt sections for STT_GNU_IFUNC symbols.  */
-  if (htab->root.splt != NULL)
-    {
-      plt = htab->root.splt;
-      gotplt = htab->root.sgotplt;
-      relplt = htab->root.srelplt;
-    }
-  else
-    {
-      plt = htab->root.iplt;
-      gotplt = htab->root.igotplt;
-      relplt = htab->root.irelplt;
-    }
-
-  /* Get the index in the procedure linkage table which
-     corresponds to this symbol.  This is the index of this symbol
-     in all the symbols for which we are making plt entries.  The
-     first entry in the procedure linkage table is reserved.
+  plt_index = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;

-     Get the offset into the .got table of the entry that
-     corresponds to this function.	Each .got entry is GOT_ENTRY_SIZE
-     bytes. The first three are reserved for the dynamic linker.
-
-     For static executables, we don't reserve anything.  */
-
-  if (plt == htab->root.splt)
-    {
-      got_offset = (h->plt.offset - htab->plt_header_size) / htab->plt_entry_size;
-      got_offset = (got_offset + 3) * GOT_ENTRY_SIZE;
-    }
-  else
-    {
-      got_offset = h->plt.offset / htab->plt_entry_size;
-      got_offset = got_offset * GOT_ENTRY_SIZE;
-    }
-
-  plt_entry = plt->contents + h->plt.offset;
-  plt_entry_address = plt->output_section->vma
-    + plt->output_section->output_offset + h->plt.offset;
-  gotplt_entry_address = gotplt->output_section->vma +
-    gotplt->output_offset + got_offset;
+  /* Offset in the GOT is PLT index plus got GOT headers(3)
+     times 8.  */
+  got_offset = (plt_index + 3) * GOT_ENTRY_SIZE;
+  plt_entry = htab->root.splt->contents + h->plt.offset;
+  plt_entry_address = htab->root.splt->output_section->vma
+    + htab->root.splt->output_section->output_offset + h->plt.offset;
+  gotplt_entry_address = htab->root.sgotplt->output_section->vma +
+    htab->root.sgotplt->output_offset + got_offset;

   /* Copy in the boiler-plate for the PLTn entry.  */
   memcpy (plt_entry, elf64_aarch64_small_plt_entry, PLT_SMALL_ENTRY_SIZE);
@@ -6988,38 +6549,19 @@  elf64_aarch64_create_small_pltn_entry (struct elf_link_hash_entry *h,

   /* All the GOTPLT Entries are essentially initialized to PLT0.  */
   bfd_put_64 (output_bfd,
-	      plt->output_section->vma + plt->output_offset,
-	      gotplt->contents + got_offset);
+	      (htab->root.splt->output_section->vma
+	       + htab->root.splt->output_offset),
+	      htab->root.sgotplt->contents + got_offset);

+  /* Fill in the entry in the .rela.plt section.  */
   rela.r_offset = gotplt_entry_address;
-
-  if (h->dynindx == -1
-      || ((info->executable
-	   || ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
-	  && h->def_regular
-	  && h->type == STT_GNU_IFUNC))
-    {
-      /* If an STT_GNU_IFUNC symbol is locally defined, generate
-	 R_AARCH64_IRELATIVE instead of R_AARCH64_JUMP_SLOT.  */
-      rela.r_info = ELF64_R_INFO (0, R_AARCH64_IRELATIVE);
-      rela.r_addend = (h->root.u.def.value
-		       + h->root.u.def.section->output_section->vma
-		       + h->root.u.def.section->output_offset);
-      /* R_AARCH64_IRELATIVE comes last.  */
-      plt_index = htab->next_irelative_index--;
-    }
-  else
-    {
-      /* Fill in the entry in the .rela.plt section.  */
-      rela.r_info = ELF64_R_INFO (h->dynindx, R_AARCH64_JUMP_SLOT);
-      rela.r_addend = 0;
-      plt_index = htab->next_jump_slot_index++;
-    }
+  rela.r_info = ELF64_R_INFO (h->dynindx, R_AARCH64_JUMP_SLOT);
+  rela.r_addend = 0;

   /* Compute the relocation entry to used based on PLT index and do
      not adjust reloc_count. The reloc_count has already been adjusted
      to account for this entry.  */
-  loc = relplt->contents + plt_index * RELOC_SIZE (htab);
+  loc = htab->root.srelplt->contents + plt_index * RELOC_SIZE (htab);
   bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
 }

@@ -7079,38 +6621,15 @@  elf64_aarch64_finish_dynamic_symbol (bfd *output_bfd,

   if (h->plt.offset != (bfd_vma) - 1)
     {
-      asection *plt, *gotplt, *relplt;
-
       /* This symbol has an entry in the procedure linkage table.  Set
          it up.  */

-      /* When building a static executable, use .iplt, .igot.plt and
-	 .rela.iplt sections for STT_GNU_IFUNC symbols.  */
-      if (htab->root.splt != NULL)
-	{
-	  plt = htab->root.splt;
-	  gotplt = htab->root.sgotplt;
-	  relplt = htab->root.srelplt;
-	}
-      else
-	{
-	  plt = htab->root.iplt;
-	  gotplt = htab->root.igotplt;
-	  relplt = htab->root.irelplt;
-	}
-
-      /* This symbol has an entry in the procedure linkage table.  Set
-	 it up.	 */
-      if ((h->dynindx == -1
-	   && !((h->forced_local || info->executable)
-		&& h->def_regular
-		&& h->type == STT_GNU_IFUNC))
-	  || plt == NULL
-	  || gotplt == NULL
-	  || relplt == NULL)
+      if (h->dynindx == -1
+	  || htab->root.splt == NULL
+	  || htab->root.sgotplt == NULL || htab->root.srelplt == NULL)
 	abort ();

-      elf64_aarch64_create_small_pltn_entry (h, htab, output_bfd, info);
+      elf64_aarch64_create_small_pltn_entry (h, htab, output_bfd);
       if (!h->def_regular)
 	{
 	  /* Mark the symbol as undefined, rather than as defined in
@@ -7195,21 +6714,6 @@  elf64_aarch64_finish_dynamic_symbol (bfd *output_bfd,
   return TRUE;
 }

-/* Finish up local dynamic symbol handling.  We set the contents of
-   various dynamic sections here.  */
-
-static bfd_boolean
-elf_aarch64_finish_local_dynamic_symbol (void **slot, void *inf)
-{
-  struct elf_link_hash_entry *h
-    = (struct elf_link_hash_entry *) *slot;
-  struct bfd_link_info *info
-    = (struct bfd_link_info *) inf;
-
-  return elf64_aarch64_finish_dynamic_symbol (info->output_bfd,
-					      info, h, NULL);
-}
-
 static void
 elf64_aarch64_init_small_plt0_entry (bfd *output_bfd ATTRIBUTE_UNUSED,
 				     struct elf64_aarch64_link_hash_table
@@ -7452,11 +6956,6 @@  elf64_aarch64_finish_dynamic_sections (bfd *output_bfd,
     elf_section_data (htab->root.sgot->output_section)->this_hdr.sh_entsize
       = GOT_ENTRY_SIZE;

-  /* Fill PLT and GOT entries for local STT_GNU_IFUNC symbols.  */
-  htab_traverse (htab->loc_hash_table,
-		 elf_aarch64_finish_local_dynamic_symbol,
-		 info);
-
   return TRUE;
 }

@@ -7470,24 +6969,6 @@  elf64_aarch64_plt_sym_val (bfd_vma i, const asection *plt,
   return plt->vma + PLT_ENTRY_SIZE + i * PLT_SMALL_ENTRY_SIZE;
 }

-/* Hook called by the linker routine which adds symbols from an object
-   file.  */
-
-static bfd_boolean
-elf64_aarch64_add_symbol_hook (bfd *abfd, struct bfd_link_info *info,
-			       Elf_Internal_Sym *sym,
-			       const char **namep ATTRIBUTE_UNUSED,
-			       flagword *flagsp ATTRIBUTE_UNUSED,
-			       asection **secp ATTRIBUTE_UNUSED,
-			       bfd_vma *valp ATTRIBUTE_UNUSED)
-{
-  if ((abfd->flags & DYNAMIC) == 0
-      && (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
-	  || ELF_ST_BIND (sym->st_info) == STB_GNU_UNIQUE))
-    elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
-
-  return TRUE;
-}

 /* We use this so we can override certain functions
    (though currently we don't).  */
@@ -7594,6 +7075,9 @@  const struct elf_size_info elf64_aarch64_size_info =
 #define elf_backend_init_index_section		\
   _bfd_elf_init_2_index_sections

+#define elf_backend_is_function_type		\
+  elf64_aarch64_is_function_type
+
 #define elf_backend_finish_dynamic_sections	\
   elf64_aarch64_finish_dynamic_sections

@@ -7633,9 +7117,6 @@  const struct elf_size_info elf64_aarch64_size_info =
 #define elf_backend_size_info			\
   elf64_aarch64_size_info

-#define elf_backend_add_symbol_hook		\
-  elf64_aarch64_add_symbol_hook
-
 #define elf_backend_can_refcount       1
 #define elf_backend_can_gc_sections    1
 #define elf_backend_plt_readonly       1
diff --git a/include/elf/aarch64.h b/include/elf/aarch64.h
index ebbdf8c..a7b86c1 100644
--- a/include/elf/aarch64.h
+++ b/include/elf/aarch64.h
@@ -208,8 +208,7 @@  RELOC_NUMBER (R_AARCH64_TLS_DTPMOD64, 1028)
 RELOC_NUMBER (R_AARCH64_TLS_DTPREL64, 1029)
 RELOC_NUMBER (R_AARCH64_TLS_TPREL64, 1030)
 RELOC_NUMBER (R_AARCH64_TLSDESC, 1031)
-RELOC_NUMBER (R_AARCH64_IRELATIVE, 1032)
-FAKE_RELOC (R_AARCH64_dyn_max, 1033)
+FAKE_RELOC (R_AARCH64_dyn_max, 1032)

 END_RELOC_NUMBERS (R_AARCH64_end)

diff --git a/ld/emulparams/aarch64elf.sh b/ld/emulparams/aarch64elf.sh
index 99f4844..53ccd6a 100644
--- a/ld/emulparams/aarch64elf.sh
+++ b/ld/emulparams/aarch64elf.sh
@@ -18,8 +18,6 @@  MAXPAGESIZE="CONSTANT (MAXPAGESIZE)"
 ENTRY=_start
 EMBEDDED=yes
 SEPARATE_GOTPLT=24
-IREL_IN_PLT=
-
 TEXT_START_ADDR=0x00400000

 DATA_START_SYMBOLS='__data_start = . ;';
diff --git a/ld/testsuite/ld-aarch64/aarch64-elf.exp b/ld/testsuite/ld-aarch64/aarch64-elf.exp
index 5c150dd..d687cc2 100644
--- a/ld/testsuite/ld-aarch64/aarch64-elf.exp
+++ b/ld/testsuite/ld-aarch64/aarch64-elf.exp
@@ -114,44 +114,3 @@  run_dump_test "gc-tls-relocs"
 run_dump_test "gc-plt-relocs"
 run_dump_test "gc-relocs-257-dyn"
 run_dump_test "gc-relocs-257"
-
-# ifunc tests
-run_dump_test "ifunc-1"
-run_dump_test "ifunc-1-local"
-run_dump_test "ifunc-2"
-run_dump_test "ifunc-2-local"
-run_dump_test "ifunc-3a"
-run_dump_test "ifunc-3b"
-run_dump_test "ifunc-4"
-run_dump_test "ifunc-4a"
-run_dump_test "ifunc-5a"
-run_dump_test "ifunc-5b"
-run_dump_test "ifunc-5a-local"
-run_dump_test "ifunc-5b-local"
-run_dump_test "ifunc-5r-local"
-run_dump_test "ifunc-6a"
-run_dump_test "ifunc-6b"
-run_dump_test "ifunc-7a"
-run_dump_test "ifunc-7b"
-run_dump_test "ifunc-7c"
-run_dump_test "ifunc-8"
-run_dump_test "ifunc-9"
-run_dump_test "ifunc-10"
-run_dump_test "ifunc-11"
-run_dump_test "ifunc-12"
-run_dump_test "ifunc-13"
-run_dump_test "ifunc-14a"
-run_dump_test "ifunc-14b"
-run_dump_test "ifunc-14c"
-run_dump_test "ifunc-14d"
-run_dump_test "ifunc-14e"
-run_dump_test "ifunc-14f"
-run_dump_test "ifunc-15"
-run_dump_test "ifunc-16"
-run_dump_test "ifunc-17a"
-run_dump_test "ifunc-17b"
-run_dump_test "ifunc-18a"
-run_dump_test "ifunc-18b"
-run_dump_test "ifunc-19a"
-run_dump_test "ifunc-19b"
-run_dump_test "ifunc-20"
diff --git a/ld/testsuite/ld-aarch64/ifunc-1-local.d b/ld/testsuite/ld-aarch64/ifunc-1-local.d
deleted file mode 100644
index a3054bd..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-1-local.d
+++ /dev/null
@@ -1,7 +0,0 @@ 
-#ld: -shared
-#objdump: -dw
-#target: aarch64*-*-*
-
-#...
-[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-1-local.s b/ld/testsuite/ld-aarch64/ifunc-1-local.s
deleted file mode 100644
index 7b9d117..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-1-local.s
+++ /dev/null
@@ -1,13 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.set __GI_foo, foo
-	.text
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-.globl bar
-	.type	bar, @function
-bar:
-	bl	__GI_foo
-	ret
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-1.d b/ld/testsuite/ld-aarch64/ifunc-1.d
deleted file mode 100644
index a3054bd..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-1.d
+++ /dev/null
@@ -1,7 +0,0 @@ 
-#ld: -shared
-#objdump: -dw
-#target: aarch64*-*-*
-
-#...
-[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-1.s b/ld/testsuite/ld-aarch64/ifunc-1.s
deleted file mode 100644
index 6f86c8a..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-1.s
+++ /dev/null
@@ -1,16 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.global __GI_foo
-	.hidden __GI_foo
-	.set __GI_foo, foo
-	.text
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-.globl bar
-	.type	bar, @function
-bar:
-	bl	__GI_foo
-	ret
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-10.d b/ld/testsuite/ld-aarch64/ifunc-10.d
deleted file mode 100644
index 782b078..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-10.d
+++ /dev/null
@@ -1,5 +0,0 @@ 
-#ld: -e bar --gc-sections
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-There are no relocations in this file.
diff --git a/ld/testsuite/ld-aarch64/ifunc-10.s b/ld/testsuite/ld-aarch64/ifunc-10.s
deleted file mode 100644
index 10468c1..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-10.s
+++ /dev/null
@@ -1,25 +0,0 @@ 
-        .section .text.foo,"ax",@progbits
-        .type foo, @function
-foo:
-        .global foo
-        adrp    x0, :got:ifunc
-        ldr     x0, [x0, #:got_lo12:ifunc]
-	bl ifunc
-        adrp    x0, xxx
-        add     x0, x0, :lo12:xxx
-        ret
-
-        .section .text.bar,"ax",@progbits
-        .type bar, @function
-bar:
-        .global bar
-        ret
-
-        .section .text.ifunc,"ax",@progbits
-        .type ifunc, @gnu_indirect_function
-ifunc:
-        ret
-
-        .section .data.foo,"aw",@progbits
-xxx:
-	.quad ifunc
diff --git a/ld/testsuite/ld-aarch64/ifunc-11.d b/ld/testsuite/ld-aarch64/ifunc-11.d
deleted file mode 100644
index 782b078..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-11.d
+++ /dev/null
@@ -1,5 +0,0 @@ 
-#ld: -e bar --gc-sections
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-There are no relocations in this file.
diff --git a/ld/testsuite/ld-aarch64/ifunc-11.s b/ld/testsuite/ld-aarch64/ifunc-11.s
deleted file mode 100644
index e1820de..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-11.s
+++ /dev/null
@@ -1,26 +0,0 @@ 
-        .section .text.foo,"ax",@progbits
-        .type foo, @function
-foo:
-        .global foo
-        adrp    x0, :got:ifunc
-        ldr     x0, [x0, #:got_lo12:ifunc]
-	bl ifunc
-        adrp    x0, xxx
-        add     x0, x0, :lo12:xxx
-        ret
-
-        .section .text.bar,"ax",@progbits
-        .type bar, @function
-bar:
-        .global bar
-        ret
-
-        .section .text.ifunc,"ax",@progbits
-        .type ifunc, @gnu_indirect_function
-        .global ifunc
-ifunc:
-        ret
-
-        .section .data.foo,"aw",@progbits
-xxx:
-	.quad ifunc
diff --git a/ld/testsuite/ld-aarch64/ifunc-12.d b/ld/testsuite/ld-aarch64/ifunc-12.d
deleted file mode 100644
index 8fa8ce0..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-12.d
+++ /dev/null
@@ -1,5 +0,0 @@ 
-#ld: -shared -e bar --gc-sections
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-There are no relocations in this file.
diff --git a/ld/testsuite/ld-aarch64/ifunc-12.s b/ld/testsuite/ld-aarch64/ifunc-12.s
deleted file mode 100644
index aad30df..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-12.s
+++ /dev/null
@@ -1,24 +0,0 @@ 
-        .section .text.foo,"ax",@progbits
-        .type foo, @function
-foo:
-        adrp    x0, :got:ifunc
-        ldr     x0, [x0, #:got_lo12:ifunc]
-	bl ifunc
-        adrp    x0, xxx
-        add     x0, x0, :lo12:xxx
-        ret
-
-        .section .text.bar,"ax",@progbits
-        .type bar, @function
-bar:
-        .global bar
-        ret
-
-        .section .text.ifunc,"ax",@progbits
-        .type ifunc, @gnu_indirect_function
-ifunc:
-        ret
-
-        .section .data.foo,"aw",@progbits
-xxx:
-	.quad ifunc
diff --git a/ld/testsuite/ld-aarch64/ifunc-13.d b/ld/testsuite/ld-aarch64/ifunc-13.d
deleted file mode 100644
index e1b5c10..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-13.d
+++ /dev/null
@@ -1,13 +0,0 @@ 
-#source: ifunc-13a.s
-#source: ifunc-13b.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ABS64[ ]+ifunc\(\)[ ]+ifunc \+ 0
-
-Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
diff --git a/ld/testsuite/ld-aarch64/ifunc-13a.s b/ld/testsuite/ld-aarch64/ifunc-13a.s
deleted file mode 100644
index 873e06e..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-13a.s
+++ /dev/null
@@ -1,11 +0,0 @@ 
-	.text
-        .type foo, @function
-	.global foo
-foo:
-	adrp    x0, xxx
-        add     x0, x0, :lo12:xxx
-        ret
-
-	.data
-xxx:
-	.quad ifunc
diff --git a/ld/testsuite/ld-aarch64/ifunc-13b.s b/ld/testsuite/ld-aarch64/ifunc-13b.s
deleted file mode 100644
index 3560394..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-13b.s
+++ /dev/null
@@ -1,5 +0,0 @@ 
-	.text
-        .type ifunc, @gnu_indirect_function
-	.globl ifunc
-ifunc:
-        ret
diff --git a/ld/testsuite/ld-aarch64/ifunc-14a.d b/ld/testsuite/ld-aarch64/ifunc-14a.d
deleted file mode 100644
index ff580d0..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14a.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#source: ifunc-14a.s
-#source: ifunc-14b.s
-#ld: -shared -z nocombreloc
-#readelf: -d
-#target: aarch64*-*-*
-
-#failif
-#...
-.*\(TEXTREL\).*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-14a.s b/ld/testsuite/ld-aarch64/ifunc-14a.s
deleted file mode 100644
index 7d6183c..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14a.s
+++ /dev/null
@@ -1,7 +0,0 @@ 
-	.text
-	.globl bar
-	.type	bar, @function
-bar:
-	bl	foo
-	.size	bar, .-bar
-	.hidden	foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-14b.d b/ld/testsuite/ld-aarch64/ifunc-14b.d
deleted file mode 100644
index 52ed2b4..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14b.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#source: ifunc-14b.s
-#source: ifunc-14a.s
-#ld: -shared -z nocombreloc
-#readelf: -d
-#target: aarch64*-*-*
-
-#failif
-#...
-.*\(TEXTREL\).*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-14b.s b/ld/testsuite/ld-aarch64/ifunc-14b.s
deleted file mode 100644
index bac22eb..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14b.s
+++ /dev/null
@@ -1,5 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.globl foo
-foo:
-	ret
-	.size	foo, .-foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-14c.d b/ld/testsuite/ld-aarch64/ifunc-14c.d
deleted file mode 100644
index a83126f..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14c.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#source: ifunc-14a.s
-#source: ifunc-14b.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#failif
-#...
-.* +R_AARCH64_NONE +.*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-14c.s b/ld/testsuite/ld-aarch64/ifunc-14c.s
deleted file mode 100644
index 7853280..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14c.s
+++ /dev/null
@@ -1,7 +0,0 @@ 
-	.text
-	.globl xxx
-	.type	xxx, @function
-xxx:
-	bl	foo
-	.size	xxx, .-xxx
-	.hidden	foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-14d.d b/ld/testsuite/ld-aarch64/ifunc-14d.d
deleted file mode 100644
index 4ae88d2..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14d.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#source: ifunc-14b.s
-#source: ifunc-14a.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#failif
-#...
-.* +R_AARCH64_NONE +.*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-14e.d b/ld/testsuite/ld-aarch64/ifunc-14e.d
deleted file mode 100644
index 62de35e..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14e.d
+++ /dev/null
@@ -1,11 +0,0 @@ 
-#source: ifunc-14a.s
-#source: ifunc-14c.s
-#source: ifunc-14b.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#failif
-#...
-.* +R_AARCH64_NONE +.*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-14f.d b/ld/testsuite/ld-aarch64/ifunc-14f.d
deleted file mode 100644
index ab8bdbf..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-14f.d
+++ /dev/null
@@ -1,11 +0,0 @@ 
-#source: ifunc-14a.s
-#source: ifunc-14b.s
-#source: ifunc-14c.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#failif
-#...
-.* +R_AARCH64_NONE +.*
-#...
diff --git a/ld/testsuite/ld-aarch64/ifunc-15.d b/ld/testsuite/ld-aarch64/ifunc-15.d
deleted file mode 100644
index 51d9242..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-15.d
+++ /dev/null
@@ -1,12 +0,0 @@ 
-#source: ifunc-15.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.got' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+ifunc\(\)[ ]+ifunc \+ 0
-
-Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
diff --git a/ld/testsuite/ld-aarch64/ifunc-15.s b/ld/testsuite/ld-aarch64/ifunc-15.s
deleted file mode 100644
index f94b4a6..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-15.s
+++ /dev/null
@@ -1,11 +0,0 @@ 
-	.text
-        .type foo, @function
-	.global foo
-foo:
-	adrp    x0, :got:ifunc
-        ldr     x0, [x0, #:got_lo12:ifunc]
-        ret
-        .type ifunc, @gnu_indirect_function
-	.globl ifunc
-ifunc:
-        ret
diff --git a/ld/testsuite/ld-aarch64/ifunc-16.d b/ld/testsuite/ld-aarch64/ifunc-16.d
deleted file mode 100644
index 31ec162..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-16.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#source: ifunc-16.s
-#ld: -shared
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+0+[ ]+ifunc \+ 0
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-16.s b/ld/testsuite/ld-aarch64/ifunc-16.s
deleted file mode 100644
index ded401a..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-16.s
+++ /dev/null
@@ -1,17 +0,0 @@ 
-	.text
-	.globl	fct
-	.type	fct, @gnu_indirect_function
-	.set	fct,resolve
-	.hidden int_fct
-	.globl	int_fct
-	.set	int_fct,fct
-	.p2align 4,,15
-	.type	resolve, @function
-resolve:
-	bl	ifunc
-	.size	resolve, .-resolve
-	.globl	g
-	.type	g, @function
-g:
-	bl	int_fct
-	.size	g, .-g
diff --git a/ld/testsuite/ld-aarch64/ifunc-17a.d b/ld/testsuite/ld-aarch64/ifunc-17a.d
deleted file mode 100644
index a87de7c..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-17a.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#source: ifunc-17a.s
-#source: ifunc-17b.s
-#ld: -static
-#readelf: -s --wide
-#target: aarch64*-*-*
-
-#...
- +[0-9]+: +[0-9a-f]+ +4 +OBJECT +GLOBAL +DEFAULT +[1-9] foo
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-17a.s b/ld/testsuite/ld-aarch64/ifunc-17a.s
deleted file mode 100644
index e0bde49..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-17a.s
+++ /dev/null
@@ -1,11 +0,0 @@ 
-	.globl main
-	.globl start
-	.globl _start
-	.globl __start
-	.text
-main:
-start:
-_start:
-__start:
-	.byte 0
-	.common	foo,4,4
diff --git a/ld/testsuite/ld-aarch64/ifunc-17b.d b/ld/testsuite/ld-aarch64/ifunc-17b.d
deleted file mode 100644
index 9286a9f..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-17b.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#source: ifunc-17b.s
-#source: ifunc-17a.s
-#ld: -static
-#readelf: -s --wide
-#target: aarch64*-*-*
-
-#...
- +[0-9]+: +[0-9a-f]+ +4 +OBJECT +GLOBAL +DEFAULT +[1-9] foo
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-17b.s b/ld/testsuite/ld-aarch64/ifunc-17b.s
deleted file mode 100644
index 66abe04..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-17b.s
+++ /dev/null
@@ -1,6 +0,0 @@ 
-	.weak	foo
-	.type foo, %gnu_indirect_function
-	.size	foo,1
-	.text
-foo:
-	.byte	1
diff --git a/ld/testsuite/ld-aarch64/ifunc-18a.d b/ld/testsuite/ld-aarch64/ifunc-18a.d
deleted file mode 100644
index 3db91d3..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-18a.d
+++ /dev/null
@@ -1,14 +0,0 @@ 
-#source: ifunc-18a.s
-#source: ifunc-18b.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-18a.s b/ld/testsuite/ld-aarch64/ifunc-18a.s
deleted file mode 100644
index c29c121..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-18a.s
+++ /dev/null
@@ -1,5 +0,0 @@ 
-	.section .data.rel,"aw",@progbits
-	.globl foo_ptrt
-	.type	foo_ptr, @object
-foo_ptr:
-	.dc.a foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-18b.d b/ld/testsuite/ld-aarch64/ifunc-18b.d
deleted file mode 100644
index b27f526..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-18b.d
+++ /dev/null
@@ -1,14 +0,0 @@ 
-#source: ifunc-18b.s
-#source: ifunc-18a.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-18b.s b/ld/testsuite/ld-aarch64/ifunc-18b.s
deleted file mode 100644
index 2e46c1e..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-18b.s
+++ /dev/null
@@ -1,15 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-	.hidden foo
-	.globl foo
-foo:
-	ret
-	.size	foo, .-foo
-	.globl bar
-bar:
-	bl	foo1
-	ret
-	.size	bar, .-bar
-	.hidden foo1
-	.globl foo1
-	foo1 = foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-19a.d b/ld/testsuite/ld-aarch64/ifunc-19a.d
deleted file mode 100644
index dd82b24..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-19a.d
+++ /dev/null
@@ -1,13 +0,0 @@ 
-#source: ifunc-19a.s
-#source: ifunc-19b.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-19a.s b/ld/testsuite/ld-aarch64/ifunc-19a.s
deleted file mode 100644
index 3a3d0cd..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-19a.s
+++ /dev/null
@@ -1,5 +0,0 @@ 
-	.section .data.rel,"aw",@progbits
-	.globl foo_ptrt
-	.type	foo_ptr, @object
-foo_ptr:
-	.dc.a foo1
diff --git a/ld/testsuite/ld-aarch64/ifunc-19b.d b/ld/testsuite/ld-aarch64/ifunc-19b.d
deleted file mode 100644
index 1e0819c..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-19b.d
+++ /dev/null
@@ -1,13 +0,0 @@ 
-#source: ifunc-19b.s
-#source: ifunc-19a.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-19b.s b/ld/testsuite/ld-aarch64/ifunc-19b.s
deleted file mode 100644
index 2e46c1e..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-19b.s
+++ /dev/null
@@ -1,15 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-	.hidden foo
-	.globl foo
-foo:
-	ret
-	.size	foo, .-foo
-	.globl bar
-bar:
-	bl	foo1
-	ret
-	.size	bar, .-bar
-	.hidden foo1
-	.globl foo1
-	foo1 = foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-2-local.d b/ld/testsuite/ld-aarch64/ifunc-2-local.d
deleted file mode 100644
index 0bdeb270..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-2-local.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#ld: -shared
-#objdump: -dw
-#target: aarch64*-*-*
-
-#...
-[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
-[ \t0-9a-f]+:[ \t0-9a-f]+adrp[ \t]+x0, 0 <_GLOBAL_OFFSET_TABLE_>
-[ \t0-9a-f]+:[ \t0-9a-f]+add[ \t]+x0, x0, #0x[0-9a-f]+
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-2-local.s b/ld/testsuite/ld-aarch64/ifunc-2-local.s
deleted file mode 100644
index 632c31f..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-2-local.s
+++ /dev/null
@@ -1,15 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.set __GI_foo, foo
-	.text
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-.globl bar
-	.type	bar, @function
-bar:
-	bl	__GI_foo
-        adrp    x0, __GI_foo
-        add     x0, x0, :lo12:__GI_foo
-	ret
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-2.d b/ld/testsuite/ld-aarch64/ifunc-2.d
deleted file mode 100644
index 0bdeb270..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-2.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#ld: -shared
-#objdump: -dw
-#target: aarch64*-*-*
-
-#...
-[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
-[ \t0-9a-f]+:[ \t0-9a-f]+adrp[ \t]+x0, 0 <_GLOBAL_OFFSET_TABLE_>
-[ \t0-9a-f]+:[ \t0-9a-f]+add[ \t]+x0, x0, #0x[0-9a-f]+
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-2.s b/ld/testsuite/ld-aarch64/ifunc-2.s
deleted file mode 100644
index da350df..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-2.s
+++ /dev/null
@@ -1,18 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.global __GI_foo
-	.hidden __GI_foo
-	.set __GI_foo, foo
-	.text
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-.globl bar
-	.type	bar, @function
-bar:
-	bl	__GI_foo
-        adrp    x0, __GI_foo
-        add     x0, x0, :lo12:__GI_foo
-	ret
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-20.d b/ld/testsuite/ld-aarch64/ifunc-20.d
deleted file mode 100644
index 3380479..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-20.d
+++ /dev/null
@@ -1,12 +0,0 @@ 
-#source: ifunc-20.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.ifunc' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ABS64[ ]+ifunc\(\)[ ]+ifunc \+ 0
-
-Relocation section '.rela.plt' at offset 0x[0-9a-f]+ contains 1 entries:
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+ifunc\(\)[ ]+ifunc \+ 0
diff --git a/ld/testsuite/ld-aarch64/ifunc-20.s b/ld/testsuite/ld-aarch64/ifunc-20.s
deleted file mode 100644
index 17393cb..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-20.s
+++ /dev/null
@@ -1,16 +0,0 @@ 
-	.section .data.rel,"aw",@progbits
-	.globl ifunc_ptrt
-	.type	ifunc_ptr, @object
-ifunc_ptr:
-	.dc.a ifunc
-	.text
-	.type ifunc, @gnu_indirect_function
-	.globl ifunc
-ifunc:
-	ret
-	.size	ifunc, .-ifunc
-	.type bar, @function
-	.globl bar
-bar:
-	bl	ifunc
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-3.s b/ld/testsuite/ld-aarch64/ifunc-3.s
deleted file mode 100644
index c68b1b7..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-3.s
+++ /dev/null
@@ -1,16 +0,0 @@ 
-	.type foo, %gnu_indirect_function
-	.global __GI_foo
-	.protected __GI_foo
-	.set __GI_foo, foo
-	.text
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-.globl bar
-	.type	bar, @function
-bar:
-	bl	__GI_foo
-	ret
-	.size	bar, .-bar
diff --git a/ld/testsuite/ld-aarch64/ifunc-3a.d b/ld/testsuite/ld-aarch64/ifunc-3a.d
deleted file mode 100644
index e8cc8d3..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-3a.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-3.s
-#ld: -shared
-#objdump: -dw
-#target: aarch64*-*-*
-
-#...
-[ \t0-9a-f]+:[ \t0-9a-f]+bl[ \t0-9a-f]+<\*ABS\*\+0x[0-9a-f]+@plt>
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-3b.d b/ld/testsuite/ld-aarch64/ifunc-3b.d
deleted file mode 100644
index 7e177a6..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-3b.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-3.s
-#ld: -shared
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#...
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-4.d b/ld/testsuite/ld-aarch64/ifunc-4.d
deleted file mode 100644
index 5e69b05..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-4.d
+++ /dev/null
@@ -1,7 +0,0 @@ 
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-#...
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-4.s b/ld/testsuite/ld-aarch64/ifunc-4.s
deleted file mode 100644
index c2b66f5..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-4.s
+++ /dev/null
@@ -1,18 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-	bl	foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-4a.d b/ld/testsuite/ld-aarch64/ifunc-4a.d
deleted file mode 100644
index 801e6cd..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-4a.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#ld: -s
-#readelf: -r --wide
-#target: aarch64*-*-*
-#source: ifunc-4.s
-
-#...
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_[_0-9A-Z]+_IRELATIVE[ ]*[0-9a-f]*
-#pass
diff --git a/ld/testsuite/ld-aarch64/ifunc-5-local.s b/ld/testsuite/ld-aarch64/ifunc-5-local.s
deleted file mode 100644
index 8d23bab..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5-local.s
+++ /dev/null
@@ -1,19 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-	bl	foo
-        adrp    x0, :got:foo
-        ldr     x0, [x0, #:got_lo12:foo]
diff --git a/ld/testsuite/ld-aarch64/ifunc-5.s b/ld/testsuite/ld-aarch64/ifunc-5.s
deleted file mode 100644
index b1bbf1a..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5.s
+++ /dev/null
@@ -1,20 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-	bl	foo
-        adrp    x0, :got:foo
-        ldr     x0, [x0, #:got_lo12:foo]
diff --git a/ld/testsuite/ld-aarch64/ifunc-5a-local.d b/ld/testsuite/ld-aarch64/ifunc-5a-local.d
deleted file mode 100644
index 9693585..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5a-local.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-5-local.s
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-5a.d b/ld/testsuite/ld-aarch64/ifunc-5a.d
deleted file mode 100644
index f0ee59f..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5a.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-5.s
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-5b-local.d b/ld/testsuite/ld-aarch64/ifunc-5b-local.d
deleted file mode 100644
index e8e620c..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5b-local.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-5-local.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-5b.d b/ld/testsuite/ld-aarch64/ifunc-5b.d
deleted file mode 100644
index 0175982..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5b.d
+++ /dev/null
@@ -1,12 +0,0 @@ 
-#source: ifunc-5.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.got' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0
-#...
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_JUMP_SLOT[ ]+foo\(\)[ ]+foo \+ 0
diff --git a/ld/testsuite/ld-aarch64/ifunc-5r-local.d b/ld/testsuite/ld-aarch64/ifunc-5r-local.d
deleted file mode 100644
index 463cd25..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-5r-local.d
+++ /dev/null
@@ -1,10 +0,0 @@ 
-#source: ifunc-5-local.s
-#ld: -r
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.text' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_CALL26[ ]+foo\(\)[ ]+foo \+ 0
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_ADR_GOT_PAGE[ ]+foo\(\)[ ]+foo \+ 0
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_LD64_GOT_LO1[ ]+foo\(\)[ ]+foo \+ 0
diff --git a/ld/testsuite/ld-aarch64/ifunc-6.s b/ld/testsuite/ld-aarch64/ifunc-6.s
deleted file mode 100644
index 56486d6..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-6.s
+++ /dev/null
@@ -1,21 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.protected foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-	bl	foo
-        adrp    x0, :got:foo
-        ldr     x0, [x0, #:got_lo12:foo]
diff --git a/ld/testsuite/ld-aarch64/ifunc-6a.d b/ld/testsuite/ld-aarch64/ifunc-6a.d
deleted file mode 100644
index a50ad3a..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-6a.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-6.s
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-6b.d b/ld/testsuite/ld-aarch64/ifunc-6b.d
deleted file mode 100644
index c415bc3..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-6b.d
+++ /dev/null
@@ -1,12 +0,0 @@ 
-#source: ifunc-6.s
-#ld: -shared -z nocombreloc
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.got' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_GLOB_DAT[ ]+foo\(\)[ ]+foo \+ 0
-#...
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-7.s b/ld/testsuite/ld-aarch64/ifunc-7.s
deleted file mode 100644
index 51485af..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-7.s
+++ /dev/null
@@ -1,21 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.hidden foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-	bl	foo
-        adrp    x0, :got:foo
-        ldr     x0, [x0, #:got_lo12:foo]
diff --git a/ld/testsuite/ld-aarch64/ifunc-7a.d b/ld/testsuite/ld-aarch64/ifunc-7a.d
deleted file mode 100644
index c246c99..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-7a.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-7.s
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-7b.d b/ld/testsuite/ld-aarch64/ifunc-7b.d
deleted file mode 100644
index efdd379..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-7b.d
+++ /dev/null
@@ -1,8 +0,0 @@ 
-#source: ifunc-7.s
-#ld: -shared
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-7c.d b/ld/testsuite/ld-aarch64/ifunc-7c.d
deleted file mode 100644
index 1967742..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-7c.d
+++ /dev/null
@@ -1,19 +0,0 @@ 
-#source: ifunc-7.s
-#ld: -shared
-#objdump: -dr -j .text
-#target: aarch64*-*-*
-
-# Check if adrp and ldr have been relocated correctly.
-
-.*:     file format elf.+aarch64.*
-
-
-Disassembly of section \.text:
-
-[0-9a-f]+ <foo>:
- [0-9a-f]+:	d65f03c0 	ret
-
-[0-9a-f]+ <__start>:
- [0-9a-f]+:	[0-9a-f]+ 	bl	[0-9a-f]+ <\*ABS\*\+0x[0-9a-f]+@plt>
- [0-9a-f]+:	[0-9a-f]+ 	adrp	x0, [0-9]+ <__start\+0x[0-9a-f]+>
- [0-9a-f]+:	[0-9a-f]+ 	ldr	x0, \[x0,.+\]
diff --git a/ld/testsuite/ld-aarch64/ifunc-8.d b/ld/testsuite/ld-aarch64/ifunc-8.d
deleted file mode 100644
index 8aadc51..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-8.d
+++ /dev/null
@@ -1,9 +0,0 @@ 
-#source: ifunc-8a.s
-#source: ifunc-8b.s
-#ld:
-#readelf: -r --wide
-#target: aarch64*-*-*
-
-Relocation section '.rela.plt' at .*
-[ ]+Offset[ ]+Info[ ]+Type[ ]+.*
-[0-9a-f]+[ ]+[0-9a-f]+[ ]+R_AARCH64_IRELATIVE[ ]+[0-9a-f]*
diff --git a/ld/testsuite/ld-aarch64/ifunc-8a.s b/ld/testsuite/ld-aarch64/ifunc-8a.s
deleted file mode 100644
index 94c073a..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-8a.s
+++ /dev/null
@@ -1,13 +0,0 @@ 
-	.text
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-        adrp    x0, :got:foo
-        ldr     x0, [x0, #:got_lo12:foo]
diff --git a/ld/testsuite/ld-aarch64/ifunc-8b.s b/ld/testsuite/ld-aarch64/ifunc-8b.s
deleted file mode 100644
index 1f108f8..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-8b.s
+++ /dev/null
@@ -1,7 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
diff --git a/ld/testsuite/ld-aarch64/ifunc-9.d b/ld/testsuite/ld-aarch64/ifunc-9.d
deleted file mode 100644
index 3b4e995..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-9.d
+++ /dev/null
@@ -1,3 +0,0 @@ 
-#ld: --export-dynamic
-#error: .*dynamic STT_GNU_IFUNC symbol `foo' with pointer equality in `.*.o' can not be used when making an executable; recompile with -fPIE and relink with -pie
-#target: aarch64*-*-*
diff --git a/ld/testsuite/ld-aarch64/ifunc-9.s b/ld/testsuite/ld-aarch64/ifunc-9.s
deleted file mode 100644
index 2e2f577..0000000
--- a/ld/testsuite/ld-aarch64/ifunc-9.s
+++ /dev/null
@@ -1,23 +0,0 @@ 
-	.text
-	.type foo, %gnu_indirect_function
-.globl foo
-	.type	foo, @function
-foo:
-	ret
-	.size	foo, .-foo
-	.type start,"function"
-	.global start
-start:
-	.type _start,"function"
-	.global _start
-_start:
-	.type __start,"function"
-	.global __start
-__start:
-	.type __start,"function"
-        adrp    x0, .LANCHOR0
-        add     x0, x0, :lo12:.LANCHOR0
-        .data
-        .align  3
-.LANCHOR0 = . + 0
-        .xword  foo
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
index 1d64efc..df913d8 100644
--- a/ld/testsuite/ld-ifunc/ifunc.exp
+++ b/ld/testsuite/ld-ifunc/ifunc.exp
@@ -24,11 +24,10 @@ 


 # IFUNC support has only been implemented for the ix86, x86_64, powerpc,
-# aarch64 and sparc so far.
+# and sparc so far.
 if {!(([istarget "i?86-*-*"]
        || [istarget "x86_64-*-*"]
        || [istarget "powerpc*-*-*"]
-       || [istarget "aarch64*-*-*"]
        || [istarget "sparc*-*-*"])
       && ([istarget "*-*-elf*"]
 	  || [istarget "*-*-nacl*"]