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