1 /* Alpha specific support for 64-bit ELF
2 Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005
3 Free Software Foundation, Inc.
4 Contributed by Richard Henderson <rth@tamu.edu>.
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., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, 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"
51 struct alpha_elf_link_hash_entry
53 struct elf_link_hash_entry root
;
55 /* External symbol information. */
58 /* Cumulative flags for all the .got entries. */
61 /* Contexts in which a literal was referenced. */
62 #define ALPHA_ELF_LINK_HASH_LU_ADDR 0x01
63 #define ALPHA_ELF_LINK_HASH_LU_MEM 0x02
64 #define ALPHA_ELF_LINK_HASH_LU_BYTE 0x04
65 #define ALPHA_ELF_LINK_HASH_LU_JSR 0x08
66 #define ALPHA_ELF_LINK_HASH_LU_TLSGD 0x10
67 #define ALPHA_ELF_LINK_HASH_LU_TLSLDM 0x20
68 #define ALPHA_ELF_LINK_HASH_LU_FUNC 0x38
69 #define ALPHA_ELF_LINK_HASH_TLS_IE 0x40
70 #define ALPHA_ELF_LINK_HASH_PLT_LOC 0x80
72 /* Used to undo the localization of a plt symbol. */
73 asection
*plt_old_section
;
74 bfd_vma plt_old_value
;
76 /* Used to implement multiple .got subsections. */
77 struct alpha_elf_got_entry
79 struct alpha_elf_got_entry
*next
;
81 /* Which .got subsection? */
84 /* The addend in effect for this entry. */
87 /* The .got offset for this entry. */
90 /* How many references to this entry? */
93 /* The relocation type of this entry. */
94 unsigned char reloc_type
;
96 /* How a LITERAL is used. */
99 /* Have we initialized the dynamic relocation for this entry? */
100 unsigned char reloc_done
;
102 /* Have we adjusted this entry for SEC_MERGE? */
103 unsigned char reloc_xlated
;
106 /* Used to count non-got, non-plt relocations for delayed sizing
107 of relocation sections. */
108 struct alpha_elf_reloc_entry
110 struct alpha_elf_reloc_entry
*next
;
112 /* Which .reloc section? */
115 /* What kind of relocation? */
118 /* Is this against read-only section? */
119 unsigned int reltext
: 1;
121 /* How many did we find? */
126 /* Alpha ELF linker hash table. */
128 struct alpha_elf_link_hash_table
130 struct elf_link_hash_table root
;
132 /* The head of a list of .got subsections linked through
133 alpha_elf_tdata(abfd)->got_link_next. */
137 /* Look up an entry in a Alpha ELF linker hash table. */
139 #define alpha_elf_link_hash_lookup(table, string, create, copy, follow) \
140 ((struct alpha_elf_link_hash_entry *) \
141 elf_link_hash_lookup (&(table)->root, (string), (create), \
144 /* Traverse a Alpha ELF linker hash table. */
146 #define alpha_elf_link_hash_traverse(table, func, info) \
147 (elf_link_hash_traverse \
149 (bfd_boolean (*) (struct elf_link_hash_entry *, PTR)) (func), \
152 /* Get the Alpha ELF linker hash table from a link_info structure. */
154 #define alpha_elf_hash_table(p) \
155 ((struct alpha_elf_link_hash_table *) ((p)->hash))
157 /* Get the object's symbols as our own entry type. */
159 #define alpha_elf_sym_hashes(abfd) \
160 ((struct alpha_elf_link_hash_entry **)elf_sym_hashes(abfd))
162 /* Should we do dynamic things to this symbol? This differs from the
163 generic version in that we never need to consider function pointer
164 equality wrt PLT entries -- we don't create a PLT entry if a symbol's
165 address is ever taken. */
167 static inline bfd_boolean
168 alpha_elf_dynamic_symbol_p (struct elf_link_hash_entry
*h
,
169 struct bfd_link_info
*info
)
171 return _bfd_elf_dynamic_symbol_p (h
, info
, 0);
174 /* Create an entry in a Alpha ELF linker hash table. */
176 static struct bfd_hash_entry
*
177 elf64_alpha_link_hash_newfunc (struct bfd_hash_entry
*entry
,
178 struct bfd_hash_table
*table
,
181 struct alpha_elf_link_hash_entry
*ret
=
182 (struct alpha_elf_link_hash_entry
*) entry
;
184 /* Allocate the structure if it has not already been allocated by a
186 if (ret
== (struct alpha_elf_link_hash_entry
*) NULL
)
187 ret
= ((struct alpha_elf_link_hash_entry
*)
188 bfd_hash_allocate (table
,
189 sizeof (struct alpha_elf_link_hash_entry
)));
190 if (ret
== (struct alpha_elf_link_hash_entry
*) NULL
)
191 return (struct bfd_hash_entry
*) ret
;
193 /* Call the allocation method of the superclass. */
194 ret
= ((struct alpha_elf_link_hash_entry
*)
195 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry
*) ret
,
197 if (ret
!= (struct alpha_elf_link_hash_entry
*) NULL
)
199 /* Set local fields. */
200 memset (&ret
->esym
, 0, sizeof (EXTR
));
201 /* We use -2 as a marker to indicate that the information has
202 not been set. -1 means there is no associated ifd. */
205 ret
->got_entries
= NULL
;
206 ret
->reloc_entries
= NULL
;
209 return (struct bfd_hash_entry
*) ret
;
212 /* Create a Alpha ELF linker hash table. */
214 static struct bfd_link_hash_table
*
215 elf64_alpha_bfd_link_hash_table_create (bfd
*abfd
)
217 struct alpha_elf_link_hash_table
*ret
;
218 bfd_size_type amt
= sizeof (struct alpha_elf_link_hash_table
);
220 ret
= (struct alpha_elf_link_hash_table
*) bfd_zmalloc (amt
);
221 if (ret
== (struct alpha_elf_link_hash_table
*) NULL
)
224 if (! _bfd_elf_link_hash_table_init (&ret
->root
, abfd
,
225 elf64_alpha_link_hash_newfunc
))
231 return &ret
->root
.root
;
234 /* We have some private fields hanging off of the elf_tdata structure. */
236 struct alpha_elf_obj_tdata
238 struct elf_obj_tdata root
;
240 /* For every input file, these are the got entries for that object's
242 struct alpha_elf_got_entry
** local_got_entries
;
244 /* For every input file, this is the object that owns the got that
245 this input file uses. */
248 /* For every got, this is a linked list through the objects using this got */
249 bfd
*in_got_link_next
;
251 /* For every got, this is a link to the next got subsegment. */
254 /* For every got, this is the section. */
257 /* For every got, this is it's total number of words. */
260 /* For every got, this is the sum of the number of words required
261 to hold all of the member object's local got. */
265 #define alpha_elf_tdata(abfd) \
266 ((struct alpha_elf_obj_tdata *) (abfd)->tdata.any)
269 elf64_alpha_mkobject (bfd
*abfd
)
271 bfd_size_type amt
= sizeof (struct alpha_elf_obj_tdata
);
272 abfd
->tdata
.any
= bfd_zalloc (abfd
, amt
);
273 if (abfd
->tdata
.any
== NULL
)
279 elf64_alpha_object_p (bfd
*abfd
)
281 /* Set the right machine number for an Alpha ELF file. */
282 return bfd_default_set_arch_mach (abfd
, bfd_arch_alpha
, 0);
285 /* A relocation function which doesn't do anything. */
287 static bfd_reloc_status_type
288 elf64_alpha_reloc_nil (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc
,
289 asymbol
*sym ATTRIBUTE_UNUSED
,
290 PTR data ATTRIBUTE_UNUSED
, asection
*sec
,
291 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
294 reloc
->address
+= sec
->output_offset
;
298 /* A relocation function used for an unsupported reloc. */
300 static bfd_reloc_status_type
301 elf64_alpha_reloc_bad (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*reloc
,
302 asymbol
*sym ATTRIBUTE_UNUSED
,
303 PTR data ATTRIBUTE_UNUSED
, asection
*sec
,
304 bfd
*output_bfd
, char **error_message ATTRIBUTE_UNUSED
)
307 reloc
->address
+= sec
->output_offset
;
308 return bfd_reloc_notsupported
;
311 /* Do the work of the GPDISP relocation. */
313 static bfd_reloc_status_type
314 elf64_alpha_do_reloc_gpdisp (bfd
*abfd
, bfd_vma gpdisp
, bfd_byte
*p_ldah
,
317 bfd_reloc_status_type ret
= bfd_reloc_ok
;
319 unsigned long i_ldah
, i_lda
;
321 i_ldah
= bfd_get_32 (abfd
, p_ldah
);
322 i_lda
= bfd_get_32 (abfd
, p_lda
);
324 /* Complain if the instructions are not correct. */
325 if (((i_ldah
>> 26) & 0x3f) != 0x09
326 || ((i_lda
>> 26) & 0x3f) != 0x08)
327 ret
= bfd_reloc_dangerous
;
329 /* Extract the user-supplied offset, mirroring the sign extensions
330 that the instructions perform. */
331 addend
= ((i_ldah
& 0xffff) << 16) | (i_lda
& 0xffff);
332 addend
= (addend
^ 0x80008000) - 0x80008000;
336 if ((bfd_signed_vma
) gpdisp
< -(bfd_signed_vma
) 0x80000000
337 || (bfd_signed_vma
) gpdisp
>= (bfd_signed_vma
) 0x7fff8000)
338 ret
= bfd_reloc_overflow
;
340 /* compensate for the sign extension again. */
341 i_ldah
= ((i_ldah
& 0xffff0000)
342 | (((gpdisp
>> 16) + ((gpdisp
>> 15) & 1)) & 0xffff));
343 i_lda
= (i_lda
& 0xffff0000) | (gpdisp
& 0xffff);
345 bfd_put_32 (abfd
, (bfd_vma
) i_ldah
, p_ldah
);
346 bfd_put_32 (abfd
, (bfd_vma
) i_lda
, p_lda
);
351 /* The special function for the GPDISP reloc. */
353 static bfd_reloc_status_type
354 elf64_alpha_reloc_gpdisp (bfd
*abfd
, arelent
*reloc_entry
,
355 asymbol
*sym ATTRIBUTE_UNUSED
, PTR data
,
356 asection
*input_section
, bfd
*output_bfd
,
359 bfd_reloc_status_type ret
;
360 bfd_vma gp
, relocation
;
361 bfd_vma high_address
;
362 bfd_byte
*p_ldah
, *p_lda
;
364 /* Don't do anything if we're not doing a final link. */
367 reloc_entry
->address
+= input_section
->output_offset
;
371 high_address
= bfd_get_section_limit (abfd
, input_section
);
372 if (reloc_entry
->address
> high_address
373 || reloc_entry
->address
+ reloc_entry
->addend
> high_address
)
374 return bfd_reloc_outofrange
;
376 /* The gp used in the portion of the output object to which this
377 input object belongs is cached on the input bfd. */
378 gp
= _bfd_get_gp_value (abfd
);
380 relocation
= (input_section
->output_section
->vma
381 + input_section
->output_offset
382 + reloc_entry
->address
);
384 p_ldah
= (bfd_byte
*) data
+ reloc_entry
->address
;
385 p_lda
= p_ldah
+ reloc_entry
->addend
;
387 ret
= elf64_alpha_do_reloc_gpdisp (abfd
, gp
- relocation
, p_ldah
, p_lda
);
389 /* Complain if the instructions are not correct. */
390 if (ret
== bfd_reloc_dangerous
)
391 *err_msg
= _("GPDISP relocation did not find ldah and lda instructions");
396 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
397 from smaller values. Start with zero, widen, *then* decrement. */
398 #define MINUS_ONE (((bfd_vma)0) - 1)
400 #define SKIP_HOWTO(N) \
401 HOWTO(N, 0, 0, 0, 0, 0, 0, elf64_alpha_reloc_bad, 0, 0, 0, 0, 0)
403 static reloc_howto_type elf64_alpha_howto_table
[] =
405 HOWTO (R_ALPHA_NONE
, /* type */
407 0, /* size (0 = byte, 1 = short, 2 = long) */
409 TRUE
, /* pc_relative */
411 complain_overflow_dont
, /* complain_on_overflow */
412 elf64_alpha_reloc_nil
, /* special_function */
414 FALSE
, /* partial_inplace */
417 TRUE
), /* pcrel_offset */
419 /* A 32 bit reference to a symbol. */
420 HOWTO (R_ALPHA_REFLONG
, /* type */
422 2, /* size (0 = byte, 1 = short, 2 = long) */
424 FALSE
, /* pc_relative */
426 complain_overflow_bitfield
, /* complain_on_overflow */
427 0, /* special_function */
428 "REFLONG", /* name */
429 FALSE
, /* partial_inplace */
430 0xffffffff, /* src_mask */
431 0xffffffff, /* dst_mask */
432 FALSE
), /* pcrel_offset */
434 /* A 64 bit reference to a symbol. */
435 HOWTO (R_ALPHA_REFQUAD
, /* type */
437 4, /* size (0 = byte, 1 = short, 2 = long) */
439 FALSE
, /* pc_relative */
441 complain_overflow_bitfield
, /* complain_on_overflow */
442 0, /* special_function */
443 "REFQUAD", /* name */
444 FALSE
, /* partial_inplace */
445 MINUS_ONE
, /* src_mask */
446 MINUS_ONE
, /* dst_mask */
447 FALSE
), /* pcrel_offset */
449 /* A 32 bit GP relative offset. This is just like REFLONG except
450 that when the value is used the value of the gp register will be
452 HOWTO (R_ALPHA_GPREL32
, /* type */
454 2, /* size (0 = byte, 1 = short, 2 = long) */
456 FALSE
, /* pc_relative */
458 complain_overflow_bitfield
, /* complain_on_overflow */
459 0, /* special_function */
460 "GPREL32", /* name */
461 FALSE
, /* partial_inplace */
462 0xffffffff, /* src_mask */
463 0xffffffff, /* dst_mask */
464 FALSE
), /* pcrel_offset */
466 /* Used for an instruction that refers to memory off the GP register. */
467 HOWTO (R_ALPHA_LITERAL
, /* type */
469 1, /* size (0 = byte, 1 = short, 2 = long) */
471 FALSE
, /* pc_relative */
473 complain_overflow_signed
, /* complain_on_overflow */
474 0, /* special_function */
475 "ELF_LITERAL", /* name */
476 FALSE
, /* partial_inplace */
477 0xffff, /* src_mask */
478 0xffff, /* dst_mask */
479 FALSE
), /* pcrel_offset */
481 /* This reloc only appears immediately following an ELF_LITERAL reloc.
482 It identifies a use of the literal. The symbol index is special:
483 1 means the literal address is in the base register of a memory
484 format instruction; 2 means the literal address is in the byte
485 offset register of a byte-manipulation instruction; 3 means the
486 literal address is in the target register of a jsr instruction.
487 This does not actually do any relocation. */
488 HOWTO (R_ALPHA_LITUSE
, /* type */
490 1, /* size (0 = byte, 1 = short, 2 = long) */
492 FALSE
, /* pc_relative */
494 complain_overflow_dont
, /* complain_on_overflow */
495 elf64_alpha_reloc_nil
, /* special_function */
497 FALSE
, /* partial_inplace */
500 FALSE
), /* pcrel_offset */
502 /* Load the gp register. This is always used for a ldah instruction
503 which loads the upper 16 bits of the gp register. The symbol
504 index of the GPDISP instruction is an offset in bytes to the lda
505 instruction that loads the lower 16 bits. The value to use for
506 the relocation is the difference between the GP value and the
507 current location; the load will always be done against a register
508 holding the current address.
510 NOTE: Unlike ECOFF, partial in-place relocation is not done. If
511 any offset is present in the instructions, it is an offset from
512 the register to the ldah instruction. This lets us avoid any
513 stupid hackery like inventing a gp value to do partial relocation
514 against. Also unlike ECOFF, we do the whole relocation off of
515 the GPDISP rather than a GPDISP_HI16/GPDISP_LO16 pair. An odd,
516 space consuming bit, that, since all the information was present
517 in the GPDISP_HI16 reloc. */
518 HOWTO (R_ALPHA_GPDISP
, /* type */
520 2, /* size (0 = byte, 1 = short, 2 = long) */
522 FALSE
, /* pc_relative */
524 complain_overflow_dont
, /* complain_on_overflow */
525 elf64_alpha_reloc_gpdisp
, /* special_function */
527 FALSE
, /* partial_inplace */
528 0xffff, /* src_mask */
529 0xffff, /* dst_mask */
530 TRUE
), /* pcrel_offset */
532 /* A 21 bit branch. */
533 HOWTO (R_ALPHA_BRADDR
, /* type */
535 2, /* size (0 = byte, 1 = short, 2 = long) */
537 TRUE
, /* pc_relative */
539 complain_overflow_signed
, /* complain_on_overflow */
540 0, /* special_function */
542 FALSE
, /* partial_inplace */
543 0x1fffff, /* src_mask */
544 0x1fffff, /* dst_mask */
545 TRUE
), /* pcrel_offset */
547 /* A hint for a jump to a register. */
548 HOWTO (R_ALPHA_HINT
, /* type */
550 1, /* size (0 = byte, 1 = short, 2 = long) */
552 TRUE
, /* pc_relative */
554 complain_overflow_dont
, /* complain_on_overflow */
555 0, /* special_function */
557 FALSE
, /* partial_inplace */
558 0x3fff, /* src_mask */
559 0x3fff, /* dst_mask */
560 TRUE
), /* pcrel_offset */
562 /* 16 bit PC relative offset. */
563 HOWTO (R_ALPHA_SREL16
, /* type */
565 1, /* size (0 = byte, 1 = short, 2 = long) */
567 TRUE
, /* pc_relative */
569 complain_overflow_signed
, /* complain_on_overflow */
570 0, /* special_function */
572 FALSE
, /* partial_inplace */
573 0xffff, /* src_mask */
574 0xffff, /* dst_mask */
575 TRUE
), /* pcrel_offset */
577 /* 32 bit PC relative offset. */
578 HOWTO (R_ALPHA_SREL32
, /* type */
580 2, /* size (0 = byte, 1 = short, 2 = long) */
582 TRUE
, /* pc_relative */
584 complain_overflow_signed
, /* complain_on_overflow */
585 0, /* special_function */
587 FALSE
, /* partial_inplace */
588 0xffffffff, /* src_mask */
589 0xffffffff, /* dst_mask */
590 TRUE
), /* pcrel_offset */
592 /* A 64 bit PC relative offset. */
593 HOWTO (R_ALPHA_SREL64
, /* type */
595 4, /* size (0 = byte, 1 = short, 2 = long) */
597 TRUE
, /* pc_relative */
599 complain_overflow_signed
, /* complain_on_overflow */
600 0, /* special_function */
602 FALSE
, /* partial_inplace */
603 MINUS_ONE
, /* src_mask */
604 MINUS_ONE
, /* dst_mask */
605 TRUE
), /* pcrel_offset */
607 /* Skip 12 - 16; deprecated ECOFF relocs. */
614 /* The high 16 bits of the displacement from GP to the target. */
615 HOWTO (R_ALPHA_GPRELHIGH
,
617 1, /* size (0 = byte, 1 = short, 2 = long) */
619 FALSE
, /* pc_relative */
621 complain_overflow_signed
, /* complain_on_overflow */
622 0, /* special_function */
623 "GPRELHIGH", /* name */
624 FALSE
, /* partial_inplace */
625 0xffff, /* src_mask */
626 0xffff, /* dst_mask */
627 FALSE
), /* pcrel_offset */
629 /* The low 16 bits of the displacement from GP to the target. */
630 HOWTO (R_ALPHA_GPRELLOW
,
632 1, /* size (0 = byte, 1 = short, 2 = long) */
634 FALSE
, /* pc_relative */
636 complain_overflow_dont
, /* complain_on_overflow */
637 0, /* special_function */
638 "GPRELLOW", /* name */
639 FALSE
, /* partial_inplace */
640 0xffff, /* src_mask */
641 0xffff, /* dst_mask */
642 FALSE
), /* pcrel_offset */
644 /* A 16-bit displacement from the GP to the target. */
645 HOWTO (R_ALPHA_GPREL16
,
647 1, /* size (0 = byte, 1 = short, 2 = long) */
649 FALSE
, /* pc_relative */
651 complain_overflow_signed
, /* complain_on_overflow */
652 0, /* special_function */
653 "GPREL16", /* name */
654 FALSE
, /* partial_inplace */
655 0xffff, /* src_mask */
656 0xffff, /* dst_mask */
657 FALSE
), /* pcrel_offset */
659 /* Skip 20 - 23; deprecated ECOFF relocs. */
665 /* Misc ELF relocations. */
667 /* A dynamic relocation to copy the target into our .dynbss section. */
668 /* Not generated, as all Alpha objects use PIC, so it is not needed. It
669 is present because every other ELF has one, but should not be used
670 because .dynbss is an ugly thing. */
677 complain_overflow_dont
,
678 bfd_elf_generic_reloc
,
685 /* A dynamic relocation for a .got entry. */
686 HOWTO (R_ALPHA_GLOB_DAT
,
692 complain_overflow_dont
,
693 bfd_elf_generic_reloc
,
700 /* A dynamic relocation for a .plt entry. */
701 HOWTO (R_ALPHA_JMP_SLOT
,
707 complain_overflow_dont
,
708 bfd_elf_generic_reloc
,
715 /* A dynamic relocation to add the base of the DSO to a 64-bit field. */
716 HOWTO (R_ALPHA_RELATIVE
,
722 complain_overflow_dont
,
723 bfd_elf_generic_reloc
,
730 /* A 21 bit branch that adjusts for gp loads. */
731 HOWTO (R_ALPHA_BRSGP
, /* type */
733 2, /* size (0 = byte, 1 = short, 2 = long) */
735 TRUE
, /* pc_relative */
737 complain_overflow_signed
, /* complain_on_overflow */
738 0, /* special_function */
740 FALSE
, /* partial_inplace */
741 0x1fffff, /* src_mask */
742 0x1fffff, /* dst_mask */
743 TRUE
), /* pcrel_offset */
745 /* Creates a tls_index for the symbol in the got. */
746 HOWTO (R_ALPHA_TLSGD
, /* type */
748 1, /* size (0 = byte, 1 = short, 2 = long) */
750 FALSE
, /* pc_relative */
752 complain_overflow_signed
, /* complain_on_overflow */
753 0, /* special_function */
755 FALSE
, /* partial_inplace */
756 0xffff, /* src_mask */
757 0xffff, /* dst_mask */
758 FALSE
), /* pcrel_offset */
760 /* Creates a tls_index for the (current) module in the got. */
761 HOWTO (R_ALPHA_TLSLDM
, /* type */
763 1, /* size (0 = byte, 1 = short, 2 = long) */
765 FALSE
, /* pc_relative */
767 complain_overflow_signed
, /* complain_on_overflow */
768 0, /* special_function */
770 FALSE
, /* partial_inplace */
771 0xffff, /* src_mask */
772 0xffff, /* dst_mask */
773 FALSE
), /* pcrel_offset */
775 /* A dynamic relocation for a DTP module entry. */
776 HOWTO (R_ALPHA_DTPMOD64
, /* type */
778 4, /* size (0 = byte, 1 = short, 2 = long) */
780 FALSE
, /* pc_relative */
782 complain_overflow_bitfield
, /* complain_on_overflow */
783 0, /* special_function */
784 "DTPMOD64", /* name */
785 FALSE
, /* partial_inplace */
786 MINUS_ONE
, /* src_mask */
787 MINUS_ONE
, /* dst_mask */
788 FALSE
), /* pcrel_offset */
790 /* Creates a 64-bit offset in the got for the displacement
791 from DTP to the target. */
792 HOWTO (R_ALPHA_GOTDTPREL
, /* type */
794 1, /* size (0 = byte, 1 = short, 2 = long) */
796 FALSE
, /* pc_relative */
798 complain_overflow_signed
, /* complain_on_overflow */
799 0, /* special_function */
800 "GOTDTPREL", /* name */
801 FALSE
, /* partial_inplace */
802 0xffff, /* src_mask */
803 0xffff, /* dst_mask */
804 FALSE
), /* pcrel_offset */
806 /* A dynamic relocation for a displacement from DTP to the target. */
807 HOWTO (R_ALPHA_DTPREL64
, /* type */
809 4, /* size (0 = byte, 1 = short, 2 = long) */
811 FALSE
, /* pc_relative */
813 complain_overflow_bitfield
, /* complain_on_overflow */
814 0, /* special_function */
815 "DTPREL64", /* name */
816 FALSE
, /* partial_inplace */
817 MINUS_ONE
, /* src_mask */
818 MINUS_ONE
, /* dst_mask */
819 FALSE
), /* pcrel_offset */
821 /* The high 16 bits of the displacement from DTP to the target. */
822 HOWTO (R_ALPHA_DTPRELHI
, /* type */
824 1, /* size (0 = byte, 1 = short, 2 = long) */
826 FALSE
, /* pc_relative */
828 complain_overflow_signed
, /* complain_on_overflow */
829 0, /* special_function */
830 "DTPRELHI", /* name */
831 FALSE
, /* partial_inplace */
832 0xffff, /* src_mask */
833 0xffff, /* dst_mask */
834 FALSE
), /* pcrel_offset */
836 /* The low 16 bits of the displacement from DTP to the target. */
837 HOWTO (R_ALPHA_DTPRELLO
, /* type */
839 1, /* size (0 = byte, 1 = short, 2 = long) */
841 FALSE
, /* pc_relative */
843 complain_overflow_dont
, /* complain_on_overflow */
844 0, /* special_function */
845 "DTPRELLO", /* name */
846 FALSE
, /* partial_inplace */
847 0xffff, /* src_mask */
848 0xffff, /* dst_mask */
849 FALSE
), /* pcrel_offset */
851 /* A 16-bit displacement from DTP to the target. */
852 HOWTO (R_ALPHA_DTPREL16
, /* type */
854 1, /* size (0 = byte, 1 = short, 2 = long) */
856 FALSE
, /* pc_relative */
858 complain_overflow_signed
, /* complain_on_overflow */
859 0, /* special_function */
860 "DTPREL16", /* name */
861 FALSE
, /* partial_inplace */
862 0xffff, /* src_mask */
863 0xffff, /* dst_mask */
864 FALSE
), /* pcrel_offset */
866 /* Creates a 64-bit offset in the got for the displacement
867 from TP to the target. */
868 HOWTO (R_ALPHA_GOTTPREL
, /* type */
870 1, /* size (0 = byte, 1 = short, 2 = long) */
872 FALSE
, /* pc_relative */
874 complain_overflow_signed
, /* complain_on_overflow */
875 0, /* special_function */
876 "GOTTPREL", /* name */
877 FALSE
, /* partial_inplace */
878 0xffff, /* src_mask */
879 0xffff, /* dst_mask */
880 FALSE
), /* pcrel_offset */
882 /* A dynamic relocation for a displacement from TP to the target. */
883 HOWTO (R_ALPHA_TPREL64
, /* type */
885 4, /* size (0 = byte, 1 = short, 2 = long) */
887 FALSE
, /* pc_relative */
889 complain_overflow_bitfield
, /* complain_on_overflow */
890 0, /* special_function */
891 "TPREL64", /* name */
892 FALSE
, /* partial_inplace */
893 MINUS_ONE
, /* src_mask */
894 MINUS_ONE
, /* dst_mask */
895 FALSE
), /* pcrel_offset */
897 /* The high 16 bits of the displacement from TP to the target. */
898 HOWTO (R_ALPHA_TPRELHI
, /* type */
900 1, /* size (0 = byte, 1 = short, 2 = long) */
902 FALSE
, /* pc_relative */
904 complain_overflow_signed
, /* complain_on_overflow */
905 0, /* special_function */
906 "TPRELHI", /* name */
907 FALSE
, /* partial_inplace */
908 0xffff, /* src_mask */
909 0xffff, /* dst_mask */
910 FALSE
), /* pcrel_offset */
912 /* The low 16 bits of the displacement from TP to the target. */
913 HOWTO (R_ALPHA_TPRELLO
, /* type */
915 1, /* size (0 = byte, 1 = short, 2 = long) */
917 FALSE
, /* pc_relative */
919 complain_overflow_dont
, /* complain_on_overflow */
920 0, /* special_function */
921 "TPRELLO", /* name */
922 FALSE
, /* partial_inplace */
923 0xffff, /* src_mask */
924 0xffff, /* dst_mask */
925 FALSE
), /* pcrel_offset */
927 /* A 16-bit displacement from TP to the target. */
928 HOWTO (R_ALPHA_TPREL16
, /* type */
930 1, /* size (0 = byte, 1 = short, 2 = long) */
932 FALSE
, /* pc_relative */
934 complain_overflow_signed
, /* complain_on_overflow */
935 0, /* special_function */
936 "TPREL16", /* name */
937 FALSE
, /* partial_inplace */
938 0xffff, /* src_mask */
939 0xffff, /* dst_mask */
940 FALSE
), /* pcrel_offset */
943 /* A mapping from BFD reloc types to Alpha ELF reloc types. */
947 bfd_reloc_code_real_type bfd_reloc_val
;
951 static const struct elf_reloc_map elf64_alpha_reloc_map
[] =
953 {BFD_RELOC_NONE
, R_ALPHA_NONE
},
954 {BFD_RELOC_32
, R_ALPHA_REFLONG
},
955 {BFD_RELOC_64
, R_ALPHA_REFQUAD
},
956 {BFD_RELOC_CTOR
, R_ALPHA_REFQUAD
},
957 {BFD_RELOC_GPREL32
, R_ALPHA_GPREL32
},
958 {BFD_RELOC_ALPHA_ELF_LITERAL
, R_ALPHA_LITERAL
},
959 {BFD_RELOC_ALPHA_LITUSE
, R_ALPHA_LITUSE
},
960 {BFD_RELOC_ALPHA_GPDISP
, R_ALPHA_GPDISP
},
961 {BFD_RELOC_23_PCREL_S2
, R_ALPHA_BRADDR
},
962 {BFD_RELOC_ALPHA_HINT
, R_ALPHA_HINT
},
963 {BFD_RELOC_16_PCREL
, R_ALPHA_SREL16
},
964 {BFD_RELOC_32_PCREL
, R_ALPHA_SREL32
},
965 {BFD_RELOC_64_PCREL
, R_ALPHA_SREL64
},
966 {BFD_RELOC_ALPHA_GPREL_HI16
, R_ALPHA_GPRELHIGH
},
967 {BFD_RELOC_ALPHA_GPREL_LO16
, R_ALPHA_GPRELLOW
},
968 {BFD_RELOC_GPREL16
, R_ALPHA_GPREL16
},
969 {BFD_RELOC_ALPHA_BRSGP
, R_ALPHA_BRSGP
},
970 {BFD_RELOC_ALPHA_TLSGD
, R_ALPHA_TLSGD
},
971 {BFD_RELOC_ALPHA_TLSLDM
, R_ALPHA_TLSLDM
},
972 {BFD_RELOC_ALPHA_DTPMOD64
, R_ALPHA_DTPMOD64
},
973 {BFD_RELOC_ALPHA_GOTDTPREL16
, R_ALPHA_GOTDTPREL
},
974 {BFD_RELOC_ALPHA_DTPREL64
, R_ALPHA_DTPREL64
},
975 {BFD_RELOC_ALPHA_DTPREL_HI16
, R_ALPHA_DTPRELHI
},
976 {BFD_RELOC_ALPHA_DTPREL_LO16
, R_ALPHA_DTPRELLO
},
977 {BFD_RELOC_ALPHA_DTPREL16
, R_ALPHA_DTPREL16
},
978 {BFD_RELOC_ALPHA_GOTTPREL16
, R_ALPHA_GOTTPREL
},
979 {BFD_RELOC_ALPHA_TPREL64
, R_ALPHA_TPREL64
},
980 {BFD_RELOC_ALPHA_TPREL_HI16
, R_ALPHA_TPRELHI
},
981 {BFD_RELOC_ALPHA_TPREL_LO16
, R_ALPHA_TPRELLO
},
982 {BFD_RELOC_ALPHA_TPREL16
, R_ALPHA_TPREL16
},
985 /* Given a BFD reloc type, return a HOWTO structure. */
987 static reloc_howto_type
*
988 elf64_alpha_bfd_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
989 bfd_reloc_code_real_type code
)
991 const struct elf_reloc_map
*i
, *e
;
992 i
= e
= elf64_alpha_reloc_map
;
993 e
+= sizeof (elf64_alpha_reloc_map
) / sizeof (struct elf_reloc_map
);
996 if (i
->bfd_reloc_val
== code
)
997 return &elf64_alpha_howto_table
[i
->elf_reloc_val
];
1002 /* Given an Alpha ELF reloc type, fill in an arelent structure. */
1005 elf64_alpha_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
1006 Elf_Internal_Rela
*dst
)
1008 unsigned r_type
= ELF64_R_TYPE(dst
->r_info
);
1009 BFD_ASSERT (r_type
< (unsigned int) R_ALPHA_max
);
1010 cache_ptr
->howto
= &elf64_alpha_howto_table
[r_type
];
1013 /* These two relocations create a two-word entry in the got. */
1014 #define alpha_got_entry_size(r_type) \
1015 (r_type == R_ALPHA_TLSGD || r_type == R_ALPHA_TLSLDM ? 16 : 8)
1017 /* This is PT_TLS segment p_vaddr. */
1018 #define alpha_get_dtprel_base(info) \
1019 (elf_hash_table (info)->tls_sec->vma)
1021 /* Main program TLS (whose template starts at PT_TLS p_vaddr)
1022 is assigned offset round(16, PT_TLS p_align). */
1023 #define alpha_get_tprel_base(info) \
1024 (elf_hash_table (info)->tls_sec->vma \
1025 - align_power ((bfd_vma) 16, \
1026 elf_hash_table (info)->tls_sec->alignment_power))
1029 #define PLT_HEADER_SIZE 32
1030 #define PLT_HEADER_WORD1 (bfd_vma) 0xc3600000 /* br $27,.+4 */
1031 #define PLT_HEADER_WORD2 (bfd_vma) 0xa77b000c /* ldq $27,12($27) */
1032 #define PLT_HEADER_WORD3 (bfd_vma) 0x47ff041f /* nop */
1033 #define PLT_HEADER_WORD4 (bfd_vma) 0x6b7b0000 /* jmp $27,($27) */
1035 #define PLT_ENTRY_SIZE 12
1036 #define PLT_ENTRY_WORD1 0xc3800000 /* br $28, plt0 */
1037 #define PLT_ENTRY_WORD2 0
1038 #define PLT_ENTRY_WORD3 0
1040 #define MAX_GOT_SIZE (64*1024)
1042 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so"
1044 /* Handle an Alpha specific section when reading an object file. This
1045 is called when bfd_section_from_shdr finds a section with an unknown
1047 FIXME: We need to handle the SHF_ALPHA_GPREL flag, but I'm not sure
1051 elf64_alpha_section_from_shdr (bfd
*abfd
,
1052 Elf_Internal_Shdr
*hdr
,
1058 /* There ought to be a place to keep ELF backend specific flags, but
1059 at the moment there isn't one. We just keep track of the
1060 sections by their name, instead. Fortunately, the ABI gives
1061 suggested names for all the MIPS specific sections, so we will
1062 probably get away with this. */
1063 switch (hdr
->sh_type
)
1065 case SHT_ALPHA_DEBUG
:
1066 if (strcmp (name
, ".mdebug") != 0)
1073 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
, shindex
))
1075 newsect
= hdr
->bfd_section
;
1077 if (hdr
->sh_type
== SHT_ALPHA_DEBUG
)
1079 if (! bfd_set_section_flags (abfd
, newsect
,
1080 (bfd_get_section_flags (abfd
, newsect
)
1088 /* Convert Alpha specific section flags to bfd internal section flags. */
1091 elf64_alpha_section_flags (flagword
*flags
, const Elf_Internal_Shdr
*hdr
)
1093 if (hdr
->sh_flags
& SHF_ALPHA_GPREL
)
1094 *flags
|= SEC_SMALL_DATA
;
1099 /* Set the correct type for an Alpha ELF section. We do this by the
1100 section name, which is a hack, but ought to work. */
1103 elf64_alpha_fake_sections (bfd
*abfd
, Elf_Internal_Shdr
*hdr
, asection
*sec
)
1105 register const char *name
;
1107 name
= bfd_get_section_name (abfd
, sec
);
1109 if (strcmp (name
, ".mdebug") == 0)
1111 hdr
->sh_type
= SHT_ALPHA_DEBUG
;
1112 /* In a shared object on Irix 5.3, the .mdebug section has an
1113 entsize of 0. FIXME: Does this matter? */
1114 if ((abfd
->flags
& DYNAMIC
) != 0 )
1115 hdr
->sh_entsize
= 0;
1117 hdr
->sh_entsize
= 1;
1119 else if ((sec
->flags
& SEC_SMALL_DATA
)
1120 || strcmp (name
, ".sdata") == 0
1121 || strcmp (name
, ".sbss") == 0
1122 || strcmp (name
, ".lit4") == 0
1123 || strcmp (name
, ".lit8") == 0)
1124 hdr
->sh_flags
|= SHF_ALPHA_GPREL
;
1129 /* Hook called by the linker routine which adds symbols from an object
1130 file. We use it to put .comm items in .sbss, and not .bss. */
1133 elf64_alpha_add_symbol_hook (bfd
*abfd
, struct bfd_link_info
*info
,
1134 Elf_Internal_Sym
*sym
,
1135 const char **namep ATTRIBUTE_UNUSED
,
1136 flagword
*flagsp ATTRIBUTE_UNUSED
,
1137 asection
**secp
, bfd_vma
*valp
)
1139 if (sym
->st_shndx
== SHN_COMMON
1140 && !info
->relocatable
1141 && sym
->st_size
<= elf_gp_size (abfd
))
1143 /* Common symbols less than or equal to -G nn bytes are
1144 automatically put into .sbss. */
1146 asection
*scomm
= bfd_get_section_by_name (abfd
, ".scommon");
1150 scomm
= bfd_make_section_with_flags (abfd
, ".scommon",
1153 | SEC_LINKER_CREATED
));
1159 *valp
= sym
->st_size
;
1165 /* Create the .got section. */
1168 elf64_alpha_create_got_section (bfd
*abfd
,
1169 struct bfd_link_info
*info ATTRIBUTE_UNUSED
)
1173 if ((s
= bfd_get_section_by_name (abfd
, ".got")))
1175 /* Check for a non-linker created .got? */
1176 if (alpha_elf_tdata (abfd
)->got
== NULL
)
1177 alpha_elf_tdata (abfd
)->got
= s
;
1181 s
= bfd_make_section_with_flags (abfd
, ".got", (SEC_ALLOC
| SEC_LOAD
1184 | SEC_LINKER_CREATED
));
1186 || !bfd_set_section_alignment (abfd
, s
, 3))
1189 alpha_elf_tdata (abfd
)->got
= s
;
1194 /* Create all the dynamic sections. */
1197 elf64_alpha_create_dynamic_sections (bfd
*abfd
, struct bfd_link_info
*info
)
1200 struct elf_link_hash_entry
*h
;
1201 struct bfd_link_hash_entry
*bh
;
1203 /* We need to create .plt, .rela.plt, .got, and .rela.got sections. */
1205 s
= bfd_make_section_with_flags (abfd
, ".plt",
1206 (SEC_ALLOC
| SEC_LOAD
1209 | SEC_LINKER_CREATED
1212 || ! bfd_set_section_alignment (abfd
, s
, 3))
1215 /* Define the symbol _PROCEDURE_LINKAGE_TABLE_ at the start of the
1218 if (! (_bfd_generic_link_add_one_symbol
1219 (info
, abfd
, "_PROCEDURE_LINKAGE_TABLE_", BSF_GLOBAL
, s
,
1220 (bfd_vma
) 0, (const char *) NULL
, FALSE
,
1221 get_elf_backend_data (abfd
)->collect
, &bh
)))
1223 h
= (struct elf_link_hash_entry
*) bh
;
1225 h
->type
= STT_OBJECT
;
1228 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
1231 s
= bfd_make_section_with_flags (abfd
, ".rela.plt",
1232 (SEC_ALLOC
| SEC_LOAD
1235 | SEC_LINKER_CREATED
1238 || ! bfd_set_section_alignment (abfd
, s
, 3))
1241 /* We may or may not have created a .got section for this object, but
1242 we definitely havn't done the rest of the work. */
1244 if (!elf64_alpha_create_got_section (abfd
, info
))
1247 s
= bfd_make_section_with_flags (abfd
, ".rela.got",
1248 (SEC_ALLOC
| SEC_LOAD
1251 | SEC_LINKER_CREATED
1254 || !bfd_set_section_alignment (abfd
, s
, 3))
1257 /* Define the symbol _GLOBAL_OFFSET_TABLE_ at the start of the
1258 dynobj's .got section. We don't do this in the linker script
1259 because we don't want to define the symbol if we are not creating
1260 a global offset table. */
1262 if (!(_bfd_generic_link_add_one_symbol
1263 (info
, abfd
, "_GLOBAL_OFFSET_TABLE_", BSF_GLOBAL
,
1264 alpha_elf_tdata(abfd
)->got
, (bfd_vma
) 0, (const char *) NULL
,
1265 FALSE
, get_elf_backend_data (abfd
)->collect
, &bh
)))
1267 h
= (struct elf_link_hash_entry
*) bh
;
1269 h
->type
= STT_OBJECT
;
1272 && ! bfd_elf_link_record_dynamic_symbol (info
, h
))
1275 elf_hash_table (info
)->hgot
= h
;
1280 /* Read ECOFF debugging information from a .mdebug section into a
1281 ecoff_debug_info structure. */
1284 elf64_alpha_read_ecoff_info (bfd
*abfd
, asection
*section
,
1285 struct ecoff_debug_info
*debug
)
1288 const struct ecoff_debug_swap
*swap
;
1289 char *ext_hdr
= NULL
;
1291 swap
= get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
1292 memset (debug
, 0, sizeof (*debug
));
1294 ext_hdr
= (char *) bfd_malloc (swap
->external_hdr_size
);
1295 if (ext_hdr
== NULL
&& swap
->external_hdr_size
!= 0)
1298 if (! bfd_get_section_contents (abfd
, section
, ext_hdr
, (file_ptr
) 0,
1299 swap
->external_hdr_size
))
1302 symhdr
= &debug
->symbolic_header
;
1303 (*swap
->swap_hdr_in
) (abfd
, ext_hdr
, symhdr
);
1305 /* The symbolic header contains absolute file offsets and sizes to
1307 #define READ(ptr, offset, count, size, type) \
1308 if (symhdr->count == 0) \
1309 debug->ptr = NULL; \
1312 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
1313 debug->ptr = (type) bfd_malloc (amt); \
1314 if (debug->ptr == NULL) \
1315 goto error_return; \
1316 if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
1317 || bfd_bread (debug->ptr, amt, abfd) != amt) \
1318 goto error_return; \
1321 READ (line
, cbLineOffset
, cbLine
, sizeof (unsigned char), unsigned char *);
1322 READ (external_dnr
, cbDnOffset
, idnMax
, swap
->external_dnr_size
, PTR
);
1323 READ (external_pdr
, cbPdOffset
, ipdMax
, swap
->external_pdr_size
, PTR
);
1324 READ (external_sym
, cbSymOffset
, isymMax
, swap
->external_sym_size
, PTR
);
1325 READ (external_opt
, cbOptOffset
, ioptMax
, swap
->external_opt_size
, PTR
);
1326 READ (external_aux
, cbAuxOffset
, iauxMax
, sizeof (union aux_ext
),
1328 READ (ss
, cbSsOffset
, issMax
, sizeof (char), char *);
1329 READ (ssext
, cbSsExtOffset
, issExtMax
, sizeof (char), char *);
1330 READ (external_fdr
, cbFdOffset
, ifdMax
, swap
->external_fdr_size
, PTR
);
1331 READ (external_rfd
, cbRfdOffset
, crfd
, swap
->external_rfd_size
, PTR
);
1332 READ (external_ext
, cbExtOffset
, iextMax
, swap
->external_ext_size
, PTR
);
1340 if (ext_hdr
!= NULL
)
1342 if (debug
->line
!= NULL
)
1344 if (debug
->external_dnr
!= NULL
)
1345 free (debug
->external_dnr
);
1346 if (debug
->external_pdr
!= NULL
)
1347 free (debug
->external_pdr
);
1348 if (debug
->external_sym
!= NULL
)
1349 free (debug
->external_sym
);
1350 if (debug
->external_opt
!= NULL
)
1351 free (debug
->external_opt
);
1352 if (debug
->external_aux
!= NULL
)
1353 free (debug
->external_aux
);
1354 if (debug
->ss
!= NULL
)
1356 if (debug
->ssext
!= NULL
)
1357 free (debug
->ssext
);
1358 if (debug
->external_fdr
!= NULL
)
1359 free (debug
->external_fdr
);
1360 if (debug
->external_rfd
!= NULL
)
1361 free (debug
->external_rfd
);
1362 if (debug
->external_ext
!= NULL
)
1363 free (debug
->external_ext
);
1367 /* Alpha ELF local labels start with '$'. */
1370 elf64_alpha_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
, const char *name
)
1372 return name
[0] == '$';
1375 /* Alpha ELF follows MIPS ELF in using a special find_nearest_line
1376 routine in order to handle the ECOFF debugging information. We
1377 still call this mips_elf_find_line because of the slot
1378 find_line_info in elf_obj_tdata is declared that way. */
1380 struct mips_elf_find_line
1382 struct ecoff_debug_info d
;
1383 struct ecoff_find_line i
;
1387 elf64_alpha_find_nearest_line (bfd
*abfd
, asection
*section
, asymbol
**symbols
,
1388 bfd_vma offset
, const char **filename_ptr
,
1389 const char **functionname_ptr
,
1390 unsigned int *line_ptr
)
1394 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
1395 filename_ptr
, functionname_ptr
,
1397 &elf_tdata (abfd
)->dwarf2_find_line_info
))
1400 msec
= bfd_get_section_by_name (abfd
, ".mdebug");
1404 struct mips_elf_find_line
*fi
;
1405 const struct ecoff_debug_swap
* const swap
=
1406 get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
1408 /* If we are called during a link, alpha_elf_final_link may have
1409 cleared the SEC_HAS_CONTENTS field. We force it back on here
1410 if appropriate (which it normally will be). */
1411 origflags
= msec
->flags
;
1412 if (elf_section_data (msec
)->this_hdr
.sh_type
!= SHT_NOBITS
)
1413 msec
->flags
|= SEC_HAS_CONTENTS
;
1415 fi
= elf_tdata (abfd
)->find_line_info
;
1418 bfd_size_type external_fdr_size
;
1421 struct fdr
*fdr_ptr
;
1422 bfd_size_type amt
= sizeof (struct mips_elf_find_line
);
1424 fi
= (struct mips_elf_find_line
*) bfd_zalloc (abfd
, amt
);
1427 msec
->flags
= origflags
;
1431 if (!elf64_alpha_read_ecoff_info (abfd
, msec
, &fi
->d
))
1433 msec
->flags
= origflags
;
1437 /* Swap in the FDR information. */
1438 amt
= fi
->d
.symbolic_header
.ifdMax
* sizeof (struct fdr
);
1439 fi
->d
.fdr
= (struct fdr
*) bfd_alloc (abfd
, amt
);
1440 if (fi
->d
.fdr
== NULL
)
1442 msec
->flags
= origflags
;
1445 external_fdr_size
= swap
->external_fdr_size
;
1446 fdr_ptr
= fi
->d
.fdr
;
1447 fraw_src
= (char *) fi
->d
.external_fdr
;
1448 fraw_end
= (fraw_src
1449 + fi
->d
.symbolic_header
.ifdMax
* external_fdr_size
);
1450 for (; fraw_src
< fraw_end
; fraw_src
+= external_fdr_size
, fdr_ptr
++)
1451 (*swap
->swap_fdr_in
) (abfd
, (PTR
) fraw_src
, fdr_ptr
);
1453 elf_tdata (abfd
)->find_line_info
= fi
;
1455 /* Note that we don't bother to ever free this information.
1456 find_nearest_line is either called all the time, as in
1457 objdump -l, so the information should be saved, or it is
1458 rarely called, as in ld error messages, so the memory
1459 wasted is unimportant. Still, it would probably be a
1460 good idea for free_cached_info to throw it away. */
1463 if (_bfd_ecoff_locate_line (abfd
, section
, offset
, &fi
->d
, swap
,
1464 &fi
->i
, filename_ptr
, functionname_ptr
,
1467 msec
->flags
= origflags
;
1471 msec
->flags
= origflags
;
1474 /* Fall back on the generic ELF find_nearest_line routine. */
1476 return _bfd_elf_find_nearest_line (abfd
, section
, symbols
, offset
,
1477 filename_ptr
, functionname_ptr
,
1481 /* Structure used to pass information to alpha_elf_output_extsym. */
1486 struct bfd_link_info
*info
;
1487 struct ecoff_debug_info
*debug
;
1488 const struct ecoff_debug_swap
*swap
;
1493 elf64_alpha_output_extsym (struct alpha_elf_link_hash_entry
*h
, PTR data
)
1495 struct extsym_info
*einfo
= (struct extsym_info
*) data
;
1497 asection
*sec
, *output_section
;
1499 if (h
->root
.root
.type
== bfd_link_hash_warning
)
1500 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
1502 if (h
->root
.indx
== -2)
1504 else if ((h
->root
.def_dynamic
1505 || h
->root
.ref_dynamic
1506 || h
->root
.root
.type
== bfd_link_hash_new
)
1507 && !h
->root
.def_regular
1508 && !h
->root
.ref_regular
)
1510 else if (einfo
->info
->strip
== strip_all
1511 || (einfo
->info
->strip
== strip_some
1512 && bfd_hash_lookup (einfo
->info
->keep_hash
,
1513 h
->root
.root
.root
.string
,
1514 FALSE
, FALSE
) == NULL
))
1522 if (h
->esym
.ifd
== -2)
1525 h
->esym
.cobol_main
= 0;
1526 h
->esym
.weakext
= 0;
1527 h
->esym
.reserved
= 0;
1528 h
->esym
.ifd
= ifdNil
;
1529 h
->esym
.asym
.value
= 0;
1530 h
->esym
.asym
.st
= stGlobal
;
1532 if (h
->root
.root
.type
!= bfd_link_hash_defined
1533 && h
->root
.root
.type
!= bfd_link_hash_defweak
)
1534 h
->esym
.asym
.sc
= scAbs
;
1539 sec
= h
->root
.root
.u
.def
.section
;
1540 output_section
= sec
->output_section
;
1542 /* When making a shared library and symbol h is the one from
1543 the another shared library, OUTPUT_SECTION may be null. */
1544 if (output_section
== NULL
)
1545 h
->esym
.asym
.sc
= scUndefined
;
1548 name
= bfd_section_name (output_section
->owner
, output_section
);
1550 if (strcmp (name
, ".text") == 0)
1551 h
->esym
.asym
.sc
= scText
;
1552 else if (strcmp (name
, ".data") == 0)
1553 h
->esym
.asym
.sc
= scData
;
1554 else if (strcmp (name
, ".sdata") == 0)
1555 h
->esym
.asym
.sc
= scSData
;
1556 else if (strcmp (name
, ".rodata") == 0
1557 || strcmp (name
, ".rdata") == 0)
1558 h
->esym
.asym
.sc
= scRData
;
1559 else if (strcmp (name
, ".bss") == 0)
1560 h
->esym
.asym
.sc
= scBss
;
1561 else if (strcmp (name
, ".sbss") == 0)
1562 h
->esym
.asym
.sc
= scSBss
;
1563 else if (strcmp (name
, ".init") == 0)
1564 h
->esym
.asym
.sc
= scInit
;
1565 else if (strcmp (name
, ".fini") == 0)
1566 h
->esym
.asym
.sc
= scFini
;
1568 h
->esym
.asym
.sc
= scAbs
;
1572 h
->esym
.asym
.reserved
= 0;
1573 h
->esym
.asym
.index
= indexNil
;
1576 if (h
->root
.root
.type
== bfd_link_hash_common
)
1577 h
->esym
.asym
.value
= h
->root
.root
.u
.c
.size
;
1578 else if (h
->root
.root
.type
== bfd_link_hash_defined
1579 || h
->root
.root
.type
== bfd_link_hash_defweak
)
1581 if (h
->esym
.asym
.sc
== scCommon
)
1582 h
->esym
.asym
.sc
= scBss
;
1583 else if (h
->esym
.asym
.sc
== scSCommon
)
1584 h
->esym
.asym
.sc
= scSBss
;
1586 sec
= h
->root
.root
.u
.def
.section
;
1587 output_section
= sec
->output_section
;
1588 if (output_section
!= NULL
)
1589 h
->esym
.asym
.value
= (h
->root
.root
.u
.def
.value
1590 + sec
->output_offset
1591 + output_section
->vma
);
1593 h
->esym
.asym
.value
= 0;
1595 else if (h
->root
.needs_plt
)
1597 /* Set type and value for a symbol with a function stub. */
1598 h
->esym
.asym
.st
= stProc
;
1599 sec
= bfd_get_section_by_name (einfo
->abfd
, ".plt");
1601 h
->esym
.asym
.value
= 0;
1604 output_section
= sec
->output_section
;
1605 if (output_section
!= NULL
)
1606 h
->esym
.asym
.value
= (h
->root
.plt
.offset
1607 + sec
->output_offset
1608 + output_section
->vma
);
1610 h
->esym
.asym
.value
= 0;
1614 if (! bfd_ecoff_debug_one_external (einfo
->abfd
, einfo
->debug
, einfo
->swap
,
1615 h
->root
.root
.root
.string
,
1618 einfo
->failed
= TRUE
;
1625 /* Search for and possibly create a got entry. */
1627 static struct alpha_elf_got_entry
*
1628 get_got_entry (bfd
*abfd
, struct alpha_elf_link_hash_entry
*h
,
1629 unsigned long r_type
, unsigned long r_symndx
,
1632 struct alpha_elf_got_entry
*gotent
;
1633 struct alpha_elf_got_entry
**slot
;
1636 slot
= &h
->got_entries
;
1639 /* This is a local .got entry -- record for merge. */
1641 struct alpha_elf_got_entry
**local_got_entries
;
1643 local_got_entries
= alpha_elf_tdata(abfd
)->local_got_entries
;
1644 if (!local_got_entries
)
1647 Elf_Internal_Shdr
*symtab_hdr
;
1649 symtab_hdr
= &elf_tdata(abfd
)->symtab_hdr
;
1650 size
= symtab_hdr
->sh_info
;
1651 size
*= sizeof (struct alpha_elf_got_entry
*);
1654 = (struct alpha_elf_got_entry
**) bfd_zalloc (abfd
, size
);
1655 if (!local_got_entries
)
1658 alpha_elf_tdata (abfd
)->local_got_entries
= local_got_entries
;
1661 slot
= &local_got_entries
[r_symndx
];
1664 for (gotent
= *slot
; gotent
; gotent
= gotent
->next
)
1665 if (gotent
->gotobj
== abfd
1666 && gotent
->reloc_type
== r_type
1667 && gotent
->addend
== r_addend
)
1675 amt
= sizeof (struct alpha_elf_got_entry
);
1676 gotent
= (struct alpha_elf_got_entry
*) bfd_alloc (abfd
, amt
);
1680 gotent
->gotobj
= abfd
;
1681 gotent
->addend
= r_addend
;
1682 gotent
->got_offset
= -1;
1683 gotent
->use_count
= 1;
1684 gotent
->reloc_type
= r_type
;
1685 gotent
->reloc_done
= 0;
1686 gotent
->reloc_xlated
= 0;
1688 gotent
->next
= *slot
;
1691 entry_size
= alpha_got_entry_size (r_type
);
1692 alpha_elf_tdata (abfd
)->total_got_size
+= entry_size
;
1694 alpha_elf_tdata(abfd
)->local_got_size
+= entry_size
;
1697 gotent
->use_count
+= 1;
1702 /* Handle dynamic relocations when doing an Alpha ELF link. */
1705 elf64_alpha_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
1706 asection
*sec
, const Elf_Internal_Rela
*relocs
)
1710 const char *rel_sec_name
;
1711 Elf_Internal_Shdr
*symtab_hdr
;
1712 struct alpha_elf_link_hash_entry
**sym_hashes
;
1713 const Elf_Internal_Rela
*rel
, *relend
;
1714 bfd_boolean got_created
;
1717 if (info
->relocatable
)
1720 /* Don't do anything special with non-loaded, non-alloced sections.
1721 In particular, any relocs in such sections should not affect GOT
1722 and PLT reference counting (ie. we don't allow them to create GOT
1723 or PLT entries), there's no possibility or desire to optimize TLS
1724 relocs, and there's not much point in propagating relocs to shared
1725 libs that the dynamic linker won't relocate. */
1726 if ((sec
->flags
& SEC_ALLOC
) == 0)
1729 dynobj
= elf_hash_table(info
)->dynobj
;
1731 elf_hash_table(info
)->dynobj
= dynobj
= abfd
;
1734 rel_sec_name
= NULL
;
1735 symtab_hdr
= &elf_tdata(abfd
)->symtab_hdr
;
1736 sym_hashes
= alpha_elf_sym_hashes(abfd
);
1737 got_created
= FALSE
;
1739 relend
= relocs
+ sec
->reloc_count
;
1740 for (rel
= relocs
; rel
< relend
; ++rel
)
1748 unsigned long r_symndx
, r_type
;
1749 struct alpha_elf_link_hash_entry
*h
;
1750 unsigned int gotent_flags
;
1751 bfd_boolean maybe_dynamic
;
1755 r_symndx
= ELF64_R_SYM (rel
->r_info
);
1756 if (r_symndx
< symtab_hdr
->sh_info
)
1760 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1762 while (h
->root
.root
.type
== bfd_link_hash_indirect
1763 || h
->root
.root
.type
== bfd_link_hash_warning
)
1764 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
1766 h
->root
.ref_regular
= 1;
1769 /* We can only get preliminary data on whether a symbol is
1770 locally or externally defined, as not all of the input files
1771 have yet been processed. Do something with what we know, as
1772 this may help reduce memory usage and processing time later. */
1773 maybe_dynamic
= FALSE
;
1774 if (h
&& ((info
->shared
1776 || info
->unresolved_syms_in_shared_libs
== RM_IGNORE
))
1777 || !h
->root
.def_regular
1778 || h
->root
.root
.type
== bfd_link_hash_defweak
))
1779 maybe_dynamic
= TRUE
;
1783 r_type
= ELF64_R_TYPE (rel
->r_info
);
1784 addend
= rel
->r_addend
;
1788 case R_ALPHA_LITERAL
:
1789 need
= NEED_GOT
| NEED_GOT_ENTRY
;
1791 /* Remember how this literal is used from its LITUSEs.
1792 This will be important when it comes to decide if we can
1793 create a .plt entry for a function symbol. */
1794 while (++rel
< relend
&& ELF64_R_TYPE (rel
->r_info
) == R_ALPHA_LITUSE
)
1795 if (rel
->r_addend
>= 1 && rel
->r_addend
<= 5)
1796 gotent_flags
|= 1 << rel
->r_addend
;
1799 /* No LITUSEs -- presumably the address is used somehow. */
1800 if (gotent_flags
== 0)
1801 gotent_flags
= ALPHA_ELF_LINK_HASH_LU_ADDR
;
1804 case R_ALPHA_GPDISP
:
1805 case R_ALPHA_GPREL16
:
1806 case R_ALPHA_GPREL32
:
1807 case R_ALPHA_GPRELHIGH
:
1808 case R_ALPHA_GPRELLOW
:
1813 case R_ALPHA_REFLONG
:
1814 case R_ALPHA_REFQUAD
:
1815 if (info
->shared
|| maybe_dynamic
)
1819 case R_ALPHA_TLSLDM
:
1820 /* The symbol for a TLSLDM reloc is ignored. Collapse the
1821 reloc to the 0 symbol so that they all match. */
1824 maybe_dynamic
= FALSE
;
1828 case R_ALPHA_GOTDTPREL
:
1829 need
= NEED_GOT
| NEED_GOT_ENTRY
;
1832 case R_ALPHA_GOTTPREL
:
1833 need
= NEED_GOT
| NEED_GOT_ENTRY
;
1834 gotent_flags
= ALPHA_ELF_LINK_HASH_TLS_IE
;
1836 info
->flags
|= DF_STATIC_TLS
;
1839 case R_ALPHA_TPREL64
:
1840 if (info
->shared
|| maybe_dynamic
)
1843 info
->flags
|= DF_STATIC_TLS
;
1847 if (need
& NEED_GOT
)
1851 if (!elf64_alpha_create_got_section (abfd
, info
))
1854 /* Make sure the object's gotobj is set to itself so
1855 that we default to every object with its own .got.
1856 We'll merge .gots later once we've collected each
1858 alpha_elf_tdata(abfd
)->gotobj
= abfd
;
1864 if (need
& NEED_GOT_ENTRY
)
1866 struct alpha_elf_got_entry
*gotent
;
1868 gotent
= get_got_entry (abfd
, h
, r_type
, r_symndx
, addend
);
1874 gotent
->flags
|= gotent_flags
;
1877 gotent_flags
|= h
->flags
;
1878 h
->flags
= gotent_flags
;
1880 /* Make a guess as to whether a .plt entry is needed. */
1881 if ((gotent_flags
& ALPHA_ELF_LINK_HASH_LU_FUNC
)
1882 && !(gotent_flags
& ~ALPHA_ELF_LINK_HASH_LU_FUNC
))
1883 h
->root
.needs_plt
= 1;
1885 h
->root
.needs_plt
= 0;
1890 if (need
& NEED_DYNREL
)
1892 if (rel_sec_name
== NULL
)
1894 rel_sec_name
= (bfd_elf_string_from_elf_section
1895 (abfd
, elf_elfheader(abfd
)->e_shstrndx
,
1896 elf_section_data(sec
)->rel_hdr
.sh_name
));
1897 if (rel_sec_name
== NULL
)
1900 BFD_ASSERT (strncmp (rel_sec_name
, ".rela", 5) == 0
1901 && strcmp (bfd_get_section_name (abfd
, sec
),
1902 rel_sec_name
+5) == 0);
1905 /* We need to create the section here now whether we eventually
1906 use it or not so that it gets mapped to an output section by
1907 the linker. If not used, we'll kill it in
1908 size_dynamic_sections. */
1911 sreloc
= bfd_get_section_by_name (dynobj
, rel_sec_name
);
1916 flags
= (SEC_HAS_CONTENTS
| SEC_IN_MEMORY
1917 | SEC_LINKER_CREATED
| SEC_READONLY
);
1918 if (sec
->flags
& SEC_ALLOC
)
1919 flags
|= SEC_ALLOC
| SEC_LOAD
;
1920 sreloc
= bfd_make_section_with_flags (dynobj
,
1924 || !bfd_set_section_alignment (dynobj
, sreloc
, 3))
1931 /* Since we havn't seen all of the input symbols yet, we
1932 don't know whether we'll actually need a dynamic relocation
1933 entry for this reloc. So make a record of it. Once we
1934 find out if this thing needs dynamic relocation we'll
1935 expand the relocation sections by the appropriate amount. */
1937 struct alpha_elf_reloc_entry
*rent
;
1939 for (rent
= h
->reloc_entries
; rent
; rent
= rent
->next
)
1940 if (rent
->rtype
== r_type
&& rent
->srel
== sreloc
)
1945 amt
= sizeof (struct alpha_elf_reloc_entry
);
1946 rent
= (struct alpha_elf_reloc_entry
*) bfd_alloc (abfd
, amt
);
1950 rent
->srel
= sreloc
;
1951 rent
->rtype
= r_type
;
1953 rent
->reltext
= (sec
->flags
& SEC_READONLY
) != 0;
1955 rent
->next
= h
->reloc_entries
;
1956 h
->reloc_entries
= rent
;
1961 else if (info
->shared
)
1963 /* If this is a shared library, and the section is to be
1964 loaded into memory, we need a RELATIVE reloc. */
1965 sreloc
->size
+= sizeof (Elf64_External_Rela
);
1966 if (sec
->flags
& SEC_READONLY
)
1967 info
->flags
|= DF_TEXTREL
;
1975 /* Adjust a symbol defined by a dynamic object and referenced by a
1976 regular object. The current definition is in some section of the
1977 dynamic object, but we're not including those sections. We have to
1978 change the definition to something the rest of the link can
1982 elf64_alpha_adjust_dynamic_symbol (struct bfd_link_info
*info
,
1983 struct elf_link_hash_entry
*h
)
1987 struct alpha_elf_link_hash_entry
*ah
;
1989 dynobj
= elf_hash_table(info
)->dynobj
;
1990 ah
= (struct alpha_elf_link_hash_entry
*)h
;
1992 /* Now that we've seen all of the input symbols, finalize our decision
1993 about whether this symbol should get a .plt entry. */
1995 if (alpha_elf_dynamic_symbol_p (h
, info
)
1996 && ((h
->type
== STT_FUNC
1997 && !(ah
->flags
& ALPHA_ELF_LINK_HASH_LU_ADDR
))
1998 || (h
->type
== STT_NOTYPE
1999 && (ah
->flags
& ALPHA_ELF_LINK_HASH_LU_FUNC
)
2000 && !(ah
->flags
& ~ALPHA_ELF_LINK_HASH_LU_FUNC
)))
2001 /* Don't prevent otherwise valid programs from linking by attempting
2002 to create a new .got entry somewhere. A Correct Solution would be
2003 to add a new .got section to a new object file and let it be merged
2004 somewhere later. But for now don't bother. */
2009 s
= bfd_get_section_by_name(dynobj
, ".plt");
2010 if (!s
&& !elf64_alpha_create_dynamic_sections (dynobj
, info
))
2013 /* The first bit of the .plt is reserved. */
2015 s
->size
= PLT_HEADER_SIZE
;
2017 h
->plt
.offset
= s
->size
;
2018 s
->size
+= PLT_ENTRY_SIZE
;
2020 /* If this symbol is not defined in a regular file, and we are not
2021 generating a shared library, then set the symbol to the location
2022 in the .plt. This is required to make function pointers compare
2023 equal between the normal executable and the shared library. */
2025 && h
->root
.type
!= bfd_link_hash_defweak
)
2027 ah
->plt_old_section
= h
->root
.u
.def
.section
;
2028 ah
->plt_old_value
= h
->root
.u
.def
.value
;
2029 ah
->flags
|= ALPHA_ELF_LINK_HASH_PLT_LOC
;
2030 h
->root
.u
.def
.section
= s
;
2031 h
->root
.u
.def
.value
= h
->plt
.offset
;
2034 /* We also need a JMP_SLOT entry in the .rela.plt section. */
2035 s
= bfd_get_section_by_name (dynobj
, ".rela.plt");
2036 BFD_ASSERT (s
!= NULL
);
2037 s
->size
+= sizeof (Elf64_External_Rela
);
2044 /* If this is a weak symbol, and there is a real definition, the
2045 processor independent code will have arranged for us to see the
2046 real definition first, and we can just use the same value. */
2047 if (h
->u
.weakdef
!= NULL
)
2049 BFD_ASSERT (h
->u
.weakdef
->root
.type
== bfd_link_hash_defined
2050 || h
->u
.weakdef
->root
.type
== bfd_link_hash_defweak
);
2051 h
->root
.u
.def
.section
= h
->u
.weakdef
->root
.u
.def
.section
;
2052 h
->root
.u
.def
.value
= h
->u
.weakdef
->root
.u
.def
.value
;
2056 /* This is a reference to a symbol defined by a dynamic object which
2057 is not a function. The Alpha, since it uses .got entries for all
2058 symbols even in regular objects, does not need the hackery of a
2059 .dynbss section and COPY dynamic relocations. */
2064 /* Symbol versioning can create new symbols, and make our old symbols
2065 indirect to the new ones. Consolidate the got and reloc information
2066 in these situations. */
2069 elf64_alpha_merge_ind_symbols (struct alpha_elf_link_hash_entry
*hi
,
2070 PTR dummy ATTRIBUTE_UNUSED
)
2072 struct alpha_elf_link_hash_entry
*hs
;
2074 if (hi
->root
.root
.type
!= bfd_link_hash_indirect
)
2078 hs
= (struct alpha_elf_link_hash_entry
*)hs
->root
.root
.u
.i
.link
;
2079 } while (hs
->root
.root
.type
== bfd_link_hash_indirect
);
2081 /* Merge the flags. Whee. */
2083 hs
->flags
|= hi
->flags
;
2085 /* Merge the .got entries. Cannibalize the old symbol's list in
2086 doing so, since we don't need it anymore. */
2088 if (hs
->got_entries
== NULL
)
2089 hs
->got_entries
= hi
->got_entries
;
2092 struct alpha_elf_got_entry
*gi
, *gs
, *gin
, *gsh
;
2094 gsh
= hs
->got_entries
;
2095 for (gi
= hi
->got_entries
; gi
; gi
= gin
)
2098 for (gs
= gsh
; gs
; gs
= gs
->next
)
2099 if (gi
->gotobj
== gs
->gotobj
2100 && gi
->reloc_type
== gs
->reloc_type
2101 && gi
->addend
== gs
->addend
)
2103 gi
->use_count
+= gs
->use_count
;
2106 gi
->next
= hs
->got_entries
;
2107 hs
->got_entries
= gi
;
2111 hi
->got_entries
= NULL
;
2113 /* And similar for the reloc entries. */
2115 if (hs
->reloc_entries
== NULL
)
2116 hs
->reloc_entries
= hi
->reloc_entries
;
2119 struct alpha_elf_reloc_entry
*ri
, *rs
, *rin
, *rsh
;
2121 rsh
= hs
->reloc_entries
;
2122 for (ri
= hi
->reloc_entries
; ri
; ri
= rin
)
2125 for (rs
= rsh
; rs
; rs
= rs
->next
)
2126 if (ri
->rtype
== rs
->rtype
&& ri
->srel
== rs
->srel
)
2128 rs
->count
+= ri
->count
;
2131 ri
->next
= hs
->reloc_entries
;
2132 hs
->reloc_entries
= ri
;
2136 hi
->reloc_entries
= NULL
;
2141 /* Is it possible to merge two object file's .got tables? */
2144 elf64_alpha_can_merge_gots (bfd
*a
, bfd
*b
)
2146 int total
= alpha_elf_tdata (a
)->total_got_size
;
2149 /* Trivial quick fallout test. */
2150 if (total
+ alpha_elf_tdata (b
)->total_got_size
<= MAX_GOT_SIZE
)
2153 /* By their nature, local .got entries cannot be merged. */
2154 if ((total
+= alpha_elf_tdata (b
)->local_got_size
) > MAX_GOT_SIZE
)
2157 /* Failing the common trivial comparison, we must effectively
2158 perform the merge. Not actually performing the merge means that
2159 we don't have to store undo information in case we fail. */
2160 for (bsub
= b
; bsub
; bsub
= alpha_elf_tdata (bsub
)->in_got_link_next
)
2162 struct alpha_elf_link_hash_entry
**hashes
= alpha_elf_sym_hashes (bsub
);
2163 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (bsub
)->symtab_hdr
;
2166 n
= NUM_SHDR_ENTRIES (symtab_hdr
) - symtab_hdr
->sh_info
;
2167 for (i
= 0; i
< n
; ++i
)
2169 struct alpha_elf_got_entry
*ae
, *be
;
2170 struct alpha_elf_link_hash_entry
*h
;
2173 while (h
->root
.root
.type
== bfd_link_hash_indirect
2174 || h
->root
.root
.type
== bfd_link_hash_warning
)
2175 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
2177 for (be
= h
->got_entries
; be
; be
= be
->next
)
2179 if (be
->use_count
== 0)
2181 if (be
->gotobj
!= b
)
2184 for (ae
= h
->got_entries
; ae
; ae
= ae
->next
)
2186 && ae
->reloc_type
== be
->reloc_type
2187 && ae
->addend
== be
->addend
)
2190 total
+= alpha_got_entry_size (be
->reloc_type
);
2191 if (total
> MAX_GOT_SIZE
)
2201 /* Actually merge two .got tables. */
2204 elf64_alpha_merge_gots (bfd
*a
, bfd
*b
)
2206 int total
= alpha_elf_tdata (a
)->total_got_size
;
2209 /* Remember local expansion. */
2211 int e
= alpha_elf_tdata (b
)->local_got_size
;
2213 alpha_elf_tdata (a
)->local_got_size
+= e
;
2216 for (bsub
= b
; bsub
; bsub
= alpha_elf_tdata (bsub
)->in_got_link_next
)
2218 struct alpha_elf_got_entry
**local_got_entries
;
2219 struct alpha_elf_link_hash_entry
**hashes
;
2220 Elf_Internal_Shdr
*symtab_hdr
;
2223 /* Let the local .got entries know they are part of a new subsegment. */
2224 local_got_entries
= alpha_elf_tdata (bsub
)->local_got_entries
;
2225 if (local_got_entries
)
2227 n
= elf_tdata (bsub
)->symtab_hdr
.sh_info
;
2228 for (i
= 0; i
< n
; ++i
)
2230 struct alpha_elf_got_entry
*ent
;
2231 for (ent
= local_got_entries
[i
]; ent
; ent
= ent
->next
)
2236 /* Merge the global .got entries. */
2237 hashes
= alpha_elf_sym_hashes (bsub
);
2238 symtab_hdr
= &elf_tdata (bsub
)->symtab_hdr
;
2240 n
= NUM_SHDR_ENTRIES (symtab_hdr
) - symtab_hdr
->sh_info
;
2241 for (i
= 0; i
< n
; ++i
)
2243 struct alpha_elf_got_entry
*ae
, *be
, **pbe
, **start
;
2244 struct alpha_elf_link_hash_entry
*h
;
2247 while (h
->root
.root
.type
== bfd_link_hash_indirect
2248 || h
->root
.root
.type
== bfd_link_hash_warning
)
2249 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
2251 pbe
= start
= &h
->got_entries
;
2252 while ((be
= *pbe
) != NULL
)
2254 if (be
->use_count
== 0)
2257 memset (be
, 0xa5, sizeof (*be
));
2260 if (be
->gotobj
!= b
)
2263 for (ae
= *start
; ae
; ae
= ae
->next
)
2265 && ae
->reloc_type
== be
->reloc_type
2266 && ae
->addend
== be
->addend
)
2268 ae
->flags
|= be
->flags
;
2269 ae
->use_count
+= be
->use_count
;
2271 memset (be
, 0xa5, sizeof (*be
));
2275 total
+= alpha_got_entry_size (be
->reloc_type
);
2283 alpha_elf_tdata (bsub
)->gotobj
= a
;
2285 alpha_elf_tdata (a
)->total_got_size
= total
;
2287 /* Merge the two in_got chains. */
2292 while ((next
= alpha_elf_tdata (bsub
)->in_got_link_next
) != NULL
)
2295 alpha_elf_tdata (bsub
)->in_got_link_next
= b
;
2299 /* Calculate the offsets for the got entries. */
2302 elf64_alpha_calc_got_offsets_for_symbol (struct alpha_elf_link_hash_entry
*h
,
2303 PTR arg ATTRIBUTE_UNUSED
)
2305 bfd_boolean result
= TRUE
;
2306 struct alpha_elf_got_entry
*gotent
;
2308 if (h
->root
.root
.type
== bfd_link_hash_warning
)
2309 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
2311 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
2312 if (gotent
->use_count
> 0)
2314 struct alpha_elf_obj_tdata
*td
;
2315 bfd_size_type
*plge
;
2317 td
= alpha_elf_tdata (gotent
->gotobj
);
2320 _bfd_error_handler (_("Symbol %s has no GOT subsection for offset 0x%x"),
2321 h
->root
.root
.root
.string
, gotent
->got_offset
);
2325 plge
= &td
->got
->size
;
2326 gotent
->got_offset
= *plge
;
2327 *plge
+= alpha_got_entry_size (gotent
->reloc_type
);
2334 elf64_alpha_calc_got_offsets (struct bfd_link_info
*info
)
2336 bfd
*i
, *got_list
= alpha_elf_hash_table(info
)->got_list
;
2338 /* First, zero out the .got sizes, as we may be recalculating the
2339 .got after optimizing it. */
2340 for (i
= got_list
; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
2341 alpha_elf_tdata(i
)->got
->size
= 0;
2343 /* Next, fill in the offsets for all the global entries. */
2344 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
2345 elf64_alpha_calc_got_offsets_for_symbol
,
2348 /* Finally, fill in the offsets for the local entries. */
2349 for (i
= got_list
; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
2351 bfd_size_type got_offset
= alpha_elf_tdata(i
)->got
->size
;
2354 for (j
= i
; j
; j
= alpha_elf_tdata(j
)->in_got_link_next
)
2356 struct alpha_elf_got_entry
**local_got_entries
, *gotent
;
2359 local_got_entries
= alpha_elf_tdata(j
)->local_got_entries
;
2360 if (!local_got_entries
)
2363 for (k
= 0, n
= elf_tdata(j
)->symtab_hdr
.sh_info
; k
< n
; ++k
)
2364 for (gotent
= local_got_entries
[k
]; gotent
; gotent
= gotent
->next
)
2365 if (gotent
->use_count
> 0)
2367 gotent
->got_offset
= got_offset
;
2368 got_offset
+= alpha_got_entry_size (gotent
->reloc_type
);
2372 alpha_elf_tdata(i
)->got
->size
= got_offset
;
2376 /* Constructs the gots. */
2379 elf64_alpha_size_got_sections (struct bfd_link_info
*info
)
2381 bfd
*i
, *got_list
, *cur_got_obj
= NULL
;
2382 int something_changed
= 0;
2384 got_list
= alpha_elf_hash_table (info
)->got_list
;
2386 /* On the first time through, pretend we have an existing got list
2387 consisting of all of the input files. */
2388 if (got_list
== NULL
)
2390 for (i
= info
->input_bfds
; i
; i
= i
->link_next
)
2392 bfd
*this_got
= alpha_elf_tdata (i
)->gotobj
;
2393 if (this_got
== NULL
)
2396 /* We are assuming no merging has yet occurred. */
2397 BFD_ASSERT (this_got
== i
);
2399 if (alpha_elf_tdata (this_got
)->total_got_size
> MAX_GOT_SIZE
)
2401 /* Yikes! A single object file has too many entries. */
2402 (*_bfd_error_handler
)
2403 (_("%B: .got subsegment exceeds 64K (size %d)"),
2404 i
, alpha_elf_tdata (this_got
)->total_got_size
);
2408 if (got_list
== NULL
)
2409 got_list
= this_got
;
2411 alpha_elf_tdata(cur_got_obj
)->got_link_next
= this_got
;
2412 cur_got_obj
= this_got
;
2415 /* Strange degenerate case of no got references. */
2416 if (got_list
== NULL
)
2419 alpha_elf_hash_table (info
)->got_list
= got_list
;
2421 /* Force got offsets to be recalculated. */
2422 something_changed
= 1;
2425 cur_got_obj
= got_list
;
2426 i
= alpha_elf_tdata(cur_got_obj
)->got_link_next
;
2429 if (elf64_alpha_can_merge_gots (cur_got_obj
, i
))
2431 elf64_alpha_merge_gots (cur_got_obj
, i
);
2433 alpha_elf_tdata(i
)->got
->size
= 0;
2434 i
= alpha_elf_tdata(i
)->got_link_next
;
2435 alpha_elf_tdata(cur_got_obj
)->got_link_next
= i
;
2437 something_changed
= 1;
2442 i
= alpha_elf_tdata(i
)->got_link_next
;
2446 /* Once the gots have been merged, fill in the got offsets for
2447 everything therein. */
2448 if (1 || something_changed
)
2449 elf64_alpha_calc_got_offsets (info
);
2455 elf64_alpha_size_plt_section_1 (struct alpha_elf_link_hash_entry
*h
, PTR data
)
2457 asection
*splt
= (asection
*) data
;
2458 struct alpha_elf_got_entry
*gotent
;
2460 /* If we didn't need an entry before, we still don't. */
2461 if (!h
->root
.needs_plt
)
2464 /* There must still be a LITERAL got entry for the function. */
2465 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
2466 if (gotent
->reloc_type
== R_ALPHA_LITERAL
2467 && gotent
->use_count
> 0)
2470 /* If there is, reset the PLT offset. If not, there's no longer
2471 a need for the PLT entry. */
2474 if (splt
->size
== 0)
2475 splt
->size
= PLT_HEADER_SIZE
;
2476 h
->root
.plt
.offset
= splt
->size
;
2477 splt
->size
+= PLT_ENTRY_SIZE
;
2481 h
->root
.needs_plt
= 0;
2482 h
->root
.plt
.offset
= -1;
2484 /* Undo the definition frobbing begun in adjust_dynamic_symbol. */
2485 if (h
->flags
& ALPHA_ELF_LINK_HASH_PLT_LOC
)
2487 h
->root
.root
.u
.def
.section
= h
->plt_old_section
;
2488 h
->root
.root
.u
.def
.value
= h
->plt_old_value
;
2489 h
->flags
&= ~ALPHA_ELF_LINK_HASH_PLT_LOC
;
2496 /* Called from relax_section to rebuild the PLT in light of
2497 potential changes in the function's status. */
2500 elf64_alpha_size_plt_section (struct bfd_link_info
*info
)
2502 asection
*splt
, *spltrel
;
2503 unsigned long entries
;
2506 dynobj
= elf_hash_table(info
)->dynobj
;
2507 splt
= bfd_get_section_by_name(dynobj
, ".plt");
2513 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
2514 elf64_alpha_size_plt_section_1
, splt
);
2516 /* Every plt entry requires a JMP_SLOT relocation. */
2517 spltrel
= bfd_get_section_by_name (dynobj
, ".rela.plt");
2519 entries
= (splt
->size
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
2522 spltrel
->size
= entries
* sizeof (Elf64_External_Rela
);
2528 elf64_alpha_always_size_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
2529 struct bfd_link_info
*info
)
2533 if (info
->relocatable
)
2536 /* First, take care of the indirect symbols created by versioning. */
2537 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
2538 elf64_alpha_merge_ind_symbols
,
2541 if (!elf64_alpha_size_got_sections (info
))
2544 /* Allocate space for all of the .got subsections. */
2545 i
= alpha_elf_hash_table (info
)->got_list
;
2546 for ( ; i
; i
= alpha_elf_tdata(i
)->got_link_next
)
2548 asection
*s
= alpha_elf_tdata(i
)->got
;
2551 s
->contents
= (bfd_byte
*) bfd_zalloc (i
, s
->size
);
2552 if (s
->contents
== NULL
)
2560 /* The number of dynamic relocations required by a static relocation. */
2563 alpha_dynamic_entries_for_reloc (int r_type
, int dynamic
, int shared
)
2567 /* May appear in GOT entries. */
2569 return (dynamic
? 2 : shared
? 1 : 0);
2570 case R_ALPHA_TLSLDM
:
2572 case R_ALPHA_LITERAL
:
2573 case R_ALPHA_GOTTPREL
:
2574 return dynamic
|| shared
;
2575 case R_ALPHA_GOTDTPREL
:
2578 /* May appear in data sections. */
2579 case R_ALPHA_REFLONG
:
2580 case R_ALPHA_REFQUAD
:
2581 case R_ALPHA_TPREL64
:
2582 return dynamic
|| shared
;
2584 /* Everything else is illegal. We'll issue an error during
2585 relocate_section. */
2591 /* Work out the sizes of the dynamic relocation entries. */
2594 elf64_alpha_calc_dynrel_sizes (struct alpha_elf_link_hash_entry
*h
,
2595 struct bfd_link_info
*info
)
2597 bfd_boolean dynamic
;
2598 struct alpha_elf_reloc_entry
*relent
;
2599 unsigned long entries
;
2601 if (h
->root
.root
.type
== bfd_link_hash_warning
)
2602 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
2604 /* If the symbol was defined as a common symbol in a regular object
2605 file, and there was no definition in any dynamic object, then the
2606 linker will have allocated space for the symbol in a common
2607 section but the ELF_LINK_HASH_DEF_REGULAR flag will not have been
2608 set. This is done for dynamic symbols in
2609 elf_adjust_dynamic_symbol but this is not done for non-dynamic
2610 symbols, somehow. */
2611 if (!h
->root
.def_regular
2612 && h
->root
.ref_regular
2613 && !h
->root
.def_dynamic
2614 && (h
->root
.root
.type
== bfd_link_hash_defined
2615 || h
->root
.root
.type
== bfd_link_hash_defweak
)
2616 && !(h
->root
.root
.u
.def
.section
->owner
->flags
& DYNAMIC
))
2617 h
->root
.def_regular
= 1;
2619 /* If the symbol is dynamic, we'll need all the relocations in their
2620 natural form. If this is a shared object, and it has been forced
2621 local, we'll need the same number of RELATIVE relocations. */
2622 dynamic
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
2624 /* If the symbol is a hidden undefined weak, then we never have any
2625 relocations. Avoid the loop which may want to add RELATIVE relocs
2626 based on info->shared. */
2627 if (h
->root
.root
.type
== bfd_link_hash_undefweak
&& !dynamic
)
2630 for (relent
= h
->reloc_entries
; relent
; relent
= relent
->next
)
2632 entries
= alpha_dynamic_entries_for_reloc (relent
->rtype
, dynamic
,
2636 relent
->srel
->size
+=
2637 entries
* sizeof (Elf64_External_Rela
) * relent
->count
;
2638 if (relent
->reltext
)
2639 info
->flags
|= DT_TEXTREL
;
2646 /* Subroutine of elf64_alpha_size_rela_got_section for doing the
2650 elf64_alpha_size_rela_got_1 (struct alpha_elf_link_hash_entry
*h
,
2651 struct bfd_link_info
*info
)
2653 bfd_boolean dynamic
;
2654 struct alpha_elf_got_entry
*gotent
;
2655 unsigned long entries
;
2657 if (h
->root
.root
.type
== bfd_link_hash_warning
)
2658 h
= (struct alpha_elf_link_hash_entry
*) h
->root
.root
.u
.i
.link
;
2660 /* If the symbol is dynamic, we'll need all the relocations in their
2661 natural form. If this is a shared object, and it has been forced
2662 local, we'll need the same number of RELATIVE relocations. */
2663 dynamic
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
2665 /* If the symbol is a hidden undefined weak, then we never have any
2666 relocations. Avoid the loop which may want to add RELATIVE relocs
2667 based on info->shared. */
2668 if (h
->root
.root
.type
== bfd_link_hash_undefweak
&& !dynamic
)
2672 for (gotent
= h
->got_entries
; gotent
; gotent
= gotent
->next
)
2673 if (gotent
->use_count
> 0)
2674 entries
+= alpha_dynamic_entries_for_reloc (gotent
->reloc_type
,
2675 dynamic
, info
->shared
);
2677 /* If we are using a .plt entry, subtract one, as the first
2678 reference uses a .rela.plt entry instead. */
2679 if (h
->root
.plt
.offset
!= MINUS_ONE
)
2684 bfd
*dynobj
= elf_hash_table(info
)->dynobj
;
2685 asection
*srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
2686 BFD_ASSERT (srel
!= NULL
);
2687 srel
->size
+= sizeof (Elf64_External_Rela
) * entries
;
2693 /* Set the sizes of the dynamic relocation sections. */
2696 elf64_alpha_size_rela_got_section (struct bfd_link_info
*info
)
2698 unsigned long entries
;
2702 /* Shared libraries often require RELATIVE relocs, and some relocs
2703 require attention for the main application as well. */
2706 for (i
= alpha_elf_hash_table(info
)->got_list
;
2707 i
; i
= alpha_elf_tdata(i
)->got_link_next
)
2711 for (j
= i
; j
; j
= alpha_elf_tdata(j
)->in_got_link_next
)
2713 struct alpha_elf_got_entry
**local_got_entries
, *gotent
;
2716 local_got_entries
= alpha_elf_tdata(j
)->local_got_entries
;
2717 if (!local_got_entries
)
2720 for (k
= 0, n
= elf_tdata(j
)->symtab_hdr
.sh_info
; k
< n
; ++k
)
2721 for (gotent
= local_got_entries
[k
];
2722 gotent
; gotent
= gotent
->next
)
2723 if (gotent
->use_count
> 0)
2724 entries
+= (alpha_dynamic_entries_for_reloc
2725 (gotent
->reloc_type
, 0, info
->shared
));
2729 dynobj
= elf_hash_table(info
)->dynobj
;
2730 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
2733 BFD_ASSERT (entries
== 0);
2736 srel
->size
= sizeof (Elf64_External_Rela
) * entries
;
2738 /* Now do the non-local symbols. */
2739 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
2740 elf64_alpha_size_rela_got_1
, info
);
2745 /* Set the sizes of the dynamic sections. */
2748 elf64_alpha_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
2749 struct bfd_link_info
*info
)
2755 dynobj
= elf_hash_table(info
)->dynobj
;
2756 BFD_ASSERT(dynobj
!= NULL
);
2758 if (elf_hash_table (info
)->dynamic_sections_created
)
2760 /* Set the contents of the .interp section to the interpreter. */
2761 if (info
->executable
)
2763 s
= bfd_get_section_by_name (dynobj
, ".interp");
2764 BFD_ASSERT (s
!= NULL
);
2765 s
->size
= sizeof ELF_DYNAMIC_INTERPRETER
;
2766 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
2769 /* Now that we've seen all of the input files, we can decide which
2770 symbols need dynamic relocation entries and which don't. We've
2771 collected information in check_relocs that we can now apply to
2772 size the dynamic relocation sections. */
2773 alpha_elf_link_hash_traverse (alpha_elf_hash_table (info
),
2774 elf64_alpha_calc_dynrel_sizes
, info
);
2776 elf64_alpha_size_rela_got_section (info
);
2778 /* else we're not dynamic and by definition we don't need such things. */
2780 /* The check_relocs and adjust_dynamic_symbol entry points have
2781 determined the sizes of the various dynamic sections. Allocate
2784 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
2789 if (!(s
->flags
& SEC_LINKER_CREATED
))
2792 /* It's OK to base decisions on the section name, because none
2793 of the dynobj section names depend upon the input files. */
2794 name
= bfd_get_section_name (dynobj
, s
);
2796 /* If we don't need this section, strip it from the output file.
2797 This is to handle .rela.bss and .rela.plt. We must create it
2798 in create_dynamic_sections, because it must be created before
2799 the linker maps input sections to output sections. The
2800 linker does that before adjust_dynamic_symbol is called, and
2801 it is that function which decides whether anything needs to
2802 go into these sections. */
2806 if (strncmp (name
, ".rela", 5) == 0)
2808 strip
= (s
->size
== 0);
2812 if (strcmp(name
, ".rela.plt") == 0)
2815 /* We use the reloc_count field as a counter if we need
2816 to copy relocs into the output file. */
2820 else if (strcmp (name
, ".plt") != 0)
2822 /* It's not one of our dynamic sections, so don't allocate space. */
2827 s
->flags
|= SEC_EXCLUDE
;
2830 /* Allocate memory for the section contents. */
2831 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, s
->size
);
2832 if (s
->contents
== NULL
&& s
->size
!= 0)
2837 if (elf_hash_table (info
)->dynamic_sections_created
)
2839 /* Add some entries to the .dynamic section. We fill in the
2840 values later, in elf64_alpha_finish_dynamic_sections, but we
2841 must add the entries now so that we get the correct size for
2842 the .dynamic section. The DT_DEBUG entry is filled in by the
2843 dynamic linker and used by the debugger. */
2844 #define add_dynamic_entry(TAG, VAL) \
2845 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
2847 if (info
->executable
)
2849 if (!add_dynamic_entry (DT_DEBUG
, 0))
2855 if (!add_dynamic_entry (DT_PLTGOT
, 0)
2856 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
2857 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
2858 || !add_dynamic_entry (DT_JMPREL
, 0))
2862 if (!add_dynamic_entry (DT_RELA
, 0)
2863 || !add_dynamic_entry (DT_RELASZ
, 0)
2864 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
2867 if (info
->flags
& DF_TEXTREL
)
2869 if (!add_dynamic_entry (DT_TEXTREL
, 0))
2873 #undef add_dynamic_entry
2878 /* These functions do relaxation for Alpha ELF.
2880 Currently I'm only handling what I can do with existing compiler
2881 and assembler support, which means no instructions are removed,
2882 though some may be nopped. At this time GCC does not emit enough
2883 information to do all of the relaxing that is possible. It will
2884 take some not small amount of work for that to happen.
2886 There are a couple of interesting papers that I once read on this
2887 subject, that I cannot find references to at the moment, that
2888 related to Alpha in particular. They are by David Wall, then of
2892 #define OP_LDAH 0x09
2893 #define INSN_JSR 0x68004000
2894 #define INSN_JSR_MASK 0xfc00c000
2898 #define INSN_UNOP 0x2ffe0000
2899 #define INSN_ADDQ 0x40000400
2900 #define INSN_RDUNIQ 0x0000009e
2902 struct alpha_relax_info
2907 Elf_Internal_Shdr
*symtab_hdr
;
2908 Elf_Internal_Rela
*relocs
, *relend
;
2909 struct bfd_link_info
*link_info
;
2913 struct alpha_elf_link_hash_entry
*h
;
2914 struct alpha_elf_got_entry
**first_gotent
;
2915 struct alpha_elf_got_entry
*gotent
;
2916 bfd_boolean changed_contents
;
2917 bfd_boolean changed_relocs
;
2918 unsigned char other
;
2921 static Elf_Internal_Rela
*
2922 elf64_alpha_find_reloc_at_ofs (Elf_Internal_Rela
*rel
,
2923 Elf_Internal_Rela
*relend
,
2924 bfd_vma offset
, int type
)
2926 while (rel
< relend
)
2928 if (rel
->r_offset
== offset
2929 && ELF64_R_TYPE (rel
->r_info
) == (unsigned int) type
)
2937 elf64_alpha_relax_got_load (struct alpha_relax_info
*info
, bfd_vma symval
,
2938 Elf_Internal_Rela
*irel
, unsigned long r_type
)
2941 bfd_signed_vma disp
;
2943 /* Get the instruction. */
2944 insn
= bfd_get_32 (info
->abfd
, info
->contents
+ irel
->r_offset
);
2946 if (insn
>> 26 != OP_LDQ
)
2948 reloc_howto_type
*howto
= elf64_alpha_howto_table
+ r_type
;
2949 ((*_bfd_error_handler
)
2950 ("%B: %A+0x%lx: warning: %s relocation against unexpected insn",
2951 info
->abfd
, info
->sec
,
2952 (unsigned long) irel
->r_offset
, howto
->name
));
2956 /* Can't relax dynamic symbols. */
2957 if (alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
))
2960 /* Can't use local-exec relocations in shared libraries. */
2961 if (r_type
== R_ALPHA_GOTTPREL
&& info
->link_info
->shared
)
2964 if (r_type
== R_ALPHA_LITERAL
)
2966 /* Look for nice constant addresses. This includes the not-uncommon
2967 special case of 0 for undefweak symbols. */
2968 if ((info
->h
&& info
->h
->root
.root
.type
== bfd_link_hash_undefweak
)
2969 || (!info
->link_info
->shared
2970 && (symval
>= (bfd_vma
)-0x8000 || symval
< 0x8000)))
2973 insn
= (OP_LDA
<< 26) | (insn
& (31 << 21)) | (31 << 16);
2974 insn
|= (symval
& 0xffff);
2975 r_type
= R_ALPHA_NONE
;
2979 disp
= symval
- info
->gp
;
2980 insn
= (OP_LDA
<< 26) | (insn
& 0x03ff0000);
2981 r_type
= R_ALPHA_GPREL16
;
2986 bfd_vma dtp_base
, tp_base
;
2988 BFD_ASSERT (elf_hash_table (info
->link_info
)->tls_sec
!= NULL
);
2989 dtp_base
= alpha_get_dtprel_base (info
->link_info
);
2990 tp_base
= alpha_get_tprel_base (info
->link_info
);
2991 disp
= symval
- (r_type
== R_ALPHA_GOTDTPREL
? dtp_base
: tp_base
);
2993 insn
= (OP_LDA
<< 26) | (insn
& (31 << 21)) | (31 << 16);
2997 case R_ALPHA_GOTDTPREL
:
2998 r_type
= R_ALPHA_DTPREL16
;
3000 case R_ALPHA_GOTTPREL
:
3001 r_type
= R_ALPHA_TPREL16
;
3009 if (disp
< -0x8000 || disp
>= 0x8000)
3012 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, info
->contents
+ irel
->r_offset
);
3013 info
->changed_contents
= TRUE
;
3015 /* Reduce the use count on this got entry by one, possibly
3017 if (--info
->gotent
->use_count
== 0)
3019 int sz
= alpha_got_entry_size (r_type
);
3020 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
3022 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
3025 /* Smash the existing GOT relocation for its 16-bit immediate pair. */
3026 irel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
), r_type
);
3027 info
->changed_relocs
= TRUE
;
3029 /* ??? Search forward through this basic block looking for insns
3030 that use the target register. Stop after an insn modifying the
3031 register is seen, or after a branch or call.
3033 Any such memory load insn may be substituted by a load directly
3034 off the GP. This allows the memory load insn to be issued before
3035 the calculated GP register would otherwise be ready.
3037 Any such jsr insn can be replaced by a bsr if it is in range.
3039 This would mean that we'd have to _add_ relocations, the pain of
3040 which gives one pause. */
3046 elf64_alpha_relax_opt_call (struct alpha_relax_info
*info
, bfd_vma symval
)
3048 /* If the function has the same gp, and we can identify that the
3049 function does not use its function pointer, we can eliminate the
3052 /* If the symbol is marked NOPV, we are being told the function never
3053 needs its procedure value. */
3054 if ((info
->other
& STO_ALPHA_STD_GPLOAD
) == STO_ALPHA_NOPV
)
3057 /* If the symbol is marked STD_GP, we are being told the function does
3058 a normal ldgp in the first two words. */
3059 else if ((info
->other
& STO_ALPHA_STD_GPLOAD
) == STO_ALPHA_STD_GPLOAD
)
3062 /* Otherwise, we may be able to identify a GP load in the first two
3063 words, which we can then skip. */
3066 Elf_Internal_Rela
*tsec_relocs
, *tsec_relend
, *tsec_free
, *gpdisp
;
3069 /* Load the relocations from the section that the target symbol is in. */
3070 if (info
->sec
== info
->tsec
)
3072 tsec_relocs
= info
->relocs
;
3073 tsec_relend
= info
->relend
;
3078 tsec_relocs
= (_bfd_elf_link_read_relocs
3079 (info
->abfd
, info
->tsec
, (PTR
) NULL
,
3080 (Elf_Internal_Rela
*) NULL
,
3081 info
->link_info
->keep_memory
));
3082 if (tsec_relocs
== NULL
)
3084 tsec_relend
= tsec_relocs
+ info
->tsec
->reloc_count
;
3085 tsec_free
= (info
->link_info
->keep_memory
? NULL
: tsec_relocs
);
3088 /* Recover the symbol's offset within the section. */
3089 ofs
= (symval
- info
->tsec
->output_section
->vma
3090 - info
->tsec
->output_offset
);
3092 /* Look for a GPDISP reloc. */
3093 gpdisp
= (elf64_alpha_find_reloc_at_ofs
3094 (tsec_relocs
, tsec_relend
, ofs
, R_ALPHA_GPDISP
));
3096 if (!gpdisp
|| gpdisp
->r_addend
!= 4)
3106 /* We've now determined that we can skip an initial gp load. Verify
3107 that the call and the target use the same gp. */
3108 if (info
->link_info
->hash
->creator
!= info
->tsec
->owner
->xvec
3109 || info
->gotobj
!= alpha_elf_tdata (info
->tsec
->owner
)->gotobj
)
3116 elf64_alpha_relax_with_lituse (struct alpha_relax_info
*info
,
3117 bfd_vma symval
, Elf_Internal_Rela
*irel
)
3119 Elf_Internal_Rela
*urel
, *irelend
= info
->relend
;
3120 int flags
, count
, i
;
3121 bfd_signed_vma disp
;
3124 bfd_boolean lit_reused
= FALSE
;
3125 bfd_boolean all_optimized
= TRUE
;
3126 unsigned int lit_insn
;
3128 lit_insn
= bfd_get_32 (info
->abfd
, info
->contents
+ irel
->r_offset
);
3129 if (lit_insn
>> 26 != OP_LDQ
)
3131 ((*_bfd_error_handler
)
3132 ("%B: %A+0x%lx: warning: LITERAL relocation against unexpected insn",
3133 info
->abfd
, info
->sec
,
3134 (unsigned long) irel
->r_offset
));
3138 /* Can't relax dynamic symbols. */
3139 if (alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
))
3142 /* Summarize how this particular LITERAL is used. */
3143 for (urel
= irel
+1, flags
= count
= 0; urel
< irelend
; ++urel
, ++count
)
3145 if (ELF64_R_TYPE (urel
->r_info
) != R_ALPHA_LITUSE
)
3147 if (urel
->r_addend
<= 3)
3148 flags
|= 1 << urel
->r_addend
;
3151 /* A little preparation for the loop... */
3152 disp
= symval
- info
->gp
;
3154 for (urel
= irel
+1, i
= 0; i
< count
; ++i
, ++urel
)
3158 bfd_signed_vma xdisp
;
3160 insn
= bfd_get_32 (info
->abfd
, info
->contents
+ urel
->r_offset
);
3162 switch (urel
->r_addend
)
3164 case LITUSE_ALPHA_ADDR
:
3166 /* This type is really just a placeholder to note that all
3167 uses cannot be optimized, but to still allow some. */
3168 all_optimized
= FALSE
;
3171 case LITUSE_ALPHA_BASE
:
3172 /* We can always optimize 16-bit displacements. */
3174 /* Extract the displacement from the instruction, sign-extending
3175 it if necessary, then test whether it is within 16 or 32 bits
3176 displacement from GP. */
3177 insn_disp
= ((insn
& 0xffff) ^ 0x8000) - 0x8000;
3179 xdisp
= disp
+ insn_disp
;
3180 fits16
= (xdisp
>= - (bfd_signed_vma
) 0x8000 && xdisp
< 0x8000);
3181 fits32
= (xdisp
>= - (bfd_signed_vma
) 0x80000000
3182 && xdisp
< 0x7fff8000);
3186 /* Take the op code and dest from this insn, take the base
3187 register from the literal insn. Leave the offset alone. */
3188 insn
= (insn
& 0xffe0ffff) | (lit_insn
& 0x001f0000);
3189 urel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
3191 urel
->r_addend
= irel
->r_addend
;
3192 info
->changed_relocs
= TRUE
;
3194 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
3195 info
->contents
+ urel
->r_offset
);
3196 info
->changed_contents
= TRUE
;
3199 /* If all mem+byte, we can optimize 32-bit mem displacements. */
3200 else if (fits32
&& !(flags
& ~6))
3202 /* FIXME: sanity check that lit insn Ra is mem insn Rb. */
3204 irel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
3206 lit_insn
= (OP_LDAH
<< 26) | (lit_insn
& 0x03ff0000);
3207 bfd_put_32 (info
->abfd
, (bfd_vma
) lit_insn
,
3208 info
->contents
+ irel
->r_offset
);
3210 info
->changed_contents
= TRUE
;
3212 urel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
3214 urel
->r_addend
= irel
->r_addend
;
3215 info
->changed_relocs
= TRUE
;
3218 all_optimized
= FALSE
;
3221 case LITUSE_ALPHA_BYTOFF
:
3222 /* We can always optimize byte instructions. */
3224 /* FIXME: sanity check the insn for byte op. Check that the
3225 literal dest reg is indeed Rb in the byte insn. */
3227 insn
&= ~ (unsigned) 0x001ff000;
3228 insn
|= ((symval
& 7) << 13) | 0x1000;
3230 urel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3232 info
->changed_relocs
= TRUE
;
3234 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
3235 info
->contents
+ urel
->r_offset
);
3236 info
->changed_contents
= TRUE
;
3239 case LITUSE_ALPHA_JSR
:
3240 case LITUSE_ALPHA_TLSGD
:
3241 case LITUSE_ALPHA_TLSLDM
:
3243 bfd_vma optdest
, org
;
3244 bfd_signed_vma odisp
;
3246 /* For undefined weak symbols, we're mostly interested in getting
3247 rid of the got entry whenever possible, so optimize this to a
3248 use of the zero register. */
3249 if (info
->h
&& info
->h
->root
.root
.type
== bfd_link_hash_undefweak
)
3252 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
3253 info
->contents
+ urel
->r_offset
);
3255 info
->changed_contents
= TRUE
;
3259 /* If not zero, place to jump without needing pv. */
3260 optdest
= elf64_alpha_relax_opt_call (info
, symval
);
3261 org
= (info
->sec
->output_section
->vma
3262 + info
->sec
->output_offset
3263 + urel
->r_offset
+ 4);
3264 odisp
= (optdest
? optdest
: symval
) - org
;
3266 if (odisp
>= -0x400000 && odisp
< 0x400000)
3268 Elf_Internal_Rela
*xrel
;
3270 /* Preserve branch prediction call stack when possible. */
3271 if ((insn
& INSN_JSR_MASK
) == INSN_JSR
)
3272 insn
= (OP_BSR
<< 26) | (insn
& 0x03e00000);
3274 insn
= (OP_BR
<< 26) | (insn
& 0x03e00000);
3276 urel
->r_info
= ELF64_R_INFO (ELF64_R_SYM (irel
->r_info
),
3278 urel
->r_addend
= irel
->r_addend
;
3281 urel
->r_addend
+= optdest
- symval
;
3283 all_optimized
= FALSE
;
3285 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
,
3286 info
->contents
+ urel
->r_offset
);
3288 /* Kill any HINT reloc that might exist for this insn. */
3289 xrel
= (elf64_alpha_find_reloc_at_ofs
3290 (info
->relocs
, info
->relend
, urel
->r_offset
,
3293 xrel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3295 info
->changed_contents
= TRUE
;
3296 info
->changed_relocs
= TRUE
;
3299 all_optimized
= FALSE
;
3301 /* Even if the target is not in range for a direct branch,
3302 if we share a GP, we can eliminate the gp reload. */
3305 Elf_Internal_Rela
*gpdisp
3306 = (elf64_alpha_find_reloc_at_ofs
3307 (info
->relocs
, irelend
, urel
->r_offset
+ 4,
3311 bfd_byte
*p_ldah
= info
->contents
+ gpdisp
->r_offset
;
3312 bfd_byte
*p_lda
= p_ldah
+ gpdisp
->r_addend
;
3313 unsigned int ldah
= bfd_get_32 (info
->abfd
, p_ldah
);
3314 unsigned int lda
= bfd_get_32 (info
->abfd
, p_lda
);
3316 /* Verify that the instruction is "ldah $29,0($26)".
3317 Consider a function that ends in a noreturn call,
3318 and that the next function begins with an ldgp,
3319 and that by accident there is no padding between.
3320 In that case the insn would use $27 as the base. */
3321 if (ldah
== 0x27ba0000 && lda
== 0x23bd0000)
3323 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, p_ldah
);
3324 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, p_lda
);
3326 gpdisp
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3327 info
->changed_contents
= TRUE
;
3328 info
->changed_relocs
= TRUE
;
3337 /* If all cases were optimized, we can reduce the use count on this
3338 got entry by one, possibly eliminating it. */
3341 if (--info
->gotent
->use_count
== 0)
3343 int sz
= alpha_got_entry_size (R_ALPHA_LITERAL
);
3344 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
3346 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
3349 /* If the literal instruction is no longer needed (it may have been
3350 reused. We can eliminate it. */
3351 /* ??? For now, I don't want to deal with compacting the section,
3352 so just nop it out. */
3355 irel
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3356 info
->changed_relocs
= TRUE
;
3358 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
,
3359 info
->contents
+ irel
->r_offset
);
3360 info
->changed_contents
= TRUE
;
3366 return elf64_alpha_relax_got_load (info
, symval
, irel
, R_ALPHA_LITERAL
);
3370 elf64_alpha_relax_tls_get_addr (struct alpha_relax_info
*info
, bfd_vma symval
,
3371 Elf_Internal_Rela
*irel
, bfd_boolean is_gd
)
3375 Elf_Internal_Rela
*gpdisp
, *hint
;
3376 bfd_boolean dynamic
, use_gottprel
, pos1_unusable
;
3377 unsigned long new_symndx
;
3379 dynamic
= alpha_elf_dynamic_symbol_p (&info
->h
->root
, info
->link_info
);
3381 /* If a TLS symbol is accessed using IE at least once, there is no point
3382 to use dynamic model for it. */
3383 if (is_gd
&& info
->h
&& (info
->h
->flags
& ALPHA_ELF_LINK_HASH_TLS_IE
))
3386 /* If the symbol is local, and we've already committed to DF_STATIC_TLS,
3387 then we might as well relax to IE. */
3388 else if (info
->link_info
->shared
&& !dynamic
3389 && (info
->link_info
->flags
& DF_STATIC_TLS
))
3392 /* Otherwise we must be building an executable to do anything. */
3393 else if (info
->link_info
->shared
)
3396 /* The TLSGD/TLSLDM relocation must be followed by a LITERAL and
3397 the matching LITUSE_TLS relocations. */
3398 if (irel
+ 2 >= info
->relend
)
3400 if (ELF64_R_TYPE (irel
[1].r_info
) != R_ALPHA_LITERAL
3401 || ELF64_R_TYPE (irel
[2].r_info
) != R_ALPHA_LITUSE
3402 || irel
[2].r_addend
!= (is_gd
? LITUSE_ALPHA_TLSGD
: LITUSE_ALPHA_TLSLDM
))
3405 /* There must be a GPDISP relocation positioned immediately after the
3406 LITUSE relocation. */
3407 gpdisp
= elf64_alpha_find_reloc_at_ofs (info
->relocs
, info
->relend
,
3408 irel
[2].r_offset
+ 4, R_ALPHA_GPDISP
);
3412 pos
[0] = info
->contents
+ irel
[0].r_offset
;
3413 pos
[1] = info
->contents
+ irel
[1].r_offset
;
3414 pos
[2] = info
->contents
+ irel
[2].r_offset
;
3415 pos
[3] = info
->contents
+ gpdisp
->r_offset
;
3416 pos
[4] = pos
[3] + gpdisp
->r_addend
;
3417 pos1_unusable
= FALSE
;
3419 /* Generally, the positions are not allowed to be out of order, lest the
3420 modified insn sequence have different register lifetimes. We can make
3421 an exception when pos 1 is adjacent to pos 0. */
3422 if (pos
[1] + 4 == pos
[0])
3424 bfd_byte
*tmp
= pos
[0];
3428 else if (pos
[1] < pos
[0])
3429 pos1_unusable
= TRUE
;
3430 if (pos
[1] >= pos
[2] || pos
[2] >= pos
[3])
3433 /* Reduce the use count on the LITERAL relocation. Do this before we
3434 smash the symndx when we adjust the relocations below. */
3436 struct alpha_elf_got_entry
*lit_gotent
;
3437 struct alpha_elf_link_hash_entry
*lit_h
;
3440 BFD_ASSERT (ELF64_R_SYM (irel
[1].r_info
) >= info
->symtab_hdr
->sh_info
);
3441 indx
= ELF64_R_SYM (irel
[1].r_info
) - info
->symtab_hdr
->sh_info
;
3442 lit_h
= alpha_elf_sym_hashes (info
->abfd
)[indx
];
3444 while (lit_h
->root
.root
.type
== bfd_link_hash_indirect
3445 || lit_h
->root
.root
.type
== bfd_link_hash_warning
)
3446 lit_h
= (struct alpha_elf_link_hash_entry
*) lit_h
->root
.root
.u
.i
.link
;
3448 for (lit_gotent
= lit_h
->got_entries
; lit_gotent
;
3449 lit_gotent
= lit_gotent
->next
)
3450 if (lit_gotent
->gotobj
== info
->gotobj
3451 && lit_gotent
->reloc_type
== R_ALPHA_LITERAL
3452 && lit_gotent
->addend
== irel
[1].r_addend
)
3454 BFD_ASSERT (lit_gotent
);
3456 if (--lit_gotent
->use_count
== 0)
3458 int sz
= alpha_got_entry_size (R_ALPHA_LITERAL
);
3459 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
3465 lda $16,x($gp) !tlsgd!1
3466 ldq $27,__tls_get_addr($gp) !literal!1
3467 jsr $26,($27),__tls_get_addr !lituse_tlsgd!1
3468 ldah $29,0($26) !gpdisp!2
3469 lda $29,0($29) !gpdisp!2
3471 ldq $16,x($gp) !gottprel
3476 or the first pair to
3477 lda $16,x($gp) !tprel
3480 ldah $16,x($gp) !tprelhi
3481 lda $16,x($16) !tprello
3485 use_gottprel
= FALSE
;
3486 new_symndx
= is_gd
? ELF64_R_SYM (irel
->r_info
) : 0;
3487 switch (!dynamic
&& !info
->link_info
->shared
)
3492 bfd_signed_vma disp
;
3494 BFD_ASSERT (elf_hash_table (info
->link_info
)->tls_sec
!= NULL
);
3495 tp_base
= alpha_get_tprel_base (info
->link_info
);
3496 disp
= symval
- tp_base
;
3498 if (disp
>= -0x8000 && disp
< 0x8000)
3500 insn
= (OP_LDA
<< 26) | (16 << 21) | (31 << 16);
3501 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[0]);
3502 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, pos
[1]);
3504 irel
[0].r_offset
= pos
[0] - info
->contents
;
3505 irel
[0].r_info
= ELF64_R_INFO (new_symndx
, R_ALPHA_TPREL16
);
3506 irel
[1].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3509 else if (disp
>= -(bfd_signed_vma
) 0x80000000
3510 && disp
< (bfd_signed_vma
) 0x7fff8000
3513 insn
= (OP_LDAH
<< 26) | (16 << 21) | (31 << 16);
3514 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[0]);
3515 insn
= (OP_LDA
<< 26) | (16 << 21) | (16 << 16);
3516 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[1]);
3518 irel
[0].r_offset
= pos
[0] - info
->contents
;
3519 irel
[0].r_info
= ELF64_R_INFO (new_symndx
, R_ALPHA_TPRELHI
);
3520 irel
[1].r_offset
= pos
[1] - info
->contents
;
3521 irel
[1].r_info
= ELF64_R_INFO (new_symndx
, R_ALPHA_TPRELLO
);
3528 use_gottprel
= TRUE
;
3530 insn
= (OP_LDQ
<< 26) | (16 << 21) | (29 << 16);
3531 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[0]);
3532 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, pos
[1]);
3534 irel
[0].r_offset
= pos
[0] - info
->contents
;
3535 irel
[0].r_info
= ELF64_R_INFO (new_symndx
, R_ALPHA_GOTTPREL
);
3536 irel
[1].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3540 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_RDUNIQ
, pos
[2]);
3542 insn
= INSN_ADDQ
| (16 << 21) | (0 << 16) | (0 << 0);
3543 bfd_put_32 (info
->abfd
, (bfd_vma
) insn
, pos
[3]);
3545 bfd_put_32 (info
->abfd
, (bfd_vma
) INSN_UNOP
, pos
[4]);
3547 irel
[2].r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3548 gpdisp
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3550 hint
= elf64_alpha_find_reloc_at_ofs (info
->relocs
, info
->relend
,
3551 irel
[2].r_offset
, R_ALPHA_HINT
);
3553 hint
->r_info
= ELF64_R_INFO (0, R_ALPHA_NONE
);
3555 info
->changed_contents
= TRUE
;
3556 info
->changed_relocs
= TRUE
;
3558 /* Reduce the use count on the TLSGD/TLSLDM relocation. */
3559 if (--info
->gotent
->use_count
== 0)
3561 int sz
= alpha_got_entry_size (info
->gotent
->reloc_type
);
3562 alpha_elf_tdata (info
->gotobj
)->total_got_size
-= sz
;
3564 alpha_elf_tdata (info
->gotobj
)->local_got_size
-= sz
;
3567 /* If we've switched to a GOTTPREL relocation, increment the reference
3568 count on that got entry. */
3571 struct alpha_elf_got_entry
*tprel_gotent
;
3573 for (tprel_gotent
= *info
->first_gotent
; tprel_gotent
;
3574 tprel_gotent
= tprel_gotent
->next
)
3575 if (tprel_gotent
->gotobj
== info
->gotobj
3576 && tprel_gotent
->reloc_type
== R_ALPHA_GOTTPREL
3577 && tprel_gotent
->addend
== irel
->r_addend
)
3580 tprel_gotent
->use_count
++;
3583 if (info
->gotent
->use_count
== 0)
3584 tprel_gotent
= info
->gotent
;
3587 tprel_gotent
= (struct alpha_elf_got_entry
*)
3588 bfd_alloc (info
->abfd
, sizeof (struct alpha_elf_got_entry
));
3592 tprel_gotent
->next
= *info
->first_gotent
;
3593 *info
->first_gotent
= tprel_gotent
;
3595 tprel_gotent
->gotobj
= info
->gotobj
;
3596 tprel_gotent
->addend
= irel
->r_addend
;
3597 tprel_gotent
->got_offset
= -1;
3598 tprel_gotent
->reloc_done
= 0;
3599 tprel_gotent
->reloc_xlated
= 0;
3602 tprel_gotent
->use_count
= 1;
3603 tprel_gotent
->reloc_type
= R_ALPHA_GOTTPREL
;
3611 elf64_alpha_relax_section (bfd
*abfd
, asection
*sec
,
3612 struct bfd_link_info
*link_info
, bfd_boolean
*again
)
3614 Elf_Internal_Shdr
*symtab_hdr
;
3615 Elf_Internal_Rela
*internal_relocs
;
3616 Elf_Internal_Rela
*irel
, *irelend
;
3617 Elf_Internal_Sym
*isymbuf
= NULL
;
3618 struct alpha_elf_got_entry
**local_got_entries
;
3619 struct alpha_relax_info info
;
3621 /* We are not currently changing any sizes, so only one pass. */
3624 if (link_info
->relocatable
3625 || ((sec
->flags
& (SEC_CODE
| SEC_RELOC
| SEC_ALLOC
))
3626 != (SEC_CODE
| SEC_RELOC
| SEC_ALLOC
))
3627 || sec
->reloc_count
== 0)
3630 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3631 local_got_entries
= alpha_elf_tdata(abfd
)->local_got_entries
;
3633 /* Load the relocations for this section. */
3634 internal_relocs
= (_bfd_elf_link_read_relocs
3635 (abfd
, sec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
3636 link_info
->keep_memory
));
3637 if (internal_relocs
== NULL
)
3640 memset(&info
, 0, sizeof (info
));
3643 info
.link_info
= link_info
;
3644 info
.symtab_hdr
= symtab_hdr
;
3645 info
.relocs
= internal_relocs
;
3646 info
.relend
= irelend
= internal_relocs
+ sec
->reloc_count
;
3648 /* Find the GP for this object. Do not store the result back via
3649 _bfd_set_gp_value, since this could change again before final. */
3650 info
.gotobj
= alpha_elf_tdata (abfd
)->gotobj
;
3653 asection
*sgot
= alpha_elf_tdata (info
.gotobj
)->got
;
3654 info
.gp
= (sgot
->output_section
->vma
3655 + sgot
->output_offset
3659 /* Get the section contents. */
3660 if (elf_section_data (sec
)->this_hdr
.contents
!= NULL
)
3661 info
.contents
= elf_section_data (sec
)->this_hdr
.contents
;
3664 if (!bfd_malloc_and_get_section (abfd
, sec
, &info
.contents
))
3668 for (irel
= internal_relocs
; irel
< irelend
; irel
++)
3671 struct alpha_elf_got_entry
*gotent
;
3672 unsigned long r_type
= ELF64_R_TYPE (irel
->r_info
);
3673 unsigned long r_symndx
= ELF64_R_SYM (irel
->r_info
);
3675 /* Early exit for unhandled or unrelaxable relocations. */
3678 case R_ALPHA_LITERAL
:
3679 case R_ALPHA_GPRELHIGH
:
3680 case R_ALPHA_GPRELLOW
:
3681 case R_ALPHA_GOTDTPREL
:
3682 case R_ALPHA_GOTTPREL
:
3686 case R_ALPHA_TLSLDM
:
3687 /* The symbol for a TLSLDM reloc is ignored. Collapse the
3688 reloc to the 0 symbol so that they all match. */
3696 /* Get the value of the symbol referred to by the reloc. */
3697 if (r_symndx
< symtab_hdr
->sh_info
)
3699 /* A local symbol. */
3700 Elf_Internal_Sym
*isym
;
3702 /* Read this BFD's local symbols. */
3703 if (isymbuf
== NULL
)
3705 isymbuf
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3706 if (isymbuf
== NULL
)
3707 isymbuf
= bfd_elf_get_elf_syms (abfd
, symtab_hdr
,
3708 symtab_hdr
->sh_info
, 0,
3710 if (isymbuf
== NULL
)
3714 isym
= isymbuf
+ r_symndx
;
3716 /* Given the symbol for a TLSLDM reloc is ignored, this also
3717 means forcing the symbol value to the tp base. */
3718 if (r_type
== R_ALPHA_TLSLDM
)
3720 info
.tsec
= bfd_abs_section_ptr
;
3721 symval
= alpha_get_tprel_base (info
.link_info
);
3725 symval
= isym
->st_value
;
3726 if (isym
->st_shndx
== SHN_UNDEF
)
3728 else if (isym
->st_shndx
== SHN_ABS
)
3729 info
.tsec
= bfd_abs_section_ptr
;
3730 else if (isym
->st_shndx
== SHN_COMMON
)
3731 info
.tsec
= bfd_com_section_ptr
;
3733 info
.tsec
= bfd_section_from_elf_index (abfd
, isym
->st_shndx
);
3737 info
.other
= isym
->st_other
;
3738 if (local_got_entries
)
3739 info
.first_gotent
= &local_got_entries
[r_symndx
];
3742 info
.first_gotent
= &info
.gotent
;
3749 struct alpha_elf_link_hash_entry
*h
;
3751 indx
= r_symndx
- symtab_hdr
->sh_info
;
3752 h
= alpha_elf_sym_hashes (abfd
)[indx
];
3753 BFD_ASSERT (h
!= NULL
);
3755 while (h
->root
.root
.type
== bfd_link_hash_indirect
3756 || h
->root
.root
.type
== bfd_link_hash_warning
)
3757 h
= (struct alpha_elf_link_hash_entry
*)h
->root
.root
.u
.i
.link
;
3759 /* If the symbol is undefined, we can't do anything with it. */
3760 if (h
->root
.root
.type
== bfd_link_hash_undefined
)
3763 /* If the symbol isn't defined in the current module,
3764 again we can't do anything. */
3765 if (h
->root
.root
.type
== bfd_link_hash_undefweak
)
3767 info
.tsec
= bfd_abs_section_ptr
;
3770 else if (!h
->root
.def_regular
)
3772 /* Except for TLSGD relocs, which can sometimes be
3773 relaxed to GOTTPREL relocs. */
3774 if (r_type
!= R_ALPHA_TLSGD
)
3776 info
.tsec
= bfd_abs_section_ptr
;
3781 info
.tsec
= h
->root
.root
.u
.def
.section
;
3782 symval
= h
->root
.root
.u
.def
.value
;
3786 info
.other
= h
->root
.other
;
3787 info
.first_gotent
= &h
->got_entries
;
3790 /* Search for the got entry to be used by this relocation. */
3791 for (gotent
= *info
.first_gotent
; gotent
; gotent
= gotent
->next
)
3792 if (gotent
->gotobj
== info
.gotobj
3793 && gotent
->reloc_type
== r_type
3794 && gotent
->addend
== irel
->r_addend
)
3796 info
.gotent
= gotent
;
3798 symval
+= info
.tsec
->output_section
->vma
+ info
.tsec
->output_offset
;
3799 symval
+= irel
->r_addend
;
3803 case R_ALPHA_LITERAL
:
3804 BFD_ASSERT(info
.gotent
!= NULL
);
3806 /* If there exist LITUSE relocations immediately following, this
3807 opens up all sorts of interesting optimizations, because we
3808 now know every location that this address load is used. */
3809 if (irel
+1 < irelend
3810 && ELF64_R_TYPE (irel
[1].r_info
) == R_ALPHA_LITUSE
)
3812 if (!elf64_alpha_relax_with_lituse (&info
, symval
, irel
))
3817 if (!elf64_alpha_relax_got_load (&info
, symval
, irel
, r_type
))
3822 case R_ALPHA_GOTDTPREL
:
3823 case R_ALPHA_GOTTPREL
:
3824 BFD_ASSERT(info
.gotent
!= NULL
);
3825 if (!elf64_alpha_relax_got_load (&info
, symval
, irel
, r_type
))
3830 case R_ALPHA_TLSLDM
:
3831 BFD_ASSERT(info
.gotent
!= NULL
);
3832 if (!elf64_alpha_relax_tls_get_addr (&info
, symval
, irel
,
3833 r_type
== R_ALPHA_TLSGD
))
3839 if (!elf64_alpha_size_plt_section (link_info
))
3841 if (!elf64_alpha_size_got_sections (link_info
))
3843 if (!elf64_alpha_size_rela_got_section (link_info
))
3847 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
3849 if (!link_info
->keep_memory
)
3853 /* Cache the symbols for elf_link_input_bfd. */
3854 symtab_hdr
->contents
= (unsigned char *) isymbuf
;
3858 if (info
.contents
!= NULL
3859 && elf_section_data (sec
)->this_hdr
.contents
!= info
.contents
)
3861 if (!info
.changed_contents
&& !link_info
->keep_memory
)
3862 free (info
.contents
);
3865 /* Cache the section contents for elf_link_input_bfd. */
3866 elf_section_data (sec
)->this_hdr
.contents
= info
.contents
;
3870 if (elf_section_data (sec
)->relocs
!= internal_relocs
)
3872 if (!info
.changed_relocs
)
3873 free (internal_relocs
);
3875 elf_section_data (sec
)->relocs
= internal_relocs
;
3878 *again
= info
.changed_contents
|| info
.changed_relocs
;
3884 && symtab_hdr
->contents
!= (unsigned char *) isymbuf
)
3886 if (info
.contents
!= NULL
3887 && elf_section_data (sec
)->this_hdr
.contents
!= info
.contents
)
3888 free (info
.contents
);
3889 if (internal_relocs
!= NULL
3890 && elf_section_data (sec
)->relocs
!= internal_relocs
)
3891 free (internal_relocs
);
3895 /* Emit a dynamic relocation for (DYNINDX, RTYPE, ADDEND) at (SEC, OFFSET)
3896 into the next available slot in SREL. */
3899 elf64_alpha_emit_dynrel (bfd
*abfd
, struct bfd_link_info
*info
,
3900 asection
*sec
, asection
*srel
, bfd_vma offset
,
3901 long dynindx
, long rtype
, bfd_vma addend
)
3903 Elf_Internal_Rela outrel
;
3906 BFD_ASSERT (srel
!= NULL
);
3908 outrel
.r_info
= ELF64_R_INFO (dynindx
, rtype
);
3909 outrel
.r_addend
= addend
;
3911 offset
= _bfd_elf_section_offset (abfd
, info
, sec
, offset
);
3912 if ((offset
| 1) != (bfd_vma
) -1)
3913 outrel
.r_offset
= sec
->output_section
->vma
+ sec
->output_offset
+ offset
;
3915 memset (&outrel
, 0, sizeof (outrel
));
3917 loc
= srel
->contents
;
3918 loc
+= srel
->reloc_count
++ * sizeof (Elf64_External_Rela
);
3919 bfd_elf64_swap_reloca_out (abfd
, &outrel
, loc
);
3920 BFD_ASSERT (sizeof (Elf64_External_Rela
) * srel
->reloc_count
<= srel
->size
);
3923 /* Relocate an Alpha ELF section for a relocatable link.
3925 We don't have to change anything unless the reloc is against a section
3926 symbol, in which case we have to adjust according to where the section
3927 symbol winds up in the output section. */
3930 elf64_alpha_relocate_section_r (bfd
*output_bfd ATTRIBUTE_UNUSED
,
3931 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3932 bfd
*input_bfd
, asection
*input_section
,
3933 bfd_byte
*contents ATTRIBUTE_UNUSED
,
3934 Elf_Internal_Rela
*relocs
,
3935 Elf_Internal_Sym
*local_syms
,
3936 asection
**local_sections
)
3938 unsigned long symtab_hdr_sh_info
;
3939 Elf_Internal_Rela
*rel
;
3940 Elf_Internal_Rela
*relend
;
3941 bfd_boolean ret_val
= TRUE
;
3943 symtab_hdr_sh_info
= elf_tdata (input_bfd
)->symtab_hdr
.sh_info
;
3945 relend
= relocs
+ input_section
->reloc_count
;
3946 for (rel
= relocs
; rel
< relend
; rel
++)
3948 unsigned long r_symndx
;
3949 Elf_Internal_Sym
*sym
;
3951 unsigned long r_type
;
3953 r_type
= ELF64_R_TYPE(rel
->r_info
);
3954 if (r_type
>= R_ALPHA_max
)
3956 (*_bfd_error_handler
)
3957 (_("%B: unknown relocation type %d"),
3958 input_bfd
, (int) r_type
);
3959 bfd_set_error (bfd_error_bad_value
);
3964 r_symndx
= ELF64_R_SYM(rel
->r_info
);
3966 /* The symbol associated with GPDISP and LITUSE is
3967 immaterial. Only the addend is significant. */
3968 if (r_type
== R_ALPHA_GPDISP
|| r_type
== R_ALPHA_LITUSE
)
3971 if (r_symndx
< symtab_hdr_sh_info
)
3973 sym
= local_syms
+ r_symndx
;
3974 if (ELF_ST_TYPE(sym
->st_info
) == STT_SECTION
)
3976 sec
= local_sections
[r_symndx
];
3977 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
3985 /* Relocate an Alpha ELF section. */
3988 elf64_alpha_relocate_section (bfd
*output_bfd
, struct bfd_link_info
*info
,
3989 bfd
*input_bfd
, asection
*input_section
,
3990 bfd_byte
*contents
, Elf_Internal_Rela
*relocs
,
3991 Elf_Internal_Sym
*local_syms
,
3992 asection
**local_sections
)
3994 Elf_Internal_Shdr
*symtab_hdr
;
3995 Elf_Internal_Rela
*rel
;
3996 Elf_Internal_Rela
*relend
;
3997 asection
*sgot
, *srel
, *srelgot
;
3998 bfd
*dynobj
, *gotobj
;
3999 bfd_vma gp
, tp_base
, dtp_base
;
4000 struct alpha_elf_got_entry
**local_got_entries
;
4001 bfd_boolean ret_val
;
4003 /* Handle relocatable links with a smaller loop. */
4004 if (info
->relocatable
)
4005 return elf64_alpha_relocate_section_r (output_bfd
, info
, input_bfd
,
4006 input_section
, contents
, relocs
,
4007 local_syms
, local_sections
);
4009 /* This is a final link. */
4013 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4015 dynobj
= elf_hash_table (info
)->dynobj
;
4017 srelgot
= bfd_get_section_by_name (dynobj
, ".rela.got");
4021 if (input_section
->flags
& SEC_ALLOC
)
4023 const char *section_name
;
4024 section_name
= (bfd_elf_string_from_elf_section
4025 (input_bfd
, elf_elfheader(input_bfd
)->e_shstrndx
,
4026 elf_section_data(input_section
)->rel_hdr
.sh_name
));
4027 BFD_ASSERT(section_name
!= NULL
);
4028 srel
= bfd_get_section_by_name (dynobj
, section_name
);
4033 /* Find the gp value for this input bfd. */
4034 gotobj
= alpha_elf_tdata (input_bfd
)->gotobj
;
4037 sgot
= alpha_elf_tdata (gotobj
)->got
;
4038 gp
= _bfd_get_gp_value (gotobj
);
4041 gp
= (sgot
->output_section
->vma
4042 + sgot
->output_offset
4044 _bfd_set_gp_value (gotobj
, gp
);
4053 local_got_entries
= alpha_elf_tdata(input_bfd
)->local_got_entries
;
4055 if (elf_hash_table (info
)->tls_sec
!= NULL
)
4057 dtp_base
= alpha_get_dtprel_base (info
);
4058 tp_base
= alpha_get_tprel_base (info
);
4061 dtp_base
= tp_base
= 0;
4063 relend
= relocs
+ input_section
->reloc_count
;
4064 for (rel
= relocs
; rel
< relend
; rel
++)
4066 struct alpha_elf_link_hash_entry
*h
= NULL
;
4067 struct alpha_elf_got_entry
*gotent
;
4068 bfd_reloc_status_type r
;
4069 reloc_howto_type
*howto
;
4070 unsigned long r_symndx
;
4071 Elf_Internal_Sym
*sym
= NULL
;
4072 asection
*sec
= NULL
;
4075 bfd_boolean dynamic_symbol_p
;
4076 bfd_boolean undef_weak_ref
= FALSE
;
4077 unsigned long r_type
;
4079 r_type
= ELF64_R_TYPE(rel
->r_info
);
4080 if (r_type
>= R_ALPHA_max
)
4082 (*_bfd_error_handler
)
4083 (_("%B: unknown relocation type %d"),
4084 input_bfd
, (int) r_type
);
4085 bfd_set_error (bfd_error_bad_value
);
4090 howto
= elf64_alpha_howto_table
+ r_type
;
4091 r_symndx
= ELF64_R_SYM(rel
->r_info
);
4093 /* The symbol for a TLSLDM reloc is ignored. Collapse the
4094 reloc to the 0 symbol so that they all match. */
4095 if (r_type
== R_ALPHA_TLSLDM
)
4098 if (r_symndx
< symtab_hdr
->sh_info
)
4101 sym
= local_syms
+ r_symndx
;
4102 sec
= local_sections
[r_symndx
];
4104 value
= _bfd_elf_rela_local_sym (output_bfd
, sym
, &msec
, rel
);
4106 /* If this is a tp-relative relocation against sym 0,
4107 this is hackery from relax_section. Force the value to
4110 && (r_type
== R_ALPHA_TLSLDM
4111 || r_type
== R_ALPHA_GOTTPREL
4112 || r_type
== R_ALPHA_TPREL64
4113 || r_type
== R_ALPHA_TPRELHI
4114 || r_type
== R_ALPHA_TPRELLO
4115 || r_type
== R_ALPHA_TPREL16
))
4118 if (local_got_entries
)
4119 gotent
= local_got_entries
[r_symndx
];
4123 /* Need to adjust local GOT entries' addends for SEC_MERGE
4124 unless it has been done already. */
4125 if ((sec
->flags
& SEC_MERGE
)
4126 && ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
4127 && sec
->sec_info_type
== ELF_INFO_TYPE_MERGE
4129 && !gotent
->reloc_xlated
)
4131 struct alpha_elf_got_entry
*ent
;
4133 for (ent
= gotent
; ent
; ent
= ent
->next
)
4135 ent
->reloc_xlated
= 1;
4136 if (ent
->use_count
== 0)
4140 _bfd_merged_section_offset (output_bfd
, &msec
,
4141 elf_section_data (sec
)->
4143 sym
->st_value
+ ent
->addend
);
4144 ent
->addend
-= sym
->st_value
;
4145 ent
->addend
+= msec
->output_section
->vma
4146 + msec
->output_offset
4147 - sec
->output_section
->vma
4148 - sec
->output_offset
;
4152 dynamic_symbol_p
= FALSE
;
4157 bfd_boolean unresolved_reloc
;
4158 struct elf_link_hash_entry
*hh
;
4159 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (input_bfd
);
4161 RELOC_FOR_GLOBAL_SYMBOL (info
, input_bfd
, input_section
, rel
,
4162 r_symndx
, symtab_hdr
, sym_hashes
,
4164 unresolved_reloc
, warned
);
4170 && ! unresolved_reloc
4171 && hh
->root
.type
== bfd_link_hash_undefweak
)
4172 undef_weak_ref
= TRUE
;
4174 h
= (struct alpha_elf_link_hash_entry
*) hh
;
4175 dynamic_symbol_p
= alpha_elf_dynamic_symbol_p (&h
->root
, info
);
4176 gotent
= h
->got_entries
;
4179 addend
= rel
->r_addend
;
4182 /* Search for the proper got entry. */
4183 for (; gotent
; gotent
= gotent
->next
)
4184 if (gotent
->gotobj
== gotobj
4185 && gotent
->reloc_type
== r_type
4186 && gotent
->addend
== addend
)
4191 case R_ALPHA_GPDISP
:
4193 bfd_byte
*p_ldah
, *p_lda
;
4195 BFD_ASSERT(gp
!= 0);
4197 value
= (input_section
->output_section
->vma
4198 + input_section
->output_offset
4201 p_ldah
= contents
+ rel
->r_offset
;
4202 p_lda
= p_ldah
+ rel
->r_addend
;
4204 r
= elf64_alpha_do_reloc_gpdisp (input_bfd
, gp
- value
,
4209 case R_ALPHA_LITERAL
:
4210 BFD_ASSERT(sgot
!= NULL
);
4211 BFD_ASSERT(gp
!= 0);
4212 BFD_ASSERT(gotent
!= NULL
);
4213 BFD_ASSERT(gotent
->use_count
>= 1);
4215 if (!gotent
->reloc_done
)
4217 gotent
->reloc_done
= 1;
4219 bfd_put_64 (output_bfd
, value
,
4220 sgot
->contents
+ gotent
->got_offset
);
4222 /* If the symbol has been forced local, output a
4223 RELATIVE reloc, otherwise it will be handled in
4224 finish_dynamic_symbol. */
4225 if (info
->shared
&& !dynamic_symbol_p
&& !undef_weak_ref
)
4226 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srelgot
,
4227 gotent
->got_offset
, 0,
4228 R_ALPHA_RELATIVE
, value
);
4231 value
= (sgot
->output_section
->vma
4232 + sgot
->output_offset
4233 + gotent
->got_offset
);
4237 case R_ALPHA_GPREL32
:
4238 /* If the target section was a removed linkonce section,
4239 r_symndx will be zero. In this case, assume that the
4240 switch will not be used, so don't fill it in. If we
4241 do nothing here, we'll get relocation truncated messages,
4242 due to the placement of the application above 4GB. */
4250 case R_ALPHA_GPREL16
:
4251 case R_ALPHA_GPRELLOW
:
4252 if (dynamic_symbol_p
)
4254 (*_bfd_error_handler
)
4255 (_("%B: gp-relative relocation against dynamic symbol %s"),
4256 input_bfd
, h
->root
.root
.root
.string
);
4259 BFD_ASSERT(gp
!= 0);
4263 case R_ALPHA_GPRELHIGH
:
4264 if (dynamic_symbol_p
)
4266 (*_bfd_error_handler
)
4267 (_("%B: gp-relative relocation against dynamic symbol %s"),
4268 input_bfd
, h
->root
.root
.root
.string
);
4271 BFD_ASSERT(gp
!= 0);
4273 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4277 /* A call to a dynamic symbol is definitely out of range of
4278 the 16-bit displacement. Don't bother writing anything. */
4279 if (dynamic_symbol_p
)
4284 /* The regular PC-relative stuff measures from the start of
4285 the instruction rather than the end. */
4289 case R_ALPHA_BRADDR
:
4290 if (dynamic_symbol_p
)
4292 (*_bfd_error_handler
)
4293 (_("%B: pc-relative relocation against dynamic symbol %s"),
4294 input_bfd
, h
->root
.root
.root
.string
);
4297 /* The regular PC-relative stuff measures from the start of
4298 the instruction rather than the end. */
4307 /* The regular PC-relative stuff measures from the start of
4308 the instruction rather than the end. */
4311 /* The source and destination gp must be the same. Note that
4312 the source will always have an assigned gp, since we forced
4313 one in check_relocs, but that the destination may not, as
4314 it might not have had any relocations at all. Also take
4315 care not to crash if H is an undefined symbol. */
4316 if (h
!= NULL
&& sec
!= NULL
4317 && alpha_elf_tdata (sec
->owner
)->gotobj
4318 && gotobj
!= alpha_elf_tdata (sec
->owner
)->gotobj
)
4320 (*_bfd_error_handler
)
4321 (_("%B: change in gp: BRSGP %s"),
4322 input_bfd
, h
->root
.root
.root
.string
);
4326 /* The symbol should be marked either NOPV or STD_GPLOAD. */
4328 other
= h
->root
.other
;
4330 other
= sym
->st_other
;
4331 switch (other
& STO_ALPHA_STD_GPLOAD
)
4333 case STO_ALPHA_NOPV
:
4335 case STO_ALPHA_STD_GPLOAD
:
4340 name
= h
->root
.root
.root
.string
;
4343 name
= (bfd_elf_string_from_elf_section
4344 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
4346 name
= _("<unknown>");
4347 else if (name
[0] == 0)
4348 name
= bfd_section_name (input_bfd
, sec
);
4350 (*_bfd_error_handler
)
4351 (_("%B: !samegp reloc against symbol without .prologue: %s"),
4360 case R_ALPHA_REFLONG
:
4361 case R_ALPHA_REFQUAD
:
4362 case R_ALPHA_DTPREL64
:
4363 case R_ALPHA_TPREL64
:
4365 long dynindx
, dyntype
= r_type
;
4368 /* Careful here to remember RELATIVE relocations for global
4369 variables for symbolic shared objects. */
4371 if (dynamic_symbol_p
)
4373 BFD_ASSERT(h
->root
.dynindx
!= -1);
4374 dynindx
= h
->root
.dynindx
;
4376 addend
= 0, value
= 0;
4378 else if (r_type
== R_ALPHA_DTPREL64
)
4380 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4384 else if (r_type
== R_ALPHA_TPREL64
)
4386 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4393 dynaddend
= value
- dtp_base
;
4395 else if (info
->shared
4397 && (input_section
->flags
& SEC_ALLOC
)
4400 if (r_type
== R_ALPHA_REFLONG
)
4402 (*_bfd_error_handler
)
4403 (_("%B: unhandled dynamic relocation against %s"),
4405 h
->root
.root
.root
.string
);
4409 dyntype
= R_ALPHA_RELATIVE
;
4415 if (input_section
->flags
& SEC_ALLOC
)
4416 elf64_alpha_emit_dynrel (output_bfd
, info
, input_section
,
4417 srel
, rel
->r_offset
, dynindx
,
4418 dyntype
, dynaddend
);
4422 case R_ALPHA_SREL16
:
4423 case R_ALPHA_SREL32
:
4424 case R_ALPHA_SREL64
:
4425 if (dynamic_symbol_p
)
4427 (*_bfd_error_handler
)
4428 (_("%B: pc-relative relocation against dynamic symbol %s"),
4429 input_bfd
, h
->root
.root
.root
.string
);
4432 else if ((info
->shared
|| info
->pie
) && undef_weak_ref
)
4434 (*_bfd_error_handler
)
4435 (_("%B: pc-relative relocation against undefined weak symbol %s"),
4436 input_bfd
, h
->root
.root
.root
.string
);
4441 /* ??? .eh_frame references to discarded sections will be smashed
4442 to relocations against SHN_UNDEF. The .eh_frame format allows
4443 NULL to be encoded as 0 in any format, so this works here. */
4445 howto
= (elf64_alpha_howto_table
4446 + (r_type
- R_ALPHA_SREL32
+ R_ALPHA_REFLONG
));
4449 case R_ALPHA_TLSLDM
:
4450 /* Ignore the symbol for the relocation. The result is always
4451 the current module. */
4452 dynamic_symbol_p
= 0;
4456 if (!gotent
->reloc_done
)
4458 gotent
->reloc_done
= 1;
4460 /* Note that the module index for the main program is 1. */
4461 bfd_put_64 (output_bfd
, !info
->shared
&& !dynamic_symbol_p
,
4462 sgot
->contents
+ gotent
->got_offset
);
4464 /* If the symbol has been forced local, output a
4465 DTPMOD64 reloc, otherwise it will be handled in
4466 finish_dynamic_symbol. */
4467 if (info
->shared
&& !dynamic_symbol_p
)
4468 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srelgot
,
4469 gotent
->got_offset
, 0,
4470 R_ALPHA_DTPMOD64
, 0);
4472 if (dynamic_symbol_p
|| r_type
== R_ALPHA_TLSLDM
)
4476 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4479 bfd_put_64 (output_bfd
, value
,
4480 sgot
->contents
+ gotent
->got_offset
+ 8);
4483 value
= (sgot
->output_section
->vma
4484 + sgot
->output_offset
4485 + gotent
->got_offset
);
4489 case R_ALPHA_DTPRELHI
:
4490 case R_ALPHA_DTPRELLO
:
4491 case R_ALPHA_DTPREL16
:
4492 if (dynamic_symbol_p
)
4494 (*_bfd_error_handler
)
4495 (_("%B: dtp-relative relocation against dynamic symbol %s"),
4496 input_bfd
, h
->root
.root
.root
.string
);
4499 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4501 if (r_type
== R_ALPHA_DTPRELHI
)
4502 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4505 case R_ALPHA_TPRELHI
:
4506 case R_ALPHA_TPRELLO
:
4507 case R_ALPHA_TPREL16
:
4510 (*_bfd_error_handler
)
4511 (_("%B: TLS local exec code cannot be linked into shared objects"),
4515 else if (dynamic_symbol_p
)
4517 (*_bfd_error_handler
)
4518 (_("%B: tp-relative relocation against dynamic symbol %s"),
4519 input_bfd
, h
->root
.root
.root
.string
);
4522 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4524 if (r_type
== R_ALPHA_TPRELHI
)
4525 value
= ((bfd_signed_vma
) value
>> 16) + ((value
>> 15) & 1);
4528 case R_ALPHA_GOTDTPREL
:
4529 case R_ALPHA_GOTTPREL
:
4530 BFD_ASSERT(sgot
!= NULL
);
4531 BFD_ASSERT(gp
!= 0);
4532 BFD_ASSERT(gotent
!= NULL
);
4533 BFD_ASSERT(gotent
->use_count
>= 1);
4535 if (!gotent
->reloc_done
)
4537 gotent
->reloc_done
= 1;
4539 if (dynamic_symbol_p
)
4543 BFD_ASSERT (elf_hash_table (info
)->tls_sec
!= NULL
);
4544 if (r_type
== R_ALPHA_GOTDTPREL
)
4546 else if (!info
->shared
)
4550 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srelgot
,
4551 gotent
->got_offset
, 0,
4557 bfd_put_64 (output_bfd
, value
,
4558 sgot
->contents
+ gotent
->got_offset
);
4561 value
= (sgot
->output_section
->vma
4562 + sgot
->output_offset
4563 + gotent
->got_offset
);
4569 r
= _bfd_final_link_relocate (howto
, input_bfd
, input_section
,
4570 contents
, rel
->r_offset
, value
, 0);
4579 case bfd_reloc_overflow
:
4583 /* Don't warn if the overflow is due to pc relative reloc
4584 against discarded section. Section optimization code should
4587 if (r_symndx
< symtab_hdr
->sh_info
4588 && sec
!= NULL
&& howto
->pc_relative
4589 && elf_discarded_section (sec
))
4596 name
= (bfd_elf_string_from_elf_section
4597 (input_bfd
, symtab_hdr
->sh_link
, sym
->st_name
));
4601 name
= bfd_section_name (input_bfd
, sec
);
4603 if (! ((*info
->callbacks
->reloc_overflow
)
4604 (info
, (h
? &h
->root
.root
: NULL
), name
, howto
->name
,
4605 (bfd_vma
) 0, input_bfd
, input_section
,
4612 case bfd_reloc_outofrange
:
4620 /* Finish up dynamic symbol handling. We set the contents of various
4621 dynamic sections here. */
4624 elf64_alpha_finish_dynamic_symbol (bfd
*output_bfd
, struct bfd_link_info
*info
,
4625 struct elf_link_hash_entry
*h
,
4626 Elf_Internal_Sym
*sym
)
4628 bfd
*dynobj
= elf_hash_table(info
)->dynobj
;
4630 if (h
->plt
.offset
!= MINUS_ONE
)
4632 /* Fill in the .plt entry for this symbol. */
4633 asection
*splt
, *sgot
, *srel
;
4634 Elf_Internal_Rela outrel
;
4636 bfd_vma got_addr
, plt_addr
;
4638 struct alpha_elf_got_entry
*gotent
;
4640 BFD_ASSERT (h
->dynindx
!= -1);
4642 /* The first .got entry will be updated by the .plt with the
4643 address of the target function. */
4644 gotent
= ((struct alpha_elf_link_hash_entry
*) h
)->got_entries
;
4645 BFD_ASSERT (gotent
&& gotent
->addend
== 0);
4647 splt
= bfd_get_section_by_name (dynobj
, ".plt");
4648 BFD_ASSERT (splt
!= NULL
);
4649 srel
= bfd_get_section_by_name (dynobj
, ".rela.plt");
4650 BFD_ASSERT (srel
!= NULL
);
4651 sgot
= alpha_elf_tdata (gotent
->gotobj
)->got
;
4652 BFD_ASSERT (sgot
!= NULL
);
4654 got_addr
= (sgot
->output_section
->vma
4655 + sgot
->output_offset
4656 + gotent
->got_offset
);
4657 plt_addr
= (splt
->output_section
->vma
4658 + splt
->output_offset
4661 plt_index
= (h
->plt
.offset
- PLT_HEADER_SIZE
) / PLT_ENTRY_SIZE
;
4663 /* Fill in the entry in the procedure linkage table. */
4665 bfd_vma insn1
, insn2
, insn3
;
4667 insn1
= PLT_ENTRY_WORD1
| ((-(h
->plt
.offset
+ 4) >> 2) & 0x1fffff);
4668 insn2
= PLT_ENTRY_WORD2
;
4669 insn3
= PLT_ENTRY_WORD3
;
4671 bfd_put_32 (output_bfd
, insn1
, splt
->contents
+ h
->plt
.offset
);
4672 bfd_put_32 (output_bfd
, insn2
, splt
->contents
+ h
->plt
.offset
+ 4);
4673 bfd_put_32 (output_bfd
, insn3
, splt
->contents
+ h
->plt
.offset
+ 8);
4676 /* Fill in the entry in the .rela.plt section. */
4677 outrel
.r_offset
= got_addr
;
4678 outrel
.r_info
= ELF64_R_INFO(h
->dynindx
, R_ALPHA_JMP_SLOT
);
4679 outrel
.r_addend
= 0;
4681 loc
= srel
->contents
+ plt_index
* sizeof (Elf64_External_Rela
);
4682 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
4684 if (!h
->def_regular
)
4686 /* Mark the symbol as undefined, rather than as defined in the
4687 .plt section. Leave the value alone. */
4688 sym
->st_shndx
= SHN_UNDEF
;
4691 /* Fill in the entries in the .got. */
4692 bfd_put_64 (output_bfd
, plt_addr
, sgot
->contents
+ gotent
->got_offset
);
4694 /* Subsequent .got entries will continue to bounce through the .plt. */
4697 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
4698 BFD_ASSERT (! info
->shared
|| srel
!= NULL
);
4700 gotent
= gotent
->next
;
4703 sgot
= alpha_elf_tdata(gotent
->gotobj
)->got
;
4704 BFD_ASSERT(sgot
!= NULL
);
4705 BFD_ASSERT(gotent
->addend
== 0);
4707 bfd_put_64 (output_bfd
, plt_addr
,
4708 sgot
->contents
+ gotent
->got_offset
);
4711 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srel
,
4712 gotent
->got_offset
, 0,
4713 R_ALPHA_RELATIVE
, plt_addr
);
4715 gotent
= gotent
->next
;
4717 while (gotent
!= NULL
);
4720 else if (alpha_elf_dynamic_symbol_p (h
, info
))
4722 /* Fill in the dynamic relocations for this symbol's .got entries. */
4724 struct alpha_elf_got_entry
*gotent
;
4726 srel
= bfd_get_section_by_name (dynobj
, ".rela.got");
4727 BFD_ASSERT (srel
!= NULL
);
4729 for (gotent
= ((struct alpha_elf_link_hash_entry
*) h
)->got_entries
;
4731 gotent
= gotent
->next
)
4736 if (gotent
->use_count
== 0)
4739 sgot
= alpha_elf_tdata (gotent
->gotobj
)->got
;
4741 r_type
= gotent
->reloc_type
;
4744 case R_ALPHA_LITERAL
:
4745 r_type
= R_ALPHA_GLOB_DAT
;
4748 r_type
= R_ALPHA_DTPMOD64
;
4750 case R_ALPHA_GOTDTPREL
:
4751 r_type
= R_ALPHA_DTPREL64
;
4753 case R_ALPHA_GOTTPREL
:
4754 r_type
= R_ALPHA_TPREL64
;
4756 case R_ALPHA_TLSLDM
:
4761 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srel
,
4762 gotent
->got_offset
, h
->dynindx
,
4763 r_type
, gotent
->addend
);
4765 if (gotent
->reloc_type
== R_ALPHA_TLSGD
)
4766 elf64_alpha_emit_dynrel (output_bfd
, info
, sgot
, srel
,
4767 gotent
->got_offset
+ 8, h
->dynindx
,
4768 R_ALPHA_DTPREL64
, gotent
->addend
);
4772 /* Mark some specially defined symbols as absolute. */
4773 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
4774 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
4775 || strcmp (h
->root
.root
.string
, "_PROCEDURE_LINKAGE_TABLE_") == 0)
4776 sym
->st_shndx
= SHN_ABS
;
4781 /* Finish up the dynamic sections. */
4784 elf64_alpha_finish_dynamic_sections (bfd
*output_bfd
,
4785 struct bfd_link_info
*info
)
4790 dynobj
= elf_hash_table (info
)->dynobj
;
4791 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
4793 if (elf_hash_table (info
)->dynamic_sections_created
)
4796 Elf64_External_Dyn
*dyncon
, *dynconend
;
4798 splt
= bfd_get_section_by_name (dynobj
, ".plt");
4799 BFD_ASSERT (splt
!= NULL
&& sdyn
!= NULL
);
4801 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
4802 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->size
);
4803 for (; dyncon
< dynconend
; dyncon
++)
4805 Elf_Internal_Dyn dyn
;
4809 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
4824 /* My interpretation of the TIS v1.1 ELF document indicates
4825 that RELASZ should not include JMPREL. This is not what
4826 the rest of the BFD does. It is, however, what the
4827 glibc ld.so wants. Do this fixup here until we found
4828 out who is right. */
4829 s
= bfd_get_section_by_name (output_bfd
, ".rela.plt");
4831 dyn
.d_un
.d_val
-= s
->size
;
4835 s
= bfd_get_section_by_name (output_bfd
, name
);
4836 dyn
.d_un
.d_ptr
= (s
? s
->vma
: 0);
4840 s
= bfd_get_section_by_name (output_bfd
, name
);
4841 dyn
.d_un
.d_val
= s
->size
;
4845 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
4848 /* Initialize the PLT0 entry. */
4851 bfd_put_32 (output_bfd
, PLT_HEADER_WORD1
, splt
->contents
);
4852 bfd_put_32 (output_bfd
, PLT_HEADER_WORD2
, splt
->contents
+ 4);
4853 bfd_put_32 (output_bfd
, PLT_HEADER_WORD3
, splt
->contents
+ 8);
4854 bfd_put_32 (output_bfd
, PLT_HEADER_WORD4
, splt
->contents
+ 12);
4856 /* The next two words will be filled in by ld.so */
4857 bfd_put_64 (output_bfd
, (bfd_vma
) 0, splt
->contents
+ 16);
4858 bfd_put_64 (output_bfd
, (bfd_vma
) 0, splt
->contents
+ 24);
4860 elf_section_data (splt
->output_section
)->this_hdr
.sh_entsize
= 0;
4867 /* We need to use a special link routine to handle the .mdebug section.
4868 We need to merge all instances of these sections together, not write
4869 them all out sequentially. */
4872 elf64_alpha_final_link (bfd
*abfd
, struct bfd_link_info
*info
)
4875 struct bfd_link_order
*p
;
4876 asection
*mdebug_sec
;
4877 struct ecoff_debug_info debug
;
4878 const struct ecoff_debug_swap
*swap
4879 = get_elf_backend_data (abfd
)->elf_backend_ecoff_debug_swap
;
4880 HDRR
*symhdr
= &debug
.symbolic_header
;
4881 PTR mdebug_handle
= NULL
;
4883 /* Go through the sections and collect the mdebug information. */
4885 for (o
= abfd
->sections
; o
!= (asection
*) NULL
; o
= o
->next
)
4887 if (strcmp (o
->name
, ".mdebug") == 0)
4889 struct extsym_info einfo
;
4891 /* We have found the .mdebug section in the output file.
4892 Look through all the link_orders comprising it and merge
4893 the information together. */
4894 symhdr
->magic
= swap
->sym_magic
;
4895 /* FIXME: What should the version stamp be? */
4897 symhdr
->ilineMax
= 0;
4901 symhdr
->isymMax
= 0;
4902 symhdr
->ioptMax
= 0;
4903 symhdr
->iauxMax
= 0;
4905 symhdr
->issExtMax
= 0;
4908 symhdr
->iextMax
= 0;
4910 /* We accumulate the debugging information itself in the
4911 debug_info structure. */
4913 debug
.external_dnr
= NULL
;
4914 debug
.external_pdr
= NULL
;
4915 debug
.external_sym
= NULL
;
4916 debug
.external_opt
= NULL
;
4917 debug
.external_aux
= NULL
;
4919 debug
.ssext
= debug
.ssext_end
= NULL
;
4920 debug
.external_fdr
= NULL
;
4921 debug
.external_rfd
= NULL
;
4922 debug
.external_ext
= debug
.external_ext_end
= NULL
;
4924 mdebug_handle
= bfd_ecoff_debug_init (abfd
, &debug
, swap
, info
);
4925 if (mdebug_handle
== (PTR
) NULL
)
4934 static const char * const name
[] =
4936 ".text", ".init", ".fini", ".data",
4937 ".rodata", ".sdata", ".sbss", ".bss"
4939 static const int sc
[] = { scText
, scInit
, scFini
, scData
,
4940 scRData
, scSData
, scSBss
, scBss
};
4943 esym
.cobol_main
= 0;
4947 esym
.asym
.iss
= issNil
;
4948 esym
.asym
.st
= stLocal
;
4949 esym
.asym
.reserved
= 0;
4950 esym
.asym
.index
= indexNil
;
4951 for (i
= 0; i
< 8; i
++)
4953 esym
.asym
.sc
= sc
[i
];
4954 s
= bfd_get_section_by_name (abfd
, name
[i
]);
4957 esym
.asym
.value
= s
->vma
;
4958 last
= s
->vma
+ s
->size
;
4961 esym
.asym
.value
= last
;
4963 if (! bfd_ecoff_debug_one_external (abfd
, &debug
, swap
,
4969 for (p
= o
->map_head
.link_order
;
4970 p
!= (struct bfd_link_order
*) NULL
;
4973 asection
*input_section
;
4975 const struct ecoff_debug_swap
*input_swap
;
4976 struct ecoff_debug_info input_debug
;
4980 if (p
->type
!= bfd_indirect_link_order
)
4982 if (p
->type
== bfd_data_link_order
)
4987 input_section
= p
->u
.indirect
.section
;
4988 input_bfd
= input_section
->owner
;
4990 if (bfd_get_flavour (input_bfd
) != bfd_target_elf_flavour
4991 || (get_elf_backend_data (input_bfd
)
4992 ->elf_backend_ecoff_debug_swap
) == NULL
)
4994 /* I don't know what a non ALPHA ELF bfd would be
4995 doing with a .mdebug section, but I don't really
4996 want to deal with it. */
5000 input_swap
= (get_elf_backend_data (input_bfd
)
5001 ->elf_backend_ecoff_debug_swap
);
5003 BFD_ASSERT (p
->size
== input_section
->size
);
5005 /* The ECOFF linking code expects that we have already
5006 read in the debugging information and set up an
5007 ecoff_debug_info structure, so we do that now. */
5008 if (!elf64_alpha_read_ecoff_info (input_bfd
, input_section
,
5012 if (! (bfd_ecoff_debug_accumulate
5013 (mdebug_handle
, abfd
, &debug
, swap
, input_bfd
,
5014 &input_debug
, input_swap
, info
)))
5017 /* Loop through the external symbols. For each one with
5018 interesting information, try to find the symbol in
5019 the linker global hash table and save the information
5020 for the output external symbols. */
5021 eraw_src
= input_debug
.external_ext
;
5022 eraw_end
= (eraw_src
5023 + (input_debug
.symbolic_header
.iextMax
5024 * input_swap
->external_ext_size
));
5026 eraw_src
< eraw_end
;
5027 eraw_src
+= input_swap
->external_ext_size
)
5031 struct alpha_elf_link_hash_entry
*h
;
5033 (*input_swap
->swap_ext_in
) (input_bfd
, (PTR
) eraw_src
, &ext
);
5034 if (ext
.asym
.sc
== scNil
5035 || ext
.asym
.sc
== scUndefined
5036 || ext
.asym
.sc
== scSUndefined
)
5039 name
= input_debug
.ssext
+ ext
.asym
.iss
;
5040 h
= alpha_elf_link_hash_lookup (alpha_elf_hash_table (info
),
5041 name
, FALSE
, FALSE
, TRUE
);
5042 if (h
== NULL
|| h
->esym
.ifd
!= -2)
5048 < input_debug
.symbolic_header
.ifdMax
);
5049 ext
.ifd
= input_debug
.ifdmap
[ext
.ifd
];
5055 /* Free up the information we just read. */
5056 free (input_debug
.line
);
5057 free (input_debug
.external_dnr
);
5058 free (input_debug
.external_pdr
);
5059 free (input_debug
.external_sym
);
5060 free (input_debug
.external_opt
);
5061 free (input_debug
.external_aux
);
5062 free (input_debug
.ss
);
5063 free (input_debug
.ssext
);
5064 free (input_debug
.external_fdr
);
5065 free (input_debug
.external_rfd
);
5066 free (input_debug
.external_ext
);
5068 /* Hack: reset the SEC_HAS_CONTENTS flag so that
5069 elf_link_input_bfd ignores this section. */
5070 input_section
->flags
&=~ SEC_HAS_CONTENTS
;
5073 /* Build the external symbol information. */
5076 einfo
.debug
= &debug
;
5078 einfo
.failed
= FALSE
;
5079 elf_link_hash_traverse (elf_hash_table (info
),
5080 elf64_alpha_output_extsym
,
5085 /* Set the size of the .mdebug section. */
5086 o
->size
= bfd_ecoff_debug_size (abfd
, &debug
, swap
);
5088 /* Skip this section later on (I don't think this currently
5089 matters, but someday it might). */
5090 o
->map_head
.link_order
= (struct bfd_link_order
*) NULL
;
5096 /* Invoke the regular ELF backend linker to do all the work. */
5097 if (! bfd_elf_final_link (abfd
, info
))
5100 /* Now write out the computed sections. */
5102 /* The .got subsections... */
5104 bfd
*i
, *dynobj
= elf_hash_table(info
)->dynobj
;
5105 for (i
= alpha_elf_hash_table(info
)->got_list
;
5107 i
= alpha_elf_tdata(i
)->got_link_next
)
5111 /* elf_bfd_final_link already did everything in dynobj. */
5115 sgot
= alpha_elf_tdata(i
)->got
;
5116 if (! bfd_set_section_contents (abfd
, sgot
->output_section
,
5118 (file_ptr
) sgot
->output_offset
,
5124 if (mdebug_sec
!= (asection
*) NULL
)
5126 BFD_ASSERT (abfd
->output_has_begun
);
5127 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle
, abfd
, &debug
,
5129 mdebug_sec
->filepos
))
5132 bfd_ecoff_debug_free (mdebug_handle
, abfd
, &debug
, swap
, info
);
5138 static enum elf_reloc_type_class
5139 elf64_alpha_reloc_type_class (const Elf_Internal_Rela
*rela
)
5141 switch ((int) ELF64_R_TYPE (rela
->r_info
))
5143 case R_ALPHA_RELATIVE
:
5144 return reloc_class_relative
;
5145 case R_ALPHA_JMP_SLOT
:
5146 return reloc_class_plt
;
5148 return reloc_class_copy
;
5150 return reloc_class_normal
;
5154 static struct bfd_elf_special_section
const
5155 alpha_special_sections_s
[]=
5157 { ".sdata", 6, -2, SHT_PROGBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_ALPHA_GPREL
},
5158 { ".sbss", 5, -2, SHT_NOBITS
, SHF_ALLOC
+ SHF_WRITE
+ SHF_ALPHA_GPREL
},
5159 { NULL
, 0, 0, 0, 0 }
5162 static struct bfd_elf_special_section
const *
5163 elf64_alpha_special_sections
[27] =
5183 alpha_special_sections_s
, /* 's' */
5194 /* ECOFF swapping routines. These are used when dealing with the
5195 .mdebug section, which is in the ECOFF debugging format. Copied
5196 from elf32-mips.c. */
5197 static const struct ecoff_debug_swap
5198 elf64_alpha_ecoff_debug_swap
=
5200 /* Symbol table magic number. */
5202 /* Alignment of debugging information. E.g., 4. */
5204 /* Sizes of external symbolic information. */
5205 sizeof (struct hdr_ext
),
5206 sizeof (struct dnr_ext
),
5207 sizeof (struct pdr_ext
),
5208 sizeof (struct sym_ext
),
5209 sizeof (struct opt_ext
),
5210 sizeof (struct fdr_ext
),
5211 sizeof (struct rfd_ext
),
5212 sizeof (struct ext_ext
),
5213 /* Functions to swap in external symbolic data. */
5222 _bfd_ecoff_swap_tir_in
,
5223 _bfd_ecoff_swap_rndx_in
,
5224 /* Functions to swap out external symbolic data. */
5233 _bfd_ecoff_swap_tir_out
,
5234 _bfd_ecoff_swap_rndx_out
,
5235 /* Function to read in symbolic data. */
5236 elf64_alpha_read_ecoff_info
5239 /* Use a non-standard hash bucket size of 8. */
5241 static const struct elf_size_info alpha_elf_size_info
=
5243 sizeof (Elf64_External_Ehdr
),
5244 sizeof (Elf64_External_Phdr
),
5245 sizeof (Elf64_External_Shdr
),
5246 sizeof (Elf64_External_Rel
),
5247 sizeof (Elf64_External_Rela
),
5248 sizeof (Elf64_External_Sym
),
5249 sizeof (Elf64_External_Dyn
),
5250 sizeof (Elf_External_Note
),
5254 ELFCLASS64
, EV_CURRENT
,
5255 bfd_elf64_write_out_phdrs
,
5256 bfd_elf64_write_shdrs_and_ehdr
,
5257 bfd_elf64_write_relocs
,
5258 bfd_elf64_swap_symbol_in
,
5259 bfd_elf64_swap_symbol_out
,
5260 bfd_elf64_slurp_reloc_table
,
5261 bfd_elf64_slurp_symbol_table
,
5262 bfd_elf64_swap_dyn_in
,
5263 bfd_elf64_swap_dyn_out
,
5264 bfd_elf64_swap_reloc_in
,
5265 bfd_elf64_swap_reloc_out
,
5266 bfd_elf64_swap_reloca_in
,
5267 bfd_elf64_swap_reloca_out
5270 #define TARGET_LITTLE_SYM bfd_elf64_alpha_vec
5271 #define TARGET_LITTLE_NAME "elf64-alpha"
5272 #define ELF_ARCH bfd_arch_alpha
5273 #define ELF_MACHINE_CODE EM_ALPHA
5274 #define ELF_MAXPAGESIZE 0x10000
5276 #define bfd_elf64_bfd_link_hash_table_create \
5277 elf64_alpha_bfd_link_hash_table_create
5279 #define bfd_elf64_bfd_reloc_type_lookup \
5280 elf64_alpha_bfd_reloc_type_lookup
5281 #define elf_info_to_howto \
5282 elf64_alpha_info_to_howto
5284 #define bfd_elf64_mkobject \
5285 elf64_alpha_mkobject
5286 #define elf_backend_object_p \
5287 elf64_alpha_object_p
5289 #define elf_backend_section_from_shdr \
5290 elf64_alpha_section_from_shdr
5291 #define elf_backend_section_flags \
5292 elf64_alpha_section_flags
5293 #define elf_backend_fake_sections \
5294 elf64_alpha_fake_sections
5296 #define bfd_elf64_bfd_is_local_label_name \
5297 elf64_alpha_is_local_label_name
5298 #define bfd_elf64_find_nearest_line \
5299 elf64_alpha_find_nearest_line
5300 #define bfd_elf64_bfd_relax_section \
5301 elf64_alpha_relax_section
5303 #define elf_backend_add_symbol_hook \
5304 elf64_alpha_add_symbol_hook
5305 #define elf_backend_check_relocs \
5306 elf64_alpha_check_relocs
5307 #define elf_backend_create_dynamic_sections \
5308 elf64_alpha_create_dynamic_sections
5309 #define elf_backend_adjust_dynamic_symbol \
5310 elf64_alpha_adjust_dynamic_symbol
5311 #define elf_backend_always_size_sections \
5312 elf64_alpha_always_size_sections
5313 #define elf_backend_size_dynamic_sections \
5314 elf64_alpha_size_dynamic_sections
5315 #define elf_backend_relocate_section \
5316 elf64_alpha_relocate_section
5317 #define elf_backend_finish_dynamic_symbol \
5318 elf64_alpha_finish_dynamic_symbol
5319 #define elf_backend_finish_dynamic_sections \
5320 elf64_alpha_finish_dynamic_sections
5321 #define bfd_elf64_bfd_final_link \
5322 elf64_alpha_final_link
5323 #define elf_backend_reloc_type_class \
5324 elf64_alpha_reloc_type_class
5326 #define elf_backend_ecoff_debug_swap \
5327 &elf64_alpha_ecoff_debug_swap
5329 #define elf_backend_size_info \
5332 #define elf_backend_special_sections \
5333 elf64_alpha_special_sections
5335 /* A few constants that determine how the .plt section is set up. */
5336 #define elf_backend_want_got_plt 0
5337 #define elf_backend_plt_readonly 0
5338 #define elf_backend_want_plt_sym 1
5339 #define elf_backend_got_header_size 0
5341 #include "elf64-target.h"
5343 /* FreeBSD support. */
5345 #undef TARGET_LITTLE_SYM
5346 #define TARGET_LITTLE_SYM bfd_elf64_alpha_freebsd_vec
5347 #undef TARGET_LITTLE_NAME
5348 #define TARGET_LITTLE_NAME "elf64-alpha-freebsd"
5350 /* The kernel recognizes executables as valid only if they carry a
5351 "FreeBSD" label in the ELF header. So we put this label on all
5352 executables and (for simplicity) also all other object files. */
5355 elf64_alpha_fbsd_post_process_headers (bfd
* abfd
,
5356 struct bfd_link_info
* link_info ATTRIBUTE_UNUSED
)
5358 Elf_Internal_Ehdr
* i_ehdrp
; /* ELF file header, internal form. */
5360 i_ehdrp
= elf_elfheader (abfd
);
5362 /* Put an ABI label supported by FreeBSD >= 4.1. */
5363 i_ehdrp
->e_ident
[EI_OSABI
] = ELFOSABI_FREEBSD
;
5364 #ifdef OLD_FREEBSD_ABI_LABEL
5365 /* The ABI label supported by FreeBSD <= 4.0 is quite nonstandard. */
5366 memcpy (&i_ehdrp
->e_ident
[EI_ABIVERSION
], "FreeBSD", 8);
5370 #undef elf_backend_post_process_headers
5371 #define elf_backend_post_process_headers \
5372 elf64_alpha_fbsd_post_process_headers
5375 #define elf64_bed elf64_alpha_fbsd_bed
5377 #include "elf64-target.h"