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