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