1 /* PowerPC-specific support for 32-bit ELF
2 Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
4 Written by Ian Lance Taylor, Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* This file is based on a preliminary PowerPC ELF ABI. The
23 information may not match the final PowerPC ELF ABI. It includes
24 suggestions from the in-progress Embedded PowerPC ABI, and that
25 information may also not match. */
33 #include "elf32-ppc.h"
35 /* RELA relocations are used here. */
37 static struct bfd_hash_entry
*ppc_elf_link_hash_newfunc
38 PARAMS ((struct bfd_hash_entry
*entry
, struct bfd_hash_table
*table
,
40 static struct bfd_link_hash_table
*ppc_elf_link_hash_table_create
42 static void ppc_elf_copy_indirect_symbol
43 PARAMS ((struct elf_backend_data
*bed
, struct elf_link_hash_entry
*dir
,
44 struct elf_link_hash_entry
*ind
));
45 static reloc_howto_type
*ppc_elf_reloc_type_lookup
46 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
47 static void ppc_elf_info_to_howto
48 PARAMS ((bfd
*abfd
, arelent
*cache_ptr
, Elf_Internal_Rela
*dst
));
49 static void ppc_elf_howto_init
51 static int ppc_elf_sort_rela
52 PARAMS ((const PTR
, const PTR
));
53 static bfd_boolean ppc_elf_relax_section
54 PARAMS ((bfd
*, asection
*, struct bfd_link_info
*, bfd_boolean
*));
55 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
56 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
57 static bfd_reloc_status_type ppc_elf_unhandled_reloc
58 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
59 static bfd_boolean ppc_elf_object_p
61 static bfd_boolean ppc_elf_set_private_flags
62 PARAMS ((bfd
*, flagword
));
63 static bfd_boolean ppc_elf_merge_private_bfd_data
64 PARAMS ((bfd
*, bfd
*));
65 static int ppc_elf_additional_program_headers
67 static bfd_boolean ppc_elf_modify_segment_map
69 static bfd_boolean ppc_elf_create_got
70 PARAMS ((bfd
*, struct bfd_link_info
*));
71 static bfd_boolean ppc_elf_create_dynamic_sections
72 PARAMS ((bfd
*, struct bfd_link_info
*));
73 static bfd_boolean ppc_elf_section_from_shdr
74 PARAMS ((bfd
*, Elf_Internal_Shdr
*, const char *));
75 static bfd_boolean ppc_elf_fake_sections
76 PARAMS ((bfd
*, Elf_Internal_Shdr
*, asection
*));
77 static elf_linker_section_t
*ppc_elf_create_linker_section
78 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
,
79 enum elf_linker_section_enum
));
80 static bfd_boolean update_local_sym_info
81 PARAMS ((bfd
*, Elf_Internal_Shdr
*, unsigned long, int));
82 static void bad_shared_reloc
83 PARAMS ((bfd
*, enum elf_ppc_reloc_type
));
84 static bfd_boolean ppc_elf_check_relocs
85 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
86 const Elf_Internal_Rela
*));
87 static asection
*ppc_elf_gc_mark_hook
88 PARAMS ((asection
*sec
, struct bfd_link_info
*info
, Elf_Internal_Rela
*rel
,
89 struct elf_link_hash_entry
*h
, Elf_Internal_Sym
*sym
));
90 static bfd_boolean ppc_elf_gc_sweep_hook
91 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
, asection
*sec
,
92 const Elf_Internal_Rela
*relocs
));
93 static bfd_boolean ppc_elf_adjust_dynamic_symbol
94 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
95 static bfd_boolean allocate_dynrelocs
96 PARAMS ((struct elf_link_hash_entry
*, PTR
));
97 static bfd_boolean readonly_dynrelocs
98 PARAMS ((struct elf_link_hash_entry
*, PTR
));
99 static bfd_boolean ppc_elf_size_dynamic_sections
100 PARAMS ((bfd
*, struct bfd_link_info
*));
101 static bfd_boolean ppc_elf_relocate_section
102 PARAMS ((bfd
*, struct bfd_link_info
*info
, bfd
*, asection
*, bfd_byte
*,
103 Elf_Internal_Rela
*relocs
, Elf_Internal_Sym
*local_syms
,
105 static bfd_boolean ppc_elf_add_symbol_hook
106 PARAMS ((bfd
*, struct bfd_link_info
*, const Elf_Internal_Sym
*,
107 const char **, flagword
*, asection
**, bfd_vma
*));
108 static bfd_boolean ppc_elf_finish_dynamic_symbol
109 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
110 Elf_Internal_Sym
*));
111 static bfd_boolean ppc_elf_finish_dynamic_sections
112 PARAMS ((bfd
*, struct bfd_link_info
*));
113 static enum elf_reloc_type_class ppc_elf_reloc_type_class
114 PARAMS ((const Elf_Internal_Rela
*));
115 static bfd_boolean ppc_elf_grok_prstatus
116 PARAMS ((bfd
*abfd
, Elf_Internal_Note
*note
));
117 static bfd_boolean ppc_elf_grok_psinfo
118 PARAMS ((bfd
*abfd
, Elf_Internal_Note
*note
));
120 /* Branch prediction bit for branch taken relocs. */
121 #define BRANCH_PREDICT_BIT 0x200000
122 /* Mask to set RA in memory instructions. */
123 #define RA_REGISTER_MASK 0x001f0000
124 /* Value to shift register by to insert RA. */
125 #define RA_REGISTER_SHIFT 16
127 /* The name of the dynamic interpreter. This is put in the .interp
129 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
131 /* The size in bytes of an entry in the procedure linkage table. */
132 #define PLT_ENTRY_SIZE 12
133 /* The initial size of the plt reserved for the dynamic linker. */
134 #define PLT_INITIAL_ENTRY_SIZE 72
135 /* The size of the gap between entries in the PLT. */
136 #define PLT_SLOT_SIZE 8
137 /* The number of single-slot PLT entries (the rest use two slots). */
138 #define PLT_NUM_SINGLE_ENTRIES 8192
140 /* Some nop instructions. */
141 #define NOP 0x60000000
142 #define CROR_151515 0x4def7b82
143 #define CROR_313131 0x4ffffb82
145 /* Offset of tp and dtp pointers from start of TLS block. */
146 #define TP_OFFSET 0x7000
147 #define DTP_OFFSET 0x8000
149 /* Will references to this symbol always reference the symbol
151 #define SYMBOL_REFERENCES_LOCAL(INFO, H) \
154 || H->dynindx == -1 \
155 || ELF_ST_VISIBILITY (H->other) == STV_INTERNAL \
156 || ELF_ST_VISIBILITY (H->other) == STV_HIDDEN) \
157 && (H->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
159 /* Will _calls_ to this symbol always call the version in this object? */
160 #define SYMBOL_CALLS_LOCAL(INFO, H) \
163 || H->dynindx == -1 \
164 || ELF_ST_VISIBILITY (H->other) != STV_DEFAULT) \
165 && (H->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0)
167 /* The PPC linker needs to keep track of the number of relocs that it
168 decides to copy as dynamic relocs in check_relocs for each symbol.
169 This is so that it can later discard them if they are found to be
170 unnecessary. We store the information in a field extending the
171 regular ELF linker hash table. */
173 struct ppc_elf_dyn_relocs
175 struct ppc_elf_dyn_relocs
*next
;
177 /* The input section of the reloc. */
180 /* Total number of relocs copied for the input section. */
183 /* Number of pc-relative relocs copied for the input section. */
184 bfd_size_type pc_count
;
187 /* PPC ELF linker hash entry. */
189 struct ppc_elf_link_hash_entry
191 struct elf_link_hash_entry elf
;
193 /* Track dynamic relocs copied for this symbol. */
194 struct ppc_elf_dyn_relocs
*dyn_relocs
;
196 /* Contexts in which symbol is used in the GOT (or TOC).
197 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
198 corresponding relocs are encountered during check_relocs.
199 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
200 indicate the corresponding GOT entry type is not needed. */
201 #define TLS_GD 1 /* GD reloc. */
202 #define TLS_LD 2 /* LD reloc. */
203 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
204 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
205 #define TLS_TLS 16 /* Any TLS reloc. */
206 #define TLS_TPRELGD 32 /* TPREL reloc resulting from GD->IE. */
210 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
212 /* PPC ELF linker hash table. */
214 struct ppc_elf_link_hash_table
216 struct elf_link_hash_table elf
;
218 /* Short-cuts to get to dynamic linker sections. */
227 elf_linker_section_t
*sdata
;
228 elf_linker_section_t
*sdata2
;
230 /* Short-cut to first output tls section. */
233 /* Shortcut to .__tls_get_addr. */
234 struct elf_link_hash_entry
*tls_get_addr
;
236 /* TLS local dynamic got entry handling. */
238 bfd_signed_vma refcount
;
242 /* Small local sym to section mapping cache. */
243 struct sym_sec_cache sym_sec
;
246 /* Get the PPC ELF linker hash table from a link_info structure. */
248 #define ppc_elf_hash_table(p) \
249 ((struct ppc_elf_link_hash_table *) (p)->hash)
251 /* Create an entry in a PPC ELF linker hash table. */
253 static struct bfd_hash_entry
*
254 ppc_elf_link_hash_newfunc (entry
, table
, string
)
255 struct bfd_hash_entry
*entry
;
256 struct bfd_hash_table
*table
;
259 /* Allocate the structure if it has not already been allocated by a
263 entry
= bfd_hash_allocate (table
,
264 sizeof (struct ppc_elf_link_hash_entry
));
269 /* Call the allocation method of the superclass. */
270 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
273 ppc_elf_hash_entry (entry
)->dyn_relocs
= NULL
;
274 ppc_elf_hash_entry (entry
)->tls_mask
= 0;
280 /* Create a PPC ELF linker hash table. */
282 static struct bfd_link_hash_table
*
283 ppc_elf_link_hash_table_create (abfd
)
286 struct ppc_elf_link_hash_table
*ret
;
288 ret
= ((struct ppc_elf_link_hash_table
*)
289 bfd_malloc (sizeof (struct ppc_elf_link_hash_table
)));
293 if (! _bfd_elf_link_hash_table_init (&ret
->elf
, abfd
,
294 ppc_elf_link_hash_newfunc
))
311 ret
->tls_get_addr
= NULL
;
312 ret
->tlsld_got
.refcount
= 0;
313 ret
->sym_sec
.abfd
= NULL
;
315 return &ret
->elf
.root
;
318 /* Copy the extra info we tack onto an elf_link_hash_entry. */
321 ppc_elf_copy_indirect_symbol (bed
, dir
, ind
)
322 struct elf_backend_data
*bed
;
323 struct elf_link_hash_entry
*dir
, *ind
;
325 struct ppc_elf_link_hash_entry
*edir
, *eind
;
327 edir
= (struct ppc_elf_link_hash_entry
*) dir
;
328 eind
= (struct ppc_elf_link_hash_entry
*) ind
;
330 if (eind
->dyn_relocs
!= NULL
)
332 if (edir
->dyn_relocs
!= NULL
)
334 struct ppc_elf_dyn_relocs
**pp
;
335 struct ppc_elf_dyn_relocs
*p
;
337 if (ind
->root
.type
== bfd_link_hash_indirect
)
340 /* Add reloc counts against the weak sym to the strong sym
341 list. Merge any entries against the same section. */
342 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
344 struct ppc_elf_dyn_relocs
*q
;
346 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
347 if (q
->sec
== p
->sec
)
349 q
->pc_count
+= p
->pc_count
;
350 q
->count
+= p
->count
;
357 *pp
= edir
->dyn_relocs
;
360 edir
->dyn_relocs
= eind
->dyn_relocs
;
361 eind
->dyn_relocs
= NULL
;
364 edir
->tls_mask
|= eind
->tls_mask
;
366 _bfd_elf_link_hash_copy_indirect (bed
, dir
, ind
);
369 static reloc_howto_type
*ppc_elf_howto_table
[(int) R_PPC_max
];
371 static reloc_howto_type ppc_elf_howto_raw
[] = {
372 /* This reloc does nothing. */
373 HOWTO (R_PPC_NONE
, /* type */
375 2, /* size (0 = byte, 1 = short, 2 = long) */
377 FALSE
, /* pc_relative */
379 complain_overflow_bitfield
, /* complain_on_overflow */
380 bfd_elf_generic_reloc
, /* special_function */
381 "R_PPC_NONE", /* name */
382 FALSE
, /* partial_inplace */
385 FALSE
), /* pcrel_offset */
387 /* A standard 32 bit relocation. */
388 HOWTO (R_PPC_ADDR32
, /* type */
390 2, /* size (0 = byte, 1 = short, 2 = long) */
392 FALSE
, /* pc_relative */
394 complain_overflow_bitfield
, /* complain_on_overflow */
395 bfd_elf_generic_reloc
, /* special_function */
396 "R_PPC_ADDR32", /* name */
397 FALSE
, /* partial_inplace */
399 0xffffffff, /* dst_mask */
400 FALSE
), /* pcrel_offset */
402 /* An absolute 26 bit branch; the lower two bits must be zero.
403 FIXME: we don't check that, we just clear them. */
404 HOWTO (R_PPC_ADDR24
, /* type */
406 2, /* size (0 = byte, 1 = short, 2 = long) */
408 FALSE
, /* pc_relative */
410 complain_overflow_bitfield
, /* complain_on_overflow */
411 bfd_elf_generic_reloc
, /* special_function */
412 "R_PPC_ADDR24", /* name */
413 FALSE
, /* partial_inplace */
415 0x3fffffc, /* dst_mask */
416 FALSE
), /* pcrel_offset */
418 /* A standard 16 bit relocation. */
419 HOWTO (R_PPC_ADDR16
, /* type */
421 1, /* size (0 = byte, 1 = short, 2 = long) */
423 FALSE
, /* pc_relative */
425 complain_overflow_bitfield
, /* complain_on_overflow */
426 bfd_elf_generic_reloc
, /* special_function */
427 "R_PPC_ADDR16", /* name */
428 FALSE
, /* partial_inplace */
430 0xffff, /* dst_mask */
431 FALSE
), /* pcrel_offset */
433 /* A 16 bit relocation without overflow. */
434 HOWTO (R_PPC_ADDR16_LO
, /* type */
436 1, /* size (0 = byte, 1 = short, 2 = long) */
438 FALSE
, /* pc_relative */
440 complain_overflow_dont
,/* complain_on_overflow */
441 bfd_elf_generic_reloc
, /* special_function */
442 "R_PPC_ADDR16_LO", /* name */
443 FALSE
, /* partial_inplace */
445 0xffff, /* dst_mask */
446 FALSE
), /* pcrel_offset */
448 /* The high order 16 bits of an address. */
449 HOWTO (R_PPC_ADDR16_HI
, /* type */
451 1, /* size (0 = byte, 1 = short, 2 = long) */
453 FALSE
, /* pc_relative */
455 complain_overflow_dont
, /* complain_on_overflow */
456 bfd_elf_generic_reloc
, /* special_function */
457 "R_PPC_ADDR16_HI", /* name */
458 FALSE
, /* partial_inplace */
460 0xffff, /* dst_mask */
461 FALSE
), /* pcrel_offset */
463 /* The high order 16 bits of an address, plus 1 if the contents of
464 the low 16 bits, treated as a signed number, is negative. */
465 HOWTO (R_PPC_ADDR16_HA
, /* type */
467 1, /* size (0 = byte, 1 = short, 2 = long) */
469 FALSE
, /* pc_relative */
471 complain_overflow_dont
, /* complain_on_overflow */
472 ppc_elf_addr16_ha_reloc
, /* special_function */
473 "R_PPC_ADDR16_HA", /* name */
474 FALSE
, /* partial_inplace */
476 0xffff, /* dst_mask */
477 FALSE
), /* pcrel_offset */
479 /* An absolute 16 bit branch; the lower two bits must be zero.
480 FIXME: we don't check that, we just clear them. */
481 HOWTO (R_PPC_ADDR14
, /* type */
483 2, /* size (0 = byte, 1 = short, 2 = long) */
485 FALSE
, /* pc_relative */
487 complain_overflow_bitfield
, /* complain_on_overflow */
488 bfd_elf_generic_reloc
, /* special_function */
489 "R_PPC_ADDR14", /* name */
490 FALSE
, /* partial_inplace */
492 0xfffc, /* dst_mask */
493 FALSE
), /* pcrel_offset */
495 /* An absolute 16 bit branch, for which bit 10 should be set to
496 indicate that the branch is expected to be taken. The lower two
497 bits must be zero. */
498 HOWTO (R_PPC_ADDR14_BRTAKEN
, /* type */
500 2, /* size (0 = byte, 1 = short, 2 = long) */
502 FALSE
, /* pc_relative */
504 complain_overflow_bitfield
, /* complain_on_overflow */
505 bfd_elf_generic_reloc
, /* special_function */
506 "R_PPC_ADDR14_BRTAKEN",/* name */
507 FALSE
, /* partial_inplace */
509 0xfffc, /* dst_mask */
510 FALSE
), /* pcrel_offset */
512 /* An absolute 16 bit branch, for which bit 10 should be set to
513 indicate that the branch is not expected to be taken. The lower
514 two bits must be zero. */
515 HOWTO (R_PPC_ADDR14_BRNTAKEN
, /* type */
517 2, /* size (0 = byte, 1 = short, 2 = long) */
519 FALSE
, /* pc_relative */
521 complain_overflow_bitfield
, /* complain_on_overflow */
522 bfd_elf_generic_reloc
, /* special_function */
523 "R_PPC_ADDR14_BRNTAKEN",/* name */
524 FALSE
, /* partial_inplace */
526 0xfffc, /* dst_mask */
527 FALSE
), /* pcrel_offset */
529 /* A relative 26 bit branch; the lower two bits must be zero. */
530 HOWTO (R_PPC_REL24
, /* type */
532 2, /* size (0 = byte, 1 = short, 2 = long) */
534 TRUE
, /* pc_relative */
536 complain_overflow_signed
, /* complain_on_overflow */
537 bfd_elf_generic_reloc
, /* special_function */
538 "R_PPC_REL24", /* name */
539 FALSE
, /* partial_inplace */
541 0x3fffffc, /* dst_mask */
542 TRUE
), /* pcrel_offset */
544 /* A relative 16 bit branch; the lower two bits must be zero. */
545 HOWTO (R_PPC_REL14
, /* type */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
549 TRUE
, /* pc_relative */
551 complain_overflow_signed
, /* complain_on_overflow */
552 bfd_elf_generic_reloc
, /* special_function */
553 "R_PPC_REL14", /* name */
554 FALSE
, /* partial_inplace */
556 0xfffc, /* dst_mask */
557 TRUE
), /* pcrel_offset */
559 /* A relative 16 bit branch. Bit 10 should be set to indicate that
560 the branch is expected to be taken. The lower two bits must be
562 HOWTO (R_PPC_REL14_BRTAKEN
, /* type */
564 2, /* size (0 = byte, 1 = short, 2 = long) */
566 TRUE
, /* pc_relative */
568 complain_overflow_signed
, /* complain_on_overflow */
569 bfd_elf_generic_reloc
, /* special_function */
570 "R_PPC_REL14_BRTAKEN", /* name */
571 FALSE
, /* partial_inplace */
573 0xfffc, /* dst_mask */
574 TRUE
), /* pcrel_offset */
576 /* A relative 16 bit branch. Bit 10 should be set to indicate that
577 the branch is not expected to be taken. The lower two bits must
579 HOWTO (R_PPC_REL14_BRNTAKEN
, /* type */
581 2, /* size (0 = byte, 1 = short, 2 = long) */
583 TRUE
, /* pc_relative */
585 complain_overflow_signed
, /* complain_on_overflow */
586 bfd_elf_generic_reloc
, /* special_function */
587 "R_PPC_REL14_BRNTAKEN",/* name */
588 FALSE
, /* partial_inplace */
590 0xfffc, /* dst_mask */
591 TRUE
), /* pcrel_offset */
593 /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
595 HOWTO (R_PPC_GOT16
, /* type */
597 1, /* size (0 = byte, 1 = short, 2 = long) */
599 FALSE
, /* pc_relative */
601 complain_overflow_signed
, /* complain_on_overflow */
602 bfd_elf_generic_reloc
, /* special_function */
603 "R_PPC_GOT16", /* name */
604 FALSE
, /* partial_inplace */
606 0xffff, /* dst_mask */
607 FALSE
), /* pcrel_offset */
609 /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
611 HOWTO (R_PPC_GOT16_LO
, /* type */
613 1, /* size (0 = byte, 1 = short, 2 = long) */
615 FALSE
, /* pc_relative */
617 complain_overflow_dont
, /* complain_on_overflow */
618 bfd_elf_generic_reloc
, /* special_function */
619 "R_PPC_GOT16_LO", /* name */
620 FALSE
, /* partial_inplace */
622 0xffff, /* dst_mask */
623 FALSE
), /* pcrel_offset */
625 /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
627 HOWTO (R_PPC_GOT16_HI
, /* type */
629 1, /* size (0 = byte, 1 = short, 2 = long) */
631 FALSE
, /* pc_relative */
633 complain_overflow_bitfield
, /* complain_on_overflow */
634 bfd_elf_generic_reloc
, /* special_function */
635 "R_PPC_GOT16_HI", /* name */
636 FALSE
, /* partial_inplace */
638 0xffff, /* dst_mask */
639 FALSE
), /* pcrel_offset */
641 /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
643 HOWTO (R_PPC_GOT16_HA
, /* type */
645 1, /* size (0 = byte, 1 = short, 2 = long) */
647 FALSE
, /* pc_relative */
649 complain_overflow_bitfield
, /* complain_on_overflow */
650 ppc_elf_addr16_ha_reloc
, /* special_function */
651 "R_PPC_GOT16_HA", /* name */
652 FALSE
, /* partial_inplace */
654 0xffff, /* dst_mask */
655 FALSE
), /* pcrel_offset */
657 /* Like R_PPC_REL24, but referring to the procedure linkage table
658 entry for the symbol. */
659 HOWTO (R_PPC_PLTREL24
, /* type */
661 2, /* size (0 = byte, 1 = short, 2 = long) */
663 TRUE
, /* pc_relative */
665 complain_overflow_signed
, /* complain_on_overflow */
666 bfd_elf_generic_reloc
, /* special_function */
667 "R_PPC_PLTREL24", /* name */
668 FALSE
, /* partial_inplace */
670 0x3fffffc, /* dst_mask */
671 TRUE
), /* pcrel_offset */
673 /* This is used only by the dynamic linker. The symbol should exist
674 both in the object being run and in some shared library. The
675 dynamic linker copies the data addressed by the symbol from the
676 shared library into the object, because the object being
677 run has to have the data at some particular address. */
678 HOWTO (R_PPC_COPY
, /* type */
680 2, /* size (0 = byte, 1 = short, 2 = long) */
682 FALSE
, /* pc_relative */
684 complain_overflow_bitfield
, /* complain_on_overflow */
685 bfd_elf_generic_reloc
, /* special_function */
686 "R_PPC_COPY", /* name */
687 FALSE
, /* partial_inplace */
690 FALSE
), /* pcrel_offset */
692 /* Like R_PPC_ADDR32, but used when setting global offset table
694 HOWTO (R_PPC_GLOB_DAT
, /* type */
696 2, /* size (0 = byte, 1 = short, 2 = long) */
698 FALSE
, /* pc_relative */
700 complain_overflow_bitfield
, /* complain_on_overflow */
701 bfd_elf_generic_reloc
, /* special_function */
702 "R_PPC_GLOB_DAT", /* name */
703 FALSE
, /* partial_inplace */
705 0xffffffff, /* dst_mask */
706 FALSE
), /* pcrel_offset */
708 /* Marks a procedure linkage table entry for a symbol. */
709 HOWTO (R_PPC_JMP_SLOT
, /* type */
711 2, /* size (0 = byte, 1 = short, 2 = long) */
713 FALSE
, /* pc_relative */
715 complain_overflow_bitfield
, /* complain_on_overflow */
716 bfd_elf_generic_reloc
, /* special_function */
717 "R_PPC_JMP_SLOT", /* name */
718 FALSE
, /* partial_inplace */
721 FALSE
), /* pcrel_offset */
723 /* Used only by the dynamic linker. When the object is run, this
724 longword is set to the load address of the object, plus the
726 HOWTO (R_PPC_RELATIVE
, /* type */
728 2, /* size (0 = byte, 1 = short, 2 = long) */
730 FALSE
, /* pc_relative */
732 complain_overflow_bitfield
, /* complain_on_overflow */
733 bfd_elf_generic_reloc
, /* special_function */
734 "R_PPC_RELATIVE", /* name */
735 FALSE
, /* partial_inplace */
737 0xffffffff, /* dst_mask */
738 FALSE
), /* pcrel_offset */
740 /* Like R_PPC_REL24, but uses the value of the symbol within the
741 object rather than the final value. Normally used for
742 _GLOBAL_OFFSET_TABLE_. */
743 HOWTO (R_PPC_LOCAL24PC
, /* type */
745 2, /* size (0 = byte, 1 = short, 2 = long) */
747 TRUE
, /* pc_relative */
749 complain_overflow_signed
, /* complain_on_overflow */
750 bfd_elf_generic_reloc
, /* special_function */
751 "R_PPC_LOCAL24PC", /* name */
752 FALSE
, /* partial_inplace */
754 0x3fffffc, /* dst_mask */
755 TRUE
), /* pcrel_offset */
757 /* Like R_PPC_ADDR32, but may be unaligned. */
758 HOWTO (R_PPC_UADDR32
, /* type */
760 2, /* size (0 = byte, 1 = short, 2 = long) */
762 FALSE
, /* pc_relative */
764 complain_overflow_bitfield
, /* complain_on_overflow */
765 bfd_elf_generic_reloc
, /* special_function */
766 "R_PPC_UADDR32", /* name */
767 FALSE
, /* partial_inplace */
769 0xffffffff, /* dst_mask */
770 FALSE
), /* pcrel_offset */
772 /* Like R_PPC_ADDR16, but may be unaligned. */
773 HOWTO (R_PPC_UADDR16
, /* type */
775 1, /* size (0 = byte, 1 = short, 2 = long) */
777 FALSE
, /* pc_relative */
779 complain_overflow_bitfield
, /* complain_on_overflow */
780 bfd_elf_generic_reloc
, /* special_function */
781 "R_PPC_UADDR16", /* name */
782 FALSE
, /* partial_inplace */
784 0xffff, /* dst_mask */
785 FALSE
), /* pcrel_offset */
787 /* 32-bit PC relative */
788 HOWTO (R_PPC_REL32
, /* type */
790 2, /* size (0 = byte, 1 = short, 2 = long) */
792 TRUE
, /* pc_relative */
794 complain_overflow_bitfield
, /* complain_on_overflow */
795 bfd_elf_generic_reloc
, /* special_function */
796 "R_PPC_REL32", /* name */
797 FALSE
, /* partial_inplace */
799 0xffffffff, /* dst_mask */
800 TRUE
), /* pcrel_offset */
802 /* 32-bit relocation to the symbol's procedure linkage table.
803 FIXME: not supported. */
804 HOWTO (R_PPC_PLT32
, /* type */
806 2, /* size (0 = byte, 1 = short, 2 = long) */
808 FALSE
, /* pc_relative */
810 complain_overflow_bitfield
, /* complain_on_overflow */
811 bfd_elf_generic_reloc
, /* special_function */
812 "R_PPC_PLT32", /* name */
813 FALSE
, /* partial_inplace */
816 FALSE
), /* pcrel_offset */
818 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
819 FIXME: not supported. */
820 HOWTO (R_PPC_PLTREL32
, /* type */
822 2, /* size (0 = byte, 1 = short, 2 = long) */
824 TRUE
, /* pc_relative */
826 complain_overflow_bitfield
, /* complain_on_overflow */
827 bfd_elf_generic_reloc
, /* special_function */
828 "R_PPC_PLTREL32", /* name */
829 FALSE
, /* partial_inplace */
832 TRUE
), /* pcrel_offset */
834 /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
836 HOWTO (R_PPC_PLT16_LO
, /* type */
838 1, /* size (0 = byte, 1 = short, 2 = long) */
840 FALSE
, /* pc_relative */
842 complain_overflow_dont
, /* complain_on_overflow */
843 bfd_elf_generic_reloc
, /* special_function */
844 "R_PPC_PLT16_LO", /* name */
845 FALSE
, /* partial_inplace */
847 0xffff, /* dst_mask */
848 FALSE
), /* pcrel_offset */
850 /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
852 HOWTO (R_PPC_PLT16_HI
, /* type */
854 1, /* size (0 = byte, 1 = short, 2 = long) */
856 FALSE
, /* pc_relative */
858 complain_overflow_bitfield
, /* complain_on_overflow */
859 bfd_elf_generic_reloc
, /* special_function */
860 "R_PPC_PLT16_HI", /* name */
861 FALSE
, /* partial_inplace */
863 0xffff, /* dst_mask */
864 FALSE
), /* pcrel_offset */
866 /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
868 HOWTO (R_PPC_PLT16_HA
, /* type */
870 1, /* size (0 = byte, 1 = short, 2 = long) */
872 FALSE
, /* pc_relative */
874 complain_overflow_bitfield
, /* complain_on_overflow */
875 ppc_elf_addr16_ha_reloc
, /* special_function */
876 "R_PPC_PLT16_HA", /* name */
877 FALSE
, /* partial_inplace */
879 0xffff, /* dst_mask */
880 FALSE
), /* pcrel_offset */
882 /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
884 HOWTO (R_PPC_SDAREL16
, /* type */
886 1, /* size (0 = byte, 1 = short, 2 = long) */
888 FALSE
, /* pc_relative */
890 complain_overflow_signed
, /* complain_on_overflow */
891 bfd_elf_generic_reloc
, /* special_function */
892 "R_PPC_SDAREL16", /* name */
893 FALSE
, /* partial_inplace */
895 0xffff, /* dst_mask */
896 FALSE
), /* pcrel_offset */
898 /* 16-bit section relative relocation. */
899 HOWTO (R_PPC_SECTOFF
, /* type */
901 1, /* size (0 = byte, 1 = short, 2 = long) */
903 FALSE
, /* pc_relative */
905 complain_overflow_bitfield
, /* complain_on_overflow */
906 bfd_elf_generic_reloc
, /* special_function */
907 "R_PPC_SECTOFF", /* name */
908 FALSE
, /* partial_inplace */
910 0xffff, /* dst_mask */
911 FALSE
), /* pcrel_offset */
913 /* 16-bit lower half section relative relocation. */
914 HOWTO (R_PPC_SECTOFF_LO
, /* type */
916 1, /* size (0 = byte, 1 = short, 2 = long) */
918 FALSE
, /* pc_relative */
920 complain_overflow_dont
, /* complain_on_overflow */
921 bfd_elf_generic_reloc
, /* special_function */
922 "R_PPC_SECTOFF_LO", /* name */
923 FALSE
, /* partial_inplace */
925 0xffff, /* dst_mask */
926 FALSE
), /* pcrel_offset */
928 /* 16-bit upper half section relative relocation. */
929 HOWTO (R_PPC_SECTOFF_HI
, /* type */
931 1, /* size (0 = byte, 1 = short, 2 = long) */
933 FALSE
, /* pc_relative */
935 complain_overflow_bitfield
, /* complain_on_overflow */
936 bfd_elf_generic_reloc
, /* special_function */
937 "R_PPC_SECTOFF_HI", /* name */
938 FALSE
, /* partial_inplace */
940 0xffff, /* dst_mask */
941 FALSE
), /* pcrel_offset */
943 /* 16-bit upper half adjusted section relative relocation. */
944 HOWTO (R_PPC_SECTOFF_HA
, /* type */
946 1, /* size (0 = byte, 1 = short, 2 = long) */
948 FALSE
, /* pc_relative */
950 complain_overflow_bitfield
, /* complain_on_overflow */
951 ppc_elf_addr16_ha_reloc
, /* special_function */
952 "R_PPC_SECTOFF_HA", /* name */
953 FALSE
, /* partial_inplace */
955 0xffff, /* dst_mask */
956 FALSE
), /* pcrel_offset */
958 /* Marker reloc for TLS. */
961 2, /* size (0 = byte, 1 = short, 2 = long) */
963 FALSE
, /* pc_relative */
965 complain_overflow_dont
, /* complain_on_overflow */
966 bfd_elf_generic_reloc
, /* special_function */
967 "R_PPC_TLS", /* name */
968 FALSE
, /* partial_inplace */
971 FALSE
), /* pcrel_offset */
973 /* Computes the load module index of the load module that contains the
974 definition of its TLS sym. */
975 HOWTO (R_PPC_DTPMOD32
,
977 2, /* size (0 = byte, 1 = short, 2 = long) */
979 FALSE
, /* pc_relative */
981 complain_overflow_dont
, /* complain_on_overflow */
982 ppc_elf_unhandled_reloc
, /* special_function */
983 "R_PPC_DTPMOD32", /* name */
984 FALSE
, /* partial_inplace */
986 0xffffffff, /* dst_mask */
987 FALSE
), /* pcrel_offset */
989 /* Computes a dtv-relative displacement, the difference between the value
990 of sym+add and the base address of the thread-local storage block that
991 contains the definition of sym, minus 0x8000. */
992 HOWTO (R_PPC_DTPREL32
,
994 2, /* size (0 = byte, 1 = short, 2 = long) */
996 FALSE
, /* pc_relative */
998 complain_overflow_dont
, /* complain_on_overflow */
999 ppc_elf_unhandled_reloc
, /* special_function */
1000 "R_PPC_DTPREL32", /* name */
1001 FALSE
, /* partial_inplace */
1003 0xffffffff, /* dst_mask */
1004 FALSE
), /* pcrel_offset */
1006 /* A 16 bit dtprel reloc. */
1007 HOWTO (R_PPC_DTPREL16
,
1009 1, /* size (0 = byte, 1 = short, 2 = long) */
1011 FALSE
, /* pc_relative */
1013 complain_overflow_signed
, /* complain_on_overflow */
1014 ppc_elf_unhandled_reloc
, /* special_function */
1015 "R_PPC_DTPREL16", /* name */
1016 FALSE
, /* partial_inplace */
1018 0xffff, /* dst_mask */
1019 FALSE
), /* pcrel_offset */
1021 /* Like DTPREL16, but no overflow. */
1022 HOWTO (R_PPC_DTPREL16_LO
,
1024 1, /* size (0 = byte, 1 = short, 2 = long) */
1026 FALSE
, /* pc_relative */
1028 complain_overflow_dont
, /* complain_on_overflow */
1029 ppc_elf_unhandled_reloc
, /* special_function */
1030 "R_PPC_DTPREL16_LO", /* name */
1031 FALSE
, /* partial_inplace */
1033 0xffff, /* dst_mask */
1034 FALSE
), /* pcrel_offset */
1036 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1037 HOWTO (R_PPC_DTPREL16_HI
,
1038 16, /* rightshift */
1039 1, /* size (0 = byte, 1 = short, 2 = long) */
1041 FALSE
, /* pc_relative */
1043 complain_overflow_dont
, /* complain_on_overflow */
1044 ppc_elf_unhandled_reloc
, /* special_function */
1045 "R_PPC_DTPREL16_HI", /* name */
1046 FALSE
, /* partial_inplace */
1048 0xffff, /* dst_mask */
1049 FALSE
), /* pcrel_offset */
1051 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1052 HOWTO (R_PPC_DTPREL16_HA
,
1053 16, /* rightshift */
1054 1, /* size (0 = byte, 1 = short, 2 = long) */
1056 FALSE
, /* pc_relative */
1058 complain_overflow_dont
, /* complain_on_overflow */
1059 ppc_elf_unhandled_reloc
, /* special_function */
1060 "R_PPC_DTPREL16_HA", /* name */
1061 FALSE
, /* partial_inplace */
1063 0xffff, /* dst_mask */
1064 FALSE
), /* pcrel_offset */
1066 /* Computes a tp-relative displacement, the difference between the value of
1067 sym+add and the value of the thread pointer (r13). */
1068 HOWTO (R_PPC_TPREL32
,
1070 2, /* size (0 = byte, 1 = short, 2 = long) */
1072 FALSE
, /* pc_relative */
1074 complain_overflow_dont
, /* complain_on_overflow */
1075 ppc_elf_unhandled_reloc
, /* special_function */
1076 "R_PPC_TPREL32", /* name */
1077 FALSE
, /* partial_inplace */
1079 0xffffffff, /* dst_mask */
1080 FALSE
), /* pcrel_offset */
1082 /* A 16 bit tprel reloc. */
1083 HOWTO (R_PPC_TPREL16
,
1085 1, /* size (0 = byte, 1 = short, 2 = long) */
1087 FALSE
, /* pc_relative */
1089 complain_overflow_signed
, /* complain_on_overflow */
1090 ppc_elf_unhandled_reloc
, /* special_function */
1091 "R_PPC_TPREL16", /* name */
1092 FALSE
, /* partial_inplace */
1094 0xffff, /* dst_mask */
1095 FALSE
), /* pcrel_offset */
1097 /* Like TPREL16, but no overflow. */
1098 HOWTO (R_PPC_TPREL16_LO
,
1100 1, /* size (0 = byte, 1 = short, 2 = long) */
1102 FALSE
, /* pc_relative */
1104 complain_overflow_dont
, /* complain_on_overflow */
1105 ppc_elf_unhandled_reloc
, /* special_function */
1106 "R_PPC_TPREL16_LO", /* name */
1107 FALSE
, /* partial_inplace */
1109 0xffff, /* dst_mask */
1110 FALSE
), /* pcrel_offset */
1112 /* Like TPREL16_LO, but next higher group of 16 bits. */
1113 HOWTO (R_PPC_TPREL16_HI
,
1114 16, /* rightshift */
1115 1, /* size (0 = byte, 1 = short, 2 = long) */
1117 FALSE
, /* pc_relative */
1119 complain_overflow_dont
, /* complain_on_overflow */
1120 ppc_elf_unhandled_reloc
, /* special_function */
1121 "R_PPC_TPREL16_HI", /* name */
1122 FALSE
, /* partial_inplace */
1124 0xffff, /* dst_mask */
1125 FALSE
), /* pcrel_offset */
1127 /* Like TPREL16_HI, but adjust for low 16 bits. */
1128 HOWTO (R_PPC_TPREL16_HA
,
1129 16, /* rightshift */
1130 1, /* size (0 = byte, 1 = short, 2 = long) */
1132 FALSE
, /* pc_relative */
1134 complain_overflow_dont
, /* complain_on_overflow */
1135 ppc_elf_unhandled_reloc
, /* special_function */
1136 "R_PPC_TPREL16_HA", /* name */
1137 FALSE
, /* partial_inplace */
1139 0xffff, /* dst_mask */
1140 FALSE
), /* pcrel_offset */
1142 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1143 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1144 to the first entry. */
1145 HOWTO (R_PPC_GOT_TLSGD16
,
1147 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 FALSE
, /* pc_relative */
1151 complain_overflow_signed
, /* complain_on_overflow */
1152 ppc_elf_unhandled_reloc
, /* special_function */
1153 "R_PPC_GOT_TLSGD16", /* name */
1154 FALSE
, /* partial_inplace */
1156 0xffff, /* dst_mask */
1157 FALSE
), /* pcrel_offset */
1159 /* Like GOT_TLSGD16, but no overflow. */
1160 HOWTO (R_PPC_GOT_TLSGD16_LO
,
1162 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 FALSE
, /* pc_relative */
1166 complain_overflow_dont
, /* complain_on_overflow */
1167 ppc_elf_unhandled_reloc
, /* special_function */
1168 "R_PPC_GOT_TLSGD16_LO", /* name */
1169 FALSE
, /* partial_inplace */
1171 0xffff, /* dst_mask */
1172 FALSE
), /* pcrel_offset */
1174 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1175 HOWTO (R_PPC_GOT_TLSGD16_HI
,
1176 16, /* rightshift */
1177 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 FALSE
, /* pc_relative */
1181 complain_overflow_dont
, /* complain_on_overflow */
1182 ppc_elf_unhandled_reloc
, /* special_function */
1183 "R_PPC_GOT_TLSGD16_HI", /* name */
1184 FALSE
, /* partial_inplace */
1186 0xffff, /* dst_mask */
1187 FALSE
), /* pcrel_offset */
1189 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1190 HOWTO (R_PPC_GOT_TLSGD16_HA
,
1191 16, /* rightshift */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 FALSE
, /* pc_relative */
1196 complain_overflow_dont
, /* complain_on_overflow */
1197 ppc_elf_unhandled_reloc
, /* special_function */
1198 "R_PPC_GOT_TLSGD16_HA", /* name */
1199 FALSE
, /* partial_inplace */
1201 0xffff, /* dst_mask */
1202 FALSE
), /* pcrel_offset */
1204 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1205 with values (sym+add)@dtpmod and zero, and computes the offset to the
1207 HOWTO (R_PPC_GOT_TLSLD16
,
1209 1, /* size (0 = byte, 1 = short, 2 = long) */
1211 FALSE
, /* pc_relative */
1213 complain_overflow_signed
, /* complain_on_overflow */
1214 ppc_elf_unhandled_reloc
, /* special_function */
1215 "R_PPC_GOT_TLSLD16", /* name */
1216 FALSE
, /* partial_inplace */
1218 0xffff, /* dst_mask */
1219 FALSE
), /* pcrel_offset */
1221 /* Like GOT_TLSLD16, but no overflow. */
1222 HOWTO (R_PPC_GOT_TLSLD16_LO
,
1224 1, /* size (0 = byte, 1 = short, 2 = long) */
1226 FALSE
, /* pc_relative */
1228 complain_overflow_dont
, /* complain_on_overflow */
1229 ppc_elf_unhandled_reloc
, /* special_function */
1230 "R_PPC_GOT_TLSLD16_LO", /* name */
1231 FALSE
, /* partial_inplace */
1233 0xffff, /* dst_mask */
1234 FALSE
), /* pcrel_offset */
1236 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1237 HOWTO (R_PPC_GOT_TLSLD16_HI
,
1238 16, /* rightshift */
1239 1, /* size (0 = byte, 1 = short, 2 = long) */
1241 FALSE
, /* pc_relative */
1243 complain_overflow_dont
, /* complain_on_overflow */
1244 ppc_elf_unhandled_reloc
, /* special_function */
1245 "R_PPC_GOT_TLSLD16_HI", /* name */
1246 FALSE
, /* partial_inplace */
1248 0xffff, /* dst_mask */
1249 FALSE
), /* pcrel_offset */
1251 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1252 HOWTO (R_PPC_GOT_TLSLD16_HA
,
1253 16, /* rightshift */
1254 1, /* size (0 = byte, 1 = short, 2 = long) */
1256 FALSE
, /* pc_relative */
1258 complain_overflow_dont
, /* complain_on_overflow */
1259 ppc_elf_unhandled_reloc
, /* special_function */
1260 "R_PPC_GOT_TLSLD16_HA", /* name */
1261 FALSE
, /* partial_inplace */
1263 0xffff, /* dst_mask */
1264 FALSE
), /* pcrel_offset */
1266 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1267 the offset to the entry. */
1268 HOWTO (R_PPC_GOT_DTPREL16
,
1270 1, /* size (0 = byte, 1 = short, 2 = long) */
1272 FALSE
, /* pc_relative */
1274 complain_overflow_signed
, /* complain_on_overflow */
1275 ppc_elf_unhandled_reloc
, /* special_function */
1276 "R_PPC_GOT_DTPREL16", /* name */
1277 FALSE
, /* partial_inplace */
1279 0xffff, /* dst_mask */
1280 FALSE
), /* pcrel_offset */
1282 /* Like GOT_DTPREL16, but no overflow. */
1283 HOWTO (R_PPC_GOT_DTPREL16_LO
,
1285 1, /* size (0 = byte, 1 = short, 2 = long) */
1287 FALSE
, /* pc_relative */
1289 complain_overflow_dont
, /* complain_on_overflow */
1290 ppc_elf_unhandled_reloc
, /* special_function */
1291 "R_PPC_GOT_DTPREL16_LO", /* name */
1292 FALSE
, /* partial_inplace */
1294 0xffff, /* dst_mask */
1295 FALSE
), /* pcrel_offset */
1297 /* Like GOT_DTPREL16_LO, but next higher group of 16 bits. */
1298 HOWTO (R_PPC_GOT_DTPREL16_HI
,
1299 16, /* rightshift */
1300 1, /* size (0 = byte, 1 = short, 2 = long) */
1302 FALSE
, /* pc_relative */
1304 complain_overflow_dont
, /* complain_on_overflow */
1305 ppc_elf_unhandled_reloc
, /* special_function */
1306 "R_PPC_GOT_DTPREL16_HI", /* name */
1307 FALSE
, /* partial_inplace */
1309 0xffff, /* dst_mask */
1310 FALSE
), /* pcrel_offset */
1312 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1313 HOWTO (R_PPC_GOT_DTPREL16_HA
,
1314 16, /* rightshift */
1315 1, /* size (0 = byte, 1 = short, 2 = long) */
1317 FALSE
, /* pc_relative */
1319 complain_overflow_dont
, /* complain_on_overflow */
1320 ppc_elf_unhandled_reloc
, /* special_function */
1321 "R_PPC_GOT_DTPREL16_HA", /* name */
1322 FALSE
, /* partial_inplace */
1324 0xffff, /* dst_mask */
1325 FALSE
), /* pcrel_offset */
1327 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1328 offset to the entry. */
1329 HOWTO (R_PPC_GOT_TPREL16
,
1331 1, /* size (0 = byte, 1 = short, 2 = long) */
1333 FALSE
, /* pc_relative */
1335 complain_overflow_signed
, /* complain_on_overflow */
1336 ppc_elf_unhandled_reloc
, /* special_function */
1337 "R_PPC_GOT_TPREL16", /* name */
1338 FALSE
, /* partial_inplace */
1340 0xffff, /* dst_mask */
1341 FALSE
), /* pcrel_offset */
1343 /* Like GOT_TPREL16, but no overflow. */
1344 HOWTO (R_PPC_GOT_TPREL16_LO
,
1346 1, /* size (0 = byte, 1 = short, 2 = long) */
1348 FALSE
, /* pc_relative */
1350 complain_overflow_dont
, /* complain_on_overflow */
1351 ppc_elf_unhandled_reloc
, /* special_function */
1352 "R_PPC_GOT_TPREL16_LO", /* name */
1353 FALSE
, /* partial_inplace */
1355 0xffff, /* dst_mask */
1356 FALSE
), /* pcrel_offset */
1358 /* Like GOT_TPREL16_LO, but next higher group of 16 bits. */
1359 HOWTO (R_PPC_GOT_TPREL16_HI
,
1360 16, /* rightshift */
1361 1, /* size (0 = byte, 1 = short, 2 = long) */
1363 FALSE
, /* pc_relative */
1365 complain_overflow_dont
, /* complain_on_overflow */
1366 ppc_elf_unhandled_reloc
, /* special_function */
1367 "R_PPC_GOT_TPREL16_HI", /* name */
1368 FALSE
, /* partial_inplace */
1370 0xffff, /* dst_mask */
1371 FALSE
), /* pcrel_offset */
1373 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1374 HOWTO (R_PPC_GOT_TPREL16_HA
,
1375 16, /* rightshift */
1376 1, /* size (0 = byte, 1 = short, 2 = long) */
1378 FALSE
, /* pc_relative */
1380 complain_overflow_dont
, /* complain_on_overflow */
1381 ppc_elf_unhandled_reloc
, /* special_function */
1382 "R_PPC_GOT_TPREL16_HA", /* name */
1383 FALSE
, /* partial_inplace */
1385 0xffff, /* dst_mask */
1386 FALSE
), /* pcrel_offset */
1388 /* The remaining relocs are from the Embedded ELF ABI, and are not
1389 in the SVR4 ELF ABI. */
1391 /* 32 bit value resulting from the addend minus the symbol. */
1392 HOWTO (R_PPC_EMB_NADDR32
, /* type */
1394 2, /* size (0 = byte, 1 = short, 2 = long) */
1396 FALSE
, /* pc_relative */
1398 complain_overflow_bitfield
, /* complain_on_overflow */
1399 bfd_elf_generic_reloc
, /* special_function */
1400 "R_PPC_EMB_NADDR32", /* name */
1401 FALSE
, /* partial_inplace */
1403 0xffffffff, /* dst_mask */
1404 FALSE
), /* pcrel_offset */
1406 /* 16 bit value resulting from the addend minus the symbol. */
1407 HOWTO (R_PPC_EMB_NADDR16
, /* type */
1409 1, /* size (0 = byte, 1 = short, 2 = long) */
1411 FALSE
, /* pc_relative */
1413 complain_overflow_bitfield
, /* complain_on_overflow */
1414 bfd_elf_generic_reloc
, /* special_function */
1415 "R_PPC_EMB_NADDR16", /* name */
1416 FALSE
, /* partial_inplace */
1418 0xffff, /* dst_mask */
1419 FALSE
), /* pcrel_offset */
1421 /* 16 bit value resulting from the addend minus the symbol. */
1422 HOWTO (R_PPC_EMB_NADDR16_LO
, /* type */
1424 1, /* size (0 = byte, 1 = short, 2 = long) */
1426 FALSE
, /* pc_relative */
1428 complain_overflow_dont
,/* complain_on_overflow */
1429 bfd_elf_generic_reloc
, /* special_function */
1430 "R_PPC_EMB_ADDR16_LO", /* name */
1431 FALSE
, /* partial_inplace */
1433 0xffff, /* dst_mask */
1434 FALSE
), /* pcrel_offset */
1436 /* The high order 16 bits of the addend minus the symbol. */
1437 HOWTO (R_PPC_EMB_NADDR16_HI
, /* type */
1438 16, /* rightshift */
1439 1, /* size (0 = byte, 1 = short, 2 = long) */
1441 FALSE
, /* pc_relative */
1443 complain_overflow_dont
, /* complain_on_overflow */
1444 bfd_elf_generic_reloc
, /* special_function */
1445 "R_PPC_EMB_NADDR16_HI", /* name */
1446 FALSE
, /* partial_inplace */
1448 0xffff, /* dst_mask */
1449 FALSE
), /* pcrel_offset */
1451 /* The high order 16 bits of the result of the addend minus the address,
1452 plus 1 if the contents of the low 16 bits, treated as a signed number,
1454 HOWTO (R_PPC_EMB_NADDR16_HA
, /* type */
1455 16, /* rightshift */
1456 1, /* size (0 = byte, 1 = short, 2 = long) */
1458 FALSE
, /* pc_relative */
1460 complain_overflow_dont
, /* complain_on_overflow */
1461 ppc_elf_addr16_ha_reloc
, /* special_function */
1462 "R_PPC_EMB_NADDR16_HA", /* name */
1463 FALSE
, /* partial_inplace */
1465 0xffff, /* dst_mask */
1466 FALSE
), /* pcrel_offset */
1468 /* 16 bit value resulting from allocating a 4 byte word to hold an
1469 address in the .sdata section, and returning the offset from
1470 _SDA_BASE_ for that relocation. */
1471 HOWTO (R_PPC_EMB_SDAI16
, /* type */
1473 1, /* size (0 = byte, 1 = short, 2 = long) */
1475 FALSE
, /* pc_relative */
1477 complain_overflow_bitfield
, /* complain_on_overflow */
1478 bfd_elf_generic_reloc
, /* special_function */
1479 "R_PPC_EMB_SDAI16", /* name */
1480 FALSE
, /* partial_inplace */
1482 0xffff, /* dst_mask */
1483 FALSE
), /* pcrel_offset */
1485 /* 16 bit value resulting from allocating a 4 byte word to hold an
1486 address in the .sdata2 section, and returning the offset from
1487 _SDA2_BASE_ for that relocation. */
1488 HOWTO (R_PPC_EMB_SDA2I16
, /* type */
1490 1, /* size (0 = byte, 1 = short, 2 = long) */
1492 FALSE
, /* pc_relative */
1494 complain_overflow_bitfield
, /* complain_on_overflow */
1495 bfd_elf_generic_reloc
, /* special_function */
1496 "R_PPC_EMB_SDA2I16", /* name */
1497 FALSE
, /* partial_inplace */
1499 0xffff, /* dst_mask */
1500 FALSE
), /* pcrel_offset */
1502 /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1503 small data items. */
1504 HOWTO (R_PPC_EMB_SDA2REL
, /* type */
1506 1, /* size (0 = byte, 1 = short, 2 = long) */
1508 FALSE
, /* pc_relative */
1510 complain_overflow_signed
, /* complain_on_overflow */
1511 bfd_elf_generic_reloc
, /* special_function */
1512 "R_PPC_EMB_SDA2REL", /* name */
1513 FALSE
, /* partial_inplace */
1515 0xffff, /* dst_mask */
1516 FALSE
), /* pcrel_offset */
1518 /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1519 signed offset from the appropriate base, and filling in the register
1520 field with the appropriate register (0, 2, or 13). */
1521 HOWTO (R_PPC_EMB_SDA21
, /* type */
1523 2, /* size (0 = byte, 1 = short, 2 = long) */
1525 FALSE
, /* pc_relative */
1527 complain_overflow_signed
, /* complain_on_overflow */
1528 bfd_elf_generic_reloc
, /* special_function */
1529 "R_PPC_EMB_SDA21", /* name */
1530 FALSE
, /* partial_inplace */
1532 0xffff, /* dst_mask */
1533 FALSE
), /* pcrel_offset */
1535 /* Relocation not handled: R_PPC_EMB_MRKREF */
1536 /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1537 /* Relocation not handled: R_PPC_EMB_RELST_LO */
1538 /* Relocation not handled: R_PPC_EMB_RELST_HI */
1539 /* Relocation not handled: R_PPC_EMB_RELST_HA */
1540 /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1542 /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1543 in the 16 bit signed offset from the appropriate base, and filling in the
1544 register field with the appropriate register (0, 2, or 13). */
1545 HOWTO (R_PPC_EMB_RELSDA
, /* type */
1547 1, /* size (0 = byte, 1 = short, 2 = long) */
1549 TRUE
, /* pc_relative */
1551 complain_overflow_signed
, /* complain_on_overflow */
1552 bfd_elf_generic_reloc
, /* special_function */
1553 "R_PPC_EMB_RELSDA", /* name */
1554 FALSE
, /* partial_inplace */
1556 0xffff, /* dst_mask */
1557 FALSE
), /* pcrel_offset */
1559 /* GNU extension to record C++ vtable hierarchy. */
1560 HOWTO (R_PPC_GNU_VTINHERIT
, /* type */
1562 0, /* size (0 = byte, 1 = short, 2 = long) */
1564 FALSE
, /* pc_relative */
1566 complain_overflow_dont
, /* complain_on_overflow */
1567 NULL
, /* special_function */
1568 "R_PPC_GNU_VTINHERIT", /* name */
1569 FALSE
, /* partial_inplace */
1572 FALSE
), /* pcrel_offset */
1574 /* GNU extension to record C++ vtable member usage. */
1575 HOWTO (R_PPC_GNU_VTENTRY
, /* type */
1577 0, /* size (0 = byte, 1 = short, 2 = long) */
1579 FALSE
, /* pc_relative */
1581 complain_overflow_dont
, /* complain_on_overflow */
1582 NULL
, /* special_function */
1583 "R_PPC_GNU_VTENTRY", /* name */
1584 FALSE
, /* partial_inplace */
1587 FALSE
), /* pcrel_offset */
1589 /* Phony reloc to handle AIX style TOC entries. */
1590 HOWTO (R_PPC_TOC16
, /* type */
1592 1, /* size (0 = byte, 1 = short, 2 = long) */
1594 FALSE
, /* pc_relative */
1596 complain_overflow_signed
, /* complain_on_overflow */
1597 bfd_elf_generic_reloc
, /* special_function */
1598 "R_PPC_TOC16", /* name */
1599 FALSE
, /* partial_inplace */
1601 0xffff, /* dst_mask */
1602 FALSE
), /* pcrel_offset */
1605 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done. */
1608 ppc_elf_howto_init ()
1610 unsigned int i
, type
;
1612 for (i
= 0; i
< sizeof (ppc_elf_howto_raw
) / sizeof (ppc_elf_howto_raw
[0]); i
++)
1614 type
= ppc_elf_howto_raw
[i
].type
;
1615 BFD_ASSERT (type
< sizeof (ppc_elf_howto_table
) / sizeof (ppc_elf_howto_table
[0]));
1616 ppc_elf_howto_table
[type
] = &ppc_elf_howto_raw
[i
];
1620 /* This function handles relaxing for the PPC with option --mpc860c0[=<n>].
1622 The MPC860, revision C0 or earlier contains a bug in the die.
1623 If all of the following conditions are true, the next instruction
1624 to be executed *may* be treated as a no-op.
1625 1/ A forward branch is executed.
1626 2/ The branch is predicted as not taken.
1627 3/ The branch is taken.
1628 4/ The branch is located in the last 5 words of a page.
1629 (The EOP limit is 5 by default but may be specified as any value from 1-10.)
1631 Our software solution is to detect these problematic branches in a
1632 linker pass and modify them as follows:
1633 1/ Unconditional branches - Since these are always predicted taken,
1634 there is no problem and no action is required.
1635 2/ Conditional backward branches - No problem, no action required.
1636 3/ Conditional forward branches - Ensure that the "inverse prediction
1637 bit" is set (ensure it is predicted taken).
1638 4/ Conditional register branches - Ensure that the "y bit" is set
1639 (ensure it is predicted taken). */
1641 /* Sort sections by address. */
1644 ppc_elf_sort_rela (arg1
, arg2
)
1648 const Elf_Internal_Rela
**rela1
= (const Elf_Internal_Rela
**) arg1
;
1649 const Elf_Internal_Rela
**rela2
= (const Elf_Internal_Rela
**) arg2
;
1651 /* Sort by offset. */
1652 return ((*rela1
)->r_offset
- (*rela2
)->r_offset
);
1656 ppc_elf_relax_section (abfd
, isec
, link_info
, again
)
1659 struct bfd_link_info
*link_info
;
1662 #define PAGESIZE 0x1000
1664 bfd_byte
*contents
= NULL
;
1665 bfd_byte
*free_contents
= NULL
;
1666 Elf_Internal_Rela
*internal_relocs
= NULL
;
1667 Elf_Internal_Rela
*free_relocs
= NULL
;
1668 Elf_Internal_Rela
**rela_comb
= NULL
;
1669 int comb_curr
, comb_count
;
1671 /* We never have to do this more than once per input section. */
1674 /* If needed, initialize this section's cooked size. */
1675 if (isec
->_cooked_size
== 0)
1676 isec
->_cooked_size
= isec
->_raw_size
;
1678 /* We're only interested in text sections which overlap the
1679 troublesome area at the end of a page. */
1680 if (link_info
->mpc860c0
&& (isec
->flags
& SEC_CODE
) && isec
->_cooked_size
)
1682 bfd_vma dot
, end_page
, end_section
;
1683 bfd_boolean section_modified
;
1685 /* Get the section contents. */
1686 /* Get cached copy if it exists. */
1687 if (elf_section_data (isec
)->this_hdr
.contents
!= NULL
)
1688 contents
= elf_section_data (isec
)->this_hdr
.contents
;
1691 /* Go get them off disk. */
1692 contents
= (bfd_byte
*) bfd_malloc (isec
->_raw_size
);
1693 if (contents
== NULL
)
1695 free_contents
= contents
;
1697 if (! bfd_get_section_contents (abfd
, isec
, contents
,
1698 (file_ptr
) 0, isec
->_raw_size
))
1704 if (isec
->reloc_count
)
1709 /* Get a copy of the native relocations. */
1711 = _bfd_elf32_link_read_relocs (abfd
, isec
, (PTR
) NULL
,
1712 (Elf_Internal_Rela
*) NULL
,
1713 link_info
->keep_memory
);
1714 if (internal_relocs
== NULL
)
1716 if (! link_info
->keep_memory
)
1717 free_relocs
= internal_relocs
;
1719 /* Setup a faster access method for the reloc info we need. */
1720 amt
= isec
->reloc_count
;
1721 amt
*= sizeof (Elf_Internal_Rela
*);
1722 rela_comb
= (Elf_Internal_Rela
**) bfd_malloc (amt
);
1723 if (rela_comb
== NULL
)
1725 for (n
= 0; n
< isec
->reloc_count
; ++n
)
1729 r_type
= ELF32_R_TYPE (internal_relocs
[n
].r_info
);
1730 if (r_type
< 0 || r_type
>= (int) R_PPC_max
)
1733 /* Prologue constants are sometimes present in the ".text"
1734 sections and they can be identified by their associated
1735 relocation. We don't want to process those words and
1736 some others which can also be identified by their
1737 relocations. However, not all conditional branches will
1738 have a relocation so we will only ignore words that
1739 1) have a reloc, and 2) the reloc is not applicable to a
1740 conditional branch. The array rela_comb is built here
1741 for use in the EOP scan loop. */
1744 case R_PPC_ADDR14_BRNTAKEN
:
1746 case R_PPC_REL14_BRNTAKEN
:
1747 /* We should check the instruction. */
1750 /* The word is not a conditional branch - ignore it. */
1751 rela_comb
[comb_count
++] = &internal_relocs
[n
];
1756 qsort (rela_comb
, (size_t) comb_count
, sizeof (int),
1760 /* Enumerate each EOP region that overlaps this section. */
1761 end_section
= isec
->vma
+ isec
->_cooked_size
;
1762 dot
= end_page
= (isec
->vma
| (PAGESIZE
- 1)) + 1;
1763 dot
-= link_info
->mpc860c0
;
1764 section_modified
= FALSE
;
1765 /* Increment the start position if this section begins in the
1766 middle of its first EOP region. */
1767 if (dot
< isec
->vma
)
1771 dot
+= PAGESIZE
, end_page
+= PAGESIZE
)
1773 /* Check each word in this EOP region. */
1774 for (; dot
< end_page
; dot
+= 4)
1776 bfd_vma isec_offset
;
1778 bfd_boolean skip
, modified
;
1780 /* Don't process this word if there is a relocation for it
1781 and the relocation indicates the word is not a
1782 conditional branch. */
1784 isec_offset
= dot
- isec
->vma
;
1785 for (; comb_curr
<comb_count
; ++comb_curr
)
1789 r_offset
= rela_comb
[comb_curr
]->r_offset
;
1790 if (r_offset
>= isec_offset
)
1792 if (r_offset
== isec_offset
) skip
= TRUE
;
1798 /* Check the current word for a problematic conditional
1800 #define BO0(insn) ((insn) & 0x02000000)
1801 #define BO2(insn) ((insn) & 0x00800000)
1802 #define BO4(insn) ((insn) & 0x00200000)
1803 insn
= (unsigned long) bfd_get_32 (abfd
, contents
+ isec_offset
);
1805 if ((insn
& 0xFc000000) == 0x40000000)
1807 /* Instruction is BCx */
1808 if ((!BO0(insn
) || !BO2(insn
)) && !BO4(insn
))
1812 /* This branch is predicted as "normal".
1813 If this is a forward branch, it is problematic. */
1814 target
= insn
& 0x0000Fffc;
1815 target
= (target
^ 0x8000) - 0x8000;
1816 if ((insn
& 0x00000002) == 0)
1817 /* Convert to abs. */
1821 /* Set the prediction bit. */
1827 else if ((insn
& 0xFc00Fffe) == 0x4c000420)
1829 /* Instruction is BCCTRx. */
1830 if ((!BO0(insn
) || !BO2(insn
)) && !BO4(insn
))
1832 /* This branch is predicted as not-taken.
1833 If this is a forward branch, it is problematic.
1834 Since we can't tell statically if it will branch
1835 forward, always set the prediction bit. */
1840 else if ((insn
& 0xFc00Fffe) == 0x4c000020)
1842 /* Instruction is BCLRx */
1843 if ((!BO0(insn
) || !BO2(insn
)) && !BO4(insn
))
1845 /* This branch is predicted as not-taken.
1846 If this is a forward branch, it is problematic.
1847 Since we can't tell statically if it will branch
1848 forward, always set the prediction bit. */
1858 bfd_put_32 (abfd
, (bfd_vma
) insn
, contents
+ isec_offset
);
1859 section_modified
= TRUE
;
1863 if (section_modified
)
1865 elf_section_data (isec
)->this_hdr
.contents
= contents
;
1866 free_contents
= NULL
;
1870 if (rela_comb
!= NULL
)
1876 if (free_relocs
!= NULL
)
1882 if (free_contents
!= NULL
)
1884 if (! link_info
->keep_memory
)
1885 free (free_contents
);
1888 /* Cache the section contents for elf_link_input_bfd. */
1889 elf_section_data (isec
)->this_hdr
.contents
= contents
;
1891 free_contents
= NULL
;
1897 if (rela_comb
!= NULL
)
1899 if (free_relocs
!= NULL
)
1901 if (free_contents
!= NULL
)
1902 free (free_contents
);
1906 static reloc_howto_type
*
1907 ppc_elf_reloc_type_lookup (abfd
, code
)
1908 bfd
*abfd ATTRIBUTE_UNUSED
;
1909 bfd_reloc_code_real_type code
;
1911 enum elf_ppc_reloc_type r
;
1913 if (!ppc_elf_howto_table
[R_PPC_ADDR32
])
1914 /* Initialize howto table if needed. */
1915 ppc_elf_howto_init ();
1920 return (reloc_howto_type
*) NULL
;
1922 case BFD_RELOC_NONE
: r
= R_PPC_NONE
; break;
1923 case BFD_RELOC_32
: r
= R_PPC_ADDR32
; break;
1924 case BFD_RELOC_PPC_BA26
: r
= R_PPC_ADDR24
; break;
1925 case BFD_RELOC_16
: r
= R_PPC_ADDR16
; break;
1926 case BFD_RELOC_LO16
: r
= R_PPC_ADDR16_LO
; break;
1927 case BFD_RELOC_HI16
: r
= R_PPC_ADDR16_HI
; break;
1928 case BFD_RELOC_HI16_S
: r
= R_PPC_ADDR16_HA
; break;
1929 case BFD_RELOC_PPC_BA16
: r
= R_PPC_ADDR14
; break;
1930 case BFD_RELOC_PPC_BA16_BRTAKEN
: r
= R_PPC_ADDR14_BRTAKEN
; break;
1931 case BFD_RELOC_PPC_BA16_BRNTAKEN
: r
= R_PPC_ADDR14_BRNTAKEN
; break;
1932 case BFD_RELOC_PPC_B26
: r
= R_PPC_REL24
; break;
1933 case BFD_RELOC_PPC_B16
: r
= R_PPC_REL14
; break;
1934 case BFD_RELOC_PPC_B16_BRTAKEN
: r
= R_PPC_REL14_BRTAKEN
; break;
1935 case BFD_RELOC_PPC_B16_BRNTAKEN
: r
= R_PPC_REL14_BRNTAKEN
; break;
1936 case BFD_RELOC_16_GOTOFF
: r
= R_PPC_GOT16
; break;
1937 case BFD_RELOC_LO16_GOTOFF
: r
= R_PPC_GOT16_LO
; break;
1938 case BFD_RELOC_HI16_GOTOFF
: r
= R_PPC_GOT16_HI
; break;
1939 case BFD_RELOC_HI16_S_GOTOFF
: r
= R_PPC_GOT16_HA
; break;
1940 case BFD_RELOC_24_PLT_PCREL
: r
= R_PPC_PLTREL24
; break;
1941 case BFD_RELOC_PPC_COPY
: r
= R_PPC_COPY
; break;
1942 case BFD_RELOC_PPC_GLOB_DAT
: r
= R_PPC_GLOB_DAT
; break;
1943 case BFD_RELOC_PPC_LOCAL24PC
: r
= R_PPC_LOCAL24PC
; break;
1944 case BFD_RELOC_32_PCREL
: r
= R_PPC_REL32
; break;
1945 case BFD_RELOC_32_PLTOFF
: r
= R_PPC_PLT32
; break;
1946 case BFD_RELOC_32_PLT_PCREL
: r
= R_PPC_PLTREL32
; break;
1947 case BFD_RELOC_LO16_PLTOFF
: r
= R_PPC_PLT16_LO
; break;
1948 case BFD_RELOC_HI16_PLTOFF
: r
= R_PPC_PLT16_HI
; break;
1949 case BFD_RELOC_HI16_S_PLTOFF
: r
= R_PPC_PLT16_HA
; break;
1950 case BFD_RELOC_GPREL16
: r
= R_PPC_SDAREL16
; break;
1951 case BFD_RELOC_16_BASEREL
: r
= R_PPC_SECTOFF
; break;
1952 case BFD_RELOC_LO16_BASEREL
: r
= R_PPC_SECTOFF_LO
; break;
1953 case BFD_RELOC_HI16_BASEREL
: r
= R_PPC_SECTOFF_HI
; break;
1954 case BFD_RELOC_HI16_S_BASEREL
: r
= R_PPC_SECTOFF_HA
; break;
1955 case BFD_RELOC_CTOR
: r
= R_PPC_ADDR32
; break;
1956 case BFD_RELOC_PPC_TOC16
: r
= R_PPC_TOC16
; break;
1957 case BFD_RELOC_PPC_TLS
: r
= R_PPC_TLS
; break;
1958 case BFD_RELOC_PPC_DTPMOD
: r
= R_PPC_DTPMOD32
; break;
1959 case BFD_RELOC_PPC_TPREL16
: r
= R_PPC_TPREL16
; break;
1960 case BFD_RELOC_PPC_TPREL16_LO
: r
= R_PPC_TPREL16_LO
; break;
1961 case BFD_RELOC_PPC_TPREL16_HI
: r
= R_PPC_TPREL16_HI
; break;
1962 case BFD_RELOC_PPC_TPREL16_HA
: r
= R_PPC_TPREL16_HA
; break;
1963 case BFD_RELOC_PPC_TPREL
: r
= R_PPC_TPREL32
; break;
1964 case BFD_RELOC_PPC_DTPREL16
: r
= R_PPC_DTPREL16
; break;
1965 case BFD_RELOC_PPC_DTPREL16_LO
: r
= R_PPC_DTPREL16_LO
; break;
1966 case BFD_RELOC_PPC_DTPREL16_HI
: r
= R_PPC_DTPREL16_HI
; break;
1967 case BFD_RELOC_PPC_DTPREL16_HA
: r
= R_PPC_DTPREL16_HA
; break;
1968 case BFD_RELOC_PPC_DTPREL
: r
= R_PPC_DTPREL32
; break;
1969 case BFD_RELOC_PPC_GOT_TLSGD16
: r
= R_PPC_GOT_TLSGD16
; break;
1970 case BFD_RELOC_PPC_GOT_TLSGD16_LO
: r
= R_PPC_GOT_TLSGD16_LO
; break;
1971 case BFD_RELOC_PPC_GOT_TLSGD16_HI
: r
= R_PPC_GOT_TLSGD16_HI
; break;
1972 case BFD_RELOC_PPC_GOT_TLSGD16_HA
: r
= R_PPC_GOT_TLSGD16_HA
; break;
1973 case BFD_RELOC_PPC_GOT_TLSLD16
: r
= R_PPC_GOT_TLSLD16
; break;
1974 case BFD_RELOC_PPC_GOT_TLSLD16_LO
: r
= R_PPC_GOT_TLSLD16_LO
; break;
1975 case BFD_RELOC_PPC_GOT_TLSLD16_HI
: r
= R_PPC_GOT_TLSLD16_HI
; break;
1976 case BFD_RELOC_PPC_GOT_TLSLD16_HA
: r
= R_PPC_GOT_TLSLD16_HA
; break;
1977 case BFD_RELOC_PPC_GOT_TPREL16
: r
= R_PPC_GOT_TPREL16
; break;
1978 case BFD_RELOC_PPC_GOT_TPREL16_LO
: r
= R_PPC_GOT_TPREL16_LO
; break;
1979 case BFD_RELOC_PPC_GOT_TPREL16_HI
: r
= R_PPC_GOT_TPREL16_HI
; break;
1980 case BFD_RELOC_PPC_GOT_TPREL16_HA
: r
= R_PPC_GOT_TPREL16_HA
; break;
1981 case BFD_RELOC_PPC_GOT_DTPREL16
: r
= R_PPC_GOT_DTPREL16
; break;
1982 case BFD_RELOC_PPC_GOT_DTPREL16_LO
: r
= R_PPC_GOT_DTPREL16_LO
; break;
1983 case BFD_RELOC_PPC_GOT_DTPREL16_HI
: r
= R_PPC_GOT_DTPREL16_HI
; break;
1984 case BFD_RELOC_PPC_GOT_DTPREL16_HA
: r
= R_PPC_GOT_DTPREL16_HA
; break;
1985 case BFD_RELOC_PPC_EMB_NADDR32
: r
= R_PPC_EMB_NADDR32
; break;
1986 case BFD_RELOC_PPC_EMB_NADDR16
: r
= R_PPC_EMB_NADDR16
; break;
1987 case BFD_RELOC_PPC_EMB_NADDR16_LO
: r
= R_PPC_EMB_NADDR16_LO
; break;
1988 case BFD_RELOC_PPC_EMB_NADDR16_HI
: r
= R_PPC_EMB_NADDR16_HI
; break;
1989 case BFD_RELOC_PPC_EMB_NADDR16_HA
: r
= R_PPC_EMB_NADDR16_HA
; break;
1990 case BFD_RELOC_PPC_EMB_SDAI16
: r
= R_PPC_EMB_SDAI16
; break;
1991 case BFD_RELOC_PPC_EMB_SDA2I16
: r
= R_PPC_EMB_SDA2I16
; break;
1992 case BFD_RELOC_PPC_EMB_SDA2REL
: r
= R_PPC_EMB_SDA2REL
; break;
1993 case BFD_RELOC_PPC_EMB_SDA21
: r
= R_PPC_EMB_SDA21
; break;
1994 case BFD_RELOC_PPC_EMB_MRKREF
: r
= R_PPC_EMB_MRKREF
; break;
1995 case BFD_RELOC_PPC_EMB_RELSEC16
: r
= R_PPC_EMB_RELSEC16
; break;
1996 case BFD_RELOC_PPC_EMB_RELST_LO
: r
= R_PPC_EMB_RELST_LO
; break;
1997 case BFD_RELOC_PPC_EMB_RELST_HI
: r
= R_PPC_EMB_RELST_HI
; break;
1998 case BFD_RELOC_PPC_EMB_RELST_HA
: r
= R_PPC_EMB_RELST_HA
; break;
1999 case BFD_RELOC_PPC_EMB_BIT_FLD
: r
= R_PPC_EMB_BIT_FLD
; break;
2000 case BFD_RELOC_PPC_EMB_RELSDA
: r
= R_PPC_EMB_RELSDA
; break;
2001 case BFD_RELOC_VTABLE_INHERIT
: r
= R_PPC_GNU_VTINHERIT
; break;
2002 case BFD_RELOC_VTABLE_ENTRY
: r
= R_PPC_GNU_VTENTRY
; break;
2005 return ppc_elf_howto_table
[(int) r
];
2008 /* Set the howto pointer for a PowerPC ELF reloc. */
2011 ppc_elf_info_to_howto (abfd
, cache_ptr
, dst
)
2012 bfd
*abfd ATTRIBUTE_UNUSED
;
2014 Elf_Internal_Rela
*dst
;
2016 if (!ppc_elf_howto_table
[R_PPC_ADDR32
])
2017 /* Initialize howto table if needed. */
2018 ppc_elf_howto_init ();
2020 BFD_ASSERT (ELF32_R_TYPE (dst
->r_info
) < (unsigned int) R_PPC_max
);
2021 cache_ptr
->howto
= ppc_elf_howto_table
[ELF32_R_TYPE (dst
->r_info
)];
2024 /* Handle the R_PPC_ADDR16_HA reloc. */
2026 static bfd_reloc_status_type
2027 ppc_elf_addr16_ha_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
2028 output_bfd
, error_message
)
2029 bfd
*abfd ATTRIBUTE_UNUSED
;
2030 arelent
*reloc_entry
;
2032 PTR data ATTRIBUTE_UNUSED
;
2033 asection
*input_section
;
2035 char **error_message ATTRIBUTE_UNUSED
;
2039 if (output_bfd
!= NULL
)
2041 reloc_entry
->address
+= input_section
->output_offset
;
2042 return bfd_reloc_ok
;
2045 if (reloc_entry
->address
> input_section
->_cooked_size
)
2046 return bfd_reloc_outofrange
;
2048 if (bfd_is_com_section (symbol
->section
))
2051 relocation
= symbol
->value
;
2053 relocation
+= symbol
->section
->output_section
->vma
;
2054 relocation
+= symbol
->section
->output_offset
;
2055 relocation
+= reloc_entry
->addend
;
2057 reloc_entry
->addend
+= (relocation
& 0x8000) << 1;
2059 return bfd_reloc_continue
;
2062 static bfd_reloc_status_type
2063 ppc_elf_unhandled_reloc (abfd
, reloc_entry
, symbol
, data
,
2064 input_section
, output_bfd
, error_message
)
2066 arelent
*reloc_entry
;
2069 asection
*input_section
;
2071 char **error_message
;
2073 /* If this is a relocatable link (output_bfd test tells us), just
2074 call the generic function. Any adjustment will be done at final
2076 if (output_bfd
!= NULL
)
2077 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2078 input_section
, output_bfd
, error_message
);
2080 if (error_message
!= NULL
)
2082 static char buf
[60];
2083 sprintf (buf
, "generic linker can't handle %s",
2084 reloc_entry
->howto
->name
);
2085 *error_message
= buf
;
2087 return bfd_reloc_dangerous
;
2090 /* Fix bad default arch selected for a 32 bit input bfd when the
2091 default is 64 bit. */
2094 ppc_elf_object_p (abfd
)
2097 if (abfd
->arch_info
->the_default
&& abfd
->arch_info
->bits_per_word
== 64)
2099 Elf_Internal_Ehdr
*i_ehdr
= elf_elfheader (abfd
);
2101 if (i_ehdr
->e_ident
[EI_CLASS
] == ELFCLASS32
)
2103 /* Relies on arch after 64 bit default being 32 bit default. */
2104 abfd
->arch_info
= abfd
->arch_info
->next
;
2105 BFD_ASSERT (abfd
->arch_info
->bits_per_word
== 32);
2111 /* Function to set whether a module needs the -mrelocatable bit set. */
2114 ppc_elf_set_private_flags (abfd
, flags
)
2118 BFD_ASSERT (!elf_flags_init (abfd
)
2119 || elf_elfheader (abfd
)->e_flags
== flags
);
2121 elf_elfheader (abfd
)->e_flags
= flags
;
2122 elf_flags_init (abfd
) = TRUE
;
2126 /* Merge backend specific data from an object file to the output
2127 object file when linking. */
2130 ppc_elf_merge_private_bfd_data (ibfd
, obfd
)
2138 /* Check if we have the same endianess. */
2139 if (! _bfd_generic_verify_endian_match (ibfd
, obfd
))
2142 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
2143 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
2146 new_flags
= elf_elfheader (ibfd
)->e_flags
;
2147 old_flags
= elf_elfheader (obfd
)->e_flags
;
2148 if (!elf_flags_init (obfd
))
2150 /* First call, no flags set. */
2151 elf_flags_init (obfd
) = TRUE
;
2152 elf_elfheader (obfd
)->e_flags
= new_flags
;
2155 /* Compatible flags are ok. */
2156 else if (new_flags
== old_flags
)
2159 /* Incompatible flags. */
2162 /* Warn about -mrelocatable mismatch. Allow -mrelocatable-lib
2163 to be linked with either. */
2165 if ((new_flags
& EF_PPC_RELOCATABLE
) != 0
2166 && (old_flags
& (EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
)) == 0)
2169 (*_bfd_error_handler
)
2170 (_("%s: compiled with -mrelocatable and linked with modules compiled normally"),
2171 bfd_archive_filename (ibfd
));
2173 else if ((new_flags
& (EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
)) == 0
2174 && (old_flags
& EF_PPC_RELOCATABLE
) != 0)
2177 (*_bfd_error_handler
)
2178 (_("%s: compiled normally and linked with modules compiled with -mrelocatable"),
2179 bfd_archive_filename (ibfd
));
2182 /* The output is -mrelocatable-lib iff both the input files are. */
2183 if (! (new_flags
& EF_PPC_RELOCATABLE_LIB
))
2184 elf_elfheader (obfd
)->e_flags
&= ~EF_PPC_RELOCATABLE_LIB
;
2186 /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
2187 but each input file is either -mrelocatable or -mrelocatable-lib. */
2188 if (! (elf_elfheader (obfd
)->e_flags
& EF_PPC_RELOCATABLE_LIB
)
2189 && (new_flags
& (EF_PPC_RELOCATABLE_LIB
| EF_PPC_RELOCATABLE
))
2190 && (old_flags
& (EF_PPC_RELOCATABLE_LIB
| EF_PPC_RELOCATABLE
)))
2191 elf_elfheader (obfd
)->e_flags
|= EF_PPC_RELOCATABLE
;
2193 /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
2194 any module uses it. */
2195 elf_elfheader (obfd
)->e_flags
|= (new_flags
& EF_PPC_EMB
);
2197 new_flags
&= ~(EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
| EF_PPC_EMB
);
2198 old_flags
&= ~(EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
| EF_PPC_EMB
);
2200 /* Warn about any other mismatches. */
2201 if (new_flags
!= old_flags
)
2204 (*_bfd_error_handler
)
2205 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
2206 bfd_archive_filename (ibfd
), (long) new_flags
, (long) old_flags
);
2211 bfd_set_error (bfd_error_bad_value
);
2219 /* Handle a PowerPC specific section when reading an object file. This
2220 is called when elfcode.h finds a section with an unknown type. */
2223 ppc_elf_section_from_shdr (abfd
, hdr
, name
)
2225 Elf_Internal_Shdr
*hdr
;
2231 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
))
2234 newsect
= hdr
->bfd_section
;
2235 flags
= bfd_get_section_flags (abfd
, newsect
);
2236 if (hdr
->sh_flags
& SHF_EXCLUDE
)
2237 flags
|= SEC_EXCLUDE
;
2239 if (hdr
->sh_type
== SHT_ORDERED
)
2240 flags
|= SEC_SORT_ENTRIES
;
2242 bfd_set_section_flags (abfd
, newsect
, flags
);
2246 /* Set up any other section flags and such that may be necessary. */
2249 ppc_elf_fake_sections (abfd
, shdr
, asect
)
2250 bfd
*abfd ATTRIBUTE_UNUSED
;
2251 Elf_Internal_Shdr
*shdr
;
2254 if ((asect
->flags
& SEC_EXCLUDE
) != 0)
2255 shdr
->sh_flags
|= SHF_EXCLUDE
;
2257 if ((asect
->flags
& SEC_SORT_ENTRIES
) != 0)
2258 shdr
->sh_type
= SHT_ORDERED
;
2263 /* Create a special linker section */
2264 static elf_linker_section_t
*
2265 ppc_elf_create_linker_section (abfd
, info
, which
)
2267 struct bfd_link_info
*info
;
2268 enum elf_linker_section_enum which
;
2270 bfd
*dynobj
= elf_hash_table (info
)->dynobj
;
2271 elf_linker_section_t
*lsect
;
2273 /* Record the first bfd section that needs the special section. */
2275 dynobj
= elf_hash_table (info
)->dynobj
= abfd
;
2277 /* If this is the first time, create the section. */
2278 lsect
= elf_linker_section (dynobj
, which
);
2281 elf_linker_section_t defaults
;
2282 static elf_linker_section_t zero_section
;
2284 defaults
= zero_section
;
2285 defaults
.which
= which
;
2286 defaults
.hole_written_p
= FALSE
;
2287 defaults
.alignment
= 2;
2289 /* Both of these sections are (technically) created by the user
2290 putting data in them, so they shouldn't be marked
2293 The linker creates them so it has somewhere to attach their
2294 respective symbols. In fact, if they were empty it would
2295 be OK to leave the symbol set to 0 (or any random number), because
2296 the appropriate register should never be used. */
2297 defaults
.flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
2303 (*_bfd_error_handler
) (_("%s: unknown special linker type %d"),
2304 bfd_get_filename (abfd
),
2307 bfd_set_error (bfd_error_bad_value
);
2308 return (elf_linker_section_t
*) 0;
2310 case LINKER_SECTION_SDATA
: /* .sdata/.sbss section */
2311 defaults
.name
= ".sdata";
2312 defaults
.rel_name
= ".rela.sdata";
2313 defaults
.bss_name
= ".sbss";
2314 defaults
.sym_name
= "_SDA_BASE_";
2315 defaults
.sym_offset
= 32768;
2318 case LINKER_SECTION_SDATA2
: /* .sdata2/.sbss2 section */
2319 defaults
.name
= ".sdata2";
2320 defaults
.rel_name
= ".rela.sdata2";
2321 defaults
.bss_name
= ".sbss2";
2322 defaults
.sym_name
= "_SDA2_BASE_";
2323 defaults
.sym_offset
= 32768;
2324 defaults
.flags
|= SEC_READONLY
;
2328 lsect
= _bfd_elf_create_linker_section (abfd
, info
, which
, &defaults
);
2334 /* If we have a non-zero sized .sbss2 or .PPC.EMB.sbss0 sections, we
2335 need to bump up the number of section headers. */
2338 ppc_elf_additional_program_headers (abfd
)
2346 s
= bfd_get_section_by_name (abfd
, ".interp");
2350 s
= bfd_get_section_by_name (abfd
, ".sbss2");
2351 if (s
!= NULL
&& (s
->flags
& SEC_LOAD
) != 0 && s
->_raw_size
> 0)
2354 s
= bfd_get_section_by_name (abfd
, ".PPC.EMB.sbss0");
2355 if (s
!= NULL
&& (s
->flags
& SEC_LOAD
) != 0 && s
->_raw_size
> 0)
2361 /* Modify the segment map if needed. */
2364 ppc_elf_modify_segment_map (abfd
)
2365 bfd
*abfd ATTRIBUTE_UNUSED
;
2370 /* The powerpc .got has a blrl instruction in it. Mark it executable. */
2373 ppc_elf_create_got (abfd
, info
)
2375 struct bfd_link_info
*info
;
2377 struct ppc_elf_link_hash_table
*htab
;
2381 if (!_bfd_elf_create_got_section (abfd
, info
))
2384 htab
= ppc_elf_hash_table (info
);
2385 htab
->got
= s
= bfd_get_section_by_name (abfd
, ".got");
2389 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
2390 | SEC_LINKER_CREATED
);
2391 if (!bfd_set_section_flags (abfd
, s
, flags
))
2394 htab
->relgot
= bfd_make_section (abfd
, ".rela.got");
2396 || ! bfd_set_section_flags (abfd
, htab
->relgot
,
2397 (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
2398 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
2400 || ! bfd_set_section_alignment (abfd
, htab
->relgot
, 2))
2406 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2407 to output sections (just like _bfd_elf_create_dynamic_sections has
2408 to create .dynbss and .rela.bss). */
2411 ppc_elf_create_dynamic_sections (abfd
, info
)
2413 struct bfd_link_info
*info
;
2415 struct ppc_elf_link_hash_table
*htab
;
2419 if (!ppc_elf_create_got (abfd
, info
))
2422 if (!_bfd_elf_create_dynamic_sections (abfd
, info
))
2425 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
| SEC_IN_MEMORY
2426 | SEC_LINKER_CREATED
);
2428 htab
= ppc_elf_hash_table (info
);
2429 htab
->dynbss
= bfd_get_section_by_name (abfd
, ".dynbss");
2430 htab
->dynsbss
= s
= bfd_make_section (abfd
, ".dynsbss");
2432 || ! bfd_set_section_flags (abfd
, s
, SEC_ALLOC
))
2437 htab
->relbss
= bfd_get_section_by_name (abfd
, ".rela.bss");
2438 htab
->relsbss
= s
= bfd_make_section (abfd
, ".rela.sbss");
2440 || ! bfd_set_section_flags (abfd
, s
, flags
| SEC_READONLY
)
2441 || ! bfd_set_section_alignment (abfd
, s
, 2))
2445 htab
->relplt
= bfd_get_section_by_name (abfd
, ".rela.plt");
2446 htab
->plt
= s
= bfd_get_section_by_name (abfd
, ".plt");
2450 flags
= SEC_ALLOC
| SEC_CODE
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
;
2451 return bfd_set_section_flags (abfd
, s
, flags
);
2454 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2455 copying dynamic variables from a shared lib into an app's dynbss
2456 section, and instead use a dynamic relocation to point into the
2458 #define ELIMINATE_COPY_RELOCS 1
2460 /* Adjust a symbol defined by a dynamic object and referenced by a
2461 regular object. The current definition is in some section of the
2462 dynamic object, but we're not including those sections. We have to
2463 change the definition to something the rest of the link can
2467 ppc_elf_adjust_dynamic_symbol (info
, h
)
2468 struct bfd_link_info
*info
;
2469 struct elf_link_hash_entry
*h
;
2471 struct ppc_elf_link_hash_table
*htab
;
2473 unsigned int power_of_two
;
2476 fprintf (stderr
, "ppc_elf_adjust_dynamic_symbol called for %s\n",
2477 h
->root
.root
.string
);
2480 /* Make sure we know what is going on here. */
2481 htab
= ppc_elf_hash_table (info
);
2482 BFD_ASSERT (htab
->elf
.dynobj
!= NULL
2483 && ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
)
2484 || h
->weakdef
!= NULL
2485 || ((h
->elf_link_hash_flags
2486 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2487 && (h
->elf_link_hash_flags
2488 & ELF_LINK_HASH_REF_REGULAR
) != 0
2489 && (h
->elf_link_hash_flags
2490 & ELF_LINK_HASH_DEF_REGULAR
) == 0)));
2492 /* Deal with function syms. */
2493 if (h
->type
== STT_FUNC
2494 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
2496 /* Clear procedure linkage table information for any symbol that
2497 won't need a .plt entry. */
2498 if (! htab
->elf
.dynamic_sections_created
2499 || SYMBOL_CALLS_LOCAL (info
, h
)
2500 || h
->plt
.refcount
<= 0)
2502 /* A PLT entry is not required/allowed when:
2504 1. We are not using ld.so; because then the PLT entry
2505 can't be set up, so we can't use one.
2507 2. We know for certain that a call to this symbol
2508 will go to this object.
2510 3. GC has rendered the entry unused. */
2511 h
->plt
.offset
= (bfd_vma
) -1;
2512 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2517 h
->plt
.offset
= (bfd_vma
) -1;
2519 /* If this is a weak symbol, and there is a real definition, the
2520 processor independent code will have arranged for us to see the
2521 real definition first, and we can just use the same value. */
2522 if (h
->weakdef
!= NULL
)
2524 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
2525 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
2526 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
2527 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
2528 if (ELIMINATE_COPY_RELOCS
)
2529 h
->elf_link_hash_flags
2530 = ((h
->elf_link_hash_flags
& ~ELF_LINK_NON_GOT_REF
)
2531 | (h
->weakdef
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
));
2535 /* This is a reference to a symbol defined by a dynamic object which
2536 is not a function. */
2538 /* If we are creating a shared library, we must presume that the
2539 only references to the symbol are via the global offset table.
2540 For such cases we need not do anything here; the relocations will
2541 be handled correctly by relocate_section. */
2545 /* If there are no references to this symbol that do not use the
2546 GOT, we don't need to generate a copy reloc. */
2547 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0)
2550 if (ELIMINATE_COPY_RELOCS
)
2552 struct ppc_elf_dyn_relocs
*p
;
2553 for (p
= ppc_elf_hash_entry (h
)->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2555 s
= p
->sec
->output_section
;
2556 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
2560 /* If we didn't find any dynamic relocs in read-only sections, then
2561 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2564 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
2569 /* We must allocate the symbol in our .dynbss section, which will
2570 become part of the .bss section of the executable. There will be
2571 an entry for this symbol in the .dynsym section. The dynamic
2572 object will contain position independent code, so all references
2573 from the dynamic object to this symbol will go through the global
2574 offset table. The dynamic linker will use the .dynsym entry to
2575 determine the address it must put in the global offset table, so
2576 both the dynamic object and the regular object will refer to the
2577 same memory location for the variable.
2579 Of course, if the symbol is sufficiently small, we must instead
2580 allocate it in .sbss. FIXME: It would be better to do this if and
2581 only if there were actually SDAREL relocs for that symbol. */
2583 if (h
->size
<= elf_gp_size (htab
->elf
.dynobj
))
2587 BFD_ASSERT (s
!= NULL
);
2589 /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2590 copy the initial value out of the dynamic object and into the
2591 runtime process image. We need to remember the offset into the
2592 .rela.bss section we are going to use. */
2593 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
2597 if (h
->size
<= elf_gp_size (htab
->elf
.dynobj
))
2598 srel
= htab
->relsbss
;
2600 srel
= htab
->relbss
;
2601 BFD_ASSERT (srel
!= NULL
);
2602 srel
->_raw_size
+= sizeof (Elf32_External_Rela
);
2603 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
2606 /* We need to figure out the alignment required for this symbol. I
2607 have no idea how ELF linkers handle this. */
2608 power_of_two
= bfd_log2 (h
->size
);
2609 if (power_of_two
> 4)
2612 /* Apply the required alignment. */
2613 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
,
2614 (bfd_size_type
) (1 << power_of_two
));
2615 if (power_of_two
> bfd_get_section_alignment (htab
->elf
.dynobj
, s
))
2617 if (! bfd_set_section_alignment (htab
->elf
.dynobj
, s
, power_of_two
))
2621 /* Define the symbol as being at this point in the section. */
2622 h
->root
.u
.def
.section
= s
;
2623 h
->root
.u
.def
.value
= s
->_raw_size
;
2625 /* Increment the section size to make room for the symbol. */
2626 s
->_raw_size
+= h
->size
;
2631 /* This is the condition under which finish_dynamic_symbol will be
2632 called from elflink.h. If elflink.h doesn't call our
2633 finish_dynamic_symbol routine, we'll need to do something about
2634 initializing any .plt and .got entries in relocate_section. */
2635 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
2638 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
2639 && ((H)->dynindx != -1 \
2640 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
2642 /* Of those relocs that might be copied as dynamic relocs, this macro
2643 selects those that must be copied when linking a shared library,
2644 even when the symbol is local. */
2646 #define MUST_BE_DYN_RELOC(RTYPE) \
2647 ((RTYPE) != R_PPC_REL24 \
2648 && (RTYPE) != R_PPC_REL14 \
2649 && (RTYPE) != R_PPC_REL14_BRTAKEN \
2650 && (RTYPE) != R_PPC_REL14_BRNTAKEN \
2651 && (RTYPE) != R_PPC_REL32)
2653 /* Allocate space in associated reloc sections for dynamic relocs. */
2656 allocate_dynrelocs (h
, inf
)
2657 struct elf_link_hash_entry
*h
;
2660 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
2661 struct ppc_elf_link_hash_entry
*eh
;
2662 struct ppc_elf_link_hash_table
*htab
;
2663 struct ppc_elf_dyn_relocs
*p
;
2665 if (h
->root
.type
== bfd_link_hash_indirect
)
2668 if (h
->root
.type
== bfd_link_hash_warning
)
2669 /* When warning symbols are created, they **replace** the "real"
2670 entry in the hash table, thus we never get to see the real
2671 symbol in a hash traversal. So look at it now. */
2672 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
2674 htab
= ppc_elf_hash_table (info
);
2675 if (htab
->elf
.dynamic_sections_created
2676 && h
->plt
.refcount
> 0)
2678 /* Make sure this symbol is output as a dynamic symbol. */
2679 if (h
->dynindx
== -1
2680 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
2682 if (! bfd_elf32_link_record_dynamic_symbol (info
, h
))
2687 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h
))
2689 asection
*s
= htab
->plt
;
2691 /* If this is the first .plt entry, make room for the special
2693 if (s
->_raw_size
== 0)
2694 s
->_raw_size
+= PLT_INITIAL_ENTRY_SIZE
;
2696 /* The PowerPC PLT is actually composed of two parts, the
2697 first part is 2 words (for a load and a jump), and then
2698 there is a remaining word available at the end. */
2699 h
->plt
.offset
= (PLT_INITIAL_ENTRY_SIZE
2701 * ((s
->_raw_size
- PLT_INITIAL_ENTRY_SIZE
)
2702 / PLT_ENTRY_SIZE
)));
2704 /* If this symbol is not defined in a regular file, and we
2705 are not generating a shared library, then set the symbol
2706 to this location in the .plt. This is required to make
2707 function pointers compare as equal between the normal
2708 executable and the shared library. */
2710 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2712 h
->root
.u
.def
.section
= s
;
2713 h
->root
.u
.def
.value
= h
->plt
.offset
;
2716 /* Make room for this entry. After the 8192nd entry, room
2717 for two entries is allocated. */
2718 s
->_raw_size
+= PLT_ENTRY_SIZE
;
2719 if ((s
->_raw_size
- PLT_INITIAL_ENTRY_SIZE
) / PLT_ENTRY_SIZE
2720 >= PLT_NUM_SINGLE_ENTRIES
)
2721 s
->_raw_size
+= PLT_ENTRY_SIZE
;
2723 /* We also need to make an entry in the .rela.plt section. */
2724 htab
->relplt
->_raw_size
+= sizeof (Elf32_External_Rela
);
2728 h
->plt
.offset
= (bfd_vma
) -1;
2729 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2734 h
->plt
.offset
= (bfd_vma
) -1;
2735 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2738 eh
= (struct ppc_elf_link_hash_entry
*) h
;
2739 if (eh
->elf
.got
.refcount
> 0)
2741 /* Make sure this symbol is output as a dynamic symbol. */
2742 if (eh
->elf
.dynindx
== -1
2743 && (eh
->elf
.elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
2745 if (!bfd_elf32_link_record_dynamic_symbol (info
, &eh
->elf
))
2749 if (eh
->tls_mask
== (TLS_TLS
| TLS_LD
)
2750 && !(eh
->elf
.elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
))
2751 /* If just an LD reloc, we'll just use htab->tlsld_got.offset. */
2752 eh
->elf
.got
.offset
= (bfd_vma
) -1;
2756 eh
->elf
.got
.offset
= htab
->got
->_raw_size
;
2757 if ((eh
->tls_mask
& TLS_TLS
) != 0)
2759 if ((eh
->tls_mask
& TLS_LD
) != 0)
2760 htab
->got
->_raw_size
+= 8;
2761 if ((eh
->tls_mask
& TLS_GD
) != 0)
2762 htab
->got
->_raw_size
+= 8;
2763 if ((eh
->tls_mask
& (TLS_TPREL
| TLS_TPRELGD
)) != 0)
2764 htab
->got
->_raw_size
+= 4;
2765 if ((eh
->tls_mask
& TLS_DTPREL
) != 0)
2766 htab
->got
->_raw_size
+= 4;
2769 htab
->got
->_raw_size
+= 4;
2770 dyn
= htab
->elf
.dynamic_sections_created
;
2772 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, &eh
->elf
))
2774 /* All the entries we allocated need relocs. */
2775 htab
->relgot
->_raw_size
2776 += ((htab
->got
->_raw_size
- eh
->elf
.got
.offset
) / 4
2777 * sizeof (Elf32_External_Rela
));
2778 /* Except LD only needs one. */
2779 if ((eh
->tls_mask
& TLS_LD
) != 0)
2780 htab
->relgot
->_raw_size
-= sizeof (Elf32_External_Rela
);
2785 eh
->elf
.got
.offset
= (bfd_vma
) -1;
2787 if (eh
->dyn_relocs
== NULL
)
2790 /* In the shared -Bsymbolic case, discard space allocated for
2791 dynamic pc-relative relocs against symbols which turn out to be
2792 defined in regular objects. For the normal shared case, discard
2793 space for relocs that have become local due to symbol visibility
2797 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) != 0
2798 && ((h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) != 0
2801 struct ppc_elf_dyn_relocs
**pp
;
2803 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
2805 p
->count
-= p
->pc_count
;
2814 else if (ELIMINATE_COPY_RELOCS
)
2816 /* For the non-shared case, discard space for relocs against
2817 symbols which turn out to need copy relocs or are not
2820 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
2821 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2822 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2824 /* Make sure this symbol is output as a dynamic symbol.
2825 Undefined weak syms won't yet be marked as dynamic. */
2826 if (h
->dynindx
== -1
2827 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
2829 if (! bfd_elf64_link_record_dynamic_symbol (info
, h
))
2833 /* If that succeeded, we know we'll be keeping all the
2835 if (h
->dynindx
!= -1)
2839 eh
->dyn_relocs
= NULL
;
2844 /* Finally, allocate space. */
2845 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2847 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
2848 sreloc
->_raw_size
+= p
->count
* sizeof (Elf32_External_Rela
);
2854 /* Find any dynamic relocs that apply to read-only sections. */
2857 readonly_dynrelocs (h
, info
)
2858 struct elf_link_hash_entry
*h
;
2861 struct ppc_elf_dyn_relocs
*p
;
2863 if (h
->root
.type
== bfd_link_hash_indirect
)
2866 if (h
->root
.type
== bfd_link_hash_warning
)
2867 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
2869 for (p
= ppc_elf_hash_entry (h
)->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2871 asection
*s
= p
->sec
->output_section
;
2874 && ((s
->flags
& (SEC_READONLY
| SEC_ALLOC
))
2875 == (SEC_READONLY
| SEC_ALLOC
)))
2877 ((struct bfd_link_info
*) info
)->flags
|= DF_TEXTREL
;
2879 /* Not an error, just cut short the traversal. */
2886 /* Set the sizes of the dynamic sections. */
2889 ppc_elf_size_dynamic_sections (output_bfd
, info
)
2890 bfd
*output_bfd ATTRIBUTE_UNUSED
;
2891 struct bfd_link_info
*info
;
2893 struct ppc_elf_link_hash_table
*htab
;
2899 fprintf (stderr
, "ppc_elf_size_dynamic_sections called\n");
2902 htab
= ppc_elf_hash_table (info
);
2903 BFD_ASSERT (htab
->elf
.dynobj
!= NULL
);
2905 if (elf_hash_table (info
)->dynamic_sections_created
)
2907 /* Set the contents of the .interp section to the interpreter. */
2910 s
= bfd_get_section_by_name (htab
->elf
.dynobj
, ".interp");
2911 BFD_ASSERT (s
!= NULL
);
2912 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
2913 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
2917 if (htab
->tlsld_got
.refcount
> 0)
2919 htab
->tlsld_got
.offset
= htab
->got
->_raw_size
;
2920 htab
->got
->_raw_size
+= 8;
2922 htab
->relgot
->_raw_size
+= sizeof (Elf32_External_Rela
);
2925 htab
->tlsld_got
.offset
= (bfd_vma
) -1;
2927 /* Set up .got offsets for local syms, and space for local dynamic
2929 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2931 bfd_signed_vma
*local_got
;
2932 bfd_signed_vma
*end_local_got
;
2934 bfd_size_type locsymcount
;
2935 Elf_Internal_Shdr
*symtab_hdr
;
2938 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
2941 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
2943 struct ppc_elf_dyn_relocs
*p
;
2945 for (p
= ((struct ppc_elf_dyn_relocs
*)
2946 elf_section_data (s
)->local_dynrel
);
2950 if (!bfd_is_abs_section (p
->sec
)
2951 && bfd_is_abs_section (p
->sec
->output_section
))
2953 /* Input section has been discarded, either because
2954 it is a copy of a linkonce section or due to
2955 linker script /DISCARD/, so we'll be discarding
2958 else if (p
->count
!= 0)
2960 elf_section_data (p
->sec
)->sreloc
->_raw_size
2961 += p
->count
* sizeof (Elf32_External_Rela
);
2962 if ((p
->sec
->output_section
->flags
2963 & (SEC_READONLY
| SEC_ALLOC
))
2964 == (SEC_READONLY
| SEC_ALLOC
))
2965 info
->flags
|= DF_TEXTREL
;
2970 local_got
= elf_local_got_refcounts (ibfd
);
2974 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
2975 locsymcount
= symtab_hdr
->sh_info
;
2976 end_local_got
= local_got
+ locsymcount
;
2977 lgot_masks
= (char *) end_local_got
;
2979 srel
= htab
->relgot
;
2980 for (; local_got
< end_local_got
; ++local_got
, ++lgot_masks
)
2983 if (*lgot_masks
== (TLS_TLS
| TLS_LD
))
2985 /* If just an LD reloc, we'll just use
2986 htab->tlsld_got.offset. */
2987 if (htab
->tlsld_got
.offset
== (bfd_vma
) -1)
2989 htab
->tlsld_got
.offset
= s
->_raw_size
;
2992 srel
->_raw_size
+= sizeof (Elf32_External_Rela
);
2994 *local_got
= (bfd_vma
) -1;
2998 *local_got
= s
->_raw_size
;
2999 if ((*lgot_masks
& TLS_TLS
) != 0)
3001 if ((*lgot_masks
& TLS_GD
) != 0)
3003 if ((*lgot_masks
& (TLS_TPREL
| TLS_TPRELGD
)) != 0)
3005 if ((*lgot_masks
& TLS_DTPREL
) != 0)
3011 srel
->_raw_size
+= ((s
->_raw_size
- *local_got
) / 4
3012 * sizeof (Elf32_External_Rela
));
3016 *local_got
= (bfd_vma
) -1;
3019 /* Allocate space for global sym dynamic relocs. */
3020 elf_link_hash_traverse (elf_hash_table (info
), allocate_dynrelocs
, info
);
3022 /* We've now determined the sizes of the various dynamic sections.
3023 Allocate memory for them. */
3025 for (s
= htab
->elf
.dynobj
->sections
; s
!= NULL
; s
= s
->next
)
3027 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
3032 || (htab
->sdata
!= NULL
&& s
== htab
->sdata
->section
)
3033 || (htab
->sdata2
!= NULL
&& s
== htab
->sdata2
->section
))
3035 /* Strip this section if we don't need it; see the
3038 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
3040 if (s
->_raw_size
== 0)
3042 /* If we don't need this section, strip it from the
3043 output file. This is mostly to handle .rela.bss and
3044 .rela.plt. We must create both sections in
3045 create_dynamic_sections, because they must be created
3046 before the linker maps input sections to output
3047 sections. The linker does that before
3048 adjust_dynamic_symbol is called, and it is that
3049 function which decides whether anything needs to go
3050 into these sections. */
3054 /* Remember whether there are any relocation sections. */
3057 /* We use the reloc_count field as a counter if we need
3058 to copy relocs into the output file. */
3064 /* It's not one of our sections, so don't allocate space. */
3068 if (s
->_raw_size
== 0)
3070 _bfd_strip_section_from_output (info
, s
);
3074 /* Allocate memory for the section contents. */
3075 s
->contents
= (bfd_byte
*) bfd_zalloc (htab
->elf
.dynobj
, s
->_raw_size
);
3076 if (s
->contents
== NULL
)
3080 if (htab
->elf
.dynamic_sections_created
)
3082 /* Add some entries to the .dynamic section. We fill in the
3083 values later, in ppc_elf_finish_dynamic_sections, but we
3084 must add the entries now so that we get the correct size for
3085 the .dynamic section. The DT_DEBUG entry is filled in by the
3086 dynamic linker and used by the debugger. */
3087 #define add_dynamic_entry(TAG, VAL) \
3088 bfd_elf32_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
3092 if (!add_dynamic_entry (DT_DEBUG
, 0))
3096 if (htab
->plt
!= NULL
&& htab
->plt
->_raw_size
!= 0)
3098 if (!add_dynamic_entry (DT_PLTGOT
, 0)
3099 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
3100 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
3101 || !add_dynamic_entry (DT_JMPREL
, 0))
3107 if (!add_dynamic_entry (DT_RELA
, 0)
3108 || !add_dynamic_entry (DT_RELASZ
, 0)
3109 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf32_External_Rela
)))
3113 /* If any dynamic relocs apply to a read-only section, then we
3114 need a DT_TEXTREL entry. */
3115 if ((info
->flags
& DF_TEXTREL
) == 0)
3116 elf_link_hash_traverse (elf_hash_table (info
), readonly_dynrelocs
,
3119 if ((info
->flags
& DF_TEXTREL
) != 0)
3121 if (!add_dynamic_entry (DT_TEXTREL
, 0))
3125 #undef add_dynamic_entry
3131 update_local_sym_info (abfd
, symtab_hdr
, r_symndx
, tls_type
)
3133 Elf_Internal_Shdr
*symtab_hdr
;
3134 unsigned long r_symndx
;
3137 bfd_signed_vma
*local_got_refcounts
= elf_local_got_refcounts (abfd
);
3138 char *local_got_tls_masks
;
3140 if (local_got_refcounts
== NULL
)
3142 bfd_size_type size
= symtab_hdr
->sh_info
;
3144 size
*= sizeof (*local_got_refcounts
) + sizeof (*local_got_tls_masks
);
3145 local_got_refcounts
= (bfd_signed_vma
*) bfd_zalloc (abfd
, size
);
3146 if (local_got_refcounts
== NULL
)
3148 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
3151 local_got_refcounts
[r_symndx
] += 1;
3152 local_got_tls_masks
= (char *) (local_got_refcounts
+ symtab_hdr
->sh_info
);
3153 local_got_tls_masks
[r_symndx
] |= tls_type
;
3158 bad_shared_reloc (abfd
, r_type
)
3160 enum elf_ppc_reloc_type r_type
;
3162 (*_bfd_error_handler
)
3163 (_("%s: relocation %s cannot be used when making a shared object"),
3164 bfd_archive_filename (abfd
),
3165 ppc_elf_howto_table
[(int) r_type
]->name
);
3166 bfd_set_error (bfd_error_bad_value
);
3169 /* Look through the relocs for a section during the first phase, and
3170 allocate space in the global offset table or procedure linkage
3174 ppc_elf_check_relocs (abfd
, info
, sec
, relocs
)
3176 struct bfd_link_info
*info
;
3178 const Elf_Internal_Rela
*relocs
;
3180 struct ppc_elf_link_hash_table
*htab
;
3181 Elf_Internal_Shdr
*symtab_hdr
;
3182 struct elf_link_hash_entry
**sym_hashes
;
3183 const Elf_Internal_Rela
*rel
;
3184 const Elf_Internal_Rela
*rel_end
;
3187 if (info
->relocateable
)
3191 fprintf (stderr
, "ppc_elf_check_relocs called for section %s in %s\n",
3192 bfd_get_section_name (abfd
, sec
),
3193 bfd_archive_filename (abfd
));
3196 /* Create the linker generated sections all the time so that the
3197 special symbols are created. */
3199 htab
= ppc_elf_hash_table (info
);
3200 if (htab
->sdata
== NULL
)
3202 htab
->sdata
= elf_linker_section (abfd
, LINKER_SECTION_SDATA
);
3203 if (htab
->sdata
== NULL
)
3204 htab
->sdata
= ppc_elf_create_linker_section (abfd
, info
,
3205 LINKER_SECTION_SDATA
);
3206 if (htab
->sdata
== NULL
)
3210 if (htab
->sdata2
== NULL
)
3212 htab
->sdata2
= elf_linker_section (abfd
, LINKER_SECTION_SDATA2
);
3213 if (htab
->sdata2
== NULL
)
3214 htab
->sdata2
= ppc_elf_create_linker_section (abfd
, info
,
3215 LINKER_SECTION_SDATA2
);
3216 if (htab
->sdata2
== NULL
)
3220 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3221 sym_hashes
= elf_sym_hashes (abfd
);
3224 rel_end
= relocs
+ sec
->reloc_count
;
3225 for (rel
= relocs
; rel
< rel_end
; rel
++)
3227 unsigned long r_symndx
;
3228 enum elf_ppc_reloc_type r_type
;
3229 struct elf_link_hash_entry
*h
;
3232 r_symndx
= ELF32_R_SYM (rel
->r_info
);
3233 if (r_symndx
< symtab_hdr
->sh_info
)
3236 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3238 /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3239 This shows up in particular in an R_PPC_ADDR32 in the eabi
3241 if (h
&& strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0)
3243 if (htab
->got
== NULL
)
3245 if (htab
->elf
.dynobj
== NULL
)
3246 htab
->elf
.dynobj
= abfd
;
3247 if (!ppc_elf_create_got (htab
->elf
.dynobj
, info
))
3252 r_type
= (enum elf_ppc_reloc_type
) ELF32_R_TYPE (rel
->r_info
);
3255 case R_PPC_GOT_TLSLD16
:
3256 case R_PPC_GOT_TLSLD16_LO
:
3257 case R_PPC_GOT_TLSLD16_HI
:
3258 case R_PPC_GOT_TLSLD16_HA
:
3259 htab
->tlsld_got
.refcount
+= 1;
3260 tls_type
= TLS_TLS
| TLS_LD
;
3263 case R_PPC_GOT_TLSGD16
:
3264 case R_PPC_GOT_TLSGD16_LO
:
3265 case R_PPC_GOT_TLSGD16_HI
:
3266 case R_PPC_GOT_TLSGD16_HA
:
3267 tls_type
= TLS_TLS
| TLS_GD
;
3270 case R_PPC_GOT_TPREL16
:
3271 case R_PPC_GOT_TPREL16_LO
:
3272 case R_PPC_GOT_TPREL16_HI
:
3273 case R_PPC_GOT_TPREL16_HA
:
3275 info
->flags
|= DF_STATIC_TLS
;
3276 tls_type
= TLS_TLS
| TLS_TPREL
;
3279 case R_PPC_GOT_DTPREL16
:
3280 case R_PPC_GOT_DTPREL16_LO
:
3281 case R_PPC_GOT_DTPREL16_HI
:
3282 case R_PPC_GOT_DTPREL16_HA
:
3283 tls_type
= TLS_TLS
| TLS_DTPREL
;
3285 sec
->has_tls_reloc
= 1;
3288 /* GOT16 relocations */
3290 case R_PPC_GOT16_LO
:
3291 case R_PPC_GOT16_HI
:
3292 case R_PPC_GOT16_HA
:
3293 /* This symbol requires a global offset table entry. */
3294 if (htab
->got
== NULL
)
3296 if (htab
->elf
.dynobj
== NULL
)
3297 htab
->elf
.dynobj
= abfd
;
3298 if (!ppc_elf_create_got (htab
->elf
.dynobj
, info
))
3303 h
->got
.refcount
+= 1;
3304 ppc_elf_hash_entry (h
)->tls_mask
|= tls_type
;
3307 /* This is a global offset table entry for a local symbol. */
3308 if (!update_local_sym_info (abfd
, symtab_hdr
, r_symndx
, tls_type
))
3312 /* Indirect .sdata relocation. */
3313 case R_PPC_EMB_SDAI16
:
3316 bad_shared_reloc (abfd
, r_type
);
3319 if (!bfd_elf32_create_pointer_linker_section (abfd
, info
,
3320 htab
->sdata
, h
, rel
))
3324 /* Indirect .sdata2 relocation. */
3325 case R_PPC_EMB_SDA2I16
:
3328 bad_shared_reloc (abfd
, r_type
);
3331 if (!bfd_elf32_create_pointer_linker_section (abfd
, info
,
3332 htab
->sdata2
, h
, rel
))
3336 case R_PPC_SDAREL16
:
3337 case R_PPC_EMB_SDA2REL
:
3338 case R_PPC_EMB_SDA21
:
3339 case R_PPC_EMB_RELSDA
:
3340 case R_PPC_EMB_NADDR32
:
3341 case R_PPC_EMB_NADDR16
:
3342 case R_PPC_EMB_NADDR16_LO
:
3343 case R_PPC_EMB_NADDR16_HI
:
3344 case R_PPC_EMB_NADDR16_HA
:
3347 bad_shared_reloc (abfd
, r_type
);
3353 case R_PPC_PLTREL24
:
3354 case R_PPC_PLTREL32
:
3355 case R_PPC_PLT16_LO
:
3356 case R_PPC_PLT16_HI
:
3357 case R_PPC_PLT16_HA
:
3359 fprintf (stderr
, "Reloc requires a PLT entry\n");
3361 /* This symbol requires a procedure linkage table entry. We
3362 actually build the entry in finish_dynamic_symbol,
3363 because this might be a case of linking PIC code without
3364 linking in any dynamic objects, in which case we don't
3365 need to generate a procedure linkage table after all. */
3369 /* It does not make sense to have a procedure linkage
3370 table entry for a local symbol. */
3371 bfd_set_error (bfd_error_bad_value
);
3375 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
3379 /* The following relocations don't need to propagate the
3380 relocation if linking a shared object since they are
3381 section relative. */
3383 case R_PPC_SECTOFF_LO
:
3384 case R_PPC_SECTOFF_HI
:
3385 case R_PPC_SECTOFF_HA
:
3386 case R_PPC_DTPREL16
:
3387 case R_PPC_DTPREL16_LO
:
3388 case R_PPC_DTPREL16_HI
:
3389 case R_PPC_DTPREL16_HA
:
3393 /* This are just markers. */
3395 case R_PPC_EMB_MRKREF
:
3400 /* These should only appear in dynamic objects. */
3402 case R_PPC_GLOB_DAT
:
3403 case R_PPC_JMP_SLOT
:
3404 case R_PPC_RELATIVE
:
3407 /* These aren't handled yet. We'll report an error later. */
3409 case R_PPC_EMB_RELSEC16
:
3410 case R_PPC_EMB_RELST_LO
:
3411 case R_PPC_EMB_RELST_HI
:
3412 case R_PPC_EMB_RELST_HA
:
3413 case R_PPC_EMB_BIT_FLD
:
3416 /* This refers only to functions defined in the shared library. */
3417 case R_PPC_LOCAL24PC
:
3420 /* This relocation describes the C++ object vtable hierarchy.
3421 Reconstruct it for later use during GC. */
3422 case R_PPC_GNU_VTINHERIT
:
3423 if (!_bfd_elf32_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
3427 /* This relocation describes which C++ vtable entries are actually
3428 used. Record for later use during GC. */
3429 case R_PPC_GNU_VTENTRY
:
3430 if (!_bfd_elf32_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
3434 /* We shouldn't really be seeing these. */
3437 info
->flags
|= DF_STATIC_TLS
;
3441 case R_PPC_DTPMOD32
:
3442 case R_PPC_DTPREL32
:
3446 case R_PPC_TPREL16_LO
:
3447 case R_PPC_TPREL16_HI
:
3448 case R_PPC_TPREL16_HA
:
3450 info
->flags
|= DF_STATIC_TLS
;
3453 /* When creating a shared object, we must copy these
3454 relocs into the output file. We create a reloc
3455 section in dynobj and make room for the reloc. */
3458 case R_PPC_REL14_BRTAKEN
:
3459 case R_PPC_REL14_BRNTAKEN
:
3462 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
3463 || SYMBOL_REFERENCES_LOCAL (info
, h
))
3470 case R_PPC_ADDR16_LO
:
3471 case R_PPC_ADDR16_HI
:
3472 case R_PPC_ADDR16_HA
:
3474 case R_PPC_ADDR14_BRTAKEN
:
3475 case R_PPC_ADDR14_BRNTAKEN
:
3478 if (h
!= NULL
&& !info
->shared
)
3480 /* We may need a plt entry if the symbol turns out to be
3481 a function defined in a dynamic object. */
3484 /* We may need a copy reloc too. */
3485 h
->elf_link_hash_flags
|= ELF_LINK_NON_GOT_REF
;
3489 /* If we are creating a shared library, and this is a reloc
3490 against a global symbol, or a non PC relative reloc
3491 against a local symbol, then we need to copy the reloc
3492 into the shared library. However, if we are linking with
3493 -Bsymbolic, we do not need to copy a reloc against a
3494 global symbol which is defined in an object we are
3495 including in the link (i.e., DEF_REGULAR is set). At
3496 this point we have not seen all the input files, so it is
3497 possible that DEF_REGULAR is not set now but will be set
3498 later (it is never cleared). In case of a weak definition,
3499 DEF_REGULAR may be cleared later by a strong definition in
3500 a shared library. We account for that possibility below by
3501 storing information in the dyn_relocs field of the hash
3502 table entry. A similar situation occurs when creating
3503 shared libraries and symbol visibility changes render the
3506 If on the other hand, we are creating an executable, we
3507 may need to keep relocations for symbols satisfied by a
3508 dynamic library if we manage to avoid copy relocs for the
3511 && (MUST_BE_DYN_RELOC (r_type
)
3513 && (! info
->symbolic
3514 || h
->root
.type
== bfd_link_hash_defweak
3515 || (h
->elf_link_hash_flags
3516 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
3517 || (ELIMINATE_COPY_RELOCS
3519 && (sec
->flags
& SEC_ALLOC
) != 0
3521 && (h
->root
.type
== bfd_link_hash_defweak
3522 || (h
->elf_link_hash_flags
3523 & ELF_LINK_HASH_DEF_REGULAR
) == 0)))
3525 struct ppc_elf_dyn_relocs
*p
;
3526 struct ppc_elf_dyn_relocs
**head
;
3529 fprintf (stderr
, "ppc_elf_check_relocs need to create relocation for %s\n",
3530 (h
&& h
->root
.root
.string
3531 ? h
->root
.root
.string
: "<unknown>"));
3537 name
= (bfd_elf_string_from_elf_section
3539 elf_elfheader (abfd
)->e_shstrndx
,
3540 elf_section_data (sec
)->rel_hdr
.sh_name
));
3544 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
3545 && strcmp (bfd_get_section_name (abfd
, sec
),
3548 sreloc
= bfd_get_section_by_name (htab
->elf
.dynobj
, name
);
3553 sreloc
= bfd_make_section (htab
->elf
.dynobj
, name
);
3554 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
3555 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
3556 if ((sec
->flags
& SEC_ALLOC
) != 0)
3557 flags
|= SEC_ALLOC
| SEC_LOAD
;
3559 || ! bfd_set_section_flags (htab
->elf
.dynobj
,
3561 || ! bfd_set_section_alignment (htab
->elf
.dynobj
,
3565 elf_section_data (sec
)->sreloc
= sreloc
;
3568 /* If this is a global symbol, we count the number of
3569 relocations we need for this symbol. */
3572 head
= &ppc_elf_hash_entry (h
)->dyn_relocs
;
3576 /* Track dynamic relocs needed for local syms too.
3577 We really need local syms available to do this
3581 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
3586 head
= ((struct ppc_elf_dyn_relocs
**)
3587 &elf_section_data (s
)->local_dynrel
);
3591 if (p
== NULL
|| p
->sec
!= sec
)
3593 p
= ((struct ppc_elf_dyn_relocs
*)
3594 bfd_alloc (htab
->elf
.dynobj
, sizeof *p
));
3605 if (!MUST_BE_DYN_RELOC (r_type
))
3616 /* Return the section that should be marked against GC for a given
3620 ppc_elf_gc_mark_hook (sec
, info
, rel
, h
, sym
)
3622 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
3623 Elf_Internal_Rela
*rel
;
3624 struct elf_link_hash_entry
*h
;
3625 Elf_Internal_Sym
*sym
;
3629 switch (ELF32_R_TYPE (rel
->r_info
))
3631 case R_PPC_GNU_VTINHERIT
:
3632 case R_PPC_GNU_VTENTRY
:
3636 switch (h
->root
.type
)
3638 case bfd_link_hash_defined
:
3639 case bfd_link_hash_defweak
:
3640 return h
->root
.u
.def
.section
;
3642 case bfd_link_hash_common
:
3643 return h
->root
.u
.c
.p
->section
;
3651 return bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
3656 /* Update the got, plt and dynamic reloc reference counts for the
3657 section being removed. */
3660 ppc_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
3662 struct bfd_link_info
*info
;
3664 const Elf_Internal_Rela
*relocs
;
3666 struct ppc_elf_link_hash_table
*htab
;
3667 Elf_Internal_Shdr
*symtab_hdr
;
3668 struct elf_link_hash_entry
**sym_hashes
;
3669 bfd_signed_vma
*local_got_refcounts
;
3670 const Elf_Internal_Rela
*rel
, *relend
;
3672 elf_section_data (sec
)->local_dynrel
= NULL
;
3674 htab
= ppc_elf_hash_table (info
);
3675 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3676 sym_hashes
= elf_sym_hashes (abfd
);
3677 local_got_refcounts
= elf_local_got_refcounts (abfd
);
3679 relend
= relocs
+ sec
->reloc_count
;
3680 for (rel
= relocs
; rel
< relend
; rel
++)
3682 unsigned long r_symndx
;
3683 enum elf_ppc_reloc_type r_type
;
3684 struct elf_link_hash_entry
*h
= NULL
;
3686 r_symndx
= ELF32_R_SYM (rel
->r_info
);
3687 if (r_symndx
>= symtab_hdr
->sh_info
)
3689 struct ppc_elf_dyn_relocs
**pp
, *p
;
3690 struct ppc_elf_link_hash_entry
*eh
;
3692 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3693 eh
= (struct ppc_elf_link_hash_entry
*) h
;
3695 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
3698 /* Everything must go for SEC. */
3704 r_type
= (enum elf_ppc_reloc_type
) ELF32_R_TYPE (rel
->r_info
);
3707 case R_PPC_GOT_TLSLD16
:
3708 case R_PPC_GOT_TLSLD16_LO
:
3709 case R_PPC_GOT_TLSLD16_HI
:
3710 case R_PPC_GOT_TLSLD16_HA
:
3711 htab
->tlsld_got
.refcount
-= 1;
3714 case R_PPC_GOT_TLSGD16
:
3715 case R_PPC_GOT_TLSGD16_LO
:
3716 case R_PPC_GOT_TLSGD16_HI
:
3717 case R_PPC_GOT_TLSGD16_HA
:
3718 case R_PPC_GOT_TPREL16
:
3719 case R_PPC_GOT_TPREL16_LO
:
3720 case R_PPC_GOT_TPREL16_HI
:
3721 case R_PPC_GOT_TPREL16_HA
:
3722 case R_PPC_GOT_DTPREL16
:
3723 case R_PPC_GOT_DTPREL16_LO
:
3724 case R_PPC_GOT_DTPREL16_HI
:
3725 case R_PPC_GOT_DTPREL16_HA
:
3727 case R_PPC_GOT16_LO
:
3728 case R_PPC_GOT16_HI
:
3729 case R_PPC_GOT16_HA
:
3732 if (h
->got
.refcount
> 0)
3735 else if (local_got_refcounts
!= NULL
)
3737 if (local_got_refcounts
[r_symndx
] > 0)
3738 local_got_refcounts
[r_symndx
]--;
3744 case R_PPC_REL14_BRTAKEN
:
3745 case R_PPC_REL14_BRNTAKEN
:
3748 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
3749 || SYMBOL_REFERENCES_LOCAL (info
, h
))
3756 case R_PPC_ADDR16_LO
:
3757 case R_PPC_ADDR16_HI
:
3758 case R_PPC_ADDR16_HA
:
3760 case R_PPC_ADDR14_BRTAKEN
:
3761 case R_PPC_ADDR14_BRNTAKEN
:
3765 case R_PPC_PLTREL24
:
3766 case R_PPC_PLT16_LO
:
3767 case R_PPC_PLT16_HI
:
3768 case R_PPC_PLT16_HA
:
3771 if (h
->plt
.refcount
> 0)
3783 /* Set htab->tls_sec and htab->tls_get_addr. */
3786 ppc_elf_tls_setup (obfd
, info
)
3788 struct bfd_link_info
*info
;
3791 struct ppc_elf_link_hash_table
*htab
;
3793 htab
= ppc_elf_hash_table (info
);
3794 htab
->tls_get_addr
= elf_link_hash_lookup (&htab
->elf
, "__tls_get_addr",
3795 FALSE
, FALSE
, TRUE
);
3797 for (tls
= obfd
->sections
; tls
!= NULL
; tls
= tls
->next
)
3798 if ((tls
->flags
& (SEC_THREAD_LOCAL
| SEC_LOAD
))
3799 == (SEC_THREAD_LOCAL
| SEC_LOAD
))
3801 htab
->tls_sec
= tls
;
3806 /* Run through all the TLS relocs looking for optimization
3810 ppc_elf_tls_optimize (obfd
, info
)
3811 bfd
*obfd ATTRIBUTE_UNUSED
;
3812 struct bfd_link_info
*info
;
3816 struct ppc_elf_link_hash_table
*htab
;
3818 if (info
->relocateable
|| info
->shared
)
3821 htab
= ppc_elf_hash_table (info
);
3822 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
3824 Elf_Internal_Sym
*locsyms
= NULL
;
3825 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
3827 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
3828 if (sec
->has_tls_reloc
&& !bfd_is_abs_section (sec
->output_section
))
3830 Elf_Internal_Rela
*relstart
, *rel
, *relend
;
3831 int expecting_tls_get_addr
;
3833 /* Read the relocations. */
3834 relstart
= _bfd_elf32_link_read_relocs (ibfd
, sec
, (PTR
) NULL
,
3835 (Elf_Internal_Rela
*) NULL
,
3837 if (relstart
== NULL
)
3840 expecting_tls_get_addr
= 0;
3841 relend
= relstart
+ sec
->reloc_count
;
3842 for (rel
= relstart
; rel
< relend
; rel
++)
3844 enum elf_ppc_reloc_type r_type
;
3845 unsigned long r_symndx
;
3846 struct elf_link_hash_entry
*h
= NULL
;
3848 char tls_set
, tls_clear
;
3849 bfd_boolean is_local
;
3851 r_symndx
= ELF32_R_SYM (rel
->r_info
);
3852 if (r_symndx
>= symtab_hdr
->sh_info
)
3854 struct elf_link_hash_entry
**sym_hashes
;
3856 sym_hashes
= elf_sym_hashes (ibfd
);
3857 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3858 while (h
->root
.type
== bfd_link_hash_indirect
3859 || h
->root
.type
== bfd_link_hash_warning
)
3860 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3865 || !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
))
3868 r_type
= (enum elf_ppc_reloc_type
) ELF32_R_TYPE (rel
->r_info
);
3871 case R_PPC_GOT_TLSLD16
:
3872 case R_PPC_GOT_TLSLD16_LO
:
3873 case R_PPC_GOT_TLSLD16_HI
:
3874 case R_PPC_GOT_TLSLD16_HA
:
3875 /* These relocs should never be against a symbol
3876 defined in a shared lib. Leave them alone if
3877 that turns out to be the case. */
3878 expecting_tls_get_addr
= 0;
3879 htab
->tlsld_got
.refcount
-= 1;
3886 expecting_tls_get_addr
= 1;
3889 case R_PPC_GOT_TLSGD16
:
3890 case R_PPC_GOT_TLSGD16_LO
:
3891 case R_PPC_GOT_TLSGD16_HI
:
3892 case R_PPC_GOT_TLSGD16_HA
:
3898 tls_set
= TLS_TLS
| TLS_TPRELGD
;
3900 expecting_tls_get_addr
= 1;
3903 case R_PPC_GOT_TPREL16
:
3904 case R_PPC_GOT_TPREL16_LO
:
3905 case R_PPC_GOT_TPREL16_HI
:
3906 case R_PPC_GOT_TPREL16_HA
:
3907 expecting_tls_get_addr
= 0;
3912 tls_clear
= TLS_TPREL
;
3919 case R_PPC_REL14_BRTAKEN
:
3920 case R_PPC_REL14_BRNTAKEN
:
3922 if (expecting_tls_get_addr
3924 && h
== htab
->tls_get_addr
)
3926 if (h
->plt
.refcount
> 0)
3927 h
->plt
.refcount
-= 1;
3929 expecting_tls_get_addr
= 0;
3933 expecting_tls_get_addr
= 0;
3941 /* We managed to get rid of a got entry. */
3942 if (h
->got
.refcount
> 0)
3943 h
->got
.refcount
-= 1;
3945 tls_mask
= &ppc_elf_hash_entry (h
)->tls_mask
;
3949 Elf_Internal_Sym
*sym
;
3950 bfd_signed_vma
*lgot_refs
;
3953 if (locsyms
== NULL
)
3955 locsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
3956 if (locsyms
== NULL
)
3957 locsyms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
3958 symtab_hdr
->sh_info
,
3959 0, NULL
, NULL
, NULL
);
3960 if (locsyms
== NULL
)
3962 if (elf_section_data (sec
)->relocs
!= relstart
)
3967 sym
= locsyms
+ r_symndx
;
3968 lgot_refs
= elf_local_got_refcounts (ibfd
);
3969 if (lgot_refs
== NULL
)
3973 /* We managed to get rid of a got entry. */
3974 if (lgot_refs
[r_symndx
] > 0)
3975 lgot_refs
[r_symndx
] -= 1;
3977 lgot_masks
= (char *) (lgot_refs
+ symtab_hdr
->sh_info
);
3978 tls_mask
= &lgot_masks
[r_symndx
];
3981 *tls_mask
|= tls_set
;
3982 *tls_mask
&= ~tls_clear
;
3985 if (elf_section_data (sec
)->relocs
!= relstart
)
3990 && (symtab_hdr
->contents
!= (unsigned char *) locsyms
))
3992 if (!info
->keep_memory
)
3995 symtab_hdr
->contents
= (unsigned char *) locsyms
;
4001 /* Hook called by the linker routine which adds symbols from an object
4002 file. We use it to put .comm items in .sbss, and not .bss. */
4005 ppc_elf_add_symbol_hook (abfd
, info
, sym
, namep
, flagsp
, secp
, valp
)
4007 struct bfd_link_info
*info
;
4008 const Elf_Internal_Sym
*sym
;
4009 const char **namep ATTRIBUTE_UNUSED
;
4010 flagword
*flagsp ATTRIBUTE_UNUSED
;
4014 if (sym
->st_shndx
== SHN_COMMON
4015 && !info
->relocateable
4016 && sym
->st_size
<= elf_gp_size (abfd
)
4017 && info
->hash
->creator
->flavour
== bfd_target_elf_flavour
)
4019 /* Common symbols less than or equal to -G nn bytes are automatically
4021 elf_linker_section_t
*sdata
4022 = ppc_elf_create_linker_section (abfd
, info
, LINKER_SECTION_SDATA
);
4024 if (!sdata
->bss_section
)
4028 /* We don't go through bfd_make_section, because we don't
4029 want to attach this common section to DYNOBJ. The linker
4030 will move the symbols to the appropriate output section
4031 when it defines common symbols. */
4032 amt
= sizeof (asection
);
4033 sdata
->bss_section
= (asection
*) bfd_zalloc (abfd
, amt
);
4034 if (sdata
->bss_section
== NULL
)
4036 sdata
->bss_section
->name
= sdata
->bss_name
;
4037 sdata
->bss_section
->flags
= SEC_IS_COMMON
;
4038 sdata
->bss_section
->output_section
= sdata
->bss_section
;
4039 amt
= sizeof (asymbol
);
4040 sdata
->bss_section
->symbol
= (asymbol
*) bfd_zalloc (abfd
, amt
);
4041 amt
= sizeof (asymbol
*);
4042 sdata
->bss_section
->symbol_ptr_ptr
=
4043 (asymbol
**) bfd_zalloc (abfd
, amt
);
4044 if (sdata
->bss_section
->symbol
== NULL
4045 || sdata
->bss_section
->symbol_ptr_ptr
== NULL
)
4047 sdata
->bss_section
->symbol
->name
= sdata
->bss_name
;
4048 sdata
->bss_section
->symbol
->flags
= BSF_SECTION_SYM
;
4049 sdata
->bss_section
->symbol
->section
= sdata
->bss_section
;
4050 *sdata
->bss_section
->symbol_ptr_ptr
= sdata
->bss_section
->symbol
;
4053 *secp
= sdata
->bss_section
;
4054 *valp
= sym
->st_size
;
4060 /* Finish up dynamic symbol handling. We set the contents of various
4061 dynamic sections here. */
4064 ppc_elf_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
4066 struct bfd_link_info
*info
;
4067 struct elf_link_hash_entry
*h
;
4068 Elf_Internal_Sym
*sym
;
4070 struct ppc_elf_link_hash_table
*htab
;
4073 fprintf (stderr
, "ppc_elf_finish_dynamic_symbol called for %s",
4074 h
->root
.root
.string
);
4077 htab
= ppc_elf_hash_table (info
);
4078 BFD_ASSERT (htab
->elf
.dynobj
!= NULL
);
4080 if (h
->plt
.offset
!= (bfd_vma
) -1)
4082 Elf_Internal_Rela rela
;
4084 bfd_vma reloc_index
;
4087 fprintf (stderr
, ", plt_offset = %d", h
->plt
.offset
);
4090 /* This symbol has an entry in the procedure linkage table. Set
4093 BFD_ASSERT (h
->dynindx
!= -1);
4094 BFD_ASSERT (htab
->plt
!= NULL
&& htab
->relplt
!= NULL
);
4096 /* We don't need to fill in the .plt. The ppc dynamic linker
4099 /* Fill in the entry in the .rela.plt section. */
4100 rela
.r_offset
= (htab
->plt
->output_section
->vma
4101 + htab
->plt
->output_offset
4103 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_PPC_JMP_SLOT
);
4106 reloc_index
= (h
->plt
.offset
- PLT_INITIAL_ENTRY_SIZE
) / PLT_SLOT_SIZE
;
4107 if (reloc_index
> PLT_NUM_SINGLE_ENTRIES
)
4108 reloc_index
-= (reloc_index
- PLT_NUM_SINGLE_ENTRIES
) / 2;
4109 loc
= (htab
->relplt
->contents
4110 + reloc_index
* sizeof (Elf32_External_Rela
));
4111 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
4113 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4115 /* Mark the symbol as undefined, rather than as defined in
4116 the .plt section. Leave the value alone. */
4117 sym
->st_shndx
= SHN_UNDEF
;
4118 /* If the symbol is weak, we do need to clear the value.
4119 Otherwise, the PLT entry would provide a definition for
4120 the symbol even if the symbol wasn't defined anywhere,
4121 and so the symbol would never be NULL. */
4122 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR_NONWEAK
)
4128 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
4131 Elf_Internal_Rela rela
;
4134 /* This symbols needs a copy reloc. Set it up. */
4137 fprintf (stderr
, ", copy");
4140 BFD_ASSERT (h
->dynindx
!= -1);
4142 if (h
->size
<= elf_gp_size (htab
->elf
.dynobj
))
4146 BFD_ASSERT (s
!= NULL
);
4148 rela
.r_offset
= (h
->root
.u
.def
.value
4149 + h
->root
.u
.def
.section
->output_section
->vma
4150 + h
->root
.u
.def
.section
->output_offset
);
4151 rela
.r_info
= ELF32_R_INFO (h
->dynindx
, R_PPC_COPY
);
4153 loc
= s
->contents
+ s
->reloc_count
++ * sizeof (Elf32_External_Rela
);
4154 bfd_elf32_swap_reloca_out (output_bfd
, &rela
, loc
);
4158 fprintf (stderr
, "\n");
4161 /* Mark some specially defined symbols as absolute. */
4162 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0
4163 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
4164 || strcmp (h
->root
.root
.string
, "_PROCEDURE_LINKAGE_TABLE_") == 0)
4165 sym
->st_shndx
= SHN_ABS
;
4170 /* Finish up the dynamic sections. */
4173 ppc_elf_finish_dynamic_sections (output_bfd
, info
)
4175 struct bfd_link_info
*info
;
4178 struct ppc_elf_link_hash_table
*htab
;
4181 fprintf (stderr
, "ppc_elf_finish_dynamic_sections called\n");
4184 htab
= ppc_elf_hash_table (info
);
4185 sdyn
= bfd_get_section_by_name (htab
->elf
.dynobj
, ".dynamic");
4187 if (htab
->elf
.dynamic_sections_created
)
4189 Elf32_External_Dyn
*dyncon
, *dynconend
;
4191 BFD_ASSERT (htab
->plt
!= NULL
&& sdyn
!= NULL
);
4193 dyncon
= (Elf32_External_Dyn
*) sdyn
->contents
;
4194 dynconend
= (Elf32_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
4195 for (; dyncon
< dynconend
; dyncon
++)
4197 Elf_Internal_Dyn dyn
;
4200 bfd_elf32_swap_dyn_in (htab
->elf
.dynobj
, dyncon
, &dyn
);
4206 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
4210 dyn
.d_un
.d_val
= htab
->relplt
->_raw_size
;
4215 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
4222 bfd_elf32_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
4226 /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
4227 easily find the address of the _GLOBAL_OFFSET_TABLE_. */
4230 unsigned char *contents
= htab
->got
->contents
;
4231 bfd_put_32 (output_bfd
, (bfd_vma
) 0x4e800021 /* blrl */, contents
);
4234 bfd_put_32 (output_bfd
, (bfd_vma
) 0, contents
+ 4);
4236 bfd_put_32 (output_bfd
,
4237 sdyn
->output_section
->vma
+ sdyn
->output_offset
,
4240 elf_section_data (htab
->got
->output_section
)->this_hdr
.sh_entsize
= 4;
4246 /* The RELOCATE_SECTION function is called by the ELF backend linker
4247 to handle the relocations for a section.
4249 The relocs are always passed as Rela structures; if the section
4250 actually uses Rel structures, the r_addend field will always be
4253 This function is responsible for adjust the section contents as
4254 necessary, and (if using Rela relocs and generating a
4255 relocateable output file) adjusting the reloc addend as
4258 This function does not have to worry about setting the reloc
4259 address or the reloc symbol index.
4261 LOCAL_SYMS is a pointer to the swapped in local symbols.
4263 LOCAL_SECTIONS is an array giving the section in the input file
4264 corresponding to the st_shndx field of each local symbol.
4266 The global hash table entry for the global symbols can be found
4267 via elf_sym_hashes (input_bfd).
4269 When generating relocateable output, this function must handle
4270 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
4271 going to be the section symbol corresponding to the output
4272 section, which means that the addend must be adjusted
4276 ppc_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
4277 contents
, relocs
, local_syms
, local_sections
)
4279 struct bfd_link_info
*info
;
4281 asection
*input_section
;
4283 Elf_Internal_Rela
*relocs
;
4284 Elf_Internal_Sym
*local_syms
;
4285 asection
**local_sections
;
4287 Elf_Internal_Shdr
*symtab_hdr
;
4288 struct elf_link_hash_entry
**sym_hashes
;
4289 struct ppc_elf_link_hash_table
*htab
;
4290 Elf_Internal_Rela
*rel
;
4291 Elf_Internal_Rela
*relend
;
4292 Elf_Internal_Rela outrel
;
4294 asection
*sreloc
= NULL
;
4295 bfd_vma
*local_got_offsets
;
4296 bfd_boolean ret
= TRUE
;
4299 fprintf (stderr
, "ppc_elf_relocate_section called for %s section %s, %ld relocations%s\n",
4300 bfd_archive_filename (input_bfd
),
4301 bfd_section_name(input_bfd
, input_section
),
4302 (long) input_section
->reloc_count
,
4303 (info
->relocateable
) ? " (relocatable)" : "");
4306 if (info
->relocateable
)
4309 if (!ppc_elf_howto_table
[R_PPC_ADDR32
])
4310 /* Initialize howto table if needed. */
4311 ppc_elf_howto_init ();
4313 htab
= ppc_elf_hash_table (info
);
4314 local_got_offsets
= elf_local_got_offsets (input_bfd
);
4315 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
4316 sym_hashes
= elf_sym_hashes (input_bfd
);
4318 relend
= relocs
+ input_section
->reloc_count
;
4319 for (; rel
< relend
; rel
++)
4321 enum elf_ppc_reloc_type r_type
;
4323 bfd_reloc_status_type r
;
4324 Elf_Internal_Sym
*sym
;
4326 struct elf_link_hash_entry
*h
;
4327 const char *sym_name
;
4328 reloc_howto_type
*howto
;
4329 unsigned long r_symndx
;
4331 bfd_vma branch_bit
, insn
, from
;
4332 bfd_boolean unresolved_reloc
;
4334 unsigned int tls_type
, tls_mask
, tls_gd
;
4336 r_type
= (enum elf_ppc_reloc_type
)ELF32_R_TYPE (rel
->r_info
);
4337 sym
= (Elf_Internal_Sym
*) 0;
4338 sec
= (asection
*) 0;
4339 h
= (struct elf_link_hash_entry
*) 0;
4340 unresolved_reloc
= FALSE
;
4342 r_symndx
= ELF32_R_SYM (rel
->r_info
);
4343 if (r_symndx
< symtab_hdr
->sh_info
)
4345 sym
= local_syms
+ r_symndx
;
4346 sec
= local_sections
[r_symndx
];
4347 sym_name
= bfd_elf_local_sym_name (input_bfd
, sym
);
4349 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, sec
, rel
);
4353 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4354 while (h
->root
.type
== bfd_link_hash_indirect
4355 || h
->root
.type
== bfd_link_hash_warning
)
4356 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4357 sym_name
= h
->root
.root
.string
;
4360 if (h
->root
.type
== bfd_link_hash_defined
4361 || h
->root
.type
== bfd_link_hash_defweak
)
4363 sec
= h
->root
.u
.def
.section
;
4364 /* Set a flag that will be cleared later if we find a
4365 relocation value for this symbol. output_section
4366 is typically NULL for symbols satisfied by a shared
4368 if (sec
->output_section
== NULL
)
4369 unresolved_reloc
= TRUE
;
4371 relocation
= (h
->root
.u
.def
.value
4372 + sec
->output_section
->vma
4373 + sec
->output_offset
);
4375 else if (h
->root
.type
== bfd_link_hash_undefweak
)
4377 else if (info
->shared
4378 && !info
->no_undefined
4379 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4383 if (! ((*info
->callbacks
->undefined_symbol
)
4384 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
4385 rel
->r_offset
, (!info
->shared
4386 || info
->no_undefined
4387 || ELF_ST_VISIBILITY (h
->other
)))))
4393 /* TLS optimizations. Replace instruction sequences and relocs
4394 based on information we collected in tls_optimize. We edit
4395 RELOCS so that --emit-relocs will output something sensible
4396 for the final instruction stream. */
4399 if (IS_PPC_TLS_RELOC (r_type
))
4402 tls_mask
= ((struct ppc_elf_link_hash_entry
*) h
)->tls_mask
;
4403 else if (local_got_offsets
!= NULL
)
4406 lgot_masks
= (char *) (local_got_offsets
+ symtab_hdr
->sh_info
);
4407 tls_mask
= lgot_masks
[r_symndx
];
4411 /* Ensure reloc mapping code below stays sane. */
4412 if ((R_PPC_GOT_TLSLD16
& 3) != (R_PPC_GOT_TLSGD16
& 3)
4413 || (R_PPC_GOT_TLSLD16_LO
& 3) != (R_PPC_GOT_TLSGD16_LO
& 3)
4414 || (R_PPC_GOT_TLSLD16_HI
& 3) != (R_PPC_GOT_TLSGD16_HI
& 3)
4415 || (R_PPC_GOT_TLSLD16_HA
& 3) != (R_PPC_GOT_TLSGD16_HA
& 3)
4416 || (R_PPC_GOT_TLSLD16
& 3) != (R_PPC_GOT_TPREL16
& 3)
4417 || (R_PPC_GOT_TLSLD16_LO
& 3) != (R_PPC_GOT_TPREL16_LO
& 3)
4418 || (R_PPC_GOT_TLSLD16_HI
& 3) != (R_PPC_GOT_TPREL16_HI
& 3)
4419 || (R_PPC_GOT_TLSLD16_HA
& 3) != (R_PPC_GOT_TPREL16_HA
& 3))
4426 case R_PPC_GOT_TPREL16
:
4427 case R_PPC_GOT_TPREL16_LO
:
4429 && (tls_mask
& TLS_TPREL
) == 0)
4432 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
- 2);
4434 insn
|= 0x3c020000; /* addis 0,2,0 */
4435 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
- 2);
4436 r_type
= R_PPC_TPREL16_HA
;
4437 rel
->r_info
= ELF32_R_INFO (r_symndx
, r_type
);
4443 && (tls_mask
& TLS_TPREL
) == 0)
4446 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
);
4447 if ((insn
& ((31 << 26) | (31 << 11)))
4448 == ((31 << 26) | (2 << 11)))
4449 rtra
= insn
& ((1 << 26) - (1 << 16));
4450 else if ((insn
& ((31 << 26) | (31 << 16)))
4451 == ((31 << 26) | (2 << 16)))
4452 rtra
= (insn
& (31 << 21)) | ((insn
& (31 << 11)) << 5);
4455 if ((insn
& ((1 << 11) - (1 << 1))) == 266 << 1)
4458 else if ((insn
& (31 << 1)) == 23 << 1
4459 && ((insn
& (31 << 6)) < 14 << 6
4460 || ((insn
& (31 << 6)) >= 16 << 6
4461 && (insn
& (31 << 6)) < 24 << 6)))
4462 /* load and store indexed -> dform. */
4463 insn
= (32 | ((insn
>> 6) & 31)) << 26;
4464 else if ((insn
& (31 << 1)) == 21 << 1
4465 && (insn
& (0x1a << 6)) == 0)
4466 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */
4467 insn
= (((58 | ((insn
>> 6) & 4)) << 26)
4468 | ((insn
>> 6) & 1));
4469 else if ((insn
& (31 << 1)) == 21 << 1
4470 && (insn
& ((1 << 11) - (1 << 1))) == 341 << 1)
4472 insn
= (58 << 26) | 2;
4476 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
4477 r_type
= R_PPC_TPREL16_LO
;
4478 rel
->r_info
= ELF32_R_INFO (r_symndx
, r_type
);
4479 /* Was PPC_TLS which sits on insn boundary, now
4480 PPC_TPREL16_LO which is at insn+2. */
4485 case R_PPC_GOT_TLSGD16_HI
:
4486 case R_PPC_GOT_TLSGD16_HA
:
4487 tls_gd
= TLS_TPRELGD
;
4488 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
4492 case R_PPC_GOT_TLSLD16_HI
:
4493 case R_PPC_GOT_TLSLD16_HA
:
4494 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
4497 if ((tls_mask
& tls_gd
) != 0)
4498 r_type
= (((r_type
- (R_PPC_GOT_TLSGD16
& 3)) & 3)
4499 + R_PPC_GOT_TPREL16
);
4502 bfd_put_32 (output_bfd
, NOP
, contents
+ rel
->r_offset
);
4504 r_type
= R_PPC_NONE
;
4506 rel
->r_info
= ELF32_R_INFO (r_symndx
, r_type
);
4510 case R_PPC_GOT_TLSGD16
:
4511 case R_PPC_GOT_TLSGD16_LO
:
4512 tls_gd
= TLS_TPRELGD
;
4513 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
4514 goto tls_get_addr_check
;
4517 case R_PPC_GOT_TLSLD16
:
4518 case R_PPC_GOT_TLSLD16_LO
:
4519 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
4522 if (rel
+ 1 < relend
)
4524 enum elf_ppc_reloc_type r_type2
;
4525 unsigned long r_symndx2
;
4526 struct elf_link_hash_entry
*h2
;
4527 bfd_vma insn1
, insn2
;
4530 /* The next instruction should be a call to
4531 __tls_get_addr. Peek at the reloc to be sure. */
4533 = (enum elf_ppc_reloc_type
) ELF32_R_TYPE (rel
[1].r_info
);
4534 r_symndx2
= ELF32_R_SYM (rel
[1].r_info
);
4535 if (r_symndx2
< symtab_hdr
->sh_info
4536 || (r_type2
!= R_PPC_REL14
4537 && r_type2
!= R_PPC_REL14_BRTAKEN
4538 && r_type2
!= R_PPC_REL14_BRNTAKEN
4539 && r_type2
!= R_PPC_REL24
4540 && r_type2
!= R_PPC_PLTREL24
))
4543 h2
= sym_hashes
[r_symndx2
- symtab_hdr
->sh_info
];
4544 while (h2
->root
.type
== bfd_link_hash_indirect
4545 || h2
->root
.type
== bfd_link_hash_warning
)
4546 h2
= (struct elf_link_hash_entry
*) h2
->root
.u
.i
.link
;
4547 if (h2
== NULL
|| h2
!= htab
->tls_get_addr
)
4550 /* OK, it checks out. Replace the call. */
4551 offset
= rel
[1].r_offset
;
4552 insn1
= bfd_get_32 (output_bfd
,
4553 contents
+ rel
->r_offset
- 2);
4554 if ((tls_mask
& tls_gd
) != 0)
4557 insn1
&= (1 << 26) - 1;
4558 insn1
|= 32 << 26; /* lwz */
4559 insn2
= 0x7c631214; /* add 3,3,2 */
4560 rel
[1].r_info
= ELF32_R_INFO (r_symndx2
, R_PPC_NONE
);
4561 r_type
= (((r_type
- (R_PPC_GOT_TLSGD16
& 3)) & 3)
4562 + R_PPC_GOT_TPREL16
);
4563 rel
->r_info
= ELF32_R_INFO (r_symndx
, r_type
);
4568 insn1
= 0x3c620000; /* addis 3,2,0 */
4569 insn2
= 0x38630000; /* addi 3,3,0 */
4572 /* Was an LD reloc. */
4574 rel
->r_addend
= htab
->tls_sec
->vma
+ DTP_OFFSET
;
4575 rel
[1].r_addend
= htab
->tls_sec
->vma
+ DTP_OFFSET
;
4577 r_type
= R_PPC_TPREL16_HA
;
4578 rel
->r_info
= ELF32_R_INFO (r_symndx
, r_type
);
4579 rel
[1].r_info
= ELF32_R_INFO (r_symndx
,
4581 rel
[1].r_offset
+= 2;
4583 bfd_put_32 (output_bfd
, insn1
, contents
+ rel
->r_offset
- 2);
4584 bfd_put_32 (output_bfd
, insn2
, contents
+ offset
);
4587 /* We changed the symbol on an LD reloc. Start over
4588 in order to get h, sym, sec etc. right. */
4597 /* Handle other relocations that tweak non-addend part of insn. */
4604 /* Branch taken prediction relocations. */
4605 case R_PPC_ADDR14_BRTAKEN
:
4606 case R_PPC_REL14_BRTAKEN
:
4607 branch_bit
= BRANCH_PREDICT_BIT
;
4610 /* Branch not taken predicition relocations. */
4611 case R_PPC_ADDR14_BRNTAKEN
:
4612 case R_PPC_REL14_BRNTAKEN
:
4613 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
);
4614 insn
&= ~BRANCH_PREDICT_BIT
;
4617 from
= (rel
->r_offset
4618 + input_section
->output_offset
4619 + input_section
->output_section
->vma
);
4621 /* Invert 'y' bit if not the default. */
4622 if ((bfd_signed_vma
) (relocation
+ rel
->r_addend
- from
) < 0)
4623 insn
^= BRANCH_PREDICT_BIT
;
4625 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
4629 addend
= rel
->r_addend
;
4632 if ((unsigned) r_type
< (unsigned) R_PPC_max
)
4633 howto
= ppc_elf_howto_table
[(int) r_type
];
4637 (*_bfd_error_handler
)
4638 (_("%s: unknown relocation type %d for symbol %s"),
4639 bfd_archive_filename (input_bfd
), (int) r_type
, sym_name
);
4641 bfd_set_error (bfd_error_bad_value
);
4647 case R_PPC_EMB_MRKREF
:
4648 case R_PPC_GNU_VTINHERIT
:
4649 case R_PPC_GNU_VTENTRY
:
4652 /* GOT16 relocations. Like an ADDR16 using the symbol's
4653 address in the GOT as relocation value instead of the
4654 symbol's value itself. Also, create a GOT entry for the
4655 symbol and put the symbol value there. */
4656 case R_PPC_GOT_TLSGD16
:
4657 case R_PPC_GOT_TLSGD16_LO
:
4658 case R_PPC_GOT_TLSGD16_HI
:
4659 case R_PPC_GOT_TLSGD16_HA
:
4660 tls_type
= TLS_TLS
| TLS_GD
;
4663 case R_PPC_GOT_TLSLD16
:
4664 case R_PPC_GOT_TLSLD16_LO
:
4665 case R_PPC_GOT_TLSLD16_HI
:
4666 case R_PPC_GOT_TLSLD16_HA
:
4667 tls_type
= TLS_TLS
| TLS_LD
;
4670 case R_PPC_GOT_TPREL16
:
4671 case R_PPC_GOT_TPREL16_LO
:
4672 case R_PPC_GOT_TPREL16_HI
:
4673 case R_PPC_GOT_TPREL16_HA
:
4674 tls_type
= TLS_TLS
| TLS_TPREL
;
4677 case R_PPC_GOT_DTPREL16
:
4678 case R_PPC_GOT_DTPREL16_LO
:
4679 case R_PPC_GOT_DTPREL16_HI
:
4680 case R_PPC_GOT_DTPREL16_HA
:
4681 tls_type
= TLS_TLS
| TLS_DTPREL
;
4685 case R_PPC_GOT16_LO
:
4686 case R_PPC_GOT16_HI
:
4687 case R_PPC_GOT16_HA
:
4690 /* Relocation is to the entry for this symbol in the global
4696 if (htab
->got
== NULL
)
4700 if (tls_type
== (TLS_TLS
| TLS_LD
)
4702 || !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
)))
4703 offp
= &htab
->tlsld_got
.offset
;
4707 dyn
= htab
->elf
.dynamic_sections_created
;
4708 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
4710 && SYMBOL_REFERENCES_LOCAL (info
, h
)))
4711 /* This is actually a static link, or it is a
4712 -Bsymbolic link and the symbol is defined
4713 locally, or the symbol was forced to be local
4714 because of a version file. */
4719 unresolved_reloc
= FALSE
;
4721 offp
= &h
->got
.offset
;
4725 if (local_got_offsets
== NULL
)
4727 offp
= &local_got_offsets
[r_symndx
];
4730 /* The offset must always be a multiple of 4. We use the
4731 least significant bit to record whether we have already
4732 processed this entry. */
4738 unsigned int tls_m
= (tls_mask
4739 & (TLS_LD
| TLS_GD
| TLS_DTPREL
4740 | TLS_TPREL
| TLS_TPRELGD
));
4742 if (offp
== &htab
->tlsld_got
.offset
)
4745 || !(h
->elf_link_hash_flags
4746 & ELF_LINK_HASH_DEF_DYNAMIC
))
4749 /* We might have multiple got entries for this sym.
4750 Initialize them all. */
4755 if ((tls_m
& TLS_LD
) != 0)
4757 tls_ty
= TLS_TLS
| TLS_LD
;
4760 else if ((tls_m
& TLS_GD
) != 0)
4762 tls_ty
= TLS_TLS
| TLS_GD
;
4765 else if ((tls_m
& TLS_DTPREL
) != 0)
4767 tls_ty
= TLS_TLS
| TLS_DTPREL
;
4768 tls_m
&= ~TLS_DTPREL
;
4770 else if ((tls_m
& (TLS_TPREL
| TLS_TPRELGD
)) != 0)
4772 tls_ty
= TLS_TLS
| TLS_TPREL
;
4776 /* Generate relocs for the dynamic linker. */
4777 if (info
->shared
|| indx
!= 0)
4779 outrel
.r_offset
= (htab
->got
->output_section
->vma
4780 + htab
->got
->output_offset
4782 outrel
.r_addend
= 0;
4783 if (tls_ty
& (TLS_LD
| TLS_GD
))
4785 outrel
.r_info
= ELF32_R_INFO (indx
, R_PPC_DTPMOD32
);
4786 if (tls_ty
== (TLS_TLS
| TLS_GD
))
4788 loc
= htab
->relgot
->contents
;
4789 loc
+= (htab
->relgot
->reloc_count
++
4790 * sizeof (Elf32_External_Rela
));
4791 bfd_elf32_swap_reloca_out (output_bfd
,
4793 outrel
.r_offset
+= 4;
4795 = ELF32_R_INFO (indx
, R_PPC_DTPREL32
);
4798 else if (tls_ty
== (TLS_TLS
| TLS_DTPREL
))
4799 outrel
.r_info
= ELF32_R_INFO (indx
, R_PPC_DTPREL32
);
4800 else if (tls_ty
== (TLS_TLS
| TLS_TPREL
))
4801 outrel
.r_info
= ELF32_R_INFO (indx
, R_PPC_TPREL32
);
4803 outrel
.r_info
= ELF32_R_INFO (indx
, R_PPC_RELATIVE
);
4805 outrel
.r_info
= ELF32_R_INFO (indx
, R_PPC_GLOB_DAT
);
4808 outrel
.r_addend
+= relocation
;
4809 if (tls_ty
& (TLS_GD
| TLS_DTPREL
| TLS_TPREL
))
4810 outrel
.r_addend
-= htab
->tls_sec
->vma
;
4812 loc
= htab
->relgot
->contents
;
4813 loc
+= (htab
->relgot
->reloc_count
++
4814 * sizeof (Elf32_External_Rela
));
4815 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
4818 /* Init the .got section contents if we're not
4819 emitting a reloc. */
4822 bfd_vma value
= relocation
;
4824 if (tls_ty
== (TLS_TLS
| TLS_LD
))
4826 else if (tls_ty
!= 0)
4828 value
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
4829 if (tls_ty
== (TLS_TLS
| TLS_TPREL
))
4830 value
+= DTP_OFFSET
- TP_OFFSET
;
4832 if (tls_ty
== (TLS_TLS
| TLS_GD
))
4834 bfd_put_32 (output_bfd
, value
,
4835 htab
->got
->contents
+ off
+ 4);
4839 bfd_put_32 (output_bfd
, value
,
4840 htab
->got
->contents
+ off
);
4844 if (tls_ty
& (TLS_LD
| TLS_GD
))
4853 if (off
>= (bfd_vma
) -2)
4856 if ((tls_type
& TLS_TLS
) != 0)
4858 if (tls_type
!= (TLS_TLS
| TLS_LD
))
4860 if ((tls_mask
& TLS_LD
) != 0
4862 || !(h
->elf_link_hash_flags
4863 & ELF_LINK_HASH_DEF_DYNAMIC
)))
4865 if (tls_type
!= (TLS_TLS
| TLS_GD
))
4867 if ((tls_mask
& TLS_GD
) != 0)
4869 if (tls_type
!= (TLS_TLS
| TLS_DTPREL
))
4871 if ((tls_mask
& TLS_DTPREL
) != 0)
4878 relocation
= htab
->got
->output_offset
+ off
- 4;
4880 /* Addends on got relocations don't make much sense.
4881 x+off@got is actually x@got+off, and since the got is
4882 generated by a hash table traversal, the value in the
4883 got at entry m+n bears little relation to the entry m. */
4885 (*_bfd_error_handler
)
4886 (_("%s(%s+0x%lx): non-zero addend on %s reloc against `%s'"),
4887 bfd_archive_filename (input_bfd
),
4888 bfd_get_section_name (input_bfd
, input_section
),
4889 (long) rel
->r_offset
,
4895 /* Relocations that need no special processing. */
4896 case R_PPC_LOCAL24PC
:
4897 /* It makes no sense to point a local relocation
4898 at a symbol not in this object. */
4899 if (unresolved_reloc
)
4901 if (! (*info
->callbacks
->undefined_symbol
) (info
,
4902 h
->root
.root
.string
,
4912 case R_PPC_DTPREL16
:
4913 case R_PPC_DTPREL16_LO
:
4914 case R_PPC_DTPREL16_HI
:
4915 case R_PPC_DTPREL16_HA
:
4916 addend
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
4919 /* Relocations that may need to be propagated if this is a shared
4922 case R_PPC_TPREL16_LO
:
4923 case R_PPC_TPREL16_HI
:
4924 case R_PPC_TPREL16_HA
:
4925 addend
-= htab
->tls_sec
->vma
+ TP_OFFSET
;
4926 /* The TPREL16 relocs shouldn't really be used in shared
4927 libs as they will result in DT_TEXTREL being set, but
4928 support them anyway. */
4932 addend
-= htab
->tls_sec
->vma
+ TP_OFFSET
;
4935 case R_PPC_DTPREL32
:
4936 addend
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
4939 case R_PPC_DTPMOD32
:
4947 case R_PPC_REL14_BRTAKEN
:
4948 case R_PPC_REL14_BRNTAKEN
:
4949 /* If these relocations are not to a named symbol, they can be
4950 handled right here, no need to bother the dynamic linker. */
4952 || strcmp (h
->root
.root
.string
, "_GLOBAL_OFFSET_TABLE_") == 0
4953 || SYMBOL_REFERENCES_LOCAL (info
, h
))
4957 /* Relocations that always need to be propagated if this is a shared
4962 case R_PPC_ADDR16_LO
:
4963 case R_PPC_ADDR16_HI
:
4964 case R_PPC_ADDR16_HA
:
4966 case R_PPC_ADDR14_BRTAKEN
:
4967 case R_PPC_ADDR14_BRNTAKEN
:
4970 /* r_symndx will be zero only for relocs against symbols
4971 from removed linkonce sections, or sections discarded by
4979 && (MUST_BE_DYN_RELOC (r_type
)
4983 || (h
->elf_link_hash_flags
4984 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
4985 || (ELIMINATE_COPY_RELOCS
4987 && (input_section
->flags
& SEC_ALLOC
) != 0
4990 && (h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
4991 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
4992 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0))
4997 fprintf (stderr
, "ppc_elf_relocate_section need to create relocation for %s\n",
4998 (h
&& h
->root
.root
.string
4999 ? h
->root
.root
.string
: "<unknown>"));
5002 /* When generating a shared object, these relocations
5003 are copied into the output file to be resolved at run
5009 name
= (bfd_elf_string_from_elf_section
5011 elf_elfheader (input_bfd
)->e_shstrndx
,
5012 elf_section_data (input_section
)->rel_hdr
.sh_name
));
5016 BFD_ASSERT (strncmp (name
, ".rela", 5) == 0
5017 && strcmp (bfd_get_section_name (input_bfd
,
5021 sreloc
= bfd_get_section_by_name (htab
->elf
.dynobj
, name
);
5022 BFD_ASSERT (sreloc
!= NULL
);
5028 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
5030 if (outrel
.r_offset
== (bfd_vma
) -1
5031 || outrel
.r_offset
== (bfd_vma
) -2)
5032 skip
= (int) outrel
.r_offset
;
5033 outrel
.r_offset
+= (input_section
->output_section
->vma
5034 + input_section
->output_offset
);
5037 memset (&outrel
, 0, sizeof outrel
);
5039 && !SYMBOL_REFERENCES_LOCAL (info
, h
))
5041 unresolved_reloc
= FALSE
;
5042 outrel
.r_info
= ELF32_R_INFO (h
->dynindx
, r_type
);
5043 outrel
.r_addend
= rel
->r_addend
;
5047 outrel
.r_addend
= relocation
+ rel
->r_addend
;
5049 if (r_type
== R_PPC_ADDR32
)
5050 outrel
.r_info
= ELF32_R_INFO (0, R_PPC_RELATIVE
);
5055 if (bfd_is_abs_section (sec
))
5057 else if (sec
== NULL
|| sec
->owner
== NULL
)
5059 bfd_set_error (bfd_error_bad_value
);
5066 /* We are turning this relocation into one
5067 against a section symbol. It would be
5068 proper to subtract the symbol's value,
5069 osec->vma, from the emitted reloc addend,
5070 but ld.so expects buggy relocs. */
5071 osec
= sec
->output_section
;
5072 indx
= elf_section_data (osec
)->dynindx
;
5073 BFD_ASSERT (indx
> 0);
5077 printf ("indx=%d section=%s flags=%08x name=%s\n",
5078 indx
, osec
->name
, osec
->flags
,
5079 h
->root
.root
.string
);
5084 outrel
.r_info
= ELF32_R_INFO (indx
, r_type
);
5088 loc
= sreloc
->contents
;
5089 loc
+= sreloc
->reloc_count
++ * sizeof (Elf32_External_Rela
);
5090 bfd_elf32_swap_reloca_out (output_bfd
, &outrel
, loc
);
5095 /* This reloc will be computed at runtime. We clear the memory
5096 so that it contains predictable value. */
5098 && ((input_section
->flags
& SEC_ALLOC
) != 0
5099 || ELF32_R_TYPE (outrel
.r_info
) != R_PPC_RELATIVE
))
5101 relocation
= howto
->pc_relative
? outrel
.r_offset
: 0;
5108 /* Indirect .sdata relocation. */
5109 case R_PPC_EMB_SDAI16
:
5110 BFD_ASSERT (htab
->sdata
!= NULL
);
5112 = bfd_elf32_finish_pointer_linker_section (output_bfd
, input_bfd
,
5113 info
, htab
->sdata
, h
,
5118 /* Indirect .sdata2 relocation. */
5119 case R_PPC_EMB_SDA2I16
:
5120 BFD_ASSERT (htab
->sdata2
!= NULL
);
5122 = bfd_elf32_finish_pointer_linker_section (output_bfd
, input_bfd
,
5123 info
, htab
->sdata2
, h
,
5128 /* Handle the TOC16 reloc. We want to use the offset within the .got
5129 section, not the actual VMA. This is appropriate when generating
5130 an embedded ELF object, for which the .got section acts like the
5131 AIX .toc section. */
5132 case R_PPC_TOC16
: /* phony GOT16 relocations */
5133 BFD_ASSERT (sec
!= (asection
*) 0);
5134 BFD_ASSERT (bfd_is_und_section (sec
)
5135 || strcmp (bfd_get_section_name (abfd
, sec
), ".got") == 0
5136 || strcmp (bfd_get_section_name (abfd
, sec
), ".cgot") == 0)
5138 addend
-= sec
->output_section
->vma
+ sec
->output_offset
+ 0x8000;
5141 case R_PPC_PLTREL24
:
5142 /* Relocation is to the entry for this symbol in the
5143 procedure linkage table. */
5144 BFD_ASSERT (h
!= NULL
);
5146 if (h
->plt
.offset
== (bfd_vma
) -1
5147 || htab
->plt
== NULL
)
5149 /* We didn't make a PLT entry for this symbol. This
5150 happens when statically linking PIC code, or when
5151 using -Bsymbolic. */
5155 unresolved_reloc
= FALSE
;
5156 relocation
= (htab
->plt
->output_section
->vma
5157 + htab
->plt
->output_offset
5161 /* Relocate against _SDA_BASE_. */
5162 case R_PPC_SDAREL16
:
5165 const struct elf_link_hash_entry
*sh
;
5167 BFD_ASSERT (sec
!= (asection
*) 0);
5168 name
= bfd_get_section_name (abfd
, sec
->output_section
);
5169 if (! ((strncmp (name
, ".sdata", 6) == 0
5170 && (name
[6] == 0 || name
[6] == '.'))
5171 || (strncmp (name
, ".sbss", 5) == 0
5172 && (name
[5] == 0 || name
[5] == '.'))))
5174 (*_bfd_error_handler
) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
5175 bfd_archive_filename (input_bfd
),
5180 sh
= htab
->sdata
->sym_hash
;
5181 addend
-= (sh
->root
.u
.def
.value
5182 + sh
->root
.u
.def
.section
->output_section
->vma
5183 + sh
->root
.u
.def
.section
->output_offset
);
5187 /* Relocate against _SDA2_BASE_. */
5188 case R_PPC_EMB_SDA2REL
:
5191 const struct elf_link_hash_entry
*sh
;
5193 BFD_ASSERT (sec
!= (asection
*) 0);
5194 name
= bfd_get_section_name (abfd
, sec
->output_section
);
5195 if (! (strncmp (name
, ".sdata2", 7) == 0
5196 || strncmp (name
, ".sbss2", 6) == 0))
5198 (*_bfd_error_handler
) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
5199 bfd_archive_filename (input_bfd
),
5204 bfd_set_error (bfd_error_bad_value
);
5208 sh
= htab
->sdata2
->sym_hash
;
5209 addend
-= (sh
->root
.u
.def
.value
5210 + sh
->root
.u
.def
.section
->output_section
->vma
5211 + sh
->root
.u
.def
.section
->output_offset
);
5215 /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0. */
5216 case R_PPC_EMB_SDA21
:
5217 case R_PPC_EMB_RELSDA
:
5220 const struct elf_link_hash_entry
*sh
;
5223 BFD_ASSERT (sec
!= (asection
*) 0);
5224 name
= bfd_get_section_name (abfd
, sec
->output_section
);
5225 if (((strncmp (name
, ".sdata", 6) == 0
5226 && (name
[6] == 0 || name
[6] == '.'))
5227 || (strncmp (name
, ".sbss", 5) == 0
5228 && (name
[5] == 0 || name
[5] == '.'))))
5231 sh
= htab
->sdata
->sym_hash
;
5232 addend
-= (sh
->root
.u
.def
.value
5233 + sh
->root
.u
.def
.section
->output_section
->vma
5234 + sh
->root
.u
.def
.section
->output_offset
);
5237 else if (strncmp (name
, ".sdata2", 7) == 0
5238 || strncmp (name
, ".sbss2", 6) == 0)
5241 sh
= htab
->sdata2
->sym_hash
;
5242 addend
-= (sh
->root
.u
.def
.value
5243 + sh
->root
.u
.def
.section
->output_section
->vma
5244 + sh
->root
.u
.def
.section
->output_offset
);
5247 else if (strcmp (name
, ".PPC.EMB.sdata0") == 0
5248 || strcmp (name
, ".PPC.EMB.sbss0") == 0)
5255 (*_bfd_error_handler
) (_("%s: the target (%s) of a %s relocation is in the wrong output section (%s)"),
5256 bfd_archive_filename (input_bfd
),
5261 bfd_set_error (bfd_error_bad_value
);
5266 if (r_type
== R_PPC_EMB_SDA21
)
5267 { /* fill in register field */
5268 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
);
5269 insn
= (insn
& ~RA_REGISTER_MASK
) | (reg
<< RA_REGISTER_SHIFT
);
5270 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
5275 /* Relocate against the beginning of the section. */
5277 case R_PPC_SECTOFF_LO
:
5278 case R_PPC_SECTOFF_HI
:
5279 case R_PPC_SECTOFF_HA
:
5280 BFD_ASSERT (sec
!= (asection
*) 0);
5281 addend
-= sec
->output_section
->vma
;
5284 /* Negative relocations. */
5285 case R_PPC_EMB_NADDR32
:
5286 case R_PPC_EMB_NADDR16
:
5287 case R_PPC_EMB_NADDR16_LO
:
5288 case R_PPC_EMB_NADDR16_HI
:
5289 case R_PPC_EMB_NADDR16_HA
:
5290 addend
-= 2 * relocation
;
5294 case R_PPC_GLOB_DAT
:
5295 case R_PPC_JMP_SLOT
:
5296 case R_PPC_RELATIVE
:
5298 case R_PPC_PLTREL32
:
5299 case R_PPC_PLT16_LO
:
5300 case R_PPC_PLT16_HI
:
5301 case R_PPC_PLT16_HA
:
5303 case R_PPC_EMB_RELSEC16
:
5304 case R_PPC_EMB_RELST_LO
:
5305 case R_PPC_EMB_RELST_HI
:
5306 case R_PPC_EMB_RELST_HA
:
5307 case R_PPC_EMB_BIT_FLD
:
5308 (*_bfd_error_handler
)
5309 (_("%s: relocation %s is not yet supported for symbol %s."),
5310 bfd_archive_filename (input_bfd
),
5314 bfd_set_error (bfd_error_invalid_operation
);
5319 /* Do any further special processing. */
5325 case R_PPC_ADDR16_HA
:
5326 case R_PPC_GOT16_HA
:
5327 case R_PPC_PLT16_HA
:
5328 case R_PPC_SECTOFF_HA
:
5329 case R_PPC_TPREL16_HA
:
5330 case R_PPC_DTPREL16_HA
:
5331 case R_PPC_GOT_TLSGD16_HA
:
5332 case R_PPC_GOT_TLSLD16_HA
:
5333 case R_PPC_GOT_TPREL16_HA
:
5334 case R_PPC_GOT_DTPREL16_HA
:
5335 case R_PPC_EMB_NADDR16_HA
:
5336 case R_PPC_EMB_RELST_HA
:
5337 /* It's just possible that this symbol is a weak symbol
5338 that's not actually defined anywhere. In that case,
5339 'sec' would be NULL, and we should leave the symbol
5340 alone (it will be set to zero elsewhere in the link). */
5342 /* Add 0x10000 if sign bit in 0:15 is set.
5343 Bits 0:15 are not used. */
5349 fprintf (stderr
, "\ttype = %s (%d), name = %s, symbol index = %ld, offset = %ld, addend = %ld\n",
5354 (long) rel
->r_offset
,
5358 if (unresolved_reloc
5359 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
5360 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0))
5362 (*_bfd_error_handler
)
5363 (_("%s(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
5364 bfd_archive_filename (input_bfd
),
5365 bfd_get_section_name (input_bfd
, input_section
),
5366 (long) rel
->r_offset
,
5372 r
= _bfd_final_link_relocate (howto
,
5380 if (r
!= bfd_reloc_ok
)
5382 if (sym_name
== NULL
)
5383 sym_name
= "(null)";
5384 if (r
== bfd_reloc_overflow
)
5389 && h
->root
.type
== bfd_link_hash_undefweak
5390 && howto
->pc_relative
)
5392 /* Assume this is a call protected by other code that
5393 detect the symbol is undefined. If this is the case,
5394 we can safely ignore the overflow. If not, the
5395 program is hosed anyway, and a little warning isn't
5401 if (! (*info
->callbacks
->reloc_overflow
) (info
,
5412 (*_bfd_error_handler
)
5413 (_("%s(%s+0x%lx): %s reloc against `%s': error %d"),
5414 bfd_archive_filename (input_bfd
),
5415 bfd_get_section_name (input_bfd
, input_section
),
5416 (long) rel
->r_offset
, howto
->name
, sym_name
, (int) r
);
5423 fprintf (stderr
, "\n");
5429 static enum elf_reloc_type_class
5430 ppc_elf_reloc_type_class (rela
)
5431 const Elf_Internal_Rela
*rela
;
5433 switch ((int) ELF32_R_TYPE (rela
->r_info
))
5435 case R_PPC_RELATIVE
:
5436 return reloc_class_relative
;
5439 case R_PPC_JMP_SLOT
:
5440 return reloc_class_plt
;
5442 return reloc_class_copy
;
5444 return reloc_class_normal
;
5448 /* Support for core dump NOTE sections. */
5451 ppc_elf_grok_prstatus (abfd
, note
)
5453 Elf_Internal_Note
*note
;
5456 unsigned int raw_size
;
5458 switch (note
->descsz
)
5463 case 268: /* Linux/PPC. */
5465 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
5468 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
5477 /* Make a ".reg/999" section. */
5478 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
5479 raw_size
, note
->descpos
+ offset
);
5483 ppc_elf_grok_psinfo (abfd
, note
)
5485 Elf_Internal_Note
*note
;
5487 switch (note
->descsz
)
5492 case 128: /* Linux/PPC elf_prpsinfo. */
5493 elf_tdata (abfd
)->core_program
5494 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 32, 16);
5495 elf_tdata (abfd
)->core_command
5496 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 48, 80);
5499 /* Note that for some reason, a spurious space is tacked
5500 onto the end of the args in some (at least one anyway)
5501 implementations, so strip it off if it exists. */
5504 char *command
= elf_tdata (abfd
)->core_command
;
5505 int n
= strlen (command
);
5507 if (0 < n
&& command
[n
- 1] == ' ')
5508 command
[n
- 1] = '\0';
5514 /* Very simple linked list structure for recording apuinfo values. */
5515 typedef struct apuinfo_list
5517 struct apuinfo_list
*next
;
5518 unsigned long value
;
5522 static apuinfo_list
* head
;
5524 static void apuinfo_list_init
PARAMS ((void));
5525 static void apuinfo_list_add
PARAMS ((unsigned long));
5526 static unsigned apuinfo_list_length
PARAMS ((void));
5527 static unsigned long apuinfo_list_element
PARAMS ((unsigned long));
5528 static void apuinfo_list_finish
PARAMS ((void));
5530 extern void ppc_elf_begin_write_processing
5531 PARAMS ((bfd
*, struct bfd_link_info
*));
5532 extern void ppc_elf_final_write_processing
5533 PARAMS ((bfd
*, bfd_boolean
));
5534 extern bfd_boolean ppc_elf_write_section
5535 PARAMS ((bfd
*, asection
*, bfd_byte
*));
5539 apuinfo_list_init
PARAMS ((void))
5545 apuinfo_list_add (value
)
5546 unsigned long value
;
5548 apuinfo_list
*entry
= head
;
5550 while (entry
!= NULL
)
5552 if (entry
->value
== value
)
5554 entry
= entry
->next
;
5557 entry
= bfd_malloc (sizeof (* entry
));
5561 entry
->value
= value
;
5567 apuinfo_list_length
PARAMS ((void))
5569 apuinfo_list
*entry
;
5570 unsigned long count
;
5572 for (entry
= head
, count
= 0;
5574 entry
= entry
->next
)
5580 static inline unsigned long
5581 apuinfo_list_element (number
)
5582 unsigned long number
;
5584 apuinfo_list
* entry
;
5588 entry
= entry
->next
)
5591 return entry
? entry
->value
: 0;
5595 apuinfo_list_finish
PARAMS ((void))
5597 apuinfo_list
*entry
;
5599 for (entry
= head
; entry
;)
5601 apuinfo_list
*next
= entry
->next
;
5609 #define APUINFO_SECTION_NAME ".PPC.EMB.apuinfo"
5610 #define APUINFO_LABEL "APUinfo"
5612 /* Scan the input BFDs and create a linked list of
5613 the APUinfo values that will need to be emitted. */
5616 ppc_elf_begin_write_processing (abfd
, link_info
)
5618 struct bfd_link_info
*link_info
;
5623 unsigned num_input_sections
;
5624 bfd_size_type output_section_size
;
5626 unsigned num_entries
;
5627 unsigned long offset
;
5628 unsigned long length
;
5629 const char *error_message
= NULL
;
5631 if (link_info
== NULL
)
5634 /* Scan the input bfds, looking for apuinfo sections. */
5635 num_input_sections
= 0;
5636 output_section_size
= 0;
5638 for (ibfd
= link_info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
5640 asec
= bfd_get_section_by_name (ibfd
, APUINFO_SECTION_NAME
);
5643 ++ num_input_sections
;
5644 output_section_size
+= asec
->_raw_size
;
5648 /* We need at least one input sections
5649 in order to make merging worthwhile. */
5650 if (num_input_sections
< 1)
5653 /* Just make sure that the output section exists as well. */
5654 asec
= bfd_get_section_by_name (abfd
, APUINFO_SECTION_NAME
);
5658 /* Allocate a buffer for the contents of the input sections. */
5659 buffer
= bfd_malloc (output_section_size
);
5664 apuinfo_list_init ();
5666 /* Read in the input sections contents. */
5667 for (ibfd
= link_info
->input_bfds
; ibfd
; ibfd
= ibfd
->link_next
)
5669 unsigned long datum
;
5672 asec
= bfd_get_section_by_name (ibfd
, APUINFO_SECTION_NAME
);
5676 length
= asec
->_raw_size
;
5679 error_message
= _("corrupt or empty %s section in %s");
5683 if (bfd_seek (ibfd
, asec
->filepos
, SEEK_SET
) != 0
5684 || (bfd_bread (buffer
+ offset
, length
, ibfd
) != length
))
5686 error_message
= _("unable to read in %s section from %s");
5690 /* Process the contents of the section. */
5691 ptr
= buffer
+ offset
;
5692 error_message
= _("corrupt %s section in %s");
5694 /* Verify the contents of the header. Note - we have to
5695 extract the values this way in order to allow for a
5696 host whose endian-ness is different from the target. */
5697 datum
= bfd_get_32 (ibfd
, ptr
);
5698 if (datum
!= sizeof APUINFO_LABEL
)
5701 datum
= bfd_get_32 (ibfd
, ptr
+ 8);
5705 if (strcmp (ptr
+ 12, APUINFO_LABEL
) != 0)
5708 /* Get the number of apuinfo entries. */
5709 datum
= bfd_get_32 (ibfd
, ptr
+ 4);
5710 if ((datum
* 4 + 20) != length
)
5713 /* Make sure that we do not run off the end of the section. */
5714 if (offset
+ length
> output_section_size
)
5717 /* Scan the apuinfo section, building a list of apuinfo numbers. */
5718 for (i
= 0; i
< datum
; i
++)
5719 apuinfo_list_add (bfd_get_32 (ibfd
, ptr
+ 20 + (i
* 4)));
5721 /* Update the offset. */
5725 error_message
= NULL
;
5727 /* Compute the size of the output section. */
5728 num_entries
= apuinfo_list_length ();
5729 output_section_size
= 20 + num_entries
* 4;
5731 asec
= bfd_get_section_by_name (abfd
, APUINFO_SECTION_NAME
);
5733 if (! bfd_set_section_size (abfd
, asec
, output_section_size
))
5735 error_message
= _("warning: unable to set size of %s section in %s");
5741 (*_bfd_error_handler
) (error_message
, APUINFO_SECTION_NAME
,
5742 bfd_archive_filename (ibfd
));
5746 /* Prevent the output section from accumulating the input sections'
5747 contents. We have already stored this in our linked list structure. */
5750 ppc_elf_write_section (abfd
, asec
, contents
)
5751 bfd
*abfd ATTRIBUTE_UNUSED
;
5753 bfd_byte
*contents ATTRIBUTE_UNUSED
;
5755 return (apuinfo_list_length ()
5756 && strcmp (asec
->name
, APUINFO_SECTION_NAME
) == 0);
5760 /* Finally we can generate the output section. */
5763 ppc_elf_final_write_processing (abfd
, linker
)
5765 bfd_boolean linker ATTRIBUTE_UNUSED
;
5770 unsigned num_entries
;
5771 bfd_size_type length
;
5773 asec
= bfd_get_section_by_name (abfd
, APUINFO_SECTION_NAME
);
5777 if (apuinfo_list_length () == 0)
5780 length
= asec
->_raw_size
;
5784 buffer
= bfd_malloc (length
);
5787 (*_bfd_error_handler
)
5788 (_("failed to allocate space for new APUinfo section."));
5792 /* Create the apuinfo header. */
5793 num_entries
= apuinfo_list_length ();
5794 bfd_put_32 (abfd
, sizeof APUINFO_LABEL
, buffer
);
5795 bfd_put_32 (abfd
, num_entries
, buffer
+ 4);
5796 bfd_put_32 (abfd
, 0x2, buffer
+ 8);
5797 strcpy (buffer
+ 12, APUINFO_LABEL
);
5800 for (i
= 0; i
< num_entries
; i
++)
5802 bfd_put_32 (abfd
, apuinfo_list_element (i
), buffer
+ length
);
5806 if (length
!= asec
->_raw_size
)
5807 (*_bfd_error_handler
) (_("failed to compute new APUinfo section."));
5809 if (! bfd_set_section_contents (abfd
, asec
, buffer
, (file_ptr
) 0, length
))
5810 (*_bfd_error_handler
) (_("failed to install new APUinfo section."));
5814 apuinfo_list_finish ();
5817 #define TARGET_LITTLE_SYM bfd_elf32_powerpcle_vec
5818 #define TARGET_LITTLE_NAME "elf32-powerpcle"
5819 #define TARGET_BIG_SYM bfd_elf32_powerpc_vec
5820 #define TARGET_BIG_NAME "elf32-powerpc"
5821 #define ELF_ARCH bfd_arch_powerpc
5822 #define ELF_MACHINE_CODE EM_PPC
5823 #define ELF_MAXPAGESIZE 0x10000
5824 #define elf_info_to_howto ppc_elf_info_to_howto
5826 #ifdef EM_CYGNUS_POWERPC
5827 #define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC
5831 #define ELF_MACHINE_ALT2 EM_PPC_OLD
5834 #define elf_backend_plt_not_loaded 1
5835 #define elf_backend_got_symbol_offset 4
5836 #define elf_backend_can_gc_sections 1
5837 #define elf_backend_can_refcount 1
5838 #define elf_backend_got_header_size 12
5839 #define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
5840 #define elf_backend_rela_normal 1
5842 #define bfd_elf32_bfd_merge_private_bfd_data ppc_elf_merge_private_bfd_data
5843 #define bfd_elf32_bfd_relax_section ppc_elf_relax_section
5844 #define bfd_elf32_bfd_reloc_type_lookup ppc_elf_reloc_type_lookup
5845 #define bfd_elf32_bfd_set_private_flags ppc_elf_set_private_flags
5846 #define bfd_elf32_bfd_link_hash_table_create ppc_elf_link_hash_table_create
5848 #define elf_backend_object_p ppc_elf_object_p
5849 #define elf_backend_gc_mark_hook ppc_elf_gc_mark_hook
5850 #define elf_backend_gc_sweep_hook ppc_elf_gc_sweep_hook
5851 #define elf_backend_section_from_shdr ppc_elf_section_from_shdr
5852 #define elf_backend_relocate_section ppc_elf_relocate_section
5853 #define elf_backend_create_dynamic_sections ppc_elf_create_dynamic_sections
5854 #define elf_backend_check_relocs ppc_elf_check_relocs
5855 #define elf_backend_copy_indirect_symbol ppc_elf_copy_indirect_symbol
5856 #define elf_backend_adjust_dynamic_symbol ppc_elf_adjust_dynamic_symbol
5857 #define elf_backend_add_symbol_hook ppc_elf_add_symbol_hook
5858 #define elf_backend_size_dynamic_sections ppc_elf_size_dynamic_sections
5859 #define elf_backend_finish_dynamic_symbol ppc_elf_finish_dynamic_symbol
5860 #define elf_backend_finish_dynamic_sections ppc_elf_finish_dynamic_sections
5861 #define elf_backend_fake_sections ppc_elf_fake_sections
5862 #define elf_backend_additional_program_headers ppc_elf_additional_program_headers
5863 #define elf_backend_modify_segment_map ppc_elf_modify_segment_map
5864 #define elf_backend_grok_prstatus ppc_elf_grok_prstatus
5865 #define elf_backend_grok_psinfo ppc_elf_grok_psinfo
5866 #define elf_backend_reloc_type_class ppc_elf_reloc_type_class
5867 #define elf_backend_begin_write_processing ppc_elf_begin_write_processing
5868 #define elf_backend_final_write_processing ppc_elf_final_write_processing
5869 #define elf_backend_write_section ppc_elf_write_section
5871 #include "elf32-target.h"