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