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>.
6 This file is part of BFD, the Binary File Descriptor library.
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.
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.
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. */
22 /* We need a published ABI spec for this. Until one comes out, don't
23 assume this'll remain unchanged forever. */
30 #include "elf/alpha.h"
34 #define NO_COFF_RELOCS
35 #define NO_COFF_SYMBOLS
36 #define NO_COFF_LINENOS
38 /* Get the ECOFF swapping routines. Needed for the debug information. */
39 #include "coff/internal.h"
41 #include "coff/symconst.h"
42 #include "coff/ecoff.h"
43 #include "coff/alpha.h"
48 #include "ecoffswap.h"
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
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 **));
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
*));
71 static boolean elf64_alpha_mkobject
73 static boolean elf64_alpha_object_p
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
*));
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 *));
94 #if defined(__STDC__) || defined(ALMOST_STDC)
95 struct alpha_elf_link_hash_entry
;
98 static boolean elf64_alpha_output_extsym
99 PARAMS((struct alpha_elf_link_hash_entry
*, PTR
));
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
*));
157 struct alpha_elf_link_hash_entry
159 struct elf_link_hash_entry root
;
161 /* External symbol information. */
164 /* Cumulative flags for all the .got entries. */
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
177 /* Used to implement multiple .got subsections. */
178 struct alpha_elf_got_entry
180 struct alpha_elf_got_entry
*next
;
182 /* which .got subsection? */
185 /* the addend in effect for this entry. */
188 /* the .got offset for this entry. */
191 /* How many references to this entry? */
194 /* The relocation type of this entry. */
195 unsigned char reloc_type
;
197 /* How a LITERAL is used. */
200 /* Have we initialized the dynamic relocation for this entry? */
201 unsigned char reloc_done
;
203 /* Have we adjusted this entry for SEC_MERGE? */
204 unsigned char reloc_xlated
;
207 /* used to count non-got, non-plt relocations for delayed sizing
208 of relocation sections. */
209 struct alpha_elf_reloc_entry
211 struct alpha_elf_reloc_entry
*next
;
213 /* which .reloc section? */
216 /* what kind of relocation? */
219 /* is this against read-only section? */
220 unsigned int reltext
: 1;
222 /* how many did we find? */
227 /* Alpha ELF linker hash table. */
229 struct alpha_elf_link_hash_table
231 struct elf_link_hash_table root
;
233 /* The head of a list of .got subsections linked through
234 alpha_elf_tdata(abfd)->got_link_next. */
238 /* Look up an entry in a Alpha ELF linker hash table. */
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), \
245 /* Traverse a Alpha ELF linker hash table. */
247 #define alpha_elf_link_hash_traverse(table, func, info) \
248 (elf_link_hash_traverse \
250 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
253 /* Get the Alpha ELF linker hash table from a link_info structure. */
255 #define alpha_elf_hash_table(p) \
256 ((struct alpha_elf_link_hash_table *) ((p)->hash))
258 /* Get the object's symbols as our own entry type. */
260 #define alpha_elf_sym_hashes(abfd) \
261 ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
263 /* Should we do dynamic things to this symbol? */
266 alpha_elf_dynamic_symbol_p (h
, info
)
267 struct elf_link_hash_entry
*h
;
268 struct bfd_link_info
*info
;
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
;
277 if (h
->dynindx
== -1)
280 if (h
->root
.type
== bfd_link_hash_undefweak
281 || h
->root
.type
== bfd_link_hash_defweak
)
284 switch (ELF_ST_VISIBILITY (h
->other
))
292 if (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)
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
)))
306 /* Create an entry in a Alpha ELF linker hash table. */
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
;
314 struct alpha_elf_link_hash_entry
*ret
=
315 (struct alpha_elf_link_hash_entry
*) entry
;
317 /* Allocate the structure if it has not already been allocated by a
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
;
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
,
330 if (ret
!= (struct alpha_elf_link_hash_entry
*) NULL
)
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. */
338 ret
->got_entries
= NULL
;
339 ret
->reloc_entries
= NULL
;
342 return (struct bfd_hash_entry
*) ret
;
345 /* Create a Alpha ELF linker hash table. */
347 static struct bfd_link_hash_table
*
348 elf64_alpha_bfd_link_hash_table_create (abfd
)
351 struct alpha_elf_link_hash_table
*ret
;
352 bfd_size_type amt
= sizeof (struct alpha_elf_link_hash_table
);
354 ret
= (struct alpha_elf_link_hash_table
*) bfd_zmalloc (amt
);
355 if (ret
== (struct alpha_elf_link_hash_table
*) NULL
)
358 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
359 elf64_alpha_link_hash_newfunc
))
365 return &ret
->root
.root
;
368 /* We have some private fields hanging off of the elf_tdata structure. */
370 struct alpha_elf_obj_tdata
372 struct elf_obj_tdata root
;
374 /* For every input file, these are the got entries for that object's
376 struct alpha_elf_got_entry
** local_got_entries
;
378 /* For every input file, this is the object that owns the got that
379 this input file uses. */
382 /* For every got, this is a linked list through the objects using this got */
383 bfd
*in_got_link_next
;
385 /* For every got, this is a link to the next got subsegment. */
388 /* For every got, this is the section. */
391 /* For every got, this is it's total number of words. */
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. */
399 #define alpha_elf_tdata(abfd) \
400 ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
403 elf64_alpha_mkobject (abfd
)
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
)
414 elf64_alpha_object_p (abfd
)
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
)
423 new_tdata
->root
= *abfd
->tdata
.elf_obj_data
;
424 abfd
->tdata
.any
= new_tdata
;
426 /* Set the right machine number for an Alpha ELF file. */
427 return bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0);
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)
434 #define SKIP_HOWTO(N) \
435 HOWTO(N, 0, 0, 0, 0, 0, 0, elf64_alpha_reloc_bad, 0, 0, 0, 0, 0)
437 static reloc_howto_type elf64_alpha_howto_table
[] =
439 HOWTO (R_ALPHA_NONE
, /* type */
441 0, /* size (0 = byte, 1 = short, 2 = long) */
443 true, /* pc_relative */
445 complain_overflow_dont
, /* complain_on_overflow */
446 elf64_alpha_reloc_nil
, /* special_function */
448 false, /* partial_inplace */
451 true), /* pcrel_offset */
453 /* A 32 bit reference to a symbol. */
454 HOWTO (R_ALPHA_REFLONG
, /* type */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
458 false, /* pc_relative */
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 */
468 /* A 64 bit reference to a symbol. */
469 HOWTO (R_ALPHA_REFQUAD
, /* type */
471 4, /* size (0 = byte, 1 = short, 2 = long) */
473 false, /* pc_relative */
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 */
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
486 HOWTO (R_ALPHA_GPREL32
, /* type */
488 2, /* size (0 = byte, 1 = short, 2 = long) */
490 false, /* pc_relative */
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 */
500 /* Used for an instruction that refers to memory off the GP register. */
501 HOWTO (R_ALPHA_LITERAL
, /* type */
503 1, /* size (0 = byte, 1 = short, 2 = long) */
505 false, /* pc_relative */
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 */
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 */
524 1, /* size (0 = byte, 1 = short, 2 = long) */
526 false, /* pc_relative */
528 complain_overflow_dont
, /* complain_on_overflow */
529 elf64_alpha_reloc_nil
, /* special_function */
531 false, /* partial_inplace */
534 false), /* pcrel_offset */
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.
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 */
554 2, /* size (0 = byte, 1 = short, 2 = long) */
556 false, /* pc_relative */
558 complain_overflow_dont
, /* complain_on_overflow */
559 elf64_alpha_reloc_gpdisp
, /* special_function */
561 false, /* partial_inplace */
562 0xffff, /* src_mask */
563 0xffff, /* dst_mask */
564 true), /* pcrel_offset */
566 /* A 21 bit branch. */
567 HOWTO (R_ALPHA_BRADDR
, /* type */
569 2, /* size (0 = byte, 1 = short, 2 = long) */
571 true, /* pc_relative */
573 complain_overflow_signed
, /* complain_on_overflow */
574 0, /* special_function */
576 false, /* partial_inplace */
577 0x1fffff, /* src_mask */
578 0x1fffff, /* dst_mask */
579 true), /* pcrel_offset */
581 /* A hint for a jump to a register. */
582 HOWTO (R_ALPHA_HINT
, /* type */
584 1, /* size (0 = byte, 1 = short, 2 = long) */
586 true, /* pc_relative */
588 complain_overflow_dont
, /* complain_on_overflow */
589 0, /* special_function */
591 false, /* partial_inplace */
592 0x3fff, /* src_mask */
593 0x3fff, /* dst_mask */
594 true), /* pcrel_offset */
596 /* 16 bit PC relative offset. */
597 HOWTO (R_ALPHA_SREL16
, /* type */
599 1, /* size (0 = byte, 1 = short, 2 = long) */
601 true, /* pc_relative */
603 complain_overflow_signed
, /* complain_on_overflow */
604 0, /* special_function */
606 false, /* partial_inplace */
607 0xffff, /* src_mask */
608 0xffff, /* dst_mask */
609 true), /* pcrel_offset */
611 /* 32 bit PC relative offset. */
612 HOWTO (R_ALPHA_SREL32
, /* type */
614 2, /* size (0 = byte, 1 = short, 2 = long) */
616 true, /* pc_relative */
618 complain_overflow_signed
, /* complain_on_overflow */
619 0, /* special_function */
621 false, /* partial_inplace */
622 0xffffffff, /* src_mask */
623 0xffffffff, /* dst_mask */
624 true), /* pcrel_offset */
626 /* A 64 bit PC relative offset. */
627 HOWTO (R_ALPHA_SREL64
, /* type */
629 4, /* size (0 = byte, 1 = short, 2 = long) */
631 true, /* pc_relative */
633 complain_overflow_signed
, /* complain_on_overflow */
634 0, /* special_function */
636 false, /* partial_inplace */
637 MINUS_ONE
, /* src_mask */
638 MINUS_ONE
, /* dst_mask */
639 true), /* pcrel_offset */
641 /* Skip 12 - 16; deprecated ECOFF relocs. */
648 /* The high 16 bits of the displacement from GP to the target. */
649 HOWTO (R_ALPHA_GPRELHIGH
,
651 1, /* size (0 = byte, 1 = short, 2 = long) */
653 false, /* pc_relative */
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 */
663 /* The low 16 bits of the displacement from GP to the target. */
664 HOWTO (R_ALPHA_GPRELLOW
,
666 1, /* size (0 = byte, 1 = short, 2 = long) */
668 false, /* pc_relative */
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 */
678 /* A 16-bit displacement from the GP to the target. */
679 HOWTO (R_ALPHA_GPREL16
,
681 1, /* size (0 = byte, 1 = short, 2 = long) */
683 false, /* pc_relative */
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 */
693 /* Skip 20 - 23; deprecated ECOFF relocs. */
699 /* Misc ELF relocations. */
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. */
711 complain_overflow_dont
,
712 bfd_elf_generic_reloc
,
719 /* A dynamic relocation for a .got entry. */
720 HOWTO (R_ALPHA_GLOB_DAT
,
726 complain_overflow_dont
,
727 bfd_elf_generic_reloc
,
734 /* A dynamic relocation for a .plt entry. */
735 HOWTO (R_ALPHA_JMP_SLOT
,
741 complain_overflow_dont
,
742 bfd_elf_generic_reloc
,
749 /* A dynamic relocation to add the base of the DSO to a 64-bit field. */
750 HOWTO (R_ALPHA_RELATIVE
,
756 complain_overflow_dont
,
757 bfd_elf_generic_reloc
,
764 /* A 21 bit branch that adjusts for gp loads. */
765 HOWTO (R_ALPHA_BRSGP
, /* type */
767 2, /* size (0 = byte, 1 = short, 2 = long) */
769 true, /* pc_relative */
771 complain_overflow_signed
, /* complain_on_overflow */
772 0, /* special_function */
774 false, /* partial_inplace */
775 0x1fffff, /* src_mask */
776 0x1fffff, /* dst_mask */
777 true), /* pcrel_offset */
779 /* Creates a tls_index for the symbol in the got. */
780 HOWTO (R_ALPHA_TLSGD
, /* type */
782 1, /* size (0 = byte, 1 = short, 2 = long) */
784 false, /* pc_relative */
786 complain_overflow_signed
, /* complain_on_overflow */
787 0, /* special_function */
789 false, /* partial_inplace */
790 0xffff, /* src_mask */
791 0xffff, /* dst_mask */
792 false), /* pcrel_offset */
794 /* Creates a tls_index for the (current) module in the got. */
795 HOWTO (R_ALPHA_TLSLDM
, /* type */
797 1, /* size (0 = byte, 1 = short, 2 = long) */
799 false, /* pc_relative */
801 complain_overflow_signed
, /* complain_on_overflow */
802 0, /* special_function */
804 false, /* partial_inplace */
805 0xffff, /* src_mask */
806 0xffff, /* dst_mask */
807 false), /* pcrel_offset */
809 /* A dynamic relocation for a DTP module entry. */
810 HOWTO (R_ALPHA_DTPMOD64
, /* type */
812 4, /* size (0 = byte, 1 = short, 2 = long) */
814 false, /* pc_relative */
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 */
824 /* Creates a 64-bit offset in the got for the displacement
825 from DTP to the target. */
826 HOWTO (R_ALPHA_GOTDTPREL
, /* type */
828 1, /* size (0 = byte, 1 = short, 2 = long) */
830 false, /* pc_relative */
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 */
840 /* A dynamic relocation for a displacement from DTP to the target. */
841 HOWTO (R_ALPHA_DTPREL64
, /* type */
843 4, /* size (0 = byte, 1 = short, 2 = long) */
845 false, /* pc_relative */
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 */
855 /* The high 16 bits of the displacement from DTP to the target. */
856 HOWTO (R_ALPHA_DTPRELHI
, /* type */
858 1, /* size (0 = byte, 1 = short, 2 = long) */
860 false, /* pc_relative */
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 */
870 /* The low 16 bits of the displacement from DTP to the target. */
871 HOWTO (R_ALPHA_DTPRELLO
, /* type */
873 1, /* size (0 = byte, 1 = short, 2 = long) */
875 false, /* pc_relative */
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 */
885 /* A 16-bit displacement from DTP to the target. */
886 HOWTO (R_ALPHA_DTPREL16
, /* type */
888 1, /* size (0 = byte, 1 = short, 2 = long) */
890 false, /* pc_relative */
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 */
900 /* Creates a 64-bit offset in the got for the displacement
901 from TP to the target. */
902 HOWTO (R_ALPHA_GOTTPREL
, /* type */
904 1, /* size (0 = byte, 1 = short, 2 = long) */
906 false, /* pc_relative */
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 */
916 /* A dynamic relocation for a displacement from TP to the target. */
917 HOWTO (R_ALPHA_TPREL64
, /* type */
919 4, /* size (0 = byte, 1 = short, 2 = long) */
921 false, /* pc_relative */
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 */
931 /* The high 16 bits of the displacement from TP to the target. */
932 HOWTO (R_ALPHA_TPRELHI
, /* type */
934 1, /* size (0 = byte, 1 = short, 2 = long) */
936 false, /* pc_relative */
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 */
946 /* The low 16 bits of the displacement from TP to the target. */
947 HOWTO (R_ALPHA_TPRELLO
, /* type */
949 1, /* size (0 = byte, 1 = short, 2 = long) */
951 false, /* pc_relative */
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 */
961 /* A 16-bit displacement from TP to the target. */
962 HOWTO (R_ALPHA_TPREL16
, /* type */
964 1, /* size (0 = byte, 1 = short, 2 = long) */
966 false, /* pc_relative */
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 */
977 /* A relocation function which doesn't do anything. */
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
;
983 asymbol
*sym ATTRIBUTE_UNUSED
;
984 PTR data ATTRIBUTE_UNUSED
;
987 char **error_message ATTRIBUTE_UNUSED
;
990 reloc
->address
+= sec
->output_offset
;
994 /* A relocation function used for an unsupported reloc. */
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
;
1000 asymbol
*sym ATTRIBUTE_UNUSED
;
1001 PTR data ATTRIBUTE_UNUSED
;
1004 char **error_message ATTRIBUTE_UNUSED
;
1007 reloc
->address
+= sec
->output_offset
;
1008 return bfd_reloc_notsupported
;
1011 /* Do the work of the GPDISP relocation. */
1013 static bfd_reloc_status_type
1014 elf64_alpha_do_reloc_gpdisp (abfd
, gpdisp
, p_ldah
, p_lda
)
1020 bfd_reloc_status_type ret
= bfd_reloc_ok
;
1022 unsigned long i_ldah
, i_lda
;
1024 i_ldah
= bfd_get_32 (abfd
, p_ldah
);
1025 i_lda
= bfd_get_32 (abfd
, p_lda
);
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
;
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;
1039 if ((bfd_signed_vma
) gpdisp
< -(bfd_signed_vma
) 0x80000000
1040 || (bfd_signed_vma
) gpdisp
>= (bfd_signed_vma
) 0x7fff8000)
1041 ret
= bfd_reloc_overflow
;
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);
1048 bfd_put_32 (abfd
, (bfd_vma
) i_ldah
, p_ldah
);
1049 bfd_put_32 (abfd
, (bfd_vma
) i_lda
, p_lda
);
1054 /* The special function for the GPDISP reloc. */
1056 static bfd_reloc_status_type
1057 elf64_alpha_reloc_gpdisp (abfd
, reloc_entry
, sym
, data
, input_section
,
1058 output_bfd
, err_msg
)
1060 arelent
*reloc_entry
;
1061 asymbol
*sym ATTRIBUTE_UNUSED
;
1063 asection
*input_section
;
1067 bfd_reloc_status_type ret
;
1068 bfd_vma gp
, relocation
;
1069 bfd_byte
*p_ldah
, *p_lda
;
1071 /* Don't do anything if we're not doing a final link. */
1074 reloc_entry
->address
+= input_section
->output_offset
;
1075 return bfd_reloc_ok
;
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
;
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
);
1086 relocation
= (input_section
->output_section
->vma
1087 + input_section
->output_offset
1088 + reloc_entry
->address
);
1090 p_ldah
= (bfd_byte
*) data
+ reloc_entry
->address
;
1091 p_lda
= p_ldah
+ reloc_entry
->addend
;
1093 ret
= elf64_alpha_do_reloc_gpdisp (abfd
, gp
- relocation
, p_ldah
, p_lda
);
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");
1102 /* A mapping from BFD reloc types to Alpha ELF reloc types. */
1104 struct elf_reloc_map
1106 bfd_reloc_code_real_type bfd_reloc_val
;
1110 static const struct elf_reloc_map elf64_alpha_reloc_map
[] =
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
},
1144 /* Given a BFD reloc type, return a HOWTO structure. */
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
;
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
);
1156 if (i
->bfd_reloc_val
== code
)
1157 return &elf64_alpha_howto_table
[i
->elf_reloc_val
];
1162 /* Given an Alpha ELF reloc type, fill in an arelent structure. */
1165 elf64_alpha_info_to_howto (abfd
, cache_ptr
, dst
)
1166 bfd
*abfd ATTRIBUTE_UNUSED
;
1168 Elf64_Internal_Rela
*dst
;
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
];
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)
1181 /* This is PT_TLS segment p_vaddr. */
1182 #define alpha_get_dtprel_base(tlss) \
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))
1190 /* These functions do relaxation for Alpha ELF.
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.
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
1204 #define OP_LDAH 0x09
1205 #define INSN_JSR 0x68004000
1206 #define INSN_JSR_MASK 0xfc00c000
1210 #define INSN_UNOP 0x2ffe0000
1211 #define INSN_ADDQ 0x40000400
1212 #define INSN_RDUNIQ 0x0000009e
1214 struct alpha_relax_info
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
;
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
;
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
,
1254 static Elf_Internal_Rela
*
1255 elf64_alpha_find_reloc_at_ofs (rel
, relend
, offset
, type
)
1256 Elf_Internal_Rela
*rel
, *relend
;
1260 while (rel
< relend
)
1262 if (rel
->r_offset
== offset
1263 && ELF64_R_TYPE (rel
->r_info
) == (unsigned int) type
)
1271 elf64_alpha_relax_with_lituse (info
, symval
, irel
)
1272 struct alpha_relax_info
*info
;
1274 Elf_Internal_Rela
*irel
;
1276 Elf_Internal_Rela
*urel
, *irelend
= info
->relend
;
1277 int flags
, count
, i
;
1278 bfd_signed_vma disp
;
1281 boolean lit_reused
= false;
1282 boolean all_optimized
= true;
1283 unsigned int lit_insn
;
1285 lit_insn
= bfd_get_32 (info
->abfd
, info
->contents
+ irel
->r_offset
);
1286 if (lit_insn
>> 26 != OP_LDQ
)
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
));
1295 /* Can't relax dynamic symbols. */
1296 if (alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
))
1299 /* Summarize how this particular LITERAL is used. */
1300 for (urel
= irel
+1, flags
= count
= 0; urel
< irelend
; ++urel
, ++count
)
1302 if (ELF64_R_TYPE (urel
->r_info
) != R_ALPHA_LITUSE
)
1304 if (urel
->r_addend
<= 3)
1305 flags
|= 1 << urel
->r_addend
;
1308 /* A little preparation for the loop... */
1309 disp
= symval
- info
->gp
;
1311 for (urel
= irel
+1, i
= 0; i
< count
; ++i
, ++urel
)
1315 bfd_signed_vma xdisp
;
1317 insn
= bfd_get_32 (info
->abfd
, info
->contents
+ urel
->r_offset
);
1319 switch (urel
->r_addend
)
1321 case LITUSE_ALPHA_ADDR
:
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;
1328 case LITUSE_ALPHA_BASE
:
1329 /* We can always optimize 16-bit displacements. */
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. */
1338 xdisp
= disp
+ insn_disp
;
1339 fits16
= (xdisp
>= - (bfd_signed_vma
) 0x8000 && xdisp
< 0x8000);
1340 fits32
= (xdisp
>= - (bfd_signed_vma
) 0x80000000
1341 && xdisp
< 0x7fff8000);
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
),
1350 urel
->r_addend
= irel
->r_addend
;
1351 info
->changed_relocs
= true;
1353 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
1354 info
->contents
+ urel
->r_offset
);
1355 info
->changed_contents
= true;
1358 /* If all mem+byte, we can optimize 32-bit mem displacements. */
1359 else if (fits32
&& !(flags
& ~6))
1361 /* FIXME: sanity check that lit insn Ra is mem insn Rb. */
1363 irel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
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
);
1369 info
->changed_contents
= true;
1371 urel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1373 urel
->r_addend
= irel
->r_addend
;
1374 info
->changed_relocs
= true;
1377 all_optimized
= false;
1380 case LITUSE_ALPHA_BYTOFF
:
1381 /* We can always optimize byte instructions. */
1383 /* FIXME: sanity check the insn for byte op. Check that the
1384 literal dest reg is indeed Rb in the byte insn. */
1386 insn
&= ~ (unsigned) 0x001ff000;
1387 insn
|= ((symval
& 7) << 13) | 0x1000;
1389 urel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1391 info
->changed_relocs
= true;
1393 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
1394 info
->contents
+ urel
->r_offset
);
1395 info
->changed_contents
= true;
1398 case LITUSE_ALPHA_JSR
:
1399 case LITUSE_ALPHA_TLSGD
:
1400 case LITUSE_ALPHA_TLSLDM
:
1402 bfd_vma optdest
, org
;
1403 bfd_signed_vma odisp
;
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
;
1412 if (odisp
>= -0x400000 && odisp
< 0x400000)
1414 Elf_Internal_Rela
*xrel
;
1416 /* Preserve branch prediction call stack when possible. */
1417 if ((insn
& INSN_JSR_MASK
) == INSN_JSR
)
1418 insn
= (OP_BSR
<< 26) | (insn
& 0x03e00000);
1420 insn
= (OP_BR
<< 26) | (insn
& 0x03e00000);
1422 urel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1424 urel
->r_addend
= irel
->r_addend
;
1427 urel
->r_addend
+= optdest
- symval
;
1429 all_optimized
= false;
1431 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
1432 info
->contents
+ urel
->r_offset
);
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
,
1439 xrel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1441 info
->changed_contents
= true;
1442 info
->changed_relocs
= true;
1445 all_optimized
= false;
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. */
1451 Elf_Internal_Rela
*gpdisp
1452 = (elf64_alpha_find_reloc_at_ofs
1453 (info
->relocs
, irelend
, urel
->r_offset
+ 4,
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
);
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)
1469 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, p_ldah
);
1470 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, p_lda
);
1472 gpdisp
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1473 info
->changed_contents
= true;
1474 info
->changed_relocs
= true;
1483 /* If all cases were optimized, we can reduce the use count on this
1484 got entry by one, possibly eliminating it. */
1487 if (--info
->gotent
->use_count
== 0)
1489 int sz
= alpha_got_entry_size (R_ALPHA_LITERAL
);
1490 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
1492 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
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. */
1501 irel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1502 info
->changed_relocs
= true;
1504 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
,
1505 info
->contents
+ irel
->r_offset
);
1506 info
->changed_contents
= true;
1514 elf64_alpha_relax_opt_call (info
, symval
)
1515 struct alpha_relax_info
*info
;
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
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
)
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
)
1532 /* Otherwise, we may be able to identify a GP load in the first two
1533 words, which we can then skip. */
1536 Elf_Internal_Rela
*tsec_relocs
, *tsec_relend
, *tsec_free
, *gpdisp
;
1539 /* Load the relocations from the section that the target symbol is in. */
1540 if (info
->sec
== info
->tsec
)
1542 tsec_relocs
= info
->relocs
;
1543 tsec_relend
= info
->relend
;
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
)
1554 tsec_relend
= tsec_relocs
+ info
->tsec
->reloc_count
;
1555 tsec_free
= (info
->link_info
->keep_memory
? NULL
: tsec_relocs
);
1558 /* Recover the symbol's offset within the section. */
1559 ofs
= (symval
- info
->tsec
->output_section
->vma
1560 - info
->tsec
->output_offset
);
1562 /* Look for a GPDISP reloc. */
1563 gpdisp
= (elf64_alpha_find_reloc_at_ofs
1564 (tsec_relocs
, tsec_relend
, ofs
, R_ALPHA_GPDISP
));
1566 if (!gpdisp
|| gpdisp
->r_addend
!= 4)
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
)
1586 elf64_alpha_relax_got_load (info
, symval
, irel
, r_type
)
1587 struct alpha_relax_info
*info
;
1589 Elf_Internal_Rela
*irel
;
1590 unsigned long r_type
;
1593 bfd_signed_vma disp
;
1595 /* Get the instruction. */
1596 insn
= bfd_get_32 (info
->abfd
, info
->contents
+ irel
->r_offset
);
1598 if (insn
>> 26 != OP_LDQ
)
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
));
1608 /* Can't relax dynamic symbols. */
1609 if (alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
))
1612 /* Can't use local-exec relocations in shared libraries. */
1613 if (r_type
== R_ALPHA_GOTTPREL
&& info
->link_info
->shared
)
1616 if (r_type
== R_ALPHA_LITERAL
)
1617 disp
= symval
- info
->gp
;
1620 bfd_vma dtp_base
, tp_base
;
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
);
1628 if (disp
< -0x8000 || disp
>= 0x8000)
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);
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;
1642 case R_ALPHA_LITERAL
:
1643 r_type
= R_ALPHA_GPREL16
;
1645 case R_ALPHA_GOTDTPREL
:
1646 r_type
= R_ALPHA_DTPREL16
;
1648 case R_ALPHA_GOTTPREL
:
1649 r_type
= R_ALPHA_TPREL16
;
1656 irel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
), r_type
);
1657 info
->changed_relocs
= true;
1659 /* Reduce the use count on this got entry by one, possibly
1661 if (--info
->gotent
->use_count
== 0)
1663 int sz
= alpha_got_entry_size (r_type
);
1664 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
1666 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
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.
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.
1677 Any such jsr insn can be replaced by a bsr if it is in range.
1679 This would mean that we'd have to _add_ relocations, the pain of
1680 which gives one pause. */
1686 elf64_alpha_relax_gprelhilo (info
, symval
, irel
, hi
)
1687 struct alpha_relax_info
*info
;
1689 Elf_Internal_Rela
*irel
;
1693 bfd_signed_vma disp
;
1694 bfd_byte
*pos
= info
->contents
+ irel
->r_offset
;
1696 /* ??? This assumes that the compiler doesn't render
1700 ldah t, array(gp) !gprelhigh
1702 ldq r, array(t) !gprellow
1704 which would indeed be the most efficient way to implement this. */
1708 disp
= symval
- info
->gp
;
1709 if (disp
< -0x8000 || disp
>= 0x8000)
1714 /* Nop out the high instruction. */
1716 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, pos
);
1717 info
->changed_contents
= true;
1719 irel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1721 info
->changed_relocs
= true;
1725 /* Adjust the low instruction to reference GP directly. */
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;
1732 irel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1734 info
->changed_relocs
= true;
1741 elf64_alpha_relax_tls_get_addr (info
, symval
, irel
, is_gd
)
1742 struct alpha_relax_info
*info
;
1744 Elf_Internal_Rela
*irel
;
1749 Elf_Internal_Rela
*gpdisp
, *hint
;
1750 boolean dynamic
, use_gottprel
;
1752 dynamic
= alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
);
1754 /* ??? For LD relaxation, we need a symbol referencing the beginning
1755 of the TLS segment. */
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
))
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
))
1770 /* Otherwise we must be building an executable to do anything. */
1771 else if (info
->link_info
->shared
)
1774 /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
1775 the matching LITUSE_TLS relocations. */
1776 if (irel
+ 2 >= info
->relend
)
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
))
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
);
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
;
1796 /* Only positions 0 and 1 are allowed to be out of order. */
1797 if (pos
[1] < pos
[0])
1799 bfd_byte
*tmp
= pos
[0];
1803 if (pos
[1] >= pos
[2] || pos
[2] >= pos
[3] || pos
[3] >= pos
[4])
1806 /* Reduce the use count on the LITERAL relocation. Do this before we
1807 smash the symndx when we adjust the relocations below. */
1809 struct alpha_elf_got_entry
*lit_gotent
;
1810 struct alpha_elf_link_hash_entry
*lit_h
;
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
];
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
;
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
)
1827 BFD_ASSERT (lit_gotent
);
1829 if (--lit_gotent
->use_count
== 0)
1831 int sz
= alpha_got_entry_size (R_ALPHA_LITERAL
);
1832 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
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
1844 ldq $16,x($gp) !gottprel
1849 or the first pair to
1850 lda $16,x($gp) !tprel
1853 ldah $16,x($gp) !tprelhi
1854 lda $16,x($16) !tprello
1858 use_gottprel
= false;
1859 switch (!dynamic
&& !info
->link_info
->shared
)
1864 bfd_signed_vma disp
;
1866 BFD_ASSERT (info
->tls_segment
!= NULL
);
1867 tp_base
= alpha_get_tprel_base (info
->tls_segment
);
1868 disp
= symval
- tp_base
;
1870 if (disp
>= -0x8000 && disp
< 0x8000)
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]);
1876 irel
[0].r_offset
= pos
[0] - info
->contents
;
1877 irel
[0].r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1879 irel
[1].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1882 else if (disp
>= -(bfd_signed_vma
) 0x80000000
1883 && disp
< (bfd_signed_vma
) 0x7fff8000)
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]);
1890 irel
[0].r_offset
= pos
[0] - info
->contents
;
1891 irel
[0].r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1893 irel
[1].r_offset
= pos
[1] - info
->contents
;
1894 irel
[1].r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1902 use_gottprel
= true;
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]);
1908 irel
[0].r_offset
= pos
[0] - info
->contents
;
1909 irel
[0].r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
1911 irel
[1].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1915 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_RDUNIQ
, pos
[2]);
1917 insn
= INSN_ADDQ
| (16 << 21) | (0 << 16) | (0 << 0);
1918 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[3]);
1920 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, pos
[4]);
1922 irel
[2].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1923 gpdisp
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1925 hint
= elf64_alpha_find_reloc_at_ofs (info
->relocs
, info
->relend
,
1926 irel
[2].r_offset
, R_ALPHA_HINT
);
1928 hint
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
1930 info
->changed_contents
= true;
1931 info
->changed_relocs
= true;
1933 /* Reduce the use count on the TLSGD/TLSLDM relocation. */
1934 if (--info
->gotent
->use_count
== 0)
1936 int sz
= alpha_got_entry_size (info
->gotent
->reloc_type
);
1937 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
1939 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
1942 /* If we've switched to a GOTTPREL relocation, increment the reference
1943 count on that got entry. */
1946 struct alpha_elf_got_entry
*tprel_gotent
;
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
)
1955 tprel_gotent
->use_count
++;
1958 if (info
->gotent
->use_count
== 0)
1959 tprel_gotent
= info
->gotent
;
1962 tprel_gotent
= (struct alpha_elf_got_entry
*)
1963 bfd_alloc (info
->abfd
, sizeof (struct alpha_elf_got_entry
));
1967 tprel_gotent
->next
= *info
->first_gotent
;
1968 *info
->first_gotent
= tprel_gotent
;
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;
1977 tprel_gotent
->use_count
= 1;
1978 tprel_gotent
->reloc_type
= R_ALPHA_GOTTPREL
;
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
;
1990 bfd
*output_bfd
= info
->sec
->output_section
->owner
;
1995 for (o
= output_bfd
->sections
; o
; o
= o
->next
)
1996 if ((o
->flags
& SEC_THREAD_LOCAL
) != 0
1997 && (o
->flags
& SEC_LOAD
) != 0)
2009 if (bfd_get_section_alignment (output_bfd
, o
) > align
)
2010 align
= bfd_get_section_alignment (output_bfd
, o
);
2012 size
= o
->_raw_size
;
2013 if (size
== 0 && (o
->flags
& SEC_HAS_CONTENTS
) == 0)
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
;
2020 end
= o
->vma
+ size
;
2023 while (o
&& (o
->flags
& SEC_THREAD_LOCAL
));
2026 seg
->size
= end
- base
;
2033 elf64_alpha_relax_section (abfd
, sec
, link_info
, again
)
2036 struct bfd_link_info
*link_info
;
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
;
2047 /* We are not currently changing any sizes, so only one pass. */
2050 if (link_info
->relocateable
2051 || (sec
->flags
& SEC_RELOC
) == 0
2052 || sec
->reloc_count
== 0)
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
;
2060 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2061 local_got_entries
= alpha_elf_tdata(abfd
)->local_got_entries
;
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
)
2070 memset(&info
, 0, sizeof (info
));
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
;
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
;
2083 asection
*sgot
= alpha_elf_tdata (info
.gotobj
)->got
;
2084 info
.gp
= (sgot
->output_section
->vma
2085 + sgot
->output_offset
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
;
2094 info
.contents
= (bfd_byte
*) bfd_malloc (sec
->_raw_size
);
2095 if (info
.contents
== NULL
)
2098 if (! bfd_get_section_contents (abfd
, sec
, info
.contents
,
2099 (file_ptr
) 0, sec
->_raw_size
))
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
);
2108 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
2111 struct alpha_elf_got_entry
*gotent
;
2112 unsigned long r_type
= ELF64_R_TYPE (irel
->r_info
);
2114 /* Early exit for unhandled or unrelaxable relocations. */
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
:
2123 case R_ALPHA_TLSLDM
:
2129 /* Get the value of the symbol referred to by the reloc. */
2130 if (ELF64_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2132 /* A local symbol. */
2133 Elf_Internal_Sym
*isym
;
2135 /* Read this BFD's local symbols. */
2136 if (isymbuf
== NULL
)
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,
2143 if (isymbuf
== NULL
)
2147 isym
= isymbuf
+ ELF64_R_SYM (irel
->r_info
);
2148 if (isym
->st_shndx
== SHN_UNDEF
)
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
;
2155 info
.tsec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
2158 info
.other
= isym
->st_other
;
2159 info
.first_gotent
= &local_got_entries
[ELF64_R_SYM(irel
->r_info
)];
2160 symval
= isym
->st_value
;
2165 struct alpha_elf_link_hash_entry
*h
;
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
);
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
;
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
)
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
))
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
;
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
)
2198 info
.gotent
= gotent
;
2200 symval
+= info
.tsec
->output_section
->vma
+ info
.tsec
->output_offset
;
2201 symval
+= irel
->r_addend
;
2205 case R_ALPHA_LITERAL
:
2206 BFD_ASSERT(info
.gotent
!= NULL
);
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
)
2214 if (!elf64_alpha_relax_with_lituse (&info
, symval
, irel
))
2219 if (!elf64_alpha_relax_got_load (&info
, symval
, irel
, r_type
))
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
))
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
))
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
))
2248 if (!elf64_alpha_size_plt_section (link_info
))
2250 if (!elf64_alpha_size_got_sections (link_info
))
2252 if (!elf64_alpha_size_rela_got_section (link_info
))
2256 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
2258 if (!link_info
->keep_memory
)
2262 /* Cache the symbols for elf_link_input_bfd. */
2263 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
2267 if (info
.contents
!= NULL
2268 && elf_section_data (sec
)->this_hdr
.contents
!= info
.contents
)
2270 if (!info
.changed_contents
&& !link_info
->keep_memory
)
2271 free (info
.contents
);
2274 /* Cache the section contents for elf_link_input_bfd. */
2275 elf_section_data (sec
)->this_hdr
.contents
= info
.contents
;
2279 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
2281 if (!info
.changed_relocs
)
2282 free (internal_relocs
);
2284 elf_section_data (sec
)->relocs
= internal_relocs
;
2287 *again
= info
.changed_contents
|| info
.changed_relocs
;
2293 && symtab_hdr
->contents
!= (unsigned char *) 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
);
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) */
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
2316 #define MAX_GOT_SIZE (64*1024)
2318 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
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
2326 elf64_alpha_section_from_shdr (abfd
, hdr
, name
)
2328 Elf64_Internal_Shdr
*hdr
;
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
)
2340 case SHT_ALPHA_DEBUG
:
2341 if (strcmp (name
, ".mdebug") != 0)
2348 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
))
2350 newsect
= hdr
->bfd_section
;
2352 if (hdr
->sh_type
== SHT_ALPHA_DEBUG
)
2354 if (! bfd_set_section_flags (abfd
, newsect
,
2355 (bfd_get_section_flags (abfd
, newsect
)
2363 /* Convert Alpha specific section flags to bfd internal section flags. */
2366 elf64_alpha_section_flags (flags
, hdr
)
2368 Elf64_Internal_Shdr
*hdr
;
2370 if (hdr
->sh_flags
& SHF_ALPHA_GPREL
)
2371 *flags
|= SEC_SMALL_DATA
;
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. */
2380 elf64_alpha_fake_sections (abfd
, hdr
, sec
)
2382 Elf64_Internal_Shdr
*hdr
;
2385 register const char *name
;
2387 name
= bfd_get_section_name (abfd
, sec
);
2389 if (strcmp (name
, ".mdebug") == 0)
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;
2397 hdr
->sh_entsize
= 1;
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
;
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. */
2413 elf64_alpha_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
2415 struct bfd_link_info
*info
;
2416 const Elf_Internal_Sym
*sym
;
2417 const char **namep ATTRIBUTE_UNUSED
;
2418 flagword
*flagsp ATTRIBUTE_UNUSED
;
2422 if (sym
->st_shndx
== SHN_COMMON
2423 && !info
->relocateable
2424 && sym
->st_size
<= elf_gp_size (abfd
))
2426 /* Common symbols less than or equal to -G nn bytes are
2427 automatically put into .sbss. */
2429 asection
*scomm
= bfd_get_section_by_name (abfd
, ".scommon");
2433 scomm
= bfd_make_section (abfd
, ".scommon");
2435 || !bfd_set_section_flags (abfd
, scomm
, (SEC_ALLOC
2437 | SEC_LINKER_CREATED
)))
2442 *valp
= sym
->st_size
;
2448 /* Create the .got section. */
2451 elf64_alpha_create_got_section(abfd
, info
)
2453 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2457 if (bfd_get_section_by_name (abfd
, ".got"))
2460 s
= bfd_make_section (abfd
, ".got");
2462 || !bfd_set_section_flags (abfd
, s
, (SEC_ALLOC
| SEC_LOAD
2465 | SEC_LINKER_CREATED
))
2466 || !bfd_set_section_alignment (abfd
, s
, 3))
2469 alpha_elf_tdata (abfd
)->got
= s
;
2474 /* Create all the dynamic sections. */
2477 elf64_alpha_create_dynamic_sections (abfd
, info
)
2479 struct bfd_link_info
*info
;
2482 struct elf_link_hash_entry
*h
;
2484 /* We need to create .plt, .rela.plt, .got, and .rela.got sections. */
2486 s
= bfd_make_section (abfd
, ".plt");
2488 || ! bfd_set_section_flags (abfd
, s
, (SEC_ALLOC
| SEC_LOAD
2491 | SEC_LINKER_CREATED
2493 || ! bfd_set_section_alignment (abfd
, s
, 3))
2496 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
2499 if (! (_bfd_generic_link_add_one_symbol
2500 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
2501 (bfd_vma
) 0, (const char *) NULL
, false,
2502 get_elf_backend_data (abfd
)->collect
,
2503 (struct bfd_link_hash_entry
**) &h
)))
2505 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
2506 h
->type
= STT_OBJECT
;
2509 && ! _bfd_elf_link_record_dynamic_symbol (info
, h
))
2512 s
= bfd_make_section (abfd
, ".rela.plt");
2514 || !bfd_set_section_flags (abfd
, s
, (SEC_ALLOC
| SEC_LOAD
2517 | SEC_LINKER_CREATED
2519 || ! bfd_set_section_alignment (abfd
, s
, 3))
2522 /* We may or may not have created a .got section for this object, but
2523 we definitely havn't done the rest of the work. */
2525 if (!elf64_alpha_create_got_section (abfd
, info
))
2528 s
= bfd_make_section(abfd
, ".rela.got");
2530 || !bfd_set_section_flags (abfd
, s
, (SEC_ALLOC
| SEC_LOAD
2533 | SEC_LINKER_CREATED
2535 || !bfd_set_section_alignment (abfd
, s
, 3))
2538 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
2539 dynobj's .got section. We don't do this in the linker script
2540 because we don't want to define the symbol if we are not creating
2541 a global offset table. */
2543 if (!(_bfd_generic_link_add_one_symbol
2544 (info
, abfd
, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL
,
2545 alpha_elf_tdata(abfd
)->got
, (bfd_vma
) 0, (const char *) NULL
,
2546 false, get_elf_backend_data (abfd
)->collect
,
2547 (struct bfd_link_hash_entry
**) &h
)))
2549 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
2550 h
->type
= STT_OBJECT
;
2553 && ! _bfd_elf_link_record_dynamic_symbol (info
, h
))
2556 elf_hash_table (info
)->hgot
= h
;
2561 /* Read ECOFF debugging information from a .mdebug section into a
2562 ecoff_debug_info structure. */
2565 elf64_alpha_read_ecoff_info (abfd
, section
, debug
)
2568 struct ecoff_debug_info
*debug
;
2571 const struct ecoff_debug_swap
*swap
;
2572 char *ext_hdr
= NULL
;
2574 swap
= get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
2575 memset (debug
, 0, sizeof (*debug
));
2577 ext_hdr
= (char *) bfd_malloc (swap
->external_hdr_size
);
2578 if (ext_hdr
== NULL
&& swap
->external_hdr_size
!= 0)
2581 if (! bfd_get_section_contents (abfd
, section
, ext_hdr
, (file_ptr
) 0,
2582 swap
->external_hdr_size
))
2585 symhdr
= &debug
->symbolic_header
;
2586 (*swap
->swap_hdr_in
) (abfd
, ext_hdr
, symhdr
);
2588 /* The symbolic header contains absolute file offsets and sizes to
2590 #define READ(ptr, offset, count, size, type) \
2591 if (symhdr->count == 0) \
2592 debug->ptr = NULL; \
2595 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
2596 debug->ptr = (type) bfd_malloc (amt); \
2597 if (debug->ptr == NULL) \
2598 goto error_return; \
2599 if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
2600 || bfd_bread (debug->ptr, amt, abfd) != amt) \
2601 goto error_return; \
2604 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char), unsigned char *);
2605 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
2606 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
2607 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
2608 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
2609 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
2611 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
2612 READ (ssext
, cbSsExtOffset
, issExtMax
, sizeof (char), char *);
2613 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
2614 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
2615 READ (external_ext
, cbExtOffset
, iextMax
, swap
->external_ext_size
, PTR
);
2619 debug
->adjust
= NULL
;
2624 if (ext_hdr
!= NULL
)
2626 if (debug
->line
!= NULL
)
2628 if (debug
->external_dnr
!= NULL
)
2629 free (debug
->external_dnr
);
2630 if (debug
->external_pdr
!= NULL
)
2631 free (debug
->external_pdr
);
2632 if (debug
->external_sym
!= NULL
)
2633 free (debug
->external_sym
);
2634 if (debug
->external_opt
!= NULL
)
2635 free (debug
->external_opt
);
2636 if (debug
->external_aux
!= NULL
)
2637 free (debug
->external_aux
);
2638 if (debug
->ss
!= NULL
)
2640 if (debug
->ssext
!= NULL
)
2641 free (debug
->ssext
);
2642 if (debug
->external_fdr
!= NULL
)
2643 free (debug
->external_fdr
);
2644 if (debug
->external_rfd
!= NULL
)
2645 free (debug
->external_rfd
);
2646 if (debug
->external_ext
!= NULL
)
2647 free (debug
->external_ext
);
2651 /* Alpha ELF local labels start with '$'. */
2654 elf64_alpha_is_local_label_name (abfd
, name
)
2655 bfd
*abfd ATTRIBUTE_UNUSED
;
2658 return name
[0] == '$';
2661 /* Alpha ELF follows MIPS ELF in using a special find_nearest_line
2662 routine in order to handle the ECOFF debugging information. We
2663 still call this mips_elf_find_line because of the slot
2664 find_line_info in elf_obj_tdata is declared that way. */
2666 struct mips_elf_find_line
2668 struct ecoff_debug_info d
;
2669 struct ecoff_find_line i
;
2673 elf64_alpha_find_nearest_line (abfd
, section
, symbols
, offset
, filename_ptr
,
2674 functionname_ptr
, line_ptr
)
2679 const char **filename_ptr
;
2680 const char **functionname_ptr
;
2681 unsigned int *line_ptr
;
2685 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
2686 filename_ptr
, functionname_ptr
,
2688 &elf_tdata (abfd
)->dwarf2_find_line_info
))
2691 msec
= bfd_get_section_by_name (abfd
, ".mdebug");
2695 struct mips_elf_find_line
*fi
;
2696 const struct ecoff_debug_swap
* const swap
=
2697 get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
2699 /* If we are called during a link, alpha_elf_final_link may have
2700 cleared the SEC_HAS_CONTENTS field. We force it back on here
2701 if appropriate (which it normally will be). */
2702 origflags
= msec
->flags
;
2703 if (elf_section_data (msec
)->this_hdr
.sh_type
!= SHT_NOBITS
)
2704 msec
->flags
|= SEC_HAS_CONTENTS
;
2706 fi
= elf_tdata (abfd
)->find_line_info
;
2709 bfd_size_type external_fdr_size
;
2712 struct fdr
*fdr_ptr
;
2713 bfd_size_type amt
= sizeof (struct mips_elf_find_line
);
2715 fi
= (struct mips_elf_find_line
*) bfd_zalloc (abfd
, amt
);
2718 msec
->flags
= origflags
;
2722 if (!elf64_alpha_read_ecoff_info (abfd
, msec
, &fi
->d
))
2724 msec
->flags
= origflags
;
2728 /* Swap in the FDR information. */
2729 amt
= fi
->d
.symbolic_header
.ifdMax
* sizeof (struct fdr
);
2730 fi
->d
.fdr
= (struct fdr
*) bfd_alloc (abfd
, amt
);
2731 if (fi
->d
.fdr
== NULL
)
2733 msec
->flags
= origflags
;
2736 external_fdr_size
= swap
->external_fdr_size
;
2737 fdr_ptr
= fi
->d
.fdr
;
2738 fraw_src
= (char *) fi
->d
.external_fdr
;
2739 fraw_end
= (fraw_src
2740 + fi
->d
.symbolic_header
.ifdMax
* external_fdr_size
);
2741 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
2742 (*swap
->swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
2744 elf_tdata (abfd
)->find_line_info
= fi
;
2746 /* Note that we don't bother to ever free this information.
2747 find_nearest_line is either called all the time, as in
2748 objdump -l, so the information should be saved, or it is
2749 rarely called, as in ld error messages, so the memory
2750 wasted is unimportant. Still, it would probably be a
2751 good idea for free_cached_info to throw it away. */
2754 if (_bfd_ecoff_locate_line (abfd
, section
, offset
, &fi
->d
, swap
,
2755 &fi
->i
, filename_ptr
, functionname_ptr
,
2758 msec
->flags
= origflags
;
2762 msec
->flags
= origflags
;
2765 /* Fall back on the generic ELF find_nearest_line routine. */
2767 return _bfd_elf_find_nearest_line (abfd
, section
, symbols
, offset
,
2768 filename_ptr
, functionname_ptr
,
2772 /* Structure used to pass information to alpha_elf_output_extsym. */
2777 struct bfd_link_info
*info
;
2778 struct ecoff_debug_info
*debug
;
2779 const struct ecoff_debug_swap
*swap
;
2784 elf64_alpha_output_extsym (h
, data
)
2785 struct alpha_elf_link_hash_entry
*h
;
2788 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
2790 asection
*sec
, *output_section
;
2792 if (h
->root
.root
.type
== bfd_link_hash_warning
)
2793 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
2795 if (h
->root
.indx
== -2)
2797 else if (((h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2798 || (h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) != 0)
2799 && (h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0
2800 && (h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR
) == 0)
2802 else if (einfo
->info
->strip
== strip_all
2803 || (einfo
->info
->strip
== strip_some
2804 && bfd_hash_lookup (einfo
->info
->keep_hash
,
2805 h
->root
.root
.root
.string
,
2806 false, false) == NULL
))
2814 if (h
->esym
.ifd
== -2)
2817 h
->esym
.cobol_main
= 0;
2818 h
->esym
.weakext
= 0;
2819 h
->esym
.reserved
= 0;
2820 h
->esym
.ifd
= ifdNil
;
2821 h
->esym
.asym
.value
= 0;
2822 h
->esym
.asym
.st
= stGlobal
;
2824 if (h
->root
.root
.type
!= bfd_link_hash_defined
2825 && h
->root
.root
.type
!= bfd_link_hash_defweak
)
2826 h
->esym
.asym
.sc
= scAbs
;
2831 sec
= h
->root
.root
.u
.def
.section
;
2832 output_section
= sec
->output_section
;
2834 /* When making a shared library and symbol h is the one from
2835 the another shared library, OUTPUT_SECTION may be null. */
2836 if (output_section
== NULL
)
2837 h
->esym
.asym
.sc
= scUndefined
;
2840 name
= bfd_section_name (output_section
->owner
, output_section
);
2842 if (strcmp (name
, ".text") == 0)
2843 h
->esym
.asym
.sc
= scText
;
2844 else if (strcmp (name
, ".data") == 0)
2845 h
->esym
.asym
.sc
= scData
;
2846 else if (strcmp (name
, ".sdata") == 0)
2847 h
->esym
.asym
.sc
= scSData
;
2848 else if (strcmp (name
, ".rodata") == 0
2849 || strcmp (name
, ".rdata") == 0)
2850 h
->esym
.asym
.sc
= scRData
;
2851 else if (strcmp (name
, ".bss") == 0)
2852 h
->esym
.asym
.sc
= scBss
;
2853 else if (strcmp (name
, ".sbss") == 0)
2854 h
->esym
.asym
.sc
= scSBss
;
2855 else if (strcmp (name
, ".init") == 0)
2856 h
->esym
.asym
.sc
= scInit
;
2857 else if (strcmp (name
, ".fini") == 0)
2858 h
->esym
.asym
.sc
= scFini
;
2860 h
->esym
.asym
.sc
= scAbs
;
2864 h
->esym
.asym
.reserved
= 0;
2865 h
->esym
.asym
.index
= indexNil
;
2868 if (h
->root
.root
.type
== bfd_link_hash_common
)
2869 h
->esym
.asym
.value
= h
->root
.root
.u
.c
.size
;
2870 else if (h
->root
.root
.type
== bfd_link_hash_defined
2871 || h
->root
.root
.type
== bfd_link_hash_defweak
)
2873 if (h
->esym
.asym
.sc
== scCommon
)
2874 h
->esym
.asym
.sc
= scBss
;
2875 else if (h
->esym
.asym
.sc
== scSCommon
)
2876 h
->esym
.asym
.sc
= scSBss
;
2878 sec
= h
->root
.root
.u
.def
.section
;
2879 output_section
= sec
->output_section
;
2880 if (output_section
!= NULL
)
2881 h
->esym
.asym
.value
= (h
->root
.root
.u
.def
.value
2882 + sec
->output_offset
2883 + output_section
->vma
);
2885 h
->esym
.asym
.value
= 0;
2887 else if ((h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
2889 /* Set type and value for a symbol with a function stub. */
2890 h
->esym
.asym
.st
= stProc
;
2891 sec
= bfd_get_section_by_name (einfo
->abfd
, ".plt");
2893 h
->esym
.asym
.value
= 0;
2896 output_section
= sec
->output_section
;
2897 if (output_section
!= NULL
)
2898 h
->esym
.asym
.value
= (h
->root
.plt
.offset
2899 + sec
->output_offset
2900 + output_section
->vma
);
2902 h
->esym
.asym
.value
= 0;
2906 if (! bfd_ecoff_debug_one_external (einfo
->abfd
, einfo
->debug
, einfo
->swap
,
2907 h
->root
.root
.root
.string
,
2910 einfo
->failed
= true;
2917 /* Search for and possibly create a got entry. */
2919 static struct alpha_elf_got_entry
*
2920 get_got_entry (abfd
, h
, r_type
, r_symndx
, r_addend
)
2922 struct alpha_elf_link_hash_entry
*h
;
2923 unsigned long r_type
, r_symndx
;
2926 struct alpha_elf_got_entry
*gotent
;
2927 struct alpha_elf_got_entry
**slot
;
2930 slot
= &h
->got_entries
;
2933 /* This is a local .got entry -- record for merge. */
2935 struct alpha_elf_got_entry
**local_got_entries
;
2937 local_got_entries
= alpha_elf_tdata(abfd
)->local_got_entries
;
2938 if (!local_got_entries
)
2941 Elf_Internal_Shdr
*symtab_hdr
;
2943 symtab_hdr
= &elf_tdata(abfd
)->symtab_hdr
;
2944 size
= symtab_hdr
->sh_info
;
2945 size
*= sizeof (struct alpha_elf_got_entry
*);
2948 = (struct alpha_elf_got_entry
**) bfd_zalloc (abfd
, size
);
2949 if (!local_got_entries
)
2952 alpha_elf_tdata (abfd
)->local_got_entries
= local_got_entries
;
2955 slot
= &local_got_entries
[r_symndx
];
2958 for (gotent
= *slot
; gotent
; gotent
= gotent
->next
)
2959 if (gotent
->gotobj
== abfd
2960 && gotent
->reloc_type
== r_type
2961 && gotent
->addend
== r_addend
)
2969 amt
= sizeof (struct alpha_elf_got_entry
);
2970 gotent
= (struct alpha_elf_got_entry
*) bfd_alloc (abfd
, amt
);
2974 gotent
->gotobj
= abfd
;
2975 gotent
->addend
= r_addend
;
2976 gotent
->got_offset
= -1;
2977 gotent
->use_count
= 1;
2978 gotent
->reloc_type
= r_type
;
2979 gotent
->reloc_done
= 0;
2980 gotent
->reloc_xlated
= 0;
2982 gotent
->next
= *slot
;
2985 entry_size
= alpha_got_entry_size (r_type
);
2986 alpha_elf_tdata (abfd
)->total_got_size
+= entry_size
;
2988 alpha_elf_tdata(abfd
)->local_got_size
+= entry_size
;
2991 gotent
->use_count
+= 1;
2996 /* Handle dynamic relocations when doing an Alpha ELF link. */
2999 elf64_alpha_check_relocs (abfd
, info
, sec
, relocs
)
3001 struct bfd_link_info
*info
;
3003 const Elf_Internal_Rela
*relocs
;
3007 const char *rel_sec_name
;
3008 Elf_Internal_Shdr
*symtab_hdr
;
3009 struct alpha_elf_link_hash_entry
**sym_hashes
;
3010 const Elf_Internal_Rela
*rel
, *relend
;
3011 boolean got_created
;
3014 if (info
->relocateable
)
3017 dynobj
= elf_hash_table(info
)->dynobj
;
3019 elf_hash_table(info
)->dynobj
= dynobj
= abfd
;
3022 rel_sec_name
= NULL
;
3023 symtab_hdr
= &elf_tdata(abfd
)->symtab_hdr
;
3024 sym_hashes
= alpha_elf_sym_hashes(abfd
);
3025 got_created
= false;
3027 relend
= relocs
+ sec
->reloc_count
;
3028 for (rel
= relocs
; rel
< relend
; ++rel
)
3036 unsigned long r_symndx
, r_type
;
3037 struct alpha_elf_link_hash_entry
*h
;
3038 unsigned int gotent_flags
;
3039 boolean maybe_dynamic
;
3043 r_symndx
= ELF64_R_SYM (rel
->r_info
);
3044 if (r_symndx
< symtab_hdr
->sh_info
)
3048 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3050 while (h
->root
.root
.type
== bfd_link_hash_indirect
3051 || h
->root
.root
.type
== bfd_link_hash_warning
)
3052 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
3054 h
->root
.elf_link_hash_flags
|= ELF_LINK_HASH_REF_REGULAR
;
3057 /* We can only get preliminary data on whether a symbol is
3058 locally or externally defined, as not all of the input files
3059 have yet been processed. Do something with what we know, as
3060 this may help reduce memory usage and processing time later. */
3061 maybe_dynamic
= false;
3062 if (h
&& ((info
->shared
3063 && (!info
->symbolic
|| info
->allow_shlib_undefined
))
3064 || ! (h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
)
3065 || h
->root
.root
.type
== bfd_link_hash_defweak
))
3066 maybe_dynamic
= true;
3070 r_type
= ELF64_R_TYPE (rel
->r_info
);
3071 addend
= rel
->r_addend
;
3075 case R_ALPHA_LITERAL
:
3076 need
= NEED_GOT
| NEED_GOT_ENTRY
;
3078 /* Remember how this literal is used from its LITUSEs.
3079 This will be important when it comes to decide if we can
3080 create a .plt entry for a function symbol. */
3081 while (++rel
< relend
&& ELF64_R_TYPE (rel
->r_info
) == R_ALPHA_LITUSE
)
3082 if (rel
->r_addend
>= 1 && rel
->r_addend
<= 5)
3083 gotent_flags
|= 1 << rel
->r_addend
;
3086 /* No LITUSEs -- presumably the address is used somehow. */
3087 if (gotent_flags
== 0)
3088 gotent_flags
= ALPHA_ELF_LINK_HASH_LU_ADDR
;
3091 case R_ALPHA_GPDISP
:
3092 case R_ALPHA_GPREL16
:
3093 case R_ALPHA_GPREL32
:
3094 case R_ALPHA_GPRELHIGH
:
3095 case R_ALPHA_GPRELLOW
:
3100 case R_ALPHA_REFLONG
:
3101 case R_ALPHA_REFQUAD
:
3102 if (info
->shared
|| maybe_dynamic
)
3107 case R_ALPHA_TLSLDM
:
3108 case R_ALPHA_GOTDTPREL
:
3109 need
= NEED_GOT
| NEED_GOT_ENTRY
;
3112 case R_ALPHA_GOTTPREL
:
3113 need
= NEED_GOT
| NEED_GOT_ENTRY
;
3114 gotent_flags
= ALPHA_ELF_LINK_HASH_TLS_IE
;
3116 info
->flags
|= DF_STATIC_TLS
;
3119 case R_ALPHA_TPREL64
:
3120 if (info
->shared
|| maybe_dynamic
)
3123 info
->flags
|= DF_STATIC_TLS
;
3127 if (need
& NEED_GOT
)
3131 if (!elf64_alpha_create_got_section (abfd
, info
))
3134 /* Make sure the object's gotobj is set to itself so
3135 that we default to every object with its own .got.
3136 We'll merge .gots later once we've collected each
3138 alpha_elf_tdata(abfd
)->gotobj
= abfd
;
3144 if (need
& NEED_GOT_ENTRY
)
3146 struct alpha_elf_got_entry
*gotent
;
3148 gotent
= get_got_entry (abfd
, h
, r_type
, r_symndx
, addend
);
3154 gotent
->flags
|= gotent_flags
;
3157 gotent_flags
|= h
->flags
;
3158 h
->flags
= gotent_flags
;
3160 /* Make a guess as to whether a .plt entry is needed. */
3161 if ((gotent_flags
& ALPHA_ELF_LINK_HASH_LU_FUNC
)
3162 && !(gotent_flags
& ~ALPHA_ELF_LINK_HASH_LU_FUNC
))
3163 h
->root
.elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
3165 h
->root
.elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
3170 if (need
& NEED_DYNREL
)
3172 if (rel_sec_name
== NULL
)
3174 rel_sec_name
= (bfd_elf_string_from_elf_section
3175 (abfd
, elf_elfheader(abfd
)->e_shstrndx
,
3176 elf_section_data(sec
)->rel_hdr
.sh_name
));
3177 if (rel_sec_name
== NULL
)
3180 BFD_ASSERT (strncmp (rel_sec_name
, ".rela", 5) == 0
3181 && strcmp (bfd_get_section_name (abfd
, sec
),
3182 rel_sec_name
+5) == 0);
3185 /* We need to create the section here now whether we eventually
3186 use it or not so that it gets mapped to an output section by
3187 the linker. If not used, we'll kill it in
3188 size_dynamic_sections. */
3191 sreloc
= bfd_get_section_by_name (dynobj
, rel_sec_name
);
3196 sreloc
= bfd_make_section (dynobj
, rel_sec_name
);
3197 flags
= (SEC_HAS_CONTENTS
| SEC_IN_MEMORY
3198 | SEC_LINKER_CREATED
| SEC_READONLY
);
3199 if (sec
->flags
& SEC_ALLOC
)
3200 flags
|= SEC_ALLOC
| SEC_LOAD
;
3202 || !bfd_set_section_flags (dynobj
, sreloc
, flags
)
3203 || !bfd_set_section_alignment (dynobj
, sreloc
, 3))
3210 /* Since we havn't seen all of the input symbols yet, we
3211 don't know whether we'll actually need a dynamic relocation
3212 entry for this reloc. So make a record of it. Once we
3213 find out if this thing needs dynamic relocation we'll
3214 expand the relocation sections by the appropriate amount. */
3216 struct alpha_elf_reloc_entry
*rent
;
3218 for (rent
= h
->reloc_entries
; rent
; rent
= rent
->next
)
3219 if (rent
->rtype
== r_type
&& rent
->srel
== sreloc
)
3224 amt
= sizeof (struct alpha_elf_reloc_entry
);
3225 rent
= (struct alpha_elf_reloc_entry
*) bfd_alloc (abfd
, amt
);
3229 rent
->srel
= sreloc
;
3230 rent
->rtype
= r_type
;
3232 rent
->reltext
= ((sec
->flags
& (SEC_READONLY
| SEC_ALLOC
))
3233 == (SEC_READONLY
| SEC_ALLOC
));
3235 rent
->next
= h
->reloc_entries
;
3236 h
->reloc_entries
= rent
;
3241 else if (info
->shared
)
3243 /* If this is a shared library, and the section is to be
3244 loaded into memory, we need a RELATIVE reloc. */
3245 sreloc
->_raw_size
+= sizeof (Elf64_External_Rela
);
3246 if ((sec
->flags
& (SEC_READONLY
| SEC_ALLOC
))
3247 == (SEC_READONLY
| SEC_ALLOC
))
3248 info
->flags
|= DF_TEXTREL
;
3256 /* Adjust a symbol defined by a dynamic object and referenced by a
3257 regular object. The current definition is in some section of the
3258 dynamic object, but we're not including those sections. We have to
3259 change the definition to something the rest of the link can
3263 elf64_alpha_adjust_dynamic_symbol (info
, h
)
3264 struct bfd_link_info
*info
;
3265 struct elf_link_hash_entry
*h
;
3269 struct alpha_elf_link_hash_entry
*ah
;
3271 dynobj
= elf_hash_table(info
)->dynobj
;
3272 ah
= (struct alpha_elf_link_hash_entry
*)h
;
3274 /* Now that we've seen all of the input symbols, finalize our decision
3275 about whether this symbol should get a .plt entry. */
3277 if (alpha_elf_dynamic_symbol_p (h
, info
)
3278 && ((h
->type
== STT_FUNC
3279 && !(ah
->flags
& ALPHA_ELF_LINK_HASH_LU_ADDR
))
3280 || (h
->type
== STT_NOTYPE
3281 && (ah
->flags
& ALPHA_ELF_LINK_HASH_LU_FUNC
)
3282 && !(ah
->flags
& ~ALPHA_ELF_LINK_HASH_LU_FUNC
)))
3283 /* Don't prevent otherwise valid programs from linking by attempting
3284 to create a new .got entry somewhere. A Correct Solution would be
3285 to add a new .got section to a new object file and let it be merged
3286 somewhere later. But for now don't bother. */
3289 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
3291 s
= bfd_get_section_by_name(dynobj
, ".plt");
3292 if (!s
&& !elf64_alpha_create_dynamic_sections (dynobj
, info
))
3295 /* The first bit of the .plt is reserved. */
3296 if (s
->_raw_size
== 0)
3297 s
->_raw_size
= PLT_HEADER_SIZE
;
3299 h
->plt
.offset
= s
->_raw_size
;
3300 s
->_raw_size
+= PLT_ENTRY_SIZE
;
3302 /* If this symbol is not defined in a regular file, and we are not
3303 generating a shared library, then set the symbol to the location
3304 in the .plt. This is required to make function pointers compare
3305 equal between the normal executable and the shared library. */
3307 && h
->root
.type
!= bfd_link_hash_defweak
)
3309 h
->root
.u
.def
.section
= s
;
3310 h
->root
.u
.def
.value
= h
->plt
.offset
;
3313 /* We also need a JMP_SLOT entry in the .rela.plt section. */
3314 s
= bfd_get_section_by_name (dynobj
, ".rela.plt");
3315 BFD_ASSERT (s
!= NULL
);
3316 s
->_raw_size
+= sizeof (Elf64_External_Rela
);
3321 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
3323 /* If this is a weak symbol, and there is a real definition, the
3324 processor independent code will have arranged for us to see the
3325 real definition first, and we can just use the same value. */
3326 if (h
->weakdef
!= NULL
)
3328 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
3329 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
3330 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
3331 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
3335 /* This is a reference to a symbol defined by a dynamic object which
3336 is not a function. The Alpha, since it uses .got entries for all
3337 symbols even in regular objects, does not need the hackery of a
3338 .dynbss section and COPY dynamic relocations. */
3343 /* Symbol versioning can create new symbols, and make our old symbols
3344 indirect to the new ones. Consolidate the got and reloc information
3345 in these situations. */
3348 elf64_alpha_merge_ind_symbols (hi
, dummy
)
3349 struct alpha_elf_link_hash_entry
*hi
;
3350 PTR dummy ATTRIBUTE_UNUSED
;
3352 struct alpha_elf_link_hash_entry
*hs
;
3354 if (hi
->root
.root
.type
!= bfd_link_hash_indirect
)
3358 hs
= (struct alpha_elf_link_hash_entry
*)hs
->root
.root
.u
.i
.link
;
3359 } while (hs
->root
.root
.type
== bfd_link_hash_indirect
);
3361 /* Merge the flags. Whee. */
3363 hs
->flags
|= hi
->flags
;
3365 /* Merge the .got entries. Cannibalize the old symbol's list in
3366 doing so, since we don't need it anymore. */
3368 if (hs
->got_entries
== NULL
)
3369 hs
->got_entries
= hi
->got_entries
;
3372 struct alpha_elf_got_entry
*gi
, *gs
, *gin
, *gsh
;
3374 gsh
= hs
->got_entries
;
3375 for (gi
= hi
->got_entries
; gi
; gi
= gin
)
3378 for (gs
= gsh
; gs
; gs
= gs
->next
)
3379 if (gi
->gotobj
== gs
->gotobj
3380 && gi
->reloc_type
== gs
->reloc_type
3381 && gi
->addend
== gs
->addend
)
3383 gi
->use_count
+= gs
->use_count
;
3386 gi
->next
= hs
->got_entries
;
3387 hs
->got_entries
= gi
;
3391 hi
->got_entries
= NULL
;
3393 /* And similar for the reloc entries. */
3395 if (hs
->reloc_entries
== NULL
)
3396 hs
->reloc_entries
= hi
->reloc_entries
;
3399 struct alpha_elf_reloc_entry
*ri
, *rs
, *rin
, *rsh
;
3401 rsh
= hs
->reloc_entries
;
3402 for (ri
= hi
->reloc_entries
; ri
; ri
= rin
)
3405 for (rs
= rsh
; rs
; rs
= rs
->next
)
3406 if (ri
->rtype
== rs
->rtype
)
3408 rs
->count
+= ri
->count
;
3411 ri
->next
= hs
->reloc_entries
;
3412 hs
->reloc_entries
= ri
;
3416 hi
->reloc_entries
= NULL
;
3421 /* Is it possible to merge two object file's .got tables? */
3424 elf64_alpha_can_merge_gots (a
, b
)
3427 int total
= alpha_elf_tdata (a
)->total_got_size
;
3430 /* Trivial quick fallout test. */
3431 if (total
+ alpha_elf_tdata (b
)->total_got_size
<= MAX_GOT_SIZE
)
3434 /* By their nature, local .got entries cannot be merged. */
3435 if ((total
+= alpha_elf_tdata (b
)->local_got_size
) > MAX_GOT_SIZE
)
3438 /* Failing the common trivial comparison, we must effectively
3439 perform the merge. Not actually performing the merge means that
3440 we don't have to store undo information in case we fail. */
3441 for (bsub
= b
; bsub
; bsub
= alpha_elf_tdata (bsub
)->in_got_link_next
)
3443 struct alpha_elf_link_hash_entry
**hashes
= alpha_elf_sym_hashes (bsub
);
3444 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (bsub
)->symtab_hdr
;
3447 n
= NUM_SHDR_ENTRIES (symtab_hdr
) - symtab_hdr
->sh_info
;
3448 for (i
= 0; i
< n
; ++i
)
3450 struct alpha_elf_got_entry
*ae
, *be
;
3451 struct alpha_elf_link_hash_entry
*h
;
3454 while (h
->root
.root
.type
== bfd_link_hash_indirect
3455 || h
->root
.root
.type
== bfd_link_hash_warning
)
3456 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
3458 for (be
= h
->got_entries
; be
; be
= be
->next
)
3460 if (be
->use_count
== 0)
3462 if (be
->gotobj
!= b
)
3465 for (ae
= h
->got_entries
; ae
; ae
= ae
->next
)
3467 && ae
->reloc_type
== be
->reloc_type
3468 && ae
->addend
== be
->addend
)
3471 total
+= alpha_got_entry_size (be
->reloc_type
);
3472 if (total
> MAX_GOT_SIZE
)
3482 /* Actually merge two .got tables. */
3485 elf64_alpha_merge_gots (a
, b
)
3488 int total
= alpha_elf_tdata (a
)->total_got_size
;
3491 /* Remember local expansion. */
3493 int e
= alpha_elf_tdata (b
)->local_got_size
;
3495 alpha_elf_tdata (a
)->local_got_size
+= e
;
3498 for (bsub
= b
; bsub
; bsub
= alpha_elf_tdata (bsub
)->in_got_link_next
)
3500 struct alpha_elf_got_entry
**local_got_entries
;
3501 struct alpha_elf_link_hash_entry
**hashes
;
3502 Elf_Internal_Shdr
*symtab_hdr
;
3505 /* Let the local .got entries know they are part of a new subsegment. */
3506 local_got_entries
= alpha_elf_tdata (bsub
)->local_got_entries
;
3507 if (local_got_entries
)
3509 n
= elf_tdata (bsub
)->symtab_hdr
.sh_info
;
3510 for (i
= 0; i
< n
; ++i
)
3512 struct alpha_elf_got_entry
*ent
;
3513 for (ent
= local_got_entries
[i
]; ent
; ent
= ent
->next
)
3518 /* Merge the global .got entries. */
3519 hashes
= alpha_elf_sym_hashes (bsub
);
3520 symtab_hdr
= &elf_tdata (bsub
)->symtab_hdr
;
3522 n
= NUM_SHDR_ENTRIES (symtab_hdr
) - symtab_hdr
->sh_info
;
3523 for (i
= 0; i
< n
; ++i
)
3525 struct alpha_elf_got_entry
*ae
, *be
, **pbe
, **start
;
3526 struct alpha_elf_link_hash_entry
*h
;
3529 while (h
->root
.root
.type
== bfd_link_hash_indirect
3530 || h
->root
.root
.type
== bfd_link_hash_warning
)
3531 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
3533 start
= &h
->got_entries
;
3534 for (pbe
= start
, be
= *start
; be
; pbe
= &be
->next
, be
= be
->next
)
3536 if (be
->use_count
== 0)
3541 if (be
->gotobj
!= b
)
3544 for (ae
= *start
; ae
; ae
= ae
->next
)
3546 && ae
->reloc_type
== be
->reloc_type
3547 && ae
->addend
== be
->addend
)
3549 ae
->flags
|= be
->flags
;
3550 ae
->use_count
+= be
->use_count
;
3555 total
+= alpha_got_entry_size (be
->reloc_type
);
3561 alpha_elf_tdata (bsub
)->gotobj
= a
;
3563 alpha_elf_tdata (a
)->total_got_size
= total
;
3565 /* Merge the two in_got chains. */
3570 while ((next
= alpha_elf_tdata (bsub
)->in_got_link_next
) != NULL
)
3573 alpha_elf_tdata (bsub
)->in_got_link_next
= b
;
3577 /* Calculate the offsets for the got entries. */
3580 elf64_alpha_calc_got_offsets_for_symbol (h
, arg
)
3581 struct alpha_elf_link_hash_entry
*h
;
3582 PTR arg ATTRIBUTE_UNUSED
;
3584 struct alpha_elf_got_entry
*gotent
;
3586 if (h
->root
.root
.type
== bfd_link_hash_warning
)
3587 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
3589 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
3590 if (gotent
->use_count
> 0)
3593 = &alpha_elf_tdata (gotent
->gotobj
)->got
->_raw_size
;
3595 gotent
->got_offset
= *plge
;
3596 *plge
+= alpha_got_entry_size (gotent
->reloc_type
);
3603 elf64_alpha_calc_got_offsets (info
)
3604 struct bfd_link_info
*info
;
3606 bfd
*i
, *got_list
= alpha_elf_hash_table(info
)->got_list
;
3608 /* First, zero out the .got sizes, as we may be recalculating the
3609 .got after optimizing it. */
3610 for (i
= got_list
; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
3611 alpha_elf_tdata(i
)->got
->_raw_size
= 0;
3613 /* Next, fill in the offsets for all the global entries. */
3614 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
3615 elf64_alpha_calc_got_offsets_for_symbol
,
3618 /* Finally, fill in the offsets for the local entries. */
3619 for (i
= got_list
; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
3621 bfd_size_type got_offset
= alpha_elf_tdata(i
)->got
->_raw_size
;
3624 for (j
= i
; j
; j
= alpha_elf_tdata(j
)->in_got_link_next
)
3626 struct alpha_elf_got_entry
**local_got_entries
, *gotent
;
3629 local_got_entries
= alpha_elf_tdata(j
)->local_got_entries
;
3630 if (!local_got_entries
)
3633 for (k
= 0, n
= elf_tdata(j
)->symtab_hdr
.sh_info
; k
< n
; ++k
)
3634 for (gotent
= local_got_entries
[k
]; gotent
; gotent
= gotent
->next
)
3635 if (gotent
->use_count
> 0)
3637 gotent
->got_offset
= got_offset
;
3638 got_offset
+= alpha_got_entry_size (gotent
->reloc_type
);
3642 alpha_elf_tdata(i
)->got
->_raw_size
= got_offset
;
3643 alpha_elf_tdata(i
)->got
->_cooked_size
= got_offset
;
3647 /* Constructs the gots. */
3650 elf64_alpha_size_got_sections (info
)
3651 struct bfd_link_info
*info
;
3653 bfd
*i
, *got_list
, *cur_got_obj
= NULL
;
3654 int something_changed
= 0;
3656 got_list
= alpha_elf_hash_table (info
)->got_list
;
3658 /* On the first time through, pretend we have an existing got list
3659 consisting of all of the input files. */
3660 if (got_list
== NULL
)
3662 for (i
= info
->input_bfds
; i
; i
= i
->link_next
)
3664 bfd
*this_got
= alpha_elf_tdata (i
)->gotobj
;
3665 if (this_got
== NULL
)
3668 /* We are assuming no merging has yet ocurred. */
3669 BFD_ASSERT (this_got
== i
);
3671 if (alpha_elf_tdata (this_got
)->total_got_size
> MAX_GOT_SIZE
)
3673 /* Yikes! A single object file has too many entries. */
3674 (*_bfd_error_handler
)
3675 (_("%s: .got subsegment exceeds 64K (size %d)"),
3676 bfd_archive_filename (i
),
3677 alpha_elf_tdata (this_got
)->total_got_size
);
3681 if (got_list
== NULL
)
3682 got_list
= this_got
;
3684 alpha_elf_tdata(cur_got_obj
)->got_link_next
= this_got
;
3685 cur_got_obj
= this_got
;
3688 /* Strange degenerate case of no got references. */
3689 if (got_list
== NULL
)
3692 alpha_elf_hash_table (info
)->got_list
= got_list
;
3694 /* Force got offsets to be recalculated. */
3695 something_changed
= 1;
3698 cur_got_obj
= got_list
;
3699 i
= alpha_elf_tdata(cur_got_obj
)->got_link_next
;
3702 if (elf64_alpha_can_merge_gots (cur_got_obj
, i
))
3704 elf64_alpha_merge_gots (cur_got_obj
, i
);
3705 i
= alpha_elf_tdata(i
)->got_link_next
;
3706 alpha_elf_tdata(cur_got_obj
)->got_link_next
= i
;
3707 something_changed
= 1;
3712 i
= alpha_elf_tdata(i
)->got_link_next
;
3716 /* Once the gots have been merged, fill in the got offsets for
3717 everything therein. */
3718 if (1 || something_changed
)
3719 elf64_alpha_calc_got_offsets (info
);
3724 /* Called from relax_section to rebuild the PLT in light of
3725 potential changes in the function's status. */
3728 elf64_alpha_size_plt_section (info
)
3729 struct bfd_link_info
*info
;
3731 asection
*splt
, *spltrel
;
3732 unsigned long entries
;
3735 dynobj
= elf_hash_table(info
)->dynobj
;
3736 splt
= bfd_get_section_by_name(dynobj
, ".plt");
3740 splt
->_raw_size
= 0;
3742 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
3743 elf64_alpha_size_plt_section_1
, splt
);
3745 splt
->_cooked_size
= splt
->_raw_size
;
3747 /* Every plt entry requires a JMP_SLOT relocation. */
3748 spltrel
= bfd_get_section_by_name (dynobj
, ".rela.plt");
3749 if (splt
->_raw_size
)
3750 entries
= (splt
->_raw_size
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
3753 spltrel
->_raw_size
= entries
* sizeof (Elf64_External_Rela
);
3754 spltrel
->_cooked_size
= spltrel
->_raw_size
;
3760 elf64_alpha_size_plt_section_1 (h
, data
)
3761 struct alpha_elf_link_hash_entry
*h
;
3764 asection
*splt
= (asection
*) data
;
3765 struct alpha_elf_got_entry
*gotent
;
3767 /* If we didn't need an entry before, we still don't. */
3768 if (!(h
->root
.elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
))
3771 /* There must still be a LITERAL got entry for the function. */
3772 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
3773 if (gotent
->reloc_type
== R_ALPHA_LITERAL
3774 && gotent
->use_count
> 0)
3777 /* If there is, reset the PLT offset. If not, there's no longer
3778 a need for the PLT entry. */
3781 if (splt
->_raw_size
== 0)
3782 splt
->_raw_size
= PLT_HEADER_SIZE
;
3783 h
->root
.plt
.offset
= splt
->_raw_size
;
3784 splt
->_raw_size
+= PLT_ENTRY_SIZE
;
3788 h
->root
.elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
3789 h
->root
.plt
.offset
= -1;
3796 elf64_alpha_always_size_sections (output_bfd
, info
)
3797 bfd
*output_bfd ATTRIBUTE_UNUSED
;
3798 struct bfd_link_info
*info
;
3802 if (info
->relocateable
)
3805 /* First, take care of the indirect symbols created by versioning. */
3806 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
3807 elf64_alpha_merge_ind_symbols
,
3810 if (!elf64_alpha_size_got_sections (info
))
3813 /* Allocate space for all of the .got subsections. */
3814 i
= alpha_elf_hash_table (info
)->got_list
;
3815 for ( ; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
3817 asection
*s
= alpha_elf_tdata(i
)->got
;
3818 if (s
->_raw_size
> 0)
3820 s
->contents
= (bfd_byte
*) bfd_zalloc (i
, s
->_raw_size
);
3821 if (s
->contents
== NULL
)
3829 /* The number of dynamic relocations required by a static relocation. */
3832 alpha_dynamic_entries_for_reloc (r_type
, dynamic
, shared
)
3833 int r_type
, dynamic
, shared
;
3837 /* May appear in GOT entries. */
3839 return (dynamic
? 2 : shared
? 1 : 0);
3840 case R_ALPHA_TLSLDM
:
3842 case R_ALPHA_LITERAL
:
3843 return dynamic
|| shared
;
3844 case R_ALPHA_GOTDTPREL
:
3845 case R_ALPHA_GOTTPREL
:
3848 /* May appear in data sections. */
3849 case R_ALPHA_REFLONG
:
3850 case R_ALPHA_REFQUAD
:
3851 return dynamic
|| shared
;
3852 case R_ALPHA_SREL64
:
3853 case R_ALPHA_TPREL64
:
3856 /* Everything else is illegal. We'll issue an error during
3857 relocate_section. */
3863 /* Work out the sizes of the dynamic relocation entries. */
3866 elf64_alpha_calc_dynrel_sizes (h
, info
)
3867 struct alpha_elf_link_hash_entry
*h
;
3868 struct bfd_link_info
*info
;
3871 struct alpha_elf_reloc_entry
*relent
;
3872 unsigned long entries
;
3874 if (h
->root
.root
.type
== bfd_link_hash_warning
)
3875 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
3877 /* If the symbol was defined as a common symbol in a regular object
3878 file, and there was no definition in any dynamic object, then the
3879 linker will have allocated space for the symbol in a common
3880 section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
3881 set. This is done for dynamic symbols in
3882 elf_adjust_dynamic_symbol but this is not done for non-dynamic
3883 symbols, somehow. */
3884 if (((h
->root
.elf_link_hash_flags
3885 & (ELF_LINK_HASH_DEF_REGULAR
3886 | ELF_LINK_HASH_REF_REGULAR
3887 | ELF_LINK_HASH_DEF_DYNAMIC
))
3888 == ELF_LINK_HASH_REF_REGULAR
)
3889 && (h
->root
.root
.type
== bfd_link_hash_defined
3890 || h
->root
.root
.type
== bfd_link_hash_defweak
)
3891 && !(h
->root
.root
.u
.def
.section
->owner
->flags
& DYNAMIC
))
3892 h
->root
.elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
3894 /* If the symbol is dynamic, we'll need all the relocations in their
3895 natural form. If this is a shared object, and it has been forced
3896 local, we'll need the same number of RELATIVE relocations. */
3898 dynamic
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
3900 for (relent
= h
->reloc_entries
; relent
; relent
= relent
->next
)
3902 entries
= alpha_dynamic_entries_for_reloc (relent
->rtype
, dynamic
,
3906 relent
->srel
->_raw_size
+=
3907 entries
* sizeof (Elf64_External_Rela
) * relent
->count
;
3908 if (relent
->reltext
)
3909 info
->flags
|= DT_TEXTREL
;
3916 /* Set the sizes of the dynamic relocation sections. */
3919 elf64_alpha_size_rela_got_section (info
)
3920 struct bfd_link_info
*info
;
3922 unsigned long entries
;
3926 /* Shared libraries often require RELATIVE relocs, and some relocs
3927 require attention for the main application as well. */
3930 for (i
= alpha_elf_hash_table(info
)->got_list
;
3931 i
; i
= alpha_elf_tdata(i
)->got_link_next
)
3935 for (j
= i
; j
; j
= alpha_elf_tdata(j
)->in_got_link_next
)
3937 struct alpha_elf_got_entry
**local_got_entries
, *gotent
;
3940 local_got_entries
= alpha_elf_tdata(j
)->local_got_entries
;
3941 if (!local_got_entries
)
3944 for (k
= 0, n
= elf_tdata(j
)->symtab_hdr
.sh_info
; k
< n
; ++k
)
3945 for (gotent
= local_got_entries
[k
];
3946 gotent
; gotent
= gotent
->next
)
3947 if (gotent
->use_count
> 0)
3948 entries
+= (alpha_dynamic_entries_for_reloc
3949 (gotent
->reloc_type
, 0, info
->shared
));
3953 dynobj
= elf_hash_table(info
)->dynobj
;
3954 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
3957 BFD_ASSERT (entries
== 0);
3960 srel
->_raw_size
= sizeof (Elf64_External_Rela
) * entries
;
3962 /* Now do the non-local symbols. */
3963 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
3964 elf64_alpha_size_rela_got_1
, info
);
3966 srel
->_cooked_size
= srel
->_raw_size
;
3971 /* Subroutine of elf64_alpha_size_rela_got_section for doing the
3975 elf64_alpha_size_rela_got_1 (h
, info
)
3976 struct alpha_elf_link_hash_entry
*h
;
3977 struct bfd_link_info
*info
;
3980 struct alpha_elf_got_entry
*gotent
;
3981 unsigned long entries
;
3983 if (h
->root
.root
.type
== bfd_link_hash_warning
)
3984 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
3986 /* If the symbol is dynamic, we'll need all the relocations in their
3987 natural form. If this is a shared object, and it has been forced
3988 local, we'll need the same number of RELATIVE relocations. */
3990 dynamic
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
3993 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
3994 if (gotent
->use_count
> 0)
3995 entries
+= alpha_dynamic_entries_for_reloc (gotent
->reloc_type
,
3996 dynamic
, info
->shared
);
3998 /* If we are using a .plt entry, subtract one, as the first
3999 reference uses a .rela.plt entry instead. */
4000 if (h
->root
.plt
.offset
!= MINUS_ONE
)
4005 bfd
*dynobj
= elf_hash_table(info
)->dynobj
;
4006 asection
*srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
4007 BFD_ASSERT (srel
!= NULL
);
4008 srel
->_raw_size
+= sizeof (Elf64_External_Rela
) * entries
;
4014 /* Set the sizes of the dynamic sections. */
4017 elf64_alpha_size_dynamic_sections (output_bfd
, info
)
4018 bfd
*output_bfd ATTRIBUTE_UNUSED
;
4019 struct bfd_link_info
*info
;
4025 dynobj
= elf_hash_table(info
)->dynobj
;
4026 BFD_ASSERT(dynobj
!= NULL
);
4028 if (elf_hash_table (info
)->dynamic_sections_created
)
4030 /* Set the contents of the .interp section to the interpreter. */
4033 s
= bfd_get_section_by_name (dynobj
, ".interp");
4034 BFD_ASSERT (s
!= NULL
);
4035 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
4036 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
4039 /* Now that we've seen all of the input files, we can decide which
4040 symbols need dynamic relocation entries and which don't. We've
4041 collected information in check_relocs that we can now apply to
4042 size the dynamic relocation sections. */
4043 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
4044 elf64_alpha_calc_dynrel_sizes
, info
);
4046 elf64_alpha_size_rela_got_section (info
);
4048 /* else we're not dynamic and by definition we don't need such things. */
4050 /* The check_relocs and adjust_dynamic_symbol entry points have
4051 determined the sizes of the various dynamic sections. Allocate
4054 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
4059 if (!(s
->flags
& SEC_LINKER_CREATED
))
4062 /* It's OK to base decisions on the section name, because none
4063 of the dynobj section names depend upon the input files. */
4064 name
= bfd_get_section_name (dynobj
, s
);
4066 /* If we don't need this section, strip it from the output file.
4067 This is to handle .rela.bss and .rela.plt. We must create it
4068 in create_dynamic_sections, because it must be created before
4069 the linker maps input sections to output sections. The
4070 linker does that before adjust_dynamic_symbol is called, and
4071 it is that function which decides whether anything needs to
4072 go into these sections. */
4076 if (strncmp (name
, ".rela", 5) == 0)
4078 strip
= (s
->_raw_size
== 0);
4082 if (strcmp(name
, ".rela.plt") == 0)
4085 /* We use the reloc_count field as a counter if we need
4086 to copy relocs into the output file. */
4090 else if (strcmp (name
, ".plt") != 0)
4092 /* It's not one of our dynamic sections, so don't allocate space. */
4097 _bfd_strip_section_from_output (info
, s
);
4100 /* Allocate memory for the section contents. */
4101 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->_raw_size
);
4102 if (s
->contents
== NULL
&& s
->_raw_size
!= 0)
4107 if (elf_hash_table (info
)->dynamic_sections_created
)
4109 /* Add some entries to the .dynamic section. We fill in the
4110 values later, in elf64_alpha_finish_dynamic_sections, but we
4111 must add the entries now so that we get the correct size for
4112 the .dynamic section. The DT_DEBUG entry is filled in by the
4113 dynamic linker and used by the debugger. */
4114 #define add_dynamic_entry(TAG, VAL) \
4115 bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
4119 if (!add_dynamic_entry (DT_DEBUG
, 0))
4125 if (!add_dynamic_entry (DT_PLTGOT
, 0)
4126 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
4127 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
4128 || !add_dynamic_entry (DT_JMPREL
, 0))
4132 if (!add_dynamic_entry (DT_RELA
, 0)
4133 || !add_dynamic_entry (DT_RELASZ
, 0)
4134 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
4137 if (info
->flags
& DF_TEXTREL
)
4139 if (!add_dynamic_entry (DT_TEXTREL
, 0))
4143 #undef add_dynamic_entry
4148 /* Relocate an Alpha ELF section for a relocatable link.
4150 We don't have to change anything unless the reloc is against a section
4151 symbol, in which case we have to adjust according to where the section
4152 symbol winds up in the output section. */
4155 elf64_alpha_relocate_section_r (output_bfd
, info
, input_bfd
, input_section
,
4156 contents
, relocs
, local_syms
, local_sections
)
4157 bfd
*output_bfd ATTRIBUTE_UNUSED
;
4158 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
4160 asection
*input_section
;
4161 bfd_byte
*contents ATTRIBUTE_UNUSED
;
4162 Elf_Internal_Rela
*relocs
;
4163 Elf_Internal_Sym
*local_syms
;
4164 asection
**local_sections
;
4166 unsigned long symtab_hdr_sh_info
;
4167 Elf_Internal_Rela
*rel
;
4168 Elf_Internal_Rela
*relend
;
4169 boolean ret_val
= true;
4171 symtab_hdr_sh_info
= elf_tdata (input_bfd
)->symtab_hdr
.sh_info
;
4173 relend
= relocs
+ input_section
->reloc_count
;
4174 for (rel
= relocs
; rel
< relend
; rel
++)
4176 unsigned long r_symndx
;
4177 Elf_Internal_Sym
*sym
;
4179 unsigned long r_type
;
4181 r_type
= ELF64_R_TYPE(rel
->r_info
);
4182 if (r_type
>= R_ALPHA_max
)
4184 (*_bfd_error_handler
)
4185 (_("%s: unknown relocation type %d"),
4186 bfd_archive_filename (input_bfd
), (int)r_type
);
4187 bfd_set_error (bfd_error_bad_value
);
4192 r_symndx
= ELF64_R_SYM(rel
->r_info
);
4194 /* The symbol associated with GPDISP and LITUSE is
4195 immaterial. Only the addend is significant. */
4196 if (r_type
== R_ALPHA_GPDISP
|| r_type
== R_ALPHA_LITUSE
)
4199 if (r_symndx
< symtab_hdr_sh_info
)
4201 sym
= local_syms
+ r_symndx
;
4202 if (ELF_ST_TYPE(sym
->st_info
) == STT_SECTION
)
4204 sec
= local_sections
[r_symndx
];
4205 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
4213 /* Relocate an Alpha ELF section. */
4216 elf64_alpha_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
4217 contents
, relocs
, local_syms
, local_sections
)
4219 struct bfd_link_info
*info
;
4221 asection
*input_section
;
4223 Elf_Internal_Rela
*relocs
;
4224 Elf_Internal_Sym
*local_syms
;
4225 asection
**local_sections
;
4227 Elf_Internal_Shdr
*symtab_hdr
;
4228 Elf_Internal_Rela
*rel
;
4229 Elf_Internal_Rela
*relend
;
4230 struct elf_link_tls_segment
*tls_segment
;
4231 asection
*sgot
, *srel
, *srelgot
;
4232 bfd
*dynobj
, *gotobj
;
4233 bfd_vma gp
, tp_base
, dtp_base
;
4234 struct alpha_elf_got_entry
**local_got_entries
;
4236 const char *section_name
;
4238 /* Handle relocatable links with a smaller loop. */
4239 if (info
->relocateable
)
4240 return elf64_alpha_relocate_section_r (output_bfd
, info
, input_bfd
,
4241 input_section
, contents
, relocs
,
4242 local_syms
, local_sections
);
4244 /* This is a final link. */
4248 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4250 dynobj
= elf_hash_table (info
)->dynobj
;
4252 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
4256 section_name
= (bfd_elf_string_from_elf_section
4257 (input_bfd
, elf_elfheader(input_bfd
)->e_shstrndx
,
4258 elf_section_data(input_section
)->rel_hdr
.sh_name
));
4259 BFD_ASSERT(section_name
!= NULL
);
4260 srel
= bfd_get_section_by_name (dynobj
, section_name
);
4262 /* Find the gp value for this input bfd. */
4263 gotobj
= alpha_elf_tdata (input_bfd
)->gotobj
;
4266 sgot
= alpha_elf_tdata (gotobj
)->got
;
4267 gp
= _bfd_get_gp_value (gotobj
);
4270 gp
= (sgot
->output_section
->vma
4271 + sgot
->output_offset
4273 _bfd_set_gp_value (gotobj
, gp
);
4282 local_got_entries
= alpha_elf_tdata(input_bfd
)->local_got_entries
;
4284 tls_segment
= elf_hash_table (info
)->tls_segment
;
4287 dtp_base
= alpha_get_dtprel_base (tls_segment
);
4288 tp_base
= alpha_get_tprel_base (tls_segment
);
4291 dtp_base
= tp_base
= 0;
4293 relend
= relocs
+ input_section
->reloc_count
;
4294 for (rel
= relocs
; rel
< relend
; rel
++)
4296 struct alpha_elf_link_hash_entry
*h
= NULL
;
4297 struct alpha_elf_got_entry
*gotent
;
4298 bfd_reloc_status_type r
;
4299 reloc_howto_type
*howto
;
4300 unsigned long r_symndx
;
4301 Elf_Internal_Sym
*sym
= NULL
;
4302 asection
*sec
= NULL
;
4305 boolean dynamic_symbol_p
;
4306 boolean undef_weak_ref
= false;
4307 unsigned long r_type
;
4309 r_type
= ELF64_R_TYPE(rel
->r_info
);
4310 if (r_type
>= R_ALPHA_max
)
4312 (*_bfd_error_handler
)
4313 (_("%s: unknown relocation type %d"),
4314 bfd_archive_filename (input_bfd
), (int)r_type
);
4315 bfd_set_error (bfd_error_bad_value
);
4320 howto
= elf64_alpha_howto_table
+ r_type
;
4321 r_symndx
= ELF64_R_SYM(rel
->r_info
);
4323 if (r_symndx
< symtab_hdr
->sh_info
)
4325 sym
= local_syms
+ r_symndx
;
4326 sec
= local_sections
[r_symndx
];
4327 value
= _bfd_elf_rela_local_sym (output_bfd
, sym
, sec
, rel
);
4329 if (local_got_entries
)
4330 gotent
= local_got_entries
[r_symndx
];
4334 /* Need to adjust local GOT entries' addends for SEC_MERGE
4335 unless it has been done already. */
4336 if ((sec
->flags
& SEC_MERGE
)
4337 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
4338 && (elf_section_data (sec
)->sec_info_type
4339 == ELF_INFO_TYPE_MERGE
)
4341 && !gotent
->reloc_xlated
)
4343 struct alpha_elf_got_entry
*ent
;
4346 for (ent
= gotent
; ent
; ent
= ent
->next
)
4348 ent
->reloc_xlated
= 1;
4349 if (ent
->use_count
== 0)
4353 _bfd_merged_section_offset (output_bfd
, &msec
,
4354 elf_section_data (sec
)->
4356 sym
->st_value
+ ent
->addend
,
4358 ent
->addend
-= sym
->st_value
;
4359 ent
->addend
+= msec
->output_section
->vma
4360 + msec
->output_offset
4361 - sec
->output_section
->vma
4362 - sec
->output_offset
;
4366 dynamic_symbol_p
= false;
4370 h
= alpha_elf_sym_hashes (input_bfd
)[r_symndx
- symtab_hdr
->sh_info
];
4372 while (h
->root
.root
.type
== bfd_link_hash_indirect
4373 || h
->root
.root
.type
== bfd_link_hash_warning
)
4374 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
4377 if (h
->root
.root
.type
== bfd_link_hash_defined
4378 || h
->root
.root
.type
== bfd_link_hash_defweak
)
4380 sec
= h
->root
.root
.u
.def
.section
;
4382 /* Detect the cases that sym_sec->output_section is
4383 expected to be NULL -- all cases in which the symbol
4384 is defined in another shared module. This includes
4385 PLT relocs for which we've created a PLT entry and
4386 other relocs for which we're prepared to create
4387 dynamic relocations. */
4388 /* ??? Just accept it NULL and continue. */
4390 if (sec
->output_section
!= NULL
)
4391 value
= (h
->root
.root
.u
.def
.value
4392 + sec
->output_section
->vma
4393 + sec
->output_offset
);
4395 else if (h
->root
.root
.type
== bfd_link_hash_undefweak
)
4396 undef_weak_ref
= true;
4397 else if (info
->shared
4398 && (!info
->symbolic
|| info
->allow_shlib_undefined
)
4399 && !info
->no_undefined
4400 && ELF_ST_VISIBILITY (h
->root
.other
) == STV_DEFAULT
)
4404 if (!((*info
->callbacks
->undefined_symbol
)
4405 (info
, h
->root
.root
.root
.string
, input_bfd
,
4406 input_section
, rel
->r_offset
,
4407 (!info
->shared
|| info
->no_undefined
4408 || ELF_ST_VISIBILITY (h
->root
.other
)))))
4414 dynamic_symbol_p
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
4415 gotent
= h
->got_entries
;
4418 addend
= rel
->r_addend
;
4421 /* Search for the proper got entry. */
4422 for (; gotent
; gotent
= gotent
->next
)
4423 if (gotent
->gotobj
== gotobj
4424 && gotent
->reloc_type
== r_type
4425 && gotent
->addend
== addend
)
4430 case R_ALPHA_GPDISP
:
4432 bfd_byte
*p_ldah
, *p_lda
;
4434 BFD_ASSERT(gp
!= 0);
4436 value
= (input_section
->output_section
->vma
4437 + input_section
->output_offset
4440 p_ldah
= contents
+ rel
->r_offset
;
4441 p_lda
= p_ldah
+ rel
->r_addend
;
4443 r
= elf64_alpha_do_reloc_gpdisp (input_bfd
, gp
- value
,
4448 case R_ALPHA_LITERAL
:
4449 BFD_ASSERT(sgot
!= NULL
);
4450 BFD_ASSERT(gp
!= 0);
4451 BFD_ASSERT(gotent
!= NULL
);
4452 BFD_ASSERT(gotent
->use_count
>= 1);
4454 if (!gotent
->reloc_done
)
4456 gotent
->reloc_done
= 1;
4458 bfd_put_64 (output_bfd
, value
,
4459 sgot
->contents
+ gotent
->got_offset
);
4461 /* If the symbol has been forced local, output a
4462 RELATIVE reloc, otherwise it will be handled in
4463 finish_dynamic_symbol. */
4464 if (info
->shared
&& !dynamic_symbol_p
)
4466 Elf_Internal_Rela outrel
;
4468 BFD_ASSERT(srelgot
!= NULL
);
4470 outrel
.r_offset
= (sgot
->output_section
->vma
4471 + sgot
->output_offset
4472 + gotent
->got_offset
);
4473 outrel
.r_info
= ELF64_R_INFO (0, R_ALPHA_RELATIVE
);
4474 outrel
.r_addend
= value
;
4476 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
4477 ((Elf64_External_Rela
*)
4479 + srelgot
->reloc_count
++);
4480 BFD_ASSERT (sizeof (Elf64_External_Rela
)
4481 * srelgot
->reloc_count
4482 <= srelgot
->_cooked_size
);
4486 value
= (sgot
->output_section
->vma
4487 + sgot
->output_offset
4488 + gotent
->got_offset
);
4492 case R_ALPHA_GPREL16
:
4493 case R_ALPHA_GPREL32
:
4494 case R_ALPHA_GPRELLOW
:
4495 if (dynamic_symbol_p
)
4497 (*_bfd_error_handler
)
4498 (_("%s: gp-relative relocation against dynamic symbol %s"),
4499 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4502 BFD_ASSERT(gp
!= 0);
4506 case R_ALPHA_GPRELHIGH
:
4507 if (dynamic_symbol_p
)
4509 (*_bfd_error_handler
)
4510 (_("%s: gp-relative relocation against dynamic symbol %s"),
4511 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4514 BFD_ASSERT(gp
!= 0);
4516 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4520 /* A call to a dynamic symbol is definitely out of range of
4521 the 16-bit displacement. Don't bother writing anything. */
4522 if (dynamic_symbol_p
)
4527 /* The regular PC-relative stuff measures from the start of
4528 the instruction rather than the end. */
4532 case R_ALPHA_BRADDR
:
4533 if (dynamic_symbol_p
)
4535 (*_bfd_error_handler
)
4536 (_("%s: pc-relative relocation against dynamic symbol %s"),
4537 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4540 /* The regular PC-relative stuff measures from the start of
4541 the instruction rather than the end. */
4550 /* The regular PC-relative stuff measures from the start of
4551 the instruction rather than the end. */
4554 /* The source and destination gp must be the same. Note that
4555 the source will always have an assigned gp, since we forced
4556 one in check_relocs, but that the destination may not, as
4557 it might not have had any relocations at all. Also take
4558 care not to crash if H is an undefined symbol. */
4559 if (h
!= NULL
&& sec
!= NULL
4560 && alpha_elf_tdata (sec
->owner
)->gotobj
4561 && gotobj
!= alpha_elf_tdata (sec
->owner
)->gotobj
)
4563 (*_bfd_error_handler
)
4564 (_("%s: change in gp: BRSGP %s"),
4565 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4569 /* The symbol should be marked either NOPV or STD_GPLOAD. */
4571 other
= h
->root
.other
;
4573 other
= sym
->st_other
;
4574 switch (other
& STO_ALPHA_STD_GPLOAD
)
4576 case STO_ALPHA_NOPV
:
4578 case STO_ALPHA_STD_GPLOAD
:
4583 name
= h
->root
.root
.root
.string
;
4586 name
= (bfd_elf_string_from_elf_section
4587 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
4589 name
= _("<unknown>");
4590 else if (name
[0] == 0)
4591 name
= bfd_section_name (input_bfd
, sec
);
4593 (*_bfd_error_handler
)
4594 (_("%s: !samegp reloc against symbol without .prologue: %s"),
4595 bfd_archive_filename (input_bfd
), name
);
4603 case R_ALPHA_REFLONG
:
4604 case R_ALPHA_REFQUAD
:
4605 case R_ALPHA_DTPREL64
:
4606 case R_ALPHA_TPREL64
:
4608 Elf_Internal_Rela outrel
;
4610 /* Careful here to remember RELATIVE relocations for global
4611 variables for symbolic shared objects. */
4613 if (dynamic_symbol_p
)
4615 BFD_ASSERT(h
->root
.dynindx
!= -1);
4616 outrel
.r_info
= ELF64_R_INFO (h
->root
.dynindx
, r_type
);
4617 outrel
.r_addend
= addend
;
4618 addend
= 0, value
= 0;
4620 else if (r_type
== R_ALPHA_DTPREL64
)
4622 BFD_ASSERT(tls_segment
!= NULL
);
4626 else if (r_type
== R_ALPHA_TPREL64
)
4628 BFD_ASSERT(tls_segment
!= NULL
);
4632 else if (info
->shared
4634 && (input_section
->flags
& SEC_ALLOC
))
4636 if (r_type
== R_ALPHA_REFLONG
)
4638 (*_bfd_error_handler
)
4639 (_("%s: unhandled dynamic relocation against %s"),
4640 bfd_archive_filename (input_bfd
),
4641 h
->root
.root
.root
.string
);
4644 outrel
.r_info
= ELF64_R_INFO (0, R_ALPHA_RELATIVE
);
4645 outrel
.r_addend
= value
;
4650 BFD_ASSERT(srel
!= NULL
);
4653 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
4655 if ((outrel
.r_offset
| 1) != (bfd_vma
) -1)
4656 outrel
.r_offset
+= (input_section
->output_section
->vma
4657 + input_section
->output_offset
);
4659 memset (&outrel
, 0, sizeof outrel
);
4661 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
4662 ((Elf64_External_Rela
*)
4664 + srel
->reloc_count
++);
4665 BFD_ASSERT (sizeof (Elf64_External_Rela
) * srel
->reloc_count
4666 <= srel
->_cooked_size
);
4670 case R_ALPHA_SREL16
:
4671 case R_ALPHA_SREL32
:
4672 case R_ALPHA_SREL64
:
4673 if (dynamic_symbol_p
)
4675 (*_bfd_error_handler
)
4676 (_("%s: pc-relative relocation against dynamic symbol %s"),
4677 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4681 /* ??? .eh_frame references to discarded sections will be smashed
4682 to relocations against SHN_UNDEF. The .eh_frame format allows
4683 NULL to be encoded as 0 in any format, so this works here. */
4685 howto
= (elf64_alpha_howto_table
4686 + (r_type
- R_ALPHA_SREL32
+ R_ALPHA_REFLONG
));
4689 case R_ALPHA_TLSLDM
:
4690 /* Ignore the symbol for the relocation. The result is always
4691 the current module. */
4692 dynamic_symbol_p
= 0;
4696 if (!gotent
->reloc_done
)
4698 gotent
->reloc_done
= 1;
4700 /* Note that the module index for the main program is 1. */
4701 bfd_put_64 (output_bfd
, !info
->shared
&& !dynamic_symbol_p
,
4702 sgot
->contents
+ gotent
->got_offset
);
4704 /* If the symbol has been forced local, output a
4705 DTPMOD64 reloc, otherwise it will be handled in
4706 finish_dynamic_symbol. */
4707 if (info
->shared
&& !dynamic_symbol_p
)
4709 Elf_Internal_Rela outrel
;
4711 BFD_ASSERT(srelgot
!= NULL
);
4713 outrel
.r_offset
= (sgot
->output_section
->vma
4714 + sgot
->output_offset
4715 + gotent
->got_offset
);
4716 /* ??? Proper dynindx here. */
4717 outrel
.r_info
= ELF64_R_INFO (0, R_ALPHA_DTPMOD64
);
4718 outrel
.r_addend
= 0;
4720 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
4721 ((Elf64_External_Rela
*)
4723 + srelgot
->reloc_count
++);
4724 BFD_ASSERT (sizeof (Elf64_External_Rela
)
4725 * srelgot
->reloc_count
4726 <= srelgot
->_cooked_size
);
4729 if (dynamic_symbol_p
|| r_type
== R_ALPHA_TLSLDM
)
4733 BFD_ASSERT(tls_segment
!= NULL
);
4736 bfd_put_64 (output_bfd
, value
,
4737 sgot
->contents
+ gotent
->got_offset
+ 8);
4740 value
= (sgot
->output_section
->vma
4741 + sgot
->output_offset
4742 + gotent
->got_offset
);
4746 case R_ALPHA_DTPRELHI
:
4747 case R_ALPHA_DTPRELLO
:
4748 case R_ALPHA_DTPREL16
:
4749 if (dynamic_symbol_p
)
4751 (*_bfd_error_handler
)
4752 (_("%s: dtp-relative relocation against dynamic symbol %s"),
4753 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4756 BFD_ASSERT(tls_segment
!= NULL
);
4758 if (r_type
== R_ALPHA_DTPRELHI
)
4759 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4762 case R_ALPHA_TPRELHI
:
4763 case R_ALPHA_TPRELLO
:
4764 case R_ALPHA_TPREL16
:
4767 (*_bfd_error_handler
)
4768 (_("%s: TLS local exec code cannot be linked into shared objects"),
4769 bfd_archive_filename (input_bfd
));
4772 else if (dynamic_symbol_p
)
4774 (*_bfd_error_handler
)
4775 (_("%s: tp-relative relocation against dynamic symbol %s"),
4776 bfd_archive_filename (input_bfd
), h
->root
.root
.root
.string
);
4779 BFD_ASSERT(tls_segment
!= NULL
);
4781 if (r_type
== R_ALPHA_TPRELHI
)
4782 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4785 case R_ALPHA_GOTDTPREL
:
4786 case R_ALPHA_GOTTPREL
:
4787 BFD_ASSERT(sgot
!= NULL
);
4788 BFD_ASSERT(gp
!= 0);
4789 BFD_ASSERT(gotent
!= NULL
);
4790 BFD_ASSERT(gotent
->use_count
>= 1);
4792 if (!gotent
->reloc_done
)
4794 gotent
->reloc_done
= 1;
4796 if (dynamic_symbol_p
)
4800 BFD_ASSERT(tls_segment
!= NULL
);
4801 value
-= (r_type
== R_ALPHA_GOTDTPREL
? dtp_base
: tp_base
);
4803 bfd_put_64 (output_bfd
, value
,
4804 sgot
->contents
+ gotent
->got_offset
);
4807 value
= (sgot
->output_section
->vma
4808 + sgot
->output_offset
4809 + gotent
->got_offset
);
4815 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4816 contents
, rel
->r_offset
, value
, 0);
4825 case bfd_reloc_overflow
:
4829 /* Don't warn if the overflow is due to pc relative reloc
4830 against discarded section. Section optimization code should
4833 if (r_symndx
< symtab_hdr
->sh_info
4834 && sec
!= NULL
&& howto
->pc_relative
4835 && elf_discarded_section (sec
))
4839 name
= h
->root
.root
.root
.string
;
4842 name
= (bfd_elf_string_from_elf_section
4843 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
4847 name
= bfd_section_name (input_bfd
, sec
);
4849 if (! ((*info
->callbacks
->reloc_overflow
)
4850 (info
, name
, howto
->name
, (bfd_vma
) 0,
4851 input_bfd
, input_section
, rel
->r_offset
)))
4857 case bfd_reloc_outofrange
:
4865 /* Finish up dynamic symbol handling. We set the contents of various
4866 dynamic sections here. */
4869 elf64_alpha_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
4871 struct bfd_link_info
*info
;
4872 struct elf_link_hash_entry
*h
;
4873 Elf_Internal_Sym
*sym
;
4875 bfd
*dynobj
= elf_hash_table(info
)->dynobj
;
4877 if (h
->plt
.offset
!= MINUS_ONE
)
4879 /* Fill in the .plt entry for this symbol. */
4880 asection
*splt
, *sgot
, *srel
;
4881 Elf_Internal_Rela outrel
;
4882 bfd_vma got_addr
, plt_addr
;
4884 struct alpha_elf_got_entry
*gotent
;
4886 BFD_ASSERT (h
->dynindx
!= -1);
4888 /* The first .got entry will be updated by the .plt with the
4889 address of the target function. */
4890 gotent
= ((struct alpha_elf_link_hash_entry
*) h
)->got_entries
;
4891 BFD_ASSERT (gotent
&& gotent
->addend
== 0);
4893 splt
= bfd_get_section_by_name (dynobj
, ".plt");
4894 BFD_ASSERT (splt
!= NULL
);
4895 srel
= bfd_get_section_by_name (dynobj
, ".rela.plt");
4896 BFD_ASSERT (srel
!= NULL
);
4897 sgot
= alpha_elf_tdata (gotent
->gotobj
)->got
;
4898 BFD_ASSERT (sgot
!= NULL
);
4900 got_addr
= (sgot
->output_section
->vma
4901 + sgot
->output_offset
4902 + gotent
->got_offset
);
4903 plt_addr
= (splt
->output_section
->vma
4904 + splt
->output_offset
4907 plt_index
= (h
->plt
.offset
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
4909 /* Fill in the entry in the procedure linkage table. */
4911 bfd_vma insn1
, insn2
, insn3
;
4913 insn1
= PLT_ENTRY_WORD1
| ((-(h
->plt
.offset
+ 4) >> 2) & 0x1fffff);
4914 insn2
= PLT_ENTRY_WORD2
;
4915 insn3
= PLT_ENTRY_WORD3
;
4917 bfd_put_32 (output_bfd
, insn1
, splt
->contents
+ h
->plt
.offset
);
4918 bfd_put_32 (output_bfd
, insn2
, splt
->contents
+ h
->plt
.offset
+ 4);
4919 bfd_put_32 (output_bfd
, insn3
, splt
->contents
+ h
->plt
.offset
+ 8);
4922 /* Fill in the entry in the .rela.plt section. */
4923 outrel
.r_offset
= got_addr
;
4924 outrel
.r_info
= ELF64_R_INFO(h
->dynindx
, R_ALPHA_JMP_SLOT
);
4925 outrel
.r_addend
= 0;
4927 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
4928 ((Elf64_External_Rela
*)srel
->contents
4931 if (!(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
4933 /* Mark the symbol as undefined, rather than as defined in the
4934 .plt section. Leave the value alone. */
4935 sym
->st_shndx
= SHN_UNDEF
;
4938 /* Fill in the entries in the .got. */
4939 bfd_put_64 (output_bfd
, plt_addr
, sgot
->contents
+ gotent
->got_offset
);
4941 /* Subsequent .got entries will continue to bounce through the .plt. */
4944 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
4945 BFD_ASSERT (! info
->shared
|| srel
!= NULL
);
4947 gotent
= gotent
->next
;
4950 sgot
= alpha_elf_tdata(gotent
->gotobj
)->got
;
4951 BFD_ASSERT(sgot
!= NULL
);
4952 BFD_ASSERT(gotent
->addend
== 0);
4954 bfd_put_64 (output_bfd
, plt_addr
,
4955 sgot
->contents
+ gotent
->got_offset
);
4959 outrel
.r_offset
= (sgot
->output_section
->vma
4960 + sgot
->output_offset
4961 + gotent
->got_offset
);
4962 outrel
.r_info
= ELF64_R_INFO(0, R_ALPHA_RELATIVE
);
4963 outrel
.r_addend
= plt_addr
;
4965 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
4966 ((Elf64_External_Rela
*)
4968 + srel
->reloc_count
++);
4969 BFD_ASSERT (sizeof (Elf64_External_Rela
) * srel
->reloc_count
4970 <= srel
->_cooked_size
);
4973 gotent
= gotent
->next
;
4975 while (gotent
!= NULL
);
4978 else if (alpha_elf_dynamic_symbol_p (h
, info
))
4980 /* Fill in the dynamic relocations for this symbol's .got entries. */
4982 Elf_Internal_Rela outrel
;
4983 struct alpha_elf_got_entry
*gotent
;
4985 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
4986 BFD_ASSERT (srel
!= NULL
);
4988 for (gotent
= ((struct alpha_elf_link_hash_entry
*) h
)->got_entries
;
4990 gotent
= gotent
->next
)
4995 if (gotent
->use_count
== 0)
4998 sgot
= alpha_elf_tdata (gotent
->gotobj
)->got
;
4999 outrel
.r_offset
= (sgot
->output_section
->vma
5000 + sgot
->output_offset
5001 + gotent
->got_offset
);
5003 r_type
= gotent
->reloc_type
;
5006 case R_ALPHA_LITERAL
:
5007 r_type
= R_ALPHA_GLOB_DAT
;
5010 r_type
= R_ALPHA_DTPMOD64
;
5012 case R_ALPHA_GOTDTPREL
:
5013 r_type
= R_ALPHA_DTPREL64
;
5015 case R_ALPHA_GOTTPREL
:
5016 r_type
= R_ALPHA_TPREL64
;
5018 case R_ALPHA_TLSLDM
:
5023 outrel
.r_info
= ELF64_R_INFO (h
->dynindx
, r_type
);
5024 outrel
.r_addend
= gotent
->addend
;
5026 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
5027 ((Elf64_External_Rela
*)srel
->contents
5028 + srel
->reloc_count
++));
5030 if (gotent
->reloc_type
== R_ALPHA_TLSGD
)
5032 outrel
.r_offset
+= 8;
5033 outrel
.r_info
= ELF64_R_INFO (h
->dynindx
, R_ALPHA_DTPREL64
);
5035 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
,
5036 ((Elf64_External_Rela
*)srel
->contents
5037 + srel
->reloc_count
++));
5040 BFD_ASSERT (sizeof (Elf64_External_Rela
) * srel
->reloc_count
5041 <= srel
->_cooked_size
);
5045 /* Mark some specially defined symbols as absolute. */
5046 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
5047 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
5048 || strcmp (h
->root
.root
.string
, "_PROCEDURE_LINKAGE_TABLE_") == 0)
5049 sym
->st_shndx
= SHN_ABS
;
5054 /* Finish up the dynamic sections. */
5057 elf64_alpha_finish_dynamic_sections (output_bfd
, info
)
5059 struct bfd_link_info
*info
;
5064 dynobj
= elf_hash_table (info
)->dynobj
;
5065 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
5067 if (elf_hash_table (info
)->dynamic_sections_created
)
5070 Elf64_External_Dyn
*dyncon
, *dynconend
;
5072 splt
= bfd_get_section_by_name (dynobj
, ".plt");
5073 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
5075 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
5076 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
5077 for (; dyncon
< dynconend
; dyncon
++)
5079 Elf_Internal_Dyn dyn
;
5083 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
5098 /* My interpretation of the TIS v1.1 ELF document indicates
5099 that RELASZ should not include JMPREL. This is not what
5100 the rest of the BFD does. It is, however, what the
5101 glibc ld.so wants. Do this fixup here until we found
5102 out who is right. */
5103 s
= bfd_get_section_by_name (output_bfd
, ".rela.plt");
5107 (s
->_cooked_size
? s
->_cooked_size
: s
->_raw_size
);
5112 s
= bfd_get_section_by_name (output_bfd
, name
);
5113 dyn
.d_un
.d_ptr
= (s
? s
->vma
: 0);
5117 s
= bfd_get_section_by_name (output_bfd
, name
);
5119 (s
->_cooked_size
? s
->_cooked_size
: s
->_raw_size
);
5123 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
5126 /* Initialize the PLT0 entry */
5127 if (splt
->_raw_size
> 0)
5129 bfd_put_32 (output_bfd
, PLT_HEADER_WORD1
, splt
->contents
);
5130 bfd_put_32 (output_bfd
, PLT_HEADER_WORD2
, splt
->contents
+ 4);
5131 bfd_put_32 (output_bfd
, PLT_HEADER_WORD3
, splt
->contents
+ 8);
5132 bfd_put_32 (output_bfd
, PLT_HEADER_WORD4
, splt
->contents
+ 12);
5134 /* The next two words will be filled in by ld.so */
5135 bfd_put_64 (output_bfd
, (bfd_vma
) 0, splt
->contents
+ 16);
5136 bfd_put_64 (output_bfd
, (bfd_vma
) 0, splt
->contents
+ 24);
5138 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
=
5146 /* We need to use a special link routine to handle the .mdebug section.
5147 We need to merge all instances of these sections together, not write
5148 them all out sequentially. */
5151 elf64_alpha_final_link (abfd
, info
)
5153 struct bfd_link_info
*info
;
5156 struct bfd_link_order
*p
;
5157 asection
*mdebug_sec
;
5158 struct ecoff_debug_info debug
;
5159 const struct ecoff_debug_swap
*swap
5160 = get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
5161 HDRR
*symhdr
= &debug
.symbolic_header
;
5162 PTR mdebug_handle
= NULL
;
5164 /* Go through the sections and collect the mdebug information. */
5166 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
5168 if (strcmp (o
->name
, ".mdebug") == 0)
5170 struct extsym_info einfo
;
5172 /* We have found the .mdebug section in the output file.
5173 Look through all the link_orders comprising it and merge
5174 the information together. */
5175 symhdr
->magic
= swap
->sym_magic
;
5176 /* FIXME: What should the version stamp be? */
5178 symhdr
->ilineMax
= 0;
5182 symhdr
->isymMax
= 0;
5183 symhdr
->ioptMax
= 0;
5184 symhdr
->iauxMax
= 0;
5186 symhdr
->issExtMax
= 0;
5189 symhdr
->iextMax
= 0;
5191 /* We accumulate the debugging information itself in the
5192 debug_info structure. */
5194 debug
.external_dnr
= NULL
;
5195 debug
.external_pdr
= NULL
;
5196 debug
.external_sym
= NULL
;
5197 debug
.external_opt
= NULL
;
5198 debug
.external_aux
= NULL
;
5200 debug
.ssext
= debug
.ssext_end
= NULL
;
5201 debug
.external_fdr
= NULL
;
5202 debug
.external_rfd
= NULL
;
5203 debug
.external_ext
= debug
.external_ext_end
= NULL
;
5205 mdebug_handle
= bfd_ecoff_debug_init (abfd
, &debug
, swap
, info
);
5206 if (mdebug_handle
== (PTR
) NULL
)
5215 static const char * const name
[] =
5217 ".text", ".init", ".fini", ".data",
5218 ".rodata", ".sdata", ".sbss", ".bss"
5220 static const int sc
[] = { scText
, scInit
, scFini
, scData
,
5221 scRData
, scSData
, scSBss
, scBss
};
5224 esym
.cobol_main
= 0;
5228 esym
.asym
.iss
= issNil
;
5229 esym
.asym
.st
= stLocal
;
5230 esym
.asym
.reserved
= 0;
5231 esym
.asym
.index
= indexNil
;
5232 for (i
= 0; i
< 8; i
++)
5234 esym
.asym
.sc
= sc
[i
];
5235 s
= bfd_get_section_by_name (abfd
, name
[i
]);
5238 esym
.asym
.value
= s
->vma
;
5239 last
= s
->vma
+ s
->_raw_size
;
5242 esym
.asym
.value
= last
;
5244 if (! bfd_ecoff_debug_one_external (abfd
, &debug
, swap
,
5250 for (p
= o
->link_order_head
;
5251 p
!= (struct bfd_link_order
*) NULL
;
5254 asection
*input_section
;
5256 const struct ecoff_debug_swap
*input_swap
;
5257 struct ecoff_debug_info input_debug
;
5261 if (p
->type
!= bfd_indirect_link_order
)
5263 if (p
->type
== bfd_data_link_order
)
5268 input_section
= p
->u
.indirect
.section
;
5269 input_bfd
= input_section
->owner
;
5271 if (bfd_get_flavour (input_bfd
) != bfd_target_elf_flavour
5272 || (get_elf_backend_data (input_bfd
)
5273 ->elf_backend_ecoff_debug_swap
) == NULL
)
5275 /* I don't know what a non ALPHA ELF bfd would be
5276 doing with a .mdebug section, but I don't really
5277 want to deal with it. */
5281 input_swap
= (get_elf_backend_data (input_bfd
)
5282 ->elf_backend_ecoff_debug_swap
);
5284 BFD_ASSERT (p
->size
== input_section
->_raw_size
);
5286 /* The ECOFF linking code expects that we have already
5287 read in the debugging information and set up an
5288 ecoff_debug_info structure, so we do that now. */
5289 if (!elf64_alpha_read_ecoff_info (input_bfd
, input_section
,
5293 if (! (bfd_ecoff_debug_accumulate
5294 (mdebug_handle
, abfd
, &debug
, swap
, input_bfd
,
5295 &input_debug
, input_swap
, info
)))
5298 /* Loop through the external symbols. For each one with
5299 interesting information, try to find the symbol in
5300 the linker global hash table and save the information
5301 for the output external symbols. */
5302 eraw_src
= input_debug
.external_ext
;
5303 eraw_end
= (eraw_src
5304 + (input_debug
.symbolic_header
.iextMax
5305 * input_swap
->external_ext_size
));
5307 eraw_src
< eraw_end
;
5308 eraw_src
+= input_swap
->external_ext_size
)
5312 struct alpha_elf_link_hash_entry
*h
;
5314 (*input_swap
->swap_ext_in
) (input_bfd
, (PTR
) eraw_src
, &ext
);
5315 if (ext
.asym
.sc
== scNil
5316 || ext
.asym
.sc
== scUndefined
5317 || ext
.asym
.sc
== scSUndefined
)
5320 name
= input_debug
.ssext
+ ext
.asym
.iss
;
5321 h
= alpha_elf_link_hash_lookup (alpha_elf_hash_table (info
),
5322 name
, false, false, true);
5323 if (h
== NULL
|| h
->esym
.ifd
!= -2)
5329 < input_debug
.symbolic_header
.ifdMax
);
5330 ext
.ifd
= input_debug
.ifdmap
[ext
.ifd
];
5336 /* Free up the information we just read. */
5337 free (input_debug
.line
);
5338 free (input_debug
.external_dnr
);
5339 free (input_debug
.external_pdr
);
5340 free (input_debug
.external_sym
);
5341 free (input_debug
.external_opt
);
5342 free (input_debug
.external_aux
);
5343 free (input_debug
.ss
);
5344 free (input_debug
.ssext
);
5345 free (input_debug
.external_fdr
);
5346 free (input_debug
.external_rfd
);
5347 free (input_debug
.external_ext
);
5349 /* Hack: reset the SEC_HAS_CONTENTS flag so that
5350 elf_link_input_bfd ignores this section. */
5351 input_section
->flags
&=~ SEC_HAS_CONTENTS
;
5354 /* Build the external symbol information. */
5357 einfo
.debug
= &debug
;
5359 einfo
.failed
= false;
5360 elf_link_hash_traverse (elf_hash_table (info
),
5361 elf64_alpha_output_extsym
,
5366 /* Set the size of the .mdebug section. */
5367 o
->_raw_size
= bfd_ecoff_debug_size (abfd
, &debug
, swap
);
5369 /* Skip this section later on (I don't think this currently
5370 matters, but someday it might). */
5371 o
->link_order_head
= (struct bfd_link_order
*) NULL
;
5377 /* Invoke the regular ELF backend linker to do all the work. */
5378 if (! bfd_elf64_bfd_final_link (abfd
, info
))
5381 /* Now write out the computed sections. */
5383 /* The .got subsections... */
5385 bfd
*i
, *dynobj
= elf_hash_table(info
)->dynobj
;
5386 for (i
= alpha_elf_hash_table(info
)->got_list
;
5388 i
= alpha_elf_tdata(i
)->got_link_next
)
5392 /* elf_bfd_final_link already did everything in dynobj. */
5396 sgot
= alpha_elf_tdata(i
)->got
;
5397 if (! bfd_set_section_contents (abfd
, sgot
->output_section
,
5399 (file_ptr
) sgot
->output_offset
,
5405 if (mdebug_sec
!= (asection
*) NULL
)
5407 BFD_ASSERT (abfd
->output_has_begun
);
5408 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle
, abfd
, &debug
,
5410 mdebug_sec
->filepos
))
5413 bfd_ecoff_debug_free (mdebug_handle
, abfd
, &debug
, swap
, info
);
5419 static enum elf_reloc_type_class
5420 elf64_alpha_reloc_type_class (rela
)
5421 const Elf_Internal_Rela
*rela
;
5423 switch ((int) ELF64_R_TYPE (rela
->r_info
))
5425 case R_ALPHA_RELATIVE
:
5426 return reloc_class_relative
;
5427 case R_ALPHA_JMP_SLOT
:
5428 return reloc_class_plt
;
5430 return reloc_class_copy
;
5432 return reloc_class_normal
;
5436 /* ECOFF swapping routines. These are used when dealing with the
5437 .mdebug section, which is in the ECOFF debugging format. Copied
5438 from elf32-mips.c. */
5439 static const struct ecoff_debug_swap
5440 elf64_alpha_ecoff_debug_swap
=
5442 /* Symbol table magic number. */
5444 /* Alignment of debugging information. E.g., 4. */
5446 /* Sizes of external symbolic information. */
5447 sizeof (struct hdr_ext
),
5448 sizeof (struct dnr_ext
),
5449 sizeof (struct pdr_ext
),
5450 sizeof (struct sym_ext
),
5451 sizeof (struct opt_ext
),
5452 sizeof (struct fdr_ext
),
5453 sizeof (struct rfd_ext
),
5454 sizeof (struct ext_ext
),
5455 /* Functions to swap in external symbolic data. */
5464 _bfd_ecoff_swap_tir_in
,
5465 _bfd_ecoff_swap_rndx_in
,
5466 /* Functions to swap out external symbolic data. */
5475 _bfd_ecoff_swap_tir_out
,
5476 _bfd_ecoff_swap_rndx_out
,
5477 /* Function to read in symbolic data. */
5478 elf64_alpha_read_ecoff_info
5481 /* Use a non-standard hash bucket size of 8. */
5483 const struct elf_size_info alpha_elf_size_info
=
5485 sizeof (Elf64_External_Ehdr
),
5486 sizeof (Elf64_External_Phdr
),
5487 sizeof (Elf64_External_Shdr
),
5488 sizeof (Elf64_External_Rel
),
5489 sizeof (Elf64_External_Rela
),
5490 sizeof (Elf64_External_Sym
),
5491 sizeof (Elf64_External_Dyn
),
5492 sizeof (Elf_External_Note
),
5496 ELFCLASS64
, EV_CURRENT
,
5497 bfd_elf64_write_out_phdrs
,
5498 bfd_elf64_write_shdrs_and_ehdr
,
5499 bfd_elf64_write_relocs
,
5500 bfd_elf64_swap_symbol_in
,
5501 bfd_elf64_swap_symbol_out
,
5502 bfd_elf64_slurp_reloc_table
,
5503 bfd_elf64_slurp_symbol_table
,
5504 bfd_elf64_swap_dyn_in
,
5505 bfd_elf64_swap_dyn_out
,
5512 #define TARGET_LITTLE_SYM bfd_elf64_alpha_vec
5513 #define TARGET_LITTLE_NAME "elf64-alpha"
5514 #define ELF_ARCH bfd_arch_alpha
5515 #define ELF_MACHINE_CODE EM_ALPHA
5516 #define ELF_MAXPAGESIZE 0x10000
5518 #define bfd_elf64_bfd_link_hash_table_create \
5519 elf64_alpha_bfd_link_hash_table_create
5521 #define bfd_elf64_bfd_reloc_type_lookup \
5522 elf64_alpha_bfd_reloc_type_lookup
5523 #define elf_info_to_howto \
5524 elf64_alpha_info_to_howto
5526 #define bfd_elf64_mkobject \
5527 elf64_alpha_mkobject
5528 #define elf_backend_object_p \
5529 elf64_alpha_object_p
5531 #define elf_backend_section_from_shdr \
5532 elf64_alpha_section_from_shdr
5533 #define elf_backend_section_flags \
5534 elf64_alpha_section_flags
5535 #define elf_backend_fake_sections \
5536 elf64_alpha_fake_sections
5538 #define bfd_elf64_bfd_is_local_label_name \
5539 elf64_alpha_is_local_label_name
5540 #define bfd_elf64_find_nearest_line \
5541 elf64_alpha_find_nearest_line
5542 #define bfd_elf64_bfd_relax_section \
5543 elf64_alpha_relax_section
5545 #define elf_backend_add_symbol_hook \
5546 elf64_alpha_add_symbol_hook
5547 #define elf_backend_check_relocs \
5548 elf64_alpha_check_relocs
5549 #define elf_backend_create_dynamic_sections \
5550 elf64_alpha_create_dynamic_sections
5551 #define elf_backend_adjust_dynamic_symbol \
5552 elf64_alpha_adjust_dynamic_symbol
5553 #define elf_backend_always_size_sections \
5554 elf64_alpha_always_size_sections
5555 #define elf_backend_size_dynamic_sections \
5556 elf64_alpha_size_dynamic_sections
5557 #define elf_backend_relocate_section \
5558 elf64_alpha_relocate_section
5559 #define elf_backend_finish_dynamic_symbol \
5560 elf64_alpha_finish_dynamic_symbol
5561 #define elf_backend_finish_dynamic_sections \
5562 elf64_alpha_finish_dynamic_sections
5563 #define bfd_elf64_bfd_final_link \
5564 elf64_alpha_final_link
5565 #define elf_backend_reloc_type_class \
5566 elf64_alpha_reloc_type_class
5568 #define elf_backend_ecoff_debug_swap \
5569 &elf64_alpha_ecoff_debug_swap
5571 #define elf_backend_size_info \
5574 /* A few constants that determine how the .plt section is set up. */
5575 #define elf_backend_want_got_plt 0
5576 #define elf_backend_plt_readonly 0
5577 #define elf_backend_want_plt_sym 1
5578 #define elf_backend_got_header_size 0
5579 #define elf_backend_plt_header_size PLT_HEADER_SIZE
5581 #include "elf64-target.h"