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