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