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