* elf64-alpha.c: Remove dead code.
[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 \f
2483 /* Search for and possibly create a got entry.  */
2484
2485 static struct alpha_elf_got_entry *
2486 get_got_entry (abfd, h, r_type, r_symndx, r_addend)
2487      bfd *abfd;
2488      struct alpha_elf_link_hash_entry *h;
2489      unsigned long r_type, r_symndx;
2490      bfd_vma r_addend;
2491 {
2492   struct alpha_elf_got_entry *gotent;
2493   struct alpha_elf_got_entry **slot;
2494
2495   if (h)
2496     slot = &h->got_entries;
2497   else
2498     {
2499       /* This is a local .got entry -- record for merge.  */
2500
2501       struct alpha_elf_got_entry **local_got_entries;
2502
2503       local_got_entries = alpha_elf_tdata(abfd)->local_got_entries;
2504       if (!local_got_entries)
2505         {
2506           bfd_size_type size;
2507           Elf_Internal_Shdr *symtab_hdr;
2508
2509           symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
2510           size = symtab_hdr->sh_info;
2511           size *= sizeof (struct alpha_elf_got_entry *);
2512
2513           local_got_entries
2514             = (struct alpha_elf_got_entry **) bfd_alloc (abfd, size);
2515           if (!local_got_entries)
2516             return NULL;
2517
2518           memset (local_got_entries, 0, (size_t) size);
2519           alpha_elf_tdata (abfd)->local_got_entries = local_got_entries;
2520         }
2521
2522       slot = &local_got_entries[r_symndx];
2523     }
2524
2525   for (gotent = *slot; gotent ; gotent = gotent->next)
2526     if (gotent->gotobj == abfd
2527         && gotent->reloc_type == r_type
2528         && gotent->addend == r_addend)
2529       break;
2530
2531   if (!gotent)
2532     {
2533       int entry_size;
2534       bfd_size_type amt;
2535
2536       amt = sizeof (struct alpha_elf_got_entry);
2537       gotent = (struct alpha_elf_got_entry *) bfd_alloc (abfd, amt);
2538       if (!gotent)
2539         return NULL;
2540
2541       gotent->gotobj = abfd;
2542       gotent->addend = r_addend;
2543       gotent->got_offset = -1;
2544       gotent->use_count = 1;
2545       gotent->reloc_type = r_type;
2546       gotent->reloc_done = 0;
2547       gotent->reloc_xlated = 0;
2548
2549       gotent->next = *slot;
2550       *slot = gotent;
2551
2552       entry_size = alpha_got_entry_size (r_type);
2553       alpha_elf_tdata (abfd)->total_got_size += entry_size;
2554       if (!h)
2555         alpha_elf_tdata(abfd)->local_got_size += entry_size;
2556     }
2557   else
2558     gotent->use_count += 1;
2559
2560   return gotent;
2561 }
2562
2563 /* Handle dynamic relocations when doing an Alpha ELF link.  */
2564
2565 static boolean
2566 elf64_alpha_check_relocs (abfd, info, sec, relocs)
2567      bfd *abfd;
2568      struct bfd_link_info *info;
2569      asection *sec;
2570      const Elf_Internal_Rela *relocs;
2571 {
2572   bfd *dynobj;
2573   asection *sreloc;
2574   const char *rel_sec_name;
2575   Elf_Internal_Shdr *symtab_hdr;
2576   struct alpha_elf_link_hash_entry **sym_hashes;
2577   const Elf_Internal_Rela *rel, *relend;
2578   boolean got_created;
2579   bfd_size_type amt;
2580
2581   if (info->relocateable)
2582     return true;
2583
2584   dynobj = elf_hash_table(info)->dynobj;
2585   if (dynobj == NULL)
2586     elf_hash_table(info)->dynobj = dynobj = abfd;
2587
2588   sreloc = NULL;
2589   rel_sec_name = NULL;
2590   symtab_hdr = &elf_tdata(abfd)->symtab_hdr;
2591   sym_hashes = alpha_elf_sym_hashes(abfd);
2592   got_created = false;
2593
2594   relend = relocs + sec->reloc_count;
2595   for (rel = relocs; rel < relend; ++rel)
2596     {
2597       enum {
2598         NEED_GOT = 1,
2599         NEED_GOT_ENTRY = 2,
2600         NEED_DYNREL = 4
2601       };
2602
2603       unsigned long r_symndx, r_type;
2604       struct alpha_elf_link_hash_entry *h;
2605       unsigned int gotent_flags;
2606       boolean maybe_dynamic;
2607       unsigned int need;
2608       bfd_vma addend;
2609
2610       r_symndx = ELF64_R_SYM (rel->r_info);
2611       if (r_symndx < symtab_hdr->sh_info)
2612         h = NULL;
2613       else
2614         {
2615           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2616
2617           while (h->root.root.type == bfd_link_hash_indirect
2618                  || h->root.root.type == bfd_link_hash_warning)
2619             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
2620
2621           h->root.elf_link_hash_flags |= ELF_LINK_HASH_REF_REGULAR;
2622         }
2623
2624       /* We can only get preliminary data on whether a symbol is
2625          locally or externally defined, as not all of the input files
2626          have yet been processed.  Do something with what we know, as
2627          this may help reduce memory usage and processing time later.  */
2628       maybe_dynamic = false;
2629       if (h && ((info->shared
2630                  && (!info->symbolic || info->allow_shlib_undefined))
2631                 || ! (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR)
2632                 || h->root.root.type == bfd_link_hash_defweak))
2633         maybe_dynamic = true;
2634
2635       need = 0;
2636       gotent_flags = 0;
2637       r_type = ELF64_R_TYPE (rel->r_info);
2638       addend = rel->r_addend;
2639
2640       switch (r_type)
2641         {
2642         case R_ALPHA_LITERAL:
2643           need = NEED_GOT | NEED_GOT_ENTRY;
2644
2645           /* Remember how this literal is used from its LITUSEs.
2646              This will be important when it comes to decide if we can
2647              create a .plt entry for a function symbol.  */
2648           while (++rel < relend && ELF64_R_TYPE (rel->r_info) == R_ALPHA_LITUSE)
2649             if (rel->r_addend >= 1 && rel->r_addend <= 5)
2650               gotent_flags |= 1 << rel->r_addend;
2651           --rel;
2652
2653           /* No LITUSEs -- presumably the address is used somehow.  */
2654           if (gotent_flags == 0)
2655             gotent_flags = ALPHA_ELF_LINK_HASH_LU_ADDR;
2656           break;
2657
2658         case R_ALPHA_GPDISP:
2659         case R_ALPHA_GPREL16:
2660         case R_ALPHA_GPREL32:
2661         case R_ALPHA_GPRELHIGH:
2662         case R_ALPHA_GPRELLOW:
2663         case R_ALPHA_BRSGP:
2664           need = NEED_GOT;
2665           break;
2666
2667         case R_ALPHA_REFLONG:
2668         case R_ALPHA_REFQUAD:
2669           if (info->shared || maybe_dynamic)
2670             need = NEED_DYNREL;
2671           break;
2672
2673         case R_ALPHA_TLSGD:
2674         case R_ALPHA_TLSLDM:
2675         case R_ALPHA_GOTDTPREL:
2676           need = NEED_GOT | NEED_GOT_ENTRY;
2677           break;
2678
2679         case R_ALPHA_GOTTPREL:
2680           need = NEED_GOT | NEED_GOT_ENTRY;
2681           if (info->shared)
2682             info->flags |= DF_STATIC_TLS;
2683           break;
2684
2685         case R_ALPHA_TPREL64:
2686           if (info->shared || maybe_dynamic)
2687             need = NEED_DYNREL;
2688           if (info->shared)
2689             info->flags |= DF_STATIC_TLS;
2690           break;
2691         }
2692
2693       if (need & NEED_GOT)
2694         {
2695           if (!got_created)
2696             {
2697               if (!elf64_alpha_create_got_section (abfd, info))
2698                 return false;
2699
2700               /* Make sure the object's gotobj is set to itself so
2701                  that we default to every object with its own .got.
2702                  We'll merge .gots later once we've collected each
2703                  object's info.  */
2704               alpha_elf_tdata(abfd)->gotobj = abfd;
2705
2706               got_created = 1;
2707             }
2708         }
2709
2710       if (need & NEED_GOT_ENTRY)
2711         {
2712           struct alpha_elf_got_entry *gotent;
2713
2714           gotent = get_got_entry (abfd, h, r_type, r_symndx, addend);
2715           if (!gotent)
2716             return false;
2717
2718           if (gotent_flags)
2719             {
2720               gotent->flags |= gotent_flags;
2721               if (h)
2722                 {
2723                   gotent_flags |= h->flags;
2724                   h->flags = gotent_flags;
2725
2726                   /* Make a guess as to whether a .plt entry is needed.  */
2727                   if ((gotent_flags & ALPHA_ELF_LINK_HASH_LU_FUNC)
2728                       && !(gotent_flags & ~ALPHA_ELF_LINK_HASH_LU_FUNC))
2729                     h->root.elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2730                   else
2731                     h->root.elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2732                 }
2733             }
2734         }
2735
2736       if (need & NEED_DYNREL)
2737         {
2738           if (rel_sec_name == NULL)
2739             {
2740               rel_sec_name = (bfd_elf_string_from_elf_section
2741                               (abfd, elf_elfheader(abfd)->e_shstrndx,
2742                                elf_section_data(sec)->rel_hdr.sh_name));
2743               if (rel_sec_name == NULL)
2744                 return false;
2745
2746               BFD_ASSERT (strncmp (rel_sec_name, ".rela", 5) == 0
2747                           && strcmp (bfd_get_section_name (abfd, sec),
2748                                      rel_sec_name+5) == 0);
2749             }
2750
2751           /* We need to create the section here now whether we eventually
2752              use it or not so that it gets mapped to an output section by
2753              the linker.  If not used, we'll kill it in
2754              size_dynamic_sections.  */
2755           if (sreloc == NULL)
2756             {
2757               sreloc = bfd_get_section_by_name (dynobj, rel_sec_name);
2758               if (sreloc == NULL)
2759                 {
2760                   flagword flags;
2761
2762                   sreloc = bfd_make_section (dynobj, rel_sec_name);
2763                   flags = (SEC_HAS_CONTENTS | SEC_IN_MEMORY
2764                            | SEC_LINKER_CREATED | SEC_READONLY);
2765                   if (sec->flags & SEC_ALLOC)
2766                     flags |= SEC_ALLOC | SEC_LOAD;
2767                   if (sreloc == NULL
2768                       || !bfd_set_section_flags (dynobj, sreloc, flags)
2769                       || !bfd_set_section_alignment (dynobj, sreloc, 3))
2770                     return false;
2771                 }
2772             }
2773
2774           if (h)
2775             {
2776               /* Since we havn't seen all of the input symbols yet, we
2777                  don't know whether we'll actually need a dynamic relocation
2778                  entry for this reloc.  So make a record of it.  Once we
2779                  find out if this thing needs dynamic relocation we'll
2780                  expand the relocation sections by the appropriate amount.  */
2781
2782               struct alpha_elf_reloc_entry *rent;
2783
2784               for (rent = h->reloc_entries; rent; rent = rent->next)
2785                 if (rent->rtype == r_type && rent->srel == sreloc)
2786                   break;
2787
2788               if (!rent)
2789                 {
2790                   amt = sizeof (struct alpha_elf_reloc_entry);
2791                   rent = (struct alpha_elf_reloc_entry *) bfd_alloc (abfd, amt);
2792                   if (!rent)
2793                     return false;
2794
2795                   rent->srel = sreloc;
2796                   rent->rtype = r_type;
2797                   rent->count = 1;
2798                   rent->reltext = ((sec->flags & (SEC_READONLY | SEC_ALLOC))
2799                                    == (SEC_READONLY | SEC_ALLOC));
2800
2801                   rent->next = h->reloc_entries;
2802                   h->reloc_entries = rent;
2803                 }
2804               else
2805                 rent->count++;
2806             }
2807           else if (info->shared)
2808             {
2809               /* If this is a shared library, and the section is to be
2810                  loaded into memory, we need a RELATIVE reloc.  */
2811               sreloc->_raw_size += sizeof (Elf64_External_Rela);
2812               if ((sec->flags & (SEC_READONLY | SEC_ALLOC))
2813                   == (SEC_READONLY | SEC_ALLOC))
2814                 info->flags |= DF_TEXTREL;
2815             }
2816         }
2817     }
2818
2819   return true;
2820 }
2821
2822 /* Adjust a symbol defined by a dynamic object and referenced by a
2823    regular object.  The current definition is in some section of the
2824    dynamic object, but we're not including those sections.  We have to
2825    change the definition to something the rest of the link can
2826    understand.  */
2827
2828 static boolean
2829 elf64_alpha_adjust_dynamic_symbol (info, h)
2830      struct bfd_link_info *info;
2831      struct elf_link_hash_entry *h;
2832 {
2833   bfd *dynobj;
2834   asection *s;
2835   struct alpha_elf_link_hash_entry *ah;
2836
2837   dynobj = elf_hash_table(info)->dynobj;
2838   ah = (struct alpha_elf_link_hash_entry *)h;
2839
2840   /* Now that we've seen all of the input symbols, finalize our decision
2841      about whether this symbol should get a .plt entry.  */
2842
2843   if (alpha_elf_dynamic_symbol_p (h, info)
2844       && ((h->type == STT_FUNC
2845            && !(ah->flags & ALPHA_ELF_LINK_HASH_LU_ADDR))
2846           || (h->type == STT_NOTYPE
2847               && (ah->flags & ALPHA_ELF_LINK_HASH_LU_FUNC)
2848               && !(ah->flags & ~ALPHA_ELF_LINK_HASH_LU_FUNC)))
2849       /* Don't prevent otherwise valid programs from linking by attempting
2850          to create a new .got entry somewhere.  A Correct Solution would be
2851          to add a new .got section to a new object file and let it be merged
2852          somewhere later.  But for now don't bother.  */
2853       && ah->got_entries)
2854     {
2855       h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2856
2857       s = bfd_get_section_by_name(dynobj, ".plt");
2858       if (!s && !elf64_alpha_create_dynamic_sections (dynobj, info))
2859         return false;
2860
2861       /* The first bit of the .plt is reserved.  */
2862       if (s->_raw_size == 0)
2863         s->_raw_size = PLT_HEADER_SIZE;
2864
2865       h->plt.offset = s->_raw_size;
2866       s->_raw_size += PLT_ENTRY_SIZE;
2867
2868       /* If this symbol is not defined in a regular file, and we are not
2869          generating a shared library, then set the symbol to the location
2870          in the .plt.  This is required to make function pointers compare
2871          equal between the normal executable and the shared library.  */
2872       if (! info->shared
2873           && h->root.type != bfd_link_hash_defweak)
2874         {
2875           h->root.u.def.section = s;
2876           h->root.u.def.value = h->plt.offset;
2877         }
2878
2879       /* We also need a JMP_SLOT entry in the .rela.plt section.  */
2880       s = bfd_get_section_by_name (dynobj, ".rela.plt");
2881       BFD_ASSERT (s != NULL);
2882       s->_raw_size += sizeof (Elf64_External_Rela);
2883
2884       return true;
2885     }
2886   else
2887     h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2888
2889   /* If this is a weak symbol, and there is a real definition, the
2890      processor independent code will have arranged for us to see the
2891      real definition first, and we can just use the same value.  */
2892   if (h->weakdef != NULL)
2893     {
2894       BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2895                   || h->weakdef->root.type == bfd_link_hash_defweak);
2896       h->root.u.def.section = h->weakdef->root.u.def.section;
2897       h->root.u.def.value = h->weakdef->root.u.def.value;
2898       return true;
2899     }
2900
2901   /* This is a reference to a symbol defined by a dynamic object which
2902      is not a function.  The Alpha, since it uses .got entries for all
2903      symbols even in regular objects, does not need the hackery of a
2904      .dynbss section and COPY dynamic relocations.  */
2905
2906   return true;
2907 }
2908
2909 /* Symbol versioning can create new symbols, and make our old symbols
2910    indirect to the new ones.  Consolidate the got and reloc information
2911    in these situations.  */
2912
2913 static boolean
2914 elf64_alpha_merge_ind_symbols (hi, dummy)
2915      struct alpha_elf_link_hash_entry *hi;
2916      PTR dummy ATTRIBUTE_UNUSED;
2917 {
2918   struct alpha_elf_link_hash_entry *hs;
2919
2920   if (hi->root.root.type != bfd_link_hash_indirect)
2921     return true;
2922   hs = hi;
2923   do {
2924     hs = (struct alpha_elf_link_hash_entry *)hs->root.root.u.i.link;
2925   } while (hs->root.root.type == bfd_link_hash_indirect);
2926
2927   /* Merge the flags.  Whee.  */
2928
2929   hs->flags |= hi->flags;
2930
2931   /* Merge the .got entries.  Cannibalize the old symbol's list in
2932      doing so, since we don't need it anymore.  */
2933
2934   if (hs->got_entries == NULL)
2935     hs->got_entries = hi->got_entries;
2936   else
2937     {
2938       struct alpha_elf_got_entry *gi, *gs, *gin, *gsh;
2939
2940       gsh = hs->got_entries;
2941       for (gi = hi->got_entries; gi ; gi = gin)
2942         {
2943           gin = gi->next;
2944           for (gs = gsh; gs ; gs = gs->next)
2945             if (gi->gotobj == gs->gotobj
2946                 && gi->reloc_type == gs->reloc_type
2947                 && gi->addend == gs->addend)
2948               {
2949                 gi->use_count += gs->use_count;
2950                 goto got_found;
2951               }
2952           gi->next = hs->got_entries;
2953           hs->got_entries = gi;
2954         got_found:;
2955         }
2956     }
2957   hi->got_entries = NULL;
2958
2959   /* And similar for the reloc entries.  */
2960
2961   if (hs->reloc_entries == NULL)
2962     hs->reloc_entries = hi->reloc_entries;
2963   else
2964     {
2965       struct alpha_elf_reloc_entry *ri, *rs, *rin, *rsh;
2966
2967       rsh = hs->reloc_entries;
2968       for (ri = hi->reloc_entries; ri ; ri = rin)
2969         {
2970           rin = ri->next;
2971           for (rs = rsh; rs ; rs = rs->next)
2972             if (ri->rtype == rs->rtype)
2973               {
2974                 rs->count += ri->count;
2975                 goto found_reloc;
2976               }
2977           ri->next = hs->reloc_entries;
2978           hs->reloc_entries = ri;
2979         found_reloc:;
2980         }
2981     }
2982   hi->reloc_entries = NULL;
2983
2984   return true;
2985 }
2986
2987 /* Is it possible to merge two object file's .got tables?  */
2988
2989 static boolean
2990 elf64_alpha_can_merge_gots (a, b)
2991      bfd *a, *b;
2992 {
2993   int total = alpha_elf_tdata (a)->total_got_size;
2994   bfd *bsub;
2995
2996   /* Trivial quick fallout test.  */
2997   if (total + alpha_elf_tdata (b)->total_got_size <= MAX_GOT_SIZE)
2998     return true;
2999
3000   /* By their nature, local .got entries cannot be merged.  */
3001   if ((total += alpha_elf_tdata (b)->local_got_size) > MAX_GOT_SIZE)
3002     return false;
3003
3004   /* Failing the common trivial comparison, we must effectively
3005      perform the merge.  Not actually performing the merge means that
3006      we don't have to store undo information in case we fail.  */
3007   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
3008     {
3009       struct alpha_elf_link_hash_entry **hashes = alpha_elf_sym_hashes (bsub);
3010       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
3011       int i, n;
3012
3013       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
3014       for (i = 0; i < n; ++i)
3015         {
3016           struct alpha_elf_got_entry *ae, *be;
3017           struct alpha_elf_link_hash_entry *h;
3018
3019           h = hashes[i];
3020           while (h->root.root.type == bfd_link_hash_indirect
3021                  || h->root.root.type == bfd_link_hash_warning)
3022             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3023
3024           for (be = h->got_entries; be ; be = be->next)
3025             {
3026               if (be->use_count == 0)
3027                 continue;
3028               if (be->gotobj != b)
3029                 continue;
3030
3031               for (ae = h->got_entries; ae ; ae = ae->next)
3032                 if (ae->gotobj == a
3033                     && ae->reloc_type == be->reloc_type
3034                     && ae->addend == be->addend)
3035                   goto global_found;
3036
3037               total += alpha_got_entry_size (be->reloc_type);
3038               if (total > MAX_GOT_SIZE)
3039                 return false;
3040             global_found:;
3041             }
3042         }
3043     }
3044
3045   return true;
3046 }
3047
3048 /* Actually merge two .got tables.  */
3049
3050 static void
3051 elf64_alpha_merge_gots (a, b)
3052      bfd *a, *b;
3053 {
3054   int total = alpha_elf_tdata (a)->total_got_size;
3055   bfd *bsub;
3056
3057   /* Remember local expansion.  */
3058   {
3059     int e = alpha_elf_tdata (b)->local_got_size;
3060     total += e;
3061     alpha_elf_tdata (a)->local_got_size += e;
3062   }
3063
3064   for (bsub = b; bsub ; bsub = alpha_elf_tdata (bsub)->in_got_link_next)
3065     {
3066       struct alpha_elf_got_entry **local_got_entries;
3067       struct alpha_elf_link_hash_entry **hashes;
3068       Elf_Internal_Shdr *symtab_hdr;
3069       int i, n;
3070
3071       /* Let the local .got entries know they are part of a new subsegment.  */
3072       local_got_entries = alpha_elf_tdata (bsub)->local_got_entries;
3073       if (local_got_entries)
3074         {
3075           n = elf_tdata (bsub)->symtab_hdr.sh_info;
3076           for (i = 0; i < n; ++i)
3077             {
3078               struct alpha_elf_got_entry *ent;
3079               for (ent = local_got_entries[i]; ent; ent = ent->next)
3080                 ent->gotobj = a;
3081             }
3082         }
3083
3084       /* Merge the global .got entries.  */
3085       hashes = alpha_elf_sym_hashes (bsub);
3086       symtab_hdr = &elf_tdata (bsub)->symtab_hdr;
3087
3088       n = NUM_SHDR_ENTRIES (symtab_hdr) - symtab_hdr->sh_info;
3089       for (i = 0; i < n; ++i)
3090         {
3091           struct alpha_elf_got_entry *ae, *be, **pbe, **start;
3092           struct alpha_elf_link_hash_entry *h;
3093
3094           h = hashes[i];
3095           while (h->root.root.type == bfd_link_hash_indirect
3096                  || h->root.root.type == bfd_link_hash_warning)
3097             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3098
3099           start = &h->got_entries;
3100           for (pbe = start, be = *start; be ; pbe = &be->next, be = be->next)
3101             {
3102               if (be->use_count == 0)
3103                 {
3104                   *pbe = be->next;
3105                   continue;
3106                 }
3107               if (be->gotobj != b)
3108                 continue;
3109
3110               for (ae = *start; ae ; ae = ae->next)
3111                 if (ae->gotobj == a
3112                     && ae->reloc_type == be->reloc_type
3113                     && ae->addend == be->addend)
3114                   {
3115                     ae->flags |= be->flags;
3116                     ae->use_count += be->use_count;
3117                     *pbe = be->next;
3118                     goto global_found;
3119                   }
3120               be->gotobj = a;
3121               total += alpha_got_entry_size (be->reloc_type);
3122
3123             global_found:;
3124             }
3125         }
3126
3127       alpha_elf_tdata (bsub)->gotobj = a;
3128     }
3129   alpha_elf_tdata (a)->total_got_size = total;
3130
3131   /* Merge the two in_got chains.  */
3132   {
3133     bfd *next;
3134
3135     bsub = a;
3136     while ((next = alpha_elf_tdata (bsub)->in_got_link_next) != NULL)
3137       bsub = next;
3138
3139     alpha_elf_tdata (bsub)->in_got_link_next = b;
3140   }
3141 }
3142
3143 /* Calculate the offsets for the got entries.  */
3144
3145 static boolean
3146 elf64_alpha_calc_got_offsets_for_symbol (h, arg)
3147      struct alpha_elf_link_hash_entry *h;
3148      PTR arg ATTRIBUTE_UNUSED;
3149 {
3150   struct alpha_elf_got_entry *gotent;
3151
3152   if (h->root.root.type == bfd_link_hash_warning)
3153     h = (struct alpha_elf_link_hash_entry *) h->root.root.u.i.link;
3154
3155   for (gotent = h->got_entries; gotent; gotent = gotent->next)
3156     if (gotent->use_count > 0)
3157       {
3158         bfd_size_type *plge
3159           = &alpha_elf_tdata (gotent->gotobj)->got->_raw_size;
3160
3161         gotent->got_offset = *plge;
3162         *plge += alpha_got_entry_size (gotent->reloc_type);
3163       }
3164
3165   return true;
3166 }
3167
3168 static void
3169 elf64_alpha_calc_got_offsets (info)
3170      struct bfd_link_info *info;
3171 {
3172   bfd *i, *got_list = alpha_elf_hash_table(info)->got_list;
3173
3174   /* First, zero out the .got sizes, as we may be recalculating the
3175      .got after optimizing it.  */
3176   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
3177     alpha_elf_tdata(i)->got->_raw_size = 0;
3178
3179   /* Next, fill in the offsets for all the global entries.  */
3180   alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3181                                 elf64_alpha_calc_got_offsets_for_symbol,
3182                                 NULL);
3183
3184   /* Finally, fill in the offsets for the local entries.  */
3185   for (i = got_list; i ; i = alpha_elf_tdata(i)->got_link_next)
3186     {
3187       bfd_size_type got_offset = alpha_elf_tdata(i)->got->_raw_size;
3188       bfd *j;
3189
3190       for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
3191         {
3192           struct alpha_elf_got_entry **local_got_entries, *gotent;
3193           int k, n;
3194
3195           local_got_entries = alpha_elf_tdata(j)->local_got_entries;
3196           if (!local_got_entries)
3197             continue;
3198
3199           for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
3200             for (gotent = local_got_entries[k]; gotent; gotent = gotent->next)
3201               if (gotent->use_count > 0)
3202                 {
3203                   gotent->got_offset = got_offset;
3204                   got_offset += alpha_got_entry_size (gotent->reloc_type);
3205                 }
3206         }
3207
3208       alpha_elf_tdata(i)->got->_raw_size = got_offset;
3209       alpha_elf_tdata(i)->got->_cooked_size = got_offset;
3210     }
3211 }
3212
3213 /* Constructs the gots.  */
3214
3215 static boolean
3216 elf64_alpha_size_got_sections (output_bfd, info)
3217      bfd *output_bfd ATTRIBUTE_UNUSED;
3218      struct bfd_link_info *info;
3219 {
3220   bfd *i, *got_list, *cur_got_obj = NULL;
3221   int something_changed = 0;
3222
3223   got_list = alpha_elf_hash_table (info)->got_list;
3224
3225   /* On the first time through, pretend we have an existing got list
3226      consisting of all of the input files.  */
3227   if (got_list == NULL)
3228     {
3229       for (i = info->input_bfds; i ; i = i->link_next)
3230         {
3231           bfd *this_got = alpha_elf_tdata (i)->gotobj;
3232           if (this_got == NULL)
3233             continue;
3234
3235           /* We are assuming no merging has yet ocurred.  */
3236           BFD_ASSERT (this_got == i);
3237
3238           if (alpha_elf_tdata (this_got)->total_got_size > MAX_GOT_SIZE)
3239             {
3240               /* Yikes! A single object file has too many entries.  */
3241               (*_bfd_error_handler)
3242                 (_("%s: .got subsegment exceeds 64K (size %d)"),
3243                  bfd_archive_filename (i),
3244                  alpha_elf_tdata (this_got)->total_got_size);
3245               return false;
3246             }
3247
3248           if (got_list == NULL)
3249             got_list = this_got;
3250           else
3251             alpha_elf_tdata(cur_got_obj)->got_link_next = this_got;
3252           cur_got_obj = this_got;
3253         }
3254
3255       /* Strange degenerate case of no got references.  */
3256       if (got_list == NULL)
3257         return true;
3258
3259       alpha_elf_hash_table (info)->got_list = got_list;
3260
3261       /* Force got offsets to be recalculated.  */
3262       something_changed = 1;
3263     }
3264
3265   cur_got_obj = got_list;
3266   i = alpha_elf_tdata(cur_got_obj)->got_link_next;
3267   while (i != NULL)
3268     {
3269       if (elf64_alpha_can_merge_gots (cur_got_obj, i))
3270         {
3271           elf64_alpha_merge_gots (cur_got_obj, i);
3272           i = alpha_elf_tdata(i)->got_link_next;
3273           alpha_elf_tdata(cur_got_obj)->got_link_next = i;
3274           something_changed = 1;
3275         }
3276       else
3277         {
3278           cur_got_obj = i;
3279           i = alpha_elf_tdata(i)->got_link_next;
3280         }
3281     }
3282
3283   /* Once the gots have been merged, fill in the got offsets for
3284      everything therein.  */
3285   if (1 || something_changed)
3286     elf64_alpha_calc_got_offsets (info);
3287
3288   return true;
3289 }
3290
3291 static boolean
3292 elf64_alpha_always_size_sections (output_bfd, info)
3293      bfd *output_bfd;
3294      struct bfd_link_info *info;
3295 {
3296   bfd *i;
3297
3298   if (info->relocateable)
3299     return true;
3300
3301   /* First, take care of the indirect symbols created by versioning.  */
3302   alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3303                                 elf64_alpha_merge_ind_symbols,
3304                                 NULL);
3305
3306   if (!elf64_alpha_size_got_sections (output_bfd, info))
3307     return false;
3308
3309   /* Allocate space for all of the .got subsections.  */
3310   i = alpha_elf_hash_table (info)->got_list;
3311   for ( ; i ; i = alpha_elf_tdata(i)->got_link_next)
3312     {
3313       asection *s = alpha_elf_tdata(i)->got;
3314       if (s->_raw_size > 0)
3315         {
3316           s->contents = (bfd_byte *) bfd_zalloc (i, s->_raw_size);
3317           if (s->contents == NULL)
3318             return false;
3319         }
3320     }
3321
3322   return true;
3323 }
3324
3325 /* The number of dynamic relocations required by a static relocation.  */
3326
3327 static int
3328 alpha_dynamic_entries_for_reloc (r_type, dynamic, shared)
3329      int r_type, dynamic, shared;
3330 {
3331   switch (r_type)
3332     {
3333     /* May appear in GOT entries.  */
3334     case R_ALPHA_TLSGD:
3335       return (dynamic ? 2 : shared ? 1 : 0);
3336     case R_ALPHA_TLSLDM:
3337       return shared;
3338     case R_ALPHA_LITERAL:
3339       return dynamic || shared;
3340     case R_ALPHA_GOTDTPREL:
3341     case R_ALPHA_GOTTPREL:
3342       return dynamic;
3343
3344     /* May appear in data sections.  */
3345     case R_ALPHA_REFLONG:
3346     case R_ALPHA_REFQUAD:
3347       return dynamic || shared;
3348     case R_ALPHA_SREL64:
3349     case R_ALPHA_TPREL64:
3350       return dynamic;
3351
3352     /* Everything else is illegal.  We'll issue an error during
3353        relocate_section.  */
3354     default:
3355       return 0;
3356     }
3357 }
3358
3359 /* Work out the sizes of the dynamic relocation entries.  */
3360
3361 static boolean
3362 elf64_alpha_calc_dynrel_sizes (h, info)
3363      struct alpha_elf_link_hash_entry *h;
3364      struct bfd_link_info *info;
3365 {
3366   boolean dynamic;
3367   struct alpha_elf_reloc_entry *relent;
3368   struct alpha_elf_got_entry *gotent;
3369   int entries;
3370
3371   if (h->root.root.type == bfd_link_hash_warning)
3372     h = (struct alpha_elf_link_hash_entry *) h->root.root.u.i.link;
3373
3374   /* If the symbol was defined as a common symbol in a regular object
3375      file, and there was no definition in any dynamic object, then the
3376      linker will have allocated space for the symbol in a common
3377      section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
3378      set.  This is done for dynamic symbols in
3379      elf_adjust_dynamic_symbol but this is not done for non-dynamic
3380      symbols, somehow.  */
3381   if (((h->root.elf_link_hash_flags
3382        & (ELF_LINK_HASH_DEF_REGULAR
3383           | ELF_LINK_HASH_REF_REGULAR
3384           | ELF_LINK_HASH_DEF_DYNAMIC))
3385        == ELF_LINK_HASH_REF_REGULAR)
3386       && (h->root.root.type == bfd_link_hash_defined
3387           || h->root.root.type == bfd_link_hash_defweak)
3388       && !(h->root.root.u.def.section->owner->flags & DYNAMIC))
3389     {
3390       h->root.elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
3391     }
3392
3393   /* If the symbol is dynamic, we'll need all the relocations in their
3394      natural form.  If this is a shared object, and it has been forced
3395      local, we'll need the same number of RELATIVE relocations.  */
3396
3397   dynamic = alpha_elf_dynamic_symbol_p (&h->root, info);
3398
3399   for (relent = h->reloc_entries; relent; relent = relent->next)
3400     {
3401       entries = alpha_dynamic_entries_for_reloc (relent->rtype, dynamic,
3402                                                  info->shared);
3403       if (entries)
3404         {
3405           relent->srel->_raw_size +=
3406             entries * sizeof (Elf64_External_Rela) * relent->count;
3407           if (relent->reltext)
3408             info->flags |= DT_TEXTREL;
3409         }
3410     }
3411
3412   entries = 0;
3413   for (gotent = h->got_entries; gotent ; gotent = gotent->next)
3414     entries += alpha_dynamic_entries_for_reloc (gotent->reloc_type,
3415                                                 dynamic, info->shared);
3416
3417   /* If we are using a .plt entry, subtract one, as the first
3418      reference uses a .rela.plt entry instead.  */
3419   if (h->root.plt.offset != MINUS_ONE)
3420     entries--;
3421
3422   if (entries > 0)
3423     {
3424       bfd *dynobj = elf_hash_table(info)->dynobj;
3425       asection *srel = bfd_get_section_by_name (dynobj, ".rela.got");
3426       BFD_ASSERT (srel != NULL);
3427       srel->_raw_size += sizeof (Elf64_External_Rela) * entries;
3428     }
3429
3430   return true;
3431 }
3432
3433 /* Set the sizes of the dynamic sections.  */
3434
3435 static boolean
3436 elf64_alpha_size_dynamic_sections (output_bfd, info)
3437      bfd *output_bfd ATTRIBUTE_UNUSED;
3438      struct bfd_link_info *info;
3439 {
3440   bfd *dynobj;
3441   asection *s;
3442   boolean relplt;
3443
3444   dynobj = elf_hash_table(info)->dynobj;
3445   BFD_ASSERT(dynobj != NULL);
3446
3447   if (elf_hash_table (info)->dynamic_sections_created)
3448     {
3449       int entries;
3450       bfd *i;
3451
3452       /* Set the contents of the .interp section to the interpreter.  */
3453       if (!info->shared)
3454         {
3455           s = bfd_get_section_by_name (dynobj, ".interp");
3456           BFD_ASSERT (s != NULL);
3457           s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
3458           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3459         }
3460
3461       /* Now that we've seen all of the input files, we can decide which
3462          symbols need dynamic relocation entries and which don't.  We've
3463          collected information in check_relocs that we can now apply to
3464          size the dynamic relocation sections.  */
3465       alpha_elf_link_hash_traverse (alpha_elf_hash_table (info),
3466                                     elf64_alpha_calc_dynrel_sizes,
3467                                     info);
3468
3469       /* Shared libraries often require RELATIVE relocs, and some relocs
3470          require attention for the main application as well.  */
3471          
3472       entries = 0;
3473       for (i = alpha_elf_hash_table(info)->got_list;
3474            i ; i = alpha_elf_tdata(i)->got_link_next)
3475         {
3476           bfd *j;
3477
3478           for (j = i; j ; j = alpha_elf_tdata(j)->in_got_link_next)
3479             {
3480               struct alpha_elf_got_entry **local_got_entries, *gotent;
3481               int k, n;
3482
3483               local_got_entries = alpha_elf_tdata(j)->local_got_entries;
3484               if (!local_got_entries)
3485                 continue;
3486
3487               for (k = 0, n = elf_tdata(j)->symtab_hdr.sh_info; k < n; ++k)
3488                 for (gotent = local_got_entries[k];
3489                      gotent ; gotent = gotent->next)
3490                   if (gotent->use_count > 0)
3491                     entries += (alpha_dynamic_entries_for_reloc
3492                                 (gotent->reloc_type, 0, info->shared));
3493             }
3494         }
3495
3496       if (entries > 0)
3497         {
3498           s = bfd_get_section_by_name (dynobj, ".rela.got");
3499           BFD_ASSERT (s != NULL);
3500           s->_raw_size += sizeof (Elf64_External_Rela) * entries;
3501         }
3502     }
3503   /* else we're not dynamic and by definition we don't need such things.  */
3504
3505   /* The check_relocs and adjust_dynamic_symbol entry points have
3506      determined the sizes of the various dynamic sections.  Allocate
3507      memory for them.  */
3508   relplt = false;
3509   for (s = dynobj->sections; s != NULL; s = s->next)
3510     {
3511       const char *name;
3512       boolean strip;
3513
3514       if (!(s->flags & SEC_LINKER_CREATED))
3515         continue;
3516
3517       /* It's OK to base decisions on the section name, because none
3518          of the dynobj section names depend upon the input files.  */
3519       name = bfd_get_section_name (dynobj, s);
3520
3521       /* If we don't need this section, strip it from the output file.
3522          This is to handle .rela.bss and .rela.plt.  We must create it
3523          in create_dynamic_sections, because it must be created before
3524          the linker maps input sections to output sections.  The
3525          linker does that before adjust_dynamic_symbol is called, and
3526          it is that function which decides whether anything needs to
3527          go into these sections.  */
3528
3529       strip = false;
3530
3531       if (strncmp (name, ".rela", 5) == 0)
3532         {
3533           strip = (s->_raw_size == 0);
3534
3535           if (!strip)
3536             {
3537               if (strcmp(name, ".rela.plt") == 0)
3538                 relplt = true;
3539
3540               /* We use the reloc_count field as a counter if we need
3541                  to copy relocs into the output file.  */
3542               s->reloc_count = 0;
3543             }
3544         }
3545       else if (strcmp (name, ".plt") != 0)
3546         {
3547           /* It's not one of our dynamic sections, so don't allocate space.  */
3548           continue;
3549         }
3550
3551       if (strip)
3552         _bfd_strip_section_from_output (info, s);
3553       else
3554         {
3555           /* Allocate memory for the section contents.  */
3556           s->contents = (bfd_byte *) bfd_zalloc (dynobj, s->_raw_size);
3557           if (s->contents == NULL && s->_raw_size != 0)
3558             return false;
3559         }
3560     }
3561
3562   if (elf_hash_table (info)->dynamic_sections_created)
3563     {
3564       /* Add some entries to the .dynamic section.  We fill in the
3565          values later, in elf64_alpha_finish_dynamic_sections, but we
3566          must add the entries now so that we get the correct size for
3567          the .dynamic section.  The DT_DEBUG entry is filled in by the
3568          dynamic linker and used by the debugger.  */
3569 #define add_dynamic_entry(TAG, VAL) \
3570   bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
3571
3572       if (!info->shared)
3573         {
3574           if (!add_dynamic_entry (DT_DEBUG, 0))
3575             return false;
3576         }
3577
3578       if (!add_dynamic_entry (DT_PLTGOT, 0))
3579         return false;
3580
3581       if (relplt)
3582         {
3583           if (!add_dynamic_entry (DT_PLTRELSZ, 0)
3584               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3585               || !add_dynamic_entry (DT_JMPREL, 0))
3586             return false;
3587         }
3588
3589       if (!add_dynamic_entry (DT_RELA, 0)
3590           || !add_dynamic_entry (DT_RELASZ, 0)
3591           || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
3592         return false;
3593
3594       if (info->flags & DF_TEXTREL)
3595         {
3596           if (!add_dynamic_entry (DT_TEXTREL, 0))
3597             return false;
3598         }
3599     }
3600 #undef add_dynamic_entry
3601
3602   return true;
3603 }
3604
3605 /* Relocate an Alpha ELF section.  */
3606
3607 static boolean
3608 elf64_alpha_relocate_section (output_bfd, info, input_bfd, input_section,
3609                               contents, relocs, local_syms, local_sections)
3610      bfd *output_bfd;
3611      struct bfd_link_info *info;
3612      bfd *input_bfd;
3613      asection *input_section;
3614      bfd_byte *contents;
3615      Elf_Internal_Rela *relocs;
3616      Elf_Internal_Sym *local_syms;
3617      asection **local_sections;
3618 {
3619   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3620   Elf_Internal_Rela *rel;
3621   Elf_Internal_Rela *relend;
3622   struct elf_link_tls_segment *tls_segment = NULL;
3623   asection *sgot = NULL, *srel = NULL, *srelgot = NULL;
3624   bfd *dynobj = NULL, *gotobj = NULL;
3625   bfd_vma gp = 0, tp_base = 0, dtp_base = 0;
3626   boolean ret_val = true;
3627
3628   if (!info->relocateable)
3629     {
3630       const char *name;
3631
3632       dynobj = elf_hash_table (info)->dynobj;
3633       if (dynobj)
3634         srelgot = bfd_get_section_by_name (dynobj, ".rela.got");
3635
3636       name = (bfd_elf_string_from_elf_section
3637               (input_bfd, elf_elfheader(input_bfd)->e_shstrndx,
3638                elf_section_data(input_section)->rel_hdr.sh_name));
3639       BFD_ASSERT(name != NULL);
3640       srel = bfd_get_section_by_name (dynobj, name);
3641
3642       /* Find the gp value for this input bfd.  */
3643       gotobj = alpha_elf_tdata (input_bfd)->gotobj;
3644       if (gotobj)
3645         {
3646           sgot = alpha_elf_tdata (gotobj)->got;
3647           gp = _bfd_get_gp_value (gotobj);
3648           if (gp == 0)
3649             {
3650               gp = (sgot->output_section->vma
3651                     + sgot->output_offset
3652                     + 0x8000);
3653               _bfd_set_gp_value (gotobj, gp);
3654             }
3655         }
3656
3657       tls_segment = elf_hash_table (info)->tls_segment;
3658       if (tls_segment)
3659         {
3660           /* This is PT_TLS segment p_vaddr.  */
3661           dtp_base = tls_segment->start;
3662
3663           /* Main program TLS (whose template starts at PT_TLS p_vaddr)
3664              is assigned offset round(16, PT_TLS p_align).  */
3665           tp_base = dtp_base - align_power (16, tls_segment->align);
3666         }
3667     }
3668
3669   rel = relocs;
3670   relend = relocs + input_section->reloc_count;
3671   for (; rel < relend; rel++)
3672     {
3673       struct alpha_elf_link_hash_entry *h;
3674       struct alpha_elf_got_entry *gotent;
3675       bfd_reloc_status_type r;
3676       reloc_howto_type *howto;
3677       unsigned long r_symndx;
3678       Elf_Internal_Sym *sym;
3679       asection *sec;
3680       bfd_vma value;
3681       bfd_vma addend;
3682       boolean dynamic_symbol_p;
3683       boolean undef_weak_ref;
3684       unsigned long r_type;
3685
3686       r_type = ELF64_R_TYPE(rel->r_info);
3687       if (r_type >= R_ALPHA_max)
3688         {
3689           (*_bfd_error_handler)
3690             (_("%s: unknown relocation type %d"),
3691              bfd_archive_filename (input_bfd), (int)r_type);
3692           bfd_set_error (bfd_error_bad_value);
3693           ret_val = false;
3694           continue;
3695         }
3696
3697       howto = elf64_alpha_howto_table + r_type;
3698       r_symndx = ELF64_R_SYM(rel->r_info);
3699
3700       if (info->relocateable)
3701         {
3702           /* This is a relocateable link.  We don't have to change
3703              anything, unless the reloc is against a section symbol,
3704              in which case we have to adjust according to where the
3705              section symbol winds up in the output section.  */
3706
3707           /* The symbol associated with GPDISP and LITUSE is
3708              immaterial.  Only the addend is significant.  */
3709           if (r_type == R_ALPHA_GPDISP || r_type == R_ALPHA_LITUSE)
3710             continue;
3711
3712           if (r_symndx < symtab_hdr->sh_info)
3713             {
3714               sym = local_syms + r_symndx;
3715               if (ELF_ST_TYPE(sym->st_info) == STT_SECTION)
3716                 {
3717                   sec = local_sections[r_symndx];
3718                   rel->r_addend += sec->output_offset + sym->st_value;
3719                 }
3720             }
3721
3722           continue;
3723         }
3724
3725       /* This is a final link.  */
3726
3727       h = NULL;
3728       sym = NULL;
3729       sec = NULL;
3730       undef_weak_ref = false;
3731
3732       if (r_symndx < symtab_hdr->sh_info)
3733         {
3734           sym = local_syms + r_symndx;
3735           sec = local_sections[r_symndx];
3736           value = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
3737
3738           gotent = alpha_elf_tdata(input_bfd)->local_got_entries[r_symndx];
3739
3740           /* Need to adjust local GOT entries' addends for SEC_MERGE
3741              unless it has been done already.  */
3742           if ((sec->flags & SEC_MERGE)
3743                && ELF_ST_TYPE (sym->st_info) == STT_SECTION
3744                && (elf_section_data (sec)->sec_info_type
3745                    == ELF_INFO_TYPE_MERGE)
3746                && !gotent->reloc_xlated)
3747             {
3748               struct alpha_elf_got_entry *ent;
3749               asection *msec;
3750
3751               for (ent = gotent; ent; ent = ent->next)
3752                 {
3753                   ent->reloc_xlated = 1;
3754                   if (ent->use_count == 0)
3755                     continue;
3756                   msec = sec;
3757                   ent->addend =
3758                     _bfd_merged_section_offset (output_bfd, &msec,
3759                                                 elf_section_data (sec)->
3760                                                   sec_info,
3761                                                 sym->st_value + ent->addend,
3762                                                 (bfd_vma) 0);
3763                   ent->addend -= sym->st_value;
3764                   ent->addend += msec->output_section->vma
3765                                  + msec->output_offset
3766                                  - sec->output_section->vma
3767                                  - sec->output_offset;
3768                 }
3769             }
3770
3771           dynamic_symbol_p = false;
3772         }
3773       else
3774         {
3775           h = alpha_elf_sym_hashes (input_bfd)[r_symndx - symtab_hdr->sh_info];
3776
3777           while (h->root.root.type == bfd_link_hash_indirect
3778                  || h->root.root.type == bfd_link_hash_warning)
3779             h = (struct alpha_elf_link_hash_entry *)h->root.root.u.i.link;
3780
3781           value = 0;
3782           if (h->root.root.type == bfd_link_hash_defined
3783               || h->root.root.type == bfd_link_hash_defweak)
3784             {
3785               sec = h->root.root.u.def.section;
3786
3787               /* Detect the cases that sym_sec->output_section is
3788                  expected to be NULL -- all cases in which the symbol
3789                  is defined in another shared module.  This includes
3790                  PLT relocs for which we've created a PLT entry and
3791                  other relocs for which we're prepared to create
3792                  dynamic relocations.  */
3793               /* ??? Just accept it NULL and continue.  */
3794
3795               if (sec->output_section != NULL)
3796                 value = (h->root.root.u.def.value
3797                          + sec->output_section->vma
3798                               + sec->output_offset);
3799             }
3800           else if (h->root.root.type == bfd_link_hash_undefweak)
3801             undef_weak_ref = true;
3802           else if (info->shared
3803                    && (!info->symbolic || info->allow_shlib_undefined)
3804                    && !info->no_undefined
3805                    && ELF_ST_VISIBILITY (h->root.other) == STV_DEFAULT)
3806             ;
3807           else
3808             {
3809               if (!((*info->callbacks->undefined_symbol)
3810                     (info, h->root.root.root.string, input_bfd,
3811                      input_section, rel->r_offset,
3812                      (!info->shared || info->no_undefined
3813                       || ELF_ST_VISIBILITY (h->root.other)))))
3814                 return false;
3815               ret_val = false;
3816               continue;
3817             }
3818
3819           dynamic_symbol_p = alpha_elf_dynamic_symbol_p (&h->root, info);
3820           gotent = h->got_entries;
3821         }
3822
3823       addend = rel->r_addend;
3824       value += addend;
3825
3826       /* Search for the proper got entry.  */
3827       for (; gotent ; gotent = gotent->next)
3828         if (gotent->gotobj == gotobj
3829             && gotent->reloc_type == r_type
3830             && gotent->addend == addend)
3831           break;
3832
3833       switch (r_type)
3834         {
3835         case R_ALPHA_GPDISP:
3836           {
3837             bfd_byte *p_ldah, *p_lda;
3838
3839             BFD_ASSERT(gp != 0);
3840
3841             value = (input_section->output_section->vma
3842                      + input_section->output_offset
3843                      + rel->r_offset);
3844
3845             p_ldah = contents + rel->r_offset;
3846             p_lda = p_ldah + rel->r_addend;
3847
3848             r = elf64_alpha_do_reloc_gpdisp (input_bfd, gp - value,
3849                                              p_ldah, p_lda);
3850           }
3851           break;
3852
3853         case R_ALPHA_LITERAL:
3854           BFD_ASSERT(sgot != NULL);
3855           BFD_ASSERT(gp != 0);
3856           BFD_ASSERT(gotent != NULL);
3857           BFD_ASSERT(gotent->use_count >= 1);
3858
3859           if (!gotent->reloc_done)
3860             {
3861               gotent->reloc_done = 1;
3862
3863               bfd_put_64 (output_bfd, value,
3864                           sgot->contents + gotent->got_offset);
3865
3866               /* If the symbol has been forced local, output a
3867                  RELATIVE reloc, otherwise it will be handled in
3868                  finish_dynamic_symbol.  */
3869               if (info->shared && !dynamic_symbol_p)
3870                 {
3871                   Elf_Internal_Rela outrel;
3872
3873                   BFD_ASSERT(srelgot != NULL);
3874
3875                   outrel.r_offset = (sgot->output_section->vma
3876                                      + sgot->output_offset
3877                                      + gotent->got_offset);
3878                   outrel.r_info = ELF64_R_INFO (0, R_ALPHA_RELATIVE);
3879                   outrel.r_addend = value;
3880
3881                   bfd_elf64_swap_reloca_out (output_bfd, &outrel,
3882                                              ((Elf64_External_Rela *)
3883                                               srelgot->contents)
3884                                              + srelgot->reloc_count++);
3885                   BFD_ASSERT (sizeof (Elf64_External_Rela)
3886                               * srelgot->reloc_count
3887                               <= srelgot->_cooked_size);
3888                 }
3889             }
3890
3891           value = (sgot->output_section->vma
3892                    + sgot->output_offset
3893                    + gotent->got_offset);
3894           value -= gp;
3895           goto default_reloc;
3896
3897         case R_ALPHA_GPREL16:
3898         case R_ALPHA_GPREL32:
3899         case R_ALPHA_GPRELLOW:
3900           if (dynamic_symbol_p)
3901             {
3902               (*_bfd_error_handler)
3903                 (_("%s: gp-relative relocation against dynamic symbol %s"),
3904                  bfd_archive_filename (input_bfd), h->root.root.root.string);
3905               ret_val = false;
3906             }
3907           BFD_ASSERT(gp != 0);
3908           value -= gp;
3909           goto default_reloc;
3910
3911         case R_ALPHA_GPRELHIGH:
3912           if (dynamic_symbol_p)
3913             {
3914               (*_bfd_error_handler)
3915                 (_("%s: gp-relative relocation against dynamic symbol %s"),
3916                  bfd_archive_filename (input_bfd), h->root.root.root.string);
3917               ret_val = false;
3918             }
3919           BFD_ASSERT(gp != 0);
3920           value -= gp;
3921           value = ((bfd_signed_vma) value >> 16) + ((value >> 15) & 1);
3922           goto default_reloc;
3923
3924         case R_ALPHA_HINT:
3925           /* A call to a dynamic symbol is definitely out of range of
3926              the 16-bit displacement.  Don't bother writing anything.  */
3927           if (dynamic_symbol_p)
3928             {
3929               r = bfd_reloc_ok;
3930               break;
3931             }
3932           /* The regular PC-relative stuff measures from the start of
3933              the instruction rather than the end.  */
3934           value -= 4;
3935           goto default_reloc;
3936
3937         case R_ALPHA_BRADDR:
3938           if (dynamic_symbol_p)
3939             {
3940               (*_bfd_error_handler)
3941                 (_("%s: pc-relative relocation against dynamic symbol %s"),
3942                  bfd_archive_filename (input_bfd), h->root.root.root.string);
3943               ret_val = false;
3944             }
3945           /* The regular PC-relative stuff measures from the start of
3946              the instruction rather than the end.  */
3947           value -= 4;
3948           goto default_reloc;
3949
3950         case R_ALPHA_BRSGP:
3951           {
3952             int other;
3953             const char *name;
3954
3955             /* The regular PC-relative stuff measures from the start of
3956                the instruction rather than the end.  */
3957             value -= 4;
3958
3959             /* The source and destination gp must be the same.  Note that
3960                the source will always have an assigned gp, since we forced
3961                one in check_relocs, but that the destination may not, as
3962                it might not have had any relocations at all.  Also take 
3963                care not to crash if H is an undefined symbol.  */
3964             if (h != NULL && sec != NULL
3965                 && alpha_elf_tdata (sec->owner)->gotobj
3966                 && gotobj != alpha_elf_tdata (sec->owner)->gotobj)
3967               {
3968                 (*_bfd_error_handler)
3969                   (_("%s: change in gp: BRSGP %s"),
3970                    bfd_archive_filename (input_bfd), h->root.root.root.string);
3971                 ret_val = false;
3972               }
3973
3974             /* The symbol should be marked either NOPV or STD_GPLOAD.  */
3975             if (h != NULL)
3976               other = h->root.other;
3977             else
3978               other = sym->st_other;
3979             switch (other & STO_ALPHA_STD_GPLOAD)
3980               {
3981               case STO_ALPHA_NOPV:
3982                 break;
3983               case STO_ALPHA_STD_GPLOAD:
3984                 addend += 8;
3985                 break;
3986               default:
3987                 if (h != NULL)
3988                   name = h->root.root.root.string;
3989                 else
3990                   {
3991                     name = (bfd_elf_string_from_elf_section
3992                             (input_bfd, symtab_hdr->sh_link, sym->st_name));
3993                     if (name == NULL)
3994                       name = _("<unknown>");
3995                     else if (name[0] == 0)
3996                       name = bfd_section_name (input_bfd, sec);
3997                   }
3998                 (*_bfd_error_handler)
3999                   (_("%s: !samegp reloc against symbol without .prologue: %s"),
4000                    bfd_archive_filename (input_bfd), name);
4001                 ret_val = false;
4002                 break;
4003               }
4004
4005             goto default_reloc;
4006           }
4007
4008         case R_ALPHA_REFLONG:
4009         case R_ALPHA_REFQUAD:
4010         case R_ALPHA_DTPREL64:
4011         case R_ALPHA_TPREL64:
4012           {
4013             Elf_Internal_Rela outrel;
4014
4015             /* Careful here to remember RELATIVE relocations for global
4016                variables for symbolic shared objects.  */
4017
4018             if (dynamic_symbol_p)
4019               {
4020                 BFD_ASSERT(h->root.dynindx != -1);
4021                 outrel.r_info = ELF64_R_INFO (h->root.dynindx, r_type);
4022                 outrel.r_addend = addend;
4023                 addend = 0, value = 0;
4024               }
4025             else if (r_type == R_ALPHA_DTPREL64)
4026               {
4027                 BFD_ASSERT(tls_segment != NULL);
4028                 value -= dtp_base;
4029                 goto default_reloc;
4030               }
4031             else if (r_type == R_ALPHA_TPREL64)
4032               {
4033                 BFD_ASSERT(tls_segment != NULL);
4034                 value -= dtp_base;
4035                 goto default_reloc;
4036               }
4037             else if (info->shared
4038                      && r_symndx != 0
4039                      && (input_section->flags & SEC_ALLOC))
4040               {
4041                 if (r_type == R_ALPHA_REFLONG)
4042                   {
4043                     (*_bfd_error_handler)
4044                       (_("%s: unhandled dynamic relocation against %s"),
4045                        bfd_archive_filename (input_bfd),
4046                        h->root.root.root.string);
4047                     ret_val = false;
4048                   }
4049                 outrel.r_info = ELF64_R_INFO (0, R_ALPHA_RELATIVE);
4050                 outrel.r_addend = value;
4051               }
4052             else
4053               goto default_reloc;
4054
4055             BFD_ASSERT(srel != NULL);
4056
4057             outrel.r_offset =
4058               _bfd_elf_section_offset (output_bfd, info, input_section,
4059                                        rel->r_offset);
4060             if ((outrel.r_offset | 1) != (bfd_vma) -1)
4061               outrel.r_offset += (input_section->output_section->vma
4062                                   + input_section->output_offset);
4063             else
4064               memset (&outrel, 0, sizeof outrel);
4065
4066             bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4067                                        ((Elf64_External_Rela *)
4068                                         srel->contents)
4069                                        + srel->reloc_count++);
4070             BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
4071                         <= srel->_cooked_size);
4072           }
4073           goto default_reloc;
4074
4075         case R_ALPHA_SREL16:
4076         case R_ALPHA_SREL32:
4077         case R_ALPHA_SREL64:
4078           if (dynamic_symbol_p)
4079             {
4080               (*_bfd_error_handler)
4081                 (_("%s: pc-relative relocation against dynamic symbol %s"),
4082                  bfd_archive_filename (input_bfd), h->root.root.root.string);
4083               ret_val = false;
4084             }
4085
4086           /* ??? .eh_frame references to discarded sections will be smashed
4087              to relocations against SHN_UNDEF.  The .eh_frame format allows
4088              NULL to be encoded as 0 in any format, so this works here.  */
4089           if (r_symndx == 0)
4090             howto = (elf64_alpha_howto_table
4091                      + (r_type - R_ALPHA_SREL32 + R_ALPHA_REFLONG));
4092           goto default_reloc;
4093
4094         case R_ALPHA_TLSLDM:
4095           /* Ignore the symbol for the relocation.  The result is always
4096              the current module.  */
4097           dynamic_symbol_p = 0;
4098           /* FALLTHRU */
4099
4100         case R_ALPHA_TLSGD:
4101           if (!gotent->reloc_done)
4102             {
4103               gotent->reloc_done = 1;
4104
4105               /* Note that the module index for the main program is 1.  */
4106               bfd_put_64 (output_bfd, !info->shared && !dynamic_symbol_p,
4107                           sgot->contents + gotent->got_offset);
4108
4109               /* If the symbol has been forced local, output a
4110                  DTPMOD64 reloc, otherwise it will be handled in
4111                  finish_dynamic_symbol.  */
4112               if (info->shared && !dynamic_symbol_p)
4113                 {
4114                   Elf_Internal_Rela outrel;
4115
4116                   BFD_ASSERT(srelgot != NULL);
4117
4118                   outrel.r_offset = (sgot->output_section->vma
4119                                      + sgot->output_offset
4120                                      + gotent->got_offset);
4121                   /* ??? Proper dynindx here.  */
4122                   outrel.r_info = ELF64_R_INFO (0, R_ALPHA_DTPMOD64);
4123                   outrel.r_addend = 0;
4124
4125                   bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4126                                              ((Elf64_External_Rela *)
4127                                               srelgot->contents)
4128                                              + srelgot->reloc_count++);
4129                   BFD_ASSERT (sizeof (Elf64_External_Rela)
4130                               * srelgot->reloc_count
4131                               <= srelgot->_cooked_size);
4132                 }
4133
4134               if (dynamic_symbol_p || r_type == R_ALPHA_TLSLDM)
4135                 value = 0;
4136               else
4137                 {
4138                   BFD_ASSERT(tls_segment != NULL);
4139                   value -= dtp_base;
4140                 }
4141               bfd_put_64 (output_bfd, value,
4142                           sgot->contents + gotent->got_offset + 8);
4143             }
4144
4145           value = (sgot->output_section->vma
4146                    + sgot->output_offset
4147                    + gotent->got_offset);
4148           value -= gp;
4149           goto default_reloc;
4150
4151         case R_ALPHA_DTPRELHI:
4152         case R_ALPHA_DTPRELLO:
4153         case R_ALPHA_DTPREL16:
4154           if (dynamic_symbol_p)
4155             {
4156               (*_bfd_error_handler)
4157                 (_("%s: dtp-relative relocation against dynamic symbol %s"),
4158                  bfd_archive_filename (input_bfd), h->root.root.root.string);
4159               ret_val = false;
4160             }
4161           BFD_ASSERT(tls_segment != NULL);
4162           value -= dtp_base;
4163           goto default_reloc;
4164
4165         case R_ALPHA_TPRELHI:
4166         case R_ALPHA_TPRELLO:
4167         case R_ALPHA_TPREL16:
4168           if (dynamic_symbol_p)
4169             {
4170               (*_bfd_error_handler)
4171                 (_("%s: tp-relative relocation against dynamic symbol %s"),
4172                  bfd_archive_filename (input_bfd), h->root.root.root.string);
4173               ret_val = false;
4174             }
4175           BFD_ASSERT(tls_segment != NULL);
4176           value -= tp_base;
4177           goto default_reloc;
4178
4179         case R_ALPHA_GOTDTPREL:
4180         case R_ALPHA_GOTTPREL:
4181           BFD_ASSERT(sgot != NULL);
4182           BFD_ASSERT(gp != 0);
4183           BFD_ASSERT(gotent != NULL);
4184           BFD_ASSERT(gotent->use_count >= 1);
4185
4186           if (!gotent->reloc_done)
4187             {
4188               gotent->reloc_done = 1;
4189
4190               if (dynamic_symbol_p)
4191                 value = 0;
4192               else
4193                 {
4194                   BFD_ASSERT(tls_segment != NULL);
4195                   value -= (r_type == R_ALPHA_GOTDTPREL ? dtp_base : tp_base);
4196                 }
4197               bfd_put_64 (output_bfd, value,
4198                           sgot->contents + gotent->got_offset);
4199             }
4200
4201           value = (sgot->output_section->vma
4202                    + sgot->output_offset
4203                    + gotent->got_offset);
4204           value -= gp;
4205           goto default_reloc;
4206
4207         default:
4208         default_reloc:
4209           r = _bfd_final_link_relocate (howto, input_bfd, input_section,
4210                                         contents, rel->r_offset, value, 0);
4211           break;
4212         }
4213
4214       switch (r)
4215         {
4216         case bfd_reloc_ok:
4217           break;
4218
4219         case bfd_reloc_overflow:
4220           {
4221             const char *name;
4222
4223             /* Don't warn if the overflow is due to pc relative reloc
4224                against discarded section.  Section optimization code should
4225                handle it.  */
4226
4227             if (r_symndx < symtab_hdr->sh_info
4228                 && sec != NULL && howto->pc_relative
4229                 && elf_discarded_section (sec))
4230               break;
4231
4232             if (h != NULL)
4233               name = h->root.root.root.string;
4234             else
4235               {
4236                 name = (bfd_elf_string_from_elf_section
4237                         (input_bfd, symtab_hdr->sh_link, sym->st_name));
4238                 if (name == NULL)
4239                   return false;
4240                 if (*name == '\0')
4241                   name = bfd_section_name (input_bfd, sec);
4242               }
4243             if (! ((*info->callbacks->reloc_overflow)
4244                    (info, name, howto->name, (bfd_vma) 0,
4245                     input_bfd, input_section, rel->r_offset)))
4246               ret_val = false;
4247           }
4248           break;
4249
4250         default:
4251         case bfd_reloc_outofrange:
4252           abort ();
4253         }
4254     }
4255
4256   return ret_val;
4257 }
4258
4259 /* Finish up dynamic symbol handling.  We set the contents of various
4260    dynamic sections here.  */
4261
4262 static boolean
4263 elf64_alpha_finish_dynamic_symbol (output_bfd, info, h, sym)
4264      bfd *output_bfd;
4265      struct bfd_link_info *info;
4266      struct elf_link_hash_entry *h;
4267      Elf_Internal_Sym *sym;
4268 {
4269   bfd *dynobj = elf_hash_table(info)->dynobj;
4270
4271   if (h->plt.offset != MINUS_ONE)
4272     {
4273       /* Fill in the .plt entry for this symbol.  */
4274       asection *splt, *sgot, *srel;
4275       Elf_Internal_Rela outrel;
4276       bfd_vma got_addr, plt_addr;
4277       bfd_vma plt_index;
4278       struct alpha_elf_got_entry *gotent;
4279
4280       BFD_ASSERT (h->dynindx != -1);
4281
4282       /* The first .got entry will be updated by the .plt with the
4283          address of the target function.  */
4284       gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4285       BFD_ASSERT (gotent && gotent->addend == 0);
4286
4287       splt = bfd_get_section_by_name (dynobj, ".plt");
4288       BFD_ASSERT (splt != NULL);
4289       srel = bfd_get_section_by_name (dynobj, ".rela.plt");
4290       BFD_ASSERT (srel != NULL);
4291       sgot = alpha_elf_tdata (gotent->gotobj)->got;
4292       BFD_ASSERT (sgot != NULL);
4293
4294       got_addr = (sgot->output_section->vma
4295                   + sgot->output_offset
4296                   + gotent->got_offset);
4297       plt_addr = (splt->output_section->vma
4298                   + splt->output_offset
4299                   + h->plt.offset);
4300
4301       plt_index = (h->plt.offset - PLT_HEADER_SIZE) / PLT_ENTRY_SIZE;
4302
4303       /* Fill in the entry in the procedure linkage table.  */
4304       {
4305         bfd_vma insn1, insn2, insn3;
4306
4307         insn1 = PLT_ENTRY_WORD1 | ((-(h->plt.offset + 4) >> 2) & 0x1fffff);
4308         insn2 = PLT_ENTRY_WORD2;
4309         insn3 = PLT_ENTRY_WORD3;
4310
4311         bfd_put_32 (output_bfd, insn1, splt->contents + h->plt.offset);
4312         bfd_put_32 (output_bfd, insn2, splt->contents + h->plt.offset + 4);
4313         bfd_put_32 (output_bfd, insn3, splt->contents + h->plt.offset + 8);
4314       }
4315
4316       /* Fill in the entry in the .rela.plt section.  */
4317       outrel.r_offset = got_addr;
4318       outrel.r_info = ELF64_R_INFO(h->dynindx, R_ALPHA_JMP_SLOT);
4319       outrel.r_addend = 0;
4320
4321       bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4322                                  ((Elf64_External_Rela *)srel->contents
4323                                   + plt_index));
4324
4325       if (!(h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
4326         {
4327           /* Mark the symbol as undefined, rather than as defined in the
4328              .plt section.  Leave the value alone.  */
4329           sym->st_shndx = SHN_UNDEF;
4330         }
4331
4332       /* Fill in the entries in the .got.  */
4333       bfd_put_64 (output_bfd, plt_addr, sgot->contents + gotent->got_offset);
4334
4335       /* Subsequent .got entries will continue to bounce through the .plt.  */
4336       if (gotent->next)
4337         {
4338           srel = bfd_get_section_by_name (dynobj, ".rela.got");
4339           BFD_ASSERT (! info->shared || srel != NULL);
4340
4341           gotent = gotent->next;
4342           do
4343             {
4344               sgot = alpha_elf_tdata(gotent->gotobj)->got;
4345               BFD_ASSERT(sgot != NULL);
4346               BFD_ASSERT(gotent->addend == 0);
4347
4348               bfd_put_64 (output_bfd, plt_addr,
4349                           sgot->contents + gotent->got_offset);
4350
4351               if (info->shared)
4352                 {
4353                   outrel.r_offset = (sgot->output_section->vma
4354                                      + sgot->output_offset
4355                                      + gotent->got_offset);
4356                   outrel.r_info = ELF64_R_INFO(0, R_ALPHA_RELATIVE);
4357                   outrel.r_addend = plt_addr;
4358
4359                   bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4360                                              ((Elf64_External_Rela *)
4361                                               srel->contents)
4362                                              + srel->reloc_count++);
4363                   BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
4364                               <= srel->_cooked_size);
4365                 }
4366
4367               gotent = gotent->next;
4368             }
4369           while (gotent != NULL);
4370         }
4371     }
4372   else if (alpha_elf_dynamic_symbol_p (h, info))
4373     {
4374       /* Fill in the dynamic relocations for this symbol's .got entries.  */
4375       asection *srel;
4376       Elf_Internal_Rela outrel;
4377       struct alpha_elf_got_entry *gotent;
4378
4379       srel = bfd_get_section_by_name (dynobj, ".rela.got");
4380       BFD_ASSERT (srel != NULL);
4381
4382       for (gotent = ((struct alpha_elf_link_hash_entry *) h)->got_entries;
4383            gotent != NULL;
4384            gotent = gotent->next)
4385         {
4386           asection *sgot = alpha_elf_tdata (gotent->gotobj)->got;
4387           int r_type;
4388
4389           outrel.r_offset = (sgot->output_section->vma
4390                              + sgot->output_offset
4391                              + gotent->got_offset);
4392
4393           r_type = gotent->reloc_type;
4394           switch (r_type)
4395             {
4396             case R_ALPHA_LITERAL:
4397               r_type = R_ALPHA_GLOB_DAT;
4398               break;
4399             case R_ALPHA_TLSGD:
4400               r_type = R_ALPHA_DTPMOD64;
4401               break;
4402             case R_ALPHA_GOTDTPREL:
4403               r_type = R_ALPHA_DTPREL64;
4404               break;
4405             case R_ALPHA_GOTTPREL:
4406               r_type = R_ALPHA_TPREL64;
4407               break;
4408             case R_ALPHA_TLSLDM:
4409             default:
4410               abort ();
4411             }
4412
4413           outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
4414           outrel.r_addend = gotent->addend;
4415
4416           bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4417                                      ((Elf64_External_Rela *)srel->contents
4418                                       + srel->reloc_count++));
4419
4420           if (gotent->reloc_type == R_ALPHA_TLSGD)
4421             {
4422               outrel.r_offset += 8;
4423               outrel.r_info = ELF64_R_INFO (h->dynindx, R_ALPHA_DTPREL64);
4424
4425               bfd_elf64_swap_reloca_out (output_bfd, &outrel,
4426                                          ((Elf64_External_Rela *)srel->contents
4427                                           + srel->reloc_count++));
4428             }
4429
4430           BFD_ASSERT (sizeof (Elf64_External_Rela) * srel->reloc_count
4431                       <= srel->_cooked_size);
4432         }
4433     }
4434
4435   /* Mark some specially defined symbols as absolute.  */
4436   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4437       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
4438       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
4439     sym->st_shndx = SHN_ABS;
4440
4441   return true;
4442 }
4443
4444 /* Finish up the dynamic sections.  */
4445
4446 static boolean
4447 elf64_alpha_finish_dynamic_sections (output_bfd, info)
4448      bfd *output_bfd;
4449      struct bfd_link_info *info;
4450 {
4451   bfd *dynobj;
4452   asection *sdyn;
4453
4454   dynobj = elf_hash_table (info)->dynobj;
4455   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4456
4457   if (elf_hash_table (info)->dynamic_sections_created)
4458     {
4459       asection *splt;
4460       Elf64_External_Dyn *dyncon, *dynconend;
4461
4462       splt = bfd_get_section_by_name (dynobj, ".plt");
4463       BFD_ASSERT (splt != NULL && sdyn != NULL);
4464
4465       dyncon = (Elf64_External_Dyn *) sdyn->contents;
4466       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
4467       for (; dyncon < dynconend; dyncon++)
4468         {
4469           Elf_Internal_Dyn dyn;
4470           const char *name;
4471           asection *s;
4472
4473           bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4474
4475           switch (dyn.d_tag)
4476             {
4477             case DT_PLTGOT:
4478               name = ".plt";
4479               goto get_vma;
4480             case DT_PLTRELSZ:
4481               name = ".rela.plt";
4482               goto get_size;
4483             case DT_JMPREL:
4484               name = ".rela.plt";
4485               goto get_vma;
4486
4487             case DT_RELASZ:
4488               /* My interpretation of the TIS v1.1 ELF document indicates
4489                  that RELASZ should not include JMPREL.  This is not what
4490                  the rest of the BFD does.  It is, however, what the
4491                  glibc ld.so wants.  Do this fixup here until we found
4492                  out who is right.  */
4493               s = bfd_get_section_by_name (output_bfd, ".rela.plt");
4494               if (s)
4495                 {
4496                   dyn.d_un.d_val -=
4497                     (s->_cooked_size ? s->_cooked_size : s->_raw_size);
4498                 }
4499               break;
4500
4501             get_vma:
4502               s = bfd_get_section_by_name (output_bfd, name);
4503               dyn.d_un.d_ptr = (s ? s->vma : 0);
4504               break;
4505
4506             get_size:
4507               s = bfd_get_section_by_name (output_bfd, name);
4508               dyn.d_un.d_val =
4509                 (s->_cooked_size ? s->_cooked_size : s->_raw_size);
4510               break;
4511             }
4512
4513           bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
4514         }
4515
4516       /* Initialize the PLT0 entry */
4517       if (splt->_raw_size > 0)
4518         {
4519           bfd_put_32 (output_bfd, PLT_HEADER_WORD1, splt->contents);
4520           bfd_put_32 (output_bfd, PLT_HEADER_WORD2, splt->contents + 4);
4521           bfd_put_32 (output_bfd, PLT_HEADER_WORD3, splt->contents + 8);
4522           bfd_put_32 (output_bfd, PLT_HEADER_WORD4, splt->contents + 12);
4523
4524           /* The next two words will be filled in by ld.so */
4525           bfd_put_64 (output_bfd, (bfd_vma) 0, splt->contents + 16);
4526           bfd_put_64 (output_bfd, (bfd_vma) 0, splt->contents + 24);
4527
4528           elf_section_data (splt->output_section)->this_hdr.sh_entsize =
4529             PLT_HEADER_SIZE;
4530         }
4531     }
4532
4533   return true;
4534 }
4535
4536 /* We need to use a special link routine to handle the .mdebug section.
4537    We need to merge all instances of these sections together, not write
4538    them all out sequentially.  */
4539
4540 static boolean
4541 elf64_alpha_final_link (abfd, info)
4542      bfd *abfd;
4543      struct bfd_link_info *info;
4544 {
4545   asection *o;
4546   struct bfd_link_order *p;
4547   asection *mdebug_sec;
4548   struct ecoff_debug_info debug;
4549   const struct ecoff_debug_swap *swap
4550     = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
4551   HDRR *symhdr = &debug.symbolic_header;
4552   PTR mdebug_handle = NULL;
4553
4554   /* Go through the sections and collect the mdebug information.  */
4555   mdebug_sec = NULL;
4556   for (o = abfd->sections; o != (asection *) NULL; o = o->next)
4557     {
4558       if (strcmp (o->name, ".mdebug") == 0)
4559         {
4560           struct extsym_info einfo;
4561
4562           /* We have found the .mdebug section in the output file.
4563              Look through all the link_orders comprising it and merge
4564              the information together.  */
4565           symhdr->magic = swap->sym_magic;
4566           /* FIXME: What should the version stamp be?  */
4567           symhdr->vstamp = 0;
4568           symhdr->ilineMax = 0;
4569           symhdr->cbLine = 0;
4570           symhdr->idnMax = 0;
4571           symhdr->ipdMax = 0;
4572           symhdr->isymMax = 0;
4573           symhdr->ioptMax = 0;
4574           symhdr->iauxMax = 0;
4575           symhdr->issMax = 0;
4576           symhdr->issExtMax = 0;
4577           symhdr->ifdMax = 0;
4578           symhdr->crfd = 0;
4579           symhdr->iextMax = 0;
4580
4581           /* We accumulate the debugging information itself in the
4582              debug_info structure.  */
4583           debug.line = NULL;
4584           debug.external_dnr = NULL;
4585           debug.external_pdr = NULL;
4586           debug.external_sym = NULL;
4587           debug.external_opt = NULL;
4588           debug.external_aux = NULL;
4589           debug.ss = NULL;
4590           debug.ssext = debug.ssext_end = NULL;
4591           debug.external_fdr = NULL;
4592           debug.external_rfd = NULL;
4593           debug.external_ext = debug.external_ext_end = NULL;
4594
4595           mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
4596           if (mdebug_handle == (PTR) NULL)
4597             return false;
4598
4599           if (1)
4600             {
4601               asection *s;
4602               EXTR esym;
4603               bfd_vma last = 0;
4604               unsigned int i;
4605               static const char * const name[] =
4606                 {
4607                   ".text", ".init", ".fini", ".data",
4608                   ".rodata", ".sdata", ".sbss", ".bss"
4609                 };
4610               static const int sc[] = { scText, scInit, scFini, scData,
4611                                           scRData, scSData, scSBss, scBss };
4612
4613               esym.jmptbl = 0;
4614               esym.cobol_main = 0;
4615               esym.weakext = 0;
4616               esym.reserved = 0;
4617               esym.ifd = ifdNil;
4618               esym.asym.iss = issNil;
4619               esym.asym.st = stLocal;
4620               esym.asym.reserved = 0;
4621               esym.asym.index = indexNil;
4622               for (i = 0; i < 8; i++)
4623                 {
4624                   esym.asym.sc = sc[i];
4625                   s = bfd_get_section_by_name (abfd, name[i]);
4626                   if (s != NULL)
4627                     {
4628                       esym.asym.value = s->vma;
4629                       last = s->vma + s->_raw_size;
4630                     }
4631                   else
4632                     esym.asym.value = last;
4633
4634                   if (! bfd_ecoff_debug_one_external (abfd, &debug, swap,
4635                                                       name[i], &esym))
4636                     return false;
4637                 }
4638             }
4639
4640           for (p = o->link_order_head;
4641                p != (struct bfd_link_order *) NULL;
4642                p = p->next)
4643             {
4644               asection *input_section;
4645               bfd *input_bfd;
4646               const struct ecoff_debug_swap *input_swap;
4647               struct ecoff_debug_info input_debug;
4648               char *eraw_src;
4649               char *eraw_end;
4650
4651               if (p->type != bfd_indirect_link_order)
4652                 {
4653                   if (p->type == bfd_data_link_order)
4654                     continue;
4655                   abort ();
4656                 }
4657
4658               input_section = p->u.indirect.section;
4659               input_bfd = input_section->owner;
4660
4661               if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
4662                   || (get_elf_backend_data (input_bfd)
4663                       ->elf_backend_ecoff_debug_swap) == NULL)
4664                 {
4665                   /* I don't know what a non ALPHA ELF bfd would be
4666                      doing with a .mdebug section, but I don't really
4667                      want to deal with it.  */
4668                   continue;
4669                 }
4670
4671               input_swap = (get_elf_backend_data (input_bfd)
4672                             ->elf_backend_ecoff_debug_swap);
4673
4674               BFD_ASSERT (p->size == input_section->_raw_size);
4675
4676               /* The ECOFF linking code expects that we have already
4677                  read in the debugging information and set up an
4678                  ecoff_debug_info structure, so we do that now.  */
4679               if (!elf64_alpha_read_ecoff_info (input_bfd, input_section,
4680                                                 &input_debug))
4681                 return false;
4682
4683               if (! (bfd_ecoff_debug_accumulate
4684                      (mdebug_handle, abfd, &debug, swap, input_bfd,
4685                       &input_debug, input_swap, info)))
4686                 return false;
4687
4688               /* Loop through the external symbols.  For each one with
4689                  interesting information, try to find the symbol in
4690                  the linker global hash table and save the information
4691                  for the output external symbols.  */
4692               eraw_src = input_debug.external_ext;
4693               eraw_end = (eraw_src
4694                           + (input_debug.symbolic_header.iextMax
4695                              * input_swap->external_ext_size));
4696               for (;
4697                    eraw_src < eraw_end;
4698                    eraw_src += input_swap->external_ext_size)
4699                 {
4700                   EXTR ext;
4701                   const char *name;
4702                   struct alpha_elf_link_hash_entry *h;
4703
4704                   (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
4705                   if (ext.asym.sc == scNil
4706                       || ext.asym.sc == scUndefined
4707                       || ext.asym.sc == scSUndefined)
4708                     continue;
4709
4710                   name = input_debug.ssext + ext.asym.iss;
4711                   h = alpha_elf_link_hash_lookup (alpha_elf_hash_table (info),
4712                                                   name, false, false, true);
4713                   if (h == NULL || h->esym.ifd != -2)
4714                     continue;
4715
4716                   if (ext.ifd != -1)
4717                     {
4718                       BFD_ASSERT (ext.ifd
4719                                   < input_debug.symbolic_header.ifdMax);
4720                       ext.ifd = input_debug.ifdmap[ext.ifd];
4721                     }
4722
4723                   h->esym = ext;
4724                 }
4725
4726               /* Free up the information we just read.  */
4727               free (input_debug.line);
4728               free (input_debug.external_dnr);
4729               free (input_debug.external_pdr);
4730               free (input_debug.external_sym);
4731               free (input_debug.external_opt);
4732               free (input_debug.external_aux);
4733               free (input_debug.ss);
4734               free (input_debug.ssext);
4735               free (input_debug.external_fdr);
4736               free (input_debug.external_rfd);
4737               free (input_debug.external_ext);
4738
4739               /* Hack: reset the SEC_HAS_CONTENTS flag so that
4740                  elf_link_input_bfd ignores this section.  */
4741               input_section->flags &=~ SEC_HAS_CONTENTS;
4742             }
4743
4744           /* Build the external symbol information.  */
4745           einfo.abfd = abfd;
4746           einfo.info = info;
4747           einfo.debug = &debug;
4748           einfo.swap = swap;
4749           einfo.failed = false;
4750           elf_link_hash_traverse (elf_hash_table (info),
4751                                   elf64_alpha_output_extsym,
4752                                   (PTR) &einfo);
4753           if (einfo.failed)
4754             return false;
4755
4756           /* Set the size of the .mdebug section.  */
4757           o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
4758
4759           /* Skip this section later on (I don't think this currently
4760              matters, but someday it might).  */
4761           o->link_order_head = (struct bfd_link_order *) NULL;
4762
4763           mdebug_sec = o;
4764         }
4765     }
4766
4767   /* Invoke the regular ELF backend linker to do all the work.  */
4768   if (! bfd_elf64_bfd_final_link (abfd, info))
4769     return false;
4770
4771   /* Now write out the computed sections.  */
4772
4773   /* The .got subsections...  */
4774   {
4775     bfd *i, *dynobj = elf_hash_table(info)->dynobj;
4776     for (i = alpha_elf_hash_table(info)->got_list;
4777          i != NULL;
4778          i = alpha_elf_tdata(i)->got_link_next)
4779       {
4780         asection *sgot;
4781
4782         /* elf_bfd_final_link already did everything in dynobj.  */
4783         if (i == dynobj)
4784           continue;
4785
4786         sgot = alpha_elf_tdata(i)->got;
4787         if (! bfd_set_section_contents (abfd, sgot->output_section,
4788                                         sgot->contents,
4789                                         (file_ptr) sgot->output_offset,
4790                                         sgot->_raw_size))
4791           return false;
4792       }
4793   }
4794
4795   if (mdebug_sec != (asection *) NULL)
4796     {
4797       BFD_ASSERT (abfd->output_has_begun);
4798       if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
4799                                                swap, info,
4800                                                mdebug_sec->filepos))
4801         return false;
4802
4803       bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
4804     }
4805
4806   return true;
4807 }
4808
4809 static enum elf_reloc_type_class
4810 elf64_alpha_reloc_type_class (rela)
4811      const Elf_Internal_Rela *rela;
4812 {
4813   switch ((int) ELF64_R_TYPE (rela->r_info))
4814     {
4815     case R_ALPHA_RELATIVE:
4816       return reloc_class_relative;
4817     case R_ALPHA_JMP_SLOT:
4818       return reloc_class_plt;
4819     case R_ALPHA_COPY:
4820       return reloc_class_copy;
4821     default:
4822       return reloc_class_normal;
4823     }
4824 }
4825 \f
4826 /* ECOFF swapping routines.  These are used when dealing with the
4827    .mdebug section, which is in the ECOFF debugging format.  Copied
4828    from elf32-mips.c.  */
4829 static const struct ecoff_debug_swap
4830 elf64_alpha_ecoff_debug_swap =
4831 {
4832   /* Symbol table magic number.  */
4833   magicSym2,
4834   /* Alignment of debugging information.  E.g., 4.  */
4835   8,
4836   /* Sizes of external symbolic information.  */
4837   sizeof (struct hdr_ext),
4838   sizeof (struct dnr_ext),
4839   sizeof (struct pdr_ext),
4840   sizeof (struct sym_ext),
4841   sizeof (struct opt_ext),
4842   sizeof (struct fdr_ext),
4843   sizeof (struct rfd_ext),
4844   sizeof (struct ext_ext),
4845   /* Functions to swap in external symbolic data.  */
4846   ecoff_swap_hdr_in,
4847   ecoff_swap_dnr_in,
4848   ecoff_swap_pdr_in,
4849   ecoff_swap_sym_in,
4850   ecoff_swap_opt_in,
4851   ecoff_swap_fdr_in,
4852   ecoff_swap_rfd_in,
4853   ecoff_swap_ext_in,
4854   _bfd_ecoff_swap_tir_in,
4855   _bfd_ecoff_swap_rndx_in,
4856   /* Functions to swap out external symbolic data.  */
4857   ecoff_swap_hdr_out,
4858   ecoff_swap_dnr_out,
4859   ecoff_swap_pdr_out,
4860   ecoff_swap_sym_out,
4861   ecoff_swap_opt_out,
4862   ecoff_swap_fdr_out,
4863   ecoff_swap_rfd_out,
4864   ecoff_swap_ext_out,
4865   _bfd_ecoff_swap_tir_out,
4866   _bfd_ecoff_swap_rndx_out,
4867   /* Function to read in symbolic data.  */
4868   elf64_alpha_read_ecoff_info
4869 };
4870 \f
4871 /* Use a non-standard hash bucket size of 8.  */
4872
4873 const struct elf_size_info alpha_elf_size_info =
4874 {
4875   sizeof (Elf64_External_Ehdr),
4876   sizeof (Elf64_External_Phdr),
4877   sizeof (Elf64_External_Shdr),
4878   sizeof (Elf64_External_Rel),
4879   sizeof (Elf64_External_Rela),
4880   sizeof (Elf64_External_Sym),
4881   sizeof (Elf64_External_Dyn),
4882   sizeof (Elf_External_Note),
4883   8,
4884   1,
4885   64, 8,
4886   ELFCLASS64, EV_CURRENT,
4887   bfd_elf64_write_out_phdrs,
4888   bfd_elf64_write_shdrs_and_ehdr,
4889   bfd_elf64_write_relocs,
4890   bfd_elf64_swap_symbol_out,
4891   bfd_elf64_slurp_reloc_table,
4892   bfd_elf64_slurp_symbol_table,
4893   bfd_elf64_swap_dyn_in,
4894   bfd_elf64_swap_dyn_out,
4895   NULL,
4896   NULL,
4897   NULL,
4898   NULL
4899 };
4900
4901 #define TARGET_LITTLE_SYM       bfd_elf64_alpha_vec
4902 #define TARGET_LITTLE_NAME      "elf64-alpha"
4903 #define ELF_ARCH                bfd_arch_alpha
4904 #define ELF_MACHINE_CODE        EM_ALPHA
4905 #define ELF_MAXPAGESIZE 0x10000
4906
4907 #define bfd_elf64_bfd_link_hash_table_create \
4908   elf64_alpha_bfd_link_hash_table_create
4909
4910 #define bfd_elf64_bfd_reloc_type_lookup \
4911   elf64_alpha_bfd_reloc_type_lookup
4912 #define elf_info_to_howto \
4913   elf64_alpha_info_to_howto
4914
4915 #define bfd_elf64_mkobject \
4916   elf64_alpha_mkobject
4917 #define elf_backend_object_p \
4918   elf64_alpha_object_p
4919
4920 #define elf_backend_section_from_shdr \
4921   elf64_alpha_section_from_shdr
4922 #define elf_backend_section_flags \
4923   elf64_alpha_section_flags
4924 #define elf_backend_fake_sections \
4925   elf64_alpha_fake_sections
4926
4927 #define bfd_elf64_bfd_is_local_label_name \
4928   elf64_alpha_is_local_label_name
4929 #define bfd_elf64_find_nearest_line \
4930   elf64_alpha_find_nearest_line
4931 #define bfd_elf64_bfd_relax_section \
4932   elf64_alpha_relax_section
4933
4934 #define elf_backend_add_symbol_hook \
4935   elf64_alpha_add_symbol_hook
4936 #define elf_backend_check_relocs \
4937   elf64_alpha_check_relocs
4938 #define elf_backend_create_dynamic_sections \
4939   elf64_alpha_create_dynamic_sections
4940 #define elf_backend_adjust_dynamic_symbol \
4941   elf64_alpha_adjust_dynamic_symbol
4942 #define elf_backend_always_size_sections \
4943   elf64_alpha_always_size_sections
4944 #define elf_backend_size_dynamic_sections \
4945   elf64_alpha_size_dynamic_sections
4946 #define elf_backend_relocate_section \
4947   elf64_alpha_relocate_section
4948 #define elf_backend_finish_dynamic_symbol \
4949   elf64_alpha_finish_dynamic_symbol
4950 #define elf_backend_finish_dynamic_sections \
4951   elf64_alpha_finish_dynamic_sections
4952 #define bfd_elf64_bfd_final_link \
4953   elf64_alpha_final_link
4954 #define elf_backend_reloc_type_class \
4955   elf64_alpha_reloc_type_class
4956
4957 #define elf_backend_ecoff_debug_swap \
4958   &elf64_alpha_ecoff_debug_swap
4959
4960 #define elf_backend_size_info \
4961   alpha_elf_size_info
4962
4963 /* A few constants that determine how the .plt section is set up.  */
4964 #define elf_backend_want_got_plt 0
4965 #define elf_backend_plt_readonly 0
4966 #define elf_backend_want_plt_sym 1
4967 #define elf_backend_got_header_size 0
4968 #define elf_backend_plt_header_size PLT_HEADER_SIZE
4969
4970 #include "elf64-target.h"