Home | History | Annotate | Line # | Download | only in bfd
elf64-ia64-vms.c revision 1.1.1.11
      1 /* IA-64 support for OpenVMS
      2    Copyright (C) 1998-2025 Free Software Foundation, Inc.
      3 
      4    This file is part of BFD, the Binary File Descriptor library.
      5 
      6    This program is free software; you can redistribute it and/or modify
      7    it under the terms of the GNU General Public License as published by
      8    the Free Software Foundation; either version 3 of the License, or
      9    (at your option) any later version.
     10 
     11    This program is distributed in the hope that it will be useful,
     12    but WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     14    GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; if not, write to the Free Software
     18    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     19    MA 02110-1301, USA.  */
     20 
     21 #include "sysdep.h"
     22 #include "bfd.h"
     23 #include "libbfd.h"
     24 #include "elf-bfd.h"
     25 #include "opcode/ia64.h"
     26 #include "elf/ia64.h"
     27 #include "objalloc.h"
     28 #include "hashtab.h"
     29 #include "elfxx-ia64.h"
     30 #include "vms.h"
     31 #include "bfdver.h"
     32 
     33 /* THE RULES for all the stuff the linker creates --
     34 
     35   GOT		Entries created in response to LTOFF or LTOFF_FPTR
     36 		relocations.  Dynamic relocs created for dynamic
     37 		symbols in an application; REL relocs for locals
     38 		in a shared library.
     39 
     40   FPTR		The canonical function descriptor.  Created for local
     41 		symbols in applications.  Descriptors for dynamic symbols
     42 		and local symbols in shared libraries are created by
     43 		ld.so.  Thus there are no dynamic relocs against these
     44 		objects.  The FPTR relocs for such _are_ passed through
     45 		to the dynamic relocation tables.
     46 
     47   FULL_PLT	Created for a PCREL21B relocation against a dynamic symbol.
     48 		Requires the creation of a PLTOFF entry.  This does not
     49 		require any dynamic relocations.
     50 
     51   PLTOFF	Created by PLTOFF relocations.  For local symbols, this
     52 		is an alternate function descriptor, and in shared libraries
     53 		requires two REL relocations.  Note that this cannot be
     54 		transformed into an FPTR relocation, since it must be in
     55 		range of the GP.  For dynamic symbols, this is a function
     56 		descriptor.  */
     57 
     58 typedef struct bfd_hash_entry *(*new_hash_entry_func)
     59   (struct bfd_hash_entry *, struct bfd_hash_table *, const char *);
     60 
     61 /* In dynamically (linker-) created sections, we generally need to keep track
     62    of the place a symbol or expression got allocated to. This is done via hash
     63    tables that store entries of the following type.  */
     64 
     65 struct elf64_ia64_dyn_sym_info
     66 {
     67   /* The addend for which this entry is relevant.  */
     68   bfd_vma addend;
     69 
     70   bfd_vma got_offset;
     71   bfd_vma fptr_offset;
     72   bfd_vma pltoff_offset;
     73   bfd_vma plt_offset;
     74   bfd_vma plt2_offset;
     75 
     76   /* The symbol table entry, if any, that this was derived from.  */
     77   struct elf_link_hash_entry *h;
     78 
     79   /* Used to count non-got, non-plt relocations for delayed sizing
     80      of relocation sections.  */
     81   struct elf64_ia64_dyn_reloc_entry
     82   {
     83     struct elf64_ia64_dyn_reloc_entry *next;
     84     asection *srel;
     85     int type;
     86     int count;
     87   } *reloc_entries;
     88 
     89   /* TRUE when the section contents have been updated.  */
     90   unsigned got_done : 1;
     91   unsigned fptr_done : 1;
     92   unsigned pltoff_done : 1;
     93 
     94   /* TRUE for the different kinds of linker data we want created.  */
     95   unsigned want_got : 1;
     96   unsigned want_gotx : 1;
     97   unsigned want_fptr : 1;
     98   unsigned want_ltoff_fptr : 1;
     99   unsigned want_plt : 1;	/* A MIN_PLT entry.  */
    100   unsigned want_plt2 : 1;	/* A FULL_PLT.  */
    101   unsigned want_pltoff : 1;
    102 };
    103 
    104 struct elf64_ia64_local_hash_entry
    105 {
    106   int id;
    107   unsigned int r_sym;
    108   /* The number of elements in elf64_ia64_dyn_sym_info array.  */
    109   unsigned int count;
    110   /* The number of sorted elements in elf64_ia64_dyn_sym_info array.  */
    111   unsigned int sorted_count;
    112   /* The size of elf64_ia64_dyn_sym_info array.  */
    113   unsigned int size;
    114   /* The array of elf64_ia64_dyn_sym_info.  */
    115   struct elf64_ia64_dyn_sym_info *info;
    116 
    117   /* TRUE if this hash entry's addends was translated for
    118      SHF_MERGE optimization.  */
    119   unsigned sec_merge_done : 1;
    120 };
    121 
    122 struct elf64_ia64_link_hash_entry
    123 {
    124   struct elf_link_hash_entry root;
    125 
    126   /* Set if this symbol is defined in a shared library.
    127      We can't use root.u.def.section->owner as the symbol is an absolute
    128      symbol.  */
    129   bfd *shl;
    130 
    131   /* The number of elements in elf64_ia64_dyn_sym_info array.  */
    132   unsigned int count;
    133   /* The number of sorted elements in elf64_ia64_dyn_sym_info array.  */
    134   unsigned int sorted_count;
    135   /* The size of elf64_ia64_dyn_sym_info array.  */
    136   unsigned int size;
    137   /* The array of elf64_ia64_dyn_sym_info.  */
    138   struct elf64_ia64_dyn_sym_info *info;
    139 };
    140 
    141 struct elf64_ia64_link_hash_table
    142 {
    143   /* The main hash table.  */
    144   struct elf_link_hash_table root;
    145 
    146   asection *fptr_sec;		/* Function descriptor table (or NULL).  */
    147   asection *rel_fptr_sec;	/* Dynamic relocation section for same.  */
    148   asection *pltoff_sec;		/* Private descriptors for plt (or NULL).  */
    149   asection *fixups_sec;		/* Fixups section.  */
    150   asection *transfer_sec;	/* Transfer vector section.  */
    151   asection *note_sec;		/* .note section.  */
    152 
    153   /* There are maybe R_IA64_GPREL22 relocations, including those
    154      optimized from R_IA64_LTOFF22X, against non-SHF_IA_64_SHORT
    155      sections.  We need to record those sections so that we can choose
    156      a proper GP to cover all R_IA64_GPREL22 relocations.  */
    157   asection *max_short_sec;	/* Maximum short output section.  */
    158   bfd_vma max_short_offset;	/* Maximum short offset.  */
    159   asection *min_short_sec;	/* Minimum short output section.  */
    160   bfd_vma min_short_offset;	/* Minimum short offset.  */
    161 
    162   htab_t loc_hash_table;
    163   void *loc_hash_memory;
    164 };
    165 
    166 struct elf64_ia64_allocate_data
    167 {
    168   struct bfd_link_info *info;
    169   bfd_size_type ofs;
    170 };
    171 
    172 #define elf64_ia64_hash_table(p) \
    173   ((is_elf_hash_table ((p)->hash)					\
    174     && elf_hash_table_id (elf_hash_table (p)) == IA64_ELF_DATA)		\
    175    ? (struct elf64_ia64_link_hash_table *) (p)->hash : NULL)
    176 
    177 struct elf64_ia64_vms_obj_tdata
    178 {
    179   struct elf_obj_tdata root;
    180 
    181   /* Ident for shared library.  */
    182   uint64_t ident;
    183 
    184   /* Used only during link: offset in the .fixups section for this bfd.  */
    185   bfd_vma fixups_off;
    186 
    187   /* Max number of shared libraries.  */
    188   unsigned int needed_count;
    189 };
    190 
    191 #define elf_ia64_vms_tdata(abfd) \
    192   ((struct elf64_ia64_vms_obj_tdata *)((abfd)->tdata.any))
    193 #define elf_ia64_vms_ident(abfd) (elf_ia64_vms_tdata(abfd)->ident)
    194 
    195 struct elf64_vms_transfer
    196 {
    197   unsigned char size[4];
    198   unsigned char spare[4];
    199   unsigned char tfradr1[8];
    200   unsigned char tfradr2[8];
    201   unsigned char tfradr3[8];
    202   unsigned char tfradr4[8];
    203   unsigned char tfradr5[8];
    204 
    205   /* Local function descriptor for tfr3.  */
    206   unsigned char tfr3_func[8];
    207   unsigned char tfr3_gp[8];
    208 };
    209 
    210 typedef struct
    211 {
    212   Elf64_External_Ehdr ehdr;
    213   unsigned char vms_needed_count[8];
    214 } Elf64_External_VMS_Ehdr;
    215 
    216 static struct elf64_ia64_dyn_sym_info * get_dyn_sym_info
    217   (struct elf64_ia64_link_hash_table *,
    218    struct elf_link_hash_entry *,
    219    bfd *, const Elf_Internal_Rela *, bool);
    220 static bool elf64_ia64_dynamic_symbol_p
    221   (struct elf_link_hash_entry *);
    222 static bool elf64_ia64_choose_gp
    223   (bfd *, struct bfd_link_info *, bool);
    224 static void elf64_ia64_dyn_sym_traverse
    225   (struct elf64_ia64_link_hash_table *,
    226    bool (*) (struct elf64_ia64_dyn_sym_info *, void *),
    227    void *);
    228 static bool allocate_global_data_got
    229   (struct elf64_ia64_dyn_sym_info *, void *);
    230 static bool allocate_global_fptr_got
    231   (struct elf64_ia64_dyn_sym_info *, void *);
    232 static bool allocate_local_got
    233   (struct elf64_ia64_dyn_sym_info *, void *);
    234 static bool allocate_dynrel_entries
    235   (struct elf64_ia64_dyn_sym_info *, void *);
    236 static asection *get_pltoff
    237   (bfd *, struct elf64_ia64_link_hash_table *);
    238 static asection *get_got
    239   (bfd *, struct elf64_ia64_link_hash_table *);
    240 
    241 
    242 /* Given a ELF reloc, return the matching HOWTO structure.  */
    243 
    244 static bool
    245 elf64_ia64_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
    246 			  arelent *bfd_reloc,
    247 			  Elf_Internal_Rela *elf_reloc)
    248 {
    249   unsigned int r_type = ELF32_R_TYPE (elf_reloc->r_info);
    250 
    251   bfd_reloc->howto = ia64_elf_lookup_howto (r_type);
    252   if (bfd_reloc->howto == NULL)
    253     {
    254       /* xgettext:c-format */
    255       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
    256 			  abfd, r_type);
    257       bfd_set_error (bfd_error_bad_value);
    258       return false;
    259     }
    260 
    261   return true;
    262 }
    263 
    264 
    265 #define PLT_FULL_ENTRY_SIZE	(2 * 16)
    266 
    267 static const bfd_byte plt_full_entry[PLT_FULL_ENTRY_SIZE] =
    268 {
    269   0x0b, 0x78, 0x00, 0x02, 0x00, 0x24,  /*   [MMI]	addl r15=0,r1;;	  */
    270   0x00, 0x41, 0x3c, 0x70, 0x29, 0xc0,  /*		ld8.acq r16=[r15],8*/
    271   0x01, 0x08, 0x00, 0x84,	       /*		mov r14=r1;;	  */
    272   0x11, 0x08, 0x00, 0x1e, 0x18, 0x10,  /*   [MIB]	ld8 r1=[r15]	  */
    273   0x60, 0x80, 0x04, 0x80, 0x03, 0x00,  /*		mov b6=r16	  */
    274   0x60, 0x00, 0x80, 0x00	       /*		br.few b6;;	  */
    275 };
    276 
    277 static const bfd_byte oor_brl[16] =
    278 {
    279   0x05, 0x00, 0x00, 0x00, 0x01, 0x00,  /*  [MLX]	nop.m 0		  */
    280   0x00, 0x00, 0x00, 0x00, 0x00, 0x00,  /*		brl.sptk.few tgt;;*/
    281   0x00, 0x00, 0x00, 0xc0
    282 };
    283 
    284 
    285 /* These functions do relaxation for IA-64 ELF.  */
    286 
    287 /* Rename some of the generic section flags to better document how they
    288    are used here.  */
    289 #define skip_relax_pass_0 sec_flg0
    290 #define skip_relax_pass_1 sec_flg1
    291 
    292 static void
    293 elf64_ia64_update_short_info (asection *sec, bfd_vma offset,
    294 			      struct elf64_ia64_link_hash_table *ia64_info)
    295 {
    296   /* Skip ABS and SHF_IA_64_SHORT sections.  */
    297   if (sec == bfd_abs_section_ptr
    298       || (sec->flags & SEC_SMALL_DATA) != 0)
    299     return;
    300 
    301   if (!ia64_info->min_short_sec)
    302     {
    303       ia64_info->max_short_sec = sec;
    304       ia64_info->max_short_offset = offset;
    305       ia64_info->min_short_sec = sec;
    306       ia64_info->min_short_offset = offset;
    307     }
    308   else if (sec == ia64_info->max_short_sec
    309 	   && offset > ia64_info->max_short_offset)
    310     ia64_info->max_short_offset = offset;
    311   else if (sec == ia64_info->min_short_sec
    312 	   && offset < ia64_info->min_short_offset)
    313     ia64_info->min_short_offset = offset;
    314   else if (sec->output_section->vma
    315 	   > ia64_info->max_short_sec->vma)
    316     {
    317       ia64_info->max_short_sec = sec;
    318       ia64_info->max_short_offset = offset;
    319     }
    320   else if (sec->output_section->vma
    321 	   < ia64_info->min_short_sec->vma)
    322     {
    323       ia64_info->min_short_sec = sec;
    324       ia64_info->min_short_offset = offset;
    325     }
    326 }
    327 
    328 /* Use a two passes algorithm.  In the first pass, branches are relaxed
    329    (which may increase the size of the section).  In the second pass,
    330    the other relaxations are done.
    331 */
    332 
    333 static bool
    334 elf64_ia64_relax_section (bfd *abfd, asection *sec,
    335 			  struct bfd_link_info *link_info,
    336 			  bool *again)
    337 {
    338   struct one_fixup
    339     {
    340       struct one_fixup *next;
    341       asection *tsec;
    342       bfd_vma toff;
    343       bfd_vma trampoff;
    344     };
    345 
    346   Elf_Internal_Shdr *symtab_hdr;
    347   Elf_Internal_Rela *internal_relocs;
    348   Elf_Internal_Rela *irel, *irelend;
    349   bfd_byte *contents;
    350   Elf_Internal_Sym *isymbuf = NULL;
    351   struct elf64_ia64_link_hash_table *ia64_info;
    352   struct one_fixup *fixups = NULL;
    353   bool changed_contents = false;
    354   bool changed_relocs = false;
    355   bool skip_relax_pass_0 = true;
    356   bool skip_relax_pass_1 = true;
    357   bfd_vma gp = 0;
    358 
    359   /* Assume we're not going to change any sizes, and we'll only need
    360      one pass.  */
    361   *again = false;
    362 
    363   if (bfd_link_relocatable (link_info))
    364     link_info->callbacks->fatal
    365       (_("%P: --relax and -r may not be used together\n"));
    366 
    367   /* Don't even try to relax for non-ELF outputs.  */
    368   if (!is_elf_hash_table (link_info->hash))
    369     return false;
    370 
    371   /* Nothing to do if there are no relocations or there is no need for
    372      the current pass.  */
    373   if (sec->reloc_count == 0
    374       || (sec->flags & SEC_RELOC) == 0
    375       || (sec->flags & SEC_HAS_CONTENTS) == 0
    376       || (link_info->relax_pass == 0 && sec->skip_relax_pass_0)
    377       || (link_info->relax_pass == 1 && sec->skip_relax_pass_1))
    378     return true;
    379 
    380   ia64_info = elf64_ia64_hash_table (link_info);
    381   if (ia64_info == NULL)
    382     return false;
    383 
    384   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
    385 
    386   /* Load the relocations for this section.  */
    387   internal_relocs = (_bfd_elf_link_read_relocs
    388 		     (abfd, sec, NULL, (Elf_Internal_Rela *) NULL,
    389 		      link_info->keep_memory));
    390   if (internal_relocs == NULL)
    391     return false;
    392 
    393   irelend = internal_relocs + sec->reloc_count;
    394 
    395   /* Get the section contents.  */
    396   if (elf_section_data (sec)->this_hdr.contents != NULL)
    397     contents = elf_section_data (sec)->this_hdr.contents;
    398   else
    399     {
    400       if (!bfd_malloc_and_get_section (abfd, sec, &contents))
    401 	goto error_return;
    402     }
    403 
    404   for (irel = internal_relocs; irel < irelend; irel++)
    405     {
    406       unsigned long r_type = ELF64_R_TYPE (irel->r_info);
    407       bfd_vma symaddr, reladdr, trampoff, toff, roff;
    408       asection *tsec;
    409       struct one_fixup *f;
    410       bfd_size_type amt;
    411       bool is_branch;
    412       struct elf64_ia64_dyn_sym_info *dyn_i;
    413 
    414       switch (r_type)
    415 	{
    416 	case R_IA64_PCREL21B:
    417 	case R_IA64_PCREL21BI:
    418 	case R_IA64_PCREL21M:
    419 	case R_IA64_PCREL21F:
    420 	  /* In pass 1, all br relaxations are done. We can skip it. */
    421 	  if (link_info->relax_pass == 1)
    422 	    continue;
    423 	  skip_relax_pass_0 = false;
    424 	  is_branch = true;
    425 	  break;
    426 
    427 	case R_IA64_PCREL60B:
    428 	  /* We can't optimize brl to br in pass 0 since br relaxations
    429 	     will increase the code size. Defer it to pass 1.  */
    430 	  if (link_info->relax_pass == 0)
    431 	    {
    432 	      skip_relax_pass_1 = false;
    433 	      continue;
    434 	    }
    435 	  is_branch = true;
    436 	  break;
    437 
    438 	case R_IA64_GPREL22:
    439 	  /* Update max_short_sec/min_short_sec.  */
    440 
    441 	case R_IA64_LTOFF22X:
    442 	case R_IA64_LDXMOV:
    443 	  /* We can't relax ldx/mov in pass 0 since br relaxations will
    444 	     increase the code size. Defer it to pass 1.  */
    445 	  if (link_info->relax_pass == 0)
    446 	    {
    447 	      skip_relax_pass_1 = false;
    448 	      continue;
    449 	    }
    450 	  is_branch = false;
    451 	  break;
    452 
    453 	default:
    454 	  continue;
    455 	}
    456 
    457       /* Get the value of the symbol referred to by the reloc.  */
    458       if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
    459 	{
    460 	  /* A local symbol.  */
    461 	  Elf_Internal_Sym *isym;
    462 
    463 	  /* Read this BFD's local symbols.  */
    464 	  if (isymbuf == NULL)
    465 	    {
    466 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
    467 	      if (isymbuf == NULL)
    468 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
    469 						symtab_hdr->sh_info, 0,
    470 						NULL, NULL, NULL);
    471 	      if (isymbuf == 0)
    472 		goto error_return;
    473 	    }
    474 
    475 	  isym = isymbuf + ELF64_R_SYM (irel->r_info);
    476 	  if (isym->st_shndx == SHN_UNDEF)
    477 	    continue;	/* We can't do anything with undefined symbols.  */
    478 	  else if (isym->st_shndx == SHN_ABS)
    479 	    tsec = bfd_abs_section_ptr;
    480 	  else if (isym->st_shndx == SHN_COMMON)
    481 	    tsec = bfd_com_section_ptr;
    482 	  else if (isym->st_shndx == SHN_IA_64_ANSI_COMMON)
    483 	    tsec = bfd_com_section_ptr;
    484 	  else
    485 	    tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
    486 
    487 	  toff = isym->st_value;
    488 	  dyn_i = get_dyn_sym_info (ia64_info, NULL, abfd, irel, false);
    489 	}
    490       else
    491 	{
    492 	  unsigned long indx;
    493 	  struct elf_link_hash_entry *h;
    494 
    495 	  indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
    496 	  h = elf_sym_hashes (abfd)[indx];
    497 	  BFD_ASSERT (h != NULL);
    498 
    499 	  while (h->root.type == bfd_link_hash_indirect
    500 		 || h->root.type == bfd_link_hash_warning)
    501 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
    502 
    503 	  dyn_i = get_dyn_sym_info (ia64_info, h, abfd, irel, false);
    504 
    505 	  /* For branches to dynamic symbols, we're interested instead
    506 	     in a branch to the PLT entry.  */
    507 	  if (is_branch && dyn_i && dyn_i->want_plt2)
    508 	    {
    509 	      /* Internal branches shouldn't be sent to the PLT.
    510 		 Leave this for now and we'll give an error later.  */
    511 	      if (r_type != R_IA64_PCREL21B)
    512 		continue;
    513 
    514 	      tsec = ia64_info->root.splt;
    515 	      toff = dyn_i->plt2_offset;
    516 	      BFD_ASSERT (irel->r_addend == 0);
    517 	    }
    518 
    519 	  /* Can't do anything else with dynamic symbols.  */
    520 	  else if (elf64_ia64_dynamic_symbol_p (h))
    521 	    continue;
    522 
    523 	  else
    524 	    {
    525 	      /* We can't do anything with undefined symbols.  */
    526 	      if (h->root.type == bfd_link_hash_undefined
    527 		  || h->root.type == bfd_link_hash_undefweak)
    528 		continue;
    529 
    530 	      tsec = h->root.u.def.section;
    531 	      toff = h->root.u.def.value;
    532 	    }
    533 	}
    534 
    535       toff += irel->r_addend;
    536 
    537       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
    538 
    539       roff = irel->r_offset;
    540 
    541       if (is_branch)
    542 	{
    543 	  bfd_signed_vma offset;
    544 
    545 	  reladdr = (sec->output_section->vma
    546 		     + sec->output_offset
    547 		     + roff) & (bfd_vma) -4;
    548 
    549 	  /* The .plt section is aligned at 32byte and the .text section
    550 	     is aligned at 64byte. The .text section is right after the
    551 	     .plt section.  After the first relaxation pass, linker may
    552 	     increase the gap between the .plt and .text sections up
    553 	     to 32byte.  We assume linker will always insert 32byte
    554 	     between the .plt and .text sections after the first
    555 	     relaxation pass.  */
    556 	  if (tsec == ia64_info->root.splt)
    557 	    offset = -0x1000000 + 32;
    558 	  else
    559 	    offset = -0x1000000;
    560 
    561 	  /* If the branch is in range, no need to do anything.  */
    562 	  if ((bfd_signed_vma) (symaddr - reladdr) >= offset
    563 	      && (bfd_signed_vma) (symaddr - reladdr) <= 0x0FFFFF0)
    564 	    {
    565 	      /* If the 60-bit branch is in 21-bit range, optimize it. */
    566 	      if (r_type == R_IA64_PCREL60B)
    567 		{
    568 		  ia64_elf_relax_brl (contents, roff);
    569 
    570 		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
    571 					       R_IA64_PCREL21B);
    572 
    573 		  /* If the original relocation offset points to slot
    574 		     1, change it to slot 2.  */
    575 		  if ((irel->r_offset & 3) == 1)
    576 		    irel->r_offset += 1;
    577 		}
    578 
    579 	      continue;
    580 	    }
    581 	  else if (r_type == R_IA64_PCREL60B)
    582 	    continue;
    583 	  else if (ia64_elf_relax_br (contents, roff))
    584 	    {
    585 	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
    586 					   R_IA64_PCREL60B);
    587 
    588 	      /* Make the relocation offset point to slot 1.  */
    589 	      irel->r_offset = (irel->r_offset & ~((bfd_vma) 0x3)) + 1;
    590 	      continue;
    591 	    }
    592 
    593 	  /* We can't put a trampoline in a .init/.fini section. Issue
    594 	     an error.  */
    595 	  if (strcmp (sec->output_section->name, ".init") == 0
    596 	      || strcmp (sec->output_section->name, ".fini") == 0)
    597 	    {
    598 	      _bfd_error_handler
    599 		/* xgettext:c-format */
    600 		(_("%pB: can't relax br at %#" PRIx64 " in section `%pA';"
    601 		   " please use brl or indirect branch"),
    602 		 sec->owner, (uint64_t) roff, sec);
    603 	      bfd_set_error (bfd_error_bad_value);
    604 	      goto error_return;
    605 	    }
    606 
    607 	  /* If the branch and target are in the same section, you've
    608 	     got one honking big section and we can't help you unless
    609 	     you are branching backwards.  You'll get an error message
    610 	     later.  */
    611 	  if (tsec == sec && toff > roff)
    612 	    continue;
    613 
    614 	  /* Look for an existing fixup to this address.  */
    615 	  for (f = fixups; f ; f = f->next)
    616 	    if (f->tsec == tsec && f->toff == toff)
    617 	      break;
    618 
    619 	  if (f == NULL)
    620 	    {
    621 	      /* Two alternatives: If it's a branch to a PLT entry, we can
    622 		 make a copy of the FULL_PLT entry.  Otherwise, we'll have
    623 		 to use a `brl' insn to get where we're going.  */
    624 
    625 	      size_t size;
    626 
    627 	      if (tsec == ia64_info->root.splt)
    628 		size = sizeof (plt_full_entry);
    629 	      else
    630 		size = sizeof (oor_brl);
    631 
    632 	      /* Resize the current section to make room for the new branch. */
    633 	      trampoff = (sec->size + 15) & (bfd_vma) -16;
    634 
    635 	      /* If trampoline is out of range, there is nothing we
    636 		 can do.  */
    637 	      offset = trampoff - (roff & (bfd_vma) -4);
    638 	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
    639 		continue;
    640 
    641 	      amt = trampoff + size;
    642 	      contents = (bfd_byte *) bfd_realloc (contents, amt);
    643 	      if (contents == NULL)
    644 		goto error_return;
    645 	      sec->size = amt;
    646 
    647 	      if (tsec == ia64_info->root.splt)
    648 		{
    649 		  memcpy (contents + trampoff, plt_full_entry, size);
    650 
    651 		  /* Hijack the old relocation for use as the PLTOFF reloc.  */
    652 		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
    653 					       R_IA64_PLTOFF22);
    654 		  irel->r_offset = trampoff;
    655 		}
    656 	      else
    657 		{
    658 		  memcpy (contents + trampoff, oor_brl, size);
    659 		  irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
    660 					       R_IA64_PCREL60B);
    661 		  irel->r_offset = trampoff + 2;
    662 		}
    663 
    664 	      /* Record the fixup so we don't do it again this section.  */
    665 	      f = (struct one_fixup *)
    666 		bfd_malloc ((bfd_size_type) sizeof (*f));
    667 	      f->next = fixups;
    668 	      f->tsec = tsec;
    669 	      f->toff = toff;
    670 	      f->trampoff = trampoff;
    671 	      fixups = f;
    672 	    }
    673 	  else
    674 	    {
    675 	      /* If trampoline is out of range, there is nothing we
    676 		 can do.  */
    677 	      offset = f->trampoff - (roff & (bfd_vma) -4);
    678 	      if (offset < -0x1000000 || offset > 0x0FFFFF0)
    679 		continue;
    680 
    681 	      /* Nop out the reloc, since we're finalizing things here.  */
    682 	      irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
    683 	    }
    684 
    685 	  /* Fix up the existing branch to hit the trampoline.  */
    686 	  if (ia64_elf_install_value (contents + roff, offset, r_type)
    687 	      != bfd_reloc_ok)
    688 	    goto error_return;
    689 
    690 	  changed_contents = true;
    691 	  changed_relocs = true;
    692 	}
    693       else
    694 	{
    695 	  /* Fetch the gp.  */
    696 	  if (gp == 0)
    697 	    {
    698 	      bfd *obfd = sec->output_section->owner;
    699 	      gp = _bfd_get_gp_value (obfd);
    700 	      if (gp == 0)
    701 		{
    702 		  if (!elf64_ia64_choose_gp (obfd, link_info, false))
    703 		    goto error_return;
    704 		  gp = _bfd_get_gp_value (obfd);
    705 		}
    706 	    }
    707 
    708 	  /* If the data is out of range, do nothing.  */
    709 	  if ((bfd_signed_vma) (symaddr - gp) >= 0x200000
    710 	      ||(bfd_signed_vma) (symaddr - gp) < -0x200000)
    711 	    continue;
    712 
    713 	  if (r_type == R_IA64_GPREL22)
    714 	    elf64_ia64_update_short_info (tsec->output_section,
    715 					  tsec->output_offset + toff,
    716 					  ia64_info);
    717 	  else if (r_type == R_IA64_LTOFF22X)
    718 	    {
    719 	      /* Can't deal yet correctly with ABS symbols.  */
    720 	      if (bfd_is_abs_section (tsec))
    721 		continue;
    722 
    723 	      irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
    724 					   R_IA64_GPREL22);
    725 	      changed_relocs = true;
    726 
    727 	      elf64_ia64_update_short_info (tsec->output_section,
    728 					    tsec->output_offset + toff,
    729 					    ia64_info);
    730 	    }
    731 	  else
    732 	    {
    733 	      ia64_elf_relax_ldxmov (contents, roff);
    734 	      irel->r_info = ELF64_R_INFO (0, R_IA64_NONE);
    735 	      changed_contents = true;
    736 	      changed_relocs = true;
    737 	    }
    738 	}
    739     }
    740 
    741   /* ??? If we created fixups, this may push the code segment large
    742      enough that the data segment moves, which will change the GP.
    743      Reset the GP so that we re-calculate next round.  We need to
    744      do this at the _beginning_ of the next round; now will not do.  */
    745 
    746   /* Clean up and go home.  */
    747   while (fixups)
    748     {
    749       struct one_fixup *f = fixups;
    750       fixups = fixups->next;
    751       free (f);
    752     }
    753 
    754   if (isymbuf != NULL
    755       && symtab_hdr->contents != (unsigned char *) isymbuf)
    756     {
    757       if (! link_info->keep_memory)
    758 	free (isymbuf);
    759       else
    760 	{
    761 	  /* Cache the symbols for elf_link_input_bfd.  */
    762 	  symtab_hdr->contents = (unsigned char *) isymbuf;
    763 	}
    764     }
    765 
    766   if (contents != NULL
    767       && elf_section_data (sec)->this_hdr.contents != contents)
    768     {
    769       if (!changed_contents && !link_info->keep_memory)
    770 	free (contents);
    771       else
    772 	{
    773 	  /* Cache the section contents for elf_link_input_bfd.  */
    774 	  elf_section_data (sec)->this_hdr.contents = contents;
    775 	}
    776     }
    777 
    778   if (elf_section_data (sec)->relocs != internal_relocs)
    779     {
    780       if (!changed_relocs)
    781 	free (internal_relocs);
    782       else
    783 	elf_section_data (sec)->relocs = internal_relocs;
    784     }
    785 
    786   if (link_info->relax_pass == 0)
    787     {
    788       /* Pass 0 is only needed to relax br.  */
    789       sec->skip_relax_pass_0 = skip_relax_pass_0;
    790       sec->skip_relax_pass_1 = skip_relax_pass_1;
    791     }
    792 
    793   *again = changed_contents || changed_relocs;
    794   return true;
    795 
    796  error_return:
    797   if ((unsigned char *) isymbuf != symtab_hdr->contents)
    798     free (isymbuf);
    799   if (elf_section_data (sec)->this_hdr.contents != contents)
    800     free (contents);
    801   if (elf_section_data (sec)->relocs != internal_relocs)
    802     free (internal_relocs);
    803   return false;
    804 }
    805 #undef skip_relax_pass_0
    806 #undef skip_relax_pass_1
    807 
    808 /* Return TRUE if NAME is an unwind table section name.  */
    809 
    810 static inline bool
    811 is_unwind_section_name (bfd *abfd ATTRIBUTE_UNUSED, const char *name)
    812 {
    813   return ((startswith (name, ELF_STRING_ia64_unwind)
    814 	   && ! startswith (name, ELF_STRING_ia64_unwind_info))
    815 	  || startswith (name, ELF_STRING_ia64_unwind_once));
    816 }
    817 
    818 
    819 /* Convert IA-64 specific section flags to bfd internal section flags.  */
    820 
    821 /* ??? There is no bfd internal flag equivalent to the SHF_IA_64_NORECOV
    822    flag.  */
    823 
    824 static bool
    825 elf64_ia64_section_flags (const Elf_Internal_Shdr *hdr)
    826 {
    827   if (hdr->sh_flags & SHF_IA_64_SHORT)
    828     hdr->bfd_section->flags |= SEC_SMALL_DATA;
    829 
    830   return true;
    831 }
    832 
    833 /* Set the correct type for an IA-64 ELF section.  We do this by the
    834    section name, which is a hack, but ought to work.  */
    835 
    836 static bool
    837 elf64_ia64_fake_sections (bfd *abfd, Elf_Internal_Shdr *hdr,
    838 			  asection *sec)
    839 {
    840   const char *name;
    841 
    842   name = bfd_section_name (sec);
    843 
    844   if (is_unwind_section_name (abfd, name))
    845     {
    846       /* We don't have the sections numbered at this point, so sh_info
    847 	 is set later, in elf64_ia64_final_write_processing.  */
    848       hdr->sh_type = SHT_IA_64_UNWIND;
    849       hdr->sh_flags |= SHF_LINK_ORDER;
    850     }
    851   else if (strcmp (name, ELF_STRING_ia64_archext) == 0)
    852     hdr->sh_type = SHT_IA_64_EXT;
    853 
    854   if (sec->flags & SEC_SMALL_DATA)
    855     hdr->sh_flags |= SHF_IA_64_SHORT;
    856 
    857   return true;
    858 }
    859 
    860 /* Hook called by the linker routine which adds symbols from an object
    861    file.  We use it to put .comm items in .sbss, and not .bss.  */
    862 
    863 static bool
    864 elf64_ia64_add_symbol_hook (bfd *abfd,
    865 			    struct bfd_link_info *info,
    866 			    Elf_Internal_Sym *sym,
    867 			    const char **namep ATTRIBUTE_UNUSED,
    868 			    flagword *flagsp ATTRIBUTE_UNUSED,
    869 			    asection **secp,
    870 			    bfd_vma *valp)
    871 {
    872   if (sym->st_shndx == SHN_COMMON
    873       && !bfd_link_relocatable (info)
    874       && sym->st_size <= elf_gp_size (abfd))
    875     {
    876       /* Common symbols less than or equal to -G nn bytes are
    877 	 automatically put into .sbss.  */
    878 
    879       asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
    880 
    881       if (scomm == NULL)
    882 	{
    883 	  scomm = bfd_make_section_with_flags (abfd, ".scommon",
    884 					       (SEC_ALLOC
    885 						| SEC_IS_COMMON
    886 						| SEC_SMALL_DATA
    887 						| SEC_LINKER_CREATED));
    888 	  if (scomm == NULL)
    889 	    return false;
    890 	}
    891 
    892       *secp = scomm;
    893       *valp = sym->st_size;
    894     }
    895 
    896   return true;
    897 }
    898 
    899 /* According to the Tahoe assembler spec, all labels starting with a
    900    '.' are local.  */
    901 
    902 static bool
    903 elf64_ia64_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
    904 				const char *name)
    905 {
    906   return name[0] == '.';
    907 }
    908 
    909 /* Should we do dynamic things to this symbol?  */
    910 
    911 static bool
    912 elf64_ia64_dynamic_symbol_p (struct elf_link_hash_entry *h)
    913 {
    914   return h != NULL && h->def_dynamic;
    915 }
    916 
    917 static struct bfd_hash_entry*
    918 elf64_ia64_new_elf_hash_entry (struct bfd_hash_entry *entry,
    919 			       struct bfd_hash_table *table,
    920 			       const char *string)
    921 {
    922   struct elf64_ia64_link_hash_entry *ret;
    923   ret = (struct elf64_ia64_link_hash_entry *) entry;
    924 
    925   /* Allocate the structure if it has not already been allocated by a
    926      subclass.  */
    927   if (!ret)
    928     ret = bfd_hash_allocate (table, sizeof (*ret));
    929 
    930   if (!ret)
    931     return 0;
    932 
    933   /* Call the allocation method of the superclass.  */
    934   ret = ((struct elf64_ia64_link_hash_entry *)
    935 	 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
    936 				     table, string));
    937 
    938   ret->info = NULL;
    939   ret->count = 0;
    940   ret->sorted_count = 0;
    941   ret->size = 0;
    942   return (struct bfd_hash_entry *) ret;
    943 }
    944 
    945 static void
    946 elf64_ia64_hash_hide_symbol (struct bfd_link_info *info,
    947 			     struct elf_link_hash_entry *xh,
    948 			     bool force_local)
    949 {
    950   struct elf64_ia64_link_hash_entry *h;
    951   struct elf64_ia64_dyn_sym_info *dyn_i;
    952   unsigned int count;
    953 
    954   h = (struct elf64_ia64_link_hash_entry *)xh;
    955 
    956   _bfd_elf_link_hash_hide_symbol (info, &h->root, force_local);
    957 
    958   for (count = h->count, dyn_i = h->info;
    959        count != 0;
    960        count--, dyn_i++)
    961     {
    962       dyn_i->want_plt2 = 0;
    963       dyn_i->want_plt = 0;
    964     }
    965 }
    966 
    967 /* Compute a hash of a local hash entry.  */
    968 
    969 static hashval_t
    970 elf64_ia64_local_htab_hash (const void *ptr)
    971 {
    972   struct elf64_ia64_local_hash_entry *entry
    973     = (struct elf64_ia64_local_hash_entry *) ptr;
    974 
    975   return ELF_LOCAL_SYMBOL_HASH (entry->id, entry->r_sym);
    976 }
    977 
    978 /* Compare local hash entries.  */
    979 
    980 static int
    981 elf64_ia64_local_htab_eq (const void *ptr1, const void *ptr2)
    982 {
    983   struct elf64_ia64_local_hash_entry *entry1
    984     = (struct elf64_ia64_local_hash_entry *) ptr1;
    985   struct elf64_ia64_local_hash_entry *entry2
    986     = (struct elf64_ia64_local_hash_entry *) ptr2;
    987 
    988   return entry1->id == entry2->id && entry1->r_sym == entry2->r_sym;
    989 }
    990 
    991 /* Free the global elf64_ia64_dyn_sym_info array.  */
    992 
    993 static bool
    994 elf64_ia64_global_dyn_info_free (struct elf_link_hash_entry *xentry,
    995 				 void * unused ATTRIBUTE_UNUSED)
    996 {
    997   struct elf64_ia64_link_hash_entry *entry
    998     = (struct elf64_ia64_link_hash_entry *) xentry;
    999 
   1000   if (entry->root.root.type == bfd_link_hash_warning)
   1001     entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
   1002 
   1003   free (entry->info);
   1004   entry->info = NULL;
   1005   entry->count = 0;
   1006   entry->sorted_count = 0;
   1007   entry->size = 0;
   1008 
   1009   return true;
   1010 }
   1011 
   1012 /* Free the local elf64_ia64_dyn_sym_info array.  */
   1013 
   1014 static int
   1015 elf64_ia64_local_dyn_info_free (void **slot,
   1016 				void * unused ATTRIBUTE_UNUSED)
   1017 {
   1018   struct elf64_ia64_local_hash_entry *entry
   1019     = (struct elf64_ia64_local_hash_entry *) *slot;
   1020 
   1021   free (entry->info);
   1022   entry->info = NULL;
   1023   entry->count = 0;
   1024   entry->sorted_count = 0;
   1025   entry->size = 0;
   1026 
   1027   return true;
   1028 }
   1029 
   1030 /* Destroy IA-64 linker hash table.  */
   1031 
   1032 static void
   1033 elf64_ia64_link_hash_table_free (bfd *obfd)
   1034 {
   1035   struct elf64_ia64_link_hash_table *ia64_info
   1036     = (struct elf64_ia64_link_hash_table *) obfd->link.hash;
   1037   if (ia64_info->loc_hash_table)
   1038     {
   1039       htab_traverse (ia64_info->loc_hash_table,
   1040 		     elf64_ia64_local_dyn_info_free, NULL);
   1041       htab_delete (ia64_info->loc_hash_table);
   1042     }
   1043   if (ia64_info->loc_hash_memory)
   1044     objalloc_free ((struct objalloc *) ia64_info->loc_hash_memory);
   1045   elf_link_hash_traverse (&ia64_info->root,
   1046 			  elf64_ia64_global_dyn_info_free, NULL);
   1047   _bfd_elf_link_hash_table_free (obfd);
   1048 }
   1049 
   1050 /* Create the derived linker hash table.  The IA-64 ELF port uses this
   1051    derived hash table to keep information specific to the IA-64 ElF
   1052    linker (without using static variables).  */
   1053 
   1054 static struct bfd_link_hash_table *
   1055 elf64_ia64_hash_table_create (bfd *abfd)
   1056 {
   1057   struct elf64_ia64_link_hash_table *ret;
   1058 
   1059   ret = bfd_zmalloc ((bfd_size_type) sizeof (*ret));
   1060   if (!ret)
   1061     return NULL;
   1062 
   1063   if (!_bfd_elf_link_hash_table_init (&ret->root, abfd,
   1064 				      elf64_ia64_new_elf_hash_entry,
   1065 				      sizeof (struct elf64_ia64_link_hash_entry)))
   1066     {
   1067       free (ret);
   1068       return NULL;
   1069     }
   1070 
   1071   ret->loc_hash_table = htab_try_create (1024, elf64_ia64_local_htab_hash,
   1072 					 elf64_ia64_local_htab_eq, NULL);
   1073   ret->loc_hash_memory = objalloc_create ();
   1074   if (!ret->loc_hash_table || !ret->loc_hash_memory)
   1075     {
   1076       elf64_ia64_link_hash_table_free (abfd);
   1077       return NULL;
   1078     }
   1079   ret->root.root.hash_table_free = elf64_ia64_link_hash_table_free;
   1080 
   1081   return &ret->root.root;
   1082 }
   1083 
   1084 /* Traverse both local and global hash tables.  */
   1085 
   1086 struct elf64_ia64_dyn_sym_traverse_data
   1087 {
   1088   bool (*func) (struct elf64_ia64_dyn_sym_info *, void *);
   1089   void * data;
   1090 };
   1091 
   1092 static bool
   1093 elf64_ia64_global_dyn_sym_thunk (struct elf_link_hash_entry *xentry,
   1094 				 void * xdata)
   1095 {
   1096   struct elf64_ia64_link_hash_entry *entry
   1097     = (struct elf64_ia64_link_hash_entry *) xentry;
   1098   struct elf64_ia64_dyn_sym_traverse_data *data
   1099     = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
   1100   struct elf64_ia64_dyn_sym_info *dyn_i;
   1101   unsigned int count;
   1102 
   1103   if (entry->root.root.type == bfd_link_hash_warning)
   1104     entry = (struct elf64_ia64_link_hash_entry *) entry->root.root.u.i.link;
   1105 
   1106   for (count = entry->count, dyn_i = entry->info;
   1107        count != 0;
   1108        count--, dyn_i++)
   1109     if (! (*data->func) (dyn_i, data->data))
   1110       return false;
   1111   return true;
   1112 }
   1113 
   1114 static int
   1115 elf64_ia64_local_dyn_sym_thunk (void **slot, void * xdata)
   1116 {
   1117   struct elf64_ia64_local_hash_entry *entry
   1118     = (struct elf64_ia64_local_hash_entry *) *slot;
   1119   struct elf64_ia64_dyn_sym_traverse_data *data
   1120     = (struct elf64_ia64_dyn_sym_traverse_data *) xdata;
   1121   struct elf64_ia64_dyn_sym_info *dyn_i;
   1122   unsigned int count;
   1123 
   1124   for (count = entry->count, dyn_i = entry->info;
   1125        count != 0;
   1126        count--, dyn_i++)
   1127     if (! (*data->func) (dyn_i, data->data))
   1128       return false;
   1129   return true;
   1130 }
   1131 
   1132 static void
   1133 elf64_ia64_dyn_sym_traverse (struct elf64_ia64_link_hash_table *ia64_info,
   1134 			     bool (*func) (struct elf64_ia64_dyn_sym_info *, void *),
   1135 			     void * data)
   1136 {
   1137   struct elf64_ia64_dyn_sym_traverse_data xdata;
   1138 
   1139   xdata.func = func;
   1140   xdata.data = data;
   1141 
   1142   elf_link_hash_traverse (&ia64_info->root,
   1143 			  elf64_ia64_global_dyn_sym_thunk, &xdata);
   1144   htab_traverse (ia64_info->loc_hash_table,
   1145 		 elf64_ia64_local_dyn_sym_thunk, &xdata);
   1146 }
   1147 
   1148 #define NOTE_NAME "IPF/VMS"
   1149 
   1150 static bool
   1151 create_ia64_vms_notes (bfd *abfd, struct bfd_link_info *info,
   1152 		       unsigned int time_hi, unsigned int time_lo)
   1153 {
   1154 #define NBR_NOTES 7
   1155   Elf_Internal_Note notes[NBR_NOTES];
   1156   char *module_name;
   1157   int module_name_len;
   1158   unsigned char cur_time[8];
   1159   Elf64_External_VMS_ORIG_DYN_Note *orig_dyn;
   1160   unsigned int orig_dyn_size;
   1161   unsigned int note_size;
   1162   int i;
   1163   unsigned char *noteptr;
   1164   unsigned char *note_contents;
   1165   struct elf64_ia64_link_hash_table *ia64_info;
   1166 
   1167   ia64_info = elf64_ia64_hash_table (info);
   1168 
   1169   module_name = vms_get_module_name (bfd_get_filename (abfd), true);
   1170   module_name_len = strlen (module_name) + 1;
   1171 
   1172   bfd_putl32 (time_lo, cur_time + 0);
   1173   bfd_putl32 (time_hi, cur_time + 4);
   1174 
   1175   /* Note 0: IMGNAM.  */
   1176   notes[0].type = NT_VMS_IMGNAM;
   1177   notes[0].descdata = module_name;
   1178   notes[0].descsz = module_name_len;
   1179 
   1180   /* Note 1: GSTNAM.  */
   1181   notes[1].type = NT_VMS_GSTNAM;
   1182   notes[1].descdata = module_name;
   1183   notes[1].descsz = module_name_len;
   1184 
   1185   /* Note 2: IMGID.  */
   1186 #define IMG_ID "V1.0"
   1187   notes[2].type = NT_VMS_IMGID;
   1188   notes[2].descdata = IMG_ID;
   1189   notes[2].descsz = sizeof (IMG_ID);
   1190 
   1191   /* Note 3: Linktime.  */
   1192   notes[3].type = NT_VMS_LINKTIME;
   1193   notes[3].descdata = (char *)cur_time;
   1194   notes[3].descsz = sizeof (cur_time);
   1195 
   1196   /* Note 4: Linker id.  */
   1197   notes[4].type = NT_VMS_LINKID;
   1198   notes[4].descdata = "GNU ld " BFD_VERSION_STRING;
   1199   notes[4].descsz = strlen (notes[4].descdata) + 1;
   1200 
   1201   /* Note 5: Original dyn.  */
   1202   orig_dyn_size = (sizeof (*orig_dyn) + sizeof (IMG_ID) - 1 + 7) & ~7;
   1203   orig_dyn = bfd_zalloc (abfd, orig_dyn_size);
   1204   if (orig_dyn == NULL)
   1205     return false;
   1206   bfd_putl32 (1, orig_dyn->major_id);
   1207   bfd_putl32 (3, orig_dyn->minor_id);
   1208   memcpy (orig_dyn->manipulation_date, cur_time, sizeof (cur_time));
   1209   bfd_putl64 (VMS_LF_IMGSTA | VMS_LF_MAIN, orig_dyn->link_flags);
   1210   bfd_putl32 (EF_IA_64_ABI64, orig_dyn->elf_flags);
   1211   memcpy (orig_dyn->imgid, IMG_ID, sizeof (IMG_ID));
   1212   notes[5].type = NT_VMS_ORIG_DYN;
   1213   notes[5].descdata = (char *)orig_dyn;
   1214   notes[5].descsz = orig_dyn_size;
   1215 
   1216   /* Note 3: Patchtime.  */
   1217   notes[6].type = NT_VMS_PATCHTIME;
   1218   notes[6].descdata = (char *)cur_time;
   1219   notes[6].descsz = sizeof (cur_time);
   1220 
   1221   /* Compute notes size.  */
   1222   note_size = 0;
   1223   for (i = 0; i < NBR_NOTES; i++)
   1224     note_size += sizeof (Elf64_External_VMS_Note) - 1
   1225       + ((sizeof (NOTE_NAME) - 1 + 7) & ~7)
   1226       + ((notes[i].descsz + 7) & ~7);
   1227 
   1228   /* Malloc a temporary buffer large enough for most notes */
   1229   note_contents = (unsigned char *) bfd_zalloc (abfd, note_size);
   1230   if (note_contents == NULL)
   1231     return false;
   1232   noteptr = note_contents;
   1233 
   1234   /* Fill notes.  */
   1235   for (i = 0; i < NBR_NOTES; i++)
   1236     {
   1237       Elf64_External_VMS_Note *enote = (Elf64_External_VMS_Note *) noteptr;
   1238 
   1239       bfd_putl64 (sizeof (NOTE_NAME) - 1, enote->namesz);
   1240       bfd_putl64 (notes[i].descsz, enote->descsz);
   1241       bfd_putl64 (notes[i].type, enote->type);
   1242 
   1243       noteptr = (unsigned char *)enote->name;
   1244       memcpy (noteptr, NOTE_NAME, sizeof (NOTE_NAME) - 1);
   1245       noteptr += (sizeof (NOTE_NAME) - 1 + 7) & ~7;
   1246       memcpy (noteptr, notes[i].descdata, notes[i].descsz);
   1247       noteptr += (notes[i].descsz + 7) & ~7;
   1248     }
   1249 
   1250   ia64_info->note_sec->contents = note_contents;
   1251   ia64_info->note_sec->alloced = 1;
   1252   ia64_info->note_sec->size = note_size;
   1253 
   1254   free (module_name);
   1255 
   1256   return true;
   1257 }
   1258 
   1259 static bool
   1260 elf64_ia64_create_dynamic_sections (bfd *abfd,
   1261 				    struct bfd_link_info *info)
   1262 {
   1263   struct elf64_ia64_link_hash_table *ia64_info;
   1264   asection *s;
   1265   flagword flags;
   1266   const struct elf_backend_data *bed;
   1267 
   1268   ia64_info = elf64_ia64_hash_table (info);
   1269   if (ia64_info == NULL)
   1270     return false;
   1271 
   1272   if (elf_hash_table (info)->dynamic_sections_created)
   1273     return true;
   1274 
   1275   abfd = elf_hash_table (info)->dynobj;
   1276   bed = get_elf_backend_data (abfd);
   1277 
   1278   flags = bed->dynamic_sec_flags;
   1279 
   1280   s = bfd_make_section_anyway_with_flags (abfd, ".dynamic",
   1281 					  flags | SEC_READONLY);
   1282   if (s == NULL
   1283       || !bfd_set_section_alignment (s, bed->s->log_file_align))
   1284     return false;
   1285 
   1286   s = bfd_make_section_anyway_with_flags (abfd, ".plt", flags | SEC_READONLY);
   1287   if (s == NULL
   1288       || !bfd_set_section_alignment (s, bed->plt_alignment))
   1289     return false;
   1290   ia64_info->root.splt = s;
   1291 
   1292   if (!get_got (abfd, ia64_info))
   1293     return false;
   1294 
   1295   if (!get_pltoff (abfd, ia64_info))
   1296     return false;
   1297 
   1298   s = bfd_make_section_anyway_with_flags (abfd, ".vmsdynstr",
   1299 					  (SEC_ALLOC
   1300 					   | SEC_HAS_CONTENTS
   1301 					   | SEC_IN_MEMORY
   1302 					   | SEC_LINKER_CREATED));
   1303   if (s == NULL
   1304       || !bfd_set_section_alignment (s, 0))
   1305     return false;
   1306 
   1307   /* Create a fixup section.  */
   1308   s = bfd_make_section_anyway_with_flags (abfd, ".fixups",
   1309 					  (SEC_ALLOC
   1310 					   | SEC_HAS_CONTENTS
   1311 					   | SEC_IN_MEMORY
   1312 					   | SEC_LINKER_CREATED));
   1313   if (s == NULL
   1314       || !bfd_set_section_alignment (s, 3))
   1315     return false;
   1316   ia64_info->fixups_sec = s;
   1317 
   1318   /* Create the transfer fixup section.  */
   1319   s = bfd_make_section_anyway_with_flags (abfd, ".transfer",
   1320 					  (SEC_ALLOC
   1321 					   | SEC_HAS_CONTENTS
   1322 					   | SEC_IN_MEMORY
   1323 					   | SEC_LINKER_CREATED));
   1324   if (s == NULL
   1325       || !bfd_set_section_alignment (s, 3))
   1326     return false;
   1327   s->size = sizeof (struct elf64_vms_transfer);
   1328   ia64_info->transfer_sec = s;
   1329 
   1330   /* Create note section.  */
   1331   s = bfd_make_section_anyway_with_flags (abfd, ".vms.note",
   1332 					  (SEC_LINKER_CREATED
   1333 					   | SEC_HAS_CONTENTS
   1334 					   | SEC_IN_MEMORY
   1335 					   | SEC_READONLY));
   1336   if (s == NULL
   1337       || !bfd_set_section_alignment (s, 3))
   1338     return false;
   1339   ia64_info->note_sec = s;
   1340 
   1341   elf_hash_table (info)->dynamic_sections_created = true;
   1342   return true;
   1343 }
   1344 
   1345 /* Find and/or create a hash entry for local symbol.  */
   1346 static struct elf64_ia64_local_hash_entry *
   1347 get_local_sym_hash (struct elf64_ia64_link_hash_table *ia64_info,
   1348 		    bfd *abfd, const Elf_Internal_Rela *rel,
   1349 		    bool create)
   1350 {
   1351   struct elf64_ia64_local_hash_entry e, *ret;
   1352   asection *sec = abfd->sections;
   1353   hashval_t h = ELF_LOCAL_SYMBOL_HASH (sec->id,
   1354 				       ELF64_R_SYM (rel->r_info));
   1355   void **slot;
   1356 
   1357   e.id = sec->id;
   1358   e.r_sym = ELF64_R_SYM (rel->r_info);
   1359   slot = htab_find_slot_with_hash (ia64_info->loc_hash_table, &e, h,
   1360 				   create ? INSERT : NO_INSERT);
   1361 
   1362   if (!slot)
   1363     return NULL;
   1364 
   1365   if (*slot)
   1366     return (struct elf64_ia64_local_hash_entry *) *slot;
   1367 
   1368   ret = (struct elf64_ia64_local_hash_entry *)
   1369 	objalloc_alloc ((struct objalloc *) ia64_info->loc_hash_memory,
   1370 			sizeof (struct elf64_ia64_local_hash_entry));
   1371   if (ret)
   1372     {
   1373       memset (ret, 0, sizeof (*ret));
   1374       ret->id = sec->id;
   1375       ret->r_sym = ELF64_R_SYM (rel->r_info);
   1376       *slot = ret;
   1377     }
   1378   return ret;
   1379 }
   1380 
   1381 /* Used to sort elf64_ia64_dyn_sym_info array.  */
   1382 
   1383 static int
   1384 addend_compare (const void *xp, const void *yp)
   1385 {
   1386   const struct elf64_ia64_dyn_sym_info *x
   1387     = (const struct elf64_ia64_dyn_sym_info *) xp;
   1388   const struct elf64_ia64_dyn_sym_info *y
   1389     = (const struct elf64_ia64_dyn_sym_info *) yp;
   1390 
   1391   return x->addend < y->addend ? -1 : x->addend > y->addend ? 1 : 0;
   1392 }
   1393 
   1394 /* Sort elf64_ia64_dyn_sym_info array and remove duplicates.  */
   1395 
   1396 static unsigned int
   1397 sort_dyn_sym_info (struct elf64_ia64_dyn_sym_info *info,
   1398 		   unsigned int count)
   1399 {
   1400   bfd_vma curr, prev, got_offset;
   1401   unsigned int i, kept, dupes, diff, dest, src, len;
   1402 
   1403   qsort (info, count, sizeof (*info), addend_compare);
   1404 
   1405   /* Find the first duplicate.  */
   1406   prev = info [0].addend;
   1407   got_offset = info [0].got_offset;
   1408   for (i = 1; i < count; i++)
   1409     {
   1410       curr = info [i].addend;
   1411       if (curr == prev)
   1412 	{
   1413 	  /* For duplicates, make sure that GOT_OFFSET is valid.  */
   1414 	  if (got_offset == (bfd_vma) -1)
   1415 	    got_offset = info [i].got_offset;
   1416 	  break;
   1417 	}
   1418       got_offset = info [i].got_offset;
   1419       prev = curr;
   1420     }
   1421 
   1422   /* We may move a block of elements to here.  */
   1423   dest = i++;
   1424 
   1425   /* Remove duplicates.  */
   1426   if (i < count)
   1427     {
   1428       while (i < count)
   1429 	{
   1430 	  /* For duplicates, make sure that the kept one has a valid
   1431 	     got_offset.  */
   1432 	  kept = dest - 1;
   1433 	  if (got_offset != (bfd_vma) -1)
   1434 	    info [kept].got_offset = got_offset;
   1435 
   1436 	  curr = info [i].addend;
   1437 	  got_offset = info [i].got_offset;
   1438 
   1439 	  /* Move a block of elements whose first one is different from
   1440 	     the previous.  */
   1441 	  if (curr == prev)
   1442 	    {
   1443 	      for (src = i + 1; src < count; src++)
   1444 		{
   1445 		  if (info [src].addend != curr)
   1446 		    break;
   1447 		  /* For duplicates, make sure that GOT_OFFSET is
   1448 		     valid.  */
   1449 		  if (got_offset == (bfd_vma) -1)
   1450 		    got_offset = info [src].got_offset;
   1451 		}
   1452 
   1453 	      /* Make sure that the kept one has a valid got_offset.  */
   1454 	      if (got_offset != (bfd_vma) -1)
   1455 		info [kept].got_offset = got_offset;
   1456 	    }
   1457 	  else
   1458 	    src = i;
   1459 
   1460 	  if (src >= count)
   1461 	    break;
   1462 
   1463 	  /* Find the next duplicate.  SRC will be kept.  */
   1464 	  prev = info [src].addend;
   1465 	  got_offset = info [src].got_offset;
   1466 	  for (dupes = src + 1; dupes < count; dupes ++)
   1467 	    {
   1468 	      curr = info [dupes].addend;
   1469 	      if (curr == prev)
   1470 		{
   1471 		  /* Make sure that got_offset is valid.  */
   1472 		  if (got_offset == (bfd_vma) -1)
   1473 		    got_offset = info [dupes].got_offset;
   1474 
   1475 		  /* For duplicates, make sure that the kept one has
   1476 		     a valid got_offset.  */
   1477 		  if (got_offset != (bfd_vma) -1)
   1478 		    info [dupes - 1].got_offset = got_offset;
   1479 		  break;
   1480 		}
   1481 	      got_offset = info [dupes].got_offset;
   1482 	      prev = curr;
   1483 	    }
   1484 
   1485 	  /* How much to move.  */
   1486 	  len = dupes - src;
   1487 	  i = dupes + 1;
   1488 
   1489 	  if (len == 1 && dupes < count)
   1490 	    {
   1491 	      /* If we only move 1 element, we combine it with the next
   1492 		 one.  There must be at least a duplicate.  Find the
   1493 		 next different one.  */
   1494 	      for (diff = dupes + 1, src++; diff < count; diff++, src++)
   1495 		{
   1496 		  if (info [diff].addend != curr)
   1497 		    break;
   1498 		  /* Make sure that got_offset is valid.  */
   1499 		  if (got_offset == (bfd_vma) -1)
   1500 		    got_offset = info [diff].got_offset;
   1501 		}
   1502 
   1503 	      /* Makre sure that the last duplicated one has an valid
   1504 		 offset.  */
   1505 	      BFD_ASSERT (curr == prev);
   1506 	      if (got_offset != (bfd_vma) -1)
   1507 		info [diff - 1].got_offset = got_offset;
   1508 
   1509 	      if (diff < count)
   1510 		{
   1511 		  /* Find the next duplicate.  Track the current valid
   1512 		     offset.  */
   1513 		  prev = info [diff].addend;
   1514 		  got_offset = info [diff].got_offset;
   1515 		  for (dupes = diff + 1; dupes < count; dupes ++)
   1516 		    {
   1517 		      curr = info [dupes].addend;
   1518 		      if (curr == prev)
   1519 			{
   1520 			  /* For duplicates, make sure that GOT_OFFSET
   1521 			     is valid.  */
   1522 			  if (got_offset == (bfd_vma) -1)
   1523 			    got_offset = info [dupes].got_offset;
   1524 			  break;
   1525 			}
   1526 		      got_offset = info [dupes].got_offset;
   1527 		      prev = curr;
   1528 		      diff++;
   1529 		    }
   1530 
   1531 		  len = diff - src + 1;
   1532 		  i = diff + 1;
   1533 		}
   1534 	    }
   1535 
   1536 	  memmove (&info [dest], &info [src], len * sizeof (*info));
   1537 
   1538 	  dest += len;
   1539 	}
   1540 
   1541       count = dest;
   1542     }
   1543   else
   1544     {
   1545       /* When we get here, either there is no duplicate at all or
   1546 	 the only duplicate is the last element.  */
   1547       if (dest < count)
   1548 	{
   1549 	  /* If the last element is a duplicate, make sure that the
   1550 	     kept one has a valid got_offset.  We also update count.  */
   1551 	  if (got_offset != (bfd_vma) -1)
   1552 	    info [dest - 1].got_offset = got_offset;
   1553 	  count = dest;
   1554 	}
   1555     }
   1556 
   1557   return count;
   1558 }
   1559 
   1560 /* Find and/or create a descriptor for dynamic symbol info.  This will
   1561    vary based on global or local symbol, and the addend to the reloc.
   1562 
   1563    We don't sort when inserting.  Also, we sort and eliminate
   1564    duplicates if there is an unsorted section.  Typically, this will
   1565    only happen once, because we do all insertions before lookups.  We
   1566    then use bsearch to do a lookup.  This also allows lookups to be
   1567    fast.  So we have fast insertion (O(log N) due to duplicate check),
   1568    fast lookup (O(log N)) and one sort (O(N log N) expected time).
   1569    Previously, all lookups were O(N) because of the use of the linked
   1570    list and also all insertions were O(N) because of the check for
   1571    duplicates.  There are some complications here because the array
   1572    size grows occasionally, which may add an O(N) factor, but this
   1573    should be rare.  Also,  we free the excess array allocation, which
   1574    requires a copy which is O(N), but this only happens once.  */
   1575 
   1576 static struct elf64_ia64_dyn_sym_info *
   1577 get_dyn_sym_info (struct elf64_ia64_link_hash_table *ia64_info,
   1578 		  struct elf_link_hash_entry *h, bfd *abfd,
   1579 		  const Elf_Internal_Rela *rel, bool create)
   1580 {
   1581   struct elf64_ia64_dyn_sym_info **info_p, *info, *dyn_i, key;
   1582   unsigned int *count_p, *sorted_count_p, *size_p;
   1583   unsigned int count, sorted_count, size;
   1584   bfd_vma addend = rel ? rel->r_addend : 0;
   1585   bfd_size_type amt;
   1586 
   1587   if (h)
   1588     {
   1589       struct elf64_ia64_link_hash_entry *global_h;
   1590 
   1591       global_h = (struct elf64_ia64_link_hash_entry *) h;
   1592       info_p = &global_h->info;
   1593       count_p = &global_h->count;
   1594       sorted_count_p = &global_h->sorted_count;
   1595       size_p = &global_h->size;
   1596     }
   1597   else
   1598     {
   1599       struct elf64_ia64_local_hash_entry *loc_h;
   1600 
   1601       loc_h = get_local_sym_hash (ia64_info, abfd, rel, create);
   1602       if (!loc_h)
   1603 	{
   1604 	  BFD_ASSERT (!create);
   1605 	  return NULL;
   1606 	}
   1607 
   1608       info_p = &loc_h->info;
   1609       count_p = &loc_h->count;
   1610       sorted_count_p = &loc_h->sorted_count;
   1611       size_p = &loc_h->size;
   1612     }
   1613 
   1614   count = *count_p;
   1615   sorted_count = *sorted_count_p;
   1616   size = *size_p;
   1617   info = *info_p;
   1618   if (create)
   1619     {
   1620       /* When we create the array, we don't check for duplicates,
   1621 	 except in the previously sorted section if one exists, and
   1622 	 against the last inserted entry.  This allows insertions to
   1623 	 be fast.  */
   1624       if (info)
   1625 	{
   1626 	  if (sorted_count)
   1627 	    {
   1628 	      /* Try bsearch first on the sorted section.  */
   1629 	      key.addend = addend;
   1630 	      dyn_i = bsearch (&key, info, sorted_count,
   1631 			       sizeof (*info), addend_compare);
   1632 
   1633 	      if (dyn_i)
   1634 		{
   1635 		  return dyn_i;
   1636 		}
   1637 	    }
   1638 
   1639 	  /* Do a quick check for the last inserted entry.  */
   1640 	  dyn_i = info + count - 1;
   1641 	  if (dyn_i->addend == addend)
   1642 	    {
   1643 	      return dyn_i;
   1644 	    }
   1645 	}
   1646 
   1647       if (size == 0)
   1648 	{
   1649 	  /* It is the very first element. We create the array of size
   1650 	     1.  */
   1651 	  size = 1;
   1652 	  amt = size * sizeof (*info);
   1653 	  info = bfd_malloc (amt);
   1654 	}
   1655       else if (size <= count)
   1656 	{
   1657 	  /* We double the array size every time when we reach the
   1658 	     size limit.  */
   1659 	  size += size;
   1660 	  amt = size * sizeof (*info);
   1661 	  info = bfd_realloc (info, amt);
   1662 	}
   1663       else
   1664 	goto has_space;
   1665 
   1666       if (info == NULL)
   1667 	return NULL;
   1668       *size_p = size;
   1669       *info_p = info;
   1670 
   1671     has_space:
   1672       /* Append the new one to the array.  */
   1673       dyn_i = info + count;
   1674       memset (dyn_i, 0, sizeof (*dyn_i));
   1675       dyn_i->got_offset = (bfd_vma) -1;
   1676       dyn_i->addend = addend;
   1677 
   1678       /* We increment count only since the new ones are unsorted and
   1679 	 may have duplicate.  */
   1680       (*count_p)++;
   1681     }
   1682   else
   1683     {
   1684       /* It is a lookup without insertion.  Sort array if part of the
   1685 	 array isn't sorted.  */
   1686       if (count != sorted_count)
   1687 	{
   1688 	  count = sort_dyn_sym_info (info, count);
   1689 	  *count_p = count;
   1690 	  *sorted_count_p = count;
   1691 	}
   1692 
   1693       /* Free unused memory.  */
   1694       if (size != count)
   1695 	{
   1696 	  amt = count * sizeof (*info);
   1697 	  info = bfd_malloc (amt);
   1698 	  if (info != NULL)
   1699 	    {
   1700 	      memcpy (info, *info_p, amt);
   1701 	      free (*info_p);
   1702 	      *size_p = count;
   1703 	      *info_p = info;
   1704 	    }
   1705 	}
   1706 
   1707       key.addend = addend;
   1708       dyn_i = bsearch (&key, info, count,
   1709 		       sizeof (*info), addend_compare);
   1710     }
   1711 
   1712   return dyn_i;
   1713 }
   1714 
   1715 static asection *
   1716 get_got (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
   1717 {
   1718   asection *got;
   1719   bfd *dynobj;
   1720 
   1721   got = ia64_info->root.sgot;
   1722   if (!got)
   1723     {
   1724       flagword flags;
   1725 
   1726       dynobj = ia64_info->root.dynobj;
   1727       if (!dynobj)
   1728 	ia64_info->root.dynobj = dynobj = abfd;
   1729 
   1730       /* The .got section is always aligned at 8 bytes.  */
   1731       flags = get_elf_backend_data (dynobj)->dynamic_sec_flags;
   1732       got = bfd_make_section_anyway_with_flags (dynobj, ".got",
   1733 						flags | SEC_SMALL_DATA);
   1734       if (got == NULL
   1735 	  || !bfd_set_section_alignment (got, 3))
   1736 	return NULL;
   1737       ia64_info->root.sgot = got;
   1738     }
   1739 
   1740   return got;
   1741 }
   1742 
   1743 /* Create function descriptor section (.opd).  This section is called .opd
   1744    because it contains "official procedure descriptors".  The "official"
   1745    refers to the fact that these descriptors are used when taking the address
   1746    of a procedure, thus ensuring a unique address for each procedure.  */
   1747 
   1748 static asection *
   1749 get_fptr (bfd *abfd, struct bfd_link_info *info,
   1750 	  struct elf64_ia64_link_hash_table *ia64_info)
   1751 {
   1752   asection *fptr;
   1753   bfd *dynobj;
   1754 
   1755   fptr = ia64_info->fptr_sec;
   1756   if (!fptr)
   1757     {
   1758       dynobj = ia64_info->root.dynobj;
   1759       if (!dynobj)
   1760 	ia64_info->root.dynobj = dynobj = abfd;
   1761 
   1762       fptr = bfd_make_section_anyway_with_flags (dynobj, ".opd",
   1763 						 (SEC_ALLOC
   1764 						  | SEC_LOAD
   1765 						  | SEC_HAS_CONTENTS
   1766 						  | SEC_IN_MEMORY
   1767 						  | (bfd_link_pie (info) ? 0
   1768 						     : SEC_READONLY)
   1769 						  | SEC_LINKER_CREATED));
   1770       if (!fptr
   1771 	  || !bfd_set_section_alignment (fptr, 4))
   1772 	{
   1773 	  BFD_ASSERT (0);
   1774 	  return NULL;
   1775 	}
   1776 
   1777       ia64_info->fptr_sec = fptr;
   1778 
   1779       if (bfd_link_pie (info))
   1780 	{
   1781 	  asection *fptr_rel;
   1782 	  fptr_rel = bfd_make_section_anyway_with_flags (dynobj, ".rela.opd",
   1783 							 (SEC_ALLOC | SEC_LOAD
   1784 							  | SEC_HAS_CONTENTS
   1785 							  | SEC_IN_MEMORY
   1786 							  | SEC_LINKER_CREATED
   1787 							  | SEC_READONLY));
   1788 	  if (fptr_rel == NULL
   1789 	      || !bfd_set_section_alignment (fptr_rel, 3))
   1790 	    {
   1791 	      BFD_ASSERT (0);
   1792 	      return NULL;
   1793 	    }
   1794 
   1795 	  ia64_info->rel_fptr_sec = fptr_rel;
   1796 	}
   1797     }
   1798 
   1799   return fptr;
   1800 }
   1801 
   1802 static asection *
   1803 get_pltoff (bfd *abfd, struct elf64_ia64_link_hash_table *ia64_info)
   1804 {
   1805   asection *pltoff;
   1806   bfd *dynobj;
   1807 
   1808   pltoff = ia64_info->pltoff_sec;
   1809   if (!pltoff)
   1810     {
   1811       dynobj = ia64_info->root.dynobj;
   1812       if (!dynobj)
   1813 	ia64_info->root.dynobj = dynobj = abfd;
   1814 
   1815       pltoff = bfd_make_section_anyway_with_flags (dynobj,
   1816 						   ELF_STRING_ia64_pltoff,
   1817 						   (SEC_ALLOC
   1818 						    | SEC_LOAD
   1819 						    | SEC_HAS_CONTENTS
   1820 						    | SEC_IN_MEMORY
   1821 						    | SEC_SMALL_DATA
   1822 						    | SEC_LINKER_CREATED));
   1823       if (!pltoff
   1824 	  || !bfd_set_section_alignment (pltoff, 4))
   1825 	{
   1826 	  BFD_ASSERT (0);
   1827 	  return NULL;
   1828 	}
   1829 
   1830       ia64_info->pltoff_sec = pltoff;
   1831     }
   1832 
   1833   return pltoff;
   1834 }
   1835 
   1836 static asection *
   1837 get_reloc_section (bfd *abfd,
   1838 		   struct elf64_ia64_link_hash_table *ia64_info,
   1839 		   asection *sec, bool create)
   1840 {
   1841   const char *srel_name;
   1842   asection *srel;
   1843   bfd *dynobj;
   1844 
   1845   srel_name = (bfd_elf_string_from_elf_section
   1846 	       (abfd, elf_elfheader(abfd)->e_shstrndx,
   1847 		_bfd_elf_single_rel_hdr (sec)->sh_name));
   1848   if (srel_name == NULL)
   1849     return NULL;
   1850 
   1851   BFD_ASSERT ((startswith (srel_name, ".rela")
   1852 	       && strcmp (bfd_section_name (sec), srel_name+5) == 0)
   1853 	      || (startswith (srel_name, ".rel")
   1854 		  && strcmp (bfd_section_name (sec), srel_name+4) == 0));
   1855 
   1856   dynobj = ia64_info->root.dynobj;
   1857   if (!dynobj)
   1858     ia64_info->root.dynobj = dynobj = abfd;
   1859 
   1860   srel = bfd_get_linker_section (dynobj, srel_name);
   1861   if (srel == NULL && create)
   1862     {
   1863       srel = bfd_make_section_anyway_with_flags (dynobj, srel_name,
   1864 						 (SEC_ALLOC | SEC_LOAD
   1865 						  | SEC_HAS_CONTENTS
   1866 						  | SEC_IN_MEMORY
   1867 						  | SEC_LINKER_CREATED
   1868 						  | SEC_READONLY));
   1869       if (srel == NULL
   1870 	  || !bfd_set_section_alignment (srel, 3))
   1871 	return NULL;
   1872     }
   1873 
   1874   return srel;
   1875 }
   1876 
   1877 static bool
   1878 count_dyn_reloc (bfd *abfd, struct elf64_ia64_dyn_sym_info *dyn_i,
   1879 		 asection *srel, int type)
   1880 {
   1881   struct elf64_ia64_dyn_reloc_entry *rent;
   1882 
   1883   for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
   1884     if (rent->srel == srel && rent->type == type)
   1885       break;
   1886 
   1887   if (!rent)
   1888     {
   1889       rent = ((struct elf64_ia64_dyn_reloc_entry *)
   1890 	      bfd_alloc (abfd, (bfd_size_type) sizeof (*rent)));
   1891       if (!rent)
   1892 	return false;
   1893 
   1894       rent->next = dyn_i->reloc_entries;
   1895       rent->srel = srel;
   1896       rent->type = type;
   1897       rent->count = 0;
   1898       dyn_i->reloc_entries = rent;
   1899     }
   1900   rent->count++;
   1901 
   1902   return true;
   1903 }
   1904 
   1905 static bool
   1906 elf64_ia64_check_relocs (bfd *abfd, struct bfd_link_info *info,
   1907 			 asection *sec,
   1908 			 const Elf_Internal_Rela *relocs)
   1909 {
   1910   struct elf64_ia64_link_hash_table *ia64_info;
   1911   const Elf_Internal_Rela *relend;
   1912   Elf_Internal_Shdr *symtab_hdr;
   1913   const Elf_Internal_Rela *rel;
   1914   asection *got, *fptr, *srel, *pltoff;
   1915   enum {
   1916     NEED_GOT = 1,
   1917     NEED_GOTX = 2,
   1918     NEED_FPTR = 4,
   1919     NEED_PLTOFF = 8,
   1920     NEED_MIN_PLT = 16,
   1921     NEED_FULL_PLT = 32,
   1922     NEED_DYNREL = 64,
   1923     NEED_LTOFF_FPTR = 128
   1924   };
   1925   int need_entry;
   1926   struct elf_link_hash_entry *h;
   1927   unsigned long r_symndx;
   1928   bool maybe_dynamic;
   1929 
   1930   if (bfd_link_relocatable (info))
   1931     return true;
   1932 
   1933   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
   1934   ia64_info = elf64_ia64_hash_table (info);
   1935   if (ia64_info == NULL)
   1936     return false;
   1937 
   1938   got = fptr = srel = pltoff = NULL;
   1939 
   1940   relend = relocs + sec->reloc_count;
   1941 
   1942   /* We scan relocations first to create dynamic relocation arrays.  We
   1943      modified get_dyn_sym_info to allow fast insertion and support fast
   1944      lookup in the next loop.  */
   1945   for (rel = relocs; rel < relend; ++rel)
   1946     {
   1947       r_symndx = ELF64_R_SYM (rel->r_info);
   1948       if (r_symndx >= symtab_hdr->sh_info)
   1949 	{
   1950 	  long indx = r_symndx - symtab_hdr->sh_info;
   1951 	  h = elf_sym_hashes (abfd)[indx];
   1952 	  while (h->root.type == bfd_link_hash_indirect
   1953 		 || h->root.type == bfd_link_hash_warning)
   1954 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   1955 	}
   1956       else
   1957 	h = NULL;
   1958 
   1959       /* We can only get preliminary data on whether a symbol is
   1960 	 locally or externally defined, as not all of the input files
   1961 	 have yet been processed.  Do something with what we know, as
   1962 	 this may help reduce memory usage and processing time later.  */
   1963       maybe_dynamic = (h && ((!bfd_link_executable (info)
   1964 			      && (!SYMBOLIC_BIND (info, h)
   1965 				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
   1966 			     || !h->def_regular
   1967 			     || h->root.type == bfd_link_hash_defweak));
   1968 
   1969       need_entry = 0;
   1970       switch (ELF64_R_TYPE (rel->r_info))
   1971 	{
   1972 	case R_IA64_TPREL64MSB:
   1973 	case R_IA64_TPREL64LSB:
   1974 	case R_IA64_LTOFF_TPREL22:
   1975 	case R_IA64_DTPREL32MSB:
   1976 	case R_IA64_DTPREL32LSB:
   1977 	case R_IA64_DTPREL64MSB:
   1978 	case R_IA64_DTPREL64LSB:
   1979 	case R_IA64_LTOFF_DTPREL22:
   1980 	case R_IA64_DTPMOD64MSB:
   1981 	case R_IA64_DTPMOD64LSB:
   1982 	case R_IA64_LTOFF_DTPMOD22:
   1983 	  abort ();
   1984 	  break;
   1985 
   1986 	case R_IA64_IPLTMSB:
   1987 	case R_IA64_IPLTLSB:
   1988 	  break;
   1989 
   1990 	case R_IA64_LTOFF_FPTR22:
   1991 	case R_IA64_LTOFF_FPTR64I:
   1992 	case R_IA64_LTOFF_FPTR32MSB:
   1993 	case R_IA64_LTOFF_FPTR32LSB:
   1994 	case R_IA64_LTOFF_FPTR64MSB:
   1995 	case R_IA64_LTOFF_FPTR64LSB:
   1996 	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
   1997 	  break;
   1998 
   1999 	case R_IA64_FPTR64I:
   2000 	case R_IA64_FPTR32MSB:
   2001 	case R_IA64_FPTR32LSB:
   2002 	case R_IA64_FPTR64MSB:
   2003 	case R_IA64_FPTR64LSB:
   2004 	  if (bfd_link_pic (info) || h)
   2005 	    need_entry = NEED_FPTR | NEED_DYNREL;
   2006 	  else
   2007 	    need_entry = NEED_FPTR;
   2008 	  break;
   2009 
   2010 	case R_IA64_LTOFF22:
   2011 	case R_IA64_LTOFF64I:
   2012 	  need_entry = NEED_GOT;
   2013 	  break;
   2014 
   2015 	case R_IA64_LTOFF22X:
   2016 	  need_entry = NEED_GOTX;
   2017 	  break;
   2018 
   2019 	case R_IA64_PLTOFF22:
   2020 	case R_IA64_PLTOFF64I:
   2021 	case R_IA64_PLTOFF64MSB:
   2022 	case R_IA64_PLTOFF64LSB:
   2023 	  need_entry = NEED_PLTOFF;
   2024 	  if (h)
   2025 	    {
   2026 	      if (maybe_dynamic)
   2027 		need_entry |= NEED_MIN_PLT;
   2028 	    }
   2029 	  else
   2030 	    {
   2031 	      (*info->callbacks->warning)
   2032 		(info, _("@pltoff reloc against local symbol"), 0,
   2033 		 abfd, 0, (bfd_vma) 0);
   2034 	    }
   2035 	  break;
   2036 
   2037 	case R_IA64_PCREL21B:
   2038 	case R_IA64_PCREL60B:
   2039 	  /* Depending on where this symbol is defined, we may or may not
   2040 	     need a full plt entry.  Only skip if we know we'll not need
   2041 	     the entry -- static or symbolic, and the symbol definition
   2042 	     has already been seen.  */
   2043 	  if (maybe_dynamic && rel->r_addend == 0)
   2044 	    need_entry = NEED_FULL_PLT;
   2045 	  break;
   2046 
   2047 	case R_IA64_IMM14:
   2048 	case R_IA64_IMM22:
   2049 	case R_IA64_IMM64:
   2050 	case R_IA64_DIR32MSB:
   2051 	case R_IA64_DIR32LSB:
   2052 	case R_IA64_DIR64MSB:
   2053 	case R_IA64_DIR64LSB:
   2054 	  /* Shared objects will always need at least a REL relocation.  */
   2055 	  if (bfd_link_pic (info) || maybe_dynamic)
   2056 	    need_entry = NEED_DYNREL;
   2057 	  break;
   2058 
   2059 	case R_IA64_PCREL22:
   2060 	case R_IA64_PCREL64I:
   2061 	case R_IA64_PCREL32MSB:
   2062 	case R_IA64_PCREL32LSB:
   2063 	case R_IA64_PCREL64MSB:
   2064 	case R_IA64_PCREL64LSB:
   2065 	  if (maybe_dynamic)
   2066 	    need_entry = NEED_DYNREL;
   2067 	  break;
   2068 	}
   2069 
   2070       if (!need_entry)
   2071 	continue;
   2072 
   2073       if ((need_entry & NEED_FPTR) != 0
   2074 	  && rel->r_addend)
   2075 	{
   2076 	  (*info->callbacks->warning)
   2077 	    (info, _("non-zero addend in @fptr reloc"), 0,
   2078 	     abfd, 0, (bfd_vma) 0);
   2079 	}
   2080 
   2081       if (get_dyn_sym_info (ia64_info, h, abfd, rel, true) == NULL)
   2082 	return false;
   2083     }
   2084 
   2085   /* Now, we only do lookup without insertion, which is very fast
   2086      with the modified get_dyn_sym_info.  */
   2087   for (rel = relocs; rel < relend; ++rel)
   2088     {
   2089       struct elf64_ia64_dyn_sym_info *dyn_i;
   2090       int dynrel_type = R_IA64_NONE;
   2091 
   2092       r_symndx = ELF64_R_SYM (rel->r_info);
   2093       if (r_symndx >= symtab_hdr->sh_info)
   2094 	{
   2095 	  /* We're dealing with a global symbol -- find its hash entry
   2096 	     and mark it as being referenced.  */
   2097 	  long indx = r_symndx - symtab_hdr->sh_info;
   2098 	  h = elf_sym_hashes (abfd)[indx];
   2099 	  while (h->root.type == bfd_link_hash_indirect
   2100 		 || h->root.type == bfd_link_hash_warning)
   2101 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2102 
   2103 	  /* PR15323, ref flags aren't set for references in the same
   2104 	     object.  */
   2105 	  h->ref_regular = 1;
   2106 	}
   2107       else
   2108 	h = NULL;
   2109 
   2110       /* We can only get preliminary data on whether a symbol is
   2111 	 locally or externally defined, as not all of the input files
   2112 	 have yet been processed.  Do something with what we know, as
   2113 	 this may help reduce memory usage and processing time later.  */
   2114       maybe_dynamic = (h && ((!bfd_link_executable (info)
   2115 			      && (!SYMBOLIC_BIND (info, h)
   2116 				  || info->unresolved_syms_in_shared_libs == RM_IGNORE))
   2117 			     || !h->def_regular
   2118 			     || h->root.type == bfd_link_hash_defweak));
   2119 
   2120       need_entry = 0;
   2121       switch (ELF64_R_TYPE (rel->r_info))
   2122 	{
   2123 	case R_IA64_TPREL64MSB:
   2124 	case R_IA64_TPREL64LSB:
   2125 	case R_IA64_LTOFF_TPREL22:
   2126 	case R_IA64_DTPREL32MSB:
   2127 	case R_IA64_DTPREL32LSB:
   2128 	case R_IA64_DTPREL64MSB:
   2129 	case R_IA64_DTPREL64LSB:
   2130 	case R_IA64_LTOFF_DTPREL22:
   2131 	case R_IA64_DTPMOD64MSB:
   2132 	case R_IA64_DTPMOD64LSB:
   2133 	case R_IA64_LTOFF_DTPMOD22:
   2134 	  abort ();
   2135 	  break;
   2136 
   2137 	case R_IA64_LTOFF_FPTR22:
   2138 	case R_IA64_LTOFF_FPTR64I:
   2139 	case R_IA64_LTOFF_FPTR32MSB:
   2140 	case R_IA64_LTOFF_FPTR32LSB:
   2141 	case R_IA64_LTOFF_FPTR64MSB:
   2142 	case R_IA64_LTOFF_FPTR64LSB:
   2143 	  need_entry = NEED_FPTR | NEED_GOT | NEED_LTOFF_FPTR;
   2144 	  break;
   2145 
   2146 	case R_IA64_FPTR64I:
   2147 	case R_IA64_FPTR32MSB:
   2148 	case R_IA64_FPTR32LSB:
   2149 	case R_IA64_FPTR64MSB:
   2150 	case R_IA64_FPTR64LSB:
   2151 	  if (bfd_link_pic (info) || h)
   2152 	    need_entry = NEED_FPTR | NEED_DYNREL;
   2153 	  else
   2154 	    need_entry = NEED_FPTR;
   2155 	  dynrel_type = R_IA64_FPTR64LSB;
   2156 	  break;
   2157 
   2158 	case R_IA64_LTOFF22:
   2159 	case R_IA64_LTOFF64I:
   2160 	  need_entry = NEED_GOT;
   2161 	  break;
   2162 
   2163 	case R_IA64_LTOFF22X:
   2164 	  need_entry = NEED_GOTX;
   2165 	  break;
   2166 
   2167 	case R_IA64_PLTOFF22:
   2168 	case R_IA64_PLTOFF64I:
   2169 	case R_IA64_PLTOFF64MSB:
   2170 	case R_IA64_PLTOFF64LSB:
   2171 	  need_entry = NEED_PLTOFF;
   2172 	  if (h)
   2173 	    {
   2174 	      if (maybe_dynamic)
   2175 		need_entry |= NEED_MIN_PLT;
   2176 	    }
   2177 	  break;
   2178 
   2179 	case R_IA64_PCREL21B:
   2180 	case R_IA64_PCREL60B:
   2181 	  /* Depending on where this symbol is defined, we may or may not
   2182 	     need a full plt entry.  Only skip if we know we'll not need
   2183 	     the entry -- static or symbolic, and the symbol definition
   2184 	     has already been seen.  */
   2185 	  if (maybe_dynamic && rel->r_addend == 0)
   2186 	    need_entry = NEED_FULL_PLT;
   2187 	  break;
   2188 
   2189 	case R_IA64_IMM14:
   2190 	case R_IA64_IMM22:
   2191 	case R_IA64_IMM64:
   2192 	case R_IA64_DIR32MSB:
   2193 	case R_IA64_DIR32LSB:
   2194 	case R_IA64_DIR64MSB:
   2195 	case R_IA64_DIR64LSB:
   2196 	  /* Shared objects will always need at least a REL relocation.  */
   2197 	  if (bfd_link_pic (info) || maybe_dynamic)
   2198 	    need_entry = NEED_DYNREL;
   2199 	  dynrel_type = R_IA64_DIR64LSB;
   2200 	  break;
   2201 
   2202 	case R_IA64_IPLTMSB:
   2203 	case R_IA64_IPLTLSB:
   2204 	  break;
   2205 
   2206 	case R_IA64_PCREL22:
   2207 	case R_IA64_PCREL64I:
   2208 	case R_IA64_PCREL32MSB:
   2209 	case R_IA64_PCREL32LSB:
   2210 	case R_IA64_PCREL64MSB:
   2211 	case R_IA64_PCREL64LSB:
   2212 	  if (maybe_dynamic)
   2213 	    need_entry = NEED_DYNREL;
   2214 	  dynrel_type = R_IA64_PCREL64LSB;
   2215 	  break;
   2216 	}
   2217 
   2218       if (!need_entry)
   2219 	continue;
   2220 
   2221       dyn_i = get_dyn_sym_info (ia64_info, h, abfd, rel, false);
   2222 
   2223       /* Record whether or not this is a local symbol.  */
   2224       dyn_i->h = h;
   2225 
   2226       /* Create what's needed.  */
   2227       if (need_entry & (NEED_GOT | NEED_GOTX))
   2228 	{
   2229 	  if (!got)
   2230 	    {
   2231 	      got = get_got (abfd, ia64_info);
   2232 	      if (!got)
   2233 		return false;
   2234 	    }
   2235 	  if (need_entry & NEED_GOT)
   2236 	    dyn_i->want_got = 1;
   2237 	  if (need_entry & NEED_GOTX)
   2238 	    dyn_i->want_gotx = 1;
   2239 	}
   2240       if (need_entry & NEED_FPTR)
   2241 	{
   2242 	  /* Create the .opd section.  */
   2243 	  if (!fptr)
   2244 	    {
   2245 	      fptr = get_fptr (abfd, info, ia64_info);
   2246 	      if (!fptr)
   2247 		return false;
   2248 	    }
   2249 	  dyn_i->want_fptr = 1;
   2250 	}
   2251       if (need_entry & NEED_LTOFF_FPTR)
   2252 	dyn_i->want_ltoff_fptr = 1;
   2253       if (need_entry & (NEED_MIN_PLT | NEED_FULL_PLT))
   2254 	{
   2255 	  if (!ia64_info->root.dynobj)
   2256 	    ia64_info->root.dynobj = abfd;
   2257 	  h->needs_plt = 1;
   2258 	  dyn_i->want_plt = 1;
   2259 	}
   2260       if (need_entry & NEED_FULL_PLT)
   2261 	dyn_i->want_plt2 = 1;
   2262       if (need_entry & NEED_PLTOFF)
   2263 	{
   2264 	  /* This is needed here, in case @pltoff is used in a non-shared
   2265 	     link.  */
   2266 	  if (!pltoff)
   2267 	    {
   2268 	      pltoff = get_pltoff (abfd, ia64_info);
   2269 	      if (!pltoff)
   2270 		return false;
   2271 	    }
   2272 
   2273 	  dyn_i->want_pltoff = 1;
   2274 	}
   2275       if ((need_entry & NEED_DYNREL) && (sec->flags & SEC_ALLOC))
   2276 	{
   2277 	  if (!srel)
   2278 	    {
   2279 	      srel = get_reloc_section (abfd, ia64_info, sec, true);
   2280 	      if (!srel)
   2281 		return false;
   2282 	    }
   2283 	  if (!count_dyn_reloc (abfd, dyn_i, srel, dynrel_type))
   2284 	    return false;
   2285 	}
   2286     }
   2287 
   2288   return true;
   2289 }
   2290 
   2291 /* For cleanliness, and potentially faster dynamic loading, allocate
   2292    external GOT entries first.  */
   2293 
   2294 static bool
   2295 allocate_global_data_got (struct elf64_ia64_dyn_sym_info *dyn_i,
   2296 			  void * data)
   2297 {
   2298   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
   2299 
   2300   if ((dyn_i->want_got || dyn_i->want_gotx)
   2301       && ! dyn_i->want_fptr
   2302       && elf64_ia64_dynamic_symbol_p (dyn_i->h))
   2303      {
   2304        /* GOT entry with FPTR is done by allocate_global_fptr_got.  */
   2305        dyn_i->got_offset = x->ofs;
   2306        x->ofs += 8;
   2307      }
   2308   return true;
   2309 }
   2310 
   2311 /* Next, allocate all the GOT entries used by LTOFF_FPTR relocs.  */
   2312 
   2313 static bool
   2314 allocate_global_fptr_got (struct elf64_ia64_dyn_sym_info *dyn_i,
   2315 			  void * data)
   2316 {
   2317   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
   2318 
   2319   if (dyn_i->want_got
   2320       && dyn_i->want_fptr
   2321       && elf64_ia64_dynamic_symbol_p (dyn_i->h))
   2322     {
   2323       dyn_i->got_offset = x->ofs;
   2324       x->ofs += 8;
   2325     }
   2326   return true;
   2327 }
   2328 
   2329 /* Lastly, allocate all the GOT entries for local data.  */
   2330 
   2331 static bool
   2332 allocate_local_got (struct elf64_ia64_dyn_sym_info *dyn_i,
   2333 		    void * data)
   2334 {
   2335   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
   2336 
   2337   if ((dyn_i->want_got || dyn_i->want_gotx)
   2338       && !elf64_ia64_dynamic_symbol_p (dyn_i->h))
   2339     {
   2340       dyn_i->got_offset = x->ofs;
   2341       x->ofs += 8;
   2342     }
   2343   return true;
   2344 }
   2345 
   2346 /* Allocate function descriptors.  We can do these for every function
   2347    in a main executable that is not exported.  */
   2348 
   2349 static bool
   2350 allocate_fptr (struct elf64_ia64_dyn_sym_info *dyn_i, void * data)
   2351 {
   2352   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *) data;
   2353 
   2354   if (dyn_i->want_fptr)
   2355     {
   2356       struct elf_link_hash_entry *h = dyn_i->h;
   2357 
   2358       if (h)
   2359 	while (h->root.type == bfd_link_hash_indirect
   2360 	       || h->root.type == bfd_link_hash_warning)
   2361 	  h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2362 
   2363       if (h == NULL || !h->def_dynamic)
   2364 	{
   2365 	  /*  A non dynamic symbol.  */
   2366 	  dyn_i->fptr_offset = x->ofs;
   2367 	  x->ofs += 16;
   2368 	}
   2369       else
   2370 	dyn_i->want_fptr = 0;
   2371     }
   2372   return true;
   2373 }
   2374 
   2375 /* Allocate all the minimal PLT entries.  */
   2376 
   2377 static bool
   2378 allocate_plt_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
   2379 		      void * data ATTRIBUTE_UNUSED)
   2380 {
   2381   if (dyn_i->want_plt)
   2382     {
   2383       struct elf_link_hash_entry *h = dyn_i->h;
   2384 
   2385       if (h)
   2386 	while (h->root.type == bfd_link_hash_indirect
   2387 	       || h->root.type == bfd_link_hash_warning)
   2388 	  h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2389 
   2390       /* ??? Versioned symbols seem to lose NEEDS_PLT.  */
   2391       if (elf64_ia64_dynamic_symbol_p (h))
   2392 	{
   2393 	  dyn_i->want_pltoff = 1;
   2394 	}
   2395       else
   2396 	{
   2397 	  dyn_i->want_plt = 0;
   2398 	  dyn_i->want_plt2 = 0;
   2399 	}
   2400     }
   2401   return true;
   2402 }
   2403 
   2404 /* Allocate all the full PLT entries.  */
   2405 
   2406 static bool
   2407 allocate_plt2_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
   2408 		       void * data)
   2409 {
   2410   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
   2411 
   2412   if (dyn_i->want_plt2)
   2413     {
   2414       struct elf_link_hash_entry *h = dyn_i->h;
   2415       bfd_size_type ofs = x->ofs;
   2416 
   2417       dyn_i->plt2_offset = ofs;
   2418       x->ofs = ofs + PLT_FULL_ENTRY_SIZE;
   2419 
   2420       while (h->root.type == bfd_link_hash_indirect
   2421 	     || h->root.type == bfd_link_hash_warning)
   2422 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
   2423       dyn_i->h->plt.offset = ofs;
   2424     }
   2425   return true;
   2426 }
   2427 
   2428 /* Allocate all the PLTOFF entries requested by relocations and
   2429    plt entries.  We can't share space with allocated FPTR entries,
   2430    because the latter are not necessarily addressable by the GP.
   2431    ??? Relaxation might be able to determine that they are.  */
   2432 
   2433 static bool
   2434 allocate_pltoff_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
   2435 			 void * data)
   2436 {
   2437   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
   2438 
   2439   if (dyn_i->want_pltoff)
   2440     {
   2441       dyn_i->pltoff_offset = x->ofs;
   2442       x->ofs += 16;
   2443     }
   2444   return true;
   2445 }
   2446 
   2447 /* Allocate dynamic relocations for those symbols that turned out
   2448    to be dynamic.  */
   2449 
   2450 static bool
   2451 allocate_dynrel_entries (struct elf64_ia64_dyn_sym_info *dyn_i,
   2452 			 void * data)
   2453 {
   2454   struct elf64_ia64_allocate_data *x = (struct elf64_ia64_allocate_data *)data;
   2455   struct elf64_ia64_link_hash_table *ia64_info;
   2456   struct elf64_ia64_dyn_reloc_entry *rent;
   2457   bool dynamic_symbol, shared, resolved_zero;
   2458   struct elf64_ia64_link_hash_entry *h_ia64;
   2459 
   2460   ia64_info = elf64_ia64_hash_table (x->info);
   2461   if (ia64_info == NULL)
   2462     return false;
   2463 
   2464   /* Note that this can't be used in relation to FPTR relocs below.  */
   2465   dynamic_symbol = elf64_ia64_dynamic_symbol_p (dyn_i->h);
   2466 
   2467   shared = bfd_link_pic (x->info);
   2468   resolved_zero = (dyn_i->h
   2469 		   && ELF_ST_VISIBILITY (dyn_i->h->other)
   2470 		   && dyn_i->h->root.type == bfd_link_hash_undefweak);
   2471 
   2472   /* Take care of the GOT and PLT relocations.  */
   2473 
   2474   if ((!resolved_zero
   2475        && (dynamic_symbol || shared)
   2476        && (dyn_i->want_got || dyn_i->want_gotx))
   2477       || (dyn_i->want_ltoff_fptr
   2478 	  && dyn_i->h
   2479 	  && dyn_i->h->def_dynamic))
   2480     {
   2481       /* VMS: FIX64.  */
   2482       if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
   2483 	{
   2484 	  h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
   2485 	  elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
   2486 	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2487 	  ia64_info->fixups_sec->size +=
   2488 	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2489 	}
   2490     }
   2491 
   2492   if (ia64_info->rel_fptr_sec && dyn_i->want_fptr)
   2493     {
   2494       /* VMS: only image reloc.  */
   2495       if (dyn_i->h == NULL || dyn_i->h->root.type != bfd_link_hash_undefweak)
   2496 	ia64_info->rel_fptr_sec->size += sizeof (Elf64_External_Rela);
   2497     }
   2498 
   2499   if (!resolved_zero && dyn_i->want_pltoff)
   2500     {
   2501       /* VMS: FIXFD.  */
   2502       if (dyn_i->h != NULL && dyn_i->h->def_dynamic)
   2503 	{
   2504 	  h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
   2505 	  elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
   2506 	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2507 	  ia64_info->fixups_sec->size +=
   2508 	    sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2509 	}
   2510     }
   2511 
   2512   /* Take care of the normal data relocations.  */
   2513 
   2514   for (rent = dyn_i->reloc_entries; rent; rent = rent->next)
   2515     {
   2516       switch (rent->type)
   2517 	{
   2518 	case R_IA64_FPTR32LSB:
   2519 	case R_IA64_FPTR64LSB:
   2520 	  /* Allocate one iff !want_fptr and not PIE, which by this point
   2521 	     will be true only if we're actually allocating one statically
   2522 	     in the main executable.  Position independent executables
   2523 	     need a relative reloc.  */
   2524 	  if (dyn_i->want_fptr && !bfd_link_pie (x->info))
   2525 	    continue;
   2526 	  break;
   2527 	case R_IA64_PCREL32LSB:
   2528 	case R_IA64_PCREL64LSB:
   2529 	  if (!dynamic_symbol)
   2530 	    continue;
   2531 	  break;
   2532 	case R_IA64_DIR32LSB:
   2533 	case R_IA64_DIR64LSB:
   2534 	  if (!dynamic_symbol && !shared)
   2535 	    continue;
   2536 	  break;
   2537 	case R_IA64_IPLTLSB:
   2538 	  if (!dynamic_symbol && !shared)
   2539 	    continue;
   2540 	  break;
   2541 	case R_IA64_DTPREL32LSB:
   2542 	case R_IA64_TPREL64LSB:
   2543 	case R_IA64_DTPREL64LSB:
   2544 	case R_IA64_DTPMOD64LSB:
   2545 	  break;
   2546 	default:
   2547 	  abort ();
   2548 	}
   2549 
   2550       /* Add a fixup.  */
   2551       if (!dynamic_symbol)
   2552 	abort ();
   2553 
   2554       h_ia64 = (struct elf64_ia64_link_hash_entry *) dyn_i->h;
   2555       elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
   2556 	sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2557       ia64_info->fixups_sec->size +=
   2558 	sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2559     }
   2560 
   2561   return true;
   2562 }
   2563 
   2564 static bool
   2565 elf64_ia64_adjust_dynamic_symbol (struct bfd_link_info *info ATTRIBUTE_UNUSED,
   2566 				  struct elf_link_hash_entry *h)
   2567 {
   2568   /* ??? Undefined symbols with PLT entries should be re-defined
   2569      to be the PLT entry.  */
   2570 
   2571   /* If this is a weak symbol, and there is a real definition, the
   2572      processor independent code will have arranged for us to see the
   2573      real definition first, and we can just use the same value.  */
   2574   if (h->is_weakalias)
   2575     {
   2576       struct elf_link_hash_entry *def = weakdef (h);
   2577       BFD_ASSERT (def->root.type == bfd_link_hash_defined);
   2578       h->root.u.def.section = def->root.u.def.section;
   2579       h->root.u.def.value = def->root.u.def.value;
   2580       return true;
   2581     }
   2582 
   2583   /* If this is a reference to a symbol defined by a dynamic object which
   2584      is not a function, we might allocate the symbol in our .dynbss section
   2585      and allocate a COPY dynamic relocation.
   2586 
   2587      But IA-64 code is canonically PIC, so as a rule we can avoid this sort
   2588      of hackery.  */
   2589 
   2590   return true;
   2591 }
   2592 
   2593 static bool
   2594 elf64_ia64_late_size_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
   2595 			       struct bfd_link_info *info)
   2596 {
   2597   struct elf64_ia64_allocate_data data;
   2598   struct elf64_ia64_link_hash_table *ia64_info;
   2599   asection *sec;
   2600   bfd *dynobj;
   2601   struct elf_link_hash_table *hash_table;
   2602 
   2603   hash_table = elf_hash_table (info);
   2604   ia64_info = elf64_ia64_hash_table (info);
   2605   if (ia64_info == NULL)
   2606     return false;
   2607   dynobj = hash_table->dynobj;
   2608   if (dynobj == NULL)
   2609     return true;
   2610   data.info = info;
   2611 
   2612   /* Allocate the GOT entries.  */
   2613 
   2614   if (ia64_info->root.sgot)
   2615     {
   2616       data.ofs = 0;
   2617       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
   2618       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
   2619       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
   2620       ia64_info->root.sgot->size = data.ofs;
   2621     }
   2622 
   2623   /* Allocate the FPTR entries.  */
   2624 
   2625   if (ia64_info->fptr_sec)
   2626     {
   2627       data.ofs = 0;
   2628       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
   2629       ia64_info->fptr_sec->size = data.ofs;
   2630     }
   2631 
   2632   /* Now that we've seen all of the input files, we can decide which
   2633      symbols need plt entries.  Allocate the minimal PLT entries first.
   2634      We do this even though dynamic_sections_created may be FALSE, because
   2635      this has the side-effect of clearing want_plt and want_plt2.  */
   2636 
   2637   data.ofs = 0;
   2638   elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
   2639 
   2640   /* Align the pointer for the plt2 entries.  */
   2641   data.ofs = (data.ofs + 31) & (bfd_vma) -32;
   2642 
   2643   elf64_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
   2644   if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
   2645     {
   2646       /* FIXME: we always reserve the memory for dynamic linker even if
   2647 	 there are no PLT entries since dynamic linker may assume the
   2648 	 reserved memory always exists.  */
   2649 
   2650       BFD_ASSERT (ia64_info->root.dynamic_sections_created);
   2651 
   2652       ia64_info->root.splt->size = data.ofs;
   2653     }
   2654 
   2655   /* Allocate the PLTOFF entries.  */
   2656 
   2657   if (ia64_info->pltoff_sec)
   2658     {
   2659       data.ofs = 0;
   2660       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
   2661       ia64_info->pltoff_sec->size = data.ofs;
   2662     }
   2663 
   2664   if (ia64_info->root.dynamic_sections_created)
   2665     {
   2666       /* Allocate space for the dynamic relocations that turned out to be
   2667 	 required.  */
   2668       elf64_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
   2669     }
   2670 
   2671   /* We have now determined the sizes of the various dynamic sections.
   2672      Allocate memory for them.  */
   2673   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
   2674     {
   2675       bool strip;
   2676 
   2677       if (!(sec->flags & SEC_LINKER_CREATED))
   2678 	continue;
   2679 
   2680       /* If we don't need this section, strip it from the output file.
   2681 	 There were several sections primarily related to dynamic
   2682 	 linking that must be create before the linker maps input
   2683 	 sections to output sections.  The linker does that before
   2684 	 bfd_elf_size_dynamic_sections is called, and it is that
   2685 	 function which decides whether anything needs to go into
   2686 	 these sections.  */
   2687 
   2688       strip = (sec->size == 0);
   2689 
   2690       if (sec == ia64_info->root.sgot)
   2691 	strip = false;
   2692       else if (sec == ia64_info->root.srelgot)
   2693 	{
   2694 	  if (strip)
   2695 	    ia64_info->root.srelgot = NULL;
   2696 	  else
   2697 	    /* We use the reloc_count field as a counter if we need to
   2698 	       copy relocs into the output file.  */
   2699 	    sec->reloc_count = 0;
   2700 	}
   2701       else if (sec == ia64_info->fptr_sec)
   2702 	{
   2703 	  if (strip)
   2704 	    ia64_info->fptr_sec = NULL;
   2705 	}
   2706       else if (sec == ia64_info->rel_fptr_sec)
   2707 	{
   2708 	  if (strip)
   2709 	    ia64_info->rel_fptr_sec = NULL;
   2710 	  else
   2711 	    /* We use the reloc_count field as a counter if we need to
   2712 	       copy relocs into the output file.  */
   2713 	    sec->reloc_count = 0;
   2714 	}
   2715       else if (sec == ia64_info->root.splt)
   2716 	{
   2717 	  if (strip)
   2718 	    ia64_info->root.splt = NULL;
   2719 	}
   2720       else if (sec == ia64_info->pltoff_sec)
   2721 	{
   2722 	  if (strip)
   2723 	    ia64_info->pltoff_sec = NULL;
   2724 	}
   2725       else if (sec == ia64_info->fixups_sec)
   2726 	{
   2727 	  if (strip)
   2728 	    ia64_info->fixups_sec = NULL;
   2729 	}
   2730       else if (sec == ia64_info->transfer_sec)
   2731 	{
   2732 	  ;
   2733 	}
   2734       else
   2735 	{
   2736 	  const char *name;
   2737 
   2738 	  /* It's OK to base decisions on the section name, because none
   2739 	     of the dynobj section names depend upon the input files.  */
   2740 	  name = bfd_section_name (sec);
   2741 
   2742 	  if (strcmp (name, ".got.plt") == 0)
   2743 	    strip = false;
   2744 	  else if (startswith (name, ".rel"))
   2745 	    {
   2746 	      if (!strip)
   2747 		{
   2748 		  /* We use the reloc_count field as a counter if we need to
   2749 		     copy relocs into the output file.  */
   2750 		  sec->reloc_count = 0;
   2751 		}
   2752 	    }
   2753 	  else
   2754 	    continue;
   2755 	}
   2756 
   2757       if (strip)
   2758 	sec->flags |= SEC_EXCLUDE;
   2759       else
   2760 	{
   2761 	  /* Allocate memory for the section contents.  */
   2762 	  sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
   2763 	  if (sec->contents == NULL && sec->size != 0)
   2764 	    return false;
   2765 	  sec->alloced = 1;
   2766 	}
   2767     }
   2768 
   2769   if (elf_hash_table (info)->dynamic_sections_created)
   2770     {
   2771       bfd *abfd;
   2772       asection *dynsec;
   2773       asection *dynstrsec;
   2774       Elf_Internal_Dyn dyn;
   2775       const struct elf_backend_data *bed;
   2776       unsigned int shl_num = 0;
   2777       bfd_vma fixups_off = 0;
   2778       bfd_vma strdyn_off;
   2779       unsigned int time_hi, time_lo;
   2780 
   2781       /* The .dynamic section must exist and be empty.  */
   2782       dynsec = bfd_get_linker_section (hash_table->dynobj, ".dynamic");
   2783       BFD_ASSERT (dynsec != NULL);
   2784       BFD_ASSERT (dynsec->size == 0);
   2785 
   2786       dynstrsec = bfd_get_linker_section (hash_table->dynobj, ".vmsdynstr");
   2787       BFD_ASSERT (dynstrsec != NULL);
   2788       BFD_ASSERT (dynstrsec->size == 0);
   2789       dynstrsec->size = 1;	/* Initial blank.  */
   2790 
   2791       /* Ident + link time.  */
   2792       vms_get_time (&time_hi, &time_lo);
   2793 
   2794       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_IDENT, 0))
   2795 	return false;
   2796       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LINKTIME,
   2797 				       ((uint64_t) time_hi << 32)
   2798 				       + time_lo))
   2799 	return false;
   2800 
   2801       /* Strtab.  */
   2802       strdyn_off = dynsec->size;
   2803       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_STRTAB_OFFSET, 0))
   2804 	return false;
   2805       if (!_bfd_elf_add_dynamic_entry (info, DT_STRSZ, 0))
   2806 	return false;
   2807 
   2808       /* PLTGOT  */
   2809       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_SEG, 0))
   2810 	return false;
   2811       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_PLTGOT_OFFSET, 0))
   2812 	return false;
   2813 
   2814       /* Misc.  */
   2815       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FPMODE, 0x9800000))
   2816 	return false;
   2817       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_LNKFLAGS,
   2818 				       VMS_LF_IMGSTA | VMS_LF_MAIN))
   2819 	return false;
   2820 
   2821       /* Add entries for shared libraries.  */
   2822       for (abfd = info->input_bfds; abfd; abfd = abfd->link.next)
   2823 	{
   2824 	  char *soname;
   2825 	  size_t soname_len;
   2826 	  bfd_size_type strindex;
   2827 	  bfd_byte *newcontents;
   2828 	  bfd_vma fixups_shl_off;
   2829 
   2830 	  if (!(abfd->flags & DYNAMIC))
   2831 	    continue;
   2832 	  BFD_ASSERT (abfd->xvec == output_bfd->xvec);
   2833 
   2834 	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_NEEDED_IDENT,
   2835 					   elf_ia64_vms_ident (abfd)))
   2836 	    return false;
   2837 
   2838 	  soname = vms_get_module_name (bfd_get_filename (abfd), true);
   2839 	  if (soname == NULL)
   2840 	    return false;
   2841 	  strindex = dynstrsec->size;
   2842 	  soname_len = strlen (soname) + 1;
   2843 	  newcontents = (bfd_byte *) bfd_realloc (dynstrsec->contents,
   2844 						  strindex + soname_len);
   2845 	  if (newcontents == NULL)
   2846 	    return false;
   2847 	  memcpy (newcontents + strindex, soname, soname_len);
   2848 	  dynstrsec->size += soname_len;
   2849 	  dynstrsec->contents = newcontents;
   2850 
   2851 	  if (!_bfd_elf_add_dynamic_entry (info, DT_NEEDED, strindex))
   2852 	    return false;
   2853 
   2854 	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_NEEDED,
   2855 					   shl_num))
   2856 	    return false;
   2857 	  shl_num++;
   2858 
   2859 	  /* The fixups_off was in fact containing the size of the fixup
   2860 	     section.  Remap into the offset.  */
   2861 	  fixups_shl_off = elf_ia64_vms_tdata (abfd)->fixups_off;
   2862 	  elf_ia64_vms_tdata (abfd)->fixups_off = fixups_off;
   2863 
   2864 	  if (!_bfd_elf_add_dynamic_entry
   2865 	      (info, DT_IA_64_VMS_FIXUP_RELA_CNT,
   2866 	       fixups_shl_off / sizeof (Elf64_External_VMS_IMAGE_FIXUP)))
   2867 	    return false;
   2868 	  if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_FIXUP_RELA_OFF,
   2869 					   fixups_off))
   2870 	    return false;
   2871 	  fixups_off += fixups_shl_off;
   2872 	}
   2873 
   2874       /* Unwind.  */
   2875       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWINDSZ, 0))
   2876 	return false;
   2877       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_CODSEG, 0))
   2878 	return false;
   2879       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_INFOSEG, 0))
   2880 	return false;
   2881       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_OFFSET, 0))
   2882 	return false;
   2883       if (!_bfd_elf_add_dynamic_entry (info, DT_IA_64_VMS_UNWIND_SEG, 0))
   2884 	return false;
   2885 
   2886       if (!_bfd_elf_add_dynamic_entry (info, DT_NULL, 0xdead))
   2887 	    return false;
   2888 
   2889       /* Fix the strtab entries.  */
   2890       bed = get_elf_backend_data (hash_table->dynobj);
   2891 
   2892       if (dynstrsec->size > 1)
   2893 	dynstrsec->contents[0] = 0;
   2894       else
   2895 	dynstrsec->size = 0;
   2896 
   2897       /* Note: one 'spare' (ie DT_NULL) entry is added by
   2898 	 bfd_elf_size_dynsym_hash_dynstr.  */
   2899       dyn.d_tag = DT_IA_64_VMS_STRTAB_OFFSET;
   2900       dyn.d_un.d_val = dynsec->size /* + sizeof (Elf64_External_Dyn) */;
   2901       bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
   2902 			    dynsec->contents + strdyn_off);
   2903 
   2904       dyn.d_tag = DT_STRSZ;
   2905       dyn.d_un.d_val = dynstrsec->size;
   2906       bed->s->swap_dyn_out (hash_table->dynobj, &dyn,
   2907 			    dynsec->contents + strdyn_off + bed->s->sizeof_dyn);
   2908 
   2909       elf_ia64_vms_tdata (output_bfd)->needed_count = shl_num;
   2910 
   2911       /* Note section.  */
   2912       if (!create_ia64_vms_notes (output_bfd, info, time_hi, time_lo))
   2913 	return false;
   2914     }
   2915 
   2916   /* ??? Perhaps force __gp local.  */
   2917 
   2918   return true;
   2919 }
   2920 
   2921 static void
   2922 elf64_ia64_install_fixup (bfd *output_bfd,
   2923 			  struct elf64_ia64_link_hash_table *ia64_info,
   2924 			  struct elf_link_hash_entry *h,
   2925 			  unsigned int type, asection *sec, bfd_vma offset,
   2926 			  bfd_vma addend)
   2927 {
   2928   asection *relsec;
   2929   Elf64_External_VMS_IMAGE_FIXUP *fixup;
   2930   struct elf64_ia64_link_hash_entry *h_ia64;
   2931   bfd_vma fixoff;
   2932   Elf_Internal_Phdr *phdr;
   2933 
   2934   if (h == NULL || !h->def_dynamic)
   2935     abort ();
   2936 
   2937   h_ia64 = (struct elf64_ia64_link_hash_entry *) h;
   2938   fixoff = elf_ia64_vms_tdata (h_ia64->shl)->fixups_off;
   2939   elf_ia64_vms_tdata (h_ia64->shl)->fixups_off +=
   2940     sizeof (Elf64_External_VMS_IMAGE_FIXUP);
   2941   relsec = ia64_info->fixups_sec;
   2942 
   2943   fixup = (Elf64_External_VMS_IMAGE_FIXUP *)(relsec->contents + fixoff);
   2944   offset += sec->output_section->vma + sec->output_offset;
   2945 
   2946   /* FIXME: this is slow.  We should cache the last one used, or create a
   2947      map.  */
   2948   phdr = _bfd_elf_find_segment_containing_section
   2949     (output_bfd, sec->output_section);
   2950   BFD_ASSERT (phdr != NULL);
   2951 
   2952   bfd_putl64 (offset - phdr->p_vaddr, fixup->fixup_offset);
   2953   bfd_putl32 (type, fixup->type);
   2954   bfd_putl32 (phdr - elf_tdata (output_bfd)->phdr, fixup->fixup_seg);
   2955   bfd_putl64 (addend, fixup->addend);
   2956   bfd_putl32 (h->root.u.def.value, fixup->symvec_index);
   2957   bfd_putl32 (2, fixup->data_type);
   2958 }
   2959 
   2960 /* Store an entry for target address TARGET_ADDR in the linkage table
   2961    and return the gp-relative address of the linkage table entry.  */
   2962 
   2963 static bfd_vma
   2964 set_got_entry (bfd *abfd, struct bfd_link_info *info,
   2965 	       struct elf64_ia64_dyn_sym_info *dyn_i,
   2966 	       bfd_vma addend, bfd_vma value, unsigned int dyn_r_type)
   2967 {
   2968   struct elf64_ia64_link_hash_table *ia64_info;
   2969   asection *got_sec;
   2970   bool done;
   2971   bfd_vma got_offset;
   2972 
   2973   ia64_info = elf64_ia64_hash_table (info);
   2974   if (ia64_info == NULL)
   2975     return 0;
   2976 
   2977   got_sec = ia64_info->root.sgot;
   2978 
   2979   switch (dyn_r_type)
   2980     {
   2981     case R_IA64_TPREL64LSB:
   2982     case R_IA64_DTPMOD64LSB:
   2983     case R_IA64_DTPREL32LSB:
   2984     case R_IA64_DTPREL64LSB:
   2985       abort ();
   2986       break;
   2987     default:
   2988       done = dyn_i->got_done;
   2989       dyn_i->got_done = true;
   2990       got_offset = dyn_i->got_offset;
   2991       break;
   2992     }
   2993 
   2994   BFD_ASSERT ((got_offset & 7) == 0);
   2995 
   2996   if (! done)
   2997     {
   2998       /* Store the target address in the linkage table entry.  */
   2999       bfd_put_64 (abfd, value, got_sec->contents + got_offset);
   3000 
   3001       /* Install a dynamic relocation if needed.  */
   3002       if (((bfd_link_pic (info)
   3003 	    && (!dyn_i->h
   3004 		|| ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
   3005 		|| dyn_i->h->root.type != bfd_link_hash_undefweak))
   3006 	   || elf64_ia64_dynamic_symbol_p (dyn_i->h))
   3007 	  && (!dyn_i->want_ltoff_fptr
   3008 	      || !bfd_link_pie (info)
   3009 	      || !dyn_i->h
   3010 	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
   3011 	{
   3012 	  if (!dyn_i->h || !dyn_i->h->def_dynamic)
   3013 	    {
   3014 	      dyn_r_type = R_IA64_REL64LSB;
   3015 	      addend = value;
   3016 	    }
   3017 
   3018 	  /* VMS: install a FIX32 or FIX64.  */
   3019 	  switch (dyn_r_type)
   3020 	    {
   3021 	    case R_IA64_DIR32LSB:
   3022 	    case R_IA64_FPTR32LSB:
   3023 	      dyn_r_type = R_IA64_VMS_FIX32;
   3024 	      break;
   3025 	    case R_IA64_DIR64LSB:
   3026 	    case R_IA64_FPTR64LSB:
   3027 	      dyn_r_type = R_IA64_VMS_FIX64;
   3028 	      break;
   3029 	    default:
   3030 	      BFD_ASSERT (false);
   3031 	      break;
   3032 	    }
   3033 	  elf64_ia64_install_fixup
   3034 	    (info->output_bfd, ia64_info, dyn_i->h,
   3035 	     dyn_r_type, got_sec, got_offset, addend);
   3036 	}
   3037     }
   3038 
   3039   /* Return the address of the linkage table entry.  */
   3040   value = (got_sec->output_section->vma
   3041 	   + got_sec->output_offset
   3042 	   + got_offset);
   3043 
   3044   return value;
   3045 }
   3046 
   3047 /* Fill in a function descriptor consisting of the function's code
   3048    address and its global pointer.  Return the descriptor's address.  */
   3049 
   3050 static bfd_vma
   3051 set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
   3052 		struct elf64_ia64_dyn_sym_info *dyn_i,
   3053 		bfd_vma value)
   3054 {
   3055   struct elf64_ia64_link_hash_table *ia64_info;
   3056   asection *fptr_sec;
   3057 
   3058   ia64_info = elf64_ia64_hash_table (info);
   3059   if (ia64_info == NULL)
   3060     return 0;
   3061 
   3062   fptr_sec = ia64_info->fptr_sec;
   3063 
   3064   if (!dyn_i->fptr_done)
   3065     {
   3066       dyn_i->fptr_done = 1;
   3067 
   3068       /* Fill in the function descriptor.  */
   3069       bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
   3070       bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
   3071 		  fptr_sec->contents + dyn_i->fptr_offset + 8);
   3072     }
   3073 
   3074   /* Return the descriptor's address.  */
   3075   value = (fptr_sec->output_section->vma
   3076 	   + fptr_sec->output_offset
   3077 	   + dyn_i->fptr_offset);
   3078 
   3079   return value;
   3080 }
   3081 
   3082 /* Fill in a PLTOFF entry consisting of the function's code address
   3083    and its global pointer.  Return the descriptor's address.  */
   3084 
   3085 static bfd_vma
   3086 set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
   3087 		  struct elf64_ia64_dyn_sym_info *dyn_i,
   3088 		  bfd_vma value, bool is_plt)
   3089 {
   3090   struct elf64_ia64_link_hash_table *ia64_info;
   3091   asection *pltoff_sec;
   3092 
   3093   ia64_info = elf64_ia64_hash_table (info);
   3094   if (ia64_info == NULL)
   3095     return 0;
   3096 
   3097   pltoff_sec = ia64_info->pltoff_sec;
   3098 
   3099   /* Don't do anything if this symbol uses a real PLT entry.  In
   3100      that case, we'll fill this in during finish_dynamic_symbol.  */
   3101   if ((! dyn_i->want_plt || is_plt)
   3102       && !dyn_i->pltoff_done)
   3103     {
   3104       bfd_vma gp = _bfd_get_gp_value (abfd);
   3105 
   3106       /* Fill in the function descriptor.  */
   3107       bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
   3108       bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
   3109 
   3110       /* Install dynamic relocations if needed.  */
   3111       if (!is_plt
   3112 	  && bfd_link_pic (info)
   3113 	  && (!dyn_i->h
   3114 	      || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
   3115 	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
   3116 	{
   3117 	  /* VMS:  */
   3118 	  abort ();
   3119 	}
   3120 
   3121       dyn_i->pltoff_done = 1;
   3122     }
   3123 
   3124   /* Return the descriptor's address.  */
   3125   value = (pltoff_sec->output_section->vma
   3126 	   + pltoff_sec->output_offset
   3127 	   + dyn_i->pltoff_offset);
   3128 
   3129   return value;
   3130 }
   3131 
   3132 /* Called through qsort to sort the .IA_64.unwind section during a
   3133    non-relocatable link.  Set elf64_ia64_unwind_entry_compare_bfd
   3134    to the output bfd so we can do proper endianness frobbing.  */
   3135 
   3136 static bfd *elf64_ia64_unwind_entry_compare_bfd;
   3137 
   3138 static int
   3139 elf64_ia64_unwind_entry_compare (const void * a, const void * b)
   3140 {
   3141   bfd_vma av, bv;
   3142 
   3143   av = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, a);
   3144   bv = bfd_get_64 (elf64_ia64_unwind_entry_compare_bfd, b);
   3145 
   3146   return (av < bv ? -1 : av > bv ? 1 : 0);
   3147 }
   3148 
   3149 /* Make sure we've got ourselves a nice fat __gp value.  */
   3150 static bool
   3151 elf64_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final)
   3152 {
   3153   bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
   3154   bfd_vma min_short_vma = min_vma, max_short_vma = 0;
   3155   struct elf_link_hash_entry *gp;
   3156   bfd_vma gp_val;
   3157   asection *os;
   3158   struct elf64_ia64_link_hash_table *ia64_info;
   3159 
   3160   ia64_info = elf64_ia64_hash_table (info);
   3161   if (ia64_info == NULL)
   3162     return false;
   3163 
   3164   /* Find the min and max vma of all sections marked short.  Also collect
   3165      min and max vma of any type, for use in selecting a nice gp.  */
   3166   for (os = abfd->sections; os ; os = os->next)
   3167     {
   3168       bfd_vma lo, hi;
   3169 
   3170       if ((os->flags & SEC_ALLOC) == 0)
   3171 	continue;
   3172 
   3173       lo = os->vma;
   3174       /* When this function is called from elfNN_ia64_final_link
   3175 	 the correct value to use is os->size.  When called from
   3176 	 elfNN_ia64_relax_section we are in the middle of section
   3177 	 sizing; some sections will already have os->size set, others
   3178 	 will have os->size zero and os->rawsize the previous size.  */
   3179       hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
   3180       if (hi < lo)
   3181 	hi = (bfd_vma) -1;
   3182 
   3183       if (min_vma > lo)
   3184 	min_vma = lo;
   3185       if (max_vma < hi)
   3186 	max_vma = hi;
   3187       if (os->flags & SEC_SMALL_DATA)
   3188 	{
   3189 	  if (min_short_vma > lo)
   3190 	    min_short_vma = lo;
   3191 	  if (max_short_vma < hi)
   3192 	    max_short_vma = hi;
   3193 	}
   3194     }
   3195 
   3196   if (ia64_info->min_short_sec)
   3197     {
   3198       if (min_short_vma
   3199 	  > (ia64_info->min_short_sec->vma
   3200 	     + ia64_info->min_short_offset))
   3201 	min_short_vma = (ia64_info->min_short_sec->vma
   3202 			 + ia64_info->min_short_offset);
   3203       if (max_short_vma
   3204 	  < (ia64_info->max_short_sec->vma
   3205 	     + ia64_info->max_short_offset))
   3206 	max_short_vma = (ia64_info->max_short_sec->vma
   3207 			 + ia64_info->max_short_offset);
   3208     }
   3209 
   3210   /* See if the user wants to force a value.  */
   3211   gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
   3212 			     false, false);
   3213 
   3214   if (gp
   3215       && (gp->root.type == bfd_link_hash_defined
   3216 	  || gp->root.type == bfd_link_hash_defweak))
   3217     {
   3218       asection *gp_sec = gp->root.u.def.section;
   3219       gp_val = (gp->root.u.def.value
   3220 		+ gp_sec->output_section->vma
   3221 		+ gp_sec->output_offset);
   3222     }
   3223   else
   3224     {
   3225       /* Pick a sensible value.  */
   3226 
   3227       if (ia64_info->min_short_sec)
   3228 	{
   3229 	  bfd_vma short_range = max_short_vma - min_short_vma;
   3230 
   3231 	  /* If min_short_sec is set, pick one in the middle bewteen
   3232 	     min_short_vma and max_short_vma.  */
   3233 	  if (short_range >= 0x400000)
   3234 	    goto overflow;
   3235 	  gp_val = min_short_vma + short_range / 2;
   3236 	}
   3237       else
   3238 	{
   3239 	  asection *got_sec = ia64_info->root.sgot;
   3240 
   3241 	  /* Start with just the address of the .got.  */
   3242 	  if (got_sec)
   3243 	    gp_val = got_sec->output_section->vma;
   3244 	  else if (max_short_vma != 0)
   3245 	    gp_val = min_short_vma;
   3246 	  else if (max_vma - min_vma < 0x200000)
   3247 	    gp_val = min_vma;
   3248 	  else
   3249 	    gp_val = max_vma - 0x200000 + 8;
   3250 	}
   3251 
   3252       /* If it is possible to address the entire image, but we
   3253 	 don't with the choice above, adjust.  */
   3254       if (max_vma - min_vma < 0x400000
   3255 	  && (max_vma - gp_val >= 0x200000
   3256 	      || gp_val - min_vma > 0x200000))
   3257 	gp_val = min_vma + 0x200000;
   3258       else if (max_short_vma != 0)
   3259 	{
   3260 	  /* If we don't cover all the short data, adjust.  */
   3261 	  if (max_short_vma - gp_val >= 0x200000)
   3262 	    gp_val = min_short_vma + 0x200000;
   3263 
   3264 	  /* If we're addressing stuff past the end, adjust back.  */
   3265 	  if (gp_val > max_vma)
   3266 	    gp_val = max_vma - 0x200000 + 8;
   3267 	}
   3268     }
   3269 
   3270   /* Validate whether all SHF_IA_64_SHORT sections are within
   3271      range of the chosen GP.  */
   3272 
   3273   if (max_short_vma != 0)
   3274     {
   3275       if (max_short_vma - min_short_vma >= 0x400000)
   3276 	{
   3277 	overflow:
   3278 	  _bfd_error_handler
   3279 	    /* xgettext:c-format */
   3280 	    (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
   3281 	     abfd, (uint64_t) (max_short_vma - min_short_vma));
   3282 	  return false;
   3283 	}
   3284       else if ((gp_val > min_short_vma
   3285 		&& gp_val - min_short_vma > 0x200000)
   3286 	       || (gp_val < max_short_vma
   3287 		   && max_short_vma - gp_val >= 0x200000))
   3288 	{
   3289 	  _bfd_error_handler
   3290 	    (_("%pB: __gp does not cover short data segment"), abfd);
   3291 	  return false;
   3292 	}
   3293     }
   3294 
   3295   _bfd_set_gp_value (abfd, gp_val);
   3296 
   3297   return true;
   3298 }
   3299 
   3300 static bool
   3301 elf64_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
   3302 {
   3303   struct elf64_ia64_link_hash_table *ia64_info;
   3304   asection *unwind_output_sec;
   3305 
   3306   ia64_info = elf64_ia64_hash_table (info);
   3307   if (ia64_info == NULL)
   3308     return false;
   3309 
   3310   /* Make sure we've got ourselves a nice fat __gp value.  */
   3311   if (!bfd_link_relocatable (info))
   3312     {
   3313       bfd_vma gp_val;
   3314       struct elf_link_hash_entry *gp;
   3315 
   3316       /* We assume after gp is set, section size will only decrease. We
   3317 	 need to adjust gp for it.  */
   3318       _bfd_set_gp_value (abfd, 0);
   3319       if (! elf64_ia64_choose_gp (abfd, info, true))
   3320 	return false;
   3321       gp_val = _bfd_get_gp_value (abfd);
   3322 
   3323       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
   3324 				 false, false);
   3325       if (gp)
   3326 	{
   3327 	  gp->root.type = bfd_link_hash_defined;
   3328 	  gp->root.u.def.value = gp_val;
   3329 	  gp->root.u.def.section = bfd_abs_section_ptr;
   3330 	}
   3331     }
   3332 
   3333   /* If we're producing a final executable, we need to sort the contents
   3334      of the .IA_64.unwind section.  Force this section to be relocated
   3335      into memory rather than written immediately to the output file.  */
   3336   unwind_output_sec = NULL;
   3337   if (!bfd_link_relocatable (info))
   3338     {
   3339       asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
   3340       if (s)
   3341 	{
   3342 	  unwind_output_sec = s->output_section;
   3343 	  unwind_output_sec->contents
   3344 	    = bfd_malloc (unwind_output_sec->size);
   3345 	  if (unwind_output_sec->contents == NULL)
   3346 	    return false;
   3347 	}
   3348     }
   3349 
   3350   /* Invoke the regular ELF backend linker to do all the work.  */
   3351   if (!bfd_elf_final_link (abfd, info))
   3352     return false;
   3353 
   3354   if (unwind_output_sec)
   3355     {
   3356       elf64_ia64_unwind_entry_compare_bfd = abfd;
   3357       qsort (unwind_output_sec->contents,
   3358 	     (size_t) (unwind_output_sec->size / 24),
   3359 	     24,
   3360 	     elf64_ia64_unwind_entry_compare);
   3361 
   3362       if (! bfd_set_section_contents (abfd, unwind_output_sec,
   3363 				      unwind_output_sec->contents, (bfd_vma) 0,
   3364 				      unwind_output_sec->size))
   3365 	return false;
   3366     }
   3367 
   3368   return true;
   3369 }
   3370 
   3371 static int
   3372 elf64_ia64_relocate_section (bfd *output_bfd,
   3373 			     struct bfd_link_info *info,
   3374 			     bfd *input_bfd,
   3375 			     asection *input_section,
   3376 			     bfd_byte *contents,
   3377 			     Elf_Internal_Rela *relocs,
   3378 			     Elf_Internal_Sym *local_syms,
   3379 			     asection **local_sections)
   3380 {
   3381   struct elf64_ia64_link_hash_table *ia64_info;
   3382   Elf_Internal_Shdr *symtab_hdr;
   3383   Elf_Internal_Rela *rel;
   3384   Elf_Internal_Rela *relend;
   3385   bool ret_val = true;	/* for non-fatal errors */
   3386   bfd_vma gp_val;
   3387 
   3388   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   3389   ia64_info = elf64_ia64_hash_table (info);
   3390   if (ia64_info == NULL)
   3391     return false;
   3392 
   3393   /* Infect various flags from the input section to the output section.  */
   3394   if (bfd_link_relocatable (info))
   3395     {
   3396       bfd_vma flags;
   3397 
   3398       flags = elf_section_data(input_section)->this_hdr.sh_flags;
   3399       flags &= SHF_IA_64_NORECOV;
   3400 
   3401       elf_section_data(input_section->output_section)
   3402 	->this_hdr.sh_flags |= flags;
   3403     }
   3404 
   3405   gp_val = _bfd_get_gp_value (output_bfd);
   3406 
   3407   rel = relocs;
   3408   relend = relocs + input_section->reloc_count;
   3409   for (; rel < relend; ++rel)
   3410     {
   3411       struct elf_link_hash_entry *h;
   3412       struct elf64_ia64_dyn_sym_info *dyn_i;
   3413       bfd_reloc_status_type r;
   3414       reloc_howto_type *howto;
   3415       unsigned long r_symndx;
   3416       Elf_Internal_Sym *sym;
   3417       unsigned int r_type;
   3418       bfd_vma value;
   3419       asection *sym_sec;
   3420       bfd_byte *hit_addr;
   3421       bool dynamic_symbol_p;
   3422       bool undef_weak_ref;
   3423 
   3424       r_type = ELF64_R_TYPE (rel->r_info);
   3425       if (r_type > R_IA64_MAX_RELOC_CODE)
   3426 	{
   3427 	  /* xgettext:c-format */
   3428 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   3429 			      input_bfd, (int) r_type);
   3430 	  bfd_set_error (bfd_error_bad_value);
   3431 	  ret_val = false;
   3432 	  continue;
   3433 	}
   3434 
   3435       howto = ia64_elf_lookup_howto (r_type);
   3436       if (howto == NULL)
   3437 	{
   3438 	  ret_val = false;
   3439 	  continue;
   3440 	}
   3441       r_symndx = ELF64_R_SYM (rel->r_info);
   3442       h = NULL;
   3443       sym = NULL;
   3444       sym_sec = NULL;
   3445       undef_weak_ref = false;
   3446 
   3447       if (r_symndx < symtab_hdr->sh_info)
   3448 	{
   3449 	  /* Reloc against local symbol.  */
   3450 	  asection *msec;
   3451 	  sym = local_syms + r_symndx;
   3452 	  sym_sec = local_sections[r_symndx];
   3453 	  msec = sym_sec;
   3454 	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
   3455 	  if (!bfd_link_relocatable (info)
   3456 	      && (sym_sec->flags & SEC_MERGE) != 0
   3457 	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
   3458 	      && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
   3459 	    {
   3460 	      struct elf64_ia64_local_hash_entry *loc_h;
   3461 
   3462 	      loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false);
   3463 	      if (loc_h && ! loc_h->sec_merge_done)
   3464 		{
   3465 		  struct elf64_ia64_dyn_sym_info *dynent;
   3466 		  unsigned int count;
   3467 
   3468 		  for (count = loc_h->count, dynent = loc_h->info;
   3469 		       count != 0;
   3470 		       count--, dynent++)
   3471 		    {
   3472 		      msec = sym_sec;
   3473 		      dynent->addend =
   3474 			_bfd_merged_section_offset (output_bfd, &msec,
   3475 						    elf_section_data (msec)->
   3476 						    sec_info,
   3477 						    sym->st_value
   3478 						    + dynent->addend);
   3479 		      dynent->addend -= sym->st_value;
   3480 		      dynent->addend += msec->output_section->vma
   3481 					+ msec->output_offset
   3482 					- sym_sec->output_section->vma
   3483 					- sym_sec->output_offset;
   3484 		    }
   3485 
   3486 		  /* We may have introduced duplicated entries. We need
   3487 		     to remove them properly.  */
   3488 		  count = sort_dyn_sym_info (loc_h->info, loc_h->count);
   3489 		  if (count != loc_h->count)
   3490 		    {
   3491 		      loc_h->count = count;
   3492 		      loc_h->sorted_count = count;
   3493 		    }
   3494 
   3495 		  loc_h->sec_merge_done = 1;
   3496 		}
   3497 	    }
   3498 	}
   3499       else
   3500 	{
   3501 	  bool unresolved_reloc;
   3502 	  bool warned, ignored;
   3503 	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
   3504 
   3505 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   3506 				   r_symndx, symtab_hdr, sym_hashes,
   3507 				   h, sym_sec, value,
   3508 				   unresolved_reloc, warned, ignored);
   3509 
   3510 	  if (h->root.type == bfd_link_hash_undefweak)
   3511 	    undef_weak_ref = true;
   3512 	  else if (warned)
   3513 	    continue;
   3514 	}
   3515 
   3516       /* For relocs against symbols from removed linkonce sections,
   3517 	 or sections discarded by a linker script, we just want the
   3518 	 section contents zeroed.  Avoid any special processing.  */
   3519       if (sym_sec != NULL && discarded_section (sym_sec))
   3520 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   3521 					 rel, 1, relend, R_IA64_NONE,
   3522 					 howto, 0, contents);
   3523 
   3524       if (bfd_link_relocatable (info))
   3525 	continue;
   3526 
   3527       hit_addr = contents + rel->r_offset;
   3528       value += rel->r_addend;
   3529       dynamic_symbol_p = elf64_ia64_dynamic_symbol_p (h);
   3530 
   3531       switch (r_type)
   3532 	{
   3533 	case R_IA64_NONE:
   3534 	case R_IA64_LDXMOV:
   3535 	  continue;
   3536 
   3537 	case R_IA64_IMM14:
   3538 	case R_IA64_IMM22:
   3539 	case R_IA64_IMM64:
   3540 	case R_IA64_DIR32MSB:
   3541 	case R_IA64_DIR32LSB:
   3542 	case R_IA64_DIR64MSB:
   3543 	case R_IA64_DIR64LSB:
   3544 	  /* Install a dynamic relocation for this reloc.  */
   3545 	  if ((dynamic_symbol_p || bfd_link_pic (info))
   3546 	      && r_symndx != 0
   3547 	      && (input_section->flags & SEC_ALLOC) != 0)
   3548 	    {
   3549 	      unsigned int dyn_r_type;
   3550 	      bfd_vma addend;
   3551 
   3552 	      switch (r_type)
   3553 		{
   3554 		case R_IA64_IMM14:
   3555 		case R_IA64_IMM22:
   3556 		case R_IA64_IMM64:
   3557 		  /* ??? People shouldn't be doing non-pic code in
   3558 		     shared libraries nor dynamic executables.  */
   3559 		  _bfd_error_handler
   3560 		    /* xgettext:c-format */
   3561 		    (_("%pB: non-pic code with imm relocation against"
   3562 		       " dynamic symbol `%s'"),
   3563 		     input_bfd,
   3564 		     h ? h->root.root.string
   3565 		       : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3566 					   sym_sec));
   3567 		  ret_val = false;
   3568 		  continue;
   3569 
   3570 		default:
   3571 		  break;
   3572 		}
   3573 
   3574 	      /* If we don't need dynamic symbol lookup, find a
   3575 		 matching RELATIVE relocation.  */
   3576 	      dyn_r_type = r_type;
   3577 	      if (dynamic_symbol_p)
   3578 		{
   3579 		  addend = rel->r_addend;
   3580 		  value = 0;
   3581 		}
   3582 	      else
   3583 		{
   3584 		  addend = value;
   3585 		}
   3586 
   3587 	      /* VMS: install a FIX64.  */
   3588 	      switch (dyn_r_type)
   3589 		{
   3590 		case R_IA64_DIR32LSB:
   3591 		  dyn_r_type = R_IA64_VMS_FIX32;
   3592 		  break;
   3593 		case R_IA64_DIR64LSB:
   3594 		  dyn_r_type = R_IA64_VMS_FIX64;
   3595 		  break;
   3596 		default:
   3597 		  BFD_ASSERT (false);
   3598 		  break;
   3599 		}
   3600 	      elf64_ia64_install_fixup
   3601 		(output_bfd, ia64_info, h,
   3602 		 dyn_r_type, input_section, rel->r_offset, addend);
   3603 	      r = bfd_reloc_ok;
   3604 	      break;
   3605 	    }
   3606 	  /* Fall through.  */
   3607 
   3608 	case R_IA64_LTV32MSB:
   3609 	case R_IA64_LTV32LSB:
   3610 	case R_IA64_LTV64MSB:
   3611 	case R_IA64_LTV64LSB:
   3612 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3613 	  break;
   3614 
   3615 	case R_IA64_GPREL22:
   3616 	case R_IA64_GPREL64I:
   3617 	case R_IA64_GPREL32MSB:
   3618 	case R_IA64_GPREL32LSB:
   3619 	case R_IA64_GPREL64MSB:
   3620 	case R_IA64_GPREL64LSB:
   3621 	  if (dynamic_symbol_p)
   3622 	    {
   3623 	      _bfd_error_handler
   3624 		/* xgettext:c-format */
   3625 		(_("%pB: @gprel relocation against dynamic symbol %s"),
   3626 		 input_bfd,
   3627 		 h ? h->root.root.string
   3628 		   : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3629 				       sym_sec));
   3630 	      ret_val = false;
   3631 	      continue;
   3632 	    }
   3633 	  value -= gp_val;
   3634 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3635 	  break;
   3636 
   3637 	case R_IA64_LTOFF22:
   3638 	case R_IA64_LTOFF22X:
   3639 	case R_IA64_LTOFF64I:
   3640 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   3641 	  value = set_got_entry (input_bfd, info, dyn_i,
   3642 				 rel->r_addend, value, R_IA64_DIR64LSB);
   3643 	  value -= gp_val;
   3644 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3645 	  break;
   3646 
   3647 	case R_IA64_PLTOFF22:
   3648 	case R_IA64_PLTOFF64I:
   3649 	case R_IA64_PLTOFF64MSB:
   3650 	case R_IA64_PLTOFF64LSB:
   3651 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   3652 	  value = set_pltoff_entry (output_bfd, info, dyn_i, value, false);
   3653 	  value -= gp_val;
   3654 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3655 	  break;
   3656 
   3657 	case R_IA64_FPTR64I:
   3658 	case R_IA64_FPTR32MSB:
   3659 	case R_IA64_FPTR32LSB:
   3660 	case R_IA64_FPTR64MSB:
   3661 	case R_IA64_FPTR64LSB:
   3662 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   3663 	  if (dyn_i->want_fptr)
   3664 	    {
   3665 	      if (!undef_weak_ref)
   3666 		value = set_fptr_entry (output_bfd, info, dyn_i, value);
   3667 	    }
   3668 	  if (!dyn_i->want_fptr || bfd_link_pie (info))
   3669 	    {
   3670 	      /* Otherwise, we expect the dynamic linker to create
   3671 		 the entry.  */
   3672 
   3673 	      if (dyn_i->want_fptr)
   3674 		{
   3675 		  if (r_type == R_IA64_FPTR64I)
   3676 		    {
   3677 		      /* We can't represent this without a dynamic symbol.
   3678 			 Adjust the relocation to be against an output
   3679 			 section symbol, which are always present in the
   3680 			 dynamic symbol table.  */
   3681 		      /* ??? People shouldn't be doing non-pic code in
   3682 			 shared libraries.  Hork.  */
   3683 		      _bfd_error_handler
   3684 			(_("%pB: linking non-pic code in a position independent executable"),
   3685 			 input_bfd);
   3686 		      ret_val = false;
   3687 		      continue;
   3688 		    }
   3689 		}
   3690 	      else
   3691 		{
   3692 		  value = 0;
   3693 		}
   3694 
   3695 	      /* VMS: FIXFD.  */
   3696 	      elf64_ia64_install_fixup
   3697 		(output_bfd, ia64_info, h, R_IA64_VMS_FIXFD,
   3698 		 input_section, rel->r_offset, 0);
   3699 	      r = bfd_reloc_ok;
   3700 	      break;
   3701 	    }
   3702 
   3703 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3704 	  break;
   3705 
   3706 	case R_IA64_LTOFF_FPTR22:
   3707 	case R_IA64_LTOFF_FPTR64I:
   3708 	case R_IA64_LTOFF_FPTR32MSB:
   3709 	case R_IA64_LTOFF_FPTR32LSB:
   3710 	case R_IA64_LTOFF_FPTR64MSB:
   3711 	case R_IA64_LTOFF_FPTR64LSB:
   3712 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   3713 	  if (dyn_i->want_fptr)
   3714 	    {
   3715 	      BFD_ASSERT (h == NULL || !h->def_dynamic);
   3716 	      if (!undef_weak_ref)
   3717 		value = set_fptr_entry (output_bfd, info, dyn_i, value);
   3718 	    }
   3719 	  else
   3720 	    value = 0;
   3721 
   3722 	  value = set_got_entry (output_bfd, info, dyn_i,
   3723 				 rel->r_addend, value, R_IA64_FPTR64LSB);
   3724 	  value -= gp_val;
   3725 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3726 	  break;
   3727 
   3728 	case R_IA64_PCREL32MSB:
   3729 	case R_IA64_PCREL32LSB:
   3730 	case R_IA64_PCREL64MSB:
   3731 	case R_IA64_PCREL64LSB:
   3732 	  /* Install a dynamic relocation for this reloc.  */
   3733 	  if (dynamic_symbol_p && r_symndx != 0)
   3734 	    {
   3735 	      /* VMS: doesn't exist ???  */
   3736 	      abort ();
   3737 	    }
   3738 	  goto finish_pcrel;
   3739 
   3740 	case R_IA64_PCREL21B:
   3741 	case R_IA64_PCREL60B:
   3742 	  /* We should have created a PLT entry for any dynamic symbol.  */
   3743 	  dyn_i = NULL;
   3744 	  if (h)
   3745 	    dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
   3746 
   3747 	  if (dyn_i && dyn_i->want_plt2)
   3748 	    {
   3749 	      /* Should have caught this earlier.  */
   3750 	      BFD_ASSERT (rel->r_addend == 0);
   3751 
   3752 	      value = (ia64_info->root.splt->output_section->vma
   3753 		       + ia64_info->root.splt->output_offset
   3754 		       + dyn_i->plt2_offset);
   3755 	    }
   3756 	  else
   3757 	    {
   3758 	      /* Since there's no PLT entry, Validate that this is
   3759 		 locally defined.  */
   3760 	      BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
   3761 
   3762 	      /* If the symbol is undef_weak, we shouldn't be trying
   3763 		 to call it.  There's every chance that we'd wind up
   3764 		 with an out-of-range fixup here.  Don't bother setting
   3765 		 any value at all.  */
   3766 	      if (undef_weak_ref)
   3767 		continue;
   3768 	    }
   3769 	  goto finish_pcrel;
   3770 
   3771 	case R_IA64_PCREL21BI:
   3772 	case R_IA64_PCREL21F:
   3773 	case R_IA64_PCREL21M:
   3774 	case R_IA64_PCREL22:
   3775 	case R_IA64_PCREL64I:
   3776 	  /* The PCREL21BI reloc is specifically not intended for use with
   3777 	     dynamic relocs.  PCREL21F and PCREL21M are used for speculation
   3778 	     fixup code, and thus probably ought not be dynamic.  The
   3779 	     PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs.  */
   3780 	  if (dynamic_symbol_p)
   3781 	    {
   3782 	      const char *msg;
   3783 
   3784 	      if (r_type == R_IA64_PCREL21BI)
   3785 		/* xgettext:c-format */
   3786 		msg = _("%pB: @internal branch to dynamic symbol %s");
   3787 	      else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
   3788 		/* xgettext:c-format */
   3789 		msg = _("%pB: speculation fixup to dynamic symbol %s");
   3790 	      else
   3791 		/* xgettext:c-format */
   3792 		msg = _("%pB: @pcrel relocation against dynamic symbol %s");
   3793 	      _bfd_error_handler (msg, input_bfd,
   3794 				  h ? h->root.root.string
   3795 				  : bfd_elf_sym_name (input_bfd,
   3796 						      symtab_hdr,
   3797 						      sym,
   3798 						      sym_sec));
   3799 	      ret_val = false;
   3800 	      continue;
   3801 	    }
   3802 	  goto finish_pcrel;
   3803 
   3804 	finish_pcrel:
   3805 	  /* Make pc-relative.  */
   3806 	  value -= (input_section->output_section->vma
   3807 		    + input_section->output_offset
   3808 		    + rel->r_offset) & ~ (bfd_vma) 0x3;
   3809 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3810 	  break;
   3811 
   3812 	case R_IA64_SEGREL32MSB:
   3813 	case R_IA64_SEGREL32LSB:
   3814 	case R_IA64_SEGREL64MSB:
   3815 	case R_IA64_SEGREL64LSB:
   3816 	    {
   3817 	      /* Find the segment that contains the output_section.  */
   3818 	      Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
   3819 		(output_bfd, sym_sec->output_section);
   3820 
   3821 	      if (p == NULL)
   3822 		{
   3823 		  r = bfd_reloc_notsupported;
   3824 		}
   3825 	      else
   3826 		{
   3827 		  /* The VMA of the segment is the vaddr of the associated
   3828 		     program header.  */
   3829 		  if (value > p->p_vaddr)
   3830 		    value -= p->p_vaddr;
   3831 		  else
   3832 		    value = 0;
   3833 		  r = ia64_elf_install_value (hit_addr, value, r_type);
   3834 		}
   3835 	      break;
   3836 	    }
   3837 
   3838 	case R_IA64_SECREL32MSB:
   3839 	case R_IA64_SECREL32LSB:
   3840 	case R_IA64_SECREL64MSB:
   3841 	case R_IA64_SECREL64LSB:
   3842 	  /* Make output-section relative to section where the symbol
   3843 	     is defined. PR 475  */
   3844 	  if (sym_sec)
   3845 	    value -= sym_sec->output_section->vma;
   3846 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   3847 	  break;
   3848 
   3849 	case R_IA64_IPLTMSB:
   3850 	case R_IA64_IPLTLSB:
   3851 	  /* Install a dynamic relocation for this reloc.  */
   3852 	  if ((dynamic_symbol_p || bfd_link_pic (info))
   3853 	      && (input_section->flags & SEC_ALLOC) != 0)
   3854 	    {
   3855 	      /* VMS: FIXFD ??  */
   3856 	      abort ();
   3857 	    }
   3858 
   3859 	  if (r_type == R_IA64_IPLTMSB)
   3860 	    r_type = R_IA64_DIR64MSB;
   3861 	  else
   3862 	    r_type = R_IA64_DIR64LSB;
   3863 	  ia64_elf_install_value (hit_addr, value, r_type);
   3864 	  r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
   3865 	  break;
   3866 
   3867 	case R_IA64_TPREL14:
   3868 	case R_IA64_TPREL22:
   3869 	case R_IA64_TPREL64I:
   3870 	  r = bfd_reloc_notsupported;
   3871 	  break;
   3872 
   3873 	case R_IA64_DTPREL14:
   3874 	case R_IA64_DTPREL22:
   3875 	case R_IA64_DTPREL64I:
   3876 	case R_IA64_DTPREL32LSB:
   3877 	case R_IA64_DTPREL32MSB:
   3878 	case R_IA64_DTPREL64LSB:
   3879 	case R_IA64_DTPREL64MSB:
   3880 	  r = bfd_reloc_notsupported;
   3881 	  break;
   3882 
   3883 	case R_IA64_LTOFF_TPREL22:
   3884 	case R_IA64_LTOFF_DTPMOD22:
   3885 	case R_IA64_LTOFF_DTPREL22:
   3886 	  r = bfd_reloc_notsupported;
   3887 	  break;
   3888 
   3889 	default:
   3890 	  r = bfd_reloc_notsupported;
   3891 	  break;
   3892 	}
   3893 
   3894       switch (r)
   3895 	{
   3896 	case bfd_reloc_ok:
   3897 	  break;
   3898 
   3899 	case bfd_reloc_undefined:
   3900 	  /* This can happen for global table relative relocs if
   3901 	     __gp is undefined.  This is a panic situation so we
   3902 	     don't try to continue.  */
   3903 	  (*info->callbacks->undefined_symbol)
   3904 	    (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
   3905 	  return false;
   3906 
   3907 	case bfd_reloc_notsupported:
   3908 	  {
   3909 	    const char *name;
   3910 
   3911 	    if (h)
   3912 	      name = h->root.root.string;
   3913 	    else
   3914 	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3915 				       sym_sec);
   3916 	    (*info->callbacks->warning) (info, _("unsupported reloc"),
   3917 					 name, input_bfd,
   3918 					 input_section, rel->r_offset);
   3919 	    ret_val = false;
   3920 	  }
   3921 	  break;
   3922 
   3923 	case bfd_reloc_dangerous:
   3924 	case bfd_reloc_outofrange:
   3925 	case bfd_reloc_overflow:
   3926 	default:
   3927 	  {
   3928 	    const char *name;
   3929 
   3930 	    if (h)
   3931 	      name = h->root.root.string;
   3932 	    else
   3933 	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3934 				       sym_sec);
   3935 
   3936 	    switch (r_type)
   3937 	      {
   3938 	      case R_IA64_TPREL14:
   3939 	      case R_IA64_TPREL22:
   3940 	      case R_IA64_TPREL64I:
   3941 	      case R_IA64_DTPREL14:
   3942 	      case R_IA64_DTPREL22:
   3943 	      case R_IA64_DTPREL64I:
   3944 	      case R_IA64_DTPREL32LSB:
   3945 	      case R_IA64_DTPREL32MSB:
   3946 	      case R_IA64_DTPREL64LSB:
   3947 	      case R_IA64_DTPREL64MSB:
   3948 	      case R_IA64_LTOFF_TPREL22:
   3949 	      case R_IA64_LTOFF_DTPMOD22:
   3950 	      case R_IA64_LTOFF_DTPREL22:
   3951 		_bfd_error_handler
   3952 		  /* xgettext:c-format */
   3953 		  (_("%pB: missing TLS section for relocation %s against `%s'"
   3954 		     " at %#" PRIx64 " in section `%pA'."),
   3955 		   input_bfd, howto->name, name,
   3956 		   (uint64_t) rel->r_offset, input_section);
   3957 		break;
   3958 
   3959 	      case R_IA64_PCREL21B:
   3960 	      case R_IA64_PCREL21BI:
   3961 	      case R_IA64_PCREL21M:
   3962 	      case R_IA64_PCREL21F:
   3963 		if (is_elf_hash_table (info->hash))
   3964 		  {
   3965 		    /* Relaxtion is always performed for ELF output.
   3966 		       Overflow failures for those relocations mean
   3967 		       that the section is too big to relax.  */
   3968 		    _bfd_error_handler
   3969 		      /* xgettext:c-format */
   3970 		      (_("%pB: Can't relax br (%s) to `%s' "
   3971 			 "at %#" PRIx64 " in section `%pA' "
   3972 			 "with size %#" PRIx64 " (> 0x1000000)."),
   3973 		       input_bfd, howto->name, name, (uint64_t) rel->r_offset,
   3974 		       input_section, (uint64_t) input_section->size);
   3975 		    break;
   3976 		  }
   3977 		/* Fall through.  */
   3978 	      default:
   3979 		(*info->callbacks->reloc_overflow) (info,
   3980 						    &h->root,
   3981 						    name,
   3982 						    howto->name,
   3983 						    (bfd_vma) 0,
   3984 						    input_bfd,
   3985 						    input_section,
   3986 						    rel->r_offset);
   3987 		break;
   3988 	      }
   3989 
   3990 	    ret_val = false;
   3991 	  }
   3992 	  break;
   3993 	}
   3994     }
   3995 
   3996   return ret_val;
   3997 }
   3998 
   3999 static bool
   4000 elf64_ia64_finish_dynamic_symbol (bfd *output_bfd,
   4001 				  struct bfd_link_info *info,
   4002 				  struct elf_link_hash_entry *h,
   4003 				  Elf_Internal_Sym *sym)
   4004 {
   4005   struct elf64_ia64_link_hash_table *ia64_info;
   4006   struct elf64_ia64_dyn_sym_info *dyn_i;
   4007 
   4008   ia64_info = elf64_ia64_hash_table (info);
   4009 
   4010   dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
   4011 
   4012   /* Fill in the PLT data, if required.  */
   4013   if (dyn_i && dyn_i->want_plt)
   4014     {
   4015       bfd_byte *loc;
   4016       asection *plt_sec;
   4017       bfd_vma plt_addr, pltoff_addr, gp_val;
   4018 
   4019       gp_val = _bfd_get_gp_value (output_bfd);
   4020 
   4021       plt_sec = ia64_info->root.splt;
   4022       plt_addr = 0;  /* Not used as overriden by FIXUPs.  */
   4023       pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true);
   4024 
   4025       /* Initialize the FULL PLT entry, if needed.  */
   4026       if (dyn_i->want_plt2)
   4027 	{
   4028 	  loc = plt_sec->contents + dyn_i->plt2_offset;
   4029 
   4030 	  memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
   4031 	  ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
   4032 
   4033 	  /* Mark the symbol as undefined, rather than as defined in the
   4034 	     plt section.  Leave the value alone.  */
   4035 	  /* ??? We didn't redefine it in adjust_dynamic_symbol in the
   4036 	     first place.  But perhaps elflink.c did some for us.  */
   4037 	  if (!h->def_regular)
   4038 	    sym->st_shndx = SHN_UNDEF;
   4039 	}
   4040 
   4041       /* VMS: FIXFD.  */
   4042       elf64_ia64_install_fixup
   4043 	(output_bfd, ia64_info, h, R_IA64_VMS_FIXFD, ia64_info->pltoff_sec,
   4044 	 pltoff_addr - (ia64_info->pltoff_sec->output_section->vma
   4045 			+ ia64_info->pltoff_sec->output_offset), 0);
   4046     }
   4047 
   4048   /* Mark some specially defined symbols as absolute.  */
   4049   if (h == ia64_info->root.hdynamic
   4050       || h == ia64_info->root.hgot
   4051       || h == ia64_info->root.hplt)
   4052     sym->st_shndx = SHN_ABS;
   4053 
   4054   return true;
   4055 }
   4056 
   4057 static bool
   4058 elf64_ia64_finish_dynamic_sections (bfd *abfd,
   4059 				    struct bfd_link_info *info)
   4060 {
   4061   struct elf64_ia64_link_hash_table *ia64_info;
   4062   bfd *dynobj;
   4063 
   4064   ia64_info = elf64_ia64_hash_table (info);
   4065   if (ia64_info == NULL)
   4066     return false;
   4067 
   4068   dynobj = ia64_info->root.dynobj;
   4069 
   4070   if (elf_hash_table (info)->dynamic_sections_created)
   4071     {
   4072       Elf64_External_Dyn *dyncon, *dynconend;
   4073       asection *sdyn;
   4074       asection *unwind_sec;
   4075       bfd_vma gp_val;
   4076       unsigned int gp_seg;
   4077       bfd_vma gp_off;
   4078       Elf_Internal_Phdr *phdr;
   4079       Elf_Internal_Phdr *base_phdr;
   4080       unsigned int unwind_seg = 0;
   4081       unsigned int code_seg = 0;
   4082 
   4083       sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   4084       BFD_ASSERT (sdyn != NULL);
   4085       dyncon = (Elf64_External_Dyn *) sdyn->contents;
   4086       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
   4087 
   4088       gp_val = _bfd_get_gp_value (abfd);
   4089       phdr = _bfd_elf_find_segment_containing_section
   4090 	(info->output_bfd, ia64_info->pltoff_sec->output_section);
   4091       BFD_ASSERT (phdr != NULL);
   4092       base_phdr = elf_tdata (info->output_bfd)->phdr;
   4093       gp_seg = phdr - base_phdr;
   4094       gp_off = gp_val - phdr->p_vaddr;
   4095 
   4096       unwind_sec = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
   4097       if (unwind_sec != NULL)
   4098 	{
   4099 	  asection *code_sec;
   4100 
   4101 	  phdr = _bfd_elf_find_segment_containing_section (abfd, unwind_sec);
   4102 	  BFD_ASSERT (phdr != NULL);
   4103 	  unwind_seg = phdr - base_phdr;
   4104 
   4105 	  code_sec = bfd_get_section_by_name (abfd, "$CODE$");
   4106 	  phdr = _bfd_elf_find_segment_containing_section (abfd, code_sec);
   4107 	  BFD_ASSERT (phdr != NULL);
   4108 	  code_seg = phdr - base_phdr;
   4109 	}
   4110 
   4111       for (; dyncon < dynconend; dyncon++)
   4112 	{
   4113 	  Elf_Internal_Dyn dyn;
   4114 
   4115 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
   4116 
   4117 	  switch (dyn.d_tag)
   4118 	    {
   4119 	    case DT_IA_64_VMS_FIXUP_RELA_OFF:
   4120 	      dyn.d_un.d_val +=
   4121 		(ia64_info->fixups_sec->output_section->vma
   4122 		 + ia64_info->fixups_sec->output_offset)
   4123 		- (sdyn->output_section->vma + sdyn->output_offset);
   4124 	      break;
   4125 
   4126 	    case DT_IA_64_VMS_PLTGOT_OFFSET:
   4127 	      dyn.d_un.d_val = gp_off;
   4128 	      break;
   4129 
   4130 	    case DT_IA_64_VMS_PLTGOT_SEG:
   4131 	      dyn.d_un.d_val = gp_seg;
   4132 	      break;
   4133 
   4134 	    case DT_IA_64_VMS_UNWINDSZ:
   4135 	      if (unwind_sec == NULL)
   4136 		{
   4137 		  dyn.d_tag = DT_NULL;
   4138 		  dyn.d_un.d_val = 0xdead;
   4139 		}
   4140 	      else
   4141 		dyn.d_un.d_val = unwind_sec->size;
   4142 	      break;
   4143 
   4144 	    case DT_IA_64_VMS_UNWIND_CODSEG:
   4145 	      dyn.d_un.d_val = code_seg;
   4146 	      break;
   4147 
   4148 	    case DT_IA_64_VMS_UNWIND_INFOSEG:
   4149 	    case DT_IA_64_VMS_UNWIND_SEG:
   4150 	      dyn.d_un.d_val = unwind_seg;
   4151 	      break;
   4152 
   4153 	    case DT_IA_64_VMS_UNWIND_OFFSET:
   4154 	      break;
   4155 
   4156 	    default:
   4157 	      /* No need to rewrite the entry.  */
   4158 	      continue;
   4159 	    }
   4160 
   4161 	  bfd_elf64_swap_dyn_out (abfd, &dyn, dyncon);
   4162 	}
   4163     }
   4164 
   4165   /* Handle transfer addresses.  */
   4166   {
   4167     asection *tfr_sec = ia64_info->transfer_sec;
   4168     struct elf64_vms_transfer *tfr;
   4169     struct elf_link_hash_entry *tfr3;
   4170 
   4171     tfr = (struct elf64_vms_transfer *)tfr_sec->contents;
   4172     bfd_putl32 (6 * 8, tfr->size);
   4173     bfd_putl64 (tfr_sec->output_section->vma
   4174 		+ tfr_sec->output_offset
   4175 		+ 6 * 8, tfr->tfradr3);
   4176 
   4177     tfr3 = elf_link_hash_lookup (elf_hash_table (info), "ELF$TFRADR", false,
   4178 				 false, false);
   4179 
   4180     if (tfr3
   4181 	&& (tfr3->root.type == bfd_link_hash_defined
   4182 	    || tfr3->root.type == bfd_link_hash_defweak))
   4183       {
   4184 	asection *tfr3_sec = tfr3->root.u.def.section;
   4185 	bfd_vma tfr3_val;
   4186 
   4187 	tfr3_val = (tfr3->root.u.def.value
   4188 		    + tfr3_sec->output_section->vma
   4189 		    + tfr3_sec->output_offset);
   4190 
   4191 	bfd_putl64 (tfr3_val, tfr->tfr3_func);
   4192 	bfd_putl64 (_bfd_get_gp_value (info->output_bfd), tfr->tfr3_gp);
   4193       }
   4194 
   4195     /* FIXME: set linker flags,
   4196        handle lib$initialize.  */
   4197   }
   4198 
   4199   return true;
   4200 }
   4201 
   4202 /* ELF file flag handling:  */
   4203 
   4204 /* Function to keep IA-64 specific file flags.  */
   4205 static bool
   4206 elf64_ia64_set_private_flags (bfd *abfd, flagword flags)
   4207 {
   4208   BFD_ASSERT (!elf_flags_init (abfd)
   4209 	      || elf_elfheader (abfd)->e_flags == flags);
   4210 
   4211   elf_elfheader (abfd)->e_flags = flags;
   4212   elf_flags_init (abfd) = true;
   4213   return true;
   4214 }
   4215 
   4216 /* Merge backend specific data from an object file to the output
   4217    object file when linking.  */
   4218 static bool
   4219 elf64_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   4220 {
   4221   bfd *obfd = info->output_bfd;
   4222   flagword out_flags;
   4223   flagword in_flags;
   4224   bool ok = true;
   4225 
   4226   /* FIXME: What should be checked when linking shared libraries?  */
   4227   if ((ibfd->flags & DYNAMIC) != 0)
   4228     return true;
   4229 
   4230   /* Don't even pretend to support mixed-format linking.  */
   4231   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
   4232       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
   4233     return false;
   4234 
   4235   in_flags  = elf_elfheader (ibfd)->e_flags;
   4236   out_flags = elf_elfheader (obfd)->e_flags;
   4237 
   4238   if (! elf_flags_init (obfd))
   4239     {
   4240       elf_flags_init (obfd) = true;
   4241       elf_elfheader (obfd)->e_flags = in_flags;
   4242 
   4243       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   4244 	  && bfd_get_arch_info (obfd)->the_default)
   4245 	{
   4246 	  return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
   4247 				    bfd_get_mach (ibfd));
   4248 	}
   4249 
   4250       return true;
   4251     }
   4252 
   4253   /* Check flag compatibility.  */
   4254   if (in_flags == out_flags)
   4255     return true;
   4256 
   4257   /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set.  */
   4258   if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
   4259     elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
   4260 
   4261   if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
   4262     {
   4263       _bfd_error_handler
   4264 	(_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
   4265 	 ibfd);
   4266 
   4267       bfd_set_error (bfd_error_bad_value);
   4268       ok = false;
   4269     }
   4270   if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
   4271     {
   4272       _bfd_error_handler
   4273 	(_("%pB: linking big-endian files with little-endian files"),
   4274 	 ibfd);
   4275 
   4276       bfd_set_error (bfd_error_bad_value);
   4277       ok = false;
   4278     }
   4279   if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
   4280     {
   4281       _bfd_error_handler
   4282 	(_("%pB: linking 64-bit files with 32-bit files"),
   4283 	 ibfd);
   4284 
   4285       bfd_set_error (bfd_error_bad_value);
   4286       ok = false;
   4287     }
   4288   if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
   4289     {
   4290       _bfd_error_handler
   4291 	(_("%pB: linking constant-gp files with non-constant-gp files"),
   4292 	 ibfd);
   4293 
   4294       bfd_set_error (bfd_error_bad_value);
   4295       ok = false;
   4296     }
   4297   if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
   4298       != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
   4299     {
   4300       _bfd_error_handler
   4301 	(_("%pB: linking auto-pic files with non-auto-pic files"),
   4302 	 ibfd);
   4303 
   4304       bfd_set_error (bfd_error_bad_value);
   4305       ok = false;
   4306     }
   4307 
   4308   return ok;
   4309 }
   4310 
   4311 static bool
   4312 elf64_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
   4313 {
   4314   FILE *file = (FILE *) ptr;
   4315   flagword flags = elf_elfheader (abfd)->e_flags;
   4316 
   4317   BFD_ASSERT (abfd != NULL && ptr != NULL);
   4318 
   4319   fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
   4320 	   (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
   4321 	   (flags & EF_IA_64_EXT) ? "EXT, " : "",
   4322 	   (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
   4323 	   (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
   4324 	   (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
   4325 	   (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
   4326 	   (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
   4327 	   (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
   4328 
   4329   _bfd_elf_print_private_bfd_data (abfd, ptr);
   4330   return true;
   4331 }
   4332 
   4333 static enum elf_reloc_type_class
   4334 elf64_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   4335 			     const asection *rel_sec ATTRIBUTE_UNUSED,
   4336 			     const Elf_Internal_Rela *rela)
   4337 {
   4338   switch ((int) ELF64_R_TYPE (rela->r_info))
   4339     {
   4340     case R_IA64_REL32MSB:
   4341     case R_IA64_REL32LSB:
   4342     case R_IA64_REL64MSB:
   4343     case R_IA64_REL64LSB:
   4344       return reloc_class_relative;
   4345     case R_IA64_IPLTMSB:
   4346     case R_IA64_IPLTLSB:
   4347       return reloc_class_plt;
   4348     case R_IA64_COPY:
   4349       return reloc_class_copy;
   4350     default:
   4351       return reloc_class_normal;
   4352     }
   4353 }
   4354 
   4355 static const struct bfd_elf_special_section elf64_ia64_special_sections[] =
   4356 {
   4357   { STRING_COMMA_LEN (".sbss"),	 -1, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
   4358   { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
   4359   { NULL,		     0,	  0, 0,		   0 }
   4360 };
   4361 
   4362 static bool
   4363 elf64_ia64_object_p (bfd *abfd)
   4364 {
   4365   asection *sec;
   4366   asection *group, *unwi, *unw;
   4367   flagword flags;
   4368   const char *name;
   4369   char *unwi_name, *unw_name;
   4370   size_t amt;
   4371 
   4372   if (abfd->flags & DYNAMIC)
   4373     return true;
   4374 
   4375   /* Flags for fake group section.  */
   4376   flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
   4377 	   | SEC_EXCLUDE);
   4378 
   4379   /* We add a fake section group for each .gnu.linkonce.t.* section,
   4380      which isn't in a section group, and its unwind sections.  */
   4381   for (sec = abfd->sections; sec != NULL; sec = sec->next)
   4382     {
   4383       if (elf_sec_group (sec) == NULL
   4384 	  && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
   4385 	      == (SEC_LINK_ONCE | SEC_CODE))
   4386 	  && startswith (sec->name, ".gnu.linkonce.t."))
   4387 	{
   4388 	  name = sec->name + 16;
   4389 
   4390 	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
   4391 	  unwi_name = bfd_alloc (abfd, amt);
   4392 	  if (!unwi_name)
   4393 	    return false;
   4394 
   4395 	  strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
   4396 	  unwi = bfd_get_section_by_name (abfd, unwi_name);
   4397 
   4398 	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
   4399 	  unw_name = bfd_alloc (abfd, amt);
   4400 	  if (!unw_name)
   4401 	    return false;
   4402 
   4403 	  strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
   4404 	  unw = bfd_get_section_by_name (abfd, unw_name);
   4405 
   4406 	  /* We need to create a fake group section for it and its
   4407 	     unwind sections.  */
   4408 	  group = bfd_make_section_anyway_with_flags (abfd, name,
   4409 						      flags);
   4410 	  if (group == NULL)
   4411 	    return false;
   4412 
   4413 	  /* Move the fake group section to the beginning.  */
   4414 	  bfd_section_list_remove (abfd, group);
   4415 	  bfd_section_list_prepend (abfd, group);
   4416 
   4417 	  elf_next_in_group (group) = sec;
   4418 
   4419 	  elf_group_name (sec) = name;
   4420 	  elf_next_in_group (sec) = sec;
   4421 	  elf_sec_group (sec) = group;
   4422 
   4423 	  if (unwi)
   4424 	    {
   4425 	      elf_group_name (unwi) = name;
   4426 	      elf_next_in_group (unwi) = sec;
   4427 	      elf_next_in_group (sec) = unwi;
   4428 	      elf_sec_group (unwi) = group;
   4429 	    }
   4430 
   4431 	   if (unw)
   4432 	     {
   4433 	       elf_group_name (unw) = name;
   4434 	       if (unwi)
   4435 		 {
   4436 		   elf_next_in_group (unw) = elf_next_in_group (unwi);
   4437 		   elf_next_in_group (unwi) = unw;
   4438 		 }
   4439 	       else
   4440 		 {
   4441 		   elf_next_in_group (unw) = sec;
   4442 		   elf_next_in_group (sec) = unw;
   4443 		 }
   4444 	       elf_sec_group (unw) = group;
   4445 	     }
   4446 
   4447 	   /* Fake SHT_GROUP section header.  */
   4448 	  elf_section_data (group)->this_hdr.bfd_section = group;
   4449 	  elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
   4450 	}
   4451     }
   4452   return true;
   4453 }
   4454 
   4455 /* Handle an IA-64 specific section when reading an object file.  This
   4456    is called when bfd_section_from_shdr finds a section with an unknown
   4457    type.  */
   4458 
   4459 static bool
   4460 elf64_vms_section_from_shdr (bfd *abfd,
   4461 			     Elf_Internal_Shdr *hdr,
   4462 			     const char *name,
   4463 			     int shindex)
   4464 {
   4465   flagword secflags = 0;
   4466 
   4467   switch (hdr->sh_type)
   4468     {
   4469     case SHT_IA_64_VMS_TRACE:
   4470     case SHT_IA_64_VMS_DEBUG:
   4471     case SHT_IA_64_VMS_DEBUG_STR:
   4472       secflags = SEC_DEBUGGING;
   4473       break;
   4474 
   4475     case SHT_IA_64_UNWIND:
   4476     case SHT_IA_64_HP_OPT_ANOT:
   4477       break;
   4478 
   4479     case SHT_IA_64_EXT:
   4480       if (strcmp (name, ELF_STRING_ia64_archext) != 0)
   4481 	return false;
   4482       break;
   4483 
   4484     default:
   4485       return false;
   4486     }
   4487 
   4488   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
   4489     return false;
   4490 
   4491   if (secflags != 0)
   4492     {
   4493       asection *newsect = hdr->bfd_section;
   4494 
   4495       if (!bfd_set_section_flags (newsect,
   4496 				  bfd_section_flags (newsect) | secflags))
   4497 	return false;
   4498     }
   4499 
   4500   return true;
   4501 }
   4502 
   4503 static bool
   4504 elf64_vms_object_p (bfd *abfd)
   4505 {
   4506   Elf_Internal_Ehdr *i_ehdrp = elf_elfheader (abfd);
   4507   Elf_Internal_Phdr *i_phdr = elf_tdata (abfd)->phdr;
   4508   unsigned int i;
   4509   unsigned int num_text = 0;
   4510   unsigned int num_data = 0;
   4511   unsigned int num_rodata = 0;
   4512   char name[16];
   4513 
   4514   if (!elf64_ia64_object_p (abfd))
   4515     return false;
   4516 
   4517   /* Many VMS compilers do not generate sections for the corresponding
   4518      segment.  This is boring as binutils tools won't be able to disassemble
   4519      the code.  So we simply create all the missing sections.  */
   4520   for (i = 0; i < i_ehdrp->e_phnum; i++, i_phdr++)
   4521     {
   4522       /* Is there a section for this segment?  */
   4523       bfd_vma base_vma = i_phdr->p_vaddr;
   4524       bfd_vma limit_vma = base_vma + i_phdr->p_filesz;
   4525 
   4526       if (i_phdr->p_type != PT_LOAD)
   4527 	continue;
   4528 
   4529       /* We need to cover from base_vms to limit_vma.  */
   4530     again:
   4531       while (base_vma < limit_vma)
   4532 	{
   4533 	  bfd_vma next_vma = limit_vma;
   4534 	  asection *nsec;
   4535 	  asection *sec;
   4536 	  flagword flags;
   4537 	  char *nname = NULL;
   4538 
   4539 	  /* Find a section covering [base_vma;limit_vma)  */
   4540 	  for (sec = abfd->sections; sec != NULL; sec = sec->next)
   4541 	    {
   4542 	      /* Skip uninteresting sections (either not in memory or
   4543 		 below base_vma.  */
   4544 	      if ((sec->flags & (SEC_ALLOC | SEC_LOAD)) == 0
   4545 		  || sec->vma + sec->size <= base_vma)
   4546 		continue;
   4547 	      if (sec->vma <= base_vma)
   4548 		{
   4549 		  /* This section covers (maybe partially) the beginning
   4550 		     of the range.  */
   4551 		  base_vma = sec->vma + sec->size;
   4552 		  goto again;
   4553 		}
   4554 	      if (sec->vma < next_vma)
   4555 		{
   4556 		  /* This section partially covers the end of the range.
   4557 		     Used to compute the size of the hole.  */
   4558 		  next_vma = sec->vma;
   4559 		}
   4560 	    }
   4561 
   4562 	  /* No section covering [base_vma; next_vma).  Create a fake one.  */
   4563 	  flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS;
   4564 	  if (i_phdr->p_flags & PF_X)
   4565 	    {
   4566 	      flags |= SEC_CODE;
   4567 	      if (num_text++ == 0)
   4568 		nname = ".text";
   4569 	      else
   4570 		sprintf (name, ".text$%u", num_text);
   4571 	    }
   4572 	  else if ((i_phdr->p_flags & (PF_R | PF_W)) == PF_R)
   4573 	    {
   4574 	      flags |= SEC_READONLY;
   4575 	      sprintf (name, ".rodata$%u", num_rodata++);
   4576 	    }
   4577 	  else
   4578 	    {
   4579 	      flags |= SEC_DATA;
   4580 	      sprintf (name, ".data$%u", num_data++);
   4581 	    }
   4582 
   4583 	  /* Allocate name.  */
   4584 	  if (nname == NULL)
   4585 	    {
   4586 	      size_t name_len = strlen (name) + 1;
   4587 	      nname = bfd_alloc (abfd, name_len);
   4588 	      if (nname == NULL)
   4589 		return false;
   4590 	      memcpy (nname, name, name_len);
   4591 	    }
   4592 
   4593 	  /* Create and fill new section.  */
   4594 	  nsec = bfd_make_section_anyway_with_flags (abfd, nname, flags);
   4595 	  if (nsec == NULL)
   4596 	    return false;
   4597 	  nsec->vma = base_vma;
   4598 	  nsec->size = next_vma - base_vma;
   4599 	  nsec->filepos = i_phdr->p_offset + (base_vma - i_phdr->p_vaddr);
   4600 
   4601 	  base_vma = next_vma;
   4602 	}
   4603     }
   4604   return true;
   4605 }
   4606 
   4607 static bool
   4608 elf64_vms_init_file_header (bfd *abfd, struct bfd_link_info *info)
   4609 {
   4610   Elf_Internal_Ehdr *i_ehdrp;
   4611 
   4612   if (!_bfd_elf_init_file_header (abfd, info))
   4613     return false;
   4614 
   4615   i_ehdrp = elf_elfheader (abfd);
   4616   i_ehdrp->e_ident[EI_OSABI] = ELFOSABI_OPENVMS;
   4617   i_ehdrp->e_ident[EI_ABIVERSION] = 2;
   4618   return true;
   4619 }
   4620 
   4621 static bool
   4622 elf64_vms_section_processing (bfd *abfd ATTRIBUTE_UNUSED,
   4623 			      Elf_Internal_Shdr *hdr)
   4624 {
   4625   if (hdr->bfd_section != NULL)
   4626     {
   4627       const char *name = bfd_section_name (hdr->bfd_section);
   4628 
   4629       if (strcmp (name, ".text") == 0)
   4630 	hdr->sh_flags |= SHF_IA_64_VMS_SHARED;
   4631       else if ((strcmp (name, ".debug") == 0)
   4632 	    || (strcmp (name, ".debug_abbrev") == 0)
   4633 	    || (strcmp (name, ".debug_aranges") == 0)
   4634 	    || (strcmp (name, ".debug_frame") == 0)
   4635 	    || (strcmp (name, ".debug_info") == 0)
   4636 	    || (strcmp (name, ".debug_loc") == 0)
   4637 	    || (strcmp (name, ".debug_macinfo") == 0)
   4638 	    || (strcmp (name, ".debug_pubnames") == 0)
   4639 	    || (strcmp (name, ".debug_pubtypes") == 0))
   4640 	hdr->sh_type = SHT_IA_64_VMS_DEBUG;
   4641       else if ((strcmp (name, ".debug_line") == 0)
   4642 	    || (strcmp (name, ".debug_ranges") == 0)
   4643 	    || (strcmp (name, ".trace_info") == 0)
   4644 	    || (strcmp (name, ".trace_abbrev") == 0)
   4645 	    || (strcmp (name, ".trace_aranges") == 0))
   4646 	hdr->sh_type = SHT_IA_64_VMS_TRACE;
   4647       else if (strcmp (name, ".debug_str") == 0)
   4648 	hdr->sh_type = SHT_IA_64_VMS_DEBUG_STR;
   4649     }
   4650 
   4651   return true;
   4652 }
   4653 
   4654 /* The final processing done just before writing out a VMS IA-64 ELF
   4655    object file.  */
   4656 
   4657 static bool
   4658 elf64_vms_final_write_processing (bfd *abfd)
   4659 {
   4660   Elf_Internal_Shdr *hdr;
   4661   asection *s;
   4662   int unwind_info_sect_idx = 0;
   4663 
   4664   for (s = abfd->sections; s; s = s->next)
   4665     {
   4666       hdr = &elf_section_data (s)->this_hdr;
   4667 
   4668       if (strcmp (bfd_section_name (hdr->bfd_section),
   4669 		  ".IA_64.unwind_info") == 0)
   4670 	unwind_info_sect_idx = elf_section_data (s)->this_idx;
   4671 
   4672       switch (hdr->sh_type)
   4673 	{
   4674 	case SHT_IA_64_UNWIND:
   4675 	  /* VMS requires sh_info to point to the unwind info section.  */
   4676 	  hdr->sh_info = unwind_info_sect_idx;
   4677 	  break;
   4678 	}
   4679     }
   4680 
   4681   if (! elf_flags_init (abfd))
   4682     {
   4683       unsigned long flags = 0;
   4684 
   4685       if (abfd->xvec->byteorder == BFD_ENDIAN_BIG)
   4686 	flags |= EF_IA_64_BE;
   4687       if (bfd_get_mach (abfd) == bfd_mach_ia64_elf64)
   4688 	flags |= EF_IA_64_ABI64;
   4689 
   4690       elf_elfheader (abfd)->e_flags = flags;
   4691       elf_flags_init (abfd) = true;
   4692     }
   4693   return _bfd_elf_final_write_processing (abfd);
   4694 }
   4695 
   4696 static bool
   4697 elf64_vms_write_shdrs_and_ehdr (bfd *abfd)
   4698 {
   4699   unsigned char needed_count[8];
   4700 
   4701   if (!bfd_elf64_write_shdrs_and_ehdr (abfd))
   4702     return false;
   4703 
   4704   bfd_putl64 (elf_ia64_vms_tdata (abfd)->needed_count, needed_count);
   4705 
   4706   if (bfd_seek (abfd, sizeof (Elf64_External_Ehdr), SEEK_SET) != 0
   4707       || bfd_write (needed_count, 8, abfd) != 8)
   4708     return false;
   4709 
   4710   return true;
   4711 }
   4712 
   4713 static bool
   4714 elf64_vms_close_and_cleanup (bfd *abfd)
   4715 {
   4716   bool ret = true;
   4717   if (bfd_get_format (abfd) == bfd_object
   4718       && bfd_write_p (abfd))
   4719     {
   4720       long isize;
   4721 
   4722       /* Pad to 8 byte boundary for IPF/VMS.  */
   4723       isize = bfd_get_size (abfd);
   4724       if ((isize & 7) != 0)
   4725 	{
   4726 	  unsigned int ishort = 8 - (isize & 7);
   4727 	  uint64_t pad = 0;
   4728 
   4729 	  if (bfd_seek (abfd, isize, SEEK_SET) != 0
   4730 	      || bfd_write (&pad, ishort, abfd) != ishort)
   4731 	    ret = false;
   4732 	}
   4733     }
   4734 
   4735   return _bfd_generic_close_and_cleanup (abfd) && ret;
   4736 }
   4737 
   4738 /* Add symbols from an ELF object file to the linker hash table.  */
   4739 
   4740 static bool
   4741 elf64_vms_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
   4742 {
   4743   Elf_Internal_Shdr *hdr;
   4744   bfd_size_type symcount;
   4745   bfd_size_type extsymcount;
   4746   bfd_size_type extsymoff;
   4747   struct elf_link_hash_entry **sym_hash;
   4748   bool dynamic;
   4749   Elf_Internal_Sym *isymbuf = NULL;
   4750   Elf_Internal_Sym *isym;
   4751   Elf_Internal_Sym *isymend;
   4752   const struct elf_backend_data *bed;
   4753   struct elf_link_hash_table *htab;
   4754   bfd_size_type amt;
   4755 
   4756   htab = elf_hash_table (info);
   4757   bed = get_elf_backend_data (abfd);
   4758 
   4759   if ((abfd->flags & DYNAMIC) == 0)
   4760     dynamic = false;
   4761   else
   4762     {
   4763       dynamic = true;
   4764 
   4765       /* You can't use -r against a dynamic object.  Also, there's no
   4766 	 hope of using a dynamic object which does not exactly match
   4767 	 the format of the output file.  */
   4768       if (bfd_link_relocatable (info)
   4769 	  || !is_elf_hash_table (&htab->root)
   4770 	  || info->output_bfd->xvec != abfd->xvec)
   4771 	{
   4772 	  if (bfd_link_relocatable (info))
   4773 	    bfd_set_error (bfd_error_invalid_operation);
   4774 	  else
   4775 	    bfd_set_error (bfd_error_wrong_format);
   4776 	  goto error_return;
   4777 	}
   4778     }
   4779 
   4780   if (! dynamic)
   4781     {
   4782       /* If we are creating a shared library, create all the dynamic
   4783 	 sections immediately.  We need to attach them to something,
   4784 	 so we attach them to this BFD, provided it is the right
   4785 	 format.  FIXME: If there are no input BFD's of the same
   4786 	 format as the output, we can't make a shared library.  */
   4787       if (bfd_link_pic (info)
   4788 	  && is_elf_hash_table (&htab->root)
   4789 	  && info->output_bfd->xvec == abfd->xvec
   4790 	  && !htab->dynamic_sections_created)
   4791 	{
   4792 	  if (! elf64_ia64_create_dynamic_sections (abfd, info))
   4793 	    goto error_return;
   4794 	}
   4795     }
   4796   else if (!is_elf_hash_table (&htab->root))
   4797     goto error_return;
   4798   else
   4799     {
   4800       asection *s;
   4801       bfd_byte *dynbuf;
   4802       bfd_byte *extdyn;
   4803 
   4804       /* ld --just-symbols and dynamic objects don't mix very well.
   4805 	 ld shouldn't allow it.  */
   4806       if ((s = abfd->sections) != NULL
   4807 	  && s->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
   4808 	abort ();
   4809 
   4810       /* Be sure there are dynamic sections.  */
   4811       if (! elf64_ia64_create_dynamic_sections (htab->dynobj, info))
   4812 	goto error_return;
   4813 
   4814       s = bfd_get_section_by_name (abfd, ".dynamic");
   4815       if (s == NULL)
   4816 	{
   4817 	  /* VMS libraries do not have dynamic sections.  Create one from
   4818 	     the segment.  */
   4819 	  Elf_Internal_Phdr *phdr;
   4820 	  unsigned int i, phnum;
   4821 
   4822 	  phdr = elf_tdata (abfd)->phdr;
   4823 	  if (phdr == NULL)
   4824 	    goto error_return;
   4825 	  phnum = elf_elfheader (abfd)->e_phnum;
   4826 	  for (i = 0; i < phnum; phdr++)
   4827 	    if (phdr->p_type == PT_DYNAMIC)
   4828 	      {
   4829 		s = bfd_make_section (abfd, ".dynamic");
   4830 		if (s == NULL)
   4831 		  goto error_return;
   4832 		s->vma = phdr->p_vaddr;
   4833 		s->lma = phdr->p_paddr;
   4834 		s->size = phdr->p_filesz;
   4835 		s->filepos = phdr->p_offset;
   4836 		s->flags |= SEC_HAS_CONTENTS;
   4837 		s->alignment_power = bfd_log2 (phdr->p_align);
   4838 		break;
   4839 	      }
   4840 	  if (s == NULL)
   4841 	    goto error_return;
   4842 	}
   4843 
   4844       /* Extract IDENT.  */
   4845       if (!bfd_malloc_and_get_section (abfd, s, &dynbuf))
   4846 	{
   4847 	error_free_dyn:
   4848 	  free (dynbuf);
   4849 	  goto error_return;
   4850 	}
   4851 
   4852       for (extdyn = dynbuf;
   4853 	   (size_t) (dynbuf + s->size - extdyn) >= bed->s->sizeof_dyn;
   4854 	   extdyn += bed->s->sizeof_dyn)
   4855 	{
   4856 	  Elf_Internal_Dyn dyn;
   4857 
   4858 	  bed->s->swap_dyn_in (abfd, extdyn, &dyn);
   4859 	  if (dyn.d_tag == DT_IA_64_VMS_IDENT)
   4860 	    {
   4861 	      uint64_t tagv = dyn.d_un.d_val;
   4862 	      elf_ia64_vms_ident (abfd) = tagv;
   4863 	      break;
   4864 	    }
   4865 	}
   4866       if (extdyn >= dynbuf + s->size)
   4867 	{
   4868 	  /* Ident not found.  */
   4869 	  goto error_free_dyn;
   4870 	}
   4871       free (dynbuf);
   4872 
   4873       /* We do not want to include any of the sections in a dynamic
   4874 	 object in the output file.  We hack by simply clobbering the
   4875 	 list of sections in the BFD.  This could be handled more
   4876 	 cleanly by, say, a new section flag; the existing
   4877 	 SEC_NEVER_LOAD flag is not the one we want, because that one
   4878 	 still implies that the section takes up space in the output
   4879 	 file.  */
   4880       bfd_section_list_clear (abfd);
   4881 
   4882       /* FIXME: should we detect if this library is already included ?
   4883 	 This should be harmless and shouldn't happen in practice.  */
   4884     }
   4885 
   4886   hdr = &elf_tdata (abfd)->symtab_hdr;
   4887   symcount = hdr->sh_size / bed->s->sizeof_sym;
   4888 
   4889   /* The sh_info field of the symtab header tells us where the
   4890      external symbols start.  We don't care about the local symbols at
   4891      this point.  */
   4892   extsymcount = symcount - hdr->sh_info;
   4893   extsymoff = hdr->sh_info;
   4894 
   4895   sym_hash = NULL;
   4896   if (extsymcount != 0)
   4897     {
   4898       isymbuf = bfd_elf_get_elf_syms (abfd, hdr, extsymcount, extsymoff,
   4899 				      NULL, NULL, NULL);
   4900       if (isymbuf == NULL)
   4901 	goto error_return;
   4902 
   4903       /* We store a pointer to the hash table entry for each external
   4904 	 symbol.  */
   4905       amt = extsymcount * sizeof (struct elf_link_hash_entry *);
   4906       sym_hash = (struct elf_link_hash_entry **) bfd_alloc (abfd, amt);
   4907       if (sym_hash == NULL)
   4908 	goto error_free_sym;
   4909       elf_sym_hashes (abfd) = sym_hash;
   4910     }
   4911 
   4912   for (isym = isymbuf, isymend = isymbuf + extsymcount;
   4913        isym < isymend;
   4914        isym++, sym_hash++)
   4915     {
   4916       int bind;
   4917       bfd_vma value;
   4918       asection *sec, *new_sec;
   4919       flagword flags;
   4920       const char *name;
   4921       struct elf_link_hash_entry *h;
   4922       bool definition;
   4923       bool size_change_ok;
   4924       bool type_change_ok;
   4925       bool common;
   4926       unsigned int old_alignment;
   4927       bfd *old_bfd;
   4928 
   4929       flags = BSF_NO_FLAGS;
   4930       sec = NULL;
   4931       value = isym->st_value;
   4932       *sym_hash = NULL;
   4933       common = bed->common_definition (isym);
   4934 
   4935       bind = ELF_ST_BIND (isym->st_info);
   4936       switch (bind)
   4937 	{
   4938 	case STB_LOCAL:
   4939 	  /* This should be impossible, since ELF requires that all
   4940 	     global symbols follow all local symbols, and that sh_info
   4941 	     point to the first global symbol.  Unfortunately, Irix 5
   4942 	     screws this up.  */
   4943 	  continue;
   4944 
   4945 	case STB_GLOBAL:
   4946 	  if (isym->st_shndx != SHN_UNDEF && !common)
   4947 	    flags = BSF_GLOBAL;
   4948 	  break;
   4949 
   4950 	case STB_WEAK:
   4951 	  flags = BSF_WEAK;
   4952 	  break;
   4953 
   4954 	case STB_GNU_UNIQUE:
   4955 	  flags = BSF_GNU_UNIQUE;
   4956 	  break;
   4957 
   4958 	default:
   4959 	  /* Leave it up to the processor backend.  */
   4960 	  break;
   4961 	}
   4962 
   4963       if (isym->st_shndx == SHN_UNDEF)
   4964 	sec = bfd_und_section_ptr;
   4965       else if (isym->st_shndx == SHN_ABS)
   4966 	sec = bfd_abs_section_ptr;
   4967       else if (isym->st_shndx == SHN_COMMON)
   4968 	{
   4969 	  sec = bfd_com_section_ptr;
   4970 	  /* What ELF calls the size we call the value.  What ELF
   4971 	     calls the value we call the alignment.  */
   4972 	  value = isym->st_size;
   4973 	}
   4974       else
   4975 	{
   4976 	  sec = bfd_section_from_elf_index (abfd, isym->st_shndx);
   4977 	  if (sec == NULL)
   4978 	    sec = bfd_abs_section_ptr;
   4979 	  else if (sec->kept_section)
   4980 	    {
   4981 	      /* Symbols from discarded section are undefined.  We keep
   4982 		 its visibility.  */
   4983 	      sec = bfd_und_section_ptr;
   4984 	      isym->st_shndx = SHN_UNDEF;
   4985 	    }
   4986 	  else if ((abfd->flags & (EXEC_P | DYNAMIC)) != 0)
   4987 	    value -= sec->vma;
   4988 	}
   4989 
   4990       name = bfd_elf_string_from_elf_section (abfd, hdr->sh_link,
   4991 					      isym->st_name);
   4992       if (name == NULL)
   4993 	goto error_free_vers;
   4994 
   4995       if (bed->elf_add_symbol_hook)
   4996 	{
   4997 	  if (! (*bed->elf_add_symbol_hook) (abfd, info, isym, &name, &flags,
   4998 					     &sec, &value))
   4999 	    goto error_free_vers;
   5000 
   5001 	  /* The hook function sets the name to NULL if this symbol
   5002 	     should be skipped for some reason.  */
   5003 	  if (name == NULL)
   5004 	    continue;
   5005 	}
   5006 
   5007       /* Sanity check that all possibilities were handled.  */
   5008       if (sec == NULL)
   5009 	{
   5010 	  bfd_set_error (bfd_error_bad_value);
   5011 	  goto error_free_vers;
   5012 	}
   5013 
   5014       if (bfd_is_und_section (sec)
   5015 	  || bfd_is_com_section (sec))
   5016 	definition = false;
   5017       else
   5018 	definition = true;
   5019 
   5020       size_change_ok = false;
   5021       type_change_ok = bed->type_change_ok;
   5022       old_alignment = 0;
   5023       old_bfd = NULL;
   5024       new_sec = sec;
   5025 
   5026       if (! bfd_is_und_section (sec))
   5027 	h = elf_link_hash_lookup (htab, name, true, false, false);
   5028       else
   5029 	h = ((struct elf_link_hash_entry *) bfd_wrapped_link_hash_lookup
   5030 	     (abfd, info, name, true, false, false));
   5031       if (h == NULL)
   5032 	goto error_free_sym;
   5033 
   5034       *sym_hash = h;
   5035 
   5036       if (is_elf_hash_table (&htab->root))
   5037 	{
   5038 	  while (h->root.type == bfd_link_hash_indirect
   5039 		 || h->root.type == bfd_link_hash_warning)
   5040 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
   5041 
   5042 	  /* Remember the old alignment if this is a common symbol, so
   5043 	     that we don't reduce the alignment later on.  We can't
   5044 	     check later, because _bfd_generic_link_add_one_symbol
   5045 	     will set a default for the alignment which we want to
   5046 	     override. We also remember the old bfd where the existing
   5047 	     definition comes from.  */
   5048 	  switch (h->root.type)
   5049 	    {
   5050 	    default:
   5051 	      break;
   5052 
   5053 	    case bfd_link_hash_defined:
   5054 	      if (abfd->selective_search)
   5055 		continue;
   5056 	      /* Fall-through.  */
   5057 	    case bfd_link_hash_defweak:
   5058 	      old_bfd = h->root.u.def.section->owner;
   5059 	      break;
   5060 
   5061 	    case bfd_link_hash_common:
   5062 	      old_bfd = h->root.u.c.p->section->owner;
   5063 	      old_alignment = h->root.u.c.p->alignment_power;
   5064 	      break;
   5065 	    }
   5066 	}
   5067 
   5068       if (! (_bfd_generic_link_add_one_symbol
   5069 	     (info, abfd, name, flags, sec, value, NULL, false, bed->collect,
   5070 	      (struct bfd_link_hash_entry **) sym_hash)))
   5071 	goto error_free_vers;
   5072 
   5073       h = *sym_hash;
   5074       while (h->root.type == bfd_link_hash_indirect
   5075 	     || h->root.type == bfd_link_hash_warning)
   5076 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
   5077 
   5078       *sym_hash = h;
   5079       if (definition)
   5080 	h->unique_global = (flags & BSF_GNU_UNIQUE) != 0;
   5081 
   5082       /* Set the alignment of a common symbol.  */
   5083       if ((common || bfd_is_com_section (sec))
   5084 	  && h->root.type == bfd_link_hash_common)
   5085 	{
   5086 	  unsigned int align;
   5087 
   5088 	  if (common)
   5089 	    align = bfd_log2 (isym->st_value);
   5090 	  else
   5091 	    {
   5092 	      /* The new symbol is a common symbol in a shared object.
   5093 		 We need to get the alignment from the section.  */
   5094 	      align = new_sec->alignment_power;
   5095 	    }
   5096 	  if (align > old_alignment
   5097 	      /* Permit an alignment power of zero if an alignment of one
   5098 		 is specified and no other alignments have been specified.  */
   5099 	      || (isym->st_value == 1 && old_alignment == 0))
   5100 	    h->root.u.c.p->alignment_power = align;
   5101 	  else
   5102 	    h->root.u.c.p->alignment_power = old_alignment;
   5103 	}
   5104 
   5105       if (is_elf_hash_table (&htab->root))
   5106 	{
   5107 	  /* Check the alignment when a common symbol is involved. This
   5108 	     can change when a common symbol is overridden by a normal
   5109 	     definition or a common symbol is ignored due to the old
   5110 	     normal definition. We need to make sure the maximum
   5111 	     alignment is maintained.  */
   5112 	  if ((old_alignment || common)
   5113 	      && h->root.type != bfd_link_hash_common)
   5114 	    {
   5115 	      unsigned int common_align;
   5116 	      unsigned int normal_align;
   5117 	      unsigned int symbol_align;
   5118 	      bfd *normal_bfd;
   5119 	      bfd *common_bfd;
   5120 
   5121 	      symbol_align = ffs (h->root.u.def.value) - 1;
   5122 	      if (h->root.u.def.section->owner != NULL
   5123 		  && (h->root.u.def.section->owner->flags & DYNAMIC) == 0)
   5124 		{
   5125 		  normal_align = h->root.u.def.section->alignment_power;
   5126 		  if (normal_align > symbol_align)
   5127 		    normal_align = symbol_align;
   5128 		}
   5129 	      else
   5130 		normal_align = symbol_align;
   5131 
   5132 	      if (old_alignment)
   5133 		{
   5134 		  common_align = old_alignment;
   5135 		  common_bfd = old_bfd;
   5136 		  normal_bfd = abfd;
   5137 		}
   5138 	      else
   5139 		{
   5140 		  common_align = bfd_log2 (isym->st_value);
   5141 		  common_bfd = abfd;
   5142 		  normal_bfd = old_bfd;
   5143 		}
   5144 
   5145 	      if (normal_align < common_align)
   5146 		{
   5147 		  /* PR binutils/2735 */
   5148 		  if (normal_bfd == NULL)
   5149 		    _bfd_error_handler
   5150 		      /* xgettext:c-format */
   5151 		      (_("warning: alignment %u of common symbol `%s' in %pB"
   5152 			 " is greater than the alignment (%u) of its section %pA"),
   5153 		       1 << common_align, name, common_bfd,
   5154 		       1 << normal_align, h->root.u.def.section);
   5155 		  else
   5156 		    _bfd_error_handler
   5157 		      /* xgettext:c-format */
   5158 		      (_("warning: alignment %u of symbol `%s' in %pB"
   5159 			 " is smaller than %u in %pB"),
   5160 		       1 << normal_align, name, normal_bfd,
   5161 		       1 << common_align, common_bfd);
   5162 		}
   5163 	    }
   5164 
   5165 	  /* Remember the symbol size if it isn't undefined.  */
   5166 	  if ((isym->st_size != 0 && isym->st_shndx != SHN_UNDEF)
   5167 	      && (definition || h->size == 0))
   5168 	    {
   5169 	      if (h->size != 0
   5170 		  && h->size != isym->st_size
   5171 		  && ! size_change_ok)
   5172 		_bfd_error_handler
   5173 		  /* xgettext:c-format */
   5174 		  (_("warning: size of symbol `%s' changed"
   5175 		     " from %" PRIu64 " in %pB to %" PRIu64 " in %pB"),
   5176 		   name, (uint64_t) h->size, old_bfd,
   5177 		   (uint64_t) isym->st_size, abfd);
   5178 
   5179 	      h->size = isym->st_size;
   5180 	    }
   5181 
   5182 	  /* If this is a common symbol, then we always want H->SIZE
   5183 	     to be the size of the common symbol.  The code just above
   5184 	     won't fix the size if a common symbol becomes larger.  We
   5185 	     don't warn about a size change here, because that is
   5186 	     covered by --warn-common.  Allow changed between different
   5187 	     function types.  */
   5188 	  if (h->root.type == bfd_link_hash_common)
   5189 	    h->size = h->root.u.c.size;
   5190 
   5191 	  if (ELF_ST_TYPE (isym->st_info) != STT_NOTYPE
   5192 	      && (definition || h->type == STT_NOTYPE))
   5193 	    {
   5194 	      unsigned int type = ELF_ST_TYPE (isym->st_info);
   5195 
   5196 	      if (h->type != type)
   5197 		{
   5198 		  if (h->type != STT_NOTYPE && ! type_change_ok)
   5199 		    _bfd_error_handler
   5200 		      /* xgettext:c-format */
   5201 		      (_("warning: type of symbol `%s' changed"
   5202 			 " from %d to %d in %pB"),
   5203 		       name, h->type, type, abfd);
   5204 
   5205 		  h->type = type;
   5206 		}
   5207 	    }
   5208 
   5209 	  /* Set a flag in the hash table entry indicating the type of
   5210 	     reference or definition we just found.  Keep a count of
   5211 	     the number of dynamic symbols we find.  A dynamic symbol
   5212 	     is one which is referenced or defined by both a regular
   5213 	     object and a shared object.  */
   5214 	  if (! dynamic)
   5215 	    {
   5216 	      if (! definition)
   5217 		{
   5218 		  h->ref_regular = 1;
   5219 		  if (bind != STB_WEAK)
   5220 		    h->ref_regular_nonweak = 1;
   5221 		}
   5222 	      else
   5223 		{
   5224 		  BFD_ASSERT (!h->def_dynamic);
   5225 		  h->def_regular = 1;
   5226 		}
   5227 	    }
   5228 	  else
   5229 	    {
   5230 	      BFD_ASSERT (definition);
   5231 	      h->def_dynamic = 1;
   5232 	      h->dynindx = -2;
   5233 	      ((struct elf64_ia64_link_hash_entry *)h)->shl = abfd;
   5234 	    }
   5235 	}
   5236     }
   5237 
   5238   free (isymbuf);
   5239   isymbuf = NULL;
   5240 
   5241   /* If this object is the same format as the output object, and it is
   5242      not a shared library, then let the backend look through the
   5243      relocs.
   5244 
   5245      This is required to build global offset table entries and to
   5246      arrange for dynamic relocs.  It is not required for the
   5247      particular common case of linking non PIC code, even when linking
   5248      against shared libraries, but unfortunately there is no way of
   5249      knowing whether an object file has been compiled PIC or not.
   5250      Looking through the relocs is not particularly time consuming.
   5251      The problem is that we must either (1) keep the relocs in memory,
   5252      which causes the linker to require additional runtime memory or
   5253      (2) read the relocs twice from the input file, which wastes time.
   5254      This would be a good case for using mmap.
   5255 
   5256      I have no idea how to handle linking PIC code into a file of a
   5257      different format.  It probably can't be done.  */
   5258   if (! dynamic
   5259       && is_elf_hash_table (&htab->root)
   5260       && bed->check_relocs != NULL
   5261       && (*bed->relocs_compatible) (abfd->xvec, info->output_bfd->xvec))
   5262     {
   5263       asection *o;
   5264 
   5265       for (o = abfd->sections; o != NULL; o = o->next)
   5266 	{
   5267 	  Elf_Internal_Rela *internal_relocs;
   5268 	  bool ok;
   5269 
   5270 	  if ((o->flags & SEC_RELOC) == 0
   5271 	      || o->reloc_count == 0
   5272 	      || ((info->strip == strip_all || info->strip == strip_debugger)
   5273 		  && (o->flags & SEC_DEBUGGING) != 0)
   5274 	      || bfd_is_abs_section (o->output_section))
   5275 	    continue;
   5276 
   5277 	  internal_relocs = _bfd_elf_link_read_relocs (abfd, o, NULL, NULL,
   5278 						       info->keep_memory);
   5279 	  if (internal_relocs == NULL)
   5280 	    goto error_return;
   5281 
   5282 	  ok = (*bed->check_relocs) (abfd, info, o, internal_relocs);
   5283 
   5284 	  if (elf_section_data (o)->relocs != internal_relocs)
   5285 	    free (internal_relocs);
   5286 
   5287 	  if (! ok)
   5288 	    goto error_return;
   5289 	}
   5290     }
   5291 
   5292   return true;
   5293 
   5294  error_free_vers:
   5295  error_free_sym:
   5296   free (isymbuf);
   5297  error_return:
   5298   return false;
   5299 }
   5300 
   5301 static bool
   5302 elf64_vms_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
   5303 {
   5304   int pass;
   5305   struct bfd_link_hash_entry **pundef;
   5306   struct bfd_link_hash_entry **next_pundef;
   5307 
   5308   /* We only accept VMS libraries.  */
   5309   if (info->output_bfd->xvec != abfd->xvec)
   5310     {
   5311       bfd_set_error (bfd_error_wrong_format);
   5312       return false;
   5313     }
   5314 
   5315   /* The archive_pass field in the archive itself is used to
   5316      initialize PASS, since we may search the same archive multiple
   5317      times.  */
   5318   pass = ++abfd->archive_pass;
   5319 
   5320   /* Look through the list of undefined symbols.  */
   5321   for (pundef = &info->hash->undefs; *pundef != NULL; pundef = next_pundef)
   5322     {
   5323       struct bfd_link_hash_entry *h;
   5324       symindex symidx;
   5325       bfd *element;
   5326       bfd *orig_element;
   5327 
   5328       h = *pundef;
   5329       next_pundef = &(*pundef)->u.undef.next;
   5330 
   5331       /* When a symbol is defined, it is not necessarily removed from
   5332 	 the list.  */
   5333       if (h->type != bfd_link_hash_undefined
   5334 	  && h->type != bfd_link_hash_common)
   5335 	{
   5336 	  /* Remove this entry from the list, for general cleanliness
   5337 	     and because we are going to look through the list again
   5338 	     if we search any more libraries.  We can't remove the
   5339 	     entry if it is the tail, because that would lose any
   5340 	     entries we add to the list later on.  */
   5341 	  if (*pundef != info->hash->undefs_tail)
   5342 	    {
   5343 	      *pundef = *next_pundef;
   5344 	      next_pundef = pundef;
   5345 	    }
   5346 	  continue;
   5347 	}
   5348 
   5349       /* Look for this symbol in the archive hash table.  */
   5350       symidx = _bfd_vms_lib_find_symbol (abfd, h->root.string);
   5351       if (symidx == BFD_NO_MORE_SYMBOLS)
   5352 	{
   5353 	  /* Nothing in this slot.  */
   5354 	  continue;
   5355 	}
   5356 
   5357       element = bfd_get_elt_at_index (abfd, symidx);
   5358       if (element == NULL)
   5359 	return false;
   5360 
   5361       if (element->archive_pass == -1 || element->archive_pass == pass)
   5362 	{
   5363 	  /* Next symbol if this archive is wrong or already handled.  */
   5364 	  continue;
   5365 	}
   5366 
   5367       orig_element = element;
   5368       if (bfd_is_thin_archive (abfd))
   5369 	{
   5370 	  element = _bfd_vms_lib_get_imagelib_file (element);
   5371 	  if (element == NULL || !bfd_check_format (element, bfd_object))
   5372 	    {
   5373 	      orig_element->archive_pass = -1;
   5374 	      return false;
   5375 	    }
   5376 	}
   5377       else if (! bfd_check_format (element, bfd_object))
   5378 	{
   5379 	  element->archive_pass = -1;
   5380 	  return false;
   5381 	}
   5382 
   5383       /* Unlike the generic linker, we know that this element provides
   5384 	 a definition for an undefined symbol and we know that we want
   5385 	 to include it.  We don't need to check anything.  */
   5386       if (! (*info->callbacks->add_archive_element) (info, element,
   5387 						     h->root.string, &element))
   5388 	continue;
   5389       if (! elf64_vms_link_add_object_symbols (element, info))
   5390 	return false;
   5391 
   5392       orig_element->archive_pass = pass;
   5393     }
   5394 
   5395   return true;
   5396 }
   5397 
   5398 static bool
   5399 elf64_vms_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
   5400 {
   5401   switch (bfd_get_format (abfd))
   5402     {
   5403     case bfd_object:
   5404       return elf64_vms_link_add_object_symbols (abfd, info);
   5405       break;
   5406     case bfd_archive:
   5407       return elf64_vms_link_add_archive_symbols (abfd, info);
   5408       break;
   5409     default:
   5410       bfd_set_error (bfd_error_wrong_format);
   5411       return false;
   5412     }
   5413 }
   5414 
   5415 static bool
   5416 elf64_ia64_vms_mkobject (bfd *abfd)
   5417 {
   5418   return bfd_elf_allocate_object (abfd,
   5419 				  sizeof (struct elf64_ia64_vms_obj_tdata));
   5420 }
   5421 
   5422 
   5423 /* Size-dependent data and functions.  */
   5424 static const struct elf_size_info elf64_ia64_vms_size_info = {
   5425   sizeof (Elf64_External_VMS_Ehdr),
   5426   sizeof (Elf64_External_Phdr),
   5427   sizeof (Elf64_External_Shdr),
   5428   sizeof (Elf64_External_Rel),
   5429   sizeof (Elf64_External_Rela),
   5430   sizeof (Elf64_External_Sym),
   5431   sizeof (Elf64_External_Dyn),
   5432   sizeof (Elf_External_Note),
   5433   4,
   5434   1,
   5435   64, 3, /* ARCH_SIZE, LOG_FILE_ALIGN */
   5436   ELFCLASS64, EV_CURRENT,
   5437   bfd_elf64_write_out_phdrs,
   5438   elf64_vms_write_shdrs_and_ehdr,
   5439   bfd_elf64_checksum_contents,
   5440   bfd_elf64_write_relocs,
   5441   bfd_elf64_swap_symbol_in,
   5442   bfd_elf64_swap_symbol_out,
   5443   bfd_elf64_slurp_reloc_table,
   5444   bfd_elf64_slurp_symbol_table,
   5445   bfd_elf64_swap_dyn_in,
   5446   bfd_elf64_swap_dyn_out,
   5447   bfd_elf64_swap_reloc_in,
   5448   bfd_elf64_swap_reloc_out,
   5449   bfd_elf64_swap_reloca_in,
   5450   bfd_elf64_swap_reloca_out
   5451 };
   5452 
   5453 #define ELF_ARCH			bfd_arch_ia64
   5454 #define ELF_TARGET_ID			IA64_ELF_DATA
   5455 #define ELF_MACHINE_CODE		EM_IA_64
   5456 #define ELF_MAXPAGESIZE			0x10000	/* 64KB */
   5457 #define ELF_COMMONPAGESIZE		0x200	/* 16KB */
   5458 
   5459 #define elf_backend_section_from_shdr \
   5460 	elf64_ia64_section_from_shdr
   5461 #define elf_backend_section_flags \
   5462 	elf64_ia64_section_flags
   5463 #define elf_backend_fake_sections \
   5464 	elf64_ia64_fake_sections
   5465 #define elf_backend_final_write_processing \
   5466 	elf64_ia64_final_write_processing
   5467 #define elf_backend_add_symbol_hook \
   5468 	elf64_ia64_add_symbol_hook
   5469 #define elf_info_to_howto \
   5470 	elf64_ia64_info_to_howto
   5471 
   5472 #define bfd_elf64_bfd_reloc_type_lookup \
   5473 	ia64_elf_reloc_type_lookup
   5474 #define bfd_elf64_bfd_reloc_name_lookup \
   5475 	ia64_elf_reloc_name_lookup
   5476 #define bfd_elf64_bfd_is_local_label_name \
   5477 	elf64_ia64_is_local_label_name
   5478 #define bfd_elf64_bfd_relax_section \
   5479 	elf64_ia64_relax_section
   5480 
   5481 #define elf_backend_object_p \
   5482 	elf64_ia64_object_p
   5483 
   5484 /* Stuff for the BFD linker: */
   5485 #define bfd_elf64_bfd_link_hash_table_create \
   5486 	elf64_ia64_hash_table_create
   5487 #define elf_backend_create_dynamic_sections \
   5488 	elf64_ia64_create_dynamic_sections
   5489 #define elf_backend_check_relocs \
   5490 	elf64_ia64_check_relocs
   5491 #define elf_backend_adjust_dynamic_symbol \
   5492 	elf64_ia64_adjust_dynamic_symbol
   5493 #define elf_backend_late_size_sections \
   5494 	elf64_ia64_late_size_sections
   5495 #define elf_backend_omit_section_dynsym \
   5496 	_bfd_elf_omit_section_dynsym_all
   5497 #define elf_backend_relocate_section \
   5498 	elf64_ia64_relocate_section
   5499 #define elf_backend_finish_dynamic_symbol \
   5500 	elf64_ia64_finish_dynamic_symbol
   5501 #define elf_backend_finish_dynamic_sections \
   5502 	elf64_ia64_finish_dynamic_sections
   5503 #define bfd_elf64_bfd_final_link \
   5504 	elf64_ia64_final_link
   5505 
   5506 #define bfd_elf64_bfd_merge_private_bfd_data \
   5507 	elf64_ia64_merge_private_bfd_data
   5508 #define bfd_elf64_bfd_set_private_flags \
   5509 	elf64_ia64_set_private_flags
   5510 #define bfd_elf64_bfd_print_private_bfd_data \
   5511 	elf64_ia64_print_private_bfd_data
   5512 
   5513 #define elf_backend_plt_readonly	1
   5514 #define elf_backend_want_plt_sym	0
   5515 #define elf_backend_plt_alignment	5
   5516 #define elf_backend_got_header_size	0
   5517 #define elf_backend_want_got_plt	1
   5518 #define elf_backend_may_use_rel_p	1
   5519 #define elf_backend_may_use_rela_p	1
   5520 #define elf_backend_default_use_rela_p	1
   5521 #define elf_backend_want_dynbss		0
   5522 #define elf_backend_hide_symbol		elf64_ia64_hash_hide_symbol
   5523 #define elf_backend_fixup_symbol	_bfd_elf_link_hash_fixup_symbol
   5524 #define elf_backend_reloc_type_class	elf64_ia64_reloc_type_class
   5525 #define elf_backend_rela_normal		1
   5526 #define elf_backend_special_sections	elf64_ia64_special_sections
   5527 #define elf_backend_default_execstack	0
   5528 
   5529 /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
   5530    SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
   5531    We don't want to flood users with so many error messages. We turn
   5532    off the warning for now. It will be turned on later when the Intel
   5533    compiler is fixed.   */
   5534 #define elf_backend_link_order_error_handler NULL
   5535 
   5536 /* VMS-specific vectors.  */
   5537 
   5538 #undef  TARGET_LITTLE_SYM
   5539 #define TARGET_LITTLE_SYM		ia64_elf64_vms_vec
   5540 #undef  TARGET_LITTLE_NAME
   5541 #define TARGET_LITTLE_NAME		"elf64-ia64-vms"
   5542 #undef  TARGET_BIG_SYM
   5543 #undef  TARGET_BIG_NAME
   5544 
   5545 /* These are VMS specific functions.  */
   5546 
   5547 #undef  elf_backend_object_p
   5548 #define elf_backend_object_p elf64_vms_object_p
   5549 
   5550 #undef  elf_backend_section_from_shdr
   5551 #define elf_backend_section_from_shdr elf64_vms_section_from_shdr
   5552 
   5553 #undef  elf_backend_init_file_header
   5554 #define elf_backend_init_file_header elf64_vms_init_file_header
   5555 
   5556 #undef  elf_backend_section_processing
   5557 #define elf_backend_section_processing elf64_vms_section_processing
   5558 
   5559 #undef  elf_backend_final_write_processing
   5560 #define elf_backend_final_write_processing elf64_vms_final_write_processing
   5561 
   5562 #undef  bfd_elf64_close_and_cleanup
   5563 #define bfd_elf64_close_and_cleanup elf64_vms_close_and_cleanup
   5564 
   5565 #undef  elf_backend_section_from_bfd_section
   5566 
   5567 #undef  elf_backend_symbol_processing
   5568 
   5569 #undef  elf_backend_want_p_paddr_set_to_zero
   5570 
   5571 #undef  ELF_OSABI
   5572 #define ELF_OSABI			ELFOSABI_OPENVMS
   5573 
   5574 #undef  ELF_MAXPAGESIZE
   5575 #define ELF_MAXPAGESIZE			0x10000	/* 64KB */
   5576 
   5577 #undef  elf64_bed
   5578 #define elf64_bed elf64_ia64_vms_bed
   5579 
   5580 #define elf_backend_size_info elf64_ia64_vms_size_info
   5581 
   5582 /* Use VMS-style archives (in particular, don't use the standard coff
   5583    archive format).  */
   5584 #define bfd_elf64_archive_functions
   5585 
   5586 #undef bfd_elf64_archive_p
   5587 #define bfd_elf64_archive_p _bfd_vms_lib_ia64_archive_p
   5588 #undef bfd_elf64_write_archive_contents
   5589 #define bfd_elf64_write_archive_contents _bfd_vms_lib_write_archive_contents
   5590 #undef bfd_elf64_mkarchive
   5591 #define bfd_elf64_mkarchive _bfd_vms_lib_ia64_mkarchive
   5592 
   5593 #define bfd_elf64_archive_slurp_armap \
   5594   _bfd_vms_lib_slurp_armap
   5595 #define bfd_elf64_archive_slurp_extended_name_table \
   5596   _bfd_vms_lib_slurp_extended_name_table
   5597 #define bfd_elf64_archive_construct_extended_name_table \
   5598   _bfd_vms_lib_construct_extended_name_table
   5599 #define bfd_elf64_archive_truncate_arname \
   5600   _bfd_vms_lib_truncate_arname
   5601 #define bfd_elf64_archive_write_armap \
   5602   _bfd_vms_lib_write_armap
   5603 #define bfd_elf64_archive_read_ar_hdr \
   5604   _bfd_vms_lib_read_ar_hdr
   5605 #define bfd_elf64_archive_write_ar_hdr \
   5606   _bfd_vms_lib_write_ar_hdr
   5607 #define bfd_elf64_archive_openr_next_archived_file \
   5608   _bfd_vms_lib_openr_next_archived_file
   5609 #define bfd_elf64_archive_get_elt_at_index \
   5610   _bfd_vms_lib_get_elt_at_index
   5611 #define bfd_elf64_archive_generic_stat_arch_elt \
   5612   _bfd_vms_lib_generic_stat_arch_elt
   5613 #define bfd_elf64_archive_update_armap_timestamp \
   5614   _bfd_vms_lib_update_armap_timestamp
   5615 
   5616 /* VMS link methods.  */
   5617 #undef  bfd_elf64_bfd_link_add_symbols
   5618 #define bfd_elf64_bfd_link_add_symbols	elf64_vms_bfd_link_add_symbols
   5619 
   5620 #undef  elf_backend_want_got_sym
   5621 #define elf_backend_want_got_sym	0
   5622 
   5623 #undef  bfd_elf64_mkobject
   5624 #define bfd_elf64_mkobject		elf64_ia64_vms_mkobject
   5625 
   5626 /* Redefine to align segments on block size.  */
   5627 #undef  ELF_MAXPAGESIZE
   5628 #define ELF_MAXPAGESIZE			0x200 /* 512B  */
   5629 
   5630 #undef  elf_backend_want_got_plt
   5631 #define elf_backend_want_got_plt	0
   5632 
   5633 #include "elf64-target.h"
   5634