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