[1/2] binutils: Remove Itanium (IA-64) architecture

Message ID 20240508092911.24823-2-yangtiezhu@loongson.cn
State New
Headers
Series binutils-gdb: Remove Itanium (IA-64) architecture |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 fail Testing failed
linaro-tcwg-bot/tcwg_gdb_build--master-arm fail Testing failed

Commit Message

Tiezhu Yang May 8, 2024, 9:29 a.m. UTC
  The Itanium architecture is obsolete, after the upstream Linux kernel
commit cf8e8658100d ("arch: Remove Itanium (IA-64) architecture"), the
IA-64 port has been removed from the Linux kernel, so also remove the
IA-64 specific code from binutils.

Link: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=cf8e8658100d
Signed-off-by: Tiezhu Yang <yangtiezhu@loongson.cn>
---
 bfd/.gitignore                                |     2 -
 bfd/Makefile.am                               |    23 +-
 bfd/Makefile.in                               |    29 +-
 bfd/archures.c                                |     5 -
 bfd/bfd-in2.h                                 |     3 -
 bfd/coff-ia64.c                               |   214 -
 bfd/coffcode.h                                |    11 -
 bfd/config.bfd                                |    15 -
 bfd/configure                                 |   107 +-
 bfd/configure.ac                              |     7 -
 bfd/configure.com                             |     9 -
 bfd/configure.host                            |     4 -
 bfd/cpu-ia64-opc.c                            |   669 -
 bfd/cpu-ia64.c                                |    50 -
 bfd/elf-eh-frame.c                            |     4 -
 bfd/elf64-ia64-vms.c                          |  5630 --------
 bfd/elfnn-ia64.c                              |  5116 -------
 bfd/elfxx-ia64.c                              |   764 -
 bfd/elfxx-ia64.h                              |    40 -
 bfd/libbfd-in.h                               |     4 -
 bfd/libbfd.h                                  |     4 -
 bfd/makefile.vms                              |     8 -
 bfd/peXXigen.c                                |     2 -
 bfd/pei-ia64.c                                |    38 -
 bfd/targets.c                                 |    19 -
 bfd/vms-lib.c                                 |    39 +-
 binutils/MAINTAINERS                          |     1 -
 binutils/Makefile.am                          |     7 +-
 binutils/Makefile.in                          |    10 +-
 binutils/NEWS                                 |     2 +
 binutils/configure                            |   100 +-
 binutils/configure.com                        |     1 -
 binutils/makefile.vms                         |     4 +-
 binutils/readelf.c                            |  1329 +-
 binutils/testsuite/binutils-all/nm.exp        |     3 +-
 binutils/testsuite/binutils-all/objcopy.exp   |    10 +-
 binutils/testsuite/binutils-all/objdump.exp   |     1 -
 .../testsuite/binutils-all/testranges-ia64.d  |    15 -
 .../testsuite/binutils-all/testranges-ia64.s  |    57 -
 binutils/testsuite/binutils-all/testranges.d  |     1 -
 binutils/testsuite/lib/binutils-common.exp    |     3 +-
 binutils/unwind-ia64.c                        |  1164 --
 binutils/unwind-ia64.h                        |    32 -
 config.guess                                  |    19 -
 config.rpath                                  |    30 +-
 config.sub                                    |     2 +-
 config/picflag.m4                             |     5 -
 config/tcl.m4                                 |    19 +-
 config/unwind_ipinfo.m4                       |     2 -
 configure                                     |    15 -
 configure.ac                                  |    15 -
 gas/Makefile.am                               |     3 -
 gas/Makefile.in                               |     6 -
 gas/config/obj-coff-seh.c                     |     3 -
 gas/config/tc-ia64.c                          | 11982 ----------------
 gas/config/tc-ia64.h                          |   331 -
 gas/config/te-ia64aix.h                       |    23 -
 gas/configure                                 |   100 +-
 gas/configure.com                             |    16 -
 gas/configure.tgt                             |    10 +-
 gas/doc/as.texi                               |    18 -
 gas/doc/c-ia64.texi                           |   201 -
 gas/testsuite/gas/all/gas.exp                 |     3 -
 gas/testsuite/gas/all/local-label-overflow.d  |     2 +-
 gas/testsuite/gas/elf/bad-bss.d               |     2 +-
 gas/testsuite/gas/elf/bss.d                   |     2 +-
 gas/testsuite/gas/elf/elf.exp                 |     4 -
 gas/testsuite/gas/elf/file.s                  |     3 -
 gas/testsuite/gas/ia64/alias-ilp32.d          |    28 -
 gas/testsuite/gas/ia64/alias.d                |    35 -
 gas/testsuite/gas/ia64/alias.s                |    11 -
 gas/testsuite/gas/ia64/align.d                |     7 -
 gas/testsuite/gas/ia64/align.s                |     3 -
 gas/testsuite/gas/ia64/alloc.l                |    11 -
 gas/testsuite/gas/ia64/alloc.s                |    14 -
 gas/testsuite/gas/ia64/bundling.d             |    14 -
 gas/testsuite/gas/ia64/bundling.s             |    15 -
 gas/testsuite/gas/ia64/dependency-1.d         |    17 -
 gas/testsuite/gas/ia64/dependency-1.s         |     7 -
 gas/testsuite/gas/ia64/dv-branch.d            |    15 -
 gas/testsuite/gas/ia64/dv-branch.s            |    16 -
 gas/testsuite/gas/ia64/dv-entry-err.l         |     3 -
 gas/testsuite/gas/ia64/dv-entry-err.s         |    15 -
 gas/testsuite/gas/ia64/dv-imply.d             |    45 -
 gas/testsuite/gas/ia64/dv-imply.s             |    44 -
 gas/testsuite/gas/ia64/dv-mutex-err.l         |    13 -
 gas/testsuite/gas/ia64/dv-mutex-err.s         |    33 -
 gas/testsuite/gas/ia64/dv-mutex.d             |    39 -
 gas/testsuite/gas/ia64/dv-mutex.s             |    36 -
 gas/testsuite/gas/ia64/dv-raw-err.l           |   309 -
 gas/testsuite/gas/ia64/dv-raw-err.s           |   625 -
 gas/testsuite/gas/ia64/dv-safe.d              |    21 -
 gas/testsuite/gas/ia64/dv-safe.s              |    19 -
 gas/testsuite/gas/ia64/dv-srlz.d              |    24 -
 gas/testsuite/gas/ia64/dv-srlz.s              |    13 -
 gas/testsuite/gas/ia64/dv-war-err.l           |     3 -
 gas/testsuite/gas/ia64/dv-war-err.s           |     9 -
 gas/testsuite/gas/ia64/dv-waw-err.l           |   395 -
 gas/testsuite/gas/ia64/dv-waw-err.s           |   581 -
 gas/testsuite/gas/ia64/fixup-dump.pl          |    12 -
 gas/testsuite/gas/ia64/forward.d              |    15 -
 gas/testsuite/gas/ia64/forward.s              |    27 -
 gas/testsuite/gas/ia64/global.d               |    10 -
 gas/testsuite/gas/ia64/global.s               |     3 -
 gas/testsuite/gas/ia64/group-1.d              |    32 -
 gas/testsuite/gas/ia64/group-1.s              |    10 -
 gas/testsuite/gas/ia64/group-2.d              |    42 -
 gas/testsuite/gas/ia64/group-2.s              |     6 -
 gas/testsuite/gas/ia64/hint.b-err.l           |     3 -
 gas/testsuite/gas/ia64/hint.b-err.s           |     2 -
 gas/testsuite/gas/ia64/hint.b-warn.l          |     3 -
 gas/testsuite/gas/ia64/hint.b-warn.s          |     2 -
 gas/testsuite/gas/ia64/ia64.exp               |   118 -
 gas/testsuite/gas/ia64/index.l                |    42 -
 gas/testsuite/gas/ia64/index.s                |    63 -
 gas/testsuite/gas/ia64/invalid-ar.l           |   125 -
 gas/testsuite/gas/ia64/invalid-ar.s           |   135 -
 gas/testsuite/gas/ia64/label.l                |     3 -
 gas/testsuite/gas/ia64/label.s                |    26 -
 gas/testsuite/gas/ia64/last.l                 |     3 -
 gas/testsuite/gas/ia64/last.s                 |    12 -
 gas/testsuite/gas/ia64/ldxmov-1.d             |    19 -
 gas/testsuite/gas/ia64/ldxmov-1.s             |     8 -
 gas/testsuite/gas/ia64/ldxmov-2.l             |     5 -
 gas/testsuite/gas/ia64/ldxmov-2.s             |     8 -
 gas/testsuite/gas/ia64/ltoff22x-1.d           |    10 -
 gas/testsuite/gas/ia64/ltoff22x-1.s           |     4 -
 gas/testsuite/gas/ia64/ltoff22x-2.d           |    11 -
 gas/testsuite/gas/ia64/ltoff22x-2.s           |    13 -
 gas/testsuite/gas/ia64/ltoff22x-3.d           |    11 -
 gas/testsuite/gas/ia64/ltoff22x-3.s           |    13 -
 gas/testsuite/gas/ia64/ltoff22x-4.d           |    11 -
 gas/testsuite/gas/ia64/ltoff22x-4.s           |    13 -
 gas/testsuite/gas/ia64/ltoff22x-5.d           |    11 -
 gas/testsuite/gas/ia64/ltoff22x-5.s           |    13 -
 gas/testsuite/gas/ia64/mov-ar.d               |    26 -
 gas/testsuite/gas/ia64/mov-ar.s               |    21 -
 gas/testsuite/gas/ia64/no-fit.l               |     8 -
 gas/testsuite/gas/ia64/no-fit.s               |    33 -
 gas/testsuite/gas/ia64/nop_x.d                |    11 -
 gas/testsuite/gas/ia64/nop_x.s                |     6 -
 gas/testsuite/gas/ia64/nostkreg.d             |    16 -
 gas/testsuite/gas/ia64/nostkreg.s             |     9 -
 gas/testsuite/gas/ia64/opc-a-err.l            |    18 -
 gas/testsuite/gas/ia64/opc-a-err.s            |    24 -
 gas/testsuite/gas/ia64/opc-a.d                |   363 -
 gas/testsuite/gas/ia64/opc-a.pl               |   142 -
 gas/testsuite/gas/ia64/opc-a.s                |   396 -
 gas/testsuite/gas/ia64/opc-b.d                |  1021 --
 gas/testsuite/gas/ia64/opc-b.pl               |    95 -
 gas/testsuite/gas/ia64/opc-b.s                |   837 --
 gas/testsuite/gas/ia64/opc-f.d                |  1572 --
 gas/testsuite/gas/ia64/opc-f.pl               |   174 -
 gas/testsuite/gas/ia64/opc-f.s                |   612 -
 gas/testsuite/gas/ia64/opc-i.d                |   312 -
 gas/testsuite/gas/ia64/opc-i.pl               |   189 -
 gas/testsuite/gas/ia64/opc-i.s                |   258 -
 gas/testsuite/gas/ia64/opc-m.d                |  1359 --
 gas/testsuite/gas/ia64/opc-m.pl               |   218 -
 gas/testsuite/gas/ia64/opc-m.s                |  1037 --
 gas/testsuite/gas/ia64/opc-x.d                |    39 -
 gas/testsuite/gas/ia64/opc-x.s                |    19 -
 gas/testsuite/gas/ia64/operand-or.d           |    30 -
 gas/testsuite/gas/ia64/operand-or.s           |    11 -
 gas/testsuite/gas/ia64/operands.l             |     5 -
 gas/testsuite/gas/ia64/operands.s             |     6 -
 gas/testsuite/gas/ia64/order.d                |    36 -
 gas/testsuite/gas/ia64/order.s                |    37 -
 gas/testsuite/gas/ia64/pcrel.d                |    63 -
 gas/testsuite/gas/ia64/pcrel.s                |    87 -
 gas/testsuite/gas/ia64/pound.l                |    58 -
 gas/testsuite/gas/ia64/pound.s                |    43 -
 gas/testsuite/gas/ia64/pr13167.d              |    43 -
 gas/testsuite/gas/ia64/pr13167.s              |     9 -
 gas/testsuite/gas/ia64/pred-rel.s             |    21 -
 gas/testsuite/gas/ia64/proc.l                 |     6 -
 gas/testsuite/gas/ia64/proc.s                 |    13 -
 gas/testsuite/gas/ia64/pseudo.d               |    29 -
 gas/testsuite/gas/ia64/pseudo.s               |    19 -
 gas/testsuite/gas/ia64/psn.d                  |  1467 --
 gas/testsuite/gas/ia64/psn.s                  |  1018 --
 gas/testsuite/gas/ia64/radix.l                |     4 -
 gas/testsuite/gas/ia64/radix.s                |     5 -
 gas/testsuite/gas/ia64/real.d                 |    10 -
 gas/testsuite/gas/ia64/real.s                 |     8 -
 gas/testsuite/gas/ia64/reg-err.l              |    14 -
 gas/testsuite/gas/ia64/reg-err.s              |    14 -
 gas/testsuite/gas/ia64/regs.d                 |  2349 ---
 gas/testsuite/gas/ia64/regs.pl                |   150 -
 gas/testsuite/gas/ia64/regs.s                 |  1020 --
 gas/testsuite/gas/ia64/regval.l               |    17 -
 gas/testsuite/gas/ia64/regval.s               |    48 -
 gas/testsuite/gas/ia64/reloc-bad.l            |    43 -
 gas/testsuite/gas/ia64/reloc-bad.s            |    62 -
 gas/testsuite/gas/ia64/reloc-mlx.d            |     8 -
 gas/testsuite/gas/ia64/reloc-mlx.s            |     7 -
 gas/testsuite/gas/ia64/reloc-uw-ilp32.d       |    15 -
 gas/testsuite/gas/ia64/reloc-uw.d             |    13 -
 gas/testsuite/gas/ia64/reloc-uw.s             |    13 -
 gas/testsuite/gas/ia64/reloc.d                |    64 -
 gas/testsuite/gas/ia64/reloc.s                |    82 -
 gas/testsuite/gas/ia64/rotX.l                 |     5 -
 gas/testsuite/gas/ia64/rotX.s                 |     4 -
 gas/testsuite/gas/ia64/secname-ilp32.d        |    19 -
 gas/testsuite/gas/ia64/secname.d              |    26 -
 gas/testsuite/gas/ia64/secname.s              |     2 -
 gas/testsuite/gas/ia64/slot2.l                |     3 -
 gas/testsuite/gas/ia64/slot2.s                |    18 -
 gas/testsuite/gas/ia64/slotcount.d            |    10 -
 gas/testsuite/gas/ia64/slotcount.s            |    51 -
 gas/testsuite/gas/ia64/strange.d              |    19 -
 gas/testsuite/gas/ia64/strange.s              |    18 -
 gas/testsuite/gas/ia64/tls.d                  |    54 -
 gas/testsuite/gas/ia64/tls.s                  |    64 -
 gas/testsuite/gas/ia64/unwind-bad.l           |    51 -
 gas/testsuite/gas/ia64/unwind-bad.s           |   155 -
 gas/testsuite/gas/ia64/unwind-err.l           |    35 -
 gas/testsuite/gas/ia64/unwind-err.s           |    67 -
 gas/testsuite/gas/ia64/unwind-ilp32.d         |    20 -
 gas/testsuite/gas/ia64/unwind-ok.d            |   224 -
 gas/testsuite/gas/ia64/unwind-ok.s            |   272 -
 gas/testsuite/gas/ia64/unwind.d               |    28 -
 gas/testsuite/gas/ia64/unwind.s               |     4 -
 gas/testsuite/gas/ia64/xdata-ilp32.d          |    29 -
 gas/testsuite/gas/ia64/xdata.d                |    47 -
 gas/testsuite/gas/ia64/xdata.s                |    45 -
 gas/testsuite/gas/lns/lns-common-1-ia64.s     |    18 -
 gas/testsuite/gas/lns/lns.exp                 |     2 -
 gas/testsuite/gas/symver/symver.exp           |     5 -
 gas/write.c                                   |     4 +-
 gnulib/configure                              |     3 +-
 gnulib/import/isnan.c                         |     4 +-
 gnulib/import/m4/isnanl.m4                    |     2 +-
 gnulib/import/m4/stdalign.m4                  |     1 -
 gnulib/import/stdalign.in.h                   |     1 -
 gprof/configure                               |   100 +-
 gprofng/configure                             |   171 +-
 gprofng/libcollector/configure                |   175 +-
 include/coff/ia64.h                           |    89 -
 include/elf/ia64.h                            |   415 -
 include/floatformat.h                         |     3 -
 include/longlong.h                            |    49 -
 include/opcode/ia64.h                         |   428 -
 ld/Makefile.am                                |     3 -
 ld/Makefile.in                                |     6 -
 ld/configure                                  |   171 +-
 ld/configure.tgt                              |    21 +-
 ld/emulparams/elf64_aix.sh                    |    21 -
 ld/emulparams/elf64_ia64.sh                   |    39 -
 ld/emulparams/elf64_ia64_fbsd.sh              |     6 -
 ld/emulparams/elf64_ia64_vms.sh               |     6 -
 ld/emultempl/ia64elf.em                       |    63 -
 ld/emultempl/vms.em                           |    11 -
 ld/ldlex.h                                    |     2 -
 ld/scripttempl/ia64vms.sc                     |   132 -
 ld/testsuite/ld-bootstrap/bootstrap.exp       |     9 +-
 ld/testsuite/ld-checks/checks.exp             |     4 +-
 ld/testsuite/ld-elf/eh-group.exp              |     2 +-
 ld/testsuite/ld-elf/elf.exp                   |     1 -
 ld/testsuite/ld-elf/pr21884.d                 |     2 +-
 ld/testsuite/ld-elf/shared.exp                |     4 +-
 ld/testsuite/ld-elf/stab.d                    |     2 +-
 ld/testsuite/ld-elf/tls.exp                   |     4 +-
 ld/testsuite/ld-elfvers/vers.exp              |     3 -
 ld/testsuite/ld-elfweak/elfweak.exp           |     2 -
 ld/testsuite/ld-ia64/error1.d                 |     5 -
 ld/testsuite/ld-ia64/error1.s                 |    30 -
 ld/testsuite/ld-ia64/error2.d                 |     5 -
 ld/testsuite/ld-ia64/error3.d                 |     5 -
 ld/testsuite/ld-ia64/ia64.exp                 |    65 -
 ld/testsuite/ld-ia64/line.exp                 |    57 -
 ld/testsuite/ld-ia64/link-order.d             |     9 -
 ld/testsuite/ld-ia64/local1.d                 |     9 -
 ld/testsuite/ld-ia64/local1.map               |     6 -
 ld/testsuite/ld-ia64/local1.s                 |    21 -
 ld/testsuite/ld-ia64/merge1.d                 |    10 -
 ld/testsuite/ld-ia64/merge1.s                 |    12 -
 ld/testsuite/ld-ia64/merge2.d                 |    10 -
 ld/testsuite/ld-ia64/merge2.s                 |    12 -
 ld/testsuite/ld-ia64/merge3.d                 |    13 -
 ld/testsuite/ld-ia64/merge3.s                 |    16 -
 ld/testsuite/ld-ia64/merge4.d                 |    13 -
 ld/testsuite/ld-ia64/merge4.s                 |    21 -
 ld/testsuite/ld-ia64/merge5.d                 |    16 -
 ld/testsuite/ld-ia64/merge5.s                 |    24 -
 ld/testsuite/ld-ia64/tlsbin.dd                |    74 -
 ld/testsuite/ld-ia64/tlsbin.rd                |   136 -
 ld/testsuite/ld-ia64/tlsbin.s                 |    54 -
 ld/testsuite/ld-ia64/tlsbin.sd                |    15 -
 ld/testsuite/ld-ia64/tlsbin.td                |    16 -
 ld/testsuite/ld-ia64/tlsbinpic.s              |    97 -
 ld/testsuite/ld-ia64/tlsg.s                   |    14 -
 ld/testsuite/ld-ia64/tlsg.sd                  |    10 -
 ld/testsuite/ld-ia64/tlslib.s                 |    18 -
 ld/testsuite/ld-ia64/tlspic.dd                |    64 -
 ld/testsuite/ld-ia64/tlspic.rd                |   127 -
 ld/testsuite/ld-ia64/tlspic.sd                |    15 -
 ld/testsuite/ld-ia64/tlspic.td                |    16 -
 ld/testsuite/ld-ia64/tlspic1.s                |   114 -
 ld/testsuite/ld-ia64/tlspic2.s                |    11 -
 ld/testsuite/ld-ia64/undefined.s              |   152 -
 ld/testsuite/ld-scripts/fill.d                |     3 +-
 ld/testsuite/ld-shared/shared.exp             |     5 -
 ld/testsuite/ld-srec/srec.exp                 |     4 -
 ld/testsuite/ld-unique/pr21529.d              |     2 +-
 ld/testsuite/ld-vsb/vsb.exp                   |     4 -
 ld/testsuite/lib/ld-lib.exp                   |     1 -
 libbacktrace/configure                        |   106 +-
 libctf/configure                              |   100 +-
 libiberty/configure                           |     5 -
 libiberty/floatformat.c                       |    16 -
 libsframe/configure                           |   100 +-
 libtool.m4                                    |   150 +-
 opcodes/Makefile.am                           |    27 +-
 opcodes/Makefile.in                           |    30 +-
 opcodes/configure                             |   101 +-
 opcodes/configure.ac                          |     1 -
 opcodes/configure.com                         |     8 -
 opcodes/disassemble.c                         |    11 -
 opcodes/disassemble.h                         |     1 -
 opcodes/ia64-asmtab.c                         | 10669 --------------
 opcodes/ia64-asmtab.h                         |   148 -
 opcodes/ia64-dis.c                            |   320 -
 opcodes/ia64-gen.c                            |  2865 ----
 opcodes/ia64-ic.tbl                           |   258 -
 opcodes/ia64-opc-a.c                          |   418 -
 opcodes/ia64-opc-b.c                          |   511 -
 opcodes/ia64-opc-d.c                          |    34 -
 opcodes/ia64-opc-f.c                          |   656 -
 opcodes/ia64-opc-i.c                          |   340 -
 opcodes/ia64-opc-m.c                          |  2235 ---
 opcodes/ia64-opc-x.c                          |   188 -
 opcodes/ia64-opc.c                            |   735 -
 opcodes/ia64-opc.h                            |   138 -
 opcodes/ia64-raw.tbl                          |   199 -
 opcodes/ia64-war.tbl                          |     2 -
 opcodes/ia64-waw.tbl                          |   140 -
 readline/readline/support/config.guess        |    19 -
 readline/readline/support/config.rpath        |    25 +-
 readline/readline/support/config.sub          |     2 +-
 sim/configure                                 |   100 +-
 zlib/configure                                |   100 +-
 zlib/make_vms.com                             |     7 +-
 343 files changed, 213 insertions(+), 72515 deletions(-)
 delete mode 100644 bfd/coff-ia64.c
 delete mode 100644 bfd/cpu-ia64-opc.c
 delete mode 100644 bfd/cpu-ia64.c
 delete mode 100644 bfd/elf64-ia64-vms.c
 delete mode 100644 bfd/elfnn-ia64.c
 delete mode 100644 bfd/elfxx-ia64.c
 delete mode 100644 bfd/elfxx-ia64.h
 delete mode 100644 bfd/pei-ia64.c
 delete mode 100644 binutils/testsuite/binutils-all/testranges-ia64.d
 delete mode 100644 binutils/testsuite/binutils-all/testranges-ia64.s
 delete mode 100644 binutils/unwind-ia64.c
 delete mode 100644 binutils/unwind-ia64.h
 delete mode 100644 gas/config/tc-ia64.c
 delete mode 100644 gas/config/tc-ia64.h
 delete mode 100644 gas/config/te-ia64aix.h
 delete mode 100644 gas/doc/c-ia64.texi
 delete mode 100644 gas/testsuite/gas/ia64/alias-ilp32.d
 delete mode 100644 gas/testsuite/gas/ia64/alias.d
 delete mode 100644 gas/testsuite/gas/ia64/alias.s
 delete mode 100644 gas/testsuite/gas/ia64/align.d
 delete mode 100644 gas/testsuite/gas/ia64/align.s
 delete mode 100644 gas/testsuite/gas/ia64/alloc.l
 delete mode 100644 gas/testsuite/gas/ia64/alloc.s
 delete mode 100644 gas/testsuite/gas/ia64/bundling.d
 delete mode 100644 gas/testsuite/gas/ia64/bundling.s
 delete mode 100644 gas/testsuite/gas/ia64/dependency-1.d
 delete mode 100644 gas/testsuite/gas/ia64/dependency-1.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-branch.d
 delete mode 100644 gas/testsuite/gas/ia64/dv-branch.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-entry-err.l
 delete mode 100644 gas/testsuite/gas/ia64/dv-entry-err.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-imply.d
 delete mode 100644 gas/testsuite/gas/ia64/dv-imply.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-mutex-err.l
 delete mode 100644 gas/testsuite/gas/ia64/dv-mutex-err.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-mutex.d
 delete mode 100644 gas/testsuite/gas/ia64/dv-mutex.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-raw-err.l
 delete mode 100644 gas/testsuite/gas/ia64/dv-raw-err.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-safe.d
 delete mode 100644 gas/testsuite/gas/ia64/dv-safe.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-srlz.d
 delete mode 100644 gas/testsuite/gas/ia64/dv-srlz.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-war-err.l
 delete mode 100644 gas/testsuite/gas/ia64/dv-war-err.s
 delete mode 100644 gas/testsuite/gas/ia64/dv-waw-err.l
 delete mode 100644 gas/testsuite/gas/ia64/dv-waw-err.s
 delete mode 100644 gas/testsuite/gas/ia64/fixup-dump.pl
 delete mode 100644 gas/testsuite/gas/ia64/forward.d
 delete mode 100644 gas/testsuite/gas/ia64/forward.s
 delete mode 100644 gas/testsuite/gas/ia64/global.d
 delete mode 100644 gas/testsuite/gas/ia64/global.s
 delete mode 100644 gas/testsuite/gas/ia64/group-1.d
 delete mode 100644 gas/testsuite/gas/ia64/group-1.s
 delete mode 100644 gas/testsuite/gas/ia64/group-2.d
 delete mode 100644 gas/testsuite/gas/ia64/group-2.s
 delete mode 100644 gas/testsuite/gas/ia64/hint.b-err.l
 delete mode 100644 gas/testsuite/gas/ia64/hint.b-err.s
 delete mode 100644 gas/testsuite/gas/ia64/hint.b-warn.l
 delete mode 100644 gas/testsuite/gas/ia64/hint.b-warn.s
 delete mode 100644 gas/testsuite/gas/ia64/ia64.exp
 delete mode 100644 gas/testsuite/gas/ia64/index.l
 delete mode 100644 gas/testsuite/gas/ia64/index.s
 delete mode 100644 gas/testsuite/gas/ia64/invalid-ar.l
 delete mode 100644 gas/testsuite/gas/ia64/invalid-ar.s
 delete mode 100644 gas/testsuite/gas/ia64/label.l
 delete mode 100644 gas/testsuite/gas/ia64/label.s
 delete mode 100644 gas/testsuite/gas/ia64/last.l
 delete mode 100644 gas/testsuite/gas/ia64/last.s
 delete mode 100644 gas/testsuite/gas/ia64/ldxmov-1.d
 delete mode 100644 gas/testsuite/gas/ia64/ldxmov-1.s
 delete mode 100644 gas/testsuite/gas/ia64/ldxmov-2.l
 delete mode 100644 gas/testsuite/gas/ia64/ldxmov-2.s
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-1.d
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-1.s
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-2.d
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-2.s
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-3.d
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-3.s
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-4.d
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-4.s
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-5.d
 delete mode 100644 gas/testsuite/gas/ia64/ltoff22x-5.s
 delete mode 100644 gas/testsuite/gas/ia64/mov-ar.d
 delete mode 100644 gas/testsuite/gas/ia64/mov-ar.s
 delete mode 100644 gas/testsuite/gas/ia64/no-fit.l
 delete mode 100644 gas/testsuite/gas/ia64/no-fit.s
 delete mode 100644 gas/testsuite/gas/ia64/nop_x.d
 delete mode 100644 gas/testsuite/gas/ia64/nop_x.s
 delete mode 100644 gas/testsuite/gas/ia64/nostkreg.d
 delete mode 100644 gas/testsuite/gas/ia64/nostkreg.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-a-err.l
 delete mode 100644 gas/testsuite/gas/ia64/opc-a-err.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-a.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-a.pl
 delete mode 100644 gas/testsuite/gas/ia64/opc-a.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-b.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-b.pl
 delete mode 100644 gas/testsuite/gas/ia64/opc-b.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-f.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-f.pl
 delete mode 100644 gas/testsuite/gas/ia64/opc-f.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-i.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-i.pl
 delete mode 100644 gas/testsuite/gas/ia64/opc-i.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-m.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-m.pl
 delete mode 100644 gas/testsuite/gas/ia64/opc-m.s
 delete mode 100644 gas/testsuite/gas/ia64/opc-x.d
 delete mode 100644 gas/testsuite/gas/ia64/opc-x.s
 delete mode 100644 gas/testsuite/gas/ia64/operand-or.d
 delete mode 100644 gas/testsuite/gas/ia64/operand-or.s
 delete mode 100644 gas/testsuite/gas/ia64/operands.l
 delete mode 100644 gas/testsuite/gas/ia64/operands.s
 delete mode 100644 gas/testsuite/gas/ia64/order.d
 delete mode 100644 gas/testsuite/gas/ia64/order.s
 delete mode 100644 gas/testsuite/gas/ia64/pcrel.d
 delete mode 100644 gas/testsuite/gas/ia64/pcrel.s
 delete mode 100644 gas/testsuite/gas/ia64/pound.l
 delete mode 100644 gas/testsuite/gas/ia64/pound.s
 delete mode 100644 gas/testsuite/gas/ia64/pr13167.d
 delete mode 100644 gas/testsuite/gas/ia64/pr13167.s
 delete mode 100644 gas/testsuite/gas/ia64/pred-rel.s
 delete mode 100644 gas/testsuite/gas/ia64/proc.l
 delete mode 100644 gas/testsuite/gas/ia64/proc.s
 delete mode 100644 gas/testsuite/gas/ia64/pseudo.d
 delete mode 100644 gas/testsuite/gas/ia64/pseudo.s
 delete mode 100644 gas/testsuite/gas/ia64/psn.d
 delete mode 100644 gas/testsuite/gas/ia64/psn.s
 delete mode 100644 gas/testsuite/gas/ia64/radix.l
 delete mode 100644 gas/testsuite/gas/ia64/radix.s
 delete mode 100644 gas/testsuite/gas/ia64/real.d
 delete mode 100644 gas/testsuite/gas/ia64/real.s
 delete mode 100644 gas/testsuite/gas/ia64/reg-err.l
 delete mode 100644 gas/testsuite/gas/ia64/reg-err.s
 delete mode 100644 gas/testsuite/gas/ia64/regs.d
 delete mode 100644 gas/testsuite/gas/ia64/regs.pl
 delete mode 100644 gas/testsuite/gas/ia64/regs.s
 delete mode 100644 gas/testsuite/gas/ia64/regval.l
 delete mode 100644 gas/testsuite/gas/ia64/regval.s
 delete mode 100644 gas/testsuite/gas/ia64/reloc-bad.l
 delete mode 100644 gas/testsuite/gas/ia64/reloc-bad.s
 delete mode 100644 gas/testsuite/gas/ia64/reloc-mlx.d
 delete mode 100644 gas/testsuite/gas/ia64/reloc-mlx.s
 delete mode 100644 gas/testsuite/gas/ia64/reloc-uw-ilp32.d
 delete mode 100644 gas/testsuite/gas/ia64/reloc-uw.d
 delete mode 100644 gas/testsuite/gas/ia64/reloc-uw.s
 delete mode 100644 gas/testsuite/gas/ia64/reloc.d
 delete mode 100644 gas/testsuite/gas/ia64/reloc.s
 delete mode 100644 gas/testsuite/gas/ia64/rotX.l
 delete mode 100644 gas/testsuite/gas/ia64/rotX.s
 delete mode 100644 gas/testsuite/gas/ia64/secname-ilp32.d
 delete mode 100644 gas/testsuite/gas/ia64/secname.d
 delete mode 100644 gas/testsuite/gas/ia64/secname.s
 delete mode 100644 gas/testsuite/gas/ia64/slot2.l
 delete mode 100644 gas/testsuite/gas/ia64/slot2.s
 delete mode 100644 gas/testsuite/gas/ia64/slotcount.d
 delete mode 100644 gas/testsuite/gas/ia64/slotcount.s
 delete mode 100644 gas/testsuite/gas/ia64/strange.d
 delete mode 100644 gas/testsuite/gas/ia64/strange.s
 delete mode 100644 gas/testsuite/gas/ia64/tls.d
 delete mode 100644 gas/testsuite/gas/ia64/tls.s
 delete mode 100644 gas/testsuite/gas/ia64/unwind-bad.l
 delete mode 100644 gas/testsuite/gas/ia64/unwind-bad.s
 delete mode 100644 gas/testsuite/gas/ia64/unwind-err.l
 delete mode 100644 gas/testsuite/gas/ia64/unwind-err.s
 delete mode 100644 gas/testsuite/gas/ia64/unwind-ilp32.d
 delete mode 100644 gas/testsuite/gas/ia64/unwind-ok.d
 delete mode 100644 gas/testsuite/gas/ia64/unwind-ok.s
 delete mode 100644 gas/testsuite/gas/ia64/unwind.d
 delete mode 100644 gas/testsuite/gas/ia64/unwind.s
 delete mode 100644 gas/testsuite/gas/ia64/xdata-ilp32.d
 delete mode 100644 gas/testsuite/gas/ia64/xdata.d
 delete mode 100644 gas/testsuite/gas/ia64/xdata.s
 delete mode 100644 gas/testsuite/gas/lns/lns-common-1-ia64.s
 delete mode 100644 include/coff/ia64.h
 delete mode 100644 include/elf/ia64.h
 delete mode 100644 include/opcode/ia64.h
 delete mode 100644 ld/emulparams/elf64_aix.sh
 delete mode 100644 ld/emulparams/elf64_ia64.sh
 delete mode 100644 ld/emulparams/elf64_ia64_fbsd.sh
 delete mode 100644 ld/emulparams/elf64_ia64_vms.sh
 delete mode 100644 ld/emultempl/ia64elf.em
 delete mode 100644 ld/scripttempl/ia64vms.sc
 delete mode 100644 ld/testsuite/ld-ia64/error1.d
 delete mode 100644 ld/testsuite/ld-ia64/error1.s
 delete mode 100644 ld/testsuite/ld-ia64/error2.d
 delete mode 100644 ld/testsuite/ld-ia64/error3.d
 delete mode 100644 ld/testsuite/ld-ia64/ia64.exp
 delete mode 100644 ld/testsuite/ld-ia64/line.exp
 delete mode 100644 ld/testsuite/ld-ia64/link-order.d
 delete mode 100644 ld/testsuite/ld-ia64/local1.d
 delete mode 100644 ld/testsuite/ld-ia64/local1.map
 delete mode 100644 ld/testsuite/ld-ia64/local1.s
 delete mode 100644 ld/testsuite/ld-ia64/merge1.d
 delete mode 100644 ld/testsuite/ld-ia64/merge1.s
 delete mode 100644 ld/testsuite/ld-ia64/merge2.d
 delete mode 100644 ld/testsuite/ld-ia64/merge2.s
 delete mode 100644 ld/testsuite/ld-ia64/merge3.d
 delete mode 100644 ld/testsuite/ld-ia64/merge3.s
 delete mode 100644 ld/testsuite/ld-ia64/merge4.d
 delete mode 100644 ld/testsuite/ld-ia64/merge4.s
 delete mode 100644 ld/testsuite/ld-ia64/merge5.d
 delete mode 100644 ld/testsuite/ld-ia64/merge5.s
 delete mode 100644 ld/testsuite/ld-ia64/tlsbin.dd
 delete mode 100644 ld/testsuite/ld-ia64/tlsbin.rd
 delete mode 100644 ld/testsuite/ld-ia64/tlsbin.s
 delete mode 100644 ld/testsuite/ld-ia64/tlsbin.sd
 delete mode 100644 ld/testsuite/ld-ia64/tlsbin.td
 delete mode 100644 ld/testsuite/ld-ia64/tlsbinpic.s
 delete mode 100644 ld/testsuite/ld-ia64/tlsg.s
 delete mode 100644 ld/testsuite/ld-ia64/tlsg.sd
 delete mode 100644 ld/testsuite/ld-ia64/tlslib.s
 delete mode 100644 ld/testsuite/ld-ia64/tlspic.dd
 delete mode 100644 ld/testsuite/ld-ia64/tlspic.rd
 delete mode 100644 ld/testsuite/ld-ia64/tlspic.sd
 delete mode 100644 ld/testsuite/ld-ia64/tlspic.td
 delete mode 100644 ld/testsuite/ld-ia64/tlspic1.s
 delete mode 100644 ld/testsuite/ld-ia64/tlspic2.s
 delete mode 100644 ld/testsuite/ld-ia64/undefined.s
 delete mode 100644 opcodes/ia64-asmtab.c
 delete mode 100644 opcodes/ia64-asmtab.h
 delete mode 100644 opcodes/ia64-dis.c
 delete mode 100644 opcodes/ia64-gen.c
 delete mode 100644 opcodes/ia64-ic.tbl
 delete mode 100644 opcodes/ia64-opc-a.c
 delete mode 100644 opcodes/ia64-opc-b.c
 delete mode 100644 opcodes/ia64-opc-d.c
 delete mode 100644 opcodes/ia64-opc-f.c
 delete mode 100644 opcodes/ia64-opc-i.c
 delete mode 100644 opcodes/ia64-opc-m.c
 delete mode 100644 opcodes/ia64-opc-x.c
 delete mode 100644 opcodes/ia64-opc.c
 delete mode 100644 opcodes/ia64-opc.h
 delete mode 100644 opcodes/ia64-raw.tbl
 delete mode 100644 opcodes/ia64-war.tbl
 delete mode 100644 opcodes/ia64-waw.tbl
  

Patch

diff --git a/bfd/.gitignore b/bfd/.gitignore
index ba2aea70156..d091ef76068 100644
--- a/bfd/.gitignore
+++ b/bfd/.gitignore
@@ -1,9 +1,7 @@ 
 /bfd-in3.h
 /bfd.h
 /bfdver.h
-/elf32-ia64.c
 /elf32-target.h
-/elf64-ia64.c
 /elf64-target.h
 /libtool-soversion
 /ofiles
diff --git a/bfd/Makefile.am b/bfd/Makefile.am
index 0dc733eaba9..fbde3be930a 100644
--- a/bfd/Makefile.am
+++ b/bfd/Makefile.am
@@ -117,7 +117,6 @@  ALL_MACHINES = \
 	cpu-h8300.lo \
 	cpu-hppa.lo \
 	cpu-i386.lo \
-	cpu-ia64.lo \
 	cpu-iamcu.lo \
 	cpu-ip2k.lo \
 	cpu-iq2000.lo \
@@ -201,7 +200,6 @@  ALL_MACHINES_CFILES = \
 	cpu-h8300.c \
 	cpu-hppa.c \
 	cpu-i386.c \
-	cpu-ia64.c \
 	cpu-iamcu.c \
 	cpu-ip2k.c \
 	cpu-iq2000.c \
@@ -536,8 +534,6 @@  BFD32_BACKENDS_CFILES = \
 # The .o files needed by all of the 64 bit vectors that are configured into
 # target_vector in targets.c if configured with --enable-targets=all
 # and --enable-64-bit-bfd.
-# elf32-ia64.c requires a 64-bit bfd_vma, and hence can not be put in
-# BFD32_BACKENDS.
 BFD64_BACKENDS = \
 	aix5ppc-core.lo \
 	aout64.lo \
@@ -545,7 +541,6 @@  BFD64_BACKENDS = \
 	coff-x86_64.lo \
 	coff64-rs6000.lo \
 	elf32-aarch64.lo \
-	elf32-ia64.lo \
 	elf32-kvx.lo \
 	elf32-loongarch.lo \
 	elf32-mips.lo \
@@ -558,8 +553,6 @@  BFD64_BACKENDS = \
 	elf64-bpf.lo \
 	elf64-gen.lo \
 	elf64-hppa.lo \
-	elf64-ia64-vms.lo \
-	elf64-ia64.lo \
 	elf64-kvx.lo \
 	elf64-loongarch.lo \
 	elf64-mips.lo \
@@ -574,7 +567,6 @@  BFD64_BACKENDS = \
 	elf64.lo \
 	elfn32-mips.lo \
 	elfxx-aarch64.lo \
-	elfxx-ia64.lo \
 	elfxx-kvx.lo \
 	elfxx-loongarch.lo \
 	elfxx-mips.lo \
@@ -589,7 +581,6 @@  BFD64_BACKENDS = \
 	pe-riscv64igen.lo \
 	pe-x86_64.lo \
 	pei-aarch64.lo \
-	pei-ia64.lo \
 	pei-loongarch64.lo \
 	pei-riscv64.lo \
 	pei-x86_64.lo \
@@ -611,7 +602,6 @@  BFD64_BACKENDS_CFILES = \
 	elf64-bpf.c \
 	elf64-gen.c \
 	elf64-hppa.c \
-	elf64-ia64-vms.c \
 	elf64-mips.c \
 	elf64-mmix.c \
 	elf64-nfp.c \
@@ -623,7 +613,6 @@  BFD64_BACKENDS_CFILES = \
 	elf64.c \
 	elfn32-mips.c \
 	elfxx-aarch64.c \
-	elfxx-ia64.c \
 	elfxx-kvx.c \
 	elfxx-loongarch.c \
 	elfxx-mips.c \
@@ -635,7 +624,6 @@  BFD64_BACKENDS_CFILES = \
 	pe-aarch64.c \
 	pe-x86_64.c \
 	pei-aarch64.c \
-	pei-ia64.c \
 	pei-loongarch64.c \
 	pei-riscv64.c \
 	pei-x86_64.c \
@@ -691,7 +679,6 @@  SOURCE_CFILES = \
 BUILD_CFILES = \
 	elf32-aarch64.c elf64-aarch64.c \
 	elf32-kvx.c elf64-kvx.c \
-	elf32-ia64.c elf64-ia64.c \
 	elf32-loongarch.c elf64-loongarch.c \
 	elf32-riscv.c elf64-riscv.c \
 	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c \
@@ -714,7 +701,7 @@  SOURCE_HFILES = \
 	elf64-hppa.h elf64-ppc.h elf64-tilegx.h \
 	elf-bfd.h elfcode.h elfcore.h elf-hppa.h elf-linker-x86.h \
 	elf-linux-core.h elf-nacl.h elf-s390.h elf-vxworks.h \
-	elfxx-aarch64.h elfxx-ia64.h elfxx-mips.h elfxx-riscv.h \
+	elfxx-aarch64.h elfxx-mips.h elfxx-riscv.h \
 	elfxx-sparc.h elfxx-tilegx.h elfxx-x86.h elfxx-loongarch.h \
 	genlink.h go32stub.h \
 	libaout.h libbfd.h libcoff.h libecoff.h libhppa.h \
@@ -853,14 +840,6 @@  elf64-aarch64.c : elfnn-aarch64.c
 	$(AM_V_at)echo "#line 1 \"$<\"" > $@
 	$(AM_V_GEN)$(SED) -e s/NN/64/g < $< >> $@
 
-elf32-ia64.c : elfnn-ia64.c
-	$(AM_V_at)echo "#line 1 \"$<\"" > $@
-	$(AM_V_GEN)$(SED) -e s/NN/32/g < $< >> $@
-
-elf64-ia64.c : elfnn-ia64.c
-	$(AM_V_at)echo "#line 1 \"$<\"" > $@
-	$(AM_V_GEN)$(SED) -e s/NN/64/g < $< >> $@
-
 elf32-kvx.c : elfnn-kvx.c
 	$(AM_V_at)echo "#line 1 \"$<\"" > $@
 	$(AM_V_GEN)$(SED) -e s/NN/32/g < $< >> $@
diff --git a/bfd/Makefile.in b/bfd/Makefile.in
index b3d97d478ea..543a4c567aa 100644
--- a/bfd/Makefile.in
+++ b/bfd/Makefile.in
@@ -583,7 +583,6 @@  ALL_MACHINES = \
 	cpu-h8300.lo \
 	cpu-hppa.lo \
 	cpu-i386.lo \
-	cpu-ia64.lo \
 	cpu-iamcu.lo \
 	cpu-ip2k.lo \
 	cpu-iq2000.lo \
@@ -667,7 +666,6 @@  ALL_MACHINES_CFILES = \
 	cpu-h8300.c \
 	cpu-hppa.c \
 	cpu-i386.c \
-	cpu-ia64.c \
 	cpu-iamcu.c \
 	cpu-ip2k.c \
 	cpu-iq2000.c \
@@ -1004,8 +1002,6 @@  BFD32_BACKENDS_CFILES = \
 # The .o files needed by all of the 64 bit vectors that are configured into
 # target_vector in targets.c if configured with --enable-targets=all
 # and --enable-64-bit-bfd.
-# elf32-ia64.c requires a 64-bit bfd_vma, and hence can not be put in
-# BFD32_BACKENDS.
 BFD64_BACKENDS = \
 	aix5ppc-core.lo \
 	aout64.lo \
@@ -1013,7 +1009,6 @@  BFD64_BACKENDS = \
 	coff-x86_64.lo \
 	coff64-rs6000.lo \
 	elf32-aarch64.lo \
-	elf32-ia64.lo \
 	elf32-kvx.lo \
 	elf32-loongarch.lo \
 	elf32-mips.lo \
@@ -1026,8 +1021,6 @@  BFD64_BACKENDS = \
 	elf64-bpf.lo \
 	elf64-gen.lo \
 	elf64-hppa.lo \
-	elf64-ia64-vms.lo \
-	elf64-ia64.lo \
 	elf64-kvx.lo \
 	elf64-loongarch.lo \
 	elf64-mips.lo \
@@ -1042,7 +1035,6 @@  BFD64_BACKENDS = \
 	elf64.lo \
 	elfn32-mips.lo \
 	elfxx-aarch64.lo \
-	elfxx-ia64.lo \
 	elfxx-kvx.lo \
 	elfxx-loongarch.lo \
 	elfxx-mips.lo \
@@ -1057,7 +1049,6 @@  BFD64_BACKENDS = \
 	pe-riscv64igen.lo \
 	pe-x86_64.lo \
 	pei-aarch64.lo \
-	pei-ia64.lo \
 	pei-loongarch64.lo \
 	pei-riscv64.lo \
 	pei-x86_64.lo \
@@ -1079,7 +1070,6 @@  BFD64_BACKENDS_CFILES = \
 	elf64-bpf.c \
 	elf64-gen.c \
 	elf64-hppa.c \
-	elf64-ia64-vms.c \
 	elf64-mips.c \
 	elf64-mmix.c \
 	elf64-nfp.c \
@@ -1091,7 +1081,6 @@  BFD64_BACKENDS_CFILES = \
 	elf64.c \
 	elfn32-mips.c \
 	elfxx-aarch64.c \
-	elfxx-ia64.c \
 	elfxx-kvx.c \
 	elfxx-loongarch.c \
 	elfxx-mips.c \
@@ -1103,7 +1092,6 @@  BFD64_BACKENDS_CFILES = \
 	pe-aarch64.c \
 	pe-x86_64.c \
 	pei-aarch64.c \
-	pei-ia64.c \
 	pei-loongarch64.c \
 	pei-riscv64.c \
 	pei-x86_64.c \
@@ -1158,7 +1146,6 @@  SOURCE_CFILES = \
 BUILD_CFILES = \
 	elf32-aarch64.c elf64-aarch64.c \
 	elf32-kvx.c elf64-kvx.c \
-	elf32-ia64.c elf64-ia64.c \
 	elf32-loongarch.c elf64-loongarch.c \
 	elf32-riscv.c elf64-riscv.c \
 	peigen.c pepigen.c pex64igen.c pe-aarch64igen.c pe-loongarch64igen.c \
@@ -1178,7 +1165,7 @@  SOURCE_HFILES = \
 	elf64-hppa.h elf64-ppc.h elf64-tilegx.h \
 	elf-bfd.h elfcode.h elfcore.h elf-hppa.h elf-linker-x86.h \
 	elf-linux-core.h elf-nacl.h elf-s390.h elf-vxworks.h \
-	elfxx-aarch64.h elfxx-ia64.h elfxx-mips.h elfxx-riscv.h \
+	elfxx-aarch64.h elfxx-mips.h elfxx-riscv.h \
 	elfxx-sparc.h elfxx-tilegx.h elfxx-x86.h elfxx-loongarch.h \
 	genlink.h go32stub.h \
 	libaout.h libbfd.h libcoff.h libecoff.h libhppa.h \
@@ -1497,7 +1484,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-h8300.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-hppa.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-i386.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-iamcu.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-ip2k.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cpu-iq2000.Plo@am__quote@
@@ -1593,7 +1579,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-h8300.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-hppa.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-i386.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-ip2k.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-iq2000.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf32-kvx.Plo@am__quote@
@@ -1647,8 +1632,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-bpf.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-gen.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-hppa.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ia64-vms.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-kvx.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-loongarch.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elf64-mips.Plo@am__quote@
@@ -1664,7 +1647,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elflink.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfn32-mips.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-aarch64.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-kvx.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-loongarch.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/elfxx-mips.Plo@am__quote@
@@ -1713,7 +1695,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-arm-wince.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-arm.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-i386.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-ia64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-loongarch64.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-mcore.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pei-riscv64.Plo@am__quote@
@@ -2364,14 +2345,6 @@  elf64-aarch64.c : elfnn-aarch64.c
 	$(AM_V_at)echo "#line 1 \"$<\"" > $@
 	$(AM_V_GEN)$(SED) -e s/NN/64/g < $< >> $@
 
-elf32-ia64.c : elfnn-ia64.c
-	$(AM_V_at)echo "#line 1 \"$<\"" > $@
-	$(AM_V_GEN)$(SED) -e s/NN/32/g < $< >> $@
-
-elf64-ia64.c : elfnn-ia64.c
-	$(AM_V_at)echo "#line 1 \"$<\"" > $@
-	$(AM_V_GEN)$(SED) -e s/NN/64/g < $< >> $@
-
 elf32-kvx.c : elfnn-kvx.c
 	$(AM_V_at)echo "#line 1 \"$<\"" > $@
 	$(AM_V_GEN)$(SED) -e s/NN/32/g < $< >> $@
diff --git a/bfd/archures.c b/bfd/archures.c
index 94118b8d2cf..f7e5e6d6867 100644
--- a/bfd/archures.c
+++ b/bfd/archures.c
@@ -396,9 +396,6 @@  DESCRIPTION
 .#define bfd_mach_mep_c5	0x6335
 .  bfd_arch_metag,
 .#define bfd_mach_metag		1
-.  bfd_arch_ia64,      {* HP/Intel ia64.  *}
-.#define bfd_mach_ia64_elf64	64
-.#define bfd_mach_ia64_elf32	32
 .  bfd_arch_ip2k,      {* Ubicom IP2K microcontrollers. *}
 .#define bfd_mach_ip2022	1
 .#define bfd_mach_ip2022ext	2
@@ -653,7 +650,6 @@  extern const bfd_arch_info_type bfd_h8300_arch;
 extern const bfd_arch_info_type bfd_hppa_arch;
 extern const bfd_arch_info_type bfd_i386_arch;
 extern const bfd_arch_info_type bfd_iamcu_arch;
-extern const bfd_arch_info_type bfd_ia64_arch;
 extern const bfd_arch_info_type bfd_ip2k_arch;
 extern const bfd_arch_info_type bfd_iq2000_arch;
 extern const bfd_arch_info_type bfd_kvx_arch;
@@ -742,7 +738,6 @@  static const bfd_arch_info_type * const bfd_archures_list[] =
     &bfd_hppa_arch,
     &bfd_i386_arch,
     &bfd_iamcu_arch,
-    &bfd_ia64_arch,
     &bfd_ip2k_arch,
     &bfd_iq2000_arch,
     &bfd_kvx_arch,
diff --git a/bfd/bfd-in2.h b/bfd/bfd-in2.h
index e3b5a8b8522..1a997a043df 100644
--- a/bfd/bfd-in2.h
+++ b/bfd/bfd-in2.h
@@ -1657,9 +1657,6 @@  enum bfd_architecture
 #define bfd_mach_mep_c5        0x6335
   bfd_arch_metag,
 #define bfd_mach_metag         1
-  bfd_arch_ia64,      /* HP/Intel ia64.  */
-#define bfd_mach_ia64_elf64    64
-#define bfd_mach_ia64_elf32    32
   bfd_arch_ip2k,      /* Ubicom IP2K microcontrollers. */
 #define bfd_mach_ip2022        1
 #define bfd_mach_ip2022ext     2
diff --git a/bfd/coff-ia64.c b/bfd/coff-ia64.c
deleted file mode 100644
index c579bfdfe16..00000000000
--- a/bfd/coff-ia64.c
+++ /dev/null
@@ -1,214 +0,0 @@ 
-/* BFD back-end for HP/Intel IA-64 COFF files.
-   Copyright (C) 1999-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-#include "coff/ia64.h"
-#include "coff/internal.h"
-#include "coff/pe.h"
-#include "libcoff.h"
-
-#define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
-
-/* Windows ia64 uses 8K page size.  */
-#define COFF_PAGE_SIZE 0x2000
-
-static reloc_howto_type howto_table[] =
-{
-  EMPTY_HOWTO (0),
-};
-
-#define BADMAG(x) IA64BADMAG(x)
-#define IA64 1			/* Customize coffcode.h */
-
-#ifdef COFF_WITH_pep
-# undef AOUTSZ
-# define AOUTSZ		PEPAOUTSZ
-# define PEAOUTHDR	PEPAOUTHDR
-#endif
-
-#define RTYPE2HOWTO(cache_ptr, dst) \
-  (cache_ptr)->howto = howto_table;
-
-#ifdef COFF_WITH_PE
-/* Return TRUE if this relocation should
-   appear in the output .reloc section.  */
-
-static bool
-in_reloc_p (bfd * abfd ATTRIBUTE_UNUSED,
-	    reloc_howto_type *howto ATTRIBUTE_UNUSED)
-{
-  return false;			/* We don't do relocs for now...  */
-}
-#endif
-
-#ifndef bfd_pe_print_pdata
-#define bfd_pe_print_pdata	NULL
-#endif
-
-#include "coffcode.h"
-
-static bfd_cleanup
-ia64coff_object_p (bfd *abfd)
-{
-#ifdef COFF_IMAGE_WITH_PE
-  {
-    struct external_DOS_hdr dos_hdr;
-    struct external_PEI_IMAGE_hdr image_hdr;
-    file_ptr offset;
-
-    if (bfd_seek (abfd, 0, SEEK_SET) != 0
-	|| (bfd_read (&dos_hdr, sizeof (dos_hdr), abfd) != sizeof (dos_hdr)))
-      {
-	if (bfd_get_error () != bfd_error_system_call)
-	  bfd_set_error (bfd_error_wrong_format);
-	return NULL;
-      }
-
-    /* There are really two magic numbers involved; the magic number
-       that says this is a NT executable (PEI) and the magic number
-       that determines the architecture.  The former is IMAGE_DOS_SIGNATURE,
-       stored in the e_magic field.  The latter is stored in the
-       f_magic field.  If the NT magic number isn't valid, the
-       architecture magic number could be mimicked by some other
-       field (specifically, the number of relocs in section 3).  Since
-       this routine can only be called correctly for a PEI file, check
-       the e_magic number here, and, if it doesn't match, clobber the
-       f_magic number so that we don't get a false match.  */
-    if (H_GET_16 (abfd, dos_hdr.e_magic) != IMAGE_DOS_SIGNATURE)
-      {
-	bfd_set_error (bfd_error_wrong_format);
-	return NULL;
-      }
-
-    offset = H_GET_32 (abfd, dos_hdr.e_lfanew);
-    if (bfd_seek (abfd, offset, SEEK_SET) != 0
-	|| (bfd_read (&image_hdr, sizeof (image_hdr), abfd)
-	    != sizeof (image_hdr)))
-      {
-	if (bfd_get_error () != bfd_error_system_call)
-	  bfd_set_error (bfd_error_wrong_format);
-	return NULL;
-      }
-
-    if (H_GET_32 (abfd, image_hdr.nt_signature)
-	!= 0x4550)
-      {
-	bfd_set_error (bfd_error_wrong_format);
-	return NULL;
-      }
-
-    /* Here is the hack.  coff_object_p wants to read filhsz bytes to
-       pick up the COFF header for PE, see "struct external_PEI_filehdr"
-       in include/coff/pe.h.  We adjust so that that will work. */
-    if (bfd_seek (abfd, offset - sizeof (dos_hdr), SEEK_SET) != 0)
-      {
-	if (bfd_get_error () != bfd_error_system_call)
-	  bfd_set_error (bfd_error_wrong_format);
-	return NULL;
-      }
-  }
-#endif
-
-  return coff_object_p (abfd);
-}
-
-const bfd_target
-#ifdef TARGET_SYM
-  TARGET_SYM =
-#else
-  ia64coff_vec =
-#endif
-{
-#ifdef TARGET_NAME
-  TARGET_NAME,
-#else
-  "coff-ia64",			/* name */
-#endif
-  bfd_target_coff_flavour,
-  BFD_ENDIAN_LITTLE,		/* data byte order is little */
-  BFD_ENDIAN_LITTLE,		/* header byte order is little */
-
-  (HAS_RELOC | EXEC_P		/* object flags */
-   | HAS_LINENO | HAS_DEBUG
-   | HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
-
-#ifndef COFF_WITH_PE
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
-   | SEC_CODE | SEC_DATA),
-#else
-  (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
-   | SEC_CODE | SEC_DATA
-   | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
-#endif
-
-#ifdef TARGET_UNDERSCORE
-  TARGET_UNDERSCORE,		/* leading underscore */
-#else
-  0,				/* leading underscore */
-#endif
-  '/',				/* ar_pad_char */
-  15,				/* ar_max_namelen */
-  0,				/* match priority.  */
-  TARGET_KEEP_UNUSED_SECTION_SYMBOLS, /* keep unused section symbols.  */
-
-  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
-  bfd_getl64, bfd_getl_signed_64, bfd_putl64,
-     bfd_getl32, bfd_getl_signed_32, bfd_putl32,
-     bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
-
-/* Note that we allow an object file to be treated as a core file as well.  */
-  {				/* bfd_check_format */
-    _bfd_dummy_target,
-    ia64coff_object_p,
-    bfd_generic_archive_p,
-    ia64coff_object_p
-  },
-  {				/* bfd_set_format */
-    _bfd_bool_bfd_false_error,
-    coff_mkobject,
-    _bfd_generic_mkarchive,
-    _bfd_bool_bfd_false_error
-  },
-  {				/* bfd_write_contents */
-    _bfd_bool_bfd_false_error,
-    coff_write_object_contents,
-    _bfd_write_archive_contents,
-    _bfd_bool_bfd_false_error
-  },
-
-  BFD_JUMP_TABLE_GENERIC (coff),
-  BFD_JUMP_TABLE_COPY (coff),
-  BFD_JUMP_TABLE_CORE (_bfd_nocore),
-  BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
-  BFD_JUMP_TABLE_SYMBOLS (coff),
-  BFD_JUMP_TABLE_RELOCS (coff),
-  BFD_JUMP_TABLE_WRITE (coff),
-  BFD_JUMP_TABLE_LINK (coff),
-  BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
-
-  NULL,
-
-  COFF_SWAP_TABLE
-};
diff --git a/bfd/coffcode.h b/bfd/coffcode.h
index ebf4f513fde..3cce4950c9e 100644
--- a/bfd/coffcode.h
+++ b/bfd/coffcode.h
@@ -2191,11 +2191,6 @@  coff_set_arch_mach_hook (bfd *abfd, void * filehdr)
       machine = bfd_mach_x86_64;
       break;
 #endif
-#ifdef IA64MAGIC
-    case IA64MAGIC:
-      arch = bfd_arch_ia64;
-      break;
-#endif
 #ifdef ARMMAGIC
     case ARMMAGIC:
     case ARMPEMAGIC:
@@ -2872,12 +2867,6 @@  coff_set_flags (bfd * abfd,
       return true;
 #endif
 
-#ifdef IA64MAGIC
-    case bfd_arch_ia64:
-      *magicp = IA64MAGIC;
-      return true;
-#endif
-
 #ifdef SH_ARCH_MAGIC_BIG
     case bfd_arch_sh:
 #ifdef COFF_IMAGE_WITH_PE
diff --git a/bfd/config.bfd b/bfd/config.bfd
index 6553aac1e99..ba3777a58ee 100644
--- a/bfd/config.bfd
+++ b/bfd/config.bfd
@@ -332,21 +332,6 @@  case "${targ}" in
     targ_defvec=amdgcn_elf64_le_vec
     want64=true
     ;;
-  ia64*-*-freebsd* | ia64*-*-netbsd* | ia64*-*-linux-* | ia64*-*-elf* | ia64*-*-kfreebsd*-gnu)
-    targ_defvec=ia64_elf64_le_vec
-    targ_selvecs="ia64_elf64_be_vec ia64_pei_vec"
-    want64=true
-    ;;
-  ia64*-*-hpux*)
-    targ_defvec=ia64_elf32_hpux_be_vec
-    targ_selvecs="ia64_elf64_hpux_be_vec"
-    want64=true
-    ;;
-  ia64*-*-*vms*)
-    targ_defvec=ia64_elf64_vms_vec
-    targ_selvecs=alpha_vms_lib_txt_vec
-    want64=true
-    ;;
 #endif /* BFD64 */
 
   am33_2.0-*-linux*)
diff --git a/bfd/configure b/bfd/configure
index 89fe4388171..13f374bd88a 100755
--- a/bfd/configure
+++ b/bfd/configure
@@ -6073,10 +6073,6 @@  haiku*)
 hpux10.20* | hpux11*)
   lt_cv_file_magic_cmd=/usr/bin/file
   case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
   hppa*64*)
     lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
     lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
@@ -6635,11 +6631,6 @@  aix*)
 cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
 irix* | nonstopux*)
   symcode='[BCDEGRST]'
   ;;
@@ -6670,7 +6661,7 @@  case `$NM -V 2>&1` in
 esac
 
 # Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
+# Some systems link data and code symbols differently,
 # so use this general approach.
 lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
@@ -6870,25 +6861,6 @@  test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
 *-*-irix6*)
   # Find out which ABI we are using.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
@@ -8192,10 +8164,6 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
       lt_prog_compiler_pic='-fPIC'
       ;;
 
@@ -8292,12 +8260,7 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
+      lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
       ;;
 
     mingw* | cygwin* | pw32* | os2* | cegcc*)
@@ -8311,7 +8274,7 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       # not for PA HP-UX.
       case $host_cpu in
-      hppa*64*|ia64*)
+      hppa*64*)
 	# +Z the default
 	;;
       *)
@@ -8836,7 +8799,6 @@  $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -8848,7 +8810,6 @@  $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 *** You will then need to restart the configuration process.
 
 _LT_EOF
-      fi
       ;;
 
     amigaos*)
@@ -8944,10 +8905,6 @@  _LT_EOF
 					# Portland Group f77 and f90 compilers
 	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
 	ifc* | ifort*)			# Intel Fortran compiler
 	  tmp_addflag=' -nofor_main' ;;
 	lf95*)				# Lahey Fortran 8.1
@@ -9101,13 +9058,6 @@  _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
 	# If we're using GNU nm, then we don't want the "-C" option.
 	# -C means demangle to AIX nm, but means don't demangle with GNU nm
 	# Also, AIX nm treats weak defined symbols like other global
@@ -9134,7 +9084,6 @@  _LT_EOF
 
 	exp_sym_flag='-bexport'
 	no_entry_flag='-bnoentry'
-      fi
 
       # When large executables or shared objects are built, AIX ld can
       # have problems creating the table of contents.  If linking a library
@@ -9177,17 +9126,11 @@  _LT_EOF
 	fi
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
 	  if test "$aix_use_runtimelinking" = yes; then
 	    shared_flag='${wl}-G'
 	  else
 	    shared_flag='${wl}-bM:SRE'
 	  fi
-	fi
       fi
 
       export_dynamic_flag_spec='${wl}-bexpall'
@@ -9233,11 +9176,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
         hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
         archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -9285,7 +9223,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	  archive_cmds_need_lc=yes
 	  # This is similar to how AIX traditionally builds its shared libraries.
 	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
       fi
       ;;
 
@@ -9434,9 +9371,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	hppa*64*)
 	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
 	*)
 	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
@@ -9446,9 +9380,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	hppa*64*)
 	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
 	*)
 
 	  # Older versions of the 11.00 compiler do not understand -b yet
@@ -9498,7 +9429,7 @@  fi
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
-	hppa*64*|ia64*)
+	hppa*64*)
 	  hardcode_direct=no
 	  hardcode_shlibpath_var=no
 	  ;;
@@ -10135,11 +10066,6 @@  aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
     # the line `#! .'.  This would cause the generated library to
@@ -10171,7 +10097,6 @@  aix[4-9]*)
       soname_spec='${libname}${release}${shared_ext}$major'
     fi
     shlibpath_var=LIBPATH
-  fi
   ;;
 
 amigaos*)
@@ -10348,21 +10273,6 @@  hpux9* | hpux10* | hpux11*)
   need_lib_prefix=no
   need_version=no
   case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
   hppa*64*)
     shrext_cmds='.sl'
     hardcode_into_libs=yes
@@ -11453,7 +11363,7 @@  $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    if test "$aix_use_runtimelinking" = no ; then
       test "$enable_shared" = yes && enable_static=no
     fi
     ;;
@@ -15903,13 +15813,6 @@  do
     i386_pe_big_vec)		 tb="$tb pe-i386.lo peigen.lo $coff" ;;
     i386_pei_vec)		 tb="$tb pei-i386.lo peigen.lo $coff" ;;
     iamcu_elf32_vec)		 tb="$tb elf32-i386.lo $elfxx_x86 elf32.lo $elf" ;;
-    ia64_elf32_be_vec)		 tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;;
-    ia64_elf32_hpux_be_vec)	 tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;;
-    ia64_elf64_be_vec)		 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_le_vec)		 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_hpux_be_vec)	 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_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 ;;
-    ia64_pei_vec)		 tb="$tb pei-ia64.lo pepigen.lo $coff"; target_size=64 ;;
     ip2k_elf32_vec)		 tb="$tb elf32-ip2k.lo elf32.lo $elf" ;;
     iq2000_elf32_vec)		 tb="$tb elf32-iq2000.lo elf32.lo $elf" ;;
     kvx_elf32_vec)		 tb="$tb elf32-kvx.lo elfxx-kvx.lo elf32.lo $elf $ipa" ;;
diff --git a/bfd/configure.ac b/bfd/configure.ac
index 29ede92b993..cf771a8a6d6 100644
--- a/bfd/configure.ac
+++ b/bfd/configure.ac
@@ -488,13 +488,6 @@  do
     i386_pe_big_vec)		 tb="$tb pe-i386.lo peigen.lo $coff" ;;
     i386_pei_vec)		 tb="$tb pei-i386.lo peigen.lo $coff" ;;
     iamcu_elf32_vec)		 tb="$tb elf32-i386.lo $elfxx_x86 elf32.lo $elf" ;;
-    ia64_elf32_be_vec)		 tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;;
-    ia64_elf32_hpux_be_vec)	 tb="$tb elf32-ia64.lo elfxx-ia64.lo elf32.lo $elf" ;;
-    ia64_elf64_be_vec)		 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_le_vec)		 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_hpux_be_vec)	 tb="$tb elf64-ia64.lo elfxx-ia64.lo elf64.lo $elf"; target_size=64 ;;
-    ia64_elf64_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 ;;
-    ia64_pei_vec)		 tb="$tb pei-ia64.lo pepigen.lo $coff"; target_size=64 ;;
     ip2k_elf32_vec)		 tb="$tb elf32-ip2k.lo elf32.lo $elf" ;;
     iq2000_elf32_vec)		 tb="$tb elf32-iq2000.lo elf32.lo $elf" ;;
     kvx_elf32_vec)		 tb="$tb elf32-kvx.lo elfxx-kvx.lo elf32.lo $elf $ipa" ;;
diff --git a/bfd/configure.com b/bfd/configure.com
index 6022b305f0d..32ce83430e6 100644
--- a/bfd/configure.com
+++ b/bfd/configure.com
@@ -284,15 +284,6 @@  $ DEFS="""SELECT_VECS=&alpha_vms_vec"","+-
 $ FILES="cpu-alpha,vms,vms-hdr,vms-gsd,vms-tir,vms-misc,"
 $EOD
 $ endif
-$ if ARCH.eqs."ia64"
-$ then
-$   create build.com
-$DECK
-$ DEFS="""SELECT_VECS=&ia64_elf64_vms_vec"","+-
-  """SELECT_ARCHITECTURES=&bfd_ia64_arch"""
-$ FILES="cpu-ia64,elf64-ia64,elf-strtab,corefile,stabs,merge,elf-eh-frame,"+-
-  "elflink,elf-attrs,dwarf1,elf64,"
-$EOD
 $ create substxx.tpu
 $DECK
    set (success,off);
diff --git a/bfd/configure.host b/bfd/configure.host
index 74342f7cc89..7f19e06586c 100644
--- a/bfd/configure.host
+++ b/bfd/configure.host
@@ -48,10 +48,6 @@  hppa*-*-mpeix*)		HDEFINES=-DHOST_HPPAMPEIX ;;
 hppa*-*-bsd*)		HDEFINES=-DHOST_HPPABSD ;;
 hppa*-*-osf*)		HDEFINES=-DHOST_HPPAOSF ;;
 
-ia64-*-hpux*)		HDEFINES=-D_LARGEFILE64_SOURCE
-			host64=true;;
-ia64-*-*)		host64=true;;
-
 # Workaround for limitations on win9x where file contents are
 # not zero'd out if you seek past the end and then write.
 i[3-7]86-*-mingw32*)	HDEFINES=-D__USE_MINGW_FSEEK;;
diff --git a/bfd/cpu-ia64-opc.c b/bfd/cpu-ia64-opc.c
deleted file mode 100644
index b8884ca4c50..00000000000
--- a/bfd/cpu-ia64-opc.c
+++ /dev/null
@@ -1,669 +0,0 @@ 
-/* Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-/* Logically, this code should be part of libopcode but since some of
-   the operand insertion/extraction functions help bfd to implement
-   relocations, this code is included as part of cpu-ia64.c.  This
-   avoids circular dependencies between libopcode and libbfd and also
-   obviates the need for applications to link in libopcode when all
-   they really want is libbfd.
-
-   --davidm Mon Apr 13 22:14:02 1998 */
-
-#include "../opcodes/ia64-opc.h"
-
-#define NELEMS(a)  ((int) (sizeof (a) / sizeof ((a)[0])))
-
-static const char*
-ins_rsvd (const struct ia64_operand *self ATTRIBUTE_UNUSED,
-	  ia64_insn value ATTRIBUTE_UNUSED, ia64_insn *code ATTRIBUTE_UNUSED)
-{
-  return "internal error---this shouldn't happen";
-}
-
-static const char*
-ext_rsvd (const struct ia64_operand *self ATTRIBUTE_UNUSED,
-	  ia64_insn code ATTRIBUTE_UNUSED, ia64_insn *valuep ATTRIBUTE_UNUSED)
-{
-  return "internal error---this shouldn't happen";
-}
-
-static const char*
-ins_const (const struct ia64_operand *self ATTRIBUTE_UNUSED,
-	   ia64_insn value ATTRIBUTE_UNUSED, ia64_insn *code ATTRIBUTE_UNUSED)
-{
-  return 0;
-}
-
-static const char*
-ext_const (const struct ia64_operand *self ATTRIBUTE_UNUSED,
-	   ia64_insn code ATTRIBUTE_UNUSED, ia64_insn *valuep ATTRIBUTE_UNUSED)
-{
-  return 0;
-}
-
-static const char*
-ins_reg (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  if (value >= 1u << self->field[0].bits)
-    return "register number out of range";
-
-  *code |= value << self->field[0].shift;
-  return 0;
-}
-
-static const char*
-ext_reg (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  *valuep = ((code >> self->field[0].shift)
-	     & ((1u << self->field[0].bits) - 1));
-  return 0;
-}
-
-static const char*
-ins_immu (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  ia64_insn new_insn = 0;
-  int i;
-
-  for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i)
-    {
-      new_insn |= ((value & ((((ia64_insn) 1) << self->field[i].bits) - 1))
-		 << self->field[i].shift);
-      value >>= self->field[i].bits;
-    }
-  if (value)
-    return "integer operand out of range";
-
-  *code |= new_insn;
-  return 0;
-}
-
-static const char*
-ext_immu (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  uint64_t value = 0;
-  int i, bits = 0, total = 0;
-
-  for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i)
-    {
-      bits = self->field[i].bits;
-      value |= ((code >> self->field[i].shift)
-		& (((uint64_t) 1 << bits) - 1)) << total;
-      total += bits;
-    }
-  *valuep = value;
-  return 0;
-}
-
-static const char*
-ins_immu5b (const struct ia64_operand *self, ia64_insn value,
-	    ia64_insn *code)
-{
-  if (value < 32 || value > 63)
-    return "value must be between 32 and 63";
-  return ins_immu (self, value - 32, code);
-}
-
-static const char*
-ext_immu5b (const struct ia64_operand *self, ia64_insn code,
-	    ia64_insn *valuep)
-{
-  const char *result;
-
-  result = ext_immu (self, code, valuep);
-  if (result)
-    return result;
-
-  *valuep = *valuep + 32;
-  return 0;
-}
-
-static const char*
-ins_immus8 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  if (value & 0x7)
-    return "value not an integer multiple of 8";
-  return ins_immu (self, value >> 3, code);
-}
-
-static const char*
-ext_immus8 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  const char *result;
-
-  result = ext_immu (self, code, valuep);
-  if (result)
-    return result;
-
-  *valuep = *valuep << 3;
-  return 0;
-}
-
-static const char*
-ins_imms_scaled (const struct ia64_operand *self, ia64_insn value,
-		 ia64_insn *code, int scale)
-{
-  int64_t svalue = value, sign_bit = 0;
-  ia64_insn new_insn = 0;
-  int i;
-
-  svalue >>= scale;
-
-  for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i)
-    {
-      new_insn |= ((svalue & ((((ia64_insn) 1) << self->field[i].bits) - 1))
-		 << self->field[i].shift);
-      sign_bit = (svalue >> (self->field[i].bits - 1)) & 1;
-      svalue >>= self->field[i].bits;
-    }
-  if ((!sign_bit && svalue != 0) || (sign_bit && svalue != -1))
-    return "integer operand out of range";
-
-  *code |= new_insn;
-  return 0;
-}
-
-static const char*
-ext_imms_scaled (const struct ia64_operand *self, ia64_insn code,
-		 ia64_insn *valuep, int scale)
-{
-  int i, bits = 0, total = 0;
-  uint64_t val = 0, sign;
-
-  for (i = 0; i < NELEMS (self->field) && self->field[i].bits; ++i)
-    {
-      bits = self->field[i].bits;
-      val |= ((code >> self->field[i].shift)
-	      & (((uint64_t) 1 << bits) - 1)) << total;
-      total += bits;
-    }
-  /* sign extend: */
-  sign = (uint64_t) 1 << (total - 1);
-  val = (val ^ sign) - sign;
-
-  *valuep = val << scale;
-  return 0;
-}
-
-static const char*
-ins_imms (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  return ins_imms_scaled (self, value, code, 0);
-}
-
-static const char*
-ins_immsu4 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  value = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
-
-  return ins_imms_scaled (self, value, code, 0);
-}
-
-static const char*
-ext_imms (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  return ext_imms_scaled (self, code, valuep, 0);
-}
-
-static const char*
-ins_immsm1 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  --value;
-  return ins_imms_scaled (self, value, code, 0);
-}
-
-static const char*
-ins_immsm1u4 (const struct ia64_operand *self, ia64_insn value,
-	      ia64_insn *code)
-{
-  value = ((value & 0xffffffff) ^ 0x80000000) - 0x80000000;
-
-  --value;
-  return ins_imms_scaled (self, value, code, 0);
-}
-
-static const char*
-ext_immsm1 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  const char *res = ext_imms_scaled (self, code, valuep, 0);
-
-  ++*valuep;
-  return res;
-}
-
-static const char*
-ins_imms1 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  return ins_imms_scaled (self, value, code, 1);
-}
-
-static const char*
-ext_imms1 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  return ext_imms_scaled (self, code, valuep, 1);
-}
-
-static const char*
-ins_imms4 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  return ins_imms_scaled (self, value, code, 4);
-}
-
-static const char*
-ext_imms4 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  return ext_imms_scaled (self, code, valuep, 4);
-}
-
-static const char*
-ins_imms16 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  return ins_imms_scaled (self, value, code, 16);
-}
-
-static const char*
-ext_imms16 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  return ext_imms_scaled (self, code, valuep, 16);
-}
-
-static const char*
-ins_cimmu (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  ia64_insn mask = (((ia64_insn) 1) << self->field[0].bits) - 1;
-  return ins_immu (self, value ^ mask, code);
-}
-
-static const char*
-ext_cimmu (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  const char *result;
-  ia64_insn mask;
-
-  mask = (((ia64_insn) 1) << self->field[0].bits) - 1;
-  result = ext_immu (self, code, valuep);
-  if (!result)
-    {
-      mask = (((ia64_insn) 1) << self->field[0].bits) - 1;
-      *valuep ^= mask;
-    }
-  return result;
-}
-
-static const char*
-ins_cnt (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  --value;
-  if (value >= (uint64_t) 1 << self->field[0].bits)
-    return "count out of range";
-
-  *code |= value << self->field[0].shift;
-  return 0;
-}
-
-static const char*
-ext_cnt (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  *valuep = ((code >> self->field[0].shift)
-	     & (((uint64_t) 1 << self->field[0].bits) - 1)) + 1;
-  return 0;
-}
-
-static const char*
-ins_cnt2b (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  --value;
-
-  if (value > 2)
-    return "count must be in range 1..3";
-
-  *code |= value << self->field[0].shift;
-  return 0;
-}
-
-static const char*
-ext_cnt2b (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  *valuep = ((code >> self->field[0].shift) & 0x3) + 1;
-  return 0;
-}
-
-static const char*
-ins_cnt2c (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  switch (value)
-    {
-    case 0:	value = 0; break;
-    case 7:	value = 1; break;
-    case 15:	value = 2; break;
-    case 16:	value = 3; break;
-    default:	return "count must be 0, 7, 15, or 16";
-    }
-  *code |= value << self->field[0].shift;
-  return 0;
-}
-
-static const char*
-ext_cnt2c (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  ia64_insn value;
-
-  value = (code >> self->field[0].shift) & 0x3;
-  switch (value)
-    {
-    case 0: value =  0; break;
-    case 1: value =  7; break;
-    case 2: value = 15; break;
-    case 3: value = 16; break;
-    }
-  *valuep = value;
-  return 0;
-}
-
-static const char*
-ins_cnt6a (const struct ia64_operand *self, ia64_insn value,
-	    ia64_insn *code)
-{
-  if (value < 1 || value > 64)
-    return "value must be between 1 and 64";
-  return ins_immu (self, value - 1, code);
-}
-
-static const char*
-ext_cnt6a (const struct ia64_operand *self, ia64_insn code,
-	    ia64_insn *valuep)
-{
-  const char *result;
-
-  result = ext_immu (self, code, valuep);
-  if (result)
-    return result;
-
-  *valuep = *valuep + 1;
-  return 0;
-}
-
-static const char*
-ins_strd5b (const struct ia64_operand *self, ia64_insn value,
-	    ia64_insn *code)
-{
-  if (  value & 0x3f )
-    return "value must be a multiple of 64";
-  return ins_imms_scaled (self, value, code, 6);
-}
-
-static const char*
-ext_strd5b (const struct ia64_operand *self, ia64_insn code,
-	    ia64_insn *valuep)
-{
-  return ext_imms_scaled (self, code, valuep, 6);
-}
-
-
-static const char*
-ins_inc3 (const struct ia64_operand *self, ia64_insn value, ia64_insn *code)
-{
-  int64_t val = value;
-  uint64_t sign = 0;
-
-  if (val < 0)
-    {
-      sign = 0x4;
-      value = -value;
-    }
-  switch (value)
-    {
-    case  1:	value = 3; break;
-    case  4:	value = 2; break;
-    case  8:	value = 1; break;
-    case 16:	value = 0; break;
-    default:	return "count must be +/- 1, 4, 8, or 16";
-    }
-  *code |= (sign | value) << self->field[0].shift;
-  return 0;
-}
-
-static const char*
-ext_inc3 (const struct ia64_operand *self, ia64_insn code, ia64_insn *valuep)
-{
-  int64_t val;
-  int negate;
-
-  val = (code >> self->field[0].shift) & 0x7;
-  negate = val & 0x4;
-  switch (val & 0x3)
-    {
-    case 0: val = 16; break;
-    case 1: val =  8; break;
-    case 2: val =  4; break;
-    case 3: val =  1; break;
-    }
-  if (negate)
-    val = -val;
-
-  *valuep = val;
-  return 0;
-}
-
-#define CST	IA64_OPND_CLASS_CST
-#define REG	IA64_OPND_CLASS_REG
-#define IND	IA64_OPND_CLASS_IND
-#define ABS	IA64_OPND_CLASS_ABS
-#define REL	IA64_OPND_CLASS_REL
-
-#define SDEC	IA64_OPND_FLAG_DECIMAL_SIGNED
-#define UDEC	IA64_OPND_FLAG_DECIMAL_UNSIGNED
-
-const struct ia64_operand elf64_ia64_operands[IA64_OPND_COUNT] =
-  {
-    /* constants: */
-    { CST, ins_const, ext_const, "NIL",		{{ 0, 0}}, 0, "<none>" },
-    { CST, ins_const, ext_const, "ar.csd",	{{ 0, 0}}, 0, "ar.csd" },
-    { CST, ins_const, ext_const, "ar.ccv",	{{ 0, 0}}, 0, "ar.ccv" },
-    { CST, ins_const, ext_const, "ar.pfs",	{{ 0, 0}}, 0, "ar.pfs" },
-    { CST, ins_const, ext_const, "1",		{{ 0, 0}}, 0, "1" },
-    { CST, ins_const, ext_const, "8",		{{ 0, 0}}, 0, "8" },
-    { CST, ins_const, ext_const, "16",		{{ 0, 0}}, 0, "16" },
-    { CST, ins_const, ext_const, "r0",		{{ 0, 0}}, 0, "r0" },
-    { CST, ins_const, ext_const, "ip",		{{ 0, 0}}, 0, "ip" },
-    { CST, ins_const, ext_const, "pr",		{{ 0, 0}}, 0, "pr" },
-    { CST, ins_const, ext_const, "pr.rot",	{{ 0, 0}}, 0, "pr.rot" },
-    { CST, ins_const, ext_const, "psr",		{{ 0, 0}}, 0, "psr" },
-    { CST, ins_const, ext_const, "psr.l",	{{ 0, 0}}, 0, "psr.l" },
-    { CST, ins_const, ext_const, "psr.um",	{{ 0, 0}}, 0, "psr.um" },
-
-    /* register operands: */
-    { REG, ins_reg,   ext_reg,	"ar", {{ 7, 20}}, 0,		/* AR3 */
-      "an application register" },
-    { REG, ins_reg,   ext_reg,	 "b", {{ 3,  6}}, 0,		/* B1 */
-      "a branch register" },
-    { REG, ins_reg,   ext_reg,	 "b", {{ 3, 13}}, 0,		/* B2 */
-      "a branch register"},
-    { REG, ins_reg,   ext_reg,	"cr", {{ 7, 20}}, 0,		/* CR */
-      "a control register"},
-    { REG, ins_reg,   ext_reg,	 "f", {{ 7,  6}}, 0,		/* F1 */
-      "a floating-point register" },
-    { REG, ins_reg,   ext_reg,	 "f", {{ 7, 13}}, 0,		/* F2 */
-      "a floating-point register" },
-    { REG, ins_reg,   ext_reg,	 "f", {{ 7, 20}}, 0,		/* F3 */
-      "a floating-point register" },
-    { REG, ins_reg,   ext_reg,	 "f", {{ 7, 27}}, 0,		/* F4 */
-      "a floating-point register" },
-    { REG, ins_reg,   ext_reg,	 "p", {{ 6,  6}}, 0,		/* P1 */
-      "a predicate register" },
-    { REG, ins_reg,   ext_reg,	 "p", {{ 6, 27}}, 0,		/* P2 */
-      "a predicate register" },
-    { REG, ins_reg,   ext_reg,	 "r", {{ 7,  6}}, 0,		/* R1 */
-      "a general register" },
-    { REG, ins_reg,   ext_reg,	 "r", {{ 7, 13}}, 0,		/* R2 */
-      "a general register" },
-    { REG, ins_reg,   ext_reg,	 "r", {{ 7, 20}}, 0,		/* R3 */
-      "a general register" },
-    { REG, ins_reg,   ext_reg,	 "r", {{ 2, 20}}, 0,		/* R3_2 */
-      "a general register r0-r3" },
-    { REG, ins_reg,   ext_reg,	 "dahr", {{ 3, 23}}, 0,		/* DAHR */
-      "a dahr register dahr0-7" },
-
-    /* memory operands: */
-    { IND, ins_reg,   ext_reg,	"",      {{7, 20}}, 0,		/* MR3 */
-      "a memory address" },
-
-    /* indirect operands: */
-    { IND, ins_reg,   ext_reg,	"cpuid", {{7, 20}}, 0,		/* CPUID_R3 */
-      "a cpuid register" },
-    { IND, ins_reg,   ext_reg,	"dbr",   {{7, 20}}, 0,		/* DBR_R3 */
-      "a dbr register" },
-    { IND, ins_reg,   ext_reg,	"dtr",   {{7, 20}}, 0,		/* DTR_R3 */
-      "a dtr register" },
-    { IND, ins_reg,   ext_reg,	"itr",   {{7, 20}}, 0,		/* ITR_R3 */
-      "an itr register" },
-    { IND, ins_reg,   ext_reg,	"ibr",   {{7, 20}}, 0,		/* IBR_R3 */
-      "an ibr register" },
-    { IND, ins_reg,   ext_reg,	"msr",   {{7, 20}}, 0,		/* MSR_R3 */
-      "an msr register" },
-    { IND, ins_reg,   ext_reg,	"pkr",   {{7, 20}}, 0,		/* PKR_R3 */
-      "a pkr register" },
-    { IND, ins_reg,   ext_reg,	"pmc",   {{7, 20}}, 0,		/* PMC_R3 */
-      "a pmc register" },
-    { IND, ins_reg,   ext_reg,	"pmd",   {{7, 20}}, 0,		/* PMD_R3 */
-      "a pmd register" },
-    { IND, ins_reg,   ext_reg,	"dahr",  {{7, 20}}, 0,		/* DAHR_R3 */
-      "a dahr register" },
-    { IND, ins_reg,   ext_reg,	"rr",    {{7, 20}}, 0,		/* RR_R3 */
-      "an rr register" },
-
-    /* immediate operands: */
-    { ABS, ins_cimmu, ext_cimmu, 0, {{ 5, 20 }}, UDEC,		/* CCNT5 */
-      "a 5-bit count (0-31)" },
-    { ABS, ins_cnt,   ext_cnt,   0, {{ 2, 27 }}, UDEC,		/* CNT2a */
-      "a 2-bit count (1-4)" },
-    { ABS, ins_cnt2b, ext_cnt2b, 0, {{ 2, 27 }}, UDEC,		/* CNT2b */
-      "a 2-bit count (1-3)" },
-    { ABS, ins_cnt2c, ext_cnt2c, 0, {{ 2, 30 }}, UDEC,		/* CNT2c */
-      "a count (0, 7, 15, or 16)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 5, 14}}, UDEC,		/* CNT5 */
-      "a 5-bit count (0-31)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 6, 27}}, UDEC,		/* CNT6 */
-      "a 6-bit count (0-63)" },
-    { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 20}}, UDEC,		/* CPOS6a */
-      "a 6-bit bit pos (0-63)" },
-    { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 14}}, UDEC,		/* CPOS6b */
-      "a 6-bit bit pos (0-63)" },
-    { ABS, ins_cimmu, ext_cimmu, 0, {{ 6, 31}}, UDEC,		/* CPOS6c */
-      "a 6-bit bit pos (0-63)" },
-    { ABS, ins_imms,  ext_imms,  0, {{ 1, 36}}, SDEC,		/* IMM1 */
-      "a 1-bit integer (-1, 0)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 2, 13}}, UDEC,		/* IMMU2 */
-      "a 2-bit unsigned (0-3)" },
-    { ABS, ins_immu5b,  ext_immu5b,  0, {{ 5, 14}}, UDEC,	/* IMMU5b */
-      "a 5-bit unsigned (32 + (0-31))" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 7, 13}}, 0,		/* IMMU7a */
-      "a 7-bit unsigned (0-127)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 7, 20}}, 0,		/* IMMU7b */
-      "a 7-bit unsigned (0-127)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 7, 13}}, UDEC,		/* SOF */
-      "a frame size (register count)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 7, 20}}, UDEC,		/* SOL */
-      "a local register count" },
-    { ABS, ins_immus8,ext_immus8,0, {{ 4, 27}}, UDEC,		/* SOR */
-      "a rotating register count (integer multiple of 8)" },
-    { ABS, ins_imms,  ext_imms,  0,				/* IMM8 */
-      {{ 7, 13}, { 1, 36}}, SDEC,
-      "an 8-bit integer (-128-127)" },
-    { ABS, ins_immsu4,  ext_imms,  0,				/* IMM8U4 */
-      {{ 7, 13}, { 1, 36}}, SDEC,
-      "an 8-bit signed integer for 32-bit unsigned compare (-128-127)" },
-    { ABS, ins_immsm1,  ext_immsm1,  0,				/* IMM8M1 */
-      {{ 7, 13}, { 1, 36}}, SDEC,
-      "an 8-bit integer (-127-128)" },
-    { ABS, ins_immsm1u4,  ext_immsm1,  0,			/* IMM8M1U4 */
-      {{ 7, 13}, { 1, 36}}, SDEC,
-      "an 8-bit integer for 32-bit unsigned compare (-127-(-1),1-128,0x100000000)" },
-    { ABS, ins_immsm1,  ext_immsm1,  0,				/* IMM8M1U8 */
-      {{ 7, 13}, { 1, 36}}, SDEC,
-      "an 8-bit integer for 64-bit unsigned compare (-127-(-1),1-128,0x10000000000000000)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 2, 33}, { 7, 20}}, 0,	/* IMMU9 */
-      "a 9-bit unsigned (0-511)" },
-    { ABS, ins_imms,  ext_imms,  0,				/* IMM9a */
-      {{ 7,  6}, { 1, 27}, { 1, 36}}, SDEC,
-      "a 9-bit integer (-256-255)" },
-    { ABS, ins_imms,  ext_imms, 0,				/* IMM9b */
-      {{ 7, 13}, { 1, 27}, { 1, 36}}, SDEC,
-      "a 9-bit integer (-256-255)" },
-    { ABS, ins_imms,  ext_imms, 0,				/* IMM14 */
-      {{ 7, 13}, { 6, 27}, { 1, 36}}, SDEC,
-      "a 14-bit integer (-8192-8191)" },
-    { ABS, ins_immu,  ext_immu,  0,				/* IMMU16 */
-      {{4,  6}, {11, 12}, { 1, 36}}, UDEC,
-      "a 16-bit unsigned" },
-    { ABS, ins_imms1, ext_imms1, 0,				/* IMM17 */
-      {{ 7,  6}, { 8, 24}, { 1, 36}}, 0,
-      "a 17-bit integer (-65536-65535)" },
-    { ABS, ins_immu,  ext_immu,  0,				/* IMMU19 */
-      {{4,  6}, {14, 12}, { 1, 36}}, UDEC,
-      "a 19-bit unsigned" },
-    { ABS, ins_immu,  ext_immu,  0, {{20,  6}, { 1, 36}}, 0,	/* IMMU21 */
-      "a 21-bit unsigned" },
-    { ABS, ins_imms,  ext_imms,  0,				/* IMM22 */
-      {{ 7, 13}, { 9, 27}, { 5, 22}, { 1, 36}}, SDEC,
-      "a 22-bit signed integer" },
-    { ABS, ins_immu,  ext_immu,  0,				/* IMMU24 */
-      {{21,  6}, { 2, 31}, { 1, 36}}, 0,
-      "a 24-bit unsigned" },
-    { ABS, ins_imms16,ext_imms16,0, {{27,  6}, { 1, 36}}, 0,	/* IMM44 */
-      "a 44-bit unsigned (least 16 bits ignored/zeroes)" },
-    { ABS, ins_rsvd,  ext_rsvd,	0, {{0,  0}}, 0,		/* IMMU62 */
-      "a 62-bit unsigned" },
-    { ABS, ins_rsvd,  ext_rsvd,	0, {{0,  0}}, 0,		/* IMMU64 */
-      "a 64-bit unsigned" },
-    { ABS, ins_inc3,  ext_inc3,  0, {{ 3, 13}}, SDEC,		/* INC3 */
-      "an increment (+/- 1, 4, 8, or 16)" },
-    { ABS, ins_cnt,   ext_cnt,   0, {{ 4, 27}}, UDEC,		/* LEN4 */
-      "a 4-bit length (1-16)" },
-    { ABS, ins_cnt,   ext_cnt,   0, {{ 6, 27}}, UDEC,		/* LEN6 */
-      "a 6-bit length (1-64)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 4, 20}},	0,		/* MBTYPE4 */
-      "a mix type (@rev, @mix, @shuf, @alt, or @brcst)" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 8, 20}},	0,		/* MBTYPE8 */
-      "an 8-bit mix type" },
-    { ABS, ins_immu,  ext_immu,  0, {{ 6, 14}}, UDEC,		/* POS6 */
-      "a 6-bit bit pos (0-63)" },
-    { REL, ins_imms4, ext_imms4, 0, {{ 7,  6}, { 2, 33}}, 0,	/* TAG13 */
-      "a branch tag" },
-    { REL, ins_imms4, ext_imms4, 0, {{ 9, 24}}, 0,		/* TAG13b */
-      "a branch tag" },
-    { REL, ins_imms4, ext_imms4, 0, {{20,  6}, { 1, 36}}, 0,	/* TGT25 */
-      "a branch target" },
-    { REL, ins_imms4, ext_imms4, 0,				/* TGT25b */
-      {{ 7,  6}, {13, 20}, { 1, 36}}, 0,
-      "a branch target" },
-    { REL, ins_imms4, ext_imms4, 0, {{20, 13}, { 1, 36}}, 0,	/* TGT25c */
-      "a branch target" },
-    { REL, ins_rsvd, ext_rsvd, 0, {{0, 0}}, 0,			/* TGT64  */
-      "a branch target" },
-
-    { ABS, ins_const, ext_const, 0, {{0, 0}}, 0,		/* LDXMOV */
-      "ldxmov target" },
-    { ABS, ins_cnt6a, ext_cnt6a, 0, {{6, 6}}, UDEC,		/* CNT6a */
-      "lfetch count" },
-    { ABS, ins_strd5b, ext_strd5b, 0, {{5, 13}}, SDEC,		/* STRD5b*/
-      "lfetch stride" },
-  };
diff --git a/bfd/cpu-ia64.c b/bfd/cpu-ia64.c
deleted file mode 100644
index 7d35def44b2..00000000000
--- a/bfd/cpu-ia64.c
+++ /dev/null
@@ -1,50 +0,0 @@ 
-/* BFD support for the ia64 architecture.
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-
-#define N(BITS_ADDR, NUMBER, PRINT, DEFAULT, NEXT) \
-  {							\
-    64,        /* Bits in a word.  */			\
-    BITS_ADDR, /* Bits in an address.  */		\
-    8,	       /* Bits in a byte.  */			\
-    bfd_arch_ia64,					\
-    NUMBER,						\
-    "ia64",						\
-    PRINT,						\
-    3,		/* Section alignment power.  */		\
-    DEFAULT,						\
-    bfd_default_compatible,				\
-    bfd_default_scan,					\
-    bfd_arch_default_fill,				\
-    NEXT,						\
-    0 /* Maximum offset of a reloc from the start of an insn.  */ \
-  }
-
-const bfd_arch_info_type bfd_ia64_elf32_arch =
-  N (32, bfd_mach_ia64_elf32, "ia64-elf32", false, NULL);
-
-const bfd_arch_info_type bfd_ia64_arch =
-  N (64, bfd_mach_ia64_elf64, "ia64-elf64", true, &bfd_ia64_elf32_arch);
-
-#include "cpu-ia64-opc.c"
diff --git a/bfd/elf-eh-frame.c b/bfd/elf-eh-frame.c
index 902d7c16334..441f9454c9f 100644
--- a/bfd/elf-eh-frame.c
+++ b/bfd/elf-eh-frame.c
@@ -2134,10 +2134,6 @@  _bfd_elf_write_section_eh_frame (bfd *abfd,
 		  {
 		    switch (abfd->arch_info->arch)
 		      {
-		      case bfd_arch_ia64:
-			BFD_ASSERT (elf_gp (abfd) != 0);
-			address += elf_gp (abfd);
-			break;
 		      default:
 			_bfd_error_handler
 			  (_("DW_EH_PE_datarel unspecified"
diff --git a/bfd/elf64-ia64-vms.c b/bfd/elf64-ia64-vms.c
deleted file mode 100644
index 54133c94c91..00000000000
--- a/bfd/elf64-ia64-vms.c
+++ /dev/null
@@ -1,5630 +0,0 @@ 
-/* IA-64 support for OpenVMS
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-#include "elf-bfd.h"
-#include "opcode/ia64.h"
-#include "elf/ia64.h"
-#include "objalloc.h"
-#include "hashtab.h"
-#include "elfxx-ia64.h"
-#include "vms.h"
-#include "bfdver.h"
-
-/* THE RULES for all the stuff the linker creates --
-
-  GOT		Entries created in response to LTOFF or LTOFF_FPTR
-		relocations.  Dynamic relocs created for dynamic
-		symbols in an application; REL relocs for locals
-		in a shared library.
-
-  FPTR		The canonical function descriptor.  Created for local
-		symbols in applications.  Descriptors for dynamic symbols
-		and local symbols in shared libraries are created by
-		ld.so.  Thus there are no dynamic relocs against these
-		objects.  The FPTR relocs for such _are_ passed through
-		to the dynamic relocation tables.
-
-  FULL_PLT	Created for a PCREL21B relocation against a dynamic symbol.
-		Requires the creation of a PLTOFF entry.  This does not
-		require any dynamic relocations.
-
-  PLTOFF	Created by PLTOFF relocations.  For local symbols, this
-		is an alternate function descriptor, and in shared libraries
-		requires two REL relocations.  Note that this cannot be
-		transformed into an FPTR relocation, since it must be in
-		range of the GP.  For dynamic symbols, this is a function
-		descriptor.  */
-
-typedef struct bfd_hash_entry *(*new_hash_entry_func)
-  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
-
-/* In dynamically (linker-) created sections, we generally need to keep track
-   of the place a symbol or expression got allocated to. This is done via hash
-   tables that store entries of the following type.  */
-
-struct elf64_ia64_dyn_sym_info
-{
-  /* The addend for which this entry is relevant.  */
-  bfd_vma addend;
-
-  bfd_vma got_offset;
-  bfd_vma fptr_offset;
-  bfd_vma pltoff_offset;
-  bfd_vma plt_offset;
-  bfd_vma plt2_offset;
-
-  /* The symbol table entry, if any, that this was derived from.  */
-  struct elf_link_hash_entry *h;
-
-  /* Used to count non-got, non-plt relocations for delayed sizing
-     of relocation sections.  */
-  struct elf64_ia64_dyn_reloc_entry
-  {
-    struct elf64_ia64_dyn_reloc_entry *next;
-    asection *srel;
-    int type;
-    int count;
-  } *reloc_entries;
-
-  /* TRUE when the section contents have been updated.  */
-  unsigned got_done : 1;
-  unsigned fptr_done : 1;
-  unsigned pltoff_done : 1;
-
-  /* TRUE for the different kinds of linker data we want created.  */
-  unsigned want_got : 1;
-  unsigned want_gotx : 1;
-  unsigned want_fptr : 1;
-  unsigned want_ltoff_fptr : 1;
-  unsigned want_plt : 1;	/* A MIN_PLT entry.  */
-  unsigned want_plt2 : 1;	/* A FULL_PLT.  */
-  unsigned want_pltoff : 1;
-};
-
-struct elf64_ia64_local_hash_entry
-{
-  int id;
-  unsigned int r_sym;
-  /* The number of elements in elf64_ia64_dyn_sym_info array.  */
-  unsigned int count;
-  /* The number of sorted elements in elf64_ia64_dyn_sym_info array.  */
-  unsigned int sorted_count;
-  /* The size of elf64_ia64_dyn_sym_info array.  */
-  unsigned int size;
-  /* The array of elf64_ia64_dyn_sym_info.  */
-  struct elf64_ia64_dyn_sym_info *info;
-
-  /* TRUE if this hash entry's addends was translated for
-     SHF_MERGE optimization.  */
-  unsigned sec_merge_done : 1;
-};
-
-struct elf64_ia64_link_hash_entry
-{
-  struct elf_link_hash_entry root;
-
-  /* Set if this symbol is defined in a shared library.
-     We can't use root.u.def.section->owner as the symbol is an absolute
-     symbol.  */
-  bfd *shl;
-
-  /* The number of elements in elf64_ia64_dyn_sym_info array.  */
-  unsigned int count;
-  /* The number of sorted elements in elf64_ia64_dyn_sym_info array.  */
-  unsigned int sorted_count;
-  /* The size of elf64_ia64_dyn_sym_info array.  */
-  unsigned int size;
-  /* The array of elf64_ia64_dyn_sym_info.  */
-  struct elf64_ia64_dyn_sym_info *info;
-};
-
-struct elf64_ia64_link_hash_table
-{
-  /* The main hash table.  */
-  struct elf_link_hash_table root;
-
-  asection *fptr_sec;		/* Function descriptor table (or NULL).  */
-  asection *rel_fptr_sec;	/* Dynamic relocation section for same.  */
-  asection *pltoff_sec;		/* Private descriptors for plt (or NULL).  */
-  asection *fixups_sec;		/* Fixups section.  */
-  asection *transfer_sec;	/* Transfer vector section.  */
-  asection *note_sec;		/* .note section.  */
-
-  /* There are maybe R_IA64_GPREL22 relocations, including those
-     optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
-     sections.  We need to record those sections so that we can choose
-     a proper GP to cover all R_IA64_GPREL22 relocations.  */
-  asection *max_short_sec;	/* Maximum short output section.  */
-  bfd_vma max_short_offset;	/* Maximum short offset.  */
-  asection *min_short_sec;	/* Minimum short output section.  */
-  bfd_vma min_short_offset;	/* Minimum short offset.  */
-
-  htab_t loc_hash_table;
-  void *loc_hash_memory;
-};
-
-struct elf64_ia64_allocate_data
-{
-  struct bfd_link_info *info;
-  bfd_size_type ofs;
-};
-
-#define elf64_ia64_hash_table(p) \
-  ((is_elf_hash_table ((p)->hash)					\
-    && elf_hash_table_id (elf_hash_table (p)) == IA64_ELF_DATA)		\
-   ? (struct elf64_ia64_link_hash_table *) (p)->hash : NULL)
-
-struct elf64_ia64_vms_obj_tdata
-{
-  struct elf_obj_tdata root;
-
-  /* Ident for shared library.  */
-  uint64_t ident;
-
-  /* Used only during link: offset in the .fixups section for this bfd.  */
-  bfd_vma fixups_off;
-
-  /* Max number of shared libraries.  */
-  unsigned int needed_count;
-};
-
-#define elf_ia64_vms_tdata(abfd) \
-  ((struct elf64_ia64_vms_obj_tdata *)((abfd)->tdata.any))
-#define elf_ia64_vms_ident(abfd) (elf_ia64_vms_tdata(abfd)->ident)
-
-struct elf64_vms_transfer
-{
-  unsigned char size[4];
-  unsigned char spare[4];
-  unsigned char tfradr1[8];
-  unsigned char tfradr2[8];
-  unsigned char tfradr3[8];
-  unsigned char tfradr4[8];
-  unsigned char tfradr5[8];
-
-  /* Local function descriptor for tfr3.  */
-  unsigned char tfr3_func[8];
-  unsigned char tfr3_gp[8];
-};
-
-typedef struct
-{
-  Elf64_External_Ehdr ehdr;
-  unsigned char vms_needed_count[8];
-} Elf64_External_VMS_Ehdr;
-
-static struct elf64_ia64_dyn_sym_info * get_dyn_sym_info
-  (struct elf64_ia64_link_hash_table *,
-   struct elf_link_hash_entry *,
-   bfd *, const Elf_Internal_Rela *, bool);
-static bool elf64_ia64_dynamic_symbol_p
-  (struct elf_link_hash_entry *);
-static bool elf64_ia64_choose_gp
-  (bfd *, struct bfd_link_info *, bool);
-static void elf64_ia64_dyn_sym_traverse
-  (struct elf64_ia64_link_hash_table *,
-   bool (*) (struct elf64_ia64_dyn_sym_info *, void *),
-   void *);
-static bool allocate_global_data_got
-  (struct elf64_ia64_dyn_sym_info *, void *);
-static bool allocate_global_fptr_got
-  (struct elf64_ia64_dyn_sym_info *, void *);
-static bool allocate_local_got
-  (struct elf64_ia64_dyn_sym_info *, void *);
-static bool allocate_dynrel_entries
-  (struct elf64_ia64_dyn_sym_info *, void *);
-static asection *get_pltoff
-  (bfd *, struct elf64_ia64_link_hash_table *);
-static asection *get_got
-  (bfd *, struct elf64_ia64_link_hash_table *);
-
-
-/* Given a ELF reloc, return the matching HOWTO structure.  */
-
-static bool
-elf64_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
-			  arelent *bfd_reloc,
-			  Elf_Internal_Rela *elf_reloc)
-{
-  unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
-
-  bfd_reloc->howto = ia64_elf_lookup_howto (r_type);
-  if (bfd_reloc->howto == NULL)
-    {
-      /* xgettext:c-format */
-      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-			  abfd, r_type);
-      bfd_set_error (bfd_error_bad_value);
-      return false;
-    }
-
-  return true;
-}
-
-
-#define PLT_FULL_ENTRY_SIZE	(2 * 16)
-
-static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] =
-{
-  0x0b, 0x78, 0x00, 0x02, 0x00, 0x24,  /*   [MMI]	addl r15=0,r1;;	  */
-  0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0,  /*		ld8.acq r16=[r15],8*/
-  0x01, 0x08, 0x00, 0x84,	       /*		mov r14=r1;;	  */
-  0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,  /*   [MIB]	ld8 r1=[r15]	  */
-  0x60, 0x80, 0x04, 0x80, 0x03, 0x00,  /*		mov b6=r16	  */
-  0x60, 0x00, 0x80, 0x00	       /*		br.few b6;;	  */
-};
-
-static const bfd_byte oor_brl[16] =
-{
-  0x05, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MLX]	nop.m 0		  */
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /*		brl.sptk.few tgt;;*/
-  0x00, 0x00, 0x00, 0xc0
-};
-
-
-/* These functions do relaxation for IA-64 ELF.  */
-
-/* Rename some of the generic section flags to better document how they
-   are used here.  */
-#define skip_relax_pass_0 sec_flg0
-#define skip_relax_pass_1 sec_flg1
-
-static void
-elf64_ia64_update_short_info (asection *sec, bfd_vma offset,
-			      struct elf64_ia64_link_hash_table *ia64_info)
-{
-  /* Skip ABS and SHF_IA_64_SHORT sections.  */
-  if (sec == bfd_abs_section_ptr
-      || (sec->flags & SEC_SMALL_DATA) != 0)
-    return;
-
-  if (!ia64_info->min_short_sec)
-    {
-      ia64_info->max_short_sec = sec;
-      ia64_info->max_short_offset = offset;
-      ia64_info->min_short_sec = sec;
-      ia64_info->min_short_offset = offset;
-    }
-  else if (sec == ia64_info->max_short_sec
-	   && offset > ia64_info->max_short_offset)
-    ia64_info->max_short_offset = offset;
-  else if (sec == ia64_info->min_short_sec
-	   && offset < ia64_info->min_short_offset)
-    ia64_info->min_short_offset = offset;
-  else if (sec->output_section->vma
-	   > ia64_info->max_short_sec->vma)
-    {
-      ia64_info->max_short_sec = sec;
-      ia64_info->max_short_offset = offset;
-    }
-  else if (sec->output_section->vma
-	   < ia64_info->min_short_sec->vma)
-    {
-      ia64_info->min_short_sec = sec;
-      ia64_info->min_short_offset = offset;
-    }
-}
-
-/* Use a two passes algorithm.  In the first pass, branches are relaxed
-   (which may increase the size of the section).  In the second pass,
-   the other relaxations are done.
-*/
-
-static bool
-elf64_ia64_relax_section (bfd *abfd, asection *sec,
-			  struct bfd_link_info *link_info,
-			  bool *again)
-{
-  struct one_fixup
-    {
-      struct one_fixup *next;
-      asection *tsec;
-      bfd_vma toff;
-      bfd_vma trampoff;
-    };
-
-  Elf_Internal_Shdr *symtab_hdr;
-  Elf_Internal_Rela *internal_relocs;
-  Elf_Internal_Rela *irel, *irelend;
-  bfd_byte *contents;
-  Elf_Internal_Sym *isymbuf = NULL;
-  struct elf64_ia64_link_hash_table *ia64_info;
-  struct one_fixup *fixups = NULL;
-  bool changed_contents = false;
-  bool changed_relocs = false;
-  bool skip_relax_pass_0 = true;
-  bool skip_relax_pass_1 = true;
-  bfd_vma gp = 0;
-
-  /* Assume we're not going to change any sizes, and we'll only need
-     one pass.  */
-  *again = false;
-
-  if (bfd_link_relocatable (link_info))
-    (*link_info->callbacks->einfo)
-      (_("%P%F: --relax and -r may not be used together\n"));
-
-  /* Don't even try to relax for non-ELF outputs.  */
-  if (!is_elf_hash_table (link_info->hash))
-    return false;
-
-  /* Nothing to do if there are no relocations or there is no need for
-     the current pass.  */
-  if (sec->reloc_count == 0
-      || (sec->flags & SEC_RELOC) == 0
-      || (sec->flags & SEC_HAS_CONTENTS) == 0
-      || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
-      || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
-    return true;
-
-  ia64_info = elf64_ia64_hash_table (link_info);
-  if (ia64_info == NULL)
-    return false;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-
-  /* Load the relocations for this section.  */
-  internal_relocs = (_bfd_elf_link_read_relocs
-		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
-		      link_info->keep_memory));
-  if (internal_relocs == NULL)
-    return false;
-
-  irelend = internal_relocs + sec->reloc_count;
-
-  /* Get the section contents.  */
-  if (elf_section_data (sec)->this_hdr.contents != NULL)
-    contents = elf_section_data (sec)->this_hdr.contents;
-  else
-    {
-      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
-	goto error_return;
-    }
-
-  for (irel = internal_relocs; irel < irelend; irel++)
-    {
-      unsigned long r_type = ELF64_R_TYPE (irel->r_info);
-      bfd_vma symaddr, reladdr, trampoff, toff, roff;
-      asection *tsec;
-      struct one_fixup *f;
-      bfd_size_type amt;
-      bool is_branch;
-      struct elf64_ia64_dyn_sym_info *dyn_i;
-
-      switch (r_type)
-	{
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL21BI:
-	case R_IA64_PCREL21M:
-	case R_IA64_PCREL21F:
-	  /* In pass 1, all br relaxations are done. We can skip it. */
-	  if (link_info->relax_pass == 1)
-	    continue;
-	  skip_relax_pass_0 = false;
-	  is_branch = true;
-	  break;
-
-	case R_IA64_PCREL60B:
-	  /* We can't optimize brl to br in pass 0 since br relaxations
-	     will increase the code size. Defer it to pass 1.  */
-	  if (link_info->relax_pass == 0)
-	    {
-	      skip_relax_pass_1 = false;
-	      continue;
-	    }
-	  is_branch = true;
-	  break;
-
-	case R_IA64_GPREL22:
-	  /* Update max_short_sec/min_short_sec.  */
-
-	case R_IA64_LTOFF22X:
-	case R_IA64_LDXMOV:
-	  /* We can't relax ldx/mov in pass 0 since br relaxations will
-	     increase the code size. Defer it to pass 1.  */
-	  if (link_info->relax_pass == 0)
-	    {
-	      skip_relax_pass_1 = false;
-	      continue;
-	    }
-	  is_branch = false;
-	  break;
-
-	default:
-	  continue;
-	}
-
-      /* Get the value of the symbol referred to by the reloc.  */
-      if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-	{
-	  /* A local symbol.  */
-	  Elf_Internal_Sym *isym;
-
-	  /* Read this BFD's local symbols.  */
-	  if (isymbuf == NULL)
-	    {
-	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-	      if (isymbuf == NULL)
-		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-						symtab_hdr->sh_info, 0,
-						NULL, NULL, NULL);
-	      if (isymbuf == 0)
-		goto error_return;
-	    }
-
-	  isym = isymbuf + ELF64_R_SYM (irel->r_info);
-	  if (isym->st_shndx == SHN_UNDEF)
-	    continue;	/* We can't do anything with undefined symbols.  */
-	  else if (isym->st_shndx == SHN_ABS)
-	    tsec = bfd_abs_section_ptr;
-	  else if (isym->st_shndx == SHN_COMMON)
-	    tsec = bfd_com_section_ptr;
-	  else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
-	    tsec = bfd_com_section_ptr;
-	  else
-	    tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-
-	  toff = isym->st_value;
-	  dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, false);
-	}
-      else
-	{
-	  unsigned long indx;
-	  struct elf_link_hash_entry *h;
-
-	  indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  BFD_ASSERT (h != NULL);
-
-	  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;
-
-	  dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, false);
-
-	  /* For branches to dynamic symbols, we're interested instead
-	     in a branch to the PLT entry.  */
-	  if (is_branch && dyn_i && dyn_i->want_plt2)
-	    {
-	      /* Internal branches shouldn't be sent to the PLT.
-		 Leave this for now and we'll give an error later.  */
-	      if (r_type != R_IA64_PCREL21B)
-		continue;
-
-	      tsec = ia64_info->root.splt;
-	      toff = dyn_i->plt2_offset;
-	      BFD_ASSERT (irel->r_addend == 0);
-	    }
-
-	  /* Can't do anything else with dynamic symbols.  */
-	  else if (elf64_ia64_dynamic_symbol_p (h))
-	    continue;
-
-	  else
-	    {
-	      /* We can't do anything with undefined symbols.  */
-	      if (h->root.type == bfd_link_hash_undefined
-		  || h->root.type == bfd_link_hash_undefweak)
-		continue;
-
-	      tsec = h->root.u.def.section;
-	      toff = h->root.u.def.value;
-	    }
-	}
-
-      toff += irel->r_addend;
-
-      symaddr = tsec->output_section->vma + tsec->output_offset + toff;
-
-      roff = irel->r_offset;
-
-      if (is_branch)
-	{
-	  bfd_signed_vma offset;
-
-	  reladdr = (sec->output_section->vma
-		     + sec->output_offset
-		     + roff) & (bfd_vma) -4;
-
-	  /* The .plt section is aligned at 32byte and the .text section
-	     is aligned at 64byte. The .text section is right after the
-	     .plt section.  After the first relaxation pass, linker may
-	     increase the gap between the .plt and .text sections up
-	     to 32byte.  We assume linker will always insert 32byte
-	     between the .plt and .text sections after the first
-	     relaxation pass.  */
-	  if (tsec == ia64_info->root.splt)
-	    offset = -0x1000000 + 32;
-	  else
-	    offset = -0x1000000;
-
-	  /* If the branch is in range, no need to do anything.  */
-	  if ((bfd_signed_vma) (symaddr - reladdr) >= offset
-	      && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
-	    {
-	      /* If the 60-bit branch is in 21-bit range, optimize it. */
-	      if (r_type == R_IA64_PCREL60B)
-		{
-		  ia64_elf_relax_brl (contents, roff);
-
-		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
-					       R_IA64_PCREL21B);
-
-		  /* If the original relocation offset points to slot
-		     1, change it to slot 2.  */
-		  if ((irel->r_offset & 3) == 1)
-		    irel->r_offset += 1;
-		}
-
-	      continue;
-	    }
-	  else if (r_type == R_IA64_PCREL60B)
-	    continue;
-	  else if (ia64_elf_relax_br (contents, roff))
-	    {
-	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
-					   R_IA64_PCREL60B);
-
-	      /* Make the relocation offset point to slot 1.  */
-	      irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
-	      continue;
-	    }
-
-	  /* We can't put a trampoline in a .init/.fini section. Issue
-	     an error.  */
-	  if (strcmp (sec->output_section->name, ".init") == 0
-	      || strcmp (sec->output_section->name, ".fini") == 0)
-	    {
-	      _bfd_error_handler
-		/* xgettext:c-format */
-		(_("%pB: can't relax br at %#" PRIx64 " in section `%pA';"
-		   " please use brl or indirect branch"),
-		 sec->owner, (uint64_t) roff, sec);
-	      bfd_set_error (bfd_error_bad_value);
-	      goto error_return;
-	    }
-
-	  /* If the branch and target are in the same section, you've
-	     got one honking big section and we can't help you unless
-	     you are branching backwards.  You'll get an error message
-	     later.  */
-	  if (tsec == sec && toff > roff)
-	    continue;
-
-	  /* Look for an existing fixup to this address.  */
-	  for (f = fixups; f ; f = f->next)
-	    if (f->tsec == tsec && f->toff == toff)
-	      break;
-
-	  if (f == NULL)
-	    {
-	      /* Two alternatives: If it's a branch to a PLT entry, we can
-		 make a copy of the FULL_PLT entry.  Otherwise, we'll have
-		 to use a `brl' insn to get where we're going.  */
-
-	      size_t size;
-
-	      if (tsec == ia64_info->root.splt)
-		size = sizeof (plt_full_entry);
-	      else
-		size = sizeof (oor_brl);
-
-	      /* Resize the current section to make room for the new branch. */
-	      trampoff = (sec->size + 15) & (bfd_vma) -16;
-
-	      /* If trampoline is out of range, there is nothing we
-		 can do.  */
-	      offset = trampoff - (roff & (bfd_vma) -4);
-	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
-		continue;
-
-	      amt = trampoff + size;
-	      contents = (bfd_byte *) bfd_realloc (contents, amt);
-	      if (contents == NULL)
-		goto error_return;
-	      sec->size = amt;
-
-	      if (tsec == ia64_info->root.splt)
-		{
-		  memcpy (contents + trampoff, plt_full_entry, size);
-
-		  /* Hijack the old relocation for use as the PLTOFF reloc.  */
-		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
-					       R_IA64_PLTOFF22);
-		  irel->r_offset = trampoff;
-		}
-	      else
-		{
-		  memcpy (contents + trampoff, oor_brl, size);
-		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
-					       R_IA64_PCREL60B);
-		  irel->r_offset = trampoff + 2;
-		}
-
-	      /* Record the fixup so we don't do it again this section.  */
-	      f = (struct one_fixup *)
-		bfd_malloc ((bfd_size_type) sizeof (*f));
-	      f->next = fixups;
-	      f->tsec = tsec;
-	      f->toff = toff;
-	      f->trampoff = trampoff;
-	      fixups = f;
-	    }
-	  else
-	    {
-	      /* If trampoline is out of range, there is nothing we
-		 can do.  */
-	      offset = f->trampoff - (roff & (bfd_vma) -4);
-	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
-		continue;
-
-	      /* Nop out the reloc, since we're finalizing things here.  */
-	      irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
-	    }
-
-	  /* Fix up the existing branch to hit the trampoline.  */
-	  if (ia64_elf_install_value (contents + roff, offset, r_type)
-	      != bfd_reloc_ok)
-	    goto error_return;
-
-	  changed_contents = true;
-	  changed_relocs = true;
-	}
-      else
-	{
-	  /* Fetch the gp.  */
-	  if (gp == 0)
-	    {
-	      bfd *obfd = sec->output_section->owner;
-	      gp = _bfd_get_gp_value (obfd);
-	      if (gp == 0)
-		{
-		  if (!elf64_ia64_choose_gp (obfd, link_info, false))
-		    goto error_return;
-		  gp = _bfd_get_gp_value (obfd);
-		}
-	    }
-
-	  /* If the data is out of range, do nothing.  */
-	  if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
-	      ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
-	    continue;
-
-	  if (r_type == R_IA64_GPREL22)
-	    elf64_ia64_update_short_info (tsec->output_section,
-					  tsec->output_offset + toff,
-					  ia64_info);
-	  else if (r_type == R_IA64_LTOFF22X)
-	    {
-	      /* Can't deal yet correctly with ABS symbols.  */
-	      if (bfd_is_abs_section (tsec))
-		continue;
-
-	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
-					   R_IA64_GPREL22);
-	      changed_relocs = true;
-
-	      elf64_ia64_update_short_info (tsec->output_section,
-					    tsec->output_offset + toff,
-					    ia64_info);
-	    }
-	  else
-	    {
-	      ia64_elf_relax_ldxmov (contents, roff);
-	      irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
-	      changed_contents = true;
-	      changed_relocs = true;
-	    }
-	}
-    }
-
-  /* ??? If we created fixups, this may push the code segment large
-     enough that the data segment moves, which will change the GP.
-     Reset the GP so that we re-calculate next round.  We need to
-     do this at the _beginning_ of the next round; now will not do.  */
-
-  /* Clean up and go home.  */
-  while (fixups)
-    {
-      struct one_fixup *f = fixups;
-      fixups = fixups->next;
-      free (f);
-    }
-
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
-    {
-      if (! link_info->keep_memory)
-	free (isymbuf);
-      else
-	{
-	  /* Cache the symbols for elf_link_input_bfd.  */
-	  symtab_hdr->contents = (unsigned char *) isymbuf;
-	}
-    }
-
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
-    {
-      if (!changed_contents && !link_info->keep_memory)
-	free (contents);
-      else
-	{
-	  /* Cache the section contents for elf_link_input_bfd.  */
-	  elf_section_data (sec)->this_hdr.contents = contents;
-	}
-    }
-
-  if (elf_section_data (sec)->relocs != internal_relocs)
-    {
-      if (!changed_relocs)
-	free (internal_relocs);
-      else
-	elf_section_data (sec)->relocs = internal_relocs;
-    }
-
-  if (link_info->relax_pass == 0)
-    {
-      /* Pass 0 is only needed to relax br.  */
-      sec->skip_relax_pass_0 = skip_relax_pass_0;
-      sec->skip_relax_pass_1 = skip_relax_pass_1;
-    }
-
-  *again = changed_contents || changed_relocs;
-  return true;
-
- error_return:
-  if ((unsigned char *) isymbuf != symtab_hdr->contents)
-    free (isymbuf);
-  if (elf_section_data (sec)->this_hdr.contents != contents)
-    free (contents);
-  if (elf_section_data (sec)->relocs != internal_relocs)
-    free (internal_relocs);
-  return false;
-}
-#undef skip_relax_pass_0
-#undef skip_relax_pass_1
-
-/* Return TRUE if NAME is an unwind table section name.  */
-
-static inline bool
-is_unwind_section_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
-{
-  return ((startswith (name, ELF_STRING_ia64_unwind)
-	   && ! startswith (name, ELF_STRING_ia64_unwind_info))
-	  || startswith (name, ELF_STRING_ia64_unwind_once));
-}
-
-
-/* Convert IA-64 specific section flags to bfd internal section flags.  */
-
-/* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
-   flag.  */
-
-static bool
-elf64_ia64_section_flags (const Elf_Internal_Shdr *hdr)
-{
-  if (hdr->sh_flags & SHF_IA_64_SHORT)
-    hdr->bfd_section->flags |= SEC_SMALL_DATA;
-
-  return true;
-}
-
-/* Set the correct type for an IA-64 ELF section.  We do this by the
-   section name, which is a hack, but ought to work.  */
-
-static bool
-elf64_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
-			  asection *sec)
-{
-  const char *name;
-
-  name = bfd_section_name (sec);
-
-  if (is_unwind_section_name (abfd, name))
-    {
-      /* We don't have the sections numbered at this point, so sh_info
-	 is set later, in elf64_ia64_final_write_processing.  */
-      hdr->sh_type = SHT_IA_64_UNWIND;
-      hdr->sh_flags |= SHF_LINK_ORDER;
-    }
-  else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
-    hdr->sh_type = SHT_IA_64_EXT;
-
-  if (sec->flags & SEC_SMALL_DATA)
-    hdr->sh_flags |= SHF_IA_64_SHORT;
-
-  return true;
-}
-
-/* Hook called by the linker routine which adds symbols from an object
-   file.  We use it to put .comm items in .sbss, and not .bss.  */
-
-static bool
-elf64_ia64_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,
-			    bfd_vma *valp)
-{
-  if (sym->st_shndx == SHN_COMMON
-      && !bfd_link_relocatable (info)
-      && sym->st_size <= elf_gp_size (abfd))
-    {
-      /* Common symbols less than or equal to -G nn bytes are
-	 automatically put into .sbss.  */
-
-      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
-
-      if (scomm == NULL)
-	{
-	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
-					       (SEC_ALLOC
-						| SEC_IS_COMMON
-						| SEC_SMALL_DATA
-						| SEC_LINKER_CREATED));
-	  if (scomm == NULL)
-	    return false;
-	}
-
-      *secp = scomm;
-      *valp = sym->st_size;
-    }
-
-  return true;
-}
-
-/* According to the Tahoe assembler spec, all labels starting with a
-   '.' are local.  */
-
-static bool
-elf64_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
-				const char *name)
-{
-  return name[0] == '.';
-}
-
-/* Should we do dynamic things to this symbol?  */
-
-static bool
-elf64_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h)
-{
-  return h != NULL && h->def_dynamic;
-}
-
-static struct bfd_hash_entry*
-elf64_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
-			       struct bfd_hash_table *table,
-			       const char *string)
-{
-  struct elf64_ia64_link_hash_entry *ret;
-  ret = (struct elf64_ia64_link_hash_entry *) entry;
-
-  /* Allocate the structure if it has not already been allocated by a
-     subclass.  */
-  if (!ret)
-    ret = bfd_hash_allocate (table, sizeof (*ret));
-
-  if (!ret)
-    return 0;
-
-  /* Call the allocation method of the superclass.  */
-  ret = ((struct elf64_ia64_link_hash_entry *)
-	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
-				     table, string));
-
-  ret->info = NULL;
-  ret->count = 0;
-  ret->sorted_count = 0;
-  ret->size = 0;
-  return (struct bfd_hash_entry *) ret;
-}
-
-static void
-elf64_ia64_hash_hide_symbol (struct bfd_link_info *info,
-			     struct elf_link_hash_entry *xh,
-			     bool force_local)
-{
-  struct elf64_ia64_link_hash_entry *h;
-  struct elf64_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  h = (struct elf64_ia64_link_hash_entry *)xh;
-
-  _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
-
-  for (count = h->count, dyn_i = h->info;
-       count != 0;
-       count--, dyn_i++)
-    {
-      dyn_i->want_plt2 = 0;
-      dyn_i->want_plt = 0;
-    }
-}
-
-/* Compute a hash of a local hash entry.  */
-
-static hashval_t
-elf64_ia64_local_htab_hash (const void *ptr)
-{
-  struct elf64_ia64_local_hash_entry *entry
-    = (struct elf64_ia64_local_hash_entry *) ptr;
-
-  return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
-}
-
-/* Compare local hash entries.  */
-
-static int
-elf64_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
-{
-  struct elf64_ia64_local_hash_entry *entry1
-    = (struct elf64_ia64_local_hash_entry *) ptr1;
-  struct elf64_ia64_local_hash_entry *entry2
-    = (struct elf64_ia64_local_hash_entry *) ptr2;
-
-  return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
-}
-
-/* Free the global elf64_ia64_dyn_sym_info array.  */
-
-static bool
-elf64_ia64_global_dyn_info_free (struct elf_link_hash_entry *xentry,
-				 void * unused ATTRIBUTE_UNUSED)
-{
-  struct elf64_ia64_link_hash_entry *entry
-    = (struct elf64_ia64_link_hash_entry *) xentry;
-
-  if (entry->root.root.type == bfd_link_hash_warning)
-    entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
-
-  free (entry->info);
-  entry->info = NULL;
-  entry->count = 0;
-  entry->sorted_count = 0;
-  entry->size = 0;
-
-  return true;
-}
-
-/* Free the local elf64_ia64_dyn_sym_info array.  */
-
-static int
-elf64_ia64_local_dyn_info_free (void **slot,
-				void * unused ATTRIBUTE_UNUSED)
-{
-  struct elf64_ia64_local_hash_entry *entry
-    = (struct elf64_ia64_local_hash_entry *) *slot;
-
-  free (entry->info);
-  entry->info = NULL;
-  entry->count = 0;
-  entry->sorted_count = 0;
-  entry->size = 0;
-
-  return true;
-}
-
-/* Destroy IA-64 linker hash table.  */
-
-static void
-elf64_ia64_link_hash_table_free (bfd *obfd)
-{
-  struct elf64_ia64_link_hash_table *ia64_info
-    = (struct elf64_ia64_link_hash_table *) obfd->link.hash;
-  if (ia64_info->loc_hash_table)
-    {
-      htab_traverse (ia64_info->loc_hash_table,
-		     elf64_ia64_local_dyn_info_free, NULL);
-      htab_delete (ia64_info->loc_hash_table);
-    }
-  if (ia64_info->loc_hash_memory)
-    objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
-  elf_link_hash_traverse (&ia64_info->root,
-			  elf64_ia64_global_dyn_info_free, NULL);
-  _bfd_elf_link_hash_table_free (obfd);
-}
-
-/* Create the derived linker hash table.  The IA-64 ELF port uses this
-   derived hash table to keep information specific to the IA-64 ElF
-   linker (without using static variables).  */
-
-static struct bfd_link_hash_table *
-elf64_ia64_hash_table_create (bfd *abfd)
-{
-  struct elf64_ia64_link_hash_table *ret;
-
-  ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
-  if (!ret)
-    return NULL;
-
-  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
-				      elf64_ia64_new_elf_hash_entry,
-				      sizeof (struct elf64_ia64_link_hash_entry),
-				      IA64_ELF_DATA))
-    {
-      free (ret);
-      return NULL;
-    }
-
-  ret->loc_hash_table = htab_try_create (1024, elf64_ia64_local_htab_hash,
-					 elf64_ia64_local_htab_eq, NULL);
-  ret->loc_hash_memory = objalloc_create ();
-  if (!ret->loc_hash_table || !ret->loc_hash_memory)
-    {
-      elf64_ia64_link_hash_table_free (abfd);
-      return NULL;
-    }
-  ret->root.root.hash_table_free = elf64_ia64_link_hash_table_free;
-
-  return &ret->root.root;
-}
-
-/* Traverse both local and global hash tables.  */
-
-struct elf64_ia64_dyn_sym_traverse_data
-{
-  bool (*func) (struct elf64_ia64_dyn_sym_info *, void *);
-  void * data;
-};
-
-static bool
-elf64_ia64_global_dyn_sym_thunk (struct elf_link_hash_entry *xentry,
-				 void * xdata)
-{
-  struct elf64_ia64_link_hash_entry *entry
-    = (struct elf64_ia64_link_hash_entry *) xentry;
-  struct elf64_ia64_dyn_sym_traverse_data *data
-    = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
-  struct elf64_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  if (entry->root.root.type == bfd_link_hash_warning)
-    entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
-
-  for (count = entry->count, dyn_i = entry->info;
-       count != 0;
-       count--, dyn_i++)
-    if (! (*data->func) (dyn_i, data->data))
-      return false;
-  return true;
-}
-
-static int
-elf64_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
-{
-  struct elf64_ia64_local_hash_entry *entry
-    = (struct elf64_ia64_local_hash_entry *) *slot;
-  struct elf64_ia64_dyn_sym_traverse_data *data
-    = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
-  struct elf64_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  for (count = entry->count, dyn_i = entry->info;
-       count != 0;
-       count--, dyn_i++)
-    if (! (*data->func) (dyn_i, data->data))
-      return false;
-  return true;
-}
-
-static void
-elf64_ia64_dyn_sym_traverse (struct elf64_ia64_link_hash_table *ia64_info,
-			     bool (*func) (struct elf64_ia64_dyn_sym_info *, void *),
-			     void * data)
-{
-  struct elf64_ia64_dyn_sym_traverse_data xdata;
-
-  xdata.func = func;
-  xdata.data = data;
-
-  elf_link_hash_traverse (&ia64_info->root,
-			  elf64_ia64_global_dyn_sym_thunk, &xdata);
-  htab_traverse (ia64_info->loc_hash_table,
-		 elf64_ia64_local_dyn_sym_thunk, &xdata);
-}
-
-#define NOTE_NAME "IPF/VMS"
-
-static bool
-create_ia64_vms_notes (bfd *abfd, struct bfd_link_info *info,
-		       unsigned int time_hi, unsigned int time_lo)
-{
-#define NBR_NOTES 7
-  Elf_Internal_Note notes[NBR_NOTES];
-  char *module_name;
-  int module_name_len;
-  unsigned char cur_time[8];
-  Elf64_External_VMS_ORIG_DYN_Note *orig_dyn;
-  unsigned int orig_dyn_size;
-  unsigned int note_size;
-  int i;
-  unsigned char *noteptr;
-  unsigned char *note_contents;
-  struct elf64_ia64_link_hash_table *ia64_info;
-
-  ia64_info = elf64_ia64_hash_table (info);
-
-  module_name = vms_get_module_name (bfd_get_filename (abfd), true);
-  module_name_len = strlen (module_name) + 1;
-
-  bfd_putl32 (time_lo, cur_time + 0);
-  bfd_putl32 (time_hi, cur_time + 4);
-
-  /* Note 0: IMGNAM.  */
-  notes[0].type = NT_VMS_IMGNAM;
-  notes[0].descdata = module_name;
-  notes[0].descsz = module_name_len;
-
-  /* Note 1: GSTNAM.  */
-  notes[1].type = NT_VMS_GSTNAM;
-  notes[1].descdata = module_name;
-  notes[1].descsz = module_name_len;
-
-  /* Note 2: IMGID.  */
-#define IMG_ID "V1.0"
-  notes[2].type = NT_VMS_IMGID;
-  notes[2].descdata = IMG_ID;
-  notes[2].descsz = sizeof (IMG_ID);
-
-  /* Note 3: Linktime.  */
-  notes[3].type = NT_VMS_LINKTIME;
-  notes[3].descdata = (char *)cur_time;
-  notes[3].descsz = sizeof (cur_time);
-
-  /* Note 4: Linker id.  */
-  notes[4].type = NT_VMS_LINKID;
-  notes[4].descdata = "GNU ld " BFD_VERSION_STRING;
-  notes[4].descsz = strlen (notes[4].descdata) + 1;
-
-  /* Note 5: Original dyn.  */
-  orig_dyn_size = (sizeof (*orig_dyn) + sizeof (IMG_ID) - 1 + 7) & ~7;
-  orig_dyn = bfd_zalloc (abfd, orig_dyn_size);
-  if (orig_dyn == NULL)
-    return false;
-  bfd_putl32 (1, orig_dyn->major_id);
-  bfd_putl32 (3, orig_dyn->minor_id);
-  memcpy (orig_dyn->manipulation_date, cur_time, sizeof (cur_time));
-  bfd_putl64 (VMS_LF_IMGSTA | VMS_LF_MAIN, orig_dyn->link_flags);
-  bfd_putl32 (EF_IA_64_ABI64, orig_dyn->elf_flags);
-  memcpy (orig_dyn->imgid, IMG_ID, sizeof (IMG_ID));
-  notes[5].type = NT_VMS_ORIG_DYN;
-  notes[5].descdata = (char *)orig_dyn;
-  notes[5].descsz = orig_dyn_size;
-
-  /* Note 3: Patchtime.  */
-  notes[6].type = NT_VMS_PATCHTIME;
-  notes[6].descdata = (char *)cur_time;
-  notes[6].descsz = sizeof (cur_time);
-
-  /* Compute notes size.  */
-  note_size = 0;
-  for (i = 0; i < NBR_NOTES; i++)
-    note_size += sizeof (Elf64_External_VMS_Note) - 1
-      + ((sizeof (NOTE_NAME) - 1 + 7) & ~7)
-      + ((notes[i].descsz + 7) & ~7);
-
-  /* Malloc a temporary buffer large enough for most notes */
-  note_contents = (unsigned char *) bfd_zalloc (abfd, note_size);
-  if (note_contents == NULL)
-    return false;
-  noteptr = note_contents;
-
-  /* Fill notes.  */
-  for (i = 0; i < NBR_NOTES; i++)
-    {
-      Elf64_External_VMS_Note *enote = (Elf64_External_VMS_Note *) noteptr;
-
-      bfd_putl64 (sizeof (NOTE_NAME) - 1, enote->namesz);
-      bfd_putl64 (notes[i].descsz, enote->descsz);
-      bfd_putl64 (notes[i].type, enote->type);
-
-      noteptr = (unsigned char *)enote->name;
-      memcpy (noteptr, NOTE_NAME, sizeof (NOTE_NAME) - 1);
-      noteptr += (sizeof (NOTE_NAME) - 1 + 7) & ~7;
-      memcpy (noteptr, notes[i].descdata, notes[i].descsz);
-      noteptr += (notes[i].descsz + 7) & ~7;
-    }
-
-  ia64_info->note_sec->contents = note_contents;
-  ia64_info->note_sec->size = note_size;
-
-  free (module_name);
-
-  return true;
-}
-
-static bool
-elf64_ia64_create_dynamic_sections (bfd *abfd,
-				    struct bfd_link_info *info)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *s;
-  flagword flags;
-  const struct elf_backend_data *bed;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  if (elf_hash_table (info)->dynamic_sections_created)
-    return true;
-
-  abfd = elf_hash_table (info)->dynobj;
-  bed = get_elf_backend_data (abfd);
-
-  flags = bed->dynamic_sec_flags;
-
-  s = bfd_make_section_anyway_with_flags (abfd, ".dynamic",
-					  flags | SEC_READONLY);
-  if (s == NULL
-      || !bfd_set_section_alignment (s, bed->s->log_file_align))
-    return false;
-
-  s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_READONLY);
-  if (s == NULL
-      || !bfd_set_section_alignment (s, bed->plt_alignment))
-    return false;
-  ia64_info->root.splt = s;
-
-  if (!get_got (abfd, ia64_info))
-    return false;
-
-  if (!get_pltoff (abfd, ia64_info))
-    return false;
-
-  s = bfd_make_section_anyway_with_flags (abfd, ".vmsdynstr",
-					  (SEC_ALLOC
-					   | SEC_HAS_CONTENTS
-					   | SEC_IN_MEMORY
-					   | SEC_LINKER_CREATED));
-  if (s == NULL
-      || !bfd_set_section_alignment (s, 0))
-    return false;
-
-  /* Create a fixup section.  */
-  s = bfd_make_section_anyway_with_flags (abfd, ".fixups",
-					  (SEC_ALLOC
-					   | SEC_HAS_CONTENTS
-					   | SEC_IN_MEMORY
-					   | SEC_LINKER_CREATED));
-  if (s == NULL
-      || !bfd_set_section_alignment (s, 3))
-    return false;
-  ia64_info->fixups_sec = s;
-
-  /* Create the transfer fixup section.  */
-  s = bfd_make_section_anyway_with_flags (abfd, ".transfer",
-					  (SEC_ALLOC
-					   | SEC_HAS_CONTENTS
-					   | SEC_IN_MEMORY
-					   | SEC_LINKER_CREATED));
-  if (s == NULL
-      || !bfd_set_section_alignment (s, 3))
-    return false;
-  s->size = sizeof (struct elf64_vms_transfer);
-  ia64_info->transfer_sec = s;
-
-  /* Create note section.  */
-  s = bfd_make_section_anyway_with_flags (abfd, ".vms.note",
-					  (SEC_LINKER_CREATED
-					   | SEC_HAS_CONTENTS
-					   | SEC_IN_MEMORY
-					   | SEC_READONLY));
-  if (s == NULL
-      || !bfd_set_section_alignment (s, 3))
-    return false;
-  ia64_info->note_sec = s;
-
-  elf_hash_table (info)->dynamic_sections_created = true;
-  return true;
-}
-
-/* Find and/or create a hash entry for local symbol.  */
-static struct elf64_ia64_local_hash_entry *
-get_local_sym_hash (struct elf64_ia64_link_hash_table *ia64_info,
-		    bfd *abfd, const Elf_Internal_Rela *rel,
-		    bool create)
-{
-  struct elf64_ia64_local_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.id = sec->id;
-  e.r_sym = ELF64_R_SYM (rel->r_info);
-  slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
-				   create ? INSERT : NO_INSERT);
-
-  if (!slot)
-    return NULL;
-
-  if (*slot)
-    return (struct elf64_ia64_local_hash_entry *) *slot;
-
-  ret = (struct elf64_ia64_local_hash_entry *)
-	objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
-			sizeof (struct elf64_ia64_local_hash_entry));
-  if (ret)
-    {
-      memset (ret, 0, sizeof (*ret));
-      ret->id = sec->id;
-      ret->r_sym = ELF64_R_SYM (rel->r_info);
-      *slot = ret;
-    }
-  return ret;
-}
-
-/* Used to sort elf64_ia64_dyn_sym_info array.  */
-
-static int
-addend_compare (const void *xp, const void *yp)
-{
-  const struct elf64_ia64_dyn_sym_info *x
-    = (const struct elf64_ia64_dyn_sym_info *) xp;
-  const struct elf64_ia64_dyn_sym_info *y
-    = (const struct elf64_ia64_dyn_sym_info *) yp;
-
-  return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
-}
-
-/* Sort elf64_ia64_dyn_sym_info array and remove duplicates.  */
-
-static unsigned int
-sort_dyn_sym_info (struct elf64_ia64_dyn_sym_info *info,
-		   unsigned int count)
-{
-  bfd_vma curr, prev, got_offset;
-  unsigned int i, kept, dupes, diff, dest, src, len;
-
-  qsort (info, count, sizeof (*info), addend_compare);
-
-  /* Find the first duplicate.  */
-  prev = info [0].addend;
-  got_offset = info [0].got_offset;
-  for (i = 1; i < count; i++)
-    {
-      curr = info [i].addend;
-      if (curr == prev)
-	{
-	  /* For duplicates, make sure that GOT_OFFSET is valid.  */
-	  if (got_offset == (bfd_vma) -1)
-	    got_offset = info [i].got_offset;
-	  break;
-	}
-      got_offset = info [i].got_offset;
-      prev = curr;
-    }
-
-  /* We may move a block of elements to here.  */
-  dest = i++;
-
-  /* Remove duplicates.  */
-  if (i < count)
-    {
-      while (i < count)
-	{
-	  /* For duplicates, make sure that the kept one has a valid
-	     got_offset.  */
-	  kept = dest - 1;
-	  if (got_offset != (bfd_vma) -1)
-	    info [kept].got_offset = got_offset;
-
-	  curr = info [i].addend;
-	  got_offset = info [i].got_offset;
-
-	  /* Move a block of elements whose first one is different from
-	     the previous.  */
-	  if (curr == prev)
-	    {
-	      for (src = i + 1; src < count; src++)
-		{
-		  if (info [src].addend != curr)
-		    break;
-		  /* For duplicates, make sure that GOT_OFFSET is
-		     valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [src].got_offset;
-		}
-
-	      /* Make sure that the kept one has a valid got_offset.  */
-	      if (got_offset != (bfd_vma) -1)
-		info [kept].got_offset = got_offset;
-	    }
-	  else
-	    src = i;
-
-	  if (src >= count)
-	    break;
-
-	  /* Find the next duplicate.  SRC will be kept.  */
-	  prev = info [src].addend;
-	  got_offset = info [src].got_offset;
-	  for (dupes = src + 1; dupes < count; dupes ++)
-	    {
-	      curr = info [dupes].addend;
-	      if (curr == prev)
-		{
-		  /* Make sure that got_offset is valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [dupes].got_offset;
-
-		  /* For duplicates, make sure that the kept one has
-		     a valid got_offset.  */
-		  if (got_offset != (bfd_vma) -1)
-		    info [dupes - 1].got_offset = got_offset;
-		  break;
-		}
-	      got_offset = info [dupes].got_offset;
-	      prev = curr;
-	    }
-
-	  /* How much to move.  */
-	  len = dupes - src;
-	  i = dupes + 1;
-
-	  if (len == 1 && dupes < count)
-	    {
-	      /* If we only move 1 element, we combine it with the next
-		 one.  There must be at least a duplicate.  Find the
-		 next different one.  */
-	      for (diff = dupes + 1, src++; diff < count; diff++, src++)
-		{
-		  if (info [diff].addend != curr)
-		    break;
-		  /* Make sure that got_offset is valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [diff].got_offset;
-		}
-
-	      /* Makre sure that the last duplicated one has an valid
-		 offset.  */
-	      BFD_ASSERT (curr == prev);
-	      if (got_offset != (bfd_vma) -1)
-		info [diff - 1].got_offset = got_offset;
-
-	      if (diff < count)
-		{
-		  /* Find the next duplicate.  Track the current valid
-		     offset.  */
-		  prev = info [diff].addend;
-		  got_offset = info [diff].got_offset;
-		  for (dupes = diff + 1; dupes < count; dupes ++)
-		    {
-		      curr = info [dupes].addend;
-		      if (curr == prev)
-			{
-			  /* For duplicates, make sure that GOT_OFFSET
-			     is valid.  */
-			  if (got_offset == (bfd_vma) -1)
-			    got_offset = info [dupes].got_offset;
-			  break;
-			}
-		      got_offset = info [dupes].got_offset;
-		      prev = curr;
-		      diff++;
-		    }
-
-		  len = diff - src + 1;
-		  i = diff + 1;
-		}
-	    }
-
-	  memmove (&info [dest], &info [src], len * sizeof (*info));
-
-	  dest += len;
-	}
-
-      count = dest;
-    }
-  else
-    {
-      /* When we get here, either there is no duplicate at all or
-	 the only duplicate is the last element.  */
-      if (dest < count)
-	{
-	  /* If the last element is a duplicate, make sure that the
-	     kept one has a valid got_offset.  We also update count.  */
-	  if (got_offset != (bfd_vma) -1)
-	    info [dest - 1].got_offset = got_offset;
-	  count = dest;
-	}
-    }
-
-  return count;
-}
-
-/* Find and/or create a descriptor for dynamic symbol info.  This will
-   vary based on global or local symbol, and the addend to the reloc.
-
-   We don't sort when inserting.  Also, we sort and eliminate
-   duplicates if there is an unsorted section.  Typically, this will
-   only happen once, because we do all insertions before lookups.  We
-   then use bsearch to do a lookup.  This also allows lookups to be
-   fast.  So we have fast insertion (O(log N) due to duplicate check),
-   fast lookup (O(log N)) and one sort (O(N log N) expected time).
-   Previously, all lookups were O(N) because of the use of the linked
-   list and also all insertions were O(N) because of the check for
-   duplicates.  There are some complications here because the array
-   size grows occasionally, which may add an O(N) factor, but this
-   should be rare.  Also,  we free the excess array allocation, which
-   requires a copy which is O(N), but this only happens once.  */
-
-static struct elf64_ia64_dyn_sym_info *
-get_dyn_sym_info (struct elf64_ia64_link_hash_table *ia64_info,
-		  struct elf_link_hash_entry *h, bfd *abfd,
-		  const Elf_Internal_Rela *rel, bool create)
-{
-  struct elf64_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
-  unsigned int *count_p, *sorted_count_p, *size_p;
-  unsigned int count, sorted_count, size;
-  bfd_vma addend = rel ? rel->r_addend : 0;
-  bfd_size_type amt;
-
-  if (h)
-    {
-      struct elf64_ia64_link_hash_entry *global_h;
-
-      global_h = (struct elf64_ia64_link_hash_entry *) h;
-      info_p = &global_h->info;
-      count_p = &global_h->count;
-      sorted_count_p = &global_h->sorted_count;
-      size_p = &global_h->size;
-    }
-  else
-    {
-      struct elf64_ia64_local_hash_entry *loc_h;
-
-      loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
-      if (!loc_h)
-	{
-	  BFD_ASSERT (!create);
-	  return NULL;
-	}
-
-      info_p = &loc_h->info;
-      count_p = &loc_h->count;
-      sorted_count_p = &loc_h->sorted_count;
-      size_p = &loc_h->size;
-    }
-
-  count = *count_p;
-  sorted_count = *sorted_count_p;
-  size = *size_p;
-  info = *info_p;
-  if (create)
-    {
-      /* When we create the array, we don't check for duplicates,
-	 except in the previously sorted section if one exists, and
-	 against the last inserted entry.  This allows insertions to
-	 be fast.  */
-      if (info)
-	{
-	  if (sorted_count)
-	    {
-	      /* Try bsearch first on the sorted section.  */
-	      key.addend = addend;
-	      dyn_i = bsearch (&key, info, sorted_count,
-			       sizeof (*info), addend_compare);
-
-	      if (dyn_i)
-		{
-		  return dyn_i;
-		}
-	    }
-
-	  /* Do a quick check for the last inserted entry.  */
-	  dyn_i = info + count - 1;
-	  if (dyn_i->addend == addend)
-	    {
-	      return dyn_i;
-	    }
-	}
-
-      if (size == 0)
-	{
-	  /* It is the very first element. We create the array of size
-	     1.  */
-	  size = 1;
-	  amt = size * sizeof (*info);
-	  info = bfd_malloc (amt);
-	}
-      else if (size <= count)
-	{
-	  /* We double the array size every time when we reach the
-	     size limit.  */
-	  size += size;
-	  amt = size * sizeof (*info);
-	  info = bfd_realloc (info, amt);
-	}
-      else
-	goto has_space;
-
-      if (info == NULL)
-	return NULL;
-      *size_p = size;
-      *info_p = info;
-
-    has_space:
-      /* Append the new one to the array.  */
-      dyn_i = info + count;
-      memset (dyn_i, 0, sizeof (*dyn_i));
-      dyn_i->got_offset = (bfd_vma) -1;
-      dyn_i->addend = addend;
-
-      /* We increment count only since the new ones are unsorted and
-	 may have duplicate.  */
-      (*count_p)++;
-    }
-  else
-    {
-      /* It is a lookup without insertion.  Sort array if part of the
-	 array isn't sorted.  */
-      if (count != sorted_count)
-	{
-	  count = sort_dyn_sym_info (info, count);
-	  *count_p = count;
-	  *sorted_count_p = count;
-	}
-
-      /* Free unused memory.  */
-      if (size != count)
-	{
-	  amt = count * sizeof (*info);
-	  info = bfd_malloc (amt);
-	  if (info != NULL)
-	    {
-	      memcpy (info, *info_p, amt);
-	      free (*info_p);
-	      *size_p = count;
-	      *info_p = info;
-	    }
-	}
-
-      key.addend = addend;
-      dyn_i = bsearch (&key, info, count,
-		       sizeof (*info), addend_compare);
-    }
-
-  return dyn_i;
-}
-
-static asection *
-get_got (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
-{
-  asection *got;
-  bfd *dynobj;
-
-  got = ia64_info->root.sgot;
-  if (!got)
-    {
-      flagword flags;
-
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-
-      /* The .got section is always aligned at 8 bytes.  */
-      flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
-      got = bfd_make_section_anyway_with_flags (dynobj, ".got",
-						flags | SEC_SMALL_DATA);
-      if (got == NULL
-	  || !bfd_set_section_alignment (got, 3))
-	return NULL;
-      ia64_info->root.sgot = got;
-    }
-
-  return got;
-}
-
-/* Create function descriptor section (.opd).  This section is called .opd
-   because it contains "official procedure descriptors".  The "official"
-   refers to the fact that these descriptors are used when taking the address
-   of a procedure, thus ensuring a unique address for each procedure.  */
-
-static asection *
-get_fptr (bfd *abfd, struct bfd_link_info *info,
-	  struct elf64_ia64_link_hash_table *ia64_info)
-{
-  asection *fptr;
-  bfd *dynobj;
-
-  fptr = ia64_info->fptr_sec;
-  if (!fptr)
-    {
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-
-      fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
-						 (SEC_ALLOC
-						  | SEC_LOAD
-						  | SEC_HAS_CONTENTS
-						  | SEC_IN_MEMORY
-						  | (bfd_link_pie (info) ? 0
-						     : SEC_READONLY)
-						  | SEC_LINKER_CREATED));
-      if (!fptr
-	  || !bfd_set_section_alignment (fptr, 4))
-	{
-	  BFD_ASSERT (0);
-	  return NULL;
-	}
-
-      ia64_info->fptr_sec = fptr;
-
-      if (bfd_link_pie (info))
-	{
-	  asection *fptr_rel;
-	  fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
-							 (SEC_ALLOC | SEC_LOAD
-							  | SEC_HAS_CONTENTS
-							  | SEC_IN_MEMORY
-							  | SEC_LINKER_CREATED
-							  | SEC_READONLY));
-	  if (fptr_rel == NULL
-	      || !bfd_set_section_alignment (fptr_rel, 3))
-	    {
-	      BFD_ASSERT (0);
-	      return NULL;
-	    }
-
-	  ia64_info->rel_fptr_sec = fptr_rel;
-	}
-    }
-
-  return fptr;
-}
-
-static asection *
-get_pltoff (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
-{
-  asection *pltoff;
-  bfd *dynobj;
-
-  pltoff = ia64_info->pltoff_sec;
-  if (!pltoff)
-    {
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-
-      pltoff = bfd_make_section_anyway_with_flags (dynobj,
-						   ELF_STRING_ia64_pltoff,
-						   (SEC_ALLOC
-						    | SEC_LOAD
-						    | SEC_HAS_CONTENTS
-						    | SEC_IN_MEMORY
-						    | SEC_SMALL_DATA
-						    | SEC_LINKER_CREATED));
-      if (!pltoff
-	  || !bfd_set_section_alignment (pltoff, 4))
-	{
-	  BFD_ASSERT (0);
-	  return NULL;
-	}
-
-      ia64_info->pltoff_sec = pltoff;
-    }
-
-  return pltoff;
-}
-
-static asection *
-get_reloc_section (bfd *abfd,
-		   struct elf64_ia64_link_hash_table *ia64_info,
-		   asection *sec, bool create)
-{
-  const char *srel_name;
-  asection *srel;
-  bfd *dynobj;
-
-  srel_name = (bfd_elf_string_from_elf_section
-	       (abfd, elf_elfheader(abfd)->e_shstrndx,
-		_bfd_elf_single_rel_hdr (sec)->sh_name));
-  if (srel_name == NULL)
-    return NULL;
-
-  BFD_ASSERT ((startswith (srel_name, ".rela")
-	       && strcmp (bfd_section_name (sec), srel_name+5) == 0)
-	      || (startswith (srel_name, ".rel")
-		  && strcmp (bfd_section_name (sec), srel_name+4) == 0));
-
-  dynobj = ia64_info->root.dynobj;
-  if (!dynobj)
-    ia64_info->root.dynobj = dynobj = abfd;
-
-  srel = bfd_get_linker_section (dynobj, srel_name);
-  if (srel == NULL && create)
-    {
-      srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
-						 (SEC_ALLOC | SEC_LOAD
-						  | SEC_HAS_CONTENTS
-						  | SEC_IN_MEMORY
-						  | SEC_LINKER_CREATED
-						  | SEC_READONLY));
-      if (srel == NULL
-	  || !bfd_set_section_alignment (srel, 3))
-	return NULL;
-    }
-
-  return srel;
-}
-
-static bool
-count_dyn_reloc (bfd *abfd, struct elf64_ia64_dyn_sym_info *dyn_i,
-		 asection *srel, int type)
-{
-  struct elf64_ia64_dyn_reloc_entry *rent;
-
-  for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
-    if (rent->srel == srel && rent->type == type)
-      break;
-
-  if (!rent)
-    {
-      rent = ((struct elf64_ia64_dyn_reloc_entry *)
-	      bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
-      if (!rent)
-	return false;
-
-      rent->next = dyn_i->reloc_entries;
-      rent->srel = srel;
-      rent->type = type;
-      rent->count = 0;
-      dyn_i->reloc_entries = rent;
-    }
-  rent->count++;
-
-  return true;
-}
-
-static bool
-elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
-			 asection *sec,
-			 const Elf_Internal_Rela *relocs)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  const Elf_Internal_Rela *relend;
-  Elf_Internal_Shdr *symtab_hdr;
-  const Elf_Internal_Rela *rel;
-  asection *got, *fptr, *srel, *pltoff;
-  enum {
-    NEED_GOT = 1,
-    NEED_GOTX = 2,
-    NEED_FPTR = 4,
-    NEED_PLTOFF = 8,
-    NEED_MIN_PLT = 16,
-    NEED_FULL_PLT = 32,
-    NEED_DYNREL = 64,
-    NEED_LTOFF_FPTR = 128
-  };
-  int need_entry;
-  struct elf_link_hash_entry *h;
-  unsigned long r_symndx;
-  bool maybe_dynamic;
-
-  if (bfd_link_relocatable (info))
-    return true;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  got = fptr = srel = pltoff = NULL;
-
-  relend = relocs + sec->reloc_count;
-
-  /* We scan relocations first to create dynamic relocation arrays.  We
-     modified get_dyn_sym_info to allow fast insertion and support fast
-     lookup in the next loop.  */
-  for (rel = relocs; rel < relend; ++rel)
-    {
-      r_symndx = ELF64_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-	{
-	  long indx = r_symndx - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  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;
-	}
-      else
-	h = NULL;
-
-      /* We can only get preliminary data on whether a symbol is
-	 locally or externally defined, as not all of the input files
-	 have yet been processed.  Do something with what we know, as
-	 this may help reduce memory usage and processing time later.  */
-      maybe_dynamic = (h && ((!bfd_link_executable (info)
-			      && (!SYMBOLIC_BIND (info, h)
-				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
-			     || !h->def_regular
-			     || h->root.type == bfd_link_hash_defweak));
-
-      need_entry = 0;
-      switch (ELF64_R_TYPE (rel->r_info))
-	{
-	case R_IA64_TPREL64MSB:
-	case R_IA64_TPREL64LSB:
-	case R_IA64_LTOFF_TPREL22:
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL64MSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_LTOFF_DTPREL22:
-	case R_IA64_DTPMOD64MSB:
-	case R_IA64_DTPMOD64LSB:
-	case R_IA64_LTOFF_DTPMOD22:
-	  abort ();
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  if (bfd_link_pic (info) || h)
-	    need_entry = NEED_FPTR | NEED_DYNREL;
-	  else
-	    need_entry = NEED_FPTR;
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF64I:
-	  need_entry = NEED_GOT;
-	  break;
-
-	case R_IA64_LTOFF22X:
-	  need_entry = NEED_GOTX;
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  need_entry = NEED_PLTOFF;
-	  if (h)
-	    {
-	      if (maybe_dynamic)
-		need_entry |= NEED_MIN_PLT;
-	    }
-	  else
-	    {
-	      (*info->callbacks->warning)
-		(info, _("@pltoff reloc against local symbol"), 0,
-		 abfd, 0, (bfd_vma) 0);
-	    }
-	  break;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* Depending on where this symbol is defined, we may or may not
-	     need a full plt entry.  Only skip if we know we'll not need
-	     the entry -- static or symbolic, and the symbol definition
-	     has already been seen.  */
-	  if (maybe_dynamic && rel->r_addend == 0)
-	    need_entry = NEED_FULL_PLT;
-	  break;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  if (maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-	}
-
-      if (!need_entry)
-	continue;
-
-      if ((need_entry & NEED_FPTR) != 0
-	  && rel->r_addend)
-	{
-	  (*info->callbacks->warning)
-	    (info, _("non-zero addend in @fptr reloc"), 0,
-	     abfd, 0, (bfd_vma) 0);
-	}
-
-      if (get_dyn_sym_info (ia64_info, h, abfd, rel, true) == NULL)
-	return false;
-    }
-
-  /* Now, we only do lookup without insertion, which is very fast
-     with the modified get_dyn_sym_info.  */
-  for (rel = relocs; rel < relend; ++rel)
-    {
-      struct elf64_ia64_dyn_sym_info *dyn_i;
-      int dynrel_type = R_IA64_NONE;
-
-      r_symndx = ELF64_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-	{
-	  /* We're dealing with a global symbol -- find its hash entry
-	     and mark it as being referenced.  */
-	  long indx = r_symndx - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  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;
-
-	  /* PR15323, ref flags aren't set for references in the same
-	     object.  */
-	  h->ref_regular = 1;
-	}
-      else
-	h = NULL;
-
-      /* We can only get preliminary data on whether a symbol is
-	 locally or externally defined, as not all of the input files
-	 have yet been processed.  Do something with what we know, as
-	 this may help reduce memory usage and processing time later.  */
-      maybe_dynamic = (h && ((!bfd_link_executable (info)
-			      && (!SYMBOLIC_BIND (info, h)
-				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
-			     || !h->def_regular
-			     || h->root.type == bfd_link_hash_defweak));
-
-      need_entry = 0;
-      switch (ELF64_R_TYPE (rel->r_info))
-	{
-	case R_IA64_TPREL64MSB:
-	case R_IA64_TPREL64LSB:
-	case R_IA64_LTOFF_TPREL22:
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL64MSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_LTOFF_DTPREL22:
-	case R_IA64_DTPMOD64MSB:
-	case R_IA64_DTPMOD64LSB:
-	case R_IA64_LTOFF_DTPMOD22:
-	  abort ();
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  if (bfd_link_pic (info) || h)
-	    need_entry = NEED_FPTR | NEED_DYNREL;
-	  else
-	    need_entry = NEED_FPTR;
-	  dynrel_type = R_IA64_FPTR64LSB;
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF64I:
-	  need_entry = NEED_GOT;
-	  break;
-
-	case R_IA64_LTOFF22X:
-	  need_entry = NEED_GOTX;
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  need_entry = NEED_PLTOFF;
-	  if (h)
-	    {
-	      if (maybe_dynamic)
-		need_entry |= NEED_MIN_PLT;
-	    }
-	  break;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* Depending on where this symbol is defined, we may or may not
-	     need a full plt entry.  Only skip if we know we'll not need
-	     the entry -- static or symbolic, and the symbol definition
-	     has already been seen.  */
-	  if (maybe_dynamic && rel->r_addend == 0)
-	    need_entry = NEED_FULL_PLT;
-	  break;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_DIR64LSB;
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  break;
-
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  if (maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_PCREL64LSB;
-	  break;
-	}
-
-      if (!need_entry)
-	continue;
-
-      dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, false);
-
-      /* Record whether or not this is a local symbol.  */
-      dyn_i->h = h;
-
-      /* Create what's needed.  */
-      if (need_entry & (NEED_GOT | NEED_GOTX))
-	{
-	  if (!got)
-	    {
-	      got = get_got (abfd, ia64_info);
-	      if (!got)
-		return false;
-	    }
-	  if (need_entry & NEED_GOT)
-	    dyn_i->want_got = 1;
-	  if (need_entry & NEED_GOTX)
-	    dyn_i->want_gotx = 1;
-	}
-      if (need_entry & NEED_FPTR)
-	{
-	  /* Create the .opd section.  */
-	  if (!fptr)
-	    {
-	      fptr = get_fptr (abfd, info, ia64_info);
-	      if (!fptr)
-		return false;
-	    }
-	  dyn_i->want_fptr = 1;
-	}
-      if (need_entry & NEED_LTOFF_FPTR)
-	dyn_i->want_ltoff_fptr = 1;
-      if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
-	{
-	  if (!ia64_info->root.dynobj)
-	    ia64_info->root.dynobj = abfd;
-	  h->needs_plt = 1;
-	  dyn_i->want_plt = 1;
-	}
-      if (need_entry & NEED_FULL_PLT)
-	dyn_i->want_plt2 = 1;
-      if (need_entry & NEED_PLTOFF)
-	{
-	  /* This is needed here, in case @pltoff is used in a non-shared
-	     link.  */
-	  if (!pltoff)
-	    {
-	      pltoff = get_pltoff (abfd, ia64_info);
-	      if (!pltoff)
-		return false;
-	    }
-
-	  dyn_i->want_pltoff = 1;
-	}
-      if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
-	{
-	  if (!srel)
-	    {
-	      srel = get_reloc_section (abfd, ia64_info, sec, true);
-	      if (!srel)
-		return false;
-	    }
-	  if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type))
-	    return false;
-	}
-    }
-
-  return true;
-}
-
-/* For cleanliness, and potentially faster dynamic loading, allocate
-   external GOT entries first.  */
-
-static bool
-allocate_global_data_got (struct elf64_ia64_dyn_sym_info *dyn_i,
-			  void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
-
-  if ((dyn_i->want_got || dyn_i->want_gotx)
-      && ! dyn_i->want_fptr
-      && elf64_ia64_dynamic_symbol_p (dyn_i->h))
-     {
-       /* GOT entry with FPTR is done by allocate_global_fptr_got.  */
-       dyn_i->got_offset = x->ofs;
-       x->ofs += 8;
-     }
-  return true;
-}
-
-/* Next, allocate all the GOT entries used by LTOFF_FPTR relocs.  */
-
-static bool
-allocate_global_fptr_got (struct elf64_ia64_dyn_sym_info *dyn_i,
-			  void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
-
-  if (dyn_i->want_got
-      && dyn_i->want_fptr
-      && elf64_ia64_dynamic_symbol_p (dyn_i->h))
-    {
-      dyn_i->got_offset = x->ofs;
-      x->ofs += 8;
-    }
-  return true;
-}
-
-/* Lastly, allocate all the GOT entries for local data.  */
-
-static bool
-allocate_local_got (struct elf64_ia64_dyn_sym_info *dyn_i,
-		    void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
-
-  if ((dyn_i->want_got || dyn_i->want_gotx)
-      && !elf64_ia64_dynamic_symbol_p (dyn_i->h))
-    {
-      dyn_i->got_offset = x->ofs;
-      x->ofs += 8;
-    }
-  return true;
-}
-
-/* Allocate function descriptors.  We can do these for every function
-   in a main executable that is not exported.  */
-
-static bool
-allocate_fptr (struct elf64_ia64_dyn_sym_info *dyn_i, void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
-
-  if (dyn_i->want_fptr)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-
-      if (h)
-	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;
-
-      if (h == NULL || !h->def_dynamic)
-	{
-	  /*  A non dynamic symbol.  */
-	  dyn_i->fptr_offset = x->ofs;
-	  x->ofs += 16;
-	}
-      else
-	dyn_i->want_fptr = 0;
-    }
-  return true;
-}
-
-/* Allocate all the minimal PLT entries.  */
-
-static bool
-allocate_plt_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
-		      void * data ATTRIBUTE_UNUSED)
-{
-  if (dyn_i->want_plt)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-
-      if (h)
-	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;
-
-      /* ??? Versioned symbols seem to lose NEEDS_PLT.  */
-      if (elf64_ia64_dynamic_symbol_p (h))
-	{
-	  dyn_i->want_pltoff = 1;
-	}
-      else
-	{
-	  dyn_i->want_plt = 0;
-	  dyn_i->want_plt2 = 0;
-	}
-    }
-  return true;
-}
-
-/* Allocate all the full PLT entries.  */
-
-static bool
-allocate_plt2_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
-		       void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
-
-  if (dyn_i->want_plt2)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-      bfd_size_type ofs = x->ofs;
-
-      dyn_i->plt2_offset = ofs;
-      x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
-
-      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;
-      dyn_i->h->plt.offset = ofs;
-    }
-  return true;
-}
-
-/* Allocate all the PLTOFF entries requested by relocations and
-   plt entries.  We can't share space with allocated FPTR entries,
-   because the latter are not necessarily addressable by the GP.
-   ??? Relaxation might be able to determine that they are.  */
-
-static bool
-allocate_pltoff_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
-			 void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
-
-  if (dyn_i->want_pltoff)
-    {
-      dyn_i->pltoff_offset = x->ofs;
-      x->ofs += 16;
-    }
-  return true;
-}
-
-/* Allocate dynamic relocations for those symbols that turned out
-   to be dynamic.  */
-
-static bool
-allocate_dynrel_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
-			 void * data)
-{
-  struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
-  struct elf64_ia64_link_hash_table *ia64_info;
-  struct elf64_ia64_dyn_reloc_entry *rent;
-  bool dynamic_symbol, shared, resolved_zero;
-  struct elf64_ia64_link_hash_entry *h_ia64;
-
-  ia64_info = elf64_ia64_hash_table (x->info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Note that this can't be used in relation to FPTR relocs below.  */
-  dynamic_symbol = elf64_ia64_dynamic_symbol_p (dyn_i->h);
-
-  shared = bfd_link_pic (x->info);
-  resolved_zero = (dyn_i->h
-		   && ELF_ST_VISIBILITY (dyn_i->h->other)
-		   && dyn_i->h->root.type == bfd_link_hash_undefweak);
-
-  /* Take care of the GOT and PLT relocations.  */
-
-  if ((!resolved_zero
-       && (dynamic_symbol || shared)
-       && (dyn_i->want_got || dyn_i->want_gotx))
-      || (dyn_i->want_ltoff_fptr
-	  && dyn_i->h
-	  && dyn_i->h->def_dynamic))
-    {
-      /* VMS: FIX64.  */
-      if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
-	{
-	  h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
-	  elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
-	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-	  ia64_info->fixups_sec->size +=
-	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-	}
-    }
-
-  if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
-    {
-      /* VMS: only image reloc.  */
-      if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
-	ia64_info->rel_fptr_sec->size += sizeof (Elf64_External_Rela);
-    }
-
-  if (!resolved_zero && dyn_i->want_pltoff)
-    {
-      /* VMS: FIXFD.  */
-      if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
-	{
-	  h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
-	  elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
-	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-	  ia64_info->fixups_sec->size +=
-	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-	}
-    }
-
-  /* Take care of the normal data relocations.  */
-
-  for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
-    {
-      switch (rent->type)
-	{
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64LSB:
-	  /* Allocate one iff !want_fptr and not PIE, which by this point
-	     will be true only if we're actually allocating one statically
-	     in the main executable.  Position independent executables
-	     need a relative reloc.  */
-	  if (dyn_i->want_fptr && !bfd_link_pie (x->info))
-	    continue;
-	  break;
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64LSB:
-	  if (!dynamic_symbol)
-	    continue;
-	  break;
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64LSB:
-	  if (!dynamic_symbol && !shared)
-	    continue;
-	  break;
-	case R_IA64_IPLTLSB:
-	  if (!dynamic_symbol && !shared)
-	    continue;
-	  break;
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_TPREL64LSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_DTPMOD64LSB:
-	  break;
-	default:
-	  abort ();
-	}
-
-      /* Add a fixup.  */
-      if (!dynamic_symbol)
-	abort ();
-
-      h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
-      elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
-	sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-      ia64_info->fixups_sec->size +=
-	sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-    }
-
-  return true;
-}
-
-static bool
-elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
-				  struct elf_link_hash_entry *h)
-{
-  /* ??? Undefined symbols with PLT entries should be re-defined
-     to be the PLT entry.  */
-
-  /* If this is a weak symbol, and there is a real definition, the
-     processor independent code will have arranged for us to see the
-     real definition first, and we can just use the same value.  */
-  if (h->is_weakalias)
-    {
-      struct elf_link_hash_entry *def = weakdef (h);
-      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
-      h->root.u.def.section = def->root.u.def.section;
-      h->root.u.def.value = def->root.u.def.value;
-      return true;
-    }
-
-  /* If this is a reference to a symbol defined by a dynamic object which
-     is not a function, we might allocate the symbol in our .dynbss section
-     and allocate a COPY dynamic relocation.
-
-     But IA-64 code is canonically PIC, so as a rule we can avoid this sort
-     of hackery.  */
-
-  return true;
-}
-
-static bool
-elf64_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			       struct bfd_link_info *info)
-{
-  struct elf64_ia64_allocate_data data;
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *sec;
-  bfd *dynobj;
-  struct elf_link_hash_table *hash_table;
-
-  hash_table = elf_hash_table (info);
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-  dynobj = hash_table->dynobj;
-  if (dynobj == NULL)
-    return true;
-  data.info = info;
-
-  /* Allocate the GOT entries.  */
-
-  if (ia64_info->root.sgot)
-    {
-      data.ofs = 0;
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
-      ia64_info->root.sgot->size = data.ofs;
-    }
-
-  /* Allocate the FPTR entries.  */
-
-  if (ia64_info->fptr_sec)
-    {
-      data.ofs = 0;
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
-      ia64_info->fptr_sec->size = data.ofs;
-    }
-
-  /* Now that we've seen all of the input files, we can decide which
-     symbols need plt entries.  Allocate the minimal PLT entries first.
-     We do this even though dynamic_sections_created may be FALSE, because
-     this has the side-effect of clearing want_plt and want_plt2.  */
-
-  data.ofs = 0;
-  elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
-
-  /* Align the pointer for the plt2 entries.  */
-  data.ofs = (data.ofs + 31) & (bfd_vma) -32;
-
-  elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
-  if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
-    {
-      /* FIXME: we always reserve the memory for dynamic linker even if
-	 there are no PLT entries since dynamic linker may assume the
-	 reserved memory always exists.  */
-
-      BFD_ASSERT (ia64_info->root.dynamic_sections_created);
-
-      ia64_info->root.splt->size = data.ofs;
-    }
-
-  /* Allocate the PLTOFF entries.  */
-
-  if (ia64_info->pltoff_sec)
-    {
-      data.ofs = 0;
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
-      ia64_info->pltoff_sec->size = data.ofs;
-    }
-
-  if (ia64_info->root.dynamic_sections_created)
-    {
-      /* Allocate space for the dynamic relocations that turned out to be
-	 required.  */
-      elf64_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
-    }
-
-  /* We have now determined the sizes of the various dynamic sections.
-     Allocate memory for them.  */
-  for (sec = dynobj->sections; sec != NULL; sec = sec->next)
-    {
-      bool strip;
-
-      if (!(sec->flags & SEC_LINKER_CREATED))
-	continue;
-
-      /* If we don't need this section, strip it from the output file.
-	 There were several sections primarily related to dynamic
-	 linking that must be create before the linker maps input
-	 sections to output sections.  The linker does that before
-	 bfd_elf_size_dynamic_sections is called, and it is that
-	 function which decides whether anything needs to go into
-	 these sections.  */
-
-      strip = (sec->size == 0);
-
-      if (sec == ia64_info->root.sgot)
-	strip = false;
-      else if (sec == ia64_info->root.srelgot)
-	{
-	  if (strip)
-	    ia64_info->root.srelgot = NULL;
-	  else
-	    /* We use the reloc_count field as a counter if we need to
-	       copy relocs into the output file.  */
-	    sec->reloc_count = 0;
-	}
-      else if (sec == ia64_info->fptr_sec)
-	{
-	  if (strip)
-	    ia64_info->fptr_sec = NULL;
-	}
-      else if (sec == ia64_info->rel_fptr_sec)
-	{
-	  if (strip)
-	    ia64_info->rel_fptr_sec = NULL;
-	  else
-	    /* We use the reloc_count field as a counter if we need to
-	       copy relocs into the output file.  */
-	    sec->reloc_count = 0;
-	}
-      else if (sec == ia64_info->root.splt)
-	{
-	  if (strip)
-	    ia64_info->root.splt = NULL;
-	}
-      else if (sec == ia64_info->pltoff_sec)
-	{
-	  if (strip)
-	    ia64_info->pltoff_sec = NULL;
-	}
-      else if (sec == ia64_info->fixups_sec)
-	{
-	  if (strip)
-	    ia64_info->fixups_sec = NULL;
-	}
-      else if (sec == ia64_info->transfer_sec)
-	{
-	  ;
-	}
-      else
-	{
-	  const char *name;
-
-	  /* It's OK to base decisions on the section name, because none
-	     of the dynobj section names depend upon the input files.  */
-	  name = bfd_section_name (sec);
-
-	  if (strcmp (name, ".got.plt") == 0)
-	    strip = false;
-	  else if (startswith (name, ".rel"))
-	    {
-	      if (!strip)
-		{
-		  /* We use the reloc_count field as a counter if we need to
-		     copy relocs into the output file.  */
-		  sec->reloc_count = 0;
-		}
-	    }
-	  else
-	    continue;
-	}
-
-      if (strip)
-	sec->flags |= SEC_EXCLUDE;
-      else
-	{
-	  /* Allocate memory for the section contents.  */
-	  sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
-	  if (sec->contents == NULL && sec->size != 0)
-	    return false;
-	}
-    }
-
-  if (elf_hash_table (info)->dynamic_sections_created)
-    {
-      bfd *abfd;
-      asection *dynsec;
-      asection *dynstrsec;
-      Elf_Internal_Dyn dyn;
-      const struct elf_backend_data *bed;
-      unsigned int shl_num = 0;
-      bfd_vma fixups_off = 0;
-      bfd_vma strdyn_off;
-      unsigned int time_hi, time_lo;
-
-      /* The .dynamic section must exist and be empty.  */
-      dynsec = bfd_get_linker_section (hash_table->dynobj, ".dynamic");
-      BFD_ASSERT (dynsec != NULL);
-      BFD_ASSERT (dynsec->size == 0);
-
-      dynstrsec = bfd_get_linker_section (hash_table->dynobj, ".vmsdynstr");
-      BFD_ASSERT (dynstrsec != NULL);
-      BFD_ASSERT (dynstrsec->size == 0);
-      dynstrsec->size = 1;	/* Initial blank.  */
-
-      /* Ident + link time.  */
-      vms_get_time (&time_hi, &time_lo);
-
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_IDENT, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LINKTIME,
-				       ((uint64_t) time_hi << 32)
-				       + time_lo))
-	return false;
-
-      /* Strtab.  */
-      strdyn_off = dynsec->size;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_STRTAB_OFFSET, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_STRSZ, 0))
-	return false;
-
-      /* PLTGOT  */
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_SEG, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_OFFSET, 0))
-	return false;
-
-      /* Misc.  */
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FPMODE, 0x9800000))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LNKFLAGS,
-				       VMS_LF_IMGSTA | VMS_LF_MAIN))
-	return false;
-
-      /* Add entries for shared libraries.  */
-      for (abfd = info->input_bfds; abfd; abfd = abfd->link.next)
-	{
-	  char *soname;
-	  size_t soname_len;
-	  bfd_size_type strindex;
-	  bfd_byte *newcontents;
-	  bfd_vma fixups_shl_off;
-
-	  if (!(abfd->flags & DYNAMIC))
-	    continue;
-	  BFD_ASSERT (abfd->xvec == output_bfd->xvec);
-
-	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_NEEDED_IDENT,
-					   elf_ia64_vms_ident (abfd)))
-	    return false;
-
-	  soname = vms_get_module_name (bfd_get_filename (abfd), true);
-	  if (soname == NULL)
-	    return false;
-	  strindex = dynstrsec->size;
-	  soname_len = strlen (soname) + 1;
-	  newcontents = (bfd_byte *) bfd_realloc (dynstrsec->contents,
-						  strindex + soname_len);
-	  if (newcontents == NULL)
-	    return false;
-	  memcpy (newcontents + strindex, soname, soname_len);
-	  dynstrsec->size += soname_len;
-	  dynstrsec->contents = newcontents;
-
-	  if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
-	    return false;
-
-	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_NEEDED,
-					   shl_num))
-	    return false;
-	  shl_num++;
-
-	  /* The fixups_off was in fact containing the size of the fixup
-	     section.  Remap into the offset.  */
-	  fixups_shl_off = elf_ia64_vms_tdata (abfd)->fixups_off;
-	  elf_ia64_vms_tdata (abfd)->fixups_off = fixups_off;
-
-	  if (!_bfd_elf_add_dynamic_entry
-	      (info, DT_IA_64_VMS_FIXUP_RELA_CNT,
-	       fixups_shl_off / sizeof (Elf64_External_VMS_IMAGE_FIXUP)))
-	    return false;
-	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_RELA_OFF,
-					   fixups_off))
-	    return false;
-	  fixups_off += fixups_shl_off;
-	}
-
-      /* Unwind.  */
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWINDSZ, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_CODSEG, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_INFOSEG, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_OFFSET, 0))
-	return false;
-      if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_SEG, 0))
-	return false;
-
-      if (!_bfd_elf_add_dynamic_entry (info, DT_NULL, 0xdead))
-	    return false;
-
-      /* Fix the strtab entries.  */
-      bed = get_elf_backend_data (hash_table->dynobj);
-
-      if (dynstrsec->size > 1)
-	dynstrsec->contents[0] = 0;
-      else
-	dynstrsec->size = 0;
-
-      /* Note: one 'spare' (ie DT_NULL) entry is added by
-	 bfd_elf_size_dynsym_hash_dynstr.  */
-      dyn.d_tag = DT_IA_64_VMS_STRTAB_OFFSET;
-      dyn.d_un.d_val = dynsec->size /* + sizeof (Elf64_External_Dyn) */;
-      bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
-			    dynsec->contents + strdyn_off);
-
-      dyn.d_tag = DT_STRSZ;
-      dyn.d_un.d_val = dynstrsec->size;
-      bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
-			    dynsec->contents + strdyn_off + bed->s->sizeof_dyn);
-
-      elf_ia64_vms_tdata (output_bfd)->needed_count = shl_num;
-
-      /* Note section.  */
-      if (!create_ia64_vms_notes (output_bfd, info, time_hi, time_lo))
-	return false;
-    }
-
-  /* ??? Perhaps force __gp local.  */
-
-  return true;
-}
-
-static void
-elf64_ia64_install_fixup (bfd *output_bfd,
-			  struct elf64_ia64_link_hash_table *ia64_info,
-			  struct elf_link_hash_entry *h,
-			  unsigned int type, asection *sec, bfd_vma offset,
-			  bfd_vma addend)
-{
-  asection *relsec;
-  Elf64_External_VMS_IMAGE_FIXUP *fixup;
-  struct elf64_ia64_link_hash_entry *h_ia64;
-  bfd_vma fixoff;
-  Elf_Internal_Phdr *phdr;
-
-  if (h == NULL || !h->def_dynamic)
-    abort ();
-
-  h_ia64 = (struct elf64_ia64_link_hash_entry *) h;
-  fixoff = elf_ia64_vms_tdata (h_ia64->shl)->fixups_off;
-  elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
-    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
-  relsec = ia64_info->fixups_sec;
-
-  fixup = (Elf64_External_VMS_IMAGE_FIXUP *)(relsec->contents + fixoff);
-  offset += sec->output_section->vma + sec->output_offset;
-
-  /* FIXME: this is slow.  We should cache the last one used, or create a
-     map.  */
-  phdr = _bfd_elf_find_segment_containing_section
-    (output_bfd, sec->output_section);
-  BFD_ASSERT (phdr != NULL);
-
-  bfd_putl64 (offset - phdr->p_vaddr, fixup->fixup_offset);
-  bfd_putl32 (type, fixup->type);
-  bfd_putl32 (phdr - elf_tdata (output_bfd)->phdr, fixup->fixup_seg);
-  bfd_putl64 (addend, fixup->addend);
-  bfd_putl32 (h->root.u.def.value, fixup->symvec_index);
-  bfd_putl32 (2, fixup->data_type);
-}
-
-/* Store an entry for target address TARGET_ADDR in the linkage table
-   and return the gp-relative address of the linkage table entry.  */
-
-static bfd_vma
-set_got_entry (bfd *abfd, struct bfd_link_info *info,
-	       struct elf64_ia64_dyn_sym_info *dyn_i,
-	       bfd_vma addend, bfd_vma value, unsigned int dyn_r_type)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *got_sec;
-  bool done;
-  bfd_vma got_offset;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  got_sec = ia64_info->root.sgot;
-
-  switch (dyn_r_type)
-    {
-    case R_IA64_TPREL64LSB:
-    case R_IA64_DTPMOD64LSB:
-    case R_IA64_DTPREL32LSB:
-    case R_IA64_DTPREL64LSB:
-      abort ();
-      break;
-    default:
-      done = dyn_i->got_done;
-      dyn_i->got_done = true;
-      got_offset = dyn_i->got_offset;
-      break;
-    }
-
-  BFD_ASSERT ((got_offset & 7) == 0);
-
-  if (! done)
-    {
-      /* Store the target address in the linkage table entry.  */
-      bfd_put_64 (abfd, value, got_sec->contents + got_offset);
-
-      /* Install a dynamic relocation if needed.  */
-      if (((bfd_link_pic (info)
-	    && (!dyn_i->h
-		|| ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
-		|| dyn_i->h->root.type != bfd_link_hash_undefweak))
-	   || elf64_ia64_dynamic_symbol_p (dyn_i->h))
-	  && (!dyn_i->want_ltoff_fptr
-	      || !bfd_link_pie (info)
-	      || !dyn_i->h
-	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
-	{
-	  if (!dyn_i->h || !dyn_i->h->def_dynamic)
-	    {
-	      dyn_r_type = R_IA64_REL64LSB;
-	      addend = value;
-	    }
-
-	  /* VMS: install a FIX32 or FIX64.  */
-	  switch (dyn_r_type)
-	    {
-	    case R_IA64_DIR32LSB:
-	    case R_IA64_FPTR32LSB:
-	      dyn_r_type = R_IA64_VMS_FIX32;
-	      break;
-	    case R_IA64_DIR64LSB:
-	    case R_IA64_FPTR64LSB:
-	      dyn_r_type = R_IA64_VMS_FIX64;
-	      break;
-	    default:
-	      BFD_ASSERT (false);
-	      break;
-	    }
-	  elf64_ia64_install_fixup
-	    (info->output_bfd, ia64_info, dyn_i->h,
-	     dyn_r_type, got_sec, got_offset, addend);
-	}
-    }
-
-  /* Return the address of the linkage table entry.  */
-  value = (got_sec->output_section->vma
-	   + got_sec->output_offset
-	   + got_offset);
-
-  return value;
-}
-
-/* Fill in a function descriptor consisting of the function's code
-   address and its global pointer.  Return the descriptor's address.  */
-
-static bfd_vma
-set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
-		struct elf64_ia64_dyn_sym_info *dyn_i,
-		bfd_vma value)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *fptr_sec;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  fptr_sec = ia64_info->fptr_sec;
-
-  if (!dyn_i->fptr_done)
-    {
-      dyn_i->fptr_done = 1;
-
-      /* Fill in the function descriptor.  */
-      bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
-      bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
-		  fptr_sec->contents + dyn_i->fptr_offset + 8);
-    }
-
-  /* Return the descriptor's address.  */
-  value = (fptr_sec->output_section->vma
-	   + fptr_sec->output_offset
-	   + dyn_i->fptr_offset);
-
-  return value;
-}
-
-/* Fill in a PLTOFF entry consisting of the function's code address
-   and its global pointer.  Return the descriptor's address.  */
-
-static bfd_vma
-set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
-		  struct elf64_ia64_dyn_sym_info *dyn_i,
-		  bfd_vma value, bool is_plt)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *pltoff_sec;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  pltoff_sec = ia64_info->pltoff_sec;
-
-  /* Don't do anything if this symbol uses a real PLT entry.  In
-     that case, we'll fill this in during finish_dynamic_symbol.  */
-  if ((! dyn_i->want_plt || is_plt)
-      && !dyn_i->pltoff_done)
-    {
-      bfd_vma gp = _bfd_get_gp_value (abfd);
-
-      /* Fill in the function descriptor.  */
-      bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
-      bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
-
-      /* Install dynamic relocations if needed.  */
-      if (!is_plt
-	  && bfd_link_pic (info)
-	  && (!dyn_i->h
-	      || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
-	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
-	{
-	  /* VMS:  */
-	  abort ();
-	}
-
-      dyn_i->pltoff_done = 1;
-    }
-
-  /* Return the descriptor's address.  */
-  value = (pltoff_sec->output_section->vma
-	   + pltoff_sec->output_offset
-	   + dyn_i->pltoff_offset);
-
-  return value;
-}
-
-/* Called through qsort to sort the .IA_64.unwind section during a
-   non-relocatable link.  Set elf64_ia64_unwind_entry_compare_bfd
-   to the output bfd so we can do proper endianness frobbing.  */
-
-static bfd *elf64_ia64_unwind_entry_compare_bfd;
-
-static int
-elf64_ia64_unwind_entry_compare (const void * a, const void * b)
-{
-  bfd_vma av, bv;
-
-  av = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, a);
-  bv = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, b);
-
-  return (av < bv ? -1 : av > bv ? 1 : 0);
-}
-
-/* Make sure we've got ourselves a nice fat __gp value.  */
-static bool
-elf64_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final)
-{
-  bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
-  bfd_vma min_short_vma = min_vma, max_short_vma = 0;
-  struct elf_link_hash_entry *gp;
-  bfd_vma gp_val;
-  asection *os;
-  struct elf64_ia64_link_hash_table *ia64_info;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Find the min and max vma of all sections marked short.  Also collect
-     min and max vma of any type, for use in selecting a nice gp.  */
-  for (os = abfd->sections; os ; os = os->next)
-    {
-      bfd_vma lo, hi;
-
-      if ((os->flags & SEC_ALLOC) == 0)
-	continue;
-
-      lo = os->vma;
-      /* When this function is called from elfNN_ia64_final_link
-	 the correct value to use is os->size.  When called from
-	 elfNN_ia64_relax_section we are in the middle of section
-	 sizing; some sections will already have os->size set, others
-	 will have os->size zero and os->rawsize the previous size.  */
-      hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
-      if (hi < lo)
-	hi = (bfd_vma) -1;
-
-      if (min_vma > lo)
-	min_vma = lo;
-      if (max_vma < hi)
-	max_vma = hi;
-      if (os->flags & SEC_SMALL_DATA)
-	{
-	  if (min_short_vma > lo)
-	    min_short_vma = lo;
-	  if (max_short_vma < hi)
-	    max_short_vma = hi;
-	}
-    }
-
-  if (ia64_info->min_short_sec)
-    {
-      if (min_short_vma
-	  > (ia64_info->min_short_sec->vma
-	     + ia64_info->min_short_offset))
-	min_short_vma = (ia64_info->min_short_sec->vma
-			 + ia64_info->min_short_offset);
-      if (max_short_vma
-	  < (ia64_info->max_short_sec->vma
-	     + ia64_info->max_short_offset))
-	max_short_vma = (ia64_info->max_short_sec->vma
-			 + ia64_info->max_short_offset);
-    }
-
-  /* See if the user wants to force a value.  */
-  gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
-			     false, false);
-
-  if (gp
-      && (gp->root.type == bfd_link_hash_defined
-	  || gp->root.type == bfd_link_hash_defweak))
-    {
-      asection *gp_sec = gp->root.u.def.section;
-      gp_val = (gp->root.u.def.value
-		+ gp_sec->output_section->vma
-		+ gp_sec->output_offset);
-    }
-  else
-    {
-      /* Pick a sensible value.  */
-
-      if (ia64_info->min_short_sec)
-	{
-	  bfd_vma short_range = max_short_vma - min_short_vma;
-
-	  /* If min_short_sec is set, pick one in the middle bewteen
-	     min_short_vma and max_short_vma.  */
-	  if (short_range >= 0x400000)
-	    goto overflow;
-	  gp_val = min_short_vma + short_range / 2;
-	}
-      else
-	{
-	  asection *got_sec = ia64_info->root.sgot;
-
-	  /* Start with just the address of the .got.  */
-	  if (got_sec)
-	    gp_val = got_sec->output_section->vma;
-	  else if (max_short_vma != 0)
-	    gp_val = min_short_vma;
-	  else if (max_vma - min_vma < 0x200000)
-	    gp_val = min_vma;
-	  else
-	    gp_val = max_vma - 0x200000 + 8;
-	}
-
-      /* If it is possible to address the entire image, but we
-	 don't with the choice above, adjust.  */
-      if (max_vma - min_vma < 0x400000
-	  && (max_vma - gp_val >= 0x200000
-	      || gp_val - min_vma > 0x200000))
-	gp_val = min_vma + 0x200000;
-      else if (max_short_vma != 0)
-	{
-	  /* If we don't cover all the short data, adjust.  */
-	  if (max_short_vma - gp_val >= 0x200000)
-	    gp_val = min_short_vma + 0x200000;
-
-	  /* If we're addressing stuff past the end, adjust back.  */
-	  if (gp_val > max_vma)
-	    gp_val = max_vma - 0x200000 + 8;
-	}
-    }
-
-  /* Validate whether all SHF_IA_64_SHORT sections are within
-     range of the chosen GP.  */
-
-  if (max_short_vma != 0)
-    {
-      if (max_short_vma - min_short_vma >= 0x400000)
-	{
-	overflow:
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
-	     abfd, (uint64_t) (max_short_vma - min_short_vma));
-	  return false;
-	}
-      else if ((gp_val > min_short_vma
-		&& gp_val - min_short_vma > 0x200000)
-	       || (gp_val < max_short_vma
-		   && max_short_vma - gp_val >= 0x200000))
-	{
-	  _bfd_error_handler
-	    (_("%pB: __gp does not cover short data segment"), abfd);
-	  return false;
-	}
-    }
-
-  _bfd_set_gp_value (abfd, gp_val);
-
-  return true;
-}
-
-static bool
-elf64_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  asection *unwind_output_sec;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Make sure we've got ourselves a nice fat __gp value.  */
-  if (!bfd_link_relocatable (info))
-    {
-      bfd_vma gp_val;
-      struct elf_link_hash_entry *gp;
-
-      /* We assume after gp is set, section size will only decrease. We
-	 need to adjust gp for it.  */
-      _bfd_set_gp_value (abfd, 0);
-      if (! elf64_ia64_choose_gp (abfd, info, true))
-	return false;
-      gp_val = _bfd_get_gp_value (abfd);
-
-      gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
-				 false, false);
-      if (gp)
-	{
-	  gp->root.type = bfd_link_hash_defined;
-	  gp->root.u.def.value = gp_val;
-	  gp->root.u.def.section = bfd_abs_section_ptr;
-	}
-    }
-
-  /* If we're producing a final executable, we need to sort the contents
-     of the .IA_64.unwind section.  Force this section to be relocated
-     into memory rather than written immediately to the output file.  */
-  unwind_output_sec = NULL;
-  if (!bfd_link_relocatable (info))
-    {
-      asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
-      if (s)
-	{
-	  unwind_output_sec = s->output_section;
-	  unwind_output_sec->contents
-	    = bfd_malloc (unwind_output_sec->size);
-	  if (unwind_output_sec->contents == NULL)
-	    return false;
-	}
-    }
-
-  /* Invoke the regular ELF backend linker to do all the work.  */
-  if (!bfd_elf_final_link (abfd, info))
-    return false;
-
-  if (unwind_output_sec)
-    {
-      elf64_ia64_unwind_entry_compare_bfd = abfd;
-      qsort (unwind_output_sec->contents,
-	     (size_t) (unwind_output_sec->size / 24),
-	     24,
-	     elf64_ia64_unwind_entry_compare);
-
-      if (! bfd_set_section_contents (abfd, unwind_output_sec,
-				      unwind_output_sec->contents, (bfd_vma) 0,
-				      unwind_output_sec->size))
-	return false;
-    }
-
-  return true;
-}
-
-static int
-elf64_ia64_relocate_section (bfd *output_bfd,
-			     struct bfd_link_info *info,
-			     bfd *input_bfd,
-			     asection *input_section,
-			     bfd_byte *contents,
-			     Elf_Internal_Rela *relocs,
-			     Elf_Internal_Sym *local_syms,
-			     asection **local_sections)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  Elf_Internal_Shdr *symtab_hdr;
-  Elf_Internal_Rela *rel;
-  Elf_Internal_Rela *relend;
-  bool ret_val = true;	/* for non-fatal errors */
-  bfd_vma gp_val;
-
-  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Infect various flags from the input section to the output section.  */
-  if (bfd_link_relocatable (info))
-    {
-      bfd_vma flags;
-
-      flags = elf_section_data(input_section)->this_hdr.sh_flags;
-      flags &= SHF_IA_64_NORECOV;
-
-      elf_section_data(input_section->output_section)
-	->this_hdr.sh_flags |= flags;
-    }
-
-  gp_val = _bfd_get_gp_value (output_bfd);
-
-  rel = relocs;
-  relend = relocs + input_section->reloc_count;
-  for (; rel < relend; ++rel)
-    {
-      struct elf_link_hash_entry *h;
-      struct elf64_ia64_dyn_sym_info *dyn_i;
-      bfd_reloc_status_type r;
-      reloc_howto_type *howto;
-      unsigned long r_symndx;
-      Elf_Internal_Sym *sym;
-      unsigned int r_type;
-      bfd_vma value;
-      asection *sym_sec;
-      bfd_byte *hit_addr;
-      bool dynamic_symbol_p;
-      bool undef_weak_ref;
-
-      r_type = ELF64_R_TYPE (rel->r_info);
-      if (r_type > R_IA64_MAX_RELOC_CODE)
-	{
-	  /* xgettext:c-format */
-	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-			      input_bfd, (int) r_type);
-	  bfd_set_error (bfd_error_bad_value);
-	  ret_val = false;
-	  continue;
-	}
-
-      howto = ia64_elf_lookup_howto (r_type);
-      if (howto == NULL)
-	{
-	  ret_val = false;
-	  continue;
-	}
-      r_symndx = ELF64_R_SYM (rel->r_info);
-      h = NULL;
-      sym = NULL;
-      sym_sec = NULL;
-      undef_weak_ref = false;
-
-      if (r_symndx < symtab_hdr->sh_info)
-	{
-	  /* Reloc against local symbol.  */
-	  asection *msec;
-	  sym = local_syms + r_symndx;
-	  sym_sec = local_sections[r_symndx];
-	  msec = sym_sec;
-	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
-	  if (!bfd_link_relocatable (info)
-	      && (sym_sec->flags & SEC_MERGE) != 0
-	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
-	      && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
-	    {
-	      struct elf64_ia64_local_hash_entry *loc_h;
-
-	      loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false);
-	      if (loc_h && ! loc_h->sec_merge_done)
-		{
-		  struct elf64_ia64_dyn_sym_info *dynent;
-		  unsigned int count;
-
-		  for (count = loc_h->count, dynent = loc_h->info;
-		       count != 0;
-		       count--, dynent++)
-		    {
-		      msec = sym_sec;
-		      dynent->addend =
-			_bfd_merged_section_offset (output_bfd, &msec,
-						    elf_section_data (msec)->
-						    sec_info,
-						    sym->st_value
-						    + dynent->addend);
-		      dynent->addend -= sym->st_value;
-		      dynent->addend += msec->output_section->vma
-					+ msec->output_offset
-					- sym_sec->output_section->vma
-					- sym_sec->output_offset;
-		    }
-
-		  /* We may have introduced duplicated entries. We need
-		     to remove them properly.  */
-		  count = sort_dyn_sym_info (loc_h->info, loc_h->count);
-		  if (count != loc_h->count)
-		    {
-		      loc_h->count = count;
-		      loc_h->sorted_count = count;
-		    }
-
-		  loc_h->sec_merge_done = 1;
-		}
-	    }
-	}
-      else
-	{
-	  bool unresolved_reloc;
-	  bool warned, ignored;
-	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
-
-	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
-				   r_symndx, symtab_hdr, sym_hashes,
-				   h, sym_sec, value,
-				   unresolved_reloc, warned, ignored);
-
-	  if (h->root.type == bfd_link_hash_undefweak)
-	    undef_weak_ref = true;
-	  else if (warned)
-	    continue;
-	}
-
-      /* For relocs against symbols from removed linkonce sections,
-	 or sections discarded by a linker script, we just want the
-	 section contents zeroed.  Avoid any special processing.  */
-      if (sym_sec != NULL && discarded_section (sym_sec))
-	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
-					 rel, 1, relend, howto, 0, contents);
-
-      if (bfd_link_relocatable (info))
-	continue;
-
-      hit_addr = contents + rel->r_offset;
-      value += rel->r_addend;
-      dynamic_symbol_p = elf64_ia64_dynamic_symbol_p (h);
-
-      switch (r_type)
-	{
-	case R_IA64_NONE:
-	case R_IA64_LDXMOV:
-	  continue;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if ((dynamic_symbol_p || bfd_link_pic (info))
-	      && r_symndx != 0
-	      && (input_section->flags & SEC_ALLOC) != 0)
-	    {
-	      unsigned int dyn_r_type;
-	      bfd_vma addend;
-
-	      switch (r_type)
-		{
-		case R_IA64_IMM14:
-		case R_IA64_IMM22:
-		case R_IA64_IMM64:
-		  /* ??? People shouldn't be doing non-pic code in
-		     shared libraries nor dynamic executables.  */
-		  _bfd_error_handler
-		    /* xgettext:c-format */
-		    (_("%pB: non-pic code with imm relocation against"
-		       " dynamic symbol `%s'"),
-		     input_bfd,
-		     h ? h->root.root.string
-		       : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-					   sym_sec));
-		  ret_val = false;
-		  continue;
-
-		default:
-		  break;
-		}
-
-	      /* If we don't need dynamic symbol lookup, find a
-		 matching RELATIVE relocation.  */
-	      dyn_r_type = r_type;
-	      if (dynamic_symbol_p)
-		{
-		  addend = rel->r_addend;
-		  value = 0;
-		}
-	      else
-		{
-		  addend = value;
-		}
-
-	      /* VMS: install a FIX64.  */
-	      switch (dyn_r_type)
-		{
-		case R_IA64_DIR32LSB:
-		  dyn_r_type = R_IA64_VMS_FIX32;
-		  break;
-		case R_IA64_DIR64LSB:
-		  dyn_r_type = R_IA64_VMS_FIX64;
-		  break;
-		default:
-		  BFD_ASSERT (false);
-		  break;
-		}
-	      elf64_ia64_install_fixup
-		(output_bfd, ia64_info, h,
-		 dyn_r_type, input_section, rel->r_offset, addend);
-	      r = bfd_reloc_ok;
-	      break;
-	    }
-	  /* Fall through.  */
-
-	case R_IA64_LTV32MSB:
-	case R_IA64_LTV32LSB:
-	case R_IA64_LTV64MSB:
-	case R_IA64_LTV64LSB:
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_GPREL22:
-	case R_IA64_GPREL64I:
-	case R_IA64_GPREL32MSB:
-	case R_IA64_GPREL32LSB:
-	case R_IA64_GPREL64MSB:
-	case R_IA64_GPREL64LSB:
-	  if (dynamic_symbol_p)
-	    {
-	      _bfd_error_handler
-		/* xgettext:c-format */
-		(_("%pB: @gprel relocation against dynamic symbol %s"),
-		 input_bfd,
-		 h ? h->root.root.string
-		   : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec));
-	      ret_val = false;
-	      continue;
-	    }
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF22X:
-	case R_IA64_LTOFF64I:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  value = set_got_entry (input_bfd, info, dyn_i,
-				 rel->r_addend, value, R_IA64_DIR64LSB);
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  value = set_pltoff_entry (output_bfd, info, dyn_i, value, false);
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  if (dyn_i->want_fptr)
-	    {
-	      if (!undef_weak_ref)
-		value = set_fptr_entry (output_bfd, info, dyn_i, value);
-	    }
-	  if (!dyn_i->want_fptr || bfd_link_pie (info))
-	    {
-	      /* Otherwise, we expect the dynamic linker to create
-		 the entry.  */
-
-	      if (dyn_i->want_fptr)
-		{
-		  if (r_type == R_IA64_FPTR64I)
-		    {
-		      /* We can't represent this without a dynamic symbol.
-			 Adjust the relocation to be against an output
-			 section symbol, which are always present in the
-			 dynamic symbol table.  */
-		      /* ??? People shouldn't be doing non-pic code in
-			 shared libraries.  Hork.  */
-		      _bfd_error_handler
-			(_("%pB: linking non-pic code in a position independent executable"),
-			 input_bfd);
-		      ret_val = false;
-		      continue;
-		    }
-		}
-	      else
-		{
-		  value = 0;
-		}
-
-	      /* VMS: FIXFD.  */
-	      elf64_ia64_install_fixup
-		(output_bfd, ia64_info, h, R_IA64_VMS_FIXFD,
-		 input_section, rel->r_offset, 0);
-	      r = bfd_reloc_ok;
-	      break;
-	    }
-
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  if (dyn_i->want_fptr)
-	    {
-	      BFD_ASSERT (h == NULL || !h->def_dynamic);
-	      if (!undef_weak_ref)
-		value = set_fptr_entry (output_bfd, info, dyn_i, value);
-	    }
-	  else
-	    value = 0;
-
-	  value = set_got_entry (output_bfd, info, dyn_i,
-				 rel->r_addend, value, R_IA64_FPTR64LSB);
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if (dynamic_symbol_p && r_symndx != 0)
-	    {
-	      /* VMS: doesn't exist ???  */
-	      abort ();
-	    }
-	  goto finish_pcrel;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* We should have created a PLT entry for any dynamic symbol.  */
-	  dyn_i = NULL;
-	  if (h)
-	    dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
-
-	  if (dyn_i && dyn_i->want_plt2)
-	    {
-	      /* Should have caught this earlier.  */
-	      BFD_ASSERT (rel->r_addend == 0);
-
-	      value = (ia64_info->root.splt->output_section->vma
-		       + ia64_info->root.splt->output_offset
-		       + dyn_i->plt2_offset);
-	    }
-	  else
-	    {
-	      /* Since there's no PLT entry, Validate that this is
-		 locally defined.  */
-	      BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
-
-	      /* If the symbol is undef_weak, we shouldn't be trying
-		 to call it.  There's every chance that we'd wind up
-		 with an out-of-range fixup here.  Don't bother setting
-		 any value at all.  */
-	      if (undef_weak_ref)
-		continue;
-	    }
-	  goto finish_pcrel;
-
-	case R_IA64_PCREL21BI:
-	case R_IA64_PCREL21F:
-	case R_IA64_PCREL21M:
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	  /* The PCREL21BI reloc is specifically not intended for use with
-	     dynamic relocs.  PCREL21F and PCREL21M are used for speculation
-	     fixup code, and thus probably ought not be dynamic.  The
-	     PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs.  */
-	  if (dynamic_symbol_p)
-	    {
-	      const char *msg;
-
-	      if (r_type == R_IA64_PCREL21BI)
-		/* xgettext:c-format */
-		msg = _("%pB: @internal branch to dynamic symbol %s");
-	      else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
-		/* xgettext:c-format */
-		msg = _("%pB: speculation fixup to dynamic symbol %s");
-	      else
-		/* xgettext:c-format */
-		msg = _("%pB: @pcrel relocation against dynamic symbol %s");
-	      _bfd_error_handler (msg, input_bfd,
-				  h ? h->root.root.string
-				  : bfd_elf_sym_name (input_bfd,
-						      symtab_hdr,
-						      sym,
-						      sym_sec));
-	      ret_val = false;
-	      continue;
-	    }
-	  goto finish_pcrel;
-
-	finish_pcrel:
-	  /* Make pc-relative.  */
-	  value -= (input_section->output_section->vma
-		    + input_section->output_offset
-		    + rel->r_offset) & ~ (bfd_vma) 0x3;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_SEGREL32MSB:
-	case R_IA64_SEGREL32LSB:
-	case R_IA64_SEGREL64MSB:
-	case R_IA64_SEGREL64LSB:
-	    {
-	      /* Find the segment that contains the output_section.  */
-	      Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
-		(output_bfd, sym_sec->output_section);
-
-	      if (p == NULL)
-		{
-		  r = bfd_reloc_notsupported;
-		}
-	      else
-		{
-		  /* The VMA of the segment is the vaddr of the associated
-		     program header.  */
-		  if (value > p->p_vaddr)
-		    value -= p->p_vaddr;
-		  else
-		    value = 0;
-		  r = ia64_elf_install_value (hit_addr, value, r_type);
-		}
-	      break;
-	    }
-
-	case R_IA64_SECREL32MSB:
-	case R_IA64_SECREL32LSB:
-	case R_IA64_SECREL64MSB:
-	case R_IA64_SECREL64LSB:
-	  /* Make output-section relative to section where the symbol
-	     is defined. PR 475  */
-	  if (sym_sec)
-	    value -= sym_sec->output_section->vma;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if ((dynamic_symbol_p || bfd_link_pic (info))
-	      && (input_section->flags & SEC_ALLOC) != 0)
-	    {
-	      /* VMS: FIXFD ??  */
-	      abort ();
-	    }
-
-	  if (r_type == R_IA64_IPLTMSB)
-	    r_type = R_IA64_DIR64MSB;
-	  else
-	    r_type = R_IA64_DIR64LSB;
-	  ia64_elf_install_value (hit_addr, value, r_type);
-	  r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
-	  break;
-
-	case R_IA64_TPREL14:
-	case R_IA64_TPREL22:
-	case R_IA64_TPREL64I:
-	  r = bfd_reloc_notsupported;
-	  break;
-
-	case R_IA64_DTPREL14:
-	case R_IA64_DTPREL22:
-	case R_IA64_DTPREL64I:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_DTPREL64MSB:
-	  r = bfd_reloc_notsupported;
-	  break;
-
-	case R_IA64_LTOFF_TPREL22:
-	case R_IA64_LTOFF_DTPMOD22:
-	case R_IA64_LTOFF_DTPREL22:
-	  r = bfd_reloc_notsupported;
-	  break;
-
-	default:
-	  r = bfd_reloc_notsupported;
-	  break;
-	}
-
-      switch (r)
-	{
-	case bfd_reloc_ok:
-	  break;
-
-	case bfd_reloc_undefined:
-	  /* This can happen for global table relative relocs if
-	     __gp is undefined.  This is a panic situation so we
-	     don't try to continue.  */
-	  (*info->callbacks->undefined_symbol)
-	    (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
-	  return false;
-
-	case bfd_reloc_notsupported:
-	  {
-	    const char *name;
-
-	    if (h)
-	      name = h->root.root.string;
-	    else
-	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec);
-	    (*info->callbacks->warning) (info, _("unsupported reloc"),
-					 name, input_bfd,
-					 input_section, rel->r_offset);
-	    ret_val = false;
-	  }
-	  break;
-
-	case bfd_reloc_dangerous:
-	case bfd_reloc_outofrange:
-	case bfd_reloc_overflow:
-	default:
-	  {
-	    const char *name;
-
-	    if (h)
-	      name = h->root.root.string;
-	    else
-	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec);
-
-	    switch (r_type)
-	      {
-	      case R_IA64_TPREL14:
-	      case R_IA64_TPREL22:
-	      case R_IA64_TPREL64I:
-	      case R_IA64_DTPREL14:
-	      case R_IA64_DTPREL22:
-	      case R_IA64_DTPREL64I:
-	      case R_IA64_DTPREL32LSB:
-	      case R_IA64_DTPREL32MSB:
-	      case R_IA64_DTPREL64LSB:
-	      case R_IA64_DTPREL64MSB:
-	      case R_IA64_LTOFF_TPREL22:
-	      case R_IA64_LTOFF_DTPMOD22:
-	      case R_IA64_LTOFF_DTPREL22:
-		_bfd_error_handler
-		  /* xgettext:c-format */
-		  (_("%pB: missing TLS section for relocation %s against `%s'"
-		     " at %#" PRIx64 " in section `%pA'."),
-		   input_bfd, howto->name, name,
-		   (uint64_t) rel->r_offset, input_section);
-		break;
-
-	      case R_IA64_PCREL21B:
-	      case R_IA64_PCREL21BI:
-	      case R_IA64_PCREL21M:
-	      case R_IA64_PCREL21F:
-		if (is_elf_hash_table (info->hash))
-		  {
-		    /* Relaxtion is always performed for ELF output.
-		       Overflow failures for those relocations mean
-		       that the section is too big to relax.  */
-		    _bfd_error_handler
-		      /* xgettext:c-format */
-		      (_("%pB: Can't relax br (%s) to `%s' "
-			 "at %#" PRIx64 " in section `%pA' "
-			 "with size %#" PRIx64 " (> 0x1000000)."),
-		       input_bfd, howto->name, name, (uint64_t) rel->r_offset,
-		       input_section, (uint64_t) input_section->size);
-		    break;
-		  }
-		/* Fall through.  */
-	      default:
-		(*info->callbacks->reloc_overflow) (info,
-						    &h->root,
-						    name,
-						    howto->name,
-						    (bfd_vma) 0,
-						    input_bfd,
-						    input_section,
-						    rel->r_offset);
-		break;
-	      }
-
-	    ret_val = false;
-	  }
-	  break;
-	}
-    }
-
-  return ret_val;
-}
-
-static bool
-elf64_ia64_finish_dynamic_symbol (bfd *output_bfd,
-				  struct bfd_link_info *info,
-				  struct elf_link_hash_entry *h,
-				  Elf_Internal_Sym *sym)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  struct elf64_ia64_dyn_sym_info *dyn_i;
-
-  ia64_info = elf64_ia64_hash_table (info);
-
-  dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
-
-  /* Fill in the PLT data, if required.  */
-  if (dyn_i && dyn_i->want_plt)
-    {
-      bfd_byte *loc;
-      asection *plt_sec;
-      bfd_vma plt_addr, pltoff_addr, gp_val;
-
-      gp_val = _bfd_get_gp_value (output_bfd);
-
-      plt_sec = ia64_info->root.splt;
-      plt_addr = 0;  /* Not used as overriden by FIXUPs.  */
-      pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true);
-
-      /* Initialize the FULL PLT entry, if needed.  */
-      if (dyn_i->want_plt2)
-	{
-	  loc = plt_sec->contents + dyn_i->plt2_offset;
-
-	  memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
-	  ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
-
-	  /* Mark the symbol as undefined, rather than as defined in the
-	     plt section.  Leave the value alone.  */
-	  /* ??? We didn't redefine it in adjust_dynamic_symbol in the
-	     first place.  But perhaps elflink.c did some for us.  */
-	  if (!h->def_regular)
-	    sym->st_shndx = SHN_UNDEF;
-	}
-
-      /* VMS: FIXFD.  */
-      elf64_ia64_install_fixup
-	(output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, ia64_info->pltoff_sec,
-	 pltoff_addr - (ia64_info->pltoff_sec->output_section->vma
-			+ ia64_info->pltoff_sec->output_offset), 0);
-    }
-
-  /* Mark some specially defined symbols as absolute.  */
-  if (h == ia64_info->root.hdynamic
-      || h == ia64_info->root.hgot
-      || h == ia64_info->root.hplt)
-    sym->st_shndx = SHN_ABS;
-
-  return true;
-}
-
-static bool
-elf64_ia64_finish_dynamic_sections (bfd *abfd,
-				    struct bfd_link_info *info)
-{
-  struct elf64_ia64_link_hash_table *ia64_info;
-  bfd *dynobj;
-
-  ia64_info = elf64_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  dynobj = ia64_info->root.dynobj;
-
-  if (elf_hash_table (info)->dynamic_sections_created)
-    {
-      Elf64_External_Dyn *dyncon, *dynconend;
-      asection *sdyn;
-      asection *unwind_sec;
-      bfd_vma gp_val;
-      unsigned int gp_seg;
-      bfd_vma gp_off;
-      Elf_Internal_Phdr *phdr;
-      Elf_Internal_Phdr *base_phdr;
-      unsigned int unwind_seg = 0;
-      unsigned int code_seg = 0;
-
-      sdyn = bfd_get_linker_section (dynobj, ".dynamic");
-      BFD_ASSERT (sdyn != NULL);
-      dyncon = (Elf64_External_Dyn *) sdyn->contents;
-      dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
-
-      gp_val = _bfd_get_gp_value (abfd);
-      phdr = _bfd_elf_find_segment_containing_section
-	(info->output_bfd, ia64_info->pltoff_sec->output_section);
-      BFD_ASSERT (phdr != NULL);
-      base_phdr = elf_tdata (info->output_bfd)->phdr;
-      gp_seg = phdr - base_phdr;
-      gp_off = gp_val - phdr->p_vaddr;
-
-      unwind_sec = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
-      if (unwind_sec != NULL)
-	{
-	  asection *code_sec;
-
-	  phdr = _bfd_elf_find_segment_containing_section (abfd, unwind_sec);
-	  BFD_ASSERT (phdr != NULL);
-	  unwind_seg = phdr - base_phdr;
-
-	  code_sec = bfd_get_section_by_name (abfd, "$CODE$");
-	  phdr = _bfd_elf_find_segment_containing_section (abfd, code_sec);
-	  BFD_ASSERT (phdr != NULL);
-	  code_seg = phdr - base_phdr;
-	}
-
-      for (; dyncon < dynconend; dyncon++)
-	{
-	  Elf_Internal_Dyn dyn;
-
-	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
-
-	  switch (dyn.d_tag)
-	    {
-	    case DT_IA_64_VMS_FIXUP_RELA_OFF:
-	      dyn.d_un.d_val +=
-		(ia64_info->fixups_sec->output_section->vma
-		 + ia64_info->fixups_sec->output_offset)
-		- (sdyn->output_section->vma + sdyn->output_offset);
-	      break;
-
-	    case DT_IA_64_VMS_PLTGOT_OFFSET:
-	      dyn.d_un.d_val = gp_off;
-	      break;
-
-	    case DT_IA_64_VMS_PLTGOT_SEG:
-	      dyn.d_un.d_val = gp_seg;
-	      break;
-
-	    case DT_IA_64_VMS_UNWINDSZ:
-	      if (unwind_sec == NULL)
-		{
-		  dyn.d_tag = DT_NULL;
-		  dyn.d_un.d_val = 0xdead;
-		}
-	      else
-		dyn.d_un.d_val = unwind_sec->size;
-	      break;
-
-	    case DT_IA_64_VMS_UNWIND_CODSEG:
-	      dyn.d_un.d_val = code_seg;
-	      break;
-
-	    case DT_IA_64_VMS_UNWIND_INFOSEG:
-	    case DT_IA_64_VMS_UNWIND_SEG:
-	      dyn.d_un.d_val = unwind_seg;
-	      break;
-
-	    case DT_IA_64_VMS_UNWIND_OFFSET:
-	      break;
-
-	    default:
-	      /* No need to rewrite the entry.  */
-	      continue;
-	    }
-
-	  bfd_elf64_swap_dyn_out (abfd, &dyn, dyncon);
-	}
-    }
-
-  /* Handle transfer addresses.  */
-  {
-    asection *tfr_sec = ia64_info->transfer_sec;
-    struct elf64_vms_transfer *tfr;
-    struct elf_link_hash_entry *tfr3;
-
-    tfr = (struct elf64_vms_transfer *)tfr_sec->contents;
-    bfd_putl32 (6 * 8, tfr->size);
-    bfd_putl64 (tfr_sec->output_section->vma
-		+ tfr_sec->output_offset
-		+ 6 * 8, tfr->tfradr3);
-
-    tfr3 = elf_link_hash_lookup (elf_hash_table (info), "ELF$TFRADR", false,
-				 false, false);
-
-    if (tfr3
-	&& (tfr3->root.type == bfd_link_hash_defined
-	    || tfr3->root.type == bfd_link_hash_defweak))
-      {
-	asection *tfr3_sec = tfr3->root.u.def.section;
-	bfd_vma tfr3_val;
-
-	tfr3_val = (tfr3->root.u.def.value
-		    + tfr3_sec->output_section->vma
-		    + tfr3_sec->output_offset);
-
-	bfd_putl64 (tfr3_val, tfr->tfr3_func);
-	bfd_putl64 (_bfd_get_gp_value (info->output_bfd), tfr->tfr3_gp);
-      }
-
-    /* FIXME: set linker flags,
-       handle lib$initialize.  */
-  }
-
-  return true;
-}
-
-/* ELF file flag handling:  */
-
-/* Function to keep IA-64 specific file flags.  */
-static bool
-elf64_ia64_set_private_flags (bfd *abfd, flagword flags)
-{
-  BFD_ASSERT (!elf_flags_init (abfd)
-	      || elf_elfheader (abfd)->e_flags == flags);
-
-  elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = true;
-  return true;
-}
-
-/* Merge backend specific data from an object file to the output
-   object file when linking.  */
-static bool
-elf64_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
-{
-  bfd *obfd = info->output_bfd;
-  flagword out_flags;
-  flagword in_flags;
-  bool ok = true;
-
-  /* FIXME: What should be checked when linking shared libraries?  */
-  if ((ibfd->flags & DYNAMIC) != 0)
-    return true;
-
-  /* Don't even pretend to support mixed-format linking.  */
-  if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
-      || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
-    return false;
-
-  in_flags  = elf_elfheader (ibfd)->e_flags;
-  out_flags = elf_elfheader (obfd)->e_flags;
-
-  if (! elf_flags_init (obfd))
-    {
-      elf_flags_init (obfd) = true;
-      elf_elfheader (obfd)->e_flags = in_flags;
-
-      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
-	  && bfd_get_arch_info (obfd)->the_default)
-	{
-	  return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
-				    bfd_get_mach (ibfd));
-	}
-
-      return true;
-    }
-
-  /* Check flag compatibility.  */
-  if (in_flags == out_flags)
-    return true;
-
-  /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set.  */
-  if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
-    elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
-
-  if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
-    {
-      _bfd_error_handler
-	(_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
-    {
-      _bfd_error_handler
-	(_("%pB: linking big-endian files with little-endian files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
-    {
-      _bfd_error_handler
-	(_("%pB: linking 64-bit files with 32-bit files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
-    {
-      _bfd_error_handler
-	(_("%pB: linking constant-gp files with non-constant-gp files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
-      != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
-    {
-      _bfd_error_handler
-	(_("%pB: linking auto-pic files with non-auto-pic files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-
-  return ok;
-}
-
-static bool
-elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
-{
-  FILE *file = (FILE *) ptr;
-  flagword flags = elf_elfheader (abfd)->e_flags;
-
-  BFD_ASSERT (abfd != NULL && ptr != NULL);
-
-  fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
-	   (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
-	   (flags & EF_IA_64_EXT) ? "EXT, " : "",
-	   (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
-	   (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
-	   (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
-	   (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
-	   (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
-	   (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
-
-  _bfd_elf_print_private_bfd_data (abfd, ptr);
-  return true;
-}
-
-static enum elf_reloc_type_class
-elf64_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
-			     const asection *rel_sec ATTRIBUTE_UNUSED,
-			     const Elf_Internal_Rela *rela)
-{
-  switch ((int) ELF64_R_TYPE (rela->r_info))
-    {
-    case R_IA64_REL32MSB:
-    case R_IA64_REL32LSB:
-    case R_IA64_REL64MSB:
-    case R_IA64_REL64LSB:
-      return reloc_class_relative;
-    case R_IA64_IPLTMSB:
-    case R_IA64_IPLTLSB:
-      return reloc_class_plt;
-    case R_IA64_COPY:
-      return reloc_class_copy;
-    default:
-      return reloc_class_normal;
-    }
-}
-
-static const struct bfd_elf_special_section elf64_ia64_special_sections[] =
-{
-  { STRING_COMMA_LEN (".sbss"),	 -1, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
-  { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
-  { NULL,		     0,	  0, 0,		   0 }
-};
-
-static bool
-elf64_ia64_object_p (bfd *abfd)
-{
-  asection *sec;
-  asection *group, *unwi, *unw;
-  flagword flags;
-  const char *name;
-  char *unwi_name, *unw_name;
-  size_t amt;
-
-  if (abfd->flags & DYNAMIC)
-    return true;
-
-  /* Flags for fake group section.  */
-  flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
-	   | SEC_EXCLUDE);
-
-  /* We add a fake section group for each .gnu.linkonce.t.* section,
-     which isn't in a section group, and its unwind sections.  */
-  for (sec = abfd->sections; sec != NULL; sec = sec->next)
-    {
-      if (elf_sec_group (sec) == NULL
-	  && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
-	      == (SEC_LINK_ONCE | SEC_CODE))
-	  && startswith (sec->name, ".gnu.linkonce.t."))
-	{
-	  name = sec->name + 16;
-
-	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
-	  unwi_name = bfd_alloc (abfd, amt);
-	  if (!unwi_name)
-	    return false;
-
-	  strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
-	  unwi = bfd_get_section_by_name (abfd, unwi_name);
-
-	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
-	  unw_name = bfd_alloc (abfd, amt);
-	  if (!unw_name)
-	    return false;
-
-	  strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
-	  unw = bfd_get_section_by_name (abfd, unw_name);
-
-	  /* We need to create a fake group section for it and its
-	     unwind sections.  */
-	  group = bfd_make_section_anyway_with_flags (abfd, name,
-						      flags);
-	  if (group == NULL)
-	    return false;
-
-	  /* Move the fake group section to the beginning.  */
-	  bfd_section_list_remove (abfd, group);
-	  bfd_section_list_prepend (abfd, group);
-
-	  elf_next_in_group (group) = sec;
-
-	  elf_group_name (sec) = name;
-	  elf_next_in_group (sec) = sec;
-	  elf_sec_group (sec) = group;
-
-	  if (unwi)
-	    {
-	      elf_group_name (unwi) = name;
-	      elf_next_in_group (unwi) = sec;
-	      elf_next_in_group (sec) = unwi;
-	      elf_sec_group (unwi) = group;
-	    }
-
-	   if (unw)
-	     {
-	       elf_group_name (unw) = name;
-	       if (unwi)
-		 {
-		   elf_next_in_group (unw) = elf_next_in_group (unwi);
-		   elf_next_in_group (unwi) = unw;
-		 }
-	       else
-		 {
-		   elf_next_in_group (unw) = sec;
-		   elf_next_in_group (sec) = unw;
-		 }
-	       elf_sec_group (unw) = group;
-	     }
-
-	   /* Fake SHT_GROUP section header.  */
-	  elf_section_data (group)->this_hdr.bfd_section = group;
-	  elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
-	}
-    }
-  return true;
-}
-
-/* Handle an IA-64 specific section when reading an object file.  This
-   is called when bfd_section_from_shdr finds a section with an unknown
-   type.  */
-
-static bool
-elf64_vms_section_from_shdr (bfd *abfd,
-			     Elf_Internal_Shdr *hdr,
-			     const char *name,
-			     int shindex)
-{
-  flagword secflags = 0;
-
-  switch (hdr->sh_type)
-    {
-    case SHT_IA_64_VMS_TRACE:
-    case SHT_IA_64_VMS_DEBUG:
-    case SHT_IA_64_VMS_DEBUG_STR:
-      secflags = SEC_DEBUGGING;
-      break;
-
-    case SHT_IA_64_UNWIND:
-    case SHT_IA_64_HP_OPT_ANOT:
-      break;
-
-    case SHT_IA_64_EXT:
-      if (strcmp (name, ELF_STRING_ia64_archext) != 0)
-	return false;
-      break;
-
-    default:
-      return false;
-    }
-
-  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
-    return false;
-
-  if (secflags != 0)
-    {
-      asection *newsect = hdr->bfd_section;
-
-      if (!bfd_set_section_flags (newsect,
-				  bfd_section_flags (newsect) | secflags))
-	return false;
-    }
-
-  return true;
-}
-
-static bool
-elf64_vms_object_p (bfd *abfd)
-{
-  Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
-  Elf_Internal_Phdr *i_phdr = elf_tdata (abfd)->phdr;
-  unsigned int i;
-  unsigned int num_text = 0;
-  unsigned int num_data = 0;
-  unsigned int num_rodata = 0;
-  char name[16];
-
-  if (!elf64_ia64_object_p (abfd))
-    return false;
-
-  /* Many VMS compilers do not generate sections for the corresponding
-     segment.  This is boring as binutils tools won't be able to disassemble
-     the code.  So we simply create all the missing sections.  */
-  for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
-    {
-      /* Is there a section for this segment?  */
-      bfd_vma base_vma = i_phdr->p_vaddr;
-      bfd_vma limit_vma = base_vma + i_phdr->p_filesz;
-
-      if (i_phdr->p_type != PT_LOAD)
-	continue;
-
-      /* We need to cover from base_vms to limit_vma.  */
-    again:
-      while (base_vma < limit_vma)
-	{
-	  bfd_vma next_vma = limit_vma;
-	  asection *nsec;
-	  asection *sec;
-	  flagword flags;
-	  char *nname = NULL;
-
-	  /* Find a section covering [base_vma;limit_vma)  */
-	  for (sec = abfd->sections; sec != NULL; sec = sec->next)
-	    {
-	      /* Skip uninteresting sections (either not in memory or
-		 below base_vma.  */
-	      if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0
-		  || sec->vma + sec->size <= base_vma)
-		continue;
-	      if (sec->vma <= base_vma)
-		{
-		  /* This section covers (maybe partially) the beginning
-		     of the range.  */
-		  base_vma = sec->vma + sec->size;
-		  goto again;
-		}
-	      if (sec->vma < next_vma)
-		{
-		  /* This section partially covers the end of the range.
-		     Used to compute the size of the hole.  */
-		  next_vma = sec->vma;
-		}
-	    }
-
-	  /* No section covering [base_vma; next_vma).  Create a fake one.  */
-	  flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
-	  if (i_phdr->p_flags & PF_X)
-	    {
-	      flags |= SEC_CODE;
-	      if (num_text++ == 0)
-		nname = ".text";
-	      else
-		sprintf (name, ".text$%u", num_text);
-	    }
-	  else if ((i_phdr->p_flags & (PF_R | PF_W)) == PF_R)
-	    {
-	      flags |= SEC_READONLY;
-	      sprintf (name, ".rodata$%u", num_rodata++);
-	    }
-	  else
-	    {
-	      flags |= SEC_DATA;
-	      sprintf (name, ".data$%u", num_data++);
-	    }
-
-	  /* Allocate name.  */
-	  if (nname == NULL)
-	    {
-	      size_t name_len = strlen (name) + 1;
-	      nname = bfd_alloc (abfd, name_len);
-	      if (nname == NULL)
-		return false;
-	      memcpy (nname, name, name_len);
-	    }
-
-	  /* Create and fill new section.  */
-	  nsec = bfd_make_section_anyway_with_flags (abfd, nname, flags);
-	  if (nsec == NULL)
-	    return false;
-	  nsec->vma = base_vma;
-	  nsec->size = next_vma - base_vma;
-	  nsec->filepos = i_phdr->p_offset + (base_vma - i_phdr->p_vaddr);
-
-	  base_vma = next_vma;
-	}
-    }
-  return true;
-}
-
-static bool
-elf64_vms_init_file_header (bfd *abfd, struct bfd_link_info *info)
-{
-  Elf_Internal_Ehdr *i_ehdrp;
-
-  if (!_bfd_elf_init_file_header (abfd, info))
-    return false;
-
-  i_ehdrp = elf_elfheader (abfd);
-  i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_OPENVMS;
-  i_ehdrp->e_ident[EI_ABIVERSION] = 2;
-  return true;
-}
-
-static bool
-elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED,
-			      Elf_Internal_Shdr *hdr)
-{
-  if (hdr->bfd_section != NULL)
-    {
-      const char *name = bfd_section_name (hdr->bfd_section);
-
-      if (strcmp (name, ".text") == 0)
-	hdr->sh_flags |= SHF_IA_64_VMS_SHARED;
-      else if ((strcmp (name, ".debug") == 0)
-	    || (strcmp (name, ".debug_abbrev") == 0)
-	    || (strcmp (name, ".debug_aranges") == 0)
-	    || (strcmp (name, ".debug_frame") == 0)
-	    || (strcmp (name, ".debug_info") == 0)
-	    || (strcmp (name, ".debug_loc") == 0)
-	    || (strcmp (name, ".debug_macinfo") == 0)
-	    || (strcmp (name, ".debug_pubnames") == 0)
-	    || (strcmp (name, ".debug_pubtypes") == 0))
-	hdr->sh_type = SHT_IA_64_VMS_DEBUG;
-      else if ((strcmp (name, ".debug_line") == 0)
-	    || (strcmp (name, ".debug_ranges") == 0)
-	    || (strcmp (name, ".trace_info") == 0)
-	    || (strcmp (name, ".trace_abbrev") == 0)
-	    || (strcmp (name, ".trace_aranges") == 0))
-	hdr->sh_type = SHT_IA_64_VMS_TRACE;
-      else if (strcmp (name, ".debug_str") == 0)
-	hdr->sh_type = SHT_IA_64_VMS_DEBUG_STR;
-    }
-
-  return true;
-}
-
-/* The final processing done just before writing out a VMS IA-64 ELF
-   object file.  */
-
-static bool
-elf64_vms_final_write_processing (bfd *abfd)
-{
-  Elf_Internal_Shdr *hdr;
-  asection *s;
-  int unwind_info_sect_idx = 0;
-
-  for (s = abfd->sections; s; s = s->next)
-    {
-      hdr = &elf_section_data (s)->this_hdr;
-
-      if (strcmp (bfd_section_name (hdr->bfd_section),
-		  ".IA_64.unwind_info") == 0)
-	unwind_info_sect_idx = elf_section_data (s)->this_idx;
-
-      switch (hdr->sh_type)
-	{
-	case SHT_IA_64_UNWIND:
-	  /* VMS requires sh_info to point to the unwind info section.  */
-	  hdr->sh_info = unwind_info_sect_idx;
-	  break;
-	}
-    }
-
-  if (! elf_flags_init (abfd))
-    {
-      unsigned long flags = 0;
-
-      if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
-	flags |= EF_IA_64_BE;
-      if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
-	flags |= EF_IA_64_ABI64;
-
-      elf_elfheader (abfd)->e_flags = flags;
-      elf_flags_init (abfd) = true;
-    }
-  return _bfd_elf_final_write_processing (abfd);
-}
-
-static bool
-elf64_vms_write_shdrs_and_ehdr (bfd *abfd)
-{
-  unsigned char needed_count[8];
-
-  if (!bfd_elf64_write_shdrs_and_ehdr (abfd))
-    return false;
-
-  bfd_putl64 (elf_ia64_vms_tdata (abfd)->needed_count, needed_count);
-
-  if (bfd_seek (abfd, sizeof (Elf64_External_Ehdr), SEEK_SET) != 0
-      || bfd_write (needed_count, 8, abfd) != 8)
-    return false;
-
-  return true;
-}
-
-static bool
-elf64_vms_close_and_cleanup (bfd *abfd)
-{
-  bool ret = true;
-  if (bfd_get_format (abfd) == bfd_object
-      && bfd_write_p (abfd))
-    {
-      long isize;
-
-      /* Pad to 8 byte boundary for IPF/VMS.  */
-      isize = bfd_get_size (abfd);
-      if ((isize & 7) != 0)
-	{
-	  unsigned int ishort = 8 - (isize & 7);
-	  uint64_t pad = 0;
-
-	  if (bfd_seek (abfd, isize, SEEK_SET) != 0
-	      || bfd_write (&pad, ishort, abfd) != ishort)
-	    ret = false;
-	}
-    }
-
-  return _bfd_generic_close_and_cleanup (abfd) && ret;
-}
-
-/* Add symbols from an ELF object file to the linker hash table.  */
-
-static bool
-elf64_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
-{
-  Elf_Internal_Shdr *hdr;
-  bfd_size_type symcount;
-  bfd_size_type extsymcount;
-  bfd_size_type extsymoff;
-  struct elf_link_hash_entry **sym_hash;
-  bool dynamic;
-  Elf_Internal_Sym *isymbuf = NULL;
-  Elf_Internal_Sym *isym;
-  Elf_Internal_Sym *isymend;
-  const struct elf_backend_data *bed;
-  struct elf_link_hash_table *htab;
-  bfd_size_type amt;
-
-  htab = elf_hash_table (info);
-  bed = get_elf_backend_data (abfd);
-
-  if ((abfd->flags & DYNAMIC) == 0)
-    dynamic = false;
-  else
-    {
-      dynamic = true;
-
-      /* You can't use -r against a dynamic object.  Also, there's no
-	 hope of using a dynamic object which does not exactly match
-	 the format of the output file.  */
-      if (bfd_link_relocatable (info)
-	  || !is_elf_hash_table (&htab->root)
-	  || info->output_bfd->xvec != abfd->xvec)
-	{
-	  if (bfd_link_relocatable (info))
-	    bfd_set_error (bfd_error_invalid_operation);
-	  else
-	    bfd_set_error (bfd_error_wrong_format);
-	  goto error_return;
-	}
-    }
-
-  if (! dynamic)
-    {
-      /* If we are creating a shared library, create all the dynamic
-	 sections immediately.  We need to attach them to something,
-	 so we attach them to this BFD, provided it is the right
-	 format.  FIXME: If there are no input BFD's of the same
-	 format as the output, we can't make a shared library.  */
-      if (bfd_link_pic (info)
-	  && is_elf_hash_table (&htab->root)
-	  && info->output_bfd->xvec == abfd->xvec
-	  && !htab->dynamic_sections_created)
-	{
-	  if (! elf64_ia64_create_dynamic_sections (abfd, info))
-	    goto error_return;
-	}
-    }
-  else if (!is_elf_hash_table (&htab->root))
-    goto error_return;
-  else
-    {
-      asection *s;
-      bfd_byte *dynbuf;
-      bfd_byte *extdyn;
-
-      /* ld --just-symbols and dynamic objects don't mix very well.
-	 ld shouldn't allow it.  */
-      if ((s = abfd->sections) != NULL
-	  && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
-	abort ();
-
-      /* Be sure there are dynamic sections.  */
-      if (! elf64_ia64_create_dynamic_sections (htab->dynobj, info))
-	goto error_return;
-
-      s = bfd_get_section_by_name (abfd, ".dynamic");
-      if (s == NULL)
-	{
-	  /* VMS libraries do not have dynamic sections.  Create one from
-	     the segment.  */
-	  Elf_Internal_Phdr *phdr;
-	  unsigned int i, phnum;
-
-	  phdr = elf_tdata (abfd)->phdr;
-	  if (phdr == NULL)
-	    goto error_return;
-	  phnum = elf_elfheader (abfd)->e_phnum;
-	  for (i = 0; i < phnum; phdr++)
-	    if (phdr->p_type == PT_DYNAMIC)
-	      {
-		s = bfd_make_section (abfd, ".dynamic");
-		if (s == NULL)
-		  goto error_return;
-		s->vma = phdr->p_vaddr;
-		s->lma = phdr->p_paddr;
-		s->size = phdr->p_filesz;
-		s->filepos = phdr->p_offset;
-		s->flags |= SEC_HAS_CONTENTS;
-		s->alignment_power = bfd_log2 (phdr->p_align);
-		break;
-	      }
-	  if (s == NULL)
-	    goto error_return;
-	}
-
-      /* Extract IDENT.  */
-      if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
-	{
-	error_free_dyn:
-	  free (dynbuf);
-	  goto error_return;
-	}
-
-      for (extdyn = dynbuf;
-	   (size_t) (dynbuf + s->size - extdyn) >= bed->s->sizeof_dyn;
-	   extdyn += bed->s->sizeof_dyn)
-	{
-	  Elf_Internal_Dyn dyn;
-
-	  bed->s->swap_dyn_in (abfd, extdyn, &dyn);
-	  if (dyn.d_tag == DT_IA_64_VMS_IDENT)
-	    {
-	      uint64_t tagv = dyn.d_un.d_val;
-	      elf_ia64_vms_ident (abfd) = tagv;
-	      break;
-	    }
-	}
-      if (extdyn >= dynbuf + s->size)
-	{
-	  /* Ident not found.  */
-	  goto error_free_dyn;
-	}
-      free (dynbuf);
-
-      /* We do not want to include any of the sections in a dynamic
-	 object in the output file.  We hack by simply clobbering the
-	 list of sections in the BFD.  This could be handled more
-	 cleanly by, say, a new section flag; the existing
-	 SEC_NEVER_LOAD flag is not the one we want, because that one
-	 still implies that the section takes up space in the output
-	 file.  */
-      bfd_section_list_clear (abfd);
-
-      /* FIXME: should we detect if this library is already included ?
-	 This should be harmless and shouldn't happen in practice.  */
-    }
-
-  hdr = &elf_tdata (abfd)->symtab_hdr;
-  symcount = hdr->sh_size / bed->s->sizeof_sym;
-
-  /* The sh_info field of the symtab header tells us where the
-     external symbols start.  We don't care about the local symbols at
-     this point.  */
-  extsymcount = symcount - hdr->sh_info;
-  extsymoff = hdr->sh_info;
-
-  sym_hash = NULL;
-  if (extsymcount != 0)
-    {
-      isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
-				      NULL, NULL, NULL);
-      if (isymbuf == NULL)
-	goto error_return;
-
-      /* We store a pointer to the hash table entry for each external
-	 symbol.  */
-      amt = extsymcount * sizeof (struct elf_link_hash_entry *);
-      sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt);
-      if (sym_hash == NULL)
-	goto error_free_sym;
-      elf_sym_hashes (abfd) = sym_hash;
-    }
-
-  for (isym = isymbuf, isymend = isymbuf + extsymcount;
-       isym < isymend;
-       isym++, sym_hash++)
-    {
-      int bind;
-      bfd_vma value;
-      asection *sec, *new_sec;
-      flagword flags;
-      const char *name;
-      struct elf_link_hash_entry *h;
-      bool definition;
-      bool size_change_ok;
-      bool type_change_ok;
-      bool common;
-      unsigned int old_alignment;
-      bfd *old_bfd;
-
-      flags = BSF_NO_FLAGS;
-      sec = NULL;
-      value = isym->st_value;
-      *sym_hash = NULL;
-      common = bed->common_definition (isym);
-
-      bind = ELF_ST_BIND (isym->st_info);
-      switch (bind)
-	{
-	case STB_LOCAL:
-	  /* This should be impossible, since ELF requires that all
-	     global symbols follow all local symbols, and that sh_info
-	     point to the first global symbol.  Unfortunately, Irix 5
-	     screws this up.  */
-	  continue;
-
-	case STB_GLOBAL:
-	  if (isym->st_shndx != SHN_UNDEF && !common)
-	    flags = BSF_GLOBAL;
-	  break;
-
-	case STB_WEAK:
-	  flags = BSF_WEAK;
-	  break;
-
-	case STB_GNU_UNIQUE:
-	  flags = BSF_GNU_UNIQUE;
-	  break;
-
-	default:
-	  /* Leave it up to the processor backend.  */
-	  break;
-	}
-
-      if (isym->st_shndx == SHN_UNDEF)
-	sec = bfd_und_section_ptr;
-      else if (isym->st_shndx == SHN_ABS)
-	sec = bfd_abs_section_ptr;
-      else if (isym->st_shndx == SHN_COMMON)
-	{
-	  sec = bfd_com_section_ptr;
-	  /* What ELF calls the size we call the value.  What ELF
-	     calls the value we call the alignment.  */
-	  value = isym->st_size;
-	}
-      else
-	{
-	  sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-	  if (sec == NULL)
-	    sec = bfd_abs_section_ptr;
-	  else if (sec->kept_section)
-	    {
-	      /* Symbols from discarded section are undefined.  We keep
-		 its visibility.  */
-	      sec = bfd_und_section_ptr;
-	      isym->st_shndx = SHN_UNDEF;
-	    }
-	  else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
-	    value -= sec->vma;
-	}
-
-      name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
-					      isym->st_name);
-      if (name == NULL)
-	goto error_free_vers;
-
-      if (bed->elf_add_symbol_hook)
-	{
-	  if (! (*bed->elf_add_symbol_hook) (abfd, info, isym, &name, &flags,
-					     &sec, &value))
-	    goto error_free_vers;
-
-	  /* The hook function sets the name to NULL if this symbol
-	     should be skipped for some reason.  */
-	  if (name == NULL)
-	    continue;
-	}
-
-      /* Sanity check that all possibilities were handled.  */
-      if (sec == NULL)
-	{
-	  bfd_set_error (bfd_error_bad_value);
-	  goto error_free_vers;
-	}
-
-      if (bfd_is_und_section (sec)
-	  || bfd_is_com_section (sec))
-	definition = false;
-      else
-	definition = true;
-
-      size_change_ok = false;
-      type_change_ok = bed->type_change_ok;
-      old_alignment = 0;
-      old_bfd = NULL;
-      new_sec = sec;
-
-      if (! bfd_is_und_section (sec))
-	h = elf_link_hash_lookup (htab, name, true, false, false);
-      else
-	h = ((struct elf_link_hash_entry *) bfd_wrapped_link_hash_lookup
-	     (abfd, info, name, true, false, false));
-      if (h == NULL)
-	goto error_free_sym;
-
-      *sym_hash = h;
-
-      if (is_elf_hash_table (&htab->root))
-	{
-	  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;
-
-	  /* Remember the old alignment if this is a common symbol, so
-	     that we don't reduce the alignment later on.  We can't
-	     check later, because _bfd_generic_link_add_one_symbol
-	     will set a default for the alignment which we want to
-	     override. We also remember the old bfd where the existing
-	     definition comes from.  */
-	  switch (h->root.type)
-	    {
-	    default:
-	      break;
-
-	    case bfd_link_hash_defined:
-	      if (abfd->selective_search)
-		continue;
-	      /* Fall-through.  */
-	    case bfd_link_hash_defweak:
-	      old_bfd = h->root.u.def.section->owner;
-	      break;
-
-	    case bfd_link_hash_common:
-	      old_bfd = h->root.u.c.p->section->owner;
-	      old_alignment = h->root.u.c.p->alignment_power;
-	      break;
-	    }
-	}
-
-      if (! (_bfd_generic_link_add_one_symbol
-	     (info, abfd, name, flags, sec, value, NULL, false, bed->collect,
-	      (struct bfd_link_hash_entry **) sym_hash)))
-	goto error_free_vers;
-
-      h = *sym_hash;
-      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;
-
-      *sym_hash = h;
-      if (definition)
-	h->unique_global = (flags & BSF_GNU_UNIQUE) != 0;
-
-      /* Set the alignment of a common symbol.  */
-      if ((common || bfd_is_com_section (sec))
-	  && h->root.type == bfd_link_hash_common)
-	{
-	  unsigned int align;
-
-	  if (common)
-	    align = bfd_log2 (isym->st_value);
-	  else
-	    {
-	      /* The new symbol is a common symbol in a shared object.
-		 We need to get the alignment from the section.  */
-	      align = new_sec->alignment_power;
-	    }
-	  if (align > old_alignment
-	      /* Permit an alignment power of zero if an alignment of one
-		 is specified and no other alignments have been specified.  */
-	      || (isym->st_value == 1 && old_alignment == 0))
-	    h->root.u.c.p->alignment_power = align;
-	  else
-	    h->root.u.c.p->alignment_power = old_alignment;
-	}
-
-      if (is_elf_hash_table (&htab->root))
-	{
-	  /* Check the alignment when a common symbol is involved. This
-	     can change when a common symbol is overridden by a normal
-	     definition or a common symbol is ignored due to the old
-	     normal definition. We need to make sure the maximum
-	     alignment is maintained.  */
-	  if ((old_alignment || common)
-	      && h->root.type != bfd_link_hash_common)
-	    {
-	      unsigned int common_align;
-	      unsigned int normal_align;
-	      unsigned int symbol_align;
-	      bfd *normal_bfd;
-	      bfd *common_bfd;
-
-	      symbol_align = ffs (h->root.u.def.value) - 1;
-	      if (h->root.u.def.section->owner != NULL
-		  && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
-		{
-		  normal_align = h->root.u.def.section->alignment_power;
-		  if (normal_align > symbol_align)
-		    normal_align = symbol_align;
-		}
-	      else
-		normal_align = symbol_align;
-
-	      if (old_alignment)
-		{
-		  common_align = old_alignment;
-		  common_bfd = old_bfd;
-		  normal_bfd = abfd;
-		}
-	      else
-		{
-		  common_align = bfd_log2 (isym->st_value);
-		  common_bfd = abfd;
-		  normal_bfd = old_bfd;
-		}
-
-	      if (normal_align < common_align)
-		{
-		  /* PR binutils/2735 */
-		  if (normal_bfd == NULL)
-		    _bfd_error_handler
-		      /* xgettext:c-format */
-		      (_("warning: alignment %u of common symbol `%s' in %pB"
-			 " is greater than the alignment (%u) of its section %pA"),
-		       1 << common_align, name, common_bfd,
-		       1 << normal_align, h->root.u.def.section);
-		  else
-		    _bfd_error_handler
-		      /* xgettext:c-format */
-		      (_("warning: alignment %u of symbol `%s' in %pB"
-			 " is smaller than %u in %pB"),
-		       1 << normal_align, name, normal_bfd,
-		       1 << common_align, common_bfd);
-		}
-	    }
-
-	  /* Remember the symbol size if it isn't undefined.  */
-	  if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF)
-	      && (definition || h->size == 0))
-	    {
-	      if (h->size != 0
-		  && h->size != isym->st_size
-		  && ! size_change_ok)
-		_bfd_error_handler
-		  /* xgettext:c-format */
-		  (_("warning: size of symbol `%s' changed"
-		     " from %" PRIu64 " in %pB to %" PRIu64 " in %pB"),
-		   name, (uint64_t) h->size, old_bfd,
-		   (uint64_t) isym->st_size, abfd);
-
-	      h->size = isym->st_size;
-	    }
-
-	  /* If this is a common symbol, then we always want H->SIZE
-	     to be the size of the common symbol.  The code just above
-	     won't fix the size if a common symbol becomes larger.  We
-	     don't warn about a size change here, because that is
-	     covered by --warn-common.  Allow changed between different
-	     function types.  */
-	  if (h->root.type == bfd_link_hash_common)
-	    h->size = h->root.u.c.size;
-
-	  if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE
-	      && (definition || h->type == STT_NOTYPE))
-	    {
-	      unsigned int type = ELF_ST_TYPE (isym->st_info);
-
-	      if (h->type != type)
-		{
-		  if (h->type != STT_NOTYPE && ! type_change_ok)
-		    _bfd_error_handler
-		      /* xgettext:c-format */
-		      (_("warning: type of symbol `%s' changed"
-			 " from %d to %d in %pB"),
-		       name, h->type, type, abfd);
-
-		  h->type = type;
-		}
-	    }
-
-	  /* Set a flag in the hash table entry indicating the type of
-	     reference or definition we just found.  Keep a count of
-	     the number of dynamic symbols we find.  A dynamic symbol
-	     is one which is referenced or defined by both a regular
-	     object and a shared object.  */
-	  if (! dynamic)
-	    {
-	      if (! definition)
-		{
-		  h->ref_regular = 1;
-		  if (bind != STB_WEAK)
-		    h->ref_regular_nonweak = 1;
-		}
-	      else
-		{
-		  BFD_ASSERT (!h->def_dynamic);
-		  h->def_regular = 1;
-		}
-	    }
-	  else
-	    {
-	      BFD_ASSERT (definition);
-	      h->def_dynamic = 1;
-	      h->dynindx = -2;
-	      ((struct elf64_ia64_link_hash_entry *)h)->shl = abfd;
-	    }
-	}
-    }
-
-  free (isymbuf);
-  isymbuf = NULL;
-
-  /* If this object is the same format as the output object, and it is
-     not a shared library, then let the backend look through the
-     relocs.
-
-     This is required to build global offset table entries and to
-     arrange for dynamic relocs.  It is not required for the
-     particular common case of linking non PIC code, even when linking
-     against shared libraries, but unfortunately there is no way of
-     knowing whether an object file has been compiled PIC or not.
-     Looking through the relocs is not particularly time consuming.
-     The problem is that we must either (1) keep the relocs in memory,
-     which causes the linker to require additional runtime memory or
-     (2) read the relocs twice from the input file, which wastes time.
-     This would be a good case for using mmap.
-
-     I have no idea how to handle linking PIC code into a file of a
-     different format.  It probably can't be done.  */
-  if (! dynamic
-      && is_elf_hash_table (&htab->root)
-      && bed->check_relocs != NULL
-      && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
-    {
-      asection *o;
-
-      for (o = abfd->sections; o != NULL; o = o->next)
-	{
-	  Elf_Internal_Rela *internal_relocs;
-	  bool ok;
-
-	  if ((o->flags & SEC_RELOC) == 0
-	      || o->reloc_count == 0
-	      || ((info->strip == strip_all || info->strip == strip_debugger)
-		  && (o->flags & SEC_DEBUGGING) != 0)
-	      || bfd_is_abs_section (o->output_section))
-	    continue;
-
-	  internal_relocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
-						       info->keep_memory);
-	  if (internal_relocs == NULL)
-	    goto error_return;
-
-	  ok = (*bed->check_relocs) (abfd, info, o, internal_relocs);
-
-	  if (elf_section_data (o)->relocs != internal_relocs)
-	    free (internal_relocs);
-
-	  if (! ok)
-	    goto error_return;
-	}
-    }
-
-  return true;
-
- error_free_vers:
- error_free_sym:
-  free (isymbuf);
- error_return:
-  return false;
-}
-
-static bool
-elf64_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
-{
-  int pass;
-  struct bfd_link_hash_entry **pundef;
-  struct bfd_link_hash_entry **next_pundef;
-
-  /* We only accept VMS libraries.  */
-  if (info->output_bfd->xvec != abfd->xvec)
-    {
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
-
-  /* The archive_pass field in the archive itself is used to
-     initialize PASS, since we may search the same archive multiple
-     times.  */
-  pass = ++abfd->archive_pass;
-
-  /* Look through the list of undefined symbols.  */
-  for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
-    {
-      struct bfd_link_hash_entry *h;
-      symindex symidx;
-      bfd *element;
-      bfd *orig_element;
-
-      h = *pundef;
-      next_pundef = &(*pundef)->u.undef.next;
-
-      /* When a symbol is defined, it is not necessarily removed from
-	 the list.  */
-      if (h->type != bfd_link_hash_undefined
-	  && h->type != bfd_link_hash_common)
-	{
-	  /* Remove this entry from the list, for general cleanliness
-	     and because we are going to look through the list again
-	     if we search any more libraries.  We can't remove the
-	     entry if it is the tail, because that would lose any
-	     entries we add to the list later on.  */
-	  if (*pundef != info->hash->undefs_tail)
-	    {
-	      *pundef = *next_pundef;
-	      next_pundef = pundef;
-	    }
-	  continue;
-	}
-
-      /* Look for this symbol in the archive hash table.  */
-      symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
-      if (symidx == BFD_NO_MORE_SYMBOLS)
-	{
-	  /* Nothing in this slot.  */
-	  continue;
-	}
-
-      element = bfd_get_elt_at_index (abfd, symidx);
-      if (element == NULL)
-	return false;
-
-      if (element->archive_pass == -1 || element->archive_pass == pass)
-	{
-	  /* Next symbol if this archive is wrong or already handled.  */
-	  continue;
-	}
-
-      orig_element = element;
-      if (bfd_is_thin_archive (abfd))
-	{
-	  element = _bfd_vms_lib_get_imagelib_file (element);
-	  if (element == NULL || !bfd_check_format (element, bfd_object))
-	    {
-	      orig_element->archive_pass = -1;
-	      return false;
-	    }
-	}
-      else if (! bfd_check_format (element, bfd_object))
-	{
-	  element->archive_pass = -1;
-	  return false;
-	}
-
-      /* Unlike the generic linker, we know that this element provides
-	 a definition for an undefined symbol and we know that we want
-	 to include it.  We don't need to check anything.  */
-      if (! (*info->callbacks->add_archive_element) (info, element,
-						     h->root.string, &element))
-	continue;
-      if (! elf64_vms_link_add_object_symbols (element, info))
-	return false;
-
-      orig_element->archive_pass = pass;
-    }
-
-  return true;
-}
-
-static bool
-elf64_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
-{
-  switch (bfd_get_format (abfd))
-    {
-    case bfd_object:
-      return elf64_vms_link_add_object_symbols (abfd, info);
-      break;
-    case bfd_archive:
-      return elf64_vms_link_add_archive_symbols (abfd, info);
-      break;
-    default:
-      bfd_set_error (bfd_error_wrong_format);
-      return false;
-    }
-}
-
-static bool
-elf64_ia64_vms_mkobject (bfd *abfd)
-{
-  return bfd_elf_allocate_object
-    (abfd, sizeof (struct elf64_ia64_vms_obj_tdata), IA64_ELF_DATA);
-}
-
-
-/* Size-dependent data and functions.  */
-static const struct elf_size_info elf64_ia64_vms_size_info = {
-  sizeof (Elf64_External_VMS_Ehdr),
-  sizeof (Elf64_External_Phdr),
-  sizeof (Elf64_External_Shdr),
-  sizeof (Elf64_External_Rel),
-  sizeof (Elf64_External_Rela),
-  sizeof (Elf64_External_Sym),
-  sizeof (Elf64_External_Dyn),
-  sizeof (Elf_External_Note),
-  4,
-  1,
-  64, 3, /* ARCH_SIZE, LOG_FILE_ALIGN */
-  ELFCLASS64, EV_CURRENT,
-  bfd_elf64_write_out_phdrs,
-  elf64_vms_write_shdrs_and_ehdr,
-  bfd_elf64_checksum_contents,
-  bfd_elf64_write_relocs,
-  bfd_elf64_swap_symbol_in,
-  bfd_elf64_swap_symbol_out,
-  bfd_elf64_slurp_reloc_table,
-  bfd_elf64_slurp_symbol_table,
-  bfd_elf64_swap_dyn_in,
-  bfd_elf64_swap_dyn_out,
-  bfd_elf64_swap_reloc_in,
-  bfd_elf64_swap_reloc_out,
-  bfd_elf64_swap_reloca_in,
-  bfd_elf64_swap_reloca_out
-};
-
-#define ELF_ARCH			bfd_arch_ia64
-#define ELF_MACHINE_CODE		EM_IA_64
-#define ELF_MAXPAGESIZE			0x10000	/* 64KB */
-#define ELF_COMMONPAGESIZE		0x200	/* 16KB */
-
-#define elf_backend_section_from_shdr \
-	elf64_ia64_section_from_shdr
-#define elf_backend_section_flags \
-	elf64_ia64_section_flags
-#define elf_backend_fake_sections \
-	elf64_ia64_fake_sections
-#define elf_backend_final_write_processing \
-	elf64_ia64_final_write_processing
-#define elf_backend_add_symbol_hook \
-	elf64_ia64_add_symbol_hook
-#define elf_info_to_howto \
-	elf64_ia64_info_to_howto
-
-#define bfd_elf64_bfd_reloc_type_lookup \
-	ia64_elf_reloc_type_lookup
-#define bfd_elf64_bfd_reloc_name_lookup \
-	ia64_elf_reloc_name_lookup
-#define bfd_elf64_bfd_is_local_label_name \
-	elf64_ia64_is_local_label_name
-#define bfd_elf64_bfd_relax_section \
-	elf64_ia64_relax_section
-
-#define elf_backend_object_p \
-	elf64_ia64_object_p
-
-/* Stuff for the BFD linker: */
-#define bfd_elf64_bfd_link_hash_table_create \
-	elf64_ia64_hash_table_create
-#define elf_backend_create_dynamic_sections \
-	elf64_ia64_create_dynamic_sections
-#define elf_backend_check_relocs \
-	elf64_ia64_check_relocs
-#define elf_backend_adjust_dynamic_symbol \
-	elf64_ia64_adjust_dynamic_symbol
-#define elf_backend_late_size_sections \
-	elf64_ia64_late_size_sections
-#define elf_backend_omit_section_dynsym \
-	_bfd_elf_omit_section_dynsym_all
-#define elf_backend_relocate_section \
-	elf64_ia64_relocate_section
-#define elf_backend_finish_dynamic_symbol \
-	elf64_ia64_finish_dynamic_symbol
-#define elf_backend_finish_dynamic_sections \
-	elf64_ia64_finish_dynamic_sections
-#define bfd_elf64_bfd_final_link \
-	elf64_ia64_final_link
-
-#define bfd_elf64_bfd_merge_private_bfd_data \
-	elf64_ia64_merge_private_bfd_data
-#define bfd_elf64_bfd_set_private_flags \
-	elf64_ia64_set_private_flags
-#define bfd_elf64_bfd_print_private_bfd_data \
-	elf64_ia64_print_private_bfd_data
-
-#define elf_backend_plt_readonly	1
-#define elf_backend_want_plt_sym	0
-#define elf_backend_plt_alignment	5
-#define elf_backend_got_header_size	0
-#define elf_backend_want_got_plt	1
-#define elf_backend_may_use_rel_p	1
-#define elf_backend_may_use_rela_p	1
-#define elf_backend_default_use_rela_p	1
-#define elf_backend_want_dynbss		0
-#define elf_backend_hide_symbol		elf64_ia64_hash_hide_symbol
-#define elf_backend_fixup_symbol	_bfd_elf_link_hash_fixup_symbol
-#define elf_backend_reloc_type_class	elf64_ia64_reloc_type_class
-#define elf_backend_rela_normal		1
-#define elf_backend_special_sections	elf64_ia64_special_sections
-#define elf_backend_default_execstack	0
-
-/* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
-   SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
-   We don't want to flood users with so many error messages. We turn
-   off the warning for now. It will be turned on later when the Intel
-   compiler is fixed.   */
-#define elf_backend_link_order_error_handler NULL
-
-/* VMS-specific vectors.  */
-
-#undef  TARGET_LITTLE_SYM
-#define TARGET_LITTLE_SYM		ia64_elf64_vms_vec
-#undef  TARGET_LITTLE_NAME
-#define TARGET_LITTLE_NAME		"elf64-ia64-vms"
-#undef  TARGET_BIG_SYM
-#undef  TARGET_BIG_NAME
-
-/* These are VMS specific functions.  */
-
-#undef  elf_backend_object_p
-#define elf_backend_object_p elf64_vms_object_p
-
-#undef  elf_backend_section_from_shdr
-#define elf_backend_section_from_shdr elf64_vms_section_from_shdr
-
-#undef  elf_backend_init_file_header
-#define elf_backend_init_file_header elf64_vms_init_file_header
-
-#undef  elf_backend_section_processing
-#define elf_backend_section_processing elf64_vms_section_processing
-
-#undef  elf_backend_final_write_processing
-#define elf_backend_final_write_processing elf64_vms_final_write_processing
-
-#undef  bfd_elf64_close_and_cleanup
-#define bfd_elf64_close_and_cleanup elf64_vms_close_and_cleanup
-
-#undef  elf_backend_section_from_bfd_section
-
-#undef  elf_backend_symbol_processing
-
-#undef  elf_backend_want_p_paddr_set_to_zero
-
-#undef  ELF_OSABI
-#define ELF_OSABI			ELFOSABI_OPENVMS
-
-#undef  ELF_MAXPAGESIZE
-#define ELF_MAXPAGESIZE			0x10000	/* 64KB */
-
-#undef  elf64_bed
-#define elf64_bed elf64_ia64_vms_bed
-
-#define elf_backend_size_info elf64_ia64_vms_size_info
-
-/* Use VMS-style archives (in particular, don't use the standard coff
-   archive format).  */
-#define bfd_elf64_archive_functions
-
-#undef bfd_elf64_archive_p
-#define bfd_elf64_archive_p _bfd_vms_lib_ia64_archive_p
-#undef bfd_elf64_write_archive_contents
-#define bfd_elf64_write_archive_contents _bfd_vms_lib_write_archive_contents
-#undef bfd_elf64_mkarchive
-#define bfd_elf64_mkarchive _bfd_vms_lib_ia64_mkarchive
-
-#define bfd_elf64_archive_slurp_armap \
-  _bfd_vms_lib_slurp_armap
-#define bfd_elf64_archive_slurp_extended_name_table \
-  _bfd_vms_lib_slurp_extended_name_table
-#define bfd_elf64_archive_construct_extended_name_table \
-  _bfd_vms_lib_construct_extended_name_table
-#define bfd_elf64_archive_truncate_arname \
-  _bfd_vms_lib_truncate_arname
-#define bfd_elf64_archive_write_armap \
-  _bfd_vms_lib_write_armap
-#define bfd_elf64_archive_read_ar_hdr \
-  _bfd_vms_lib_read_ar_hdr
-#define bfd_elf64_archive_write_ar_hdr \
-  _bfd_vms_lib_write_ar_hdr
-#define bfd_elf64_archive_openr_next_archived_file \
-  _bfd_vms_lib_openr_next_archived_file
-#define bfd_elf64_archive_get_elt_at_index \
-  _bfd_vms_lib_get_elt_at_index
-#define bfd_elf64_archive_generic_stat_arch_elt \
-  _bfd_vms_lib_generic_stat_arch_elt
-#define bfd_elf64_archive_update_armap_timestamp \
-  _bfd_vms_lib_update_armap_timestamp
-
-/* VMS link methods.  */
-#undef  bfd_elf64_bfd_link_add_symbols
-#define bfd_elf64_bfd_link_add_symbols	elf64_vms_bfd_link_add_symbols
-
-#undef  elf_backend_want_got_sym
-#define elf_backend_want_got_sym	0
-
-#undef  bfd_elf64_mkobject
-#define bfd_elf64_mkobject		elf64_ia64_vms_mkobject
-
-/* Redefine to align segments on block size.  */
-#undef  ELF_MAXPAGESIZE
-#define ELF_MAXPAGESIZE			0x200 /* 512B  */
-
-#undef  elf_backend_want_got_plt
-#define elf_backend_want_got_plt	0
-
-#include "elf64-target.h"
diff --git a/bfd/elfnn-ia64.c b/bfd/elfnn-ia64.c
deleted file mode 100644
index 4dabaa792f6..00000000000
--- a/bfd/elfnn-ia64.c
+++ /dev/null
@@ -1,5116 +0,0 @@ 
-/* IA-64 support for 64-bit ELF
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-#include "elf-bfd.h"
-#include "opcode/ia64.h"
-#include "elf/ia64.h"
-#include "objalloc.h"
-#include "hashtab.h"
-#include "elfxx-ia64.h"
-
-#define ARCH_SIZE	NN
-
-#if ARCH_SIZE == 64
-#define	LOG_SECTION_ALIGN	3
-#endif
-
-#if ARCH_SIZE == 32
-#define	LOG_SECTION_ALIGN	2
-#endif
-
-#define is_ia64_elf(bfd)			   \
-  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
-   && elf_object_id (bfd) == IA64_ELF_DATA)
-
-typedef struct bfd_hash_entry *(*new_hash_entry_func)
-  (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
-
-/* In dynamically (linker-) created sections, we generally need to keep track
-   of the place a symbol or expression got allocated to. This is done via hash
-   tables that store entries of the following type.  */
-
-struct elfNN_ia64_dyn_sym_info
-{
-  /* The addend for which this entry is relevant.  */
-  bfd_vma addend;
-
-  bfd_vma got_offset;
-  bfd_vma fptr_offset;
-  bfd_vma pltoff_offset;
-  bfd_vma plt_offset;
-  bfd_vma plt2_offset;
-  bfd_vma tprel_offset;
-  bfd_vma dtpmod_offset;
-  bfd_vma dtprel_offset;
-
-  /* The symbol table entry, if any, that this was derived from.  */
-  struct elf_link_hash_entry *h;
-
-  /* Used to count non-got, non-plt relocations for delayed sizing
-     of relocation sections.  */
-  struct elfNN_ia64_dyn_reloc_entry
-  {
-    struct elfNN_ia64_dyn_reloc_entry *next;
-    asection *srel;
-    int type;
-    int count;
-
-    /* Is this reloc against readonly section? */
-    bool reltext;
-  } *reloc_entries;
-
-  /* TRUE when the section contents have been updated.  */
-  unsigned got_done : 1;
-  unsigned fptr_done : 1;
-  unsigned pltoff_done : 1;
-  unsigned tprel_done : 1;
-  unsigned dtpmod_done : 1;
-  unsigned dtprel_done : 1;
-
-  /* TRUE for the different kinds of linker data we want created.  */
-  unsigned want_got : 1;
-  unsigned want_gotx : 1;
-  unsigned want_fptr : 1;
-  unsigned want_ltoff_fptr : 1;
-  unsigned want_plt : 1;
-  unsigned want_plt2 : 1;
-  unsigned want_pltoff : 1;
-  unsigned want_tprel : 1;
-  unsigned want_dtpmod : 1;
-  unsigned want_dtprel : 1;
-};
-
-struct elfNN_ia64_local_hash_entry
-{
-  int id;
-  unsigned int r_sym;
-  /* The number of elements in elfNN_ia64_dyn_sym_info array.  */
-  unsigned int count;
-  /* The number of sorted elements in elfNN_ia64_dyn_sym_info array.  */
-  unsigned int sorted_count;
-  /* The size of elfNN_ia64_dyn_sym_info array.  */
-  unsigned int size;
-  /* The array of elfNN_ia64_dyn_sym_info.  */
-  struct elfNN_ia64_dyn_sym_info *info;
-
-  /* TRUE if this hash entry's addends was translated for
-     SHF_MERGE optimization.  */
-  unsigned sec_merge_done : 1;
-};
-
-struct elfNN_ia64_link_hash_entry
-{
-  struct elf_link_hash_entry root;
-  /* The number of elements in elfNN_ia64_dyn_sym_info array.  */
-  unsigned int count;
-  /* The number of sorted elements in elfNN_ia64_dyn_sym_info array.  */
-  unsigned int sorted_count;
-  /* The size of elfNN_ia64_dyn_sym_info array.  */
-  unsigned int size;
-  /* The array of elfNN_ia64_dyn_sym_info.  */
-  struct elfNN_ia64_dyn_sym_info *info;
-};
-
-struct elfNN_ia64_link_hash_table
-{
-  /* The main hash table.  */
-  struct elf_link_hash_table root;
-
-  asection *fptr_sec;		/* Function descriptor table (or NULL).  */
-  asection *rel_fptr_sec;	/* Dynamic relocation section for same.  */
-  asection *pltoff_sec;		/* Private descriptors for plt (or NULL).  */
-  asection *rel_pltoff_sec;	/* Dynamic relocation section for same.  */
-
-  bfd_size_type minplt_entries;	/* Number of minplt entries.  */
-  unsigned self_dtpmod_done : 1;/* Has self DTPMOD entry been finished?  */
-  bfd_vma self_dtpmod_offset;	/* .got offset to self DTPMOD entry.  */
-  /* There are maybe R_IA64_GPREL22 relocations, including those
-     optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
-     sections.  We need to record those sections so that we can choose
-     a proper GP to cover all R_IA64_GPREL22 relocations.  */
-  asection *max_short_sec;	/* Maximum short output section.  */
-  bfd_vma max_short_offset;	/* Maximum short offset.  */
-  asection *min_short_sec;	/* Minimum short output section.  */
-  bfd_vma min_short_offset;	/* Minimum short offset.  */
-
-  htab_t loc_hash_table;
-  void *loc_hash_memory;
-};
-
-struct elfNN_ia64_allocate_data
-{
-  struct bfd_link_info *info;
-  bfd_size_type ofs;
-  bool only_got;
-};
-
-#define elfNN_ia64_hash_table(p) \
-  ((is_elf_hash_table ((p)->hash)					\
-    && elf_hash_table_id (elf_hash_table (p)) == IA64_ELF_DATA)		\
-   ? (struct elfNN_ia64_link_hash_table *) (p)->hash : NULL)
-
-static struct elfNN_ia64_dyn_sym_info * get_dyn_sym_info
-  (struct elfNN_ia64_link_hash_table *ia64_info,
-   struct elf_link_hash_entry *h,
-   bfd *abfd, const Elf_Internal_Rela *rel, bool create);
-static bool elfNN_ia64_dynamic_symbol_p
-  (struct elf_link_hash_entry *h, struct bfd_link_info *info, int);
-static bool elfNN_ia64_choose_gp
-  (bfd *abfd, struct bfd_link_info *info, bool final);
-static void elfNN_ia64_dyn_sym_traverse
-  (struct elfNN_ia64_link_hash_table *ia64_info,
-   bool (*func) (struct elfNN_ia64_dyn_sym_info *, void *),
-   void * info);
-static bool allocate_global_data_got
-  (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
-static bool allocate_global_fptr_got
-  (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
-static bool allocate_local_got
-  (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
-static bool elfNN_ia64_hpux_vec
-  (const bfd_target *vec);
-static bool allocate_dynrel_entries
-  (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data);
-static asection *get_pltoff
-  (bfd *abfd, struct bfd_link_info *info,
-   struct elfNN_ia64_link_hash_table *ia64_info);
-
-/* ia64-specific relocation.  */
-
-/* Given a ELF reloc, return the matching HOWTO structure.  */
-
-static bool
-elfNN_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
-			  arelent *bfd_reloc,
-			  Elf_Internal_Rela *elf_reloc)
-{
-  unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
-
-  bfd_reloc->howto = ia64_elf_lookup_howto (r_type);
-  if (bfd_reloc->howto == NULL)
-    {
-      /* xgettext:c-format */
-      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-			  abfd, r_type);
-      bfd_set_error (bfd_error_bad_value);
-      return false;
-    }
-
-  return true;
-}
-
-#define PLT_HEADER_SIZE		(3 * 16)
-#define PLT_MIN_ENTRY_SIZE	(1 * 16)
-#define PLT_FULL_ENTRY_SIZE	(2 * 16)
-#define PLT_RESERVED_WORDS	3
-
-static const bfd_byte plt_header[PLT_HEADER_SIZE] =
-{
-  0x0b, 0x10, 0x00, 0x1c, 0x00, 0x21,  /*   [MMI]	mov r2=r14;;	   */
-  0xe0, 0x00, 0x08, 0x00, 0x48, 0x00,  /*		addl r14=0,r2	   */
-  0x00, 0x00, 0x04, 0x00,	       /*		nop.i 0x0;;	   */
-  0x0b, 0x80, 0x20, 0x1c, 0x18, 0x14,  /*   [MMI]	ld8 r16=[r14],8;;  */
-  0x10, 0x41, 0x38, 0x30, 0x28, 0x00,  /*		ld8 r17=[r14],8	   */
-  0x00, 0x00, 0x04, 0x00,	       /*		nop.i 0x0;;	   */
-  0x11, 0x08, 0x00, 0x1c, 0x18, 0x10,  /*   [MIB]	ld8 r1=[r14]	   */
-  0x60, 0x88, 0x04, 0x80, 0x03, 0x00,  /*		mov b6=r17	   */
-  0x60, 0x00, 0x80, 0x00	       /*		br.few b6;;	   */
-};
-
-static const bfd_byte plt_min_entry[PLT_MIN_ENTRY_SIZE] =
-{
-  0x11, 0x78, 0x00, 0x00, 0x00, 0x24,  /*   [MIB]	mov r15=0	   */
-  0x00, 0x00, 0x00, 0x02, 0x00, 0x00,  /*		nop.i 0x0	   */
-  0x00, 0x00, 0x00, 0x40	       /*		br.few 0 <PLT0>;;  */
-};
-
-static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] =
-{
-  0x0b, 0x78, 0x00, 0x02, 0x00, 0x24,  /*   [MMI]	addl r15=0,r1;;	   */
-  0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0,  /*		ld8.acq r16=[r15],8*/
-  0x01, 0x08, 0x00, 0x84,	       /*		mov r14=r1;;	   */
-  0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,  /*   [MIB]	ld8 r1=[r15]	   */
-  0x60, 0x80, 0x04, 0x80, 0x03, 0x00,  /*		mov b6=r16	   */
-  0x60, 0x00, 0x80, 0x00	       /*		br.few b6;;	   */
-};
-
-#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
-
-static const bfd_byte oor_brl[16] =
-{
-  0x05, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MLX]	nop.m 0		   */
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /*		brl.sptk.few tgt;; */
-  0x00, 0x00, 0x00, 0xc0
-};
-
-static const bfd_byte oor_ip[48] =
-{
-  0x04, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MLX]	nop.m 0		   */
-  0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,  /*		movl r15=0	   */
-  0x01, 0x00, 0x00, 0x60,
-  0x03, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MII]	nop.m 0		   */
-  0x00, 0x01, 0x00, 0x60, 0x00, 0x00,  /*		mov r16=ip;;	   */
-  0xf2, 0x80, 0x00, 0x80,	       /*		add r16=r15,r16;;  */
-  0x11, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MIB]	nop.m 0		   */
-  0x60, 0x80, 0x04, 0x80, 0x03, 0x00,  /*		mov b6=r16	   */
-  0x60, 0x00, 0x80, 0x00	       /*		br b6;;		   */
-};
-
-static size_t oor_branch_size = sizeof (oor_brl);
-
-void
-bfd_elfNN_ia64_after_parse (int itanium)
-{
-  oor_branch_size = itanium ? sizeof (oor_ip) : sizeof (oor_brl);
-}
-
-
-/* Rename some of the generic section flags to better document how they
-   are used here.  */
-#define skip_relax_pass_0 sec_flg0
-#define skip_relax_pass_1 sec_flg1
-
-/* These functions do relaxation for IA-64 ELF.  */
-
-static void
-elfNN_ia64_update_short_info (asection *sec, bfd_vma offset,
-			      struct elfNN_ia64_link_hash_table *ia64_info)
-{
-  /* Skip ABS and SHF_IA_64_SHORT sections.  */
-  if (sec == bfd_abs_section_ptr
-      || (sec->flags & SEC_SMALL_DATA) != 0)
-    return;
-
-  if (!ia64_info->min_short_sec)
-    {
-      ia64_info->max_short_sec = sec;
-      ia64_info->max_short_offset = offset;
-      ia64_info->min_short_sec = sec;
-      ia64_info->min_short_offset = offset;
-    }
-  else if (sec == ia64_info->max_short_sec
-	   && offset > ia64_info->max_short_offset)
-    ia64_info->max_short_offset = offset;
-  else if (sec == ia64_info->min_short_sec
-	   && offset < ia64_info->min_short_offset)
-    ia64_info->min_short_offset = offset;
-  else if (sec->output_section->vma
-	   > ia64_info->max_short_sec->vma)
-    {
-      ia64_info->max_short_sec = sec;
-      ia64_info->max_short_offset = offset;
-    }
-  else if (sec->output_section->vma
-	   < ia64_info->min_short_sec->vma)
-    {
-      ia64_info->min_short_sec = sec;
-      ia64_info->min_short_offset = offset;
-    }
-}
-
-static bool
-elfNN_ia64_relax_section (bfd *abfd, asection *sec,
-			  struct bfd_link_info *link_info,
-			  bool *again)
-{
-  struct one_fixup
-    {
-      struct one_fixup *next;
-      asection *tsec;
-      bfd_vma toff;
-      bfd_vma trampoff;
-    };
-
-  Elf_Internal_Shdr *symtab_hdr;
-  Elf_Internal_Rela *internal_relocs;
-  Elf_Internal_Rela *irel, *irelend;
-  bfd_byte *contents;
-  Elf_Internal_Sym *isymbuf = NULL;
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  struct one_fixup *fixups = NULL;
-  bool changed_contents = false;
-  bool changed_relocs = false;
-  bool changed_got = false;
-  bool skip_relax_pass_0 = true;
-  bool skip_relax_pass_1 = true;
-  bfd_vma gp = 0;
-
-  /* Assume we're not going to change any sizes, and we'll only need
-     one pass.  */
-  *again = false;
-
-  if (bfd_link_relocatable (link_info))
-    (*link_info->callbacks->einfo)
-      (_("%P%F: --relax and -r may not be used together\n"));
-
-  /* Don't even try to relax for non-ELF outputs.  */
-  if (!is_elf_hash_table (link_info->hash))
-    return false;
-
-  /* Nothing to do if there are no relocations or there is no need for
-     the current pass.  */
-  if (sec->reloc_count == 0
-      || (sec->flags & SEC_RELOC) == 0
-      || (sec->flags & SEC_HAS_CONTENTS) == 0
-      || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
-      || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
-    return true;
-
-  ia64_info = elfNN_ia64_hash_table (link_info);
-  if (ia64_info == NULL)
-    return false;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-
-  /* Load the relocations for this section.  */
-  internal_relocs = (_bfd_elf_link_read_relocs
-		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
-		      link_info->keep_memory));
-  if (internal_relocs == NULL)
-    return false;
-
-  irelend = internal_relocs + sec->reloc_count;
-
-  /* Get the section contents.  */
-  if (elf_section_data (sec)->this_hdr.contents != NULL)
-    contents = elf_section_data (sec)->this_hdr.contents;
-  else
-    {
-      if (!bfd_malloc_and_get_section (abfd, sec, &contents))
-	goto error_return;
-    }
-
-  for (irel = internal_relocs; irel < irelend; irel++)
-    {
-      unsigned long r_type = ELFNN_R_TYPE (irel->r_info);
-      bfd_vma symaddr, reladdr, trampoff, toff, roff;
-      asection *tsec;
-      struct one_fixup *f;
-      bfd_size_type amt;
-      bool is_branch;
-      struct elfNN_ia64_dyn_sym_info *dyn_i;
-      char symtype;
-
-      switch (r_type)
-	{
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL21BI:
-	case R_IA64_PCREL21M:
-	case R_IA64_PCREL21F:
-	  /* In pass 1, all br relaxations are done. We can skip it. */
-	  if (link_info->relax_pass == 1)
-	    continue;
-	  skip_relax_pass_0 = false;
-	  is_branch = true;
-	  break;
-
-	case R_IA64_PCREL60B:
-	  /* We can't optimize brl to br in pass 0 since br relaxations
-	     will increase the code size. Defer it to pass 1.  */
-	  if (link_info->relax_pass == 0)
-	    {
-	      skip_relax_pass_1 = false;
-	      continue;
-	    }
-	  is_branch = true;
-	  break;
-
-	case R_IA64_GPREL22:
-	  /* Update max_short_sec/min_short_sec.  */
-
-	case R_IA64_LTOFF22X:
-	case R_IA64_LDXMOV:
-	  /* We can't relax ldx/mov in pass 0 since br relaxations will
-	     increase the code size. Defer it to pass 1.  */
-	  if (link_info->relax_pass == 0)
-	    {
-	      skip_relax_pass_1 = false;
-	      continue;
-	    }
-	  is_branch = false;
-	  break;
-
-	default:
-	  continue;
-	}
-
-      /* Get the value of the symbol referred to by the reloc.  */
-      if (ELFNN_R_SYM (irel->r_info) < symtab_hdr->sh_info)
-	{
-	  /* A local symbol.  */
-	  Elf_Internal_Sym *isym;
-
-	  /* Read this BFD's local symbols.  */
-	  if (isymbuf == NULL)
-	    {
-	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
-	      if (isymbuf == NULL)
-		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
-						symtab_hdr->sh_info, 0,
-						NULL, NULL, NULL);
-	      if (isymbuf == 0)
-		goto error_return;
-	    }
-
-	  isym = isymbuf + ELFNN_R_SYM (irel->r_info);
-	  if (isym->st_shndx == SHN_UNDEF)
-	    continue;	/* We can't do anything with undefined symbols.  */
-	  else if (isym->st_shndx == SHN_ABS)
-	    tsec = bfd_abs_section_ptr;
-	  else if (isym->st_shndx == SHN_COMMON)
-	    tsec = bfd_com_section_ptr;
-	  else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
-	    tsec = bfd_com_section_ptr;
-	  else
-	    tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
-
-	  toff = isym->st_value;
-	  dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, false);
-	  symtype = ELF_ST_TYPE (isym->st_info);
-	}
-      else
-	{
-	  unsigned long indx;
-	  struct elf_link_hash_entry *h;
-
-	  indx = ELFNN_R_SYM (irel->r_info) - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  BFD_ASSERT (h != NULL);
-
-	  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;
-
-	  dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, false);
-
-	  /* For branches to dynamic symbols, we're interested instead
-	     in a branch to the PLT entry.  */
-	  if (is_branch && dyn_i && dyn_i->want_plt2)
-	    {
-	      /* Internal branches shouldn't be sent to the PLT.
-		 Leave this for now and we'll give an error later.  */
-	      if (r_type != R_IA64_PCREL21B)
-		continue;
-
-	      tsec = ia64_info->root.splt;
-	      toff = dyn_i->plt2_offset;
-	      BFD_ASSERT (irel->r_addend == 0);
-	    }
-
-	  /* Can't do anything else with dynamic symbols.  */
-	  else if (elfNN_ia64_dynamic_symbol_p (h, link_info, r_type))
-	    continue;
-
-	  else
-	    {
-	      /* We can't do anything with undefined symbols.  */
-	      if (h->root.type == bfd_link_hash_undefined
-		  || h->root.type == bfd_link_hash_undefweak)
-		continue;
-
-	      tsec = h->root.u.def.section;
-	      toff = h->root.u.def.value;
-	    }
-
-	  symtype = h->type;
-	}
-
-      if (tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
-	{
-	  /* At this stage in linking, no SEC_MERGE symbol has been
-	     adjusted, so all references to such symbols need to be
-	     passed through _bfd_merged_section_offset.  (Later, in
-	     relocate_section, all SEC_MERGE symbols *except* for
-	     section symbols have been adjusted.)
-
-	     gas may reduce relocations against symbols in SEC_MERGE
-	     sections to a relocation against the section symbol when
-	     the original addend was zero.  When the reloc is against
-	     a section symbol we should include the addend in the
-	     offset passed to _bfd_merged_section_offset, since the
-	     location of interest is the original symbol.  On the
-	     other hand, an access to "sym+addend" where "sym" is not
-	     a section symbol should not include the addend;  Such an
-	     access is presumed to be an offset from "sym";  The
-	     location of interest is just "sym".  */
-	   if (symtype == STT_SECTION)
-	     toff += irel->r_addend;
-
-	   toff = _bfd_merged_section_offset (abfd, &tsec,
-					      elf_section_data (tsec)->sec_info,
-					      toff);
-
-	   if (symtype != STT_SECTION)
-	     toff += irel->r_addend;
-	}
-      else
-	toff += irel->r_addend;
-
-      symaddr = tsec->output_section->vma + tsec->output_offset + toff;
-
-      roff = irel->r_offset;
-
-      if (is_branch)
-	{
-	  bfd_signed_vma offset;
-
-	  reladdr = (sec->output_section->vma
-		     + sec->output_offset
-		     + roff) & (bfd_vma) -4;
-
-	  /* The .plt section is aligned at 32byte and the .text section
-	     is aligned at 64byte. The .text section is right after the
-	     .plt section.  After the first relaxation pass, linker may
-	     increase the gap between the .plt and .text sections up
-	     to 32byte.  We assume linker will always insert 32byte
-	     between the .plt and .text sections after the first
-	     relaxation pass.  */
-	  if (tsec == ia64_info->root.splt)
-	    offset = -0x1000000 + 32;
-	  else
-	    offset = -0x1000000;
-
-	  /* If the branch is in range, no need to do anything.  */
-	  if ((bfd_signed_vma) (symaddr - reladdr) >= offset
-	      && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
-	    {
-	      /* If the 60-bit branch is in 21-bit range, optimize it. */
-	      if (r_type == R_IA64_PCREL60B)
-		{
-		  ia64_elf_relax_brl (contents, roff);
-
-		  irel->r_info
-		    = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-				    R_IA64_PCREL21B);
-
-		  /* If the original relocation offset points to slot
-		     1, change it to slot 2.  */
-		  if ((irel->r_offset & 3) == 1)
-		    irel->r_offset += 1;
-
-		  changed_contents = true;
-		  changed_relocs = true;
-		}
-
-	      continue;
-	    }
-	  else if (r_type == R_IA64_PCREL60B)
-	    continue;
-	  else if (ia64_elf_relax_br (contents, roff))
-	    {
-	      irel->r_info
-		= ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-				R_IA64_PCREL60B);
-
-	      /* Make the relocation offset point to slot 1.  */
-	      irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
-
-	      changed_contents = true;
-	      changed_relocs = true;
-	      continue;
-	    }
-
-	  /* We can't put a trampoline in a .init/.fini section. Issue
-	     an error.  */
-	  if (strcmp (sec->output_section->name, ".init") == 0
-	      || strcmp (sec->output_section->name, ".fini") == 0)
-	    {
-	      _bfd_error_handler
-		/* xgettext:c-format */
-		(_("%pB: can't relax br at %#" PRIx64 " in section `%pA';"
-		   " please use brl or indirect branch"),
-		 sec->owner, (uint64_t) roff, sec);
-	      bfd_set_error (bfd_error_bad_value);
-	      goto error_return;
-	    }
-
-	  /* If the branch and target are in the same section, you've
-	     got one honking big section and we can't help you unless
-	     you are branching backwards.  You'll get an error message
-	     later.  */
-	  if (tsec == sec && toff > roff)
-	    continue;
-
-	  /* Look for an existing fixup to this address.  */
-	  for (f = fixups; f ; f = f->next)
-	    if (f->tsec == tsec && f->toff == toff)
-	      break;
-
-	  if (f == NULL)
-	    {
-	      /* Two alternatives: If it's a branch to a PLT entry, we can
-		 make a copy of the FULL_PLT entry.  Otherwise, we'll have
-		 to use a `brl' insn to get where we're going.  */
-
-	      size_t size;
-
-	      if (tsec == ia64_info->root.splt)
-		size = sizeof (plt_full_entry);
-	      else
-		size = oor_branch_size;
-
-	      /* Resize the current section to make room for the new branch. */
-	      trampoff = (sec->size + 15) & (bfd_vma) -16;
-
-	      /* If trampoline is out of range, there is nothing we
-		 can do.  */
-	      offset = trampoff - (roff & (bfd_vma) -4);
-	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
-		continue;
-
-	      amt = trampoff + size;
-	      contents = (bfd_byte *) bfd_realloc (contents, amt);
-	      if (contents == NULL)
-		goto error_return;
-	      sec->size = amt;
-
-	      if (tsec == ia64_info->root.splt)
-		{
-		  memcpy (contents + trampoff, plt_full_entry, size);
-
-		  /* Hijack the old relocation for use as the PLTOFF reloc.  */
-		  irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-					       R_IA64_PLTOFF22);
-		  irel->r_offset = trampoff;
-		}
-	      else
-		{
-		  if (size == sizeof (oor_ip))
-		    {
-		      memcpy (contents + trampoff, oor_ip, size);
-		      irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-						   R_IA64_PCREL64I);
-		      irel->r_addend -= 16;
-		      irel->r_offset = trampoff + 2;
-		    }
-		  else
-		    {
-		      memcpy (contents + trampoff, oor_brl, size);
-		      irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-						   R_IA64_PCREL60B);
-		      irel->r_offset = trampoff + 2;
-		    }
-
-		}
-
-	      /* Record the fixup so we don't do it again this section.  */
-	      f = (struct one_fixup *)
-		bfd_malloc ((bfd_size_type) sizeof (*f));
-	      f->next = fixups;
-	      f->tsec = tsec;
-	      f->toff = toff;
-	      f->trampoff = trampoff;
-	      fixups = f;
-	    }
-	  else
-	    {
-	      /* If trampoline is out of range, there is nothing we
-		 can do.  */
-	      offset = f->trampoff - (roff & (bfd_vma) -4);
-	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
-		continue;
-
-	      /* Nop out the reloc, since we're finalizing things here.  */
-	      irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
-	    }
-
-	  /* Fix up the existing branch to hit the trampoline.  */
-	  if (ia64_elf_install_value (contents + roff, offset, r_type)
-	      != bfd_reloc_ok)
-	    goto error_return;
-
-	  changed_contents = true;
-	  changed_relocs = true;
-	}
-      else
-	{
-	  /* Fetch the gp.  */
-	  if (gp == 0)
-	    {
-	      bfd *obfd = sec->output_section->owner;
-	      gp = _bfd_get_gp_value (obfd);
-	      if (gp == 0)
-		{
-		  if (!elfNN_ia64_choose_gp (obfd, link_info, false))
-		    goto error_return;
-		  gp = _bfd_get_gp_value (obfd);
-		}
-	    }
-
-	  /* If the data is out of range, do nothing.  */
-	  if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
-	      ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
-	    continue;
-
-	  if (r_type == R_IA64_GPREL22)
-	    elfNN_ia64_update_short_info (tsec->output_section,
-					  tsec->output_offset + toff,
-					  ia64_info);
-	  else if (r_type == R_IA64_LTOFF22X)
-	    {
-	      irel->r_info = ELFNN_R_INFO (ELFNN_R_SYM (irel->r_info),
-					   R_IA64_GPREL22);
-	      changed_relocs = true;
-	      if (dyn_i->want_gotx)
-		{
-		  dyn_i->want_gotx = 0;
-		  changed_got |= !dyn_i->want_got;
-		}
-
-	      elfNN_ia64_update_short_info (tsec->output_section,
-					    tsec->output_offset + toff,
-					    ia64_info);
-	    }
-	  else
-	    {
-	      ia64_elf_relax_ldxmov (contents, roff);
-	      irel->r_info = ELFNN_R_INFO (0, R_IA64_NONE);
-	      changed_contents = true;
-	      changed_relocs = true;
-	    }
-	}
-    }
-
-  /* ??? If we created fixups, this may push the code segment large
-     enough that the data segment moves, which will change the GP.
-     Reset the GP so that we re-calculate next round.  We need to
-     do this at the _beginning_ of the next round; now will not do.  */
-
-  /* Clean up and go home.  */
-  while (fixups)
-    {
-      struct one_fixup *f = fixups;
-      fixups = fixups->next;
-      free (f);
-    }
-
-  if (isymbuf != NULL
-      && symtab_hdr->contents != (unsigned char *) isymbuf)
-    {
-      if (! link_info->keep_memory)
-	free (isymbuf);
-      else
-	{
-	  /* Cache the symbols for elf_link_input_bfd.  */
-	  symtab_hdr->contents = (unsigned char *) isymbuf;
-	}
-    }
-
-  if (contents != NULL
-      && elf_section_data (sec)->this_hdr.contents != contents)
-    {
-      if (!changed_contents && !link_info->keep_memory)
-	free (contents);
-      else
-	{
-	  /* Cache the section contents for elf_link_input_bfd.  */
-	  elf_section_data (sec)->this_hdr.contents = contents;
-	}
-    }
-
-  if (elf_section_data (sec)->relocs != internal_relocs)
-    {
-      if (!changed_relocs)
-	free (internal_relocs);
-      else
-	elf_section_data (sec)->relocs = internal_relocs;
-    }
-
-  if (changed_got)
-    {
-      struct elfNN_ia64_allocate_data data;
-      data.info = link_info;
-      data.ofs = 0;
-      ia64_info->self_dtpmod_offset = (bfd_vma) -1;
-
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
-      ia64_info->root.sgot->size = data.ofs;
-
-      if (ia64_info->root.dynamic_sections_created
-	  && ia64_info->root.srelgot != NULL)
-	{
-	  /* Resize .rela.got.  */
-	  ia64_info->root.srelgot->size = 0;
-	  if (bfd_link_pic (link_info)
-	      && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
-	    ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-	  data.only_got = true;
-	  elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries,
-				       &data);
-	}
-    }
-
-  if (link_info->relax_pass == 0)
-    {
-      /* Pass 0 is only needed to relax br.  */
-      sec->skip_relax_pass_0 = skip_relax_pass_0;
-      sec->skip_relax_pass_1 = skip_relax_pass_1;
-    }
-
-  *again = changed_contents || changed_relocs;
-  return true;
-
- error_return:
-  if ((unsigned char *) isymbuf != symtab_hdr->contents)
-    free (isymbuf);
-  if (elf_section_data (sec)->this_hdr.contents != contents)
-    free (contents);
-  if (elf_section_data (sec)->relocs != internal_relocs)
-    free (internal_relocs);
-  return false;
-}
-#undef skip_relax_pass_0
-#undef skip_relax_pass_1
-
-/* Return TRUE if NAME is an unwind table section name.  */
-
-static inline bool
-is_unwind_section_name (bfd *abfd, const char *name)
-{
-  if (elfNN_ia64_hpux_vec (abfd->xvec)
-      && !strcmp (name, ELF_STRING_ia64_unwind_hdr))
-    return false;
-
-  return ((startswith (name, ELF_STRING_ia64_unwind)
-	   && ! startswith (name, ELF_STRING_ia64_unwind_info))
-	  || startswith (name, ELF_STRING_ia64_unwind_once));
-}
-
-/* Handle an IA-64 specific section when reading an object file.  This
-   is called when bfd_section_from_shdr finds a section with an unknown
-   type.  */
-
-static bool
-elfNN_ia64_section_from_shdr (bfd *abfd,
-			      Elf_Internal_Shdr *hdr,
-			      const char *name,
-			      int shindex)
-{
-  /* There ought to be a place to keep ELF backend specific flags, but
-     at the moment there isn't one.  We just keep track of the
-     sections by their name, instead.  Fortunately, the ABI gives
-     suggested names for all the MIPS specific sections, so we will
-     probably get away with this.  */
-  switch (hdr->sh_type)
-    {
-    case SHT_IA_64_UNWIND:
-    case SHT_IA_64_HP_OPT_ANOT:
-      break;
-
-    case SHT_IA_64_EXT:
-      if (strcmp (name, ELF_STRING_ia64_archext) != 0)
-	return false;
-      break;
-
-    default:
-      return false;
-    }
-
-  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
-    return false;
-
-  return true;
-}
-
-/* Convert IA-64 specific section flags to bfd internal section flags.  */
-
-/* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
-   flag.  */
-
-static bool
-elfNN_ia64_section_flags (const Elf_Internal_Shdr *hdr)
-{
-  if (hdr->sh_flags & SHF_IA_64_SHORT)
-    hdr->bfd_section->flags |= SEC_SMALL_DATA;
-
-  return true;
-}
-
-/* Set the correct type for an IA-64 ELF section.  We do this by the
-   section name, which is a hack, but ought to work.  */
-
-static bool
-elfNN_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
-			  asection *sec)
-{
-  const char *name;
-
-  name = bfd_section_name (sec);
-
-  if (is_unwind_section_name (abfd, name))
-    {
-      /* We don't have the sections numbered at this point, so sh_info
-	 is set later, in elfNN_ia64_final_write_processing.  */
-      hdr->sh_type = SHT_IA_64_UNWIND;
-      hdr->sh_flags |= SHF_LINK_ORDER;
-    }
-  else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
-    hdr->sh_type = SHT_IA_64_EXT;
-  else if (strcmp (name, ".HP.opt_annot") == 0)
-    hdr->sh_type = SHT_IA_64_HP_OPT_ANOT;
-  else if (strcmp (name, ".reloc") == 0)
-    /* This is an ugly, but unfortunately necessary hack that is
-       needed when producing EFI binaries on IA-64. It tells
-       elf.c:elf_fake_sections() not to consider ".reloc" as a section
-       containing ELF relocation info.  We need this hack in order to
-       be able to generate ELF binaries that can be translated into
-       EFI applications (which are essentially COFF objects).  Those
-       files contain a COFF ".reloc" section inside an ELFNN object,
-       which would normally cause BFD to segfault because it would
-       attempt to interpret this section as containing relocation
-       entries for section "oc".  With this hack enabled, ".reloc"
-       will be treated as a normal data section, which will avoid the
-       segfault.  However, you won't be able to create an ELFNN binary
-       with a section named "oc" that needs relocations, but that's
-       the kind of ugly side-effects you get when detecting section
-       types based on their names...  In practice, this limitation is
-       unlikely to bite.  */
-    hdr->sh_type = SHT_PROGBITS;
-
-  if (sec->flags & SEC_SMALL_DATA)
-    hdr->sh_flags |= SHF_IA_64_SHORT;
-
-  /* Some HP linkers look for the SHF_IA_64_HP_TLS flag instead of SHF_TLS. */
-
-  if (elfNN_ia64_hpux_vec (abfd->xvec) && (sec->flags & SHF_TLS))
-    hdr->sh_flags |= SHF_IA_64_HP_TLS;
-
-  return true;
-}
-
-/* The final processing done just before writing out an IA-64 ELF
-   object file.  */
-
-static bool
-elfNN_ia64_final_write_processing (bfd *abfd)
-{
-  Elf_Internal_Shdr *hdr;
-  asection *s;
-
-  for (s = abfd->sections; s; s = s->next)
-    {
-      hdr = &elf_section_data (s)->this_hdr;
-      switch (hdr->sh_type)
-	{
-	case SHT_IA_64_UNWIND:
-	  /* The IA-64 processor-specific ABI requires setting sh_link
-	     to the unwind section, whereas HP-UX requires sh_info to
-	     do so.  For maximum compatibility, we'll set both for
-	     now... */
-	  hdr->sh_info = hdr->sh_link;
-	  break;
-	}
-    }
-
-  if (! elf_flags_init (abfd))
-    {
-      unsigned long flags = 0;
-
-      if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
-	flags |= EF_IA_64_BE;
-      if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
-	flags |= EF_IA_64_ABI64;
-
-      elf_elfheader(abfd)->e_flags = flags;
-      elf_flags_init (abfd) = true;
-    }
-  return _bfd_elf_final_write_processing (abfd);
-}
-
-/* Hook called by the linker routine which adds symbols from an object
-   file.  We use it to put .comm items in .sbss, and not .bss.  */
-
-static bool
-elfNN_ia64_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,
-			    bfd_vma *valp)
-{
-  if (sym->st_shndx == SHN_COMMON
-      && !bfd_link_relocatable (info)
-      && sym->st_size <= elf_gp_size (abfd))
-    {
-      /* Common symbols less than or equal to -G nn bytes are
-	 automatically put into .sbss.  */
-
-      asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
-
-      if (scomm == NULL)
-	{
-	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
-					       (SEC_ALLOC
-						| SEC_IS_COMMON
-						| SEC_SMALL_DATA
-						| SEC_LINKER_CREATED));
-	  if (scomm == NULL)
-	    return false;
-	}
-
-      *secp = scomm;
-      *valp = sym->st_size;
-    }
-
-  return true;
-}
-
-/* Return the number of additional phdrs we will need.  */
-
-static int
-elfNN_ia64_additional_program_headers (bfd *abfd,
-				       struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  asection *s;
-  int ret = 0;
-
-  /* See if we need a PT_IA_64_ARCHEXT segment.  */
-  s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_archext);
-  if (s && (s->flags & SEC_LOAD))
-    ++ret;
-
-  /* Count how many PT_IA_64_UNWIND segments we need.  */
-  for (s = abfd->sections; s; s = s->next)
-    if (is_unwind_section_name (abfd, s->name) && (s->flags & SEC_LOAD))
-      ++ret;
-
-  return ret;
-}
-
-static bool
-elfNN_ia64_modify_segment_map (bfd *abfd,
-			       struct bfd_link_info *info ATTRIBUTE_UNUSED)
-{
-  struct elf_segment_map *m, **pm;
-  Elf_Internal_Shdr *hdr;
-  asection *s;
-
-  /* If we need a PT_IA_64_ARCHEXT segment, it must come before
-     all PT_LOAD segments.  */
-  s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_archext);
-  if (s && (s->flags & SEC_LOAD))
-    {
-      for (m = elf_seg_map (abfd); m != NULL; m = m->next)
-	if (m->p_type == PT_IA_64_ARCHEXT)
-	  break;
-      if (m == NULL)
-	{
-	  m = ((struct elf_segment_map *)
-	       bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
-	  if (m == NULL)
-	    return false;
-
-	  m->p_type = PT_IA_64_ARCHEXT;
-	  m->count = 1;
-	  m->sections[0] = s;
-
-	  /* We want to put it after the PHDR and INTERP segments.  */
-	  pm = &elf_seg_map (abfd);
-	  while (*pm != NULL
-		 && ((*pm)->p_type == PT_PHDR
-		     || (*pm)->p_type == PT_INTERP))
-	    pm = &(*pm)->next;
-
-	  m->next = *pm;
-	  *pm = m;
-	}
-    }
-
-  /* Install PT_IA_64_UNWIND segments, if needed.  */
-  for (s = abfd->sections; s; s = s->next)
-    {
-      hdr = &elf_section_data (s)->this_hdr;
-      if (hdr->sh_type != SHT_IA_64_UNWIND)
-	continue;
-
-      if (s && (s->flags & SEC_LOAD))
-	{
-	  for (m = elf_seg_map (abfd); m != NULL; m = m->next)
-	    if (m->p_type == PT_IA_64_UNWIND)
-	      {
-		int i;
-
-		/* Look through all sections in the unwind segment
-		   for a match since there may be multiple sections
-		   to a segment.  */
-		for (i = m->count - 1; i >= 0; --i)
-		  if (m->sections[i] == s)
-		    break;
-
-		if (i >= 0)
-		  break;
-	      }
-
-	  if (m == NULL)
-	    {
-	      m = ((struct elf_segment_map *)
-		   bfd_zalloc (abfd, (bfd_size_type) sizeof *m));
-	      if (m == NULL)
-		return false;
-
-	      m->p_type = PT_IA_64_UNWIND;
-	      m->count = 1;
-	      m->sections[0] = s;
-	      m->next = NULL;
-
-	      /* We want to put it last.  */
-	      pm = &elf_seg_map (abfd);
-	      while (*pm != NULL)
-		pm = &(*pm)->next;
-	      *pm = m;
-	    }
-	}
-    }
-
-  return true;
-}
-
-/* Turn on PF_IA_64_NORECOV if needed.  This involves traversing all of
-   the input sections for each output section in the segment and testing
-   for SHF_IA_64_NORECOV on each.  */
-
-static bool
-elfNN_ia64_modify_headers (bfd *abfd, struct bfd_link_info *info)
-{
-  struct elf_obj_tdata *tdata = elf_tdata (abfd);
-  struct elf_segment_map *m;
-  Elf_Internal_Phdr *p;
-
-  for (p = tdata->phdr, m = elf_seg_map (abfd); m != NULL; m = m->next, p++)
-    if (m->p_type == PT_LOAD)
-      {
-	int i;
-	for (i = m->count - 1; i >= 0; --i)
-	  {
-	    struct bfd_link_order *order = m->sections[i]->map_head.link_order;
-
-	    while (order != NULL)
-	      {
-		if (order->type == bfd_indirect_link_order)
-		  {
-		    asection *is = order->u.indirect.section;
-		    bfd_vma flags = elf_section_data(is)->this_hdr.sh_flags;
-		    if (flags & SHF_IA_64_NORECOV)
-		      {
-			p->p_flags |= PF_IA_64_NORECOV;
-			goto found;
-		      }
-		  }
-		order = order->next;
-	      }
-	  }
-      found:;
-      }
-
-  return _bfd_elf_modify_headers (abfd, info);
-}
-
-/* According to the Tahoe assembler spec, all labels starting with a
-   '.' are local.  */
-
-static bool
-elfNN_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
-				const char *name)
-{
-  return name[0] == '.';
-}
-
-/* Should we do dynamic things to this symbol?  */
-
-static bool
-elfNN_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h,
-			     struct bfd_link_info *info, int r_type)
-{
-  bool ignore_protected
-    = ((r_type & 0xf8) == 0x40		/* FPTR relocs */
-       || (r_type & 0xf8) == 0x50);	/* LTOFF_FPTR relocs */
-
-  return _bfd_elf_dynamic_symbol_p (h, info, ignore_protected);
-}
-
-static struct bfd_hash_entry*
-elfNN_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
-			       struct bfd_hash_table *table,
-			       const char *string)
-{
-  struct elfNN_ia64_link_hash_entry *ret;
-  ret = (struct elfNN_ia64_link_hash_entry *) entry;
-
-  /* Allocate the structure if it has not already been allocated by a
-     subclass.  */
-  if (!ret)
-    ret = bfd_hash_allocate (table, sizeof (*ret));
-
-  if (!ret)
-    return 0;
-
-  /* Call the allocation method of the superclass.  */
-  ret = ((struct elfNN_ia64_link_hash_entry *)
-	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
-				     table, string));
-
-  ret->info = NULL;
-  ret->count = 0;
-  ret->sorted_count = 0;
-  ret->size = 0;
-  return (struct bfd_hash_entry *) ret;
-}
-
-static void
-elfNN_ia64_hash_copy_indirect (struct bfd_link_info *info,
-			       struct elf_link_hash_entry *xdir,
-			       struct elf_link_hash_entry *xind)
-{
-  struct elfNN_ia64_link_hash_entry *dir, *ind;
-
-  dir = (struct elfNN_ia64_link_hash_entry *) xdir;
-  ind = (struct elfNN_ia64_link_hash_entry *) xind;
-
-  /* Copy down any references that we may have already seen to the
-     symbol which just became indirect.  */
-
-  if (dir->root.versioned != versioned_hidden)
-    dir->root.ref_dynamic |= ind->root.ref_dynamic;
-  dir->root.ref_regular |= ind->root.ref_regular;
-  dir->root.ref_regular_nonweak |= ind->root.ref_regular_nonweak;
-  dir->root.needs_plt |= ind->root.needs_plt;
-
-  if (ind->root.root.type != bfd_link_hash_indirect)
-    return;
-
-  /* Copy over the got and plt data.  This would have been done
-     by check_relocs.  */
-
-  if (ind->info != NULL)
-    {
-      struct elfNN_ia64_dyn_sym_info *dyn_i;
-      unsigned int count;
-
-      free (dir->info);
-
-      dir->info = ind->info;
-      dir->count = ind->count;
-      dir->sorted_count = ind->sorted_count;
-      dir->size = ind->size;
-
-      ind->info = NULL;
-      ind->count = 0;
-      ind->sorted_count = 0;
-      ind->size = 0;
-
-      /* Fix up the dyn_sym_info pointers to the global symbol.  */
-      for (count = dir->count, dyn_i = dir->info;
-	   count != 0;
-	   count--, dyn_i++)
-	dyn_i->h = &dir->root;
-    }
-
-  /* Copy over the dynindx.  */
-
-  if (ind->root.dynindx != -1)
-    {
-      if (dir->root.dynindx != -1)
-	_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
-				dir->root.dynstr_index);
-      dir->root.dynindx = ind->root.dynindx;
-      dir->root.dynstr_index = ind->root.dynstr_index;
-      ind->root.dynindx = -1;
-      ind->root.dynstr_index = 0;
-    }
-}
-
-static void
-elfNN_ia64_hash_hide_symbol (struct bfd_link_info *info,
-			     struct elf_link_hash_entry *xh,
-			     bool force_local)
-{
-  struct elfNN_ia64_link_hash_entry *h;
-  struct elfNN_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  h = (struct elfNN_ia64_link_hash_entry *)xh;
-
-  _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
-
-  for (count = h->count, dyn_i = h->info;
-       count != 0;
-       count--, dyn_i++)
-    {
-      dyn_i->want_plt2 = 0;
-      dyn_i->want_plt = 0;
-    }
-}
-
-/* Compute a hash of a local hash entry.  */
-
-static hashval_t
-elfNN_ia64_local_htab_hash (const void *ptr)
-{
-  struct elfNN_ia64_local_hash_entry *entry
-    = (struct elfNN_ia64_local_hash_entry *) ptr;
-
-  return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
-}
-
-/* Compare local hash entries.  */
-
-static int
-elfNN_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
-{
-  struct elfNN_ia64_local_hash_entry *entry1
-    = (struct elfNN_ia64_local_hash_entry *) ptr1;
-  struct elfNN_ia64_local_hash_entry *entry2
-    = (struct elfNN_ia64_local_hash_entry *) ptr2;
-
-  return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
-}
-
-/* Free the global elfNN_ia64_dyn_sym_info array.  */
-
-static bool
-elfNN_ia64_global_dyn_info_free (struct elf_link_hash_entry *xentry,
-				 void *unused ATTRIBUTE_UNUSED)
-{
-  struct elfNN_ia64_link_hash_entry *entry
-    = (struct elfNN_ia64_link_hash_entry *) xentry;
-
-  free (entry->info);
-  entry->info = NULL;
-  entry->count = 0;
-  entry->sorted_count = 0;
-  entry->size = 0;
-
-  return true;
-}
-
-/* Free the local elfNN_ia64_dyn_sym_info array.  */
-
-static int
-elfNN_ia64_local_dyn_info_free (void **slot,
-				void * unused ATTRIBUTE_UNUSED)
-{
-  struct elfNN_ia64_local_hash_entry *entry
-    = (struct elfNN_ia64_local_hash_entry *) *slot;
-
-  free (entry->info);
-  entry->info = NULL;
-  entry->count = 0;
-  entry->sorted_count = 0;
-  entry->size = 0;
-
-  return true;
-}
-
-/* Destroy IA-64 linker hash table.  */
-
-static void
-elfNN_ia64_link_hash_table_free (bfd *obfd)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info
-    = (struct elfNN_ia64_link_hash_table *) obfd->link.hash;
-  if (ia64_info->loc_hash_table)
-    {
-      htab_traverse (ia64_info->loc_hash_table,
-		     elfNN_ia64_local_dyn_info_free, NULL);
-      htab_delete (ia64_info->loc_hash_table);
-    }
-  if (ia64_info->loc_hash_memory)
-    objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
-  elf_link_hash_traverse (&ia64_info->root,
-			  elfNN_ia64_global_dyn_info_free, NULL);
-  _bfd_elf_link_hash_table_free (obfd);
-}
-
-/* Create the derived linker hash table.  The IA-64 ELF port uses this
-   derived hash table to keep information specific to the IA-64 ElF
-   linker (without using static variables).  */
-
-static struct bfd_link_hash_table *
-elfNN_ia64_hash_table_create (bfd *abfd)
-{
-  struct elfNN_ia64_link_hash_table *ret;
-
-  ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
-  if (!ret)
-    return NULL;
-
-  if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
-				      elfNN_ia64_new_elf_hash_entry,
-				      sizeof (struct elfNN_ia64_link_hash_entry),
-				      IA64_ELF_DATA))
-    {
-      free (ret);
-      return NULL;
-    }
-
-  ret->loc_hash_table = htab_try_create (1024, elfNN_ia64_local_htab_hash,
-					 elfNN_ia64_local_htab_eq, NULL);
-  ret->loc_hash_memory = objalloc_create ();
-  if (!ret->loc_hash_table || !ret->loc_hash_memory)
-    {
-      elfNN_ia64_link_hash_table_free (abfd);
-      return NULL;
-    }
-  ret->root.root.hash_table_free = elfNN_ia64_link_hash_table_free;
-  ret->root.dt_pltgot_required = true;
-
-  return &ret->root.root;
-}
-
-/* Traverse both local and global hash tables.  */
-
-struct elfNN_ia64_dyn_sym_traverse_data
-{
-  bool (*func) (struct elfNN_ia64_dyn_sym_info *, void *);
-  void * data;
-};
-
-static bool
-elfNN_ia64_global_dyn_sym_thunk (struct elf_link_hash_entry *xentry,
-				 void * xdata)
-{
-  struct elfNN_ia64_link_hash_entry *entry
-    = (struct elfNN_ia64_link_hash_entry *) xentry;
-  struct elfNN_ia64_dyn_sym_traverse_data *data
-    = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
-  struct elfNN_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  for (count = entry->count, dyn_i = entry->info;
-       count != 0;
-       count--, dyn_i++)
-    if (! (*data->func) (dyn_i, data->data))
-      return false;
-  return true;
-}
-
-static int
-elfNN_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
-{
-  struct elfNN_ia64_local_hash_entry *entry
-    = (struct elfNN_ia64_local_hash_entry *) *slot;
-  struct elfNN_ia64_dyn_sym_traverse_data *data
-    = (struct elfNN_ia64_dyn_sym_traverse_data *) xdata;
-  struct elfNN_ia64_dyn_sym_info *dyn_i;
-  unsigned int count;
-
-  for (count = entry->count, dyn_i = entry->info;
-       count != 0;
-       count--, dyn_i++)
-    if (! (*data->func) (dyn_i, data->data))
-      return false;
-  return true;
-}
-
-static void
-elfNN_ia64_dyn_sym_traverse (struct elfNN_ia64_link_hash_table *ia64_info,
-			     bool (*func) (struct elfNN_ia64_dyn_sym_info *,
-					   void *),
-			     void * data)
-{
-  struct elfNN_ia64_dyn_sym_traverse_data xdata;
-
-  xdata.func = func;
-  xdata.data = data;
-
-  elf_link_hash_traverse (&ia64_info->root,
-			  elfNN_ia64_global_dyn_sym_thunk, &xdata);
-  htab_traverse (ia64_info->loc_hash_table,
-		 elfNN_ia64_local_dyn_sym_thunk, &xdata);
-}
-
-static bool
-elfNN_ia64_create_dynamic_sections (bfd *abfd,
-				    struct bfd_link_info *info)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *s;
-
-  if (! _bfd_elf_create_dynamic_sections (abfd, info))
-    return false;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  {
-    flagword flags = bfd_section_flags (ia64_info->root.sgot);
-    bfd_set_section_flags (ia64_info->root.sgot, SEC_SMALL_DATA | flags);
-    /* The .got section is always aligned at 8 bytes.  */
-    if (!bfd_set_section_alignment (ia64_info->root.sgot, 3))
-      return false;
-  }
-
-  if (!get_pltoff (abfd, info, ia64_info))
-    return false;
-
-  s = bfd_make_section_anyway_with_flags (abfd, ".rela.IA_64.pltoff",
-					  (SEC_ALLOC | SEC_LOAD
-					   | SEC_HAS_CONTENTS
-					   | SEC_IN_MEMORY
-					   | SEC_LINKER_CREATED
-					   | SEC_READONLY));
-  if (s == NULL
-      || !bfd_set_section_alignment (s, LOG_SECTION_ALIGN))
-    return false;
-  ia64_info->rel_pltoff_sec = s;
-
-  return true;
-}
-
-/* Find and/or create a hash entry for local symbol.  */
-static struct elfNN_ia64_local_hash_entry *
-get_local_sym_hash (struct elfNN_ia64_link_hash_table *ia64_info,
-		    bfd *abfd, const Elf_Internal_Rela *rel,
-		    bool create)
-{
-  struct elfNN_ia64_local_hash_entry e, *ret;
-  asection *sec = abfd->sections;
-  hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
-				       ELFNN_R_SYM (rel->r_info));
-  void **slot;
-
-  e.id = sec->id;
-  e.r_sym = ELFNN_R_SYM (rel->r_info);
-  slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
-				   create ? INSERT : NO_INSERT);
-
-  if (!slot)
-    return NULL;
-
-  if (*slot)
-    return (struct elfNN_ia64_local_hash_entry *) *slot;
-
-  ret = (struct elfNN_ia64_local_hash_entry *)
-	objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
-			sizeof (struct elfNN_ia64_local_hash_entry));
-  if (ret)
-    {
-      memset (ret, 0, sizeof (*ret));
-      ret->id = sec->id;
-      ret->r_sym = ELFNN_R_SYM (rel->r_info);
-      *slot = ret;
-    }
-  return ret;
-}
-
-/* Used to sort elfNN_ia64_dyn_sym_info array.  */
-
-static int
-addend_compare (const void *xp, const void *yp)
-{
-  const struct elfNN_ia64_dyn_sym_info *x
-    = (const struct elfNN_ia64_dyn_sym_info *) xp;
-  const struct elfNN_ia64_dyn_sym_info *y
-    = (const struct elfNN_ia64_dyn_sym_info *) yp;
-
-  return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
-}
-
-/* Sort elfNN_ia64_dyn_sym_info array and remove duplicates.  */
-
-static unsigned int
-sort_dyn_sym_info (struct elfNN_ia64_dyn_sym_info *info,
-		   unsigned int count)
-{
-  bfd_vma curr, prev, got_offset;
-  unsigned int i, kept, dupes, diff, dest, src, len;
-
-  qsort (info, count, sizeof (*info), addend_compare);
-
-  /* Find the first duplicate.  */
-  prev = info [0].addend;
-  got_offset = info [0].got_offset;
-  for (i = 1; i < count; i++)
-    {
-      curr = info [i].addend;
-      if (curr == prev)
-	{
-	  /* For duplicates, make sure that GOT_OFFSET is valid.  */
-	  if (got_offset == (bfd_vma) -1)
-	    got_offset = info [i].got_offset;
-	  break;
-	}
-      got_offset = info [i].got_offset;
-      prev = curr;
-    }
-
-  /* We may move a block of elements to here.  */
-  dest = i++;
-
-  /* Remove duplicates.  */
-  if (i < count)
-    {
-      while (i < count)
-	{
-	  /* For duplicates, make sure that the kept one has a valid
-	     got_offset.  */
-	  kept = dest - 1;
-	  if (got_offset != (bfd_vma) -1)
-	    info [kept].got_offset = got_offset;
-
-	  curr = info [i].addend;
-	  got_offset = info [i].got_offset;
-
-	  /* Move a block of elements whose first one is different from
-	     the previous.  */
-	  if (curr == prev)
-	    {
-	      for (src = i + 1; src < count; src++)
-		{
-		  if (info [src].addend != curr)
-		    break;
-		  /* For duplicates, make sure that GOT_OFFSET is
-		     valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [src].got_offset;
-		}
-
-	      /* Make sure that the kept one has a valid got_offset.  */
-	      if (got_offset != (bfd_vma) -1)
-		info [kept].got_offset = got_offset;
-	    }
-	  else
-	    src = i;
-
-	  if (src >= count)
-	    break;
-
-	  /* Find the next duplicate.  SRC will be kept.  */
-	  prev = info [src].addend;
-	  got_offset = info [src].got_offset;
-	  for (dupes = src + 1; dupes < count; dupes ++)
-	    {
-	      curr = info [dupes].addend;
-	      if (curr == prev)
-		{
-		  /* Make sure that got_offset is valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [dupes].got_offset;
-
-		  /* For duplicates, make sure that the kept one has
-		     a valid got_offset.  */
-		  if (got_offset != (bfd_vma) -1)
-		    info [dupes - 1].got_offset = got_offset;
-		  break;
-		}
-	      got_offset = info [dupes].got_offset;
-	      prev = curr;
-	    }
-
-	  /* How much to move.  */
-	  len = dupes - src;
-	  i = dupes + 1;
-
-	  if (len == 1 && dupes < count)
-	    {
-	      /* If we only move 1 element, we combine it with the next
-		 one.  There must be at least a duplicate.  Find the
-		 next different one.  */
-	      for (diff = dupes + 1, src++; diff < count; diff++, src++)
-		{
-		  if (info [diff].addend != curr)
-		    break;
-		  /* Make sure that got_offset is valid.  */
-		  if (got_offset == (bfd_vma) -1)
-		    got_offset = info [diff].got_offset;
-		}
-
-	      /* Makre sure that the last duplicated one has an valid
-		 offset.  */
-	      BFD_ASSERT (curr == prev);
-	      if (got_offset != (bfd_vma) -1)
-		info [diff - 1].got_offset = got_offset;
-
-	      if (diff < count)
-		{
-		  /* Find the next duplicate.  Track the current valid
-		     offset.  */
-		  prev = info [diff].addend;
-		  got_offset = info [diff].got_offset;
-		  for (dupes = diff + 1; dupes < count; dupes ++)
-		    {
-		      curr = info [dupes].addend;
-		      if (curr == prev)
-			{
-			  /* For duplicates, make sure that GOT_OFFSET
-			     is valid.  */
-			  if (got_offset == (bfd_vma) -1)
-			    got_offset = info [dupes].got_offset;
-			  break;
-			}
-		      got_offset = info [dupes].got_offset;
-		      prev = curr;
-		      diff++;
-		    }
-
-		  len = diff - src + 1;
-		  i = diff + 1;
-		}
-	    }
-
-	  memmove (&info [dest], &info [src], len * sizeof (*info));
-
-	  dest += len;
-	}
-
-      count = dest;
-    }
-  else
-    {
-      /* When we get here, either there is no duplicate at all or
-	 the only duplicate is the last element.  */
-      if (dest < count)
-	{
-	  /* If the last element is a duplicate, make sure that the
-	     kept one has a valid got_offset.  We also update count.  */
-	  if (got_offset != (bfd_vma) -1)
-	    info [dest - 1].got_offset = got_offset;
-	  count = dest;
-	}
-    }
-
-  return count;
-}
-
-/* Find and/or create a descriptor for dynamic symbol info.  This will
-   vary based on global or local symbol, and the addend to the reloc.
-
-   We don't sort when inserting.  Also, we sort and eliminate
-   duplicates if there is an unsorted section.  Typically, this will
-   only happen once, because we do all insertions before lookups.  We
-   then use bsearch to do a lookup.  This also allows lookups to be
-   fast.  So we have fast insertion (O(log N) due to duplicate check),
-   fast lookup (O(log N)) and one sort (O(N log N) expected time).
-   Previously, all lookups were O(N) because of the use of the linked
-   list and also all insertions were O(N) because of the check for
-   duplicates.  There are some complications here because the array
-   size grows occasionally, which may add an O(N) factor, but this
-   should be rare.  Also,  we free the excess array allocation, which
-   requires a copy which is O(N), but this only happens once.  */
-
-static struct elfNN_ia64_dyn_sym_info *
-get_dyn_sym_info (struct elfNN_ia64_link_hash_table *ia64_info,
-		  struct elf_link_hash_entry *h, bfd *abfd,
-		  const Elf_Internal_Rela *rel, bool create)
-{
-  struct elfNN_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
-  unsigned int *count_p, *sorted_count_p, *size_p;
-  unsigned int count, sorted_count, size;
-  bfd_vma addend = rel ? rel->r_addend : 0;
-  bfd_size_type amt;
-
-  if (h)
-    {
-      struct elfNN_ia64_link_hash_entry *global_h;
-
-      global_h = (struct elfNN_ia64_link_hash_entry *) h;
-      info_p = &global_h->info;
-      count_p = &global_h->count;
-      sorted_count_p = &global_h->sorted_count;
-      size_p = &global_h->size;
-    }
-  else
-    {
-      struct elfNN_ia64_local_hash_entry *loc_h;
-
-      loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
-      if (!loc_h)
-	{
-	  BFD_ASSERT (!create);
-	  return NULL;
-	}
-
-      info_p = &loc_h->info;
-      count_p = &loc_h->count;
-      sorted_count_p = &loc_h->sorted_count;
-      size_p = &loc_h->size;
-    }
-
-  count = *count_p;
-  sorted_count = *sorted_count_p;
-  size = *size_p;
-  info = *info_p;
-  if (create)
-    {
-      /* When we create the array, we don't check for duplicates,
-	 except in the previously sorted section if one exists, and
-	 against the last inserted entry.  This allows insertions to
-	 be fast.  */
-      if (info)
-	{
-	  if (sorted_count)
-	    {
-	      /* Try bsearch first on the sorted section.  */
-	      key.addend = addend;
-	      dyn_i = bsearch (&key, info, sorted_count,
-			       sizeof (*info), addend_compare);
-	      if (dyn_i)
-		return dyn_i;
-	    }
-
-	  if (count != 0)
-	    {
-	      /* Do a quick check for the last inserted entry.  */
-	      dyn_i = info + count - 1;
-	      if (dyn_i->addend == addend)
-		return dyn_i;
-	    }
-	}
-
-      if (size == 0)
-	{
-	  /* It is the very first element. We create the array of size
-	     1.  */
-	  size = 1;
-	  amt = size * sizeof (*info);
-	  info = bfd_malloc (amt);
-	}
-      else if (size <= count)
-	{
-	  /* We double the array size every time when we reach the
-	     size limit.  */
-	  size += size;
-	  amt = size * sizeof (*info);
-	  info = bfd_realloc (info, amt);
-	}
-      else
-	goto has_space;
-
-      if (info == NULL)
-	return NULL;
-      *size_p = size;
-      *info_p = info;
-
-    has_space:
-      /* Append the new one to the array.  */
-      dyn_i = info + count;
-      memset (dyn_i, 0, sizeof (*dyn_i));
-      dyn_i->got_offset = (bfd_vma) -1;
-      dyn_i->addend = addend;
-
-      /* We increment count only since the new ones are unsorted and
-	 may have duplicate.  */
-      (*count_p)++;
-    }
-  else
-    {
-      /* It is a lookup without insertion.  Sort array if part of the
-	 array isn't sorted.  */
-      if (count != sorted_count)
-	{
-	  count = sort_dyn_sym_info (info, count);
-	  *count_p = count;
-	  *sorted_count_p = count;
-	}
-
-      /* Free unused memory.  */
-      if (size != count)
-	{
-	  amt = count * sizeof (*info);
-	  info = bfd_realloc (info, amt);
-	  *size_p = count;
-	  if (info == NULL && count != 0)
-	    /* realloc should never fail since we are reducing size here,
-	       but if it does use the old array.  */
-	    info = *info_p;
-	  else
-	    *info_p = info;
-	}
-
-      if (count == 0)
-	dyn_i = NULL;
-      else
-	{
-	  key.addend = addend;
-	  dyn_i = bsearch (&key, info, count, sizeof (*info), addend_compare);
-	}
-    }
-
-  return dyn_i;
-}
-
-static asection *
-get_got (bfd *abfd, struct bfd_link_info *info,
-	 struct elfNN_ia64_link_hash_table *ia64_info)
-{
-  asection *got;
-  bfd *dynobj;
-
-  got = ia64_info->root.sgot;
-  if (!got)
-    {
-      flagword flags;
-
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-      if (!_bfd_elf_create_got_section (dynobj, info))
-	return NULL;
-
-      got = ia64_info->root.sgot;
-
-      /* The .got section is always aligned at 8 bytes.  */
-      if (!bfd_set_section_alignment (got, 3))
-	return NULL;
-
-      flags = bfd_section_flags (got);
-      if (!bfd_set_section_flags (got, SEC_SMALL_DATA | flags))
-	return NULL;
-    }
-
-  return got;
-}
-
-/* Create function descriptor section (.opd).  This section is called .opd
-   because it contains "official procedure descriptors".  The "official"
-   refers to the fact that these descriptors are used when taking the address
-   of a procedure, thus ensuring a unique address for each procedure.  */
-
-static asection *
-get_fptr (bfd *abfd, struct bfd_link_info *info,
-	  struct elfNN_ia64_link_hash_table *ia64_info)
-{
-  asection *fptr;
-  bfd *dynobj;
-
-  fptr = ia64_info->fptr_sec;
-  if (!fptr)
-    {
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-
-      fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
-						 (SEC_ALLOC
-						  | SEC_LOAD
-						  | SEC_HAS_CONTENTS
-						  | SEC_IN_MEMORY
-						  | (bfd_link_pie (info)
-						     ? 0 : SEC_READONLY)
-						  | SEC_LINKER_CREATED));
-      if (!fptr
-	  || !bfd_set_section_alignment (fptr, 4))
-	{
-	  BFD_ASSERT (0);
-	  return NULL;
-	}
-
-      ia64_info->fptr_sec = fptr;
-
-      if (bfd_link_pie (info))
-	{
-	  asection *fptr_rel;
-	  fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
-							 (SEC_ALLOC | SEC_LOAD
-							  | SEC_HAS_CONTENTS
-							  | SEC_IN_MEMORY
-							  | SEC_LINKER_CREATED
-							  | SEC_READONLY));
-	  if (fptr_rel == NULL
-	      || !bfd_set_section_alignment (fptr_rel, LOG_SECTION_ALIGN))
-	    {
-	      BFD_ASSERT (0);
-	      return NULL;
-	    }
-
-	  ia64_info->rel_fptr_sec = fptr_rel;
-	}
-    }
-
-  return fptr;
-}
-
-static asection *
-get_pltoff (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED,
-	    struct elfNN_ia64_link_hash_table *ia64_info)
-{
-  asection *pltoff;
-  bfd *dynobj;
-
-  pltoff = ia64_info->pltoff_sec;
-  if (!pltoff)
-    {
-      dynobj = ia64_info->root.dynobj;
-      if (!dynobj)
-	ia64_info->root.dynobj = dynobj = abfd;
-
-      pltoff = bfd_make_section_anyway_with_flags (dynobj,
-						   ELF_STRING_ia64_pltoff,
-						   (SEC_ALLOC
-						    | SEC_LOAD
-						    | SEC_HAS_CONTENTS
-						    | SEC_IN_MEMORY
-						    | SEC_SMALL_DATA
-						    | SEC_LINKER_CREATED));
-      if (!pltoff
-	  || !bfd_set_section_alignment (pltoff, 4))
-	{
-	  BFD_ASSERT (0);
-	  return NULL;
-	}
-
-      ia64_info->pltoff_sec = pltoff;
-    }
-
-  return pltoff;
-}
-
-static asection *
-get_reloc_section (bfd *abfd,
-		   struct elfNN_ia64_link_hash_table *ia64_info,
-		   asection *sec, bool create)
-{
-  const char *srel_name;
-  asection *srel;
-  bfd *dynobj;
-
-  srel_name = (bfd_elf_string_from_elf_section
-	       (abfd, elf_elfheader(abfd)->e_shstrndx,
-		_bfd_elf_single_rel_hdr (sec)->sh_name));
-  if (srel_name == NULL)
-    return NULL;
-
-  dynobj = ia64_info->root.dynobj;
-  if (!dynobj)
-    ia64_info->root.dynobj = dynobj = abfd;
-
-  srel = bfd_get_linker_section (dynobj, srel_name);
-  if (srel == NULL && create)
-    {
-      srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
-						 (SEC_ALLOC | SEC_LOAD
-						  | SEC_HAS_CONTENTS
-						  | SEC_IN_MEMORY
-						  | SEC_LINKER_CREATED
-						  | SEC_READONLY));
-      if (srel == NULL
-	  || !bfd_set_section_alignment (srel, LOG_SECTION_ALIGN))
-	return NULL;
-    }
-
-  return srel;
-}
-
-static bool
-count_dyn_reloc (bfd *abfd, struct elfNN_ia64_dyn_sym_info *dyn_i,
-		 asection *srel, int type, bool reltext)
-{
-  struct elfNN_ia64_dyn_reloc_entry *rent;
-
-  for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
-    if (rent->srel == srel && rent->type == type)
-      break;
-
-  if (!rent)
-    {
-      rent = ((struct elfNN_ia64_dyn_reloc_entry *)
-	      bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
-      if (!rent)
-	return false;
-
-      rent->next = dyn_i->reloc_entries;
-      rent->srel = srel;
-      rent->type = type;
-      rent->count = 0;
-      dyn_i->reloc_entries = rent;
-    }
-  rent->reltext = reltext;
-  rent->count++;
-
-  return true;
-}
-
-static bool
-elfNN_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
-			 asection *sec,
-			 const Elf_Internal_Rela *relocs)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  const Elf_Internal_Rela *relend;
-  Elf_Internal_Shdr *symtab_hdr;
-  const Elf_Internal_Rela *rel;
-  asection *got, *fptr, *srel, *pltoff;
-  enum {
-    NEED_GOT = 1,
-    NEED_GOTX = 2,
-    NEED_FPTR = 4,
-    NEED_PLTOFF = 8,
-    NEED_MIN_PLT = 16,
-    NEED_FULL_PLT = 32,
-    NEED_DYNREL = 64,
-    NEED_LTOFF_FPTR = 128,
-    NEED_TPREL = 256,
-    NEED_DTPMOD = 512,
-    NEED_DTPREL = 1024
-  };
-  int need_entry;
-  struct elf_link_hash_entry *h;
-  unsigned long r_symndx;
-  bool maybe_dynamic;
-
-  if (bfd_link_relocatable (info))
-    return true;
-
-  symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  got = fptr = srel = pltoff = NULL;
-
-  relend = relocs + sec->reloc_count;
-
-  /* We scan relocations first to create dynamic relocation arrays.  We
-     modified get_dyn_sym_info to allow fast insertion and support fast
-     lookup in the next loop.  */
-  for (rel = relocs; rel < relend; ++rel)
-    {
-      r_symndx = ELFNN_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-	{
-	  long indx = r_symndx - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  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;
-	}
-      else
-	h = NULL;
-
-      /* We can only get preliminary data on whether a symbol is
-	 locally or externally defined, as not all of the input files
-	 have yet been processed.  Do something with what we know, as
-	 this may help reduce memory usage and processing time later.  */
-      maybe_dynamic = (h && ((!bfd_link_executable (info)
-			      && (!SYMBOLIC_BIND (info, h)
-				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
-			     || !h->def_regular
-			     || h->root.type == bfd_link_hash_defweak));
-
-      need_entry = 0;
-      switch (ELFNN_R_TYPE (rel->r_info))
-	{
-	case R_IA64_TPREL64MSB:
-	case R_IA64_TPREL64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_LTOFF_TPREL22:
-	  need_entry = NEED_TPREL;
-	  if (bfd_link_pic (info))
-	    info->flags |= DF_STATIC_TLS;
-	  break;
-
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL64MSB:
-	case R_IA64_DTPREL64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_LTOFF_DTPREL22:
-	  need_entry = NEED_DTPREL;
-	  break;
-
-	case R_IA64_DTPMOD64MSB:
-	case R_IA64_DTPMOD64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_LTOFF_DTPMOD22:
-	  need_entry = NEED_DTPMOD;
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  if (bfd_link_pic (info) || h)
-	    need_entry = NEED_FPTR | NEED_DYNREL;
-	  else
-	    need_entry = NEED_FPTR;
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF64I:
-	  need_entry = NEED_GOT;
-	  break;
-
-	case R_IA64_LTOFF22X:
-	  need_entry = NEED_GOTX;
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  need_entry = NEED_PLTOFF;
-	  if (h)
-	    {
-	      if (maybe_dynamic)
-		need_entry |= NEED_MIN_PLT;
-	    }
-	  else
-	    {
-	      (*info->callbacks->warning)
-		(info, _("@pltoff reloc against local symbol"), 0,
-		 abfd, 0, (bfd_vma) 0);
-	    }
-	  break;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* Depending on where this symbol is defined, we may or may not
-	     need a full plt entry.  Only skip if we know we'll not need
-	     the entry -- static or symbolic, and the symbol definition
-	     has already been seen.  */
-	  if (maybe_dynamic && rel->r_addend == 0)
-	    need_entry = NEED_FULL_PLT;
-	  break;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  if (maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  break;
-	}
-
-      if (!need_entry)
-	continue;
-
-      if ((need_entry & NEED_FPTR) != 0
-	  && rel->r_addend)
-	{
-	  (*info->callbacks->warning)
-	    (info, _("non-zero addend in @fptr reloc"), 0,
-	     abfd, 0, (bfd_vma) 0);
-	}
-
-      if (get_dyn_sym_info (ia64_info, h, abfd, rel, true) == NULL)
-	return false;
-    }
-
-  /* Now, we only do lookup without insertion, which is very fast
-     with the modified get_dyn_sym_info.  */
-  for (rel = relocs; rel < relend; ++rel)
-    {
-      struct elfNN_ia64_dyn_sym_info *dyn_i;
-      int dynrel_type = R_IA64_NONE;
-
-      r_symndx = ELFNN_R_SYM (rel->r_info);
-      if (r_symndx >= symtab_hdr->sh_info)
-	{
-	  /* We're dealing with a global symbol -- find its hash entry
-	     and mark it as being referenced.  */
-	  long indx = r_symndx - symtab_hdr->sh_info;
-	  h = elf_sym_hashes (abfd)[indx];
-	  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;
-
-	  /* PR15323, ref flags aren't set for references in the same
-	     object.  */
-	  h->ref_regular = 1;
-	}
-      else
-	h = NULL;
-
-      /* We can only get preliminary data on whether a symbol is
-	 locally or externally defined, as not all of the input files
-	 have yet been processed.  Do something with what we know, as
-	 this may help reduce memory usage and processing time later.  */
-      maybe_dynamic = (h && ((!bfd_link_executable (info)
-			      && (!SYMBOLIC_BIND (info, h)
-				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
-			     || !h->def_regular
-			     || h->root.type == bfd_link_hash_defweak));
-
-      need_entry = 0;
-      switch (ELFNN_R_TYPE (rel->r_info))
-	{
-	case R_IA64_TPREL64MSB:
-	case R_IA64_TPREL64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_TPREL64LSB;
-	  if (bfd_link_pic (info))
-	    info->flags |= DF_STATIC_TLS;
-	  break;
-
-	case R_IA64_LTOFF_TPREL22:
-	  need_entry = NEED_TPREL;
-	  if (bfd_link_pic (info))
-	    info->flags |= DF_STATIC_TLS;
-	  break;
-
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL64MSB:
-	case R_IA64_DTPREL64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_DTPRELNNLSB;
-	  break;
-
-	case R_IA64_LTOFF_DTPREL22:
-	  need_entry = NEED_DTPREL;
-	  break;
-
-	case R_IA64_DTPMOD64MSB:
-	case R_IA64_DTPMOD64LSB:
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_DTPMOD64LSB;
-	  break;
-
-	case R_IA64_LTOFF_DTPMOD22:
-	  need_entry = NEED_DTPMOD;
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  if (bfd_link_pic (info) || h)
-	    need_entry = NEED_FPTR | NEED_DYNREL;
-	  else
-	    need_entry = NEED_FPTR;
-	  dynrel_type = R_IA64_FPTRNNLSB;
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF64I:
-	  need_entry = NEED_GOT;
-	  break;
-
-	case R_IA64_LTOFF22X:
-	  need_entry = NEED_GOTX;
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  need_entry = NEED_PLTOFF;
-	  if (h)
-	    {
-	      if (maybe_dynamic)
-		need_entry |= NEED_MIN_PLT;
-	    }
-	  break;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* Depending on where this symbol is defined, we may or may not
-	     need a full plt entry.  Only skip if we know we'll not need
-	     the entry -- static or symbolic, and the symbol definition
-	     has already been seen.  */
-	  if (maybe_dynamic && rel->r_addend == 0)
-	    need_entry = NEED_FULL_PLT;
-	  break;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_DIRNNLSB;
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  /* Shared objects will always need at least a REL relocation.  */
-	  if (bfd_link_pic (info) || maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_IPLTLSB;
-	  break;
-
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  if (maybe_dynamic)
-	    need_entry = NEED_DYNREL;
-	  dynrel_type = R_IA64_PCRELNNLSB;
-	  break;
-	}
-
-      if (!need_entry)
-	continue;
-
-      dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, false);
-
-      /* Record whether or not this is a local symbol.  */
-      dyn_i->h = h;
-
-      /* Create what's needed.  */
-      if (need_entry & (NEED_GOT | NEED_GOTX | NEED_TPREL
-			| NEED_DTPMOD | NEED_DTPREL))
-	{
-	  if (!got)
-	    {
-	      got = get_got (abfd, info, ia64_info);
-	      if (!got)
-		return false;
-	    }
-	  if (need_entry & NEED_GOT)
-	    dyn_i->want_got = 1;
-	  if (need_entry & NEED_GOTX)
-	    dyn_i->want_gotx = 1;
-	  if (need_entry & NEED_TPREL)
-	    dyn_i->want_tprel = 1;
-	  if (need_entry & NEED_DTPMOD)
-	    dyn_i->want_dtpmod = 1;
-	  if (need_entry & NEED_DTPREL)
-	    dyn_i->want_dtprel = 1;
-	}
-      if (need_entry & NEED_FPTR)
-	{
-	  if (!fptr)
-	    {
-	      fptr = get_fptr (abfd, info, ia64_info);
-	      if (!fptr)
-		return false;
-	    }
-
-	  /* FPTRs for shared libraries are allocated by the dynamic
-	     linker.  Make sure this local symbol will appear in the
-	     dynamic symbol table.  */
-	  if (!h && bfd_link_pic (info))
-	    {
-	      if (! (bfd_elf_link_record_local_dynamic_symbol
-		     (info, abfd, (long) r_symndx)))
-		return false;
-	    }
-
-	  dyn_i->want_fptr = 1;
-	}
-      if (need_entry & NEED_LTOFF_FPTR)
-	dyn_i->want_ltoff_fptr = 1;
-      if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
-	{
-	  if (!ia64_info->root.dynobj)
-	    ia64_info->root.dynobj = abfd;
-	  h->needs_plt = 1;
-	  dyn_i->want_plt = 1;
-	}
-      if (need_entry & NEED_FULL_PLT)
-	dyn_i->want_plt2 = 1;
-      if (need_entry & NEED_PLTOFF)
-	{
-	  /* This is needed here, in case @pltoff is used in a non-shared
-	     link.  */
-	  if (!pltoff)
-	    {
-	      pltoff = get_pltoff (abfd, info, ia64_info);
-	      if (!pltoff)
-		return false;
-	    }
-
-	  dyn_i->want_pltoff = 1;
-	}
-      if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
-	{
-	  if (!srel)
-	    {
-	      srel = get_reloc_section (abfd, ia64_info, sec, true);
-	      if (!srel)
-		return false;
-	    }
-	  if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type,
-				(sec->flags & SEC_READONLY) != 0))
-	    return false;
-	}
-    }
-
-  return true;
-}
-
-/* For cleanliness, and potentially faster dynamic loading, allocate
-   external GOT entries first.  */
-
-static bool
-allocate_global_data_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
-			  void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if ((dyn_i->want_got || dyn_i->want_gotx)
-      && ! dyn_i->want_fptr
-      && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
-     {
-       dyn_i->got_offset = x->ofs;
-       x->ofs += 8;
-     }
-  if (dyn_i->want_tprel)
-    {
-      dyn_i->tprel_offset = x->ofs;
-      x->ofs += 8;
-    }
-  if (dyn_i->want_dtpmod)
-    {
-      if (elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
-	{
-	  dyn_i->dtpmod_offset = x->ofs;
-	  x->ofs += 8;
-	}
-      else
-	{
-	  struct elfNN_ia64_link_hash_table *ia64_info;
-
-	  ia64_info = elfNN_ia64_hash_table (x->info);
-	  if (ia64_info == NULL)
-	    return false;
-
-	  if (ia64_info->self_dtpmod_offset == (bfd_vma) -1)
-	    {
-	      ia64_info->self_dtpmod_offset = x->ofs;
-	      x->ofs += 8;
-	    }
-	  dyn_i->dtpmod_offset = ia64_info->self_dtpmod_offset;
-	}
-    }
-  if (dyn_i->want_dtprel)
-    {
-      dyn_i->dtprel_offset = x->ofs;
-      x->ofs += 8;
-    }
-  return true;
-}
-
-/* Next, allocate all the GOT entries used by LTOFF_FPTR relocs.  */
-
-static bool
-allocate_global_fptr_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
-			  void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if (dyn_i->want_got
-      && dyn_i->want_fptr
-      && elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, R_IA64_FPTRNNLSB))
-    {
-      dyn_i->got_offset = x->ofs;
-      x->ofs += 8;
-    }
-  return true;
-}
-
-/* Lastly, allocate all the GOT entries for local data.  */
-
-static bool
-allocate_local_got (struct elfNN_ia64_dyn_sym_info *dyn_i,
-		    void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if ((dyn_i->want_got || dyn_i->want_gotx)
-      && !elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0))
-    {
-      dyn_i->got_offset = x->ofs;
-      x->ofs += 8;
-    }
-  return true;
-}
-
-/* Search for the index of a global symbol in it's defining object file.  */
-
-static long
-global_sym_index (struct elf_link_hash_entry *h)
-{
-  struct elf_link_hash_entry **p;
-  bfd *obj;
-
-  BFD_ASSERT (h->root.type == bfd_link_hash_defined
-	      || h->root.type == bfd_link_hash_defweak);
-
-  obj = h->root.u.def.section->owner;
-  for (p = elf_sym_hashes (obj); *p != h; ++p)
-    continue;
-
-  return p - elf_sym_hashes (obj) + elf_tdata (obj)->symtab_hdr.sh_info;
-}
-
-/* Allocate function descriptors.  We can do these for every function
-   in a main executable that is not exported.  */
-
-static bool
-allocate_fptr (struct elfNN_ia64_dyn_sym_info *dyn_i, void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if (dyn_i->want_fptr)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-
-      if (h)
-	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;
-
-      if (!bfd_link_executable (x->info)
-	  && (!h
-	      || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
-	      || (h->root.type != bfd_link_hash_undefweak
-		  && h->root.type != bfd_link_hash_undefined)))
-	{
-	  if (h && h->dynindx == -1)
-	    {
-	      BFD_ASSERT ((h->root.type == bfd_link_hash_defined)
-			  || (h->root.type == bfd_link_hash_defweak));
-
-	      if (!bfd_elf_link_record_local_dynamic_symbol
-		    (x->info, h->root.u.def.section->owner,
-		     global_sym_index (h)))
-		return false;
-	    }
-
-	  dyn_i->want_fptr = 0;
-	}
-      else if (h == NULL || h->dynindx == -1)
-	{
-	  dyn_i->fptr_offset = x->ofs;
-	  x->ofs += 16;
-	}
-      else
-	dyn_i->want_fptr = 0;
-    }
-  return true;
-}
-
-/* Allocate all the minimal PLT entries.  */
-
-static bool
-allocate_plt_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
-		      void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if (dyn_i->want_plt)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-
-      if (h)
-	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;
-
-      /* ??? Versioned symbols seem to lose NEEDS_PLT.  */
-      if (elfNN_ia64_dynamic_symbol_p (h, x->info, 0))
-	{
-	  bfd_size_type offset = x->ofs;
-	  if (offset == 0)
-	    offset = PLT_HEADER_SIZE;
-	  dyn_i->plt_offset = offset;
-	  x->ofs = offset + PLT_MIN_ENTRY_SIZE;
-
-	  dyn_i->want_pltoff = 1;
-	}
-      else
-	{
-	  dyn_i->want_plt = 0;
-	  dyn_i->want_plt2 = 0;
-	}
-    }
-  return true;
-}
-
-/* Allocate all the full PLT entries.  */
-
-static bool
-allocate_plt2_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
-		       void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if (dyn_i->want_plt2)
-    {
-      struct elf_link_hash_entry *h = dyn_i->h;
-      bfd_size_type ofs = x->ofs;
-
-      dyn_i->plt2_offset = ofs;
-      x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
-
-      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;
-      dyn_i->h->plt.offset = ofs;
-    }
-  return true;
-}
-
-/* Allocate all the PLTOFF entries requested by relocations and
-   plt entries.  We can't share space with allocated FPTR entries,
-   because the latter are not necessarily addressable by the GP.
-   ??? Relaxation might be able to determine that they are.  */
-
-static bool
-allocate_pltoff_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
-			 void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-
-  if (dyn_i->want_pltoff)
-    {
-      dyn_i->pltoff_offset = x->ofs;
-      x->ofs += 16;
-    }
-  return true;
-}
-
-/* Allocate dynamic relocations for those symbols that turned out
-   to be dynamic.  */
-
-static bool
-allocate_dynrel_entries (struct elfNN_ia64_dyn_sym_info *dyn_i,
-			 void * data)
-{
-  struct elfNN_ia64_allocate_data *x = (struct elfNN_ia64_allocate_data *)data;
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  struct elfNN_ia64_dyn_reloc_entry *rent;
-  bool dynamic_symbol, shared, resolved_zero;
-
-  ia64_info = elfNN_ia64_hash_table (x->info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Note that this can't be used in relation to FPTR relocs below.  */
-  dynamic_symbol = elfNN_ia64_dynamic_symbol_p (dyn_i->h, x->info, 0);
-
-  shared = bfd_link_pic (x->info);
-  resolved_zero = (dyn_i->h
-		   && ELF_ST_VISIBILITY (dyn_i->h->other)
-		   && dyn_i->h->root.type == bfd_link_hash_undefweak);
-
-  /* Take care of the GOT and PLT relocations.  */
-
-  if ((!resolved_zero
-       && (dynamic_symbol || shared)
-       && (dyn_i->want_got || dyn_i->want_gotx))
-      || (dyn_i->want_ltoff_fptr
-	  && dyn_i->h
-	  && dyn_i->h->dynindx != -1))
-    {
-      if (!dyn_i->want_ltoff_fptr
-	  || !bfd_link_pie (x->info)
-	  || dyn_i->h == NULL
-	  || dyn_i->h->root.type != bfd_link_hash_undefweak)
-	ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-    }
-  if ((dynamic_symbol || shared) && dyn_i->want_tprel)
-    ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-  if (dynamic_symbol && dyn_i->want_dtpmod)
-    ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-  if (dynamic_symbol && dyn_i->want_dtprel)
-    ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-
-  if (x->only_got)
-    return true;
-
-  if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
-    {
-      if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
-	ia64_info->rel_fptr_sec->size += sizeof (ElfNN_External_Rela);
-    }
-
-  if (!resolved_zero && dyn_i->want_pltoff)
-    {
-      bfd_size_type t = 0;
-
-      /* Dynamic symbols get one IPLT relocation.  Local symbols in
-	 shared libraries get two REL relocations.  Local symbols in
-	 main applications get nothing.  */
-      if (dynamic_symbol)
-	t = sizeof (ElfNN_External_Rela);
-      else if (shared)
-	t = 2 * sizeof (ElfNN_External_Rela);
-
-      ia64_info->rel_pltoff_sec->size += t;
-    }
-
-  /* Take care of the normal data relocations.  */
-
-  for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
-    {
-      int count = rent->count;
-
-      switch (rent->type)
-	{
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64LSB:
-	  /* Allocate one iff !want_fptr and not PIE, which by this point
-	     will be true only if we're actually allocating one statically
-	     in the main executable.  Position independent executables
-	     need a relative reloc.  */
-	  if (dyn_i->want_fptr && !bfd_link_pie (x->info))
-	    continue;
-	  break;
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64LSB:
-	  if (!dynamic_symbol)
-	    continue;
-	  break;
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64LSB:
-	  if (!dynamic_symbol && !shared)
-	    continue;
-	  break;
-	case R_IA64_IPLTLSB:
-	  if (!dynamic_symbol && !shared)
-	    continue;
-	  /* Use two REL relocations for IPLT relocations
-	     against local symbols.  */
-	  if (!dynamic_symbol)
-	    count *= 2;
-	  break;
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_TPREL64LSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_DTPMOD64LSB:
-	  break;
-	default:
-	  abort ();
-	}
-      if (rent->reltext)
-	x->info->flags |= DF_TEXTREL;
-      rent->srel->size += sizeof (ElfNN_External_Rela) * count;
-    }
-
-  return true;
-}
-
-static bool
-elfNN_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
-				  struct elf_link_hash_entry *h)
-{
-  /* ??? Undefined symbols with PLT entries should be re-defined
-     to be the PLT entry.  */
-
-  /* If this is a weak symbol, and there is a real definition, the
-     processor independent code will have arranged for us to see the
-     real definition first, and we can just use the same value.  */
-  if (h->is_weakalias)
-    {
-      struct elf_link_hash_entry *def = weakdef (h);
-      BFD_ASSERT (def->root.type == bfd_link_hash_defined);
-      h->root.u.def.section = def->root.u.def.section;
-      h->root.u.def.value = def->root.u.def.value;
-      return true;
-    }
-
-  /* If this is a reference to a symbol defined by a dynamic object which
-     is not a function, we might allocate the symbol in our .dynbss section
-     and allocate a COPY dynamic relocation.
-
-     But IA-64 code is canonically PIC, so as a rule we can avoid this sort
-     of hackery.  */
-
-  return true;
-}
-
-static bool
-elfNN_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
-			       struct bfd_link_info *info)
-{
-  struct elfNN_ia64_allocate_data data;
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *sec;
-  bfd *dynobj;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-  dynobj = ia64_info->root.dynobj;
-  if (dynobj == NULL)
-    return true;
-  ia64_info->self_dtpmod_offset = (bfd_vma) -1;
-  data.info = info;
-
-  /* Set the contents of the .interp section to the interpreter.  */
-  if (ia64_info->root.dynamic_sections_created
-      && bfd_link_executable (info) && !info->nointerp)
-    {
-      sec = bfd_get_linker_section (dynobj, ".interp");
-      BFD_ASSERT (sec != NULL);
-      sec->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
-      sec->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1;
-    }
-
-  /* Allocate the GOT entries.  */
-
-  if (ia64_info->root.sgot)
-    {
-      data.ofs = 0;
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
-      ia64_info->root.sgot->size = data.ofs;
-    }
-
-  /* Allocate the FPTR entries.  */
-
-  if (ia64_info->fptr_sec)
-    {
-      data.ofs = 0;
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
-      ia64_info->fptr_sec->size = data.ofs;
-    }
-
-  /* Now that we've seen all of the input files, we can decide which
-     symbols need plt entries.  Allocate the minimal PLT entries first.
-     We do this even though dynamic_sections_created may be FALSE, because
-     this has the side-effect of clearing want_plt and want_plt2.  */
-
-  data.ofs = 0;
-  elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
-
-  ia64_info->minplt_entries = 0;
-  if (data.ofs)
-    {
-      ia64_info->minplt_entries
-	= (data.ofs - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
-    }
-
-  /* Align the pointer for the plt2 entries.  */
-  data.ofs = (data.ofs + 31) & (bfd_vma) -32;
-
-  elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
-  if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
-    {
-      /* FIXME: we always reserve the memory for dynamic linker even if
-	 there are no PLT entries since dynamic linker may assume the
-	 reserved memory always exists.  */
-
-      BFD_ASSERT (ia64_info->root.dynamic_sections_created);
-
-      ia64_info->root.splt->size = data.ofs;
-
-      /* If we've got a .plt, we need some extra memory for the dynamic
-	 linker.  We stuff these in .got.plt.  */
-      ia64_info->root.sgotplt->size = 8 * PLT_RESERVED_WORDS;
-    }
-
-  /* Allocate the PLTOFF entries.  */
-
-  if (ia64_info->pltoff_sec)
-    {
-      data.ofs = 0;
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
-      ia64_info->pltoff_sec->size = data.ofs;
-    }
-
-  if (ia64_info->root.dynamic_sections_created)
-    {
-      /* Allocate space for the dynamic relocations that turned out to be
-	 required.  */
-
-      if (bfd_link_pic (info) && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
-	ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
-      data.only_got = false;
-      elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
-    }
-
-  /* We have now determined the sizes of the various dynamic sections.
-     Allocate memory for them.  */
-  for (sec = dynobj->sections; sec != NULL; sec = sec->next)
-    {
-      bool strip;
-
-      if (!(sec->flags & SEC_LINKER_CREATED))
-	continue;
-
-      /* If we don't need this section, strip it from the output file.
-	 There were several sections primarily related to dynamic
-	 linking that must be create before the linker maps input
-	 sections to output sections.  The linker does that before
-	 bfd_elf_size_dynamic_sections is called, and it is that
-	 function which decides whether anything needs to go into
-	 these sections.  */
-
-      strip = (sec->size == 0);
-
-      if (sec == ia64_info->root.sgot)
-	strip = false;
-      else if (sec == ia64_info->root.srelgot)
-	{
-	  if (strip)
-	    ia64_info->root.srelgot = NULL;
-	  else
-	    /* We use the reloc_count field as a counter if we need to
-	       copy relocs into the output file.  */
-	    sec->reloc_count = 0;
-	}
-      else if (sec == ia64_info->fptr_sec)
-	{
-	  if (strip)
-	    ia64_info->fptr_sec = NULL;
-	}
-      else if (sec == ia64_info->rel_fptr_sec)
-	{
-	  if (strip)
-	    ia64_info->rel_fptr_sec = NULL;
-	  else
-	    /* We use the reloc_count field as a counter if we need to
-	       copy relocs into the output file.  */
-	    sec->reloc_count = 0;
-	}
-      else if (sec == ia64_info->root.splt)
-	{
-	  if (strip)
-	    ia64_info->root.splt = NULL;
-	}
-      else if (sec == ia64_info->pltoff_sec)
-	{
-	  if (strip)
-	    ia64_info->pltoff_sec = NULL;
-	}
-      else if (sec == ia64_info->rel_pltoff_sec)
-	{
-	  if (strip)
-	    ia64_info->rel_pltoff_sec = NULL;
-	  else
-	    {
-	      ia64_info->root.dt_jmprel_required = true;
-	      /* We use the reloc_count field as a counter if we need to
-		 copy relocs into the output file.  */
-	      sec->reloc_count = 0;
-	    }
-	}
-      else
-	{
-	  const char *name;
-
-	  /* It's OK to base decisions on the section name, because none
-	     of the dynobj section names depend upon the input files.  */
-	  name = bfd_section_name (sec);
-
-	  if (strcmp (name, ".got.plt") == 0)
-	    strip = false;
-	  else if (startswith (name, ".rel"))
-	    {
-	      if (!strip)
-		{
-		  /* We use the reloc_count field as a counter if we need to
-		     copy relocs into the output file.  */
-		  sec->reloc_count = 0;
-		}
-	    }
-	  else
-	    continue;
-	}
-
-      if (strip)
-	sec->flags |= SEC_EXCLUDE;
-      else
-	{
-	  /* Allocate memory for the section contents.  */
-	  sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
-	  if (sec->contents == NULL && sec->size != 0)
-	    return false;
-	}
-    }
-
-  if (ia64_info->root.dynamic_sections_created)
-    {
-      /* Add some entries to the .dynamic section.  We fill in the values
-	 later (in finish_dynamic_sections) but we must add the entries now
-	 so that we get the correct size for the .dynamic section.  */
-
-#define add_dynamic_entry(TAG, VAL) \
-  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
-
-      if (!_bfd_elf_add_dynamic_tags (output_bfd, info, true))
-	return false;
-
-      if (!add_dynamic_entry (DT_IA_64_PLT_RESERVE, 0))
-	return false;
-    }
-
-  /* ??? Perhaps force __gp local.  */
-
-  return true;
-}
-
-static void
-elfNN_ia64_install_dyn_reloc (bfd *abfd, struct bfd_link_info *info,
-			      asection *sec, asection *srel,
-			      bfd_vma offset, unsigned int type,
-			      long dynindx, bfd_vma addend)
-{
-  Elf_Internal_Rela outrel;
-  bfd_byte *loc;
-
-  BFD_ASSERT (dynindx != -1);
-  outrel.r_info = ELFNN_R_INFO (dynindx, type);
-  outrel.r_addend = addend;
-  outrel.r_offset = _bfd_elf_section_offset (abfd, info, sec, offset);
-  if (outrel.r_offset >= (bfd_vma) -2)
-    {
-      /* Run for the hills.  We shouldn't be outputting a relocation
-	 for this.  So do what everyone else does and output a no-op.  */
-      outrel.r_info = ELFNN_R_INFO (0, R_IA64_NONE);
-      outrel.r_addend = 0;
-      outrel.r_offset = 0;
-    }
-  else
-    outrel.r_offset += sec->output_section->vma + sec->output_offset;
-
-  loc = srel->contents;
-  loc += srel->reloc_count++ * sizeof (ElfNN_External_Rela);
-  bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
-  BFD_ASSERT (sizeof (ElfNN_External_Rela) * srel->reloc_count <= srel->size);
-}
-
-/* Store an entry for target address TARGET_ADDR in the linkage table
-   and return the gp-relative address of the linkage table entry.  */
-
-static bfd_vma
-set_got_entry (bfd *abfd, struct bfd_link_info *info,
-	       struct elfNN_ia64_dyn_sym_info *dyn_i,
-	       long dynindx, bfd_vma addend, bfd_vma value,
-	       unsigned int dyn_r_type)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *got_sec;
-  bool done;
-  bfd_vma got_offset;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  got_sec = ia64_info->root.sgot;
-
-  switch (dyn_r_type)
-    {
-    case R_IA64_TPREL64LSB:
-      done = dyn_i->tprel_done;
-      dyn_i->tprel_done = true;
-      got_offset = dyn_i->tprel_offset;
-      break;
-    case R_IA64_DTPMOD64LSB:
-      if (dyn_i->dtpmod_offset != ia64_info->self_dtpmod_offset)
-	{
-	  done = dyn_i->dtpmod_done;
-	  dyn_i->dtpmod_done = true;
-	}
-      else
-	{
-	  done = ia64_info->self_dtpmod_done;
-	  ia64_info->self_dtpmod_done = true;
-	  dynindx = 0;
-	}
-      got_offset = dyn_i->dtpmod_offset;
-      break;
-    case R_IA64_DTPREL32LSB:
-    case R_IA64_DTPREL64LSB:
-      done = dyn_i->dtprel_done;
-      dyn_i->dtprel_done = true;
-      got_offset = dyn_i->dtprel_offset;
-      break;
-    default:
-      done = dyn_i->got_done;
-      dyn_i->got_done = true;
-      got_offset = dyn_i->got_offset;
-      break;
-    }
-
-  BFD_ASSERT ((got_offset & 7) == 0);
-
-  if (! done)
-    {
-      /* Store the target address in the linkage table entry.  */
-      bfd_put_64 (abfd, value, got_sec->contents + got_offset);
-
-      /* Install a dynamic relocation if needed.  */
-      if (((bfd_link_pic (info)
-	    && (!dyn_i->h
-		|| ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
-		|| dyn_i->h->root.type != bfd_link_hash_undefweak)
-	    && dyn_r_type != R_IA64_DTPREL32LSB
-	    && dyn_r_type != R_IA64_DTPREL64LSB)
-	   || elfNN_ia64_dynamic_symbol_p (dyn_i->h, info, dyn_r_type)
-	   || (dynindx != -1
-	       && (dyn_r_type == R_IA64_FPTR32LSB
-		   || dyn_r_type == R_IA64_FPTR64LSB)))
-	  && (!dyn_i->want_ltoff_fptr
-	      || !bfd_link_pie (info)
-	      || !dyn_i->h
-	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
-	{
-	  if (dynindx == -1
-	      && dyn_r_type != R_IA64_TPREL64LSB
-	      && dyn_r_type != R_IA64_DTPMOD64LSB
-	      && dyn_r_type != R_IA64_DTPREL32LSB
-	      && dyn_r_type != R_IA64_DTPREL64LSB)
-	    {
-	      dyn_r_type = R_IA64_RELNNLSB;
-	      dynindx = 0;
-	      addend = value;
-	    }
-
-	  if (bfd_big_endian (abfd))
-	    {
-	      switch (dyn_r_type)
-		{
-		case R_IA64_REL32LSB:
-		  dyn_r_type = R_IA64_REL32MSB;
-		  break;
-		case R_IA64_DIR32LSB:
-		  dyn_r_type = R_IA64_DIR32MSB;
-		  break;
-		case R_IA64_FPTR32LSB:
-		  dyn_r_type = R_IA64_FPTR32MSB;
-		  break;
-		case R_IA64_DTPREL32LSB:
-		  dyn_r_type = R_IA64_DTPREL32MSB;
-		  break;
-		case R_IA64_REL64LSB:
-		  dyn_r_type = R_IA64_REL64MSB;
-		  break;
-		case R_IA64_DIR64LSB:
-		  dyn_r_type = R_IA64_DIR64MSB;
-		  break;
-		case R_IA64_FPTR64LSB:
-		  dyn_r_type = R_IA64_FPTR64MSB;
-		  break;
-		case R_IA64_TPREL64LSB:
-		  dyn_r_type = R_IA64_TPREL64MSB;
-		  break;
-		case R_IA64_DTPMOD64LSB:
-		  dyn_r_type = R_IA64_DTPMOD64MSB;
-		  break;
-		case R_IA64_DTPREL64LSB:
-		  dyn_r_type = R_IA64_DTPREL64MSB;
-		  break;
-		default:
-		  BFD_ASSERT (false);
-		  break;
-		}
-	    }
-
-	  elfNN_ia64_install_dyn_reloc (abfd, NULL, got_sec,
-					ia64_info->root.srelgot,
-					got_offset, dyn_r_type,
-					dynindx, addend);
-	}
-    }
-
-  /* Return the address of the linkage table entry.  */
-  value = (got_sec->output_section->vma
-	   + got_sec->output_offset
-	   + got_offset);
-
-  return value;
-}
-
-/* Fill in a function descriptor consisting of the function's code
-   address and its global pointer.  Return the descriptor's address.  */
-
-static bfd_vma
-set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
-		struct elfNN_ia64_dyn_sym_info *dyn_i,
-		bfd_vma value)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *fptr_sec;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  fptr_sec = ia64_info->fptr_sec;
-
-  if (!dyn_i->fptr_done)
-    {
-      dyn_i->fptr_done = 1;
-
-      /* Fill in the function descriptor.  */
-      bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
-      bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
-		  fptr_sec->contents + dyn_i->fptr_offset + 8);
-      if (ia64_info->rel_fptr_sec)
-	{
-	  Elf_Internal_Rela outrel;
-	  bfd_byte *loc;
-
-	  if (bfd_little_endian (abfd))
-	    outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTLSB);
-	  else
-	    outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTMSB);
-	  outrel.r_addend = value;
-	  outrel.r_offset = (fptr_sec->output_section->vma
-			     + fptr_sec->output_offset
-			     + dyn_i->fptr_offset);
-	  loc = ia64_info->rel_fptr_sec->contents;
-	  loc += ia64_info->rel_fptr_sec->reloc_count++
-		 * sizeof (ElfNN_External_Rela);
-	  bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
-	}
-    }
-
-  /* Return the descriptor's address.  */
-  value = (fptr_sec->output_section->vma
-	   + fptr_sec->output_offset
-	   + dyn_i->fptr_offset);
-
-  return value;
-}
-
-/* Fill in a PLTOFF entry consisting of the function's code address
-   and its global pointer.  Return the descriptor's address.  */
-
-static bfd_vma
-set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
-		  struct elfNN_ia64_dyn_sym_info *dyn_i,
-		  bfd_vma value, bool is_plt)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *pltoff_sec;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return 0;
-
-  pltoff_sec = ia64_info->pltoff_sec;
-
-  /* Don't do anything if this symbol uses a real PLT entry.  In
-     that case, we'll fill this in during finish_dynamic_symbol.  */
-  if ((! dyn_i->want_plt || is_plt)
-      && !dyn_i->pltoff_done)
-    {
-      bfd_vma gp = _bfd_get_gp_value (abfd);
-
-      /* Fill in the function descriptor.  */
-      bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
-      bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
-
-      /* Install dynamic relocations if needed.  */
-      if (!is_plt
-	  && bfd_link_pic (info)
-	  && (!dyn_i->h
-	      || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
-	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
-	{
-	  unsigned int dyn_r_type;
-
-	  if (bfd_big_endian (abfd))
-	    dyn_r_type = R_IA64_RELNNMSB;
-	  else
-	    dyn_r_type = R_IA64_RELNNLSB;
-
-	  elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
-					ia64_info->rel_pltoff_sec,
-					dyn_i->pltoff_offset,
-					dyn_r_type, 0, value);
-	  elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
-					ia64_info->rel_pltoff_sec,
-					dyn_i->pltoff_offset + ARCH_SIZE / 8,
-					dyn_r_type, 0, gp);
-	}
-
-      dyn_i->pltoff_done = 1;
-    }
-
-  /* Return the descriptor's address.  */
-  value = (pltoff_sec->output_section->vma
-	   + pltoff_sec->output_offset
-	   + dyn_i->pltoff_offset);
-
-  return value;
-}
-
-/* Return the base VMA address which should be subtracted from real addresses
-   when resolving @tprel() relocation.
-   Main program TLS (whose template starts at PT_TLS p_vaddr)
-   is assigned offset round(2 * size of pointer, PT_TLS p_align).  */
-
-static bfd_vma
-elfNN_ia64_tprel_base (struct bfd_link_info *info)
-{
-  asection *tls_sec = elf_hash_table (info)->tls_sec;
-  return tls_sec->vma - align_power ((bfd_vma) ARCH_SIZE / 4,
-				     tls_sec->alignment_power);
-}
-
-/* Return the base VMA address which should be subtracted from real addresses
-   when resolving @dtprel() relocation.
-   This is PT_TLS segment p_vaddr.  */
-
-static bfd_vma
-elfNN_ia64_dtprel_base (struct bfd_link_info *info)
-{
-  return elf_hash_table (info)->tls_sec->vma;
-}
-
-/* Called through qsort to sort the .IA_64.unwind section during a
-   non-relocatable link.  Set elfNN_ia64_unwind_entry_compare_bfd
-   to the output bfd so we can do proper endianness frobbing.  */
-
-static bfd *elfNN_ia64_unwind_entry_compare_bfd;
-
-static int
-elfNN_ia64_unwind_entry_compare (const void * a, const void * b)
-{
-  bfd_vma av, bv;
-
-  av = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, a);
-  bv = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, b);
-
-  return (av < bv ? -1 : av > bv ? 1 : 0);
-}
-
-/* Make sure we've got ourselves a nice fat __gp value.  */
-static bool
-elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final)
-{
-  bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
-  bfd_vma min_short_vma = min_vma, max_short_vma = 0;
-  struct elf_link_hash_entry *gp;
-  bfd_vma gp_val;
-  asection *os;
-  struct elfNN_ia64_link_hash_table *ia64_info;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Find the min and max vma of all sections marked short.  Also collect
-     min and max vma of any type, for use in selecting a nice gp.  */
-  for (os = abfd->sections; os ; os = os->next)
-    {
-      bfd_vma lo, hi;
-
-      if ((os->flags & SEC_ALLOC) == 0)
-	continue;
-
-      lo = os->vma;
-      /* When this function is called from elfNN_ia64_final_link
-	 the correct value to use is os->size.  When called from
-	 elfNN_ia64_relax_section we are in the middle of section
-	 sizing; some sections will already have os->size set, others
-	 will have os->size zero and os->rawsize the previous size.  */
-      hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
-      if (hi < lo)
-	hi = (bfd_vma) -1;
-
-      if (min_vma > lo)
-	min_vma = lo;
-      if (max_vma < hi)
-	max_vma = hi;
-      if (os->flags & SEC_SMALL_DATA)
-	{
-	  if (min_short_vma > lo)
-	    min_short_vma = lo;
-	  if (max_short_vma < hi)
-	    max_short_vma = hi;
-	}
-    }
-
-  if (ia64_info->min_short_sec)
-    {
-      if (min_short_vma
-	  > (ia64_info->min_short_sec->vma
-	     + ia64_info->min_short_offset))
-	min_short_vma = (ia64_info->min_short_sec->vma
-			 + ia64_info->min_short_offset);
-      if (max_short_vma
-	  < (ia64_info->max_short_sec->vma
-	     + ia64_info->max_short_offset))
-	max_short_vma = (ia64_info->max_short_sec->vma
-			 + ia64_info->max_short_offset);
-    }
-
-  /* See if the user wants to force a value.  */
-  gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
-			     false, false);
-
-  if (gp
-      && (gp->root.type == bfd_link_hash_defined
-	  || gp->root.type == bfd_link_hash_defweak))
-    {
-      asection *gp_sec = gp->root.u.def.section;
-      gp_val = (gp->root.u.def.value
-		+ gp_sec->output_section->vma
-		+ gp_sec->output_offset);
-    }
-  else
-    {
-      /* Pick a sensible value.  */
-
-      if (ia64_info->min_short_sec)
-	{
-	  bfd_vma short_range = max_short_vma - min_short_vma;
-
-	  /* If min_short_sec is set, pick one in the middle bewteen
-	     min_short_vma and max_short_vma.  */
-	  if (short_range >= 0x400000)
-	    goto overflow;
-	  gp_val = min_short_vma + short_range / 2;
-	}
-      else
-	{
-	  asection *got_sec = ia64_info->root.sgot;
-
-	  /* Start with just the address of the .got.  */
-	  if (got_sec)
-	    gp_val = got_sec->output_section->vma;
-	  else if (max_short_vma != 0)
-	    gp_val = min_short_vma;
-	  else if (max_vma - min_vma < 0x200000)
-	    gp_val = min_vma;
-	  else
-	    gp_val = max_vma - 0x200000 + 8;
-	}
-
-      /* If it is possible to address the entire image, but we
-	 don't with the choice above, adjust.  */
-      if (max_vma - min_vma < 0x400000
-	  && (max_vma - gp_val >= 0x200000
-	      || gp_val - min_vma > 0x200000))
-	gp_val = min_vma + 0x200000;
-      else if (max_short_vma != 0)
-	{
-	  /* If we don't cover all the short data, adjust.  */
-	  if (max_short_vma - gp_val >= 0x200000)
-	    gp_val = min_short_vma + 0x200000;
-
-	  /* If we're addressing stuff past the end, adjust back.  */
-	  if (gp_val > max_vma)
-	    gp_val = max_vma - 0x200000 + 8;
-	}
-    }
-
-  /* Validate whether all SHF_IA_64_SHORT sections are within
-     range of the chosen GP.  */
-
-  if (max_short_vma != 0)
-    {
-      if (max_short_vma - min_short_vma >= 0x400000)
-	{
-	overflow:
-	  _bfd_error_handler
-	    /* xgettext:c-format */
-	    (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
-	     abfd, (uint64_t) (max_short_vma - min_short_vma));
-	  return false;
-	}
-      else if ((gp_val > min_short_vma
-		&& gp_val - min_short_vma > 0x200000)
-	       || (gp_val < max_short_vma
-		   && max_short_vma - gp_val >= 0x200000))
-	{
-	  _bfd_error_handler
-	    (_("%pB: __gp does not cover short data segment"), abfd);
-	  return false;
-	}
-    }
-
-  _bfd_set_gp_value (abfd, gp_val);
-
-  return true;
-}
-
-static bool
-elfNN_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  asection *unwind_output_sec;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Make sure we've got ourselves a nice fat __gp value.  */
-  if (!bfd_link_relocatable (info))
-    {
-      bfd_vma gp_val;
-      struct elf_link_hash_entry *gp;
-
-      /* We assume after gp is set, section size will only decrease. We
-	 need to adjust gp for it.  */
-      _bfd_set_gp_value (abfd, 0);
-      if (! elfNN_ia64_choose_gp (abfd, info, true))
-	return false;
-      gp_val = _bfd_get_gp_value (abfd);
-
-      gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
-				 false, false);
-      if (gp)
-	{
-	  gp->root.type = bfd_link_hash_defined;
-	  gp->root.u.def.value = gp_val;
-	  gp->root.u.def.section = bfd_abs_section_ptr;
-	}
-    }
-
-  /* If we're producing a final executable, we need to sort the contents
-     of the .IA_64.unwind section.  Force this section to be relocated
-     into memory rather than written immediately to the output file.  */
-  unwind_output_sec = NULL;
-  if (!bfd_link_relocatable (info))
-    {
-      asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
-      if (s)
-	{
-	  unwind_output_sec = s->output_section;
-	  unwind_output_sec->contents
-	    = bfd_malloc (unwind_output_sec->size);
-	  if (unwind_output_sec->contents == NULL)
-	    return false;
-	}
-    }
-
-  /* Invoke the regular ELF backend linker to do all the work.  */
-  if (!bfd_elf_final_link (abfd, info))
-    return false;
-
-  if (unwind_output_sec)
-    {
-      elfNN_ia64_unwind_entry_compare_bfd = abfd;
-      qsort (unwind_output_sec->contents,
-	     (size_t) (unwind_output_sec->size / 24),
-	     24,
-	     elfNN_ia64_unwind_entry_compare);
-
-      if (! bfd_set_section_contents (abfd, unwind_output_sec,
-				      unwind_output_sec->contents, (bfd_vma) 0,
-				      unwind_output_sec->size))
-	return false;
-    }
-
-  return true;
-}
-
-static int
-elfNN_ia64_relocate_section (bfd *output_bfd,
-			     struct bfd_link_info *info,
-			     bfd *input_bfd,
-			     asection *input_section,
-			     bfd_byte *contents,
-			     Elf_Internal_Rela *relocs,
-			     Elf_Internal_Sym *local_syms,
-			     asection **local_sections)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  Elf_Internal_Shdr *symtab_hdr;
-  Elf_Internal_Rela *rel;
-  Elf_Internal_Rela *relend;
-  asection *srel;
-  bool ret_val = true;	/* for non-fatal errors */
-  bfd_vma gp_val;
-
-  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  /* Infect various flags from the input section to the output section.  */
-  if (bfd_link_relocatable (info))
-    {
-      bfd_vma flags;
-
-      flags = elf_section_data(input_section)->this_hdr.sh_flags;
-      flags &= SHF_IA_64_NORECOV;
-
-      elf_section_data(input_section->output_section)
-	->this_hdr.sh_flags |= flags;
-    }
-
-  gp_val = _bfd_get_gp_value (output_bfd);
-  srel = get_reloc_section (input_bfd, ia64_info, input_section, false);
-
-  rel = relocs;
-  relend = relocs + input_section->reloc_count;
-  for (; rel < relend; ++rel)
-    {
-      struct elf_link_hash_entry *h;
-      struct elfNN_ia64_dyn_sym_info *dyn_i;
-      bfd_reloc_status_type r;
-      reloc_howto_type *howto;
-      unsigned long r_symndx;
-      Elf_Internal_Sym *sym;
-      unsigned int r_type;
-      bfd_vma value;
-      asection *sym_sec;
-      bfd_byte *hit_addr;
-      bool dynamic_symbol_p;
-      bool undef_weak_ref;
-
-      r_type = ELFNN_R_TYPE (rel->r_info);
-      if (r_type > R_IA64_MAX_RELOC_CODE)
-	{
-	  /* xgettext:c-format */
-	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-			      input_bfd, (int) r_type);
-	  bfd_set_error (bfd_error_bad_value);
-	  ret_val = false;
-	  continue;
-	}
-
-      howto = ia64_elf_lookup_howto (r_type);
-      if (howto == NULL)
-	{
-	  ret_val = false;
-	  continue;
-	}
-
-      r_symndx = ELFNN_R_SYM (rel->r_info);
-      h = NULL;
-      sym = NULL;
-      sym_sec = NULL;
-      undef_weak_ref = false;
-
-      if (r_symndx < symtab_hdr->sh_info)
-	{
-	  /* Reloc against local symbol.  */
-	  asection *msec;
-	  sym = local_syms + r_symndx;
-	  sym_sec = local_sections[r_symndx];
-	  msec = sym_sec;
-	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
-	  if (!bfd_link_relocatable (info)
-	      && (sym_sec->flags & SEC_MERGE) != 0
-	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
-	      && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
-	    {
-	      struct elfNN_ia64_local_hash_entry *loc_h;
-
-	      loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false);
-	      if (loc_h && ! loc_h->sec_merge_done)
-		{
-		  struct elfNN_ia64_dyn_sym_info *dynent;
-		  unsigned int count;
-
-		  for (count = loc_h->count, dynent = loc_h->info;
-		       count != 0;
-		       count--, dynent++)
-		    {
-		      msec = sym_sec;
-		      dynent->addend =
-			_bfd_merged_section_offset (output_bfd, &msec,
-						    elf_section_data (msec)->
-						    sec_info,
-						    sym->st_value
-						    + dynent->addend);
-		      dynent->addend -= sym->st_value;
-		      dynent->addend += msec->output_section->vma
-					+ msec->output_offset
-					- sym_sec->output_section->vma
-					- sym_sec->output_offset;
-		    }
-
-		  /* We may have introduced duplicated entries. We need
-		     to remove them properly.  */
-		  count = sort_dyn_sym_info (loc_h->info, loc_h->count);
-		  if (count != loc_h->count)
-		    {
-		      loc_h->count = count;
-		      loc_h->sorted_count = count;
-		    }
-
-		  loc_h->sec_merge_done = 1;
-		}
-	    }
-	}
-      else
-	{
-	  bool unresolved_reloc;
-	  bool warned, ignored;
-	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
-
-	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
-				   r_symndx, symtab_hdr, sym_hashes,
-				   h, sym_sec, value,
-				   unresolved_reloc, warned, ignored);
-
-	  if (h->root.type == bfd_link_hash_undefweak)
-	    undef_weak_ref = true;
-	  else if (warned || (ignored && bfd_link_executable (info)))
-	    continue;
-	}
-
-      if (sym_sec != NULL && discarded_section (sym_sec))
-	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
-					 rel, 1, relend, howto, 0, contents);
-
-      if (bfd_link_relocatable (info))
-	continue;
-
-      hit_addr = contents + rel->r_offset;
-      value += rel->r_addend;
-      dynamic_symbol_p = elfNN_ia64_dynamic_symbol_p (h, info, r_type);
-
-      switch (r_type)
-	{
-	case R_IA64_NONE:
-	case R_IA64_LDXMOV:
-	  continue;
-
-	case R_IA64_IMM14:
-	case R_IA64_IMM22:
-	case R_IA64_IMM64:
-	case R_IA64_DIR32MSB:
-	case R_IA64_DIR32LSB:
-	case R_IA64_DIR64MSB:
-	case R_IA64_DIR64LSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if ((dynamic_symbol_p || bfd_link_pic (info))
-	      && r_symndx != STN_UNDEF
-	      && (input_section->flags & SEC_ALLOC) != 0)
-	    {
-	      unsigned int dyn_r_type;
-	      long dynindx;
-	      bfd_vma addend;
-
-	      BFD_ASSERT (srel != NULL);
-
-	      switch (r_type)
-		{
-		case R_IA64_IMM14:
-		case R_IA64_IMM22:
-		case R_IA64_IMM64:
-		  /* ??? People shouldn't be doing non-pic code in
-		     shared libraries nor dynamic executables.  */
-		  _bfd_error_handler
-		    /* xgettext:c-format */
-		    (_("%pB: non-pic code with imm relocation against dynamic symbol `%s'"),
-		     input_bfd,
-		     h ? h->root.root.string
-		       : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-					   sym_sec));
-		  ret_val = false;
-		  continue;
-
-		default:
-		  break;
-		}
-
-	      /* If we don't need dynamic symbol lookup, find a
-		 matching RELATIVE relocation.  */
-	      dyn_r_type = r_type;
-	      if (dynamic_symbol_p)
-		{
-		  dynindx = h->dynindx;
-		  addend = rel->r_addend;
-		  value = 0;
-		}
-	      else
-		{
-		  switch (r_type)
-		    {
-		    case R_IA64_DIR32MSB:
-		      dyn_r_type = R_IA64_REL32MSB;
-		      break;
-		    case R_IA64_DIR32LSB:
-		      dyn_r_type = R_IA64_REL32LSB;
-		      break;
-		    case R_IA64_DIR64MSB:
-		      dyn_r_type = R_IA64_REL64MSB;
-		      break;
-		    case R_IA64_DIR64LSB:
-		      dyn_r_type = R_IA64_REL64LSB;
-		      break;
-
-		    default:
-		      break;
-		    }
-		  dynindx = 0;
-		  addend = value;
-		}
-
-	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
-					    srel, rel->r_offset, dyn_r_type,
-					    dynindx, addend);
-	    }
-	  /* Fall through.  */
-
-	case R_IA64_LTV32MSB:
-	case R_IA64_LTV32LSB:
-	case R_IA64_LTV64MSB:
-	case R_IA64_LTV64LSB:
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_GPREL22:
-	case R_IA64_GPREL64I:
-	case R_IA64_GPREL32MSB:
-	case R_IA64_GPREL32LSB:
-	case R_IA64_GPREL64MSB:
-	case R_IA64_GPREL64LSB:
-	  if (dynamic_symbol_p)
-	    {
-	      _bfd_error_handler
-		/* xgettext:c-format */
-		(_("%pB: @gprel relocation against dynamic symbol %s"),
-		 input_bfd,
-		 h ? h->root.root.string
-		   : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec));
-	      ret_val = false;
-	      continue;
-	    }
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_LTOFF22:
-	case R_IA64_LTOFF22X:
-	case R_IA64_LTOFF64I:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  value = set_got_entry (input_bfd, info, dyn_i, (h ? h->dynindx : -1),
-				 rel->r_addend, value, R_IA64_DIRNNLSB);
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_PLTOFF22:
-	case R_IA64_PLTOFF64I:
-	case R_IA64_PLTOFF64MSB:
-	case R_IA64_PLTOFF64LSB:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  value = set_pltoff_entry (output_bfd, info, dyn_i, value, false);
-	  value -= gp_val;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_FPTR64I:
-	case R_IA64_FPTR32MSB:
-	case R_IA64_FPTR32LSB:
-	case R_IA64_FPTR64MSB:
-	case R_IA64_FPTR64LSB:
-	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	  if (dyn_i->want_fptr)
-	    {
-	      if (!undef_weak_ref)
-		value = set_fptr_entry (output_bfd, info, dyn_i, value);
-	    }
-	  if (!dyn_i->want_fptr || bfd_link_pie (info))
-	    {
-	      long dynindx;
-	      unsigned int dyn_r_type = r_type;
-	      bfd_vma addend = rel->r_addend;
-
-	      /* Otherwise, we expect the dynamic linker to create
-		 the entry.  */
-
-	      if (dyn_i->want_fptr)
-		{
-		  if (r_type == R_IA64_FPTR64I)
-		    {
-		      /* We can't represent this without a dynamic symbol.
-			 Adjust the relocation to be against an output
-			 section symbol, which are always present in the
-			 dynamic symbol table.  */
-		      /* ??? People shouldn't be doing non-pic code in
-			 shared libraries.  Hork.  */
-		      _bfd_error_handler
-			(_("%pB: linking non-pic code in a position independent executable"),
-			 input_bfd);
-		      ret_val = false;
-		      continue;
-		    }
-		  dynindx = 0;
-		  addend = value;
-		  dyn_r_type = r_type + R_IA64_RELNNLSB - R_IA64_FPTRNNLSB;
-		}
-	      else if (h)
-		{
-		  if (h->dynindx != -1)
-		    dynindx = h->dynindx;
-		  else
-		    dynindx = (_bfd_elf_link_lookup_local_dynindx
-			       (info, h->root.u.def.section->owner,
-				global_sym_index (h)));
-		  value = 0;
-		}
-	      else
-		{
-		  dynindx = (_bfd_elf_link_lookup_local_dynindx
-			     (info, input_bfd, (long) r_symndx));
-		  value = 0;
-		}
-
-	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
-					    srel, rel->r_offset, dyn_r_type,
-					    dynindx, addend);
-	    }
-
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_LTOFF_FPTR22:
-	case R_IA64_LTOFF_FPTR64I:
-	case R_IA64_LTOFF_FPTR32MSB:
-	case R_IA64_LTOFF_FPTR32LSB:
-	case R_IA64_LTOFF_FPTR64MSB:
-	case R_IA64_LTOFF_FPTR64LSB:
-	  {
-	    long dynindx;
-
-	    dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	    if (dyn_i->want_fptr)
-	      {
-		BFD_ASSERT (h == NULL || h->dynindx == -1);
-		if (!undef_weak_ref)
-		  value = set_fptr_entry (output_bfd, info, dyn_i, value);
-		dynindx = -1;
-	      }
-	    else
-	      {
-		/* Otherwise, we expect the dynamic linker to create
-		   the entry.  */
-		if (h)
-		  {
-		    if (h->dynindx != -1)
-		      dynindx = h->dynindx;
-		    else
-		      dynindx = (_bfd_elf_link_lookup_local_dynindx
-				 (info, h->root.u.def.section->owner,
-				  global_sym_index (h)));
-		  }
-		else
-		  dynindx = (_bfd_elf_link_lookup_local_dynindx
-			     (info, input_bfd, (long) r_symndx));
-		value = 0;
-	      }
-
-	    value = set_got_entry (output_bfd, info, dyn_i, dynindx,
-				   rel->r_addend, value, R_IA64_FPTRNNLSB);
-	    value -= gp_val;
-	    r = ia64_elf_install_value (hit_addr, value, r_type);
-	  }
-	  break;
-
-	case R_IA64_PCREL32MSB:
-	case R_IA64_PCREL32LSB:
-	case R_IA64_PCREL64MSB:
-	case R_IA64_PCREL64LSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if (dynamic_symbol_p && r_symndx != STN_UNDEF)
-	    {
-	      BFD_ASSERT (srel != NULL);
-
-	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
-					    srel, rel->r_offset, r_type,
-					    h->dynindx, rel->r_addend);
-	    }
-	  goto finish_pcrel;
-
-	case R_IA64_PCREL21B:
-	case R_IA64_PCREL60B:
-	  /* We should have created a PLT entry for any dynamic symbol.  */
-	  dyn_i = NULL;
-	  if (h)
-	    dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
-
-	  if (dyn_i && dyn_i->want_plt2)
-	    {
-	      /* Should have caught this earlier.  */
-	      BFD_ASSERT (rel->r_addend == 0);
-
-	      value = (ia64_info->root.splt->output_section->vma
-		       + ia64_info->root.splt->output_offset
-		       + dyn_i->plt2_offset);
-	    }
-	  else
-	    {
-	      /* Since there's no PLT entry, Validate that this is
-		 locally defined.  */
-	      BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
-
-	      /* If the symbol is undef_weak, we shouldn't be trying
-		 to call it.  There's every chance that we'd wind up
-		 with an out-of-range fixup here.  Don't bother setting
-		 any value at all.  */
-	      if (undef_weak_ref)
-		continue;
-	    }
-	  goto finish_pcrel;
-
-	case R_IA64_PCREL21BI:
-	case R_IA64_PCREL21F:
-	case R_IA64_PCREL21M:
-	case R_IA64_PCREL22:
-	case R_IA64_PCREL64I:
-	  /* The PCREL21BI reloc is specifically not intended for use with
-	     dynamic relocs.  PCREL21F and PCREL21M are used for speculation
-	     fixup code, and thus probably ought not be dynamic.  The
-	     PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs.  */
-	  if (dynamic_symbol_p)
-	    {
-	      const char *msg;
-
-	      if (r_type == R_IA64_PCREL21BI)
-		/* xgettext:c-format */
-		msg = _("%pB: @internal branch to dynamic symbol %s");
-	      else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
-		/* xgettext:c-format */
-		msg = _("%pB: speculation fixup to dynamic symbol %s");
-	      else
-		/* xgettext:c-format */
-		msg = _("%pB: @pcrel relocation against dynamic symbol %s");
-	      _bfd_error_handler (msg, input_bfd,
-				  h ? h->root.root.string
-				  : bfd_elf_sym_name (input_bfd,
-						      symtab_hdr,
-						      sym,
-						      sym_sec));
-	      ret_val = false;
-	      continue;
-	    }
-	  goto finish_pcrel;
-
-	finish_pcrel:
-	  /* Make pc-relative.  */
-	  value -= (input_section->output_section->vma
-		    + input_section->output_offset
-		    + rel->r_offset) & ~ (bfd_vma) 0x3;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_SEGREL32MSB:
-	case R_IA64_SEGREL32LSB:
-	case R_IA64_SEGREL64MSB:
-	case R_IA64_SEGREL64LSB:
-	    {
-	      /* Find the segment that contains the output_section.  */
-	      Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
-		(output_bfd, input_section->output_section);
-
-	      if (p == NULL)
-		{
-		  r = bfd_reloc_notsupported;
-		}
-	      else
-		{
-		  /* The VMA of the segment is the vaddr of the associated
-		     program header.  */
-		  if (value > p->p_vaddr)
-		    value -= p->p_vaddr;
-		  else
-		    value = 0;
-		  r = ia64_elf_install_value (hit_addr, value, r_type);
-		}
-	      break;
-	    }
-
-	case R_IA64_SECREL32MSB:
-	case R_IA64_SECREL32LSB:
-	case R_IA64_SECREL64MSB:
-	case R_IA64_SECREL64LSB:
-	  /* Make output-section relative to section where the symbol
-	     is defined. PR 475  */
-	  if (sym_sec)
-	    value -= sym_sec->output_section->vma;
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_IPLTMSB:
-	case R_IA64_IPLTLSB:
-	  /* Install a dynamic relocation for this reloc.  */
-	  if ((dynamic_symbol_p || bfd_link_pic (info))
-	      && (input_section->flags & SEC_ALLOC) != 0)
-	    {
-	      BFD_ASSERT (srel != NULL);
-
-	      /* If we don't need dynamic symbol lookup, install two
-		 RELATIVE relocations.  */
-	      if (!dynamic_symbol_p)
-		{
-		  unsigned int dyn_r_type;
-
-		  if (r_type == R_IA64_IPLTMSB)
-		    dyn_r_type = R_IA64_REL64MSB;
-		  else
-		    dyn_r_type = R_IA64_REL64LSB;
-
-		  elfNN_ia64_install_dyn_reloc (output_bfd, info,
-						input_section,
-						srel, rel->r_offset,
-						dyn_r_type, 0, value);
-		  elfNN_ia64_install_dyn_reloc (output_bfd, info,
-						input_section,
-						srel, rel->r_offset + 8,
-						dyn_r_type, 0, gp_val);
-		}
-	      else
-		elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
-					      srel, rel->r_offset, r_type,
-					      h->dynindx, rel->r_addend);
-	    }
-
-	  if (r_type == R_IA64_IPLTMSB)
-	    r_type = R_IA64_DIR64MSB;
-	  else
-	    r_type = R_IA64_DIR64LSB;
-	  ia64_elf_install_value (hit_addr, value, r_type);
-	  r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
-	  break;
-
-	case R_IA64_TPREL14:
-	case R_IA64_TPREL22:
-	case R_IA64_TPREL64I:
-	  if (elf_hash_table (info)->tls_sec == NULL)
-	    goto missing_tls_sec;
-	  value -= elfNN_ia64_tprel_base (info);
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_DTPREL14:
-	case R_IA64_DTPREL22:
-	case R_IA64_DTPREL64I:
-	case R_IA64_DTPREL32LSB:
-	case R_IA64_DTPREL32MSB:
-	case R_IA64_DTPREL64LSB:
-	case R_IA64_DTPREL64MSB:
-	  if (elf_hash_table (info)->tls_sec == NULL)
-	    goto missing_tls_sec;
-	  value -= elfNN_ia64_dtprel_base (info);
-	  r = ia64_elf_install_value (hit_addr, value, r_type);
-	  break;
-
-	case R_IA64_LTOFF_TPREL22:
-	case R_IA64_LTOFF_DTPMOD22:
-	case R_IA64_LTOFF_DTPREL22:
-	  {
-	    int got_r_type;
-	    long dynindx = h ? h->dynindx : -1;
-	    bfd_vma r_addend = rel->r_addend;
-
-	    switch (r_type)
-	      {
-	      default:
-	      case R_IA64_LTOFF_TPREL22:
-		if (!dynamic_symbol_p)
-		  {
-		    if (elf_hash_table (info)->tls_sec == NULL)
-		      goto missing_tls_sec;
-		    if (!bfd_link_pic (info))
-		      value -= elfNN_ia64_tprel_base (info);
-		    else
-		      {
-			r_addend += value - elfNN_ia64_dtprel_base (info);
-			dynindx = 0;
-		      }
-		  }
-		got_r_type = R_IA64_TPREL64LSB;
-		break;
-	      case R_IA64_LTOFF_DTPMOD22:
-		if (!dynamic_symbol_p && !bfd_link_pic (info))
-		  value = 1;
-		got_r_type = R_IA64_DTPMOD64LSB;
-		break;
-	      case R_IA64_LTOFF_DTPREL22:
-		if (!dynamic_symbol_p)
-		  {
-		    if (elf_hash_table (info)->tls_sec == NULL)
-		      goto missing_tls_sec;
-		    value -= elfNN_ia64_dtprel_base (info);
-		  }
-		got_r_type = R_IA64_DTPRELNNLSB;
-		break;
-	      }
-	    dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
-	    value = set_got_entry (input_bfd, info, dyn_i, dynindx, r_addend,
-				   value, got_r_type);
-	    value -= gp_val;
-	    r = ia64_elf_install_value (hit_addr, value, r_type);
-	  }
-	  break;
-
-	default:
-	  r = bfd_reloc_notsupported;
-	  break;
-	}
-
-      switch (r)
-	{
-	case bfd_reloc_ok:
-	  break;
-
-	case bfd_reloc_undefined:
-	  /* This can happen for global table relative relocs if
-	     __gp is undefined.  This is a panic situation so we
-	     don't try to continue.  */
-	  (*info->callbacks->undefined_symbol)
-	    (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
-	  return false;
-
-	case bfd_reloc_notsupported:
-	  {
-	    const char *name;
-
-	    if (h)
-	      name = h->root.root.string;
-	    else
-	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec);
-	    (*info->callbacks->warning) (info, _("unsupported reloc"),
-					 name, input_bfd,
-					 input_section, rel->r_offset);
-	    ret_val = false;
-	  }
-	  break;
-
-	case bfd_reloc_dangerous:
-	case bfd_reloc_outofrange:
-	case bfd_reloc_overflow:
-	default:
-	missing_tls_sec:
-	  {
-	    const char *name;
-
-	    if (h)
-	      name = h->root.root.string;
-	    else
-	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
-				       sym_sec);
-
-	    switch (r_type)
-	      {
-	      case R_IA64_TPREL14:
-	      case R_IA64_TPREL22:
-	      case R_IA64_TPREL64I:
-	      case R_IA64_DTPREL14:
-	      case R_IA64_DTPREL22:
-	      case R_IA64_DTPREL64I:
-	      case R_IA64_DTPREL32LSB:
-	      case R_IA64_DTPREL32MSB:
-	      case R_IA64_DTPREL64LSB:
-	      case R_IA64_DTPREL64MSB:
-	      case R_IA64_LTOFF_TPREL22:
-	      case R_IA64_LTOFF_DTPMOD22:
-	      case R_IA64_LTOFF_DTPREL22:
-		_bfd_error_handler
-		  /* xgettext:c-format */
-		  (_("%pB: missing TLS section for relocation %s against `%s'"
-		     " at %#" PRIx64 " in section `%pA'."),
-		   input_bfd, howto->name, name,
-		   (uint64_t) rel->r_offset, input_section);
-		break;
-
-	      case R_IA64_PCREL21B:
-	      case R_IA64_PCREL21BI:
-	      case R_IA64_PCREL21M:
-	      case R_IA64_PCREL21F:
-		if (is_elf_hash_table (info->hash))
-		  {
-		    /* Relaxtion is always performed for ELF output.
-		       Overflow failures for those relocations mean
-		       that the section is too big to relax.  */
-		    _bfd_error_handler
-		      /* xgettext:c-format */
-		      (_("%pB: Can't relax br (%s) to `%s' at %#" PRIx64
-			 " in section `%pA' with size %#" PRIx64
-			 " (> 0x1000000)."),
-		       input_bfd, howto->name, name, (uint64_t) rel->r_offset,
-		       input_section, (uint64_t) input_section->size);
-		    break;
-		  }
-		/* Fall through.  */
-	      default:
-		(*info->callbacks->reloc_overflow) (info,
-						    &h->root,
-						    name,
-						    howto->name,
-						    (bfd_vma) 0,
-						    input_bfd,
-						    input_section,
-						    rel->r_offset);
-		break;
-	      }
-
-	    ret_val = false;
-	  }
-	  break;
-	}
-    }
-
-  return ret_val;
-}
-
-static bool
-elfNN_ia64_finish_dynamic_symbol (bfd *output_bfd,
-				  struct bfd_link_info *info,
-				  struct elf_link_hash_entry *h,
-				  Elf_Internal_Sym *sym)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  struct elfNN_ia64_dyn_sym_info *dyn_i;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-
-  dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
-
-  /* Fill in the PLT data, if required.  */
-  if (dyn_i && dyn_i->want_plt)
-    {
-      Elf_Internal_Rela outrel;
-      bfd_byte *loc;
-      asection *plt_sec;
-      bfd_vma plt_addr, pltoff_addr, gp_val, plt_index;
-
-      gp_val = _bfd_get_gp_value (output_bfd);
-
-      /* Initialize the minimal PLT entry.  */
-
-      plt_index = (dyn_i->plt_offset - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
-      plt_sec = ia64_info->root.splt;
-      loc = plt_sec->contents + dyn_i->plt_offset;
-
-      memcpy (loc, plt_min_entry, PLT_MIN_ENTRY_SIZE);
-      ia64_elf_install_value (loc, plt_index, R_IA64_IMM22);
-      ia64_elf_install_value (loc+2, -dyn_i->plt_offset, R_IA64_PCREL21B);
-
-      plt_addr = (plt_sec->output_section->vma
-		  + plt_sec->output_offset
-		  + dyn_i->plt_offset);
-      pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true);
-
-      /* Initialize the FULL PLT entry, if needed.  */
-      if (dyn_i->want_plt2)
-	{
-	  loc = plt_sec->contents + dyn_i->plt2_offset;
-
-	  memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
-	  ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
-
-	  /* Mark the symbol as undefined, rather than as defined in the
-	     plt section.  Leave the value alone.  */
-	  /* ??? We didn't redefine it in adjust_dynamic_symbol in the
-	     first place.  But perhaps elflink.c did some for us.  */
-	  if (!h->def_regular)
-	    sym->st_shndx = SHN_UNDEF;
-	}
-
-      /* Create the dynamic relocation.  */
-      outrel.r_offset = pltoff_addr;
-      if (bfd_little_endian (output_bfd))
-	outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTLSB);
-      else
-	outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTMSB);
-      outrel.r_addend = 0;
-
-      /* This is fun.  In the .IA_64.pltoff section, we've got entries
-	 that correspond both to real PLT entries, and those that
-	 happened to resolve to local symbols but need to be created
-	 to satisfy @pltoff relocations.  The .rela.IA_64.pltoff
-	 relocations for the real PLT should come at the end of the
-	 section, so that they can be indexed by plt entry at runtime.
-
-	 We emitted all of the relocations for the non-PLT @pltoff
-	 entries during relocate_section.  So we can consider the
-	 existing sec->reloc_count to be the base of the array of
-	 PLT relocations.  */
-
-      loc = ia64_info->rel_pltoff_sec->contents;
-      loc += ((ia64_info->rel_pltoff_sec->reloc_count + plt_index)
-	      * sizeof (ElfNN_External_Rela));
-      bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
-    }
-
-  /* Mark some specially defined symbols as absolute.  */
-  if (h == ia64_info->root.hdynamic
-      || h == ia64_info->root.hgot
-      || h == ia64_info->root.hplt)
-    sym->st_shndx = SHN_ABS;
-
-  return true;
-}
-
-static bool
-elfNN_ia64_finish_dynamic_sections (bfd *abfd,
-				    struct bfd_link_info *info)
-{
-  struct elfNN_ia64_link_hash_table *ia64_info;
-  bfd *dynobj;
-
-  ia64_info = elfNN_ia64_hash_table (info);
-  if (ia64_info == NULL)
-    return false;
-
-  dynobj = ia64_info->root.dynobj;
-
-  if (ia64_info->root.dynamic_sections_created)
-    {
-      ElfNN_External_Dyn *dyncon, *dynconend;
-      asection *sdyn, *sgotplt;
-      bfd_vma gp_val;
-
-      sdyn = bfd_get_linker_section (dynobj, ".dynamic");
-      sgotplt = ia64_info->root.sgotplt;
-      BFD_ASSERT (sdyn != NULL);
-      dyncon = (ElfNN_External_Dyn *) sdyn->contents;
-      dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
-
-      gp_val = _bfd_get_gp_value (abfd);
-
-      for (; dyncon < dynconend; dyncon++)
-	{
-	  Elf_Internal_Dyn dyn;
-
-	  bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
-
-	  switch (dyn.d_tag)
-	    {
-	    case DT_PLTGOT:
-	      dyn.d_un.d_ptr = gp_val;
-	      break;
-
-	    case DT_PLTRELSZ:
-	      dyn.d_un.d_val = (ia64_info->minplt_entries
-				* sizeof (ElfNN_External_Rela));
-	      break;
-
-	    case DT_JMPREL:
-	      /* See the comment above in finish_dynamic_symbol.  */
-	      dyn.d_un.d_ptr = (ia64_info->rel_pltoff_sec->output_section->vma
-				+ ia64_info->rel_pltoff_sec->output_offset
-				+ (ia64_info->rel_pltoff_sec->reloc_count
-				   * sizeof (ElfNN_External_Rela)));
-	      break;
-
-	    case DT_IA_64_PLT_RESERVE:
-	      dyn.d_un.d_ptr = (sgotplt->output_section->vma
-				+ sgotplt->output_offset);
-	      break;
-	    }
-
-	  bfd_elfNN_swap_dyn_out (abfd, &dyn, dyncon);
-	}
-
-      /* Initialize the PLT0 entry.  */
-      if (ia64_info->root.splt)
-	{
-	  bfd_byte *loc = ia64_info->root.splt->contents;
-	  bfd_vma pltres;
-
-	  memcpy (loc, plt_header, PLT_HEADER_SIZE);
-
-	  pltres = (sgotplt->output_section->vma
-		    + sgotplt->output_offset
-		    - gp_val);
-
-	  ia64_elf_install_value (loc+1, pltres, R_IA64_GPREL22);
-	}
-    }
-
-  return true;
-}
-
-/* ELF file flag handling:  */
-
-/* Function to keep IA-64 specific file flags.  */
-static bool
-elfNN_ia64_set_private_flags (bfd *abfd, flagword flags)
-{
-  BFD_ASSERT (!elf_flags_init (abfd)
-	      || elf_elfheader (abfd)->e_flags == flags);
-
-  elf_elfheader (abfd)->e_flags = flags;
-  elf_flags_init (abfd) = true;
-  return true;
-}
-
-/* Merge backend specific data from an object file to the output
-   object file when linking.  */
-
-static bool
-elfNN_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
-{
-  bfd *obfd = info->output_bfd;
-  flagword out_flags;
-  flagword in_flags;
-  bool ok = true;
-
-  /* FIXME: What should be checked when linking shared libraries?  */
-  if ((ibfd->flags & DYNAMIC) != 0)
-    return true;
-
-  if (!is_ia64_elf (ibfd) || !is_ia64_elf (obfd))
-    return true;
-
-  in_flags  = elf_elfheader (ibfd)->e_flags;
-  out_flags = elf_elfheader (obfd)->e_flags;
-
-  if (! elf_flags_init (obfd))
-    {
-      elf_flags_init (obfd) = true;
-      elf_elfheader (obfd)->e_flags = in_flags;
-
-      if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
-	  && bfd_get_arch_info (obfd)->the_default)
-	{
-	  return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
-				    bfd_get_mach (ibfd));
-	}
-
-      return true;
-    }
-
-  /* Check flag compatibility.  */
-  if (in_flags == out_flags)
-    return true;
-
-  /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set.  */
-  if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
-    elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
-
-  if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
-    {
-      _bfd_error_handler
-	(_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
-    {
-      _bfd_error_handler
-	(_("%pB: linking big-endian files with little-endian files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
-    {
-      _bfd_error_handler
-	(_("%pB: linking 64-bit files with 32-bit files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
-    {
-      _bfd_error_handler
-	(_("%pB: linking constant-gp files with non-constant-gp files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-  if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
-      != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
-    {
-      _bfd_error_handler
-	(_("%pB: linking auto-pic files with non-auto-pic files"),
-	 ibfd);
-
-      bfd_set_error (bfd_error_bad_value);
-      ok = false;
-    }
-
-  return ok;
-}
-
-static bool
-elfNN_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
-{
-  FILE *file = (FILE *) ptr;
-  flagword flags = elf_elfheader (abfd)->e_flags;
-
-  BFD_ASSERT (abfd != NULL && ptr != NULL);
-
-  fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
-	   (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
-	   (flags & EF_IA_64_EXT) ? "EXT, " : "",
-	   (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
-	   (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
-	   (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
-	   (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
-	   (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
-	   (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
-
-  _bfd_elf_print_private_bfd_data (abfd, ptr);
-  return true;
-}
-
-static enum elf_reloc_type_class
-elfNN_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
-			     const asection *rel_sec ATTRIBUTE_UNUSED,
-			     const Elf_Internal_Rela *rela)
-{
-  switch ((int) ELFNN_R_TYPE (rela->r_info))
-    {
-    case R_IA64_REL32MSB:
-    case R_IA64_REL32LSB:
-    case R_IA64_REL64MSB:
-    case R_IA64_REL64LSB:
-      return reloc_class_relative;
-    case R_IA64_IPLTMSB:
-    case R_IA64_IPLTLSB:
-      return reloc_class_plt;
-    case R_IA64_COPY:
-      return reloc_class_copy;
-    default:
-      return reloc_class_normal;
-    }
-}
-
-static const struct bfd_elf_special_section elfNN_ia64_special_sections[] =
-{
-  { STRING_COMMA_LEN (".sbss"),	 -1, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
-  { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
-  { NULL,		     0,	  0, 0,		   0 }
-};
-
-static bool
-elfNN_ia64_object_p (bfd *abfd)
-{
-  asection *sec;
-  asection *group, *unwi, *unw;
-  flagword flags;
-  const char *name;
-  char *unwi_name, *unw_name;
-  size_t amt;
-
-  if (abfd->flags & DYNAMIC)
-    return true;
-
-  /* Flags for fake group section.  */
-  flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
-	   | SEC_EXCLUDE);
-
-  /* We add a fake section group for each .gnu.linkonce.t.* section,
-     which isn't in a section group, and its unwind sections.  */
-  for (sec = abfd->sections; sec != NULL; sec = sec->next)
-    {
-      if (elf_sec_group (sec) == NULL
-	  && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
-	      == (SEC_LINK_ONCE | SEC_CODE))
-	  && startswith (sec->name, ".gnu.linkonce.t."))
-	{
-	  name = sec->name + 16;
-
-	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
-	  unwi_name = bfd_alloc (abfd, amt);
-	  if (!unwi_name)
-	    return false;
-
-	  strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
-	  unwi = bfd_get_section_by_name (abfd, unwi_name);
-
-	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
-	  unw_name = bfd_alloc (abfd, amt);
-	  if (!unw_name)
-	    return false;
-
-	  strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
-	  unw = bfd_get_section_by_name (abfd, unw_name);
-
-	  /* We need to create a fake group section for it and its
-	     unwind sections.  */
-	  group = bfd_make_section_anyway_with_flags (abfd, name,
-						      flags);
-	  if (group == NULL)
-	    return false;
-
-	  /* Move the fake group section to the beginning.  */
-	  bfd_section_list_remove (abfd, group);
-	  bfd_section_list_prepend (abfd, group);
-
-	  elf_next_in_group (group) = sec;
-
-	  elf_group_name (sec) = name;
-	  elf_next_in_group (sec) = sec;
-	  elf_sec_group (sec) = group;
-
-	  if (unwi)
-	    {
-	      elf_group_name (unwi) = name;
-	      elf_next_in_group (unwi) = sec;
-	      elf_next_in_group (sec) = unwi;
-	      elf_sec_group (unwi) = group;
-	    }
-
-	   if (unw)
-	     {
-	       elf_group_name (unw) = name;
-	       if (unwi)
-		 {
-		   elf_next_in_group (unw) = elf_next_in_group (unwi);
-		   elf_next_in_group (unwi) = unw;
-		 }
-	       else
-		 {
-		   elf_next_in_group (unw) = sec;
-		   elf_next_in_group (sec) = unw;
-		 }
-	       elf_sec_group (unw) = group;
-	     }
-
-	   /* Fake SHT_GROUP section header.  */
-	  elf_section_data (group)->this_hdr.bfd_section = group;
-	  elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
-	}
-    }
-  return true;
-}
-
-static bool
-elfNN_ia64_hpux_vec (const bfd_target *vec)
-{
-  extern const bfd_target ia64_elfNN_hpux_be_vec;
-  return (vec == &ia64_elfNN_hpux_be_vec);
-}
-
-static bool
-elfNN_hpux_init_file_header (bfd *abfd, struct bfd_link_info *info)
-{
-  Elf_Internal_Ehdr *i_ehdrp;
-
-  if (!_bfd_elf_init_file_header (abfd, info))
-    return false;
-
-  i_ehdrp = elf_elfheader (abfd);
-  i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
-  i_ehdrp->e_ident[EI_ABIVERSION] = 1;
-  return true;
-}
-
-static bool
-elfNN_hpux_backend_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
-					     asection *sec, int *retval)
-{
-  if (bfd_is_com_section (sec))
-    {
-      *retval = SHN_IA_64_ANSI_COMMON;
-      return true;
-    }
-  return false;
-}
-
-static void
-elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
-				      asymbol *asym)
-{
-  elf_symbol_type *elfsym = (elf_symbol_type *) asym;
-
-  switch (elfsym->internal_elf_sym.st_shndx)
-    {
-    case SHN_IA_64_ANSI_COMMON:
-      asym->section = bfd_com_section_ptr;
-      asym->value = elfsym->internal_elf_sym.st_size;
-      asym->flags &= ~BSF_GLOBAL;
-      break;
-    }
-}
-
-static void
-ignore_errors (const char *fmt ATTRIBUTE_UNUSED, ...)
-{
-}
-
-#define TARGET_LITTLE_SYM		ia64_elfNN_le_vec
-#define TARGET_LITTLE_NAME		"elfNN-ia64-little"
-#define TARGET_BIG_SYM			ia64_elfNN_be_vec
-#define TARGET_BIG_NAME			"elfNN-ia64-big"
-#define ELF_ARCH			bfd_arch_ia64
-#define ELF_TARGET_ID			IA64_ELF_DATA
-#define ELF_MACHINE_CODE		EM_IA_64
-#define ELF_MACHINE_ALT1		1999	/* EAS2.3 */
-#define ELF_MACHINE_ALT2		1998	/* EAS2.2 */
-#define ELF_MAXPAGESIZE			0x10000	/* 64KB */
-#define ELF_COMMONPAGESIZE		0x4000	/* 16KB */
-
-#define elf_backend_section_from_shdr \
-	elfNN_ia64_section_from_shdr
-#define elf_backend_section_flags \
-	elfNN_ia64_section_flags
-#define elf_backend_fake_sections \
-	elfNN_ia64_fake_sections
-#define elf_backend_final_write_processing \
-	elfNN_ia64_final_write_processing
-#define elf_backend_add_symbol_hook \
-	elfNN_ia64_add_symbol_hook
-#define elf_backend_additional_program_headers \
-	elfNN_ia64_additional_program_headers
-#define elf_backend_modify_segment_map \
-	elfNN_ia64_modify_segment_map
-#define elf_backend_modify_headers \
-	elfNN_ia64_modify_headers
-#define elf_info_to_howto \
-	elfNN_ia64_info_to_howto
-
-#define bfd_elfNN_bfd_reloc_type_lookup \
-	ia64_elf_reloc_type_lookup
-#define bfd_elfNN_bfd_reloc_name_lookup \
-	ia64_elf_reloc_name_lookup
-#define bfd_elfNN_bfd_is_local_label_name \
-	elfNN_ia64_is_local_label_name
-#define bfd_elfNN_bfd_relax_section \
-	elfNN_ia64_relax_section
-
-#define elf_backend_object_p \
-	elfNN_ia64_object_p
-
-/* Stuff for the BFD linker: */
-#define bfd_elfNN_bfd_link_hash_table_create \
-	elfNN_ia64_hash_table_create
-#define elf_backend_create_dynamic_sections \
-	elfNN_ia64_create_dynamic_sections
-#define elf_backend_check_relocs \
-	elfNN_ia64_check_relocs
-#define elf_backend_adjust_dynamic_symbol \
-	elfNN_ia64_adjust_dynamic_symbol
-#define elf_backend_late_size_sections \
-	elfNN_ia64_late_size_sections
-#define elf_backend_omit_section_dynsym \
-	_bfd_elf_omit_section_dynsym_all
-#define elf_backend_relocate_section \
-	elfNN_ia64_relocate_section
-#define elf_backend_finish_dynamic_symbol \
-	elfNN_ia64_finish_dynamic_symbol
-#define elf_backend_finish_dynamic_sections \
-	elfNN_ia64_finish_dynamic_sections
-#define bfd_elfNN_bfd_final_link \
-	elfNN_ia64_final_link
-
-#define bfd_elfNN_bfd_merge_private_bfd_data \
-	elfNN_ia64_merge_private_bfd_data
-#define bfd_elfNN_bfd_set_private_flags \
-	elfNN_ia64_set_private_flags
-#define bfd_elfNN_bfd_print_private_bfd_data \
-	elfNN_ia64_print_private_bfd_data
-
-#define elf_backend_plt_readonly	1
-#define elf_backend_can_gc_sections	1
-#define elf_backend_want_plt_sym	0
-#define elf_backend_plt_alignment	5
-#define elf_backend_got_header_size	0
-#define elf_backend_want_got_plt	1
-#define elf_backend_may_use_rel_p	1
-#define elf_backend_may_use_rela_p	1
-#define elf_backend_default_use_rela_p	1
-#define elf_backend_want_dynbss		0
-#define elf_backend_copy_indirect_symbol elfNN_ia64_hash_copy_indirect
-#define elf_backend_hide_symbol		elfNN_ia64_hash_hide_symbol
-#define elf_backend_fixup_symbol	_bfd_elf_link_hash_fixup_symbol
-#define elf_backend_reloc_type_class	elfNN_ia64_reloc_type_class
-#define elf_backend_rela_normal		1
-#define elf_backend_dtrel_excludes_plt	1
-#define elf_backend_special_sections	elfNN_ia64_special_sections
-#define elf_backend_default_execstack	0
-
-/* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
-   SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
-   We don't want to flood users with so many error messages. We turn
-   off the warning for now. It will be turned on later when the Intel
-   compiler is fixed.   */
-#define elf_backend_link_order_error_handler ignore_errors
-
-#include "elfNN-target.h"
-
-/* HPUX-specific vectors.  */
-
-#undef  TARGET_LITTLE_SYM
-#undef  TARGET_LITTLE_NAME
-#undef  TARGET_BIG_SYM
-#define TARGET_BIG_SYM			ia64_elfNN_hpux_be_vec
-#undef	TARGET_BIG_NAME
-#define TARGET_BIG_NAME			"elfNN-ia64-hpux-big"
-
-/* These are HP-UX specific functions.  */
-
-#undef  elf_backend_init_file_header
-#define elf_backend_init_file_header elfNN_hpux_init_file_header
-
-#undef  elf_backend_section_from_bfd_section
-#define elf_backend_section_from_bfd_section elfNN_hpux_backend_section_from_bfd_section
-
-#undef elf_backend_symbol_processing
-#define elf_backend_symbol_processing elfNN_hpux_backend_symbol_processing
-
-#undef  elf_backend_want_p_paddr_set_to_zero
-#define elf_backend_want_p_paddr_set_to_zero 1
-
-#undef ELF_COMMONPAGESIZE
-#undef ELF_OSABI
-#define ELF_OSABI			ELFOSABI_HPUX
-
-#undef  elfNN_bed
-#define elfNN_bed elfNN_ia64_hpux_bed
-
-#include "elfNN-target.h"
diff --git a/bfd/elfxx-ia64.c b/bfd/elfxx-ia64.c
deleted file mode 100644
index 643145e1654..00000000000
--- a/bfd/elfxx-ia64.c
+++ /dev/null
@@ -1,764 +0,0 @@ 
-/* IA-64 support for 64-bit ELF
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-#include "libbfd.h"
-#include "elf-bfd.h"
-#include "opcode/ia64.h"
-#include "elf/ia64.h"
-#include "objalloc.h"
-#include "hashtab.h"
-#include "elfxx-ia64.h"
-
-/* THE RULES for all the stuff the linker creates --
-
-  GOT		Entries created in response to LTOFF or LTOFF_FPTR
-		relocations.  Dynamic relocs created for dynamic
-		symbols in an application; REL relocs for locals
-		in a shared library.
-
-  FPTR		The canonical function descriptor.  Created for local
-		symbols in applications.  Descriptors for dynamic symbols
-		and local symbols in shared libraries are created by
-		ld.so.	Thus there are no dynamic relocs against these
-		objects.  The FPTR relocs for such _are_ passed through
-		to the dynamic relocation tables.
-
-  FULL_PLT	Created for a PCREL21B relocation against a dynamic symbol.
-		Requires the creation of a PLTOFF entry.  This does not
-		require any dynamic relocations.
-
-  PLTOFF	Created by PLTOFF relocations.	For local symbols, this
-		is an alternate function descriptor, and in shared libraries
-		requires two REL relocations.  Note that this cannot be
-		transformed into an FPTR relocation, since it must be in
-		range of the GP.  For dynamic symbols, this is a function
-		descriptor for a MIN_PLT entry, and requires one IPLT reloc.
-
-  MIN_PLT	Created by PLTOFF entries against dynamic symbols.  This
-		does not require dynamic relocations.  */
-
-/* ia64-specific relocation.  */
-
-#define NELEMS(a)	((int) (sizeof (a) / sizeof ((a)[0])))
-
-/* Perform a relocation.  Not much to do here as all the hard work is
-   done in elfNN_ia64_final_link_relocate.  */
-static bfd_reloc_status_type
-ia64_elf_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc,
-		asymbol *sym ATTRIBUTE_UNUSED,
-		void *data ATTRIBUTE_UNUSED, asection *input_section,
-		bfd *output_bfd, char **error_message)
-{
-  if (output_bfd)
-    {
-      reloc->address += input_section->output_offset;
-      return bfd_reloc_ok;
-    }
-
-  if (input_section->flags & SEC_DEBUGGING)
-    return bfd_reloc_continue;
-
-  *error_message = "Unsupported call to ia64_elf_reloc";
-  return bfd_reloc_notsupported;
-}
-
-#define IA64_HOWTO(TYPE, NAME, SIZE, PCREL, IN)			\
-  HOWTO (TYPE, 0, SIZE, 0, PCREL, 0, complain_overflow_signed,	\
-	 ia64_elf_reloc, NAME, false, 0, -1, IN)
-
-/* This table has to be sorted according to increasing number of the
-   TYPE field.  */
-static reloc_howto_type ia64_howto_table[] =
-  {
-    IA64_HOWTO (R_IA64_NONE,	    "NONE",	   0, false, true),
-
-    IA64_HOWTO (R_IA64_IMM14,	    "IMM14",	   1, false, true),
-    IA64_HOWTO (R_IA64_IMM22,	    "IMM22",	   1, false, true),
-    IA64_HOWTO (R_IA64_IMM64,	    "IMM64",	   1, false, true),
-    IA64_HOWTO (R_IA64_DIR32MSB,    "DIR32MSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_DIR32LSB,    "DIR32LSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_DIR64MSB,    "DIR64MSB",	   8, false, true),
-    IA64_HOWTO (R_IA64_DIR64LSB,    "DIR64LSB",	   8, false, true),
-
-    IA64_HOWTO (R_IA64_GPREL22,	    "GPREL22",	   1, false, true),
-    IA64_HOWTO (R_IA64_GPREL64I,    "GPREL64I",	   1, false, true),
-    IA64_HOWTO (R_IA64_GPREL32MSB,  "GPREL32MSB",  4, false, true),
-    IA64_HOWTO (R_IA64_GPREL32LSB,  "GPREL32LSB",  4, false, true),
-    IA64_HOWTO (R_IA64_GPREL64MSB,  "GPREL64MSB",  8, false, true),
-    IA64_HOWTO (R_IA64_GPREL64LSB,  "GPREL64LSB",  8, false, true),
-
-    IA64_HOWTO (R_IA64_LTOFF22,	    "LTOFF22",	   1, false, true),
-    IA64_HOWTO (R_IA64_LTOFF64I,    "LTOFF64I",	   1, false, true),
-
-    IA64_HOWTO (R_IA64_PLTOFF22,    "PLTOFF22",	   1, false, true),
-    IA64_HOWTO (R_IA64_PLTOFF64I,   "PLTOFF64I",   1, false, true),
-    IA64_HOWTO (R_IA64_PLTOFF64MSB, "PLTOFF64MSB", 8, false, true),
-    IA64_HOWTO (R_IA64_PLTOFF64LSB, "PLTOFF64LSB", 8, false, true),
-
-    IA64_HOWTO (R_IA64_FPTR64I,	    "FPTR64I",	   1, false, true),
-    IA64_HOWTO (R_IA64_FPTR32MSB,   "FPTR32MSB",   4, false, true),
-    IA64_HOWTO (R_IA64_FPTR32LSB,   "FPTR32LSB",   4, false, true),
-    IA64_HOWTO (R_IA64_FPTR64MSB,   "FPTR64MSB",   8, false, true),
-    IA64_HOWTO (R_IA64_FPTR64LSB,   "FPTR64LSB",   8, false, true),
-
-    IA64_HOWTO (R_IA64_PCREL60B,    "PCREL60B",	   1, true, true),
-    IA64_HOWTO (R_IA64_PCREL21B,    "PCREL21B",	   1, true, true),
-    IA64_HOWTO (R_IA64_PCREL21M,    "PCREL21M",	   1, true, true),
-    IA64_HOWTO (R_IA64_PCREL21F,    "PCREL21F",	   1, true, true),
-    IA64_HOWTO (R_IA64_PCREL32MSB,  "PCREL32MSB",  4, true, true),
-    IA64_HOWTO (R_IA64_PCREL32LSB,  "PCREL32LSB",  4, true, true),
-    IA64_HOWTO (R_IA64_PCREL64MSB,  "PCREL64MSB",  8, true, true),
-    IA64_HOWTO (R_IA64_PCREL64LSB,  "PCREL64LSB",  8, true, true),
-
-    IA64_HOWTO (R_IA64_LTOFF_FPTR22, "LTOFF_FPTR22", 1, false, true),
-    IA64_HOWTO (R_IA64_LTOFF_FPTR64I, "LTOFF_FPTR64I", 1, false, true),
-    IA64_HOWTO (R_IA64_LTOFF_FPTR32MSB, "LTOFF_FPTR32MSB", 4, false, true),
-    IA64_HOWTO (R_IA64_LTOFF_FPTR32LSB, "LTOFF_FPTR32LSB", 4, false, true),
-    IA64_HOWTO (R_IA64_LTOFF_FPTR64MSB, "LTOFF_FPTR64MSB", 8, false, true),
-    IA64_HOWTO (R_IA64_LTOFF_FPTR64LSB, "LTOFF_FPTR64LSB", 8, false, true),
-
-    IA64_HOWTO (R_IA64_SEGREL32MSB, "SEGREL32MSB", 4, false, true),
-    IA64_HOWTO (R_IA64_SEGREL32LSB, "SEGREL32LSB", 4, false, true),
-    IA64_HOWTO (R_IA64_SEGREL64MSB, "SEGREL64MSB", 8, false, true),
-    IA64_HOWTO (R_IA64_SEGREL64LSB, "SEGREL64LSB", 8, false, true),
-
-    IA64_HOWTO (R_IA64_SECREL32MSB, "SECREL32MSB", 4, false, true),
-    IA64_HOWTO (R_IA64_SECREL32LSB, "SECREL32LSB", 4, false, true),
-    IA64_HOWTO (R_IA64_SECREL64MSB, "SECREL64MSB", 8, false, true),
-    IA64_HOWTO (R_IA64_SECREL64LSB, "SECREL64LSB", 8, false, true),
-
-    IA64_HOWTO (R_IA64_REL32MSB,    "REL32MSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_REL32LSB,    "REL32LSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_REL64MSB,    "REL64MSB",	   8, false, true),
-    IA64_HOWTO (R_IA64_REL64LSB,    "REL64LSB",	   8, false, true),
-
-    IA64_HOWTO (R_IA64_LTV32MSB,    "LTV32MSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_LTV32LSB,    "LTV32LSB",	   4, false, true),
-    IA64_HOWTO (R_IA64_LTV64MSB,    "LTV64MSB",	   8, false, true),
-    IA64_HOWTO (R_IA64_LTV64LSB,    "LTV64LSB",	   8, false, true),
-
-    IA64_HOWTO (R_IA64_PCREL21BI,   "PCREL21BI",   1, true, true),
-    IA64_HOWTO (R_IA64_PCREL22,     "PCREL22",     1, true, true),
-    IA64_HOWTO (R_IA64_PCREL64I,    "PCREL64I",    1, true, true),
-
-    IA64_HOWTO (R_IA64_IPLTMSB,	    "IPLTMSB",	   8, false, true),
-    IA64_HOWTO (R_IA64_IPLTLSB,	    "IPLTLSB",	   8, false, true),
-    IA64_HOWTO (R_IA64_COPY,	    "COPY",	   8, false, true),
-    IA64_HOWTO (R_IA64_LTOFF22X,    "LTOFF22X",	   1, false, true),
-    IA64_HOWTO (R_IA64_LDXMOV,	    "LDXMOV",	   1, false, true),
-
-    IA64_HOWTO (R_IA64_TPREL14,	    "TPREL14",	   1, false, false),
-    IA64_HOWTO (R_IA64_TPREL22,	    "TPREL22",	   1, false, false),
-    IA64_HOWTO (R_IA64_TPREL64I,    "TPREL64I",	   1, false, false),
-    IA64_HOWTO (R_IA64_TPREL64MSB,  "TPREL64MSB",  8, false, false),
-    IA64_HOWTO (R_IA64_TPREL64LSB,  "TPREL64LSB",  8, false, false),
-    IA64_HOWTO (R_IA64_LTOFF_TPREL22, "LTOFF_TPREL22",  1, false, false),
-
-    IA64_HOWTO (R_IA64_DTPMOD64MSB, "DTPMOD64MSB",  8, false, false),
-    IA64_HOWTO (R_IA64_DTPMOD64LSB, "DTPMOD64LSB",  8, false, false),
-    IA64_HOWTO (R_IA64_LTOFF_DTPMOD22, "LTOFF_DTPMOD22", 1, false, false),
-
-    IA64_HOWTO (R_IA64_DTPREL14,    "DTPREL14",	   1, false, false),
-    IA64_HOWTO (R_IA64_DTPREL22,    "DTPREL22",	   1, false, false),
-    IA64_HOWTO (R_IA64_DTPREL64I,   "DTPREL64I",   1, false, false),
-    IA64_HOWTO (R_IA64_DTPREL32MSB, "DTPREL32MSB", 4, false, false),
-    IA64_HOWTO (R_IA64_DTPREL32LSB, "DTPREL32LSB", 4, false, false),
-    IA64_HOWTO (R_IA64_DTPREL64MSB, "DTPREL64MSB", 8, false, false),
-    IA64_HOWTO (R_IA64_DTPREL64LSB, "DTPREL64LSB", 8, false, false),
-    IA64_HOWTO (R_IA64_LTOFF_DTPREL22, "LTOFF_DTPREL22", 1, false, false),
-  };
-
-static unsigned char elf_code_to_howto_index[R_IA64_MAX_RELOC_CODE + 1];
-
-/* Given a BFD reloc type, return the matching HOWTO structure.  */
-
-reloc_howto_type *
-ia64_elf_lookup_howto (unsigned int rtype)
-{
-  static bool inited = false;
-  int i;
-
-  if (!inited)
-    {
-      inited = true;
-
-      memset (elf_code_to_howto_index, 0xff, sizeof (elf_code_to_howto_index));
-      for (i = 0; i < NELEMS (ia64_howto_table); ++i)
-	elf_code_to_howto_index[ia64_howto_table[i].type] = i;
-    }
-
-  if (rtype > R_IA64_MAX_RELOC_CODE)
-    return NULL;
-  i = elf_code_to_howto_index[rtype];
-  if (i >= NELEMS (ia64_howto_table))
-    return NULL;
-  return ia64_howto_table + i;
-}
-
-reloc_howto_type *
-ia64_elf_reloc_type_lookup (bfd *abfd,
-			    bfd_reloc_code_real_type bfd_code)
-{
-  unsigned int rtype;
-
-  switch (bfd_code)
-    {
-    case BFD_RELOC_NONE:		rtype = R_IA64_NONE; break;
-
-    case BFD_RELOC_IA64_IMM14:		rtype = R_IA64_IMM14; break;
-    case BFD_RELOC_IA64_IMM22:		rtype = R_IA64_IMM22; break;
-    case BFD_RELOC_IA64_IMM64:		rtype = R_IA64_IMM64; break;
-
-    case BFD_RELOC_IA64_DIR32MSB:	rtype = R_IA64_DIR32MSB; break;
-    case BFD_RELOC_IA64_DIR32LSB:	rtype = R_IA64_DIR32LSB; break;
-    case BFD_RELOC_IA64_DIR64MSB:	rtype = R_IA64_DIR64MSB; break;
-    case BFD_RELOC_IA64_DIR64LSB:	rtype = R_IA64_DIR64LSB; break;
-
-    case BFD_RELOC_IA64_GPREL22:	rtype = R_IA64_GPREL22; break;
-    case BFD_RELOC_IA64_GPREL64I:	rtype = R_IA64_GPREL64I; break;
-    case BFD_RELOC_IA64_GPREL32MSB:	rtype = R_IA64_GPREL32MSB; break;
-    case BFD_RELOC_IA64_GPREL32LSB:	rtype = R_IA64_GPREL32LSB; break;
-    case BFD_RELOC_IA64_GPREL64MSB:	rtype = R_IA64_GPREL64MSB; break;
-    case BFD_RELOC_IA64_GPREL64LSB:	rtype = R_IA64_GPREL64LSB; break;
-
-    case BFD_RELOC_IA64_LTOFF22:	rtype = R_IA64_LTOFF22; break;
-    case BFD_RELOC_IA64_LTOFF64I:	rtype = R_IA64_LTOFF64I; break;
-
-    case BFD_RELOC_IA64_PLTOFF22:	rtype = R_IA64_PLTOFF22; break;
-    case BFD_RELOC_IA64_PLTOFF64I:	rtype = R_IA64_PLTOFF64I; break;
-    case BFD_RELOC_IA64_PLTOFF64MSB:	rtype = R_IA64_PLTOFF64MSB; break;
-    case BFD_RELOC_IA64_PLTOFF64LSB:	rtype = R_IA64_PLTOFF64LSB; break;
-    case BFD_RELOC_IA64_FPTR64I:	rtype = R_IA64_FPTR64I; break;
-    case BFD_RELOC_IA64_FPTR32MSB:	rtype = R_IA64_FPTR32MSB; break;
-    case BFD_RELOC_IA64_FPTR32LSB:	rtype = R_IA64_FPTR32LSB; break;
-    case BFD_RELOC_IA64_FPTR64MSB:	rtype = R_IA64_FPTR64MSB; break;
-    case BFD_RELOC_IA64_FPTR64LSB:	rtype = R_IA64_FPTR64LSB; break;
-
-    case BFD_RELOC_IA64_PCREL21B:	rtype = R_IA64_PCREL21B; break;
-    case BFD_RELOC_IA64_PCREL21BI:	rtype = R_IA64_PCREL21BI; break;
-    case BFD_RELOC_IA64_PCREL21M:	rtype = R_IA64_PCREL21M; break;
-    case BFD_RELOC_IA64_PCREL21F:	rtype = R_IA64_PCREL21F; break;
-    case BFD_RELOC_IA64_PCREL22:	rtype = R_IA64_PCREL22; break;
-    case BFD_RELOC_IA64_PCREL60B:	rtype = R_IA64_PCREL60B; break;
-    case BFD_RELOC_IA64_PCREL64I:	rtype = R_IA64_PCREL64I; break;
-    case BFD_RELOC_IA64_PCREL32MSB:	rtype = R_IA64_PCREL32MSB; break;
-    case BFD_RELOC_IA64_PCREL32LSB:	rtype = R_IA64_PCREL32LSB; break;
-    case BFD_RELOC_IA64_PCREL64MSB:	rtype = R_IA64_PCREL64MSB; break;
-    case BFD_RELOC_IA64_PCREL64LSB:	rtype = R_IA64_PCREL64LSB; break;
-
-    case BFD_RELOC_IA64_LTOFF_FPTR22:	rtype = R_IA64_LTOFF_FPTR22; break;
-    case BFD_RELOC_IA64_LTOFF_FPTR64I:	rtype = R_IA64_LTOFF_FPTR64I; break;
-    case BFD_RELOC_IA64_LTOFF_FPTR32MSB: rtype = R_IA64_LTOFF_FPTR32MSB; break;
-    case BFD_RELOC_IA64_LTOFF_FPTR32LSB: rtype = R_IA64_LTOFF_FPTR32LSB; break;
-    case BFD_RELOC_IA64_LTOFF_FPTR64MSB: rtype = R_IA64_LTOFF_FPTR64MSB; break;
-    case BFD_RELOC_IA64_LTOFF_FPTR64LSB: rtype = R_IA64_LTOFF_FPTR64LSB; break;
-
-    case BFD_RELOC_IA64_SEGREL32MSB:	rtype = R_IA64_SEGREL32MSB; break;
-    case BFD_RELOC_IA64_SEGREL32LSB:	rtype = R_IA64_SEGREL32LSB; break;
-    case BFD_RELOC_IA64_SEGREL64MSB:	rtype = R_IA64_SEGREL64MSB; break;
-    case BFD_RELOC_IA64_SEGREL64LSB:	rtype = R_IA64_SEGREL64LSB; break;
-
-    case BFD_RELOC_IA64_SECREL32MSB:	rtype = R_IA64_SECREL32MSB; break;
-    case BFD_RELOC_IA64_SECREL32LSB:	rtype = R_IA64_SECREL32LSB; break;
-    case BFD_RELOC_IA64_SECREL64MSB:	rtype = R_IA64_SECREL64MSB; break;
-    case BFD_RELOC_IA64_SECREL64LSB:	rtype = R_IA64_SECREL64LSB; break;
-
-    case BFD_RELOC_IA64_REL32MSB:	rtype = R_IA64_REL32MSB; break;
-    case BFD_RELOC_IA64_REL32LSB:	rtype = R_IA64_REL32LSB; break;
-    case BFD_RELOC_IA64_REL64MSB:	rtype = R_IA64_REL64MSB; break;
-    case BFD_RELOC_IA64_REL64LSB:	rtype = R_IA64_REL64LSB; break;
-
-    case BFD_RELOC_IA64_LTV32MSB:	rtype = R_IA64_LTV32MSB; break;
-    case BFD_RELOC_IA64_LTV32LSB:	rtype = R_IA64_LTV32LSB; break;
-    case BFD_RELOC_IA64_LTV64MSB:	rtype = R_IA64_LTV64MSB; break;
-    case BFD_RELOC_IA64_LTV64LSB:	rtype = R_IA64_LTV64LSB; break;
-
-    case BFD_RELOC_IA64_IPLTMSB:	rtype = R_IA64_IPLTMSB; break;
-    case BFD_RELOC_IA64_IPLTLSB:	rtype = R_IA64_IPLTLSB; break;
-    case BFD_RELOC_IA64_COPY:		rtype = R_IA64_COPY; break;
-    case BFD_RELOC_IA64_LTOFF22X:	rtype = R_IA64_LTOFF22X; break;
-    case BFD_RELOC_IA64_LDXMOV:		rtype = R_IA64_LDXMOV; break;
-
-    case BFD_RELOC_IA64_TPREL14:	rtype = R_IA64_TPREL14; break;
-    case BFD_RELOC_IA64_TPREL22:	rtype = R_IA64_TPREL22; break;
-    case BFD_RELOC_IA64_TPREL64I:	rtype = R_IA64_TPREL64I; break;
-    case BFD_RELOC_IA64_TPREL64MSB:	rtype = R_IA64_TPREL64MSB; break;
-    case BFD_RELOC_IA64_TPREL64LSB:	rtype = R_IA64_TPREL64LSB; break;
-    case BFD_RELOC_IA64_LTOFF_TPREL22:	rtype = R_IA64_LTOFF_TPREL22; break;
-
-    case BFD_RELOC_IA64_DTPMOD64MSB:	rtype = R_IA64_DTPMOD64MSB; break;
-    case BFD_RELOC_IA64_DTPMOD64LSB:	rtype = R_IA64_DTPMOD64LSB; break;
-    case BFD_RELOC_IA64_LTOFF_DTPMOD22:	rtype = R_IA64_LTOFF_DTPMOD22; break;
-
-    case BFD_RELOC_IA64_DTPREL14:	rtype = R_IA64_DTPREL14; break;
-    case BFD_RELOC_IA64_DTPREL22:	rtype = R_IA64_DTPREL22; break;
-    case BFD_RELOC_IA64_DTPREL64I:	rtype = R_IA64_DTPREL64I; break;
-    case BFD_RELOC_IA64_DTPREL32MSB:	rtype = R_IA64_DTPREL32MSB; break;
-    case BFD_RELOC_IA64_DTPREL32LSB:	rtype = R_IA64_DTPREL32LSB; break;
-    case BFD_RELOC_IA64_DTPREL64MSB:	rtype = R_IA64_DTPREL64MSB; break;
-    case BFD_RELOC_IA64_DTPREL64LSB:	rtype = R_IA64_DTPREL64LSB; break;
-    case BFD_RELOC_IA64_LTOFF_DTPREL22:	rtype = R_IA64_LTOFF_DTPREL22; break;
-
-    default:
-      /* xgettext:c-format */
-      _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
-			  abfd, (int) bfd_code);
-      bfd_set_error (bfd_error_bad_value);
-      return NULL;
-    }
-  return ia64_elf_lookup_howto (rtype);
-}
-
-reloc_howto_type *
-ia64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
-			    const char *r_name)
-{
-  unsigned int i;
-
-  for (i = 0;
-       i < sizeof (ia64_howto_table) / sizeof (ia64_howto_table[0]);
-       i++)
-    if (ia64_howto_table[i].name != NULL
-	&& strcasecmp (ia64_howto_table[i].name, r_name) == 0)
-      return &ia64_howto_table[i];
-
-  return NULL;
-}
-
-#define BTYPE_SHIFT	6
-#define Y_SHIFT		26
-#define X6_SHIFT	27
-#define X4_SHIFT	27
-#define X3_SHIFT	33
-#define X2_SHIFT	31
-#define X_SHIFT		33
-#define OPCODE_SHIFT	37
-
-#define OPCODE_BITS	(0xfLL << OPCODE_SHIFT)
-#define X6_BITS		(0x3fLL << X6_SHIFT)
-#define X4_BITS		(0xfLL << X4_SHIFT)
-#define X3_BITS		(0x7LL << X3_SHIFT)
-#define X2_BITS		(0x3LL << X2_SHIFT)
-#define X_BITS		(0x1LL << X_SHIFT)
-#define Y_BITS		(0x1LL << Y_SHIFT)
-#define BTYPE_BITS	(0x7LL << BTYPE_SHIFT)
-#define PREDICATE_BITS	(0x3fLL)
-
-#define IS_NOP_B(i) \
-  (((i) & (OPCODE_BITS | X6_BITS)) == (2LL << OPCODE_SHIFT))
-#define IS_NOP_F(i) \
-  (((i) & (OPCODE_BITS | X_BITS | X6_BITS | Y_BITS)) \
-   == (0x1LL << X6_SHIFT))
-#define IS_NOP_I(i) \
-  (((i) & (OPCODE_BITS | X3_BITS | X6_BITS | Y_BITS)) \
-   == (0x1LL << X6_SHIFT))
-#define IS_NOP_M(i) \
-  (((i) & (OPCODE_BITS | X3_BITS | X2_BITS | X4_BITS | Y_BITS)) \
-   == (0x1LL << X4_SHIFT))
-#define IS_BR_COND(i) \
-  (((i) & (OPCODE_BITS | BTYPE_BITS)) == (0x4LL << OPCODE_SHIFT))
-#define IS_BR_CALL(i) \
-  (((i) & OPCODE_BITS) == (0x5LL << OPCODE_SHIFT))
-
-bool
-ia64_elf_relax_br (bfd_byte *contents, bfd_vma off)
-{
-  unsigned int template_val, mlx;
-  bfd_vma t0, t1, s0, s1, s2, br_code;
-  long br_slot;
-  bfd_byte *hit_addr;
-
-  hit_addr = (bfd_byte *) (contents + off);
-  br_slot = (intptr_t) hit_addr & 0x3;
-  hit_addr -= br_slot;
-  t0 = bfd_getl64 (hit_addr + 0);
-  t1 = bfd_getl64 (hit_addr + 8);
-
-  /* Check if we can turn br into brl.  A label is always at the start
-     of the bundle.  Even if there are predicates on NOPs, we still
-     perform this optimization.  */
-  template_val = t0 & 0x1e;
-  s0 = (t0 >> 5) & 0x1ffffffffffLL;
-  s1 = ((t0 >> 46) | (t1 << 18)) & 0x1ffffffffffLL;
-  s2 = (t1 >> 23) & 0x1ffffffffffLL;
-  switch (br_slot)
-    {
-    case 0:
-      /* Check if slot 1 and slot 2 are NOPs. Possible template is
-	 BBB.  We only need to check nop.b.  */
-      if (!(IS_NOP_B (s1) && IS_NOP_B (s2)))
-	return false;
-      br_code = s0;
-      break;
-    case 1:
-      /* Check if slot 2 is NOP. Possible templates are MBB and BBB.
-	 For BBB, slot 0 also has to be nop.b.  */
-      if (!((template_val == 0x12				/* MBB */
-	     && IS_NOP_B (s2))
-	    || (template_val == 0x16			/* BBB */
-		&& IS_NOP_B (s0)
-		&& IS_NOP_B (s2))))
-	return false;
-      br_code = s1;
-      break;
-    case 2:
-      /* Check if slot 1 is NOP. Possible templates are MIB, MBB, BBB,
-	 MMB and MFB. For BBB, slot 0 also has to be nop.b.  */
-      if (!((template_val == 0x10				/* MIB */
-	     && IS_NOP_I (s1))
-	    || (template_val == 0x12			/* MBB */
-		&& IS_NOP_B (s1))
-	    || (template_val == 0x16			/* BBB */
-		&& IS_NOP_B (s0)
-		&& IS_NOP_B (s1))
-	    || (template_val == 0x18			/* MMB */
-		&& IS_NOP_M (s1))
-	    || (template_val == 0x1c			/* MFB */
-		&& IS_NOP_F (s1))))
-	return false;
-      br_code = s2;
-      break;
-    default:
-      /* It should never happen.  */
-      abort ();
-    }
-
-  /* We can turn br.cond/br.call into brl.cond/brl.call.  */
-  if (!(IS_BR_COND (br_code) || IS_BR_CALL (br_code)))
-    return false;
-
-  /* Turn br into brl by setting bit 40.  */
-  br_code |= 0x1LL << 40;
-
-  /* Turn the old bundle into a MLX bundle with the same stop-bit
-     variety.  */
-  if (t0 & 0x1)
-    mlx = 0x5;
-  else
-    mlx = 0x4;
-
-  if (template_val == 0x16)
-    {
-      /* For BBB, we need to put nop.m in slot 0.  We keep the original
-	 predicate only if slot 0 isn't br.  */
-      if (br_slot == 0)
-	t0 = 0LL;
-      else
-	t0 &= PREDICATE_BITS << 5;
-      t0 |= 0x1LL << (X4_SHIFT + 5);
-    }
-  else
-    {
-      /* Keep the original instruction in slot 0.  */
-      t0 &= 0x1ffffffffffLL << 5;
-    }
-
-  t0 |= mlx;
-
-  /* Put brl in slot 1.  */
-  t1 = br_code << 23;
-
-  bfd_putl64 (t0, hit_addr);
-  bfd_putl64 (t1, hit_addr + 8);
-  return true;
-}
-
-void
-ia64_elf_relax_brl (bfd_byte *contents, bfd_vma off)
-{
-  int template_val;
-  bfd_byte *hit_addr;
-  bfd_vma t0, t1, i0, i1, i2;
-
-  hit_addr = (bfd_byte *) (contents + off);
-  hit_addr -= (intptr_t) hit_addr & 0x3;
-  t0 = bfd_getl64 (hit_addr);
-  t1 = bfd_getl64 (hit_addr + 8);
-
-  /* Keep the instruction in slot 0. */
-  i0 = (t0 >> 5) & 0x1ffffffffffLL;
-  /* Use nop.b for slot 1. */
-  i1 = 0x4000000000LL;
-  /* For slot 2, turn brl into br by masking out bit 40.  */
-  i2 = (t1 >> 23) & 0x0ffffffffffLL;
-
-  /* Turn a MLX bundle into a MBB bundle with the same stop-bit
-     variety.  */
-  if (t0 & 0x1)
-    template_val = 0x13;
-  else
-    template_val = 0x12;
-  t0 = (i1 << 46) | (i0 << 5) | template_val;
-  t1 = (i2 << 23) | (i1 >> 18);
-
-  bfd_putl64 (t0, hit_addr);
-  bfd_putl64 (t1, hit_addr + 8);
-}
-
-void
-ia64_elf_relax_ldxmov (bfd_byte *contents, bfd_vma off)
-{
-  int shift, r1, r3;
-  bfd_vma dword, insn;
-
-  switch ((int)off & 0x3)
-    {
-    case 0: shift =  5; break;
-    case 1: shift = 14; off += 3; break;
-    case 2: shift = 23; off += 6; break;
-    default:
-      abort ();
-    }
-
-  dword = bfd_getl64 (contents + off);
-  insn = (dword >> shift) & 0x1ffffffffffLL;
-
-  r1 = (insn >> 6) & 127;
-  r3 = (insn >> 20) & 127;
-  if (r1 == r3)
-    insn = 0x8000000;				   /* nop */
-  else
-    insn = (insn & 0x7f01fff) | 0x10800000000LL;   /* (qp) mov r1 = r3 */
-
-  dword &= ~(0x1ffffffffffLL << shift);
-  dword |= (insn << shift);
-  bfd_putl64 (dword, contents + off);
-}
-
-bfd_reloc_status_type
-ia64_elf_install_value (bfd_byte *hit_addr, bfd_vma v, unsigned int r_type)
-{
-  const struct ia64_operand *op;
-  int bigendian = 0, shift = 0;
-  bfd_vma t0, t1, dword;
-  ia64_insn insn;
-  enum ia64_opnd opnd;
-  const char *err;
-  size_t size = 8;
-  uint64_t val = v;
-
-  opnd = IA64_OPND_NIL;
-  switch (r_type)
-    {
-    case R_IA64_NONE:
-    case R_IA64_LDXMOV:
-      return bfd_reloc_ok;
-
-      /* Instruction relocations.  */
-
-    case R_IA64_IMM14:
-    case R_IA64_TPREL14:
-    case R_IA64_DTPREL14:
-      opnd = IA64_OPND_IMM14;
-      break;
-
-    case R_IA64_PCREL21F:	opnd = IA64_OPND_TGT25; break;
-    case R_IA64_PCREL21M:	opnd = IA64_OPND_TGT25b; break;
-    case R_IA64_PCREL60B:	opnd = IA64_OPND_TGT64; break;
-    case R_IA64_PCREL21B:
-    case R_IA64_PCREL21BI:
-      opnd = IA64_OPND_TGT25c;
-      break;
-
-    case R_IA64_IMM22:
-    case R_IA64_GPREL22:
-    case R_IA64_LTOFF22:
-    case R_IA64_LTOFF22X:
-    case R_IA64_PLTOFF22:
-    case R_IA64_PCREL22:
-    case R_IA64_LTOFF_FPTR22:
-    case R_IA64_TPREL22:
-    case R_IA64_DTPREL22:
-    case R_IA64_LTOFF_TPREL22:
-    case R_IA64_LTOFF_DTPMOD22:
-    case R_IA64_LTOFF_DTPREL22:
-      opnd = IA64_OPND_IMM22;
-      break;
-
-    case R_IA64_IMM64:
-    case R_IA64_GPREL64I:
-    case R_IA64_LTOFF64I:
-    case R_IA64_PLTOFF64I:
-    case R_IA64_PCREL64I:
-    case R_IA64_FPTR64I:
-    case R_IA64_LTOFF_FPTR64I:
-    case R_IA64_TPREL64I:
-    case R_IA64_DTPREL64I:
-      opnd = IA64_OPND_IMMU64;
-      break;
-
-      /* Data relocations.  */
-
-    case R_IA64_DIR32MSB:
-    case R_IA64_GPREL32MSB:
-    case R_IA64_FPTR32MSB:
-    case R_IA64_PCREL32MSB:
-    case R_IA64_LTOFF_FPTR32MSB:
-    case R_IA64_SEGREL32MSB:
-    case R_IA64_SECREL32MSB:
-    case R_IA64_LTV32MSB:
-    case R_IA64_DTPREL32MSB:
-      size = 4; bigendian = 1;
-      break;
-
-    case R_IA64_DIR32LSB:
-    case R_IA64_GPREL32LSB:
-    case R_IA64_FPTR32LSB:
-    case R_IA64_PCREL32LSB:
-    case R_IA64_LTOFF_FPTR32LSB:
-    case R_IA64_SEGREL32LSB:
-    case R_IA64_SECREL32LSB:
-    case R_IA64_LTV32LSB:
-    case R_IA64_DTPREL32LSB:
-      size = 4; bigendian = 0;
-      break;
-
-    case R_IA64_DIR64MSB:
-    case R_IA64_GPREL64MSB:
-    case R_IA64_PLTOFF64MSB:
-    case R_IA64_FPTR64MSB:
-    case R_IA64_PCREL64MSB:
-    case R_IA64_LTOFF_FPTR64MSB:
-    case R_IA64_SEGREL64MSB:
-    case R_IA64_SECREL64MSB:
-    case R_IA64_LTV64MSB:
-    case R_IA64_TPREL64MSB:
-    case R_IA64_DTPMOD64MSB:
-    case R_IA64_DTPREL64MSB:
-      size = 8; bigendian = 1;
-      break;
-
-    case R_IA64_DIR64LSB:
-    case R_IA64_GPREL64LSB:
-    case R_IA64_PLTOFF64LSB:
-    case R_IA64_FPTR64LSB:
-    case R_IA64_PCREL64LSB:
-    case R_IA64_LTOFF_FPTR64LSB:
-    case R_IA64_SEGREL64LSB:
-    case R_IA64_SECREL64LSB:
-    case R_IA64_LTV64LSB:
-    case R_IA64_TPREL64LSB:
-    case R_IA64_DTPMOD64LSB:
-    case R_IA64_DTPREL64LSB:
-      size = 8; bigendian = 0;
-      break;
-
-      /* Unsupported / Dynamic relocations.  */
-    default:
-      return bfd_reloc_notsupported;
-    }
-
-  switch (opnd)
-    {
-    case IA64_OPND_IMMU64:
-      hit_addr -= (intptr_t) hit_addr & 0x3;
-      t0 = bfd_getl64 (hit_addr);
-      t1 = bfd_getl64 (hit_addr + 8);
-
-      /* tmpl/s: bits  0.. 5 in t0
-	 slot 0: bits  5..45 in t0
-	 slot 1: bits 46..63 in t0, bits 0..22 in t1
-	 slot 2: bits 23..63 in t1 */
-
-      /* First, clear the bits that form the 64 bit constant.  */
-      t0 &= ~(0x3ffffULL << 46);
-      t1 &= ~(0x7fffffLL
-	      | ((  (0x07fLL << 13) | (0x1ffLL << 27)
-		    | (0x01fLL << 22) | (0x001LL << 21)
-		    | (0x001LL << 36)) << 23));
-
-      t0 |= ((val >> 22) & 0x03ffffLL) << 46;		/* 18 lsbs of imm41 */
-      t1 |= ((val >> 40) & 0x7fffffLL) <<  0;		/* 23 msbs of imm41 */
-      t1 |= (  (((val >>  0) & 0x07f) << 13)		/* imm7b */
-	       | (((val >>  7) & 0x1ff) << 27)		/* imm9d */
-	       | (((val >> 16) & 0x01f) << 22)		/* imm5c */
-	       | (((val >> 21) & 0x001) << 21)		/* ic */
-	       | (((val >> 63) & 0x001) << 36)) << 23;	/* i */
-
-      bfd_putl64 (t0, hit_addr);
-      bfd_putl64 (t1, hit_addr + 8);
-      break;
-
-    case IA64_OPND_TGT64:
-      hit_addr -= (intptr_t) hit_addr & 0x3;
-      t0 = bfd_getl64 (hit_addr);
-      t1 = bfd_getl64 (hit_addr + 8);
-
-      /* tmpl/s: bits  0.. 5 in t0
-	 slot 0: bits  5..45 in t0
-	 slot 1: bits 46..63 in t0, bits 0..22 in t1
-	 slot 2: bits 23..63 in t1 */
-
-      /* First, clear the bits that form the 64 bit constant.  */
-      t0 &= ~(0x3ffffULL << 46);
-      t1 &= ~(0x7fffffLL
-	      | ((1LL << 36 | 0xfffffLL << 13) << 23));
-
-      val >>= 4;
-      t0 |= ((val >> 20) & 0xffffLL) << 2 << 46;	/* 16 lsbs of imm39 */
-      t1 |= ((val >> 36) & 0x7fffffLL) << 0;		/* 23 msbs of imm39 */
-      t1 |= ((((val >> 0) & 0xfffffLL) << 13)		/* imm20b */
-	      | (((val >> 59) & 0x1LL) << 36)) << 23;	/* i */
-
-      bfd_putl64 (t0, hit_addr);
-      bfd_putl64 (t1, hit_addr + 8);
-      break;
-
-    default:
-      switch ((intptr_t) hit_addr & 0x3)
-	{
-	case 0: shift =  5; break;
-	case 1: shift = 14; hit_addr += 3; break;
-	case 2: shift = 23; hit_addr += 6; break;
-	case 3: return bfd_reloc_notsupported; /* shouldn't happen...  */
-	}
-      dword = bfd_getl64 (hit_addr);
-      insn = (dword >> shift) & 0x1ffffffffffLL;
-
-      op = elf64_ia64_operands + opnd;
-      err = (*op->insert) (op, val, &insn);
-      if (err)
-	return bfd_reloc_overflow;
-
-      dword &= ~(0x1ffffffffffULL << shift);
-      dword |= (insn << shift);
-      bfd_putl64 (dword, hit_addr);
-      break;
-
-    case IA64_OPND_NIL:
-      /* A data relocation.  */
-      if (bigendian)
-	if (size == 4)
-	  bfd_putb32 (val, hit_addr);
-	else
-	  bfd_putb64 (val, hit_addr);
-      else
-	if (size == 4)
-	  bfd_putl32 (val, hit_addr);
-	else
-	  bfd_putl64 (val, hit_addr);
-      break;
-    }
-
-  return bfd_reloc_ok;
-}
diff --git a/bfd/elfxx-ia64.h b/bfd/elfxx-ia64.h
deleted file mode 100644
index cfede0a1d5d..00000000000
--- a/bfd/elfxx-ia64.h
+++ /dev/null
@@ -1,40 +0,0 @@ 
-/* IA-64 support for 64-bit ELF
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-reloc_howto_type *ia64_elf_reloc_type_lookup (bfd *, bfd_reloc_code_real_type);
-
-reloc_howto_type *ia64_elf_reloc_name_lookup (bfd *, const char *);
-
-reloc_howto_type *ia64_elf_lookup_howto (unsigned int rtype);
-
-bool ia64_elf_relax_br (bfd_byte *contents, bfd_vma off);
-void ia64_elf_relax_brl (bfd_byte *contents, bfd_vma off);
-void ia64_elf_relax_ldxmov (bfd_byte *contents, bfd_vma off);
-
-bfd_reloc_status_type ia64_elf_install_value (bfd_byte *hit_addr, bfd_vma v,
-					      unsigned int r_type);
-
-/* IA64 Itanium code generation.  Called from linker.  */
-extern void bfd_elf32_ia64_after_parse
-  (int);
-
-extern void bfd_elf64_ia64_after_parse
-  (int);
diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h
index f7f5773510b..1eae3c3788f 100644
--- a/bfd/libbfd-in.h
+++ b/bfd/libbfd-in.h
@@ -405,12 +405,8 @@  extern bfd *_bfd_vms_lib_get_imagelib_file
   (bfd *) ATTRIBUTE_HIDDEN;
 extern bfd_cleanup _bfd_vms_lib_alpha_archive_p
   (bfd *) ATTRIBUTE_HIDDEN;
-extern bfd_cleanup _bfd_vms_lib_ia64_archive_p
-  (bfd *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_vms_lib_alpha_mkarchive
   (bfd *) ATTRIBUTE_HIDDEN;
-extern bool _bfd_vms_lib_ia64_mkarchive
-  (bfd *) ATTRIBUTE_HIDDEN;
 
 /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol
    support.  Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols).  */
diff --git a/bfd/libbfd.h b/bfd/libbfd.h
index 5e8ed9eeefe..d2f5f9cd5f2 100644
--- a/bfd/libbfd.h
+++ b/bfd/libbfd.h
@@ -411,12 +411,8 @@  extern bfd *_bfd_vms_lib_get_imagelib_file
   (bfd *) ATTRIBUTE_HIDDEN;
 extern bfd_cleanup _bfd_vms_lib_alpha_archive_p
   (bfd *) ATTRIBUTE_HIDDEN;
-extern bfd_cleanup _bfd_vms_lib_ia64_archive_p
-  (bfd *) ATTRIBUTE_HIDDEN;
 extern bool _bfd_vms_lib_alpha_mkarchive
   (bfd *) ATTRIBUTE_HIDDEN;
-extern bool _bfd_vms_lib_ia64_mkarchive
-  (bfd *) ATTRIBUTE_HIDDEN;
 
 /* Routines to use for BFD_JUMP_TABLE_SYMBOLS where there is no symbol
    support.  Use BFD_JUMP_TABLE_SYMBOLS (_bfd_nosymbols).  */
diff --git a/bfd/makefile.vms b/bfd/makefile.vms
index af793d62902..4637f9ab590 100644
--- a/bfd/makefile.vms
+++ b/bfd/makefile.vms
@@ -22,14 +22,6 @@ 
 # <http://www.gnu.org/licenses/>.
 #
 
-ifeq ($(ARCH),IA64)
-HOSTFILE=alphavms.h
-OBJS:=cpu-ia64.obj,elfxx-ia64.obj,elf64-ia64-vms.obj,\
-  vms-misc.obj,vms-lib.obj,elf-strtab.obj,corefile.obj,stabs.obj,\
-  merge.obj,elf-eh-frame.obj,elflink.obj,elf-attrs.obj,dwarf1.obj,elf64.obj
-DEFS=SELECT_VECS="&ia64_elf64_vms_vec",\
- SELECT_ARCHITECTURES="&bfd_ia64_arch","HAVE_ia64_elf64_vms_vec"=1
-endif
 ifeq ($(ARCH),ALPHA)
 HOSTFILE=alphavms.h
 OBJS:=vms-alpha.obj,vms-lib.obj,vms-misc.obj,cpu-alpha.obj
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index d73c5e6e059..9fb3a0de09f 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -82,8 +82,6 @@ 
    PE/PEI targets are created.  */
 #if defined COFF_WITH_pex64
 # include "coff/x86_64.h"
-#elif defined COFF_WITH_pep
-# include "coff/ia64.h"
 #elif defined COFF_WITH_peAArch64
 # include "coff/aarch64.h"
 #elif defined COFF_WITH_peLoongArch64
diff --git a/bfd/pei-ia64.c b/bfd/pei-ia64.c
deleted file mode 100644
index bfc2152418e..00000000000
--- a/bfd/pei-ia64.c
+++ /dev/null
@@ -1,38 +0,0 @@ 
-/* BFD back-end for HP/Intel IA-64 PE IMAGE COFF files.
-   Copyright (C) 1999-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger <davidm@hpl.hp.com>
-
-   This implementation only supports objcopy to ouput IA-64 PE IMAGE COFF
-   files.
-
-   This file is part of BFD, the Binary File Descriptor library.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "sysdep.h"
-#include "bfd.h"
-
-#define TARGET_SYM ia64_pei_vec
-#define TARGET_NAME "pei-ia64"
-#define COFF_IMAGE_WITH_PE
-#define COFF_WITH_PE
-#define COFF_WITH_pep
-#define PCRELOFFSET true
-#define TARGET_UNDERSCORE '_'
-/* Long section names not allowed in executable images, only object files.  */
-#define COFF_LONG_SECTION_NAMES 0
-
-#include "coff-ia64.c"
diff --git a/bfd/targets.c b/bfd/targets.c
index 0d5d73ba462..da98776f068 100644
--- a/bfd/targets.c
+++ b/bfd/targets.c
@@ -757,13 +757,6 @@  extern const bfd_target i386_pe_vec;
 extern const bfd_target i386_pe_big_vec;
 extern const bfd_target i386_pei_vec;
 extern const bfd_target iamcu_elf32_vec;
-extern const bfd_target ia64_elf32_be_vec;
-extern const bfd_target ia64_elf32_hpux_be_vec;
-extern const bfd_target ia64_elf64_be_vec;
-extern const bfd_target ia64_elf64_le_vec;
-extern const bfd_target ia64_elf64_hpux_be_vec;
-extern const bfd_target ia64_elf64_vms_vec;
-extern const bfd_target ia64_pei_vec;
 extern const bfd_target ip2k_elf32_vec;
 extern const bfd_target iq2000_elf32_vec;
 extern const bfd_target kvx_elf32_vec;
@@ -1113,18 +1106,6 @@  static const bfd_target * const _bfd_target_vector[] =
 	&bpf_elf64_le_vec,
 #endif
 
-#ifdef BFD64
-#if 0
-	&ia64_elf32_be_vec,
-#endif
-	&ia64_elf32_hpux_be_vec,
-	&ia64_elf64_be_vec,
-	&ia64_elf64_le_vec,
-	&ia64_elf64_hpux_be_vec,
-	&ia64_elf64_vms_vec,
-	&ia64_pei_vec,
-#endif
-
 	&ip2k_elf32_vec,
 	&iq2000_elf32_vec,
 
diff --git a/bfd/vms-lib.c b/bfd/vms-lib.c
index c51476ac441..837abe31900 100644
--- a/bfd/vms-lib.c
+++ b/bfd/vms-lib.c
@@ -56,7 +56,6 @@  enum vms_lib_kind
   {
     vms_lib_vax,
     vms_lib_alpha,
-    vms_lib_ia64,
     vms_lib_txt
   };
 
@@ -536,15 +535,6 @@  _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind)
 	  return NULL;
 	}
       break;
-    case vms_lib_ia64:
-      if ((lhd.type != LBR__C_TYP_IOBJ && lhd.type != LBR__C_TYP_ISHSTB)
-	  || majorid != LBR_ELFMAJORID
-	  || lhd.nindex != 2)
-	{
-	  bfd_set_error (bfd_error_wrong_format);
-	  return NULL;
-	}
-      break;
     case vms_lib_txt:
       if ((lhd.type != LBR__C_TYP_TXT
 	   && lhd.type != LBR__C_TYP_MLB
@@ -588,10 +578,8 @@  _bfd_vms_lib_archive_p (bfd *abfd, enum vms_lib_kind kind)
 	goto err;
       /* Only IA64 archives may have more entries in the index that what
 	 was declared.  */
-      if (nbr_ent != tdata->artdata.symdef_count
-	  && kind != vms_lib_ia64)
+      if (nbr_ent != tdata->artdata.symdef_count)
 	goto err;
-      tdata->artdata.symdef_count = nbr_ent;
     }
   tdata->cache = bfd_zalloc (abfd, sizeof (bfd *) * tdata->nbr_modules);
   if (tdata->cache == NULL)
@@ -714,14 +702,6 @@  _bfd_vms_lib_alpha_archive_p (bfd *abfd)
   return _bfd_vms_lib_archive_p (abfd, vms_lib_alpha);
 }
 
-/* Standard function for ia64 libraries.  */
-
-bfd_cleanup
-_bfd_vms_lib_ia64_archive_p (bfd *abfd)
-{
-  return _bfd_vms_lib_archive_p (abfd, vms_lib_ia64);
-}
-
 /* Standard function for text libraries.  */
 
 static bfd_cleanup
@@ -752,11 +732,6 @@  _bfd_vms_lib_mkarchive (bfd *abfd, enum vms_lib_kind kind)
       tdata->mhd_size = offsetof (struct vms_mhd, pad1);
       tdata->type = LBR__C_TYP_EOBJ;
       break;
-    case vms_lib_ia64:
-      tdata->ver = LBR_ELFMAJORID;
-      tdata->mhd_size = sizeof (struct vms_mhd);
-      tdata->type = LBR__C_TYP_IOBJ;
-      break;
     default:
       abort ();
     }
@@ -776,12 +751,6 @@  _bfd_vms_lib_alpha_mkarchive (bfd *abfd)
   return _bfd_vms_lib_mkarchive (abfd, vms_lib_alpha);
 }
 
-bool
-_bfd_vms_lib_ia64_mkarchive (bfd *abfd)
-{
-  return _bfd_vms_lib_mkarchive (abfd, vms_lib_ia64);
-}
-
 /* Find NAME in the symbol index.  Return the index.  */
 
 symindex
@@ -1666,7 +1635,6 @@  get_idxlen (struct lib_index *idx, bool is_elfidx)
    VBN is the first vbn to be used, and will contain on return the last vbn.
    Can be called with ABFD set to NULL just to size the index.
    If not null, TOPVBN will be assigned to the vbn of the root index tree.
-   IS_ELFIDX is true for elfidx (ie ia64) indexes layout.
    Return TRUE on success.  */
 
 static bool
@@ -2135,7 +2103,7 @@  _bfd_vms_lib_write_archive_contents (bfd *arch)
   unsigned int vbn;
   unsigned int mod_idx_vbn;
   unsigned int sym_idx_vbn;
-  bool is_elfidx = tdata->kind == vms_lib_ia64;
+  bool is_elfidx = false;
   unsigned int max_keylen = is_elfidx ? MAX_EKEYLEN : MAX_KEYLEN;
 
   /* Count the number of modules (and do a first sanity check).  */
@@ -2340,9 +2308,6 @@  _bfd_vms_lib_write_archive_contents (bfd *arch)
       case vms_lib_alpha:
 	saneid = LHD_SANEID3;
 	break;
-      case vms_lib_ia64:
-	saneid = LHD_SANEID6;
-	break;
       default:
 	abort ();
       }
diff --git a/binutils/MAINTAINERS b/binutils/MAINTAINERS
index dabb331c0d5..4ffa5443c68 100644
--- a/binutils/MAINTAINERS
+++ b/binutils/MAINTAINERS
@@ -93,7 +93,6 @@  responsibility among the other maintainers.
   H8300		   Prafulla Thakare <prafulla.thakare@kpitcummins.com>
   HPPA		   Dave Anglin <dave.anglin@bell.net>
   HPPA elf64	   Jeff Law <law@redhat.com> [Basic maintainance only]
-  IA-64		   Jim Wilson <wilson@tuliptree.org>
   IQ2000	   Stan Cox <scox@redhat.com>
   ix86		   H.J. Lu <hjl.tools@gmail.com>
   ix86 COFF	   DJ Delorie <dj@redhat.com>
diff --git a/binutils/Makefile.am b/binutils/Makefile.am
index ad571b60546..36b87af6b54 100644
--- a/binutils/Makefile.am
+++ b/binutils/Makefile.am
@@ -126,8 +126,7 @@  AM_CPPFLAGS = -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) \
 HFILES = \
 	arsup.h binemul.h bucomm.h budbg.h \
 	coffgrok.h debug.h demanguse.h dlltool.h dwarf.h elfcomm.h \
-	objdump.h sysdep.h unwind-ia64.h windres.h winduni.h windint.h \
-	windmc.h
+	objdump.h sysdep.h windres.h winduni.h windint.h windmc.h
 
 GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h rcparse.h mcparse.h
 BUILT_SOURCES = $(GENERATED_HFILES)
@@ -144,7 +143,7 @@  CFILES = \
 	rclex.c rdcoff.c rddbg.c readelf.c rename.c \
 	resbin.c rescoff.c resrc.c resres.c \
 	size.c srconv.c stabs.c strings.c sysdump.c \
-	syslex_wrap.c unwind-ia64.c elfedit.c version.c \
+	syslex_wrap.c elfedit.c version.c \
 	windres.c winduni.c wrstabs.c \
 	windmc.c mclex.c
 
@@ -259,7 +258,7 @@  objcopy_SOURCES = objcopy.c not-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS)
 
 strings_SOURCES = strings.c $(BULIBS)
 
-readelf_SOURCES = readelf.c version.c unwind-ia64.c dwarf.c demanguse.c $(ELFLIBS)
+readelf_SOURCES = readelf.c version.c dwarf.c demanguse.c $(ELFLIBS)
 readelf_LDADD   = $(LIBCTF_NOBFD) $(LIBINTL) $(LIBIBERTY) $(ZLIB) $(ZSTD_LIBS) $(DEBUGINFOD_LIBS) $(MSGPACK_LIBS) $(LIBSFRAME)
 
 elfedit_SOURCES = elfedit.c version.c $(ELFLIBS)
diff --git a/binutils/Makefile.in b/binutils/Makefile.in
index 67fa5b3b8d9..074e2d57e87 100644
--- a/binutils/Makefile.in
+++ b/binutils/Makefile.in
@@ -254,7 +254,7 @@  am_ranlib_OBJECTS = ar.$(OBJEXT) is-ranlib.$(OBJEXT) arparse.$(OBJEXT) \
 	binemul.$(OBJEXT) emul_$(EMULATION).$(OBJEXT) $(am__objects_1)
 ranlib_OBJECTS = $(am_ranlib_OBJECTS)
 am_readelf_OBJECTS = readelf.$(OBJEXT) version.$(OBJEXT) \
-	unwind-ia64.$(OBJEXT) dwarf.$(OBJEXT) demanguse.$(OBJEXT) \
+	dwarf.$(OBJEXT) demanguse.$(OBJEXT) \
 	$(am__objects_2)
 readelf_OBJECTS = $(am_readelf_OBJECTS)
 @ENABLE_LIBCTF_TRUE@am__DEPENDENCIES_3 = ../libctf/libctf-nobfd.la
@@ -707,8 +707,7 @@  AM_CPPFLAGS = -I. -I$(srcdir) -I../bfd -I$(BFDDIR) -I$(INCDIR) \
 HFILES = \
 	arsup.h binemul.h bucomm.h budbg.h \
 	coffgrok.h debug.h demanguse.h dlltool.h dwarf.h elfcomm.h \
-	objdump.h sysdep.h unwind-ia64.h windres.h winduni.h windint.h \
-	windmc.h
+	objdump.h sysdep.h windres.h winduni.h windint.h windmc.h
 
 GENERATED_HFILES = arparse.h sysroff.h sysinfo.h defparse.h rcparse.h mcparse.h
 BUILT_SOURCES = $(GENERATED_HFILES)
@@ -724,7 +723,7 @@  CFILES = \
 	rclex.c rdcoff.c rddbg.c readelf.c rename.c \
 	resbin.c rescoff.c resrc.c resres.c \
 	size.c srconv.c stabs.c strings.c sysdump.c \
-	syslex_wrap.c unwind-ia64.c elfedit.c version.c \
+	syslex_wrap.c elfedit.c version.c \
 	windres.c winduni.c wrstabs.c \
 	windmc.c mclex.c
 
@@ -795,7 +794,7 @@  LDADD = $(BFDLIB) $(LIBIBERTY) $(LIBINTL)
 size_SOURCES = size.c $(BULIBS)
 objcopy_SOURCES = objcopy.c not-strip.c rename.c $(WRITE_DEBUG_SRCS) $(BULIBS)
 strings_SOURCES = strings.c $(BULIBS)
-readelf_SOURCES = readelf.c version.c unwind-ia64.c dwarf.c demanguse.c $(ELFLIBS)
+readelf_SOURCES = readelf.c version.c dwarf.c demanguse.c $(ELFLIBS)
 readelf_LDADD = $(LIBCTF_NOBFD) $(LIBINTL) $(LIBIBERTY) $(ZLIB) $(ZSTD_LIBS) $(DEBUGINFOD_LIBS) $(MSGPACK_LIBS) $(LIBSFRAME)
 elfedit_SOURCES = elfedit.c version.c $(ELFLIBS)
 elfedit_LDADD = $(LIBINTL) $(LIBIBERTY)
@@ -1205,7 +1204,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strings.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sysdump.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/syslex_wrap.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/unwind-ia64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/version.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windmc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/windres.Po@am__quote@
diff --git a/binutils/NEWS b/binutils/NEWS
index 5c31953575a..3b5c4631d8c 100644
--- a/binutils/NEWS
+++ b/binutils/NEWS
@@ -1,5 +1,7 @@ 
 -*- text -*-
 
+* Remove Itanium (IA-64) architecture.
+
 * Readelf now displays RELR relocations in full detail.
 
 * Readelf now has a -j/--display-section option which takes the name or index
diff --git a/binutils/configure b/binutils/configure
index 5d87b6b3e66..bf9e62193c5 100755
--- a/binutils/configure
+++ b/binutils/configure
@@ -5968,10 +5968,6 @@  haiku*)
 hpux10.20* | hpux11*)
   lt_cv_file_magic_cmd=/usr/bin/file
   case $host_cpu in
-  ia64*)
-    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'
-    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so
-    ;;
   hppa*64*)
     lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\.[0-9]'
     lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl
@@ -6530,11 +6526,6 @@  aix*)
 cygwin* | mingw* | pw32* | cegcc*)
   symcode='[ABCDGISTW]'
   ;;
-hpux*)
-  if test "$host_cpu" = ia64; then
-    symcode='[ABCDEGRST]'
-  fi
-  ;;
 irix* | nonstopux*)
   symcode='[BCDEGRST]'
   ;;
@@ -6565,7 +6556,7 @@  case `$NM -V 2>&1` in
 esac
 
 # Transform an extracted symbol line into a proper C declaration.
-# Some systems (esp. on ia64) link data and code symbols differently,
+# Some systems link data and code symbols differently,
 # so use this general approach.
 lt_cv_sys_global_symbol_to_cdecl="sed -n -e 's/^T .* \(.*\)$/extern int \1();/p' -e 's/^$symcode* .* \(.*\)$/extern char \1;/p'"
 
@@ -6765,25 +6756,6 @@  test "x$enable_libtool_lock" != xno && enable_libtool_lock=yes
 # Some flags need to be propagated to the compiler or linker for good
 # libtool support.
 case $host in
-ia64-*-hpux*)
-  # Find out which ABI we are using.
-  echo 'int i;' > conftest.$ac_ext
-  if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
-  (eval $ac_compile) 2>&5
-  ac_status=$?
-  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
-  test $ac_status = 0; }; then
-    case `/usr/bin/file conftest.$ac_objext` in
-      *ELF-32*)
-	HPUX_IA64_MODE="32"
-	;;
-      *ELF-64*)
-	HPUX_IA64_MODE="64"
-	;;
-    esac
-  fi
-  rm -rf conftest*
-  ;;
 *-*-irix6*)
   # Find out which ABI we are using.
   echo '#line '$LINENO' "configure"' > conftest.$ac_ext
@@ -8118,10 +8090,6 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
     case $host_os in
       aix*)
       # All AIX code is PIC.
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      fi
       lt_prog_compiler_pic='-fPIC'
       ;;
 
@@ -8218,12 +8186,7 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
     case $host_os in
     aix*)
       lt_prog_compiler_wl='-Wl,'
-      if test "$host_cpu" = ia64; then
-	# AIX 5 now supports IA64 processor
-	lt_prog_compiler_static='-Bstatic'
-      else
-	lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
-      fi
+      lt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'
       ;;
 
     mingw* | cygwin* | pw32* | os2* | cegcc*)
@@ -8237,7 +8200,7 @@  $as_echo_n "checking for $compiler option to produce PIC... " >&6; }
       # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but
       # not for PA HP-UX.
       case $host_cpu in
-      hppa*64*|ia64*)
+      hppa*64*)
 	# +Z the default
 	;;
       *)
@@ -8762,7 +8725,6 @@  $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
     case $host_os in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
 	ld_shlibs=no
 	cat <<_LT_EOF 1>&2
 
@@ -8774,7 +8736,6 @@  $as_echo_n "checking whether the $compiler linker ($LD) supports shared librarie
 *** You will then need to restart the configuration process.
 
 _LT_EOF
-      fi
       ;;
 
     amigaos*)
@@ -8870,10 +8831,6 @@  _LT_EOF
 					# Portland Group f77 and f90 compilers
 	  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\"\"; do test  -n \"$conv\" && new_convenience=\"$new_convenience,$conv\"; done; func_echo_all \"$new_convenience\"` ${wl}--no-whole-archive'
 	  tmp_addflag=' $pic_flag -Mnomain' ;;
-	ecc*,ia64* | icc*,ia64*)	# Intel C compiler on ia64
-	  tmp_addflag=' -i_dynamic' ;;
-	efc*,ia64* | ifort*,ia64*)	# Intel Fortran compiler on ia64
-	  tmp_addflag=' -i_dynamic -nofor_main' ;;
 	ifc* | ifort*)			# Intel Fortran compiler
 	  tmp_addflag=' -nofor_main' ;;
 	lf95*)				# Lahey Fortran 8.1
@@ -9027,13 +8984,6 @@  _LT_EOF
       ;;
 
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-	# On IA64, the linker does run time linking by default, so we don't
-	# have to do anything special.
-	aix_use_runtimelinking=no
-	exp_sym_flag='-Bexport'
-	no_entry_flag=""
-      else
 	# If we're using GNU nm, then we don't want the "-C" option.
 	# -C means demangle to AIX nm, but means don't demangle with GNU nm
 	# Also, AIX nm treats weak defined symbols like other global
@@ -9060,7 +9010,6 @@  _LT_EOF
 
 	exp_sym_flag='-bexport'
 	no_entry_flag='-bnoentry'
-      fi
 
       # When large executables or shared objects are built, AIX ld can
       # have problems creating the table of contents.  If linking a library
@@ -9103,17 +9052,11 @@  _LT_EOF
 	fi
       else
 	# not using gcc
-	if test "$host_cpu" = ia64; then
-	# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release
-	# chokes on -Wl,-G. The following line is correct:
-	  shared_flag='-G'
-	else
 	  if test "$aix_use_runtimelinking" = yes; then
 	    shared_flag='${wl}-G'
 	  else
 	    shared_flag='${wl}-bM:SRE'
 	  fi
-	fi
       fi
 
       export_dynamic_flag_spec='${wl}-bexpall'
@@ -9159,11 +9102,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
         hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
         archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags `if test "x${allow_undefined_flag}" != "x"; then func_echo_all "${wl}${allow_undefined_flag}"; else :; fi` '"\${wl}$exp_sym_flag:\$export_symbols $shared_flag"
       else
-	if test "$host_cpu" = ia64; then
-	  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-	  allow_undefined_flag="-z nodefs"
-	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs '"\${wl}$no_entry_flag"' $compiler_flags ${wl}${allow_undefined_flag} '"\${wl}$exp_sym_flag:\$export_symbols"
-	else
 	 # Determine the default libpath from the value encoded in an
 	 # empty executable.
 	 cat confdefs.h - <<_ACEOF >conftest.$ac_ext
@@ -9211,7 +9149,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	  archive_cmds_need_lc=yes
 	  # This is similar to how AIX traditionally builds its shared libraries.
 	  archive_expsym_cmds="\$CC $shared_flag"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'
-	fi
       fi
       ;;
 
@@ -9360,9 +9297,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	hppa*64*)
 	  archive_cmds='$CC -shared ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
-	ia64*)
-	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
 	*)
 	  archive_cmds='$CC -shared -fPIC ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
@@ -9372,9 +9306,6 @@  if test -z "$aix_libpath"; then aix_libpath="/usr/lib:/lib"; fi
 	hppa*64*)
 	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
 	  ;;
-	ia64*)
-	  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'
-	  ;;
 	*)
 
 	  # Older versions of the 11.00 compiler do not understand -b yet
@@ -9424,7 +9355,7 @@  fi
 	hardcode_libdir_separator=:
 
 	case $host_cpu in
-	hppa*64*|ia64*)
+	hppa*64*)
 	  hardcode_direct=no
 	  hardcode_shlibpath_var=no
 	  ;;
@@ -10061,11 +9992,6 @@  aix[4-9]*)
   need_lib_prefix=no
   need_version=no
   hardcode_into_libs=yes
-  if test "$host_cpu" = ia64; then
-    # AIX 5 supports IA64
-    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'
-    shlibpath_var=LD_LIBRARY_PATH
-  else
     # With GCC up to 2.95.x, collect2 would create an import file
     # for dependence libraries.  The import file would start with
     # the line `#! .'.  This would cause the generated library to
@@ -10097,7 +10023,6 @@  aix[4-9]*)
       soname_spec='${libname}${release}${shared_ext}$major'
     fi
     shlibpath_var=LIBPATH
-  fi
   ;;
 
 amigaos*)
@@ -10274,21 +10199,6 @@  hpux9* | hpux10* | hpux11*)
   need_lib_prefix=no
   need_version=no
   case $host_cpu in
-  ia64*)
-    shrext_cmds='.so'
-    hardcode_into_libs=yes
-    dynamic_linker="$host_os dld.so"
-    shlibpath_var=LD_LIBRARY_PATH
-    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.
-    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'
-    soname_spec='${libname}${release}${shared_ext}$major'
-    if test "X$HPUX_IA64_MODE" = X32; then
-      sys_lib_search_path_spec="/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib"
-    else
-      sys_lib_search_path_spec="/usr/lib/hpux64 /usr/local/lib/hpux64"
-    fi
-    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec
-    ;;
   hppa*64*)
     shrext_cmds='.sl'
     hardcode_into_libs=yes
@@ -11379,7 +11289,7 @@  $as_echo_n "checking whether to build shared libraries... " >&6; }
     ;;
 
   aix[4-9]*)
-    if test "$host_cpu" != ia64 && test "$aix_use_runtimelinking" = no ; then
+    if test "$aix_use_runtimelinking" = no ; then
       test "$enable_shared" = yes && enable_static=no
     fi
     ;;
diff --git a/binutils/configure.com b/binutils/configure.com
index 41145101e04..3b467156a66 100644
--- a/binutils/configure.com
+++ b/binutils/configure.com
@@ -82,7 +82,6 @@  $ create config.h
 $!
 $! Add TARGET.
 $!
-$ if arch .eqs. "ia64" then target = "elf64-ia64-vms"
 $ if arch .eqs. "alpha" then target = "vms-alpha"
 $ if arch .eqs. "vax" then target = "vms-vax"
 $!
diff --git a/binutils/makefile.vms b/binutils/makefile.vms
index 0f2cca59f6c..14b00863289 100644
--- a/binutils/makefile.vms
+++ b/binutils/makefile.vms
@@ -54,7 +54,7 @@  ADDR2LINEOBJS = $(ADDL_DEPS),addr2line.obj
 
 OBJDUMPOBJS = objdump.obj,prdbg.obj,$(DEBUG_OBJS),$(ADDL_DEPS),$(OPCODES_DEP)
 
-READELFOBJS = readelf.obj,dwarf.obj,unwind-ia64.obj,$(ADDL_DEPS)
+READELFOBJS = readelf.obj,dwarf.obj,$(ADDL_DEPS)
 
 all: config.h size.exe strings.exe objdump.exe nm.exe addr2line.exe
 
@@ -74,7 +74,7 @@  objdump.exe: $(OBJDUMPOBJS)
 	link/exe=$@ objdump.obj,prdbg.obj,$(DEBUG_OBJS),$(ADDL_LIBS),$(OPCODES)
 
 readelf.exe: $(READELFOBJS)
-	link/exe=$@ readelf.obj,dwarf.obj,unwind-ia64.obj,$(ADDL_LIBS)
+	link/exe=$@ readelf.obj,dwarf.obj,$(ADDL_LIBS)
 
 config.h:
 	$$ @configure
diff --git a/binutils/readelf.c b/binutils/readelf.c
index f8305b4715b..f98a7717e3c 100644
--- a/binutils/readelf.c
+++ b/binutils/readelf.c
@@ -119,7 +119,6 @@ 
 #include "elf/i370.h"
 #include "elf/i860.h"
 #include "elf/i960.h"
-#include "elf/ia64.h"
 #include "elf/ip2k.h"
 #include "elf/kvx.h"
 #include "elf/lm32.h"
@@ -961,17 +960,6 @@  printable_section_name (Filedata * filedata, const Elf_Internal_Shdr * sec)
   return buf_start;
 }
 
-/* Return TRUE if the current file is for IA-64 machine and OpenVMS ABI.
-   This OS has so many departures from the ELF standard that we test it at
-   many places.  */
-
-static inline bool
-is_ia64_vms (Filedata * filedata)
-{
-  return filedata->file_header.e_machine == EM_IA_64
-    && filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS;
-}
-
 static const char *
 printable_section_name_from_index (Filedata *  filedata,
 				   size_t      ndx,
@@ -1011,15 +999,6 @@  printable_section_name_from_index (Filedata *  filedata,
 	    return "LARGE_COM";
 	  break;
 
-	case EM_IA_64:
-	  if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_HPUX
-	      && ndx == SHN_IA_64_ANSI_COMMON)
-	    return "ANSI_COM";
-
-	  if (is_ia64_vms (filedata) && ndx == SHN_IA_64_VMS_SYMVEC)
-	    return "VMS_SYMVEC";
-	  break;
-
 	default:
 	  break;
 	}
@@ -1216,7 +1195,6 @@  guess_is_rela (unsigned int e_machine)
     case EM_H8S:
     case EM_H8_300:
     case EM_H8_300H:
-    case EM_IA_64:
     case EM_IP2K:
     case EM_IP2K_OLD:
     case EM_IQ2000:
@@ -2088,9 +2066,6 @@  dump_relocations (Filedata *          filedata,
 	case EM_PJ_OLD:
 	  rtype = elf_pj_reloc_type (type);
 	  break;
-	case EM_IA_64:
-	  rtype = elf_ia64_reloc_type (type);
-	  break;
 
 	case EM_KVX:
 	  rtype = elf_kvx_reloc_type (type);
@@ -2574,47 +2549,6 @@  get_parisc_dynamic_type (unsigned long type)
     }
 }
 
-static const char *
-get_ia64_dynamic_type (unsigned long type)
-{
-  switch (type)
-    {
-    case DT_IA_64_PLT_RESERVE:         return "IA_64_PLT_RESERVE";
-    case DT_IA_64_VMS_SUBTYPE:         return "VMS_SUBTYPE";
-    case DT_IA_64_VMS_IMGIOCNT:        return "VMS_IMGIOCNT";
-    case DT_IA_64_VMS_LNKFLAGS:        return "VMS_LNKFLAGS";
-    case DT_IA_64_VMS_VIR_MEM_BLK_SIZ: return "VMS_VIR_MEM_BLK_SIZ";
-    case DT_IA_64_VMS_IDENT:           return "VMS_IDENT";
-    case DT_IA_64_VMS_NEEDED_IDENT:    return "VMS_NEEDED_IDENT";
-    case DT_IA_64_VMS_IMG_RELA_CNT:    return "VMS_IMG_RELA_CNT";
-    case DT_IA_64_VMS_SEG_RELA_CNT:    return "VMS_SEG_RELA_CNT";
-    case DT_IA_64_VMS_FIXUP_RELA_CNT:  return "VMS_FIXUP_RELA_CNT";
-    case DT_IA_64_VMS_FIXUP_NEEDED:    return "VMS_FIXUP_NEEDED";
-    case DT_IA_64_VMS_SYMVEC_CNT:      return "VMS_SYMVEC_CNT";
-    case DT_IA_64_VMS_XLATED:          return "VMS_XLATED";
-    case DT_IA_64_VMS_STACKSIZE:       return "VMS_STACKSIZE";
-    case DT_IA_64_VMS_UNWINDSZ:        return "VMS_UNWINDSZ";
-    case DT_IA_64_VMS_UNWIND_CODSEG:   return "VMS_UNWIND_CODSEG";
-    case DT_IA_64_VMS_UNWIND_INFOSEG:  return "VMS_UNWIND_INFOSEG";
-    case DT_IA_64_VMS_LINKTIME:        return "VMS_LINKTIME";
-    case DT_IA_64_VMS_SEG_NO:          return "VMS_SEG_NO";
-    case DT_IA_64_VMS_SYMVEC_OFFSET:   return "VMS_SYMVEC_OFFSET";
-    case DT_IA_64_VMS_SYMVEC_SEG:      return "VMS_SYMVEC_SEG";
-    case DT_IA_64_VMS_UNWIND_OFFSET:   return "VMS_UNWIND_OFFSET";
-    case DT_IA_64_VMS_UNWIND_SEG:      return "VMS_UNWIND_SEG";
-    case DT_IA_64_VMS_STRTAB_OFFSET:   return "VMS_STRTAB_OFFSET";
-    case DT_IA_64_VMS_SYSVER_OFFSET:   return "VMS_SYSVER_OFFSET";
-    case DT_IA_64_VMS_IMG_RELA_OFF:    return "VMS_IMG_RELA_OFF";
-    case DT_IA_64_VMS_SEG_RELA_OFF:    return "VMS_SEG_RELA_OFF";
-    case DT_IA_64_VMS_FIXUP_RELA_OFF:  return "VMS_FIXUP_RELA_OFF";
-    case DT_IA_64_VMS_PLTGOT_OFFSET:   return "VMS_PLTGOT_OFFSET";
-    case DT_IA_64_VMS_PLTGOT_SEG:      return "VMS_PLTGOT_SEG";
-    case DT_IA_64_VMS_FPMODE:          return "VMS_FPMODE";
-    default:
-      return NULL;
-    }
-}
-
 static const char *
 get_solaris_section_type (unsigned long type)
 {
@@ -2867,9 +2801,6 @@  get_dynamic_type (Filedata * filedata, unsigned long type)
 	    case EM_PPC64:
 	      result = get_ppc64_dynamic_type (type);
 	      break;
-	    case EM_IA_64:
-	      result = get_ia64_dynamic_type (type);
-	      break;
 	    case EM_ALPHA:
 	      result = get_alpha_dynamic_type (type);
 	      break;
@@ -2912,9 +2843,6 @@  get_dynamic_type (Filedata * filedata, unsigned long type)
 	    case EM_PARISC:
 	      result = get_parisc_dynamic_type (type);
 	      break;
-	    case EM_IA_64:
-	      result = get_ia64_dynamic_type (type);
-	      break;
 	    default:
 	      if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
 		result = get_solaris_dynamic_type (type);
@@ -3100,7 +3028,6 @@  get_machine_name (unsigned e_machine)
     case EM_H8S:		return "Renesas H8S";
     case EM_H8_500:		return "Renesas H8/500";
       /* 50 */
-    case EM_IA_64:		return "Intel IA-64";
     case EM_MIPS_X:		return "Stanford MIPS-X";
     case EM_COLDFIRE:		return "Motorola Coldfire";
     case EM_68HC12:		return "Motorola MC68HC12 Microcontroller";
@@ -3729,47 +3656,6 @@  decode_FRV_machine_flags (char *out, unsigned e_flags)
   return out;
 }
 
-static char *
-decode_IA64_machine_flags (char *out, unsigned e_flags, Filedata *filedata)
-{
-  if ((e_flags & EF_IA_64_ABI64))
-    out = stpcpy (out, ", 64-bit");
-  else
-    out = stpcpy (out, ", 32-bit");
-  if ((e_flags & EF_IA_64_REDUCEDFP))
-    out = stpcpy (out, ", reduced fp model");
-  if ((e_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
-    out = stpcpy (out, ", no function descriptors, constant gp");
-  else if ((e_flags & EF_IA_64_CONS_GP))
-    out = stpcpy (out, ", constant gp");
-  if ((e_flags & EF_IA_64_ABSOLUTE))
-    out = stpcpy (out, ", absolute");
-  if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
-    {
-      if ((e_flags & EF_IA_64_VMS_LINKAGES))
-	out = stpcpy (out, ", vms_linkages");
-      switch ((e_flags & EF_IA_64_VMS_COMCOD))
-	{
-	case EF_IA_64_VMS_COMCOD_SUCCESS:
-	  break;
-	case EF_IA_64_VMS_COMCOD_WARNING:
-	  out = stpcpy (out, ", warning");
-	  break;
-	case EF_IA_64_VMS_COMCOD_ERROR:
-	  out = stpcpy (out, ", error");
-	  break;
-	case EF_IA_64_VMS_COMCOD_ABORT:
-	  out = stpcpy (out, ", abort");
-	  break;
-	default:
-	  warn (_("Unrecognised IA64 VMS Command Code: %x\n"),
-		e_flags & EF_IA_64_VMS_COMCOD);
-	  out = stpcpy (out, ", <unknown>");
-	}
-    }
-  return out;
-}
-
 static char *
 decode_LOONGARCH_machine_flags (char *out, unsigned int e_flags)
 {
@@ -5011,10 +4897,6 @@  get_machine_flags (Filedata * filedata, unsigned e_flags, unsigned e_machine)
 	    out = stpcpy (out, ", gnu calling convention");
 	  break;
 
-	case EM_IA_64:
-	  out = decode_IA64_machine_flags (out, e_flags, filedata);
-	  break;
-
 	case EM_VAX:
 	  if ((e_flags & EF_VAX_NONPIC))
 	    out = stpcpy (out, ", non-PIC");
@@ -5213,17 +5095,6 @@  get_parisc_segment_type (unsigned long type)
     }
 }
 
-static const char *
-get_ia64_segment_type (unsigned long type)
-{
-  switch (type)
-    {
-    case PT_IA_64_ARCHEXT:	return "IA_64_ARCHEXT";
-    case PT_IA_64_UNWIND:	return "IA_64_UNWIND";
-    default:                    return NULL;
-    }
-}
-
 static const char *
 get_tic6x_segment_type (unsigned long type)
 {
@@ -5269,16 +5140,6 @@  get_hpux_segment_type (unsigned long type, unsigned e_machine)
       default:			return NULL;
       }
 
-  if (e_machine == EM_IA_64)
-    switch (type)
-      {
-      case PT_HP_TLS:		 return "HP_TLS";
-      case PT_IA_64_HP_OPT_ANOT: return "HP_OPT_ANNOT";
-      case PT_IA_64_HP_HSL_ANOT: return "HP_HSL_ANNOT";
-      case PT_IA_64_HP_STACK:	 return "HP_STACK";
-      default:			 return NULL;
-      }
-
   return NULL;
 }
 
@@ -5347,9 +5208,6 @@  get_segment_type (Filedata * filedata, unsigned long p_type)
 	    case EM_PARISC:
 	      result = get_parisc_segment_type (p_type);
 	      break;
-	    case EM_IA_64:
-	      result = get_ia64_segment_type (p_type);
-	      break;
 	    case EM_TI_C6000:
 	      result = get_tic6x_segment_type (p_type);
 	      break;
@@ -5486,31 +5344,6 @@  get_parisc_section_type_name (unsigned int sh_type)
     }
 }
 
-static const char *
-get_ia64_section_type_name (Filedata * filedata, unsigned int sh_type)
-{
-  /* If the top 8 bits are 0x78 the next 8 are the os/abi ID.  */
-  if ((sh_type & 0xFF000000) == SHT_IA_64_LOPSREG)
-    return get_osabi_name (filedata, (sh_type & 0x00FF0000) >> 16);
-
-  switch (sh_type)
-    {
-    case SHT_IA_64_EXT:		       return "IA_64_EXT";
-    case SHT_IA_64_UNWIND:	       return "IA_64_UNWIND";
-    case SHT_IA_64_PRIORITY_INIT:      return "IA_64_PRIORITY_INIT";
-    case SHT_IA_64_VMS_TRACE:          return "VMS_TRACE";
-    case SHT_IA_64_VMS_TIE_SIGNATURES: return "VMS_TIE_SIGNATURES";
-    case SHT_IA_64_VMS_DEBUG:          return "VMS_DEBUG";
-    case SHT_IA_64_VMS_DEBUG_STR:      return "VMS_DEBUG_STR";
-    case SHT_IA_64_VMS_LINKAGES:       return "VMS_LINKAGES";
-    case SHT_IA_64_VMS_SYMBOL_VECTOR:  return "VMS_SYMBOL_VECTOR";
-    case SHT_IA_64_VMS_FIXUP:          return "VMS_FIXUP";
-    default:
-      break;
-    }
-  return NULL;
-}
-
 static const char *
 get_x86_64_section_type_name (unsigned int sh_type)
 {
@@ -5681,9 +5514,6 @@  get_section_type_name (Filedata * filedata, unsigned int sh_type)
 	    case EM_PARISC:
 	      result = get_parisc_section_type_name (sh_type);
 	      break;
-	    case EM_IA_64:
-	      result = get_ia64_section_type_name (filedata, sh_type);
-	      break;
 	    case EM_X86_64:
 	    case EM_L1OM:
 	    case EM_K1OM:
@@ -5729,9 +5559,6 @@  get_section_type_name (Filedata * filedata, unsigned int sh_type)
 	{
 	  switch (filedata->file_header.e_machine)
 	    {
-	    case EM_IA_64:
-	      result = get_ia64_section_type_name (filedata, sh_type);
-	      break;
 	    default:
 	      if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_SOLARIS)
 		result = get_solaris_section_type (sh_type);
@@ -6983,10 +6810,8 @@  process_program_headers (Filedata * filedata)
 	      sec = find_section (filedata, ".dynamic");
 	      if (sec == NULL || sec->sh_size == 0)
 		{
-		  /* A corresponding .dynamic section is expected, but on
-		     IA-64/OpenVMS it is OK for it to be missing.  */
-		  if (!is_ia64_vms (filedata))
-		    error (_("no .dynamic section in the dynamic segment\n"));
+		  /* A corresponding .dynamic section is expected.  */
+		  error (_("no .dynamic section in the dynamic segment\n"));
 		  break;
 		}
 
@@ -7606,24 +7431,6 @@  get_elf_section_flags (Filedata * filedata, uint64_t sh_flags)
 	      sindex = -1;
 	      switch (filedata->file_header.e_machine)
 		{
-		case EM_IA_64:
-		  if (flag == SHF_IA_64_SHORT)
-		    sindex = 10;
-		  else if (flag == SHF_IA_64_NORECOV)
-		    sindex = 11;
-		  else if (filedata->file_header.e_ident[EI_OSABI] == ELFOSABI_OPENVMS)
-		    switch (flag)
-		      {
-		      case SHF_IA_64_VMS_GLOBAL:      sindex = 12; break;
-		      case SHF_IA_64_VMS_OVERLAID:    sindex = 13; break;
-		      case SHF_IA_64_VMS_SHARED:      sindex = 14; break;
-		      case SHF_IA_64_VMS_VECTOR:      sindex = 15; break;
-		      case SHF_IA_64_VMS_ALLOC_64BIT: sindex = 16; break;
-		      case SHF_IA_64_VMS_PROTECTED:   sindex = 17; break;
-		      default:                        break;
-		      }
-		  break;
-
 		case EM_386:
 		case EM_IAMCU:
 		case EM_X86_64:
@@ -8910,194 +8717,6 @@  process_section_groups (Filedata * filedata)
   return true;
 }
 
-/* Data used to display dynamic fixups.  */
-
-struct ia64_vms_dynfixup
-{
-  uint64_t needed_ident;	/* Library ident number.  */
-  uint64_t needed;		/* Index in the dstrtab of the library name.  */
-  uint64_t fixup_needed;	/* Index of the library.  */
-  uint64_t fixup_rela_cnt;	/* Number of fixups.  */
-  uint64_t fixup_rela_off;	/* Fixups offset in the dynamic segment.  */
-};
-
-/* Data used to display dynamic relocations.  */
-
-struct ia64_vms_dynimgrela
-{
-  uint64_t img_rela_cnt;	/* Number of relocations.  */
-  uint64_t img_rela_off;	/* Reloc offset in the dynamic segment.  */
-};
-
-/* Display IA-64 OpenVMS dynamic fixups (used to dynamically link a shared
-   library).  */
-
-static bool
-dump_ia64_vms_dynamic_fixups (Filedata *                  filedata,
-			      struct ia64_vms_dynfixup *  fixup,
-                              const char *                strtab,
-			      unsigned int                strtab_sz)
-{
-  Elf64_External_VMS_IMAGE_FIXUP * imfs;
-  size_t i;
-  const char * lib_name;
-
-  imfs = get_data (NULL, filedata,
-		   filedata->dynamic_addr + fixup->fixup_rela_off,
-		   sizeof (*imfs), fixup->fixup_rela_cnt,
-		   _("dynamic section image fixups"));
-  if (!imfs)
-    return false;
-
-  if (fixup->needed < strtab_sz)
-    lib_name = strtab + fixup->needed;
-  else
-    {
-      warn (_("corrupt library name index of %#" PRIx64
-	      " found in dynamic entry"), fixup->needed);
-      lib_name = "???";
-    }
-
-  printf (_("\nImage fixups for needed library #%" PRId64
-	    ": %s - ident: %" PRIx64 "\n"),
-	  fixup->fixup_needed, lib_name, fixup->needed_ident);
-  printf
-    (_("Seg Offset           Type                             SymVec DataType\n"));
-
-  for (i = 0; i < (size_t) fixup->fixup_rela_cnt; i++)
-    {
-      unsigned int type;
-      const char *rtype;
-
-      printf ("%3u ", (unsigned) BYTE_GET (imfs [i].fixup_seg));
-      printf ("%016" PRIx64 " ", BYTE_GET (imfs [i].fixup_offset));
-      type = BYTE_GET (imfs [i].type);
-      rtype = elf_ia64_reloc_type (type);
-      if (rtype == NULL)
-	printf ("0x%08x                       ", type);
-      else
-	printf ("%-32s ", rtype);
-      printf ("%6u ", (unsigned) BYTE_GET (imfs [i].symvec_index));
-      printf ("0x%08x\n", (unsigned) BYTE_GET (imfs [i].data_type));
-    }
-
-  free (imfs);
-  return true;
-}
-
-/* Display IA-64 OpenVMS dynamic relocations (used to relocate an image).  */
-
-static bool
-dump_ia64_vms_dynamic_relocs (Filedata * filedata, struct ia64_vms_dynimgrela *imgrela)
-{
-  Elf64_External_VMS_IMAGE_RELA *imrs;
-  size_t i;
-
-  imrs = get_data (NULL, filedata,
-		   filedata->dynamic_addr + imgrela->img_rela_off,
-		   sizeof (*imrs), imgrela->img_rela_cnt,
-		   _("dynamic section image relocations"));
-  if (!imrs)
-    return false;
-
-  printf (_("\nImage relocs\n"));
-  printf
-    (_("Seg Offset   Type                            Addend            Seg Sym Off\n"));
-
-  for (i = 0; i < (size_t) imgrela->img_rela_cnt; i++)
-    {
-      unsigned int type;
-      const char *rtype;
-
-      printf ("%3u ", (unsigned) BYTE_GET (imrs [i].rela_seg));
-      printf ("%08" PRIx64 " ", BYTE_GET (imrs [i].rela_offset));
-      type = BYTE_GET (imrs [i].type);
-      rtype = elf_ia64_reloc_type (type);
-      if (rtype == NULL)
-        printf ("0x%08x                      ", type);
-      else
-        printf ("%-31s ", rtype);
-      print_vma (BYTE_GET (imrs [i].addend), FULL_HEX);
-      printf ("%3u ", (unsigned) BYTE_GET (imrs [i].sym_seg));
-      printf ("%08" PRIx64 "\n", BYTE_GET (imrs [i].sym_offset));
-    }
-
-  free (imrs);
-  return true;
-}
-
-/* Display IA-64 OpenVMS dynamic relocations and fixups.  */
-
-static bool
-process_ia64_vms_dynamic_relocs (Filedata * filedata)
-{
-  struct ia64_vms_dynfixup fixup;
-  struct ia64_vms_dynimgrela imgrela;
-  Elf_Internal_Dyn *entry;
-  uint64_t strtab_off = 0;
-  uint64_t strtab_sz = 0;
-  char *strtab = NULL;
-  bool res = true;
-
-  memset (&fixup, 0, sizeof (fixup));
-  memset (&imgrela, 0, sizeof (imgrela));
-
-  /* Note: the order of the entries is specified by the OpenVMS specs.  */
-  for (entry = filedata->dynamic_section;
-       entry < filedata->dynamic_section + filedata->dynamic_nent;
-       entry++)
-    {
-      switch (entry->d_tag)
-        {
-        case DT_IA_64_VMS_STRTAB_OFFSET:
-          strtab_off = entry->d_un.d_val;
-          break;
-        case DT_STRSZ:
-          strtab_sz = entry->d_un.d_val;
-          if (strtab == NULL)
-	    strtab = get_data (NULL, filedata,
-			       filedata->dynamic_addr + strtab_off,
-                               1, strtab_sz, _("dynamic string section"));
-	  if (strtab == NULL)
-	    strtab_sz = 0;
-          break;
-
-        case DT_IA_64_VMS_NEEDED_IDENT:
-          fixup.needed_ident = entry->d_un.d_val;
-          break;
-        case DT_NEEDED:
-          fixup.needed = entry->d_un.d_val;
-          break;
-        case DT_IA_64_VMS_FIXUP_NEEDED:
-          fixup.fixup_needed = entry->d_un.d_val;
-          break;
-        case DT_IA_64_VMS_FIXUP_RELA_CNT:
-          fixup.fixup_rela_cnt = entry->d_un.d_val;
-          break;
-        case DT_IA_64_VMS_FIXUP_RELA_OFF:
-          fixup.fixup_rela_off = entry->d_un.d_val;
-          if (! dump_ia64_vms_dynamic_fixups (filedata, &fixup, strtab, strtab_sz))
-	    res = false;
-          break;
-        case DT_IA_64_VMS_IMG_RELA_CNT:
-	  imgrela.img_rela_cnt = entry->d_un.d_val;
-          break;
-        case DT_IA_64_VMS_IMG_RELA_OFF:
-	  imgrela.img_rela_off = entry->d_un.d_val;
-          if (! dump_ia64_vms_dynamic_relocs (filedata, &imgrela))
-	    res = false;
-          break;
-
-        default:
-          break;
-	}
-    }
-
-  free (strtab);
-
-  return res;
-}
-
 static struct
 {
   const char * name;
@@ -9290,10 +8909,6 @@  process_relocs (Filedata * filedata)
 	    }
 	}
 
-      if (is_ia64_vms (filedata))
-        if (process_ia64_vms_dynamic_relocs (filedata))
-	  has_dynamic_reloc = true;
-
       if (! has_dynamic_reloc)
 	{
 	  if (filedata->is_separate)
@@ -9340,522 +8955,83 @@  process_relocs (Filedata * filedata)
 		printf (_("\nThere are no relocations in linked file '%s'.\n"),
 			filedata->file_name);
 	      else
-		printf (_("\nThere are no relocations in this file.\n"));
-	    }
-	}
-    }
-
-  return true;
-}
-
-/* An absolute address consists of a section and an offset.  If the
-   section is NULL, the offset itself is the address, otherwise, the
-   address equals to LOAD_ADDRESS(section) + offset.  */
-
-struct absaddr
-{
-  unsigned short section;
-  uint64_t offset;
-};
-
-/* Find the nearest symbol at or below ADDR.  Returns the symbol
-   name, if found, and the offset from the symbol to ADDR.  */
-
-static void
-find_symbol_for_address (Filedata *filedata,
-			 Elf_Internal_Sym *symtab,
-			 uint64_t nsyms,
-			 const char *strtab,
-			 uint64_t strtab_size,
-			 struct absaddr addr,
-			 const char **symname,
-			 uint64_t *offset)
-{
-  uint64_t dist = 0x100000;
-  Elf_Internal_Sym * sym;
-  Elf_Internal_Sym * beg;
-  Elf_Internal_Sym * end;
-  Elf_Internal_Sym * best = NULL;
-
-  REMOVE_ARCH_BITS (addr.offset);
-  beg = symtab;
-  end = symtab + nsyms;
-
-  while (beg < end)
-    {
-      uint64_t value;
-
-      sym = beg + (end - beg) / 2;
-
-      value = sym->st_value;
-      REMOVE_ARCH_BITS (value);
-
-      if (sym->st_name != 0
-	  && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
-	  && addr.offset >= value
-	  && addr.offset - value < dist)
-	{
-	  best = sym;
-	  dist = addr.offset - value;
-	  if (!dist)
-	    break;
-	}
-
-      if (addr.offset < value)
-	end = sym;
-      else
-	beg = sym + 1;
-    }
-
-  if (best)
-    {
-      *symname = (best->st_name >= strtab_size
-		  ? _("<corrupt>") : strtab + best->st_name);
-      *offset = dist;
-      return;
-    }
-
-  *symname = NULL;
-  *offset = addr.offset;
-}
-
-/* Process the unwind section.  */
-
-#include "unwind-ia64.h"
-
-struct ia64_unw_table_entry
-{
-  struct absaddr start;
-  struct absaddr end;
-  struct absaddr info;
-};
-
-struct ia64_unw_aux_info
-{
-  struct ia64_unw_table_entry * table;		/* Unwind table.  */
-  uint64_t                      table_len;	/* Length of unwind table.  */
-  unsigned char *               info;		/* Unwind info.  */
-  uint64_t                      info_size;	/* Size of unwind info.  */
-  uint64_t                      info_addr;	/* Starting address of unwind info.  */
-  uint64_t                      seg_base;	/* Starting address of segment.  */
-  Elf_Internal_Sym *            symtab;		/* The symbol table.  */
-  uint64_t                      nsyms;		/* Number of symbols.  */
-  Elf_Internal_Sym *            funtab;		/* Sorted table of STT_FUNC symbols.  */
-  uint64_t                      nfuns;		/* Number of entries in funtab.  */
-  char *                        strtab;		/* The string table.  */
-  uint64_t                      strtab_size;	/* Size of string table.  */
-};
-
-static bool
-dump_ia64_unwind (Filedata * filedata, struct ia64_unw_aux_info * aux)
-{
-  struct ia64_unw_table_entry * tp;
-  size_t j, nfuns;
-  int in_body;
-  bool res = true;
-
-  aux->funtab = xmalloc (aux->nsyms * sizeof (Elf_Internal_Sym));
-  for (nfuns = 0, j = 0; j < aux->nsyms; j++)
-    if (aux->symtab[j].st_value && ELF_ST_TYPE (aux->symtab[j].st_info) == STT_FUNC)
-      aux->funtab[nfuns++] = aux->symtab[j];
-  aux->nfuns = nfuns;
-  qsort (aux->funtab, aux->nfuns, sizeof (Elf_Internal_Sym), symcmp);
-
-  for (tp = aux->table; tp < aux->table + aux->table_len; ++tp)
-    {
-      uint64_t stamp;
-      uint64_t offset;
-      const unsigned char * dp;
-      const unsigned char * head;
-      const unsigned char * end;
-      const char * procname;
-
-      find_symbol_for_address (filedata, aux->funtab, aux->nfuns, aux->strtab,
-			       aux->strtab_size, tp->start, &procname, &offset);
-
-      fputs ("\n<", stdout);
-
-      if (procname)
-	{
-	  fputs (procname, stdout);
-
-	  if (offset)
-	    printf ("+%" PRIx64, offset);
-	}
-
-      fputs (">: [", stdout);
-      print_vma (tp->start.offset, PREFIX_HEX);
-      fputc ('-', stdout);
-      print_vma (tp->end.offset, PREFIX_HEX);
-      printf ("], info at +0x%" PRIx64 "\n",
-	      tp->info.offset - aux->seg_base);
-
-      /* PR 17531: file: 86232b32.  */
-      if (aux->info == NULL)
-	continue;
-
-      offset = tp->info.offset;
-      if (tp->info.section)
-	{
-	  if (tp->info.section >= filedata->file_header.e_shnum)
-	    {
-	      warn (_("Invalid section %u in table entry %td\n"),
-		    tp->info.section, tp - aux->table);
-	      res = false;
-	      continue;
-	    }
-	  offset += filedata->section_headers[tp->info.section].sh_addr;
-	}
-      offset -= aux->info_addr;
-      /* PR 17531: file: 0997b4d1.  */
-      if (offset >= aux->info_size
-	  || aux->info_size - offset < 8)
-	{
-	  warn (_("Invalid offset %" PRIx64 " in table entry %td\n"),
-		tp->info.offset, tp - aux->table);
-	  res = false;
-	  continue;
-	}
-
-      head = aux->info + offset;
-      stamp = byte_get ((unsigned char *) head, sizeof (stamp));
-
-      printf ("  v%u, flags=0x%lx (%s%s), len=%lu bytes\n",
-	      (unsigned) UNW_VER (stamp),
-	      (unsigned long) ((stamp & UNW_FLAG_MASK) >> 32),
-	      UNW_FLAG_EHANDLER (stamp) ? " ehandler" : "",
-	      UNW_FLAG_UHANDLER (stamp) ? " uhandler" : "",
-	      (unsigned long) (eh_addr_size * UNW_LENGTH (stamp)));
-
-      if (UNW_VER (stamp) != 1)
-	{
-	  printf (_("\tUnknown version.\n"));
-	  continue;
-	}
-
-      in_body = 0;
-      end = head + 8 + eh_addr_size * UNW_LENGTH (stamp);
-      /* PR 17531: file: 16ceda89.  */
-      if (end > aux->info + aux->info_size)
-	end = aux->info + aux->info_size;
-      for (dp = head + 8; dp < end;)
-	dp = unw_decode (dp, in_body, & in_body, end);
-    }
-
-  free (aux->funtab);
-
-  return res;
-}
-
-static bool
-slurp_ia64_unwind_table (Filedata *                  filedata,
-			 struct ia64_unw_aux_info *  aux,
-			 Elf_Internal_Shdr *         sec)
-{
-  uint64_t size, nrelas, i;
-  Elf_Internal_Phdr * seg;
-  struct ia64_unw_table_entry * tep;
-  Elf_Internal_Shdr * relsec;
-  Elf_Internal_Rela * rela;
-  Elf_Internal_Rela * rp;
-  unsigned char * table;
-  unsigned char * tp;
-  Elf_Internal_Sym * sym;
-  const char * relname;
-
-  aux->table_len = 0;
-
-  /* First, find the starting address of the segment that includes
-     this section: */
-
-  if (filedata->file_header.e_phnum)
-    {
-      if (! get_program_headers (filedata))
-	  return false;
-
-      for (seg = filedata->program_headers;
-	   seg < filedata->program_headers + filedata->file_header.e_phnum;
-	   ++seg)
-	{
-	  if (seg->p_type != PT_LOAD)
-	    continue;
-
-	  if (sec->sh_addr >= seg->p_vaddr
-	      && (sec->sh_addr + sec->sh_size <= seg->p_vaddr + seg->p_memsz))
-	    {
-	      aux->seg_base = seg->p_vaddr;
-	      break;
-	    }
-	}
-    }
-
-  /* Second, build the unwind table from the contents of the unwind section:  */
-  size = sec->sh_size;
-  table = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1, size,
-                                      _("unwind table"));
-  if (!table)
-    return false;
-
-  aux->table_len = size / (3 * eh_addr_size);
-  aux->table = (struct ia64_unw_table_entry *)
-    xcmalloc (aux->table_len, sizeof (aux->table[0]));
-  tep = aux->table;
-
-  for (tp = table; tp <= table + size - (3 * eh_addr_size); ++tep)
-    {
-      tep->start.section = SHN_UNDEF;
-      tep->end.section   = SHN_UNDEF;
-      tep->info.section  = SHN_UNDEF;
-      tep->start.offset = byte_get (tp, eh_addr_size); tp += eh_addr_size;
-      tep->end.offset   = byte_get (tp, eh_addr_size); tp += eh_addr_size;
-      tep->info.offset  = byte_get (tp, eh_addr_size); tp += eh_addr_size;
-      tep->start.offset += aux->seg_base;
-      tep->end.offset   += aux->seg_base;
-      tep->info.offset  += aux->seg_base;
-    }
-  free (table);
-
-  /* Third, apply any relocations to the unwind table:  */
-  for (relsec = filedata->section_headers;
-       relsec < filedata->section_headers + filedata->file_header.e_shnum;
-       ++relsec)
-    {
-      if (relsec->sh_type != SHT_RELA
-	  || relsec->sh_info >= filedata->file_header.e_shnum
-	  || filedata->section_headers + relsec->sh_info != sec)
-	continue;
-
-      if (!slurp_rela_relocs (filedata, relsec->sh_offset, relsec->sh_size,
-			      & rela, & nrelas))
-	{
-	  free (aux->table);
-	  aux->table = NULL;
-	  aux->table_len = 0;
-	  return false;
-	}
-
-      for (rp = rela; rp < rela + nrelas; ++rp)
-	{
-	  unsigned int sym_ndx;
-	  unsigned int r_type = get_reloc_type (filedata, rp->r_info);
-	  relname = elf_ia64_reloc_type (r_type);
-
-	  /* PR 17531: file: 9fa67536.  */
-	  if (relname == NULL)
-	    {
-	      warn (_("Skipping unknown relocation type: %u\n"), r_type);
-	      continue;
-	    }
-
-	  if (! startswith (relname, "R_IA64_SEGREL"))
-	    {
-	      warn (_("Skipping unexpected relocation type: %s\n"), relname);
-	      continue;
-	    }
-
-	  i = rp->r_offset / (3 * eh_addr_size);
-
-	  /* PR 17531: file: 5bc8d9bf.  */
-	  if (i >= aux->table_len)
-	    {
-	      warn (_("Skipping reloc with overlarge offset: %#" PRIx64 "\n"),
-		    i);
-	      continue;
-	    }
-
-	  sym_ndx = get_reloc_symindex (rp->r_info);
-	  if (sym_ndx >= aux->nsyms)
-	    {
-	      warn (_("Skipping reloc with invalid symbol index: %u\n"),
-		    sym_ndx);
-	      continue;
-	    }
-	  sym = aux->symtab + sym_ndx;
-
-	  switch (rp->r_offset / eh_addr_size % 3)
-	    {
-	    case 0:
-	      aux->table[i].start.section = sym->st_shndx;
-	      aux->table[i].start.offset  = rp->r_addend + sym->st_value;
-	      break;
-	    case 1:
-	      aux->table[i].end.section   = sym->st_shndx;
-	      aux->table[i].end.offset    = rp->r_addend + sym->st_value;
-	      break;
-	    case 2:
-	      aux->table[i].info.section  = sym->st_shndx;
-	      aux->table[i].info.offset   = rp->r_addend + sym->st_value;
-	      break;
-	    default:
-	      break;
-	    }
-	}
-
-      free (rela);
-    }
-
-  return true;
-}
-
-static bool
-ia64_process_unwind (Filedata * filedata)
-{
-  Elf_Internal_Shdr * sec;
-  Elf_Internal_Shdr * unwsec = NULL;
-  uint64_t i, unwcount = 0, unwstart = 0;
-  struct ia64_unw_aux_info aux;
-  bool res = true;
-
-  memset (& aux, 0, sizeof (aux));
-
-  for (i = 0, sec = filedata->section_headers; i < filedata->file_header.e_shnum; ++i, ++sec)
-    {
-      if (sec->sh_type == SHT_SYMTAB)
-	{
-	  if (aux.symtab)
-	    {
-	      error (_("Multiple symbol tables encountered\n"));
-	      free (aux.symtab);
-	      aux.symtab = NULL;
-	      free (aux.strtab);
-	      aux.strtab = NULL;
+		printf (_("\nThere are no relocations in this file.\n"));
 	    }
-	  if (!get_symtab (filedata, sec, &aux.symtab, &aux.nsyms,
-			   &aux.strtab, &aux.strtab_size))
-	    return false;
 	}
-      else if (sec->sh_type == SHT_IA_64_UNWIND)
-	unwcount++;
     }
 
-  if (!unwcount)
-    printf (_("\nThere are no unwind sections in this file.\n"));
+  return true;
+}
 
-  while (unwcount-- > 0)
-    {
-      const char *suffix;
-      size_t len, len2;
+/* An absolute address consists of a section and an offset.  If the
+   section is NULL, the offset itself is the address, otherwise, the
+   address equals to LOAD_ADDRESS(section) + offset.  */
 
-      for (i = unwstart, sec = filedata->section_headers + unwstart, unwsec = NULL;
-	   i < filedata->file_header.e_shnum; ++i, ++sec)
-	if (sec->sh_type == SHT_IA_64_UNWIND)
-	  {
-	    unwsec = sec;
-	    break;
-	  }
-      /* We have already counted the number of SHT_IA64_UNWIND
-	 sections so the loop above should never fail.  */
-      assert (unwsec != NULL);
+struct absaddr
+{
+  unsigned short section;
+  uint64_t offset;
+};
 
-      unwstart = i + 1;
-      len = sizeof (ELF_STRING_ia64_unwind_once) - 1;
+/* Find the nearest symbol at or below ADDR.  Returns the symbol
+   name, if found, and the offset from the symbol to ADDR.  */
 
-      if ((unwsec->sh_flags & SHF_GROUP) != 0)
-	{
-	  /* We need to find which section group it is in.  */
-	  struct group_list * g;
+static void
+find_symbol_for_address (Filedata *filedata,
+			 Elf_Internal_Sym *symtab,
+			 uint64_t nsyms,
+			 const char *strtab,
+			 uint64_t strtab_size,
+			 struct absaddr addr,
+			 const char **symname,
+			 uint64_t *offset)
+{
+  uint64_t dist = 0x100000;
+  Elf_Internal_Sym * sym;
+  Elf_Internal_Sym * beg;
+  Elf_Internal_Sym * end;
+  Elf_Internal_Sym * best = NULL;
 
-	  if (filedata->section_headers_groups == NULL
-	      || filedata->section_headers_groups[i] == NULL)
-	    i = filedata->file_header.e_shnum;
-	  else
-	    {
-	      g = filedata->section_headers_groups[i]->root;
+  REMOVE_ARCH_BITS (addr.offset);
+  beg = symtab;
+  end = symtab + nsyms;
 
-	      for (; g != NULL; g = g->next)
-		{
-		  sec = filedata->section_headers + g->section_index;
+  while (beg < end)
+    {
+      uint64_t value;
 
-		  if (section_name_valid (filedata, sec)
-		      && streq (section_name (filedata, sec),
-				ELF_STRING_ia64_unwind_info))
-		    break;
-		}
+      sym = beg + (end - beg) / 2;
 
-	      if (g == NULL)
-		i = filedata->file_header.e_shnum;
-	    }
-	}
-      else if (section_name_valid (filedata, unwsec)
-	       && startswith (section_name (filedata, unwsec),
-			      ELF_STRING_ia64_unwind_once))
-	{
-	  /* .gnu.linkonce.ia64unw.FOO -> .gnu.linkonce.ia64unwi.FOO.  */
-	  len2 = sizeof (ELF_STRING_ia64_unwind_info_once) - 1;
-	  suffix = section_name (filedata, unwsec) + len;
-	  for (i = 0, sec = filedata->section_headers;
-	       i < filedata->file_header.e_shnum;
-	       ++i, ++sec)
-	    if (section_name_valid (filedata, sec)
-		&& startswith (section_name (filedata, sec),
-			       ELF_STRING_ia64_unwind_info_once)
-		&& streq (section_name (filedata, sec) + len2, suffix))
-	      break;
-	}
-      else
-	{
-	  /* .IA_64.unwindFOO -> .IA_64.unwind_infoFOO
-	     .IA_64.unwind or BAR -> .IA_64.unwind_info.  */
-	  len = sizeof (ELF_STRING_ia64_unwind) - 1;
-	  len2 = sizeof (ELF_STRING_ia64_unwind_info) - 1;
-	  suffix = "";
-	  if (section_name_valid (filedata, unwsec)
-	      && startswith (section_name (filedata, unwsec),
-			     ELF_STRING_ia64_unwind))
-	    suffix = section_name (filedata, unwsec) + len;
-	  for (i = 0, sec = filedata->section_headers;
-	       i < filedata->file_header.e_shnum;
-	       ++i, ++sec)
-	    if (section_name_valid (filedata, sec)
-		&& startswith (section_name (filedata, sec),
-			       ELF_STRING_ia64_unwind_info)
-		&& streq (section_name (filedata, sec) + len2, suffix))
-	      break;
-	}
+      value = sym->st_value;
+      REMOVE_ARCH_BITS (value);
 
-      if (i == filedata->file_header.e_shnum)
+      if (sym->st_name != 0
+	  && (addr.section == SHN_UNDEF || addr.section == sym->st_shndx)
+	  && addr.offset >= value
+	  && addr.offset - value < dist)
 	{
-	  printf (_("\nCould not find unwind info section for "));
-
-	  if (filedata->string_table == NULL)
-	    printf ("%d", unwsec->sh_name);
-	  else
-	    printf ("'%s'", printable_section_name (filedata, unwsec));
+	  best = sym;
+	  dist = addr.offset - value;
+	  if (!dist)
+	    break;
 	}
-      else
-	{
-	  aux.info_addr = sec->sh_addr;
-	  aux.info = (unsigned char *) get_data (NULL, filedata, sec->sh_offset, 1,
-						 sec->sh_size,
-						 _("unwind info"));
-	  aux.info_size = aux.info == NULL ? 0 : sec->sh_size;
-
-	  printf (_("\nUnwind section "));
 
-	  if (filedata->string_table == NULL)
-	    printf ("%d", unwsec->sh_name);
-	  else
-	    printf ("'%s'", printable_section_name (filedata, unwsec));
-
-	  printf (_(" at offset %#" PRIx64 " contains %" PRIu64 " entries:\n"),
-		  unwsec->sh_offset,
-		  unwsec->sh_size / (3 * eh_addr_size));
-
-	  if (slurp_ia64_unwind_table (filedata, & aux, unwsec)
-	      && aux.table_len > 0)
-	    dump_ia64_unwind (filedata, & aux);
-
-	  free ((char *) aux.table);
-	  free ((char *) aux.info);
-	  aux.table = NULL;
-	  aux.info = NULL;
-	}
+      if (addr.offset < value)
+	end = sym;
+      else
+	beg = sym + 1;
     }
 
-  free (aux.symtab);
-  free ((char *) aux.strtab);
+  if (best)
+    {
+      *symname = (best->st_name >= strtab_size
+		  ? _("<corrupt>") : strtab + best->st_name);
+      *offset = dist;
+      return;
+    }
 
-  return res;
+  *symname = NULL;
+  *offset = addr.offset;
 }
 
 struct hppa_unw_table_entry
@@ -11352,7 +10528,6 @@  process_unwind (Filedata * filedata)
   } handlers[] =
   {
     { EM_ARM, arm_process_unwind },
-    { EM_IA_64, ia64_process_unwind },
     { EM_PARISC, hppa_process_unwind },
     { EM_TI_C6000, arm_process_unwind },
     { EM_386, no_processor_specific_unwind },
@@ -11542,84 +10717,6 @@  dynamic_section_parisc_val (Elf_Internal_Dyn * entry)
 #define INT64_MIN (-9223372036854775807LL - 1)
 #endif
 
-/* Display a VMS time in a human readable format.  */
-
-static void
-print_vms_time (int64_t vmstime)
-{
-  struct tm *tm = NULL;
-  time_t unxtime;
-
-  if (vmstime >= INT64_MIN + VMS_EPOCH_OFFSET)
-    {
-      vmstime = (vmstime - VMS_EPOCH_OFFSET) / VMS_GRANULARITY_FACTOR;
-      unxtime = vmstime;
-      if (unxtime == vmstime)
-	tm = gmtime (&unxtime);
-    }
-  if (tm != NULL)
-    printf ("%04u-%02u-%02uT%02u:%02u:%02u",
-	    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,
-	    tm->tm_hour, tm->tm_min, tm->tm_sec);
-}
-
-static void
-dynamic_section_ia64_val (Elf_Internal_Dyn * entry)
-{
-  switch (entry->d_tag)
-    {
-    case DT_IA_64_PLT_RESERVE:
-      /* First 3 slots reserved.  */
-      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
-      printf (" -- ");
-      print_vma (entry->d_un.d_ptr + (3 * 8), PREFIX_HEX);
-      break;
-
-    case DT_IA_64_VMS_LINKTIME:
-      print_vms_time (entry->d_un.d_val);
-      break;
-
-    case DT_IA_64_VMS_LNKFLAGS:
-      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
-      if (entry->d_un.d_val & VMS_LF_CALL_DEBUG)
-        printf (" CALL_DEBUG");
-      if (entry->d_un.d_val & VMS_LF_NOP0BUFS)
-        printf (" NOP0BUFS");
-      if (entry->d_un.d_val & VMS_LF_P0IMAGE)
-        printf (" P0IMAGE");
-      if (entry->d_un.d_val & VMS_LF_MKTHREADS)
-        printf (" MKTHREADS");
-      if (entry->d_un.d_val & VMS_LF_UPCALLS)
-        printf (" UPCALLS");
-      if (entry->d_un.d_val & VMS_LF_IMGSTA)
-        printf (" IMGSTA");
-      if (entry->d_un.d_val & VMS_LF_INITIALIZE)
-        printf (" INITIALIZE");
-      if (entry->d_un.d_val & VMS_LF_MAIN)
-        printf (" MAIN");
-      if (entry->d_un.d_val & VMS_LF_EXE_INIT)
-        printf (" EXE_INIT");
-      if (entry->d_un.d_val & VMS_LF_TBK_IN_IMG)
-        printf (" TBK_IN_IMG");
-      if (entry->d_un.d_val & VMS_LF_DBG_IN_IMG)
-        printf (" DBG_IN_IMG");
-      if (entry->d_un.d_val & VMS_LF_TBK_IN_DSF)
-        printf (" TBK_IN_DSF");
-      if (entry->d_un.d_val & VMS_LF_DBG_IN_DSF)
-        printf (" DBG_IN_DSF");
-      if (entry->d_un.d_val & VMS_LF_SIGNATURES)
-        printf (" SIGNATURES");
-      if (entry->d_un.d_val & VMS_LF_REL_SEG_OFF)
-        printf (" REL_SEG_OFF");
-      break;
-
-    default:
-      print_vma (entry->d_un.d_ptr, PREFIX_HEX);
-      break;
-    }
-  putchar ('\n');
-}
-
 static bool
 get_32bit_dynamic_section (Filedata * filedata)
 {
@@ -12809,9 +11906,6 @@  the .dynstr section doesn't match the DT_STRTAB and DT_STRSZ tags\n"));
 		case EM_PARISC:
 		  dynamic_section_parisc_val (entry);
 		  break;
-		case EM_IA_64:
-		  dynamic_section_ia64_val (entry);
-		  break;
 		default:
 		  print_vma (entry->d_un.d_val, PREFIX_HEX);
 		  putchar ('\n');
@@ -13580,73 +12674,6 @@  get_mips_symbol_other (unsigned int other)
     }
 }
 
-static const char *
-get_ia64_symbol_other (Filedata * filedata, unsigned int other)
-{
-  if (is_ia64_vms (filedata))
-    {
-      static char res[32];
-
-      res[0] = 0;
-
-      /* Function types is for images and .STB files only.  */
-      switch (filedata->file_header.e_type)
-        {
-        case ET_DYN:
-        case ET_EXEC:
-          switch (VMS_ST_FUNC_TYPE (other))
-            {
-            case VMS_SFT_CODE_ADDR:
-              strcat (res, " CA");
-              break;
-            case VMS_SFT_SYMV_IDX:
-              strcat (res, " VEC");
-              break;
-            case VMS_SFT_FD:
-              strcat (res, " FD");
-              break;
-            case VMS_SFT_RESERVE:
-              strcat (res, " RSV");
-              break;
-            default:
-	      warn (_("Unrecognized IA64 VMS ST Function type: %d\n"),
-		    VMS_ST_FUNC_TYPE (other));
-	      strcat (res, " <unknown>");
-	      break;
-            }
-          break;
-        default:
-          break;
-        }
-      switch (VMS_ST_LINKAGE (other))
-        {
-        case VMS_STL_IGNORE:
-          strcat (res, " IGN");
-          break;
-        case VMS_STL_RESERVE:
-          strcat (res, " RSV");
-          break;
-        case VMS_STL_STD:
-          strcat (res, " STD");
-          break;
-        case VMS_STL_LNK:
-          strcat (res, " LNK");
-          break;
-        default:
-	  warn (_("Unrecognized IA64 VMS ST Linkage: %d\n"),
-		VMS_ST_LINKAGE (other));
-	  strcat (res, " <unknown>");
-	  break;
-        }
-
-      if (res[0] != 0)
-        return res + 1;
-      else
-        return res;
-    }
-  return NULL;
-}
-
 static const char *
 get_ppc64_symbol_other (unsigned int other)
 {
@@ -13707,9 +12734,6 @@  get_symbol_other (Filedata * filedata, unsigned int other)
     case EM_MIPS:
       result = get_mips_symbol_other (other);
       break;
-    case EM_IA_64:
-      result = get_ia64_symbol_other (filedata, other);
-      break;
     case EM_PPC64:
       result = get_ppc64_symbol_other (other);
       break;
@@ -15155,11 +14179,6 @@  is_32bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_H8_300:
     case EM_H8_300H:
       return reloc_type == 1; /* R_H8_DIR32.  */
-    case EM_IA_64:
-      return (reloc_type == 0x64    /* R_IA64_SECREL32MSB.  */
-	      || reloc_type == 0x65 /* R_IA64_SECREL32LSB.  */
-	      || reloc_type == 0x24 /* R_IA64_DIR32MSB.  */
-	      || reloc_type == 0x25 /* R_IA64_DIR32LSB.  */);
     case EM_IP2K_OLD:
     case EM_IP2K:
       return reloc_type == 2; /* R_IP2K_32.  */
@@ -15390,9 +14409,6 @@  is_64bit_abs_reloc (Filedata * filedata, unsigned int reloc_type)
       return reloc_type == 5; /* R_ARC_64.  */
     case EM_ALPHA:
       return reloc_type == 2; /* R_ALPHA_REFQUAD.  */
-    case EM_IA_64:
-      return (reloc_type == 0x26    /* R_IA64_DIR64MSB.  */
-	      || reloc_type == 0x27 /* R_IA64_DIR64LSB.  */);
     case EM_LOONGARCH:
       return reloc_type == 2;      /* R_LARCH_64 */
     case EM_PARISC:
@@ -15436,9 +14452,6 @@  is_64bit_pcrel_reloc (Filedata * filedata, unsigned int reloc_type)
       return reloc_type == 260;	/* R_AARCH64_PREL64.  */
     case EM_ALPHA:
       return reloc_type == 11; /* R_ALPHA_SREL64.  */
-    case EM_IA_64:
-      return (reloc_type == 0x4e    /* R_IA64_PCREL64MSB.  */
-	      || reloc_type == 0x4f /* R_IA64_PCREL64LSB.  */);
     case EM_PARISC:
       return reloc_type == 72; /* R_PARISC_PCREL64.  */
     case EM_PPC64:
@@ -15788,7 +14801,6 @@  is_none_reloc (Filedata * filedata, unsigned int reloc_type)
     case EM_ARM:     /* R_ARM_NONE.  */
     case EM_CRIS:    /* R_CRIS_NONE.  */
     case EM_FT32:    /* R_FT32_NONE.  */
-    case EM_IA_64:   /* R_IA64_NONE.  */
     case EM_K1OM:    /* R_X86_64_NONE.  */
     case EM_KVX:      /* R_KVX_NONE.  */
     case EM_L1OM:    /* R_X86_64_NONE.  */
@@ -16998,8 +16010,6 @@  get_build_id (void * data)
       end = (char *) enote + length;
       data_remaining = end - (char *) enote;
 
-      if (!is_ia64_vms (filedata))
-        {
           min_notesz = offsetof (Elf_External_Note, name);
           if (data_remaining < min_notesz)
             {
@@ -17020,33 +16030,6 @@  malformed note encountered in section %s whilst scanning for build-id note\n"),
           inote.descpos  = offset + (inote.descdata - (char *) enote);
           next = ((char *) enote
                   + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
-        }
-      else
-        {
-          Elf64_External_VMS_Note *vms_enote;
-
-          /* PR binutils/15191
-             Make sure that there is enough data to read.  */
-          min_notesz = offsetof (Elf64_External_VMS_Note, name);
-          if (data_remaining < min_notesz)
-            {
-	      warn (_("\
-malformed note encountered in section %s whilst scanning for build-id note\n"),
-		    printable_section_name (filedata, shdr));
-	      free (enote);
-              continue;
-            }
-          data_remaining -= min_notesz;
-
-          vms_enote = (Elf64_External_VMS_Note *) enote;
-          inote.type     = BYTE_GET (vms_enote->type);
-          inote.namesz   = BYTE_GET (vms_enote->namesz);
-          inote.namedata = vms_enote->name;
-          inote.descsz   = BYTE_GET (vms_enote->descsz);
-          inote.descdata = inote.namedata + align_power (inote.namesz, 3);
-          inote.descpos  = offset + (inote.descdata - (char *) enote);
-          next = inote.descdata + align_power (inote.descsz, 3);
-        }
 
       /* Skip malformed notes.  */
       if ((size_t) (inote.descdata - inote.namedata) < inote.namesz
@@ -21780,159 +20763,6 @@  print_fdo_note (Elf_Internal_Note * pnote)
   return false;
 }
 
-static const char *
-get_ia64_vms_note_type (unsigned e_type)
-{
-  static char buff[64];
-
-  switch (e_type)
-    {
-    case NT_VMS_MHD:
-      return _("NT_VMS_MHD (module header)");
-    case NT_VMS_LNM:
-      return _("NT_VMS_LNM (language name)");
-    case NT_VMS_SRC:
-      return _("NT_VMS_SRC (source files)");
-    case NT_VMS_TITLE:
-      return "NT_VMS_TITLE";
-    case NT_VMS_EIDC:
-      return _("NT_VMS_EIDC (consistency check)");
-    case NT_VMS_FPMODE:
-      return _("NT_VMS_FPMODE (FP mode)");
-    case NT_VMS_LINKTIME:
-      return "NT_VMS_LINKTIME";
-    case NT_VMS_IMGNAM:
-      return _("NT_VMS_IMGNAM (image name)");
-    case NT_VMS_IMGID:
-      return _("NT_VMS_IMGID (image id)");
-    case NT_VMS_LINKID:
-      return _("NT_VMS_LINKID (link id)");
-    case NT_VMS_IMGBID:
-      return _("NT_VMS_IMGBID (build id)");
-    case NT_VMS_GSTNAM:
-      return _("NT_VMS_GSTNAM (sym table name)");
-    case NT_VMS_ORIG_DYN:
-      return "NT_VMS_ORIG_DYN";
-    case NT_VMS_PATCHTIME:
-      return "NT_VMS_PATCHTIME";
-    default:
-      snprintf (buff, sizeof (buff), _("Unknown note type: (0x%08x)"), e_type);
-      return buff;
-    }
-}
-
-static bool
-print_ia64_vms_note (Elf_Internal_Note * pnote)
-{
-  unsigned int maxlen = pnote->descsz;
-
-  if (maxlen < 2 || maxlen != pnote->descsz)
-    goto desc_size_fail;
-
-  switch (pnote->type)
-    {
-    case NT_VMS_MHD:
-      if (maxlen <= 36)
-	goto desc_size_fail;
-
-      size_t l = strnlen (pnote->descdata + 34, maxlen - 34);
-
-      printf (_("    Creation date  : %.17s\n"), pnote->descdata);
-      printf (_("    Last patch date: %.17s\n"), pnote->descdata + 17);
-      if (l + 34 < maxlen)
-	{
-	  printf (_("    Module name    : %s\n"), pnote->descdata + 34);
-	  if (l + 35 < maxlen)
-	    printf (_("    Module version : %s\n"), pnote->descdata + 34 + l + 1);
-	  else
-	    printf (_("    Module version : <missing>\n"));
-	}
-      else
-	{
-	  printf (_("    Module name    : <missing>\n"));
-	  printf (_("    Module version : <missing>\n"));
-	}
-      break;
-
-    case NT_VMS_LNM:
-      printf (_("   Language: %.*s\n"), maxlen, pnote->descdata);
-      break;
-
-    case NT_VMS_FPMODE:
-      printf (_("   Floating Point mode: "));
-      if (maxlen < 8)
-	goto desc_size_fail;
-      /* FIXME: Generate an error if descsz > 8 ?  */
-
-      printf ("0x%016" PRIx64 "\n",
-	      byte_get ((unsigned char *) pnote->descdata, 8));
-      break;
-
-    case NT_VMS_LINKTIME:
-      printf (_("   Link time: "));
-      if (maxlen < 8)
-	goto desc_size_fail;
-      /* FIXME: Generate an error if descsz > 8 ?  */
-
-      print_vms_time (byte_get ((unsigned char *) pnote->descdata, 8));
-      printf ("\n");
-      break;
-
-    case NT_VMS_PATCHTIME:
-      printf (_("   Patch time: "));
-      if (maxlen < 8)
-	goto desc_size_fail;
-      /* FIXME: Generate an error if descsz > 8 ?  */
-
-      print_vms_time (byte_get ((unsigned char *) pnote->descdata, 8));
-      printf ("\n");
-      break;
-
-    case NT_VMS_ORIG_DYN:
-      if (maxlen < 34)
-	goto desc_size_fail;
-
-      printf (_("   Major id: %u,  minor id: %u\n"),
-	      (unsigned) byte_get ((unsigned char *) pnote->descdata, 4),
-	      (unsigned) byte_get ((unsigned char *) pnote->descdata + 4, 4));
-      printf (_("   Last modified  : "));
-      print_vms_time (byte_get ((unsigned char *) pnote->descdata + 8, 8));
-      printf (_("\n   Link flags  : "));
-      printf ("0x%016" PRIx64 "\n",
-	      byte_get ((unsigned char *) pnote->descdata + 16, 8));
-      printf (_("   Header flags: 0x%08x\n"),
-	      (unsigned) byte_get ((unsigned char *) pnote->descdata + 24, 4));
-      printf (_("   Image id    : %.*s\n"), maxlen - 32, pnote->descdata + 32);
-      break;
-
-    case NT_VMS_IMGNAM:
-      printf (_("    Image name: %.*s\n"), maxlen, pnote->descdata);
-      break;
-
-    case NT_VMS_GSTNAM:
-      printf (_("    Global symbol table name: %.*s\n"), maxlen, pnote->descdata);
-      break;
-
-    case NT_VMS_IMGID:
-      printf (_("    Image id: %.*s\n"), maxlen, pnote->descdata);
-      break;
-
-    case NT_VMS_LINKID:
-      printf (_("    Linker id: %.*s\n"), maxlen, pnote->descdata);
-      break;
-
-    default:
-      return false;
-    }
-
-  return true;
-
- desc_size_fail:
-  printf (_("  <corrupt - data size is too small>\n"));
-  error (_("corrupt IA64 note: data size is too small\n"));
-  return false;
-}
-
 struct build_attr_cache {
   Filedata *filedata;
   char *strtab;
@@ -22684,10 +21514,6 @@  process_note (Elf_Internal_Note *  pnote,
       name = "SPU";
     }
 
-  else if (startswith (pnote->namedata, "IPF/VMS"))
-    /* VMS/ia64-specific file notes.  */
-    nt = get_ia64_vms_note_type (pnote->type);
-
   else if (startswith (pnote->namedata, "stapsdt"))
     nt = get_stapsdt_note_type (pnote->type);
 
@@ -22712,9 +21538,7 @@  process_note (Elf_Internal_Note *  pnote,
   else
     printf (" 0x%08lx\t%s\n", pnote->descsz, nt);
 
-  if (startswith (pnote->namedata, "IPF/VMS"))
-    return print_ia64_vms_note (pnote);
-  else if (startswith (pnote->namedata, "GNU"))
+  if (startswith (pnote->namedata, "GNU"))
     return print_gnu_note (filedata, pnote);
   else if (startswith (pnote->namedata, "stapsdt"))
     return print_stapsdt_note (pnote);
@@ -22811,8 +21635,6 @@  process_notes_at (Filedata *           filedata,
       char * temp = NULL;
       size_t data_remaining = end - (char *) external;
 
-      if (!is_ia64_vms (filedata))
-	{
 	  /* PR binutils/15191
 	     Make sure that there is enough data to read.  */
 	  min_notesz = offsetof (Elf_External_Note, name);
@@ -22837,35 +21659,6 @@  process_notes_at (Filedata *           filedata,
 	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
 	  next = ((char *) external
 		  + ELF_NOTE_NEXT_OFFSET (inote.namesz, inote.descsz, align));
-	}
-      else
-	{
-	  Elf64_External_VMS_Note *vms_external;
-
-	  /* PR binutils/15191
-	     Make sure that there is enough data to read.  */
-	  min_notesz = offsetof (Elf64_External_VMS_Note, name);
-	  if (data_remaining < min_notesz)
-	    {
-	      warn (ngettext ("Corrupt note: only %zd byte remains, "
-			      "not enough for a full note\n",
-			      "Corrupt note: only %zd bytes remain, "
-			      "not enough for a full note\n",
-			      data_remaining),
-		    data_remaining);
-	      break;
-	    }
-	  data_remaining -= min_notesz;
-
-	  vms_external = (Elf64_External_VMS_Note *) external;
-	  inote.type     = BYTE_GET (vms_external->type);
-	  inote.namesz   = BYTE_GET (vms_external->namesz);
-	  inote.namedata = vms_external->name;
-	  inote.descsz   = BYTE_GET (vms_external->descsz);
-	  inote.descdata = inote.namedata + align_power (inote.namesz, 3);
-	  inote.descpos  = offset + (inote.descdata - (char *) pnotes);
-	  next = inote.descdata + align_power (inote.descsz, 3);
-	}
 
       /* PR 17531: file: 3443835e.  */
       /* PR 17531: file: id:000000,sig:11,src:006986,op:havoc,rep:4.  */
diff --git a/binutils/testsuite/binutils-all/nm.exp b/binutils/testsuite/binutils-all/nm.exp
index 8fe4ce85f03..d77ce4b4a15 100644
--- a/binutils/testsuite/binutils-all/nm.exp
+++ b/binutils/testsuite/binutils-all/nm.exp
@@ -158,7 +158,6 @@  if {   [is_elf_format]
     || [istarget *-*-rdos*]
     || [istarget *-*-tpf*]
     || [istarget *-*-uclinux*]
-    || [istarget ia64-*-*vms*]
     || [istarget *-*-vxworks*]
     || [istarget wasm32-*-*]
     || [istarget bpf-*-*]} {
@@ -251,7 +250,7 @@  if [is_elf_format] {
     setup_xfail "sh*-*-*"
     # The pre-compiled dwarf info in dw4.s is not compatible with the
     # ALPHA, HPPA, IA64 and MIPS targets.
-    setup_xfail "alpha*-*-*" "hppa*-*-*" "ia64*-*-*" "mips*-*-*"
+    setup_xfail "alpha*-*-*" "hppa*-*-*" "mips*-*-*"
     # Assembling the source file triggers an ICE in the FT32 assembler.
     # FIXME: Fix the ICE...
     setup_xfail "ft32-*-*"
diff --git a/binutils/testsuite/binutils-all/objcopy.exp b/binutils/testsuite/binutils-all/objcopy.exp
index 8b432f3b48c..130efd1e7ac 100644
--- a/binutils/testsuite/binutils-all/objcopy.exp
+++ b/binutils/testsuite/binutils-all/objcopy.exp
@@ -1209,12 +1209,6 @@  proc objcopy_test_elf_common_symbols {} {
     }
 }
 
-# ia64 specific tests
-if { ([istarget "ia64-*-elf*"]
-       || [istarget "ia64-*-linux*"]) } {
-    objcopy_test "ia64 link order" link-order.s object "" ""
-}
-
 # ELF specific tests
 set elf64 ""
 if [is_elf_format] {
@@ -1292,8 +1286,7 @@  if [is_elf_format] {
     # supported by the target and ABI being tested.
     if { [istarget "aarch64*-*"] } {
 	set reloc 259
-    } elseif { [istarget "ia64*-*"] \
-	       || [istarget "m32r*-*"] \
+    } elseif { [istarget "m32r*-*"] \
 	       || [istarget "nds32*-*"] \
 	       || [istarget "v850*-*"] } {
 	set reloc 50
@@ -1342,7 +1335,6 @@  if [is_elf_format] {
     }
     run_dump_test "localize-hidden-1"
     run_dump_test "testranges"
-    run_dump_test "testranges-ia64"
 
     run_dump_test "add-section"
     run_dump_test "add-symbol"
diff --git a/binutils/testsuite/binutils-all/objdump.exp b/binutils/testsuite/binutils-all/objdump.exp
index 493e31b1281..7f3c99bea61 100644
--- a/binutils/testsuite/binutils-all/objdump.exp
+++ b/binutils/testsuite/binutils-all/objdump.exp
@@ -490,7 +490,6 @@  if { ![is_elf_format] } then {
 
 if { ![is_elf_format]
      || [istarget "hppa64*-*-hpux*"]
-     || [istarget "ia64*-*-*"]
      || [istarget "mcore-*-*"]
      || [istarget "moxie-*-*"]
 } then {
diff --git a/binutils/testsuite/binutils-all/testranges-ia64.d b/binutils/testsuite/binutils-all/testranges-ia64.d
deleted file mode 100644
index e1e29e71632..00000000000
--- a/binutils/testsuite/binutils-all/testranges-ia64.d
+++ /dev/null
@@ -1,15 +0,0 @@ 
-#PROG: objcopy
-#source: testranges-ia64.s
-#readelf: -wR --wide
-#name: unordered .debug_info references to .debug_ranges
-#target: ia64-*-*
-
-Contents of the .debug_ranges section:
-
-    Offset   Begin    End
-    00000000 00000001 00000002 ?
-    00000000 <End of list>
-    00000010 00000000 00000002 ?
-    00000010 <End of list>
-
-#pass
diff --git a/binutils/testsuite/binutils-all/testranges-ia64.s b/binutils/testsuite/binutils-all/testranges-ia64.s
deleted file mode 100644
index 9af6b634c1d..00000000000
--- a/binutils/testsuite/binutils-all/testranges-ia64.s
+++ /dev/null
@@ -1,57 +0,0 @@ 
-# Test .debug_info can reference .debug_ranges entries without ordering the
-# offsets strictly as increasing.
-
-	.text
-start:
-	.byte	1
-sub:
-	.byte	2
-end:
-
-	.section	.debug_ranges,"",@progbits
-range:
-
-range_sub:
-	data4.ua	@secrel(sub), @secrel(end)
-	data4.ua	0, 0	/* range terminator  */
-
-range_cu:
-	data4.ua	@secrel(start), @secrel(end)
-	data4.ua	0, 0	/* range terminator  */
-
-	.section	.debug_info,"",@progbits
-	data4.ua	debugE - debugS	/* Length of Compilation Unit Info  */
-debugS:
-	.short	0x2	/* DWARF version number  */
-	data4.ua	@secrel(abbrev0) /* Offset Into Abbrev. Section  */
-	.byte	0x4	/* Pointer Size (in bytes)  */
-
-	.uleb128 0x1	/* (DIE (0xb) DW_TAG_compile_unit)  */
-	data4.ua	range_cu - range	/* DW_AT_ranges  */
-
-	.uleb128 0x2	/* (DIE (0x6d) DW_TAG_subprogram)  */
-	.ascii "A\0"	/* DW_AT_name */
-	data4.ua	range_sub - range	/* DW_AT_ranges  */
-debugE:
-
-	.section	.debug_abbrev,"",@progbits
-abbrev0:
-	.uleb128 0x1	/* (abbrev code)  */
-	.uleb128 0x11	/* (TAG: DW_TAG_compile_unit)  */
-	.byte	0x0	/* DW_children_no  */
-	.uleb128 0x55	/* (DW_AT_ranges)  */
-	.uleb128 0x6	/* (DW_FORM_data4)  */
-	.byte	0x0
-	.byte	0x0
-
-	.uleb128 0x2	/* (abbrev code)  */
-	.uleb128 0x2e	/* (TAG: DW_TAG_subprogram)  */
-	.byte	0x0	/* DW_children_no  */
-	.uleb128 0x3	/* (DW_AT_name)  */
-	.uleb128 0x8	/* (DW_FORM_string)  */
-	.uleb128 0x55	/* (DW_AT_ranges)  */
-	.uleb128 0x6	/* (DW_FORM_data4) */
-	.byte	0x0
-	.byte	0x0
-
-	.byte	0x0	/* abbrevs terminator  */
diff --git a/binutils/testsuite/binutils-all/testranges.d b/binutils/testsuite/binutils-all/testranges.d
index dd2017557e7..32664fec50f 100644
--- a/binutils/testsuite/binutils-all/testranges.d
+++ b/binutils/testsuite/binutils-all/testranges.d
@@ -2,7 +2,6 @@ 
 #source: testranges.s
 #readelf: -wR --wide
 #name: unordered .debug_info references to .debug_ranges
-#notarget: ia64-*-*
 
 Contents of the \.z?debug_ranges section:
 
diff --git a/binutils/testsuite/lib/binutils-common.exp b/binutils/testsuite/lib/binutils-common.exp
index 2fca43bac48..bee9ee84040 100644
--- a/binutils/testsuite/lib/binutils-common.exp
+++ b/binutils/testsuite/lib/binutils-common.exp
@@ -54,8 +54,7 @@  proc is_elf_format {} {
 	 && ![istarget *-*-wasm32*]
 	 && ![istarget avr-*-*]
 	 && ![istarget hppa*64*-*-hpux*]
-	 && ![istarget i?86-*-beos*]
-	 && ![istarget ia64-*-hpux*] } {
+	 && ![istarget i?86-*-beos*] } {
 	return 0
     }
 
diff --git a/binutils/unwind-ia64.c b/binutils/unwind-ia64.c
deleted file mode 100644
index 086fac6cc12..00000000000
--- a/binutils/unwind-ia64.c
+++ /dev/null
@@ -1,1164 +0,0 @@ 
-/* unwind-ia64.c -- utility routines to dump IA-64 unwind info for readelf.
-   Copyright (C) 2000-2024 Free Software Foundation, Inc.
-
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of GNU Binutils.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "config.h"
-#include "sysdep.h"
-#include "unwind-ia64.h"
-
-#if __GNUC__ >= 2
-/* Define BFD64 here, even if our default architecture is 32 bit ELF
-   as this will allow us to read in and parse 64bit and 32bit ELF files.
-   Only do this if we believe that the compiler can support a 64 bit
-   data type.  For now we only rely on GCC being able to do this.  */
-#define BFD64
-#endif
-#include "bfd.h"
-
-static bfd_vma unw_rlen = 0;
-
-static void unw_print_brmask (char *, unsigned int);
-static void unw_print_grmask (char *, unsigned int);
-static void unw_print_frmask (char *, unsigned int);
-static void unw_print_abreg (char *, unsigned int);
-static void unw_print_xyreg (char *, unsigned int, unsigned int);
-
-static void
-unw_print_brmask (char *cp, unsigned int mask)
-{
-  int sep = 0;
-  int i;
-
-  for (i = 0; mask && (i < 5); ++i)
-    {
-      if (mask & 1)
-	{
-	  if (sep)
-	    *cp++ = ',';
-	  *cp++ = 'b';
-	  *cp++ = i + 1 + '0';
-	  sep = 1;
-	}
-      mask >>= 1;
-    }
-  *cp = '\0';
-}
-
-static void
-unw_print_grmask (char *cp, unsigned int mask)
-{
-  int sep = 0;
-  int i;
-
-  for (i = 0; i < 4; ++i)
-    {
-      if (mask & 1)
-	{
-	  if (sep)
-	    *cp++ = ',';
-	  *cp++ = 'r';
-	  *cp++ = i + 4 + '0';
-	  sep = 1;
-	}
-      mask >>= 1;
-    }
-  *cp = '\0';
-}
-
-static void
-unw_print_frmask (char *cp, unsigned int mask)
-{
-  int sep = 0;
-  int i;
-
-  for (i = 0; i < 20; ++i)
-    {
-      if (mask & 1)
-	{
-	  if (sep)
-	    *cp++ = ',';
-	  *cp++ = 'f';
-	  if (i < 4)
-	    *cp++ = i + 2 + '0';
-	  else
-	    {
-	      *cp++ = (i + 2) / 10 + 1 + '0';
-	      *cp++ = (i + 2) % 10 + '0';
-	    }
-	  sep = 1;
-	}
-      mask >>= 1;
-    }
-  *cp = '\0';
-}
-
-static void
-unw_print_abreg (char *cp, unsigned int abreg)
-{
-  static const char * const special_reg[16] =
-  {
-    "pr", "psp", "@priunat", "rp", "ar.bsp", "ar.bspstore", "ar.rnat",
-    "ar.unat", "ar.fpsr", "ar.pfs", "ar.lc",
-    "Unknown11", "Unknown12", "Unknown13", "Unknown14", "Unknown15"
-  };
-
-  switch ((abreg >> 5) & 0x3)
-    {
-    case 0: /* gr */
-      sprintf (cp, "r%u", (abreg & 0x1f));
-      break;
-
-    case 1: /* fr */
-      sprintf (cp, "f%u", (abreg & 0x1f));
-      break;
-
-    case 2: /* br */
-      sprintf (cp, "b%u", (abreg & 0x1f));
-      break;
-
-    case 3: /* special */
-      strcpy (cp, special_reg[abreg & 0xf]);
-      break;
-    }
-}
-
-static void
-unw_print_xyreg (char *cp, unsigned int x, unsigned int ytreg)
-{
-  switch ((x << 1) | ((ytreg >> 7) & 1))
-    {
-    case 0: /* gr */
-      sprintf (cp, "r%u", (ytreg & 0x1f));
-      break;
-
-    case 1: /* fr */
-      sprintf (cp, "f%u", (ytreg & 0x1f));
-      break;
-
-    case 2: /* br */
-      sprintf (cp, "b%u", (ytreg & 0x1f));
-      break;
-
-    default:
-      strcpy (cp, "invalid");
-      break;
-    }
-}
-
-#define UNW_REG_BSP		"bsp"
-#define UNW_REG_BSPSTORE	"bspstore"
-#define UNW_REG_FPSR		"fpsr"
-#define UNW_REG_LC		"lc"
-#define UNW_REG_PFS		"pfs"
-#define UNW_REG_PR		"pr"
-#define UNW_REG_PSP		"psp"
-#define UNW_REG_RNAT		"rnat"
-#define UNW_REG_RP		"rp"
-#define UNW_REG_UNAT		"unat"
-
-typedef bfd_vma unw_word;
-
-#define UNW_DEC_BAD_CODE(code)			\
-  printf (_("Unknown code 0x%02x\n"), code)
-
-#define UNW_DEC_PROLOGUE(fmt, body, rlen, arg)					\
-  do										\
-    {										\
-      unw_rlen = rlen;								\
-      *(int *)arg = body;							\
-      printf ("    %s:%s(rlen=%lu)\n",						\
-	      fmt, body ? "body" : "prologue", (unsigned long) rlen);		\
-    }										\
-  while (0)
-
-#define UNW_DEC_PROLOGUE_GR(fmt, rlen, mask, grsave, arg)			\
-  do										\
-    {										\
-      char regname[16], maskstr[64], *sep;					\
-										\
-      unw_rlen = rlen;								\
-      *(int *)arg = 0;								\
-										\
-      maskstr[0] = '\0';							\
-      sep = "";									\
-      if (mask & 0x8)								\
-	{									\
-	  strcat (maskstr, "rp");						\
-	  sep = ",";								\
-	}									\
-      if (mask & 0x4)								\
-	{									\
-	  strcat (maskstr, sep);						\
-	  strcat (maskstr, "ar.pfs");						\
-	  sep = ",";								\
-	}									\
-      if (mask & 0x2)								\
-	{									\
-	  strcat (maskstr, sep);						\
-	  strcat (maskstr, "psp");						\
-	  sep = ",";								\
-	}									\
-      if (mask & 0x1)								\
-	{									\
-	  strcat (maskstr, sep);						\
-	  strcat (maskstr, "pr");						\
-	}									\
-      sprintf (regname, "r%u", grsave);						\
-      printf ("    %s:prologue_gr(mask=[%s],grsave=%s,rlen=%lu)\n",		\
-	      fmt, maskstr, regname, (unsigned long) rlen);			\
-    }										\
-  while (0)
-
-#define UNW_DEC_FR_MEM(fmt, frmask, arg)			\
-  do								\
-    {								\
-      char frstr[200];						\
-								\
-      unw_print_frmask (frstr, frmask);				\
-      printf ("\t%s:fr_mem(frmask=[%s])\n", fmt, frstr);	\
-    }								\
-  while (0)
-
-#define UNW_DEC_GR_MEM(fmt, grmask, arg)			\
-  do								\
-    {								\
-      char grstr[200];						\
-								\
-      unw_print_grmask (grstr, grmask);				\
-      printf ("\t%s:gr_mem(grmask=[%s])\n", fmt, grstr);	\
-    }								\
-  while (0)
-
-#define UNW_DEC_FRGR_MEM(fmt, grmask, frmask, arg)				\
-  do										\
-    {										\
-      char frstr[200], grstr[20];						\
-										\
-      unw_print_grmask (grstr, grmask);						\
-      unw_print_frmask (frstr, frmask);						\
-      printf ("\t%s:frgr_mem(grmask=[%s],frmask=[%s])\n", fmt, grstr, frstr);	\
-    }										\
-  while (0)
-
-#define UNW_DEC_BR_MEM(fmt, brmask, arg)				\
-  do									\
-    {									\
-      char brstr[20];							\
-									\
-      unw_print_brmask (brstr, brmask);					\
-      printf ("\t%s:br_mem(brmask=[%s])\n", fmt, brstr);		\
-    }									\
-  while (0)
-
-#define UNW_DEC_BR_GR(fmt, brmask, gr, arg)				\
-  do									\
-    {									\
-      char brstr[20];							\
-									\
-      unw_print_brmask (brstr, brmask);					\
-      printf ("\t%s:br_gr(brmask=[%s],gr=r%u)\n", fmt, brstr, gr);	\
-    }									\
-  while (0)
-
-#define UNW_DEC_REG_GR(fmt, src, dst, arg)		\
-  printf ("\t%s:%s_gr(reg=r%u)\n", fmt, src, dst)
-
-#define UNW_DEC_RP_BR(fmt, dst, arg)		\
-  printf ("\t%s:rp_br(reg=b%u)\n", fmt, dst)
-
-#define UNW_DEC_REG_WHEN(fmt, reg, t, arg)				\
-  printf ("\t%s:%s_when(t=%lu)\n", fmt, reg, (unsigned long) t)
-
-#define UNW_DEC_REG_SPREL(fmt, reg, spoff, arg)		\
-  printf ("\t%s:%s_sprel(spoff=0x%lx)\n",		\
-	  fmt, reg, 4*(unsigned long)spoff)
-
-#define UNW_DEC_REG_PSPREL(fmt, reg, pspoff, arg)		\
-  printf ("\t%s:%s_psprel(pspoff=0x10-0x%lx)\n",		\
-	  fmt, reg, 4*(unsigned long)pspoff)
-
-#define UNW_DEC_GR_GR(fmt, grmask, gr, arg)				\
-  do									\
-    {									\
-      char grstr[20];							\
-									\
-      unw_print_grmask (grstr, grmask);					\
-      printf ("\t%s:gr_gr(grmask=[%s],r%u)\n", fmt, grstr, gr);		\
-    }									\
-  while (0)
-
-#define UNW_DEC_ABI(fmt, abi, context, arg)			\
-  do								\
-    {								\
-      static const char * const abiname[] =			\
-      {								\
-	"@svr4", "@hpux", "@nt"					\
-      };							\
-      char buf[20];						\
-      const char *abistr = buf;					\
-								\
-      if (abi < 3)						\
-	abistr = abiname[abi];					\
-      else							\
-	sprintf (buf, "0x%x", abi);				\
-      printf ("\t%s:unwabi(abi=%s,context=0x%02x)\n",		\
-	      fmt, abistr, context);				\
-    }								\
-  while (0)
-
-#define UNW_DEC_PRIUNAT_GR(fmt, r, arg)		\
-  printf ("\t%s:priunat_gr(reg=r%u)\n", fmt, r)
-
-#define UNW_DEC_PRIUNAT_WHEN_GR(fmt, t, arg)				\
-  printf ("\t%s:priunat_when_gr(t=%lu)\n", fmt, (unsigned long) t)
-
-#define UNW_DEC_PRIUNAT_WHEN_MEM(fmt, t, arg)				\
-  printf ("\t%s:priunat_when_mem(t=%lu)\n", fmt, (unsigned long) t)
-
-#define UNW_DEC_PRIUNAT_PSPREL(fmt, pspoff, arg)		\
-  printf ("\t%s:priunat_psprel(pspoff=0x10-0x%lx)\n",		\
-	  fmt, 4*(unsigned long)pspoff)
-
-#define UNW_DEC_PRIUNAT_SPREL(fmt, spoff, arg)		\
-  printf ("\t%s:priunat_sprel(spoff=0x%lx)\n",		\
-	  fmt, 4*(unsigned long)spoff)
-
-#define UNW_DEC_MEM_STACK_F(fmt, t, size, arg)		\
-  printf ("\t%s:mem_stack_f(t=%lu,size=%lu)\n",		\
-	  fmt, (unsigned long) t, 16*(unsigned long)size)
-
-#define UNW_DEC_MEM_STACK_V(fmt, t, arg)				\
-  printf ("\t%s:mem_stack_v(t=%lu)\n", fmt, (unsigned long) t)
-
-#define UNW_DEC_SPILL_BASE(fmt, pspoff, arg)			\
-  printf ("\t%s:spill_base(pspoff=0x10-0x%lx)\n",		\
-	  fmt, 4*(unsigned long)pspoff)
-
-#define UNW_DEC_SPILL_MASK(fmt, dp, arg, end)				\
-  do									\
-    {									\
-      static const char *spill_type = "-frb";				\
-      unsigned const char *imaskp = dp;					\
-      unsigned char mask = 0;						\
-      bfd_vma insn = 0;							\
-      									\
-      /* PR 18420.  */							\
-      if ((dp + (unw_rlen / 4)) > end)					\
-	{								\
-	  printf (_("\nERROR: unwind length too long (0x%lx > 0x%lx)\n\n"), \
-		  (long) (unw_rlen / 4), (long)(end - dp));		\
-	  /* FIXME: Should we reset unw_rlen ?  */			\
-	  break;							\
-	}								\
-      printf ("\t%s:spill_mask(imask=[", fmt);					\
-      for (insn = 0; insn < unw_rlen; ++insn)					\
-	{									\
-	  if ((insn % 4) == 0)							\
-	    mask = *imaskp++;							\
-	  if (insn > 0 && (insn % 3) == 0)					\
-	    putchar (',');							\
-	  putchar (spill_type[(mask >> (2 * (3 - (insn & 0x3)))) & 0x3]);	\
-	}									\
-      printf ("])\n");								\
-      dp = imaskp;								\
-    }										\
-  while (0)
-
-#define UNW_DEC_SPILL_SPREL(fmt, t, abreg, spoff, arg)				\
-  do										\
-    {										\
-      char regname[20];								\
-										\
-      unw_print_abreg (regname, abreg);						\
-      printf ("\t%s:spill_sprel(reg=%s,t=%lu,spoff=0x%lx)\n",			\
-	      fmt, regname, (unsigned long) t, 4*(unsigned long)off);		\
-    }										\
-  while (0)
-
-#define UNW_DEC_SPILL_PSPREL(fmt, t, abreg, pspoff, arg)			\
-  do										\
-    {										\
-      char regname[20];								\
-										\
-      unw_print_abreg (regname, abreg);						\
-      printf ("\t%s:spill_psprel(reg=%s,t=%lu,pspoff=0x10-0x%lx)\n",		\
-	      fmt, regname, (unsigned long) t, 4*(unsigned long)pspoff);	\
-    }										\
-  while (0)
-
-#define UNW_DEC_RESTORE(fmt, t, abreg, arg)			\
-  do								\
-    {								\
-      char regname[20];						\
-								\
-      unw_print_abreg (regname, abreg);				\
-      printf ("\t%s:restore(t=%lu,reg=%s)\n",			\
-	      fmt, (unsigned long) t, regname);			\
-    }								\
-  while (0)
-
-#define UNW_DEC_SPILL_REG(fmt, t, abreg, x, ytreg, arg)		\
-  do								\
-    {								\
-      char abregname[20], tregname[20];				\
-								\
-      unw_print_abreg (abregname, abreg);			\
-      unw_print_xyreg (tregname, x, ytreg);			\
-      printf ("\t%s:spill_reg(t=%lu,reg=%s,treg=%s)\n",		\
-	      fmt, (unsigned long) t, abregname, tregname);	\
-    }								\
-  while (0)
-
-#define UNW_DEC_SPILL_SPREL_P(fmt, qp, t, abreg, spoff, arg)			    \
-  do										    \
-    {										    \
-      char regname[20];								    \
-										    \
-      unw_print_abreg (regname, abreg);						    \
-      printf ("\t%s:spill_sprel_p(qp=p%u,t=%lu,reg=%s,spoff=0x%lx)\n",		    \
-	      fmt, qp, (unsigned long) t, regname, 4 * (unsigned long)spoff);	    \
-    }										    \
-  while (0)
-
-#define UNW_DEC_SPILL_PSPREL_P(fmt, qp, t, abreg, pspoff, arg)		\
-  do									\
-    {									\
-      char regname[20];							\
-									\
-      unw_print_abreg (regname, abreg);					\
-      printf ("\t%s:spill_psprel_p(qp=p%u,t=%lu,reg=%s,pspoff=0x10-0x%lx)\n",\
-	      fmt, qp, (unsigned long) t, regname, 4*(unsigned long)pspoff);\
-    }									\
-  while (0)
-
-#define UNW_DEC_RESTORE_P(fmt, qp, t, abreg, arg)			\
-  do									\
-    {									\
-      char regname[20];							\
-									\
-      unw_print_abreg (regname, abreg);					\
-      printf ("\t%s:restore_p(qp=p%u,t=%lu,reg=%s)\n",			\
-	      fmt, qp, (unsigned long) t, regname);			\
-    }									\
-  while (0)
-
-#define UNW_DEC_SPILL_REG_P(fmt, qp, t, abreg, x, ytreg, arg)		\
-  do									\
-    {									\
-      char regname[20], tregname[20];					\
-									\
-      unw_print_abreg (regname, abreg);					\
-      unw_print_xyreg (tregname, x, ytreg);				\
-      printf ("\t%s:spill_reg_p(qp=p%u,t=%lu,reg=%s,treg=%s)\n",	\
-	      fmt, qp, (unsigned long) t, regname, tregname);		\
-    }									\
-  while (0)
-
-#define UNW_DEC_LABEL_STATE(fmt, label, arg)				\
-  printf ("\t%s:label_state(label=%lu)\n", fmt, (unsigned long) label)
-
-#define UNW_DEC_COPY_STATE(fmt, label, arg)				\
-  printf ("\t%s:copy_state(label=%lu)\n", fmt, (unsigned long) label)
-
-#define UNW_DEC_EPILOGUE(fmt, t, ecount, arg)		\
-  printf ("\t%s:epilogue(t=%lu,ecount=%lu)\n",		\
-	  fmt, (unsigned long) t, (unsigned long) ecount)
-
-/*
- * Generic IA-64 unwind info decoder.
- *
- * This file is used both by the Linux kernel and objdump.  Please
- * keep the two copies of this file in sync (modulo differences in the
- * prototypes...).
- *
- * You need to customize the decoder by defining the following
- * macros/constants before including this file:
- *
- *  Types:
- *	unw_word	Unsigned integer type with at least 64 bits
- *
- *  Register names:
- *	UNW_REG_BSP
- *	UNW_REG_BSPSTORE
- *	UNW_REG_FPSR
- *	UNW_REG_LC
- *	UNW_REG_PFS
- *	UNW_REG_PR
- *	UNW_REG_RNAT
- *	UNW_REG_PSP
- *	UNW_REG_RP
- *	UNW_REG_UNAT
- *
- *  Decoder action macros:
- *	UNW_DEC_BAD_CODE(code)
- *	UNW_DEC_ABI(fmt,abi,context,arg)
- *	UNW_DEC_BR_GR(fmt,brmask,gr,arg)
- *	UNW_DEC_BR_MEM(fmt,brmask,arg)
- *	UNW_DEC_COPY_STATE(fmt,label,arg)
- *	UNW_DEC_EPILOGUE(fmt,t,ecount,arg)
- *	UNW_DEC_FRGR_MEM(fmt,grmask,frmask,arg)
- *	UNW_DEC_FR_MEM(fmt,frmask,arg)
- *	UNW_DEC_GR_GR(fmt,grmask,gr,arg)
- *	UNW_DEC_GR_MEM(fmt,grmask,arg)
- *	UNW_DEC_LABEL_STATE(fmt,label,arg)
- *	UNW_DEC_MEM_STACK_F(fmt,t,size,arg)
- *	UNW_DEC_MEM_STACK_V(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_GR(fmt,r,arg)
- *	UNW_DEC_PRIUNAT_WHEN_GR(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_WHEN_MEM(fmt,t,arg)
- *	UNW_DEC_PRIUNAT_WHEN_PSPREL(fmt,pspoff,arg)
- *	UNW_DEC_PRIUNAT_WHEN_SPREL(fmt,spoff,arg)
- *	UNW_DEC_PROLOGUE(fmt,body,rlen,arg)
- *	UNW_DEC_PROLOGUE_GR(fmt,rlen,mask,grsave,arg)
- *	UNW_DEC_REG_PSPREL(fmt,reg,pspoff,arg)
- *	UNW_DEC_REG_REG(fmt,src,dst,arg)
- *	UNW_DEC_REG_SPREL(fmt,reg,spoff,arg)
- *	UNW_DEC_REG_WHEN(fmt,reg,t,arg)
- *	UNW_DEC_RESTORE(fmt,t,abreg,arg)
- *	UNW_DEC_RESTORE_P(fmt,qp,t,abreg,arg)
- *	UNW_DEC_SPILL_BASE(fmt,pspoff,arg)
- *	UNW_DEC_SPILL_MASK(fmt,imaskp,arg)
- *	UNW_DEC_SPILL_PSPREL(fmt,t,abreg,pspoff,arg)
- *	UNW_DEC_SPILL_PSPREL_P(fmt,qp,t,abreg,pspoff,arg)
- *	UNW_DEC_SPILL_REG(fmt,t,abreg,x,ytreg,arg)
- *	UNW_DEC_SPILL_REG_P(fmt,qp,t,abreg,x,ytreg,arg)
- *	UNW_DEC_SPILL_SPREL(fmt,t,abreg,spoff,arg)
- *	UNW_DEC_SPILL_SPREL_P(fmt,qp,t,abreg,pspoff,arg)
- */
-
-static unw_word
-unw_decode_uleb128 (const unsigned char **dpp, const unsigned char * end)
-{
-  unsigned shift = 0;
-  int status = 1;
-  unw_word byte, result = 0;
-  const unsigned char *bp = *dpp;
-
-  while (bp < end)
-    {
-      byte = *bp++;
-      if (shift < sizeof (result) * 8)
-	{
-	  result |= (byte & 0x7f) << shift;
-	  if ((result >> shift) != (byte & 0x7f))
-	    /* Overflow.  */
-	    status |= 2;
-	  shift += 7;
-	}
-      else if ((byte & 0x7f) != 0)
-	status |= 2;
-
-      if ((byte & 0x80) == 0)
-	{
-	  status &= ~1;
-	  break;
-	}
-    }
-
-  *dpp = bp;
-  if (status != 0)
-    printf (_("Bad uleb128\n"));
-
-  return result;
-}
-
-static const unsigned char *
-unw_decode_x1 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
-	       void *arg ATTRIBUTE_UNUSED, const unsigned char * end)
-{
-  unsigned char byte1, abreg;
-  unw_word t, off;
-
-  if ((end - dp) < 3)
-    {
-      printf (_("\t<corrupt X1>\n"));
-      return end;
-    }
-
-  byte1 = *dp++;
-  t = unw_decode_uleb128 (&dp, end);
-  off = unw_decode_uleb128 (&dp, end);
-  abreg = (byte1 & 0x7f);
-  if (byte1 & 0x80)
-    UNW_DEC_SPILL_SPREL ("X1", t, abreg, off, arg);
-  else
-    UNW_DEC_SPILL_PSPREL ("X1", t, abreg, off, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_x2 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
-	       void *arg ATTRIBUTE_UNUSED, const unsigned char * end)
-{
-  unsigned char byte1, byte2, abreg, x, ytreg;
-  unw_word t;
-
-  if ((end - dp) < 3)
-    {
-      printf (_("\t<corrupt X2>\n"));
-      return end;
-    }
-
-  byte1 = *dp++;
-  byte2 = *dp++;
-  t = unw_decode_uleb128 (&dp, end);
-  abreg = (byte1 & 0x7f);
-  ytreg = byte2;
-  x = (byte1 >> 7) & 1;
-  if ((byte1 & 0x80) == 0 && ytreg == 0)
-    UNW_DEC_RESTORE ("X2", t, abreg, arg);
-  else
-    UNW_DEC_SPILL_REG ("X2", t, abreg, x, ytreg, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_x3 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
-	       void *arg ATTRIBUTE_UNUSED, const unsigned char * end)
-{
-  unsigned char byte1, byte2, abreg, qp;
-  unw_word t, off;
-
-  if ((end - dp) < 4)
-    {
-      printf (_("\t<corrupt X3>\n"));
-      return end;
-    }
-
-  byte1 = *dp++;
-  byte2 = *dp++;
-  t = unw_decode_uleb128 (&dp, end);
-  off = unw_decode_uleb128 (&dp, end);
-
-  qp = (byte1 & 0x3f);
-  abreg = (byte2 & 0x7f);
-
-  if (byte1 & 0x80)
-    UNW_DEC_SPILL_SPREL_P ("X3", qp, t, abreg, off, arg);
-  else
-    UNW_DEC_SPILL_PSPREL_P ("X3", qp, t, abreg, off, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_x4 (const unsigned char *dp, unsigned int code ATTRIBUTE_UNUSED,
-	       void *arg ATTRIBUTE_UNUSED, const unsigned char * end)
-{
-  unsigned char byte1, byte2, byte3, qp, abreg, x, ytreg;
-  unw_word t;
-
-  if ((end - dp) < 4)
-    {
-      printf (_("\t<corrupt X4>\n"));
-      return end;
-    }
-
-  byte1 = *dp++;
-  byte2 = *dp++;
-  byte3 = *dp++;
-  t = unw_decode_uleb128 (&dp, end);
-
-  qp = (byte1 & 0x3f);
-  abreg = (byte2 & 0x7f);
-  x = (byte2 >> 7) & 1;
-  ytreg = byte3;
-
-  if ((byte2 & 0x80) == 0 && byte3 == 0)
-    UNW_DEC_RESTORE_P ("X4", qp, t, abreg, arg);
-  else
-    UNW_DEC_SPILL_REG_P ("X4", qp, t, abreg, x, ytreg, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_r1 (const unsigned char *dp, unsigned int code, void *arg,
-	       const unsigned char * end ATTRIBUTE_UNUSED)
-{
-  int body = (code & 0x20) != 0;
-  unw_word rlen;
-
-  rlen = (code & 0x1f);
-  UNW_DEC_PROLOGUE ("R1", body, rlen, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_r2 (const unsigned char *dp, unsigned int code, void *arg,
-	       const unsigned char * end)
-{
-  unsigned char byte1, mask, grsave;
-  unw_word rlen;
-
-  if ((end - dp) < 2)
-    {
-      printf (_("\t<corrupt R2>\n"));
-      return end;
-    }
-
-  byte1 = *dp++;
-
-  mask = ((code & 0x7) << 1) | ((byte1 >> 7) & 1);
-  grsave = (byte1 & 0x7f);
-  rlen = unw_decode_uleb128 (& dp, end);
-  UNW_DEC_PROLOGUE_GR ("R2", rlen, mask, grsave, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_r3 (const unsigned char *dp, unsigned int code, void *arg,
-	       const unsigned char * end)
-{
-  unw_word rlen;
-
-  rlen = unw_decode_uleb128 (& dp, end);
-  UNW_DEC_PROLOGUE ("R3", ((code & 0x3) == 1), rlen, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_p1 (const unsigned char *dp, unsigned int code,
-	       void *arg ATTRIBUTE_UNUSED,
-	       const unsigned char * end ATTRIBUTE_UNUSED)
-{
-  unsigned char brmask = (code & 0x1f);
-
-  UNW_DEC_BR_MEM ("P1", brmask, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_p2_p5 (const unsigned char *dp, unsigned int code,
-		  void *arg ATTRIBUTE_UNUSED,
-		  const unsigned char * end)
-{
-  if ((code & 0x10) == 0)
-    {
-      unsigned char byte1;
-
-      if ((end - dp) < 1)
-	{
-	  printf (_("\t<corrupt P2>\n"));
-	  return end;
-	}
-
-      byte1 = *dp++;
-
-      UNW_DEC_BR_GR ("P2", ((code & 0xf) << 1) | ((byte1 >> 7) & 1),
-		     (byte1 & 0x7f), arg);
-    }
-  else if ((code & 0x08) == 0)
-    {
-      unsigned char byte1, r, dst;
-
-      if ((end - dp) < 1)
-	{
-	  printf (_("\t<corrupt P3>\n"));
-	  return end;
-	}
-
-      byte1 = *dp++;
-
-      r = ((code & 0x7) << 1) | ((byte1 >> 7) & 1);
-      dst = (byte1 & 0x7f);
-      switch (r)
-	{
-	case 0:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_PSP, dst, arg);
-	  break;
-	case 1:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_RP, dst, arg);
-	  break;
-	case 2:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_PFS, dst, arg);
-	  break;
-	case 3:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_PR, dst, arg);
-	  break;
-	case 4:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_UNAT, dst, arg);
-	  break;
-	case 5:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_LC, dst, arg);
-	  break;
-	case 6:
-	  UNW_DEC_RP_BR ("P3", dst, arg);
-	  break;
-	case 7:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_RNAT, dst, arg);
-	  break;
-	case 8:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_BSP, dst, arg);
-	  break;
-	case 9:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_BSPSTORE, dst, arg);
-	  break;
-	case 10:
-	  UNW_DEC_REG_GR ("P3", UNW_REG_FPSR, dst, arg);
-	  break;
-	case 11:
-	  UNW_DEC_PRIUNAT_GR ("P3", dst, arg);
-	  break;
-	default:
-	  UNW_DEC_BAD_CODE (r);
-	  break;
-	}
-    }
-  else if ((code & 0x7) == 0)
-    UNW_DEC_SPILL_MASK ("P4", dp, arg, end);
-  else if ((code & 0x7) == 1)
-    {
-      unw_word grmask, frmask, byte1, byte2, byte3;
-
-      if ((end - dp) < 3)
-	{
-	  printf (_("\t<corrupt P5>\n"));
-	  return end;
-	}
-      byte1 = *dp++;
-      byte2 = *dp++;
-      byte3 = *dp++;
-      grmask = ((byte1 >> 4) & 0xf);
-      frmask = ((byte1 & 0xf) << 16) | (byte2 << 8) | byte3;
-      UNW_DEC_FRGR_MEM ("P5", grmask, frmask, arg);
-    }
-  else
-    UNW_DEC_BAD_CODE (code);
-
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_p6 (const unsigned char *dp, unsigned int code,
-	       void *arg ATTRIBUTE_UNUSED,
-	       const unsigned char * end ATTRIBUTE_UNUSED)
-{
-  int gregs = (code & 0x10) != 0;
-  unsigned char mask = (code & 0x0f);
-
-  if (gregs)
-    UNW_DEC_GR_MEM ("P6", mask, arg);
-  else
-    UNW_DEC_FR_MEM ("P6", mask, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_p7_p10 (const unsigned char *dp, unsigned int code, void *arg,
-		   const unsigned char * end)
-{
-  unsigned char r, byte1, byte2;
-  unw_word t, size;
-
-  if ((code & 0x10) == 0)
-    {
-      r = (code & 0xf);
-      t = unw_decode_uleb128 (&dp, end);
-      switch (r)
-	{
-	case 0:
-	  size = unw_decode_uleb128 (&dp, end);
-	  UNW_DEC_MEM_STACK_F ("P7", t, size, arg);
-	  break;
-
-	case 1:
-	  UNW_DEC_MEM_STACK_V ("P7", t, arg);
-	  break;
-	case 2:
-	  UNW_DEC_SPILL_BASE ("P7", t, arg);
-	  break;
-	case 3:
-	  UNW_DEC_REG_SPREL ("P7", UNW_REG_PSP, t, arg);
-	  break;
-	case 4:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_RP, t, arg);
-	  break;
-	case 5:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_RP, t, arg);
-	  break;
-	case 6:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_PFS, t, arg);
-	  break;
-	case 7:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_PFS, t, arg);
-	  break;
-	case 8:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_PR, t, arg);
-	  break;
-	case 9:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_PR, t, arg);
-	  break;
-	case 10:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_LC, t, arg);
-	  break;
-	case 11:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_LC, t, arg);
-	  break;
-	case 12:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_UNAT, t, arg);
-	  break;
-	case 13:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_UNAT, t, arg);
-	  break;
-	case 14:
-	  UNW_DEC_REG_WHEN ("P7", UNW_REG_FPSR, t, arg);
-	  break;
-	case 15:
-	  UNW_DEC_REG_PSPREL ("P7", UNW_REG_FPSR, t, arg);
-	  break;
-	default:
-	  UNW_DEC_BAD_CODE (r);
-	  break;
-	}
-    }
-  else
-    {
-      switch (code & 0xf)
-	{
-	case 0x0:		/* p8 */
-	  {
-	    if ((end - dp) < 2)
-	      {
-		printf (_("\t<corrupt P8>\n"));
-		return end;
-	      }
-
-	    r = *dp++;
-	    t = unw_decode_uleb128 (&dp, end);
-	    switch (r)
-	      {
-	      case 1:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_RP, t, arg);
-		break;
-	      case 2:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_PFS, t, arg);
-		break;
-	      case 3:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_PR, t, arg);
-		break;
-	      case 4:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_LC, t, arg);
-		break;
-	      case 5:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_UNAT, t, arg);
-		break;
-	      case 6:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_FPSR, t, arg);
-		break;
-	      case 7:
-		UNW_DEC_REG_WHEN ("P8", UNW_REG_BSP, t, arg);
-		break;
-	      case 8:
-		UNW_DEC_REG_PSPREL ("P8", UNW_REG_BSP, t, arg);
-		break;
-	      case 9:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_BSP, t, arg);
-		break;
-	      case 10:
-		UNW_DEC_REG_WHEN ("P8", UNW_REG_BSPSTORE, t, arg);
-		break;
-	      case 11:
-		UNW_DEC_REG_PSPREL ("P8", UNW_REG_BSPSTORE, t, arg);
-		break;
-	      case 12:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_BSPSTORE, t, arg);
-		break;
-	      case 13:
-		UNW_DEC_REG_WHEN ("P8", UNW_REG_RNAT, t, arg);
-		break;
-	      case 14:
-		UNW_DEC_REG_PSPREL ("P8", UNW_REG_RNAT, t, arg);
-		break;
-	      case 15:
-		UNW_DEC_REG_SPREL ("P8", UNW_REG_RNAT, t, arg);
-		break;
-	      case 16:
-		UNW_DEC_PRIUNAT_WHEN_GR ("P8", t, arg);
-		break;
-	      case 17:
-		UNW_DEC_PRIUNAT_PSPREL ("P8", t, arg);
-		break;
-	      case 18:
-		UNW_DEC_PRIUNAT_SPREL ("P8", t, arg);
-		break;
-	      case 19:
-		UNW_DEC_PRIUNAT_WHEN_MEM ("P8", t, arg);
-		break;
-	      default:
-		UNW_DEC_BAD_CODE (r);
-		break;
-	      }
-	  }
-	  break;
-
-	case 0x1:
-	  if ((end - dp) < 2)
-	    {
-	      printf (_("\t<corrupt P9>\n"));
-	      return end;
-	    }
-
-	  byte1 = *dp++;
-	  byte2 = *dp++;
-	  UNW_DEC_GR_GR ("P9", (byte1 & 0xf), (byte2 & 0x7f), arg);
-	  break;
-
-	case 0xf:		/* p10 */
-	  if ((end - dp) < 2)
-	    {
-	      printf (_("\t<corrupt P10>\n"));
-	      return end;
-	    }
-
-	  byte1 = *dp++;
-	  byte2 = *dp++;
-	  UNW_DEC_ABI ("P10", byte1, byte2, arg);
-	  break;
-
-	case 0x9:
-	  return unw_decode_x1 (dp, code, arg, end);
-
-	case 0xa:
-	  return unw_decode_x2 (dp, code, arg, end);
-
-	case 0xb:
-	  return unw_decode_x3 (dp, code, arg, end);
-
-	case 0xc:
-	  return unw_decode_x4 (dp, code, arg, end);
-
-	default:
-	  UNW_DEC_BAD_CODE (code);
-	  break;
-	}
-    }
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_b1 (const unsigned char *dp, unsigned int code,
-	       void *arg ATTRIBUTE_UNUSED,
-	       const unsigned char * end ATTRIBUTE_UNUSED)
-{
-  unw_word label = (code & 0x1f);
-
-  if ((code & 0x20) != 0)
-    UNW_DEC_COPY_STATE ("B1", label, arg);
-  else
-    UNW_DEC_LABEL_STATE ("B1", label, arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_b2 (const unsigned char *dp, unsigned int code,
-	       void *arg ATTRIBUTE_UNUSED,
-	       const unsigned char * end)
-{
-  unw_word t;
-
-  t = unw_decode_uleb128 (& dp, end);
-  UNW_DEC_EPILOGUE ("B2", t, (code & 0x1f), arg);
-  return dp;
-}
-
-static const unsigned char *
-unw_decode_b3_x4 (const unsigned char *dp, unsigned int code, void *arg,
-		  const unsigned char * end)
-{
-  unw_word t, ecount, label;
-
-  if ((code & 0x10) == 0)
-    {
-      t = unw_decode_uleb128 (&dp, end);
-      ecount = unw_decode_uleb128 (&dp, end);
-      UNW_DEC_EPILOGUE ("B3", t, ecount, arg);
-    }
-  else if ((code & 0x07) == 0)
-    {
-      label = unw_decode_uleb128 (&dp, end);
-      if ((code & 0x08) != 0)
-	UNW_DEC_COPY_STATE ("B4", label, arg);
-      else
-	UNW_DEC_LABEL_STATE ("B4", label, arg);
-    }
-  else
-    switch (code & 0x7)
-      {
-      case 1:
-	return unw_decode_x1 (dp, code, arg, end);
-      case 2:
-	return unw_decode_x2 (dp, code, arg, end);
-      case 3:
-	return unw_decode_x3 (dp, code, arg, end);
-      case 4:
-	return unw_decode_x4 (dp, code, arg, end);
-      default:
-	UNW_DEC_BAD_CODE (code);
-	break;
-      }
-  return dp;
-}
-
-typedef const unsigned char *(*unw_decoder)
-  (const unsigned char *, unsigned int, void *, const unsigned char *);
-
-static const unw_decoder unw_decode_table[2][8] =
-  {
-    /* prologue table: */
-    {
-      unw_decode_r1,		/* 0 */
-      unw_decode_r1,
-      unw_decode_r2,
-      unw_decode_r3,
-      unw_decode_p1,		/* 4 */
-      unw_decode_p2_p5,
-      unw_decode_p6,
-      unw_decode_p7_p10
-    },
-    {
-      unw_decode_r1,		/* 0 */
-      unw_decode_r1,
-      unw_decode_r2,
-      unw_decode_r3,
-      unw_decode_b1,		/* 4 */
-      unw_decode_b1,
-      unw_decode_b2,
-      unw_decode_b3_x4
-    }
-  };
-
-/* Decode one descriptor and return address of next descriptor.  */
-const unsigned char *
-unw_decode (const unsigned char *dp, int inside_body,
-	    void *ptr_inside_body, const unsigned char * end)
-{
-  unw_decoder decoder;
-  unsigned char code;
-
-  if ((end - dp) < 1)
-    {
-      printf (_("\t<corrupt IA64 descriptor>\n"));
-      return end;
-    }
-
-  code = *dp++;
-  decoder = unw_decode_table[inside_body][code >> 5];
-  return (*decoder) (dp, code, ptr_inside_body, end);
-}
diff --git a/binutils/unwind-ia64.h b/binutils/unwind-ia64.h
deleted file mode 100644
index 61965e011bd..00000000000
--- a/binutils/unwind-ia64.h
+++ /dev/null
@@ -1,32 +0,0 @@ 
-/* unwind-ia64.h -- dump IA-64 unwind info.
-   Copyright (C) 2000-2024 Free Software Foundation, Inc.
-	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of GNU Binutils.
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   This program is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, 51 Franklin Street - Fifth Floor, Boston,
-   MA 02110-1301, USA.  */
-
-#include "elf/ia64.h"
-#include "ansidecl.h"
-
-#define UNW_VER(x)		((x) >> 48)
-#define UNW_FLAG_MASK		0x0000ffff00000000LL
-#define UNW_FLAG_OSMASK		0x0000f00000000000LL
-#define UNW_FLAG_EHANDLER(x)	((x) & 0x0000000100000000LL)
-#define UNW_FLAG_UHANDLER(x)	((x) & 0x0000000200000000LL)
-#define UNW_LENGTH(x)		((x) & 0x00000000ffffffffLL)
-
-extern const unsigned char *unw_decode (const unsigned char *, int, void *, const unsigned char *);
diff --git a/config.guess b/config.guess
index cdfc4392047..faeb058a5a3 100755
--- a/config.guess
+++ b/config.guess
@@ -618,14 +618,6 @@  EOF
     i*86:AIX:*:*)
 	GUESS=i386-ibm-aix
 	;;
-    ia64:AIX:*:*)
-	if test -x /usr/bin/oslevel ; then
-		IBM_REV=`/usr/bin/oslevel`
-	else
-		IBM_REV=$UNAME_VERSION.$UNAME_RELEASE
-	fi
-	GUESS=$UNAME_MACHINE-ibm-aix$IBM_REV
-	;;
     *:AIX:2:3)
 	if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
 		set_cc_for_build
@@ -770,10 +762,6 @@  EOF
 	fi
 	GUESS=$HP_ARCH-hp-hpux$HPUX_REV
 	;;
-    ia64:HP-UX:*:*)
-	HPUX_REV=`echo "$UNAME_RELEASE" | sed -e 's/[^.]*.[0B]*//'`
-	GUESS=ia64-hp-hpux$HPUX_REV
-	;;
     3050*:HI-UX:*:*)
 	set_cc_for_build
 	sed 's/^	//' << EOF > "$dummy.c"
@@ -944,9 +932,6 @@  EOF
 	    authenticamd | genuineintel | EM64T)
 		GUESS=x86_64-unknown-interix$UNAME_RELEASE
 		;;
-	    IA64)
-		GUESS=ia64-unknown-interix$UNAME_RELEASE
-		;;
 	esac ;;
     i*:UWIN*:*)
 	GUESS=$UNAME_MACHINE-pc-uwin
@@ -1060,9 +1045,6 @@  EOF
     i*86:Linux:*:*)
 	GUESS=$UNAME_MACHINE-pc-linux-$LIBC
 	;;
-    ia64:Linux:*:*)
-	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
-	;;
     k1om:Linux:*:*)
 	GUESS=$UNAME_MACHINE-unknown-linux-$LIBC
 	;;
@@ -1565,7 +1547,6 @@  EOF
 	UNAME_MACHINE=`(uname -p) 2>/dev/null`
 	case $UNAME_MACHINE in
 	    A*) GUESS=alpha-dec-vms ;;
-	    I*) GUESS=ia64-dec-vms ;;
 	    V*) GUESS=vax-dec-vms ;;
 	esac ;;
     *:XENIX:*:SysV)
diff --git a/config.rpath b/config.rpath
index 4dea75957c2..aa878254457 100755
--- a/config.rpath
+++ b/config.rpath
@@ -127,9 +127,7 @@  if test "$with_gnu_ld" = yes; then
   case "$host_os" in
     aix[3-9]*)
       # On AIX/PPC, the GNU linker is very broken
-      if test "$host_cpu" != ia64; then
-        ld_shlibs=no
-      fi
+      ld_shlibs=no
       ;;
     amigaos*)
       hardcode_libdir_flag_spec='-L$libdir'
@@ -199,11 +197,6 @@  else
       fi
       ;;
     aix[4-9]*)
-      if test "$host_cpu" = ia64; then
-        # On IA64, the linker does run time linking by default, so we don't
-        # have to do anything special.
-        aix_use_runtimelinking=no
-      else
         aix_use_runtimelinking=no
         # Test if we are trying to use run time linking or normal
         # AIX style linking. If -brtl is somewhere in LDFLAGS, we
@@ -216,7 +209,6 @@  else
             fi
           done
         esac
-      fi
       hardcode_direct=yes
       hardcode_libdir_separator=':'
       if test "$GCC" = yes; then
@@ -250,15 +242,7 @@  else
       fi
       rm -f conftest.c conftest
       # End _LT_AC_SYS_LIBPATH_AIX.
-      if test "$aix_use_runtimelinking" = yes; then
-        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-      else
-        if test "$host_cpu" = ia64; then
-          hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'
-        else
-          hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
-        fi
-      fi
+      hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath"
       ;;
     amigaos*)
       hardcode_libdir_flag_spec='-L$libdir'
@@ -312,13 +296,6 @@  else
             hardcode_libdir_separator=:
             hardcode_direct=no
             ;;
-          ia64*)
-            hardcode_libdir_flag_spec='-L$libdir'
-            hardcode_direct=no
-            # hardcode_minus_L: Not really in the search PATH,
-            # but as the default location of the library.
-            hardcode_minus_L=yes
-            ;;
           *)
             hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'
             hardcode_libdir_separator=:
@@ -451,9 +428,6 @@  case "$host_os" in
     ;;
   hpux9* | hpux10* | hpux11*)
     case "$host_cpu" in
-      ia64*)
-        shrext=.so
-        ;;
       hppa*64*)
         shrext=.sl
         ;;
diff --git a/config.sub b/config.sub
index defe52c0c87..d7a76e7a1af 100755
--- a/config.sub
+++ b/config.sub
@@ -1204,7 +1204,7 @@  case $cpu-$vendor in
 			| h8300 | h8500 \
 			| hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
 			| hexagon \
-			| i370 | i*86 | i860 | i960 | ia16 | ia64 \
+			| i370 | i*86 | i860 | i960 \
 			| ip2k | iq2000 \
 			| k1om \
 			| kvx \
diff --git a/config/picflag.m4 b/config/picflag.m4
index 3f3ac744c96..7f43f4c553d 100644
--- a/config/picflag.m4
+++ b/config/picflag.m4
@@ -39,11 +39,6 @@  case "${$2}" in
     i[[34567]]86-pc-msdosdjgpp*)
 	# DJGPP does not support shared libraries at all.
 	;;
-    ia64*-*-hpux*)
-	# On IA64 HP-UX, PIC is the default but the pic flag
-	# sets the default TLS model and affects inlining.
-	$1=-fPIC
-	;;
     loongarch*-*-*)
 	$1=-fpic
 	;;
diff --git a/config/tcl.m4 b/config/tcl.m4
index 4542a4b23d7..95815bc4aea 100644
--- a/config/tcl.m4
+++ b/config/tcl.m4
@@ -1103,18 +1103,6 @@  dnl AC_CHECK_TOOL(AR, ar)
 		fi
 	    fi
 
-	    if test "`uname -m`" = "ia64" ; then
-		# AIX-5 uses ELF style dynamic libraries on IA-64, but not PPC
-		SHLIB_LD="/usr/ccs/bin/ld -G -z text"
-		# AIX-5 has dl* in libc.so
-		DL_LIBS=""
-		if test "$GCC" = "yes" ; then
-		    CC_SEARCH_FLAGS='-Wl,-R,${LIB_RUNTIME_DIR}'
-		else
-		    CC_SEARCH_FLAGS='-R${LIB_RUNTIME_DIR}'
-		fi
-		LD_SEARCH_FLAGS='-R ${LIB_RUNTIME_DIR}'
-	    else
 		if test "$GCC" = "yes" ; then
 		    SHLIB_LD="gcc -shared"
 		else
@@ -1126,7 +1114,6 @@  dnl AC_CHECK_TOOL(AR, ar)
 		LD_SEARCH_FLAGS=${CC_SEARCH_FLAGS}
 		TCL_NEEDS_EXP_FILE=1
 		TCL_EXPORT_FILE_SUFFIX='${VERSION}\$\{DBGX\}.exp'
-	    fi
 
 	    # AIX v<=4.1 has some different flags than 4.2+
 	    if test "$system" = "AIX-4.1" -o "`uname -v`" -lt "4" ; then
@@ -1204,11 +1191,7 @@  dnl AC_CHECK_TOOL(AR, ar)
 	    AC_DEFINE(_XOPEN_SOURCE_EXTENDED) # Use the XOPEN network library
 	    LIBS="$LIBS -lxnet"               # Use the XOPEN network library
 
-	    if test "`uname -m`" = "ia64" ; then
-		SHLIB_SUFFIX=".so"
-	    else
-		SHLIB_SUFFIX=".sl"
-	    fi
+	    SHLIB_SUFFIX=".sl"
 	    AC_CHECK_LIB(dld, shl_load, tcl_ok=yes, tcl_ok=no)
 	    if test "$tcl_ok" = yes; then
 		SHLIB_CFLAGS="+z"
diff --git a/config/unwind_ipinfo.m4 b/config/unwind_ipinfo.m4
index efc79903b77..c41d7051f01 100644
--- a/config/unwind_ipinfo.m4
+++ b/config/unwind_ipinfo.m4
@@ -11,14 +11,12 @@  AC_DEFUN([GCC_CHECK_UNWIND_GETIPINFO], [
   # If system-libunwind was not specifically set, pick a default setting.
   if test x$with_system_libunwind = x; then
     case ${target} in
-      ia64-*-hpux*) with_system_libunwind=yes ;;
       *) with_system_libunwind=no ;;
     esac
   fi
   # Based on system-libunwind and target, do we have ipinfo?
   if  test x$with_system_libunwind = xyes; then
     case ${target} in
-      ia64-*-*) have_unwind_getipinfo=no ;;
       *) have_unwind_getipinfo=yes ;;
     esac
   else
diff --git a/configure b/configure
index 6466b97f3ec..2b96ad2ae89 100755
--- a/configure
+++ b/configure
@@ -3578,9 +3578,6 @@  case "${target}" in
   hppa*-*-hpux*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
-  ia64*-*-*vms*)
-    noconfigdirs="$noconfigdirs target-libffi"
-    ;;
   i[3456789]86-w64-mingw*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
@@ -3918,18 +3915,6 @@  case "${target}" in
   i960-*-*)
     noconfigdirs="$noconfigdirs gdb"
     ;;
-  ia64*-*-elf*)
-    # No gdb support yet.
-    noconfigdirs="$noconfigdirs readline libgui itcl gdb"
-    ;;
-  ia64*-**-hpux*)
-    # No ld support yet.
-    noconfigdirs="$noconfigdirs gdb libgui itcl ld"
-    ;;
-  ia64*-*-*vms*)
-    # No ld support yet.
-    noconfigdirs="$noconfigdirs libgui itcl ld"
-    ;;
   i[3456789]86-w64-mingw*)
     ;;
   i[3456789]86-*-mingw*)
diff --git a/configure.ac b/configure.ac
index 1300a805fd8..5e841ca411b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -808,9 +808,6 @@  case "${target}" in
   hppa*-*-hpux*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
-  ia64*-*-*vms*)
-    noconfigdirs="$noconfigdirs target-libffi"
-    ;;
   i[[3456789]]86-w64-mingw*)
     noconfigdirs="$noconfigdirs target-libffi"
     ;;
@@ -1145,18 +1142,6 @@  case "${target}" in
   i960-*-*)
     noconfigdirs="$noconfigdirs gdb"
     ;;
-  ia64*-*-elf*)
-    # No gdb support yet.
-    noconfigdirs="$noconfigdirs readline libgui itcl gdb"
-    ;;
-  ia64*-**-hpux*)
-    # No ld support yet.
-    noconfigdirs="$noconfigdirs gdb libgui itcl ld"
-    ;;
-  ia64*-*-*vms*)
-    # No ld support yet.
-    noconfigdirs="$noconfigdirs libgui itcl ld"
-    ;;
   i[[3456789]]86-w64-mingw*)
     ;;
   i[[3456789]]86-*-mingw*)
diff --git a/gas/Makefile.am b/gas/Makefile.am
index 37ca0952f7e..b34caf17264 100644
--- a/gas/Makefile.am
+++ b/gas/Makefile.am
@@ -162,7 +162,6 @@  TARGET_CPU_CFILES = \
 	config/tc-ft32.c \
 	config/tc-h8300.c \
 	config/tc-hppa.c \
-	config/tc-ia64.c \
 	config/tc-i386.c \
 	config/tc-ip2k.c \
 	config/tc-iq2000.c \
@@ -238,7 +237,6 @@  TARGET_CPU_HFILES = \
 	config/tc-ft32.h \
 	config/tc-h8300.h \
 	config/tc-hppa.h \
-	config/tc-ia64.h \
 	config/tc-i386.h \
 	config/tc-ip2k.h \
 	config/tc-iq2000.h \
@@ -342,7 +340,6 @@  TARG_ENV_HFILES = \
 	config/te-hppa.h \
 	config/te-hppa64.h \
 	config/te-hppalinux64.h \
-	config/te-ia64aix.h \
 	config/te-interix.h \
 	config/te-lynx.h \
 	config/te-macos.h \
diff --git a/gas/Makefile.in b/gas/Makefile.in
index bc25765cb5b..f7b3721cfe3 100644
--- a/gas/Makefile.in
+++ b/gas/Makefile.in
@@ -661,7 +661,6 @@  TARGET_CPU_CFILES = \
 	config/tc-ft32.c \
 	config/tc-h8300.c \
 	config/tc-hppa.c \
-	config/tc-ia64.c \
 	config/tc-i386.c \
 	config/tc-ip2k.c \
 	config/tc-iq2000.c \
@@ -737,7 +736,6 @@  TARGET_CPU_HFILES = \
 	config/tc-ft32.h \
 	config/tc-h8300.h \
 	config/tc-hppa.h \
-	config/tc-ia64.h \
 	config/tc-i386.h \
 	config/tc-ip2k.h \
 	config/tc-iq2000.h \
@@ -841,7 +839,6 @@  TARG_ENV_HFILES = \
 	config/te-hppa.h \
 	config/te-hppa64.h \
 	config/te-hppalinux64.h \
-	config/te-ia64aix.h \
 	config/te-interix.h \
 	config/te-lynx.h \
 	config/te-macos.h \
@@ -1143,8 +1140,6 @@  config/tc-h8300.$(OBJEXT): config/$(am__dirstamp) \
 	config/$(DEPDIR)/$(am__dirstamp)
 config/tc-hppa.$(OBJEXT): config/$(am__dirstamp) \
 	config/$(DEPDIR)/$(am__dirstamp)
-config/tc-ia64.$(OBJEXT): config/$(am__dirstamp) \
-	config/$(DEPDIR)/$(am__dirstamp)
 config/tc-i386.$(OBJEXT): config/$(am__dirstamp) \
 	config/$(DEPDIR)/$(am__dirstamp)
 config/tc-ip2k.$(OBJEXT): config/$(am__dirstamp) \
@@ -1410,7 +1405,6 @@  distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-h8300.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-hppa.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-i386.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-ia64.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-ip2k.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-iq2000.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@config/$(DEPDIR)/tc-kvx.Po@am__quote@
diff --git a/gas/config/obj-coff-seh.c b/gas/config/obj-coff-seh.c
index 4800b959751..20e40d3902f 100644
--- a/gas/config/obj-coff-seh.c
+++ b/gas/config/obj-coff-seh.c
@@ -214,9 +214,6 @@  seh_get_target_kind (void)
       /* FALL THROUGH.  */
     case bfd_arch_mips:
       return seh_kind_mips;
-    case bfd_arch_ia64:
-      /* Should return seh_kind_x64.  But not implemented yet.  */
-      return seh_kind_unknown;
     default:
       break;
     }
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c
deleted file mode 100644
index a1b1e61408b..00000000000
--- a/gas/config/tc-ia64.c
+++ /dev/null
@@ -1,11982 +0,0 @@ 
-/* tc-ia64.c -- Assembler for the HP/Intel IA-64 architecture.
-   Copyright (C) 1998-2024 Free Software Foundation, Inc.
-   Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
-
-   This file is part of GAS, the GNU Assembler.
-
-   GAS is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 3, or (at your option)
-   any later version.
-
-   GAS is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with GAS; see the file COPYING.  If not, write to
-   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
-   Boston, MA 02110-1301, USA.  */
-
-/*
-  TODO:
-
-  - optional operands
-  - directives:
-	.eb
-	.estate
-	.lb
-	.popsection
-	.previous
-	.psr
-	.pushsection
-  - labels are wrong if automatic alignment is introduced
-    (e.g., checkout the second real10 definition in test-data.s)
-  - DV-related stuff:
-	<reg>.safe_across_calls and any other DV-related directives I don't
-	  have documentation for.
-	verify mod-sched-brs reads/writes are checked/marked (and other
-	notes)
-
- */
-
-#include "as.h"
-#include "safe-ctype.h"
-#include "dwarf2dbg.h"
-#include "subsegs.h"
-
-#include "opcode/ia64.h"
-
-#include "elf/ia64.h"
-#include "bfdver.h"
-#include <time.h>
-#include <limits.h>
-
-#define NELEMS(a)	((int) (sizeof (a)/sizeof ((a)[0])))
-
-/* Some systems define MIN in, e.g., param.h.  */
-#undef MIN
-#define MIN(a,b)	((a) < (b) ? (a) : (b))
-
-#define NUM_SLOTS	4
-#define PREV_SLOT	md.slot[(md.curr_slot + NUM_SLOTS - 1) % NUM_SLOTS]
-#define CURR_SLOT	md.slot[md.curr_slot]
-
-#define O_pseudo_fixup (O_max + 1)
-
-enum special_section
-  {
-    /* IA-64 ABI section pseudo-ops.  */
-    SPECIAL_SECTION_SBSS = 0,
-    SPECIAL_SECTION_SDATA,
-    SPECIAL_SECTION_RODATA,
-    SPECIAL_SECTION_COMMENT,
-    SPECIAL_SECTION_UNWIND,
-    SPECIAL_SECTION_UNWIND_INFO,
-    /* HPUX specific section pseudo-ops.  */
-    SPECIAL_SECTION_INIT_ARRAY,
-    SPECIAL_SECTION_FINI_ARRAY,
-  };
-
-enum reloc_func
-  {
-    FUNC_DTP_MODULE,
-    FUNC_DTP_RELATIVE,
-    FUNC_FPTR_RELATIVE,
-    FUNC_GP_RELATIVE,
-    FUNC_LT_RELATIVE,
-    FUNC_LT_RELATIVE_X,
-    FUNC_PC_RELATIVE,
-    FUNC_PLT_RELATIVE,
-    FUNC_SEC_RELATIVE,
-    FUNC_SEG_RELATIVE,
-    FUNC_TP_RELATIVE,
-    FUNC_LTV_RELATIVE,
-    FUNC_LT_FPTR_RELATIVE,
-    FUNC_LT_DTP_MODULE,
-    FUNC_LT_DTP_RELATIVE,
-    FUNC_LT_TP_RELATIVE,
-    FUNC_IPLT_RELOC,
-#ifdef TE_VMS
-    FUNC_SLOTCOUNT_RELOC,
-#endif
-  };
-
-enum reg_symbol
-  {
-    REG_GR	= 0,
-    REG_FR	= (REG_GR + 128),
-    REG_AR	= (REG_FR + 128),
-    REG_CR	= (REG_AR + 128),
-    REG_DAHR	= (REG_CR + 128),
-    REG_P	= (REG_DAHR + 8),
-    REG_BR	= (REG_P  + 64),
-    REG_IP	= (REG_BR + 8),
-    REG_CFM,
-    REG_PR,
-    REG_PR_ROT,
-    REG_PSR,
-    REG_PSR_L,
-    REG_PSR_UM,
-    /* The following are pseudo-registers for use by gas only.  */
-    IND_CPUID,
-    IND_DBR,
-    IND_DTR,
-    IND_ITR,
-    IND_IBR,
-    IND_MSR,
-    IND_PKR,
-    IND_PMC,
-    IND_PMD,
-    IND_DAHR,
-    IND_RR,
-    /* The following pseudo-registers are used for unwind directives only:  */
-    REG_PSP,
-    REG_PRIUNAT,
-    REG_NUM
-  };
-
-enum dynreg_type
-  {
-    DYNREG_GR = 0,	/* dynamic general purpose register */
-    DYNREG_FR,		/* dynamic floating point register */
-    DYNREG_PR,		/* dynamic predicate register */
-    DYNREG_NUM_TYPES
-  };
-
-enum operand_match_result
-  {
-    OPERAND_MATCH,
-    OPERAND_OUT_OF_RANGE,
-    OPERAND_MISMATCH
-  };
-
-/* On the ia64, we can't know the address of a text label until the
-   instructions are packed into a bundle.  To handle this, we keep
-   track of the list of labels that appear in front of each
-   instruction.  */
-struct label_fix
-{
-  struct label_fix *next;
-  struct symbol *sym;
-  bool dw2_mark_labels;
-};
-
-#ifdef TE_VMS
-/* An internally used relocation.  */
-#define DUMMY_RELOC_IA64_SLOTCOUNT	(BFD_RELOC_UNUSED + 1)
-#endif
-
-/* This is the endianness of the current section.  */
-extern int target_big_endian;
-
-/* This is the default endianness.  */
-static int default_big_endian = TARGET_BYTES_BIG_ENDIAN;
-
-void (*ia64_number_to_chars) (char *, valueT, int);
-
-static void ia64_float_to_chars_bigendian (char *, LITTLENUM_TYPE *, int);
-static void ia64_float_to_chars_littleendian (char *, LITTLENUM_TYPE *, int);
-
-static void (*ia64_float_to_chars) (char *, LITTLENUM_TYPE *, int);
-
-static htab_t alias_hash;
-static htab_t alias_name_hash;
-static htab_t secalias_hash;
-static htab_t secalias_name_hash;
-
-/* List of chars besides those in app.c:symbol_chars that can start an
-   operand.  Used to prevent the scrubber eating vital white-space.  */
-const char ia64_symbol_chars[] = "@?";
-
-/* Characters which always start a comment.  */
-const char comment_chars[] = "";
-
-/* Characters which start a comment at the beginning of a line.  */
-const char line_comment_chars[] = "#";
-
-/* Characters which may be used to separate multiple commands on a
-   single line.  */
-const char line_separator_chars[] = ";{}";
-
-/* Characters which are used to indicate an exponent in a floating
-   point number.  */
-const char EXP_CHARS[] = "eE";
-
-/* Characters which mean that a number is a floating point constant,
-   as in 0d1.0.  */
-const char FLT_CHARS[] = "rRsSfFdDxXpP";
-
-/* ia64-specific option processing:  */
-
-const char *md_shortopts = "m:N:x::";
-
-struct option md_longopts[] =
-  {
-#define OPTION_MCONSTANT_GP (OPTION_MD_BASE + 1)
-    {"mconstant-gp", no_argument, NULL, OPTION_MCONSTANT_GP},
-#define OPTION_MAUTO_PIC (OPTION_MD_BASE + 2)
-    {"mauto-pic", no_argument, NULL, OPTION_MAUTO_PIC}
-  };
-
-size_t md_longopts_size = sizeof (md_longopts);
-
-static struct
-  {
-    htab_t pseudo_hash;	/* pseudo opcode hash table */
-    htab_t reg_hash;	/* register name hash table */
-    htab_t dynreg_hash;	/* dynamic register hash table */
-    htab_t const_hash;	/* constant hash table */
-    htab_t entry_hash;    /* code entry hint hash table */
-
-    /* If X_op is != O_absent, the register name for the instruction's
-       qualifying predicate.  If NULL, p0 is assumed for instructions
-       that are predictable.  */
-    expressionS qp;
-
-    /* Optimize for which CPU.  */
-    enum
-      {
-	itanium1,
-	itanium2
-      } tune;
-
-    /* What to do when hint.b is used.  */
-    enum
-      {
-	hint_b_error,
-	hint_b_warning,
-	hint_b_ok
-      } hint_b;
-
-    unsigned int
-      manual_bundling : 1,
-      debug_dv: 1,
-      detect_dv: 1,
-      explicit_mode : 1,            /* which mode we're in */
-      default_explicit_mode : 1,    /* which mode is the default */
-      mode_explicitly_set : 1,      /* was the current mode explicitly set? */
-      auto_align : 1,
-      keep_pending_output : 1;
-
-    /* What to do when something is wrong with unwind directives.  */
-    enum
-      {
-	unwind_check_warning,
-	unwind_check_error
-      } unwind_check;
-
-    /* Each bundle consists of up to three instructions.  We keep
-       track of four most recent instructions so we can correctly set
-       the end_of_insn_group for the last instruction in a bundle.  */
-    int curr_slot;
-    int num_slots_in_use;
-    struct slot
-      {
-	unsigned int
-	  end_of_insn_group : 1,
-	  manual_bundling_on : 1,
-	  manual_bundling_off : 1,
-	  loc_directive_seen : 1;
-	signed char user_template;	/* user-selected template, if any */
-	unsigned char qp_regno;		/* qualifying predicate */
-	/* This duplicates a good fraction of "struct fix" but we
-	   can't use a "struct fix" instead since we can't call
-	   fix_new_exp() until we know the address of the instruction.  */
-	int num_fixups;
-	struct insn_fix
-	  {
-	    bfd_reloc_code_real_type code;
-	    enum ia64_opnd opnd;	/* type of operand in need of fix */
-	    unsigned int is_pcrel : 1;	/* is operand pc-relative? */
-	    expressionS expr;		/* the value to be inserted */
-	  }
-	fixup[2];			/* at most two fixups per insn */
-	struct ia64_opcode *idesc;
-	struct label_fix *label_fixups;
-	struct label_fix *tag_fixups;
-	struct unw_rec_list *unwind_record;	/* Unwind directive.  */
-	expressionS opnd[6];
-	const char *src_file;
-	unsigned int src_line;
-	struct dwarf2_line_info debug_line;
-      }
-    slot[NUM_SLOTS];
-
-    segT last_text_seg;
-    subsegT last_text_subseg;
-
-    struct dynreg
-      {
-	struct dynreg *next;		/* next dynamic register */
-	const char *name;
-	unsigned short base;		/* the base register number */
-	unsigned short num_regs;	/* # of registers in this set */
-      }
-    *dynreg[DYNREG_NUM_TYPES], in, loc, out, rot;