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