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