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