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