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