Home | History | Annotate | Line # | Download | only in bfd
elfnn-ia64.c revision 1.1.1.8.2.1
      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_late_size_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   if (dynobj == NULL)
   3009     return true;
   3010   ia64_info->self_dtpmod_offset = (bfd_vma) -1;
   3011   data.info = info;
   3012 
   3013   /* Set the contents of the .interp section to the interpreter.  */
   3014   if (ia64_info->root.dynamic_sections_created
   3015       && bfd_link_executable (info) && !info->nointerp)
   3016     {
   3017       sec = bfd_get_linker_section (dynobj, ".interp");
   3018       BFD_ASSERT (sec != NULL);
   3019       sec->contents = (bfd_byte *) ELF_DYNAMIC_INTERPRETER;
   3020       sec->size = strlen (ELF_DYNAMIC_INTERPRETER) + 1;
   3021     }
   3022 
   3023   /* Allocate the GOT entries.  */
   3024 
   3025   if (ia64_info->root.sgot)
   3026     {
   3027       data.ofs = 0;
   3028       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_data_got, &data);
   3029       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_global_fptr_got, &data);
   3030       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_local_got, &data);
   3031       ia64_info->root.sgot->size = data.ofs;
   3032     }
   3033 
   3034   /* Allocate the FPTR entries.  */
   3035 
   3036   if (ia64_info->fptr_sec)
   3037     {
   3038       data.ofs = 0;
   3039       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_fptr, &data);
   3040       ia64_info->fptr_sec->size = data.ofs;
   3041     }
   3042 
   3043   /* Now that we've seen all of the input files, we can decide which
   3044      symbols need plt entries.  Allocate the minimal PLT entries first.
   3045      We do this even though dynamic_sections_created may be FALSE, because
   3046      this has the side-effect of clearing want_plt and want_plt2.  */
   3047 
   3048   data.ofs = 0;
   3049   elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt_entries, &data);
   3050 
   3051   ia64_info->minplt_entries = 0;
   3052   if (data.ofs)
   3053     {
   3054       ia64_info->minplt_entries
   3055 	= (data.ofs - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
   3056     }
   3057 
   3058   /* Align the pointer for the plt2 entries.  */
   3059   data.ofs = (data.ofs + 31) & (bfd_vma) -32;
   3060 
   3061   elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_plt2_entries, &data);
   3062   if (data.ofs != 0 || ia64_info->root.dynamic_sections_created)
   3063     {
   3064       /* FIXME: we always reserve the memory for dynamic linker even if
   3065 	 there are no PLT entries since dynamic linker may assume the
   3066 	 reserved memory always exists.  */
   3067 
   3068       BFD_ASSERT (ia64_info->root.dynamic_sections_created);
   3069 
   3070       ia64_info->root.splt->size = data.ofs;
   3071 
   3072       /* If we've got a .plt, we need some extra memory for the dynamic
   3073 	 linker.  We stuff these in .got.plt.  */
   3074       ia64_info->root.sgotplt->size = 8 * PLT_RESERVED_WORDS;
   3075     }
   3076 
   3077   /* Allocate the PLTOFF entries.  */
   3078 
   3079   if (ia64_info->pltoff_sec)
   3080     {
   3081       data.ofs = 0;
   3082       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_pltoff_entries, &data);
   3083       ia64_info->pltoff_sec->size = data.ofs;
   3084     }
   3085 
   3086   if (ia64_info->root.dynamic_sections_created)
   3087     {
   3088       /* Allocate space for the dynamic relocations that turned out to be
   3089 	 required.  */
   3090 
   3091       if (bfd_link_pic (info) && ia64_info->self_dtpmod_offset != (bfd_vma) -1)
   3092 	ia64_info->root.srelgot->size += sizeof (ElfNN_External_Rela);
   3093       data.only_got = false;
   3094       elfNN_ia64_dyn_sym_traverse (ia64_info, allocate_dynrel_entries, &data);
   3095     }
   3096 
   3097   /* We have now determined the sizes of the various dynamic sections.
   3098      Allocate memory for them.  */
   3099   for (sec = dynobj->sections; sec != NULL; sec = sec->next)
   3100     {
   3101       bool strip;
   3102 
   3103       if (!(sec->flags & SEC_LINKER_CREATED))
   3104 	continue;
   3105 
   3106       /* If we don't need this section, strip it from the output file.
   3107 	 There were several sections primarily related to dynamic
   3108 	 linking that must be create before the linker maps input
   3109 	 sections to output sections.  The linker does that before
   3110 	 bfd_elf_size_dynamic_sections is called, and it is that
   3111 	 function which decides whether anything needs to go into
   3112 	 these sections.  */
   3113 
   3114       strip = (sec->size == 0);
   3115 
   3116       if (sec == ia64_info->root.sgot)
   3117 	strip = false;
   3118       else if (sec == ia64_info->root.srelgot)
   3119 	{
   3120 	  if (strip)
   3121 	    ia64_info->root.srelgot = NULL;
   3122 	  else
   3123 	    /* We use the reloc_count field as a counter if we need to
   3124 	       copy relocs into the output file.  */
   3125 	    sec->reloc_count = 0;
   3126 	}
   3127       else if (sec == ia64_info->fptr_sec)
   3128 	{
   3129 	  if (strip)
   3130 	    ia64_info->fptr_sec = NULL;
   3131 	}
   3132       else if (sec == ia64_info->rel_fptr_sec)
   3133 	{
   3134 	  if (strip)
   3135 	    ia64_info->rel_fptr_sec = NULL;
   3136 	  else
   3137 	    /* We use the reloc_count field as a counter if we need to
   3138 	       copy relocs into the output file.  */
   3139 	    sec->reloc_count = 0;
   3140 	}
   3141       else if (sec == ia64_info->root.splt)
   3142 	{
   3143 	  if (strip)
   3144 	    ia64_info->root.splt = NULL;
   3145 	}
   3146       else if (sec == ia64_info->pltoff_sec)
   3147 	{
   3148 	  if (strip)
   3149 	    ia64_info->pltoff_sec = NULL;
   3150 	}
   3151       else if (sec == ia64_info->rel_pltoff_sec)
   3152 	{
   3153 	  if (strip)
   3154 	    ia64_info->rel_pltoff_sec = NULL;
   3155 	  else
   3156 	    {
   3157 	      ia64_info->root.dt_jmprel_required = true;
   3158 	      /* We use the reloc_count field as a counter if we need to
   3159 		 copy relocs into the output file.  */
   3160 	      sec->reloc_count = 0;
   3161 	    }
   3162 	}
   3163       else
   3164 	{
   3165 	  const char *name;
   3166 
   3167 	  /* It's OK to base decisions on the section name, because none
   3168 	     of the dynobj section names depend upon the input files.  */
   3169 	  name = bfd_section_name (sec);
   3170 
   3171 	  if (strcmp (name, ".got.plt") == 0)
   3172 	    strip = false;
   3173 	  else if (startswith (name, ".rel"))
   3174 	    {
   3175 	      if (!strip)
   3176 		{
   3177 		  /* We use the reloc_count field as a counter if we need to
   3178 		     copy relocs into the output file.  */
   3179 		  sec->reloc_count = 0;
   3180 		}
   3181 	    }
   3182 	  else
   3183 	    continue;
   3184 	}
   3185 
   3186       if (strip)
   3187 	sec->flags |= SEC_EXCLUDE;
   3188       else
   3189 	{
   3190 	  /* Allocate memory for the section contents.  */
   3191 	  sec->contents = (bfd_byte *) bfd_zalloc (dynobj, sec->size);
   3192 	  if (sec->contents == NULL && sec->size != 0)
   3193 	    return false;
   3194 	}
   3195     }
   3196 
   3197   if (ia64_info->root.dynamic_sections_created)
   3198     {
   3199       /* Add some entries to the .dynamic section.  We fill in the values
   3200 	 later (in finish_dynamic_sections) but we must add the entries now
   3201 	 so that we get the correct size for the .dynamic section.  */
   3202 
   3203 #define add_dynamic_entry(TAG, VAL) \
   3204   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
   3205 
   3206       if (!_bfd_elf_add_dynamic_tags (output_bfd, info, true))
   3207 	return false;
   3208 
   3209       if (!add_dynamic_entry (DT_IA_64_PLT_RESERVE, 0))
   3210 	return false;
   3211     }
   3212 
   3213   /* ??? Perhaps force __gp local.  */
   3214 
   3215   return true;
   3216 }
   3217 
   3218 static void
   3219 elfNN_ia64_install_dyn_reloc (bfd *abfd, struct bfd_link_info *info,
   3220 			      asection *sec, asection *srel,
   3221 			      bfd_vma offset, unsigned int type,
   3222 			      long dynindx, bfd_vma addend)
   3223 {
   3224   Elf_Internal_Rela outrel;
   3225   bfd_byte *loc;
   3226 
   3227   BFD_ASSERT (dynindx != -1);
   3228   outrel.r_info = ELFNN_R_INFO (dynindx, type);
   3229   outrel.r_addend = addend;
   3230   outrel.r_offset = _bfd_elf_section_offset (abfd, info, sec, offset);
   3231   if (outrel.r_offset >= (bfd_vma) -2)
   3232     {
   3233       /* Run for the hills.  We shouldn't be outputting a relocation
   3234 	 for this.  So do what everyone else does and output a no-op.  */
   3235       outrel.r_info = ELFNN_R_INFO (0, R_IA64_NONE);
   3236       outrel.r_addend = 0;
   3237       outrel.r_offset = 0;
   3238     }
   3239   else
   3240     outrel.r_offset += sec->output_section->vma + sec->output_offset;
   3241 
   3242   loc = srel->contents;
   3243   loc += srel->reloc_count++ * sizeof (ElfNN_External_Rela);
   3244   bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
   3245   BFD_ASSERT (sizeof (ElfNN_External_Rela) * srel->reloc_count <= srel->size);
   3246 }
   3247 
   3248 /* Store an entry for target address TARGET_ADDR in the linkage table
   3249    and return the gp-relative address of the linkage table entry.  */
   3250 
   3251 static bfd_vma
   3252 set_got_entry (bfd *abfd, struct bfd_link_info *info,
   3253 	       struct elfNN_ia64_dyn_sym_info *dyn_i,
   3254 	       long dynindx, bfd_vma addend, bfd_vma value,
   3255 	       unsigned int dyn_r_type)
   3256 {
   3257   struct elfNN_ia64_link_hash_table *ia64_info;
   3258   asection *got_sec;
   3259   bool done;
   3260   bfd_vma got_offset;
   3261 
   3262   ia64_info = elfNN_ia64_hash_table (info);
   3263   if (ia64_info == NULL)
   3264     return 0;
   3265 
   3266   got_sec = ia64_info->root.sgot;
   3267 
   3268   switch (dyn_r_type)
   3269     {
   3270     case R_IA64_TPREL64LSB:
   3271       done = dyn_i->tprel_done;
   3272       dyn_i->tprel_done = true;
   3273       got_offset = dyn_i->tprel_offset;
   3274       break;
   3275     case R_IA64_DTPMOD64LSB:
   3276       if (dyn_i->dtpmod_offset != ia64_info->self_dtpmod_offset)
   3277 	{
   3278 	  done = dyn_i->dtpmod_done;
   3279 	  dyn_i->dtpmod_done = true;
   3280 	}
   3281       else
   3282 	{
   3283 	  done = ia64_info->self_dtpmod_done;
   3284 	  ia64_info->self_dtpmod_done = true;
   3285 	  dynindx = 0;
   3286 	}
   3287       got_offset = dyn_i->dtpmod_offset;
   3288       break;
   3289     case R_IA64_DTPREL32LSB:
   3290     case R_IA64_DTPREL64LSB:
   3291       done = dyn_i->dtprel_done;
   3292       dyn_i->dtprel_done = true;
   3293       got_offset = dyn_i->dtprel_offset;
   3294       break;
   3295     default:
   3296       done = dyn_i->got_done;
   3297       dyn_i->got_done = true;
   3298       got_offset = dyn_i->got_offset;
   3299       break;
   3300     }
   3301 
   3302   BFD_ASSERT ((got_offset & 7) == 0);
   3303 
   3304   if (! done)
   3305     {
   3306       /* Store the target address in the linkage table entry.  */
   3307       bfd_put_64 (abfd, value, got_sec->contents + got_offset);
   3308 
   3309       /* Install a dynamic relocation if needed.  */
   3310       if (((bfd_link_pic (info)
   3311 	    && (!dyn_i->h
   3312 		|| ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
   3313 		|| dyn_i->h->root.type != bfd_link_hash_undefweak)
   3314 	    && dyn_r_type != R_IA64_DTPREL32LSB
   3315 	    && dyn_r_type != R_IA64_DTPREL64LSB)
   3316 	   || elfNN_ia64_dynamic_symbol_p (dyn_i->h, info, dyn_r_type)
   3317 	   || (dynindx != -1
   3318 	       && (dyn_r_type == R_IA64_FPTR32LSB
   3319 		   || dyn_r_type == R_IA64_FPTR64LSB)))
   3320 	  && (!dyn_i->want_ltoff_fptr
   3321 	      || !bfd_link_pie (info)
   3322 	      || !dyn_i->h
   3323 	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
   3324 	{
   3325 	  if (dynindx == -1
   3326 	      && dyn_r_type != R_IA64_TPREL64LSB
   3327 	      && dyn_r_type != R_IA64_DTPMOD64LSB
   3328 	      && dyn_r_type != R_IA64_DTPREL32LSB
   3329 	      && dyn_r_type != R_IA64_DTPREL64LSB)
   3330 	    {
   3331 	      dyn_r_type = R_IA64_RELNNLSB;
   3332 	      dynindx = 0;
   3333 	      addend = value;
   3334 	    }
   3335 
   3336 	  if (bfd_big_endian (abfd))
   3337 	    {
   3338 	      switch (dyn_r_type)
   3339 		{
   3340 		case R_IA64_REL32LSB:
   3341 		  dyn_r_type = R_IA64_REL32MSB;
   3342 		  break;
   3343 		case R_IA64_DIR32LSB:
   3344 		  dyn_r_type = R_IA64_DIR32MSB;
   3345 		  break;
   3346 		case R_IA64_FPTR32LSB:
   3347 		  dyn_r_type = R_IA64_FPTR32MSB;
   3348 		  break;
   3349 		case R_IA64_DTPREL32LSB:
   3350 		  dyn_r_type = R_IA64_DTPREL32MSB;
   3351 		  break;
   3352 		case R_IA64_REL64LSB:
   3353 		  dyn_r_type = R_IA64_REL64MSB;
   3354 		  break;
   3355 		case R_IA64_DIR64LSB:
   3356 		  dyn_r_type = R_IA64_DIR64MSB;
   3357 		  break;
   3358 		case R_IA64_FPTR64LSB:
   3359 		  dyn_r_type = R_IA64_FPTR64MSB;
   3360 		  break;
   3361 		case R_IA64_TPREL64LSB:
   3362 		  dyn_r_type = R_IA64_TPREL64MSB;
   3363 		  break;
   3364 		case R_IA64_DTPMOD64LSB:
   3365 		  dyn_r_type = R_IA64_DTPMOD64MSB;
   3366 		  break;
   3367 		case R_IA64_DTPREL64LSB:
   3368 		  dyn_r_type = R_IA64_DTPREL64MSB;
   3369 		  break;
   3370 		default:
   3371 		  BFD_ASSERT (false);
   3372 		  break;
   3373 		}
   3374 	    }
   3375 
   3376 	  elfNN_ia64_install_dyn_reloc (abfd, NULL, got_sec,
   3377 					ia64_info->root.srelgot,
   3378 					got_offset, dyn_r_type,
   3379 					dynindx, addend);
   3380 	}
   3381     }
   3382 
   3383   /* Return the address of the linkage table entry.  */
   3384   value = (got_sec->output_section->vma
   3385 	   + got_sec->output_offset
   3386 	   + got_offset);
   3387 
   3388   return value;
   3389 }
   3390 
   3391 /* Fill in a function descriptor consisting of the function's code
   3392    address and its global pointer.  Return the descriptor's address.  */
   3393 
   3394 static bfd_vma
   3395 set_fptr_entry (bfd *abfd, struct bfd_link_info *info,
   3396 		struct elfNN_ia64_dyn_sym_info *dyn_i,
   3397 		bfd_vma value)
   3398 {
   3399   struct elfNN_ia64_link_hash_table *ia64_info;
   3400   asection *fptr_sec;
   3401 
   3402   ia64_info = elfNN_ia64_hash_table (info);
   3403   if (ia64_info == NULL)
   3404     return 0;
   3405 
   3406   fptr_sec = ia64_info->fptr_sec;
   3407 
   3408   if (!dyn_i->fptr_done)
   3409     {
   3410       dyn_i->fptr_done = 1;
   3411 
   3412       /* Fill in the function descriptor.  */
   3413       bfd_put_64 (abfd, value, fptr_sec->contents + dyn_i->fptr_offset);
   3414       bfd_put_64 (abfd, _bfd_get_gp_value (abfd),
   3415 		  fptr_sec->contents + dyn_i->fptr_offset + 8);
   3416       if (ia64_info->rel_fptr_sec)
   3417 	{
   3418 	  Elf_Internal_Rela outrel;
   3419 	  bfd_byte *loc;
   3420 
   3421 	  if (bfd_little_endian (abfd))
   3422 	    outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTLSB);
   3423 	  else
   3424 	    outrel.r_info = ELFNN_R_INFO (0, R_IA64_IPLTMSB);
   3425 	  outrel.r_addend = value;
   3426 	  outrel.r_offset = (fptr_sec->output_section->vma
   3427 			     + fptr_sec->output_offset
   3428 			     + dyn_i->fptr_offset);
   3429 	  loc = ia64_info->rel_fptr_sec->contents;
   3430 	  loc += ia64_info->rel_fptr_sec->reloc_count++
   3431 		 * sizeof (ElfNN_External_Rela);
   3432 	  bfd_elfNN_swap_reloca_out (abfd, &outrel, loc);
   3433 	}
   3434     }
   3435 
   3436   /* Return the descriptor's address.  */
   3437   value = (fptr_sec->output_section->vma
   3438 	   + fptr_sec->output_offset
   3439 	   + dyn_i->fptr_offset);
   3440 
   3441   return value;
   3442 }
   3443 
   3444 /* Fill in a PLTOFF entry consisting of the function's code address
   3445    and its global pointer.  Return the descriptor's address.  */
   3446 
   3447 static bfd_vma
   3448 set_pltoff_entry (bfd *abfd, struct bfd_link_info *info,
   3449 		  struct elfNN_ia64_dyn_sym_info *dyn_i,
   3450 		  bfd_vma value, bool is_plt)
   3451 {
   3452   struct elfNN_ia64_link_hash_table *ia64_info;
   3453   asection *pltoff_sec;
   3454 
   3455   ia64_info = elfNN_ia64_hash_table (info);
   3456   if (ia64_info == NULL)
   3457     return 0;
   3458 
   3459   pltoff_sec = ia64_info->pltoff_sec;
   3460 
   3461   /* Don't do anything if this symbol uses a real PLT entry.  In
   3462      that case, we'll fill this in during finish_dynamic_symbol.  */
   3463   if ((! dyn_i->want_plt || is_plt)
   3464       && !dyn_i->pltoff_done)
   3465     {
   3466       bfd_vma gp = _bfd_get_gp_value (abfd);
   3467 
   3468       /* Fill in the function descriptor.  */
   3469       bfd_put_64 (abfd, value, pltoff_sec->contents + dyn_i->pltoff_offset);
   3470       bfd_put_64 (abfd, gp, pltoff_sec->contents + dyn_i->pltoff_offset + 8);
   3471 
   3472       /* Install dynamic relocations if needed.  */
   3473       if (!is_plt
   3474 	  && bfd_link_pic (info)
   3475 	  && (!dyn_i->h
   3476 	      || ELF_ST_VISIBILITY (dyn_i->h->other) == STV_DEFAULT
   3477 	      || dyn_i->h->root.type != bfd_link_hash_undefweak))
   3478 	{
   3479 	  unsigned int dyn_r_type;
   3480 
   3481 	  if (bfd_big_endian (abfd))
   3482 	    dyn_r_type = R_IA64_RELNNMSB;
   3483 	  else
   3484 	    dyn_r_type = R_IA64_RELNNLSB;
   3485 
   3486 	  elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
   3487 					ia64_info->rel_pltoff_sec,
   3488 					dyn_i->pltoff_offset,
   3489 					dyn_r_type, 0, value);
   3490 	  elfNN_ia64_install_dyn_reloc (abfd, NULL, pltoff_sec,
   3491 					ia64_info->rel_pltoff_sec,
   3492 					dyn_i->pltoff_offset + ARCH_SIZE / 8,
   3493 					dyn_r_type, 0, gp);
   3494 	}
   3495 
   3496       dyn_i->pltoff_done = 1;
   3497     }
   3498 
   3499   /* Return the descriptor's address.  */
   3500   value = (pltoff_sec->output_section->vma
   3501 	   + pltoff_sec->output_offset
   3502 	   + dyn_i->pltoff_offset);
   3503 
   3504   return value;
   3505 }
   3506 
   3507 /* Return the base VMA address which should be subtracted from real addresses
   3508    when resolving @tprel() relocation.
   3509    Main program TLS (whose template starts at PT_TLS p_vaddr)
   3510    is assigned offset round(2 * size of pointer, PT_TLS p_align).  */
   3511 
   3512 static bfd_vma
   3513 elfNN_ia64_tprel_base (struct bfd_link_info *info)
   3514 {
   3515   asection *tls_sec = elf_hash_table (info)->tls_sec;
   3516   return tls_sec->vma - align_power ((bfd_vma) ARCH_SIZE / 4,
   3517 				     tls_sec->alignment_power);
   3518 }
   3519 
   3520 /* Return the base VMA address which should be subtracted from real addresses
   3521    when resolving @dtprel() relocation.
   3522    This is PT_TLS segment p_vaddr.  */
   3523 
   3524 static bfd_vma
   3525 elfNN_ia64_dtprel_base (struct bfd_link_info *info)
   3526 {
   3527   return elf_hash_table (info)->tls_sec->vma;
   3528 }
   3529 
   3530 /* Called through qsort to sort the .IA_64.unwind section during a
   3531    non-relocatable link.  Set elfNN_ia64_unwind_entry_compare_bfd
   3532    to the output bfd so we can do proper endianness frobbing.  */
   3533 
   3534 static bfd *elfNN_ia64_unwind_entry_compare_bfd;
   3535 
   3536 static int
   3537 elfNN_ia64_unwind_entry_compare (const void * a, const void * b)
   3538 {
   3539   bfd_vma av, bv;
   3540 
   3541   av = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, a);
   3542   bv = bfd_get_64 (elfNN_ia64_unwind_entry_compare_bfd, b);
   3543 
   3544   return (av < bv ? -1 : av > bv ? 1 : 0);
   3545 }
   3546 
   3547 /* Make sure we've got ourselves a nice fat __gp value.  */
   3548 static bool
   3549 elfNN_ia64_choose_gp (bfd *abfd, struct bfd_link_info *info, bool final)
   3550 {
   3551   bfd_vma min_vma = (bfd_vma) -1, max_vma = 0;
   3552   bfd_vma min_short_vma = min_vma, max_short_vma = 0;
   3553   struct elf_link_hash_entry *gp;
   3554   bfd_vma gp_val;
   3555   asection *os;
   3556   struct elfNN_ia64_link_hash_table *ia64_info;
   3557 
   3558   ia64_info = elfNN_ia64_hash_table (info);
   3559   if (ia64_info == NULL)
   3560     return false;
   3561 
   3562   /* Find the min and max vma of all sections marked short.  Also collect
   3563      min and max vma of any type, for use in selecting a nice gp.  */
   3564   for (os = abfd->sections; os ; os = os->next)
   3565     {
   3566       bfd_vma lo, hi;
   3567 
   3568       if ((os->flags & SEC_ALLOC) == 0)
   3569 	continue;
   3570 
   3571       lo = os->vma;
   3572       /* When this function is called from elfNN_ia64_final_link
   3573 	 the correct value to use is os->size.  When called from
   3574 	 elfNN_ia64_relax_section we are in the middle of section
   3575 	 sizing; some sections will already have os->size set, others
   3576 	 will have os->size zero and os->rawsize the previous size.  */
   3577       hi = os->vma + (!final && os->rawsize ? os->rawsize : os->size);
   3578       if (hi < lo)
   3579 	hi = (bfd_vma) -1;
   3580 
   3581       if (min_vma > lo)
   3582 	min_vma = lo;
   3583       if (max_vma < hi)
   3584 	max_vma = hi;
   3585       if (os->flags & SEC_SMALL_DATA)
   3586 	{
   3587 	  if (min_short_vma > lo)
   3588 	    min_short_vma = lo;
   3589 	  if (max_short_vma < hi)
   3590 	    max_short_vma = hi;
   3591 	}
   3592     }
   3593 
   3594   if (ia64_info->min_short_sec)
   3595     {
   3596       if (min_short_vma
   3597 	  > (ia64_info->min_short_sec->vma
   3598 	     + ia64_info->min_short_offset))
   3599 	min_short_vma = (ia64_info->min_short_sec->vma
   3600 			 + ia64_info->min_short_offset);
   3601       if (max_short_vma
   3602 	  < (ia64_info->max_short_sec->vma
   3603 	     + ia64_info->max_short_offset))
   3604 	max_short_vma = (ia64_info->max_short_sec->vma
   3605 			 + ia64_info->max_short_offset);
   3606     }
   3607 
   3608   /* See if the user wants to force a value.  */
   3609   gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
   3610 			     false, false);
   3611 
   3612   if (gp
   3613       && (gp->root.type == bfd_link_hash_defined
   3614 	  || gp->root.type == bfd_link_hash_defweak))
   3615     {
   3616       asection *gp_sec = gp->root.u.def.section;
   3617       gp_val = (gp->root.u.def.value
   3618 		+ gp_sec->output_section->vma
   3619 		+ gp_sec->output_offset);
   3620     }
   3621   else
   3622     {
   3623       /* Pick a sensible value.  */
   3624 
   3625       if (ia64_info->min_short_sec)
   3626 	{
   3627 	  bfd_vma short_range = max_short_vma - min_short_vma;
   3628 
   3629 	  /* If min_short_sec is set, pick one in the middle bewteen
   3630 	     min_short_vma and max_short_vma.  */
   3631 	  if (short_range >= 0x400000)
   3632 	    goto overflow;
   3633 	  gp_val = min_short_vma + short_range / 2;
   3634 	}
   3635       else
   3636 	{
   3637 	  asection *got_sec = ia64_info->root.sgot;
   3638 
   3639 	  /* Start with just the address of the .got.  */
   3640 	  if (got_sec)
   3641 	    gp_val = got_sec->output_section->vma;
   3642 	  else if (max_short_vma != 0)
   3643 	    gp_val = min_short_vma;
   3644 	  else if (max_vma - min_vma < 0x200000)
   3645 	    gp_val = min_vma;
   3646 	  else
   3647 	    gp_val = max_vma - 0x200000 + 8;
   3648 	}
   3649 
   3650       /* If it is possible to address the entire image, but we
   3651 	 don't with the choice above, adjust.  */
   3652       if (max_vma - min_vma < 0x400000
   3653 	  && (max_vma - gp_val >= 0x200000
   3654 	      || gp_val - min_vma > 0x200000))
   3655 	gp_val = min_vma + 0x200000;
   3656       else if (max_short_vma != 0)
   3657 	{
   3658 	  /* If we don't cover all the short data, adjust.  */
   3659 	  if (max_short_vma - gp_val >= 0x200000)
   3660 	    gp_val = min_short_vma + 0x200000;
   3661 
   3662 	  /* If we're addressing stuff past the end, adjust back.  */
   3663 	  if (gp_val > max_vma)
   3664 	    gp_val = max_vma - 0x200000 + 8;
   3665 	}
   3666     }
   3667 
   3668   /* Validate whether all SHF_IA_64_SHORT sections are within
   3669      range of the chosen GP.  */
   3670 
   3671   if (max_short_vma != 0)
   3672     {
   3673       if (max_short_vma - min_short_vma >= 0x400000)
   3674 	{
   3675 	overflow:
   3676 	  _bfd_error_handler
   3677 	    /* xgettext:c-format */
   3678 	    (_("%pB: short data segment overflowed (%#" PRIx64 " >= 0x400000)"),
   3679 	     abfd, (uint64_t) (max_short_vma - min_short_vma));
   3680 	  return false;
   3681 	}
   3682       else if ((gp_val > min_short_vma
   3683 		&& gp_val - min_short_vma > 0x200000)
   3684 	       || (gp_val < max_short_vma
   3685 		   && max_short_vma - gp_val >= 0x200000))
   3686 	{
   3687 	  _bfd_error_handler
   3688 	    (_("%pB: __gp does not cover short data segment"), abfd);
   3689 	  return false;
   3690 	}
   3691     }
   3692 
   3693   _bfd_set_gp_value (abfd, gp_val);
   3694 
   3695   return true;
   3696 }
   3697 
   3698 static bool
   3699 elfNN_ia64_final_link (bfd *abfd, struct bfd_link_info *info)
   3700 {
   3701   struct elfNN_ia64_link_hash_table *ia64_info;
   3702   asection *unwind_output_sec;
   3703 
   3704   ia64_info = elfNN_ia64_hash_table (info);
   3705   if (ia64_info == NULL)
   3706     return false;
   3707 
   3708   /* Make sure we've got ourselves a nice fat __gp value.  */
   3709   if (!bfd_link_relocatable (info))
   3710     {
   3711       bfd_vma gp_val;
   3712       struct elf_link_hash_entry *gp;
   3713 
   3714       /* We assume after gp is set, section size will only decrease. We
   3715 	 need to adjust gp for it.  */
   3716       _bfd_set_gp_value (abfd, 0);
   3717       if (! elfNN_ia64_choose_gp (abfd, info, true))
   3718 	return false;
   3719       gp_val = _bfd_get_gp_value (abfd);
   3720 
   3721       gp = elf_link_hash_lookup (elf_hash_table (info), "__gp", false,
   3722 				 false, false);
   3723       if (gp)
   3724 	{
   3725 	  gp->root.type = bfd_link_hash_defined;
   3726 	  gp->root.u.def.value = gp_val;
   3727 	  gp->root.u.def.section = bfd_abs_section_ptr;
   3728 	}
   3729     }
   3730 
   3731   /* If we're producing a final executable, we need to sort the contents
   3732      of the .IA_64.unwind section.  Force this section to be relocated
   3733      into memory rather than written immediately to the output file.  */
   3734   unwind_output_sec = NULL;
   3735   if (!bfd_link_relocatable (info))
   3736     {
   3737       asection *s = bfd_get_section_by_name (abfd, ELF_STRING_ia64_unwind);
   3738       if (s)
   3739 	{
   3740 	  unwind_output_sec = s->output_section;
   3741 	  unwind_output_sec->contents
   3742 	    = bfd_malloc (unwind_output_sec->size);
   3743 	  if (unwind_output_sec->contents == NULL)
   3744 	    return false;
   3745 	}
   3746     }
   3747 
   3748   /* Invoke the regular ELF backend linker to do all the work.  */
   3749   if (!bfd_elf_final_link (abfd, info))
   3750     return false;
   3751 
   3752   if (unwind_output_sec)
   3753     {
   3754       elfNN_ia64_unwind_entry_compare_bfd = abfd;
   3755       qsort (unwind_output_sec->contents,
   3756 	     (size_t) (unwind_output_sec->size / 24),
   3757 	     24,
   3758 	     elfNN_ia64_unwind_entry_compare);
   3759 
   3760       if (! bfd_set_section_contents (abfd, unwind_output_sec,
   3761 				      unwind_output_sec->contents, (bfd_vma) 0,
   3762 				      unwind_output_sec->size))
   3763 	return false;
   3764     }
   3765 
   3766   return true;
   3767 }
   3768 
   3769 static int
   3770 elfNN_ia64_relocate_section (bfd *output_bfd,
   3771 			     struct bfd_link_info *info,
   3772 			     bfd *input_bfd,
   3773 			     asection *input_section,
   3774 			     bfd_byte *contents,
   3775 			     Elf_Internal_Rela *relocs,
   3776 			     Elf_Internal_Sym *local_syms,
   3777 			     asection **local_sections)
   3778 {
   3779   struct elfNN_ia64_link_hash_table *ia64_info;
   3780   Elf_Internal_Shdr *symtab_hdr;
   3781   Elf_Internal_Rela *rel;
   3782   Elf_Internal_Rela *relend;
   3783   asection *srel;
   3784   bool ret_val = true;	/* for non-fatal errors */
   3785   bfd_vma gp_val;
   3786 
   3787   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
   3788   ia64_info = elfNN_ia64_hash_table (info);
   3789   if (ia64_info == NULL)
   3790     return false;
   3791 
   3792   /* Infect various flags from the input section to the output section.  */
   3793   if (bfd_link_relocatable (info))
   3794     {
   3795       bfd_vma flags;
   3796 
   3797       flags = elf_section_data(input_section)->this_hdr.sh_flags;
   3798       flags &= SHF_IA_64_NORECOV;
   3799 
   3800       elf_section_data(input_section->output_section)
   3801 	->this_hdr.sh_flags |= flags;
   3802     }
   3803 
   3804   gp_val = _bfd_get_gp_value (output_bfd);
   3805   srel = get_reloc_section (input_bfd, ia64_info, input_section, false);
   3806 
   3807   rel = relocs;
   3808   relend = relocs + input_section->reloc_count;
   3809   for (; rel < relend; ++rel)
   3810     {
   3811       struct elf_link_hash_entry *h;
   3812       struct elfNN_ia64_dyn_sym_info *dyn_i;
   3813       bfd_reloc_status_type r;
   3814       reloc_howto_type *howto;
   3815       unsigned long r_symndx;
   3816       Elf_Internal_Sym *sym;
   3817       unsigned int r_type;
   3818       bfd_vma value;
   3819       asection *sym_sec;
   3820       bfd_byte *hit_addr;
   3821       bool dynamic_symbol_p;
   3822       bool undef_weak_ref;
   3823 
   3824       r_type = ELFNN_R_TYPE (rel->r_info);
   3825       if (r_type > R_IA64_MAX_RELOC_CODE)
   3826 	{
   3827 	  /* xgettext:c-format */
   3828 	  _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
   3829 			      input_bfd, (int) r_type);
   3830 	  bfd_set_error (bfd_error_bad_value);
   3831 	  ret_val = false;
   3832 	  continue;
   3833 	}
   3834 
   3835       howto = ia64_elf_lookup_howto (r_type);
   3836       if (howto == NULL)
   3837 	{
   3838 	  ret_val = false;
   3839 	  continue;
   3840 	}
   3841 
   3842       r_symndx = ELFNN_R_SYM (rel->r_info);
   3843       h = NULL;
   3844       sym = NULL;
   3845       sym_sec = NULL;
   3846       undef_weak_ref = false;
   3847 
   3848       if (r_symndx < symtab_hdr->sh_info)
   3849 	{
   3850 	  /* Reloc against local symbol.  */
   3851 	  asection *msec;
   3852 	  sym = local_syms + r_symndx;
   3853 	  sym_sec = local_sections[r_symndx];
   3854 	  msec = sym_sec;
   3855 	  value = _bfd_elf_rela_local_sym (output_bfd, sym, &msec, rel);
   3856 	  if (!bfd_link_relocatable (info)
   3857 	      && (sym_sec->flags & SEC_MERGE) != 0
   3858 	      && ELF_ST_TYPE (sym->st_info) == STT_SECTION
   3859 	      && sym_sec->sec_info_type == SEC_INFO_TYPE_MERGE)
   3860 	    {
   3861 	      struct elfNN_ia64_local_hash_entry *loc_h;
   3862 
   3863 	      loc_h = get_local_sym_hash (ia64_info, input_bfd, rel, false);
   3864 	      if (loc_h && ! loc_h->sec_merge_done)
   3865 		{
   3866 		  struct elfNN_ia64_dyn_sym_info *dynent;
   3867 		  unsigned int count;
   3868 
   3869 		  for (count = loc_h->count, dynent = loc_h->info;
   3870 		       count != 0;
   3871 		       count--, dynent++)
   3872 		    {
   3873 		      msec = sym_sec;
   3874 		      dynent->addend =
   3875 			_bfd_merged_section_offset (output_bfd, &msec,
   3876 						    elf_section_data (msec)->
   3877 						    sec_info,
   3878 						    sym->st_value
   3879 						    + dynent->addend);
   3880 		      dynent->addend -= sym->st_value;
   3881 		      dynent->addend += msec->output_section->vma
   3882 					+ msec->output_offset
   3883 					- sym_sec->output_section->vma
   3884 					- sym_sec->output_offset;
   3885 		    }
   3886 
   3887 		  /* We may have introduced duplicated entries. We need
   3888 		     to remove them properly.  */
   3889 		  count = sort_dyn_sym_info (loc_h->info, loc_h->count);
   3890 		  if (count != loc_h->count)
   3891 		    {
   3892 		      loc_h->count = count;
   3893 		      loc_h->sorted_count = count;
   3894 		    }
   3895 
   3896 		  loc_h->sec_merge_done = 1;
   3897 		}
   3898 	    }
   3899 	}
   3900       else
   3901 	{
   3902 	  bool unresolved_reloc;
   3903 	  bool warned, ignored;
   3904 	  struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (input_bfd);
   3905 
   3906 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
   3907 				   r_symndx, symtab_hdr, sym_hashes,
   3908 				   h, sym_sec, value,
   3909 				   unresolved_reloc, warned, ignored);
   3910 
   3911 	  if (h->root.type == bfd_link_hash_undefweak)
   3912 	    undef_weak_ref = true;
   3913 	  else if (warned || (ignored && bfd_link_executable (info)))
   3914 	    continue;
   3915 	}
   3916 
   3917       if (sym_sec != NULL && discarded_section (sym_sec))
   3918 	RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
   3919 					 rel, 1, relend, howto, 0, contents);
   3920 
   3921       if (bfd_link_relocatable (info))
   3922 	continue;
   3923 
   3924       hit_addr = contents + rel->r_offset;
   3925       value += rel->r_addend;
   3926       dynamic_symbol_p = elfNN_ia64_dynamic_symbol_p (h, info, r_type);
   3927 
   3928       switch (r_type)
   3929 	{
   3930 	case R_IA64_NONE:
   3931 	case R_IA64_LDXMOV:
   3932 	  continue;
   3933 
   3934 	case R_IA64_IMM14:
   3935 	case R_IA64_IMM22:
   3936 	case R_IA64_IMM64:
   3937 	case R_IA64_DIR32MSB:
   3938 	case R_IA64_DIR32LSB:
   3939 	case R_IA64_DIR64MSB:
   3940 	case R_IA64_DIR64LSB:
   3941 	  /* Install a dynamic relocation for this reloc.  */
   3942 	  if ((dynamic_symbol_p || bfd_link_pic (info))
   3943 	      && r_symndx != STN_UNDEF
   3944 	      && (input_section->flags & SEC_ALLOC) != 0)
   3945 	    {
   3946 	      unsigned int dyn_r_type;
   3947 	      long dynindx;
   3948 	      bfd_vma addend;
   3949 
   3950 	      BFD_ASSERT (srel != NULL);
   3951 
   3952 	      switch (r_type)
   3953 		{
   3954 		case R_IA64_IMM14:
   3955 		case R_IA64_IMM22:
   3956 		case R_IA64_IMM64:
   3957 		  /* ??? People shouldn't be doing non-pic code in
   3958 		     shared libraries nor dynamic executables.  */
   3959 		  _bfd_error_handler
   3960 		    /* xgettext:c-format */
   3961 		    (_("%pB: non-pic code with imm relocation against dynamic symbol `%s'"),
   3962 		     input_bfd,
   3963 		     h ? h->root.root.string
   3964 		       : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   3965 					   sym_sec));
   3966 		  ret_val = false;
   3967 		  continue;
   3968 
   3969 		default:
   3970 		  break;
   3971 		}
   3972 
   3973 	      /* If we don't need dynamic symbol lookup, find a
   3974 		 matching RELATIVE relocation.  */
   3975 	      dyn_r_type = r_type;
   3976 	      if (dynamic_symbol_p)
   3977 		{
   3978 		  dynindx = h->dynindx;
   3979 		  addend = rel->r_addend;
   3980 		  value = 0;
   3981 		}
   3982 	      else
   3983 		{
   3984 		  switch (r_type)
   3985 		    {
   3986 		    case R_IA64_DIR32MSB:
   3987 		      dyn_r_type = R_IA64_REL32MSB;
   3988 		      break;
   3989 		    case R_IA64_DIR32LSB:
   3990 		      dyn_r_type = R_IA64_REL32LSB;
   3991 		      break;
   3992 		    case R_IA64_DIR64MSB:
   3993 		      dyn_r_type = R_IA64_REL64MSB;
   3994 		      break;
   3995 		    case R_IA64_DIR64LSB:
   3996 		      dyn_r_type = R_IA64_REL64LSB;
   3997 		      break;
   3998 
   3999 		    default:
   4000 		      break;
   4001 		    }
   4002 		  dynindx = 0;
   4003 		  addend = value;
   4004 		}
   4005 
   4006 	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
   4007 					    srel, rel->r_offset, dyn_r_type,
   4008 					    dynindx, addend);
   4009 	    }
   4010 	  /* Fall through.  */
   4011 
   4012 	case R_IA64_LTV32MSB:
   4013 	case R_IA64_LTV32LSB:
   4014 	case R_IA64_LTV64MSB:
   4015 	case R_IA64_LTV64LSB:
   4016 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4017 	  break;
   4018 
   4019 	case R_IA64_GPREL22:
   4020 	case R_IA64_GPREL64I:
   4021 	case R_IA64_GPREL32MSB:
   4022 	case R_IA64_GPREL32LSB:
   4023 	case R_IA64_GPREL64MSB:
   4024 	case R_IA64_GPREL64LSB:
   4025 	  if (dynamic_symbol_p)
   4026 	    {
   4027 	      _bfd_error_handler
   4028 		/* xgettext:c-format */
   4029 		(_("%pB: @gprel relocation against dynamic symbol %s"),
   4030 		 input_bfd,
   4031 		 h ? h->root.root.string
   4032 		   : bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   4033 				       sym_sec));
   4034 	      ret_val = false;
   4035 	      continue;
   4036 	    }
   4037 	  value -= gp_val;
   4038 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4039 	  break;
   4040 
   4041 	case R_IA64_LTOFF22:
   4042 	case R_IA64_LTOFF22X:
   4043 	case R_IA64_LTOFF64I:
   4044 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   4045 	  value = set_got_entry (input_bfd, info, dyn_i, (h ? h->dynindx : -1),
   4046 				 rel->r_addend, value, R_IA64_DIRNNLSB);
   4047 	  value -= gp_val;
   4048 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4049 	  break;
   4050 
   4051 	case R_IA64_PLTOFF22:
   4052 	case R_IA64_PLTOFF64I:
   4053 	case R_IA64_PLTOFF64MSB:
   4054 	case R_IA64_PLTOFF64LSB:
   4055 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   4056 	  value = set_pltoff_entry (output_bfd, info, dyn_i, value, false);
   4057 	  value -= gp_val;
   4058 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4059 	  break;
   4060 
   4061 	case R_IA64_FPTR64I:
   4062 	case R_IA64_FPTR32MSB:
   4063 	case R_IA64_FPTR32LSB:
   4064 	case R_IA64_FPTR64MSB:
   4065 	case R_IA64_FPTR64LSB:
   4066 	  dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   4067 	  if (dyn_i->want_fptr)
   4068 	    {
   4069 	      if (!undef_weak_ref)
   4070 		value = set_fptr_entry (output_bfd, info, dyn_i, value);
   4071 	    }
   4072 	  if (!dyn_i->want_fptr || bfd_link_pie (info))
   4073 	    {
   4074 	      long dynindx;
   4075 	      unsigned int dyn_r_type = r_type;
   4076 	      bfd_vma addend = rel->r_addend;
   4077 
   4078 	      /* Otherwise, we expect the dynamic linker to create
   4079 		 the entry.  */
   4080 
   4081 	      if (dyn_i->want_fptr)
   4082 		{
   4083 		  if (r_type == R_IA64_FPTR64I)
   4084 		    {
   4085 		      /* We can't represent this without a dynamic symbol.
   4086 			 Adjust the relocation to be against an output
   4087 			 section symbol, which are always present in the
   4088 			 dynamic symbol table.  */
   4089 		      /* ??? People shouldn't be doing non-pic code in
   4090 			 shared libraries.  Hork.  */
   4091 		      _bfd_error_handler
   4092 			(_("%pB: linking non-pic code in a position independent executable"),
   4093 			 input_bfd);
   4094 		      ret_val = false;
   4095 		      continue;
   4096 		    }
   4097 		  dynindx = 0;
   4098 		  addend = value;
   4099 		  dyn_r_type = r_type + R_IA64_RELNNLSB - R_IA64_FPTRNNLSB;
   4100 		}
   4101 	      else if (h)
   4102 		{
   4103 		  if (h->dynindx != -1)
   4104 		    dynindx = h->dynindx;
   4105 		  else
   4106 		    dynindx = (_bfd_elf_link_lookup_local_dynindx
   4107 			       (info, h->root.u.def.section->owner,
   4108 				global_sym_index (h)));
   4109 		  value = 0;
   4110 		}
   4111 	      else
   4112 		{
   4113 		  dynindx = (_bfd_elf_link_lookup_local_dynindx
   4114 			     (info, input_bfd, (long) r_symndx));
   4115 		  value = 0;
   4116 		}
   4117 
   4118 	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
   4119 					    srel, rel->r_offset, dyn_r_type,
   4120 					    dynindx, addend);
   4121 	    }
   4122 
   4123 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4124 	  break;
   4125 
   4126 	case R_IA64_LTOFF_FPTR22:
   4127 	case R_IA64_LTOFF_FPTR64I:
   4128 	case R_IA64_LTOFF_FPTR32MSB:
   4129 	case R_IA64_LTOFF_FPTR32LSB:
   4130 	case R_IA64_LTOFF_FPTR64MSB:
   4131 	case R_IA64_LTOFF_FPTR64LSB:
   4132 	  {
   4133 	    long dynindx;
   4134 
   4135 	    dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   4136 	    if (dyn_i->want_fptr)
   4137 	      {
   4138 		BFD_ASSERT (h == NULL || h->dynindx == -1);
   4139 		if (!undef_weak_ref)
   4140 		  value = set_fptr_entry (output_bfd, info, dyn_i, value);
   4141 		dynindx = -1;
   4142 	      }
   4143 	    else
   4144 	      {
   4145 		/* Otherwise, we expect the dynamic linker to create
   4146 		   the entry.  */
   4147 		if (h)
   4148 		  {
   4149 		    if (h->dynindx != -1)
   4150 		      dynindx = h->dynindx;
   4151 		    else
   4152 		      dynindx = (_bfd_elf_link_lookup_local_dynindx
   4153 				 (info, h->root.u.def.section->owner,
   4154 				  global_sym_index (h)));
   4155 		  }
   4156 		else
   4157 		  dynindx = (_bfd_elf_link_lookup_local_dynindx
   4158 			     (info, input_bfd, (long) r_symndx));
   4159 		value = 0;
   4160 	      }
   4161 
   4162 	    value = set_got_entry (output_bfd, info, dyn_i, dynindx,
   4163 				   rel->r_addend, value, R_IA64_FPTRNNLSB);
   4164 	    value -= gp_val;
   4165 	    r = ia64_elf_install_value (hit_addr, value, r_type);
   4166 	  }
   4167 	  break;
   4168 
   4169 	case R_IA64_PCREL32MSB:
   4170 	case R_IA64_PCREL32LSB:
   4171 	case R_IA64_PCREL64MSB:
   4172 	case R_IA64_PCREL64LSB:
   4173 	  /* Install a dynamic relocation for this reloc.  */
   4174 	  if (dynamic_symbol_p && r_symndx != STN_UNDEF)
   4175 	    {
   4176 	      BFD_ASSERT (srel != NULL);
   4177 
   4178 	      elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
   4179 					    srel, rel->r_offset, r_type,
   4180 					    h->dynindx, rel->r_addend);
   4181 	    }
   4182 	  goto finish_pcrel;
   4183 
   4184 	case R_IA64_PCREL21B:
   4185 	case R_IA64_PCREL60B:
   4186 	  /* We should have created a PLT entry for any dynamic symbol.  */
   4187 	  dyn_i = NULL;
   4188 	  if (h)
   4189 	    dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
   4190 
   4191 	  if (dyn_i && dyn_i->want_plt2)
   4192 	    {
   4193 	      /* Should have caught this earlier.  */
   4194 	      BFD_ASSERT (rel->r_addend == 0);
   4195 
   4196 	      value = (ia64_info->root.splt->output_section->vma
   4197 		       + ia64_info->root.splt->output_offset
   4198 		       + dyn_i->plt2_offset);
   4199 	    }
   4200 	  else
   4201 	    {
   4202 	      /* Since there's no PLT entry, Validate that this is
   4203 		 locally defined.  */
   4204 	      BFD_ASSERT (undef_weak_ref || sym_sec->output_section != NULL);
   4205 
   4206 	      /* If the symbol is undef_weak, we shouldn't be trying
   4207 		 to call it.  There's every chance that we'd wind up
   4208 		 with an out-of-range fixup here.  Don't bother setting
   4209 		 any value at all.  */
   4210 	      if (undef_weak_ref)
   4211 		continue;
   4212 	    }
   4213 	  goto finish_pcrel;
   4214 
   4215 	case R_IA64_PCREL21BI:
   4216 	case R_IA64_PCREL21F:
   4217 	case R_IA64_PCREL21M:
   4218 	case R_IA64_PCREL22:
   4219 	case R_IA64_PCREL64I:
   4220 	  /* The PCREL21BI reloc is specifically not intended for use with
   4221 	     dynamic relocs.  PCREL21F and PCREL21M are used for speculation
   4222 	     fixup code, and thus probably ought not be dynamic.  The
   4223 	     PCREL22 and PCREL64I relocs aren't emitted as dynamic relocs.  */
   4224 	  if (dynamic_symbol_p)
   4225 	    {
   4226 	      const char *msg;
   4227 
   4228 	      if (r_type == R_IA64_PCREL21BI)
   4229 		/* xgettext:c-format */
   4230 		msg = _("%pB: @internal branch to dynamic symbol %s");
   4231 	      else if (r_type == R_IA64_PCREL21F || r_type == R_IA64_PCREL21M)
   4232 		/* xgettext:c-format */
   4233 		msg = _("%pB: speculation fixup to dynamic symbol %s");
   4234 	      else
   4235 		/* xgettext:c-format */
   4236 		msg = _("%pB: @pcrel relocation against dynamic symbol %s");
   4237 	      _bfd_error_handler (msg, input_bfd,
   4238 				  h ? h->root.root.string
   4239 				  : bfd_elf_sym_name (input_bfd,
   4240 						      symtab_hdr,
   4241 						      sym,
   4242 						      sym_sec));
   4243 	      ret_val = false;
   4244 	      continue;
   4245 	    }
   4246 	  goto finish_pcrel;
   4247 
   4248 	finish_pcrel:
   4249 	  /* Make pc-relative.  */
   4250 	  value -= (input_section->output_section->vma
   4251 		    + input_section->output_offset
   4252 		    + rel->r_offset) & ~ (bfd_vma) 0x3;
   4253 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4254 	  break;
   4255 
   4256 	case R_IA64_SEGREL32MSB:
   4257 	case R_IA64_SEGREL32LSB:
   4258 	case R_IA64_SEGREL64MSB:
   4259 	case R_IA64_SEGREL64LSB:
   4260 	    {
   4261 	      /* Find the segment that contains the output_section.  */
   4262 	      Elf_Internal_Phdr *p = _bfd_elf_find_segment_containing_section
   4263 		(output_bfd, input_section->output_section);
   4264 
   4265 	      if (p == NULL)
   4266 		{
   4267 		  r = bfd_reloc_notsupported;
   4268 		}
   4269 	      else
   4270 		{
   4271 		  /* The VMA of the segment is the vaddr of the associated
   4272 		     program header.  */
   4273 		  if (value > p->p_vaddr)
   4274 		    value -= p->p_vaddr;
   4275 		  else
   4276 		    value = 0;
   4277 		  r = ia64_elf_install_value (hit_addr, value, r_type);
   4278 		}
   4279 	      break;
   4280 	    }
   4281 
   4282 	case R_IA64_SECREL32MSB:
   4283 	case R_IA64_SECREL32LSB:
   4284 	case R_IA64_SECREL64MSB:
   4285 	case R_IA64_SECREL64LSB:
   4286 	  /* Make output-section relative to section where the symbol
   4287 	     is defined. PR 475  */
   4288 	  if (sym_sec)
   4289 	    value -= sym_sec->output_section->vma;
   4290 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4291 	  break;
   4292 
   4293 	case R_IA64_IPLTMSB:
   4294 	case R_IA64_IPLTLSB:
   4295 	  /* Install a dynamic relocation for this reloc.  */
   4296 	  if ((dynamic_symbol_p || bfd_link_pic (info))
   4297 	      && (input_section->flags & SEC_ALLOC) != 0)
   4298 	    {
   4299 	      BFD_ASSERT (srel != NULL);
   4300 
   4301 	      /* If we don't need dynamic symbol lookup, install two
   4302 		 RELATIVE relocations.  */
   4303 	      if (!dynamic_symbol_p)
   4304 		{
   4305 		  unsigned int dyn_r_type;
   4306 
   4307 		  if (r_type == R_IA64_IPLTMSB)
   4308 		    dyn_r_type = R_IA64_REL64MSB;
   4309 		  else
   4310 		    dyn_r_type = R_IA64_REL64LSB;
   4311 
   4312 		  elfNN_ia64_install_dyn_reloc (output_bfd, info,
   4313 						input_section,
   4314 						srel, rel->r_offset,
   4315 						dyn_r_type, 0, value);
   4316 		  elfNN_ia64_install_dyn_reloc (output_bfd, info,
   4317 						input_section,
   4318 						srel, rel->r_offset + 8,
   4319 						dyn_r_type, 0, gp_val);
   4320 		}
   4321 	      else
   4322 		elfNN_ia64_install_dyn_reloc (output_bfd, info, input_section,
   4323 					      srel, rel->r_offset, r_type,
   4324 					      h->dynindx, rel->r_addend);
   4325 	    }
   4326 
   4327 	  if (r_type == R_IA64_IPLTMSB)
   4328 	    r_type = R_IA64_DIR64MSB;
   4329 	  else
   4330 	    r_type = R_IA64_DIR64LSB;
   4331 	  ia64_elf_install_value (hit_addr, value, r_type);
   4332 	  r = ia64_elf_install_value (hit_addr + 8, gp_val, r_type);
   4333 	  break;
   4334 
   4335 	case R_IA64_TPREL14:
   4336 	case R_IA64_TPREL22:
   4337 	case R_IA64_TPREL64I:
   4338 	  if (elf_hash_table (info)->tls_sec == NULL)
   4339 	    goto missing_tls_sec;
   4340 	  value -= elfNN_ia64_tprel_base (info);
   4341 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4342 	  break;
   4343 
   4344 	case R_IA64_DTPREL14:
   4345 	case R_IA64_DTPREL22:
   4346 	case R_IA64_DTPREL64I:
   4347 	case R_IA64_DTPREL32LSB:
   4348 	case R_IA64_DTPREL32MSB:
   4349 	case R_IA64_DTPREL64LSB:
   4350 	case R_IA64_DTPREL64MSB:
   4351 	  if (elf_hash_table (info)->tls_sec == NULL)
   4352 	    goto missing_tls_sec;
   4353 	  value -= elfNN_ia64_dtprel_base (info);
   4354 	  r = ia64_elf_install_value (hit_addr, value, r_type);
   4355 	  break;
   4356 
   4357 	case R_IA64_LTOFF_TPREL22:
   4358 	case R_IA64_LTOFF_DTPMOD22:
   4359 	case R_IA64_LTOFF_DTPREL22:
   4360 	  {
   4361 	    int got_r_type;
   4362 	    long dynindx = h ? h->dynindx : -1;
   4363 	    bfd_vma r_addend = rel->r_addend;
   4364 
   4365 	    switch (r_type)
   4366 	      {
   4367 	      default:
   4368 	      case R_IA64_LTOFF_TPREL22:
   4369 		if (!dynamic_symbol_p)
   4370 		  {
   4371 		    if (elf_hash_table (info)->tls_sec == NULL)
   4372 		      goto missing_tls_sec;
   4373 		    if (!bfd_link_pic (info))
   4374 		      value -= elfNN_ia64_tprel_base (info);
   4375 		    else
   4376 		      {
   4377 			r_addend += value - elfNN_ia64_dtprel_base (info);
   4378 			dynindx = 0;
   4379 		      }
   4380 		  }
   4381 		got_r_type = R_IA64_TPREL64LSB;
   4382 		break;
   4383 	      case R_IA64_LTOFF_DTPMOD22:
   4384 		if (!dynamic_symbol_p && !bfd_link_pic (info))
   4385 		  value = 1;
   4386 		got_r_type = R_IA64_DTPMOD64LSB;
   4387 		break;
   4388 	      case R_IA64_LTOFF_DTPREL22:
   4389 		if (!dynamic_symbol_p)
   4390 		  {
   4391 		    if (elf_hash_table (info)->tls_sec == NULL)
   4392 		      goto missing_tls_sec;
   4393 		    value -= elfNN_ia64_dtprel_base (info);
   4394 		  }
   4395 		got_r_type = R_IA64_DTPRELNNLSB;
   4396 		break;
   4397 	      }
   4398 	    dyn_i = get_dyn_sym_info (ia64_info, h, input_bfd, rel, false);
   4399 	    value = set_got_entry (input_bfd, info, dyn_i, dynindx, r_addend,
   4400 				   value, got_r_type);
   4401 	    value -= gp_val;
   4402 	    r = ia64_elf_install_value (hit_addr, value, r_type);
   4403 	  }
   4404 	  break;
   4405 
   4406 	default:
   4407 	  r = bfd_reloc_notsupported;
   4408 	  break;
   4409 	}
   4410 
   4411       switch (r)
   4412 	{
   4413 	case bfd_reloc_ok:
   4414 	  break;
   4415 
   4416 	case bfd_reloc_undefined:
   4417 	  /* This can happen for global table relative relocs if
   4418 	     __gp is undefined.  This is a panic situation so we
   4419 	     don't try to continue.  */
   4420 	  (*info->callbacks->undefined_symbol)
   4421 	    (info, "__gp", input_bfd, input_section, rel->r_offset, 1);
   4422 	  return false;
   4423 
   4424 	case bfd_reloc_notsupported:
   4425 	  {
   4426 	    const char *name;
   4427 
   4428 	    if (h)
   4429 	      name = h->root.root.string;
   4430 	    else
   4431 	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   4432 				       sym_sec);
   4433 	    (*info->callbacks->warning) (info, _("unsupported reloc"),
   4434 					 name, input_bfd,
   4435 					 input_section, rel->r_offset);
   4436 	    ret_val = false;
   4437 	  }
   4438 	  break;
   4439 
   4440 	case bfd_reloc_dangerous:
   4441 	case bfd_reloc_outofrange:
   4442 	case bfd_reloc_overflow:
   4443 	default:
   4444 	missing_tls_sec:
   4445 	  {
   4446 	    const char *name;
   4447 
   4448 	    if (h)
   4449 	      name = h->root.root.string;
   4450 	    else
   4451 	      name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym,
   4452 				       sym_sec);
   4453 
   4454 	    switch (r_type)
   4455 	      {
   4456 	      case R_IA64_TPREL14:
   4457 	      case R_IA64_TPREL22:
   4458 	      case R_IA64_TPREL64I:
   4459 	      case R_IA64_DTPREL14:
   4460 	      case R_IA64_DTPREL22:
   4461 	      case R_IA64_DTPREL64I:
   4462 	      case R_IA64_DTPREL32LSB:
   4463 	      case R_IA64_DTPREL32MSB:
   4464 	      case R_IA64_DTPREL64LSB:
   4465 	      case R_IA64_DTPREL64MSB:
   4466 	      case R_IA64_LTOFF_TPREL22:
   4467 	      case R_IA64_LTOFF_DTPMOD22:
   4468 	      case R_IA64_LTOFF_DTPREL22:
   4469 		_bfd_error_handler
   4470 		  /* xgettext:c-format */
   4471 		  (_("%pB: missing TLS section for relocation %s against `%s'"
   4472 		     " at %#" PRIx64 " in section `%pA'."),
   4473 		   input_bfd, howto->name, name,
   4474 		   (uint64_t) rel->r_offset, input_section);
   4475 		break;
   4476 
   4477 	      case R_IA64_PCREL21B:
   4478 	      case R_IA64_PCREL21BI:
   4479 	      case R_IA64_PCREL21M:
   4480 	      case R_IA64_PCREL21F:
   4481 		if (is_elf_hash_table (info->hash))
   4482 		  {
   4483 		    /* Relaxtion is always performed for ELF output.
   4484 		       Overflow failures for those relocations mean
   4485 		       that the section is too big to relax.  */
   4486 		    _bfd_error_handler
   4487 		      /* xgettext:c-format */
   4488 		      (_("%pB: Can't relax br (%s) to `%s' at %#" PRIx64
   4489 			 " in section `%pA' with size %#" PRIx64
   4490 			 " (> 0x1000000)."),
   4491 		       input_bfd, howto->name, name, (uint64_t) rel->r_offset,
   4492 		       input_section, (uint64_t) input_section->size);
   4493 		    break;
   4494 		  }
   4495 		/* Fall through.  */
   4496 	      default:
   4497 		(*info->callbacks->reloc_overflow) (info,
   4498 						    &h->root,
   4499 						    name,
   4500 						    howto->name,
   4501 						    (bfd_vma) 0,
   4502 						    input_bfd,
   4503 						    input_section,
   4504 						    rel->r_offset);
   4505 		break;
   4506 	      }
   4507 
   4508 	    ret_val = false;
   4509 	  }
   4510 	  break;
   4511 	}
   4512     }
   4513 
   4514   return ret_val;
   4515 }
   4516 
   4517 static bool
   4518 elfNN_ia64_finish_dynamic_symbol (bfd *output_bfd,
   4519 				  struct bfd_link_info *info,
   4520 				  struct elf_link_hash_entry *h,
   4521 				  Elf_Internal_Sym *sym)
   4522 {
   4523   struct elfNN_ia64_link_hash_table *ia64_info;
   4524   struct elfNN_ia64_dyn_sym_info *dyn_i;
   4525 
   4526   ia64_info = elfNN_ia64_hash_table (info);
   4527 
   4528   dyn_i = get_dyn_sym_info (ia64_info, h, NULL, NULL, false);
   4529 
   4530   /* Fill in the PLT data, if required.  */
   4531   if (dyn_i && dyn_i->want_plt)
   4532     {
   4533       Elf_Internal_Rela outrel;
   4534       bfd_byte *loc;
   4535       asection *plt_sec;
   4536       bfd_vma plt_addr, pltoff_addr, gp_val, plt_index;
   4537 
   4538       gp_val = _bfd_get_gp_value (output_bfd);
   4539 
   4540       /* Initialize the minimal PLT entry.  */
   4541 
   4542       plt_index = (dyn_i->plt_offset - PLT_HEADER_SIZE) / PLT_MIN_ENTRY_SIZE;
   4543       plt_sec = ia64_info->root.splt;
   4544       loc = plt_sec->contents + dyn_i->plt_offset;
   4545 
   4546       memcpy (loc, plt_min_entry, PLT_MIN_ENTRY_SIZE);
   4547       ia64_elf_install_value (loc, plt_index, R_IA64_IMM22);
   4548       ia64_elf_install_value (loc+2, -dyn_i->plt_offset, R_IA64_PCREL21B);
   4549 
   4550       plt_addr = (plt_sec->output_section->vma
   4551 		  + plt_sec->output_offset
   4552 		  + dyn_i->plt_offset);
   4553       pltoff_addr = set_pltoff_entry (output_bfd, info, dyn_i, plt_addr, true);
   4554 
   4555       /* Initialize the FULL PLT entry, if needed.  */
   4556       if (dyn_i->want_plt2)
   4557 	{
   4558 	  loc = plt_sec->contents + dyn_i->plt2_offset;
   4559 
   4560 	  memcpy (loc, plt_full_entry, PLT_FULL_ENTRY_SIZE);
   4561 	  ia64_elf_install_value (loc, pltoff_addr - gp_val, R_IA64_IMM22);
   4562 
   4563 	  /* Mark the symbol as undefined, rather than as defined in the
   4564 	     plt section.  Leave the value alone.  */
   4565 	  /* ??? We didn't redefine it in adjust_dynamic_symbol in the
   4566 	     first place.  But perhaps elflink.c did some for us.  */
   4567 	  if (!h->def_regular)
   4568 	    sym->st_shndx = SHN_UNDEF;
   4569 	}
   4570 
   4571       /* Create the dynamic relocation.  */
   4572       outrel.r_offset = pltoff_addr;
   4573       if (bfd_little_endian (output_bfd))
   4574 	outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTLSB);
   4575       else
   4576 	outrel.r_info = ELFNN_R_INFO (h->dynindx, R_IA64_IPLTMSB);
   4577       outrel.r_addend = 0;
   4578 
   4579       /* This is fun.  In the .IA_64.pltoff section, we've got entries
   4580 	 that correspond both to real PLT entries, and those that
   4581 	 happened to resolve to local symbols but need to be created
   4582 	 to satisfy @pltoff relocations.  The .rela.IA_64.pltoff
   4583 	 relocations for the real PLT should come at the end of the
   4584 	 section, so that they can be indexed by plt entry at runtime.
   4585 
   4586 	 We emitted all of the relocations for the non-PLT @pltoff
   4587 	 entries during relocate_section.  So we can consider the
   4588 	 existing sec->reloc_count to be the base of the array of
   4589 	 PLT relocations.  */
   4590 
   4591       loc = ia64_info->rel_pltoff_sec->contents;
   4592       loc += ((ia64_info->rel_pltoff_sec->reloc_count + plt_index)
   4593 	      * sizeof (ElfNN_External_Rela));
   4594       bfd_elfNN_swap_reloca_out (output_bfd, &outrel, loc);
   4595     }
   4596 
   4597   /* Mark some specially defined symbols as absolute.  */
   4598   if (h == ia64_info->root.hdynamic
   4599       || h == ia64_info->root.hgot
   4600       || h == ia64_info->root.hplt)
   4601     sym->st_shndx = SHN_ABS;
   4602 
   4603   return true;
   4604 }
   4605 
   4606 static bool
   4607 elfNN_ia64_finish_dynamic_sections (bfd *abfd,
   4608 				    struct bfd_link_info *info)
   4609 {
   4610   struct elfNN_ia64_link_hash_table *ia64_info;
   4611   bfd *dynobj;
   4612 
   4613   ia64_info = elfNN_ia64_hash_table (info);
   4614   if (ia64_info == NULL)
   4615     return false;
   4616 
   4617   dynobj = ia64_info->root.dynobj;
   4618 
   4619   if (ia64_info->root.dynamic_sections_created)
   4620     {
   4621       ElfNN_External_Dyn *dyncon, *dynconend;
   4622       asection *sdyn, *sgotplt;
   4623       bfd_vma gp_val;
   4624 
   4625       sdyn = bfd_get_linker_section (dynobj, ".dynamic");
   4626       sgotplt = ia64_info->root.sgotplt;
   4627       BFD_ASSERT (sdyn != NULL);
   4628       dyncon = (ElfNN_External_Dyn *) sdyn->contents;
   4629       dynconend = (ElfNN_External_Dyn *) (sdyn->contents + sdyn->size);
   4630 
   4631       gp_val = _bfd_get_gp_value (abfd);
   4632 
   4633       for (; dyncon < dynconend; dyncon++)
   4634 	{
   4635 	  Elf_Internal_Dyn dyn;
   4636 
   4637 	  bfd_elfNN_swap_dyn_in (dynobj, dyncon, &dyn);
   4638 
   4639 	  switch (dyn.d_tag)
   4640 	    {
   4641 	    case DT_PLTGOT:
   4642 	      dyn.d_un.d_ptr = gp_val;
   4643 	      break;
   4644 
   4645 	    case DT_PLTRELSZ:
   4646 	      dyn.d_un.d_val = (ia64_info->minplt_entries
   4647 				* sizeof (ElfNN_External_Rela));
   4648 	      break;
   4649 
   4650 	    case DT_JMPREL:
   4651 	      /* See the comment above in finish_dynamic_symbol.  */
   4652 	      dyn.d_un.d_ptr = (ia64_info->rel_pltoff_sec->output_section->vma
   4653 				+ ia64_info->rel_pltoff_sec->output_offset
   4654 				+ (ia64_info->rel_pltoff_sec->reloc_count
   4655 				   * sizeof (ElfNN_External_Rela)));
   4656 	      break;
   4657 
   4658 	    case DT_IA_64_PLT_RESERVE:
   4659 	      dyn.d_un.d_ptr = (sgotplt->output_section->vma
   4660 				+ sgotplt->output_offset);
   4661 	      break;
   4662 	    }
   4663 
   4664 	  bfd_elfNN_swap_dyn_out (abfd, &dyn, dyncon);
   4665 	}
   4666 
   4667       /* Initialize the PLT0 entry.  */
   4668       if (ia64_info->root.splt)
   4669 	{
   4670 	  bfd_byte *loc = ia64_info->root.splt->contents;
   4671 	  bfd_vma pltres;
   4672 
   4673 	  memcpy (loc, plt_header, PLT_HEADER_SIZE);
   4674 
   4675 	  pltres = (sgotplt->output_section->vma
   4676 		    + sgotplt->output_offset
   4677 		    - gp_val);
   4678 
   4679 	  ia64_elf_install_value (loc+1, pltres, R_IA64_GPREL22);
   4680 	}
   4681     }
   4682 
   4683   return true;
   4684 }
   4685 
   4686 /* ELF file flag handling:  */
   4688 
   4689 /* Function to keep IA-64 specific file flags.  */
   4690 static bool
   4691 elfNN_ia64_set_private_flags (bfd *abfd, flagword flags)
   4692 {
   4693   BFD_ASSERT (!elf_flags_init (abfd)
   4694 	      || elf_elfheader (abfd)->e_flags == flags);
   4695 
   4696   elf_elfheader (abfd)->e_flags = flags;
   4697   elf_flags_init (abfd) = true;
   4698   return true;
   4699 }
   4700 
   4701 /* Merge backend specific data from an object file to the output
   4702    object file when linking.  */
   4703 
   4704 static bool
   4705 elfNN_ia64_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
   4706 {
   4707   bfd *obfd = info->output_bfd;
   4708   flagword out_flags;
   4709   flagword in_flags;
   4710   bool ok = true;
   4711 
   4712   /* FIXME: What should be checked when linking shared libraries?  */
   4713   if ((ibfd->flags & DYNAMIC) != 0)
   4714     return true;
   4715 
   4716   if (!is_ia64_elf (ibfd) || !is_ia64_elf (obfd))
   4717     return true;
   4718 
   4719   in_flags  = elf_elfheader (ibfd)->e_flags;
   4720   out_flags = elf_elfheader (obfd)->e_flags;
   4721 
   4722   if (! elf_flags_init (obfd))
   4723     {
   4724       elf_flags_init (obfd) = true;
   4725       elf_elfheader (obfd)->e_flags = in_flags;
   4726 
   4727       if (bfd_get_arch (obfd) == bfd_get_arch (ibfd)
   4728 	  && bfd_get_arch_info (obfd)->the_default)
   4729 	{
   4730 	  return bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
   4731 				    bfd_get_mach (ibfd));
   4732 	}
   4733 
   4734       return true;
   4735     }
   4736 
   4737   /* Check flag compatibility.  */
   4738   if (in_flags == out_flags)
   4739     return true;
   4740 
   4741   /* Output has EF_IA_64_REDUCEDFP set only if all inputs have it set.  */
   4742   if (!(in_flags & EF_IA_64_REDUCEDFP) && (out_flags & EF_IA_64_REDUCEDFP))
   4743     elf_elfheader (obfd)->e_flags &= ~EF_IA_64_REDUCEDFP;
   4744 
   4745   if ((in_flags & EF_IA_64_TRAPNIL) != (out_flags & EF_IA_64_TRAPNIL))
   4746     {
   4747       _bfd_error_handler
   4748 	(_("%pB: linking trap-on-NULL-dereference with non-trapping files"),
   4749 	 ibfd);
   4750 
   4751       bfd_set_error (bfd_error_bad_value);
   4752       ok = false;
   4753     }
   4754   if ((in_flags & EF_IA_64_BE) != (out_flags & EF_IA_64_BE))
   4755     {
   4756       _bfd_error_handler
   4757 	(_("%pB: linking big-endian files with little-endian files"),
   4758 	 ibfd);
   4759 
   4760       bfd_set_error (bfd_error_bad_value);
   4761       ok = false;
   4762     }
   4763   if ((in_flags & EF_IA_64_ABI64) != (out_flags & EF_IA_64_ABI64))
   4764     {
   4765       _bfd_error_handler
   4766 	(_("%pB: linking 64-bit files with 32-bit files"),
   4767 	 ibfd);
   4768 
   4769       bfd_set_error (bfd_error_bad_value);
   4770       ok = false;
   4771     }
   4772   if ((in_flags & EF_IA_64_CONS_GP) != (out_flags & EF_IA_64_CONS_GP))
   4773     {
   4774       _bfd_error_handler
   4775 	(_("%pB: linking constant-gp files with non-constant-gp files"),
   4776 	 ibfd);
   4777 
   4778       bfd_set_error (bfd_error_bad_value);
   4779       ok = false;
   4780     }
   4781   if ((in_flags & EF_IA_64_NOFUNCDESC_CONS_GP)
   4782       != (out_flags & EF_IA_64_NOFUNCDESC_CONS_GP))
   4783     {
   4784       _bfd_error_handler
   4785 	(_("%pB: linking auto-pic files with non-auto-pic files"),
   4786 	 ibfd);
   4787 
   4788       bfd_set_error (bfd_error_bad_value);
   4789       ok = false;
   4790     }
   4791 
   4792   return ok;
   4793 }
   4794 
   4795 static bool
   4796 elfNN_ia64_print_private_bfd_data (bfd *abfd, void * ptr)
   4797 {
   4798   FILE *file = (FILE *) ptr;
   4799   flagword flags = elf_elfheader (abfd)->e_flags;
   4800 
   4801   BFD_ASSERT (abfd != NULL && ptr != NULL);
   4802 
   4803   fprintf (file, "private flags = %s%s%s%s%s%s%s%s\n",
   4804 	   (flags & EF_IA_64_TRAPNIL) ? "TRAPNIL, " : "",
   4805 	   (flags & EF_IA_64_EXT) ? "EXT, " : "",
   4806 	   (flags & EF_IA_64_BE) ? "BE, " : "LE, ",
   4807 	   (flags & EF_IA_64_REDUCEDFP) ? "REDUCEDFP, " : "",
   4808 	   (flags & EF_IA_64_CONS_GP) ? "CONS_GP, " : "",
   4809 	   (flags & EF_IA_64_NOFUNCDESC_CONS_GP) ? "NOFUNCDESC_CONS_GP, " : "",
   4810 	   (flags & EF_IA_64_ABSOLUTE) ? "ABSOLUTE, " : "",
   4811 	   (flags & EF_IA_64_ABI64) ? "ABI64" : "ABI32");
   4812 
   4813   _bfd_elf_print_private_bfd_data (abfd, ptr);
   4814   return true;
   4815 }
   4816 
   4817 static enum elf_reloc_type_class
   4818 elfNN_ia64_reloc_type_class (const struct bfd_link_info *info ATTRIBUTE_UNUSED,
   4819 			     const asection *rel_sec ATTRIBUTE_UNUSED,
   4820 			     const Elf_Internal_Rela *rela)
   4821 {
   4822   switch ((int) ELFNN_R_TYPE (rela->r_info))
   4823     {
   4824     case R_IA64_REL32MSB:
   4825     case R_IA64_REL32LSB:
   4826     case R_IA64_REL64MSB:
   4827     case R_IA64_REL64LSB:
   4828       return reloc_class_relative;
   4829     case R_IA64_IPLTMSB:
   4830     case R_IA64_IPLTLSB:
   4831       return reloc_class_plt;
   4832     case R_IA64_COPY:
   4833       return reloc_class_copy;
   4834     default:
   4835       return reloc_class_normal;
   4836     }
   4837 }
   4838 
   4839 static const struct bfd_elf_special_section elfNN_ia64_special_sections[] =
   4840 {
   4841   { STRING_COMMA_LEN (".sbss"),	 -1, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
   4842   { STRING_COMMA_LEN (".sdata"), -1, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE + SHF_IA_64_SHORT },
   4843   { NULL,		     0,	  0, 0,		   0 }
   4844 };
   4845 
   4846 static bool
   4847 elfNN_ia64_object_p (bfd *abfd)
   4848 {
   4849   asection *sec;
   4850   asection *group, *unwi, *unw;
   4851   flagword flags;
   4852   const char *name;
   4853   char *unwi_name, *unw_name;
   4854   size_t amt;
   4855 
   4856   if (abfd->flags & DYNAMIC)
   4857     return true;
   4858 
   4859   /* Flags for fake group section.  */
   4860   flags = (SEC_LINKER_CREATED | SEC_GROUP | SEC_LINK_ONCE
   4861 	   | SEC_EXCLUDE);
   4862 
   4863   /* We add a fake section group for each .gnu.linkonce.t.* section,
   4864      which isn't in a section group, and its unwind sections.  */
   4865   for (sec = abfd->sections; sec != NULL; sec = sec->next)
   4866     {
   4867       if (elf_sec_group (sec) == NULL
   4868 	  && ((sec->flags & (SEC_LINK_ONCE | SEC_CODE | SEC_GROUP))
   4869 	      == (SEC_LINK_ONCE | SEC_CODE))
   4870 	  && startswith (sec->name, ".gnu.linkonce.t."))
   4871 	{
   4872 	  name = sec->name + 16;
   4873 
   4874 	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unwi.");
   4875 	  unwi_name = bfd_alloc (abfd, amt);
   4876 	  if (!unwi_name)
   4877 	    return false;
   4878 
   4879 	  strcpy (stpcpy (unwi_name, ".gnu.linkonce.ia64unwi."), name);
   4880 	  unwi = bfd_get_section_by_name (abfd, unwi_name);
   4881 
   4882 	  amt = strlen (name) + sizeof (".gnu.linkonce.ia64unw.");
   4883 	  unw_name = bfd_alloc (abfd, amt);
   4884 	  if (!unw_name)
   4885 	    return false;
   4886 
   4887 	  strcpy (stpcpy (unw_name, ".gnu.linkonce.ia64unw."), name);
   4888 	  unw = bfd_get_section_by_name (abfd, unw_name);
   4889 
   4890 	  /* We need to create a fake group section for it and its
   4891 	     unwind sections.  */
   4892 	  group = bfd_make_section_anyway_with_flags (abfd, name,
   4893 						      flags);
   4894 	  if (group == NULL)
   4895 	    return false;
   4896 
   4897 	  /* Move the fake group section to the beginning.  */
   4898 	  bfd_section_list_remove (abfd, group);
   4899 	  bfd_section_list_prepend (abfd, group);
   4900 
   4901 	  elf_next_in_group (group) = sec;
   4902 
   4903 	  elf_group_name (sec) = name;
   4904 	  elf_next_in_group (sec) = sec;
   4905 	  elf_sec_group (sec) = group;
   4906 
   4907 	  if (unwi)
   4908 	    {
   4909 	      elf_group_name (unwi) = name;
   4910 	      elf_next_in_group (unwi) = sec;
   4911 	      elf_next_in_group (sec) = unwi;
   4912 	      elf_sec_group (unwi) = group;
   4913 	    }
   4914 
   4915 	   if (unw)
   4916 	     {
   4917 	       elf_group_name (unw) = name;
   4918 	       if (unwi)
   4919 		 {
   4920 		   elf_next_in_group (unw) = elf_next_in_group (unwi);
   4921 		   elf_next_in_group (unwi) = unw;
   4922 		 }
   4923 	       else
   4924 		 {
   4925 		   elf_next_in_group (unw) = sec;
   4926 		   elf_next_in_group (sec) = unw;
   4927 		 }
   4928 	       elf_sec_group (unw) = group;
   4929 	     }
   4930 
   4931 	   /* Fake SHT_GROUP section header.  */
   4932 	  elf_section_data (group)->this_hdr.bfd_section = group;
   4933 	  elf_section_data (group)->this_hdr.sh_type = SHT_GROUP;
   4934 	}
   4935     }
   4936   return true;
   4937 }
   4938 
   4939 static bool
   4940 elfNN_ia64_hpux_vec (const bfd_target *vec)
   4941 {
   4942   extern const bfd_target ia64_elfNN_hpux_be_vec;
   4943   return (vec == &ia64_elfNN_hpux_be_vec);
   4944 }
   4945 
   4946 static bool
   4947 elfNN_hpux_init_file_header (bfd *abfd, struct bfd_link_info *info)
   4948 {
   4949   Elf_Internal_Ehdr *i_ehdrp;
   4950 
   4951   if (!_bfd_elf_init_file_header (abfd, info))
   4952     return false;
   4953 
   4954   i_ehdrp = elf_elfheader (abfd);
   4955   i_ehdrp->e_ident[EI_OSABI] = get_elf_backend_data (abfd)->elf_osabi;
   4956   i_ehdrp->e_ident[EI_ABIVERSION] = 1;
   4957   return true;
   4958 }
   4959 
   4960 static bool
   4961 elfNN_hpux_backend_section_from_bfd_section (bfd *abfd ATTRIBUTE_UNUSED,
   4962 					     asection *sec, int *retval)
   4963 {
   4964   if (bfd_is_com_section (sec))
   4965     {
   4966       *retval = SHN_IA_64_ANSI_COMMON;
   4967       return true;
   4968     }
   4969   return false;
   4970 }
   4971 
   4972 static void
   4973 elfNN_hpux_backend_symbol_processing (bfd *abfd ATTRIBUTE_UNUSED,
   4974 				      asymbol *asym)
   4975 {
   4976   elf_symbol_type *elfsym = (elf_symbol_type *) asym;
   4977 
   4978   switch (elfsym->internal_elf_sym.st_shndx)
   4979     {
   4980     case SHN_IA_64_ANSI_COMMON:
   4981       asym->section = bfd_com_section_ptr;
   4982       asym->value = elfsym->internal_elf_sym.st_size;
   4983       asym->flags &= ~BSF_GLOBAL;
   4984       break;
   4985     }
   4986 }
   4987 
   4988 static void
   4989 ignore_errors (const char *fmt ATTRIBUTE_UNUSED, ...)
   4990 {
   4991 }
   4992 
   4993 #define TARGET_LITTLE_SYM		ia64_elfNN_le_vec
   4995 #define TARGET_LITTLE_NAME		"elfNN-ia64-little"
   4996 #define TARGET_BIG_SYM			ia64_elfNN_be_vec
   4997 #define TARGET_BIG_NAME			"elfNN-ia64-big"
   4998 #define ELF_ARCH			bfd_arch_ia64
   4999 #define ELF_TARGET_ID			IA64_ELF_DATA
   5000 #define ELF_MACHINE_CODE		EM_IA_64
   5001 #define ELF_MACHINE_ALT1		1999	/* EAS2.3 */
   5002 #define ELF_MACHINE_ALT2		1998	/* EAS2.2 */
   5003 #define ELF_MAXPAGESIZE			0x10000	/* 64KB */
   5004 #define ELF_COMMONPAGESIZE		0x4000	/* 16KB */
   5005 
   5006 #define elf_backend_section_from_shdr \
   5007 	elfNN_ia64_section_from_shdr
   5008 #define elf_backend_section_flags \
   5009 	elfNN_ia64_section_flags
   5010 #define elf_backend_fake_sections \
   5011 	elfNN_ia64_fake_sections
   5012 #define elf_backend_final_write_processing \
   5013 	elfNN_ia64_final_write_processing
   5014 #define elf_backend_add_symbol_hook \
   5015 	elfNN_ia64_add_symbol_hook
   5016 #define elf_backend_additional_program_headers \
   5017 	elfNN_ia64_additional_program_headers
   5018 #define elf_backend_modify_segment_map \
   5019 	elfNN_ia64_modify_segment_map
   5020 #define elf_backend_modify_headers \
   5021 	elfNN_ia64_modify_headers
   5022 #define elf_info_to_howto \
   5023 	elfNN_ia64_info_to_howto
   5024 
   5025 #define bfd_elfNN_bfd_reloc_type_lookup \
   5026 	ia64_elf_reloc_type_lookup
   5027 #define bfd_elfNN_bfd_reloc_name_lookup \
   5028 	ia64_elf_reloc_name_lookup
   5029 #define bfd_elfNN_bfd_is_local_label_name \
   5030 	elfNN_ia64_is_local_label_name
   5031 #define bfd_elfNN_bfd_relax_section \
   5032 	elfNN_ia64_relax_section
   5033 
   5034 #define elf_backend_object_p \
   5035 	elfNN_ia64_object_p
   5036 
   5037 /* Stuff for the BFD linker: */
   5038 #define bfd_elfNN_bfd_link_hash_table_create \
   5039 	elfNN_ia64_hash_table_create
   5040 #define elf_backend_create_dynamic_sections \
   5041 	elfNN_ia64_create_dynamic_sections
   5042 #define elf_backend_check_relocs \
   5043 	elfNN_ia64_check_relocs
   5044 #define elf_backend_adjust_dynamic_symbol \
   5045 	elfNN_ia64_adjust_dynamic_symbol
   5046 #define elf_backend_late_size_sections \
   5047 	elfNN_ia64_late_size_sections
   5048 #define elf_backend_omit_section_dynsym \
   5049 	_bfd_elf_omit_section_dynsym_all
   5050 #define elf_backend_relocate_section \
   5051 	elfNN_ia64_relocate_section
   5052 #define elf_backend_finish_dynamic_symbol \
   5053 	elfNN_ia64_finish_dynamic_symbol
   5054 #define elf_backend_finish_dynamic_sections \
   5055 	elfNN_ia64_finish_dynamic_sections
   5056 #define bfd_elfNN_bfd_final_link \
   5057 	elfNN_ia64_final_link
   5058 
   5059 #define bfd_elfNN_bfd_merge_private_bfd_data \
   5060 	elfNN_ia64_merge_private_bfd_data
   5061 #define bfd_elfNN_bfd_set_private_flags \
   5062 	elfNN_ia64_set_private_flags
   5063 #define bfd_elfNN_bfd_print_private_bfd_data \
   5064 	elfNN_ia64_print_private_bfd_data
   5065 
   5066 #define elf_backend_plt_readonly	1
   5067 #define elf_backend_can_gc_sections	1
   5068 #define elf_backend_want_plt_sym	0
   5069 #define elf_backend_plt_alignment	5
   5070 #define elf_backend_got_header_size	0
   5071 #define elf_backend_want_got_plt	1
   5072 #define elf_backend_may_use_rel_p	1
   5073 #define elf_backend_may_use_rela_p	1
   5074 #define elf_backend_default_use_rela_p	1
   5075 #define elf_backend_want_dynbss		0
   5076 #define elf_backend_copy_indirect_symbol elfNN_ia64_hash_copy_indirect
   5077 #define elf_backend_hide_symbol		elfNN_ia64_hash_hide_symbol
   5078 #define elf_backend_fixup_symbol	_bfd_elf_link_hash_fixup_symbol
   5079 #define elf_backend_reloc_type_class	elfNN_ia64_reloc_type_class
   5080 #define elf_backend_rela_normal		1
   5081 #define elf_backend_dtrel_excludes_plt	1
   5082 #define elf_backend_special_sections	elfNN_ia64_special_sections
   5083 #define elf_backend_default_execstack	0
   5084 
   5085 /* FIXME: PR 290: The Intel C compiler generates SHT_IA_64_UNWIND with
   5086    SHF_LINK_ORDER. But it doesn't set the sh_link or sh_info fields.
   5087    We don't want to flood users with so many error messages. We turn
   5088    off the warning for now. It will be turned on later when the Intel
   5089    compiler is fixed.   */
   5090 #define elf_backend_link_order_error_handler ignore_errors
   5091 
   5092 #include "elfNN-target.h"
   5093 
   5094 /* HPUX-specific vectors.  */
   5095 
   5096 #undef  TARGET_LITTLE_SYM
   5097 #undef  TARGET_LITTLE_NAME
   5098 #undef  TARGET_BIG_SYM
   5099 #define TARGET_BIG_SYM			ia64_elfNN_hpux_be_vec
   5100 #undef	TARGET_BIG_NAME
   5101 #define TARGET_BIG_NAME			"elfNN-ia64-hpux-big"
   5102 
   5103 /* These are HP-UX specific functions.  */
   5104 
   5105 #undef  elf_backend_init_file_header
   5106 #define elf_backend_init_file_header elfNN_hpux_init_file_header
   5107 
   5108 #undef  elf_backend_section_from_bfd_section
   5109 #define elf_backend_section_from_bfd_section elfNN_hpux_backend_section_from_bfd_section
   5110 
   5111 #undef elf_backend_symbol_processing
   5112 #define elf_backend_symbol_processing elfNN_hpux_backend_symbol_processing
   5113 
   5114 #undef  elf_backend_want_p_paddr_set_to_zero
   5115 #define elf_backend_want_p_paddr_set_to_zero 1
   5116 
   5117 #undef ELF_COMMONPAGESIZE
   5118 #undef ELF_OSABI
   5119 #define ELF_OSABI			ELFOSABI_HPUX
   5120 
   5121 #undef  elfNN_bed
   5122 #define elfNN_bed elfNN_ia64_hpux_bed
   5123 
   5124 #include "elfNN-target.h"
   5125