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