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