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