* elf64-sparc.c (sparc64_elf_relocate_section): Ignore overflows
[platform/upstream/binutils.git] / bfd / elf32-ppc.c
1 /* PowerPC-specific support for 32-bit ELF
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004 Free Software Foundation, Inc.
4    Written by Ian Lance Taylor, Cygnus Support.
5
6    This file is part of BFD, the Binary File Descriptor library.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the
20    Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21    Boston, MA 02111-1307, USA.  */
22
23 /* This file is based on a preliminary PowerPC ELF ABI.  The
24    information may not match the final PowerPC ELF ABI.  It includes
25    suggestions from the in-progress Embedded PowerPC ABI, and that
26    information may also not match.  */
27
28 #include "bfd.h"
29 #include "sysdep.h"
30 #include "bfdlink.h"
31 #include "libbfd.h"
32 #include "elf-bfd.h"
33 #include "elf/ppc.h"
34 #include "elf32-ppc.h"
35
36 /* RELA relocations are used here.  */
37
38 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc_elf_unhandled_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42
43 /* Branch prediction bit for branch taken relocs.  */
44 #define BRANCH_PREDICT_BIT 0x200000
45 /* Mask to set RA in memory instructions.  */
46 #define RA_REGISTER_MASK 0x001f0000
47 /* Value to shift register by to insert RA.  */
48 #define RA_REGISTER_SHIFT 16
49
50 /* The name of the dynamic interpreter.  This is put in the .interp
51    section.  */
52 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
53
54 /* The size in bytes of an entry in the procedure linkage table.  */
55 #define PLT_ENTRY_SIZE 12
56 /* The initial size of the plt reserved for the dynamic linker.  */
57 #define PLT_INITIAL_ENTRY_SIZE 72
58 /* The size of the gap between entries in the PLT.  */
59 #define PLT_SLOT_SIZE 8
60 /* The number of single-slot PLT entries (the rest use two slots).  */
61 #define PLT_NUM_SINGLE_ENTRIES 8192
62
63 /* Some nop instructions.  */
64 #define NOP             0x60000000
65 #define CROR_151515     0x4def7b82
66 #define CROR_313131     0x4ffffb82
67
68 /* Offset of tp and dtp pointers from start of TLS block.  */
69 #define TP_OFFSET       0x7000
70 #define DTP_OFFSET      0x8000
71
72 \f
73 /* Enumeration to specify the special section.  */
74 enum elf_linker_section_enum
75 {
76   LINKER_SECTION_SDATA,
77   LINKER_SECTION_SDATA2
78 };
79
80 /* Sections created by the linker.  */
81
82 typedef struct elf_linker_section
83 {
84   /* pointer to the section */
85   asection *section;
86   /* pointer to the relocations needed for this section */
87   asection *rel_section;
88   /* pointer to the created symbol hash value */
89   struct elf_link_hash_entry *sym_hash;
90   /* offset of symbol from beginning of section */
91   bfd_vma sym_offset;
92 } elf_linker_section_t;
93
94 /* Linked list of allocated pointer entries.  This hangs off of the
95    symbol lists, and provides allows us to return different pointers,
96    based on different addend's.  */
97
98 typedef struct elf_linker_section_pointers
99 {
100   /* next allocated pointer for this symbol */
101   struct elf_linker_section_pointers *next;
102   /* offset of pointer from beginning of section */
103   bfd_vma offset;
104   /* addend used */
105   bfd_vma addend;
106   /* which linker section this is */
107   elf_linker_section_t *lsect;
108   /* whether address was written yet */
109   bfd_boolean written_address_p;
110 } elf_linker_section_pointers_t;
111
112 struct ppc_elf_obj_tdata
113 {
114   struct elf_obj_tdata elf;
115
116   /* A mapping from local symbols to offsets into the various linker
117      sections added.  This is index by the symbol index.  */
118   elf_linker_section_pointers_t **linker_section_pointers;
119 };
120
121 #define ppc_elf_tdata(bfd) \
122   ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
123
124 #define elf_local_ptr_offsets(bfd) \
125   (ppc_elf_tdata (bfd)->linker_section_pointers)
126
127 /* Override the generic function because we store some extras.  */
128
129 static bfd_boolean
130 ppc_elf_mkobject (bfd *abfd)
131 {
132   bfd_size_type amt = sizeof (struct ppc_elf_obj_tdata);
133   abfd->tdata.any = bfd_zalloc (abfd, amt);
134   if (abfd->tdata.any == NULL)
135     return FALSE;
136   return TRUE;
137 }
138
139 /* The PPC linker needs to keep track of the number of relocs that it
140    decides to copy as dynamic relocs in check_relocs for each symbol.
141    This is so that it can later discard them if they are found to be
142    unnecessary.  We store the information in a field extending the
143    regular ELF linker hash table.  */
144
145 struct ppc_elf_dyn_relocs
146 {
147   struct ppc_elf_dyn_relocs *next;
148
149   /* The input section of the reloc.  */
150   asection *sec;
151
152   /* Total number of relocs copied for the input section.  */
153   bfd_size_type count;
154
155   /* Number of pc-relative relocs copied for the input section.  */
156   bfd_size_type pc_count;
157 };
158
159 /* PPC ELF linker hash entry.  */
160
161 struct ppc_elf_link_hash_entry
162 {
163   struct elf_link_hash_entry elf;
164
165   /* If this symbol is used in the linker created sections, the processor
166      specific backend uses this field to map the field into the offset
167      from the beginning of the section.  */
168   elf_linker_section_pointers_t *linker_section_pointer;
169
170   /* Track dynamic relocs copied for this symbol.  */
171   struct ppc_elf_dyn_relocs *dyn_relocs;
172
173   /* Contexts in which symbol is used in the GOT (or TOC).
174      TLS_GD .. TLS_TLS bits are or'd into the mask as the
175      corresponding relocs are encountered during check_relocs.
176      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
177      indicate the corresponding GOT entry type is not needed.  */
178 #define TLS_GD           1      /* GD reloc. */
179 #define TLS_LD           2      /* LD reloc. */
180 #define TLS_TPREL        4      /* TPREL reloc, => IE. */
181 #define TLS_DTPREL       8      /* DTPREL reloc, => LD. */
182 #define TLS_TLS         16      /* Any TLS reloc.  */
183 #define TLS_TPRELGD     32      /* TPREL reloc resulting from GD->IE. */
184   char tls_mask;
185 };
186
187 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
188
189 /* PPC ELF linker hash table.  */
190
191 struct ppc_elf_link_hash_table
192 {
193   struct elf_link_hash_table elf;
194
195   /* Short-cuts to get to dynamic linker sections.  */
196   asection *got;
197   asection *relgot;
198   asection *plt;
199   asection *relplt;
200   asection *dynbss;
201   asection *relbss;
202   asection *dynsbss;
203   asection *relsbss;
204   elf_linker_section_t *sdata;
205   elf_linker_section_t *sdata2;
206   asection *sbss;
207
208   /* Shortcut to .__tls_get_addr.  */
209   struct elf_link_hash_entry *tls_get_addr;
210
211   /* TLS local dynamic got entry handling.  */
212   union {
213     bfd_signed_vma refcount;
214     bfd_vma offset;
215   } tlsld_got;
216
217   /* Small local sym to section mapping cache.  */
218   struct sym_sec_cache sym_sec;
219 };
220
221 /* Get the PPC ELF linker hash table from a link_info structure.  */
222
223 #define ppc_elf_hash_table(p) \
224   ((struct ppc_elf_link_hash_table *) (p)->hash)
225
226 /* Create an entry in a PPC ELF linker hash table.  */
227
228 static struct bfd_hash_entry *
229 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
230                            struct bfd_hash_table *table,
231                            const char *string)
232 {
233   /* Allocate the structure if it has not already been allocated by a
234      subclass.  */
235   if (entry == NULL)
236     {
237       entry = bfd_hash_allocate (table,
238                                  sizeof (struct ppc_elf_link_hash_entry));
239       if (entry == NULL)
240         return entry;
241     }
242
243   /* Call the allocation method of the superclass.  */
244   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
245   if (entry != NULL)
246     {
247       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
248       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
249       ppc_elf_hash_entry (entry)->tls_mask = 0;
250     }
251
252   return entry;
253 }
254
255 /* Create a PPC ELF linker hash table.  */
256
257 static struct bfd_link_hash_table *
258 ppc_elf_link_hash_table_create (bfd *abfd)
259 {
260   struct ppc_elf_link_hash_table *ret;
261
262   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
263   if (ret == NULL)
264     return NULL;
265
266   if (! _bfd_elf_link_hash_table_init (&ret->elf, abfd,
267                                        ppc_elf_link_hash_newfunc))
268     {
269       free (ret);
270       return NULL;
271     }
272
273   return &ret->elf.root;
274 }
275
276 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
277    copying dynamic variables from a shared lib into an app's dynbss
278    section, and instead use a dynamic relocation to point into the
279    shared lib.  */
280 #define ELIMINATE_COPY_RELOCS 1
281
282 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
283
284 static void
285 ppc_elf_copy_indirect_symbol (const struct elf_backend_data *bed,
286                               struct elf_link_hash_entry *dir,
287                               struct elf_link_hash_entry *ind)
288 {
289   struct ppc_elf_link_hash_entry *edir, *eind;
290
291   edir = (struct ppc_elf_link_hash_entry *) dir;
292   eind = (struct ppc_elf_link_hash_entry *) ind;
293
294   if (eind->dyn_relocs != NULL)
295     {
296       if (edir->dyn_relocs != NULL)
297         {
298           struct ppc_elf_dyn_relocs **pp;
299           struct ppc_elf_dyn_relocs *p;
300
301           if (ind->root.type == bfd_link_hash_indirect)
302             abort ();
303
304           /* Add reloc counts against the weak sym to the strong sym
305              list.  Merge any entries against the same section.  */
306           for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
307             {
308               struct ppc_elf_dyn_relocs *q;
309
310               for (q = edir->dyn_relocs; q != NULL; q = q->next)
311                 if (q->sec == p->sec)
312                   {
313                     q->pc_count += p->pc_count;
314                     q->count += p->count;
315                     *pp = p->next;
316                     break;
317                   }
318               if (q == NULL)
319                 pp = &p->next;
320             }
321           *pp = edir->dyn_relocs;
322         }
323
324       edir->dyn_relocs = eind->dyn_relocs;
325       eind->dyn_relocs = NULL;
326     }
327
328   edir->tls_mask |= eind->tls_mask;
329
330   if (ELIMINATE_COPY_RELOCS
331       && ind->root.type != bfd_link_hash_indirect
332       && dir->dynamic_adjusted)
333     {
334       /* If called to transfer flags for a weakdef during processing
335          of elf_adjust_dynamic_symbol, don't copy non_got_ref.
336          We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
337       dir->ref_dynamic |= ind->ref_dynamic;
338       dir->ref_regular |= ind->ref_regular;
339       dir->ref_regular_nonweak |= ind->ref_regular_nonweak;
340       dir->needs_plt |= ind->needs_plt;
341     }
342   else
343     _bfd_elf_link_hash_copy_indirect (bed, dir, ind);
344 }
345 \f
346 static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
347
348 static reloc_howto_type ppc_elf_howto_raw[] = {
349   /* This reloc does nothing.  */
350   HOWTO (R_PPC_NONE,            /* type */
351          0,                     /* rightshift */
352          2,                     /* size (0 = byte, 1 = short, 2 = long) */
353          32,                    /* bitsize */
354          FALSE,                 /* pc_relative */
355          0,                     /* bitpos */
356          complain_overflow_bitfield, /* complain_on_overflow */
357          bfd_elf_generic_reloc, /* special_function */
358          "R_PPC_NONE",          /* name */
359          FALSE,                 /* partial_inplace */
360          0,                     /* src_mask */
361          0,                     /* dst_mask */
362          FALSE),                /* pcrel_offset */
363
364   /* A standard 32 bit relocation.  */
365   HOWTO (R_PPC_ADDR32,          /* type */
366          0,                     /* rightshift */
367          2,                     /* size (0 = byte, 1 = short, 2 = long) */
368          32,                    /* bitsize */
369          FALSE,                 /* pc_relative */
370          0,                     /* bitpos */
371          complain_overflow_bitfield, /* complain_on_overflow */
372          bfd_elf_generic_reloc, /* special_function */
373          "R_PPC_ADDR32",        /* name */
374          FALSE,                 /* partial_inplace */
375          0,                     /* src_mask */
376          0xffffffff,            /* dst_mask */
377          FALSE),                /* pcrel_offset */
378
379   /* An absolute 26 bit branch; the lower two bits must be zero.
380      FIXME: we don't check that, we just clear them.  */
381   HOWTO (R_PPC_ADDR24,          /* type */
382          0,                     /* rightshift */
383          2,                     /* size (0 = byte, 1 = short, 2 = long) */
384          26,                    /* bitsize */
385          FALSE,                 /* pc_relative */
386          0,                     /* bitpos */
387          complain_overflow_bitfield, /* complain_on_overflow */
388          bfd_elf_generic_reloc, /* special_function */
389          "R_PPC_ADDR24",        /* name */
390          FALSE,                 /* partial_inplace */
391          0,                     /* src_mask */
392          0x3fffffc,             /* dst_mask */
393          FALSE),                /* pcrel_offset */
394
395   /* A standard 16 bit relocation.  */
396   HOWTO (R_PPC_ADDR16,          /* type */
397          0,                     /* rightshift */
398          1,                     /* size (0 = byte, 1 = short, 2 = long) */
399          16,                    /* bitsize */
400          FALSE,                 /* pc_relative */
401          0,                     /* bitpos */
402          complain_overflow_bitfield, /* complain_on_overflow */
403          bfd_elf_generic_reloc, /* special_function */
404          "R_PPC_ADDR16",        /* name */
405          FALSE,                 /* partial_inplace */
406          0,                     /* src_mask */
407          0xffff,                /* dst_mask */
408          FALSE),                /* pcrel_offset */
409
410   /* A 16 bit relocation without overflow.  */
411   HOWTO (R_PPC_ADDR16_LO,       /* type */
412          0,                     /* rightshift */
413          1,                     /* size (0 = byte, 1 = short, 2 = long) */
414          16,                    /* bitsize */
415          FALSE,                 /* pc_relative */
416          0,                     /* bitpos */
417          complain_overflow_dont,/* complain_on_overflow */
418          bfd_elf_generic_reloc, /* special_function */
419          "R_PPC_ADDR16_LO",     /* name */
420          FALSE,                 /* partial_inplace */
421          0,                     /* src_mask */
422          0xffff,                /* dst_mask */
423          FALSE),                /* pcrel_offset */
424
425   /* The high order 16 bits of an address.  */
426   HOWTO (R_PPC_ADDR16_HI,       /* type */
427          16,                    /* rightshift */
428          1,                     /* size (0 = byte, 1 = short, 2 = long) */
429          16,                    /* bitsize */
430          FALSE,                 /* pc_relative */
431          0,                     /* bitpos */
432          complain_overflow_dont, /* complain_on_overflow */
433          bfd_elf_generic_reloc, /* special_function */
434          "R_PPC_ADDR16_HI",     /* name */
435          FALSE,                 /* partial_inplace */
436          0,                     /* src_mask */
437          0xffff,                /* dst_mask */
438          FALSE),                /* pcrel_offset */
439
440   /* The high order 16 bits of an address, plus 1 if the contents of
441      the low 16 bits, treated as a signed number, is negative.  */
442   HOWTO (R_PPC_ADDR16_HA,       /* type */
443          16,                    /* rightshift */
444          1,                     /* size (0 = byte, 1 = short, 2 = long) */
445          16,                    /* bitsize */
446          FALSE,                 /* pc_relative */
447          0,                     /* bitpos */
448          complain_overflow_dont, /* complain_on_overflow */
449          ppc_elf_addr16_ha_reloc, /* special_function */
450          "R_PPC_ADDR16_HA",     /* name */
451          FALSE,                 /* partial_inplace */
452          0,                     /* src_mask */
453          0xffff,                /* dst_mask */
454          FALSE),                /* pcrel_offset */
455
456   /* An absolute 16 bit branch; the lower two bits must be zero.
457      FIXME: we don't check that, we just clear them.  */
458   HOWTO (R_PPC_ADDR14,          /* type */
459          0,                     /* rightshift */
460          2,                     /* size (0 = byte, 1 = short, 2 = long) */
461          16,                    /* bitsize */
462          FALSE,                 /* pc_relative */
463          0,                     /* bitpos */
464          complain_overflow_bitfield, /* complain_on_overflow */
465          bfd_elf_generic_reloc, /* special_function */
466          "R_PPC_ADDR14",        /* name */
467          FALSE,                 /* partial_inplace */
468          0,                     /* src_mask */
469          0xfffc,                /* dst_mask */
470          FALSE),                /* pcrel_offset */
471
472   /* An absolute 16 bit branch, for which bit 10 should be set to
473      indicate that the branch is expected to be taken.  The lower two
474      bits must be zero.  */
475   HOWTO (R_PPC_ADDR14_BRTAKEN,  /* type */
476          0,                     /* rightshift */
477          2,                     /* size (0 = byte, 1 = short, 2 = long) */
478          16,                    /* bitsize */
479          FALSE,                 /* pc_relative */
480          0,                     /* bitpos */
481          complain_overflow_bitfield, /* complain_on_overflow */
482          bfd_elf_generic_reloc, /* special_function */
483          "R_PPC_ADDR14_BRTAKEN",/* name */
484          FALSE,                 /* partial_inplace */
485          0,                     /* src_mask */
486          0xfffc,                /* dst_mask */
487          FALSE),                /* pcrel_offset */
488
489   /* An absolute 16 bit branch, for which bit 10 should be set to
490      indicate that the branch is not expected to be taken.  The lower
491      two bits must be zero.  */
492   HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
493          0,                     /* rightshift */
494          2,                     /* size (0 = byte, 1 = short, 2 = long) */
495          16,                    /* bitsize */
496          FALSE,                 /* pc_relative */
497          0,                     /* bitpos */
498          complain_overflow_bitfield, /* complain_on_overflow */
499          bfd_elf_generic_reloc, /* special_function */
500          "R_PPC_ADDR14_BRNTAKEN",/* name */
501          FALSE,                 /* partial_inplace */
502          0,                     /* src_mask */
503          0xfffc,                /* dst_mask */
504          FALSE),                /* pcrel_offset */
505
506   /* A relative 26 bit branch; the lower two bits must be zero.  */
507   HOWTO (R_PPC_REL24,           /* type */
508          0,                     /* rightshift */
509          2,                     /* size (0 = byte, 1 = short, 2 = long) */
510          26,                    /* bitsize */
511          TRUE,                  /* pc_relative */
512          0,                     /* bitpos */
513          complain_overflow_signed, /* complain_on_overflow */
514          bfd_elf_generic_reloc, /* special_function */
515          "R_PPC_REL24",         /* name */
516          FALSE,                 /* partial_inplace */
517          0,                     /* src_mask */
518          0x3fffffc,             /* dst_mask */
519          TRUE),                 /* pcrel_offset */
520
521   /* A relative 16 bit branch; the lower two bits must be zero.  */
522   HOWTO (R_PPC_REL14,           /* type */
523          0,                     /* rightshift */
524          2,                     /* size (0 = byte, 1 = short, 2 = long) */
525          16,                    /* bitsize */
526          TRUE,                  /* pc_relative */
527          0,                     /* bitpos */
528          complain_overflow_signed, /* complain_on_overflow */
529          bfd_elf_generic_reloc, /* special_function */
530          "R_PPC_REL14",         /* name */
531          FALSE,                 /* partial_inplace */
532          0,                     /* src_mask */
533          0xfffc,                /* dst_mask */
534          TRUE),                 /* pcrel_offset */
535
536   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
537      the branch is expected to be taken.  The lower two bits must be
538      zero.  */
539   HOWTO (R_PPC_REL14_BRTAKEN,   /* type */
540          0,                     /* rightshift */
541          2,                     /* size (0 = byte, 1 = short, 2 = long) */
542          16,                    /* bitsize */
543          TRUE,                  /* pc_relative */
544          0,                     /* bitpos */
545          complain_overflow_signed, /* complain_on_overflow */
546          bfd_elf_generic_reloc, /* special_function */
547          "R_PPC_REL14_BRTAKEN", /* name */
548          FALSE,                 /* partial_inplace */
549          0,                     /* src_mask */
550          0xfffc,                /* dst_mask */
551          TRUE),                 /* pcrel_offset */
552
553   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
554      the branch is not expected to be taken.  The lower two bits must
555      be zero.  */
556   HOWTO (R_PPC_REL14_BRNTAKEN,  /* type */
557          0,                     /* rightshift */
558          2,                     /* size (0 = byte, 1 = short, 2 = long) */
559          16,                    /* bitsize */
560          TRUE,                  /* pc_relative */
561          0,                     /* bitpos */
562          complain_overflow_signed, /* complain_on_overflow */
563          bfd_elf_generic_reloc, /* special_function */
564          "R_PPC_REL14_BRNTAKEN",/* name */
565          FALSE,                 /* partial_inplace */
566          0,                     /* src_mask */
567          0xfffc,                /* dst_mask */
568          TRUE),                 /* pcrel_offset */
569
570   /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
571      symbol.  */
572   HOWTO (R_PPC_GOT16,           /* type */
573          0,                     /* rightshift */
574          1,                     /* size (0 = byte, 1 = short, 2 = long) */
575          16,                    /* bitsize */
576          FALSE,                 /* pc_relative */
577          0,                     /* bitpos */
578          complain_overflow_signed, /* complain_on_overflow */
579          bfd_elf_generic_reloc, /* special_function */
580          "R_PPC_GOT16",         /* name */
581          FALSE,                 /* partial_inplace */
582          0,                     /* src_mask */
583          0xffff,                /* dst_mask */
584          FALSE),                /* pcrel_offset */
585
586   /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
587      the symbol.  */
588   HOWTO (R_PPC_GOT16_LO,        /* type */
589          0,                     /* rightshift */
590          1,                     /* size (0 = byte, 1 = short, 2 = long) */
591          16,                    /* bitsize */
592          FALSE,                 /* pc_relative */
593          0,                     /* bitpos */
594          complain_overflow_dont, /* complain_on_overflow */
595          bfd_elf_generic_reloc, /* special_function */
596          "R_PPC_GOT16_LO",      /* name */
597          FALSE,                 /* partial_inplace */
598          0,                     /* src_mask */
599          0xffff,                /* dst_mask */
600          FALSE),                /* pcrel_offset */
601
602   /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
603      the symbol.  */
604   HOWTO (R_PPC_GOT16_HI,        /* type */
605          16,                    /* rightshift */
606          1,                     /* size (0 = byte, 1 = short, 2 = long) */
607          16,                    /* bitsize */
608          FALSE,                 /* pc_relative */
609          0,                     /* bitpos */
610          complain_overflow_bitfield, /* complain_on_overflow */
611          bfd_elf_generic_reloc, /* special_function */
612          "R_PPC_GOT16_HI",      /* name */
613          FALSE,                 /* partial_inplace */
614          0,                     /* src_mask */
615          0xffff,                /* dst_mask */
616          FALSE),                 /* pcrel_offset */
617
618   /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
619      the symbol.  */
620   HOWTO (R_PPC_GOT16_HA,        /* type */
621          16,                    /* rightshift */
622          1,                     /* size (0 = byte, 1 = short, 2 = long) */
623          16,                    /* bitsize */
624          FALSE,                 /* pc_relative */
625          0,                     /* bitpos */
626          complain_overflow_bitfield, /* complain_on_overflow */
627          ppc_elf_addr16_ha_reloc, /* special_function */
628          "R_PPC_GOT16_HA",      /* name */
629          FALSE,                 /* partial_inplace */
630          0,                     /* src_mask */
631          0xffff,                /* dst_mask */
632          FALSE),                /* pcrel_offset */
633
634   /* Like R_PPC_REL24, but referring to the procedure linkage table
635      entry for the symbol.  */
636   HOWTO (R_PPC_PLTREL24,        /* type */
637          0,                     /* rightshift */
638          2,                     /* size (0 = byte, 1 = short, 2 = long) */
639          26,                    /* bitsize */
640          TRUE,                  /* pc_relative */
641          0,                     /* bitpos */
642          complain_overflow_signed,  /* complain_on_overflow */
643          bfd_elf_generic_reloc, /* special_function */
644          "R_PPC_PLTREL24",      /* name */
645          FALSE,                 /* partial_inplace */
646          0,                     /* src_mask */
647          0x3fffffc,             /* dst_mask */
648          TRUE),                 /* pcrel_offset */
649
650   /* This is used only by the dynamic linker.  The symbol should exist
651      both in the object being run and in some shared library.  The
652      dynamic linker copies the data addressed by the symbol from the
653      shared library into the object, because the object being
654      run has to have the data at some particular address.  */
655   HOWTO (R_PPC_COPY,            /* type */
656          0,                     /* rightshift */
657          2,                     /* size (0 = byte, 1 = short, 2 = long) */
658          32,                    /* bitsize */
659          FALSE,                 /* pc_relative */
660          0,                     /* bitpos */
661          complain_overflow_bitfield, /* complain_on_overflow */
662          bfd_elf_generic_reloc,  /* special_function */
663          "R_PPC_COPY",          /* name */
664          FALSE,                 /* partial_inplace */
665          0,                     /* src_mask */
666          0,                     /* dst_mask */
667          FALSE),                /* pcrel_offset */
668
669   /* Like R_PPC_ADDR32, but used when setting global offset table
670      entries.  */
671   HOWTO (R_PPC_GLOB_DAT,        /* type */
672          0,                     /* rightshift */
673          2,                     /* size (0 = byte, 1 = short, 2 = long) */
674          32,                    /* bitsize */
675          FALSE,                 /* pc_relative */
676          0,                     /* bitpos */
677          complain_overflow_bitfield, /* complain_on_overflow */
678          bfd_elf_generic_reloc,  /* special_function */
679          "R_PPC_GLOB_DAT",      /* name */
680          FALSE,                 /* partial_inplace */
681          0,                     /* src_mask */
682          0xffffffff,            /* dst_mask */
683          FALSE),                /* pcrel_offset */
684
685   /* Marks a procedure linkage table entry for a symbol.  */
686   HOWTO (R_PPC_JMP_SLOT,        /* type */
687          0,                     /* rightshift */
688          2,                     /* size (0 = byte, 1 = short, 2 = long) */
689          32,                    /* bitsize */
690          FALSE,                 /* pc_relative */
691          0,                     /* bitpos */
692          complain_overflow_bitfield, /* complain_on_overflow */
693          bfd_elf_generic_reloc,  /* special_function */
694          "R_PPC_JMP_SLOT",      /* name */
695          FALSE,                 /* partial_inplace */
696          0,                     /* src_mask */
697          0,                     /* dst_mask */
698          FALSE),                /* pcrel_offset */
699
700   /* Used only by the dynamic linker.  When the object is run, this
701      longword is set to the load address of the object, plus the
702      addend.  */
703   HOWTO (R_PPC_RELATIVE,        /* type */
704          0,                     /* rightshift */
705          2,                     /* size (0 = byte, 1 = short, 2 = long) */
706          32,                    /* bitsize */
707          FALSE,                 /* pc_relative */
708          0,                     /* bitpos */
709          complain_overflow_bitfield, /* complain_on_overflow */
710          bfd_elf_generic_reloc,  /* special_function */
711          "R_PPC_RELATIVE",      /* name */
712          FALSE,                 /* partial_inplace */
713          0,                     /* src_mask */
714          0xffffffff,            /* dst_mask */
715          FALSE),                /* pcrel_offset */
716
717   /* Like R_PPC_REL24, but uses the value of the symbol within the
718      object rather than the final value.  Normally used for
719      _GLOBAL_OFFSET_TABLE_.  */
720   HOWTO (R_PPC_LOCAL24PC,       /* type */
721          0,                     /* rightshift */
722          2,                     /* size (0 = byte, 1 = short, 2 = long) */
723          26,                    /* bitsize */
724          TRUE,                  /* pc_relative */
725          0,                     /* bitpos */
726          complain_overflow_signed, /* complain_on_overflow */
727          bfd_elf_generic_reloc, /* special_function */
728          "R_PPC_LOCAL24PC",     /* name */
729          FALSE,                 /* partial_inplace */
730          0,                     /* src_mask */
731          0x3fffffc,             /* dst_mask */
732          TRUE),                 /* pcrel_offset */
733
734   /* Like R_PPC_ADDR32, but may be unaligned.  */
735   HOWTO (R_PPC_UADDR32,         /* type */
736          0,                     /* rightshift */
737          2,                     /* size (0 = byte, 1 = short, 2 = long) */
738          32,                    /* bitsize */
739          FALSE,                 /* pc_relative */
740          0,                     /* bitpos */
741          complain_overflow_bitfield, /* complain_on_overflow */
742          bfd_elf_generic_reloc, /* special_function */
743          "R_PPC_UADDR32",       /* name */
744          FALSE,                 /* partial_inplace */
745          0,                     /* src_mask */
746          0xffffffff,            /* dst_mask */
747          FALSE),                /* pcrel_offset */
748
749   /* Like R_PPC_ADDR16, but may be unaligned.  */
750   HOWTO (R_PPC_UADDR16,         /* type */
751          0,                     /* rightshift */
752          1,                     /* size (0 = byte, 1 = short, 2 = long) */
753          16,                    /* bitsize */
754          FALSE,                 /* pc_relative */
755          0,                     /* bitpos */
756          complain_overflow_bitfield, /* complain_on_overflow */
757          bfd_elf_generic_reloc, /* special_function */
758          "R_PPC_UADDR16",       /* name */
759          FALSE,                 /* partial_inplace */
760          0,                     /* src_mask */
761          0xffff,                /* dst_mask */
762          FALSE),                /* pcrel_offset */
763
764   /* 32-bit PC relative */
765   HOWTO (R_PPC_REL32,           /* type */
766          0,                     /* rightshift */
767          2,                     /* size (0 = byte, 1 = short, 2 = long) */
768          32,                    /* bitsize */
769          TRUE,                  /* pc_relative */
770          0,                     /* bitpos */
771          complain_overflow_bitfield, /* complain_on_overflow */
772          bfd_elf_generic_reloc, /* special_function */
773          "R_PPC_REL32",         /* name */
774          FALSE,                 /* partial_inplace */
775          0,                     /* src_mask */
776          0xffffffff,            /* dst_mask */
777          TRUE),                 /* pcrel_offset */
778
779   /* 32-bit relocation to the symbol's procedure linkage table.
780      FIXME: not supported.  */
781   HOWTO (R_PPC_PLT32,           /* type */
782          0,                     /* rightshift */
783          2,                     /* size (0 = byte, 1 = short, 2 = long) */
784          32,                    /* bitsize */
785          FALSE,                 /* pc_relative */
786          0,                     /* bitpos */
787          complain_overflow_bitfield, /* complain_on_overflow */
788          bfd_elf_generic_reloc, /* special_function */
789          "R_PPC_PLT32",         /* name */
790          FALSE,                 /* partial_inplace */
791          0,                     /* src_mask */
792          0,                     /* dst_mask */
793          FALSE),                /* pcrel_offset */
794
795   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
796      FIXME: not supported.  */
797   HOWTO (R_PPC_PLTREL32,        /* type */
798          0,                     /* rightshift */
799          2,                     /* size (0 = byte, 1 = short, 2 = long) */
800          32,                    /* bitsize */
801          TRUE,                  /* pc_relative */
802          0,                     /* bitpos */
803          complain_overflow_bitfield, /* complain_on_overflow */
804          bfd_elf_generic_reloc, /* special_function */
805          "R_PPC_PLTREL32",      /* name */
806          FALSE,                 /* partial_inplace */
807          0,                     /* src_mask */
808          0,                     /* dst_mask */
809          TRUE),                 /* pcrel_offset */
810
811   /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
812      the symbol.  */
813   HOWTO (R_PPC_PLT16_LO,        /* type */
814          0,                     /* rightshift */
815          1,                     /* size (0 = byte, 1 = short, 2 = long) */
816          16,                    /* bitsize */
817          FALSE,                 /* pc_relative */
818          0,                     /* bitpos */
819          complain_overflow_dont, /* complain_on_overflow */
820          bfd_elf_generic_reloc, /* special_function */
821          "R_PPC_PLT16_LO",      /* name */
822          FALSE,                 /* partial_inplace */
823          0,                     /* src_mask */
824          0xffff,                /* dst_mask */
825          FALSE),                /* pcrel_offset */
826
827   /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
828      the symbol.  */
829   HOWTO (R_PPC_PLT16_HI,        /* type */
830          16,                    /* rightshift */
831          1,                     /* size (0 = byte, 1 = short, 2 = long) */
832          16,                    /* bitsize */
833          FALSE,                 /* pc_relative */
834          0,                     /* bitpos */
835          complain_overflow_bitfield, /* complain_on_overflow */
836          bfd_elf_generic_reloc, /* special_function */
837          "R_PPC_PLT16_HI",      /* name */
838          FALSE,                 /* partial_inplace */
839          0,                     /* src_mask */
840          0xffff,                /* dst_mask */
841          FALSE),                 /* pcrel_offset */
842
843   /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
844      the symbol.  */
845   HOWTO (R_PPC_PLT16_HA,        /* type */
846          16,                    /* rightshift */
847          1,                     /* size (0 = byte, 1 = short, 2 = long) */
848          16,                    /* bitsize */
849          FALSE,                 /* pc_relative */
850          0,                     /* bitpos */
851          complain_overflow_bitfield, /* complain_on_overflow */
852          ppc_elf_addr16_ha_reloc, /* special_function */
853          "R_PPC_PLT16_HA",      /* name */
854          FALSE,                 /* partial_inplace */
855          0,                     /* src_mask */
856          0xffff,                /* dst_mask */
857          FALSE),                /* pcrel_offset */
858
859   /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
860      small data items.  */
861   HOWTO (R_PPC_SDAREL16,        /* type */
862          0,                     /* rightshift */
863          1,                     /* size (0 = byte, 1 = short, 2 = long) */
864          16,                    /* bitsize */
865          FALSE,                 /* pc_relative */
866          0,                     /* bitpos */
867          complain_overflow_signed, /* complain_on_overflow */
868          bfd_elf_generic_reloc, /* special_function */
869          "R_PPC_SDAREL16",      /* name */
870          FALSE,                 /* partial_inplace */
871          0,                     /* src_mask */
872          0xffff,                /* dst_mask */
873          FALSE),                /* pcrel_offset */
874
875   /* 16-bit section relative relocation.  */
876   HOWTO (R_PPC_SECTOFF,         /* type */
877          0,                     /* rightshift */
878          1,                     /* size (0 = byte, 1 = short, 2 = long) */
879          16,                    /* bitsize */
880          FALSE,                 /* pc_relative */
881          0,                     /* bitpos */
882          complain_overflow_bitfield, /* complain_on_overflow */
883          bfd_elf_generic_reloc, /* special_function */
884          "R_PPC_SECTOFF",       /* name */
885          FALSE,                 /* partial_inplace */
886          0,                     /* src_mask */
887          0xffff,                /* dst_mask */
888          FALSE),                /* pcrel_offset */
889
890   /* 16-bit lower half section relative relocation.  */
891   HOWTO (R_PPC_SECTOFF_LO,        /* type */
892          0,                     /* rightshift */
893          1,                     /* size (0 = byte, 1 = short, 2 = long) */
894          16,                    /* bitsize */
895          FALSE,                 /* pc_relative */
896          0,                     /* bitpos */
897          complain_overflow_dont, /* complain_on_overflow */
898          bfd_elf_generic_reloc, /* special_function */
899          "R_PPC_SECTOFF_LO",    /* name */
900          FALSE,                 /* partial_inplace */
901          0,                     /* src_mask */
902          0xffff,                /* dst_mask */
903          FALSE),                /* pcrel_offset */
904
905   /* 16-bit upper half section relative relocation.  */
906   HOWTO (R_PPC_SECTOFF_HI,      /* type */
907          16,                    /* rightshift */
908          1,                     /* size (0 = byte, 1 = short, 2 = long) */
909          16,                    /* bitsize */
910          FALSE,                 /* pc_relative */
911          0,                     /* bitpos */
912          complain_overflow_bitfield, /* complain_on_overflow */
913          bfd_elf_generic_reloc, /* special_function */
914          "R_PPC_SECTOFF_HI",    /* name */
915          FALSE,                 /* partial_inplace */
916          0,                     /* src_mask */
917          0xffff,                /* dst_mask */
918          FALSE),                 /* pcrel_offset */
919
920   /* 16-bit upper half adjusted section relative relocation.  */
921   HOWTO (R_PPC_SECTOFF_HA,      /* type */
922          16,                    /* rightshift */
923          1,                     /* size (0 = byte, 1 = short, 2 = long) */
924          16,                    /* bitsize */
925          FALSE,                 /* pc_relative */
926          0,                     /* bitpos */
927          complain_overflow_bitfield, /* complain_on_overflow */
928          ppc_elf_addr16_ha_reloc, /* special_function */
929          "R_PPC_SECTOFF_HA",    /* name */
930          FALSE,                 /* partial_inplace */
931          0,                     /* src_mask */
932          0xffff,                /* dst_mask */
933          FALSE),                /* pcrel_offset */
934
935   /* Marker reloc for TLS.  */
936   HOWTO (R_PPC_TLS,
937          0,                     /* rightshift */
938          2,                     /* size (0 = byte, 1 = short, 2 = long) */
939          32,                    /* bitsize */
940          FALSE,                 /* pc_relative */
941          0,                     /* bitpos */
942          complain_overflow_dont, /* complain_on_overflow */
943          bfd_elf_generic_reloc, /* special_function */
944          "R_PPC_TLS",           /* name */
945          FALSE,                 /* partial_inplace */
946          0,                     /* src_mask */
947          0,                     /* dst_mask */
948          FALSE),                /* pcrel_offset */
949
950   /* Computes the load module index of the load module that contains the
951      definition of its TLS sym.  */
952   HOWTO (R_PPC_DTPMOD32,
953          0,                     /* rightshift */
954          2,                     /* size (0 = byte, 1 = short, 2 = long) */
955          32,                    /* bitsize */
956          FALSE,                 /* pc_relative */
957          0,                     /* bitpos */
958          complain_overflow_dont, /* complain_on_overflow */
959          ppc_elf_unhandled_reloc, /* special_function */
960          "R_PPC_DTPMOD32",      /* name */
961          FALSE,                 /* partial_inplace */
962          0,                     /* src_mask */
963          0xffffffff,            /* dst_mask */
964          FALSE),                /* pcrel_offset */
965
966   /* Computes a dtv-relative displacement, the difference between the value
967      of sym+add and the base address of the thread-local storage block that
968      contains the definition of sym, minus 0x8000.  */
969   HOWTO (R_PPC_DTPREL32,
970          0,                     /* rightshift */
971          2,                     /* size (0 = byte, 1 = short, 2 = long) */
972          32,                    /* bitsize */
973          FALSE,                 /* pc_relative */
974          0,                     /* bitpos */
975          complain_overflow_dont, /* complain_on_overflow */
976          ppc_elf_unhandled_reloc, /* special_function */
977          "R_PPC_DTPREL32",      /* name */
978          FALSE,                 /* partial_inplace */
979          0,                     /* src_mask */
980          0xffffffff,            /* dst_mask */
981          FALSE),                /* pcrel_offset */
982
983   /* A 16 bit dtprel reloc.  */
984   HOWTO (R_PPC_DTPREL16,
985          0,                     /* rightshift */
986          1,                     /* size (0 = byte, 1 = short, 2 = long) */
987          16,                    /* bitsize */
988          FALSE,                 /* pc_relative */
989          0,                     /* bitpos */
990          complain_overflow_signed, /* complain_on_overflow */
991          ppc_elf_unhandled_reloc, /* special_function */
992          "R_PPC_DTPREL16",      /* name */
993          FALSE,                 /* partial_inplace */
994          0,                     /* src_mask */
995          0xffff,                /* dst_mask */
996          FALSE),                /* pcrel_offset */
997
998   /* Like DTPREL16, but no overflow.  */
999   HOWTO (R_PPC_DTPREL16_LO,
1000          0,                     /* rightshift */
1001          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1002          16,                    /* bitsize */
1003          FALSE,                 /* pc_relative */
1004          0,                     /* bitpos */
1005          complain_overflow_dont, /* complain_on_overflow */
1006          ppc_elf_unhandled_reloc, /* special_function */
1007          "R_PPC_DTPREL16_LO",   /* name */
1008          FALSE,                 /* partial_inplace */
1009          0,                     /* src_mask */
1010          0xffff,                /* dst_mask */
1011          FALSE),                /* pcrel_offset */
1012
1013   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1014   HOWTO (R_PPC_DTPREL16_HI,
1015          16,                    /* rightshift */
1016          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1017          16,                    /* bitsize */
1018          FALSE,                 /* pc_relative */
1019          0,                     /* bitpos */
1020          complain_overflow_dont, /* complain_on_overflow */
1021          ppc_elf_unhandled_reloc, /* special_function */
1022          "R_PPC_DTPREL16_HI",   /* name */
1023          FALSE,                 /* partial_inplace */
1024          0,                     /* src_mask */
1025          0xffff,                /* dst_mask */
1026          FALSE),                /* pcrel_offset */
1027
1028   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1029   HOWTO (R_PPC_DTPREL16_HA,
1030          16,                    /* rightshift */
1031          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1032          16,                    /* bitsize */
1033          FALSE,                 /* pc_relative */
1034          0,                     /* bitpos */
1035          complain_overflow_dont, /* complain_on_overflow */
1036          ppc_elf_unhandled_reloc, /* special_function */
1037          "R_PPC_DTPREL16_HA",   /* name */
1038          FALSE,                 /* partial_inplace */
1039          0,                     /* src_mask */
1040          0xffff,                /* dst_mask */
1041          FALSE),                /* pcrel_offset */
1042
1043   /* Computes a tp-relative displacement, the difference between the value of
1044      sym+add and the value of the thread pointer (r13).  */
1045   HOWTO (R_PPC_TPREL32,
1046          0,                     /* rightshift */
1047          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1048          32,                    /* bitsize */
1049          FALSE,                 /* pc_relative */
1050          0,                     /* bitpos */
1051          complain_overflow_dont, /* complain_on_overflow */
1052          ppc_elf_unhandled_reloc, /* special_function */
1053          "R_PPC_TPREL32",       /* name */
1054          FALSE,                 /* partial_inplace */
1055          0,                     /* src_mask */
1056          0xffffffff,            /* dst_mask */
1057          FALSE),                /* pcrel_offset */
1058
1059   /* A 16 bit tprel reloc.  */
1060   HOWTO (R_PPC_TPREL16,
1061          0,                     /* rightshift */
1062          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1063          16,                    /* bitsize */
1064          FALSE,                 /* pc_relative */
1065          0,                     /* bitpos */
1066          complain_overflow_signed, /* complain_on_overflow */
1067          ppc_elf_unhandled_reloc, /* special_function */
1068          "R_PPC_TPREL16",       /* name */
1069          FALSE,                 /* partial_inplace */
1070          0,                     /* src_mask */
1071          0xffff,                /* dst_mask */
1072          FALSE),                /* pcrel_offset */
1073
1074   /* Like TPREL16, but no overflow.  */
1075   HOWTO (R_PPC_TPREL16_LO,
1076          0,                     /* rightshift */
1077          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1078          16,                    /* bitsize */
1079          FALSE,                 /* pc_relative */
1080          0,                     /* bitpos */
1081          complain_overflow_dont, /* complain_on_overflow */
1082          ppc_elf_unhandled_reloc, /* special_function */
1083          "R_PPC_TPREL16_LO",    /* name */
1084          FALSE,                 /* partial_inplace */
1085          0,                     /* src_mask */
1086          0xffff,                /* dst_mask */
1087          FALSE),                /* pcrel_offset */
1088
1089   /* Like TPREL16_LO, but next higher group of 16 bits.  */
1090   HOWTO (R_PPC_TPREL16_HI,
1091          16,                    /* rightshift */
1092          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1093          16,                    /* bitsize */
1094          FALSE,                 /* pc_relative */
1095          0,                     /* bitpos */
1096          complain_overflow_dont, /* complain_on_overflow */
1097          ppc_elf_unhandled_reloc, /* special_function */
1098          "R_PPC_TPREL16_HI",    /* name */
1099          FALSE,                 /* partial_inplace */
1100          0,                     /* src_mask */
1101          0xffff,                /* dst_mask */
1102          FALSE),                /* pcrel_offset */
1103
1104   /* Like TPREL16_HI, but adjust for low 16 bits.  */
1105   HOWTO (R_PPC_TPREL16_HA,
1106          16,                    /* rightshift */
1107          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1108          16,                    /* bitsize */
1109          FALSE,                 /* pc_relative */
1110          0,                     /* bitpos */
1111          complain_overflow_dont, /* complain_on_overflow */
1112          ppc_elf_unhandled_reloc, /* special_function */
1113          "R_PPC_TPREL16_HA",    /* name */
1114          FALSE,                 /* partial_inplace */
1115          0,                     /* src_mask */
1116          0xffff,                /* dst_mask */
1117          FALSE),                /* pcrel_offset */
1118
1119   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1120      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1121      to the first entry.  */
1122   HOWTO (R_PPC_GOT_TLSGD16,
1123          0,                     /* rightshift */
1124          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1125          16,                    /* bitsize */
1126          FALSE,                 /* pc_relative */
1127          0,                     /* bitpos */
1128          complain_overflow_signed, /* complain_on_overflow */
1129          ppc_elf_unhandled_reloc, /* special_function */
1130          "R_PPC_GOT_TLSGD16",   /* name */
1131          FALSE,                 /* partial_inplace */
1132          0,                     /* src_mask */
1133          0xffff,                /* dst_mask */
1134          FALSE),                /* pcrel_offset */
1135
1136   /* Like GOT_TLSGD16, but no overflow.  */
1137   HOWTO (R_PPC_GOT_TLSGD16_LO,
1138          0,                     /* rightshift */
1139          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1140          16,                    /* bitsize */
1141          FALSE,                 /* pc_relative */
1142          0,                     /* bitpos */
1143          complain_overflow_dont, /* complain_on_overflow */
1144          ppc_elf_unhandled_reloc, /* special_function */
1145          "R_PPC_GOT_TLSGD16_LO", /* name */
1146          FALSE,                 /* partial_inplace */
1147          0,                     /* src_mask */
1148          0xffff,                /* dst_mask */
1149          FALSE),                /* pcrel_offset */
1150
1151   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1152   HOWTO (R_PPC_GOT_TLSGD16_HI,
1153          16,                    /* rightshift */
1154          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1155          16,                    /* bitsize */
1156          FALSE,                 /* pc_relative */
1157          0,                     /* bitpos */
1158          complain_overflow_dont, /* complain_on_overflow */
1159          ppc_elf_unhandled_reloc, /* special_function */
1160          "R_PPC_GOT_TLSGD16_HI", /* name */
1161          FALSE,                 /* partial_inplace */
1162          0,                     /* src_mask */
1163          0xffff,                /* dst_mask */
1164          FALSE),                /* pcrel_offset */
1165
1166   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1167   HOWTO (R_PPC_GOT_TLSGD16_HA,
1168          16,                    /* rightshift */
1169          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1170          16,                    /* bitsize */
1171          FALSE,                 /* pc_relative */
1172          0,                     /* bitpos */
1173          complain_overflow_dont, /* complain_on_overflow */
1174          ppc_elf_unhandled_reloc, /* special_function */
1175          "R_PPC_GOT_TLSGD16_HA", /* name */
1176          FALSE,                 /* partial_inplace */
1177          0,                     /* src_mask */
1178          0xffff,                /* dst_mask */
1179          FALSE),                /* pcrel_offset */
1180
1181   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1182      with values (sym+add)@dtpmod and zero, and computes the offset to the
1183      first entry.  */
1184   HOWTO (R_PPC_GOT_TLSLD16,
1185          0,                     /* rightshift */
1186          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1187          16,                    /* bitsize */
1188          FALSE,                 /* pc_relative */
1189          0,                     /* bitpos */
1190          complain_overflow_signed, /* complain_on_overflow */
1191          ppc_elf_unhandled_reloc, /* special_function */
1192          "R_PPC_GOT_TLSLD16",   /* name */
1193          FALSE,                 /* partial_inplace */
1194          0,                     /* src_mask */
1195          0xffff,                /* dst_mask */
1196          FALSE),                /* pcrel_offset */
1197
1198   /* Like GOT_TLSLD16, but no overflow.  */
1199   HOWTO (R_PPC_GOT_TLSLD16_LO,
1200          0,                     /* rightshift */
1201          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1202          16,                    /* bitsize */
1203          FALSE,                 /* pc_relative */
1204          0,                     /* bitpos */
1205          complain_overflow_dont, /* complain_on_overflow */
1206          ppc_elf_unhandled_reloc, /* special_function */
1207          "R_PPC_GOT_TLSLD16_LO", /* name */
1208          FALSE,                 /* partial_inplace */
1209          0,                     /* src_mask */
1210          0xffff,                /* dst_mask */
1211          FALSE),                /* pcrel_offset */
1212
1213   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1214   HOWTO (R_PPC_GOT_TLSLD16_HI,
1215          16,                    /* rightshift */
1216          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1217          16,                    /* bitsize */
1218          FALSE,                 /* pc_relative */
1219          0,                     /* bitpos */
1220          complain_overflow_dont, /* complain_on_overflow */
1221          ppc_elf_unhandled_reloc, /* special_function */
1222          "R_PPC_GOT_TLSLD16_HI", /* name */
1223          FALSE,                 /* partial_inplace */
1224          0,                     /* src_mask */
1225          0xffff,                /* dst_mask */
1226          FALSE),                /* pcrel_offset */
1227
1228   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1229   HOWTO (R_PPC_GOT_TLSLD16_HA,
1230          16,                    /* rightshift */
1231          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1232          16,                    /* bitsize */
1233          FALSE,                 /* pc_relative */
1234          0,                     /* bitpos */
1235          complain_overflow_dont, /* complain_on_overflow */
1236          ppc_elf_unhandled_reloc, /* special_function */
1237          "R_PPC_GOT_TLSLD16_HA", /* name */
1238          FALSE,                 /* partial_inplace */
1239          0,                     /* src_mask */
1240          0xffff,                /* dst_mask */
1241          FALSE),                /* pcrel_offset */
1242
1243   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1244      the offset to the entry.  */
1245   HOWTO (R_PPC_GOT_DTPREL16,
1246          0,                     /* rightshift */
1247          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1248          16,                    /* bitsize */
1249          FALSE,                 /* pc_relative */
1250          0,                     /* bitpos */
1251          complain_overflow_signed, /* complain_on_overflow */
1252          ppc_elf_unhandled_reloc, /* special_function */
1253          "R_PPC_GOT_DTPREL16",  /* name */
1254          FALSE,                 /* partial_inplace */
1255          0,                     /* src_mask */
1256          0xffff,                /* dst_mask */
1257          FALSE),                /* pcrel_offset */
1258
1259   /* Like GOT_DTPREL16, but no overflow.  */
1260   HOWTO (R_PPC_GOT_DTPREL16_LO,
1261          0,                     /* rightshift */
1262          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1263          16,                    /* bitsize */
1264          FALSE,                 /* pc_relative */
1265          0,                     /* bitpos */
1266          complain_overflow_dont, /* complain_on_overflow */
1267          ppc_elf_unhandled_reloc, /* special_function */
1268          "R_PPC_GOT_DTPREL16_LO", /* name */
1269          FALSE,                 /* partial_inplace */
1270          0,                     /* src_mask */
1271          0xffff,                /* dst_mask */
1272          FALSE),                /* pcrel_offset */
1273
1274   /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
1275   HOWTO (R_PPC_GOT_DTPREL16_HI,
1276          16,                    /* rightshift */
1277          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1278          16,                    /* bitsize */
1279          FALSE,                 /* pc_relative */
1280          0,                     /* bitpos */
1281          complain_overflow_dont, /* complain_on_overflow */
1282          ppc_elf_unhandled_reloc, /* special_function */
1283          "R_PPC_GOT_DTPREL16_HI", /* name */
1284          FALSE,                 /* partial_inplace */
1285          0,                     /* src_mask */
1286          0xffff,                /* dst_mask */
1287          FALSE),                /* pcrel_offset */
1288
1289   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1290   HOWTO (R_PPC_GOT_DTPREL16_HA,
1291          16,                    /* rightshift */
1292          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1293          16,                    /* bitsize */
1294          FALSE,                 /* pc_relative */
1295          0,                     /* bitpos */
1296          complain_overflow_dont, /* complain_on_overflow */
1297          ppc_elf_unhandled_reloc, /* special_function */
1298          "R_PPC_GOT_DTPREL16_HA", /* name */
1299          FALSE,                 /* partial_inplace */
1300          0,                     /* src_mask */
1301          0xffff,                /* dst_mask */
1302          FALSE),                /* pcrel_offset */
1303
1304   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1305      offset to the entry.  */
1306   HOWTO (R_PPC_GOT_TPREL16,
1307          0,                     /* rightshift */
1308          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1309          16,                    /* bitsize */
1310          FALSE,                 /* pc_relative */
1311          0,                     /* bitpos */
1312          complain_overflow_signed, /* complain_on_overflow */
1313          ppc_elf_unhandled_reloc, /* special_function */
1314          "R_PPC_GOT_TPREL16",   /* name */
1315          FALSE,                 /* partial_inplace */
1316          0,                     /* src_mask */
1317          0xffff,                /* dst_mask */
1318          FALSE),                /* pcrel_offset */
1319
1320   /* Like GOT_TPREL16, but no overflow.  */
1321   HOWTO (R_PPC_GOT_TPREL16_LO,
1322          0,                     /* rightshift */
1323          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1324          16,                    /* bitsize */
1325          FALSE,                 /* pc_relative */
1326          0,                     /* bitpos */
1327          complain_overflow_dont, /* complain_on_overflow */
1328          ppc_elf_unhandled_reloc, /* special_function */
1329          "R_PPC_GOT_TPREL16_LO", /* name */
1330          FALSE,                 /* partial_inplace */
1331          0,                     /* src_mask */
1332          0xffff,                /* dst_mask */
1333          FALSE),                /* pcrel_offset */
1334
1335   /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
1336   HOWTO (R_PPC_GOT_TPREL16_HI,
1337          16,                    /* rightshift */
1338          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1339          16,                    /* bitsize */
1340          FALSE,                 /* pc_relative */
1341          0,                     /* bitpos */
1342          complain_overflow_dont, /* complain_on_overflow */
1343          ppc_elf_unhandled_reloc, /* special_function */
1344          "R_PPC_GOT_TPREL16_HI", /* name */
1345          FALSE,                 /* partial_inplace */
1346          0,                     /* src_mask */
1347          0xffff,                /* dst_mask */
1348          FALSE),                /* pcrel_offset */
1349
1350   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1351   HOWTO (R_PPC_GOT_TPREL16_HA,
1352          16,                    /* rightshift */
1353          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1354          16,                    /* bitsize */
1355          FALSE,                 /* pc_relative */
1356          0,                     /* bitpos */
1357          complain_overflow_dont, /* complain_on_overflow */
1358          ppc_elf_unhandled_reloc, /* special_function */
1359          "R_PPC_GOT_TPREL16_HA", /* name */
1360          FALSE,                 /* partial_inplace */
1361          0,                     /* src_mask */
1362          0xffff,                /* dst_mask */
1363          FALSE),                /* pcrel_offset */
1364
1365   /* The remaining relocs are from the Embedded ELF ABI, and are not
1366      in the SVR4 ELF ABI.  */
1367
1368   /* 32 bit value resulting from the addend minus the symbol.  */
1369   HOWTO (R_PPC_EMB_NADDR32,     /* type */
1370          0,                     /* rightshift */
1371          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1372          32,                    /* bitsize */
1373          FALSE,                 /* pc_relative */
1374          0,                     /* bitpos */
1375          complain_overflow_bitfield, /* complain_on_overflow */
1376          bfd_elf_generic_reloc, /* special_function */
1377          "R_PPC_EMB_NADDR32",   /* name */
1378          FALSE,                 /* partial_inplace */
1379          0,                     /* src_mask */
1380          0xffffffff,            /* dst_mask */
1381          FALSE),                /* pcrel_offset */
1382
1383   /* 16 bit value resulting from the addend minus the symbol.  */
1384   HOWTO (R_PPC_EMB_NADDR16,     /* type */
1385          0,                     /* rightshift */
1386          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1387          16,                    /* bitsize */
1388          FALSE,                 /* pc_relative */
1389          0,                     /* bitpos */
1390          complain_overflow_bitfield, /* complain_on_overflow */
1391          bfd_elf_generic_reloc, /* special_function */
1392          "R_PPC_EMB_NADDR16",   /* name */
1393          FALSE,                 /* partial_inplace */
1394          0,                     /* src_mask */
1395          0xffff,                /* dst_mask */
1396          FALSE),                /* pcrel_offset */
1397
1398   /* 16 bit value resulting from the addend minus the symbol.  */
1399   HOWTO (R_PPC_EMB_NADDR16_LO,  /* type */
1400          0,                     /* rightshift */
1401          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1402          16,                    /* bitsize */
1403          FALSE,                 /* pc_relative */
1404          0,                     /* bitpos */
1405          complain_overflow_dont,/* complain_on_overflow */
1406          bfd_elf_generic_reloc, /* special_function */
1407          "R_PPC_EMB_ADDR16_LO", /* name */
1408          FALSE,                 /* partial_inplace */
1409          0,                     /* src_mask */
1410          0xffff,                /* dst_mask */
1411          FALSE),                /* pcrel_offset */
1412
1413   /* The high order 16 bits of the addend minus the symbol.  */
1414   HOWTO (R_PPC_EMB_NADDR16_HI,  /* type */
1415          16,                    /* rightshift */
1416          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1417          16,                    /* bitsize */
1418          FALSE,                 /* pc_relative */
1419          0,                     /* bitpos */
1420          complain_overflow_dont, /* complain_on_overflow */
1421          bfd_elf_generic_reloc, /* special_function */
1422          "R_PPC_EMB_NADDR16_HI", /* name */
1423          FALSE,                 /* partial_inplace */
1424          0,                     /* src_mask */
1425          0xffff,                /* dst_mask */
1426          FALSE),                /* pcrel_offset */
1427
1428   /* The high order 16 bits of the result of the addend minus the address,
1429      plus 1 if the contents of the low 16 bits, treated as a signed number,
1430      is negative.  */
1431   HOWTO (R_PPC_EMB_NADDR16_HA,  /* type */
1432          16,                    /* rightshift */
1433          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1434          16,                    /* bitsize */
1435          FALSE,                 /* pc_relative */
1436          0,                     /* bitpos */
1437          complain_overflow_dont, /* complain_on_overflow */
1438          ppc_elf_addr16_ha_reloc, /* special_function */
1439          "R_PPC_EMB_NADDR16_HA", /* name */
1440          FALSE,                 /* partial_inplace */
1441          0,                     /* src_mask */
1442          0xffff,                /* dst_mask */
1443          FALSE),                /* pcrel_offset */
1444
1445   /* 16 bit value resulting from allocating a 4 byte word to hold an
1446      address in the .sdata section, and returning the offset from
1447      _SDA_BASE_ for that relocation.  */
1448   HOWTO (R_PPC_EMB_SDAI16,      /* type */
1449          0,                     /* rightshift */
1450          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1451          16,                    /* bitsize */
1452          FALSE,                 /* pc_relative */
1453          0,                     /* bitpos */
1454          complain_overflow_bitfield, /* complain_on_overflow */
1455          bfd_elf_generic_reloc, /* special_function */
1456          "R_PPC_EMB_SDAI16",    /* name */
1457          FALSE,                 /* partial_inplace */
1458          0,                     /* src_mask */
1459          0xffff,                /* dst_mask */
1460          FALSE),                /* pcrel_offset */
1461
1462   /* 16 bit value resulting from allocating a 4 byte word to hold an
1463      address in the .sdata2 section, and returning the offset from
1464      _SDA2_BASE_ for that relocation.  */
1465   HOWTO (R_PPC_EMB_SDA2I16,     /* type */
1466          0,                     /* rightshift */
1467          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1468          16,                    /* bitsize */
1469          FALSE,                 /* pc_relative */
1470          0,                     /* bitpos */
1471          complain_overflow_bitfield, /* complain_on_overflow */
1472          bfd_elf_generic_reloc, /* special_function */
1473          "R_PPC_EMB_SDA2I16",   /* name */
1474          FALSE,                 /* partial_inplace */
1475          0,                     /* src_mask */
1476          0xffff,                /* dst_mask */
1477          FALSE),                /* pcrel_offset */
1478
1479   /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1480      small data items.   */
1481   HOWTO (R_PPC_EMB_SDA2REL,     /* type */
1482          0,                     /* rightshift */
1483          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1484          16,                    /* bitsize */
1485          FALSE,                 /* pc_relative */
1486          0,                     /* bitpos */
1487          complain_overflow_signed, /* complain_on_overflow */
1488          bfd_elf_generic_reloc, /* special_function */
1489          "R_PPC_EMB_SDA2REL",   /* name */
1490          FALSE,                 /* partial_inplace */
1491          0,                     /* src_mask */
1492          0xffff,                /* dst_mask */
1493          FALSE),                /* pcrel_offset */
1494
1495   /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1496      signed offset from the appropriate base, and filling in the register
1497      field with the appropriate register (0, 2, or 13).  */
1498   HOWTO (R_PPC_EMB_SDA21,       /* type */
1499          0,                     /* rightshift */
1500          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1501          16,                    /* bitsize */
1502          FALSE,                 /* pc_relative */
1503          0,                     /* bitpos */
1504          complain_overflow_signed, /* complain_on_overflow */
1505          bfd_elf_generic_reloc, /* special_function */
1506          "R_PPC_EMB_SDA21",     /* name */
1507          FALSE,                 /* partial_inplace */
1508          0,                     /* src_mask */
1509          0xffff,                /* dst_mask */
1510          FALSE),                /* pcrel_offset */
1511
1512   /* Relocation not handled: R_PPC_EMB_MRKREF */
1513   /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1514   /* Relocation not handled: R_PPC_EMB_RELST_LO */
1515   /* Relocation not handled: R_PPC_EMB_RELST_HI */
1516   /* Relocation not handled: R_PPC_EMB_RELST_HA */
1517   /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1518
1519   /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1520      in the 16 bit signed offset from the appropriate base, and filling in the
1521      register field with the appropriate register (0, 2, or 13).  */
1522   HOWTO (R_PPC_EMB_RELSDA,      /* type */
1523          0,                     /* rightshift */
1524          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1525          16,                    /* bitsize */
1526          TRUE,                  /* pc_relative */
1527          0,                     /* bitpos */
1528          complain_overflow_signed, /* complain_on_overflow */
1529          bfd_elf_generic_reloc, /* special_function */
1530          "R_PPC_EMB_RELSDA",    /* name */
1531          FALSE,                 /* partial_inplace */
1532          0,                     /* src_mask */
1533          0xffff,                /* dst_mask */
1534          FALSE),                /* pcrel_offset */
1535
1536   /* Phony relocs to handle branch stubs.  */
1537   HOWTO (R_PPC_RELAX32,         /* type */
1538          0,                     /* rightshift */
1539          0,                     /* size */
1540          0,                     /* bitsize */
1541          FALSE,                 /* pc_relative */
1542          0,                     /* bitpos */
1543          complain_overflow_dont, /* complain_on_overflow */
1544          bfd_elf_generic_reloc, /* special_function */
1545          "R_PPC_RELAX32",       /* name */
1546          FALSE,                 /* partial_inplace */
1547          0,                     /* src_mask */
1548          0,                     /* dst_mask */
1549          FALSE),                /* pcrel_offset */
1550
1551   HOWTO (R_PPC_RELAX32PC,       /* type */
1552          0,                     /* rightshift */
1553          0,                     /* size */
1554          0,                     /* bitsize */
1555          FALSE,                 /* pc_relative */
1556          0,                     /* bitpos */
1557          complain_overflow_dont, /* complain_on_overflow */
1558          bfd_elf_generic_reloc, /* special_function */
1559          "R_PPC_RELAX32PC",     /* name */
1560          FALSE,                 /* partial_inplace */
1561          0,                     /* src_mask */
1562          0,                     /* dst_mask */
1563          FALSE),                /* pcrel_offset */
1564
1565   /* GNU extension to record C++ vtable hierarchy.  */
1566   HOWTO (R_PPC_GNU_VTINHERIT,   /* type */
1567          0,                     /* rightshift */
1568          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1569          0,                     /* bitsize */
1570          FALSE,                 /* pc_relative */
1571          0,                     /* bitpos */
1572          complain_overflow_dont, /* complain_on_overflow */
1573          NULL,                  /* special_function */
1574          "R_PPC_GNU_VTINHERIT", /* name */
1575          FALSE,                 /* partial_inplace */
1576          0,                     /* src_mask */
1577          0,                     /* dst_mask */
1578          FALSE),                /* pcrel_offset */
1579
1580   /* GNU extension to record C++ vtable member usage.  */
1581   HOWTO (R_PPC_GNU_VTENTRY,     /* type */
1582          0,                     /* rightshift */
1583          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1584          0,                     /* bitsize */
1585          FALSE,                 /* pc_relative */
1586          0,                     /* bitpos */
1587          complain_overflow_dont, /* complain_on_overflow */
1588          NULL,                  /* special_function */
1589          "R_PPC_GNU_VTENTRY",   /* name */
1590          FALSE,                 /* partial_inplace */
1591          0,                     /* src_mask */
1592          0,                     /* dst_mask */
1593          FALSE),                /* pcrel_offset */
1594
1595   /* Phony reloc to handle AIX style TOC entries.  */
1596   HOWTO (R_PPC_TOC16,           /* type */
1597          0,                     /* rightshift */
1598          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1599          16,                    /* bitsize */
1600          FALSE,                 /* pc_relative */
1601          0,                     /* bitpos */
1602          complain_overflow_signed, /* complain_on_overflow */
1603          bfd_elf_generic_reloc, /* special_function */
1604          "R_PPC_TOC16",         /* name */
1605          FALSE,                 /* partial_inplace */
1606          0,                     /* src_mask */
1607          0xffff,                /* dst_mask */
1608          FALSE),                /* pcrel_offset */
1609 };
1610 \f
1611 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1612
1613 static void
1614 ppc_elf_howto_init (void)
1615 {
1616   unsigned int i, type;
1617
1618   for (i = 0;
1619        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1620        i++)
1621     {
1622       type = ppc_elf_howto_raw[i].type;
1623       if (type >= (sizeof (ppc_elf_howto_table)
1624                    / sizeof (ppc_elf_howto_table[0])))
1625         abort ();
1626       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1627     }
1628 }
1629 \f
1630 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
1631
1632 static const int shared_stub_entry[] =
1633   {
1634     0x7c0802a6, /* mflr 0 */
1635     0x429f0005, /* bcl 20, 31, .Lxxx */
1636     0x7d6802a6, /* mflr 11 */
1637     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
1638     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
1639     0x7c0803a6, /* mtlr 0 */
1640     0x7d6903a6, /* mtctr 11 */
1641     0x4e800420, /* bctr */
1642   };
1643
1644 static const int stub_entry[] =
1645   {
1646     0x3d600000, /* lis 11,xxx@ha */
1647     0x396b0000, /* addi 11,11,xxx@l */
1648     0x7d6903a6, /* mtctr 11 */
1649     0x4e800420, /* bctr */
1650   };
1651
1652
1653 static bfd_boolean
1654 ppc_elf_relax_section (bfd *abfd,
1655                        asection *isec,
1656                        struct bfd_link_info *link_info,
1657                        bfd_boolean *again)
1658 {
1659   struct one_fixup
1660   {
1661     struct one_fixup *next;
1662     asection *tsec;
1663     bfd_vma toff;
1664     bfd_vma trampoff;
1665   };
1666
1667   Elf_Internal_Shdr *symtab_hdr;
1668   bfd_byte *contents = NULL;
1669   Elf_Internal_Sym *isymbuf = NULL;
1670   Elf_Internal_Rela *internal_relocs = NULL;
1671   Elf_Internal_Rela *irel, *irelend;
1672   struct one_fixup *fixups = NULL;
1673   bfd_boolean changed;
1674   struct ppc_elf_link_hash_table *ppc_info;
1675   bfd_size_type trampoff;
1676
1677   *again = FALSE;
1678
1679   /* Nothing to do if there are no relocations.  */
1680   if ((isec->flags & SEC_RELOC) == 0 || isec->reloc_count == 0)
1681     return TRUE;
1682
1683   trampoff = (isec->size + 3) & (bfd_vma) -4;
1684   /* Space for a branch around any trampolines.  */
1685   trampoff += 4;
1686
1687   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1688
1689   /* Get a copy of the native relocations.  */
1690   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
1691                                                link_info->keep_memory);
1692   if (internal_relocs == NULL)
1693     goto error_return;
1694
1695   ppc_info = ppc_elf_hash_table (link_info);
1696   irelend = internal_relocs + isec->reloc_count;
1697
1698   for (irel = internal_relocs; irel < irelend; irel++)
1699     {
1700       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
1701       bfd_vma symaddr, reladdr, toff, roff;
1702       asection *tsec;
1703       struct one_fixup *f;
1704       size_t insn_offset = 0;
1705       bfd_vma max_branch_offset, val;
1706       bfd_byte *hit_addr;
1707       unsigned long t0;
1708       unsigned char sym_type;
1709
1710       switch (r_type)
1711         {
1712         case R_PPC_REL24:
1713         case R_PPC_LOCAL24PC:
1714         case R_PPC_PLTREL24:
1715           max_branch_offset = 1 << 25;
1716           break;
1717
1718         case R_PPC_REL14:
1719         case R_PPC_REL14_BRTAKEN:
1720         case R_PPC_REL14_BRNTAKEN:
1721           max_branch_offset = 1 << 15;
1722           break;
1723
1724         default:
1725           continue;
1726         }
1727
1728       /* Get the value of the symbol referred to by the reloc.  */
1729       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1730         {
1731           /* A local symbol.  */
1732           Elf_Internal_Sym *isym;
1733
1734           /* Read this BFD's local symbols.  */
1735           if (isymbuf == NULL)
1736             {
1737               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1738               if (isymbuf == NULL)
1739                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1740                                                 symtab_hdr->sh_info, 0,
1741                                                 NULL, NULL, NULL);
1742               if (isymbuf == 0)
1743                 goto error_return;
1744             }
1745           isym = isymbuf + ELF32_R_SYM (irel->r_info);
1746           if (isym->st_shndx == SHN_UNDEF)
1747             continue;   /* We can't do anything with undefined symbols.  */
1748           else if (isym->st_shndx == SHN_ABS)
1749             tsec = bfd_abs_section_ptr;
1750           else if (isym->st_shndx == SHN_COMMON)
1751             tsec = bfd_com_section_ptr;
1752           else
1753             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1754
1755           toff = isym->st_value;
1756           sym_type = ELF_ST_TYPE (isym->st_info);
1757         }
1758       else
1759         {
1760           /* Global symbol handling.  */
1761           unsigned long indx;
1762           struct elf_link_hash_entry *h;
1763
1764           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1765           h = elf_sym_hashes (abfd)[indx];
1766
1767           while (h->root.type == bfd_link_hash_indirect
1768                  || h->root.type == bfd_link_hash_warning)
1769             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1770
1771           if (r_type == R_PPC_PLTREL24
1772               && ppc_info->plt != NULL
1773               && h->plt.offset != (bfd_vma) -1)
1774             {
1775               tsec = ppc_info->plt;
1776               toff = h->plt.offset;
1777             }
1778           else if (h->root.type == bfd_link_hash_defined
1779                    || h->root.type == bfd_link_hash_defweak)
1780             {
1781               tsec = h->root.u.def.section;
1782               toff = h->root.u.def.value;
1783             }
1784           else
1785             continue;
1786
1787           sym_type = h->type;
1788         }
1789
1790       /* If the branch and target are in the same section, you have
1791          no hope of adding stubs.  We'll error out later should the
1792          branch overflow.  */
1793       if (tsec == isec)
1794         continue;
1795
1796       /* There probably isn't any reason to handle symbols in
1797          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
1798          attribute for a code section, and we are only looking at
1799          branches.  However, implement it correctly here as a
1800          reference for other target relax_section functions.  */
1801       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
1802         {
1803           /* At this stage in linking, no SEC_MERGE symbol has been
1804              adjusted, so all references to such symbols need to be
1805              passed through _bfd_merged_section_offset.  (Later, in
1806              relocate_section, all SEC_MERGE symbols *except* for
1807              section symbols have been adjusted.)
1808
1809              gas may reduce relocations against symbols in SEC_MERGE
1810              sections to a relocation against the section symbol when
1811              the original addend was zero.  When the reloc is against
1812              a section symbol we should include the addend in the
1813              offset passed to _bfd_merged_section_offset, since the
1814              location of interest is the original symbol.  On the
1815              other hand, an access to "sym+addend" where "sym" is not
1816              a section symbol should not include the addend;  Such an
1817              access is presumed to be an offset from "sym";  The
1818              location of interest is just "sym".  */
1819           if (sym_type == STT_SECTION)
1820             toff += irel->r_addend;
1821
1822           toff = _bfd_merged_section_offset (abfd, &tsec,
1823                                              elf_section_data (tsec)->sec_info,
1824                                              toff);
1825
1826           if (sym_type != STT_SECTION)
1827             toff += irel->r_addend;
1828         }
1829       else
1830         toff += irel->r_addend;
1831
1832       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
1833
1834       roff = irel->r_offset;
1835       reladdr = isec->output_section->vma + isec->output_offset + roff;
1836
1837       /* If the branch is in range, no need to do anything.  */
1838       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
1839         continue;
1840
1841       /* Look for an existing fixup to this address.  */
1842       for (f = fixups; f ; f = f->next)
1843         if (f->tsec == tsec && f->toff == toff)
1844           break;
1845
1846       if (f == NULL)
1847         {
1848           size_t size;
1849           unsigned long stub_rtype;
1850
1851           val = trampoff - roff;
1852           if (val >= max_branch_offset)
1853             /* Oh dear, we can't reach a trampoline.  Don't try to add
1854                one.  We'll report an error later.  */
1855             continue;
1856
1857           if (link_info->shared)
1858             {
1859               size = 4 * ARRAY_SIZE (shared_stub_entry);
1860               insn_offset = 12;
1861               stub_rtype = R_PPC_RELAX32PC;
1862             }
1863           else
1864             {
1865               size = 4 * ARRAY_SIZE (stub_entry);
1866               insn_offset = 0;
1867               stub_rtype = R_PPC_RELAX32;
1868             }
1869
1870           /* Hijack the old relocation.  Since we need two
1871              relocations for this use a "composite" reloc.  */
1872           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1873                                        stub_rtype);
1874           irel->r_offset = trampoff + insn_offset;
1875
1876           /* Record the fixup so we don't do it again this section.  */
1877           f = bfd_malloc (sizeof (*f));
1878           f->next = fixups;
1879           f->tsec = tsec;
1880           f->toff = toff;
1881           f->trampoff = trampoff;
1882           fixups = f;
1883
1884           trampoff += size;
1885         }
1886       else
1887         {
1888           val = f->trampoff - roff;
1889           if (val >= max_branch_offset)
1890             continue;
1891
1892           /* Nop out the reloc, since we're finalizing things here.  */
1893           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
1894         }
1895
1896       /* Get the section contents.  */
1897       if (contents == NULL)
1898         {
1899           /* Get cached copy if it exists.  */
1900           if (elf_section_data (isec)->this_hdr.contents != NULL)
1901             contents = elf_section_data (isec)->this_hdr.contents;
1902           else
1903             {
1904               /* Go get them off disk.  */
1905               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
1906                 goto error_return;
1907             }
1908         }
1909
1910       /* Fix up the existing branch to hit the trampoline.  */
1911       hit_addr = contents + roff;
1912       switch (r_type)
1913         {
1914         case R_PPC_REL24:
1915         case R_PPC_LOCAL24PC:
1916         case R_PPC_PLTREL24:
1917           t0 = bfd_get_32 (abfd, hit_addr);
1918           t0 &= ~0x3fffffc;
1919           t0 |= val & 0x3fffffc;
1920           bfd_put_32 (abfd, t0, hit_addr);
1921           break;
1922
1923         case R_PPC_REL14:
1924         case R_PPC_REL14_BRTAKEN:
1925         case R_PPC_REL14_BRNTAKEN:
1926           t0 = bfd_get_32 (abfd, hit_addr);
1927           t0 &= ~0xfffc;
1928           t0 |= val & 0xfffc;
1929           bfd_put_32 (abfd, t0, hit_addr);
1930           break;
1931         }
1932     }
1933
1934   /* Write out the trampolines.  */
1935   changed = fixups != NULL;
1936   if (fixups != NULL)
1937     {
1938       const int *stub;
1939       bfd_byte *dest;
1940       bfd_vma val;
1941       int i, size;
1942
1943       do
1944         {
1945           struct one_fixup *f = fixups;
1946           fixups = fixups->next;
1947           free (f);
1948         }
1949       while (fixups);
1950
1951       contents = bfd_realloc (contents, trampoff);
1952       if (contents == NULL)
1953         goto error_return;
1954
1955       isec->size = (isec->size + 3) & (bfd_vma) -4;
1956       /* Branch around the trampolines.  */
1957       val = trampoff - isec->size + 0x48000000;
1958       dest = contents + isec->size;
1959       isec->size = trampoff;
1960       bfd_put_32 (abfd, val, dest);
1961       dest += 4;
1962
1963       if (link_info->shared)
1964         {
1965           stub = shared_stub_entry;
1966           size = ARRAY_SIZE (shared_stub_entry);
1967         }
1968       else
1969         {
1970           stub = stub_entry;
1971           size = ARRAY_SIZE (stub_entry);
1972         }
1973
1974       i = 0;
1975       while (dest < contents + trampoff)
1976         {
1977           bfd_put_32 (abfd, stub[i], dest);
1978           i++;
1979           if (i == size)
1980             i = 0;
1981           dest += 4;
1982         }
1983       BFD_ASSERT (i == 0);
1984     }
1985
1986   if (isymbuf != NULL
1987       && symtab_hdr->contents != (unsigned char *) isymbuf)
1988     {
1989       if (! link_info->keep_memory)
1990         free (isymbuf);
1991       else
1992         {
1993           /* Cache the symbols for elf_link_input_bfd.  */
1994           symtab_hdr->contents = (unsigned char *) isymbuf;
1995         }
1996     }
1997
1998   if (contents != NULL
1999       && elf_section_data (isec)->this_hdr.contents != contents)
2000     {
2001       if (!changed && !link_info->keep_memory)
2002         free (contents);
2003       else
2004         {
2005           /* Cache the section contents for elf_link_input_bfd.  */
2006           elf_section_data (isec)->this_hdr.contents = contents;
2007         }
2008     }
2009
2010   if (elf_section_data (isec)->relocs != internal_relocs)
2011     {
2012       if (!changed)
2013         free (internal_relocs);
2014       else
2015         elf_section_data (isec)->relocs = internal_relocs;
2016     }
2017
2018   *again = changed;
2019   return TRUE;
2020
2021  error_return:
2022   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
2023     free (isymbuf);
2024   if (contents != NULL
2025       && elf_section_data (isec)->this_hdr.contents != contents)
2026     free (contents);
2027   if (internal_relocs != NULL
2028       && elf_section_data (isec)->relocs != internal_relocs)
2029     free (internal_relocs);
2030   return FALSE;
2031 }
2032 \f
2033 static reloc_howto_type *
2034 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2035                            bfd_reloc_code_real_type code)
2036 {
2037   enum elf_ppc_reloc_type r;
2038
2039   /* Initialize howto table if not already done.  */
2040   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2041     ppc_elf_howto_init ();
2042
2043   switch (code)
2044     {
2045     default:
2046       return NULL;
2047
2048     case BFD_RELOC_NONE:                r = R_PPC_NONE;                 break;
2049     case BFD_RELOC_32:                  r = R_PPC_ADDR32;               break;
2050     case BFD_RELOC_PPC_BA26:            r = R_PPC_ADDR24;               break;
2051     case BFD_RELOC_16:                  r = R_PPC_ADDR16;               break;
2052     case BFD_RELOC_LO16:                r = R_PPC_ADDR16_LO;            break;
2053     case BFD_RELOC_HI16:                r = R_PPC_ADDR16_HI;            break;
2054     case BFD_RELOC_HI16_S:              r = R_PPC_ADDR16_HA;            break;
2055     case BFD_RELOC_PPC_BA16:            r = R_PPC_ADDR14;               break;
2056     case BFD_RELOC_PPC_BA16_BRTAKEN:    r = R_PPC_ADDR14_BRTAKEN;       break;
2057     case BFD_RELOC_PPC_BA16_BRNTAKEN:   r = R_PPC_ADDR14_BRNTAKEN;      break;
2058     case BFD_RELOC_PPC_B26:             r = R_PPC_REL24;                break;
2059     case BFD_RELOC_PPC_B16:             r = R_PPC_REL14;                break;
2060     case BFD_RELOC_PPC_B16_BRTAKEN:     r = R_PPC_REL14_BRTAKEN;        break;
2061     case BFD_RELOC_PPC_B16_BRNTAKEN:    r = R_PPC_REL14_BRNTAKEN;       break;
2062     case BFD_RELOC_16_GOTOFF:           r = R_PPC_GOT16;                break;
2063     case BFD_RELOC_LO16_GOTOFF:         r = R_PPC_GOT16_LO;             break;
2064     case BFD_RELOC_HI16_GOTOFF:         r = R_PPC_GOT16_HI;             break;
2065     case BFD_RELOC_HI16_S_GOTOFF:       r = R_PPC_GOT16_HA;             break;
2066     case BFD_RELOC_24_PLT_PCREL:        r = R_PPC_PLTREL24;             break;
2067     case BFD_RELOC_PPC_COPY:            r = R_PPC_COPY;                 break;
2068     case BFD_RELOC_PPC_GLOB_DAT:        r = R_PPC_GLOB_DAT;             break;
2069     case BFD_RELOC_PPC_LOCAL24PC:       r = R_PPC_LOCAL24PC;            break;
2070     case BFD_RELOC_32_PCREL:            r = R_PPC_REL32;                break;
2071     case BFD_RELOC_32_PLTOFF:           r = R_PPC_PLT32;                break;
2072     case BFD_RELOC_32_PLT_PCREL:        r = R_PPC_PLTREL32;             break;
2073     case BFD_RELOC_LO16_PLTOFF:         r = R_PPC_PLT16_LO;             break;
2074     case BFD_RELOC_HI16_PLTOFF:         r = R_PPC_PLT16_HI;             break;
2075     case BFD_RELOC_HI16_S_PLTOFF:       r = R_PPC_PLT16_HA;             break;
2076     case BFD_RELOC_GPREL16:             r = R_PPC_SDAREL16;             break;
2077     case BFD_RELOC_16_BASEREL:          r = R_PPC_SECTOFF;              break;
2078     case BFD_RELOC_LO16_BASEREL:        r = R_PPC_SECTOFF_LO;           break;
2079     case BFD_RELOC_HI16_BASEREL:        r = R_PPC_SECTOFF_HI;           break;
2080     case BFD_RELOC_HI16_S_BASEREL:      r = R_PPC_SECTOFF_HA;           break;
2081     case BFD_RELOC_CTOR:                r = R_PPC_ADDR32;               break;
2082     case BFD_RELOC_PPC_TOC16:           r = R_PPC_TOC16;                break;
2083     case BFD_RELOC_PPC_TLS:             r = R_PPC_TLS;                  break;
2084     case BFD_RELOC_PPC_DTPMOD:          r = R_PPC_DTPMOD32;             break;
2085     case BFD_RELOC_PPC_TPREL16:         r = R_PPC_TPREL16;              break;
2086     case BFD_RELOC_PPC_TPREL16_LO:      r = R_PPC_TPREL16_LO;           break;
2087     case BFD_RELOC_PPC_TPREL16_HI:      r = R_PPC_TPREL16_HI;           break;
2088     case BFD_RELOC_PPC_TPREL16_HA:      r = R_PPC_TPREL16_HA;           break;
2089     case BFD_RELOC_PPC_TPREL:           r = R_PPC_TPREL32;              break;
2090     case BFD_RELOC_PPC_DTPREL16:        r = R_PPC_DTPREL16;             break;
2091     case BFD_RELOC_PPC_DTPREL16_LO:     r = R_PPC_DTPREL16_LO;          break;
2092     case BFD_RELOC_PPC_DTPREL16_HI:     r = R_PPC_DTPREL16_HI;          break;
2093     case BFD_RELOC_PPC_DTPREL16_HA:     r = R_PPC_DTPREL16_HA;          break;
2094     case BFD_RELOC_PPC_DTPREL:          r = R_PPC_DTPREL32;             break;
2095     case BFD_RELOC_PPC_GOT_TLSGD16:     r = R_PPC_GOT_TLSGD16;          break;
2096     case BFD_RELOC_PPC_GOT_TLSGD16_LO:  r = R_PPC_GOT_TLSGD16_LO;       break;
2097     case BFD_RELOC_PPC_GOT_TLSGD16_HI:  r = R_PPC_GOT_TLSGD16_HI;       break;
2098     case BFD_RELOC_PPC_GOT_TLSGD16_HA:  r = R_PPC_GOT_TLSGD16_HA;       break;
2099     case BFD_RELOC_PPC_GOT_TLSLD16:     r = R_PPC_GOT_TLSLD16;          break;
2100     case BFD_RELOC_PPC_GOT_TLSLD16_LO:  r = R_PPC_GOT_TLSLD16_LO;       break;
2101     case BFD_RELOC_PPC_GOT_TLSLD16_HI:  r = R_PPC_GOT_TLSLD16_HI;       break;
2102     case BFD_RELOC_PPC_GOT_TLSLD16_HA:  r = R_PPC_GOT_TLSLD16_HA;       break;
2103     case BFD_RELOC_PPC_GOT_TPREL16:     r = R_PPC_GOT_TPREL16;          break;
2104     case BFD_RELOC_PPC_GOT_TPREL16_LO:  r = R_PPC_GOT_TPREL16_LO;       break;
2105     case BFD_RELOC_PPC_GOT_TPREL16_HI:  r = R_PPC_GOT_TPREL16_HI;       break;
2106     case BFD_RELOC_PPC_GOT_TPREL16_HA:  r = R_PPC_GOT_TPREL16_HA;       break;
2107     case BFD_RELOC_PPC_GOT_DTPREL16:    r = R_PPC_GOT_DTPREL16;         break;
2108     case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO;      break;
2109     case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI;      break;
2110     case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA;      break;
2111     case BFD_RELOC_PPC_EMB_NADDR32:     r = R_PPC_EMB_NADDR32;          break;
2112     case BFD_RELOC_PPC_EMB_NADDR16:     r = R_PPC_EMB_NADDR16;          break;
2113     case BFD_RELOC_PPC_EMB_NADDR16_LO:  r = R_PPC_EMB_NADDR16_LO;       break;
2114     case BFD_RELOC_PPC_EMB_NADDR16_HI:  r = R_PPC_EMB_NADDR16_HI;       break;
2115     case BFD_RELOC_PPC_EMB_NADDR16_HA:  r = R_PPC_EMB_NADDR16_HA;       break;
2116     case BFD_RELOC_PPC_EMB_SDAI16:      r = R_PPC_EMB_SDAI16;           break;
2117     case BFD_RELOC_PPC_EMB_SDA2I16:     r = R_PPC_EMB_SDA2I16;          break;
2118     case BFD_RELOC_PPC_EMB_SDA2REL:     r = R_PPC_EMB_SDA2REL;          break;
2119     case BFD_RELOC_PPC_EMB_SDA21:       r = R_PPC_EMB_SDA21;            break;
2120     case BFD_RELOC_PPC_EMB_MRKREF:      r = R_PPC_EMB_MRKREF;           break;
2121     case BFD_RELOC_PPC_EMB_RELSEC16:    r = R_PPC_EMB_RELSEC16;         break;
2122     case BFD_RELOC_PPC_EMB_RELST_LO:    r = R_PPC_EMB_RELST_LO;         break;
2123     case BFD_RELOC_PPC_EMB_RELST_HI:    r = R_PPC_EMB_RELST_HI;         break;
2124     case BFD_RELOC_PPC_EMB_RELST_HA:    r = R_PPC_EMB_RELST_HA;         break;
2125     case BFD_RELOC_PPC_EMB_BIT_FLD:     r = R_PPC_EMB_BIT_FLD;          break;
2126     case BFD_RELOC_PPC_EMB_RELSDA:      r = R_PPC_EMB_RELSDA;           break;
2127     case BFD_RELOC_VTABLE_INHERIT:      r = R_PPC_GNU_VTINHERIT;        break;
2128     case BFD_RELOC_VTABLE_ENTRY:        r = R_PPC_GNU_VTENTRY;          break;
2129     }
2130
2131   return ppc_elf_howto_table[r];
2132 };
2133
2134 /* Set the howto pointer for a PowerPC ELF reloc.  */
2135
2136 static void
2137 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
2138                        arelent *cache_ptr,
2139                        Elf_Internal_Rela *dst)
2140 {
2141   /* Initialize howto table if not already done.  */
2142   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2143     ppc_elf_howto_init ();
2144
2145   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
2146   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
2147 }
2148
2149 /* Handle the R_PPC_ADDR16_HA reloc.  */
2150
2151 static bfd_reloc_status_type
2152 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
2153                          arelent *reloc_entry,
2154                          asymbol *symbol,
2155                          void *data ATTRIBUTE_UNUSED,
2156                          asection *input_section,
2157                          bfd *output_bfd,
2158                          char **error_message ATTRIBUTE_UNUSED)
2159 {
2160   bfd_vma relocation;
2161
2162   if (output_bfd != NULL)
2163     {
2164       reloc_entry->address += input_section->output_offset;
2165       return bfd_reloc_ok;
2166     }
2167
2168   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2169     return bfd_reloc_outofrange;
2170
2171   if (bfd_is_com_section (symbol->section))
2172     relocation = 0;
2173   else
2174     relocation = symbol->value;
2175
2176   relocation += symbol->section->output_section->vma;
2177   relocation += symbol->section->output_offset;
2178   relocation += reloc_entry->addend;
2179
2180   reloc_entry->addend += (relocation & 0x8000) << 1;
2181
2182   return bfd_reloc_continue;
2183 }
2184
2185 static bfd_reloc_status_type
2186 ppc_elf_unhandled_reloc (bfd *abfd,
2187                          arelent *reloc_entry,
2188                          asymbol *symbol,
2189                          void *data,
2190                          asection *input_section,
2191                          bfd *output_bfd,
2192                          char **error_message)
2193 {
2194   /* If this is a relocatable link (output_bfd test tells us), just
2195      call the generic function.  Any adjustment will be done at final
2196      link time.  */
2197   if (output_bfd != NULL)
2198     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2199                                   input_section, output_bfd, error_message);
2200
2201   if (error_message != NULL)
2202     {
2203       static char buf[60];
2204       sprintf (buf, _("generic linker can't handle %s"),
2205                reloc_entry->howto->name);
2206       *error_message = buf;
2207     }
2208   return bfd_reloc_dangerous;
2209 }
2210
2211 /* Fix bad default arch selected for a 32 bit input bfd when the
2212    default is 64 bit.  */
2213
2214 static bfd_boolean
2215 ppc_elf_object_p (bfd *abfd)
2216 {
2217   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
2218     {
2219       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2220
2221       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
2222         {
2223           /* Relies on arch after 64 bit default being 32 bit default.  */
2224           abfd->arch_info = abfd->arch_info->next;
2225           BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
2226         }
2227     }
2228   return TRUE;
2229 }
2230
2231 /* Function to set whether a module needs the -mrelocatable bit set.  */
2232
2233 static bfd_boolean
2234 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
2235 {
2236   BFD_ASSERT (!elf_flags_init (abfd)
2237               || elf_elfheader (abfd)->e_flags == flags);
2238
2239   elf_elfheader (abfd)->e_flags = flags;
2240   elf_flags_init (abfd) = TRUE;
2241   return TRUE;
2242 }
2243
2244 /* Merge backend specific data from an object file to the output
2245    object file when linking.  */
2246
2247 static bfd_boolean
2248 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2249 {
2250   flagword old_flags;
2251   flagword new_flags;
2252   bfd_boolean error;
2253
2254   /* Check if we have the same endianess.  */
2255   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2256     return FALSE;
2257
2258   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2259       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2260     return TRUE;
2261
2262   new_flags = elf_elfheader (ibfd)->e_flags;
2263   old_flags = elf_elfheader (obfd)->e_flags;
2264   if (!elf_flags_init (obfd))
2265     {
2266       /* First call, no flags set.  */
2267       elf_flags_init (obfd) = TRUE;
2268       elf_elfheader (obfd)->e_flags = new_flags;
2269     }
2270
2271   /* Compatible flags are ok.  */
2272   else if (new_flags == old_flags)
2273     ;
2274
2275   /* Incompatible flags.  */
2276   else
2277     {
2278       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
2279          to be linked with either.  */
2280       error = FALSE;
2281       if ((new_flags & EF_PPC_RELOCATABLE) != 0
2282           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
2283         {
2284           error = TRUE;
2285           (*_bfd_error_handler)
2286             (_("%B: compiled with -mrelocatable and linked with "
2287                "modules compiled normally"), ibfd);
2288         }
2289       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
2290                && (old_flags & EF_PPC_RELOCATABLE) != 0)
2291         {
2292           error = TRUE;
2293           (*_bfd_error_handler)
2294             (_("%B: compiled normally and linked with "
2295                "modules compiled with -mrelocatable"), ibfd);
2296         }
2297
2298       /* The output is -mrelocatable-lib iff both the input files are.  */
2299       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
2300         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
2301
2302       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
2303          but each input file is either -mrelocatable or -mrelocatable-lib.  */
2304       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
2305           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
2306           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
2307         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
2308
2309       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
2310          any module uses it.  */
2311       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
2312
2313       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
2314       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
2315
2316       /* Warn about any other mismatches.  */
2317       if (new_flags != old_flags)
2318         {
2319           error = TRUE;
2320           (*_bfd_error_handler)
2321             (_("%B: uses different e_flags (0x%lx) fields "
2322                "than previous modules (0x%lx)"),
2323              ibfd, (long) new_flags, (long) old_flags);
2324         }
2325
2326       if (error)
2327         {
2328           bfd_set_error (bfd_error_bad_value);
2329           return FALSE;
2330         }
2331     }
2332
2333   return TRUE;
2334 }
2335 \f
2336 /* Handle a PowerPC specific section when reading an object file.  This
2337    is called when elfcode.h finds a section with an unknown type.  */
2338
2339 static bfd_boolean
2340 ppc_elf_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, const char *name)
2341 {
2342   asection *newsect;
2343   flagword flags;
2344
2345   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2346     return FALSE;
2347
2348   newsect = hdr->bfd_section;
2349   flags = bfd_get_section_flags (abfd, newsect);
2350   if (hdr->sh_flags & SHF_EXCLUDE)
2351     flags |= SEC_EXCLUDE;
2352
2353   if (hdr->sh_type == SHT_ORDERED)
2354     flags |= SEC_SORT_ENTRIES;
2355
2356   bfd_set_section_flags (abfd, newsect, flags);
2357   return TRUE;
2358 }
2359 \f
2360 /* Set up any other section flags and such that may be necessary.  */
2361
2362 static bfd_boolean
2363 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2364                        Elf_Internal_Shdr *shdr,
2365                        asection *asect)
2366 {
2367   if ((asect->flags & SEC_EXCLUDE) != 0)
2368     shdr->sh_flags |= SHF_EXCLUDE;
2369
2370   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
2371     shdr->sh_type = SHT_ORDERED;
2372
2373   return TRUE;
2374 }
2375 \f
2376 /* Find a linker generated pointer with a given addend and type.  */
2377
2378 static elf_linker_section_pointers_t *
2379 elf_find_pointer_linker_section
2380   (elf_linker_section_pointers_t *linker_pointers,
2381    bfd_vma addend,
2382    elf_linker_section_t *lsect)
2383 {
2384   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2385     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2386       return linker_pointers;
2387
2388   return NULL;
2389 }
2390 \f
2391 /* Allocate a pointer to live in a linker created section.  */
2392
2393 static bfd_boolean
2394 elf_create_pointer_linker_section (bfd *abfd,
2395                                    struct bfd_link_info *info,
2396                                    elf_linker_section_t *lsect,
2397                                    struct elf_link_hash_entry *h,
2398                                    const Elf_Internal_Rela *rel)
2399 {
2400   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2401   elf_linker_section_pointers_t *linker_section_ptr;
2402   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2403   bfd_size_type amt;
2404
2405   BFD_ASSERT (lsect != NULL);
2406
2407   /* Is this a global symbol?  */
2408   if (h != NULL)
2409     {
2410       struct ppc_elf_link_hash_entry *eh;
2411
2412       /* Has this symbol already been allocated?  If so, our work is done.  */
2413       eh = (struct ppc_elf_link_hash_entry *) h;
2414       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2415                                            rel->r_addend,
2416                                            lsect))
2417         return TRUE;
2418
2419       ptr_linker_section_ptr = &eh->linker_section_pointer;
2420       /* Make sure this symbol is output as a dynamic symbol.  */
2421       if (h->dynindx == -1)
2422         {
2423           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2424             return FALSE;
2425         }
2426
2427       if (lsect->rel_section)
2428         lsect->rel_section->size += sizeof (Elf32_External_Rela);
2429     }
2430   else
2431     {
2432       /* Allocation of a pointer to a local symbol.  */
2433       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2434
2435       /* Allocate a table to hold the local symbols if first time.  */
2436       if (!ptr)
2437         {
2438           unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2439
2440           amt = num_symbols;
2441           amt *= sizeof (elf_linker_section_pointers_t *);
2442           ptr = bfd_zalloc (abfd, amt);
2443
2444           if (!ptr)
2445             return FALSE;
2446
2447           elf_local_ptr_offsets (abfd) = ptr;
2448         }
2449
2450       /* Has this symbol already been allocated?  If so, our work is done.  */
2451       if (elf_find_pointer_linker_section (ptr[r_symndx],
2452                                            rel->r_addend,
2453                                            lsect))
2454         return TRUE;
2455
2456       ptr_linker_section_ptr = &ptr[r_symndx];
2457
2458       if (info->shared)
2459         {
2460           /* If we are generating a shared object, we need to
2461              output a R_<xxx>_RELATIVE reloc so that the
2462              dynamic linker can adjust this GOT entry.  */
2463           BFD_ASSERT (lsect->rel_section != NULL);
2464           lsect->rel_section->size += sizeof (Elf32_External_Rela);
2465         }
2466     }
2467
2468   /* Allocate space for a pointer in the linker section, and allocate
2469      a new pointer record from internal memory.  */
2470   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2471   amt = sizeof (elf_linker_section_pointers_t);
2472   linker_section_ptr = bfd_alloc (abfd, amt);
2473
2474   if (!linker_section_ptr)
2475     return FALSE;
2476
2477   linker_section_ptr->next = *ptr_linker_section_ptr;
2478   linker_section_ptr->addend = rel->r_addend;
2479   linker_section_ptr->lsect = lsect;
2480   linker_section_ptr->written_address_p = FALSE;
2481   *ptr_linker_section_ptr = linker_section_ptr;
2482
2483   linker_section_ptr->offset = lsect->section->size;
2484   lsect->section->size += 4;
2485
2486 #ifdef DEBUG
2487   fprintf (stderr,
2488            "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2489            lsect->name, (long) linker_section_ptr->offset,
2490            (long) lsect->section->size);
2491 #endif
2492
2493   return TRUE;
2494 }
2495 \f
2496 #define bfd_put_ptr(BFD, VAL, ADDR) bfd_put_32 (BFD, VAL, ADDR)
2497
2498 /* Fill in the address for a pointer generated in a linker section.  */
2499
2500 static bfd_vma
2501 elf_finish_pointer_linker_section (bfd *output_bfd,
2502                                    bfd *input_bfd,
2503                                    struct bfd_link_info *info,
2504                                    elf_linker_section_t *lsect,
2505                                    struct elf_link_hash_entry *h,
2506                                    bfd_vma relocation,
2507                                    const Elf_Internal_Rela *rel,
2508                                    int relative_reloc)
2509 {
2510   elf_linker_section_pointers_t *linker_section_ptr;
2511
2512   BFD_ASSERT (lsect != NULL);
2513
2514   if (h != NULL)
2515     {
2516       /* Handle global symbol.  */
2517       struct ppc_elf_link_hash_entry *eh;
2518
2519       eh = (struct ppc_elf_link_hash_entry *) h;
2520       linker_section_ptr
2521         = elf_find_pointer_linker_section (eh->linker_section_pointer,
2522                                            rel->r_addend,
2523                                            lsect);
2524
2525       BFD_ASSERT (linker_section_ptr != NULL);
2526
2527       if (! elf_hash_table (info)->dynamic_sections_created
2528           || (info->shared
2529               && info->symbolic
2530               && h->def_regular))
2531         {
2532           /* This is actually a static link, or it is a
2533              -Bsymbolic link and the symbol is defined
2534              locally.  We must initialize this entry in the
2535              global section.
2536
2537              When doing a dynamic link, we create a .rela.<xxx>
2538              relocation entry to initialize the value.  This
2539              is done in the finish_dynamic_symbol routine.  */
2540           if (!linker_section_ptr->written_address_p)
2541             {
2542               linker_section_ptr->written_address_p = TRUE;
2543               bfd_put_ptr (output_bfd,
2544                            relocation + linker_section_ptr->addend,
2545                            (lsect->section->contents
2546                             + linker_section_ptr->offset));
2547             }
2548         }
2549     }
2550   else
2551     {
2552       /* Handle local symbol.  */
2553       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2554       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
2555       BFD_ASSERT (elf_local_ptr_offsets (input_bfd)[r_symndx] != NULL);
2556       linker_section_ptr = (elf_find_pointer_linker_section
2557                             (elf_local_ptr_offsets (input_bfd)[r_symndx],
2558                              rel->r_addend,
2559                              lsect));
2560
2561       BFD_ASSERT (linker_section_ptr != NULL);
2562
2563       /* Write out pointer if it hasn't been rewritten out before.  */
2564       if (!linker_section_ptr->written_address_p)
2565         {
2566           linker_section_ptr->written_address_p = TRUE;
2567           bfd_put_ptr (output_bfd, relocation + linker_section_ptr->addend,
2568                        lsect->section->contents + linker_section_ptr->offset);
2569
2570           if (info->shared)
2571             {
2572               /* We need to generate a relative reloc for the dynamic
2573                  linker.  */
2574
2575               asection *srel = lsect->rel_section;
2576               Elf_Internal_Rela outrel[MAX_INT_RELS_PER_EXT_REL];
2577               bfd_byte *erel;
2578               const struct elf_backend_data *bed;
2579               unsigned int i;
2580
2581               BFD_ASSERT (srel != NULL);
2582
2583               bed = get_elf_backend_data (output_bfd);
2584               for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
2585                 {
2586                   outrel[i].r_offset = (lsect->section->output_section->vma
2587                                         + lsect->section->output_offset
2588                                         + linker_section_ptr->offset);
2589                   outrel[i].r_info = 0;
2590                   outrel[i].r_addend = 0;
2591                 }
2592               outrel[0].r_info = ELF32_R_INFO (0, relative_reloc);
2593               erel = lsect->section->contents;
2594               erel += (elf_section_data (lsect->section)->rel_count++
2595                        * sizeof (Elf32_External_Rela));
2596               bfd_elf32_swap_reloca_out (output_bfd, outrel, erel);
2597             }
2598         }
2599     }
2600
2601   relocation = (lsect->section->output_offset
2602                 + linker_section_ptr->offset
2603                 - lsect->sym_offset);
2604
2605 #ifdef DEBUG
2606   fprintf (stderr,
2607            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
2608            lsect->name, (long) relocation, (long) relocation);
2609 #endif
2610
2611   /* Subtract out the addend, because it will get added back in by the normal
2612      processing.  */
2613   return relocation - linker_section_ptr->addend;
2614 }
2615 \f
2616 /* Create a special linker section */
2617 static elf_linker_section_t *
2618 ppc_elf_create_linker_section (bfd *abfd,
2619                                struct bfd_link_info *info,
2620                                enum elf_linker_section_enum which)
2621 {
2622   elf_linker_section_t *lsect;
2623   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2624   asection *s, *sym_sec;
2625   bfd_size_type amt;
2626   flagword flags;
2627   const char *name;
2628   const char *rel_name;
2629   const char *sym_name;
2630   bfd_vma sym_offset;
2631
2632   /* Both of these sections are (technically) created by the user
2633      putting data in them, so they shouldn't be marked
2634      SEC_LINKER_CREATED.
2635
2636      The linker creates them so it has somewhere to attach their
2637      respective symbols. In fact, if they were empty it would
2638      be OK to leave the symbol set to 0 (or any random number), because
2639      the appropriate register should never be used.  */
2640   flags = SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY;
2641   sym_offset = 32768;
2642
2643   switch (which)
2644     {
2645     default:
2646       abort ();
2647       return NULL;
2648
2649     case LINKER_SECTION_SDATA:  /* .sdata/.sbss section */
2650       name      = ".sdata";
2651       rel_name  = ".rela.sdata";
2652       sym_name  = "_SDA_BASE_";
2653       break;
2654
2655     case LINKER_SECTION_SDATA2: /* .sdata2/.sbss2 section */
2656       name      = ".sdata2";
2657       rel_name  = ".rela.sdata2";
2658       sym_name  = "_SDA2_BASE_";
2659       flags    |= SEC_READONLY;
2660       break;
2661     }
2662
2663   /* Record the first bfd that needs the special sections.  */
2664   if (!htab->elf.dynobj)
2665     htab->elf.dynobj = abfd;
2666
2667   amt = sizeof (elf_linker_section_t);
2668   lsect = bfd_zalloc (htab->elf.dynobj, amt);
2669
2670   lsect->sym_offset = sym_offset;
2671
2672   /* See if the sections already exist.  */
2673   sym_sec = s = bfd_get_section_by_name (htab->elf.dynobj, name);
2674   if (s == NULL || (s->flags & flags) != flags)
2675     {
2676       s = bfd_make_section_anyway (htab->elf.dynobj, name);
2677       if (s == NULL
2678           || !bfd_set_section_flags (htab->elf.dynobj, s, flags))
2679         return NULL;
2680       if (sym_sec == NULL)
2681         sym_sec = s;
2682     }
2683   lsect->section = s;
2684
2685   if (bfd_get_section_alignment (htab->elf.dynobj, s) < 2
2686       && !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2687     return NULL;
2688
2689   s->size = align_power (s->size, 2);
2690
2691 #ifdef DEBUG
2692   fprintf (stderr, "Creating section %s, current size = %ld\n",
2693            name, (long) s->size);
2694 #endif
2695
2696   if (sym_name)
2697     {
2698       struct elf_link_hash_entry *h;
2699       struct bfd_link_hash_entry *bh;
2700
2701 #ifdef DEBUG
2702       fprintf (stderr, "Adding %s to section %s\n", sym_name, name);
2703 #endif
2704       bh = bfd_link_hash_lookup (info->hash, sym_name,
2705                                  FALSE, FALSE, FALSE);
2706
2707       if ((bh == NULL || bh->type == bfd_link_hash_undefined)
2708           && !(_bfd_generic_link_add_one_symbol
2709                (info, abfd, sym_name, BSF_GLOBAL, sym_sec, sym_offset, NULL,
2710                 FALSE, get_elf_backend_data (abfd)->collect, &bh)))
2711         return NULL;
2712       h = (struct elf_link_hash_entry *) bh;
2713
2714       h->type = STT_OBJECT;
2715       lsect->sym_hash = h;
2716
2717       if (info->shared
2718           && ! bfd_elf_link_record_dynamic_symbol (info, h))
2719         return NULL;
2720     }
2721
2722   if (info->shared)
2723     {
2724       s = bfd_make_section_anyway (htab->elf.dynobj, rel_name);
2725       lsect->rel_section = s;
2726       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2727                | SEC_LINKER_CREATED | SEC_READONLY);
2728       if (s == NULL
2729           || ! bfd_set_section_flags (htab->elf.dynobj, s, flags)
2730           || ! bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2731         return NULL;
2732     }
2733
2734   return lsect;
2735 }
2736 \f
2737 /* If we have a non-zero sized .sbss2 or .PPC.EMB.sbss0 sections, we
2738    need to bump up the number of section headers.  */
2739
2740 static int
2741 ppc_elf_additional_program_headers (bfd *abfd)
2742 {
2743   asection *s;
2744   int ret;
2745
2746   ret = 0;
2747
2748   s = bfd_get_section_by_name (abfd, ".interp");
2749   if (s != NULL)
2750     ++ret;
2751
2752   s = bfd_get_section_by_name (abfd, ".sbss2");
2753   if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size > 0)
2754     ++ret;
2755
2756   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
2757   if (s != NULL && (s->flags & SEC_LOAD) != 0 && s->size > 0)
2758     ++ret;
2759
2760   return ret;
2761 }
2762 \f
2763 /* The powerpc .got has a blrl instruction in it.  Mark it executable.  */
2764
2765 static bfd_boolean
2766 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2767 {
2768   struct ppc_elf_link_hash_table *htab;
2769   asection *s;
2770   flagword flags;
2771
2772   if (!_bfd_elf_create_got_section (abfd, info))
2773     return FALSE;
2774
2775   htab = ppc_elf_hash_table (info);
2776   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2777   if (s == NULL)
2778     abort ();
2779
2780   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2781            | SEC_LINKER_CREATED);
2782   if (!bfd_set_section_flags (abfd, s, flags))
2783     return FALSE;
2784
2785   htab->relgot = bfd_make_section (abfd, ".rela.got");
2786   if (!htab->relgot
2787       || ! bfd_set_section_flags (abfd, htab->relgot,
2788                                   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
2789                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
2790                                    | SEC_READONLY))
2791       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2792     return FALSE;
2793
2794   return TRUE;
2795 }
2796
2797 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2798    to output sections (just like _bfd_elf_create_dynamic_sections has
2799    to create .dynbss and .rela.bss).  */
2800
2801 static bfd_boolean
2802 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2803 {
2804   struct ppc_elf_link_hash_table *htab;
2805   asection *s;
2806   flagword flags;
2807
2808   htab = ppc_elf_hash_table (info);
2809
2810   if (htab->got == NULL
2811       && !ppc_elf_create_got (abfd, info))
2812     return FALSE;
2813
2814   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2815     return FALSE;
2816
2817   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2818            | SEC_LINKER_CREATED);
2819
2820   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2821   htab->dynsbss = s = bfd_make_section (abfd, ".dynsbss");
2822   if (s == NULL
2823       || ! bfd_set_section_flags (abfd, s, SEC_ALLOC))
2824     return FALSE;
2825
2826   if (! info->shared)
2827     {
2828       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2829       htab->relsbss = s = bfd_make_section (abfd, ".rela.sbss");
2830       if (s == NULL
2831           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2832           || ! bfd_set_section_alignment (abfd, s, 2))
2833         return FALSE;
2834     }
2835
2836   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2837   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2838   if (s == NULL)
2839     abort ();
2840
2841   flags = SEC_ALLOC | SEC_CODE | SEC_IN_MEMORY | SEC_LINKER_CREATED;
2842   return bfd_set_section_flags (abfd, s, flags);
2843 }
2844
2845 /* Adjust a symbol defined by a dynamic object and referenced by a
2846    regular object.  The current definition is in some section of the
2847    dynamic object, but we're not including those sections.  We have to
2848    change the definition to something the rest of the link can
2849    understand.  */
2850
2851 static bfd_boolean
2852 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2853                                struct elf_link_hash_entry *h)
2854 {
2855   struct ppc_elf_link_hash_table *htab;
2856   asection *s;
2857   unsigned int power_of_two;
2858
2859 #ifdef DEBUG
2860   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
2861            h->root.root.string);
2862 #endif
2863
2864   /* Make sure we know what is going on here.  */
2865   htab = ppc_elf_hash_table (info);
2866   BFD_ASSERT (htab->elf.dynobj != NULL
2867               && (h->needs_plt
2868                   || h->u.weakdef != NULL
2869                   || (h->def_dynamic
2870                       && h->ref_regular
2871                       && !h->def_regular)));
2872
2873   /* Deal with function syms.  */
2874   if (h->type == STT_FUNC
2875       || h->needs_plt)
2876     {
2877       /* Clear procedure linkage table information for any symbol that
2878          won't need a .plt entry.  */
2879       if (h->plt.refcount <= 0
2880           || SYMBOL_CALLS_LOCAL (info, h)
2881           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2882               && h->root.type == bfd_link_hash_undefweak))
2883         {
2884           /* A PLT entry is not required/allowed when:
2885
2886              1. We are not using ld.so; because then the PLT entry
2887              can't be set up, so we can't use one.  In this case,
2888              ppc_elf_adjust_dynamic_symbol won't even be called.
2889
2890              2. GC has rendered the entry unused.
2891
2892              3. We know for certain that a call to this symbol
2893              will go to this object, or will remain undefined.  */
2894           h->plt.offset = (bfd_vma) -1;
2895           h->needs_plt = 0;
2896         }
2897       return TRUE;
2898     }
2899   else
2900     h->plt.offset = (bfd_vma) -1;
2901
2902   /* If this is a weak symbol, and there is a real definition, the
2903      processor independent code will have arranged for us to see the
2904      real definition first, and we can just use the same value.  */
2905   if (h->u.weakdef != NULL)
2906     {
2907       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2908                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2909       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2910       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2911       if (ELIMINATE_COPY_RELOCS)
2912         h->non_got_ref = h->u.weakdef->non_got_ref;
2913       return TRUE;
2914     }
2915
2916   /* This is a reference to a symbol defined by a dynamic object which
2917      is not a function.  */
2918
2919   /* If we are creating a shared library, we must presume that the
2920      only references to the symbol are via the global offset table.
2921      For such cases we need not do anything here; the relocations will
2922      be handled correctly by relocate_section.  */
2923   if (info->shared)
2924     return TRUE;
2925
2926   /* If there are no references to this symbol that do not use the
2927      GOT, we don't need to generate a copy reloc.  */
2928   if (!h->non_got_ref)
2929     return TRUE;
2930
2931   if (ELIMINATE_COPY_RELOCS)
2932     {
2933       struct ppc_elf_dyn_relocs *p;
2934       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
2935         {
2936           s = p->sec->output_section;
2937           if (s != NULL && (s->flags & SEC_READONLY) != 0)
2938             break;
2939         }
2940
2941       /* If we didn't find any dynamic relocs in read-only sections, then
2942          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2943       if (p == NULL)
2944         {
2945           h->non_got_ref = 0;
2946           return TRUE;
2947         }
2948     }
2949
2950   /* We must allocate the symbol in our .dynbss section, which will
2951      become part of the .bss section of the executable.  There will be
2952      an entry for this symbol in the .dynsym section.  The dynamic
2953      object will contain position independent code, so all references
2954      from the dynamic object to this symbol will go through the global
2955      offset table.  The dynamic linker will use the .dynsym entry to
2956      determine the address it must put in the global offset table, so
2957      both the dynamic object and the regular object will refer to the
2958      same memory location for the variable.
2959
2960      Of course, if the symbol is sufficiently small, we must instead
2961      allocate it in .sbss.  FIXME: It would be better to do this if and
2962      only if there were actually SDAREL relocs for that symbol.  */
2963
2964   if (h->size <= elf_gp_size (htab->elf.dynobj))
2965     s = htab->dynsbss;
2966   else
2967     s = htab->dynbss;
2968   BFD_ASSERT (s != NULL);
2969
2970   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2971      copy the initial value out of the dynamic object and into the
2972      runtime process image.  We need to remember the offset into the
2973      .rela.bss section we are going to use.  */
2974   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2975     {
2976       asection *srel;
2977
2978       if (h->size <= elf_gp_size (htab->elf.dynobj))
2979         srel = htab->relsbss;
2980       else
2981         srel = htab->relbss;
2982       BFD_ASSERT (srel != NULL);
2983       srel->size += sizeof (Elf32_External_Rela);
2984       h->needs_copy = 1;
2985     }
2986
2987   /* We need to figure out the alignment required for this symbol.  I
2988      have no idea how ELF linkers handle this.  */
2989   power_of_two = bfd_log2 (h->size);
2990   if (power_of_two > 4)
2991     power_of_two = 4;
2992
2993   /* Apply the required alignment.  */
2994   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
2995   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
2996     {
2997       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
2998         return FALSE;
2999     }
3000
3001   /* Define the symbol as being at this point in the section.  */
3002   h->root.u.def.section = s;
3003   h->root.u.def.value = s->size;
3004
3005   /* Increment the section size to make room for the symbol.  */
3006   s->size += h->size;
3007
3008   return TRUE;
3009 }
3010 \f
3011 /* Of those relocs that might be copied as dynamic relocs, this macro
3012    selects those that must be copied when linking a shared library,
3013    even when the symbol is local.  */
3014
3015 #define MUST_BE_DYN_RELOC(RTYPE)                \
3016   ((RTYPE) != R_PPC_REL24                       \
3017    && (RTYPE) != R_PPC_REL14                    \
3018    && (RTYPE) != R_PPC_REL14_BRTAKEN            \
3019    && (RTYPE) != R_PPC_REL14_BRNTAKEN           \
3020    && (RTYPE) != R_PPC_REL32)
3021
3022 /* Allocate space in associated reloc sections for dynamic relocs.  */
3023
3024 static bfd_boolean
3025 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
3026 {
3027   struct bfd_link_info *info = inf;
3028   struct ppc_elf_link_hash_entry *eh;
3029   struct ppc_elf_link_hash_table *htab;
3030   struct ppc_elf_dyn_relocs *p;
3031
3032   if (h->root.type == bfd_link_hash_indirect)
3033     return TRUE;
3034
3035   if (h->root.type == bfd_link_hash_warning)
3036     /* When warning symbols are created, they **replace** the "real"
3037        entry in the hash table, thus we never get to see the real
3038        symbol in a hash traversal.  So look at it now.  */
3039     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3040
3041   htab = ppc_elf_hash_table (info);
3042   if (htab->elf.dynamic_sections_created
3043       && h->plt.refcount > 0)
3044     {
3045       /* Make sure this symbol is output as a dynamic symbol.  */
3046       if (h->dynindx == -1
3047           && !h->forced_local)
3048         {
3049           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3050             return FALSE;
3051         }
3052
3053       if (info->shared
3054           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3055         {
3056           asection *s = htab->plt;
3057
3058           /* If this is the first .plt entry, make room for the special
3059              first entry.  */
3060           if (s->size == 0)
3061             s->size += PLT_INITIAL_ENTRY_SIZE;
3062
3063           /* The PowerPC PLT is actually composed of two parts, the
3064              first part is 2 words (for a load and a jump), and then
3065              there is a remaining word available at the end.  */
3066           h->plt.offset = (PLT_INITIAL_ENTRY_SIZE
3067                            + (PLT_SLOT_SIZE
3068                               * ((s->size - PLT_INITIAL_ENTRY_SIZE)
3069                                  / PLT_ENTRY_SIZE)));
3070
3071           /* If this symbol is not defined in a regular file, and we
3072              are not generating a shared library, then set the symbol
3073              to this location in the .plt.  This is required to make
3074              function pointers compare as equal between the normal
3075              executable and the shared library.  */
3076           if (! info->shared
3077               && !h->def_regular)
3078             {
3079               h->root.u.def.section = s;
3080               h->root.u.def.value = h->plt.offset;
3081             }
3082
3083           /* Make room for this entry.  After the 8192nd entry, room
3084              for two entries is allocated.  */
3085           s->size += PLT_ENTRY_SIZE;
3086           if ((s->size - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
3087               > PLT_NUM_SINGLE_ENTRIES)
3088             s->size += PLT_ENTRY_SIZE;
3089
3090           /* We also need to make an entry in the .rela.plt section.  */
3091           htab->relplt->size += sizeof (Elf32_External_Rela);
3092         }
3093       else
3094         {
3095           h->plt.offset = (bfd_vma) -1;
3096           h->needs_plt = 0;
3097         }
3098     }
3099   else
3100     {
3101       h->plt.offset = (bfd_vma) -1;
3102       h->needs_plt = 0;
3103     }
3104
3105   eh = (struct ppc_elf_link_hash_entry *) h;
3106   if (eh->elf.got.refcount > 0)
3107     {
3108       /* Make sure this symbol is output as a dynamic symbol.  */
3109       if (eh->elf.dynindx == -1
3110           && !eh->elf.forced_local)
3111         {
3112           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
3113             return FALSE;
3114         }
3115
3116       if (eh->tls_mask == (TLS_TLS | TLS_LD)
3117           && !eh->elf.def_dynamic)
3118         /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
3119         eh->elf.got.offset = (bfd_vma) -1;
3120       else
3121         {
3122           bfd_boolean dyn;
3123           eh->elf.got.offset = htab->got->size;
3124           if ((eh->tls_mask & TLS_TLS) != 0)
3125             {
3126               if ((eh->tls_mask & TLS_LD) != 0)
3127                 htab->got->size += 8;
3128               if ((eh->tls_mask & TLS_GD) != 0)
3129                 htab->got->size += 8;
3130               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
3131                 htab->got->size += 4;
3132               if ((eh->tls_mask & TLS_DTPREL) != 0)
3133                 htab->got->size += 4;
3134             }
3135           else
3136             htab->got->size += 4;
3137           dyn = htab->elf.dynamic_sections_created;
3138           if ((info->shared
3139                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
3140               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
3141                   || eh->elf.root.type != bfd_link_hash_undefweak))
3142             {
3143               /* All the entries we allocated need relocs.  */
3144               htab->relgot->size
3145                 += ((htab->got->size - eh->elf.got.offset) / 4
3146                     * sizeof (Elf32_External_Rela));
3147               /* Except LD only needs one.  */
3148               if ((eh->tls_mask & TLS_LD) != 0)
3149                 htab->relgot->size -= sizeof (Elf32_External_Rela);
3150             }
3151         }
3152     }
3153   else
3154     eh->elf.got.offset = (bfd_vma) -1;
3155
3156   if (eh->dyn_relocs == NULL)
3157     return TRUE;
3158
3159   /* In the shared -Bsymbolic case, discard space allocated for
3160      dynamic pc-relative relocs against symbols which turn out to be
3161      defined in regular objects.  For the normal shared case, discard
3162      space for relocs that have become local due to symbol visibility
3163      changes.  */
3164
3165   if (info->shared)
3166     {
3167       /* Relocs that use pc_count are those that appear on a call insn,
3168          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
3169          generated via assembly.  We want calls to protected symbols to
3170          resolve directly to the function rather than going via the plt.
3171          If people want function pointer comparisons to work as expected
3172          then they should avoid writing weird assembly.  */
3173       if (SYMBOL_CALLS_LOCAL (info, h))
3174         {
3175           struct ppc_elf_dyn_relocs **pp;
3176
3177           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3178             {
3179               p->count -= p->pc_count;
3180               p->pc_count = 0;
3181               if (p->count == 0)
3182                 *pp = p->next;
3183               else
3184                 pp = &p->next;
3185             }
3186         }
3187
3188       /* Also discard relocs on undefined weak syms with non-default
3189          visibility.  */
3190       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3191           && h->root.type == bfd_link_hash_undefweak)
3192         eh->dyn_relocs = NULL;
3193
3194       /* Make sure undefined weak symbols are output as a dynamic symbol
3195          in PIEs.  */
3196       if (info->pie
3197           && eh->dyn_relocs != NULL
3198           && h->dynindx == -1
3199           && h->root.type == bfd_link_hash_undefweak
3200           && !h->forced_local)
3201         {
3202           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3203             return FALSE;
3204         }
3205     }
3206   else if (ELIMINATE_COPY_RELOCS)
3207     {
3208       /* For the non-shared case, discard space for relocs against
3209          symbols which turn out to need copy relocs or are not
3210          dynamic.  */
3211
3212       if (!h->non_got_ref
3213           && h->def_dynamic
3214           && !h->def_regular)
3215         {
3216           /* Make sure this symbol is output as a dynamic symbol.
3217              Undefined weak syms won't yet be marked as dynamic.  */
3218           if (h->dynindx == -1
3219               && !h->forced_local)
3220             {
3221               if (! bfd_elf_link_record_dynamic_symbol (info, h))
3222                 return FALSE;
3223             }
3224
3225           /* If that succeeded, we know we'll be keeping all the
3226              relocs.  */
3227           if (h->dynindx != -1)
3228             goto keep;
3229         }
3230
3231       eh->dyn_relocs = NULL;
3232
3233     keep: ;
3234     }
3235
3236   /* Finally, allocate space.  */
3237   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3238     {
3239       asection *sreloc = elf_section_data (p->sec)->sreloc;
3240       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3241     }
3242
3243   return TRUE;
3244 }
3245
3246 /* Find any dynamic relocs that apply to read-only sections.  */
3247
3248 static bfd_boolean
3249 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
3250 {
3251   struct ppc_elf_dyn_relocs *p;
3252
3253   if (h->root.type == bfd_link_hash_indirect)
3254     return TRUE;
3255
3256   if (h->root.type == bfd_link_hash_warning)
3257     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3258
3259   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3260     {
3261       asection *s = p->sec->output_section;
3262
3263       if (s != NULL
3264           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
3265               == (SEC_READONLY | SEC_ALLOC)))
3266         {
3267           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
3268
3269           /* Not an error, just cut short the traversal.  */
3270           return FALSE;
3271         }
3272     }
3273   return TRUE;
3274 }
3275
3276 /* Set the sizes of the dynamic sections.  */
3277
3278 static bfd_boolean
3279 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3280                                struct bfd_link_info *info)
3281 {
3282   struct ppc_elf_link_hash_table *htab;
3283   asection *s;
3284   bfd_boolean relocs;
3285   bfd *ibfd;
3286
3287 #ifdef DEBUG
3288   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
3289 #endif
3290
3291   htab = ppc_elf_hash_table (info);
3292   BFD_ASSERT (htab->elf.dynobj != NULL);
3293
3294   if (elf_hash_table (info)->dynamic_sections_created)
3295     {
3296       /* Set the contents of the .interp section to the interpreter.  */
3297       if (info->executable)
3298         {
3299           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
3300           BFD_ASSERT (s != NULL);
3301           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3302           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3303         }
3304     }
3305
3306   if (htab->tlsld_got.refcount > 0)
3307     {
3308       htab->tlsld_got.offset = htab->got->size;
3309       htab->got->size += 8;
3310       if (info->shared)
3311         htab->relgot->size += sizeof (Elf32_External_Rela);
3312     }
3313   else
3314     htab->tlsld_got.offset = (bfd_vma) -1;
3315
3316   /* Set up .got offsets for local syms, and space for local dynamic
3317      relocs.  */
3318   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3319     {
3320       bfd_signed_vma *local_got;
3321       bfd_signed_vma *end_local_got;
3322       char *lgot_masks;
3323       bfd_size_type locsymcount;
3324       Elf_Internal_Shdr *symtab_hdr;
3325       asection *srel;
3326
3327       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3328         continue;
3329
3330       for (s = ibfd->sections; s != NULL; s = s->next)
3331         {
3332           struct ppc_elf_dyn_relocs *p;
3333
3334           for (p = ((struct ppc_elf_dyn_relocs *)
3335                     elf_section_data (s)->local_dynrel);
3336                p != NULL;
3337                p = p->next)
3338             {
3339               if (!bfd_is_abs_section (p->sec)
3340                   && bfd_is_abs_section (p->sec->output_section))
3341                 {
3342                   /* Input section has been discarded, either because
3343                      it is a copy of a linkonce section or due to
3344                      linker script /DISCARD/, so we'll be discarding
3345                      the relocs too.  */
3346                 }
3347               else if (p->count != 0)
3348                 {
3349                   elf_section_data (p->sec)->sreloc->size
3350                     += p->count * sizeof (Elf32_External_Rela);
3351                   if ((p->sec->output_section->flags
3352                        & (SEC_READONLY | SEC_ALLOC))
3353                       == (SEC_READONLY | SEC_ALLOC))
3354                     info->flags |= DF_TEXTREL;
3355                 }
3356             }
3357         }
3358
3359       local_got = elf_local_got_refcounts (ibfd);
3360       if (!local_got)
3361         continue;
3362
3363       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3364       locsymcount = symtab_hdr->sh_info;
3365       end_local_got = local_got + locsymcount;
3366       lgot_masks = (char *) end_local_got;
3367       s = htab->got;
3368       srel = htab->relgot;
3369       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
3370         if (*local_got > 0)
3371           {
3372             if (*lgot_masks == (TLS_TLS | TLS_LD))
3373               {
3374                 /* If just an LD reloc, we'll just use
3375                    htab->tlsld_got.offset.  */
3376                 if (htab->tlsld_got.offset == (bfd_vma) -1)
3377                   {
3378                     htab->tlsld_got.offset = s->size;
3379                     s->size += 8;
3380                     if (info->shared)
3381                       srel->size += sizeof (Elf32_External_Rela);
3382                   }
3383                 *local_got = (bfd_vma) -1;
3384               }
3385             else
3386               {
3387                 *local_got = s->size;
3388                 if ((*lgot_masks & TLS_TLS) != 0)
3389                   {
3390                     if ((*lgot_masks & TLS_GD) != 0)
3391                       s->size += 8;
3392                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
3393                       s->size += 4;
3394                     if ((*lgot_masks & TLS_DTPREL) != 0)
3395                       s->size += 4;
3396                   }
3397                 else
3398                   s->size += 4;
3399                 if (info->shared)
3400                   srel->size += ((s->size - *local_got) / 4
3401                                  * sizeof (Elf32_External_Rela));
3402               }
3403           }
3404         else
3405           *local_got = (bfd_vma) -1;
3406     }
3407
3408   /* Allocate space for global sym dynamic relocs.  */
3409   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
3410
3411   /* We've now determined the sizes of the various dynamic sections.
3412      Allocate memory for them.  */
3413   relocs = FALSE;
3414   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
3415     {
3416       if ((s->flags & SEC_LINKER_CREATED) == 0)
3417         continue;
3418
3419       if (s == htab->plt
3420           || s == htab->got
3421           || (htab->sdata != NULL && s == htab->sdata->section)
3422           || (htab->sdata2 != NULL && s == htab->sdata2->section))
3423         {
3424           /* Strip this section if we don't need it; see the
3425              comment below.  */
3426         }
3427       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
3428         {
3429           if (s->size == 0)
3430             {
3431               /* If we don't need this section, strip it from the
3432                  output file.  This is mostly to handle .rela.bss and
3433                  .rela.plt.  We must create both sections in
3434                  create_dynamic_sections, because they must be created
3435                  before the linker maps input sections to output
3436                  sections.  The linker does that before
3437                  adjust_dynamic_symbol is called, and it is that
3438                  function which decides whether anything needs to go
3439                  into these sections.  */
3440             }
3441           else
3442             {
3443               /* Remember whether there are any relocation sections.  */
3444               relocs = TRUE;
3445
3446               /* We use the reloc_count field as a counter if we need
3447                  to copy relocs into the output file.  */
3448               s->reloc_count = 0;
3449             }
3450         }
3451       else
3452         {
3453           /* It's not one of our sections, so don't allocate space.  */
3454           continue;
3455         }
3456
3457       if (s->size == 0)
3458         {
3459           _bfd_strip_section_from_output (info, s);
3460           continue;
3461         }
3462
3463       /* Allocate memory for the section contents.  */
3464       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
3465       if (s->contents == NULL)
3466         return FALSE;
3467     }
3468
3469   if (htab->elf.dynamic_sections_created)
3470     {
3471       /* Add some entries to the .dynamic section.  We fill in the
3472          values later, in ppc_elf_finish_dynamic_sections, but we
3473          must add the entries now so that we get the correct size for
3474          the .dynamic section.  The DT_DEBUG entry is filled in by the
3475          dynamic linker and used by the debugger.  */
3476 #define add_dynamic_entry(TAG, VAL) \
3477   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3478
3479       if (info->executable)
3480         {
3481           if (!add_dynamic_entry (DT_DEBUG, 0))
3482             return FALSE;
3483         }
3484
3485       if (htab->plt != NULL && htab->plt->size != 0)
3486         {
3487           if (!add_dynamic_entry (DT_PLTGOT, 0)
3488               || !add_dynamic_entry (DT_PLTRELSZ, 0)
3489               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3490               || !add_dynamic_entry (DT_JMPREL, 0))
3491             return FALSE;
3492         }
3493
3494       if (relocs)
3495         {
3496           if (!add_dynamic_entry (DT_RELA, 0)
3497               || !add_dynamic_entry (DT_RELASZ, 0)
3498               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
3499             return FALSE;
3500         }
3501
3502       /* If any dynamic relocs apply to a read-only section, then we
3503          need a DT_TEXTREL entry.  */
3504       if ((info->flags & DF_TEXTREL) == 0)
3505         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
3506                                 info);
3507
3508       if ((info->flags & DF_TEXTREL) != 0)
3509         {
3510           if (!add_dynamic_entry (DT_TEXTREL, 0))
3511             return FALSE;
3512         }
3513     }
3514 #undef add_dynamic_entry
3515
3516   return TRUE;
3517 }
3518 \f
3519 static bfd_boolean
3520 update_local_sym_info (bfd *abfd,
3521                        Elf_Internal_Shdr *symtab_hdr,
3522                        unsigned long r_symndx,
3523                        int tls_type)
3524 {
3525   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
3526   char *local_got_tls_masks;
3527
3528   if (local_got_refcounts == NULL)
3529     {
3530       bfd_size_type size = symtab_hdr->sh_info;
3531
3532       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
3533       local_got_refcounts = bfd_zalloc (abfd, size);
3534       if (local_got_refcounts == NULL)
3535         return FALSE;
3536       elf_local_got_refcounts (abfd) = local_got_refcounts;
3537     }
3538
3539   local_got_refcounts[r_symndx] += 1;
3540   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3541   local_got_tls_masks[r_symndx] |= tls_type;
3542   return TRUE;
3543 }
3544
3545 static void
3546 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3547 {
3548   (*_bfd_error_handler)
3549     (_("%B: relocation %s cannot be used when making a shared object"),
3550      abfd,
3551      ppc_elf_howto_table[r_type]->name);
3552   bfd_set_error (bfd_error_bad_value);
3553 }
3554
3555 /* Look through the relocs for a section during the first phase, and
3556    allocate space in the global offset table or procedure linkage
3557    table.  */
3558
3559 static bfd_boolean
3560 ppc_elf_check_relocs (bfd *abfd,
3561                       struct bfd_link_info *info,
3562                       asection *sec,
3563                       const Elf_Internal_Rela *relocs)
3564 {
3565   struct ppc_elf_link_hash_table *htab;
3566   Elf_Internal_Shdr *symtab_hdr;
3567   struct elf_link_hash_entry **sym_hashes;
3568   const Elf_Internal_Rela *rel;
3569   const Elf_Internal_Rela *rel_end;
3570   asection *sreloc;
3571
3572   if (info->relocatable)
3573     return TRUE;
3574
3575 #ifdef DEBUG
3576   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
3577                       sec, abfd);
3578 #endif
3579
3580   /* Initialize howto table if not already done.  */
3581   if (!ppc_elf_howto_table[R_PPC_ADDR32])
3582     ppc_elf_howto_init ();
3583
3584   /* Create the linker generated sections all the time so that the
3585      special symbols are created.  */
3586   htab = ppc_elf_hash_table (info);
3587   if (htab->sdata == NULL)
3588     {
3589       htab->sdata = ppc_elf_create_linker_section (abfd, info,
3590                                                    LINKER_SECTION_SDATA);
3591       if (htab->sdata == NULL)
3592         return FALSE;
3593     }
3594
3595   if (htab->sdata2 == NULL)
3596     {
3597       htab->sdata2 = ppc_elf_create_linker_section (abfd, info,
3598                                                     LINKER_SECTION_SDATA2);
3599       if (htab->sdata2 == NULL)
3600         return FALSE;
3601     }
3602
3603   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3604   sym_hashes = elf_sym_hashes (abfd);
3605   sreloc = NULL;
3606
3607   rel_end = relocs + sec->reloc_count;
3608   for (rel = relocs; rel < rel_end; rel++)
3609     {
3610       unsigned long r_symndx;
3611       enum elf_ppc_reloc_type r_type;
3612       struct elf_link_hash_entry *h;
3613       int tls_type = 0;
3614
3615       r_symndx = ELF32_R_SYM (rel->r_info);
3616       if (r_symndx < symtab_hdr->sh_info)
3617         h = NULL;
3618       else
3619         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3620
3621       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3622          This shows up in particular in an R_PPC_ADDR32 in the eabi
3623          startup code.  */
3624       if (h && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3625         {
3626           if (htab->got == NULL)
3627             {
3628               if (htab->elf.dynobj == NULL)
3629                 htab->elf.dynobj = abfd;
3630               if (!ppc_elf_create_got (htab->elf.dynobj, info))
3631                 return FALSE;
3632             }
3633         }
3634
3635       r_type = ELF32_R_TYPE (rel->r_info);
3636       switch (r_type)
3637         {
3638         case R_PPC_GOT_TLSLD16:
3639         case R_PPC_GOT_TLSLD16_LO:
3640         case R_PPC_GOT_TLSLD16_HI:
3641         case R_PPC_GOT_TLSLD16_HA:
3642           htab->tlsld_got.refcount += 1;
3643           tls_type = TLS_TLS | TLS_LD;
3644           goto dogottls;
3645
3646         case R_PPC_GOT_TLSGD16:
3647         case R_PPC_GOT_TLSGD16_LO:
3648         case R_PPC_GOT_TLSGD16_HI:
3649         case R_PPC_GOT_TLSGD16_HA:
3650           tls_type = TLS_TLS | TLS_GD;
3651           goto dogottls;
3652
3653         case R_PPC_GOT_TPREL16:
3654         case R_PPC_GOT_TPREL16_LO:
3655         case R_PPC_GOT_TPREL16_HI:
3656         case R_PPC_GOT_TPREL16_HA:
3657           if (info->shared)
3658             info->flags |= DF_STATIC_TLS;
3659           tls_type = TLS_TLS | TLS_TPREL;
3660           goto dogottls;
3661
3662         case R_PPC_GOT_DTPREL16:
3663         case R_PPC_GOT_DTPREL16_LO:
3664         case R_PPC_GOT_DTPREL16_HI:
3665         case R_PPC_GOT_DTPREL16_HA:
3666           tls_type = TLS_TLS | TLS_DTPREL;
3667         dogottls:
3668           sec->has_tls_reloc = 1;
3669           /* Fall thru */
3670
3671           /* GOT16 relocations */
3672         case R_PPC_GOT16:
3673         case R_PPC_GOT16_LO:
3674         case R_PPC_GOT16_HI:
3675         case R_PPC_GOT16_HA:
3676           /* This symbol requires a global offset table entry.  */
3677           if (htab->got == NULL)
3678             {
3679               if (htab->elf.dynobj == NULL)
3680                 htab->elf.dynobj = abfd;
3681               if (!ppc_elf_create_got (htab->elf.dynobj, info))
3682                 return FALSE;
3683             }
3684           if (h != NULL)
3685             {
3686               h->got.refcount += 1;
3687               ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3688             }
3689           else
3690             /* This is a global offset table entry for a local symbol.  */
3691             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3692               return FALSE;
3693           break;
3694
3695           /* Indirect .sdata relocation.  */
3696         case R_PPC_EMB_SDAI16:
3697           if (info->shared)
3698             {
3699               bad_shared_reloc (abfd, r_type);
3700               return FALSE;
3701             }
3702           if (!elf_create_pointer_linker_section (abfd, info,
3703                                                   htab->sdata, h, rel))
3704             return FALSE;
3705           break;
3706
3707           /* Indirect .sdata2 relocation.  */
3708         case R_PPC_EMB_SDA2I16:
3709           if (info->shared)
3710             {
3711               bad_shared_reloc (abfd, r_type);
3712               return FALSE;
3713             }
3714           if (!elf_create_pointer_linker_section (abfd, info,
3715                                                   htab->sdata2, h, rel))
3716             return FALSE;
3717           break;
3718
3719         case R_PPC_SDAREL16:
3720         case R_PPC_EMB_SDA2REL:
3721         case R_PPC_EMB_SDA21:
3722         case R_PPC_EMB_RELSDA:
3723         case R_PPC_EMB_NADDR32:
3724         case R_PPC_EMB_NADDR16:
3725         case R_PPC_EMB_NADDR16_LO:
3726         case R_PPC_EMB_NADDR16_HI:
3727         case R_PPC_EMB_NADDR16_HA:
3728           if (info->shared)
3729             {
3730               bad_shared_reloc (abfd, r_type);
3731               return FALSE;
3732             }
3733           break;
3734
3735         case R_PPC_PLT32:
3736         case R_PPC_PLTREL24:
3737         case R_PPC_PLTREL32:
3738         case R_PPC_PLT16_LO:
3739         case R_PPC_PLT16_HI:
3740         case R_PPC_PLT16_HA:
3741 #ifdef DEBUG
3742           fprintf (stderr, "Reloc requires a PLT entry\n");
3743 #endif
3744           /* This symbol requires a procedure linkage table entry.  We
3745              actually build the entry in finish_dynamic_symbol,
3746              because this might be a case of linking PIC code without
3747              linking in any dynamic objects, in which case we don't
3748              need to generate a procedure linkage table after all.  */
3749
3750           if (h == NULL)
3751             {
3752               /* It does not make sense to have a procedure linkage
3753                  table entry for a local symbol.  */
3754               (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
3755                                        "local symbol"),
3756                                      abfd,
3757                                      sec,
3758                                      (long) rel->r_offset,
3759                                      ppc_elf_howto_table[r_type]->name);
3760               bfd_set_error (bfd_error_bad_value);
3761               return FALSE;
3762             }
3763
3764           h->needs_plt = 1;
3765           h->plt.refcount++;
3766           break;
3767
3768           /* The following relocations don't need to propagate the
3769              relocation if linking a shared object since they are
3770              section relative.  */
3771         case R_PPC_SECTOFF:
3772         case R_PPC_SECTOFF_LO:
3773         case R_PPC_SECTOFF_HI:
3774         case R_PPC_SECTOFF_HA:
3775         case R_PPC_DTPREL16:
3776         case R_PPC_DTPREL16_LO:
3777         case R_PPC_DTPREL16_HI:
3778         case R_PPC_DTPREL16_HA:
3779         case R_PPC_TOC16:
3780           break;
3781
3782           /* This are just markers.  */
3783         case R_PPC_TLS:
3784         case R_PPC_EMB_MRKREF:
3785         case R_PPC_NONE:
3786         case R_PPC_max:
3787           break;
3788
3789           /* These should only appear in dynamic objects.  */
3790         case R_PPC_COPY:
3791         case R_PPC_GLOB_DAT:
3792         case R_PPC_JMP_SLOT:
3793         case R_PPC_RELATIVE:
3794           break;
3795
3796           /* These aren't handled yet.  We'll report an error later.  */
3797         case R_PPC_ADDR30:
3798         case R_PPC_EMB_RELSEC16:
3799         case R_PPC_EMB_RELST_LO:
3800         case R_PPC_EMB_RELST_HI:
3801         case R_PPC_EMB_RELST_HA:
3802         case R_PPC_EMB_BIT_FLD:
3803           break;
3804
3805           /* This refers only to functions defined in the shared library.  */
3806         case R_PPC_LOCAL24PC:
3807           break;
3808
3809           /* This relocation describes the C++ object vtable hierarchy.
3810              Reconstruct it for later use during GC.  */
3811         case R_PPC_GNU_VTINHERIT:
3812           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3813             return FALSE;
3814           break;
3815
3816           /* This relocation describes which C++ vtable entries are actually
3817              used.  Record for later use during GC.  */
3818         case R_PPC_GNU_VTENTRY:
3819           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3820             return FALSE;
3821           break;
3822
3823           /* We shouldn't really be seeing these.  */
3824         case R_PPC_TPREL32:
3825           if (info->shared)
3826             info->flags |= DF_STATIC_TLS;
3827           goto dodyn;
3828
3829           /* Nor these.  */
3830         case R_PPC_DTPMOD32:
3831         case R_PPC_DTPREL32:
3832           goto dodyn;
3833
3834         case R_PPC_TPREL16:
3835         case R_PPC_TPREL16_LO:
3836         case R_PPC_TPREL16_HI:
3837         case R_PPC_TPREL16_HA:
3838           if (info->shared)
3839             info->flags |= DF_STATIC_TLS;
3840           goto dodyn;
3841
3842           /* When creating a shared object, we must copy these
3843              relocs into the output file.  We create a reloc
3844              section in dynobj and make room for the reloc.  */
3845         case R_PPC_REL24:
3846         case R_PPC_REL14:
3847         case R_PPC_REL14_BRTAKEN:
3848         case R_PPC_REL14_BRNTAKEN:
3849         case R_PPC_REL32:
3850           if (h == NULL
3851               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3852             break;
3853           /* fall through */
3854
3855         case R_PPC_ADDR32:
3856         case R_PPC_ADDR24:
3857         case R_PPC_ADDR16:
3858         case R_PPC_ADDR16_LO:
3859         case R_PPC_ADDR16_HI:
3860         case R_PPC_ADDR16_HA:
3861         case R_PPC_ADDR14:
3862         case R_PPC_ADDR14_BRTAKEN:
3863         case R_PPC_ADDR14_BRNTAKEN:
3864         case R_PPC_UADDR32:
3865         case R_PPC_UADDR16:
3866           if (h != NULL && !info->shared)
3867             {
3868               /* We may need a plt entry if the symbol turns out to be
3869                  a function defined in a dynamic object.  */
3870               h->plt.refcount++;
3871
3872               /* We may need a copy reloc too.  */
3873               h->non_got_ref = 1;
3874             }
3875
3876         dodyn:
3877           /* If we are creating a shared library, and this is a reloc
3878              against a global symbol, or a non PC relative reloc
3879              against a local symbol, then we need to copy the reloc
3880              into the shared library.  However, if we are linking with
3881              -Bsymbolic, we do not need to copy a reloc against a
3882              global symbol which is defined in an object we are
3883              including in the link (i.e., DEF_REGULAR is set).  At
3884              this point we have not seen all the input files, so it is
3885              possible that DEF_REGULAR is not set now but will be set
3886              later (it is never cleared).  In case of a weak definition,
3887              DEF_REGULAR may be cleared later by a strong definition in
3888              a shared library.  We account for that possibility below by
3889              storing information in the dyn_relocs field of the hash
3890              table entry.  A similar situation occurs when creating
3891              shared libraries and symbol visibility changes render the
3892              symbol local.
3893
3894              If on the other hand, we are creating an executable, we
3895              may need to keep relocations for symbols satisfied by a
3896              dynamic library if we manage to avoid copy relocs for the
3897              symbol.  */
3898           if ((info->shared
3899                && (MUST_BE_DYN_RELOC (r_type)
3900                    || (h != NULL
3901                        && (! info->symbolic
3902                            || h->root.type == bfd_link_hash_defweak
3903                            || !h->def_regular))))
3904               || (ELIMINATE_COPY_RELOCS
3905                   && !info->shared
3906                   && (sec->flags & SEC_ALLOC) != 0
3907                   && h != NULL
3908                   && (h->root.type == bfd_link_hash_defweak
3909                       || !h->def_regular)))
3910             {
3911               struct ppc_elf_dyn_relocs *p;
3912               struct ppc_elf_dyn_relocs **head;
3913
3914 #ifdef DEBUG
3915               fprintf (stderr,
3916                        "ppc_elf_check_relocs needs to "
3917                        "create relocation for %s\n",
3918                        (h && h->root.root.string
3919                         ? h->root.root.string : "<unknown>"));
3920 #endif
3921               if (sreloc == NULL)
3922                 {
3923                   const char *name;
3924
3925                   name = (bfd_elf_string_from_elf_section
3926                           (abfd,
3927                            elf_elfheader (abfd)->e_shstrndx,
3928                            elf_section_data (sec)->rel_hdr.sh_name));
3929                   if (name == NULL)
3930                     return FALSE;
3931
3932                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3933                               && strcmp (bfd_get_section_name (abfd, sec),
3934                                          name + 5) == 0);
3935
3936                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
3937                   if (sreloc == NULL)
3938                     {
3939                       flagword flags;
3940
3941                       sreloc = bfd_make_section (htab->elf.dynobj, name);
3942                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
3943                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3944                       if ((sec->flags & SEC_ALLOC) != 0)
3945                         flags |= SEC_ALLOC | SEC_LOAD;
3946                       if (sreloc == NULL
3947                           || ! bfd_set_section_flags (htab->elf.dynobj,
3948                                                       sreloc, flags)
3949                           || ! bfd_set_section_alignment (htab->elf.dynobj,
3950                                                           sreloc, 2))
3951                         return FALSE;
3952                     }
3953                   elf_section_data (sec)->sreloc = sreloc;
3954                 }
3955
3956               /* If this is a global symbol, we count the number of
3957                  relocations we need for this symbol.  */
3958               if (h != NULL)
3959                 {
3960                   head = &ppc_elf_hash_entry (h)->dyn_relocs;
3961                 }
3962               else
3963                 {
3964                   /* Track dynamic relocs needed for local syms too.
3965                      We really need local syms available to do this
3966                      easily.  Oh well.  */
3967
3968                   asection *s;
3969                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
3970                                                  sec, r_symndx);
3971                   if (s == NULL)
3972                     return FALSE;
3973
3974                   head = ((struct ppc_elf_dyn_relocs **)
3975                           &elf_section_data (s)->local_dynrel);
3976                 }
3977
3978               p = *head;
3979               if (p == NULL || p->sec != sec)
3980                 {
3981                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3982                   if (p == NULL)
3983                     return FALSE;
3984                   p->next = *head;
3985                   *head = p;
3986                   p->sec = sec;
3987                   p->count = 0;
3988                   p->pc_count = 0;
3989                 }
3990
3991               p->count += 1;
3992               if (!MUST_BE_DYN_RELOC (r_type))
3993                 p->pc_count += 1;
3994             }
3995
3996           break;
3997         }
3998     }
3999
4000   return TRUE;
4001 }
4002
4003 /* Return the section that should be marked against GC for a given
4004    relocation.  */
4005
4006 static asection *
4007 ppc_elf_gc_mark_hook (asection *sec,
4008                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
4009                       Elf_Internal_Rela *rel,
4010                       struct elf_link_hash_entry *h,
4011                       Elf_Internal_Sym *sym)
4012 {
4013   if (h != NULL)
4014     {
4015       switch (ELF32_R_TYPE (rel->r_info))
4016         {
4017         case R_PPC_GNU_VTINHERIT:
4018         case R_PPC_GNU_VTENTRY:
4019           break;
4020
4021         default:
4022           switch (h->root.type)
4023             {
4024             case bfd_link_hash_defined:
4025             case bfd_link_hash_defweak:
4026               return h->root.u.def.section;
4027
4028             case bfd_link_hash_common:
4029               return h->root.u.c.p->section;
4030
4031             default:
4032               break;
4033             }
4034         }
4035     }
4036   else
4037     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4038
4039   return NULL;
4040 }
4041
4042 /* Update the got, plt and dynamic reloc reference counts for the
4043    section being removed.  */
4044
4045 static bfd_boolean
4046 ppc_elf_gc_sweep_hook (bfd *abfd,
4047                        struct bfd_link_info *info,
4048                        asection *sec,
4049                        const Elf_Internal_Rela *relocs)
4050 {
4051   struct ppc_elf_link_hash_table *htab;
4052   Elf_Internal_Shdr *symtab_hdr;
4053   struct elf_link_hash_entry **sym_hashes;
4054   bfd_signed_vma *local_got_refcounts;
4055   const Elf_Internal_Rela *rel, *relend;
4056
4057   elf_section_data (sec)->local_dynrel = NULL;
4058
4059   htab = ppc_elf_hash_table (info);
4060   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4061   sym_hashes = elf_sym_hashes (abfd);
4062   local_got_refcounts = elf_local_got_refcounts (abfd);
4063
4064   relend = relocs + sec->reloc_count;
4065   for (rel = relocs; rel < relend; rel++)
4066     {
4067       unsigned long r_symndx;
4068       enum elf_ppc_reloc_type r_type;
4069       struct elf_link_hash_entry *h = NULL;
4070
4071       r_symndx = ELF32_R_SYM (rel->r_info);
4072       if (r_symndx >= symtab_hdr->sh_info)
4073         {
4074           struct ppc_elf_dyn_relocs **pp, *p;
4075           struct ppc_elf_link_hash_entry *eh;
4076
4077           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4078           eh = (struct ppc_elf_link_hash_entry *) h;
4079
4080           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4081             if (p->sec == sec)
4082               {
4083                 /* Everything must go for SEC.  */
4084                 *pp = p->next;
4085                 break;
4086               }
4087         }
4088
4089       r_type = ELF32_R_TYPE (rel->r_info);
4090       switch (r_type)
4091         {
4092         case R_PPC_GOT_TLSLD16:
4093         case R_PPC_GOT_TLSLD16_LO:
4094         case R_PPC_GOT_TLSLD16_HI:
4095         case R_PPC_GOT_TLSLD16_HA:
4096           htab->tlsld_got.refcount -= 1;
4097           /* Fall thru */
4098
4099         case R_PPC_GOT_TLSGD16:
4100         case R_PPC_GOT_TLSGD16_LO:
4101         case R_PPC_GOT_TLSGD16_HI:
4102         case R_PPC_GOT_TLSGD16_HA:
4103         case R_PPC_GOT_TPREL16:
4104         case R_PPC_GOT_TPREL16_LO:
4105         case R_PPC_GOT_TPREL16_HI:
4106         case R_PPC_GOT_TPREL16_HA:
4107         case R_PPC_GOT_DTPREL16:
4108         case R_PPC_GOT_DTPREL16_LO:
4109         case R_PPC_GOT_DTPREL16_HI:
4110         case R_PPC_GOT_DTPREL16_HA:
4111         case R_PPC_GOT16:
4112         case R_PPC_GOT16_LO:
4113         case R_PPC_GOT16_HI:
4114         case R_PPC_GOT16_HA:
4115           if (h != NULL)
4116             {
4117               if (h->got.refcount > 0)
4118                 h->got.refcount--;
4119             }
4120           else if (local_got_refcounts != NULL)
4121             {
4122               if (local_got_refcounts[r_symndx] > 0)
4123                 local_got_refcounts[r_symndx]--;
4124             }
4125           break;
4126
4127         case R_PPC_REL24:
4128         case R_PPC_REL14:
4129         case R_PPC_REL14_BRTAKEN:
4130         case R_PPC_REL14_BRNTAKEN:
4131         case R_PPC_REL32:
4132           if (h == NULL
4133               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
4134             break;
4135           /* Fall thru */
4136
4137         case R_PPC_ADDR32:
4138         case R_PPC_ADDR24:
4139         case R_PPC_ADDR16:
4140         case R_PPC_ADDR16_LO:
4141         case R_PPC_ADDR16_HI:
4142         case R_PPC_ADDR16_HA:
4143         case R_PPC_ADDR14:
4144         case R_PPC_ADDR14_BRTAKEN:
4145         case R_PPC_ADDR14_BRNTAKEN:
4146         case R_PPC_UADDR32:
4147         case R_PPC_UADDR16:
4148         case R_PPC_PLT32:
4149         case R_PPC_PLTREL24:
4150         case R_PPC_PLT16_LO:
4151         case R_PPC_PLT16_HI:
4152         case R_PPC_PLT16_HA:
4153           if (h != NULL)
4154             {
4155               if (h->plt.refcount > 0)
4156                 h->plt.refcount--;
4157             }
4158           break;
4159
4160         default:
4161           break;
4162         }
4163     }
4164   return TRUE;
4165 }
4166
4167 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
4168
4169 asection *
4170 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4171 {
4172   struct ppc_elf_link_hash_table *htab;
4173
4174   htab = ppc_elf_hash_table (info);
4175   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4176                                              FALSE, FALSE, TRUE);
4177
4178   return _bfd_elf_tls_setup (obfd, info);
4179 }
4180
4181 /* Run through all the TLS relocs looking for optimization
4182    opportunities.  */
4183
4184 bfd_boolean
4185 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4186                       struct bfd_link_info *info)
4187 {
4188   bfd *ibfd;
4189   asection *sec;
4190   struct ppc_elf_link_hash_table *htab;
4191
4192   if (info->relocatable || info->shared)
4193     return TRUE;
4194
4195   htab = ppc_elf_hash_table (info);
4196   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4197     {
4198       Elf_Internal_Sym *locsyms = NULL;
4199       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4200
4201       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4202         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4203           {
4204             Elf_Internal_Rela *relstart, *rel, *relend;
4205             int expecting_tls_get_addr;
4206
4207             /* Read the relocations.  */
4208             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4209                                                   info->keep_memory);
4210             if (relstart == NULL)
4211               return FALSE;
4212
4213             expecting_tls_get_addr = 0;
4214             relend = relstart + sec->reloc_count;
4215             for (rel = relstart; rel < relend; rel++)
4216               {
4217                 enum elf_ppc_reloc_type r_type;
4218                 unsigned long r_symndx;
4219                 struct elf_link_hash_entry *h = NULL;
4220                 char *tls_mask;
4221                 char tls_set, tls_clear;
4222                 bfd_boolean is_local;
4223
4224                 r_symndx = ELF32_R_SYM (rel->r_info);
4225                 if (r_symndx >= symtab_hdr->sh_info)
4226                   {
4227                     struct elf_link_hash_entry **sym_hashes;
4228
4229                     sym_hashes = elf_sym_hashes (ibfd);
4230                     h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4231                     while (h->root.type == bfd_link_hash_indirect
4232                            || h->root.type == bfd_link_hash_warning)
4233                       h = (struct elf_link_hash_entry *) h->root.u.i.link;
4234                   }
4235
4236                 is_local = FALSE;
4237                 if (h == NULL
4238                     || !h->def_dynamic)
4239                   is_local = TRUE;
4240
4241                 r_type = ELF32_R_TYPE (rel->r_info);
4242                 switch (r_type)
4243                   {
4244                   case R_PPC_GOT_TLSLD16:
4245                   case R_PPC_GOT_TLSLD16_LO:
4246                   case R_PPC_GOT_TLSLD16_HI:
4247                   case R_PPC_GOT_TLSLD16_HA:
4248                     /* These relocs should never be against a symbol
4249                        defined in a shared lib.  Leave them alone if
4250                        that turns out to be the case.  */
4251                     expecting_tls_get_addr = 0;
4252                     htab->tlsld_got.refcount -= 1;
4253                     if (!is_local)
4254                       continue;
4255
4256                     /* LD -> LE */
4257                     tls_set = 0;
4258                     tls_clear = TLS_LD;
4259                     expecting_tls_get_addr = 1;
4260                     break;
4261
4262                   case R_PPC_GOT_TLSGD16:
4263                   case R_PPC_GOT_TLSGD16_LO:
4264                   case R_PPC_GOT_TLSGD16_HI:
4265                   case R_PPC_GOT_TLSGD16_HA:
4266                     if (is_local)
4267                       /* GD -> LE */
4268                       tls_set = 0;
4269                     else
4270                       /* GD -> IE */
4271                       tls_set = TLS_TLS | TLS_TPRELGD;
4272                     tls_clear = TLS_GD;
4273                     expecting_tls_get_addr = 1;
4274                     break;
4275
4276                   case R_PPC_GOT_TPREL16:
4277                   case R_PPC_GOT_TPREL16_LO:
4278                   case R_PPC_GOT_TPREL16_HI:
4279                   case R_PPC_GOT_TPREL16_HA:
4280                     expecting_tls_get_addr = 0;
4281                     if (is_local)
4282                       {
4283                         /* IE -> LE */
4284                         tls_set = 0;
4285                         tls_clear = TLS_TPREL;
4286                         break;
4287                       }
4288                     else
4289                       continue;
4290
4291                   case R_PPC_REL14:
4292                   case R_PPC_REL14_BRTAKEN:
4293                   case R_PPC_REL14_BRNTAKEN:
4294                   case R_PPC_REL24:
4295                     if (expecting_tls_get_addr
4296                         && h != NULL
4297                         && h == htab->tls_get_addr)
4298                       {
4299                         if (h->plt.refcount > 0)
4300                           h->plt.refcount -= 1;
4301                       }
4302                     expecting_tls_get_addr = 0;
4303                     continue;
4304
4305                   default:
4306                     expecting_tls_get_addr = 0;
4307                     continue;
4308                   }
4309
4310                 if (h != NULL)
4311                   {
4312                     if (tls_set == 0)
4313                       {
4314                         /* We managed to get rid of a got entry.  */
4315                         if (h->got.refcount > 0)
4316                           h->got.refcount -= 1;
4317                       }
4318                     tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4319                   }
4320                 else
4321                   {
4322                     Elf_Internal_Sym *sym;
4323                     bfd_signed_vma *lgot_refs;
4324                     char *lgot_masks;
4325
4326                     if (locsyms == NULL)
4327                       {
4328                         locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4329                         if (locsyms == NULL)
4330                           locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4331                                                           symtab_hdr->sh_info,
4332                                                           0, NULL, NULL, NULL);
4333                         if (locsyms == NULL)
4334                           {
4335                             if (elf_section_data (sec)->relocs != relstart)
4336                               free (relstart);
4337                             return FALSE;
4338                           }
4339                       }
4340                     sym = locsyms + r_symndx;
4341                     lgot_refs = elf_local_got_refcounts (ibfd);
4342                     if (lgot_refs == NULL)
4343                       abort ();
4344                     if (tls_set == 0)
4345                       {
4346                         /* We managed to get rid of a got entry.  */
4347                         if (lgot_refs[r_symndx] > 0)
4348                           lgot_refs[r_symndx] -= 1;
4349                       }
4350                     lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
4351                     tls_mask = &lgot_masks[r_symndx];
4352                   }
4353
4354                 *tls_mask |= tls_set;
4355                 *tls_mask &= ~tls_clear;
4356               }
4357
4358             if (elf_section_data (sec)->relocs != relstart)
4359               free (relstart);
4360           }
4361
4362       if (locsyms != NULL
4363           && (symtab_hdr->contents != (unsigned char *) locsyms))
4364         {
4365           if (!info->keep_memory)
4366             free (locsyms);
4367           else
4368             symtab_hdr->contents = (unsigned char *) locsyms;
4369         }
4370     }
4371   return TRUE;
4372 }
4373 \f
4374 /* Hook called by the linker routine which adds symbols from an object
4375    file.  We use it to put .comm items in .sbss, and not .bss.  */
4376
4377 static bfd_boolean
4378 ppc_elf_add_symbol_hook (bfd *abfd,
4379                          struct bfd_link_info *info,
4380                          Elf_Internal_Sym *sym,
4381                          const char **namep ATTRIBUTE_UNUSED,
4382                          flagword *flagsp ATTRIBUTE_UNUSED,
4383                          asection **secp,
4384                          bfd_vma *valp)
4385 {
4386   if (sym->st_shndx == SHN_COMMON
4387       && !info->relocatable
4388       && sym->st_size <= elf_gp_size (abfd)
4389       && (info->hash->creator == abfd->xvec
4390           || info->hash->creator == abfd->xvec->alternative_target))
4391     {
4392       /* Common symbols less than or equal to -G nn bytes are automatically
4393          put into .sbss.  */
4394       struct ppc_elf_link_hash_table *htab;
4395
4396       htab = ppc_elf_hash_table (info);
4397       if (htab->sbss == NULL)
4398         {
4399           flagword flags = SEC_IS_COMMON;
4400
4401           htab->sbss = bfd_make_section_anyway (abfd, ".sbss");
4402           if (htab->sbss == NULL
4403               || ! bfd_set_section_flags (abfd, htab->sbss, flags))
4404             return FALSE;
4405         }
4406
4407       *secp = htab->sbss;
4408       *valp = sym->st_size;
4409     }
4410
4411   return TRUE;
4412 }
4413 \f
4414 /* Finish up dynamic symbol handling.  We set the contents of various
4415    dynamic sections here.  */
4416
4417 static bfd_boolean
4418 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
4419                                struct bfd_link_info *info,
4420                                struct elf_link_hash_entry *h,
4421                                Elf_Internal_Sym *sym)
4422 {
4423   struct ppc_elf_link_hash_table *htab;
4424
4425 #ifdef DEBUG
4426   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
4427            h->root.root.string);
4428 #endif
4429
4430   htab = ppc_elf_hash_table (info);
4431   BFD_ASSERT (htab->elf.dynobj != NULL);
4432
4433   if (h->plt.offset != (bfd_vma) -1)
4434     {
4435       Elf_Internal_Rela rela;
4436       bfd_byte *loc;
4437       bfd_vma reloc_index;
4438
4439 #ifdef DEBUG
4440       fprintf (stderr, ", plt_offset = %d", h->plt.offset);
4441 #endif
4442
4443       /* This symbol has an entry in the procedure linkage table.  Set
4444          it up.  */
4445
4446       BFD_ASSERT (h->dynindx != -1);
4447       BFD_ASSERT (htab->plt != NULL && htab->relplt != NULL);
4448
4449       /* We don't need to fill in the .plt.  The ppc dynamic linker
4450          will fill it in.  */
4451
4452       /* Fill in the entry in the .rela.plt section.  */
4453       rela.r_offset = (htab->plt->output_section->vma
4454                        + htab->plt->output_offset
4455                        + h->plt.offset);
4456       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
4457       rela.r_addend = 0;
4458
4459       reloc_index = (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_SLOT_SIZE;
4460       if (reloc_index > PLT_NUM_SINGLE_ENTRIES)
4461         reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
4462       loc = (htab->relplt->contents
4463              + reloc_index * sizeof (Elf32_External_Rela));
4464       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4465
4466       if (!h->def_regular)
4467         {
4468           /* Mark the symbol as undefined, rather than as defined in
4469              the .plt section.  Leave the value alone.  */
4470           sym->st_shndx = SHN_UNDEF;
4471           /* If the symbol is weak, we do need to clear the value.
4472              Otherwise, the PLT entry would provide a definition for
4473              the symbol even if the symbol wasn't defined anywhere,
4474              and so the symbol would never be NULL.  */
4475           if (!h->ref_regular_nonweak)
4476             sym->st_value = 0;
4477         }
4478     }
4479
4480   if (h->needs_copy)
4481     {
4482       asection *s;
4483       Elf_Internal_Rela rela;
4484       bfd_byte *loc;
4485
4486       /* This symbols needs a copy reloc.  Set it up.  */
4487
4488 #ifdef DEBUG
4489       fprintf (stderr, ", copy");
4490 #endif
4491
4492       BFD_ASSERT (h->dynindx != -1);
4493
4494       if (h->size <= elf_gp_size (htab->elf.dynobj))
4495         s = htab->relsbss;
4496       else
4497         s = htab->relbss;
4498       BFD_ASSERT (s != NULL);
4499
4500       rela.r_offset = (h->root.u.def.value
4501                        + h->root.u.def.section->output_section->vma
4502                        + h->root.u.def.section->output_offset);
4503       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
4504       rela.r_addend = 0;
4505       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4506       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4507     }
4508
4509 #ifdef DEBUG
4510   fprintf (stderr, "\n");
4511 #endif
4512
4513   /* Mark some specially defined symbols as absolute.  */
4514   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4515       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
4516       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
4517     sym->st_shndx = SHN_ABS;
4518
4519   return TRUE;
4520 }
4521 \f
4522 /* Finish up the dynamic sections.  */
4523
4524 static bfd_boolean
4525 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
4526                                  struct bfd_link_info *info)
4527 {
4528   asection *sdyn;
4529   struct ppc_elf_link_hash_table *htab;
4530
4531 #ifdef DEBUG
4532   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
4533 #endif
4534
4535   htab = ppc_elf_hash_table (info);
4536   sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
4537
4538   if (htab->elf.dynamic_sections_created)
4539     {
4540       Elf32_External_Dyn *dyncon, *dynconend;
4541
4542       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
4543
4544       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4545       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4546       for (; dyncon < dynconend; dyncon++)
4547         {
4548           Elf_Internal_Dyn dyn;
4549           asection *s;
4550
4551           bfd_elf32_swap_dyn_in (htab->elf.dynobj, dyncon, &dyn);
4552
4553           switch (dyn.d_tag)
4554             {
4555             case DT_PLTGOT:
4556               s = htab->plt;
4557               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4558               break;
4559
4560             case DT_PLTRELSZ:
4561               dyn.d_un.d_val = htab->relplt->size;
4562               break;
4563
4564             case DT_JMPREL:
4565               s = htab->relplt;
4566               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4567               break;
4568
4569             default:
4570               continue;
4571             }
4572
4573           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4574         }
4575     }
4576
4577   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
4578      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
4579   if (htab->got)
4580     {
4581       unsigned char *contents = htab->got->contents;
4582       bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents);
4583
4584       if (sdyn == NULL)
4585         bfd_put_32 (output_bfd, 0, contents + 4);
4586       else
4587         bfd_put_32 (output_bfd,
4588                     sdyn->output_section->vma + sdyn->output_offset,
4589                     contents + 4);
4590
4591       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
4592     }
4593
4594   return TRUE;
4595 }
4596 \f
4597 /* The RELOCATE_SECTION function is called by the ELF backend linker
4598    to handle the relocations for a section.
4599
4600    The relocs are always passed as Rela structures; if the section
4601    actually uses Rel structures, the r_addend field will always be
4602    zero.
4603
4604    This function is responsible for adjust the section contents as
4605    necessary, and (if using Rela relocs and generating a
4606    relocatable output file) adjusting the reloc addend as
4607    necessary.
4608
4609    This function does not have to worry about setting the reloc
4610    address or the reloc symbol index.
4611
4612    LOCAL_SYMS is a pointer to the swapped in local symbols.
4613
4614    LOCAL_SECTIONS is an array giving the section in the input file
4615    corresponding to the st_shndx field of each local symbol.
4616
4617    The global hash table entry for the global symbols can be found
4618    via elf_sym_hashes (input_bfd).
4619
4620    When generating relocatable output, this function must handle
4621    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4622    going to be the section symbol corresponding to the output
4623    section, which means that the addend must be adjusted
4624    accordingly.  */
4625
4626 static bfd_boolean
4627 ppc_elf_relocate_section (bfd *output_bfd,
4628                           struct bfd_link_info *info,
4629                           bfd *input_bfd,
4630                           asection *input_section,
4631                           bfd_byte *contents,
4632                           Elf_Internal_Rela *relocs,
4633                           Elf_Internal_Sym *local_syms,
4634                           asection **local_sections)
4635 {
4636   Elf_Internal_Shdr *symtab_hdr;
4637   struct elf_link_hash_entry **sym_hashes;
4638   struct ppc_elf_link_hash_table *htab;
4639   Elf_Internal_Rela *rel;
4640   Elf_Internal_Rela *relend;
4641   Elf_Internal_Rela outrel;
4642   bfd_byte *loc;
4643   asection *sreloc = NULL;
4644   bfd_vma *local_got_offsets;
4645   bfd_boolean ret = TRUE;
4646
4647 #ifdef DEBUG
4648   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
4649                       "%ld relocations%s",
4650                       input_bfd, input_section,
4651                       (long) input_section->reloc_count,
4652                       (info->relocatable) ? " (relocatable)" : "");
4653 #endif
4654
4655   if (info->relocatable)
4656     return TRUE;
4657
4658   /* Initialize howto table if not already done.  */
4659   if (!ppc_elf_howto_table[R_PPC_ADDR32])
4660     ppc_elf_howto_init ();
4661
4662   htab = ppc_elf_hash_table (info);
4663   local_got_offsets = elf_local_got_offsets (input_bfd);
4664   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4665   sym_hashes = elf_sym_hashes (input_bfd);
4666   rel = relocs;
4667   relend = relocs + input_section->reloc_count;
4668   for (; rel < relend; rel++)
4669     {
4670       enum elf_ppc_reloc_type r_type;
4671       bfd_vma addend;
4672       bfd_reloc_status_type r;
4673       Elf_Internal_Sym *sym;
4674       asection *sec;
4675       struct elf_link_hash_entry *h;
4676       const char *sym_name;
4677       reloc_howto_type *howto;
4678       unsigned long r_symndx;
4679       bfd_vma relocation;
4680       bfd_vma branch_bit, insn, from;
4681       bfd_boolean unresolved_reloc;
4682       bfd_boolean warned;
4683       unsigned int tls_type, tls_mask, tls_gd;
4684
4685       r_type = ELF32_R_TYPE (rel->r_info);
4686       sym = NULL;
4687       sec = NULL;
4688       h = NULL;
4689       unresolved_reloc = FALSE;
4690       warned = FALSE;
4691       r_symndx = ELF32_R_SYM (rel->r_info);
4692
4693       if (r_symndx < symtab_hdr->sh_info)
4694         {
4695           sym = local_syms + r_symndx;
4696           sec = local_sections[r_symndx];
4697           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym);
4698
4699           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4700         }
4701       else
4702         {
4703           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4704                                    r_symndx, symtab_hdr, sym_hashes,
4705                                    h, sec, relocation,
4706                                    unresolved_reloc, warned);
4707
4708           sym_name = h->root.root.string;
4709         }
4710
4711       /* TLS optimizations.  Replace instruction sequences and relocs
4712          based on information we collected in tls_optimize.  We edit
4713          RELOCS so that --emit-relocs will output something sensible
4714          for the final instruction stream.  */
4715       tls_mask = 0;
4716       tls_gd = 0;
4717       if (IS_PPC_TLS_RELOC (r_type))
4718         {
4719           if (h != NULL)
4720             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
4721           else if (local_got_offsets != NULL)
4722             {
4723               char *lgot_masks;
4724               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
4725               tls_mask = lgot_masks[r_symndx];
4726             }
4727         }
4728
4729       /* Ensure reloc mapping code below stays sane.  */
4730       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
4731           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
4732           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
4733           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
4734           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
4735           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
4736           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
4737           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
4738         abort ();
4739       switch (r_type)
4740         {
4741         default:
4742           break;
4743
4744         case R_PPC_GOT_TPREL16:
4745         case R_PPC_GOT_TPREL16_LO:
4746           if (tls_mask != 0
4747               && (tls_mask & TLS_TPREL) == 0)
4748             {
4749               bfd_vma insn;
4750               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
4751               insn &= 31 << 21;
4752               insn |= 0x3c020000;       /* addis 0,2,0 */
4753               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
4754               r_type = R_PPC_TPREL16_HA;
4755               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4756             }
4757           break;
4758
4759         case R_PPC_TLS:
4760           if (tls_mask != 0
4761               && (tls_mask & TLS_TPREL) == 0)
4762             {
4763               bfd_vma insn, rtra;
4764               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4765               if ((insn & ((31 << 26) | (31 << 11)))
4766                   == ((31 << 26) | (2 << 11)))
4767                 rtra = insn & ((1 << 26) - (1 << 16));
4768               else if ((insn & ((31 << 26) | (31 << 16)))
4769                        == ((31 << 26) | (2 << 16)))
4770                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
4771               else
4772                 abort ();
4773               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
4774                 /* add -> addi.  */
4775                 insn = 14 << 26;
4776               else if ((insn & (31 << 1)) == 23 << 1
4777                        && ((insn & (31 << 6)) < 14 << 6
4778                            || ((insn & (31 << 6)) >= 16 << 6
4779                                && (insn & (31 << 6)) < 24 << 6)))
4780                 /* load and store indexed -> dform.  */
4781                 insn = (32 | ((insn >> 6) & 31)) << 26;
4782               else if ((insn & (31 << 1)) == 21 << 1
4783                        && (insn & (0x1a << 6)) == 0)
4784                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
4785                 insn = (((58 | ((insn >> 6) & 4)) << 26)
4786                         | ((insn >> 6) & 1));
4787               else if ((insn & (31 << 1)) == 21 << 1
4788                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
4789                 /* lwax -> lwa.  */
4790                 insn = (58 << 26) | 2;
4791               else
4792                 abort ();
4793               insn |= rtra;
4794               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4795               r_type = R_PPC_TPREL16_LO;
4796               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4797               /* Was PPC_TLS which sits on insn boundary, now
4798                  PPC_TPREL16_LO which is at insn+2.  */
4799               rel->r_offset += 2;
4800             }
4801           break;
4802
4803         case R_PPC_GOT_TLSGD16_HI:
4804         case R_PPC_GOT_TLSGD16_HA:
4805           tls_gd = TLS_TPRELGD;
4806           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4807             goto tls_gdld_hi;
4808           break;
4809
4810         case R_PPC_GOT_TLSLD16_HI:
4811         case R_PPC_GOT_TLSLD16_HA:
4812           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4813             {
4814             tls_gdld_hi:
4815               if ((tls_mask & tls_gd) != 0)
4816                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4817                           + R_PPC_GOT_TPREL16);
4818               else
4819                 {
4820                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
4821                   rel->r_offset -= 2;
4822                   r_type = R_PPC_NONE;
4823                 }
4824               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4825             }
4826           break;
4827
4828         case R_PPC_GOT_TLSGD16:
4829         case R_PPC_GOT_TLSGD16_LO:
4830           tls_gd = TLS_TPRELGD;
4831           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4832             goto tls_get_addr_check;
4833           break;
4834
4835         case R_PPC_GOT_TLSLD16:
4836         case R_PPC_GOT_TLSLD16_LO:
4837           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4838             {
4839             tls_get_addr_check:
4840               if (rel + 1 < relend)
4841                 {
4842                   enum elf_ppc_reloc_type r_type2;
4843                   unsigned long r_symndx2;
4844                   struct elf_link_hash_entry *h2;
4845                   bfd_vma insn1, insn2;
4846                   bfd_vma offset;
4847
4848                   /* The next instruction should be a call to
4849                      __tls_get_addr.  Peek at the reloc to be sure.  */
4850                   r_type2 = ELF32_R_TYPE (rel[1].r_info);
4851                   r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4852                   if (r_symndx2 < symtab_hdr->sh_info
4853                       || (r_type2 != R_PPC_REL14
4854                           && r_type2 != R_PPC_REL14_BRTAKEN
4855                           && r_type2 != R_PPC_REL14_BRNTAKEN
4856                           && r_type2 != R_PPC_REL24
4857                           && r_type2 != R_PPC_PLTREL24))
4858                     break;
4859
4860                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4861                   while (h2->root.type == bfd_link_hash_indirect
4862                          || h2->root.type == bfd_link_hash_warning)
4863                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
4864                   if (h2 == NULL || h2 != htab->tls_get_addr)
4865                     break;
4866
4867                   /* OK, it checks out.  Replace the call.  */
4868                   offset = rel[1].r_offset;
4869                   insn1 = bfd_get_32 (output_bfd,
4870                                       contents + rel->r_offset - 2);
4871                   if ((tls_mask & tls_gd) != 0)
4872                     {
4873                       /* IE */
4874                       insn1 &= (1 << 26) - 1;
4875                       insn1 |= 32 << 26;        /* lwz */
4876                       insn2 = 0x7c631214;       /* add 3,3,2 */
4877                       rel[1].r_info = ELF32_R_INFO (r_symndx2, R_PPC_NONE);
4878                       r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4879                                 + R_PPC_GOT_TPREL16);
4880                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4881                     }
4882                   else
4883                     {
4884                       /* LE */
4885                       insn1 = 0x3c620000;       /* addis 3,2,0 */
4886                       insn2 = 0x38630000;       /* addi 3,3,0 */
4887                       if (tls_gd == 0)
4888                         {
4889                           /* Was an LD reloc.  */
4890                           r_symndx = 0;
4891                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4892                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4893                         }
4894                       r_type = R_PPC_TPREL16_HA;
4895                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4896                       rel[1].r_info = ELF32_R_INFO (r_symndx,
4897                                                     R_PPC_TPREL16_LO);
4898                       rel[1].r_offset += 2;
4899                     }
4900                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
4901                   bfd_put_32 (output_bfd, insn2, contents + offset);
4902                   if (tls_gd == 0)
4903                     {
4904                       /* We changed the symbol on an LD reloc.  Start over
4905                          in order to get h, sym, sec etc. right.  */
4906                       rel--;
4907                       continue;
4908                     }
4909                 }
4910             }
4911           break;
4912         }
4913
4914       /* Handle other relocations that tweak non-addend part of insn.  */
4915       branch_bit = 0;
4916       switch (r_type)
4917         {
4918         default:
4919           break;
4920
4921           /* Branch taken prediction relocations.  */
4922         case R_PPC_ADDR14_BRTAKEN:
4923         case R_PPC_REL14_BRTAKEN:
4924           branch_bit = BRANCH_PREDICT_BIT;
4925           /* Fall thru */
4926
4927           /* Branch not taken prediction relocations.  */
4928         case R_PPC_ADDR14_BRNTAKEN:
4929         case R_PPC_REL14_BRNTAKEN:
4930           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4931           insn &= ~BRANCH_PREDICT_BIT;
4932           insn |= branch_bit;
4933
4934           from = (rel->r_offset
4935                   + input_section->output_offset
4936                   + input_section->output_section->vma);
4937
4938           /* Invert 'y' bit if not the default.  */
4939           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
4940             insn ^= BRANCH_PREDICT_BIT;
4941
4942           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4943           break;
4944         }
4945
4946       addend = rel->r_addend;
4947       tls_type = 0;
4948       howto = NULL;
4949       if (r_type < R_PPC_max)
4950         howto = ppc_elf_howto_table[r_type];
4951       switch (r_type)
4952         {
4953         default:
4954           (*_bfd_error_handler)
4955             (_("%B: unknown relocation type %d for symbol %s"),
4956              input_bfd, (int) r_type, sym_name);
4957
4958           bfd_set_error (bfd_error_bad_value);
4959           ret = FALSE;
4960           continue;
4961
4962         case R_PPC_NONE:
4963         case R_PPC_TLS:
4964         case R_PPC_EMB_MRKREF:
4965         case R_PPC_GNU_VTINHERIT:
4966         case R_PPC_GNU_VTENTRY:
4967           continue;
4968
4969           /* GOT16 relocations.  Like an ADDR16 using the symbol's
4970              address in the GOT as relocation value instead of the
4971              symbol's value itself.  Also, create a GOT entry for the
4972              symbol and put the symbol value there.  */
4973         case R_PPC_GOT_TLSGD16:
4974         case R_PPC_GOT_TLSGD16_LO:
4975         case R_PPC_GOT_TLSGD16_HI:
4976         case R_PPC_GOT_TLSGD16_HA:
4977           tls_type = TLS_TLS | TLS_GD;
4978           goto dogot;
4979
4980         case R_PPC_GOT_TLSLD16:
4981         case R_PPC_GOT_TLSLD16_LO:
4982         case R_PPC_GOT_TLSLD16_HI:
4983         case R_PPC_GOT_TLSLD16_HA:
4984           tls_type = TLS_TLS | TLS_LD;
4985           goto dogot;
4986
4987         case R_PPC_GOT_TPREL16:
4988         case R_PPC_GOT_TPREL16_LO:
4989         case R_PPC_GOT_TPREL16_HI:
4990         case R_PPC_GOT_TPREL16_HA:
4991           tls_type = TLS_TLS | TLS_TPREL;
4992           goto dogot;
4993
4994         case R_PPC_GOT_DTPREL16:
4995         case R_PPC_GOT_DTPREL16_LO:
4996         case R_PPC_GOT_DTPREL16_HI:
4997         case R_PPC_GOT_DTPREL16_HA:
4998           tls_type = TLS_TLS | TLS_DTPREL;
4999           goto dogot;
5000
5001         case R_PPC_GOT16:
5002         case R_PPC_GOT16_LO:
5003         case R_PPC_GOT16_HI:
5004         case R_PPC_GOT16_HA:
5005         dogot:
5006           {
5007             /* Relocation is to the entry for this symbol in the global
5008                offset table.  */
5009             bfd_vma off;
5010             bfd_vma *offp;
5011             unsigned long indx;
5012
5013             if (htab->got == NULL)
5014               abort ();
5015
5016             indx = 0;
5017             if (tls_type == (TLS_TLS | TLS_LD)
5018                 && (h == NULL
5019                     || !h->def_dynamic))
5020               offp = &htab->tlsld_got.offset;
5021             else if (h != NULL)
5022               {
5023                 bfd_boolean dyn;
5024                 dyn = htab->elf.dynamic_sections_created;
5025                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5026                     || (info->shared
5027                         && SYMBOL_REFERENCES_LOCAL (info, h)))
5028                   /* This is actually a static link, or it is a
5029                      -Bsymbolic link and the symbol is defined
5030                      locally, or the symbol was forced to be local
5031                      because of a version file.  */
5032                   ;
5033                 else
5034                   {
5035                     indx = h->dynindx;
5036                     unresolved_reloc = FALSE;
5037                   }
5038                 offp = &h->got.offset;
5039               }
5040             else
5041               {
5042                 if (local_got_offsets == NULL)
5043                   abort ();
5044                 offp = &local_got_offsets[r_symndx];
5045               }
5046
5047             /* The offset must always be a multiple of 4.  We use the
5048                least significant bit to record whether we have already
5049                processed this entry.  */
5050             off = *offp;
5051             if ((off & 1) != 0)
5052               off &= ~1;
5053             else
5054               {
5055                 unsigned int tls_m = (tls_mask
5056                                       & (TLS_LD | TLS_GD | TLS_DTPREL
5057                                          | TLS_TPREL | TLS_TPRELGD));
5058
5059                 if (offp == &htab->tlsld_got.offset)
5060                   tls_m = TLS_LD;
5061                 else if (h == NULL
5062                          || !h->def_dynamic)
5063                   tls_m &= ~TLS_LD;
5064
5065                 /* We might have multiple got entries for this sym.
5066                    Initialize them all.  */
5067                 do
5068                   {
5069                     int tls_ty = 0;
5070
5071                     if ((tls_m & TLS_LD) != 0)
5072                       {
5073                         tls_ty = TLS_TLS | TLS_LD;
5074                         tls_m &= ~TLS_LD;
5075                       }
5076                     else if ((tls_m & TLS_GD) != 0)
5077                       {
5078                         tls_ty = TLS_TLS | TLS_GD;
5079                         tls_m &= ~TLS_GD;
5080                       }
5081                     else if ((tls_m & TLS_DTPREL) != 0)
5082                       {
5083                         tls_ty = TLS_TLS | TLS_DTPREL;
5084                         tls_m &= ~TLS_DTPREL;
5085                       }
5086                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
5087                       {
5088                         tls_ty = TLS_TLS | TLS_TPREL;
5089                         tls_m = 0;
5090                       }
5091
5092                     /* Generate relocs for the dynamic linker.  */
5093                     if ((info->shared || indx != 0)
5094                         && (h == NULL
5095                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5096                             || h->root.type != bfd_link_hash_undefweak))
5097                       {
5098                         outrel.r_offset = (htab->got->output_section->vma
5099                                            + htab->got->output_offset
5100                                            + off);
5101                         outrel.r_addend = 0;
5102                         if (tls_ty & (TLS_LD | TLS_GD))
5103                           {
5104                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
5105                             if (tls_ty == (TLS_TLS | TLS_GD))
5106                               {
5107                                 loc = htab->relgot->contents;
5108                                 loc += (htab->relgot->reloc_count++
5109                                         * sizeof (Elf32_External_Rela));
5110                                 bfd_elf32_swap_reloca_out (output_bfd,
5111                                                            &outrel, loc);
5112                                 outrel.r_offset += 4;
5113                                 outrel.r_info
5114                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5115                               }
5116                           }
5117                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
5118                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5119                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
5120                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
5121                         else if (indx == 0)
5122                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
5123                         else
5124                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
5125                         if (indx == 0)
5126                           {
5127                             outrel.r_addend += relocation;
5128                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
5129                               outrel.r_addend -= htab->elf.tls_sec->vma;
5130                           }
5131                         loc = htab->relgot->contents;
5132                         loc += (htab->relgot->reloc_count++
5133                                 * sizeof (Elf32_External_Rela));
5134                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5135                       }
5136
5137                     /* Init the .got section contents if we're not
5138                        emitting a reloc.  */
5139                     else
5140                       {
5141                         bfd_vma value = relocation;
5142
5143                         if (tls_ty == (TLS_TLS | TLS_LD))
5144                           value = 1;
5145                         else if (tls_ty != 0)
5146                           {
5147                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
5148                             if (tls_ty == (TLS_TLS | TLS_TPREL))
5149                               value += DTP_OFFSET - TP_OFFSET;
5150
5151                             if (tls_ty == (TLS_TLS | TLS_GD))
5152                               {
5153                                 bfd_put_32 (output_bfd, value,
5154                                             htab->got->contents + off + 4);
5155                                 value = 1;
5156                               }
5157                           }
5158                         bfd_put_32 (output_bfd, value,
5159                                     htab->got->contents + off);
5160                       }
5161
5162                     off += 4;
5163                     if (tls_ty & (TLS_LD | TLS_GD))
5164                       off += 4;
5165                   }
5166                 while (tls_m != 0);
5167
5168                 off = *offp;
5169                 *offp = off | 1;
5170               }
5171
5172             if (off >= (bfd_vma) -2)
5173               abort ();
5174
5175             if ((tls_type & TLS_TLS) != 0)
5176               {
5177                 if (tls_type != (TLS_TLS | TLS_LD))
5178                   {
5179                     if ((tls_mask & TLS_LD) != 0
5180                         && !(h == NULL
5181                              || !h->def_dynamic))
5182                       off += 8;
5183                     if (tls_type != (TLS_TLS | TLS_GD))
5184                       {
5185                         if ((tls_mask & TLS_GD) != 0)
5186                           off += 8;
5187                         if (tls_type != (TLS_TLS | TLS_DTPREL))
5188                           {
5189                             if ((tls_mask & TLS_DTPREL) != 0)
5190                               off += 4;
5191                           }
5192                       }
5193                   }
5194               }
5195
5196             relocation = htab->got->output_offset + off - 4;
5197
5198             /* Addends on got relocations don't make much sense.
5199                x+off@got is actually x@got+off, and since the got is
5200                generated by a hash table traversal, the value in the
5201                got at entry m+n bears little relation to the entry m.  */
5202             if (addend != 0)
5203               (*_bfd_error_handler)
5204                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
5205                  input_bfd,
5206                  input_section,
5207                  (long) rel->r_offset,
5208                  howto->name,
5209                  sym_name);
5210           }
5211         break;
5212
5213         /* Relocations that need no special processing.  */
5214         case R_PPC_LOCAL24PC:
5215           /* It makes no sense to point a local relocation
5216              at a symbol not in this object.  */
5217           if (unresolved_reloc)
5218             {
5219               if (! (*info->callbacks->undefined_symbol) (info,
5220                                                           h->root.root.string,
5221                                                           input_bfd,
5222                                                           input_section,
5223                                                           rel->r_offset,
5224                                                           TRUE))
5225                 return FALSE;
5226               continue;
5227             }
5228           break;
5229
5230         case R_PPC_DTPREL16:
5231         case R_PPC_DTPREL16_LO:
5232         case R_PPC_DTPREL16_HI:
5233         case R_PPC_DTPREL16_HA:
5234           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5235           break;
5236
5237           /* Relocations that may need to be propagated if this is a shared
5238              object.  */
5239         case R_PPC_TPREL16:
5240         case R_PPC_TPREL16_LO:
5241         case R_PPC_TPREL16_HI:
5242         case R_PPC_TPREL16_HA:
5243           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5244           /* The TPREL16 relocs shouldn't really be used in shared
5245              libs as they will result in DT_TEXTREL being set, but
5246              support them anyway.  */
5247           goto dodyn;
5248
5249         case R_PPC_TPREL32:
5250           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5251           goto dodyn;
5252
5253         case R_PPC_DTPREL32:
5254           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5255           goto dodyn;
5256
5257         case R_PPC_DTPMOD32:
5258           relocation = 1;
5259           addend = 0;
5260           goto dodyn;
5261
5262         case R_PPC_REL24:
5263         case R_PPC_REL32:
5264         case R_PPC_REL14:
5265         case R_PPC_REL14_BRTAKEN:
5266         case R_PPC_REL14_BRNTAKEN:
5267           /* If these relocations are not to a named symbol, they can be
5268              handled right here, no need to bother the dynamic linker.  */
5269           if (SYMBOL_REFERENCES_LOCAL (info, h)
5270               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5271             break;
5272           /* fall through */
5273
5274           /* Relocations that always need to be propagated if this is a shared
5275              object.  */
5276         case R_PPC_ADDR32:
5277         case R_PPC_ADDR24:
5278         case R_PPC_ADDR16:
5279         case R_PPC_ADDR16_LO:
5280         case R_PPC_ADDR16_HI:
5281         case R_PPC_ADDR16_HA:
5282         case R_PPC_ADDR14:
5283         case R_PPC_ADDR14_BRTAKEN:
5284         case R_PPC_ADDR14_BRNTAKEN:
5285         case R_PPC_UADDR32:
5286         case R_PPC_UADDR16:
5287           /* r_symndx will be zero only for relocs against symbols
5288              from removed linkonce sections, or sections discarded by
5289              a linker script.  */
5290         dodyn:
5291           if (r_symndx == 0)
5292             break;
5293           /* Fall thru.  */
5294
5295           if ((info->shared
5296                && (h == NULL
5297                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5298                    || h->root.type != bfd_link_hash_undefweak)
5299                && (MUST_BE_DYN_RELOC (r_type)
5300                    || !SYMBOL_CALLS_LOCAL (info, h)))
5301               || (ELIMINATE_COPY_RELOCS
5302                   && !info->shared
5303                   && (input_section->flags & SEC_ALLOC) != 0
5304                   && h != NULL
5305                   && h->dynindx != -1
5306                   && !h->non_got_ref
5307                   && h->def_dynamic
5308                   && !h->def_regular))
5309             {
5310               int skip;
5311
5312 #ifdef DEBUG
5313               fprintf (stderr, "ppc_elf_relocate_section needs to "
5314                        "create relocation for %s\n",
5315                        (h && h->root.root.string
5316                         ? h->root.root.string : "<unknown>"));
5317 #endif
5318
5319               /* When generating a shared object, these relocations
5320                  are copied into the output file to be resolved at run
5321                  time.  */
5322               if (sreloc == NULL)
5323                 {
5324                   const char *name;
5325
5326                   name = (bfd_elf_string_from_elf_section
5327                           (input_bfd,
5328                            elf_elfheader (input_bfd)->e_shstrndx,
5329                            elf_section_data (input_section)->rel_hdr.sh_name));
5330                   if (name == NULL)
5331                     return FALSE;
5332
5333                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5334                               && strcmp (bfd_get_section_name (input_bfd,
5335                                                                input_section),
5336                                          name + 5) == 0);
5337
5338                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
5339                   BFD_ASSERT (sreloc != NULL);
5340                 }
5341
5342               skip = 0;
5343
5344               outrel.r_offset =
5345                 _bfd_elf_section_offset (output_bfd, info, input_section,
5346                                          rel->r_offset);
5347               if (outrel.r_offset == (bfd_vma) -1
5348                   || outrel.r_offset == (bfd_vma) -2)
5349                 skip = (int) outrel.r_offset;
5350               outrel.r_offset += (input_section->output_section->vma
5351                                   + input_section->output_offset);
5352
5353               if (skip)
5354                 memset (&outrel, 0, sizeof outrel);
5355               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
5356                 {
5357                   unresolved_reloc = FALSE;
5358                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5359                   outrel.r_addend = rel->r_addend;
5360                 }
5361               else
5362                 {
5363                   outrel.r_addend = relocation + rel->r_addend;
5364
5365                   if (r_type == R_PPC_ADDR32)
5366                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
5367                   else
5368                     {
5369                       long indx;
5370
5371                       if (bfd_is_abs_section (sec))
5372                         indx = 0;
5373                       else if (sec == NULL || sec->owner == NULL)
5374                         {
5375                           bfd_set_error (bfd_error_bad_value);
5376                           return FALSE;
5377                         }
5378                       else
5379                         {
5380                           asection *osec;
5381
5382                           /* We are turning this relocation into one
5383                              against a section symbol.  It would be
5384                              proper to subtract the symbol's value,
5385                              osec->vma, from the emitted reloc addend,
5386                              but ld.so expects buggy relocs.  */
5387                           osec = sec->output_section;
5388                           indx = elf_section_data (osec)->dynindx;
5389                           BFD_ASSERT (indx > 0);
5390 #ifdef DEBUG
5391                           if (indx <= 0)
5392                             printf ("indx=%d section=%s flags=%08x name=%s\n",
5393                                     indx, osec->name, osec->flags,
5394                                     h->root.root.string);
5395 #endif
5396                         }
5397
5398                       outrel.r_info = ELF32_R_INFO (indx, r_type);
5399                     }
5400                 }
5401
5402               loc = sreloc->contents;
5403               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5404               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5405
5406               if (skip == -1)
5407                 continue;
5408
5409               /* This reloc will be computed at runtime.  We clear the memory
5410                  so that it contains predictable value.  */
5411               if (! skip
5412                   && ((input_section->flags & SEC_ALLOC) != 0
5413                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
5414                 {
5415                   relocation = howto->pc_relative ? outrel.r_offset : 0;
5416                   addend = 0;
5417                   break;
5418                 }
5419             }
5420           break;
5421
5422         case R_PPC_RELAX32PC:
5423           relocation -= (input_section->output_section->vma
5424                          + input_section->output_offset
5425                          + rel->r_offset - 4);
5426           /* Fall thru */
5427         case R_PPC_RELAX32:
5428           {
5429             unsigned long t0;
5430             unsigned long t1;
5431
5432             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
5433             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
5434
5435             /* We're clearing the bits for R_PPC_ADDR16_HA
5436                and R_PPC_ADDR16_LO here.  */
5437             t0 &= ~0xffff;
5438             t1 &= ~0xffff;
5439
5440             /* t0 is HA, t1 is LO */
5441             relocation += addend;
5442             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
5443             t1 |= relocation & 0xffff;
5444
5445             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
5446             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
5447           }
5448           continue;
5449
5450           /* Indirect .sdata relocation.  */
5451         case R_PPC_EMB_SDAI16:
5452           BFD_ASSERT (htab->sdata != NULL);
5453           relocation
5454             = elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
5455                                                  htab->sdata, h, relocation,
5456                                                  rel, R_PPC_RELATIVE);
5457           break;
5458
5459           /* Indirect .sdata2 relocation.  */
5460         case R_PPC_EMB_SDA2I16:
5461           BFD_ASSERT (htab->sdata2 != NULL);
5462           relocation
5463             = elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
5464                                                  htab->sdata2, h, relocation,
5465                                                  rel, R_PPC_RELATIVE);
5466           break;
5467
5468           /* Handle the TOC16 reloc.  We want to use the offset within the .got
5469              section, not the actual VMA.  This is appropriate when generating
5470              an embedded ELF object, for which the .got section acts like the
5471              AIX .toc section.  */
5472         case R_PPC_TOC16:                       /* phony GOT16 relocations */
5473           BFD_ASSERT (sec != NULL);
5474           BFD_ASSERT (bfd_is_und_section (sec)
5475                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
5476                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
5477
5478             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
5479           break;
5480
5481         case R_PPC_PLTREL24:
5482           /* Relocation is to the entry for this symbol in the
5483              procedure linkage table.  */
5484           BFD_ASSERT (h != NULL);
5485
5486           if (h->plt.offset == (bfd_vma) -1
5487               || htab->plt == NULL)
5488             {
5489               /* We didn't make a PLT entry for this symbol.  This
5490                  happens when statically linking PIC code, or when
5491                  using -Bsymbolic.  */
5492               break;
5493             }
5494
5495           unresolved_reloc = FALSE;
5496           relocation = (htab->plt->output_section->vma
5497                         + htab->plt->output_offset
5498                         + h->plt.offset);
5499           break;
5500
5501           /* Relocate against _SDA_BASE_.  */
5502         case R_PPC_SDAREL16:
5503           {
5504             const char *name;
5505             const struct elf_link_hash_entry *sh;
5506
5507             BFD_ASSERT (sec != NULL);
5508             name = bfd_get_section_name (abfd, sec->output_section);
5509             if (! ((strncmp (name, ".sdata", 6) == 0
5510                     && (name[6] == 0 || name[6] == '.'))
5511                    || (strncmp (name, ".sbss", 5) == 0
5512                        && (name[5] == 0 || name[5] == '.'))))
5513               {
5514                 (*_bfd_error_handler)
5515                   (_("%B: the target (%s) of a %s relocation is "
5516                      "in the wrong output section (%s)"),
5517                    input_bfd,
5518                    sym_name,
5519                    howto->name,
5520                    name);
5521               }
5522             sh = htab->sdata->sym_hash;
5523             addend -= (sh->root.u.def.value
5524                        + sh->root.u.def.section->output_section->vma
5525                        + sh->root.u.def.section->output_offset);
5526           }
5527           break;
5528
5529           /* Relocate against _SDA2_BASE_.  */
5530         case R_PPC_EMB_SDA2REL:
5531           {
5532             const char *name;
5533             const struct elf_link_hash_entry *sh;
5534
5535             BFD_ASSERT (sec != NULL);
5536             name = bfd_get_section_name (abfd, sec->output_section);
5537             if (! (strncmp (name, ".sdata2", 7) == 0
5538                    || strncmp (name, ".sbss2", 6) == 0))
5539               {
5540                 (*_bfd_error_handler)
5541                   (_("%B: the target (%s) of a %s relocation is "
5542                      "in the wrong output section (%s)"),
5543                    input_bfd,
5544                    sym_name,
5545                    howto->name,
5546                    name);
5547
5548                 bfd_set_error (bfd_error_bad_value);
5549                 ret = FALSE;
5550                 continue;
5551               }
5552             sh = htab->sdata2->sym_hash;
5553             addend -= (sh->root.u.def.value
5554                        + sh->root.u.def.section->output_section->vma
5555                        + sh->root.u.def.section->output_offset);
5556           }
5557           break;
5558
5559           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
5560         case R_PPC_EMB_SDA21:
5561         case R_PPC_EMB_RELSDA:
5562           {
5563             const char *name;
5564             const struct elf_link_hash_entry *sh;
5565             int reg;
5566
5567             BFD_ASSERT (sec != NULL);
5568             name = bfd_get_section_name (abfd, sec->output_section);
5569             if (((strncmp (name, ".sdata", 6) == 0
5570                   && (name[6] == 0 || name[6] == '.'))
5571                  || (strncmp (name, ".sbss", 5) == 0
5572                      && (name[5] == 0 || name[5] == '.'))))
5573               {
5574                 reg = 13;
5575                 sh = htab->sdata->sym_hash;
5576                 addend -= (sh->root.u.def.value
5577                            + sh->root.u.def.section->output_section->vma
5578                            + sh->root.u.def.section->output_offset);
5579               }
5580
5581             else if (strncmp (name, ".sdata2", 7) == 0
5582                      || strncmp (name, ".sbss2", 6) == 0)
5583               {
5584                 reg = 2;
5585                 sh = htab->sdata2->sym_hash;
5586                 addend -= (sh->root.u.def.value
5587                            + sh->root.u.def.section->output_section->vma
5588                            + sh->root.u.def.section->output_offset);
5589               }
5590
5591             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
5592                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
5593               {
5594                 reg = 0;
5595               }
5596
5597             else
5598               {
5599                 (*_bfd_error_handler)
5600                   (_("%B: the target (%s) of a %s relocation is "
5601                      "in the wrong output section (%s)"),
5602                    input_bfd,
5603                    sym_name,
5604                    howto->name,
5605                    name);
5606
5607                 bfd_set_error (bfd_error_bad_value);
5608                 ret = FALSE;
5609                 continue;
5610               }
5611
5612             if (r_type == R_PPC_EMB_SDA21)
5613               {                 /* fill in register field */
5614                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5615                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
5616                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5617               }
5618           }
5619           break;
5620
5621           /* Relocate against the beginning of the section.  */
5622         case R_PPC_SECTOFF:
5623         case R_PPC_SECTOFF_LO:
5624         case R_PPC_SECTOFF_HI:
5625         case R_PPC_SECTOFF_HA:
5626           BFD_ASSERT (sec != NULL);
5627           addend -= sec->output_section->vma;
5628           break;
5629
5630           /* Negative relocations.  */
5631         case R_PPC_EMB_NADDR32:
5632         case R_PPC_EMB_NADDR16:
5633         case R_PPC_EMB_NADDR16_LO:
5634         case R_PPC_EMB_NADDR16_HI:
5635         case R_PPC_EMB_NADDR16_HA:
5636           addend -= 2 * relocation;
5637           break;
5638
5639         case R_PPC_COPY:
5640         case R_PPC_GLOB_DAT:
5641         case R_PPC_JMP_SLOT:
5642         case R_PPC_RELATIVE:
5643         case R_PPC_PLT32:
5644         case R_PPC_PLTREL32:
5645         case R_PPC_PLT16_LO:
5646         case R_PPC_PLT16_HI:
5647         case R_PPC_PLT16_HA:
5648         case R_PPC_ADDR30:
5649         case R_PPC_EMB_RELSEC16:
5650         case R_PPC_EMB_RELST_LO:
5651         case R_PPC_EMB_RELST_HI:
5652         case R_PPC_EMB_RELST_HA:
5653         case R_PPC_EMB_BIT_FLD:
5654           (*_bfd_error_handler)
5655             (_("%B: relocation %s is not yet supported for symbol %s."),
5656              input_bfd,
5657              howto->name,
5658              sym_name);
5659
5660           bfd_set_error (bfd_error_invalid_operation);
5661           ret = FALSE;
5662           continue;
5663         }
5664
5665       /* Do any further special processing.  */
5666       switch (r_type)
5667         {
5668         default:
5669           break;
5670
5671         case R_PPC_ADDR16_HA:
5672         case R_PPC_GOT16_HA:
5673         case R_PPC_PLT16_HA:
5674         case R_PPC_SECTOFF_HA:
5675         case R_PPC_TPREL16_HA:
5676         case R_PPC_DTPREL16_HA:
5677         case R_PPC_GOT_TLSGD16_HA:
5678         case R_PPC_GOT_TLSLD16_HA:
5679         case R_PPC_GOT_TPREL16_HA:
5680         case R_PPC_GOT_DTPREL16_HA:
5681         case R_PPC_EMB_NADDR16_HA:
5682         case R_PPC_EMB_RELST_HA:
5683           /* It's just possible that this symbol is a weak symbol
5684              that's not actually defined anywhere.  In that case,
5685              'sec' would be NULL, and we should leave the symbol
5686              alone (it will be set to zero elsewhere in the link).  */
5687           if (sec != NULL)
5688             /* Add 0x10000 if sign bit in 0:15 is set.
5689                Bits 0:15 are not used.  */
5690             addend += 0x8000;
5691           break;
5692         }
5693
5694 #ifdef DEBUG
5695       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
5696                "offset = %ld, addend = %ld\n",
5697                howto->name,
5698                (int) r_type,
5699                sym_name,
5700                r_symndx,
5701                (long) rel->r_offset,
5702                (long) addend);
5703 #endif
5704
5705       if (unresolved_reloc
5706           && !((input_section->flags & SEC_DEBUGGING) != 0
5707                && h->def_dynamic))
5708         {
5709           (*_bfd_error_handler)
5710             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5711              input_bfd,
5712              input_section,
5713              (long) rel->r_offset,
5714              howto->name,
5715              sym_name);
5716           ret = FALSE;
5717         }
5718
5719       r = _bfd_final_link_relocate (howto,
5720                                     input_bfd,
5721                                     input_section,
5722                                     contents,
5723                                     rel->r_offset,
5724                                     relocation,
5725                                     addend);
5726
5727       if (r != bfd_reloc_ok)
5728         {
5729           if (sym_name == NULL)
5730             sym_name = "(null)";
5731           if (r == bfd_reloc_overflow)
5732             {
5733               if (warned)
5734                 continue;
5735               if (h != NULL
5736                   && h->root.type == bfd_link_hash_undefweak
5737                   && howto->pc_relative)
5738                 {
5739                   /* Assume this is a call protected by other code that
5740                      detect the symbol is undefined.  If this is the case,
5741                      we can safely ignore the overflow.  If not, the
5742                      program is hosed anyway, and a little warning isn't
5743                      going to help.  */
5744
5745                   continue;
5746                 }
5747
5748               if (! (*info->callbacks->reloc_overflow) (info,
5749                                                         (h ? &h->root : NULL),
5750                                                         sym_name,
5751                                                         howto->name,
5752                                                         rel->r_addend,
5753                                                         input_bfd,
5754                                                         input_section,
5755                                                         rel->r_offset))
5756                 return FALSE;
5757             }
5758           else
5759             {
5760               (*_bfd_error_handler)
5761                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
5762                  input_bfd, input_section,
5763                  (long) rel->r_offset, howto->name, sym_name, (int) r);
5764               ret = FALSE;
5765             }
5766         }
5767     }
5768
5769 #ifdef DEBUG
5770   fprintf (stderr, "\n");
5771 #endif
5772
5773   return ret;
5774 }
5775
5776 static enum elf_reloc_type_class
5777 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
5778 {
5779   switch (ELF32_R_TYPE (rela->r_info))
5780     {
5781     case R_PPC_RELATIVE:
5782       return reloc_class_relative;
5783     case R_PPC_REL24:
5784     case R_PPC_ADDR24:
5785     case R_PPC_JMP_SLOT:
5786       return reloc_class_plt;
5787     case R_PPC_COPY:
5788       return reloc_class_copy;
5789     default:
5790       return reloc_class_normal;
5791     }
5792 }
5793 \f
5794 /* Support for core dump NOTE sections.  */
5795
5796 static bfd_boolean
5797 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
5798 {
5799   int offset;
5800   unsigned int size;
5801
5802   switch (note->descsz)
5803     {
5804     default:
5805       return FALSE;
5806
5807     case 268:           /* Linux/PPC.  */
5808       /* pr_cursig */
5809       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
5810
5811       /* pr_pid */
5812       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
5813
5814       /* pr_reg */
5815       offset = 72;
5816       size = 192;
5817
5818       break;
5819     }
5820
5821   /* Make a ".reg/999" section.  */
5822   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
5823                                           size, note->descpos + offset);
5824 }
5825
5826 static bfd_boolean
5827 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
5828 {
5829   switch (note->descsz)
5830     {
5831     default:
5832       return FALSE;
5833
5834     case 128:           /* Linux/PPC elf_prpsinfo.  */
5835       elf_tdata (abfd)->core_program
5836         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
5837       elf_tdata (abfd)->core_command
5838         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
5839     }
5840
5841   /* Note that for some reason, a spurious space is tacked
5842      onto the end of the args in some (at least one anyway)
5843      implementations, so strip it off if it exists.  */
5844
5845   {
5846     char *command = elf_tdata (abfd)->core_command;
5847     int n = strlen (command);
5848
5849     if (0 < n && command[n - 1] == ' ')
5850       command[n - 1] = '\0';
5851   }
5852
5853   return TRUE;
5854 }
5855 \f
5856 /* Very simple linked list structure for recording apuinfo values.  */
5857 typedef struct apuinfo_list
5858 {
5859   struct apuinfo_list *next;
5860   unsigned long value;
5861 }
5862 apuinfo_list;
5863
5864 static apuinfo_list *head;
5865
5866
5867 static void
5868 apuinfo_list_init (void)
5869 {
5870   head = NULL;
5871 }
5872
5873 static void
5874 apuinfo_list_add (unsigned long value)
5875 {
5876   apuinfo_list *entry = head;
5877
5878   while (entry != NULL)
5879     {
5880       if (entry->value == value)
5881         return;
5882       entry = entry->next;
5883     }
5884
5885   entry = bfd_malloc (sizeof (* entry));
5886   if (entry == NULL)
5887     return;
5888
5889   entry->value = value;
5890   entry->next  = head;
5891   head = entry;
5892 }
5893
5894 static unsigned
5895 apuinfo_list_length (void)
5896 {
5897   apuinfo_list *entry;
5898   unsigned long count;
5899
5900   for (entry = head, count = 0;
5901        entry;
5902        entry = entry->next)
5903     ++ count;
5904
5905   return count;
5906 }
5907
5908 static inline unsigned long
5909 apuinfo_list_element (unsigned long number)
5910 {
5911   apuinfo_list * entry;
5912
5913   for (entry = head;
5914        entry && number --;
5915        entry = entry->next)
5916     ;
5917
5918   return entry ? entry->value : 0;
5919 }
5920
5921 static void
5922 apuinfo_list_finish (void)
5923 {
5924   apuinfo_list *entry;
5925
5926   for (entry = head; entry;)
5927     {
5928       apuinfo_list *next = entry->next;
5929       free (entry);
5930       entry = next;
5931     }
5932
5933   head = NULL;
5934 }
5935
5936 #define APUINFO_SECTION_NAME    ".PPC.EMB.apuinfo"
5937 #define APUINFO_LABEL           "APUinfo"
5938
5939 /* Scan the input BFDs and create a linked list of
5940    the APUinfo values that will need to be emitted.  */
5941
5942 static void
5943 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
5944 {
5945   bfd *ibfd;
5946   asection *asec;
5947   char *buffer;
5948   unsigned num_input_sections;
5949   bfd_size_type output_section_size;
5950   unsigned i;
5951   unsigned num_entries;
5952   unsigned long offset;
5953   unsigned long length;
5954   const char *error_message = NULL;
5955
5956   if (link_info == NULL)
5957     return;
5958
5959   /* Scan the input bfds, looking for apuinfo sections.  */
5960   num_input_sections = 0;
5961   output_section_size = 0;
5962
5963   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
5964     {
5965       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
5966       if (asec)
5967         {
5968           ++ num_input_sections;
5969           output_section_size += asec->size;
5970         }
5971     }
5972
5973   /* We need at least one input sections
5974      in order to make merging worthwhile.  */
5975   if (num_input_sections < 1)
5976     return;
5977
5978   /* Just make sure that the output section exists as well.  */
5979   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
5980   if (asec == NULL)
5981     return;
5982
5983   /* Allocate a buffer for the contents of the input sections.  */
5984   buffer = bfd_malloc (output_section_size);
5985   if (buffer == NULL)
5986     return;
5987
5988   offset = 0;
5989   apuinfo_list_init ();
5990
5991   /* Read in the input sections contents.  */
5992   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
5993     {
5994       unsigned long datum;
5995       char *ptr;
5996
5997       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
5998       if (asec == NULL)
5999         continue;
6000
6001       length = asec->size;
6002       if (length < 24)
6003         {
6004           error_message = _("corrupt or empty %s section in %B");
6005           goto fail;
6006         }
6007
6008       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
6009           || (bfd_bread (buffer + offset, length, ibfd) != length))
6010         {
6011           error_message = _("unable to read in %s section from %B");
6012           goto fail;
6013         }
6014
6015       /* Process the contents of the section.  */
6016       ptr = buffer + offset;
6017       error_message = _("corrupt %s section in %B");
6018
6019       /* Verify the contents of the header.  Note - we have to
6020          extract the values this way in order to allow for a
6021          host whose endian-ness is different from the target.  */
6022       datum = bfd_get_32 (ibfd, ptr);
6023       if (datum != sizeof APUINFO_LABEL)
6024         goto fail;
6025
6026       datum = bfd_get_32 (ibfd, ptr + 8);
6027       if (datum != 0x2)
6028         goto fail;
6029
6030       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
6031         goto fail;
6032
6033       /* Get the number of bytes used for apuinfo entries.  */
6034       datum = bfd_get_32 (ibfd, ptr + 4);
6035       if (datum + 20 != length)
6036         goto fail;
6037
6038       /* Make sure that we do not run off the end of the section.  */
6039       if (offset + length > output_section_size)
6040         goto fail;
6041
6042       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
6043       for (i = 0; i < datum; i += 4)
6044         apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
6045
6046       /* Update the offset.  */
6047       offset += length;
6048     }
6049
6050   error_message = NULL;
6051
6052   /* Compute the size of the output section.  */
6053   num_entries = apuinfo_list_length ();
6054   output_section_size = 20 + num_entries * 4;
6055
6056   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
6057
6058   if (! bfd_set_section_size (abfd, asec, output_section_size))
6059     ibfd = abfd,
6060       error_message = _("warning: unable to set size of %s section in %B");
6061
6062  fail:
6063   free (buffer);
6064
6065   if (error_message)
6066     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
6067 }
6068
6069
6070 /* Prevent the output section from accumulating the input sections'
6071    contents.  We have already stored this in our linked list structure.  */
6072
6073 static bfd_boolean
6074 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
6075                        asection *asec,
6076                        bfd_byte *contents ATTRIBUTE_UNUSED)
6077 {
6078   return (apuinfo_list_length ()
6079           && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
6080 }
6081
6082
6083 /* Finally we can generate the output section.  */
6084
6085 static void
6086 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
6087 {
6088   bfd_byte *buffer;
6089   asection *asec;
6090   unsigned i;
6091   unsigned num_entries;
6092   bfd_size_type length;
6093
6094   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
6095   if (asec == NULL)
6096     return;
6097
6098   if (apuinfo_list_length () == 0)
6099     return;
6100
6101   length = asec->size;
6102   if (length < 20)
6103     return;
6104
6105   buffer = bfd_malloc (length);
6106   if (buffer == NULL)
6107     {
6108       (*_bfd_error_handler)
6109         (_("failed to allocate space for new APUinfo section."));
6110       return;
6111     }
6112
6113   /* Create the apuinfo header.  */
6114   num_entries = apuinfo_list_length ();
6115   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
6116   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
6117   bfd_put_32 (abfd, 0x2, buffer + 8);
6118   strcpy (buffer + 12, APUINFO_LABEL);
6119
6120   length = 20;
6121   for (i = 0; i < num_entries; i++)
6122     {
6123       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
6124       length += 4;
6125     }
6126
6127   if (length != asec->size)
6128     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
6129
6130   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
6131     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
6132
6133   free (buffer);
6134
6135   apuinfo_list_finish ();
6136 }
6137
6138 /* Return address for Ith PLT stub in section PLT, for relocation REL
6139    or (bfd_vma) -1 if it should not be included.  */
6140
6141 static bfd_vma
6142 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
6143                      const asection *plt ATTRIBUTE_UNUSED,
6144                      const arelent *rel)
6145 {
6146   return rel->address;
6147 }
6148
6149 /* Add extra PPC sections -- Note, for now, make .sbss2 and
6150    .PPC.EMB.sbss0 a normal section, and not a bss section so
6151    that the linker doesn't crater when trying to make more than
6152    2 sections.  */
6153
6154 static struct bfd_elf_special_section const ppc_elf_special_sections[]=
6155 {
6156   { ".tags",             5,  0, SHT_ORDERED,  SHF_ALLOC },
6157   { ".sdata",            6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
6158   { ".sbss",             5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
6159   { ".sdata2",           7, -2, SHT_PROGBITS, SHF_ALLOC },
6160   { ".sbss2",            6, -2, SHT_PROGBITS, SHF_ALLOC },
6161   { ".PPC.EMB.apuinfo", 16,  0, SHT_NOTE,     0 },
6162   { ".PPC.EMB.sdata0",  15,  0, SHT_PROGBITS, SHF_ALLOC },
6163   { ".PPC.EMB.sbss0",   14,  0, SHT_PROGBITS, SHF_ALLOC },
6164   { ".plt",              4,  0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
6165   { NULL,                0,  0, 0,            0 }
6166 };
6167 \f
6168 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
6169 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
6170 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
6171 #define TARGET_BIG_NAME         "elf32-powerpc"
6172 #define ELF_ARCH                bfd_arch_powerpc
6173 #define ELF_MACHINE_CODE        EM_PPC
6174 #ifdef __QNXTARGET__
6175 #define ELF_MAXPAGESIZE         0x1000
6176 #else
6177 #define ELF_MAXPAGESIZE         0x10000
6178 #endif
6179 #define elf_info_to_howto       ppc_elf_info_to_howto
6180
6181 #ifdef  EM_CYGNUS_POWERPC
6182 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
6183 #endif
6184
6185 #ifdef EM_PPC_OLD
6186 #define ELF_MACHINE_ALT2        EM_PPC_OLD
6187 #endif
6188
6189 #define elf_backend_plt_not_loaded      1
6190 #define elf_backend_got_symbol_offset   4
6191 #define elf_backend_can_gc_sections     1
6192 #define elf_backend_can_refcount        1
6193 #define elf_backend_got_header_size     12
6194 #define elf_backend_rela_normal         1
6195
6196 #define bfd_elf32_mkobject                      ppc_elf_mkobject
6197 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
6198 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
6199 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
6200 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
6201 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
6202
6203 #define elf_backend_object_p                    ppc_elf_object_p
6204 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
6205 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
6206 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
6207 #define elf_backend_relocate_section            ppc_elf_relocate_section
6208 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
6209 #define elf_backend_check_relocs                ppc_elf_check_relocs
6210 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
6211 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
6212 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
6213 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
6214 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
6215 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
6216 #define elf_backend_fake_sections               ppc_elf_fake_sections
6217 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
6218 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
6219 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
6220 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
6221 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
6222 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
6223 #define elf_backend_write_section               ppc_elf_write_section
6224 #define elf_backend_special_sections            ppc_elf_special_sections
6225 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
6226
6227 #include "elf32-target.h"