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