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