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