2001-02-06 H.J. Lu <hjl@gnu.org>
[external/binutils.git] / bfd / elf64-alpha.c
1 /* Alpha specific support for 64-bit ELF
2    Copyright 1996, 97, 98, 1999 Free Software Foundation, Inc.
3    Contributed by Richard Henderson <rth@tamu.edu>.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
20
21 /* We need a published ABI spec for this.  Until one comes out, don't
22    assume this'll remain unchanged forever.  */
23
24 #include "bfd.h"
25 #include "sysdep.h"
26 #include "libbfd.h"
27 #include "elf-bfd.h"
28
29 #include "elf/alpha.h"
30
31 #define ALPHAECOFF
32
33 #define NO_COFF_RELOCS
34 #define NO_COFF_SYMBOLS
35 #define NO_COFF_LINENOS
36
37 /* Get the ECOFF swapping routines.  Needed for the debug information.  */
38 #include "coff/internal.h"
39 #include "coff/sym.h"
40 #include "coff/symconst.h"
41 #include "coff/ecoff.h"
42 #include "coff/alpha.h"
43 #include "aout/ar.h"
44 #include "libcoff.h"
45 #include "libecoff.h"
46 #define ECOFF_64
47 #include "ecoffswap.h"
48
49 static int alpha_elf_dynamic_symbol_p
50   PARAMS((struct elf_link_hash_entry *, struct bfd_link_info *));
51 static struct bfd_hash_entry * elf64_alpha_link_hash_newfunc
52   PARAMS((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
53 static struct bfd_link_hash_table * elf64_alpha_bfd_link_hash_table_create
54   PARAMS((bfd *));
55
56 static bfd_reloc_status_type elf64_alpha_reloc_nil
57   PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
58 static bfd_reloc_status_type elf64_alpha_reloc_bad
59   PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
60 static bfd_reloc_status_type elf64_alpha_do_reloc_gpdisp
61   PARAMS((bfd *, bfd_vma, bfd_byte *, bfd_byte *));
62 static bfd_reloc_status_type elf64_alpha_reloc_gpdisp
63   PARAMS((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
64
65 static reloc_howto_type * elf64_alpha_bfd_reloc_type_lookup
66   PARAMS((bfd *, bfd_reloc_code_real_type));
67 static void elf64_alpha_info_to_howto
68   PARAMS((bfd *, arelent *, Elf64_Internal_Rela *));
69
70 static boolean elf64_alpha_mkobject
71   PARAMS((bfd *));
72 static boolean elf64_alpha_object_p
73   PARAMS((bfd *));
74 static boolean elf64_alpha_section_from_shdr
75   PARAMS((bfd *, Elf64_Internal_Shdr *, char *));
76 static boolean elf64_alpha_fake_sections
77   PARAMS((bfd *, Elf64_Internal_Shdr *, asection *));
78 static boolean elf64_alpha_create_got_section
79   PARAMS((bfd *, struct bfd_link_info *));
80 static boolean elf64_alpha_create_dynamic_sections
81   PARAMS((bfd *, struct bfd_link_info *));
82
83 static boolean elf64_alpha_read_ecoff_info
84   PARAMS((bfd *, asection *, struct ecoff_debug_info *));
85 static boolean elf64_alpha_is_local_label_name
86   PARAMS((bfd *, const char *));
87 static boolean elf64_alpha_find_nearest_line
88   PARAMS((bfd *, asection *, asymbol **, bfd_vma, const char **,
89           const char **, unsigned int *));
90
91 #if defined(__STDC__) || defined(ALMOST_STDC)
92 struct alpha_elf_link_hash_entry;
93 #endif
94
95 static boolean elf64_alpha_output_extsym
96   PARAMS((struct alpha_elf_link_hash_entry *, PTR));
97
98 static boolean elf64_alpha_can_merge_gots
99   PARAMS((bfd *, bfd *));
100 static void elf64_alpha_merge_gots
101   PARAMS((bfd *, bfd *));
102 static boolean elf64_alpha_calc_got_offsets_for_symbol
103   PARAMS ((struct alpha_elf_link_hash_entry *, PTR));
104 static void elf64_alpha_calc_got_offsets PARAMS ((struct bfd_link_info *));
105 static boolean elf64_alpha_size_got_sections
106   PARAMS ((bfd *, struct bfd_link_info *));
107 static boolean elf64_alpha_always_size_sections
108   PARAMS ((bfd *, struct bfd_link_info *));
109 static boolean elf64_alpha_calc_dynrel_sizes
110   PARAMS ((struct alpha_elf_link_hash_entry *, struct bfd_link_info *));
111 static boolean elf64_alpha_add_symbol_hook
112   PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
113            const char **, flagword *, asection **, bfd_vma *));
114 static boolean elf64_alpha_check_relocs
115   PARAMS((bfd *, struct bfd_link_info *, asection *sec,
116           const Elf_Internal_Rela *));
117 static boolean elf64_alpha_adjust_dynamic_symbol
118   PARAMS((struct bfd_link_info *, struct elf_link_hash_entry *));
119 static boolean elf64_alpha_size_dynamic_sections
120   PARAMS((bfd *, struct bfd_link_info *));
121 static boolean elf64_alpha_relocate_section
122   PARAMS((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
123           Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
124 static boolean elf64_alpha_finish_dynamic_symbol
125   PARAMS((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
126           Elf_Internal_Sym *));
127 static boolean elf64_alpha_finish_dynamic_sections
128   PARAMS((bfd *, struct bfd_link_info *));
129 static boolean elf64_alpha_final_link
130   PARAMS((bfd *, struct bfd_link_info *));
131 static boolean elf64_alpha_merge_ind_symbols
132   PARAMS((struct alpha_elf_link_hash_entry *, PTR));
133 static Elf_Internal_Rela * elf64_alpha_find_reloc_at_ofs
134   PARAMS ((Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_vma, int));
135 \f
136 struct alpha_elf_link_hash_entry
137 {
138   struct elf_link_hash_entry root;
139
140   /* External symbol information.  */
141   EXTR esym;
142
143   /* Cumulative flags for all the .got entries.  */
144   int flags;
145
146   /* Contexts (LITUSE) in which a literal was referenced.  */
147 #define ALPHA_ELF_LINK_HASH_LU_ADDR 0x01
148 #define ALPHA_ELF_LINK_HASH_LU_MEM  0x02
149 #define ALPHA_ELF_LINK_HASH_LU_BYTE 0x04
150 #define ALPHA_ELF_LINK_HASH_LU_FUNC 0x08
151
152   /* Used to implement multiple .got subsections.  */
153   struct alpha_elf_got_entry
154   {
155     struct alpha_elf_got_entry *next;
156
157     /* which .got subsection?  */
158     bfd *gotobj;
159
160     /* the addend in effect for this entry.  */
161     bfd_vma addend;
162
163     /* the .got offset for this entry.  */
164     int got_offset;
165
166     int flags;
167
168     /* An additional flag.  */
169 #define ALPHA_ELF_GOT_ENTRY_RELOCS_DONE 0x10
170
171     int use_count;
172   } *got_entries;
173
174   /* used to count non-got, non-plt relocations for delayed sizing
175      of relocation sections.  */
176   struct alpha_elf_reloc_entry
177   {
178     struct alpha_elf_reloc_entry *next;
179
180     /* which .reloc section? */
181     asection *srel;
182
183     /* what kind of relocation? */
184     unsigned long rtype;
185
186     /* how many did we find?  */
187     unsigned long count;
188   } *reloc_entries;
189 };
190
191 /* Alpha ELF linker hash table.  */
192
193 struct alpha_elf_link_hash_table
194 {
195   struct elf_link_hash_table root;
196
197   /* The head of a list of .got subsections linked through
198      alpha_elf_tdata(abfd)->got_link_next.  */
199   bfd *got_list;
200 };
201
202 /* Look up an entry in a Alpha ELF linker hash table.  */
203
204 #define alpha_elf_link_hash_lookup(table, string, create, copy, follow) \
205   ((struct alpha_elf_link_hash_entry *)                                 \
206    elf_link_hash_lookup (&(table)->root, (string), (create),            \
207                          (copy), (follow)))
208
209 /* Traverse a Alpha ELF linker hash table.  */
210
211 #define alpha_elf_link_hash_traverse(table, func, info)                 \
212   (elf_link_hash_traverse                                               \
213    (&(table)->root,                                                     \
214     (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func),  \
215     (info)))
216
217 /* Get the Alpha ELF linker hash table from a link_info structure.  */
218
219 #define alpha_elf_hash_table(p) \
220   ((struct alpha_elf_link_hash_table *) ((p)->hash))
221
222 /* Get the object's symbols as our own entry type.  */
223
224 #define alpha_elf_sym_hashes(abfd) \
225   ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
226
227 /* Should we do dynamic things to this symbol?  */
228
229 static int
230 alpha_elf_dynamic_symbol_p (h, info)
231      struct elf_link_hash_entry *h;
232      struct bfd_link_info *info;
233 {
234   if (h == NULL)
235     return false;
236
237   while (h->root.type == bfd_link_hash_indirect
238          || h->root.type == bfd_link_hash_warning)
239     h = (struct elf_link_hash_entry *) h->root.u.i.link;
240
241   if (h->dynindx == -1)
242     return false;
243   switch (ELF_ST_VISIBILITY (h->other))
244     {
245     case STV_INTERNAL:
246     case STV_HIDDEN:
247       return false;
248     }
249
250   if (h->root.type == bfd_link_hash_undefweak
251       || h->root.type == bfd_link_hash_defweak)
252     return true;
253
254   if ((info->shared && !info->symbolic)
255       || ((h->elf_link_hash_flags
256            & (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR))
257           == (ELF_LINK_HASH_DEF_DYNAMIC | ELF_LINK_HASH_REF_REGULAR)))
258     return true;
259
260   return false;
261 }
262
263 /* Create an entry in a Alpha ELF linker hash table.  */
264
265 static struct bfd_hash_entry *
266 elf64_alpha_link_hash_newfunc (entry, table, string)
267      struct bfd_hash_entry *entry;
268      struct bfd_hash_table *table;
269      const char *string;
270 {
271   struct alpha_elf_link_hash_entry *ret =
272     (struct alpha_elf_link_hash_entry *) entry;
273
274   /* Allocate the structure if it has not already been allocated by a
275      subclass.  */
276   if (ret == (struct alpha_elf_link_hash_entry *) NULL)
277     ret = ((struct alpha_elf_link_hash_entry *)
278            bfd_hash_allocate (table,
279                               sizeof (struct alpha_elf_link_hash_entry)));
280   if (ret == (struct alpha_elf_link_hash_entry *) NULL)
281     return (struct bfd_hash_entry *) ret;
282
283   /* Call the allocation method of the superclass.  */
284   ret = ((struct alpha_elf_link_hash_entry *)
285          _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
286                                      table, string));
287   if (ret != (struct alpha_elf_link_hash_entry *) NULL)
288     {
289       /* Set local fields.  */
290       memset (&ret->esym, 0, sizeof (EXTR));
291       /* We use -2 as a marker to indicate that the information has
292          not been set.  -1 means there is no associated ifd.  */
293       ret->esym.ifd = -2;
294       ret->flags = 0;
295       ret->got_entries = NULL;
296       ret->reloc_entries = NULL;
297     }
298
299   return (struct bfd_hash_entry *) ret;
300 }
301
302 /* Create a Alpha ELF linker hash table.  */
303
304 static struct bfd_link_hash_table *
305 elf64_alpha_bfd_link_hash_table_create (abfd)
306      bfd *abfd;
307 {
308   struct alpha_elf_link_hash_table *ret;
309
310   ret = ((struct alpha_elf_link_hash_table *)
311          bfd_zalloc (abfd, sizeof (struct alpha_elf_link_hash_table)));
312   if (ret == (struct alpha_elf_link_hash_table *) NULL)
313     return NULL;
314
315   if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
316                                        elf64_alpha_link_hash_newfunc))
317     {
318       bfd_release (abfd, ret);
319       return NULL;
320     }
321
322   return &ret->root.root;
323 }
324 \f
325 /* We have some private fields hanging off of the elf_tdata structure.  */
326
327 struct alpha_elf_obj_tdata
328 {
329   struct elf_obj_tdata root;
330
331   /* For every input file, these are the got entries for that object's
332      local symbols.  */
333   struct alpha_elf_got_entry ** local_got_entries;
334
335   /* For every input file, this is the object that owns the got that
336      this input file uses.  */
337   bfd *gotobj;
338
339   /* For every got, this is a linked list through the objects using this got */
340   bfd *in_got_link_next;
341
342   /* For every got, this is a link to the next got subsegment.  */
343   bfd *got_link_next;
344
345   /* For every got, this is the section.  */
346   asection *got;
347
348   /* For every got, this is it's total number of *entries*.  */
349   int total_got_entries;
350
351   /* For every got, this is the sum of the number of *entries* required
352      to hold all of the member object's local got.  */
353   int n_local_got_entries;
354 };
355
356 #define alpha_elf_tdata(abfd) \
357   ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
358
359 static boolean
360 elf64_alpha_mkobject (abfd)
361      bfd *abfd;
362 {
363   abfd->tdata.any = bfd_zalloc (abfd, sizeof (struct alpha_elf_obj_tdata));
364   if (abfd->tdata.any == NULL)
365     return false;
366   return true;
367 }
368
369 static boolean
370 elf64_alpha_object_p (abfd)
371      bfd *abfd;
372 {
373   /* Allocate our special target data.  */
374   struct alpha_elf_obj_tdata *new_tdata;
375   new_tdata = bfd_zalloc (abfd, sizeof (struct alpha_elf_obj_tdata));
376   if (new_tdata == NULL)
377     return false;
378   new_tdata->root = *abfd->tdata.elf_obj_data;
379   abfd->tdata.any = new_tdata;
380
381   /* Set the right machine number for an Alpha ELF file.  */
382   return bfd_default_set_arch_mach (abfd, bfd_arch_alpha, 0);
383 }
384 \f
385 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
386    from smaller values.  Start with zero, widen, *then* decrement.  */
387 #define MINUS_ONE       (((bfd_vma)0) - 1)
388
389 static reloc_howto_type elf64_alpha_howto_table[] =
390 {
391   HOWTO (R_ALPHA_NONE,          /* type */
392          0,                     /* rightshift */
393          0,                     /* size (0 = byte, 1 = short, 2 = long) */
394          8,                     /* bitsize */
395          true,                  /* pc_relative */
396          0,                     /* bitpos */
397          complain_overflow_dont, /* complain_on_overflow */
398          elf64_alpha_reloc_nil, /* special_function */
399          "NONE",                /* name */
400          false,                 /* partial_inplace */
401          0,                     /* src_mask */
402          0,                     /* dst_mask */
403          true),                 /* pcrel_offset */
404
405   /* A 32 bit reference to a symbol.  */
406   HOWTO (R_ALPHA_REFLONG,       /* type */
407          0,                     /* rightshift */
408          2,                     /* size (0 = byte, 1 = short, 2 = long) */
409          32,                    /* bitsize */
410          false,                 /* pc_relative */
411          0,                     /* bitpos */
412          complain_overflow_bitfield, /* complain_on_overflow */
413          0,                     /* special_function */
414          "REFLONG",             /* name */
415          false,                 /* partial_inplace */
416          0xffffffff,            /* src_mask */
417          0xffffffff,            /* dst_mask */
418          false),                /* pcrel_offset */
419
420   /* A 64 bit reference to a symbol.  */
421   HOWTO (R_ALPHA_REFQUAD,       /* type */
422          0,                     /* rightshift */
423          4,                     /* size (0 = byte, 1 = short, 2 = long) */
424          64,                    /* bitsize */
425          false,                 /* pc_relative */
426          0,                     /* bitpos */
427          complain_overflow_bitfield, /* complain_on_overflow */
428          0,                     /* special_function */
429          "REFQUAD",             /* name */
430          false,                 /* partial_inplace */
431          MINUS_ONE,             /* src_mask */
432          MINUS_ONE,             /* dst_mask */
433          false),                /* pcrel_offset */
434
435   /* A 32 bit GP relative offset.  This is just like REFLONG except
436      that when the value is used the value of the gp register will be
437      added in.  */
438   HOWTO (R_ALPHA_GPREL32,       /* type */
439          0,                     /* rightshift */
440          2,                     /* size (0 = byte, 1 = short, 2 = long) */
441          32,                    /* bitsize */
442          false,                 /* pc_relative */
443          0,                     /* bitpos */
444          complain_overflow_bitfield, /* complain_on_overflow */
445          0,                     /* special_function */
446          "GPREL32",             /* name */
447          false,                 /* partial_inplace */
448          0xffffffff,            /* src_mask */
449          0xffffffff,            /* dst_mask */
450          false),                /* pcrel_offset */
451
452   /* Used for an instruction that refers to memory off the GP register.  */
453   HOWTO (R_ALPHA_LITERAL,       /* type */
454          0,                     /* rightshift */
455          2,                     /* size (0 = byte, 1 = short, 2 = long) */
456          16,                    /* bitsize */
457          false,                 /* pc_relative */
458          0,                     /* bitpos */
459          complain_overflow_signed, /* complain_on_overflow */
460          0,                     /* special_function */
461          "ELF_LITERAL",         /* name */
462          false,                 /* partial_inplace */
463          0xffff,                /* src_mask */
464          0xffff,                /* dst_mask */
465          false),                /* pcrel_offset */
466
467   /* This reloc only appears immediately following an ELF_LITERAL reloc.
468      It identifies a use of the literal.  The symbol index is special:
469      1 means the literal address is in the base register of a memory
470      format instruction; 2 means the literal address is in the byte
471      offset register of a byte-manipulation instruction; 3 means the
472      literal address is in the target register of a jsr instruction.
473      This does not actually do any relocation.  */
474   HOWTO (R_ALPHA_LITUSE,        /* type */
475          0,                     /* rightshift */
476          2,                     /* size (0 = byte, 1 = short, 2 = long) */
477          32,                    /* bitsize */
478          false,                 /* pc_relative */
479          0,                     /* bitpos */
480          complain_overflow_dont, /* complain_on_overflow */
481          elf64_alpha_reloc_nil, /* special_function */
482          "LITUSE",              /* name */
483          false,                 /* partial_inplace */
484          0,                     /* src_mask */
485          0,                     /* dst_mask */
486          false),                /* pcrel_offset */
487
488   /* Load the gp register.  This is always used for a ldah instruction
489      which loads the upper 16 bits of the gp register.  The symbol
490      index of the GPDISP instruction is an offset in bytes to the lda
491      instruction that loads the lower 16 bits.  The value to use for
492      the relocation is the difference between the GP value and the
493      current location; the load will always be done against a register
494      holding the current address.
495
496      NOTE: Unlike ECOFF, partial in-place relocation is not done.  If
497      any offset is present in the instructions, it is an offset from
498      the register to the ldah instruction.  This lets us avoid any
499      stupid hackery like inventing a gp value to do partial relocation
500      against.  Also unlike ECOFF, we do the whole relocation off of
501      the GPDISP rather than a GPDISP_HI16/GPDISP_LO16 pair.  An odd,
502      space consuming bit, that, since all the information was present
503      in the GPDISP_HI16 reloc.  */
504   HOWTO (R_ALPHA_GPDISP,        /* type */
505          16,                    /* rightshift */
506          2,                     /* size (0 = byte, 1 = short, 2 = long) */
507          16,                    /* bitsize */
508          false,                 /* pc_relative */
509          0,                     /* bitpos */
510          complain_overflow_dont, /* complain_on_overflow */
511          elf64_alpha_reloc_gpdisp, /* special_function */
512          "GPDISP",              /* name */
513          false,                 /* partial_inplace */
514          0xffff,                /* src_mask */
515          0xffff,                /* dst_mask */
516          true),                 /* pcrel_offset */
517
518   /* A 21 bit branch.  */
519   HOWTO (R_ALPHA_BRADDR,        /* type */
520          2,                     /* rightshift */
521          2,                     /* size (0 = byte, 1 = short, 2 = long) */
522          21,                    /* bitsize */
523          true,                  /* pc_relative */
524          0,                     /* bitpos */
525          complain_overflow_signed, /* complain_on_overflow */
526          0,                     /* special_function */
527          "BRADDR",              /* name */
528          false,                 /* partial_inplace */
529          0x1fffff,              /* src_mask */
530          0x1fffff,              /* dst_mask */
531          true),                 /* pcrel_offset */
532
533   /* A hint for a jump to a register.  */
534   HOWTO (R_ALPHA_HINT,          /* type */
535          2,                     /* rightshift */
536          2,                     /* size (0 = byte, 1 = short, 2 = long) */
537          14,                    /* bitsize */
538          true,                  /* pc_relative */
539          0,                     /* bitpos */
540          complain_overflow_dont, /* complain_on_overflow */
541          0,                     /* special_function */
542          "HINT",                /* name */
543          false,                 /* partial_inplace */
544          0x3fff,                /* src_mask */
545          0x3fff,                /* dst_mask */
546          true),                 /* pcrel_offset */
547
548   /* 16 bit PC relative offset.  */
549   HOWTO (R_ALPHA_SREL16,        /* type */
550          0,                     /* rightshift */
551          1,                     /* size (0 = byte, 1 = short, 2 = long) */
552          16,                    /* bitsize */
553          true,                  /* pc_relative */
554          0,                     /* bitpos */
555          complain_overflow_signed, /* complain_on_overflow */
556          0,                     /* special_function */
557          "SREL16",              /* name */
558          false,                 /* partial_inplace */
559          0xffff,                /* src_mask */
560          0xffff,                /* dst_mask */
561          false),                /* pcrel_offset */
562
563   /* 32 bit PC relative offset.  */
564   HOWTO (R_ALPHA_SREL32,        /* type */
565          0,                     /* rightshift */
566          2,                     /* size (0 = byte, 1 = short, 2 = long) */
567          32,                    /* bitsize */
568          true,                  /* pc_relative */
569          0,                     /* bitpos */
570          complain_overflow_signed, /* complain_on_overflow */
571          0,                     /* special_function */
572          "SREL32",              /* name */
573          false,                 /* partial_inplace */
574          0xffffffff,            /* src_mask */
575          0xffffffff,            /* dst_mask */
576          false),                /* pcrel_offset */
577
578   /* A 64 bit PC relative offset.  */
579   HOWTO (R_ALPHA_SREL64,        /* type */
580          0,                     /* rightshift */
581          4,                     /* size (0 = byte, 1 = short, 2 = long) */
582          64,                    /* bitsize */
583          true,                  /* pc_relative */
584          0,                     /* bitpos */
585          complain_overflow_signed, /* complain_on_overflow */
586          0,                     /* special_function */
587          "SREL64",              /* name */
588          false,                 /* partial_inplace */
589          MINUS_ONE,             /* src_mask */
590          MINUS_ONE,             /* dst_mask */
591          false),                /* pcrel_offset */
592
593   /* Push a value on the reloc evaluation stack.  */
594   /* Not implemented -- it's dumb.  */
595   HOWTO (R_ALPHA_OP_PUSH,       /* type */
596          0,                     /* rightshift */
597          0,                     /* size (0 = byte, 1 = short, 2 = long) */
598          0,                     /* bitsize */
599          false,                 /* pc_relative */
600          0,                     /* bitpos */
601          complain_overflow_dont, /* complain_on_overflow */
602          elf64_alpha_reloc_bad, /* special_function */
603          "OP_PUSH",             /* name */
604          false,                 /* partial_inplace */
605          0,                     /* src_mask */
606          0,                     /* dst_mask */
607          false),                /* pcrel_offset */
608
609   /* Store the value from the stack at the given address.  Store it in
610      a bitfield of size r_size starting at bit position r_offset.  */
611   /* Not implemented -- it's dumb.  */
612   HOWTO (R_ALPHA_OP_STORE,      /* type */
613          0,                     /* rightshift */
614          4,                     /* size (0 = byte, 1 = short, 2 = long) */
615          64,                    /* bitsize */
616          false,                 /* pc_relative */
617          0,                     /* bitpos */
618          complain_overflow_dont, /* complain_on_overflow */
619          elf64_alpha_reloc_bad, /* special_function */
620          "OP_STORE",            /* name */
621          false,                 /* partial_inplace */
622          0,                     /* src_mask */
623          MINUS_ONE,             /* dst_mask */
624          false),                /* pcrel_offset */
625
626   /* Subtract the reloc address from the value on the top of the
627      relocation stack.  */
628   /* Not implemented -- it's dumb.  */
629   HOWTO (R_ALPHA_OP_PSUB,       /* type */
630          0,                     /* rightshift */
631          0,                     /* size (0 = byte, 1 = short, 2 = long) */
632          0,                     /* bitsize */
633          false,                 /* pc_relative */
634          0,                     /* bitpos */
635          complain_overflow_dont, /* complain_on_overflow */
636          elf64_alpha_reloc_bad, /* special_function */
637          "OP_PSUB",             /* name */
638          false,                 /* partial_inplace */
639          0,                     /* src_mask */
640          0,                     /* dst_mask */
641          false),                /* pcrel_offset */
642
643   /* Shift the value on the top of the relocation stack right by the
644      given value.  */
645   /* Not implemented -- it's dumb.  */
646   HOWTO (R_ALPHA_OP_PRSHIFT,    /* type */
647          0,                     /* rightshift */
648          0,                     /* size (0 = byte, 1 = short, 2 = long) */
649          0,                     /* bitsize */
650          false,                 /* pc_relative */
651          0,                     /* bitpos */
652          complain_overflow_dont, /* complain_on_overflow */
653          elf64_alpha_reloc_bad, /* special_function */
654          "OP_PRSHIFT",          /* name */
655          false,                 /* partial_inplace */
656          0,                     /* src_mask */
657          0,                     /* dst_mask */
658          false),                /* pcrel_offset */
659
660   /* Change the value of GP used by +r_addend until the next GPVALUE or the
661      end of the input bfd.  */
662   /* Not implemented -- it's dumb.  */
663   HOWTO (R_ALPHA_GPVALUE,
664          0,                     /* rightshift */
665          0,                     /* size (0 = byte, 1 = short, 2 = long) */
666          0,                     /* bitsize */
667          false,                 /* pc_relative */
668          0,                     /* bitpos */
669          complain_overflow_dont, /* complain_on_overflow */
670          elf64_alpha_reloc_bad, /* special_function */
671          "GPVALUE",             /* name */
672          false,                 /* partial_inplace */
673          0,                     /* src_mask */
674          0,                     /* dst_mask */
675          false),                /* pcrel_offset */
676
677   /* The high 16 bits of the displacement from GP to the target.  */
678   HOWTO (R_ALPHA_GPRELHIGH,
679          0,                     /* rightshift */
680          2,                     /* size (0 = byte, 1 = short, 2 = long) */
681          16,                    /* bitsize */
682          false,                 /* pc_relative */
683          0,                     /* bitpos */
684          complain_overflow_signed, /* complain_on_overflow */
685          elf64_alpha_reloc_bad, /* special_function */
686          "GPRELHIGH",           /* name */
687          false,                 /* partial_inplace */
688          0xffff,                /* src_mask */
689          0xffff,                /* dst_mask */
690          false),                /* pcrel_offset */
691
692   /* The low 16 bits of the displacement from GP to the target.  */
693   HOWTO (R_ALPHA_GPRELLOW,
694          0,                     /* rightshift */
695          2,                     /* size (0 = byte, 1 = short, 2 = long) */
696          16,                    /* bitsize */
697          false,                 /* pc_relative */
698          0,                     /* bitpos */
699          complain_overflow_dont, /* complain_on_overflow */
700          elf64_alpha_reloc_bad, /* special_function */
701          "GPRELLOW",            /* name */
702          false,                 /* partial_inplace */
703          0xffff,                /* src_mask */
704          0xffff,                /* dst_mask */
705          false),                /* pcrel_offset */
706
707   /* A 16-bit displacement from the GP to the target.  */
708   /* XXX: Not implemented.  */
709   HOWTO (R_ALPHA_IMMED_GP_16,
710          0,                     /* rightshift */
711          2,                     /* size (0 = byte, 1 = short, 2 = long) */
712          16,                    /* bitsize */
713          false,                 /* pc_relative */
714          0,                     /* bitpos */
715          complain_overflow_signed, /* complain_on_overflow */
716          0,                     /* special_function */
717          "IMMED_GP_16",         /* name */
718          false,                 /* partial_inplace */
719          0xffff,                /* src_mask */
720          0xffff,                /* dst_mask */
721          false),                /* pcrel_offset */
722
723   /* The high bits of a 32-bit displacement from the GP to the target; the
724      low bits are supplied in the subsequent R_ALPHA_IMMED_LO32 relocs.  */
725   /* XXX: Not implemented.  */
726   HOWTO (R_ALPHA_IMMED_GP_HI32,
727          0,                     /* rightshift */
728          0,                     /* size (0 = byte, 1 = short, 2 = long) */
729          0,                     /* bitsize */
730          false,                 /* pc_relative */
731          0,                     /* bitpos */
732          complain_overflow_dont, /* complain_on_overflow */
733          elf64_alpha_reloc_bad, /* special_function */
734          "IMMED_GP_HI32",               /* name */
735          false,                 /* partial_inplace */
736          0,                     /* src_mask */
737          0,                     /* dst_mask */
738          false),                /* pcrel_offset */
739
740   /* The high bits of a 32-bit displacement to the starting address of the
741      current section (the relocation target is ignored); the low bits are
742      supplied in the subsequent R_ALPHA_IMMED_LO32 relocs.  */
743   /* XXX: Not implemented.  */
744   HOWTO (R_ALPHA_IMMED_SCN_HI32,
745          0,                     /* rightshift */
746          0,                     /* size (0 = byte, 1 = short, 2 = long) */
747          0,                     /* bitsize */
748          false,                 /* pc_relative */
749          0,                     /* bitpos */
750          complain_overflow_dont, /* complain_on_overflow */
751          elf64_alpha_reloc_bad, /* special_function */
752          "IMMED_SCN_HI32",              /* name */
753          false,                 /* partial_inplace */
754          0,                     /* src_mask */
755          0,                     /* dst_mask */
756          false),                /* pcrel_offset */
757
758   /* The high bits of a 32-bit displacement from the previous br, bsr, jsr
759      or jmp insn (as tagged by a BRADDR or HINT reloc) to the target; the
760      low bits are supplied by subsequent R_ALPHA_IMMED_LO32 relocs.  */
761   /* XXX: Not implemented.  */
762   HOWTO (R_ALPHA_IMMED_BR_HI32,
763          0,                     /* rightshift */
764          0,                     /* size (0 = byte, 1 = short, 2 = long) */
765          0,                     /* bitsize */
766          false,                 /* pc_relative */
767          0,                     /* bitpos */
768          complain_overflow_dont, /* complain_on_overflow */
769          elf64_alpha_reloc_bad, /* special_function */
770          "IMMED_BR_HI32",               /* name */
771          false,                 /* partial_inplace */
772          0,                     /* src_mask */
773          0,                     /* dst_mask */
774          false),                /* pcrel_offset */
775
776   /* The low 16 bits of a displacement calculated in a previous HI32 reloc.  */
777   /* XXX: Not implemented.  */
778   HOWTO (R_ALPHA_IMMED_LO32,
779          0,                     /* rightshift */
780          0,                     /* size (0 = byte, 1 = short, 2 = long) */
781          0,                     /* bitsize */
782          false,                 /* pc_relative */
783          0,                     /* bitpos */
784          complain_overflow_dont, /* complain_on_overflow */
785          elf64_alpha_reloc_bad, /* special_function */
786          "IMMED_LO32",          /* name */
787          false,                 /* partial_inplace */
788          0,                     /* src_mask */
789          0,                     /* dst_mask */
790          false),                /* pcrel_offset */
791
792   /* Misc ELF relocations.  */
793
794   /* A dynamic relocation to copy the target into our .dynbss section.  */
795   /* Not generated, as all Alpha objects use PIC, so it is not needed.  It
796      is present because every other ELF has one, but should not be used
797      because .dynbss is an ugly thing.  */
798   HOWTO (R_ALPHA_COPY,
799          0,
800          0,
801          0,
802          false,
803          0,
804          complain_overflow_dont,
805          bfd_elf_generic_reloc,
806          "COPY",
807          false,
808          0,
809          0,
810          true),
811
812   /* A dynamic relocation for a .got entry.  */
813   HOWTO (R_ALPHA_GLOB_DAT,
814          0,
815          0,
816          0,
817          false,
818          0,
819          complain_overflow_dont,
820          bfd_elf_generic_reloc,
821          "GLOB_DAT",
822          false,
823          0,
824          0,
825          true),
826
827   /* A dynamic relocation for a .plt entry.  */
828   HOWTO (R_ALPHA_JMP_SLOT,
829          0,
830          0,
831          0,
832          false,
833          0,
834          complain_overflow_dont,
835          bfd_elf_generic_reloc,
836          "JMP_SLOT",
837          false,
838          0,
839          0,
840          true),
841
842   /* A dynamic relocation to add the base of the DSO to a 64-bit field.  */
843   HOWTO (R_ALPHA_RELATIVE,
844          0,
845          0,
846          0,
847          false,
848          0,
849          complain_overflow_dont,
850          bfd_elf_generic_reloc,
851          "RELATIVE",
852          false,
853          0,
854          0,
855          true)
856 };
857
858 /* A relocation function which doesn't do anything.  */
859
860 static bfd_reloc_status_type
861 elf64_alpha_reloc_nil (abfd, reloc, sym, data, sec, output_bfd, error_message)
862      bfd *abfd;
863      arelent *reloc;
864      asymbol *sym;
865      PTR data;
866      asection *sec;
867      bfd *output_bfd;
868      char **error_message;
869 {
870   if (output_bfd)
871     reloc->address += sec->output_offset;
872   return bfd_reloc_ok;
873 }
874
875 /* A relocation function used for an unsupported reloc.  */
876
877 static bfd_reloc_status_type
878 elf64_alpha_reloc_bad (abfd, reloc, sym, data, sec, output_bfd, error_message)
879      bfd *abfd;
880      arelent *reloc;
881      asymbol *sym;
882      PTR data;
883      asection *sec;
884      bfd *output_bfd;
885      char **error_message;
886 {
887   if (output_bfd)
888     reloc->address += sec->output_offset;
889   return bfd_reloc_notsupported;
890 }
891
892 /* Do the work of the GPDISP relocation.  */
893
894 static bfd_reloc_status_type
895 elf64_alpha_do_reloc_gpdisp (abfd, gpdisp, p_ldah, p_lda)
896      bfd *abfd;
897      bfd_vma gpdisp;
898      bfd_byte *p_ldah;
899      bfd_byte *p_lda;
900 {
901   bfd_reloc_status_type ret = bfd_reloc_ok;
902   bfd_vma addend;
903   unsigned long i_ldah, i_lda;
904
905   i_ldah = bfd_get_32 (abfd, p_ldah);
906   i_lda = bfd_get_32 (abfd, p_lda);
907
908   /* Complain if the instructions are not correct.  */
909   if (((i_ldah >> 26) & 0x3f) != 0x09
910       || ((i_lda >> 26) & 0x3f) != 0x08)
911     ret = bfd_reloc_dangerous;
912
913   /* Extract the user-supplied offset, mirroring the sign extensions
914      that the instructions perform.  */
915   addend = ((i_ldah & 0xffff) << 16) | (i_lda & 0xffff);
916   addend = (addend ^ 0x80008000) - 0x80008000;
917
918   gpdisp += addend;
919
920   if ((bfd_signed_vma) gpdisp < -(bfd_signed_vma) 0x80000000
921       || (bfd_signed_vma) gpdisp >= (bfd_signed_vma) 0x7fff8000)
922     ret = bfd_reloc_overflow;
923
924   /* compensate for the sign extension again.  */
925   i_ldah = ((i_ldah & 0xffff0000)
926             | (((gpdisp >> 16) + ((gpdisp >> 15) & 1)) & 0xffff));
927   i_lda = (i_lda & 0xffff0000) | (gpdisp & 0xffff);
928
929   bfd_put_32 (abfd, i_ldah, p_ldah);
930   bfd_put_32 (abfd, i_lda, p_lda);
931
932   return ret;
933 }
934
935 /* The special function for the GPDISP reloc.  */
936
937 static bfd_reloc_status_type
938 elf64_alpha_reloc_gpdisp (abfd, reloc_entry, sym, data, input_section,
939                           output_bfd, err_msg)
940      bfd *abfd;
941      arelent *reloc_entry;
942      asymbol *sym;
943      PTR data;
944      asection *input_section;
945      bfd *output_bfd;
946      char **err_msg;
947 {
948   bfd_reloc_status_type ret;
949   bfd_vma gp, relocation;
950   bfd_byte *p_ldah, *p_lda;
951
952   /* Don't do anything if we're not doing a final link.  */
953   if (output_bfd)
954     {
955       reloc_entry->address += input_section->output_offset;
956       return bfd_reloc_ok;
957     }
958
959   if (reloc_entry->address > input_section->_cooked_size ||
960       reloc_entry->address + reloc_entry->addend > input_section->_cooked_size)
961     return bfd_reloc_outofrange;
962
963   /* The gp used in the portion of the output object to which this
964      input object belongs is cached on the input bfd.  */
965   gp = _bfd_get_gp_value (abfd);
966
967   relocation = (input_section->output_section->vma
968                 + input_section->output_offset
969                 + reloc_entry->address);
970
971   p_ldah = (bfd_byte *) data + reloc_entry->address;
972   p_lda = p_ldah + reloc_entry->addend;
973
974   ret = elf64_alpha_do_reloc_gpdisp (abfd, gp - relocation, p_ldah, p_lda);
975
976   /* Complain if the instructions are not correct.  */
977   if (ret == bfd_reloc_dangerous)
978     *err_msg = _("GPDISP relocation did not find ldah and lda instructions");
979
980   return ret;
981 }
982
983 /* A mapping from BFD reloc types to Alpha ELF reloc types.  */
984
985 struct elf_reloc_map
986 {
987   bfd_reloc_code_real_type bfd_reloc_val;
988   int elf_reloc_val;
989 };
990
991 static const struct elf_reloc_map elf64_alpha_reloc_map[] =
992 {
993   {BFD_RELOC_NONE,              R_ALPHA_NONE},
994   {BFD_RELOC_32,                R_ALPHA_REFLONG},
995   {BFD_RELOC_64,                R_ALPHA_REFQUAD},
996   {BFD_RELOC_CTOR,              R_ALPHA_REFQUAD},
997   {BFD_RELOC_GPREL32,           R_ALPHA_GPREL32},
998   {BFD_RELOC_ALPHA_ELF_LITERAL, R_ALPHA_LITERAL},
999   {BFD_RELOC_ALPHA_LITUSE,      R_ALPHA_LITUSE},
1000   {BFD_RELOC_ALPHA_GPDISP,      R_ALPHA_GPDISP},
1001   {BFD_RELOC_23_PCREL_S2,       R_ALPHA_BRADDR},
1002   {BFD_RELOC_ALPHA_HINT,        R_ALPHA_HINT},
1003   {BFD_RELOC_16_PCREL,          R_ALPHA_SREL16},
1004   {BFD_RELOC_32_PCREL,          R_ALPHA_SREL32},
1005   {BFD_RELOC_64_PCREL,          R_ALPHA_SREL64},
1006
1007 /* The BFD_RELOC_ALPHA_USER_* relocations are used by the assembler to process
1008    the explicit !<reloc>!sequence relocations, and are mapped into the normal
1009    relocations at the end of processing.  */
1010   {BFD_RELOC_ALPHA_USER_LITERAL,        R_ALPHA_LITERAL},
1011   {BFD_RELOC_ALPHA_USER_LITUSE_BASE,    R_ALPHA_LITUSE},
1012   {BFD_RELOC_ALPHA_USER_LITUSE_BYTOFF,  R_ALPHA_LITUSE},
1013   {BFD_RELOC_ALPHA_USER_LITUSE_JSR,     R_ALPHA_LITUSE},
1014   {BFD_RELOC_ALPHA_USER_GPDISP,         R_ALPHA_GPDISP},
1015   {BFD_RELOC_ALPHA_USER_GPRELHIGH,      R_ALPHA_GPRELHIGH},
1016   {BFD_RELOC_ALPHA_USER_GPRELLOW,       R_ALPHA_GPRELLOW},
1017 };
1018
1019 /* Given a BFD reloc type, return a HOWTO structure.  */
1020
1021 static reloc_howto_type *
1022 elf64_alpha_bfd_reloc_type_lookup (abfd, code)
1023      bfd *abfd;
1024      bfd_reloc_code_real_type code;
1025 {
1026   const struct elf_reloc_map *i, *e;
1027   i = e = elf64_alpha_reloc_map;
1028   e += sizeof (elf64_alpha_reloc_map) / sizeof (struct elf_reloc_map);
1029   for (; i != e; ++i)
1030     {
1031       if (i->bfd_reloc_val == code)
1032         return &elf64_alpha_howto_table[i->elf_reloc_val];
1033     }
1034   return 0;
1035 }
1036
1037 /* Given an Alpha ELF reloc type, fill in an arelent structure.  */
1038
1039 static void
1040 elf64_alpha_info_to_howto (abfd, cache_ptr, dst)
1041      bfd *abfd;
1042      arelent *cache_ptr;
1043      Elf64_Internal_Rela *dst;
1044 {
1045   unsigned r_type;
1046
1047   r_type = ELF64_R_TYPE(dst->r_info);
1048   BFD_ASSERT (r_type < (unsigned int) R_ALPHA_max);
1049   cache_ptr->howto = &elf64_alpha_howto_table[r_type];
1050 }
1051 \f
1052 /* These functions do relaxation for Alpha ELF.
1053
1054    Currently I'm only handling what I can do with existing compiler
1055    and assembler support, which means no instructions are removed,
1056    though some may be nopped.  At this time GCC does not emit enough
1057    information to do all of the relaxing that is possible.  It will
1058    take some not small amount of work for that to happen.
1059
1060    There are a couple of interesting papers that I once read on this
1061    subject, that I cannot find references to at the moment, that
1062    related to Alpha in particular.  They are by David Wall, then of
1063    DEC WRL.  */
1064
1065 #define OP_LDA          0x08
1066 #define OP_LDAH         0x09
1067 #define INSN_JSR        0x68004000
1068 #define INSN_JSR_MASK   0xfc00c000
1069 #define OP_LDQ          0x29
1070 #define OP_BR           0x30
1071 #define OP_BSR          0x34
1072 #define INSN_UNOP       0x2fe00000
1073
1074 struct alpha_relax_info
1075 {
1076   bfd *abfd;
1077   asection *sec;
1078   bfd_byte *contents;
1079   Elf_Internal_Rela *relocs, *relend;
1080   struct bfd_link_info *link_info;
1081   boolean changed_contents;
1082   boolean changed_relocs;
1083   bfd_vma gp;
1084   bfd *gotobj;
1085   asection *tsec;
1086   struct alpha_elf_link_hash_entry *h;
1087   struct alpha_elf_got_entry *gotent;
1088   unsigned char other;
1089 };
1090
1091 static Elf_Internal_Rela * elf64_alpha_relax_with_lituse
1092   PARAMS((struct alpha_relax_info *info, bfd_vma symval,
1093           Elf_Internal_Rela *irel, Elf_Internal_Rela *irelend));
1094
1095 static boolean elf64_alpha_relax_without_lituse
1096   PARAMS((struct alpha_relax_info *info, bfd_vma symval,
1097           Elf_Internal_Rela *irel));
1098
1099 static bfd_vma elf64_alpha_relax_opt_call
1100   PARAMS((struct alpha_relax_info *info, bfd_vma symval));
1101
1102 static boolean elf64_alpha_relax_section
1103   PARAMS((bfd *abfd, asection *sec, struct bfd_link_info *link_info,
1104           boolean *again));
1105
1106 static Elf_Internal_Rela *
1107 elf64_alpha_find_reloc_at_ofs (rel, relend, offset, type)
1108      Elf_Internal_Rela *rel, *relend;
1109      bfd_vma offset;
1110      int type;
1111 {
1112   while (rel < relend)
1113     {
1114       if (rel->r_offset == offset && ELF64_R_TYPE (rel->r_info) == type)
1115         return rel;
1116       ++rel;
1117     }
1118   return NULL;
1119 }
1120
1121 static Elf_Internal_Rela *
1122 elf64_alpha_relax_with_lituse (info, symval, irel, irelend)
1123      struct alpha_relax_info *info;
1124      bfd_vma symval;
1125      Elf_Internal_Rela *irel, *irelend;
1126 {
1127   Elf_Internal_Rela *urel;
1128   int flags, count, i;
1129   bfd_signed_vma disp;
1130   boolean fits16;
1131   boolean fits32;
1132   boolean lit_reused = false;
1133   boolean all_optimized = true;
1134   unsigned int lit_insn;
1135
1136   lit_insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
1137   if (lit_insn >> 26 != OP_LDQ)
1138     {
1139       ((*_bfd_error_handler)
1140        ("%s: %s+0x%lx: warning: LITERAL relocation against unexpected insn",
1141         bfd_get_filename (info->abfd), info->sec->name,
1142         (unsigned long)irel->r_offset));
1143       return irel;
1144     }
1145
1146   /* Summarize how this particular LITERAL is used.  */
1147   for (urel = irel+1, flags = count = 0; urel < irelend; ++urel, ++count)
1148     {
1149       if (ELF64_R_TYPE (urel->r_info) != R_ALPHA_LITUSE)
1150         break;
1151       if (urel->r_addend >= 0 && urel->r_addend <= 3)
1152         flags |= 1 << urel->r_addend;
1153     }
1154
1155   /* A little preparation for the loop...  */
1156   disp = symval - info->gp;
1157
1158   for (urel = irel+1, i = 0; i < count; ++i, ++urel)
1159     {
1160       unsigned int insn;
1161       int insn_disp;
1162       bfd_signed_vma xdisp;
1163
1164       insn = bfd_get_32 (info->abfd, info->contents + urel->r_offset);
1165
1166       switch (urel->r_addend)
1167         {
1168         default: /* 0 = ADDRESS FORMAT */
1169           /* This type is really just a placeholder to note that all
1170              uses cannot be optimized, but to still allow some.  */
1171           all_optimized = false;
1172           break;
1173
1174         case 1: /* MEM FORMAT */
1175           /* We can always optimize 16-bit displacements.  */
1176
1177           /* Extract the displacement from the instruction, sign-extending
1178              it if necessary, then test whether it is within 16 or 32 bits
1179              displacement from GP.  */
1180           insn_disp = insn & 0x0000ffff;
1181           if (insn_disp & 0x00008000)
1182             insn_disp |= 0xffff0000;  /* Negative: sign-extend.  */
1183
1184           xdisp = disp + insn_disp;
1185           fits16 = (xdisp >= - (bfd_signed_vma) 0x00008000 && xdisp < 0x00008000);
1186           fits32 = (xdisp >= - (bfd_signed_vma) 0x80000000 && xdisp < 0x7fff8000);
1187
1188           if (fits16)
1189             {
1190               /* Take the op code and dest from this insn, take the base
1191                  register from the literal insn.  Leave the offset alone.  */
1192               insn = (insn & 0xffe0ffff) | (lit_insn & 0x001f0000);
1193               urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
1194                                            R_ALPHA_GPRELLOW);
1195               urel->r_addend = irel->r_addend;
1196               info->changed_relocs = true;
1197
1198               bfd_put_32 (info->abfd, insn, info->contents + urel->r_offset);
1199               info->changed_contents = true;
1200             }
1201
1202           /* If all mem+byte, we can optimize 32-bit mem displacements.  */
1203           else if (fits32 && !(flags & ~6))
1204             {
1205               /* FIXME: sanity check that lit insn Ra is mem insn Rb.  */
1206
1207               irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
1208                                            R_ALPHA_GPRELHIGH);
1209               lit_insn = (OP_LDAH << 26) | (lit_insn & 0x03ff0000);
1210               bfd_put_32 (info->abfd, lit_insn,
1211                           info->contents + irel->r_offset);
1212               lit_reused = true;
1213               info->changed_contents = true;
1214
1215               urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
1216                                            R_ALPHA_GPRELLOW);
1217               urel->r_addend = irel->r_addend;
1218               info->changed_relocs = true;
1219             }
1220           else
1221             all_optimized = false;
1222           break;
1223
1224         case 2: /* BYTE OFFSET FORMAT */
1225           /* We can always optimize byte instructions.  */
1226
1227           /* FIXME: sanity check the insn for byte op.  Check that the
1228              literal dest reg is indeed Rb in the byte insn.  */
1229
1230           insn = (insn & ~0x001ff000) | ((symval & 7) << 13) | 0x1000;
1231
1232           urel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
1233           urel->r_addend = 0;
1234           info->changed_relocs = true;
1235
1236           bfd_put_32 (info->abfd, insn, info->contents + urel->r_offset);
1237           info->changed_contents = true;
1238           break;
1239
1240         case 3: /* CALL FORMAT */
1241           {
1242             /* If not zero, place to jump without needing pv.  */
1243             bfd_vma optdest = elf64_alpha_relax_opt_call (info, symval);
1244             bfd_vma org = (info->sec->output_section->vma
1245                            + info->sec->output_offset
1246                            + urel->r_offset + 4);
1247             bfd_signed_vma odisp;
1248
1249             odisp = (optdest ? optdest : symval) - org;
1250             if (odisp >= -0x400000 && odisp < 0x400000)
1251               {
1252                 Elf_Internal_Rela *xrel;
1253
1254                 /* Preserve branch prediction call stack when possible.  */
1255                 if ((insn & INSN_JSR_MASK) == INSN_JSR)
1256                   insn = (OP_BSR << 26) | (insn & 0x03e00000);
1257                 else
1258                   insn = (OP_BR << 26) | (insn & 0x03e00000);
1259
1260                 urel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info),
1261                                              R_ALPHA_BRADDR);
1262                 urel->r_addend = irel->r_addend;
1263
1264                 if (optdest)
1265                   urel->r_addend += optdest - symval;
1266                 else
1267                   all_optimized = false;
1268
1269                 bfd_put_32 (info->abfd, insn, info->contents + urel->r_offset);
1270
1271                 /* Kill any HINT reloc that might exist for this insn.  */
1272                 xrel = (elf64_alpha_find_reloc_at_ofs
1273                         (info->relocs, info->relend, urel->r_offset,
1274                          R_ALPHA_HINT));
1275                 if (xrel)
1276                   xrel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
1277
1278                 info->changed_contents = true;
1279                 info->changed_relocs = true;
1280               }
1281             else
1282               all_optimized = false;
1283
1284             /* ??? If target gp == current gp we can eliminate the gp reload.
1285                This does depend on every place a gp could be reloaded will
1286                be, which currently happens for all code produced by gcc, but
1287                not necessarily by hand-coded assembly, or if sibling calls
1288                are enabled in gcc.
1289
1290                Perhaps conditionalize this on a flag being set in the target
1291                object file's header, and have gcc set it?  */
1292           }
1293           break;
1294         }
1295     }
1296
1297   /* If all cases were optimized, we can reduce the use count on this
1298      got entry by one, possibly eliminating it.  */
1299   if (all_optimized)
1300     {
1301       info->gotent->use_count -= 1;
1302       alpha_elf_tdata (info->gotent->gotobj)->total_got_entries -= 1;
1303       if (!info->h)
1304         alpha_elf_tdata (info->gotent->gotobj)->n_local_got_entries -= 1;
1305
1306       /* If the literal instruction is no longer needed (it may have been
1307          reused.  We can eliminate it.
1308          ??? For now, I don't want to deal with compacting the section,
1309          so just nop it out.  */
1310       if (!lit_reused)
1311         {
1312           irel->r_info = ELF64_R_INFO (0, R_ALPHA_NONE);
1313           info->changed_relocs = true;
1314
1315           bfd_put_32 (info->abfd, INSN_UNOP, info->contents + irel->r_offset);
1316           info->changed_contents = true;
1317         }
1318     }
1319
1320   return irel + count;
1321 }
1322
1323 static bfd_vma
1324 elf64_alpha_relax_opt_call (info, symval)
1325      struct alpha_relax_info *info;
1326      bfd_vma symval;
1327 {
1328   /* If the function has the same gp, and we can identify that the
1329      function does not use its function pointer, we can eliminate the
1330      address load.  */
1331
1332   /* If the symbol is marked NOPV, we are being told the function never
1333      needs its procedure value.  */
1334   if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_NOPV)
1335     return symval;
1336
1337   /* If the symbol is marked STD_GP, we are being told the function does
1338      a normal ldgp in the first two words.  */
1339   else if ((info->other & STO_ALPHA_STD_GPLOAD) == STO_ALPHA_STD_GPLOAD)
1340     ;
1341
1342   /* Otherwise, we may be able to identify a GP load in the first two
1343      words, which we can then skip.  */
1344   else
1345     {
1346       Elf_Internal_Rela *tsec_relocs, *tsec_relend, *tsec_free, *gpdisp;
1347       bfd_vma ofs;
1348
1349       /* Load the relocations from the section that the target symbol is in.  */
1350       if (info->sec == info->tsec)
1351         {
1352           tsec_relocs = info->relocs;
1353           tsec_relend = info->relend;
1354           tsec_free = NULL;
1355         }
1356       else
1357         {
1358           tsec_relocs = (_bfd_elf64_link_read_relocs
1359                          (info->abfd, info->tsec, (PTR) NULL,
1360                          (Elf_Internal_Rela *) NULL,
1361                          info->link_info->keep_memory));
1362           if (tsec_relocs == NULL)
1363             return 0;
1364           tsec_relend = tsec_relocs + info->tsec->reloc_count;
1365           tsec_free = (info->link_info->keep_memory ? NULL : tsec_relocs);
1366         }
1367
1368       /* Recover the symbol's offset within the section.  */
1369       ofs = (symval - info->tsec->output_section->vma
1370              - info->tsec->output_offset);
1371
1372       /* Look for a GPDISP reloc.  */
1373       gpdisp = (elf64_alpha_find_reloc_at_ofs
1374                 (tsec_relocs, tsec_relend, ofs, R_ALPHA_GPDISP));
1375
1376       if (!gpdisp || gpdisp->r_addend != 4)
1377         {
1378           if (tsec_free)
1379             free (tsec_free);
1380           return 0;
1381         }
1382       if (tsec_free)
1383         free (tsec_free);
1384     }
1385
1386   /* We've now determined that we can skip an initial gp load.  Verify
1387      that the call and the target use the same gp.   */
1388   if (info->link_info->hash->creator != info->tsec->owner->xvec
1389       || info->gotobj != alpha_elf_tdata (info->tsec->owner)->gotobj)
1390     return 0;
1391
1392   return symval + 8;
1393 }
1394
1395 static boolean
1396 elf64_alpha_relax_without_lituse (info, symval, irel)
1397      struct alpha_relax_info *info;
1398      bfd_vma symval;
1399      Elf_Internal_Rela *irel;
1400 {
1401   unsigned int insn;
1402   bfd_signed_vma disp;
1403
1404   /* Get the instruction.  */
1405   insn = bfd_get_32 (info->abfd, info->contents + irel->r_offset);
1406
1407   if (insn >> 26 != OP_LDQ)
1408     {
1409       ((*_bfd_error_handler)
1410        ("%s: %s+0x%lx: warning: LITERAL relocation against unexpected insn",
1411         bfd_get_filename (info->abfd), info->sec->name,
1412         (unsigned long) irel->r_offset));
1413       return true;
1414     }
1415
1416   /* So we aren't told much.  Do what we can with the address load and
1417      fake the rest.  All of the optimizations here require that the
1418      offset from the GP fit in 16 bits.  */
1419
1420   disp = symval - info->gp;
1421   if (disp < -0x8000 || disp >= 0x8000)
1422     return true;
1423
1424   /* On the LITERAL instruction itself, consider exchanging
1425      `ldq R,X(gp)' for `lda R,Y(gp)'.  */
1426
1427   insn = (OP_LDA << 26) | (insn & 0x03ff0000);
1428   bfd_put_32 (info->abfd, insn, info->contents + irel->r_offset);
1429   info->changed_contents = true;
1430
1431   irel->r_info = ELF64_R_INFO (ELF64_R_SYM (irel->r_info), R_ALPHA_GPRELLOW);
1432   info->changed_relocs = true;
1433
1434   /* Reduce the use count on this got entry by one, possibly
1435      eliminating it.  */
1436   info->gotent->use_count -= 1;
1437   alpha_elf_tdata (info->gotent->gotobj)->total_got_entries -= 1;
1438   if (!info->h)
1439     alpha_elf_tdata (info->gotent->gotobj)->n_local_got_entries -= 1;
1440
1441   /* ??? Search forward through this basic block looking for insns
1442      that use the target register.  Stop after an insn modifying the
1443      register is seen, or after a branch or call.
1444
1445      Any such memory load insn may be substituted by a load directly
1446      off the GP.  This allows the memory load insn to be issued before
1447      the calculated GP register would otherwise be ready.
1448
1449      Any such jsr insn can be replaced by a bsr if it is in range.
1450
1451      This would mean that we'd have to _add_ relocations, the pain of
1452      which gives one pause.  */
1453
1454   return true;
1455 }
1456
1457 static boolean
1458 elf64_alpha_relax_section (abfd, sec, link_info, again)
1459      bfd *abfd;
1460      asection *sec;
1461      struct bfd_link_info *link_info;
1462      boolean *again;
1463 {
1464   Elf_Internal_Shdr *symtab_hdr;
1465   Elf_Internal_Rela *internal_relocs;
1466   Elf_Internal_Rela *free_relocs = NULL;
1467   Elf_Internal_Rela *irel, *irelend;
1468   bfd_byte *free_contents = NULL;
1469   Elf64_External_Sym *extsyms = NULL;
1470   Elf64_External_Sym *free_extsyms = NULL;
1471   struct alpha_elf_got_entry **local_got_entries;
1472   struct alpha_relax_info info;
1473
1474   /* We are not currently changing any sizes, so only one pass.  */
1475   *again = false;
1476
1477   if (link_info->relocateable
1478       || (sec->flags & SEC_RELOC) == 0
1479       || sec->reloc_count == 0)
1480     return true;
1481
1482   /* If this is the first time we have been called for this section,
1483      initialize the cooked size.  */
1484   if (sec->_cooked_size == 0)
1485     sec->_cooked_size = sec->_raw_size;
1486
1487   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1488   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
1489
1490   /* Load the relocations for this section.  */
1491   internal_relocs = (_bfd_elf64_link_read_relocs
1492                      (abfd, sec, (PTR) NULL, (Elf_Internal_Rela *) NULL,
1493                       link_info->keep_memory));
1494   if (internal_relocs == NULL)
1495     goto error_return;
1496   if (! link_info->keep_memory)
1497     free_relocs = internal_relocs;
1498
1499   memset(&info, 0, sizeof (info));
1500   info.abfd = abfd;
1501   info.sec = sec;
1502   info.link_info = link_info;
1503   info.relocs = internal_relocs;
1504   info.relend = irelend = internal_relocs + sec->reloc_count;
1505
1506   /* Find the GP for this object.  */
1507   info.gotobj = alpha_elf_tdata (abfd)->gotobj;
1508   if (info.gotobj)
1509     {
1510       asection *sgot = alpha_elf_tdata (info.gotobj)->got;
1511       info.gp = _bfd_get_gp_value (info.gotobj);
1512       if (info.gp == 0)
1513         {
1514           info.gp = (sgot->output_section->vma
1515                      + sgot->output_offset
1516                      + 0x8000);
1517           _bfd_set_gp_value (info.gotobj, info.gp);
1518         }
1519     }
1520
1521   for (irel = internal_relocs; irel < irelend; irel++)
1522     {
1523       bfd_vma symval;
1524       Elf_Internal_Sym isym;
1525       struct alpha_elf_got_entry *gotent;
1526
1527       if (ELF64_R_TYPE (irel->r_info) != (int) R_ALPHA_LITERAL)
1528         continue;
1529
1530       /* Get the section contents.  */
1531       if (info.contents == NULL)
1532         {
1533           if (elf_section_data (sec)->this_hdr.contents != NULL)
1534             info.contents = elf_section_data (sec)->this_hdr.contents;
1535           else
1536             {
1537               info.contents = (bfd_byte *) bfd_malloc (sec->_raw_size);
1538               if (info.contents == NULL)
1539                 goto error_return;
1540               free_contents = info.contents;
1541
1542               if (! bfd_get_section_contents (abfd, sec, info.contents,
1543                                               (file_ptr) 0, sec->_raw_size))
1544                 goto error_return;
1545             }
1546         }
1547
1548       /* Read this BFD's symbols if we haven't done so already.  */
1549       if (extsyms == NULL)
1550         {
1551           if (symtab_hdr->contents != NULL)
1552             extsyms = (Elf64_External_Sym *) symtab_hdr->contents;
1553           else
1554             {
1555               extsyms = ((Elf64_External_Sym *)
1556                          bfd_malloc (symtab_hdr->sh_size));
1557               if (extsyms == NULL)
1558                 goto error_return;
1559               free_extsyms = extsyms;
1560               if (bfd_seek (abfd, symtab_hdr->sh_offset, SEEK_SET) != 0
1561                   || (bfd_read (extsyms, 1, symtab_hdr->sh_size, abfd)
1562                       != symtab_hdr->sh_size))
1563                 goto error_return;
1564             }
1565         }
1566
1567       /* Get the value of the symbol referred to by the reloc.  */
1568       if (ELF64_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1569         {
1570           /* A local symbol.  */
1571           bfd_elf64_swap_symbol_in (abfd,
1572                                     extsyms + ELF64_R_SYM (irel->r_info),
1573                                     &isym);
1574           if (isym.st_shndx == SHN_UNDEF)
1575             info.tsec = bfd_und_section_ptr;
1576           else if (isym.st_shndx > 0 && isym.st_shndx < SHN_LORESERVE)
1577             info.tsec = bfd_section_from_elf_index (abfd, isym.st_shndx);
1578           else if (isym.st_shndx == SHN_ABS)
1579             info.tsec = bfd_abs_section_ptr;
1580           else if (isym.st_shndx == SHN_COMMON)
1581             info.tsec = bfd_com_section_ptr;
1582           else
1583             continue;   /* who knows.  */
1584
1585           info.h = NULL;
1586           info.other = isym.st_other;
1587           gotent = local_got_entries[ELF64_R_SYM(irel->r_info)];
1588           symval = isym.st_value;
1589         }
1590       else
1591         {
1592           unsigned long indx;
1593           struct alpha_elf_link_hash_entry *h;
1594
1595           indx = ELF64_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1596           h = alpha_elf_sym_hashes (abfd)[indx];
1597           BFD_ASSERT (h != NULL);
1598
1599           while (h->root.root.type == bfd_link_hash_indirect
1600                  || h->root.root.type == bfd_link_hash_warning)
1601             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
1602
1603           /* We can't do anthing with undefined or dynamic symbols.  */
1604           if (h->root.root.type == bfd_link_hash_undefined
1605               || h->root.root.type == bfd_link_hash_undefweak
1606               || alpha_elf_dynamic_symbol_p (&h->root, link_info))
1607             continue;
1608
1609           info.h = h;
1610           info.gotent = gotent;
1611           info.tsec = h->root.root.u.def.section;
1612           info.other = h->root.other;
1613           gotent = h->got_entries;
1614           symval = h->root.root.u.def.value;
1615         }
1616
1617       /* Search for the got entry to be used by this relocation.  */
1618       while (gotent->gotobj != info.gotobj || gotent->addend != irel->r_addend)
1619         gotent = gotent->next;
1620       info.gotent = gotent;
1621
1622       symval += info.tsec->output_section->vma + info.tsec->output_offset;
1623       symval += irel->r_addend;
1624
1625       BFD_ASSERT(info.gotent != NULL);
1626
1627       /* If there exist LITUSE relocations immediately following, this
1628          opens up all sorts of interesting optimizations, because we
1629          now know every location that this address load is used.  */
1630
1631       if (irel+1 < irelend && ELF64_R_TYPE (irel[1].r_info) == R_ALPHA_LITUSE)
1632         {
1633           irel = elf64_alpha_relax_with_lituse (&info, symval, irel, irelend);
1634           if (irel == NULL)
1635             goto error_return;
1636         }
1637       else
1638         {
1639           if (!elf64_alpha_relax_without_lituse (&info, symval, irel))
1640             goto error_return;
1641         }
1642     }
1643
1644   if (!elf64_alpha_size_got_sections (abfd, link_info))
1645     return false;
1646
1647   if (info.changed_relocs)
1648     {
1649       elf_section_data (sec)->relocs = internal_relocs;
1650     }
1651   else if (free_relocs != NULL)
1652     {
1653       free (free_relocs);
1654     }
1655
1656   if (info.changed_contents)
1657     {
1658       elf_section_data (sec)->this_hdr.contents = info.contents;
1659     }
1660   else if (free_contents != NULL)
1661     {
1662       if (! link_info->keep_memory)
1663         free (free_contents);
1664       else
1665         {
1666           /* Cache the section contents for elf_link_input_bfd.  */
1667           elf_section_data (sec)->this_hdr.contents = info.contents;
1668         }
1669     }
1670
1671   if (free_extsyms != NULL)
1672     {
1673       if (! link_info->keep_memory)
1674         free (free_extsyms);
1675       else
1676         {
1677           /* Cache the symbols for elf_link_input_bfd.  */
1678           symtab_hdr->contents = extsyms;
1679         }
1680     }
1681
1682   *again = info.changed_contents || info.changed_relocs;
1683
1684   return true;
1685
1686  error_return:
1687   if (free_relocs != NULL)
1688     free (free_relocs);
1689   if (free_contents != NULL)
1690     free (free_contents);
1691   if (free_extsyms != NULL)
1692     free (free_extsyms);
1693   return false;
1694 }
1695 \f
1696 /* PLT/GOT Stuff */
1697 #define PLT_HEADER_SIZE 32
1698 #define PLT_HEADER_WORD1        0xc3600000      /* br   $27,.+4     */
1699 #define PLT_HEADER_WORD2        0xa77b000c      /* ldq  $27,12($27) */
1700 #define PLT_HEADER_WORD3        0x47ff041f      /* nop              */
1701 #define PLT_HEADER_WORD4        0x6b7b0000      /* jmp  $27,($27)   */
1702
1703 #define PLT_ENTRY_SIZE 12
1704 #define PLT_ENTRY_WORD1         0xc3800000      /* br   $28, plt0   */
1705 #define PLT_ENTRY_WORD2         0
1706 #define PLT_ENTRY_WORD3         0
1707
1708 #define MAX_GOT_ENTRIES         (64*1024 / 8)
1709
1710 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
1711 \f
1712 /* Handle an Alpha specific section when reading an object file.  This
1713    is called when elfcode.h finds a section with an unknown type.
1714    FIXME: We need to handle the SHF_ALPHA_GPREL flag, but I'm not sure
1715    how to.  */
1716
1717 static boolean
1718 elf64_alpha_section_from_shdr (abfd, hdr, name)
1719      bfd *abfd;
1720      Elf64_Internal_Shdr *hdr;
1721      char *name;
1722 {
1723   asection *newsect;
1724
1725   /* There ought to be a place to keep ELF backend specific flags, but
1726      at the moment there isn't one.  We just keep track of the
1727      sections by their name, instead.  Fortunately, the ABI gives
1728      suggested names for all the MIPS specific sections, so we will
1729      probably get away with this.  */
1730   switch (hdr->sh_type)
1731     {
1732     case SHT_ALPHA_DEBUG:
1733       if (strcmp (name, ".mdebug") != 0)
1734         return false;
1735       break;
1736 #ifdef ERIC_neverdef
1737     case SHT_ALPHA_REGINFO:
1738       if (strcmp (name, ".reginfo") != 0
1739           || hdr->sh_size != sizeof (Elf64_External_RegInfo))
1740         return false;
1741       break;
1742 #endif
1743     default:
1744       return false;
1745     }
1746
1747   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1748     return false;
1749   newsect = hdr->bfd_section;
1750
1751   if (hdr->sh_type == SHT_ALPHA_DEBUG)
1752     {
1753       if (! bfd_set_section_flags (abfd, newsect,
1754                                    (bfd_get_section_flags (abfd, newsect)
1755                                     | SEC_DEBUGGING)))
1756         return false;
1757     }
1758
1759 #ifdef ERIC_neverdef
1760   /* For a .reginfo section, set the gp value in the tdata information
1761      from the contents of this section.  We need the gp value while
1762      processing relocs, so we just get it now.  */
1763   if (hdr->sh_type == SHT_ALPHA_REGINFO)
1764     {
1765       Elf64_External_RegInfo ext;
1766       Elf64_RegInfo s;
1767
1768       if (! bfd_get_section_contents (abfd, newsect, (PTR) &ext,
1769                                       (file_ptr) 0, sizeof ext))
1770         return false;
1771       bfd_alpha_elf64_swap_reginfo_in (abfd, &ext, &s);
1772       elf_gp (abfd) = s.ri_gp_value;
1773     }
1774 #endif
1775
1776   return true;
1777 }
1778
1779 /* Set the correct type for an Alpha ELF section.  We do this by the
1780    section name, which is a hack, but ought to work.  */
1781
1782 static boolean
1783 elf64_alpha_fake_sections (abfd, hdr, sec)
1784      bfd *abfd;
1785      Elf64_Internal_Shdr *hdr;
1786      asection *sec;
1787 {
1788   register const char *name;
1789
1790   name = bfd_get_section_name (abfd, sec);
1791
1792   if (strcmp (name, ".mdebug") == 0)
1793     {
1794       hdr->sh_type = SHT_ALPHA_DEBUG;
1795       /* In a shared object on Irix 5.3, the .mdebug section has an
1796          entsize of 0.  FIXME: Does this matter?  */
1797       if ((abfd->flags & DYNAMIC) != 0 )
1798         hdr->sh_entsize = 0;
1799       else
1800         hdr->sh_entsize = 1;
1801     }
1802 #ifdef ERIC_neverdef
1803   else if (strcmp (name, ".reginfo") == 0)
1804     {
1805       hdr->sh_type = SHT_ALPHA_REGINFO;
1806       /* In a shared object on Irix 5.3, the .reginfo section has an
1807          entsize of 0x18.  FIXME: Does this matter?  */
1808       if ((abfd->flags & DYNAMIC) != 0)
1809         hdr->sh_entsize = sizeof (Elf64_External_RegInfo);
1810       else
1811         hdr->sh_entsize = 1;
1812
1813       /* Force the section size to the correct value, even if the
1814          linker thinks it is larger.  The link routine below will only
1815          write out this much data for .reginfo.  */
1816       hdr->sh_size = sec->_raw_size = sizeof (Elf64_External_RegInfo);
1817     }
1818   else if (strcmp (name, ".hash") == 0
1819            || strcmp (name, ".dynamic") == 0
1820            || strcmp (name, ".dynstr") == 0)
1821     {
1822       hdr->sh_entsize = 0;
1823       hdr->sh_info = SIZEOF_ALPHA_DYNSYM_SECNAMES;
1824     }
1825 #endif
1826   else if (strcmp (name, ".sdata") == 0
1827            || strcmp (name, ".sbss") == 0
1828            || strcmp (name, ".lit4") == 0
1829            || strcmp (name, ".lit8") == 0)
1830     hdr->sh_flags |= SHF_ALPHA_GPREL;
1831
1832   return true;
1833 }
1834
1835 /* Hook called by the linker routine which adds symbols from an object
1836    file.  We use it to put .comm items in .sbss, and not .bss.  */
1837
1838 static boolean
1839 elf64_alpha_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1840      bfd *abfd;
1841      struct bfd_link_info *info;
1842      const Elf_Internal_Sym *sym;
1843      const char **namep;
1844      flagword *flagsp;
1845      asection **secp;
1846      bfd_vma *valp;
1847 {
1848   if (sym->st_shndx == SHN_COMMON
1849       && !info->relocateable
1850       && sym->st_size <= bfd_get_gp_size (abfd))
1851     {
1852       /* Common symbols less than or equal to -G nn bytes are
1853          automatically put into .sbss.  */
1854
1855       asection *scomm = bfd_get_section_by_name (abfd, ".scommon");
1856
1857       if (scomm == NULL)
1858         {
1859           scomm = bfd_make_section (abfd, ".scommon");
1860           if (scomm == NULL
1861               || !bfd_set_section_flags (abfd, scomm, (SEC_ALLOC
1862                                                        | SEC_IS_COMMON
1863                                                        | SEC_LINKER_CREATED)))
1864             return false;
1865         }
1866
1867       *secp = scomm;
1868       *valp = sym->st_size;
1869     }
1870
1871   return true;
1872 }
1873
1874 /* Create the .got section.  */
1875
1876 static boolean
1877 elf64_alpha_create_got_section(abfd, info)
1878      bfd *abfd;
1879      struct bfd_link_info *info;
1880 {
1881   asection *s;
1882
1883   if (bfd_get_section_by_name (abfd, ".got"))
1884     return true;
1885
1886   s = bfd_make_section (abfd, ".got");
1887   if (s == NULL
1888       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1889                                            | SEC_HAS_CONTENTS
1890                                            | SEC_IN_MEMORY
1891                                            | SEC_LINKER_CREATED))
1892       || !bfd_set_section_alignment (abfd, s, 3))
1893     return false;
1894
1895   alpha_elf_tdata (abfd)->got = s;
1896
1897   return true;
1898 }
1899
1900 /* Create all the dynamic sections.  */
1901
1902 static boolean
1903 elf64_alpha_create_dynamic_sections (abfd, info)
1904      bfd *abfd;
1905      struct bfd_link_info *info;
1906 {
1907   asection *s;
1908   struct elf_link_hash_entry *h;
1909
1910   /* We need to create .plt, .rela.plt, .got, and .rela.got sections.  */
1911
1912   s = bfd_make_section (abfd, ".plt");
1913   if (s == NULL
1914       || ! bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1915                                             | SEC_HAS_CONTENTS
1916                                             | SEC_IN_MEMORY
1917                                             | SEC_LINKER_CREATED
1918                                             | SEC_CODE))
1919       || ! bfd_set_section_alignment (abfd, s, 3))
1920     return false;
1921
1922   /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
1923      .plt section.  */
1924   h = NULL;
1925   if (! (_bfd_generic_link_add_one_symbol
1926          (info, abfd, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL, s,
1927           (bfd_vma) 0, (const char *) NULL, false,
1928           get_elf_backend_data (abfd)->collect,
1929           (struct bfd_link_hash_entry **) &h)))
1930     return false;
1931   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
1932   h->type = STT_OBJECT;
1933
1934   if (info->shared
1935       && ! _bfd_elf_link_record_dynamic_symbol (info, h))
1936     return false;
1937
1938   s = bfd_make_section (abfd, ".rela.plt");
1939   if (s == NULL
1940       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1941                                            | SEC_HAS_CONTENTS
1942                                            | SEC_IN_MEMORY
1943                                            | SEC_LINKER_CREATED
1944                                            | SEC_READONLY))
1945       || ! bfd_set_section_alignment (abfd, s, 3))
1946     return false;
1947
1948   /* We may or may not have created a .got section for this object, but
1949      we definitely havn't done the rest of the work.  */
1950
1951   if (!elf64_alpha_create_got_section (abfd, info))
1952     return false;
1953
1954   s = bfd_make_section(abfd, ".rela.got");
1955   if (s == NULL
1956       || !bfd_set_section_flags (abfd, s, (SEC_ALLOC | SEC_LOAD
1957                                            | SEC_HAS_CONTENTS
1958                                            | SEC_IN_MEMORY
1959                                            | SEC_LINKER_CREATED
1960                                            | SEC_READONLY))
1961       || !bfd_set_section_alignment (abfd, s, 3))
1962     return false;
1963
1964   /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
1965      dynobj's .got section.  We don't do this in the linker script
1966      because we don't want to define the symbol if we are not creating
1967      a global offset table.  */
1968   h = NULL;
1969   if (!(_bfd_generic_link_add_one_symbol
1970         (info, abfd, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL,
1971          alpha_elf_tdata(abfd)->got, (bfd_vma) 0, (const char *) NULL,
1972          false, get_elf_backend_data (abfd)->collect,
1973          (struct bfd_link_hash_entry **) &h)))
1974     return false;
1975   h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
1976   h->type = STT_OBJECT;
1977
1978   if (info->shared
1979       && ! _bfd_elf_link_record_dynamic_symbol (info, h))
1980     return false;
1981
1982   elf_hash_table (info)->hgot = h;
1983
1984   return true;
1985 }
1986 \f
1987 /* Read ECOFF debugging information from a .mdebug section into a
1988    ecoff_debug_info structure.  */
1989
1990 static boolean
1991 elf64_alpha_read_ecoff_info (abfd, section, debug)
1992      bfd *abfd;
1993      asection *section;
1994      struct ecoff_debug_info *debug;
1995 {
1996   HDRR *symhdr;
1997   const struct ecoff_debug_swap *swap;
1998   char *ext_hdr = NULL;
1999
2000   swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2001   memset (debug, 0, sizeof (*debug));
2002
2003   ext_hdr = (char *) bfd_malloc ((size_t) swap->external_hdr_size);
2004   if (ext_hdr == NULL && swap->external_hdr_size != 0)
2005     goto error_return;
2006
2007   if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
2008                                 swap->external_hdr_size)
2009       == false)
2010     goto error_return;
2011
2012   symhdr = &debug->symbolic_header;
2013   (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
2014
2015   /* The symbolic header contains absolute file offsets and sizes to
2016      read.  */
2017 #define READ(ptr, offset, count, size, type)                            \
2018   if (symhdr->count == 0)                                               \
2019     debug->ptr = NULL;                                                  \
2020   else                                                                  \
2021     {                                                                   \
2022       debug->ptr = (type) bfd_malloc ((size_t) (size * symhdr->count)); \
2023       if (debug->ptr == NULL)                                           \
2024         goto error_return;                                              \
2025       if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0     \
2026           || (bfd_read (debug->ptr, size, symhdr->count,                \
2027                         abfd) != size * symhdr->count))                 \
2028         goto error_return;                                              \
2029     }
2030
2031   READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
2032   READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
2033   READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
2034   READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
2035   READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
2036   READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
2037         union aux_ext *);
2038   READ (ss, cbSsOffset, issMax, sizeof (char), char *);
2039   READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
2040   READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
2041   READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
2042   READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
2043 #undef READ
2044
2045   debug->fdr = NULL;
2046   debug->adjust = NULL;
2047
2048   return true;
2049
2050  error_return:
2051   if (ext_hdr != NULL)
2052     free (ext_hdr);
2053   if (debug->line != NULL)
2054     free (debug->line);
2055   if (debug->external_dnr != NULL)
2056     free (debug->external_dnr);
2057   if (debug->external_pdr != NULL)
2058     free (debug->external_pdr);
2059   if (debug->external_sym != NULL)
2060     free (debug->external_sym);
2061   if (debug->external_opt != NULL)
2062     free (debug->external_opt);
2063   if (debug->external_aux != NULL)
2064     free (debug->external_aux);
2065   if (debug->ss != NULL)
2066     free (debug->ss);
2067   if (debug->ssext != NULL)
2068     free (debug->ssext);
2069   if (debug->external_fdr != NULL)
2070     free (debug->external_fdr);
2071   if (debug->external_rfd != NULL)
2072     free (debug->external_rfd);
2073   if (debug->external_ext != NULL)
2074     free (debug->external_ext);
2075   return false;
2076 }
2077
2078 /* Alpha ELF local labels start with '$'.  */
2079
2080 static boolean
2081 elf64_alpha_is_local_label_name (abfd, name)
2082      bfd *abfd;
2083      const char *name;
2084 {
2085   return name[0] == '$';
2086 }
2087
2088 /* Alpha ELF follows MIPS ELF in using a special find_nearest_line
2089    routine in order to handle the ECOFF debugging information.  We
2090    still call this mips_elf_find_line because of the slot
2091    find_line_info in elf_obj_tdata is declared that way.  */
2092
2093 struct mips_elf_find_line
2094 {
2095   struct ecoff_debug_info d;
2096   struct ecoff_find_line i;
2097 };
2098
2099 static boolean
2100 elf64_alpha_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
2101                                functionname_ptr, line_ptr)
2102      bfd *abfd;
2103      asection *section;
2104      asymbol **symbols;
2105      bfd_vma offset;
2106      const char **filename_ptr;
2107      const char **functionname_ptr;
2108      unsigned int *line_ptr;
2109 {
2110   asection *msec;
2111
2112   if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset,
2113                                      filename_ptr, functionname_ptr,
2114                                      line_ptr, 0,
2115                                      &elf_tdata (abfd)->dwarf2_find_line_info))
2116     return true;
2117
2118   msec = bfd_get_section_by_name (abfd, ".mdebug");
2119   if (msec != NULL)
2120     {
2121       flagword origflags;
2122       struct mips_elf_find_line *fi;
2123       const struct ecoff_debug_swap * const swap =
2124         get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
2125
2126       /* If we are called during a link, alpha_elf_final_link may have
2127          cleared the SEC_HAS_CONTENTS field.  We force it back on here
2128          if appropriate (which it normally will be).  */
2129       origflags = msec->flags;
2130       if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
2131         msec->flags |= SEC_HAS_CONTENTS;
2132
2133       fi = elf_tdata (abfd)->find_line_info;
2134       if (fi == NULL)
2135         {
2136           bfd_size_type external_fdr_size;
2137           char *fraw_src;
2138           char *fraw_end;
2139           struct fdr *fdr_ptr;
2140
2141           fi = ((struct mips_elf_find_line *)
2142                 bfd_zalloc (abfd, sizeof (struct mips_elf_find_line)));
2143           if (fi == NULL)
2144             {
2145               msec->flags = origflags;
2146               return false;
2147             }
2148
2149           if (!elf64_alpha_read_ecoff_info (abfd, msec, &fi->d))
2150             {
2151               msec->flags = origflags;
2152               return false;
2153             }
2154
2155           /* Swap in the FDR information.  */
2156           fi->d.fdr = ((struct fdr *)
2157                        bfd_alloc (abfd,
2158                                   (fi->d.symbolic_header.ifdMax *
2159                                    sizeof (struct fdr))));
2160           if (fi->d.fdr == NULL)
2161             {
2162               msec->flags = origflags;
2163               return false;
2164             }
2165           external_fdr_size = swap->external_fdr_size;
2166           fdr_ptr = fi->d.fdr;
2167           fraw_src = (char *) fi->d.external_fdr;
2168           fraw_end = (fraw_src
2169                       + fi->d.symbolic_header.ifdMax * external_fdr_size);
2170           for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
2171             (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
2172
2173           elf_tdata (abfd)->find_line_info = fi;
2174
2175           /* Note that we don't bother to ever free this information.
2176              find_nearest_line is either called all the time, as in
2177              objdump -l, so the information should be saved, or it is
2178              rarely called, as in ld error messages, so the memory
2179              wasted is unimportant.  Still, it would probably be a
2180              good idea for free_cached_info to throw it away.  */
2181         }
2182
2183       if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
2184                                   &fi->i, filename_ptr, functionname_ptr,
2185                                   line_ptr))
2186         {
2187           msec->flags = origflags;
2188           return true;
2189         }
2190
2191       msec->flags = origflags;
2192     }
2193
2194   /* Fall back on the generic ELF find_nearest_line routine.  */
2195
2196   return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
2197                                      filename_ptr, functionname_ptr,
2198                                      line_ptr);
2199 }
2200 \f
2201 /* Structure used to pass information to alpha_elf_output_extsym.  */
2202
2203 struct extsym_info
2204 {
2205   bfd *abfd;
2206   struct bfd_link_info *info;
2207   struct ecoff_debug_info *debug;
2208   const struct ecoff_debug_swap *swap;
2209   boolean failed;
2210 };
2211
2212 static boolean
2213 elf64_alpha_output_extsym (h, data)
2214      struct alpha_elf_link_hash_entry *h;
2215      PTR data;
2216 {
2217   struct extsym_info *einfo = (struct extsym_info *) data;
2218   boolean strip;
2219   asection *sec, *output_section;
2220
2221   if (h->root.indx == -2)
2222     strip = false;
2223   else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2224            || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
2225           && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
2226           && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
2227     strip = true;
2228   else if (einfo->info->strip == strip_all
2229           || (einfo->info->strip == strip_some
2230               && bfd_hash_lookup (einfo->info->keep_hash,
2231                                   h->root.root.root.string,
2232                                   false, false) == NULL))
2233     strip = true;
2234   else
2235     strip = false;
2236
2237   if (strip)
2238     return true;
2239
2240   if (h->esym.ifd == -2)
2241     {
2242       h->esym.jmptbl = 0;
2243       h->esym.cobol_main = 0;
2244       h->esym.weakext = 0;
2245       h->esym.reserved = 0;
2246       h->esym.ifd = ifdNil;
2247       h->esym.asym.value = 0;
2248       h->esym.asym.st = stGlobal;
2249
2250       if (h->root.root.type != bfd_link_hash_defined
2251          && h->root.root.type != bfd_link_hash_defweak)
2252        h->esym.asym.sc = scAbs;
2253       else
2254        {
2255          const char *name;
2256
2257          sec = h->root.root.u.def.section;
2258          output_section = sec->output_section;
2259
2260          /* When making a shared library and symbol h is the one from
2261             the another shared library, OUTPUT_SECTION may be null.  */
2262          if (output_section == NULL)
2263            h->esym.asym.sc = scUndefined;
2264          else
2265            {
2266              name = bfd_section_name (output_section->owner, output_section);
2267
2268              if (strcmp (name, ".text") == 0)
2269                h->esym.asym.sc = scText;
2270              else if (strcmp (name, ".data") == 0)
2271                h->esym.asym.sc = scData;
2272              else if (strcmp (name, ".sdata") == 0)
2273                h->esym.asym.sc = scSData;
2274              else if (strcmp (name, ".rodata") == 0
2275                       || strcmp (name, ".rdata") == 0)
2276                h->esym.asym.sc = scRData;
2277              else if (strcmp (name, ".bss") == 0)
2278                h->esym.asym.sc = scBss;
2279              else if (strcmp (name, ".sbss") == 0)
2280                h->esym.asym.sc = scSBss;
2281              else if (strcmp (name, ".init") == 0)
2282                h->esym.asym.sc = scInit;
2283              else if (strcmp (name, ".fini") == 0)
2284                h->esym.asym.sc = scFini;
2285              else
2286                h->esym.asym.sc = scAbs;
2287            }
2288        }
2289
2290       h->esym.asym.reserved = 0;
2291       h->esym.asym.index = indexNil;
2292     }
2293
2294   if (h->root.root.type == bfd_link_hash_common)
2295     h->esym.asym.value = h->root.root.u.c.size;
2296   else if (h->root.root.type == bfd_link_hash_defined
2297            || h->root.root.type == bfd_link_hash_defweak)
2298     {
2299       if (h->esym.asym.sc == scCommon)
2300        h->esym.asym.sc = scBss;
2301       else if (h->esym.asym.sc == scSCommon)
2302        h->esym.asym.sc = scSBss;
2303
2304       sec = h->root.root.u.def.section;
2305       output_section = sec->output_section;
2306       if (output_section != NULL)
2307        h->esym.asym.value = (h->root.root.u.def.value
2308                              + sec->output_offset
2309                              + output_section->vma);
2310       else
2311        h->esym.asym.value = 0;
2312     }
2313   else if ((h->root.elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2314     {
2315       /* Set type and value for a symbol with a function stub.  */
2316       h->esym.asym.st = stProc;
2317       sec = bfd_get_section_by_name (einfo->abfd, ".plt");
2318       if (sec == NULL)
2319         h->esym.asym.value = 0;
2320       else
2321         {
2322           output_section = sec->output_section;
2323           if (output_section != NULL)
2324             h->esym.asym.value = (h->root.plt.offset
2325                                   + sec->output_offset
2326                                   + output_section->vma);
2327           else
2328             h->esym.asym.value = 0;
2329         }
2330 #if 0 /* FIXME?  */
2331       h->esym.ifd = 0;
2332 #endif
2333     }
2334
2335   if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
2336                                      h->root.root.root.string,
2337                                      &h->esym))
2338     {
2339       einfo->failed = true;
2340       return false;
2341     }
2342
2343   return true;
2344 }
2345
2346 /* FIXME:  Create a runtime procedure table from the .mdebug section.
2347
2348 static boolean
2349 mips_elf_create_procedure_table (handle, abfd, info, s, debug)
2350      PTR handle;
2351      bfd *abfd;
2352      struct bfd_link_info *info;
2353      asection *s;
2354      struct ecoff_debug_info *debug;
2355 */
2356 \f
2357 /* Handle dynamic relocations when doing an Alpha ELF link.  */
2358
2359 static boolean
2360 elf64_alpha_check_relocs (abfd, info, sec, relocs)
2361      bfd *abfd;
2362      struct bfd_link_info *info;
2363      asection *sec;
2364      const Elf_Internal_Rela *relocs;
2365 {
2366   bfd *dynobj;
2367   asection *sreloc;
2368   const char *rel_sec_name;
2369   Elf_Internal_Shdr *symtab_hdr;
2370   struct alpha_elf_link_hash_entry **sym_hashes;
2371   struct alpha_elf_got_entry **local_got_entries;
2372   const Elf_Internal_Rela *rel, *relend;
2373   int got_created;
2374
2375   if (info->relocateable)
2376     return true;
2377
2378   dynobj = elf_hash_table(info)->dynobj;
2379   if (dynobj == NULL)
2380     elf_hash_table(info)->dynobj = dynobj = abfd;
2381
2382   sreloc = NULL;
2383   rel_sec_name = NULL;
2384   symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
2385   sym_hashes = alpha_elf_sym_hashes(abfd);
2386   local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
2387   got_created = 0;
2388
2389   relend = relocs + sec->reloc_count;
2390   for (rel = relocs; rel < relend; ++rel)
2391     {
2392       unsigned long r_symndx, r_type;
2393       struct alpha_elf_link_hash_entry *h;
2394
2395       r_symndx = ELF64_R_SYM (rel->r_info);
2396       if (r_symndx < symtab_hdr->sh_info)
2397         h = NULL;
2398       else
2399         {
2400           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2401
2402           while (h->root.root.type == bfd_link_hash_indirect
2403                  || h->root.root.type == bfd_link_hash_warning)
2404             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2405
2406           h->root.elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
2407         }
2408       r_type = ELF64_R_TYPE (rel->r_info);
2409
2410       switch (r_type)
2411         {
2412         case R_ALPHA_LITERAL:
2413           {
2414             struct alpha_elf_got_entry *gotent;
2415             int flags = 0;
2416
2417             if (h)
2418               {
2419                 /* Search for and possibly create a got entry.  */
2420                 for (gotent = h->got_entries; gotent ; gotent = gotent->next)
2421                   if (gotent->gotobj == abfd &&
2422                       gotent->addend == rel->r_addend)
2423                     break;
2424
2425                 if (!gotent)
2426                   {
2427                     gotent = ((struct alpha_elf_got_entry *)
2428                               bfd_alloc (abfd,
2429                                          sizeof (struct alpha_elf_got_entry)));
2430                     if (!gotent)
2431                       return false;
2432
2433                     gotent->gotobj = abfd;
2434                     gotent->addend = rel->r_addend;
2435                     gotent->got_offset = -1;
2436                     gotent->flags = 0;
2437                     gotent->use_count = 1;
2438
2439                     gotent->next = h->got_entries;
2440                     h->got_entries = gotent;
2441
2442                     alpha_elf_tdata (abfd)->total_got_entries++;
2443                   }
2444                 else
2445                   gotent->use_count += 1;
2446               }
2447             else
2448               {
2449                 /* This is a local .got entry -- record for merge.  */
2450                 if (!local_got_entries)
2451                   {
2452                     size_t size;
2453                     size = (symtab_hdr->sh_info
2454                             * sizeof (struct alpha_elf_got_entry *));
2455
2456                     local_got_entries = ((struct alpha_elf_got_entry **)
2457                                          bfd_alloc (abfd, size));
2458                     if (!local_got_entries)
2459                       return false;
2460
2461                     memset (local_got_entries, 0, size);
2462                     alpha_elf_tdata (abfd)->local_got_entries =
2463                       local_got_entries;
2464                   }
2465
2466                 for (gotent = local_got_entries[ELF64_R_SYM(rel->r_info)];
2467                      gotent != NULL && gotent->addend != rel->r_addend;
2468                      gotent = gotent->next)
2469                   continue;
2470                 if (!gotent)
2471                   {
2472                     gotent = ((struct alpha_elf_got_entry *)
2473                               bfd_alloc (abfd,
2474                                          sizeof (struct alpha_elf_got_entry)));
2475                     if (!gotent)
2476                       return false;
2477
2478                     gotent->gotobj = abfd;
2479                     gotent->addend = rel->r_addend;
2480                     gotent->got_offset = -1;
2481                     gotent->flags = 0;
2482                     gotent->use_count = 1;
2483
2484                     gotent->next = local_got_entries[ELF64_R_SYM(rel->r_info)];
2485                     local_got_entries[ELF64_R_SYM(rel->r_info)] = gotent;
2486
2487                     alpha_elf_tdata(abfd)->total_got_entries++;
2488                     alpha_elf_tdata(abfd)->n_local_got_entries++;
2489                   }
2490                 else
2491                   gotent->use_count += 1;
2492               }
2493
2494             /* Remember how this literal is used from its LITUSEs.
2495                This will be important when it comes to decide if we can
2496                create a .plt entry for a function symbol.  */
2497             if (rel+1 < relend
2498                 && ELF64_R_TYPE (rel[1].r_info) == R_ALPHA_LITUSE)
2499               {
2500                 do
2501                   {
2502                     ++rel;
2503                     if (rel->r_addend >= 1 && rel->r_addend <= 3)
2504                       flags |= 1 << rel->r_addend;
2505                   }
2506                 while (rel+1 < relend &&
2507                        ELF64_R_TYPE (rel[1].r_info) == R_ALPHA_LITUSE);
2508               }
2509             else
2510               {
2511                 /* No LITUSEs -- presumably the address is not being
2512                    loaded for nothing.  */
2513                 flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
2514               }
2515
2516             gotent->flags |= flags;
2517             if (h)
2518               {
2519                 /* Make a guess as to whether a .plt entry will be needed.  */
2520                 if ((h->flags |= flags) == ALPHA_ELF_LINK_HASH_LU_FUNC)
2521                   h->root.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2522                 else
2523                   h->root.elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2524               }
2525           }
2526           /* FALLTHRU */
2527
2528         case R_ALPHA_GPDISP:
2529         case R_ALPHA_GPREL32:
2530         case R_ALPHA_GPRELHIGH:
2531         case R_ALPHA_GPRELLOW:
2532           /* We don't actually use the .got here, but the sections must
2533              be created before the linker maps input sections to output
2534              sections.  */
2535           if (!got_created)
2536             {
2537               if (!elf64_alpha_create_got_section (abfd, info))
2538                 return false;
2539
2540               /* Make sure the object's gotobj is set to itself so
2541                  that we default to every object with its own .got.
2542                  We'll merge .gots later once we've collected each
2543                  object's info.  */
2544               alpha_elf_tdata(abfd)->gotobj = abfd;
2545
2546               got_created = 1;
2547             }
2548           break;
2549
2550         case R_ALPHA_SREL16:
2551         case R_ALPHA_SREL32:
2552         case R_ALPHA_SREL64:
2553           if (h == NULL)
2554             break;
2555           /* FALLTHRU */
2556
2557         case R_ALPHA_REFLONG:
2558         case R_ALPHA_REFQUAD:
2559           if (rel_sec_name == NULL)
2560             {
2561               rel_sec_name = (bfd_elf_string_from_elf_section
2562                               (abfd, elf_elfheader(abfd)->e_shstrndx,
2563                                elf_section_data(sec)->rel_hdr.sh_name));
2564               if (rel_sec_name == NULL)
2565                 return false;
2566
2567               BFD_ASSERT (strncmp (rel_sec_name, ".rela", 5) == 0
2568                           && strcmp (bfd_get_section_name (abfd, sec),
2569                                      rel_sec_name+5) == 0);
2570             }
2571
2572           /* We need to create the section here now whether we eventually
2573              use it or not so that it gets mapped to an output section by
2574              the linker.  If not used, we'll kill it in
2575              size_dynamic_sections.  */
2576           if (sreloc == NULL)
2577             {
2578               sreloc = bfd_get_section_by_name (dynobj, rel_sec_name);
2579               if (sreloc == NULL)
2580                 {
2581                   sreloc = bfd_make_section (dynobj, rel_sec_name);
2582                   if (sreloc == NULL
2583                       || !bfd_set_section_flags (dynobj, sreloc,
2584                                                  ((sec->flags & (SEC_ALLOC
2585                                                                  | SEC_LOAD))
2586                                                   | SEC_HAS_CONTENTS
2587                                                   | SEC_IN_MEMORY
2588                                                   | SEC_LINKER_CREATED
2589                                                   | SEC_READONLY))
2590                       || !bfd_set_section_alignment (dynobj, sreloc, 3))
2591                     return false;
2592                 }
2593             }
2594
2595           if (h)
2596             {
2597               /* Since we havn't seen all of the input symbols yet, we
2598                  don't know whether we'll actually need a dynamic relocation
2599                  entry for this reloc.  So make a record of it.  Once we
2600                  find out if this thing needs dynamic relocation we'll
2601                  expand the relocation sections by the appropriate amount.  */
2602
2603               struct alpha_elf_reloc_entry *rent;
2604
2605               for (rent = h->reloc_entries; rent; rent = rent->next)
2606                 if (rent->rtype == r_type && rent->srel == sreloc)
2607                   break;
2608
2609               if (!rent)
2610                 {
2611                   rent = ((struct alpha_elf_reloc_entry *)
2612                           bfd_alloc (abfd,
2613                                      sizeof (struct alpha_elf_reloc_entry)));
2614                   if (!rent)
2615                     return false;
2616
2617                   rent->srel = sreloc;
2618                   rent->rtype = r_type;
2619                   rent->count = 1;
2620
2621                   rent->next = h->reloc_entries;
2622                   h->reloc_entries = rent;
2623                 }
2624               else
2625                 rent->count++;
2626             }
2627           else if (info->shared && (sec->flags & SEC_ALLOC))
2628             {
2629               /* If this is a shared library, and the section is to be
2630                  loaded into memory, we need a RELATIVE reloc.  */
2631               sreloc->_raw_size += sizeof (Elf64_External_Rela);
2632             }
2633           break;
2634         }
2635     }
2636
2637   return true;
2638 }
2639
2640 /* Adjust a symbol defined by a dynamic object and referenced by a
2641    regular object.  The current definition is in some section of the
2642    dynamic object, but we're not including those sections.  We have to
2643    change the definition to something the rest of the link can
2644    understand.  */
2645
2646 static boolean
2647 elf64_alpha_adjust_dynamic_symbol (info, h)
2648      struct bfd_link_info *info;
2649      struct elf_link_hash_entry *h;
2650 {
2651   bfd *dynobj;
2652   asection *s;
2653   struct alpha_elf_link_hash_entry *ah;
2654
2655   dynobj = elf_hash_table(info)->dynobj;
2656   ah = (struct alpha_elf_link_hash_entry *)h;
2657
2658   /* Now that we've seen all of the input symbols, finalize our decision
2659      about whether this symbol should get a .plt entry.  */
2660
2661   if (h->root.type != bfd_link_hash_undefweak
2662       && alpha_elf_dynamic_symbol_p (h, info)
2663       && ((h->type == STT_FUNC
2664            && !(ah->flags & ALPHA_ELF_LINK_HASH_LU_ADDR))
2665           || (h->type == STT_NOTYPE
2666               && ah->flags == ALPHA_ELF_LINK_HASH_LU_FUNC))
2667       /* Don't prevent otherwise valid programs from linking by attempting
2668          to create a new .got entry somewhere.  A Correct Solution would be
2669          to add a new .got section to a new object file and let it be merged
2670          somewhere later.  But for now don't bother.  */
2671       && ah->got_entries)
2672     {
2673       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2674
2675       s = bfd_get_section_by_name(dynobj, ".plt");
2676       if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2677         return false;
2678
2679       /* The first bit of the .plt is reserved.  */
2680       if (s->_raw_size == 0)
2681         s->_raw_size = PLT_HEADER_SIZE;
2682
2683       h->plt.offset = s->_raw_size;
2684       s->_raw_size += PLT_ENTRY_SIZE;
2685
2686       /* If this symbol is not defined in a regular file, and we are not
2687          generating a shared library, then set the symbol to the location
2688          in the .plt.  This is required to make function pointers compare
2689          equal between the normal executable and the shared library.  */
2690       if (! info->shared
2691           && h->root.type != bfd_link_hash_defweak)
2692         {
2693           h->root.u.def.section = s;
2694           h->root.u.def.value = h->plt.offset;
2695         }
2696
2697       /* We also need a JMP_SLOT entry in the .rela.plt section.  */
2698       s = bfd_get_section_by_name (dynobj, ".rela.plt");
2699       BFD_ASSERT (s != NULL);
2700       s->_raw_size += sizeof (Elf64_External_Rela);
2701
2702       return true;
2703     }
2704   else
2705     h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2706
2707   /* If this is a weak symbol, and there is a real definition, the
2708      processor independent code will have arranged for us to see the
2709      real definition first, and we can just use the same value.  */
2710   if (h->weakdef != NULL)
2711     {
2712       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2713                   || h->weakdef->root.type == bfd_link_hash_defweak);
2714       h->root.u.def.section = h->weakdef->root.u.def.section;
2715       h->root.u.def.value = h->weakdef->root.u.def.value;
2716       return true;
2717     }
2718
2719   /* This is a reference to a symbol defined by a dynamic object which
2720      is not a function.  The Alpha, since it uses .got entries for all
2721      symbols even in regular objects, does not need the hackery of a
2722      .dynbss section and COPY dynamic relocations.  */
2723
2724   return true;
2725 }
2726
2727 /* Symbol versioning can create new symbols, and make our old symbols
2728    indirect to the new ones.  Consolidate the got and reloc information
2729    in these situations.  */
2730
2731 static boolean
2732 elf64_alpha_merge_ind_symbols (hi, dummy)
2733      struct alpha_elf_link_hash_entry *hi;
2734      PTR dummy;
2735 {
2736   struct alpha_elf_link_hash_entry *hs;
2737
2738   if (hi->root.root.type != bfd_link_hash_indirect)
2739     return true;
2740   hs = hi;
2741   do {
2742     hs = (struct alpha_elf_link_hash_entry *)hs->root.root.u.i.link;
2743   } while (hs->root.root.type == bfd_link_hash_indirect);
2744
2745   /* Merge the flags.  Whee.  */
2746
2747   hs->flags |= hi->flags;
2748
2749   /* Merge the .got entries.  Cannibalize the old symbol's list in
2750      doing so, since we don't need it anymore.  */
2751
2752   if (hs->got_entries == NULL)
2753     hs->got_entries = hi->got_entries;
2754   else
2755     {
2756       struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2757
2758       gsh = hs->got_entries;
2759       for (gi = hi->got_entries; gi ; gi = gin)
2760         {
2761           gin = gi->next;
2762           for (gs = gsh; gs ; gs = gs->next)
2763             if (gi->gotobj == gs->gotobj && gi->addend == gs->addend)
2764               goto got_found;
2765           gi->next = hs->got_entries;
2766           hs->got_entries = gi;
2767         got_found:;
2768         }
2769     }
2770   hi->got_entries = NULL;
2771
2772   /* And similar for the reloc entries.  */
2773
2774   if (hs->reloc_entries == NULL)
2775     hs->reloc_entries = hi->reloc_entries;
2776   else
2777     {
2778       struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2779
2780       rsh = hs->reloc_entries;
2781       for (ri = hi->reloc_entries; ri ; ri = rin)
2782         {
2783           rin = ri->next;
2784           for (rs = rsh; rs ; rs = rs->next)
2785             if (ri->rtype == rs->rtype)
2786               {
2787                 rs->count += ri->count;
2788                 goto found_reloc;
2789               }
2790           ri->next = hs->reloc_entries;
2791           hs->reloc_entries = ri;
2792         found_reloc:;
2793         }
2794     }
2795   hi->reloc_entries = NULL;
2796
2797   return true;
2798 }
2799
2800 /* Is it possible to merge two object file's .got tables?  */
2801
2802 static boolean
2803 elf64_alpha_can_merge_gots (a, b)
2804      bfd *a, *b;
2805 {
2806   int total = alpha_elf_tdata (a)->total_got_entries;
2807   bfd *bsub;
2808
2809   /* Trivial quick fallout test.  */
2810   if (total + alpha_elf_tdata (b)->total_got_entries <= MAX_GOT_ENTRIES)
2811     return true;
2812
2813   /* By their nature, local .got entries cannot be merged.  */
2814   if ((total += alpha_elf_tdata (b)->n_local_got_entries) > MAX_GOT_ENTRIES)
2815     return false;
2816
2817   /* Failing the common trivial comparison, we must effectively
2818      perform the merge.  Not actually performing the merge means that
2819      we don't have to store undo information in case we fail.  */
2820   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2821     {
2822       struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
2823       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2824       int i, n;
2825
2826       n = symtab_hdr->sh_size / symtab_hdr->sh_entsize - symtab_hdr->sh_info;
2827       for (i = 0; i < n; ++i)
2828         {
2829           struct alpha_elf_got_entry *ae, *be;
2830           struct alpha_elf_link_hash_entry *h;
2831
2832           h = hashes[i];
2833           while (h->root.root.type == bfd_link_hash_indirect
2834                  || h->root.root.type == bfd_link_hash_warning)
2835             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2836
2837           for (be = h->got_entries; be ; be = be->next)
2838             {
2839               if (be->use_count == 0)
2840                 continue;
2841               if (be->gotobj != b)
2842                 continue;
2843
2844               for (ae = h->got_entries; ae ; ae = ae->next)
2845                 if (ae->gotobj == a && ae->addend == be->addend)
2846                   goto global_found;
2847
2848               if (++total > MAX_GOT_ENTRIES)
2849                 return false;
2850             global_found:;
2851             }
2852         }
2853     }
2854
2855   return true;
2856 }
2857
2858 /* Actually merge two .got tables.  */
2859
2860 static void
2861 elf64_alpha_merge_gots (a, b)
2862      bfd *a, *b;
2863 {
2864   int total = alpha_elf_tdata (a)->total_got_entries;
2865   bfd *bsub;
2866
2867   /* Remember local expansion.  */
2868   {
2869     int e = alpha_elf_tdata (b)->n_local_got_entries;
2870     total += e;
2871     alpha_elf_tdata (a)->n_local_got_entries += e;
2872   }
2873
2874   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
2875     {
2876       struct alpha_elf_got_entry **local_got_entries;
2877       struct alpha_elf_link_hash_entry **hashes;
2878       Elf_Internal_Shdr *symtab_hdr;
2879       int i, n;
2880
2881       /* Let the local .got entries know they are part of a new subsegment.  */
2882       local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
2883       if (local_got_entries)
2884         {
2885           n = elf_tdata (bsub)->symtab_hdr.sh_info;
2886           for (i = 0; i < n; ++i)
2887             {
2888               struct alpha_elf_got_entry *ent;
2889               for (ent = local_got_entries[i]; ent; ent = ent->next)
2890                 ent->gotobj = a;
2891             }
2892         }
2893
2894       /* Merge the global .got entries.  */
2895       hashes = alpha_elf_sym_hashes (bsub);
2896       symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
2897
2898       n = symtab_hdr->sh_size / symtab_hdr->sh_entsize - symtab_hdr->sh_info;
2899       for (i = 0; i < n; ++i)
2900         {
2901           struct alpha_elf_got_entry *ae, *be, **pbe, **start;
2902           struct alpha_elf_link_hash_entry *h;
2903
2904           h = hashes[i];
2905           while (h->root.root.type == bfd_link_hash_indirect
2906                  || h->root.root.type == bfd_link_hash_warning)
2907             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2908
2909           start = &h->got_entries;
2910           for (pbe = start, be = *start; be ; pbe = &be->next, be = be->next)
2911             {
2912               if (be->use_count == 0)
2913                 {
2914                   *pbe = be->next;
2915                   continue;
2916                 }
2917               if (be->gotobj != b)
2918                 continue;
2919
2920               for (ae = *start; ae ; ae = ae->next)
2921                 if (ae->gotobj == a && ae->addend == be->addend)
2922                   {
2923                     ae->flags |= be->flags;
2924                     ae->use_count += be->use_count;
2925                     *pbe = be->next;
2926                     goto global_found;
2927                   }
2928               be->gotobj = a;
2929               total += 1;
2930
2931             global_found:;
2932             }
2933         }
2934
2935       alpha_elf_tdata (bsub)->gotobj = a;
2936     }
2937   alpha_elf_tdata (a)->total_got_entries = total;
2938
2939   /* Merge the two in_got chains.  */
2940   {
2941     bfd *next;
2942
2943     bsub = a;
2944     while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
2945       bsub = next;
2946
2947     alpha_elf_tdata (bsub)->in_got_link_next = b;
2948   }
2949 }
2950
2951 /* Calculate the offsets for the got entries.  */
2952
2953 static boolean
2954 elf64_alpha_calc_got_offsets_for_symbol (h, arg)
2955      struct alpha_elf_link_hash_entry *h;
2956      PTR arg;
2957 {
2958   struct alpha_elf_got_entry *gotent;
2959
2960   for (gotent = h->got_entries; gotent; gotent = gotent->next)
2961     if (gotent->use_count > 0)
2962       {
2963         bfd_size_type *plge
2964           = &alpha_elf_tdata (gotent->gotobj)->got->_raw_size;
2965
2966         gotent->got_offset = *plge;
2967         *plge += 8;
2968       }
2969
2970   return true;
2971 }
2972
2973 static void
2974 elf64_alpha_calc_got_offsets (info)
2975      struct bfd_link_info *info;
2976 {
2977   bfd *i, *got_list = alpha_elf_hash_table(info)->got_list;
2978
2979   /* First, zero out the .got sizes, as we may be recalculating the
2980      .got after optimizing it.  */
2981   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2982     alpha_elf_tdata(i)->got->_raw_size = 0;
2983
2984   /* Next, fill in the offsets for all the global entries.  */
2985   alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
2986                                 elf64_alpha_calc_got_offsets_for_symbol,
2987                                 NULL);
2988
2989   /* Finally, fill in the offsets for the local entries.  */
2990   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
2991     {
2992       bfd_size_type got_offset = alpha_elf_tdata(i)->got->_raw_size;
2993       bfd *j;
2994
2995       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
2996         {
2997           struct alpha_elf_got_entry **local_got_entries, *gotent;
2998           int k, n;
2999
3000           local_got_entries = alpha_elf_tdata(j)->local_got_entries;
3001           if (!local_got_entries)
3002             continue;
3003
3004           for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
3005             for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
3006               if (gotent->use_count > 0)
3007                 {
3008                   gotent->got_offset = got_offset;
3009                   got_offset += 8;
3010                 }
3011         }
3012
3013       alpha_elf_tdata(i)->got->_raw_size = got_offset;
3014       alpha_elf_tdata(i)->got->_cooked_size = got_offset;
3015     }
3016 }
3017
3018 /* Constructs the gots.  */
3019
3020 static boolean
3021 elf64_alpha_size_got_sections (output_bfd, info)
3022      bfd *output_bfd;
3023      struct bfd_link_info *info;
3024 {
3025   bfd *i, *got_list, *cur_got_obj;
3026   int something_changed = 0;
3027
3028   got_list = alpha_elf_hash_table (info)->got_list;
3029
3030   /* On the first time through, pretend we have an existing got list
3031      consisting of all of the input files.  */
3032   if (got_list == NULL)
3033     {
3034       for (i = info->input_bfds; i ; i = i->link_next)
3035         {
3036           bfd *this_got = alpha_elf_tdata (i)->gotobj;
3037           if (this_got == NULL)
3038             continue;
3039
3040           /* We are assuming no merging has yet ocurred.  */
3041           BFD_ASSERT (this_got == i);
3042
3043           if (alpha_elf_tdata (this_got)->total_got_entries > MAX_GOT_ENTRIES)
3044             {
3045               /* Yikes! A single object file has too many entries.  */
3046               (*_bfd_error_handler)
3047                 (_("%s: .got subsegment exceeds 64K (size %d)"),
3048                  bfd_get_filename (i),
3049                  alpha_elf_tdata (this_got)->total_got_entries * 8);
3050               return false;
3051             }
3052
3053           if (got_list == NULL)
3054             got_list = this_got;
3055           else
3056             alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
3057           cur_got_obj = this_got;
3058         }
3059
3060       /* Strange degenerate case of no got references.  */
3061       if (got_list == NULL)
3062         return true;
3063
3064       alpha_elf_hash_table (info)->got_list = got_list;
3065
3066       /* Force got offsets to be recalculated.  */
3067       something_changed = 1;
3068     }
3069
3070   cur_got_obj = got_list;
3071   i = alpha_elf_tdata(cur_got_obj)->got_link_next;
3072   while (i != NULL)
3073     {
3074       if (elf64_alpha_can_merge_gots (cur_got_obj, i))
3075         {
3076           elf64_alpha_merge_gots (cur_got_obj, i);
3077           i = alpha_elf_tdata(i)->got_link_next;
3078           alpha_elf_tdata(cur_got_obj)->got_link_next = i;
3079           something_changed = 1;
3080         }
3081       else
3082         {
3083           cur_got_obj = i;
3084           i = alpha_elf_tdata(i)->got_link_next;
3085         }
3086     }
3087
3088   /* Once the gots have been merged, fill in the got offsets for
3089      everything therein.  */
3090   if (1 || something_changed)
3091     elf64_alpha_calc_got_offsets (info);
3092
3093   return true;
3094 }
3095
3096 static boolean
3097 elf64_alpha_always_size_sections (output_bfd, info)
3098      bfd *output_bfd;
3099      struct bfd_link_info *info;
3100 {
3101   bfd *i;
3102
3103   if (info->relocateable)
3104     return true;
3105
3106   /* First, take care of the indirect symbols created by versioning.  */
3107   alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3108                                 elf64_alpha_merge_ind_symbols,
3109                                 NULL);
3110
3111   if (!elf64_alpha_size_got_sections (output_bfd, info))
3112     return false;
3113
3114   /* Allocate space for all of the .got subsections.  */
3115   i = alpha_elf_hash_table (info)->got_list;
3116   for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
3117     {
3118       asection *s = alpha_elf_tdata(i)->got;
3119       if (s->_raw_size > 0)
3120         {
3121           s->contents = (bfd_byte *) bfd_zalloc (i, s->_raw_size);
3122           if (s->contents == NULL)
3123             return false;
3124         }
3125     }
3126
3127   return true;
3128 }
3129
3130 /* Work out the sizes of the dynamic relocation entries.  */
3131
3132 static boolean
3133 elf64_alpha_calc_dynrel_sizes (h, info)
3134      struct alpha_elf_link_hash_entry *h;
3135      struct bfd_link_info *info;
3136 {
3137   /* If the symbol was defined as a common symbol in a regular object
3138      file, and there was no definition in any dynamic object, then the
3139      linker will have allocated space for the symbol in a common
3140      section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
3141      set.  This is done for dynamic symbols in
3142      elf_adjust_dynamic_symbol but this is not done for non-dynamic
3143      symbols, somehow.  */
3144   if (((h->root.elf_link_hash_flags
3145        & (ELF_LINK_HASH_DEF_REGULAR
3146           | ELF_LINK_HASH_REF_REGULAR
3147           | ELF_LINK_HASH_DEF_DYNAMIC))
3148        == ELF_LINK_HASH_REF_REGULAR)
3149       && (h->root.root.type == bfd_link_hash_defined
3150           || h->root.root.type == bfd_link_hash_defweak)
3151       && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
3152     {
3153       h->root.elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3154     }
3155
3156   /* If the symbol is dynamic, we'll need all the relocations in their
3157      natural form.  If this is a shared object, and it has been forced
3158      local, we'll need the same number of RELATIVE relocations.  */
3159
3160   if (alpha_elf_dynamic_symbol_p (&h->root, info) || info->shared)
3161     {
3162       struct alpha_elf_reloc_entry *relent;
3163       bfd *dynobj;
3164       struct alpha_elf_got_entry *gotent;
3165       bfd_size_type count;
3166       asection *srel;
3167
3168       for (relent = h->reloc_entries; relent; relent = relent->next)
3169         if (relent->rtype == R_ALPHA_REFLONG
3170             || relent->rtype == R_ALPHA_REFQUAD)
3171           {
3172             relent->srel->_raw_size +=
3173               sizeof (Elf64_External_Rela) * relent->count;
3174           }
3175
3176       dynobj = elf_hash_table(info)->dynobj;
3177       count = 0;
3178
3179       for (gotent = h->got_entries; gotent ; gotent = gotent->next)
3180         count++;
3181
3182       /* If we are using a .plt entry, subtract one, as the first
3183          reference uses a .rela.plt entry instead.  */
3184       if (h->root.plt.offset != MINUS_ONE)
3185         count--;
3186
3187       if (count > 0)
3188         {
3189           srel = bfd_get_section_by_name (dynobj, ".rela.got");
3190           BFD_ASSERT (srel != NULL);
3191           srel->_raw_size += sizeof (Elf64_External_Rela) * count;
3192         }
3193     }
3194
3195   return true;
3196 }
3197
3198 /* Set the sizes of the dynamic sections.  */
3199
3200 static boolean
3201 elf64_alpha_size_dynamic_sections (output_bfd, info)
3202      bfd *output_bfd;
3203      struct bfd_link_info *info;
3204 {
3205   bfd *dynobj;
3206   asection *s;
3207   boolean reltext;
3208   boolean relplt;
3209
3210   dynobj = elf_hash_table(info)->dynobj;
3211   BFD_ASSERT(dynobj != NULL);
3212
3213   if (elf_hash_table (info)->dynamic_sections_created)
3214     {
3215       /* Set the contents of the .interp section to the interpreter.  */
3216       if (!info->shared)
3217         {
3218           s = bfd_get_section_by_name (dynobj, ".interp");
3219           BFD_ASSERT (s != NULL);
3220           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
3221           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3222         }
3223
3224       /* Now that we've seen all of the input files, we can decide which
3225          symbols need dynamic relocation entries and which don't.  We've
3226          collected information in check_relocs that we can now apply to
3227          size the dynamic relocation sections.  */
3228       alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3229                                     elf64_alpha_calc_dynrel_sizes,
3230                                     info);
3231
3232       /* When building shared libraries, each local .got entry needs a
3233          RELATIVE reloc.  */
3234       if (info->shared)
3235         {
3236           bfd *i;
3237           asection *srel;
3238           bfd_size_type count;
3239
3240           srel = bfd_get_section_by_name (dynobj, ".rela.got");
3241           BFD_ASSERT (srel != NULL);
3242
3243           for (i = alpha_elf_hash_table(info)->got_list, count = 0;
3244                i != NULL;
3245                i = alpha_elf_tdata(i)->got_link_next)
3246             count += alpha_elf_tdata(i)->n_local_got_entries;
3247
3248           srel->_raw_size += count * sizeof (Elf64_External_Rela);
3249         }
3250     }
3251   /* else we're not dynamic and by definition we don't need such things.  */
3252
3253   /* The check_relocs and adjust_dynamic_symbol entry points have
3254      determined the sizes of the various dynamic sections.  Allocate
3255      memory for them.  */
3256   reltext = false;
3257   relplt = false;
3258   for (s = dynobj->sections; s != NULL; s = s->next)
3259     {
3260       const char *name;
3261       boolean strip;
3262
3263       if (!(s->flags & SEC_LINKER_CREATED))
3264         continue;
3265
3266       /* It's OK to base decisions on the section name, because none
3267          of the dynobj section names depend upon the input files.  */
3268       name = bfd_get_section_name (dynobj, s);
3269
3270       /* If we don't need this section, strip it from the output file.
3271          This is to handle .rela.bss and .rela.plt.  We must create it
3272          in create_dynamic_sections, because it must be created before
3273          the linker maps input sections to output sections.  The
3274          linker does that before adjust_dynamic_symbol is called, and
3275          it is that function which decides whether anything needs to
3276          go into these sections.  */
3277
3278       strip = false;
3279
3280       if (strncmp (name, ".rela", 5) == 0)
3281         {
3282           strip = (s->_raw_size == 0);
3283
3284           if (!strip)
3285             {
3286               const char *outname;
3287               asection *target;
3288
3289               /* If this relocation section applies to a read only
3290                  section, then we probably need a DT_TEXTREL entry.  */
3291               outname = bfd_get_section_name (output_bfd,
3292                                               s->output_section);
3293               target = bfd_get_section_by_name (output_bfd, outname + 5);
3294               if (target != NULL
3295                   && (target->flags & SEC_READONLY) != 0
3296                   && (target->flags & SEC_ALLOC) != 0)
3297                 reltext = true;
3298
3299               if (strcmp(name, ".rela.plt") == 0)
3300                 relplt = true;
3301
3302               /* We use the reloc_count field as a counter if we need
3303                  to copy relocs into the output file.  */
3304               s->reloc_count = 0;
3305             }
3306         }
3307       else if (strcmp (name, ".plt") != 0)
3308         {
3309           /* It's not one of our dynamic sections, so don't allocate space.  */
3310           continue;
3311         }
3312
3313       if (strip)
3314         _bfd_strip_section_from_output (info, s);
3315       else
3316         {
3317           /* Allocate memory for the section contents.  */
3318           s->contents = (bfd_byte *) bfd_zalloc(dynobj, s->_raw_size);
3319           if (s->contents == NULL && s->_raw_size != 0)
3320             return false;
3321         }
3322     }
3323
3324   if (elf_hash_table (info)->dynamic_sections_created)
3325     {
3326       /* Add some entries to the .dynamic section.  We fill in the
3327          values later, in elf64_alpha_finish_dynamic_sections, but we
3328          must add the entries now so that we get the correct size for
3329          the .dynamic section.  The DT_DEBUG entry is filled in by the
3330          dynamic linker and used by the debugger.  */
3331       if (!info->shared)
3332         {
3333           if (!bfd_elf64_add_dynamic_entry (info, DT_DEBUG, 0))
3334             return false;
3335         }
3336
3337       if (! bfd_elf64_add_dynamic_entry (info, DT_PLTGOT, 0))
3338         return false;
3339
3340       if (relplt)
3341         {
3342           if (! bfd_elf64_add_dynamic_entry (info, DT_PLTRELSZ, 0)
3343               || ! bfd_elf64_add_dynamic_entry (info, DT_PLTREL, DT_RELA)
3344               || ! bfd_elf64_add_dynamic_entry (info, DT_JMPREL, 0))
3345             return false;
3346         }
3347
3348       if (! bfd_elf64_add_dynamic_entry (info, DT_RELA, 0)
3349           || ! bfd_elf64_add_dynamic_entry (info, DT_RELASZ, 0)
3350           || ! bfd_elf64_add_dynamic_entry (info, DT_RELAENT,
3351                                             sizeof (Elf64_External_Rela)))
3352         return false;
3353
3354       if (reltext)
3355         {
3356           if (! bfd_elf64_add_dynamic_entry (info, DT_TEXTREL, 0))
3357             return false;
3358           info->flags |= DF_TEXTREL;
3359         }
3360     }
3361
3362   return true;
3363 }
3364
3365 /* Relocate an Alpha ELF section.  */
3366
3367 static boolean
3368 elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
3369                               contents, relocs, local_syms, local_sections)
3370      bfd *output_bfd;
3371      struct bfd_link_info *info;
3372      bfd *input_bfd;
3373      asection *input_section;
3374      bfd_byte *contents;
3375      Elf_Internal_Rela *relocs;
3376      Elf_Internal_Sym *local_syms;
3377      asection **local_sections;
3378 {
3379   Elf_Internal_Shdr *symtab_hdr;
3380   Elf_Internal_Rela *rel;
3381   Elf_Internal_Rela *relend;
3382   asection *sec, *sgot, *srel, *srelgot;
3383   bfd *dynobj, *gotobj;
3384   bfd_vma gp;
3385
3386   srelgot = srel = NULL;
3387   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3388   dynobj = elf_hash_table (info)->dynobj;
3389   if (dynobj)
3390     {
3391       srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3392     }
3393
3394   /* Find the gp value for this input bfd.  */
3395   sgot = NULL;
3396   gp = 0;
3397   gotobj = alpha_elf_tdata (input_bfd)->gotobj;
3398   if (gotobj)
3399     {
3400       sgot = alpha_elf_tdata (gotobj)->got;
3401       gp = _bfd_get_gp_value (gotobj);
3402       if (gp == 0)
3403         {
3404           gp = (sgot->output_section->vma
3405                 + sgot->output_offset
3406                 + 0x8000);
3407           _bfd_set_gp_value (gotobj, gp);
3408         }
3409     }
3410
3411   rel = relocs;
3412   relend = relocs + input_section->reloc_count;
3413   for (; rel < relend; rel++)
3414     {
3415       int r_type;
3416       reloc_howto_type *howto;
3417       unsigned long r_symndx;
3418       struct alpha_elf_link_hash_entry *h;
3419       Elf_Internal_Sym *sym;
3420       bfd_vma relocation;
3421       bfd_vma addend;
3422       bfd_reloc_status_type r;
3423
3424       r_type = ELF64_R_TYPE(rel->r_info);
3425       if (r_type < 0 || r_type >= (int) R_ALPHA_max)
3426         {
3427           bfd_set_error (bfd_error_bad_value);
3428           return false;
3429         }
3430       howto = elf64_alpha_howto_table + r_type;
3431
3432       r_symndx = ELF64_R_SYM(rel->r_info);
3433
3434       if (info->relocateable)
3435         {
3436           /* This is a relocateable link.  We don't have to change
3437              anything, unless the reloc is against a section symbol,
3438              in which case we have to adjust according to where the
3439              section symbol winds up in the output section.  */
3440
3441           /* The symbol associated with GPDISP and LITUSE is
3442              immaterial.  Only the addend is significant.  */
3443           if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
3444             continue;
3445
3446           if (r_symndx < symtab_hdr->sh_info)
3447             {
3448               sym = local_syms + r_symndx;
3449               if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
3450                 {
3451                   sec = local_sections[r_symndx];
3452                   rel->r_addend += sec->output_offset + sym->st_value;
3453                 }
3454             }
3455
3456           continue;
3457         }
3458
3459       /* This is a final link.  */
3460
3461       h = NULL;
3462       sym = NULL;
3463       sec = NULL;
3464
3465       if (r_symndx < symtab_hdr->sh_info)
3466         {
3467           sym = local_syms + r_symndx;
3468           sec = local_sections[r_symndx];
3469           relocation = (sec->output_section->vma
3470                         + sec->output_offset
3471                         + sym->st_value);
3472         }
3473       else
3474         {
3475           h = alpha_elf_sym_hashes (input_bfd)[r_symndx - symtab_hdr->sh_info];
3476
3477           while (h->root.root.type == bfd_link_hash_indirect
3478                  || h->root.root.type == bfd_link_hash_warning)
3479             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3480
3481           if (h->root.root.type == bfd_link_hash_defined
3482               || h->root.root.type == bfd_link_hash_defweak)
3483             {
3484               sec = h->root.root.u.def.section;
3485
3486 #if rth_notdef
3487               if ((r_type == R_ALPHA_LITERAL
3488                    && elf_hash_table(info)->dynamic_sections_created
3489                    && (!info->shared
3490                        || !info->symbolic
3491                        || !(h->root.elf_link_hash_flags
3492                             & ELF_LINK_HASH_DEF_REGULAR)))
3493                   || (info->shared
3494                       && (!info->symbolic
3495                           || !(h->root.elf_link_hash_flags
3496                                & ELF_LINK_HASH_DEF_REGULAR))
3497                       && (input_section->flags & SEC_ALLOC)
3498                       && (r_type == R_ALPHA_REFLONG
3499                           || r_type == R_ALPHA_REFQUAD
3500                           || r_type == R_ALPHA_LITERAL)))
3501                 {
3502                   /* In these cases, we don't need the relocation value.
3503                      We check specially because in some obscure cases
3504                      sec->output_section will be NULL.  */
3505                   relocation = 0;
3506                 }
3507 #else
3508               /* FIXME: Are not these obscure cases simply bugs?  Let's
3509                  get something working and come back to this.  */
3510               if (sec->output_section == NULL)
3511                 relocation = 0;
3512 #endif /* rth_notdef */
3513               else
3514                 {
3515                   relocation = (h->root.root.u.def.value
3516                                 + sec->output_section->vma
3517                                 + sec->output_offset);
3518                 }
3519             }
3520           else if (h->root.root.type == bfd_link_hash_undefweak)
3521             relocation = 0;
3522           else if (info->shared && !info->symbolic
3523                    && !info->no_undefined
3524                    && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
3525             relocation = 0;
3526           else
3527             {
3528               if (!((*info->callbacks->undefined_symbol)
3529                     (info, h->root.root.root.string, input_bfd,
3530                      input_section, rel->r_offset,
3531                      (!info->shared || info->no_undefined
3532                       || ELF_ST_VISIBILITY (h->root.other)))))
3533                 return false;
3534               relocation = 0;
3535             }
3536         }
3537       addend = rel->r_addend;
3538
3539       switch (r_type)
3540         {
3541         case R_ALPHA_GPDISP:
3542           {
3543             bfd_byte *p_ldah, *p_lda;
3544
3545             BFD_ASSERT(gp != 0);
3546
3547             relocation = (input_section->output_section->vma
3548                           + input_section->output_offset
3549                           + rel->r_offset);
3550
3551             p_ldah = contents + rel->r_offset - input_section->vma;
3552             p_lda = p_ldah + rel->r_addend;
3553
3554             r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - relocation,
3555                                              p_ldah, p_lda);
3556           }
3557           break;
3558
3559         case R_ALPHA_OP_PUSH:
3560         case R_ALPHA_OP_STORE:
3561         case R_ALPHA_OP_PSUB:
3562         case R_ALPHA_OP_PRSHIFT:
3563           /* We hate these silly beasts.  */
3564           abort ();
3565
3566         case R_ALPHA_LITERAL:
3567           {
3568             struct alpha_elf_got_entry *gotent;
3569             boolean dynamic_symbol;
3570
3571             BFD_ASSERT(sgot != NULL);
3572             BFD_ASSERT(gp != 0);
3573
3574             if (h != NULL)
3575               {
3576                 gotent = h->got_entries;
3577                 dynamic_symbol = alpha_elf_dynamic_symbol_p (&h->root, info);
3578               }
3579             else
3580               {
3581                 gotent = (alpha_elf_tdata(input_bfd)->
3582                           local_got_entries[r_symndx]);
3583                 dynamic_symbol = false;
3584               }
3585
3586             BFD_ASSERT(gotent != NULL);
3587
3588             while (gotent->gotobj != gotobj || gotent->addend != addend)
3589               gotent = gotent->next;
3590
3591             BFD_ASSERT(gotent->use_count >= 1);
3592
3593             /* Initialize the .got entry's value.  */
3594             if (!(gotent->flags & ALPHA_ELF_GOT_ENTRY_RELOCS_DONE))
3595               {
3596                 bfd_put_64 (output_bfd, relocation+addend,
3597                             sgot->contents + gotent->got_offset);
3598
3599                 /* If the symbol has been forced local, output a
3600                    RELATIVE reloc, otherwise it will be handled in
3601                    finish_dynamic_symbol.  */
3602                 if (info->shared && !dynamic_symbol)
3603                   {
3604                     Elf_Internal_Rela outrel;
3605
3606                     BFD_ASSERT(srelgot != NULL);
3607
3608                     outrel.r_offset = (sgot->output_section->vma
3609                                        + sgot->output_offset
3610                                        + gotent->got_offset);
3611                     outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3612                     outrel.r_addend = 0;
3613
3614                     bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3615                                                ((Elf64_External_Rela *)
3616                                                 srelgot->contents)
3617                                                + srelgot->reloc_count++);
3618                     BFD_ASSERT (sizeof (Elf64_External_Rela)
3619                                 * srelgot->reloc_count
3620                                 <= srelgot->_cooked_size);
3621                   }
3622
3623                 gotent->flags |= ALPHA_ELF_GOT_ENTRY_RELOCS_DONE;
3624               }
3625
3626             /* Figure the gprel relocation.  */
3627             addend = 0;
3628             relocation = (sgot->output_section->vma
3629                           + sgot->output_offset
3630                           + gotent->got_offset);
3631             relocation -= gp;
3632           }
3633           /* overflow handled by _bfd_final_link_relocate */
3634           goto default_reloc;
3635
3636         case R_ALPHA_GPREL32:
3637         case R_ALPHA_GPRELLOW:
3638           BFD_ASSERT(gp != 0);
3639           relocation -= gp;
3640           goto default_reloc;
3641
3642         case R_ALPHA_GPRELHIGH:
3643           BFD_ASSERT(gp != 0);
3644           relocation -= gp;
3645           relocation += addend;
3646           addend = 0;
3647           relocation = (((bfd_signed_vma) relocation >> 16)
3648                         + ((relocation >> 15) & 1));
3649           goto default_reloc;
3650
3651         case R_ALPHA_BRADDR:
3652         case R_ALPHA_HINT:
3653           /* The regular PC-relative stuff measures from the start of
3654              the instruction rather than the end.  */
3655           addend -= 4;
3656           goto default_reloc;
3657
3658         case R_ALPHA_REFLONG:
3659         case R_ALPHA_REFQUAD:
3660           {
3661             Elf_Internal_Rela outrel;
3662             boolean skip;
3663
3664             /* Careful here to remember RELATIVE relocations for global
3665                variables for symbolic shared objects.  */
3666
3667             if (h && alpha_elf_dynamic_symbol_p (&h->root, info))
3668               {
3669                 BFD_ASSERT(h->root.dynindx != -1);
3670                 outrel.r_info = ELF64_R_INFO(h->root.dynindx, r_type);
3671                 outrel.r_addend = addend;
3672                 addend = 0, relocation = 0;
3673               }
3674             else if (info->shared && (input_section->flags & SEC_ALLOC))
3675               {
3676                 outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3677                 outrel.r_addend = 0;
3678               }
3679             else
3680               goto default_reloc;
3681
3682             if (!srel)
3683               {
3684                 const char *name;
3685
3686                 name = (bfd_elf_string_from_elf_section
3687                         (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
3688                          elf_section_data(input_section)->rel_hdr.sh_name));
3689                 BFD_ASSERT(name != NULL);
3690
3691                 srel = bfd_get_section_by_name (dynobj, name);
3692                 BFD_ASSERT(srel != NULL);
3693               }
3694
3695             skip = false;
3696
3697             if (elf_section_data (input_section)->stab_info == NULL)
3698               outrel.r_offset = rel->r_offset;
3699             else
3700               {
3701                 bfd_vma off;
3702
3703                 off = (_bfd_stab_section_offset
3704                        (output_bfd, &elf_hash_table (info)->stab_info,
3705                         input_section,
3706                         &elf_section_data (input_section)->stab_info,
3707                         rel->r_offset));
3708                 if (off == (bfd_vma) -1)
3709                   skip = true;
3710                 outrel.r_offset = off;
3711               }
3712
3713             if (! skip)
3714               outrel.r_offset += (input_section->output_section->vma
3715                                   + input_section->output_offset);
3716             else
3717               memset (&outrel, 0, sizeof outrel);
3718
3719             bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3720                                        ((Elf64_External_Rela *)
3721                                         srel->contents)
3722                                        + srel->reloc_count++);
3723             BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
3724                         <= srel->_cooked_size);
3725           }
3726           goto default_reloc;
3727
3728         default:
3729         default_reloc:
3730           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
3731                                         contents, rel->r_offset, relocation,
3732                                         addend);
3733           break;
3734         }
3735
3736       switch (r)
3737         {
3738         case bfd_reloc_ok:
3739           break;
3740
3741         case bfd_reloc_overflow:
3742           {
3743             const char *name;
3744
3745             if (h != NULL)
3746               name = h->root.root.root.string;
3747             else
3748               {
3749                 name = (bfd_elf_string_from_elf_section
3750                         (input_bfd, symtab_hdr->sh_link, sym->st_name));
3751                 if (name == NULL)
3752                   return false;
3753                 if (*name == '\0')
3754                   name = bfd_section_name (input_bfd, sec);
3755               }
3756             if (! ((*info->callbacks->reloc_overflow)
3757                    (info, name, howto->name, (bfd_vma) 0,
3758                     input_bfd, input_section, rel->r_offset)))
3759               return false;
3760           }
3761           break;
3762
3763         default:
3764         case bfd_reloc_outofrange:
3765           abort ();
3766         }
3767     }
3768
3769   return true;
3770 }
3771
3772 /* Finish up dynamic symbol handling.  We set the contents of various
3773    dynamic sections here.  */
3774
3775 static boolean
3776 elf64_alpha_finish_dynamic_symbol (output_bfd, info, h, sym)
3777      bfd *output_bfd;
3778      struct bfd_link_info *info;
3779      struct elf_link_hash_entry *h;
3780      Elf_Internal_Sym *sym;
3781 {
3782   bfd *dynobj = elf_hash_table(info)->dynobj;
3783
3784   if (h->plt.offset != MINUS_ONE)
3785     {
3786       /* Fill in the .plt entry for this symbol.  */
3787       asection *splt, *sgot, *srel;
3788       Elf_Internal_Rela outrel;
3789       bfd_vma got_addr, plt_addr;
3790       bfd_vma plt_index;
3791       struct alpha_elf_got_entry *gotent;
3792
3793       BFD_ASSERT (h->dynindx != -1);
3794
3795       /* The first .got entry will be updated by the .plt with the
3796          address of the target function.  */
3797       gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
3798       BFD_ASSERT (gotent && gotent->addend == 0);
3799
3800       splt = bfd_get_section_by_name (dynobj, ".plt");
3801       BFD_ASSERT (splt != NULL);
3802       srel = bfd_get_section_by_name (dynobj, ".rela.plt");
3803       BFD_ASSERT (srel != NULL);
3804       sgot = alpha_elf_tdata (gotent->gotobj)->got;
3805       BFD_ASSERT (sgot != NULL);
3806
3807       got_addr = (sgot->output_section->vma
3808                   + sgot->output_offset
3809                   + gotent->got_offset);
3810       plt_addr = (splt->output_section->vma
3811                   + splt->output_offset
3812                   + h->plt.offset);
3813
3814       plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
3815
3816       /* Fill in the entry in the procedure linkage table.  */
3817       {
3818         unsigned insn1, insn2, insn3;
3819
3820         insn1 = PLT_ENTRY_WORD1 | ((-(h->plt.offset + 4) >> 2) & 0x1fffff);
3821         insn2 = PLT_ENTRY_WORD2;
3822         insn3 = PLT_ENTRY_WORD3;
3823
3824         bfd_put_32 (output_bfd, insn1, splt->contents + h->plt.offset);
3825         bfd_put_32 (output_bfd, insn2, splt->contents + h->plt.offset + 4);
3826         bfd_put_32 (output_bfd, insn3, splt->contents + h->plt.offset + 8);
3827       }
3828
3829       /* Fill in the entry in the .rela.plt section.  */
3830       outrel.r_offset = got_addr;
3831       outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
3832       outrel.r_addend = 0;
3833
3834       bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3835                                  ((Elf64_External_Rela *)srel->contents
3836                                   + plt_index));
3837
3838       if (!(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
3839         {
3840           /* Mark the symbol as undefined, rather than as defined in the
3841              .plt section.  Leave the value alone.  */
3842           sym->st_shndx = SHN_UNDEF;
3843         }
3844
3845       /* Fill in the entries in the .got.  */
3846       bfd_put_64 (output_bfd, plt_addr, sgot->contents + gotent->got_offset);
3847
3848       /* Subsequent .got entries will continue to bounce through the .plt.  */
3849       if (gotent->next)
3850         {
3851           srel = bfd_get_section_by_name (dynobj, ".rela.got");
3852           BFD_ASSERT (! info->shared || srel != NULL);
3853
3854           gotent = gotent->next;
3855           do
3856             {
3857               sgot = alpha_elf_tdata(gotent->gotobj)->got;
3858               BFD_ASSERT(sgot != NULL);
3859               BFD_ASSERT(gotent->addend == 0);
3860
3861               bfd_put_64 (output_bfd, plt_addr,
3862                           sgot->contents + gotent->got_offset);
3863
3864               if (info->shared)
3865                 {
3866                   outrel.r_offset = (sgot->output_section->vma
3867                                      + sgot->output_offset
3868                                      + gotent->got_offset);
3869                   outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
3870                   outrel.r_addend = 0;
3871
3872                   bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3873                                              ((Elf64_External_Rela *)
3874                                               srel->contents)
3875                                              + srel->reloc_count++);
3876                   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
3877                               <= srel->_cooked_size);
3878                 }
3879
3880               gotent = gotent->next;
3881             }
3882           while (gotent != NULL);
3883         }
3884     }
3885   else if (alpha_elf_dynamic_symbol_p (h, info))
3886     {
3887       /* Fill in the dynamic relocations for this symbol's .got entries.  */
3888       asection *srel;
3889       Elf_Internal_Rela outrel;
3890       struct alpha_elf_got_entry *gotent;
3891
3892       srel = bfd_get_section_by_name (dynobj, ".rela.got");
3893       BFD_ASSERT (srel != NULL);
3894
3895       outrel.r_info = ELF64_R_INFO (h->dynindx, R_ALPHA_GLOB_DAT);
3896       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
3897            gotent != NULL;
3898            gotent = gotent->next)
3899         {
3900           asection *sgot = alpha_elf_tdata (gotent->gotobj)->got;
3901           outrel.r_offset = (sgot->output_section->vma
3902                              + sgot->output_offset
3903                              + gotent->got_offset);
3904           outrel.r_addend = gotent->addend;
3905
3906           bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3907                                      ((Elf64_External_Rela *)srel->contents
3908                                       + srel->reloc_count++));
3909           BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
3910                       <= srel->_cooked_size);
3911         }
3912     }
3913
3914   /* Mark some specially defined symbols as absolute.  */
3915   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
3916       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
3917       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
3918     sym->st_shndx = SHN_ABS;
3919
3920   return true;
3921 }
3922
3923 /* Finish up the dynamic sections.  */
3924
3925 static boolean
3926 elf64_alpha_finish_dynamic_sections (output_bfd, info)
3927      bfd *output_bfd;
3928      struct bfd_link_info *info;
3929 {
3930   bfd *dynobj;
3931   asection *sdyn;
3932
3933   dynobj = elf_hash_table (info)->dynobj;
3934   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
3935
3936   if (elf_hash_table (info)->dynamic_sections_created)
3937     {
3938       asection *splt;
3939       Elf64_External_Dyn *dyncon, *dynconend;
3940
3941       splt = bfd_get_section_by_name (dynobj, ".plt");
3942       BFD_ASSERT (splt != NULL && sdyn != NULL);
3943
3944       dyncon = (Elf64_External_Dyn *) sdyn->contents;
3945       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
3946       for (; dyncon < dynconend; dyncon++)
3947         {
3948           Elf_Internal_Dyn dyn;
3949           const char *name;
3950           asection *s;
3951
3952           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
3953
3954           switch (dyn.d_tag)
3955             {
3956             case DT_PLTGOT:
3957               name = ".plt";
3958               goto get_vma;
3959             case DT_PLTRELSZ:
3960               name = ".rela.plt";
3961               goto get_size;
3962             case DT_JMPREL:
3963               name = ".rela.plt";
3964               goto get_vma;
3965
3966             case DT_RELASZ:
3967               /* My interpretation of the TIS v1.1 ELF document indicates
3968                  that RELASZ should not include JMPREL.  This is not what
3969                  the rest of the BFD does.  It is, however, what the
3970                  glibc ld.so wants.  Do this fixup here until we found
3971                  out who is right.  */
3972               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
3973               if (s)
3974                 {
3975                   dyn.d_un.d_val -=
3976                     (s->_cooked_size ? s->_cooked_size : s->_raw_size);
3977                 }
3978               break;
3979
3980             get_vma:
3981               s = bfd_get_section_by_name (output_bfd, name);
3982               dyn.d_un.d_ptr = (s ? s->vma : 0);
3983               break;
3984
3985             get_size:
3986               s = bfd_get_section_by_name (output_bfd, name);
3987               dyn.d_un.d_val =
3988                 (s->_cooked_size ? s->_cooked_size : s->_raw_size);
3989               break;
3990             }
3991
3992           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
3993         }
3994
3995       /* Initialize the PLT0 entry */
3996       if (splt->_raw_size > 0)
3997         {
3998           bfd_put_32 (output_bfd, PLT_HEADER_WORD1, splt->contents);
3999           bfd_put_32 (output_bfd, PLT_HEADER_WORD2, splt->contents + 4);
4000           bfd_put_32 (output_bfd, PLT_HEADER_WORD3, splt->contents + 8);
4001           bfd_put_32 (output_bfd, PLT_HEADER_WORD4, splt->contents + 12);
4002
4003           /* The next two words will be filled in by ld.so */
4004           bfd_put_64 (output_bfd, 0, splt->contents + 16);
4005           bfd_put_64 (output_bfd, 0, splt->contents + 24);
4006
4007           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
4008             PLT_HEADER_SIZE;
4009         }
4010     }
4011
4012   return true;
4013 }
4014
4015 /* We need to use a special link routine to handle the .reginfo and
4016    the .mdebug sections.  We need to merge all instances of these
4017    sections together, not write them all out sequentially.  */
4018
4019 static boolean
4020 elf64_alpha_final_link (abfd, info)
4021      bfd *abfd;
4022      struct bfd_link_info *info;
4023 {
4024   asection *o;
4025   struct bfd_link_order *p;
4026   asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
4027   struct ecoff_debug_info debug;
4028   const struct ecoff_debug_swap *swap
4029     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
4030   HDRR *symhdr = &debug.symbolic_header;
4031   PTR mdebug_handle = NULL;
4032
4033 #if 0
4034               if (++ngots == 2)
4035                 {
4036                   (*info->callbacks->warning)
4037                     (info, _("using multiple gp values"), (char *) NULL,
4038                      output_bfd, (asection *) NULL, (bfd_vma) 0);
4039                 }
4040 #endif
4041
4042   /* Go through the sections and collect the .reginfo and .mdebug
4043      information.  */
4044   reginfo_sec = NULL;
4045   mdebug_sec = NULL;
4046   gptab_data_sec = NULL;
4047   gptab_bss_sec = NULL;
4048   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4049     {
4050 #ifdef ERIC_neverdef
4051       if (strcmp (o->name, ".reginfo") == 0)
4052         {
4053           memset (&reginfo, 0, sizeof reginfo);
4054
4055           /* We have found the .reginfo section in the output file.
4056              Look through all the link_orders comprising it and merge
4057              the information together.  */
4058           for (p = o->link_order_head;
4059                p != (struct bfd_link_order *) NULL;
4060                p = p->next)
4061             {
4062               asection *input_section;
4063               bfd *input_bfd;
4064               Elf64_External_RegInfo ext;
4065               Elf64_RegInfo sub;
4066
4067               if (p->type != bfd_indirect_link_order)
4068                 {
4069                   if (p->type == bfd_fill_link_order)
4070                     continue;
4071                   abort ();
4072                 }
4073
4074               input_section = p->u.indirect.section;
4075               input_bfd = input_section->owner;
4076
4077               /* The linker emulation code has probably clobbered the
4078                  size to be zero bytes.  */
4079               if (input_section->_raw_size == 0)
4080                 input_section->_raw_size = sizeof (Elf64_External_RegInfo);
4081
4082               if (! bfd_get_section_contents (input_bfd, input_section,
4083                                               (PTR) &ext,
4084                                               (file_ptr) 0,
4085                                               sizeof ext))
4086                 return false;
4087
4088               bfd_alpha_elf64_swap_reginfo_in (input_bfd, &ext, &sub);
4089
4090               reginfo.ri_gprmask |= sub.ri_gprmask;
4091               reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
4092               reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
4093               reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
4094               reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
4095
4096               /* ri_gp_value is set by the function
4097                  alpha_elf_section_processing when the section is
4098                  finally written out.  */
4099
4100               /* Hack: reset the SEC_HAS_CONTENTS flag so that
4101                  elf_link_input_bfd ignores this section.  */
4102               input_section->flags &=~ SEC_HAS_CONTENTS;
4103             }
4104
4105           /* Force the section size to the value we want.  */
4106           o->_raw_size = sizeof (Elf64_External_RegInfo);
4107
4108           /* Skip this section later on (I don't think this currently
4109              matters, but someday it might).  */
4110           o->link_order_head = (struct bfd_link_order *) NULL;
4111
4112           reginfo_sec = o;
4113         }
4114 #endif
4115
4116       if (strcmp (o->name, ".mdebug") == 0)
4117         {
4118           struct extsym_info einfo;
4119
4120           /* We have found the .mdebug section in the output file.
4121              Look through all the link_orders comprising it and merge
4122              the information together.  */
4123           symhdr->magic = swap->sym_magic;
4124           /* FIXME: What should the version stamp be?  */
4125           symhdr->vstamp = 0;
4126           symhdr->ilineMax = 0;
4127           symhdr->cbLine = 0;
4128           symhdr->idnMax = 0;
4129           symhdr->ipdMax = 0;
4130           symhdr->isymMax = 0;
4131           symhdr->ioptMax = 0;
4132           symhdr->iauxMax = 0;
4133           symhdr->issMax = 0;
4134           symhdr->issExtMax = 0;
4135           symhdr->ifdMax = 0;
4136           symhdr->crfd = 0;
4137           symhdr->iextMax = 0;
4138
4139           /* We accumulate the debugging information itself in the
4140              debug_info structure.  */
4141           debug.line = NULL;
4142           debug.external_dnr = NULL;
4143           debug.external_pdr = NULL;
4144           debug.external_sym = NULL;
4145           debug.external_opt = NULL;
4146           debug.external_aux = NULL;
4147           debug.ss = NULL;
4148           debug.ssext = debug.ssext_end = NULL;
4149           debug.external_fdr = NULL;
4150           debug.external_rfd = NULL;
4151           debug.external_ext = debug.external_ext_end = NULL;
4152
4153           mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
4154           if (mdebug_handle == (PTR) NULL)
4155             return false;
4156
4157           if (1)
4158             {
4159               asection *s;
4160               EXTR esym;
4161               bfd_vma last;
4162               unsigned int i;
4163               static const char * const name[] =
4164                 {
4165                   ".text", ".init", ".fini", ".data",
4166                   ".rodata", ".sdata", ".sbss", ".bss"
4167                 };
4168               static const int sc[] = { scText, scInit, scFini, scData,
4169                                           scRData, scSData, scSBss, scBss };
4170
4171               esym.jmptbl = 0;
4172               esym.cobol_main = 0;
4173               esym.weakext = 0;
4174               esym.reserved = 0;
4175               esym.ifd = ifdNil;
4176               esym.asym.iss = issNil;
4177               esym.asym.st = stLocal;
4178               esym.asym.reserved = 0;
4179               esym.asym.index = indexNil;
4180               for (i = 0; i < 8; i++)
4181                 {
4182                   esym.asym.sc = sc[i];
4183                   s = bfd_get_section_by_name (abfd, name[i]);
4184                   if (s != NULL)
4185                     {
4186                       esym.asym.value = s->vma;
4187                       last = s->vma + s->_raw_size;
4188                     }
4189                   else
4190                     esym.asym.value = last;
4191
4192                   if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
4193                                                       name[i], &esym))
4194                     return false;
4195                 }
4196             }
4197
4198           for (p = o->link_order_head;
4199                p != (struct bfd_link_order *) NULL;
4200                p = p->next)
4201             {
4202               asection *input_section;
4203               bfd *input_bfd;
4204               const struct ecoff_debug_swap *input_swap;
4205               struct ecoff_debug_info input_debug;
4206               char *eraw_src;
4207               char *eraw_end;
4208
4209               if (p->type != bfd_indirect_link_order)
4210                 {
4211                   if (p->type == bfd_fill_link_order)
4212                     continue;
4213                   abort ();
4214                 }
4215
4216               input_section = p->u.indirect.section;
4217               input_bfd = input_section->owner;
4218
4219               if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
4220                   || (get_elf_backend_data (input_bfd)
4221                       ->elf_backend_ecoff_debug_swap) == NULL)
4222                 {
4223                   /* I don't know what a non ALPHA ELF bfd would be
4224                      doing with a .mdebug section, but I don't really
4225                      want to deal with it.  */
4226                   continue;
4227                 }
4228
4229               input_swap = (get_elf_backend_data (input_bfd)
4230                             ->elf_backend_ecoff_debug_swap);
4231
4232               BFD_ASSERT (p->size == input_section->_raw_size);
4233
4234               /* The ECOFF linking code expects that we have already
4235                  read in the debugging information and set up an
4236                  ecoff_debug_info structure, so we do that now.  */
4237               if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
4238                                                 &input_debug))
4239                 return false;
4240
4241               if (! (bfd_ecoff_debug_accumulate
4242                      (mdebug_handle, abfd, &debug, swap, input_bfd,
4243                       &input_debug, input_swap, info)))
4244                 return false;
4245
4246               /* Loop through the external symbols.  For each one with
4247                  interesting information, try to find the symbol in
4248                  the linker global hash table and save the information
4249                  for the output external symbols.  */
4250               eraw_src = input_debug.external_ext;
4251               eraw_end = (eraw_src
4252                           + (input_debug.symbolic_header.iextMax
4253                              * input_swap->external_ext_size));
4254               for (;
4255                    eraw_src < eraw_end;
4256                    eraw_src += input_swap->external_ext_size)
4257                 {
4258                   EXTR ext;
4259                   const char *name;
4260                   struct alpha_elf_link_hash_entry *h;
4261
4262                   (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
4263                   if (ext.asym.sc == scNil
4264                       || ext.asym.sc == scUndefined
4265                       || ext.asym.sc == scSUndefined)
4266                     continue;
4267
4268                   name = input_debug.ssext + ext.asym.iss;
4269                   h = alpha_elf_link_hash_lookup (alpha_elf_hash_table (info),
4270                                                   name, false, false, true);
4271                   if (h == NULL || h->esym.ifd != -2)
4272                     continue;
4273
4274                   if (ext.ifd != -1)
4275                     {
4276                       BFD_ASSERT (ext.ifd
4277                                   < input_debug.symbolic_header.ifdMax);
4278                       ext.ifd = input_debug.ifdmap[ext.ifd];
4279                     }
4280
4281                   h->esym = ext;
4282                 }
4283
4284               /* Free up the information we just read.  */
4285               free (input_debug.line);
4286               free (input_debug.external_dnr);
4287               free (input_debug.external_pdr);
4288               free (input_debug.external_sym);
4289               free (input_debug.external_opt);
4290               free (input_debug.external_aux);
4291               free (input_debug.ss);
4292               free (input_debug.ssext);
4293               free (input_debug.external_fdr);
4294               free (input_debug.external_rfd);
4295               free (input_debug.external_ext);
4296
4297               /* Hack: reset the SEC_HAS_CONTENTS flag so that
4298                  elf_link_input_bfd ignores this section.  */
4299               input_section->flags &=~ SEC_HAS_CONTENTS;
4300             }
4301
4302 #ifdef ERIC_neverdef
4303           if (info->shared)
4304             {
4305               /* Create .rtproc section.  */
4306               rtproc_sec = bfd_get_section_by_name (abfd, ".rtproc");
4307               if (rtproc_sec == NULL)
4308                 {
4309                   flagword flags = (SEC_HAS_CONTENTS
4310                                     | SEC_IN_MEMORY
4311                                     | SEC_LINKER_CREATED
4312                                     | SEC_READONLY);
4313
4314                   rtproc_sec = bfd_make_section (abfd, ".rtproc");
4315                   if (rtproc_sec == NULL
4316                       || ! bfd_set_section_flags (abfd, rtproc_sec, flags)
4317                       || ! bfd_set_section_alignment (abfd, rtproc_sec, 12))
4318                     return false;
4319                 }
4320
4321               if (! alpha_elf_create_procedure_table (mdebug_handle, abfd,
4322                                                      info, rtproc_sec, &debug))
4323                 return false;
4324             }
4325 #endif
4326
4327           /* Build the external symbol information.  */
4328           einfo.abfd = abfd;
4329           einfo.info = info;
4330           einfo.debug = &debug;
4331           einfo.swap = swap;
4332           einfo.failed = false;
4333           elf_link_hash_traverse (elf_hash_table (info),
4334                                   elf64_alpha_output_extsym,
4335                                   (PTR) &einfo);
4336           if (einfo.failed)
4337             return false;
4338
4339           /* Set the size of the .mdebug section.  */
4340           o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
4341
4342           /* Skip this section later on (I don't think this currently
4343              matters, but someday it might).  */
4344           o->link_order_head = (struct bfd_link_order *) NULL;
4345
4346           mdebug_sec = o;
4347         }
4348
4349 #ifdef ERIC_neverdef
4350       if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
4351         {
4352           const char *subname;
4353           unsigned int c;
4354           Elf64_gptab *tab;
4355           Elf64_External_gptab *ext_tab;
4356           unsigned int i;
4357
4358           /* The .gptab.sdata and .gptab.sbss sections hold
4359              information describing how the small data area would
4360              change depending upon the -G switch.  These sections
4361              not used in executables files.  */
4362           if (! info->relocateable)
4363             {
4364               asection **secpp;
4365
4366               for (p = o->link_order_head;
4367                    p != (struct bfd_link_order *) NULL;
4368                    p = p->next)
4369                 {
4370                   asection *input_section;
4371
4372                   if (p->type != bfd_indirect_link_order)
4373                     {
4374                       if (p->type == bfd_fill_link_order)
4375                         continue;
4376                       abort ();
4377                     }
4378
4379                   input_section = p->u.indirect.section;
4380
4381                   /* Hack: reset the SEC_HAS_CONTENTS flag so that
4382                      elf_link_input_bfd ignores this section.  */
4383                   input_section->flags &=~ SEC_HAS_CONTENTS;
4384                 }
4385
4386               /* Skip this section later on (I don't think this
4387                  currently matters, but someday it might).  */
4388               o->link_order_head = (struct bfd_link_order *) NULL;
4389
4390               /* Really remove the section.  */
4391               for (secpp = &abfd->sections;
4392                    *secpp != o;
4393                    secpp = &(*secpp)->next)
4394                 ;
4395               *secpp = (*secpp)->next;
4396               --abfd->section_count;
4397
4398               continue;
4399             }
4400
4401           /* There is one gptab for initialized data, and one for
4402              uninitialized data.  */
4403           if (strcmp (o->name, ".gptab.sdata") == 0)
4404             gptab_data_sec = o;
4405           else if (strcmp (o->name, ".gptab.sbss") == 0)
4406             gptab_bss_sec = o;
4407           else
4408             {
4409               (*_bfd_error_handler)
4410                 (_("%s: illegal section name `%s'"),
4411                  bfd_get_filename (abfd), o->name);
4412               bfd_set_error (bfd_error_nonrepresentable_section);
4413               return false;
4414             }
4415
4416           /* The linker script always combines .gptab.data and
4417              .gptab.sdata into .gptab.sdata, and likewise for
4418              .gptab.bss and .gptab.sbss.  It is possible that there is
4419              no .sdata or .sbss section in the output file, in which
4420              case we must change the name of the output section.  */
4421           subname = o->name + sizeof ".gptab" - 1;
4422           if (bfd_get_section_by_name (abfd, subname) == NULL)
4423             {
4424               if (o == gptab_data_sec)
4425                 o->name = ".gptab.data";
4426               else
4427                 o->name = ".gptab.bss";
4428               subname = o->name + sizeof ".gptab" - 1;
4429               BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
4430             }
4431
4432           /* Set up the first entry.  */
4433           c = 1;
4434           tab = (Elf64_gptab *) bfd_malloc (c * sizeof (Elf64_gptab));
4435           if (tab == NULL)
4436             return false;
4437           tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
4438           tab[0].gt_header.gt_unused = 0;
4439
4440           /* Combine the input sections.  */
4441           for (p = o->link_order_head;
4442                p != (struct bfd_link_order *) NULL;
4443                p = p->next)
4444             {
4445               asection *input_section;
4446               bfd *input_bfd;
4447               bfd_size_type size;
4448               unsigned long last;
4449               bfd_size_type gpentry;
4450
4451               if (p->type != bfd_indirect_link_order)
4452                 {
4453                   if (p->type == bfd_fill_link_order)
4454                     continue;
4455                   abort ();
4456                 }
4457
4458               input_section = p->u.indirect.section;
4459               input_bfd = input_section->owner;
4460
4461               /* Combine the gptab entries for this input section one
4462                  by one.  We know that the input gptab entries are
4463                  sorted by ascending -G value.  */
4464               size = bfd_section_size (input_bfd, input_section);
4465               last = 0;
4466               for (gpentry = sizeof (Elf64_External_gptab);
4467                    gpentry < size;
4468                    gpentry += sizeof (Elf64_External_gptab))
4469                 {
4470                   Elf64_External_gptab ext_gptab;
4471                   Elf64_gptab int_gptab;
4472                   unsigned long val;
4473                   unsigned long add;
4474                   boolean exact;
4475                   unsigned int look;
4476
4477                   if (! (bfd_get_section_contents
4478                          (input_bfd, input_section, (PTR) &ext_gptab,
4479                           gpentry, sizeof (Elf64_External_gptab))))
4480                     {
4481                       free (tab);
4482                       return false;
4483                     }
4484
4485                   bfd_alpha_elf64_swap_gptab_in (input_bfd, &ext_gptab,
4486                                                 &int_gptab);
4487                   val = int_gptab.gt_entry.gt_g_value;
4488                   add = int_gptab.gt_entry.gt_bytes - last;
4489
4490                   exact = false;
4491                   for (look = 1; look < c; look++)
4492                     {
4493                       if (tab[look].gt_entry.gt_g_value >= val)
4494                         tab[look].gt_entry.gt_bytes += add;
4495
4496                       if (tab[look].gt_entry.gt_g_value == val)
4497                         exact = true;
4498                     }
4499
4500                   if (! exact)
4501                     {
4502                       Elf64_gptab *new_tab;
4503                       unsigned int max;
4504
4505                       /* We need a new table entry.  */
4506                       new_tab = ((Elf64_gptab *)
4507                                  bfd_realloc ((PTR) tab,
4508                                               (c + 1) * sizeof (Elf64_gptab)));
4509                       if (new_tab == NULL)
4510                         {
4511                           free (tab);
4512                           return false;
4513                         }
4514                       tab = new_tab;
4515                       tab[c].gt_entry.gt_g_value = val;
4516                       tab[c].gt_entry.gt_bytes = add;
4517
4518                       /* Merge in the size for the next smallest -G
4519                          value, since that will be implied by this new
4520                          value.  */
4521                       max = 0;
4522                       for (look = 1; look < c; look++)
4523                         {
4524                           if (tab[look].gt_entry.gt_g_value < val
4525                               && (max == 0
4526                                   || (tab[look].gt_entry.gt_g_value
4527                                       > tab[max].gt_entry.gt_g_value)))
4528                             max = look;
4529                         }
4530                       if (max != 0)
4531                         tab[c].gt_entry.gt_bytes +=
4532                           tab[max].gt_entry.gt_bytes;
4533
4534                       ++c;
4535                     }
4536
4537                   last = int_gptab.gt_entry.gt_bytes;
4538                 }
4539
4540               /* Hack: reset the SEC_HAS_CONTENTS flag so that
4541                  elf_link_input_bfd ignores this section.  */
4542               input_section->flags &=~ SEC_HAS_CONTENTS;
4543             }
4544
4545           /* The table must be sorted by -G value.  */
4546           if (c > 2)
4547             qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
4548
4549           /* Swap out the table.  */
4550           ext_tab = ((Elf64_External_gptab *)
4551                      bfd_alloc (abfd, c * sizeof (Elf64_External_gptab)));
4552           if (ext_tab == NULL)
4553             {
4554               free (tab);
4555               return false;
4556             }
4557
4558           for (i = 0; i < c; i++)
4559             bfd_alpha_elf64_swap_gptab_out (abfd, tab + i, ext_tab + i);
4560           free (tab);
4561
4562           o->_raw_size = c * sizeof (Elf64_External_gptab);
4563           o->contents = (bfd_byte *) ext_tab;
4564
4565           /* Skip this section later on (I don't think this currently
4566              matters, but someday it might).  */
4567           o->link_order_head = (struct bfd_link_order *) NULL;
4568         }
4569 #endif
4570
4571     }
4572
4573   /* Invoke the regular ELF backend linker to do all the work.  */
4574   if (! bfd_elf64_bfd_final_link (abfd, info))
4575     return false;
4576
4577   /* Now write out the computed sections.  */
4578
4579   /* The .got subsections...  */
4580   {
4581     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
4582     for (i = alpha_elf_hash_table(info)->got_list;
4583          i != NULL;
4584          i = alpha_elf_tdata(i)->got_link_next)
4585       {
4586         asection *sgot;
4587
4588         /* elf_bfd_final_link already did everything in dynobj.  */
4589         if (i == dynobj)
4590           continue;
4591
4592         sgot = alpha_elf_tdata(i)->got;
4593         if (! bfd_set_section_contents (abfd, sgot->output_section,
4594                                         sgot->contents, sgot->output_offset,
4595                                         sgot->_raw_size))
4596           return false;
4597       }
4598   }
4599
4600 #ifdef ERIC_neverdef
4601   if (reginfo_sec != (asection *) NULL)
4602     {
4603       Elf64_External_RegInfo ext;
4604
4605       bfd_alpha_elf64_swap_reginfo_out (abfd, &reginfo, &ext);
4606       if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
4607                                       (file_ptr) 0, sizeof ext))
4608         return false;
4609     }
4610 #endif
4611
4612   if (mdebug_sec != (asection *) NULL)
4613     {
4614       BFD_ASSERT (abfd->output_has_begun);
4615       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
4616                                                swap, info,
4617                                                mdebug_sec->filepos))
4618         return false;
4619
4620       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
4621     }
4622
4623   if (gptab_data_sec != (asection *) NULL)
4624     {
4625       if (! bfd_set_section_contents (abfd, gptab_data_sec,
4626                                       gptab_data_sec->contents,
4627                                       (file_ptr) 0,
4628                                       gptab_data_sec->_raw_size))
4629         return false;
4630     }
4631
4632   if (gptab_bss_sec != (asection *) NULL)
4633     {
4634       if (! bfd_set_section_contents (abfd, gptab_bss_sec,
4635                                       gptab_bss_sec->contents,
4636                                       (file_ptr) 0,
4637                                       gptab_bss_sec->_raw_size))
4638         return false;
4639     }
4640
4641   return true;
4642 }
4643 \f
4644 /* ECOFF swapping routines.  These are used when dealing with the
4645    .mdebug section, which is in the ECOFF debugging format.  Copied
4646    from elf32-mips.c.  */
4647 static const struct ecoff_debug_swap
4648 elf64_alpha_ecoff_debug_swap =
4649 {
4650   /* Symbol table magic number.  */
4651   magicSym2,
4652   /* Alignment of debugging information.  E.g., 4.  */
4653   8,
4654   /* Sizes of external symbolic information.  */
4655   sizeof (struct hdr_ext),
4656   sizeof (struct dnr_ext),
4657   sizeof (struct pdr_ext),
4658   sizeof (struct sym_ext),
4659   sizeof (struct opt_ext),
4660   sizeof (struct fdr_ext),
4661   sizeof (struct rfd_ext),
4662   sizeof (struct ext_ext),
4663   /* Functions to swap in external symbolic data.  */
4664   ecoff_swap_hdr_in,
4665   ecoff_swap_dnr_in,
4666   ecoff_swap_pdr_in,
4667   ecoff_swap_sym_in,
4668   ecoff_swap_opt_in,
4669   ecoff_swap_fdr_in,
4670   ecoff_swap_rfd_in,
4671   ecoff_swap_ext_in,
4672   _bfd_ecoff_swap_tir_in,
4673   _bfd_ecoff_swap_rndx_in,
4674   /* Functions to swap out external symbolic data.  */
4675   ecoff_swap_hdr_out,
4676   ecoff_swap_dnr_out,
4677   ecoff_swap_pdr_out,
4678   ecoff_swap_sym_out,
4679   ecoff_swap_opt_out,
4680   ecoff_swap_fdr_out,
4681   ecoff_swap_rfd_out,
4682   ecoff_swap_ext_out,
4683   _bfd_ecoff_swap_tir_out,
4684   _bfd_ecoff_swap_rndx_out,
4685   /* Function to read in symbolic data.  */
4686   elf64_alpha_read_ecoff_info
4687 };
4688 \f
4689 /* Use a non-standard hash bucket size of 8.  */
4690
4691 const struct elf_size_info alpha_elf_size_info =
4692 {
4693   sizeof (Elf64_External_Ehdr),
4694   sizeof (Elf64_External_Phdr),
4695   sizeof (Elf64_External_Shdr),
4696   sizeof (Elf64_External_Rel),
4697   sizeof (Elf64_External_Rela),
4698   sizeof (Elf64_External_Sym),
4699   sizeof (Elf64_External_Dyn),
4700   sizeof (Elf_External_Note),
4701   8,
4702   1,
4703   64, 8,
4704   ELFCLASS64, EV_CURRENT,
4705   bfd_elf64_write_out_phdrs,
4706   bfd_elf64_write_shdrs_and_ehdr,
4707   bfd_elf64_write_relocs,
4708   bfd_elf64_swap_symbol_out,
4709   bfd_elf64_slurp_reloc_table,
4710   bfd_elf64_slurp_symbol_table,
4711   bfd_elf64_swap_dyn_in,
4712   bfd_elf64_swap_dyn_out,
4713   NULL,
4714   NULL,
4715   NULL,
4716   NULL
4717 };
4718
4719 #define TARGET_LITTLE_SYM       bfd_elf64_alpha_vec
4720 #define TARGET_LITTLE_NAME      "elf64-alpha"
4721 #define ELF_ARCH                bfd_arch_alpha
4722 #define ELF_MACHINE_CODE        EM_ALPHA
4723 #define ELF_MAXPAGESIZE         0x10000
4724
4725 #define bfd_elf64_bfd_link_hash_table_create \
4726   elf64_alpha_bfd_link_hash_table_create
4727
4728 #define bfd_elf64_bfd_reloc_type_lookup \
4729   elf64_alpha_bfd_reloc_type_lookup
4730 #define elf_info_to_howto \
4731   elf64_alpha_info_to_howto
4732
4733 #define bfd_elf64_mkobject \
4734   elf64_alpha_mkobject
4735 #define elf_backend_object_p \
4736   elf64_alpha_object_p
4737
4738 #define elf_backend_section_from_shdr \
4739   elf64_alpha_section_from_shdr
4740 #define elf_backend_fake_sections \
4741   elf64_alpha_fake_sections
4742
4743 #define bfd_elf64_bfd_is_local_label_name \
4744   elf64_alpha_is_local_label_name
4745 #define bfd_elf64_find_nearest_line \
4746   elf64_alpha_find_nearest_line
4747 #define bfd_elf64_bfd_relax_section \
4748   elf64_alpha_relax_section
4749
4750 #define elf_backend_add_symbol_hook \
4751   elf64_alpha_add_symbol_hook
4752 #define elf_backend_check_relocs \
4753   elf64_alpha_check_relocs
4754 #define elf_backend_create_dynamic_sections \
4755   elf64_alpha_create_dynamic_sections
4756 #define elf_backend_adjust_dynamic_symbol \
4757   elf64_alpha_adjust_dynamic_symbol
4758 #define elf_backend_always_size_sections \
4759   elf64_alpha_always_size_sections
4760 #define elf_backend_size_dynamic_sections \
4761   elf64_alpha_size_dynamic_sections
4762 #define elf_backend_relocate_section \
4763   elf64_alpha_relocate_section
4764 #define elf_backend_finish_dynamic_symbol \
4765   elf64_alpha_finish_dynamic_symbol
4766 #define elf_backend_finish_dynamic_sections \
4767   elf64_alpha_finish_dynamic_sections
4768 #define bfd_elf64_bfd_final_link \
4769   elf64_alpha_final_link
4770
4771 #define elf_backend_ecoff_debug_swap \
4772   &elf64_alpha_ecoff_debug_swap
4773
4774 #define elf_backend_size_info \
4775   alpha_elf_size_info
4776
4777 /* A few constants that determine how the .plt section is set up.  */
4778 #define elf_backend_want_got_plt 0
4779 #define elf_backend_plt_readonly 0
4780 #define elf_backend_want_plt_sym 1
4781 #define elf_backend_got_header_size 0
4782 #define elf_backend_plt_header_size PLT_HEADER_SIZE
4783
4784 #include "elf64-target.h"