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