OSDN Git Service

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