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