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