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