OSDN Git Service

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