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