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