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