0866e465f03fd803d7b9b4959409fb7df9ba1103
[external/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, 2005 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   /* GNU extension to record C++ vtable hierarchy.  */
1537   HOWTO (R_PPC_GNU_VTINHERIT,   /* type */
1538          0,                     /* rightshift */
1539          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1540          0,                     /* bitsize */
1541          FALSE,                 /* pc_relative */
1542          0,                     /* bitpos */
1543          complain_overflow_dont, /* complain_on_overflow */
1544          NULL,                  /* special_function */
1545          "R_PPC_GNU_VTINHERIT", /* name */
1546          FALSE,                 /* partial_inplace */
1547          0,                     /* src_mask */
1548          0,                     /* dst_mask */
1549          FALSE),                /* pcrel_offset */
1550
1551   /* GNU extension to record C++ vtable member usage.  */
1552   HOWTO (R_PPC_GNU_VTENTRY,     /* type */
1553          0,                     /* rightshift */
1554          0,                     /* size (0 = byte, 1 = short, 2 = long) */
1555          0,                     /* bitsize */
1556          FALSE,                 /* pc_relative */
1557          0,                     /* bitpos */
1558          complain_overflow_dont, /* complain_on_overflow */
1559          NULL,                  /* special_function */
1560          "R_PPC_GNU_VTENTRY",   /* name */
1561          FALSE,                 /* partial_inplace */
1562          0,                     /* src_mask */
1563          0,                     /* dst_mask */
1564          FALSE),                /* pcrel_offset */
1565
1566   /* Phony reloc to handle AIX style TOC entries.  */
1567   HOWTO (R_PPC_TOC16,           /* type */
1568          0,                     /* rightshift */
1569          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1570          16,                    /* bitsize */
1571          FALSE,                 /* pc_relative */
1572          0,                     /* bitpos */
1573          complain_overflow_signed, /* complain_on_overflow */
1574          bfd_elf_generic_reloc, /* special_function */
1575          "R_PPC_TOC16",         /* name */
1576          FALSE,                 /* partial_inplace */
1577          0,                     /* src_mask */
1578          0xffff,                /* dst_mask */
1579          FALSE),                /* pcrel_offset */
1580 };
1581 \f
1582 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1583
1584 static void
1585 ppc_elf_howto_init (void)
1586 {
1587   unsigned int i, type;
1588
1589   for (i = 0;
1590        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1591        i++)
1592     {
1593       type = ppc_elf_howto_raw[i].type;
1594       if (type >= (sizeof (ppc_elf_howto_table)
1595                    / sizeof (ppc_elf_howto_table[0])))
1596         abort ();
1597       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1598     }
1599 }
1600 \f
1601 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
1602
1603 static const int shared_stub_entry[] =
1604   {
1605     0x7c0802a6, /* mflr 0 */
1606     0x429f0005, /* bcl 20, 31, .Lxxx */
1607     0x7d6802a6, /* mflr 11 */
1608     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
1609     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
1610     0x7c0803a6, /* mtlr 0 */
1611     0x7d6903a6, /* mtctr 11 */
1612     0x4e800420, /* bctr */
1613   };
1614
1615 static const int stub_entry[] =
1616   {
1617     0x3d600000, /* lis 11,xxx@ha */
1618     0x396b0000, /* addi 11,11,xxx@l */
1619     0x7d6903a6, /* mtctr 11 */
1620     0x4e800420, /* bctr */
1621   };
1622
1623
1624 static bfd_boolean
1625 ppc_elf_relax_section (bfd *abfd,
1626                        asection *isec,
1627                        struct bfd_link_info *link_info,
1628                        bfd_boolean *again)
1629 {
1630   struct one_fixup
1631   {
1632     struct one_fixup *next;
1633     asection *tsec;
1634     bfd_vma toff;
1635     bfd_vma trampoff;
1636   };
1637
1638   Elf_Internal_Shdr *symtab_hdr;
1639   bfd_byte *contents = NULL;
1640   Elf_Internal_Sym *isymbuf = NULL;
1641   Elf_Internal_Rela *internal_relocs = NULL;
1642   Elf_Internal_Rela *irel, *irelend;
1643   struct one_fixup *fixups = NULL;
1644   bfd_boolean changed;
1645   struct ppc_elf_link_hash_table *ppc_info;
1646   bfd_size_type trampoff;
1647
1648   *again = FALSE;
1649
1650   /* Nothing to do if there are no relocations.  */
1651   if ((isec->flags & SEC_RELOC) == 0 || isec->reloc_count == 0)
1652     return TRUE;
1653
1654   trampoff = (isec->size + 3) & (bfd_vma) -4;
1655   /* Space for a branch around any trampolines.  */
1656   trampoff += 4;
1657
1658   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
1659
1660   /* Get a copy of the native relocations.  */
1661   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
1662                                                link_info->keep_memory);
1663   if (internal_relocs == NULL)
1664     goto error_return;
1665
1666   ppc_info = ppc_elf_hash_table (link_info);
1667   irelend = internal_relocs + isec->reloc_count;
1668
1669   for (irel = internal_relocs; irel < irelend; irel++)
1670     {
1671       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
1672       bfd_vma symaddr, reladdr, toff, roff;
1673       asection *tsec;
1674       struct one_fixup *f;
1675       size_t insn_offset = 0;
1676       bfd_vma max_branch_offset, val;
1677       bfd_byte *hit_addr;
1678       unsigned long t0;
1679       unsigned char sym_type;
1680
1681       switch (r_type)
1682         {
1683         case R_PPC_REL24:
1684         case R_PPC_LOCAL24PC:
1685         case R_PPC_PLTREL24:
1686           max_branch_offset = 1 << 25;
1687           break;
1688
1689         case R_PPC_REL14:
1690         case R_PPC_REL14_BRTAKEN:
1691         case R_PPC_REL14_BRNTAKEN:
1692           max_branch_offset = 1 << 15;
1693           break;
1694
1695         default:
1696           continue;
1697         }
1698
1699       /* Get the value of the symbol referred to by the reloc.  */
1700       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
1701         {
1702           /* A local symbol.  */
1703           Elf_Internal_Sym *isym;
1704
1705           /* Read this BFD's local symbols.  */
1706           if (isymbuf == NULL)
1707             {
1708               isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
1709               if (isymbuf == NULL)
1710                 isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
1711                                                 symtab_hdr->sh_info, 0,
1712                                                 NULL, NULL, NULL);
1713               if (isymbuf == 0)
1714                 goto error_return;
1715             }
1716           isym = isymbuf + ELF32_R_SYM (irel->r_info);
1717           if (isym->st_shndx == SHN_UNDEF)
1718             continue;   /* We can't do anything with undefined symbols.  */
1719           else if (isym->st_shndx == SHN_ABS)
1720             tsec = bfd_abs_section_ptr;
1721           else if (isym->st_shndx == SHN_COMMON)
1722             tsec = bfd_com_section_ptr;
1723           else
1724             tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
1725
1726           toff = isym->st_value;
1727           sym_type = ELF_ST_TYPE (isym->st_info);
1728         }
1729       else
1730         {
1731           /* Global symbol handling.  */
1732           unsigned long indx;
1733           struct elf_link_hash_entry *h;
1734
1735           indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
1736           h = elf_sym_hashes (abfd)[indx];
1737
1738           while (h->root.type == bfd_link_hash_indirect
1739                  || h->root.type == bfd_link_hash_warning)
1740             h = (struct elf_link_hash_entry *) h->root.u.i.link;
1741
1742           if (r_type == R_PPC_PLTREL24
1743               && ppc_info->plt != NULL
1744               && h->plt.offset != (bfd_vma) -1)
1745             {
1746               tsec = ppc_info->plt;
1747               toff = h->plt.offset;
1748             }
1749           else if (h->root.type == bfd_link_hash_defined
1750                    || h->root.type == bfd_link_hash_defweak)
1751             {
1752               tsec = h->root.u.def.section;
1753               toff = h->root.u.def.value;
1754             }
1755           else
1756             continue;
1757
1758           sym_type = h->type;
1759         }
1760
1761       /* If the branch and target are in the same section, you have
1762          no hope of adding stubs.  We'll error out later should the
1763          branch overflow.  */
1764       if (tsec == isec)
1765         continue;
1766
1767       /* There probably isn't any reason to handle symbols in
1768          SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
1769          attribute for a code section, and we are only looking at
1770          branches.  However, implement it correctly here as a
1771          reference for other target relax_section functions.  */
1772       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
1773         {
1774           /* At this stage in linking, no SEC_MERGE symbol has been
1775              adjusted, so all references to such symbols need to be
1776              passed through _bfd_merged_section_offset.  (Later, in
1777              relocate_section, all SEC_MERGE symbols *except* for
1778              section symbols have been adjusted.)
1779
1780              gas may reduce relocations against symbols in SEC_MERGE
1781              sections to a relocation against the section symbol when
1782              the original addend was zero.  When the reloc is against
1783              a section symbol we should include the addend in the
1784              offset passed to _bfd_merged_section_offset, since the
1785              location of interest is the original symbol.  On the
1786              other hand, an access to "sym+addend" where "sym" is not
1787              a section symbol should not include the addend;  Such an
1788              access is presumed to be an offset from "sym";  The
1789              location of interest is just "sym".  */
1790           if (sym_type == STT_SECTION)
1791             toff += irel->r_addend;
1792
1793           toff = _bfd_merged_section_offset (abfd, &tsec,
1794                                              elf_section_data (tsec)->sec_info,
1795                                              toff);
1796
1797           if (sym_type != STT_SECTION)
1798             toff += irel->r_addend;
1799         }
1800       else
1801         toff += irel->r_addend;
1802
1803       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
1804
1805       roff = irel->r_offset;
1806       reladdr = isec->output_section->vma + isec->output_offset + roff;
1807
1808       /* If the branch is in range, no need to do anything.  */
1809       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
1810         continue;
1811
1812       /* Look for an existing fixup to this address.  */
1813       for (f = fixups; f ; f = f->next)
1814         if (f->tsec == tsec && f->toff == toff)
1815           break;
1816
1817       if (f == NULL)
1818         {
1819           size_t size;
1820           unsigned long stub_rtype;
1821
1822           val = trampoff - roff;
1823           if (val >= max_branch_offset)
1824             /* Oh dear, we can't reach a trampoline.  Don't try to add
1825                one.  We'll report an error later.  */
1826             continue;
1827
1828           if (link_info->shared)
1829             {
1830               size = 4 * ARRAY_SIZE (shared_stub_entry);
1831               insn_offset = 12;
1832               stub_rtype = R_PPC_RELAX32PC;
1833             }
1834           else
1835             {
1836               size = 4 * ARRAY_SIZE (stub_entry);
1837               insn_offset = 0;
1838               stub_rtype = R_PPC_RELAX32;
1839             }
1840
1841           if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
1842               != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
1843             abort ();
1844           if (tsec == ppc_info->plt)
1845             stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
1846
1847           /* Hijack the old relocation.  Since we need two
1848              relocations for this use a "composite" reloc.  */
1849           irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
1850                                        stub_rtype);
1851           irel->r_offset = trampoff + insn_offset;
1852
1853           /* Record the fixup so we don't do it again this section.  */
1854           f = bfd_malloc (sizeof (*f));
1855           f->next = fixups;
1856           f->tsec = tsec;
1857           f->toff = toff;
1858           f->trampoff = trampoff;
1859           fixups = f;
1860
1861           trampoff += size;
1862         }
1863       else
1864         {
1865           val = f->trampoff - roff;
1866           if (val >= max_branch_offset)
1867             continue;
1868
1869           /* Nop out the reloc, since we're finalizing things here.  */
1870           irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
1871         }
1872
1873       /* Get the section contents.  */
1874       if (contents == NULL)
1875         {
1876           /* Get cached copy if it exists.  */
1877           if (elf_section_data (isec)->this_hdr.contents != NULL)
1878             contents = elf_section_data (isec)->this_hdr.contents;
1879           else
1880             {
1881               /* Go get them off disk.  */
1882               if (!bfd_malloc_and_get_section (abfd, isec, &contents))
1883                 goto error_return;
1884             }
1885         }
1886
1887       /* Fix up the existing branch to hit the trampoline.  */
1888       hit_addr = contents + roff;
1889       switch (r_type)
1890         {
1891         case R_PPC_REL24:
1892         case R_PPC_LOCAL24PC:
1893         case R_PPC_PLTREL24:
1894           t0 = bfd_get_32 (abfd, hit_addr);
1895           t0 &= ~0x3fffffc;
1896           t0 |= val & 0x3fffffc;
1897           bfd_put_32 (abfd, t0, hit_addr);
1898           break;
1899
1900         case R_PPC_REL14:
1901         case R_PPC_REL14_BRTAKEN:
1902         case R_PPC_REL14_BRNTAKEN:
1903           t0 = bfd_get_32 (abfd, hit_addr);
1904           t0 &= ~0xfffc;
1905           t0 |= val & 0xfffc;
1906           bfd_put_32 (abfd, t0, hit_addr);
1907           break;
1908         }
1909     }
1910
1911   /* Write out the trampolines.  */
1912   changed = fixups != NULL;
1913   if (fixups != NULL)
1914     {
1915       const int *stub;
1916       bfd_byte *dest;
1917       bfd_vma val;
1918       int i, size;
1919
1920       do
1921         {
1922           struct one_fixup *f = fixups;
1923           fixups = fixups->next;
1924           free (f);
1925         }
1926       while (fixups);
1927
1928       contents = bfd_realloc (contents, trampoff);
1929       if (contents == NULL)
1930         goto error_return;
1931
1932       isec->size = (isec->size + 3) & (bfd_vma) -4;
1933       /* Branch around the trampolines.  */
1934       val = trampoff - isec->size + 0x48000000;
1935       dest = contents + isec->size;
1936       isec->size = trampoff;
1937       bfd_put_32 (abfd, val, dest);
1938       dest += 4;
1939
1940       if (link_info->shared)
1941         {
1942           stub = shared_stub_entry;
1943           size = ARRAY_SIZE (shared_stub_entry);
1944         }
1945       else
1946         {
1947           stub = stub_entry;
1948           size = ARRAY_SIZE (stub_entry);
1949         }
1950
1951       i = 0;
1952       while (dest < contents + trampoff)
1953         {
1954           bfd_put_32 (abfd, stub[i], dest);
1955           i++;
1956           if (i == size)
1957             i = 0;
1958           dest += 4;
1959         }
1960       BFD_ASSERT (i == 0);
1961     }
1962
1963   if (isymbuf != NULL
1964       && symtab_hdr->contents != (unsigned char *) isymbuf)
1965     {
1966       if (! link_info->keep_memory)
1967         free (isymbuf);
1968       else
1969         {
1970           /* Cache the symbols for elf_link_input_bfd.  */
1971           symtab_hdr->contents = (unsigned char *) isymbuf;
1972         }
1973     }
1974
1975   if (contents != NULL
1976       && elf_section_data (isec)->this_hdr.contents != contents)
1977     {
1978       if (!changed && !link_info->keep_memory)
1979         free (contents);
1980       else
1981         {
1982           /* Cache the section contents for elf_link_input_bfd.  */
1983           elf_section_data (isec)->this_hdr.contents = contents;
1984         }
1985     }
1986
1987   if (elf_section_data (isec)->relocs != internal_relocs)
1988     {
1989       if (!changed)
1990         free (internal_relocs);
1991       else
1992         elf_section_data (isec)->relocs = internal_relocs;
1993     }
1994
1995   *again = changed;
1996   return TRUE;
1997
1998  error_return:
1999   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
2000     free (isymbuf);
2001   if (contents != NULL
2002       && elf_section_data (isec)->this_hdr.contents != contents)
2003     free (contents);
2004   if (internal_relocs != NULL
2005       && elf_section_data (isec)->relocs != internal_relocs)
2006     free (internal_relocs);
2007   return FALSE;
2008 }
2009 \f
2010 static reloc_howto_type *
2011 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2012                            bfd_reloc_code_real_type code)
2013 {
2014   enum elf_ppc_reloc_type r;
2015
2016   /* Initialize howto table if not already done.  */
2017   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2018     ppc_elf_howto_init ();
2019
2020   switch (code)
2021     {
2022     default:
2023       return NULL;
2024
2025     case BFD_RELOC_NONE:                r = R_PPC_NONE;                 break;
2026     case BFD_RELOC_32:                  r = R_PPC_ADDR32;               break;
2027     case BFD_RELOC_PPC_BA26:            r = R_PPC_ADDR24;               break;
2028     case BFD_RELOC_16:                  r = R_PPC_ADDR16;               break;
2029     case BFD_RELOC_LO16:                r = R_PPC_ADDR16_LO;            break;
2030     case BFD_RELOC_HI16:                r = R_PPC_ADDR16_HI;            break;
2031     case BFD_RELOC_HI16_S:              r = R_PPC_ADDR16_HA;            break;
2032     case BFD_RELOC_PPC_BA16:            r = R_PPC_ADDR14;               break;
2033     case BFD_RELOC_PPC_BA16_BRTAKEN:    r = R_PPC_ADDR14_BRTAKEN;       break;
2034     case BFD_RELOC_PPC_BA16_BRNTAKEN:   r = R_PPC_ADDR14_BRNTAKEN;      break;
2035     case BFD_RELOC_PPC_B26:             r = R_PPC_REL24;                break;
2036     case BFD_RELOC_PPC_B16:             r = R_PPC_REL14;                break;
2037     case BFD_RELOC_PPC_B16_BRTAKEN:     r = R_PPC_REL14_BRTAKEN;        break;
2038     case BFD_RELOC_PPC_B16_BRNTAKEN:    r = R_PPC_REL14_BRNTAKEN;       break;
2039     case BFD_RELOC_16_GOTOFF:           r = R_PPC_GOT16;                break;
2040     case BFD_RELOC_LO16_GOTOFF:         r = R_PPC_GOT16_LO;             break;
2041     case BFD_RELOC_HI16_GOTOFF:         r = R_PPC_GOT16_HI;             break;
2042     case BFD_RELOC_HI16_S_GOTOFF:       r = R_PPC_GOT16_HA;             break;
2043     case BFD_RELOC_24_PLT_PCREL:        r = R_PPC_PLTREL24;             break;
2044     case BFD_RELOC_PPC_COPY:            r = R_PPC_COPY;                 break;
2045     case BFD_RELOC_PPC_GLOB_DAT:        r = R_PPC_GLOB_DAT;             break;
2046     case BFD_RELOC_PPC_LOCAL24PC:       r = R_PPC_LOCAL24PC;            break;
2047     case BFD_RELOC_32_PCREL:            r = R_PPC_REL32;                break;
2048     case BFD_RELOC_32_PLTOFF:           r = R_PPC_PLT32;                break;
2049     case BFD_RELOC_32_PLT_PCREL:        r = R_PPC_PLTREL32;             break;
2050     case BFD_RELOC_LO16_PLTOFF:         r = R_PPC_PLT16_LO;             break;
2051     case BFD_RELOC_HI16_PLTOFF:         r = R_PPC_PLT16_HI;             break;
2052     case BFD_RELOC_HI16_S_PLTOFF:       r = R_PPC_PLT16_HA;             break;
2053     case BFD_RELOC_GPREL16:             r = R_PPC_SDAREL16;             break;
2054     case BFD_RELOC_16_BASEREL:          r = R_PPC_SECTOFF;              break;
2055     case BFD_RELOC_LO16_BASEREL:        r = R_PPC_SECTOFF_LO;           break;
2056     case BFD_RELOC_HI16_BASEREL:        r = R_PPC_SECTOFF_HI;           break;
2057     case BFD_RELOC_HI16_S_BASEREL:      r = R_PPC_SECTOFF_HA;           break;
2058     case BFD_RELOC_CTOR:                r = R_PPC_ADDR32;               break;
2059     case BFD_RELOC_PPC_TOC16:           r = R_PPC_TOC16;                break;
2060     case BFD_RELOC_PPC_TLS:             r = R_PPC_TLS;                  break;
2061     case BFD_RELOC_PPC_DTPMOD:          r = R_PPC_DTPMOD32;             break;
2062     case BFD_RELOC_PPC_TPREL16:         r = R_PPC_TPREL16;              break;
2063     case BFD_RELOC_PPC_TPREL16_LO:      r = R_PPC_TPREL16_LO;           break;
2064     case BFD_RELOC_PPC_TPREL16_HI:      r = R_PPC_TPREL16_HI;           break;
2065     case BFD_RELOC_PPC_TPREL16_HA:      r = R_PPC_TPREL16_HA;           break;
2066     case BFD_RELOC_PPC_TPREL:           r = R_PPC_TPREL32;              break;
2067     case BFD_RELOC_PPC_DTPREL16:        r = R_PPC_DTPREL16;             break;
2068     case BFD_RELOC_PPC_DTPREL16_LO:     r = R_PPC_DTPREL16_LO;          break;
2069     case BFD_RELOC_PPC_DTPREL16_HI:     r = R_PPC_DTPREL16_HI;          break;
2070     case BFD_RELOC_PPC_DTPREL16_HA:     r = R_PPC_DTPREL16_HA;          break;
2071     case BFD_RELOC_PPC_DTPREL:          r = R_PPC_DTPREL32;             break;
2072     case BFD_RELOC_PPC_GOT_TLSGD16:     r = R_PPC_GOT_TLSGD16;          break;
2073     case BFD_RELOC_PPC_GOT_TLSGD16_LO:  r = R_PPC_GOT_TLSGD16_LO;       break;
2074     case BFD_RELOC_PPC_GOT_TLSGD16_HI:  r = R_PPC_GOT_TLSGD16_HI;       break;
2075     case BFD_RELOC_PPC_GOT_TLSGD16_HA:  r = R_PPC_GOT_TLSGD16_HA;       break;
2076     case BFD_RELOC_PPC_GOT_TLSLD16:     r = R_PPC_GOT_TLSLD16;          break;
2077     case BFD_RELOC_PPC_GOT_TLSLD16_LO:  r = R_PPC_GOT_TLSLD16_LO;       break;
2078     case BFD_RELOC_PPC_GOT_TLSLD16_HI:  r = R_PPC_GOT_TLSLD16_HI;       break;
2079     case BFD_RELOC_PPC_GOT_TLSLD16_HA:  r = R_PPC_GOT_TLSLD16_HA;       break;
2080     case BFD_RELOC_PPC_GOT_TPREL16:     r = R_PPC_GOT_TPREL16;          break;
2081     case BFD_RELOC_PPC_GOT_TPREL16_LO:  r = R_PPC_GOT_TPREL16_LO;       break;
2082     case BFD_RELOC_PPC_GOT_TPREL16_HI:  r = R_PPC_GOT_TPREL16_HI;       break;
2083     case BFD_RELOC_PPC_GOT_TPREL16_HA:  r = R_PPC_GOT_TPREL16_HA;       break;
2084     case BFD_RELOC_PPC_GOT_DTPREL16:    r = R_PPC_GOT_DTPREL16;         break;
2085     case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC_GOT_DTPREL16_LO;      break;
2086     case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC_GOT_DTPREL16_HI;      break;
2087     case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC_GOT_DTPREL16_HA;      break;
2088     case BFD_RELOC_PPC_EMB_NADDR32:     r = R_PPC_EMB_NADDR32;          break;
2089     case BFD_RELOC_PPC_EMB_NADDR16:     r = R_PPC_EMB_NADDR16;          break;
2090     case BFD_RELOC_PPC_EMB_NADDR16_LO:  r = R_PPC_EMB_NADDR16_LO;       break;
2091     case BFD_RELOC_PPC_EMB_NADDR16_HI:  r = R_PPC_EMB_NADDR16_HI;       break;
2092     case BFD_RELOC_PPC_EMB_NADDR16_HA:  r = R_PPC_EMB_NADDR16_HA;       break;
2093     case BFD_RELOC_PPC_EMB_SDAI16:      r = R_PPC_EMB_SDAI16;           break;
2094     case BFD_RELOC_PPC_EMB_SDA2I16:     r = R_PPC_EMB_SDA2I16;          break;
2095     case BFD_RELOC_PPC_EMB_SDA2REL:     r = R_PPC_EMB_SDA2REL;          break;
2096     case BFD_RELOC_PPC_EMB_SDA21:       r = R_PPC_EMB_SDA21;            break;
2097     case BFD_RELOC_PPC_EMB_MRKREF:      r = R_PPC_EMB_MRKREF;           break;
2098     case BFD_RELOC_PPC_EMB_RELSEC16:    r = R_PPC_EMB_RELSEC16;         break;
2099     case BFD_RELOC_PPC_EMB_RELST_LO:    r = R_PPC_EMB_RELST_LO;         break;
2100     case BFD_RELOC_PPC_EMB_RELST_HI:    r = R_PPC_EMB_RELST_HI;         break;
2101     case BFD_RELOC_PPC_EMB_RELST_HA:    r = R_PPC_EMB_RELST_HA;         break;
2102     case BFD_RELOC_PPC_EMB_BIT_FLD:     r = R_PPC_EMB_BIT_FLD;          break;
2103     case BFD_RELOC_PPC_EMB_RELSDA:      r = R_PPC_EMB_RELSDA;           break;
2104     case BFD_RELOC_VTABLE_INHERIT:      r = R_PPC_GNU_VTINHERIT;        break;
2105     case BFD_RELOC_VTABLE_ENTRY:        r = R_PPC_GNU_VTENTRY;          break;
2106     }
2107
2108   return ppc_elf_howto_table[r];
2109 };
2110
2111 /* Set the howto pointer for a PowerPC ELF reloc.  */
2112
2113 static void
2114 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
2115                        arelent *cache_ptr,
2116                        Elf_Internal_Rela *dst)
2117 {
2118   /* Initialize howto table if not already done.  */
2119   if (!ppc_elf_howto_table[R_PPC_ADDR32])
2120     ppc_elf_howto_init ();
2121
2122   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
2123   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
2124 }
2125
2126 /* Handle the R_PPC_ADDR16_HA reloc.  */
2127
2128 static bfd_reloc_status_type
2129 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
2130                          arelent *reloc_entry,
2131                          asymbol *symbol,
2132                          void *data ATTRIBUTE_UNUSED,
2133                          asection *input_section,
2134                          bfd *output_bfd,
2135                          char **error_message ATTRIBUTE_UNUSED)
2136 {
2137   bfd_vma relocation;
2138
2139   if (output_bfd != NULL)
2140     {
2141       reloc_entry->address += input_section->output_offset;
2142       return bfd_reloc_ok;
2143     }
2144
2145   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2146     return bfd_reloc_outofrange;
2147
2148   if (bfd_is_com_section (symbol->section))
2149     relocation = 0;
2150   else
2151     relocation = symbol->value;
2152
2153   relocation += symbol->section->output_section->vma;
2154   relocation += symbol->section->output_offset;
2155   relocation += reloc_entry->addend;
2156
2157   reloc_entry->addend += (relocation & 0x8000) << 1;
2158
2159   return bfd_reloc_continue;
2160 }
2161
2162 static bfd_reloc_status_type
2163 ppc_elf_unhandled_reloc (bfd *abfd,
2164                          arelent *reloc_entry,
2165                          asymbol *symbol,
2166                          void *data,
2167                          asection *input_section,
2168                          bfd *output_bfd,
2169                          char **error_message)
2170 {
2171   /* If this is a relocatable link (output_bfd test tells us), just
2172      call the generic function.  Any adjustment will be done at final
2173      link time.  */
2174   if (output_bfd != NULL)
2175     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2176                                   input_section, output_bfd, error_message);
2177
2178   if (error_message != NULL)
2179     {
2180       static char buf[60];
2181       sprintf (buf, _("generic linker can't handle %s"),
2182                reloc_entry->howto->name);
2183       *error_message = buf;
2184     }
2185   return bfd_reloc_dangerous;
2186 }
2187
2188 /* Fix bad default arch selected for a 32 bit input bfd when the
2189    default is 64 bit.  */
2190
2191 static bfd_boolean
2192 ppc_elf_object_p (bfd *abfd)
2193 {
2194   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
2195     {
2196       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2197
2198       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
2199         {
2200           /* Relies on arch after 64 bit default being 32 bit default.  */
2201           abfd->arch_info = abfd->arch_info->next;
2202           BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
2203         }
2204     }
2205   return TRUE;
2206 }
2207
2208 /* Function to set whether a module needs the -mrelocatable bit set.  */
2209
2210 static bfd_boolean
2211 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
2212 {
2213   BFD_ASSERT (!elf_flags_init (abfd)
2214               || elf_elfheader (abfd)->e_flags == flags);
2215
2216   elf_elfheader (abfd)->e_flags = flags;
2217   elf_flags_init (abfd) = TRUE;
2218   return TRUE;
2219 }
2220
2221 /* Merge backend specific data from an object file to the output
2222    object file when linking.  */
2223
2224 static bfd_boolean
2225 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2226 {
2227   flagword old_flags;
2228   flagword new_flags;
2229   bfd_boolean error;
2230
2231   /* Check if we have the same endianess.  */
2232   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
2233     return FALSE;
2234
2235   if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
2236       || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
2237     return TRUE;
2238
2239   new_flags = elf_elfheader (ibfd)->e_flags;
2240   old_flags = elf_elfheader (obfd)->e_flags;
2241   if (!elf_flags_init (obfd))
2242     {
2243       /* First call, no flags set.  */
2244       elf_flags_init (obfd) = TRUE;
2245       elf_elfheader (obfd)->e_flags = new_flags;
2246     }
2247
2248   /* Compatible flags are ok.  */
2249   else if (new_flags == old_flags)
2250     ;
2251
2252   /* Incompatible flags.  */
2253   else
2254     {
2255       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
2256          to be linked with either.  */
2257       error = FALSE;
2258       if ((new_flags & EF_PPC_RELOCATABLE) != 0
2259           && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
2260         {
2261           error = TRUE;
2262           (*_bfd_error_handler)
2263             (_("%B: compiled with -mrelocatable and linked with "
2264                "modules compiled normally"), ibfd);
2265         }
2266       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
2267                && (old_flags & EF_PPC_RELOCATABLE) != 0)
2268         {
2269           error = TRUE;
2270           (*_bfd_error_handler)
2271             (_("%B: compiled normally and linked with "
2272                "modules compiled with -mrelocatable"), ibfd);
2273         }
2274
2275       /* The output is -mrelocatable-lib iff both the input files are.  */
2276       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
2277         elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
2278
2279       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
2280          but each input file is either -mrelocatable or -mrelocatable-lib.  */
2281       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
2282           && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
2283           && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
2284         elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
2285
2286       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
2287          any module uses it.  */
2288       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
2289
2290       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
2291       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
2292
2293       /* Warn about any other mismatches.  */
2294       if (new_flags != old_flags)
2295         {
2296           error = TRUE;
2297           (*_bfd_error_handler)
2298             (_("%B: uses different e_flags (0x%lx) fields "
2299                "than previous modules (0x%lx)"),
2300              ibfd, (long) new_flags, (long) old_flags);
2301         }
2302
2303       if (error)
2304         {
2305           bfd_set_error (bfd_error_bad_value);
2306           return FALSE;
2307         }
2308     }
2309
2310   return TRUE;
2311 }
2312 \f
2313 /* Handle a PowerPC specific section when reading an object file.  This
2314    is called when elfcode.h finds a section with an unknown type.  */
2315
2316 static bfd_boolean
2317 ppc_elf_section_from_shdr (bfd *abfd, Elf_Internal_Shdr *hdr, const char *name)
2318 {
2319   asection *newsect;
2320   flagword flags;
2321
2322   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
2323     return FALSE;
2324
2325   newsect = hdr->bfd_section;
2326   flags = bfd_get_section_flags (abfd, newsect);
2327   if (hdr->sh_flags & SHF_EXCLUDE)
2328     flags |= SEC_EXCLUDE;
2329
2330   if (hdr->sh_type == SHT_ORDERED)
2331     flags |= SEC_SORT_ENTRIES;
2332
2333   bfd_set_section_flags (abfd, newsect, flags);
2334   return TRUE;
2335 }
2336 \f
2337 /* Set up any other section flags and such that may be necessary.  */
2338
2339 static bfd_boolean
2340 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2341                        Elf_Internal_Shdr *shdr,
2342                        asection *asect)
2343 {
2344   if ((asect->flags & SEC_EXCLUDE) != 0)
2345     shdr->sh_flags |= SHF_EXCLUDE;
2346
2347   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
2348     shdr->sh_type = SHT_ORDERED;
2349
2350   return TRUE;
2351 }
2352 \f
2353 /* Find a linker generated pointer with a given addend and type.  */
2354
2355 static elf_linker_section_pointers_t *
2356 elf_find_pointer_linker_section
2357   (elf_linker_section_pointers_t *linker_pointers,
2358    bfd_vma addend,
2359    elf_linker_section_t *lsect)
2360 {
2361   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2362     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2363       return linker_pointers;
2364
2365   return NULL;
2366 }
2367 \f
2368 /* Allocate a pointer to live in a linker created section.  */
2369
2370 static bfd_boolean
2371 elf_create_pointer_linker_section (bfd *abfd,
2372                                    struct bfd_link_info *info,
2373                                    elf_linker_section_t *lsect,
2374                                    struct elf_link_hash_entry *h,
2375                                    const Elf_Internal_Rela *rel)
2376 {
2377   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2378   elf_linker_section_pointers_t *linker_section_ptr;
2379   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2380   bfd_size_type amt;
2381
2382   BFD_ASSERT (lsect != NULL);
2383
2384   /* Is this a global symbol?  */
2385   if (h != NULL)
2386     {
2387       struct ppc_elf_link_hash_entry *eh;
2388
2389       /* Has this symbol already been allocated?  If so, our work is done.  */
2390       eh = (struct ppc_elf_link_hash_entry *) h;
2391       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2392                                            rel->r_addend,
2393                                            lsect))
2394         return TRUE;
2395
2396       ptr_linker_section_ptr = &eh->linker_section_pointer;
2397       /* Make sure this symbol is output as a dynamic symbol.  */
2398       if (h->dynindx == -1)
2399         {
2400           if (! bfd_elf_link_record_dynamic_symbol (info, h))
2401             return FALSE;
2402         }
2403
2404       if (lsect->rel_section)
2405         lsect->rel_section->size += sizeof (Elf32_External_Rela);
2406     }
2407   else
2408     {
2409       /* Allocation of a pointer to a local symbol.  */
2410       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2411
2412       /* Allocate a table to hold the local symbols if first time.  */
2413       if (!ptr)
2414         {
2415           unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2416
2417           amt = num_symbols;
2418           amt *= sizeof (elf_linker_section_pointers_t *);
2419           ptr = bfd_zalloc (abfd, amt);
2420
2421           if (!ptr)
2422             return FALSE;
2423
2424           elf_local_ptr_offsets (abfd) = ptr;
2425         }
2426
2427       /* Has this symbol already been allocated?  If so, our work is done.  */
2428       if (elf_find_pointer_linker_section (ptr[r_symndx],
2429                                            rel->r_addend,
2430                                            lsect))
2431         return TRUE;
2432
2433       ptr_linker_section_ptr = &ptr[r_symndx];
2434
2435       if (info->shared)
2436         {
2437           /* If we are generating a shared object, we need to
2438              output a R_<xxx>_RELATIVE reloc so that the
2439              dynamic linker can adjust this GOT entry.  */
2440           BFD_ASSERT (lsect->rel_section != NULL);
2441           lsect->rel_section->size += sizeof (Elf32_External_Rela);
2442         }
2443     }
2444
2445   /* Allocate space for a pointer in the linker section, and allocate
2446      a new pointer record from internal memory.  */
2447   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2448   amt = sizeof (elf_linker_section_pointers_t);
2449   linker_section_ptr = bfd_alloc (abfd, amt);
2450
2451   if (!linker_section_ptr)
2452     return FALSE;
2453
2454   linker_section_ptr->next = *ptr_linker_section_ptr;
2455   linker_section_ptr->addend = rel->r_addend;
2456   linker_section_ptr->lsect = lsect;
2457   linker_section_ptr->written_address_p = FALSE;
2458   *ptr_linker_section_ptr = linker_section_ptr;
2459
2460   linker_section_ptr->offset = lsect->section->size;
2461   lsect->section->size += 4;
2462
2463 #ifdef DEBUG
2464   fprintf (stderr,
2465            "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2466            lsect->name, (long) linker_section_ptr->offset,
2467            (long) lsect->section->size);
2468 #endif
2469
2470   return TRUE;
2471 }
2472 \f
2473 #define bfd_put_ptr(BFD, VAL, ADDR) bfd_put_32 (BFD, VAL, ADDR)
2474
2475 /* Fill in the address for a pointer generated in a linker section.  */
2476
2477 static bfd_vma
2478 elf_finish_pointer_linker_section (bfd *output_bfd,
2479                                    bfd *input_bfd,
2480                                    struct bfd_link_info *info,
2481                                    elf_linker_section_t *lsect,
2482                                    struct elf_link_hash_entry *h,
2483                                    bfd_vma relocation,
2484                                    const Elf_Internal_Rela *rel,
2485                                    int relative_reloc)
2486 {
2487   elf_linker_section_pointers_t *linker_section_ptr;
2488
2489   BFD_ASSERT (lsect != NULL);
2490
2491   if (h != NULL)
2492     {
2493       /* Handle global symbol.  */
2494       struct ppc_elf_link_hash_entry *eh;
2495
2496       eh = (struct ppc_elf_link_hash_entry *) h;
2497       linker_section_ptr
2498         = elf_find_pointer_linker_section (eh->linker_section_pointer,
2499                                            rel->r_addend,
2500                                            lsect);
2501
2502       BFD_ASSERT (linker_section_ptr != NULL);
2503
2504       if (! elf_hash_table (info)->dynamic_sections_created
2505           || (info->shared
2506               && info->symbolic
2507               && h->def_regular))
2508         {
2509           /* This is actually a static link, or it is a
2510              -Bsymbolic link and the symbol is defined
2511              locally.  We must initialize this entry in the
2512              global section.
2513
2514              When doing a dynamic link, we create a .rela.<xxx>
2515              relocation entry to initialize the value.  This
2516              is done in the finish_dynamic_symbol routine.  */
2517           if (!linker_section_ptr->written_address_p)
2518             {
2519               linker_section_ptr->written_address_p = TRUE;
2520               bfd_put_ptr (output_bfd,
2521                            relocation + linker_section_ptr->addend,
2522                            (lsect->section->contents
2523                             + linker_section_ptr->offset));
2524             }
2525         }
2526     }
2527   else
2528     {
2529       /* Handle local symbol.  */
2530       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2531       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
2532       BFD_ASSERT (elf_local_ptr_offsets (input_bfd)[r_symndx] != NULL);
2533       linker_section_ptr = (elf_find_pointer_linker_section
2534                             (elf_local_ptr_offsets (input_bfd)[r_symndx],
2535                              rel->r_addend,
2536                              lsect));
2537
2538       BFD_ASSERT (linker_section_ptr != NULL);
2539
2540       /* Write out pointer if it hasn't been rewritten out before.  */
2541       if (!linker_section_ptr->written_address_p)
2542         {
2543           linker_section_ptr->written_address_p = TRUE;
2544           bfd_put_ptr (output_bfd, relocation + linker_section_ptr->addend,
2545                        lsect->section->contents + linker_section_ptr->offset);
2546
2547           if (info->shared)
2548             {
2549               /* We need to generate a relative reloc for the dynamic
2550                  linker.  */
2551
2552               asection *srel = lsect->rel_section;
2553               Elf_Internal_Rela outrel[MAX_INT_RELS_PER_EXT_REL];
2554               bfd_byte *erel;
2555               const struct elf_backend_data *bed;
2556               unsigned int i;
2557
2558               BFD_ASSERT (srel != NULL);
2559
2560               bed = get_elf_backend_data (output_bfd);
2561               for (i = 0; i < bed->s->int_rels_per_ext_rel; i++)
2562                 {
2563                   outrel[i].r_offset = (lsect->section->output_section->vma
2564                                         + lsect->section->output_offset
2565                                         + linker_section_ptr->offset);
2566                   outrel[i].r_info = 0;
2567                   outrel[i].r_addend = 0;
2568                 }
2569               outrel[0].r_info = ELF32_R_INFO (0, relative_reloc);
2570               erel = lsect->section->contents;
2571               erel += (elf_section_data (lsect->section)->rel_count++
2572                        * sizeof (Elf32_External_Rela));
2573               bfd_elf32_swap_reloca_out (output_bfd, outrel, erel);
2574             }
2575         }
2576     }
2577
2578   relocation = (lsect->section->output_offset
2579                 + linker_section_ptr->offset
2580                 - lsect->sym_offset);
2581
2582 #ifdef DEBUG
2583   fprintf (stderr,
2584            "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
2585            lsect->name, (long) relocation, (long) relocation);
2586 #endif
2587
2588   /* Subtract out the addend, because it will get added back in by the normal
2589      processing.  */
2590   return relocation - linker_section_ptr->addend;
2591 }
2592 \f
2593 /* Create a special linker section */
2594 static elf_linker_section_t *
2595 ppc_elf_create_linker_section (bfd *abfd,
2596                                struct bfd_link_info *info,
2597                                enum elf_linker_section_enum which)
2598 {
2599   elf_linker_section_t *lsect;
2600   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2601   asection *s, *sym_sec;
2602   bfd_size_type amt;
2603   flagword flags;
2604   const char *name;
2605   const char *rel_name;
2606   const char *sym_name;
2607   bfd_vma sym_offset;
2608
2609   /* The linker creates these sections so it has somewhere to attach
2610      their respective symbols.  Startup code (crt1.o) uses these symbols
2611      to initialize a register pointing to the section.  If the output
2612      sections corresponding to these input sections were empty it would
2613      be OK to set the symbol to 0 (or any random number), because the
2614      associated register should never be used.
2615      FIXME: Setting a symbol this way is silly.  The symbols ought to 
2616      be set the same way other backends set gp.  */
2617   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2618            | SEC_LINKER_CREATED);
2619   sym_offset = 32768;
2620
2621   switch (which)
2622     {
2623     default:
2624       abort ();
2625       return NULL;
2626
2627     case LINKER_SECTION_SDATA:  /* .sdata/.sbss section */
2628       name      = ".sdata";
2629       rel_name  = ".rela.sdata";
2630       sym_name  = "_SDA_BASE_";
2631       break;
2632
2633     case LINKER_SECTION_SDATA2: /* .sdata2/.sbss2 section */
2634       name      = ".sdata2";
2635       rel_name  = ".rela.sdata2";
2636       sym_name  = "_SDA2_BASE_";
2637       flags    |= SEC_READONLY;
2638       break;
2639     }
2640
2641   /* Record the first bfd that needs the special sections.  */
2642   if (!htab->elf.dynobj)
2643     htab->elf.dynobj = abfd;
2644
2645   amt = sizeof (elf_linker_section_t);
2646   lsect = bfd_zalloc (htab->elf.dynobj, amt);
2647
2648   lsect->sym_offset = sym_offset;
2649
2650   /* See if the sections already exist.  */
2651   sym_sec = s = bfd_get_section_by_name (htab->elf.dynobj, name);
2652   if (s == NULL || (s->flags & flags) != flags)
2653     {
2654       s = bfd_make_section_anyway (htab->elf.dynobj, name);
2655       if (s == NULL
2656           || !bfd_set_section_flags (htab->elf.dynobj, s, flags))
2657         return NULL;
2658       if (sym_sec == NULL)
2659         sym_sec = s;
2660     }
2661   lsect->section = s;
2662
2663   if (bfd_get_section_alignment (htab->elf.dynobj, s) < 2
2664       && !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2665     return NULL;
2666
2667   s->size = align_power (s->size, 2);
2668
2669 #ifdef DEBUG
2670   fprintf (stderr, "Creating section %s, current size = %ld\n",
2671            name, (long) s->size);
2672 #endif
2673
2674   if (sym_name)
2675     {
2676       struct elf_link_hash_entry *h;
2677       struct bfd_link_hash_entry *bh;
2678
2679 #ifdef DEBUG
2680       fprintf (stderr, "Adding %s to section %s\n", sym_name, name);
2681 #endif
2682       bh = bfd_link_hash_lookup (info->hash, sym_name,
2683                                  FALSE, FALSE, FALSE);
2684
2685       if ((bh == NULL || bh->type == bfd_link_hash_undefined)
2686           && !(_bfd_generic_link_add_one_symbol
2687                (info, abfd, sym_name, BSF_GLOBAL, sym_sec, sym_offset, NULL,
2688                 FALSE, get_elf_backend_data (abfd)->collect, &bh)))
2689         return NULL;
2690       h = (struct elf_link_hash_entry *) bh;
2691
2692       h->type = STT_OBJECT;
2693       lsect->sym_hash = h;
2694
2695       if (info->shared
2696           && ! bfd_elf_link_record_dynamic_symbol (info, h))
2697         return NULL;
2698     }
2699
2700   if (info->shared)
2701     {
2702       s = bfd_make_section_anyway (htab->elf.dynobj, rel_name);
2703       lsect->rel_section = s;
2704       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2705                | SEC_LINKER_CREATED | SEC_READONLY);
2706       if (s == NULL
2707           || ! bfd_set_section_flags (htab->elf.dynobj, s, flags)
2708           || ! bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2709         return NULL;
2710     }
2711
2712   return lsect;
2713 }
2714 \f
2715 /* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
2716    need to bump up the number of section headers.  */
2717
2718 static int
2719 ppc_elf_additional_program_headers (bfd *abfd)
2720 {
2721   asection *s;
2722   int ret = 0;
2723
2724   s = bfd_get_section_by_name (abfd, ".sbss2");
2725   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
2726     ++ret;
2727
2728   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
2729   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
2730     ++ret;
2731
2732   return ret;
2733 }
2734 \f
2735 /* The powerpc .got has a blrl instruction in it.  Mark it executable.  */
2736
2737 static bfd_boolean
2738 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2739 {
2740   struct ppc_elf_link_hash_table *htab;
2741   asection *s;
2742   flagword flags;
2743
2744   if (!_bfd_elf_create_got_section (abfd, info))
2745     return FALSE;
2746
2747   htab = ppc_elf_hash_table (info);
2748   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2749   if (s == NULL)
2750     abort ();
2751
2752   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2753            | SEC_LINKER_CREATED);
2754   if (!bfd_set_section_flags (abfd, s, flags))
2755     return FALSE;
2756
2757   htab->relgot = bfd_make_section (abfd, ".rela.got");
2758   if (!htab->relgot
2759       || ! bfd_set_section_flags (abfd, htab->relgot,
2760                                   (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
2761                                    | SEC_IN_MEMORY | SEC_LINKER_CREATED
2762                                    | SEC_READONLY))
2763       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2764     return FALSE;
2765
2766   return TRUE;
2767 }
2768
2769 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2770    to output sections (just like _bfd_elf_create_dynamic_sections has
2771    to create .dynbss and .rela.bss).  */
2772
2773 static bfd_boolean
2774 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2775 {
2776   struct ppc_elf_link_hash_table *htab;
2777   asection *s;
2778   flagword flags;
2779
2780   htab = ppc_elf_hash_table (info);
2781
2782   if (htab->got == NULL
2783       && !ppc_elf_create_got (abfd, info))
2784     return FALSE;
2785
2786   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2787     return FALSE;
2788
2789   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2790            | SEC_LINKER_CREATED);
2791
2792   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2793   htab->dynsbss = s = bfd_make_section (abfd, ".dynsbss");
2794   if (s == NULL
2795       || ! bfd_set_section_flags (abfd, s, SEC_ALLOC | SEC_LINKER_CREATED))
2796     return FALSE;
2797
2798   if (! info->shared)
2799     {
2800       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2801       htab->relsbss = s = bfd_make_section (abfd, ".rela.sbss");
2802       if (s == NULL
2803           || ! bfd_set_section_flags (abfd, s, flags | SEC_READONLY)
2804           || ! bfd_set_section_alignment (abfd, s, 2))
2805         return FALSE;
2806     }
2807
2808   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2809   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2810   if (s == NULL)
2811     abort ();
2812
2813   flags = SEC_ALLOC | SEC_CODE | SEC_IN_MEMORY | SEC_LINKER_CREATED;
2814   return bfd_set_section_flags (abfd, s, flags);
2815 }
2816
2817 /* Adjust a symbol defined by a dynamic object and referenced by a
2818    regular object.  The current definition is in some section of the
2819    dynamic object, but we're not including those sections.  We have to
2820    change the definition to something the rest of the link can
2821    understand.  */
2822
2823 static bfd_boolean
2824 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
2825                                struct elf_link_hash_entry *h)
2826 {
2827   struct ppc_elf_link_hash_table *htab;
2828   asection *s;
2829   unsigned int power_of_two;
2830
2831 #ifdef DEBUG
2832   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
2833            h->root.root.string);
2834 #endif
2835
2836   /* Make sure we know what is going on here.  */
2837   htab = ppc_elf_hash_table (info);
2838   BFD_ASSERT (htab->elf.dynobj != NULL
2839               && (h->needs_plt
2840                   || h->u.weakdef != NULL
2841                   || (h->def_dynamic
2842                       && h->ref_regular
2843                       && !h->def_regular)));
2844
2845   /* Deal with function syms.  */
2846   if (h->type == STT_FUNC
2847       || h->needs_plt)
2848     {
2849       /* Clear procedure linkage table information for any symbol that
2850          won't need a .plt entry.  */
2851       if (h->plt.refcount <= 0
2852           || SYMBOL_CALLS_LOCAL (info, h)
2853           || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
2854               && h->root.type == bfd_link_hash_undefweak))
2855         {
2856           /* A PLT entry is not required/allowed when:
2857
2858              1. We are not using ld.so; because then the PLT entry
2859              can't be set up, so we can't use one.  In this case,
2860              ppc_elf_adjust_dynamic_symbol won't even be called.
2861
2862              2. GC has rendered the entry unused.
2863
2864              3. We know for certain that a call to this symbol
2865              will go to this object, or will remain undefined.  */
2866           h->plt.offset = (bfd_vma) -1;
2867           h->needs_plt = 0;
2868         }
2869       return TRUE;
2870     }
2871   else
2872     h->plt.offset = (bfd_vma) -1;
2873
2874   /* If this is a weak symbol, and there is a real definition, the
2875      processor independent code will have arranged for us to see the
2876      real definition first, and we can just use the same value.  */
2877   if (h->u.weakdef != NULL)
2878     {
2879       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
2880                   || h->u.weakdef->root.type == bfd_link_hash_defweak);
2881       h->root.u.def.section = h->u.weakdef->root.u.def.section;
2882       h->root.u.def.value = h->u.weakdef->root.u.def.value;
2883       if (ELIMINATE_COPY_RELOCS)
2884         h->non_got_ref = h->u.weakdef->non_got_ref;
2885       return TRUE;
2886     }
2887
2888   /* This is a reference to a symbol defined by a dynamic object which
2889      is not a function.  */
2890
2891   /* If we are creating a shared library, we must presume that the
2892      only references to the symbol are via the global offset table.
2893      For such cases we need not do anything here; the relocations will
2894      be handled correctly by relocate_section.  */
2895   if (info->shared)
2896     return TRUE;
2897
2898   /* If there are no references to this symbol that do not use the
2899      GOT, we don't need to generate a copy reloc.  */
2900   if (!h->non_got_ref)
2901     return TRUE;
2902
2903   if (ELIMINATE_COPY_RELOCS)
2904     {
2905       struct ppc_elf_dyn_relocs *p;
2906       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
2907         {
2908           s = p->sec->output_section;
2909           if (s != NULL && (s->flags & SEC_READONLY) != 0)
2910             break;
2911         }
2912
2913       /* If we didn't find any dynamic relocs in read-only sections, then
2914          we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
2915       if (p == NULL)
2916         {
2917           h->non_got_ref = 0;
2918           return TRUE;
2919         }
2920     }
2921
2922   /* We must allocate the symbol in our .dynbss section, which will
2923      become part of the .bss section of the executable.  There will be
2924      an entry for this symbol in the .dynsym section.  The dynamic
2925      object will contain position independent code, so all references
2926      from the dynamic object to this symbol will go through the global
2927      offset table.  The dynamic linker will use the .dynsym entry to
2928      determine the address it must put in the global offset table, so
2929      both the dynamic object and the regular object will refer to the
2930      same memory location for the variable.
2931
2932      Of course, if the symbol is sufficiently small, we must instead
2933      allocate it in .sbss.  FIXME: It would be better to do this if and
2934      only if there were actually SDAREL relocs for that symbol.  */
2935
2936   if (h->size <= elf_gp_size (htab->elf.dynobj))
2937     s = htab->dynsbss;
2938   else
2939     s = htab->dynbss;
2940   BFD_ASSERT (s != NULL);
2941
2942   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2943      copy the initial value out of the dynamic object and into the
2944      runtime process image.  We need to remember the offset into the
2945      .rela.bss section we are going to use.  */
2946   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2947     {
2948       asection *srel;
2949
2950       if (h->size <= elf_gp_size (htab->elf.dynobj))
2951         srel = htab->relsbss;
2952       else
2953         srel = htab->relbss;
2954       BFD_ASSERT (srel != NULL);
2955       srel->size += sizeof (Elf32_External_Rela);
2956       h->needs_copy = 1;
2957     }
2958
2959   /* We need to figure out the alignment required for this symbol.  I
2960      have no idea how ELF linkers handle this.  */
2961   power_of_two = bfd_log2 (h->size);
2962   if (power_of_two > 4)
2963     power_of_two = 4;
2964
2965   /* Apply the required alignment.  */
2966   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
2967   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
2968     {
2969       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
2970         return FALSE;
2971     }
2972
2973   /* Define the symbol as being at this point in the section.  */
2974   h->root.u.def.section = s;
2975   h->root.u.def.value = s->size;
2976
2977   /* Increment the section size to make room for the symbol.  */
2978   s->size += h->size;
2979
2980   return TRUE;
2981 }
2982 \f
2983 /* Of those relocs that might be copied as dynamic relocs, this macro
2984    selects those that must be copied when linking a shared library,
2985    even when the symbol is local.  */
2986
2987 #define MUST_BE_DYN_RELOC(RTYPE)                \
2988   ((RTYPE) != R_PPC_REL24                       \
2989    && (RTYPE) != R_PPC_REL14                    \
2990    && (RTYPE) != R_PPC_REL14_BRTAKEN            \
2991    && (RTYPE) != R_PPC_REL14_BRNTAKEN           \
2992    && (RTYPE) != R_PPC_REL32)
2993
2994 /* Allocate space in associated reloc sections for dynamic relocs.  */
2995
2996 static bfd_boolean
2997 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
2998 {
2999   struct bfd_link_info *info = inf;
3000   struct ppc_elf_link_hash_entry *eh;
3001   struct ppc_elf_link_hash_table *htab;
3002   struct ppc_elf_dyn_relocs *p;
3003
3004   if (h->root.type == bfd_link_hash_indirect)
3005     return TRUE;
3006
3007   if (h->root.type == bfd_link_hash_warning)
3008     /* When warning symbols are created, they **replace** the "real"
3009        entry in the hash table, thus we never get to see the real
3010        symbol in a hash traversal.  So look at it now.  */
3011     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3012
3013   htab = ppc_elf_hash_table (info);
3014   if (htab->elf.dynamic_sections_created
3015       && h->plt.refcount > 0)
3016     {
3017       /* Make sure this symbol is output as a dynamic symbol.  */
3018       if (h->dynindx == -1
3019           && !h->forced_local)
3020         {
3021           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3022             return FALSE;
3023         }
3024
3025       if (info->shared
3026           || WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
3027         {
3028           asection *s = htab->plt;
3029
3030           /* If this is the first .plt entry, make room for the special
3031              first entry.  */
3032           if (s->size == 0)
3033             s->size += PLT_INITIAL_ENTRY_SIZE;
3034
3035           /* The PowerPC PLT is actually composed of two parts, the
3036              first part is 2 words (for a load and a jump), and then
3037              there is a remaining word available at the end.  */
3038           h->plt.offset = (PLT_INITIAL_ENTRY_SIZE
3039                            + (PLT_SLOT_SIZE
3040                               * ((s->size - PLT_INITIAL_ENTRY_SIZE)
3041                                  / PLT_ENTRY_SIZE)));
3042
3043           /* If this symbol is not defined in a regular file, and we
3044              are not generating a shared library, then set the symbol
3045              to this location in the .plt.  This is required to make
3046              function pointers compare as equal between the normal
3047              executable and the shared library.  */
3048           if (! info->shared
3049               && !h->def_regular)
3050             {
3051               h->root.u.def.section = s;
3052               h->root.u.def.value = h->plt.offset;
3053             }
3054
3055           /* Make room for this entry.  After the 8192nd entry, room
3056              for two entries is allocated.  */
3057           s->size += PLT_ENTRY_SIZE;
3058           if ((s->size - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
3059               > PLT_NUM_SINGLE_ENTRIES)
3060             s->size += PLT_ENTRY_SIZE;
3061
3062           /* We also need to make an entry in the .rela.plt section.  */
3063           htab->relplt->size += sizeof (Elf32_External_Rela);
3064         }
3065       else
3066         {
3067           h->plt.offset = (bfd_vma) -1;
3068           h->needs_plt = 0;
3069         }
3070     }
3071   else
3072     {
3073       h->plt.offset = (bfd_vma) -1;
3074       h->needs_plt = 0;
3075     }
3076
3077   eh = (struct ppc_elf_link_hash_entry *) h;
3078   if (eh->elf.got.refcount > 0)
3079     {
3080       /* Make sure this symbol is output as a dynamic symbol.  */
3081       if (eh->elf.dynindx == -1
3082           && !eh->elf.forced_local)
3083         {
3084           if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
3085             return FALSE;
3086         }
3087
3088       if (eh->tls_mask == (TLS_TLS | TLS_LD)
3089           && !eh->elf.def_dynamic)
3090         /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
3091         eh->elf.got.offset = (bfd_vma) -1;
3092       else
3093         {
3094           bfd_boolean dyn;
3095           eh->elf.got.offset = htab->got->size;
3096           if ((eh->tls_mask & TLS_TLS) != 0)
3097             {
3098               if ((eh->tls_mask & TLS_LD) != 0)
3099                 htab->got->size += 8;
3100               if ((eh->tls_mask & TLS_GD) != 0)
3101                 htab->got->size += 8;
3102               if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
3103                 htab->got->size += 4;
3104               if ((eh->tls_mask & TLS_DTPREL) != 0)
3105                 htab->got->size += 4;
3106             }
3107           else
3108             htab->got->size += 4;
3109           dyn = htab->elf.dynamic_sections_created;
3110           if ((info->shared
3111                || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
3112               && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
3113                   || eh->elf.root.type != bfd_link_hash_undefweak))
3114             {
3115               /* All the entries we allocated need relocs.  */
3116               htab->relgot->size
3117                 += ((htab->got->size - eh->elf.got.offset) / 4
3118                     * sizeof (Elf32_External_Rela));
3119               /* Except LD only needs one.  */
3120               if ((eh->tls_mask & TLS_LD) != 0)
3121                 htab->relgot->size -= sizeof (Elf32_External_Rela);
3122             }
3123         }
3124     }
3125   else
3126     eh->elf.got.offset = (bfd_vma) -1;
3127
3128   if (eh->dyn_relocs == NULL)
3129     return TRUE;
3130
3131   /* In the shared -Bsymbolic case, discard space allocated for
3132      dynamic pc-relative relocs against symbols which turn out to be
3133      defined in regular objects.  For the normal shared case, discard
3134      space for relocs that have become local due to symbol visibility
3135      changes.  */
3136
3137   if (info->shared)
3138     {
3139       /* Relocs that use pc_count are those that appear on a call insn,
3140          or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
3141          generated via assembly.  We want calls to protected symbols to
3142          resolve directly to the function rather than going via the plt.
3143          If people want function pointer comparisons to work as expected
3144          then they should avoid writing weird assembly.  */
3145       if (SYMBOL_CALLS_LOCAL (info, h))
3146         {
3147           struct ppc_elf_dyn_relocs **pp;
3148
3149           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
3150             {
3151               p->count -= p->pc_count;
3152               p->pc_count = 0;
3153               if (p->count == 0)
3154                 *pp = p->next;
3155               else
3156                 pp = &p->next;
3157             }
3158         }
3159
3160       /* Also discard relocs on undefined weak syms with non-default
3161          visibility.  */
3162       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
3163           && h->root.type == bfd_link_hash_undefweak)
3164         eh->dyn_relocs = NULL;
3165
3166       /* Make sure undefined weak symbols are output as a dynamic symbol
3167          in PIEs.  */
3168       if (info->pie
3169           && eh->dyn_relocs != NULL
3170           && h->dynindx == -1
3171           && h->root.type == bfd_link_hash_undefweak
3172           && !h->forced_local)
3173         {
3174           if (! bfd_elf_link_record_dynamic_symbol (info, h))
3175             return FALSE;
3176         }
3177     }
3178   else if (ELIMINATE_COPY_RELOCS)
3179     {
3180       /* For the non-shared case, discard space for relocs against
3181          symbols which turn out to need copy relocs or are not
3182          dynamic.  */
3183
3184       if (!h->non_got_ref
3185           && h->def_dynamic
3186           && !h->def_regular)
3187         {
3188           /* Make sure this symbol is output as a dynamic symbol.
3189              Undefined weak syms won't yet be marked as dynamic.  */
3190           if (h->dynindx == -1
3191               && !h->forced_local)
3192             {
3193               if (! bfd_elf_link_record_dynamic_symbol (info, h))
3194                 return FALSE;
3195             }
3196
3197           /* If that succeeded, we know we'll be keeping all the
3198              relocs.  */
3199           if (h->dynindx != -1)
3200             goto keep;
3201         }
3202
3203       eh->dyn_relocs = NULL;
3204
3205     keep: ;
3206     }
3207
3208   /* Finally, allocate space.  */
3209   for (p = eh->dyn_relocs; p != NULL; p = p->next)
3210     {
3211       asection *sreloc = elf_section_data (p->sec)->sreloc;
3212       sreloc->size += p->count * sizeof (Elf32_External_Rela);
3213     }
3214
3215   return TRUE;
3216 }
3217
3218 /* Find any dynamic relocs that apply to read-only sections.  */
3219
3220 static bfd_boolean
3221 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
3222 {
3223   struct ppc_elf_dyn_relocs *p;
3224
3225   if (h->root.type == bfd_link_hash_indirect)
3226     return TRUE;
3227
3228   if (h->root.type == bfd_link_hash_warning)
3229     h = (struct elf_link_hash_entry *) h->root.u.i.link;
3230
3231   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
3232     {
3233       asection *s = p->sec->output_section;
3234
3235       if (s != NULL
3236           && ((s->flags & (SEC_READONLY | SEC_ALLOC))
3237               == (SEC_READONLY | SEC_ALLOC)))
3238         {
3239           ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
3240
3241           /* Not an error, just cut short the traversal.  */
3242           return FALSE;
3243         }
3244     }
3245   return TRUE;
3246 }
3247
3248 /* Set the sizes of the dynamic sections.  */
3249
3250 static bfd_boolean
3251 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
3252                                struct bfd_link_info *info)
3253 {
3254   struct ppc_elf_link_hash_table *htab;
3255   asection *s;
3256   bfd_boolean relocs;
3257   bfd *ibfd;
3258
3259 #ifdef DEBUG
3260   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
3261 #endif
3262
3263   htab = ppc_elf_hash_table (info);
3264   BFD_ASSERT (htab->elf.dynobj != NULL);
3265
3266   if (elf_hash_table (info)->dynamic_sections_created)
3267     {
3268       /* Set the contents of the .interp section to the interpreter.  */
3269       if (info->executable)
3270         {
3271           s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
3272           BFD_ASSERT (s != NULL);
3273           s->size = sizeof ELF_DYNAMIC_INTERPRETER;
3274           s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3275         }
3276     }
3277
3278   if (htab->tlsld_got.refcount > 0)
3279     {
3280       htab->tlsld_got.offset = htab->got->size;
3281       htab->got->size += 8;
3282       if (info->shared)
3283         htab->relgot->size += sizeof (Elf32_External_Rela);
3284     }
3285   else
3286     htab->tlsld_got.offset = (bfd_vma) -1;
3287
3288   /* Set up .got offsets for local syms, and space for local dynamic
3289      relocs.  */
3290   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3291     {
3292       bfd_signed_vma *local_got;
3293       bfd_signed_vma *end_local_got;
3294       char *lgot_masks;
3295       bfd_size_type locsymcount;
3296       Elf_Internal_Shdr *symtab_hdr;
3297       asection *srel;
3298
3299       if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3300         continue;
3301
3302       for (s = ibfd->sections; s != NULL; s = s->next)
3303         {
3304           struct ppc_elf_dyn_relocs *p;
3305
3306           for (p = ((struct ppc_elf_dyn_relocs *)
3307                     elf_section_data (s)->local_dynrel);
3308                p != NULL;
3309                p = p->next)
3310             {
3311               if (!bfd_is_abs_section (p->sec)
3312                   && bfd_is_abs_section (p->sec->output_section))
3313                 {
3314                   /* Input section has been discarded, either because
3315                      it is a copy of a linkonce section or due to
3316                      linker script /DISCARD/, so we'll be discarding
3317                      the relocs too.  */
3318                 }
3319               else if (p->count != 0)
3320                 {
3321                   elf_section_data (p->sec)->sreloc->size
3322                     += p->count * sizeof (Elf32_External_Rela);
3323                   if ((p->sec->output_section->flags
3324                        & (SEC_READONLY | SEC_ALLOC))
3325                       == (SEC_READONLY | SEC_ALLOC))
3326                     info->flags |= DF_TEXTREL;
3327                 }
3328             }
3329         }
3330
3331       local_got = elf_local_got_refcounts (ibfd);
3332       if (!local_got)
3333         continue;
3334
3335       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3336       locsymcount = symtab_hdr->sh_info;
3337       end_local_got = local_got + locsymcount;
3338       lgot_masks = (char *) end_local_got;
3339       s = htab->got;
3340       srel = htab->relgot;
3341       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
3342         if (*local_got > 0)
3343           {
3344             if (*lgot_masks == (TLS_TLS | TLS_LD))
3345               {
3346                 /* If just an LD reloc, we'll just use
3347                    htab->tlsld_got.offset.  */
3348                 if (htab->tlsld_got.offset == (bfd_vma) -1)
3349                   {
3350                     htab->tlsld_got.offset = s->size;
3351                     s->size += 8;
3352                     if (info->shared)
3353                       srel->size += sizeof (Elf32_External_Rela);
3354                   }
3355                 *local_got = (bfd_vma) -1;
3356               }
3357             else
3358               {
3359                 *local_got = s->size;
3360                 if ((*lgot_masks & TLS_TLS) != 0)
3361                   {
3362                     if ((*lgot_masks & TLS_GD) != 0)
3363                       s->size += 8;
3364                     if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
3365                       s->size += 4;
3366                     if ((*lgot_masks & TLS_DTPREL) != 0)
3367                       s->size += 4;
3368                   }
3369                 else
3370                   s->size += 4;
3371                 if (info->shared)
3372                   srel->size += ((s->size - *local_got) / 4
3373                                  * sizeof (Elf32_External_Rela));
3374               }
3375           }
3376         else
3377           *local_got = (bfd_vma) -1;
3378     }
3379
3380   /* Allocate space for global sym dynamic relocs.  */
3381   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
3382
3383   /* We've now determined the sizes of the various dynamic sections.
3384      Allocate memory for them.  */
3385   relocs = FALSE;
3386   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
3387     {
3388       if ((s->flags & SEC_LINKER_CREATED) == 0)
3389         continue;
3390
3391       if (s == htab->plt
3392           || s == htab->got)
3393         {
3394           /* Strip this section if we don't need it; see the
3395              comment below.  */
3396         }
3397       else if ((htab->sdata != NULL && s == htab->sdata->section)
3398                || (htab->sdata2 != NULL && s == htab->sdata2->section))
3399         {
3400           if (s->size == 0)
3401             /* Don't strip these sections.  We need them because they
3402                define _SDA_BASE_ and _SDA2_BASE_.  crt1.o makes a
3403                reference to _SDA_BASE_ to set up r13.  */
3404             continue;
3405         }
3406       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
3407         {
3408           if (s->size == 0)
3409             {
3410               /* If we don't need this section, strip it from the
3411                  output file.  This is mostly to handle .rela.bss and
3412                  .rela.plt.  We must create both sections in
3413                  create_dynamic_sections, because they must be created
3414                  before the linker maps input sections to output
3415                  sections.  The linker does that before
3416                  adjust_dynamic_symbol is called, and it is that
3417                  function which decides whether anything needs to go
3418                  into these sections.  */
3419             }
3420           else
3421             {
3422               /* Remember whether there are any relocation sections.  */
3423               relocs = TRUE;
3424
3425               /* We use the reloc_count field as a counter if we need
3426                  to copy relocs into the output file.  */
3427               s->reloc_count = 0;
3428             }
3429         }
3430       else
3431         {
3432           /* It's not one of our sections, so don't allocate space.  */
3433           continue;
3434         }
3435
3436       if (s->size == 0)
3437         {
3438           _bfd_strip_section_from_output (info, s);
3439           continue;
3440         }
3441
3442       /* Allocate memory for the section contents.  */
3443       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
3444       if (s->contents == NULL)
3445         return FALSE;
3446     }
3447
3448   if (htab->elf.dynamic_sections_created)
3449     {
3450       /* Add some entries to the .dynamic section.  We fill in the
3451          values later, in ppc_elf_finish_dynamic_sections, but we
3452          must add the entries now so that we get the correct size for
3453          the .dynamic section.  The DT_DEBUG entry is filled in by the
3454          dynamic linker and used by the debugger.  */
3455 #define add_dynamic_entry(TAG, VAL) \
3456   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
3457
3458       if (info->executable)
3459         {
3460           if (!add_dynamic_entry (DT_DEBUG, 0))
3461             return FALSE;
3462         }
3463
3464       if (htab->plt != NULL && htab->plt->size != 0)
3465         {
3466           if (!add_dynamic_entry (DT_PLTGOT, 0)
3467               || !add_dynamic_entry (DT_PLTRELSZ, 0)
3468               || !add_dynamic_entry (DT_PLTREL, DT_RELA)
3469               || !add_dynamic_entry (DT_JMPREL, 0))
3470             return FALSE;
3471         }
3472
3473       if (relocs)
3474         {
3475           if (!add_dynamic_entry (DT_RELA, 0)
3476               || !add_dynamic_entry (DT_RELASZ, 0)
3477               || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
3478             return FALSE;
3479         }
3480
3481       /* If any dynamic relocs apply to a read-only section, then we
3482          need a DT_TEXTREL entry.  */
3483       if ((info->flags & DF_TEXTREL) == 0)
3484         elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
3485                                 info);
3486
3487       if ((info->flags & DF_TEXTREL) != 0)
3488         {
3489           if (!add_dynamic_entry (DT_TEXTREL, 0))
3490             return FALSE;
3491         }
3492     }
3493 #undef add_dynamic_entry
3494
3495   return TRUE;
3496 }
3497 \f
3498 static bfd_boolean
3499 update_local_sym_info (bfd *abfd,
3500                        Elf_Internal_Shdr *symtab_hdr,
3501                        unsigned long r_symndx,
3502                        int tls_type)
3503 {
3504   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
3505   char *local_got_tls_masks;
3506
3507   if (local_got_refcounts == NULL)
3508     {
3509       bfd_size_type size = symtab_hdr->sh_info;
3510
3511       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
3512       local_got_refcounts = bfd_zalloc (abfd, size);
3513       if (local_got_refcounts == NULL)
3514         return FALSE;
3515       elf_local_got_refcounts (abfd) = local_got_refcounts;
3516     }
3517
3518   local_got_refcounts[r_symndx] += 1;
3519   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3520   local_got_tls_masks[r_symndx] |= tls_type;
3521   return TRUE;
3522 }
3523
3524 static void
3525 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3526 {
3527   (*_bfd_error_handler)
3528     (_("%B: relocation %s cannot be used when making a shared object"),
3529      abfd,
3530      ppc_elf_howto_table[r_type]->name);
3531   bfd_set_error (bfd_error_bad_value);
3532 }
3533
3534 /* Look through the relocs for a section during the first phase, and
3535    allocate space in the global offset table or procedure linkage
3536    table.  */
3537
3538 static bfd_boolean
3539 ppc_elf_check_relocs (bfd *abfd,
3540                       struct bfd_link_info *info,
3541                       asection *sec,
3542                       const Elf_Internal_Rela *relocs)
3543 {
3544   struct ppc_elf_link_hash_table *htab;
3545   Elf_Internal_Shdr *symtab_hdr;
3546   struct elf_link_hash_entry **sym_hashes;
3547   const Elf_Internal_Rela *rel;
3548   const Elf_Internal_Rela *rel_end;
3549   asection *sreloc;
3550
3551   if (info->relocatable)
3552     return TRUE;
3553
3554 #ifdef DEBUG
3555   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
3556                       sec, abfd);
3557 #endif
3558
3559   /* Initialize howto table if not already done.  */
3560   if (!ppc_elf_howto_table[R_PPC_ADDR32])
3561     ppc_elf_howto_init ();
3562
3563   /* Create the linker generated sections all the time so that the
3564      special symbols are created.  */
3565   htab = ppc_elf_hash_table (info);
3566   if (htab->sdata == NULL)
3567     {
3568       htab->sdata = ppc_elf_create_linker_section (abfd, info,
3569                                                    LINKER_SECTION_SDATA);
3570       if (htab->sdata == NULL)
3571         return FALSE;
3572     }
3573
3574   if (htab->sdata2 == NULL)
3575     {
3576       htab->sdata2 = ppc_elf_create_linker_section (abfd, info,
3577                                                     LINKER_SECTION_SDATA2);
3578       if (htab->sdata2 == NULL)
3579         return FALSE;
3580     }
3581
3582   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3583   sym_hashes = elf_sym_hashes (abfd);
3584   sreloc = NULL;
3585
3586   rel_end = relocs + sec->reloc_count;
3587   for (rel = relocs; rel < rel_end; rel++)
3588     {
3589       unsigned long r_symndx;
3590       enum elf_ppc_reloc_type r_type;
3591       struct elf_link_hash_entry *h;
3592       int tls_type = 0;
3593
3594       r_symndx = ELF32_R_SYM (rel->r_info);
3595       if (r_symndx < symtab_hdr->sh_info)
3596         h = NULL;
3597       else
3598         h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3599
3600       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3601          This shows up in particular in an R_PPC_ADDR32 in the eabi
3602          startup code.  */
3603       if (h && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3604         {
3605           if (htab->got == NULL)
3606             {
3607               if (htab->elf.dynobj == NULL)
3608                 htab->elf.dynobj = abfd;
3609               if (!ppc_elf_create_got (htab->elf.dynobj, info))
3610                 return FALSE;
3611             }
3612         }
3613
3614       r_type = ELF32_R_TYPE (rel->r_info);
3615       switch (r_type)
3616         {
3617         case R_PPC_GOT_TLSLD16:
3618         case R_PPC_GOT_TLSLD16_LO:
3619         case R_PPC_GOT_TLSLD16_HI:
3620         case R_PPC_GOT_TLSLD16_HA:
3621           htab->tlsld_got.refcount += 1;
3622           tls_type = TLS_TLS | TLS_LD;
3623           goto dogottls;
3624
3625         case R_PPC_GOT_TLSGD16:
3626         case R_PPC_GOT_TLSGD16_LO:
3627         case R_PPC_GOT_TLSGD16_HI:
3628         case R_PPC_GOT_TLSGD16_HA:
3629           tls_type = TLS_TLS | TLS_GD;
3630           goto dogottls;
3631
3632         case R_PPC_GOT_TPREL16:
3633         case R_PPC_GOT_TPREL16_LO:
3634         case R_PPC_GOT_TPREL16_HI:
3635         case R_PPC_GOT_TPREL16_HA:
3636           if (info->shared)
3637             info->flags |= DF_STATIC_TLS;
3638           tls_type = TLS_TLS | TLS_TPREL;
3639           goto dogottls;
3640
3641         case R_PPC_GOT_DTPREL16:
3642         case R_PPC_GOT_DTPREL16_LO:
3643         case R_PPC_GOT_DTPREL16_HI:
3644         case R_PPC_GOT_DTPREL16_HA:
3645           tls_type = TLS_TLS | TLS_DTPREL;
3646         dogottls:
3647           sec->has_tls_reloc = 1;
3648           /* Fall thru */
3649
3650           /* GOT16 relocations */
3651         case R_PPC_GOT16:
3652         case R_PPC_GOT16_LO:
3653         case R_PPC_GOT16_HI:
3654         case R_PPC_GOT16_HA:
3655           /* This symbol requires a global offset table entry.  */
3656           if (htab->got == NULL)
3657             {
3658               if (htab->elf.dynobj == NULL)
3659                 htab->elf.dynobj = abfd;
3660               if (!ppc_elf_create_got (htab->elf.dynobj, info))
3661                 return FALSE;
3662             }
3663           if (h != NULL)
3664             {
3665               h->got.refcount += 1;
3666               ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3667             }
3668           else
3669             /* This is a global offset table entry for a local symbol.  */
3670             if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3671               return FALSE;
3672           break;
3673
3674           /* Indirect .sdata relocation.  */
3675         case R_PPC_EMB_SDAI16:
3676           if (info->shared)
3677             {
3678               bad_shared_reloc (abfd, r_type);
3679               return FALSE;
3680             }
3681           if (!elf_create_pointer_linker_section (abfd, info,
3682                                                   htab->sdata, h, rel))
3683             return FALSE;
3684           break;
3685
3686           /* Indirect .sdata2 relocation.  */
3687         case R_PPC_EMB_SDA2I16:
3688           if (info->shared)
3689             {
3690               bad_shared_reloc (abfd, r_type);
3691               return FALSE;
3692             }
3693           if (!elf_create_pointer_linker_section (abfd, info,
3694                                                   htab->sdata2, h, rel))
3695             return FALSE;
3696           break;
3697
3698         case R_PPC_SDAREL16:
3699         case R_PPC_EMB_SDA2REL:
3700         case R_PPC_EMB_SDA21:
3701         case R_PPC_EMB_RELSDA:
3702         case R_PPC_EMB_NADDR32:
3703         case R_PPC_EMB_NADDR16:
3704         case R_PPC_EMB_NADDR16_LO:
3705         case R_PPC_EMB_NADDR16_HI:
3706         case R_PPC_EMB_NADDR16_HA:
3707           if (info->shared)
3708             {
3709               bad_shared_reloc (abfd, r_type);
3710               return FALSE;
3711             }
3712           break;
3713
3714         case R_PPC_PLT32:
3715         case R_PPC_PLTREL24:
3716         case R_PPC_PLTREL32:
3717         case R_PPC_PLT16_LO:
3718         case R_PPC_PLT16_HI:
3719         case R_PPC_PLT16_HA:
3720 #ifdef DEBUG
3721           fprintf (stderr, "Reloc requires a PLT entry\n");
3722 #endif
3723           /* This symbol requires a procedure linkage table entry.  We
3724              actually build the entry in finish_dynamic_symbol,
3725              because this might be a case of linking PIC code without
3726              linking in any dynamic objects, in which case we don't
3727              need to generate a procedure linkage table after all.  */
3728
3729           if (h == NULL)
3730             {
3731               /* It does not make sense to have a procedure linkage
3732                  table entry for a local symbol.  */
3733               (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
3734                                        "local symbol"),
3735                                      abfd,
3736                                      sec,
3737                                      (long) rel->r_offset,
3738                                      ppc_elf_howto_table[r_type]->name);
3739               bfd_set_error (bfd_error_bad_value);
3740               return FALSE;
3741             }
3742
3743           h->needs_plt = 1;
3744           h->plt.refcount++;
3745           break;
3746
3747           /* The following relocations don't need to propagate the
3748              relocation if linking a shared object since they are
3749              section relative.  */
3750         case R_PPC_SECTOFF:
3751         case R_PPC_SECTOFF_LO:
3752         case R_PPC_SECTOFF_HI:
3753         case R_PPC_SECTOFF_HA:
3754         case R_PPC_DTPREL16:
3755         case R_PPC_DTPREL16_LO:
3756         case R_PPC_DTPREL16_HI:
3757         case R_PPC_DTPREL16_HA:
3758         case R_PPC_TOC16:
3759           break;
3760
3761           /* This are just markers.  */
3762         case R_PPC_TLS:
3763         case R_PPC_EMB_MRKREF:
3764         case R_PPC_NONE:
3765         case R_PPC_max:
3766           break;
3767
3768           /* These should only appear in dynamic objects.  */
3769         case R_PPC_COPY:
3770         case R_PPC_GLOB_DAT:
3771         case R_PPC_JMP_SLOT:
3772         case R_PPC_RELATIVE:
3773           break;
3774
3775           /* These aren't handled yet.  We'll report an error later.  */
3776         case R_PPC_ADDR30:
3777         case R_PPC_EMB_RELSEC16:
3778         case R_PPC_EMB_RELST_LO:
3779         case R_PPC_EMB_RELST_HI:
3780         case R_PPC_EMB_RELST_HA:
3781         case R_PPC_EMB_BIT_FLD:
3782           break;
3783
3784           /* This refers only to functions defined in the shared library.  */
3785         case R_PPC_LOCAL24PC:
3786           break;
3787
3788           /* This relocation describes the C++ object vtable hierarchy.
3789              Reconstruct it for later use during GC.  */
3790         case R_PPC_GNU_VTINHERIT:
3791           if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3792             return FALSE;
3793           break;
3794
3795           /* This relocation describes which C++ vtable entries are actually
3796              used.  Record for later use during GC.  */
3797         case R_PPC_GNU_VTENTRY:
3798           if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3799             return FALSE;
3800           break;
3801
3802           /* We shouldn't really be seeing these.  */
3803         case R_PPC_TPREL32:
3804           if (info->shared)
3805             info->flags |= DF_STATIC_TLS;
3806           goto dodyn;
3807
3808           /* Nor these.  */
3809         case R_PPC_DTPMOD32:
3810         case R_PPC_DTPREL32:
3811           goto dodyn;
3812
3813         case R_PPC_TPREL16:
3814         case R_PPC_TPREL16_LO:
3815         case R_PPC_TPREL16_HI:
3816         case R_PPC_TPREL16_HA:
3817           if (info->shared)
3818             info->flags |= DF_STATIC_TLS;
3819           goto dodyn;
3820
3821           /* When creating a shared object, we must copy these
3822              relocs into the output file.  We create a reloc
3823              section in dynobj and make room for the reloc.  */
3824         case R_PPC_REL24:
3825         case R_PPC_REL14:
3826         case R_PPC_REL14_BRTAKEN:
3827         case R_PPC_REL14_BRNTAKEN:
3828         case R_PPC_REL32:
3829           if (h == NULL
3830               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3831             break;
3832           /* fall through */
3833
3834         case R_PPC_ADDR32:
3835         case R_PPC_ADDR24:
3836         case R_PPC_ADDR16:
3837         case R_PPC_ADDR16_LO:
3838         case R_PPC_ADDR16_HI:
3839         case R_PPC_ADDR16_HA:
3840         case R_PPC_ADDR14:
3841         case R_PPC_ADDR14_BRTAKEN:
3842         case R_PPC_ADDR14_BRNTAKEN:
3843         case R_PPC_UADDR32:
3844         case R_PPC_UADDR16:
3845           if (h != NULL && !info->shared)
3846             {
3847               /* We may need a plt entry if the symbol turns out to be
3848                  a function defined in a dynamic object.  */
3849               h->plt.refcount++;
3850
3851               /* We may need a copy reloc too.  */
3852               h->non_got_ref = 1;
3853             }
3854
3855         dodyn:
3856           /* If we are creating a shared library, and this is a reloc
3857              against a global symbol, or a non PC relative reloc
3858              against a local symbol, then we need to copy the reloc
3859              into the shared library.  However, if we are linking with
3860              -Bsymbolic, we do not need to copy a reloc against a
3861              global symbol which is defined in an object we are
3862              including in the link (i.e., DEF_REGULAR is set).  At
3863              this point we have not seen all the input files, so it is
3864              possible that DEF_REGULAR is not set now but will be set
3865              later (it is never cleared).  In case of a weak definition,
3866              DEF_REGULAR may be cleared later by a strong definition in
3867              a shared library.  We account for that possibility below by
3868              storing information in the dyn_relocs field of the hash
3869              table entry.  A similar situation occurs when creating
3870              shared libraries and symbol visibility changes render the
3871              symbol local.
3872
3873              If on the other hand, we are creating an executable, we
3874              may need to keep relocations for symbols satisfied by a
3875              dynamic library if we manage to avoid copy relocs for the
3876              symbol.  */
3877           if ((info->shared
3878                && (MUST_BE_DYN_RELOC (r_type)
3879                    || (h != NULL
3880                        && (! info->symbolic
3881                            || h->root.type == bfd_link_hash_defweak
3882                            || !h->def_regular))))
3883               || (ELIMINATE_COPY_RELOCS
3884                   && !info->shared
3885                   && (sec->flags & SEC_ALLOC) != 0
3886                   && h != NULL
3887                   && (h->root.type == bfd_link_hash_defweak
3888                       || !h->def_regular)))
3889             {
3890               struct ppc_elf_dyn_relocs *p;
3891               struct ppc_elf_dyn_relocs **head;
3892
3893 #ifdef DEBUG
3894               fprintf (stderr,
3895                        "ppc_elf_check_relocs needs to "
3896                        "create relocation for %s\n",
3897                        (h && h->root.root.string
3898                         ? h->root.root.string : "<unknown>"));
3899 #endif
3900               if (sreloc == NULL)
3901                 {
3902                   const char *name;
3903
3904                   name = (bfd_elf_string_from_elf_section
3905                           (abfd,
3906                            elf_elfheader (abfd)->e_shstrndx,
3907                            elf_section_data (sec)->rel_hdr.sh_name));
3908                   if (name == NULL)
3909                     return FALSE;
3910
3911                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
3912                               && strcmp (bfd_get_section_name (abfd, sec),
3913                                          name + 5) == 0);
3914
3915                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
3916                   if (sreloc == NULL)
3917                     {
3918                       flagword flags;
3919
3920                       sreloc = bfd_make_section (htab->elf.dynobj, name);
3921                       flags = (SEC_HAS_CONTENTS | SEC_READONLY
3922                                | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3923                       if ((sec->flags & SEC_ALLOC) != 0)
3924                         flags |= SEC_ALLOC | SEC_LOAD;
3925                       if (sreloc == NULL
3926                           || ! bfd_set_section_flags (htab->elf.dynobj,
3927                                                       sreloc, flags)
3928                           || ! bfd_set_section_alignment (htab->elf.dynobj,
3929                                                           sreloc, 2))
3930                         return FALSE;
3931                     }
3932                   elf_section_data (sec)->sreloc = sreloc;
3933                 }
3934
3935               /* If this is a global symbol, we count the number of
3936                  relocations we need for this symbol.  */
3937               if (h != NULL)
3938                 {
3939                   head = &ppc_elf_hash_entry (h)->dyn_relocs;
3940                 }
3941               else
3942                 {
3943                   /* Track dynamic relocs needed for local syms too.
3944                      We really need local syms available to do this
3945                      easily.  Oh well.  */
3946
3947                   asection *s;
3948                   s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
3949                                                  sec, r_symndx);
3950                   if (s == NULL)
3951                     return FALSE;
3952
3953                   head = ((struct ppc_elf_dyn_relocs **)
3954                           &elf_section_data (s)->local_dynrel);
3955                 }
3956
3957               p = *head;
3958               if (p == NULL || p->sec != sec)
3959                 {
3960                   p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3961                   if (p == NULL)
3962                     return FALSE;
3963                   p->next = *head;
3964                   *head = p;
3965                   p->sec = sec;
3966                   p->count = 0;
3967                   p->pc_count = 0;
3968                 }
3969
3970               p->count += 1;
3971               if (!MUST_BE_DYN_RELOC (r_type))
3972                 p->pc_count += 1;
3973             }
3974
3975           break;
3976         }
3977     }
3978
3979   return TRUE;
3980 }
3981
3982 /* Return the section that should be marked against GC for a given
3983    relocation.  */
3984
3985 static asection *
3986 ppc_elf_gc_mark_hook (asection *sec,
3987                       struct bfd_link_info *info ATTRIBUTE_UNUSED,
3988                       Elf_Internal_Rela *rel,
3989                       struct elf_link_hash_entry *h,
3990                       Elf_Internal_Sym *sym)
3991 {
3992   if (h != NULL)
3993     {
3994       switch (ELF32_R_TYPE (rel->r_info))
3995         {
3996         case R_PPC_GNU_VTINHERIT:
3997         case R_PPC_GNU_VTENTRY:
3998           break;
3999
4000         default:
4001           switch (h->root.type)
4002             {
4003             case bfd_link_hash_defined:
4004             case bfd_link_hash_defweak:
4005               return h->root.u.def.section;
4006
4007             case bfd_link_hash_common:
4008               return h->root.u.c.p->section;
4009
4010             default:
4011               break;
4012             }
4013         }
4014     }
4015   else
4016     return bfd_section_from_elf_index (sec->owner, sym->st_shndx);
4017
4018   return NULL;
4019 }
4020
4021 /* Update the got, plt and dynamic reloc reference counts for the
4022    section being removed.  */
4023
4024 static bfd_boolean
4025 ppc_elf_gc_sweep_hook (bfd *abfd,
4026                        struct bfd_link_info *info,
4027                        asection *sec,
4028                        const Elf_Internal_Rela *relocs)
4029 {
4030   struct ppc_elf_link_hash_table *htab;
4031   Elf_Internal_Shdr *symtab_hdr;
4032   struct elf_link_hash_entry **sym_hashes;
4033   bfd_signed_vma *local_got_refcounts;
4034   const Elf_Internal_Rela *rel, *relend;
4035
4036   elf_section_data (sec)->local_dynrel = NULL;
4037
4038   htab = ppc_elf_hash_table (info);
4039   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4040   sym_hashes = elf_sym_hashes (abfd);
4041   local_got_refcounts = elf_local_got_refcounts (abfd);
4042
4043   relend = relocs + sec->reloc_count;
4044   for (rel = relocs; rel < relend; rel++)
4045     {
4046       unsigned long r_symndx;
4047       enum elf_ppc_reloc_type r_type;
4048       struct elf_link_hash_entry *h = NULL;
4049
4050       r_symndx = ELF32_R_SYM (rel->r_info);
4051       if (r_symndx >= symtab_hdr->sh_info)
4052         {
4053           struct ppc_elf_dyn_relocs **pp, *p;
4054           struct ppc_elf_link_hash_entry *eh;
4055
4056           h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4057           while (h->root.type == bfd_link_hash_indirect
4058                  || h->root.type == bfd_link_hash_warning)
4059             h = (struct elf_link_hash_entry *) h->root.u.i.link;
4060           eh = (struct ppc_elf_link_hash_entry *) h;
4061
4062           for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
4063             if (p->sec == sec)
4064               {
4065                 /* Everything must go for SEC.  */
4066                 *pp = p->next;
4067                 break;
4068               }
4069         }
4070
4071       r_type = ELF32_R_TYPE (rel->r_info);
4072       switch (r_type)
4073         {
4074         case R_PPC_GOT_TLSLD16:
4075         case R_PPC_GOT_TLSLD16_LO:
4076         case R_PPC_GOT_TLSLD16_HI:
4077         case R_PPC_GOT_TLSLD16_HA:
4078           htab->tlsld_got.refcount -= 1;
4079           /* Fall thru */
4080
4081         case R_PPC_GOT_TLSGD16:
4082         case R_PPC_GOT_TLSGD16_LO:
4083         case R_PPC_GOT_TLSGD16_HI:
4084         case R_PPC_GOT_TLSGD16_HA:
4085         case R_PPC_GOT_TPREL16:
4086         case R_PPC_GOT_TPREL16_LO:
4087         case R_PPC_GOT_TPREL16_HI:
4088         case R_PPC_GOT_TPREL16_HA:
4089         case R_PPC_GOT_DTPREL16:
4090         case R_PPC_GOT_DTPREL16_LO:
4091         case R_PPC_GOT_DTPREL16_HI:
4092         case R_PPC_GOT_DTPREL16_HA:
4093         case R_PPC_GOT16:
4094         case R_PPC_GOT16_LO:
4095         case R_PPC_GOT16_HI:
4096         case R_PPC_GOT16_HA:
4097           if (h != NULL)
4098             {
4099               if (h->got.refcount > 0)
4100                 h->got.refcount--;
4101             }
4102           else if (local_got_refcounts != NULL)
4103             {
4104               if (local_got_refcounts[r_symndx] > 0)
4105                 local_got_refcounts[r_symndx]--;
4106             }
4107           break;
4108
4109         case R_PPC_REL24:
4110         case R_PPC_REL14:
4111         case R_PPC_REL14_BRTAKEN:
4112         case R_PPC_REL14_BRNTAKEN:
4113         case R_PPC_REL32:
4114           if (h == NULL
4115               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
4116             break;
4117           /* Fall thru */
4118
4119         case R_PPC_ADDR32:
4120         case R_PPC_ADDR24:
4121         case R_PPC_ADDR16:
4122         case R_PPC_ADDR16_LO:
4123         case R_PPC_ADDR16_HI:
4124         case R_PPC_ADDR16_HA:
4125         case R_PPC_ADDR14:
4126         case R_PPC_ADDR14_BRTAKEN:
4127         case R_PPC_ADDR14_BRNTAKEN:
4128         case R_PPC_UADDR32:
4129         case R_PPC_UADDR16:
4130         case R_PPC_PLT32:
4131         case R_PPC_PLTREL24:
4132         case R_PPC_PLT16_LO:
4133         case R_PPC_PLT16_HI:
4134         case R_PPC_PLT16_HA:
4135           if (h != NULL)
4136             {
4137               if (h->plt.refcount > 0)
4138                 h->plt.refcount--;
4139             }
4140           break;
4141
4142         default:
4143           break;
4144         }
4145     }
4146   return TRUE;
4147 }
4148
4149 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
4150
4151 asection *
4152 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4153 {
4154   struct ppc_elf_link_hash_table *htab;
4155
4156   htab = ppc_elf_hash_table (info);
4157   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4158                                              FALSE, FALSE, TRUE);
4159
4160   return _bfd_elf_tls_setup (obfd, info);
4161 }
4162
4163 /* Run through all the TLS relocs looking for optimization
4164    opportunities.  */
4165
4166 bfd_boolean
4167 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4168                       struct bfd_link_info *info)
4169 {
4170   bfd *ibfd;
4171   asection *sec;
4172   struct ppc_elf_link_hash_table *htab;
4173
4174   if (info->relocatable || info->shared)
4175     return TRUE;
4176
4177   htab = ppc_elf_hash_table (info);
4178   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4179     {
4180       Elf_Internal_Sym *locsyms = NULL;
4181       Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4182
4183       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4184         if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4185           {
4186             Elf_Internal_Rela *relstart, *rel, *relend;
4187             int expecting_tls_get_addr;
4188
4189             /* Read the relocations.  */
4190             relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4191                                                   info->keep_memory);
4192             if (relstart == NULL)
4193               return FALSE;
4194
4195             expecting_tls_get_addr = 0;
4196             relend = relstart + sec->reloc_count;
4197             for (rel = relstart; rel < relend; rel++)
4198               {
4199                 enum elf_ppc_reloc_type r_type;
4200                 unsigned long r_symndx;
4201                 struct elf_link_hash_entry *h = NULL;
4202                 char *tls_mask;
4203                 char tls_set, tls_clear;
4204                 bfd_boolean is_local;
4205
4206                 r_symndx = ELF32_R_SYM (rel->r_info);
4207                 if (r_symndx >= symtab_hdr->sh_info)
4208                   {
4209                     struct elf_link_hash_entry **sym_hashes;
4210
4211                     sym_hashes = elf_sym_hashes (ibfd);
4212                     h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4213                     while (h->root.type == bfd_link_hash_indirect
4214                            || h->root.type == bfd_link_hash_warning)
4215                       h = (struct elf_link_hash_entry *) h->root.u.i.link;
4216                   }
4217
4218                 is_local = FALSE;
4219                 if (h == NULL
4220                     || !h->def_dynamic)
4221                   is_local = TRUE;
4222
4223                 r_type = ELF32_R_TYPE (rel->r_info);
4224                 switch (r_type)
4225                   {
4226                   case R_PPC_GOT_TLSLD16:
4227                   case R_PPC_GOT_TLSLD16_LO:
4228                   case R_PPC_GOT_TLSLD16_HI:
4229                   case R_PPC_GOT_TLSLD16_HA:
4230                     /* These relocs should never be against a symbol
4231                        defined in a shared lib.  Leave them alone if
4232                        that turns out to be the case.  */
4233                     expecting_tls_get_addr = 0;
4234                     htab->tlsld_got.refcount -= 1;
4235                     if (!is_local)
4236                       continue;
4237
4238                     /* LD -> LE */
4239                     tls_set = 0;
4240                     tls_clear = TLS_LD;
4241                     expecting_tls_get_addr = 1;
4242                     break;
4243
4244                   case R_PPC_GOT_TLSGD16:
4245                   case R_PPC_GOT_TLSGD16_LO:
4246                   case R_PPC_GOT_TLSGD16_HI:
4247                   case R_PPC_GOT_TLSGD16_HA:
4248                     if (is_local)
4249                       /* GD -> LE */
4250                       tls_set = 0;
4251                     else
4252                       /* GD -> IE */
4253                       tls_set = TLS_TLS | TLS_TPRELGD;
4254                     tls_clear = TLS_GD;
4255                     expecting_tls_get_addr = 1;
4256                     break;
4257
4258                   case R_PPC_GOT_TPREL16:
4259                   case R_PPC_GOT_TPREL16_LO:
4260                   case R_PPC_GOT_TPREL16_HI:
4261                   case R_PPC_GOT_TPREL16_HA:
4262                     expecting_tls_get_addr = 0;
4263                     if (is_local)
4264                       {
4265                         /* IE -> LE */
4266                         tls_set = 0;
4267                         tls_clear = TLS_TPREL;
4268                         break;
4269                       }
4270                     else
4271                       continue;
4272
4273                   case R_PPC_REL14:
4274                   case R_PPC_REL14_BRTAKEN:
4275                   case R_PPC_REL14_BRNTAKEN:
4276                   case R_PPC_REL24:
4277                     if (expecting_tls_get_addr
4278                         && h != NULL
4279                         && h == htab->tls_get_addr)
4280                       {
4281                         if (h->plt.refcount > 0)
4282                           h->plt.refcount -= 1;
4283                       }
4284                     expecting_tls_get_addr = 0;
4285                     continue;
4286
4287                   default:
4288                     expecting_tls_get_addr = 0;
4289                     continue;
4290                   }
4291
4292                 if (h != NULL)
4293                   {
4294                     if (tls_set == 0)
4295                       {
4296                         /* We managed to get rid of a got entry.  */
4297                         if (h->got.refcount > 0)
4298                           h->got.refcount -= 1;
4299                       }
4300                     tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4301                   }
4302                 else
4303                   {
4304                     Elf_Internal_Sym *sym;
4305                     bfd_signed_vma *lgot_refs;
4306                     char *lgot_masks;
4307
4308                     if (locsyms == NULL)
4309                       {
4310                         locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4311                         if (locsyms == NULL)
4312                           locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4313                                                           symtab_hdr->sh_info,
4314                                                           0, NULL, NULL, NULL);
4315                         if (locsyms == NULL)
4316                           {
4317                             if (elf_section_data (sec)->relocs != relstart)
4318                               free (relstart);
4319                             return FALSE;
4320                           }
4321                       }
4322                     sym = locsyms + r_symndx;
4323                     lgot_refs = elf_local_got_refcounts (ibfd);
4324                     if (lgot_refs == NULL)
4325                       abort ();
4326                     if (tls_set == 0)
4327                       {
4328                         /* We managed to get rid of a got entry.  */
4329                         if (lgot_refs[r_symndx] > 0)
4330                           lgot_refs[r_symndx] -= 1;
4331                       }
4332                     lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
4333                     tls_mask = &lgot_masks[r_symndx];
4334                   }
4335
4336                 *tls_mask |= tls_set;
4337                 *tls_mask &= ~tls_clear;
4338               }
4339
4340             if (elf_section_data (sec)->relocs != relstart)
4341               free (relstart);
4342           }
4343
4344       if (locsyms != NULL
4345           && (symtab_hdr->contents != (unsigned char *) locsyms))
4346         {
4347           if (!info->keep_memory)
4348             free (locsyms);
4349           else
4350             symtab_hdr->contents = (unsigned char *) locsyms;
4351         }
4352     }
4353   return TRUE;
4354 }
4355 \f
4356 /* Hook called by the linker routine which adds symbols from an object
4357    file.  We use it to put .comm items in .sbss, and not .bss.  */
4358
4359 static bfd_boolean
4360 ppc_elf_add_symbol_hook (bfd *abfd,
4361                          struct bfd_link_info *info,
4362                          Elf_Internal_Sym *sym,
4363                          const char **namep ATTRIBUTE_UNUSED,
4364                          flagword *flagsp ATTRIBUTE_UNUSED,
4365                          asection **secp,
4366                          bfd_vma *valp)
4367 {
4368   if (sym->st_shndx == SHN_COMMON
4369       && !info->relocatable
4370       && sym->st_size <= elf_gp_size (abfd)
4371       && (info->hash->creator == abfd->xvec
4372           || info->hash->creator == abfd->xvec->alternative_target))
4373     {
4374       /* Common symbols less than or equal to -G nn bytes are automatically
4375          put into .sbss.  */
4376       struct ppc_elf_link_hash_table *htab;
4377
4378       htab = ppc_elf_hash_table (info);
4379       if (htab->sbss == NULL)
4380         {
4381           flagword flags = SEC_IS_COMMON;
4382
4383           htab->sbss = bfd_make_section_anyway (abfd, ".sbss");
4384           if (htab->sbss == NULL
4385               || ! bfd_set_section_flags (abfd, htab->sbss, flags))
4386             return FALSE;
4387         }
4388
4389       *secp = htab->sbss;
4390       *valp = sym->st_size;
4391     }
4392
4393   return TRUE;
4394 }
4395 \f
4396 /* Finish up dynamic symbol handling.  We set the contents of various
4397    dynamic sections here.  */
4398
4399 static bfd_boolean
4400 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
4401                                struct bfd_link_info *info,
4402                                struct elf_link_hash_entry *h,
4403                                Elf_Internal_Sym *sym)
4404 {
4405   struct ppc_elf_link_hash_table *htab;
4406
4407 #ifdef DEBUG
4408   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
4409            h->root.root.string);
4410 #endif
4411
4412   htab = ppc_elf_hash_table (info);
4413   BFD_ASSERT (htab->elf.dynobj != NULL);
4414
4415   if (h->plt.offset != (bfd_vma) -1)
4416     {
4417       Elf_Internal_Rela rela;
4418       bfd_byte *loc;
4419       bfd_vma reloc_index;
4420
4421 #ifdef DEBUG
4422       fprintf (stderr, ", plt_offset = %d", h->plt.offset);
4423 #endif
4424
4425       /* This symbol has an entry in the procedure linkage table.  Set
4426          it up.  */
4427
4428       BFD_ASSERT (h->dynindx != -1);
4429       BFD_ASSERT (htab->plt != NULL && htab->relplt != NULL);
4430
4431       /* We don't need to fill in the .plt.  The ppc dynamic linker
4432          will fill it in.  */
4433
4434       /* Fill in the entry in the .rela.plt section.  */
4435       rela.r_offset = (htab->plt->output_section->vma
4436                        + htab->plt->output_offset
4437                        + h->plt.offset);
4438       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
4439       rela.r_addend = 0;
4440
4441       reloc_index = (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_SLOT_SIZE;
4442       if (reloc_index > PLT_NUM_SINGLE_ENTRIES)
4443         reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
4444       loc = (htab->relplt->contents
4445              + reloc_index * sizeof (Elf32_External_Rela));
4446       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4447
4448       if (!h->def_regular)
4449         {
4450           /* Mark the symbol as undefined, rather than as defined in
4451              the .plt section.  Leave the value alone.  */
4452           sym->st_shndx = SHN_UNDEF;
4453           /* If the symbol is weak, we do need to clear the value.
4454              Otherwise, the PLT entry would provide a definition for
4455              the symbol even if the symbol wasn't defined anywhere,
4456              and so the symbol would never be NULL.  */
4457           if (!h->ref_regular_nonweak)
4458             sym->st_value = 0;
4459         }
4460     }
4461
4462   if (h->needs_copy)
4463     {
4464       asection *s;
4465       Elf_Internal_Rela rela;
4466       bfd_byte *loc;
4467
4468       /* This symbols needs a copy reloc.  Set it up.  */
4469
4470 #ifdef DEBUG
4471       fprintf (stderr, ", copy");
4472 #endif
4473
4474       BFD_ASSERT (h->dynindx != -1);
4475
4476       if (h->size <= elf_gp_size (htab->elf.dynobj))
4477         s = htab->relsbss;
4478       else
4479         s = htab->relbss;
4480       BFD_ASSERT (s != NULL);
4481
4482       rela.r_offset = (h->root.u.def.value
4483                        + h->root.u.def.section->output_section->vma
4484                        + h->root.u.def.section->output_offset);
4485       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
4486       rela.r_addend = 0;
4487       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
4488       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
4489     }
4490
4491 #ifdef DEBUG
4492   fprintf (stderr, "\n");
4493 #endif
4494
4495   /* Mark some specially defined symbols as absolute.  */
4496   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
4497       || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0
4498       || strcmp (h->root.root.string, "_PROCEDURE_LINKAGE_TABLE_") == 0)
4499     sym->st_shndx = SHN_ABS;
4500
4501   return TRUE;
4502 }
4503 \f
4504 /* Finish up the dynamic sections.  */
4505
4506 static bfd_boolean
4507 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
4508                                  struct bfd_link_info *info)
4509 {
4510   asection *sdyn;
4511   struct ppc_elf_link_hash_table *htab;
4512
4513 #ifdef DEBUG
4514   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
4515 #endif
4516
4517   htab = ppc_elf_hash_table (info);
4518   sdyn = bfd_get_section_by_name (htab->elf.dynobj, ".dynamic");
4519
4520   if (htab->elf.dynamic_sections_created)
4521     {
4522       Elf32_External_Dyn *dyncon, *dynconend;
4523
4524       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
4525
4526       dyncon = (Elf32_External_Dyn *) sdyn->contents;
4527       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
4528       for (; dyncon < dynconend; dyncon++)
4529         {
4530           Elf_Internal_Dyn dyn;
4531           asection *s;
4532
4533           bfd_elf32_swap_dyn_in (htab->elf.dynobj, dyncon, &dyn);
4534
4535           switch (dyn.d_tag)
4536             {
4537             case DT_PLTGOT:
4538               s = htab->plt;
4539               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4540               break;
4541
4542             case DT_PLTRELSZ:
4543               dyn.d_un.d_val = htab->relplt->size;
4544               break;
4545
4546             case DT_JMPREL:
4547               s = htab->relplt;
4548               dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
4549               break;
4550
4551             default:
4552               continue;
4553             }
4554
4555           bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
4556         }
4557     }
4558
4559   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
4560      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
4561   if (htab->got)
4562     {
4563       unsigned char *contents = htab->got->contents;
4564       bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, contents);
4565
4566       if (sdyn == NULL)
4567         bfd_put_32 (output_bfd, 0, contents + 4);
4568       else
4569         bfd_put_32 (output_bfd,
4570                     sdyn->output_section->vma + sdyn->output_offset,
4571                     contents + 4);
4572
4573       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
4574     }
4575
4576   return TRUE;
4577 }
4578 \f
4579 /* The RELOCATE_SECTION function is called by the ELF backend linker
4580    to handle the relocations for a section.
4581
4582    The relocs are always passed as Rela structures; if the section
4583    actually uses Rel structures, the r_addend field will always be
4584    zero.
4585
4586    This function is responsible for adjust the section contents as
4587    necessary, and (if using Rela relocs and generating a
4588    relocatable output file) adjusting the reloc addend as
4589    necessary.
4590
4591    This function does not have to worry about setting the reloc
4592    address or the reloc symbol index.
4593
4594    LOCAL_SYMS is a pointer to the swapped in local symbols.
4595
4596    LOCAL_SECTIONS is an array giving the section in the input file
4597    corresponding to the st_shndx field of each local symbol.
4598
4599    The global hash table entry for the global symbols can be found
4600    via elf_sym_hashes (input_bfd).
4601
4602    When generating relocatable output, this function must handle
4603    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
4604    going to be the section symbol corresponding to the output
4605    section, which means that the addend must be adjusted
4606    accordingly.  */
4607
4608 static bfd_boolean
4609 ppc_elf_relocate_section (bfd *output_bfd,
4610                           struct bfd_link_info *info,
4611                           bfd *input_bfd,
4612                           asection *input_section,
4613                           bfd_byte *contents,
4614                           Elf_Internal_Rela *relocs,
4615                           Elf_Internal_Sym *local_syms,
4616                           asection **local_sections)
4617 {
4618   Elf_Internal_Shdr *symtab_hdr;
4619   struct elf_link_hash_entry **sym_hashes;
4620   struct ppc_elf_link_hash_table *htab;
4621   Elf_Internal_Rela *rel;
4622   Elf_Internal_Rela *relend;
4623   Elf_Internal_Rela outrel;
4624   bfd_byte *loc;
4625   asection *sreloc = NULL;
4626   bfd_vma *local_got_offsets;
4627   bfd_boolean ret = TRUE;
4628
4629 #ifdef DEBUG
4630   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
4631                       "%ld relocations%s",
4632                       input_bfd, input_section,
4633                       (long) input_section->reloc_count,
4634                       (info->relocatable) ? " (relocatable)" : "");
4635 #endif
4636
4637   if (info->relocatable)
4638     return TRUE;
4639
4640   /* Initialize howto table if not already done.  */
4641   if (!ppc_elf_howto_table[R_PPC_ADDR32])
4642     ppc_elf_howto_init ();
4643
4644   htab = ppc_elf_hash_table (info);
4645   local_got_offsets = elf_local_got_offsets (input_bfd);
4646   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
4647   sym_hashes = elf_sym_hashes (input_bfd);
4648   rel = relocs;
4649   relend = relocs + input_section->reloc_count;
4650   for (; rel < relend; rel++)
4651     {
4652       enum elf_ppc_reloc_type r_type;
4653       bfd_vma addend;
4654       bfd_reloc_status_type r;
4655       Elf_Internal_Sym *sym;
4656       asection *sec;
4657       struct elf_link_hash_entry *h;
4658       const char *sym_name;
4659       reloc_howto_type *howto;
4660       unsigned long r_symndx;
4661       bfd_vma relocation;
4662       bfd_vma branch_bit, insn, from;
4663       bfd_boolean unresolved_reloc;
4664       bfd_boolean warned;
4665       unsigned int tls_type, tls_mask, tls_gd;
4666
4667       r_type = ELF32_R_TYPE (rel->r_info);
4668       sym = NULL;
4669       sec = NULL;
4670       h = NULL;
4671       unresolved_reloc = FALSE;
4672       warned = FALSE;
4673       r_symndx = ELF32_R_SYM (rel->r_info);
4674
4675       if (r_symndx < symtab_hdr->sh_info)
4676         {
4677           sym = local_syms + r_symndx;
4678           sec = local_sections[r_symndx];
4679           sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym);
4680
4681           relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4682         }
4683       else
4684         {
4685           RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
4686                                    r_symndx, symtab_hdr, sym_hashes,
4687                                    h, sec, relocation,
4688                                    unresolved_reloc, warned);
4689
4690           sym_name = h->root.root.string;
4691         }
4692
4693       /* TLS optimizations.  Replace instruction sequences and relocs
4694          based on information we collected in tls_optimize.  We edit
4695          RELOCS so that --emit-relocs will output something sensible
4696          for the final instruction stream.  */
4697       tls_mask = 0;
4698       tls_gd = 0;
4699       if (IS_PPC_TLS_RELOC (r_type))
4700         {
4701           if (h != NULL)
4702             tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
4703           else if (local_got_offsets != NULL)
4704             {
4705               char *lgot_masks;
4706               lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
4707               tls_mask = lgot_masks[r_symndx];
4708             }
4709         }
4710
4711       /* Ensure reloc mapping code below stays sane.  */
4712       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
4713           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
4714           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
4715           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
4716           || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
4717           || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
4718           || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
4719           || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
4720         abort ();
4721       switch (r_type)
4722         {
4723         default:
4724           break;
4725
4726         case R_PPC_GOT_TPREL16:
4727         case R_PPC_GOT_TPREL16_LO:
4728           if (tls_mask != 0
4729               && (tls_mask & TLS_TPREL) == 0)
4730             {
4731               bfd_vma insn;
4732               insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
4733               insn &= 31 << 21;
4734               insn |= 0x3c020000;       /* addis 0,2,0 */
4735               bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
4736               r_type = R_PPC_TPREL16_HA;
4737               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4738             }
4739           break;
4740
4741         case R_PPC_TLS:
4742           if (tls_mask != 0
4743               && (tls_mask & TLS_TPREL) == 0)
4744             {
4745               bfd_vma insn, rtra;
4746               insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4747               if ((insn & ((31 << 26) | (31 << 11)))
4748                   == ((31 << 26) | (2 << 11)))
4749                 rtra = insn & ((1 << 26) - (1 << 16));
4750               else if ((insn & ((31 << 26) | (31 << 16)))
4751                        == ((31 << 26) | (2 << 16)))
4752                 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
4753               else
4754                 abort ();
4755               if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
4756                 /* add -> addi.  */
4757                 insn = 14 << 26;
4758               else if ((insn & (31 << 1)) == 23 << 1
4759                        && ((insn & (31 << 6)) < 14 << 6
4760                            || ((insn & (31 << 6)) >= 16 << 6
4761                                && (insn & (31 << 6)) < 24 << 6)))
4762                 /* load and store indexed -> dform.  */
4763                 insn = (32 | ((insn >> 6) & 31)) << 26;
4764               else if ((insn & (31 << 1)) == 21 << 1
4765                        && (insn & (0x1a << 6)) == 0)
4766                 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
4767                 insn = (((58 | ((insn >> 6) & 4)) << 26)
4768                         | ((insn >> 6) & 1));
4769               else if ((insn & (31 << 1)) == 21 << 1
4770                        && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
4771                 /* lwax -> lwa.  */
4772                 insn = (58 << 26) | 2;
4773               else
4774                 abort ();
4775               insn |= rtra;
4776               bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4777               r_type = R_PPC_TPREL16_LO;
4778               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4779               /* Was PPC_TLS which sits on insn boundary, now
4780                  PPC_TPREL16_LO which is at insn+2.  */
4781               rel->r_offset += 2;
4782             }
4783           break;
4784
4785         case R_PPC_GOT_TLSGD16_HI:
4786         case R_PPC_GOT_TLSGD16_HA:
4787           tls_gd = TLS_TPRELGD;
4788           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4789             goto tls_gdld_hi;
4790           break;
4791
4792         case R_PPC_GOT_TLSLD16_HI:
4793         case R_PPC_GOT_TLSLD16_HA:
4794           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4795             {
4796             tls_gdld_hi:
4797               if ((tls_mask & tls_gd) != 0)
4798                 r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4799                           + R_PPC_GOT_TPREL16);
4800               else
4801                 {
4802                   bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
4803                   rel->r_offset -= 2;
4804                   r_type = R_PPC_NONE;
4805                 }
4806               rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4807             }
4808           break;
4809
4810         case R_PPC_GOT_TLSGD16:
4811         case R_PPC_GOT_TLSGD16_LO:
4812           tls_gd = TLS_TPRELGD;
4813           if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
4814             goto tls_get_addr_check;
4815           break;
4816
4817         case R_PPC_GOT_TLSLD16:
4818         case R_PPC_GOT_TLSLD16_LO:
4819           if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
4820             {
4821             tls_get_addr_check:
4822               if (rel + 1 < relend)
4823                 {
4824                   enum elf_ppc_reloc_type r_type2;
4825                   unsigned long r_symndx2;
4826                   struct elf_link_hash_entry *h2;
4827                   bfd_vma insn1, insn2;
4828                   bfd_vma offset;
4829
4830                   /* The next instruction should be a call to
4831                      __tls_get_addr.  Peek at the reloc to be sure.  */
4832                   r_type2 = ELF32_R_TYPE (rel[1].r_info);
4833                   r_symndx2 = ELF32_R_SYM (rel[1].r_info);
4834                   if (r_symndx2 < symtab_hdr->sh_info
4835                       || (r_type2 != R_PPC_REL14
4836                           && r_type2 != R_PPC_REL14_BRTAKEN
4837                           && r_type2 != R_PPC_REL14_BRNTAKEN
4838                           && r_type2 != R_PPC_REL24
4839                           && r_type2 != R_PPC_PLTREL24))
4840                     break;
4841
4842                   h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
4843                   while (h2->root.type == bfd_link_hash_indirect
4844                          || h2->root.type == bfd_link_hash_warning)
4845                     h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
4846                   if (h2 == NULL || h2 != htab->tls_get_addr)
4847                     break;
4848
4849                   /* OK, it checks out.  Replace the call.  */
4850                   offset = rel[1].r_offset;
4851                   insn1 = bfd_get_32 (output_bfd,
4852                                       contents + rel->r_offset - 2);
4853                   if ((tls_mask & tls_gd) != 0)
4854                     {
4855                       /* IE */
4856                       insn1 &= (1 << 26) - 1;
4857                       insn1 |= 32 << 26;        /* lwz */
4858                       insn2 = 0x7c631214;       /* add 3,3,2 */
4859                       rel[1].r_info = ELF32_R_INFO (r_symndx2, R_PPC_NONE);
4860                       r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
4861                                 + R_PPC_GOT_TPREL16);
4862                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4863                     }
4864                   else
4865                     {
4866                       /* LE */
4867                       insn1 = 0x3c620000;       /* addis 3,2,0 */
4868                       insn2 = 0x38630000;       /* addi 3,3,0 */
4869                       if (tls_gd == 0)
4870                         {
4871                           /* Was an LD reloc.  */
4872                           r_symndx = 0;
4873                           rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4874                           rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
4875                         }
4876                       r_type = R_PPC_TPREL16_HA;
4877                       rel->r_info = ELF32_R_INFO (r_symndx, r_type);
4878                       rel[1].r_info = ELF32_R_INFO (r_symndx,
4879                                                     R_PPC_TPREL16_LO);
4880                       rel[1].r_offset += 2;
4881                     }
4882                   bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
4883                   bfd_put_32 (output_bfd, insn2, contents + offset);
4884                   if (tls_gd == 0)
4885                     {
4886                       /* We changed the symbol on an LD reloc.  Start over
4887                          in order to get h, sym, sec etc. right.  */
4888                       rel--;
4889                       continue;
4890                     }
4891                 }
4892             }
4893           break;
4894         }
4895
4896       /* Handle other relocations that tweak non-addend part of insn.  */
4897       branch_bit = 0;
4898       switch (r_type)
4899         {
4900         default:
4901           break;
4902
4903           /* Branch taken prediction relocations.  */
4904         case R_PPC_ADDR14_BRTAKEN:
4905         case R_PPC_REL14_BRTAKEN:
4906           branch_bit = BRANCH_PREDICT_BIT;
4907           /* Fall thru */
4908
4909           /* Branch not taken prediction relocations.  */
4910         case R_PPC_ADDR14_BRNTAKEN:
4911         case R_PPC_REL14_BRNTAKEN:
4912           insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
4913           insn &= ~BRANCH_PREDICT_BIT;
4914           insn |= branch_bit;
4915
4916           from = (rel->r_offset
4917                   + input_section->output_offset
4918                   + input_section->output_section->vma);
4919
4920           /* Invert 'y' bit if not the default.  */
4921           if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
4922             insn ^= BRANCH_PREDICT_BIT;
4923
4924           bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
4925           break;
4926         }
4927
4928       addend = rel->r_addend;
4929       tls_type = 0;
4930       howto = NULL;
4931       if (r_type < R_PPC_max)
4932         howto = ppc_elf_howto_table[r_type];
4933       switch (r_type)
4934         {
4935         default:
4936           (*_bfd_error_handler)
4937             (_("%B: unknown relocation type %d for symbol %s"),
4938              input_bfd, (int) r_type, sym_name);
4939
4940           bfd_set_error (bfd_error_bad_value);
4941           ret = FALSE;
4942           continue;
4943
4944         case R_PPC_NONE:
4945         case R_PPC_TLS:
4946         case R_PPC_EMB_MRKREF:
4947         case R_PPC_GNU_VTINHERIT:
4948         case R_PPC_GNU_VTENTRY:
4949           continue;
4950
4951           /* GOT16 relocations.  Like an ADDR16 using the symbol's
4952              address in the GOT as relocation value instead of the
4953              symbol's value itself.  Also, create a GOT entry for the
4954              symbol and put the symbol value there.  */
4955         case R_PPC_GOT_TLSGD16:
4956         case R_PPC_GOT_TLSGD16_LO:
4957         case R_PPC_GOT_TLSGD16_HI:
4958         case R_PPC_GOT_TLSGD16_HA:
4959           tls_type = TLS_TLS | TLS_GD;
4960           goto dogot;
4961
4962         case R_PPC_GOT_TLSLD16:
4963         case R_PPC_GOT_TLSLD16_LO:
4964         case R_PPC_GOT_TLSLD16_HI:
4965         case R_PPC_GOT_TLSLD16_HA:
4966           tls_type = TLS_TLS | TLS_LD;
4967           goto dogot;
4968
4969         case R_PPC_GOT_TPREL16:
4970         case R_PPC_GOT_TPREL16_LO:
4971         case R_PPC_GOT_TPREL16_HI:
4972         case R_PPC_GOT_TPREL16_HA:
4973           tls_type = TLS_TLS | TLS_TPREL;
4974           goto dogot;
4975
4976         case R_PPC_GOT_DTPREL16:
4977         case R_PPC_GOT_DTPREL16_LO:
4978         case R_PPC_GOT_DTPREL16_HI:
4979         case R_PPC_GOT_DTPREL16_HA:
4980           tls_type = TLS_TLS | TLS_DTPREL;
4981           goto dogot;
4982
4983         case R_PPC_GOT16:
4984         case R_PPC_GOT16_LO:
4985         case R_PPC_GOT16_HI:
4986         case R_PPC_GOT16_HA:
4987         dogot:
4988           {
4989             /* Relocation is to the entry for this symbol in the global
4990                offset table.  */
4991             bfd_vma off;
4992             bfd_vma *offp;
4993             unsigned long indx;
4994
4995             if (htab->got == NULL)
4996               abort ();
4997
4998             indx = 0;
4999             if (tls_type == (TLS_TLS | TLS_LD)
5000                 && (h == NULL
5001                     || !h->def_dynamic))
5002               offp = &htab->tlsld_got.offset;
5003             else if (h != NULL)
5004               {
5005                 bfd_boolean dyn;
5006                 dyn = htab->elf.dynamic_sections_created;
5007                 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
5008                     || (info->shared
5009                         && SYMBOL_REFERENCES_LOCAL (info, h)))
5010                   /* This is actually a static link, or it is a
5011                      -Bsymbolic link and the symbol is defined
5012                      locally, or the symbol was forced to be local
5013                      because of a version file.  */
5014                   ;
5015                 else
5016                   {
5017                     indx = h->dynindx;
5018                     unresolved_reloc = FALSE;
5019                   }
5020                 offp = &h->got.offset;
5021               }
5022             else
5023               {
5024                 if (local_got_offsets == NULL)
5025                   abort ();
5026                 offp = &local_got_offsets[r_symndx];
5027               }
5028
5029             /* The offset must always be a multiple of 4.  We use the
5030                least significant bit to record whether we have already
5031                processed this entry.  */
5032             off = *offp;
5033             if ((off & 1) != 0)
5034               off &= ~1;
5035             else
5036               {
5037                 unsigned int tls_m = (tls_mask
5038                                       & (TLS_LD | TLS_GD | TLS_DTPREL
5039                                          | TLS_TPREL | TLS_TPRELGD));
5040
5041                 if (offp == &htab->tlsld_got.offset)
5042                   tls_m = TLS_LD;
5043                 else if (h == NULL
5044                          || !h->def_dynamic)
5045                   tls_m &= ~TLS_LD;
5046
5047                 /* We might have multiple got entries for this sym.
5048                    Initialize them all.  */
5049                 do
5050                   {
5051                     int tls_ty = 0;
5052
5053                     if ((tls_m & TLS_LD) != 0)
5054                       {
5055                         tls_ty = TLS_TLS | TLS_LD;
5056                         tls_m &= ~TLS_LD;
5057                       }
5058                     else if ((tls_m & TLS_GD) != 0)
5059                       {
5060                         tls_ty = TLS_TLS | TLS_GD;
5061                         tls_m &= ~TLS_GD;
5062                       }
5063                     else if ((tls_m & TLS_DTPREL) != 0)
5064                       {
5065                         tls_ty = TLS_TLS | TLS_DTPREL;
5066                         tls_m &= ~TLS_DTPREL;
5067                       }
5068                     else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
5069                       {
5070                         tls_ty = TLS_TLS | TLS_TPREL;
5071                         tls_m = 0;
5072                       }
5073
5074                     /* Generate relocs for the dynamic linker.  */
5075                     if ((info->shared || indx != 0)
5076                         && (h == NULL
5077                             || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5078                             || h->root.type != bfd_link_hash_undefweak))
5079                       {
5080                         outrel.r_offset = (htab->got->output_section->vma
5081                                            + htab->got->output_offset
5082                                            + off);
5083                         outrel.r_addend = 0;
5084                         if (tls_ty & (TLS_LD | TLS_GD))
5085                           {
5086                             outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
5087                             if (tls_ty == (TLS_TLS | TLS_GD))
5088                               {
5089                                 loc = htab->relgot->contents;
5090                                 loc += (htab->relgot->reloc_count++
5091                                         * sizeof (Elf32_External_Rela));
5092                                 bfd_elf32_swap_reloca_out (output_bfd,
5093                                                            &outrel, loc);
5094                                 outrel.r_offset += 4;
5095                                 outrel.r_info
5096                                   = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5097                               }
5098                           }
5099                         else if (tls_ty == (TLS_TLS | TLS_DTPREL))
5100                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
5101                         else if (tls_ty == (TLS_TLS | TLS_TPREL))
5102                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
5103                         else if (indx == 0)
5104                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
5105                         else
5106                           outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
5107                         if (indx == 0)
5108                           {
5109                             outrel.r_addend += relocation;
5110                             if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
5111                               outrel.r_addend -= htab->elf.tls_sec->vma;
5112                           }
5113                         loc = htab->relgot->contents;
5114                         loc += (htab->relgot->reloc_count++
5115                                 * sizeof (Elf32_External_Rela));
5116                         bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5117                       }
5118
5119                     /* Init the .got section contents if we're not
5120                        emitting a reloc.  */
5121                     else
5122                       {
5123                         bfd_vma value = relocation;
5124
5125                         if (tls_ty == (TLS_TLS | TLS_LD))
5126                           value = 1;
5127                         else if (tls_ty != 0)
5128                           {
5129                             value -= htab->elf.tls_sec->vma + DTP_OFFSET;
5130                             if (tls_ty == (TLS_TLS | TLS_TPREL))
5131                               value += DTP_OFFSET - TP_OFFSET;
5132
5133                             if (tls_ty == (TLS_TLS | TLS_GD))
5134                               {
5135                                 bfd_put_32 (output_bfd, value,
5136                                             htab->got->contents + off + 4);
5137                                 value = 1;
5138                               }
5139                           }
5140                         bfd_put_32 (output_bfd, value,
5141                                     htab->got->contents + off);
5142                       }
5143
5144                     off += 4;
5145                     if (tls_ty & (TLS_LD | TLS_GD))
5146                       off += 4;
5147                   }
5148                 while (tls_m != 0);
5149
5150                 off = *offp;
5151                 *offp = off | 1;
5152               }
5153
5154             if (off >= (bfd_vma) -2)
5155               abort ();
5156
5157             if ((tls_type & TLS_TLS) != 0)
5158               {
5159                 if (tls_type != (TLS_TLS | TLS_LD))
5160                   {
5161                     if ((tls_mask & TLS_LD) != 0
5162                         && !(h == NULL
5163                              || !h->def_dynamic))
5164                       off += 8;
5165                     if (tls_type != (TLS_TLS | TLS_GD))
5166                       {
5167                         if ((tls_mask & TLS_GD) != 0)
5168                           off += 8;
5169                         if (tls_type != (TLS_TLS | TLS_DTPREL))
5170                           {
5171                             if ((tls_mask & TLS_DTPREL) != 0)
5172                               off += 4;
5173                           }
5174                       }
5175                   }
5176               }
5177
5178             relocation = htab->got->output_offset + off - 4;
5179
5180             /* Addends on got relocations don't make much sense.
5181                x+off@got is actually x@got+off, and since the got is
5182                generated by a hash table traversal, the value in the
5183                got at entry m+n bears little relation to the entry m.  */
5184             if (addend != 0)
5185               (*_bfd_error_handler)
5186                 (_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
5187                  input_bfd,
5188                  input_section,
5189                  (long) rel->r_offset,
5190                  howto->name,
5191                  sym_name);
5192           }
5193         break;
5194
5195         /* Relocations that need no special processing.  */
5196         case R_PPC_LOCAL24PC:
5197           /* It makes no sense to point a local relocation
5198              at a symbol not in this object.  */
5199           if (unresolved_reloc)
5200             {
5201               if (! (*info->callbacks->undefined_symbol) (info,
5202                                                           h->root.root.string,
5203                                                           input_bfd,
5204                                                           input_section,
5205                                                           rel->r_offset,
5206                                                           TRUE))
5207                 return FALSE;
5208               continue;
5209             }
5210           break;
5211
5212         case R_PPC_DTPREL16:
5213         case R_PPC_DTPREL16_LO:
5214         case R_PPC_DTPREL16_HI:
5215         case R_PPC_DTPREL16_HA:
5216           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5217           break;
5218
5219           /* Relocations that may need to be propagated if this is a shared
5220              object.  */
5221         case R_PPC_TPREL16:
5222         case R_PPC_TPREL16_LO:
5223         case R_PPC_TPREL16_HI:
5224         case R_PPC_TPREL16_HA:
5225           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5226           /* The TPREL16 relocs shouldn't really be used in shared
5227              libs as they will result in DT_TEXTREL being set, but
5228              support them anyway.  */
5229           goto dodyn;
5230
5231         case R_PPC_TPREL32:
5232           addend -= htab->elf.tls_sec->vma + TP_OFFSET;
5233           goto dodyn;
5234
5235         case R_PPC_DTPREL32:
5236           addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
5237           goto dodyn;
5238
5239         case R_PPC_DTPMOD32:
5240           relocation = 1;
5241           addend = 0;
5242           goto dodyn;
5243
5244         case R_PPC_REL24:
5245         case R_PPC_REL32:
5246         case R_PPC_REL14:
5247         case R_PPC_REL14_BRTAKEN:
5248         case R_PPC_REL14_BRNTAKEN:
5249           /* If these relocations are not to a named symbol, they can be
5250              handled right here, no need to bother the dynamic linker.  */
5251           if (SYMBOL_REFERENCES_LOCAL (info, h)
5252               || strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
5253             break;
5254           /* fall through */
5255
5256           /* Relocations that always need to be propagated if this is a shared
5257              object.  */
5258         case R_PPC_ADDR32:
5259         case R_PPC_ADDR24:
5260         case R_PPC_ADDR16:
5261         case R_PPC_ADDR16_LO:
5262         case R_PPC_ADDR16_HI:
5263         case R_PPC_ADDR16_HA:
5264         case R_PPC_ADDR14:
5265         case R_PPC_ADDR14_BRTAKEN:
5266         case R_PPC_ADDR14_BRNTAKEN:
5267         case R_PPC_UADDR32:
5268         case R_PPC_UADDR16:
5269           /* r_symndx will be zero only for relocs against symbols
5270              from removed linkonce sections, or sections discarded by
5271              a linker script.  */
5272         dodyn:
5273           if (r_symndx == 0)
5274             break;
5275           /* Fall thru.  */
5276
5277           if ((info->shared
5278                && (h == NULL
5279                    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
5280                    || h->root.type != bfd_link_hash_undefweak)
5281                && (MUST_BE_DYN_RELOC (r_type)
5282                    || !SYMBOL_CALLS_LOCAL (info, h)))
5283               || (ELIMINATE_COPY_RELOCS
5284                   && !info->shared
5285                   && (input_section->flags & SEC_ALLOC) != 0
5286                   && h != NULL
5287                   && h->dynindx != -1
5288                   && !h->non_got_ref
5289                   && h->def_dynamic
5290                   && !h->def_regular))
5291             {
5292               int skip;
5293
5294 #ifdef DEBUG
5295               fprintf (stderr, "ppc_elf_relocate_section needs to "
5296                        "create relocation for %s\n",
5297                        (h && h->root.root.string
5298                         ? h->root.root.string : "<unknown>"));
5299 #endif
5300
5301               /* When generating a shared object, these relocations
5302                  are copied into the output file to be resolved at run
5303                  time.  */
5304               if (sreloc == NULL)
5305                 {
5306                   const char *name;
5307
5308                   name = (bfd_elf_string_from_elf_section
5309                           (input_bfd,
5310                            elf_elfheader (input_bfd)->e_shstrndx,
5311                            elf_section_data (input_section)->rel_hdr.sh_name));
5312                   if (name == NULL)
5313                     return FALSE;
5314
5315                   BFD_ASSERT (strncmp (name, ".rela", 5) == 0
5316                               && strcmp (bfd_get_section_name (input_bfd,
5317                                                                input_section),
5318                                          name + 5) == 0);
5319
5320                   sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
5321                   BFD_ASSERT (sreloc != NULL);
5322                 }
5323
5324               skip = 0;
5325
5326               outrel.r_offset =
5327                 _bfd_elf_section_offset (output_bfd, info, input_section,
5328                                          rel->r_offset);
5329               if (outrel.r_offset == (bfd_vma) -1
5330                   || outrel.r_offset == (bfd_vma) -2)
5331                 skip = (int) outrel.r_offset;
5332               outrel.r_offset += (input_section->output_section->vma
5333                                   + input_section->output_offset);
5334
5335               if (skip)
5336                 memset (&outrel, 0, sizeof outrel);
5337               else if (!SYMBOL_REFERENCES_LOCAL (info, h))
5338                 {
5339                   unresolved_reloc = FALSE;
5340                   outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
5341                   outrel.r_addend = rel->r_addend;
5342                 }
5343               else
5344                 {
5345                   outrel.r_addend = relocation + rel->r_addend;
5346
5347                   if (r_type == R_PPC_ADDR32)
5348                     outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
5349                   else
5350                     {
5351                       long indx;
5352
5353                       if (bfd_is_abs_section (sec))
5354                         indx = 0;
5355                       else if (sec == NULL || sec->owner == NULL)
5356                         {
5357                           bfd_set_error (bfd_error_bad_value);
5358                           return FALSE;
5359                         }
5360                       else
5361                         {
5362                           asection *osec;
5363
5364                           /* We are turning this relocation into one
5365                              against a section symbol.  It would be
5366                              proper to subtract the symbol's value,
5367                              osec->vma, from the emitted reloc addend,
5368                              but ld.so expects buggy relocs.  */
5369                           osec = sec->output_section;
5370                           indx = elf_section_data (osec)->dynindx;
5371                           BFD_ASSERT (indx > 0);
5372 #ifdef DEBUG
5373                           if (indx <= 0)
5374                             printf ("indx=%d section=%s flags=%08x name=%s\n",
5375                                     indx, osec->name, osec->flags,
5376                                     h->root.root.string);
5377 #endif
5378                         }
5379
5380                       outrel.r_info = ELF32_R_INFO (indx, r_type);
5381                     }
5382                 }
5383
5384               loc = sreloc->contents;
5385               loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
5386               bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
5387
5388               if (skip == -1)
5389                 continue;
5390
5391               /* This reloc will be computed at runtime.  We clear the memory
5392                  so that it contains predictable value.  */
5393               if (! skip
5394                   && ((input_section->flags & SEC_ALLOC) != 0
5395                       || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
5396                 {
5397                   relocation = howto->pc_relative ? outrel.r_offset : 0;
5398                   addend = 0;
5399                   break;
5400                 }
5401             }
5402           break;
5403
5404         case R_PPC_RELAX32PC_PLT:
5405         case R_PPC_RELAX32_PLT:
5406           BFD_ASSERT (h != NULL
5407                       && h->plt.offset != (bfd_vma) -1
5408                       && htab->plt != NULL);
5409
5410           relocation = (htab->plt->output_section->vma
5411                         + htab->plt->output_offset
5412                         + h->plt.offset);
5413           if (r_type == R_PPC_RELAX32_PLT)
5414             goto relax32;
5415           /* Fall thru */
5416
5417         case R_PPC_RELAX32PC:
5418           relocation -= (input_section->output_section->vma
5419                          + input_section->output_offset
5420                          + rel->r_offset - 4);
5421           /* Fall thru */
5422
5423         case R_PPC_RELAX32:
5424         relax32:
5425           {
5426             unsigned long t0;
5427             unsigned long t1;
5428
5429             t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
5430             t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
5431
5432             /* We're clearing the bits for R_PPC_ADDR16_HA
5433                and R_PPC_ADDR16_LO here.  */
5434             t0 &= ~0xffff;
5435             t1 &= ~0xffff;
5436
5437             /* t0 is HA, t1 is LO */
5438             relocation += addend;
5439             t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
5440             t1 |= relocation & 0xffff;
5441
5442             bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
5443             bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
5444           }
5445           continue;
5446
5447           /* Indirect .sdata relocation.  */
5448         case R_PPC_EMB_SDAI16:
5449           BFD_ASSERT (htab->sdata != NULL);
5450           relocation
5451             = elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
5452                                                  htab->sdata, h, relocation,
5453                                                  rel, R_PPC_RELATIVE);
5454           break;
5455
5456           /* Indirect .sdata2 relocation.  */
5457         case R_PPC_EMB_SDA2I16:
5458           BFD_ASSERT (htab->sdata2 != NULL);
5459           relocation
5460             = elf_finish_pointer_linker_section (output_bfd, input_bfd, info,
5461                                                  htab->sdata2, h, relocation,
5462                                                  rel, R_PPC_RELATIVE);
5463           break;
5464
5465           /* Handle the TOC16 reloc.  We want to use the offset within the .got
5466              section, not the actual VMA.  This is appropriate when generating
5467              an embedded ELF object, for which the .got section acts like the
5468              AIX .toc section.  */
5469         case R_PPC_TOC16:                       /* phony GOT16 relocations */
5470           BFD_ASSERT (sec != NULL);
5471           BFD_ASSERT (bfd_is_und_section (sec)
5472                       || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
5473                       || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
5474
5475             addend -= sec->output_section->vma + sec->output_offset + 0x8000;
5476           break;
5477
5478         case R_PPC_PLTREL24:
5479           /* Relocation is to the entry for this symbol in the
5480              procedure linkage table.  */
5481           BFD_ASSERT (h != NULL);
5482
5483           if (h->plt.offset == (bfd_vma) -1
5484               || htab->plt == NULL)
5485             {
5486               /* We didn't make a PLT entry for this symbol.  This
5487                  happens when statically linking PIC code, or when
5488                  using -Bsymbolic.  */
5489               break;
5490             }
5491
5492           unresolved_reloc = FALSE;
5493           relocation = (htab->plt->output_section->vma
5494                         + htab->plt->output_offset
5495                         + h->plt.offset);
5496           break;
5497
5498           /* Relocate against _SDA_BASE_.  */
5499         case R_PPC_SDAREL16:
5500           {
5501             const char *name;
5502             const struct elf_link_hash_entry *sh;
5503
5504             BFD_ASSERT (sec != NULL);
5505             name = bfd_get_section_name (abfd, sec->output_section);
5506             if (! ((strncmp (name, ".sdata", 6) == 0
5507                     && (name[6] == 0 || name[6] == '.'))
5508                    || (strncmp (name, ".sbss", 5) == 0
5509                        && (name[5] == 0 || name[5] == '.'))))
5510               {
5511                 (*_bfd_error_handler)
5512                   (_("%B: the target (%s) of a %s relocation is "
5513                      "in the wrong output section (%s)"),
5514                    input_bfd,
5515                    sym_name,
5516                    howto->name,
5517                    name);
5518               }
5519             sh = htab->sdata->sym_hash;
5520             addend -= (sh->root.u.def.value
5521                        + sh->root.u.def.section->output_section->vma
5522                        + sh->root.u.def.section->output_offset);
5523           }
5524           break;
5525
5526           /* Relocate against _SDA2_BASE_.  */
5527         case R_PPC_EMB_SDA2REL:
5528           {
5529             const char *name;
5530             const struct elf_link_hash_entry *sh;
5531
5532             BFD_ASSERT (sec != NULL);
5533             name = bfd_get_section_name (abfd, sec->output_section);
5534             if (! (strncmp (name, ".sdata2", 7) == 0
5535                    || strncmp (name, ".sbss2", 6) == 0))
5536               {
5537                 (*_bfd_error_handler)
5538                   (_("%B: the target (%s) of a %s relocation is "
5539                      "in the wrong output section (%s)"),
5540                    input_bfd,
5541                    sym_name,
5542                    howto->name,
5543                    name);
5544
5545                 bfd_set_error (bfd_error_bad_value);
5546                 ret = FALSE;
5547                 continue;
5548               }
5549             sh = htab->sdata2->sym_hash;
5550             addend -= (sh->root.u.def.value
5551                        + sh->root.u.def.section->output_section->vma
5552                        + sh->root.u.def.section->output_offset);
5553           }
5554           break;
5555
5556           /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
5557         case R_PPC_EMB_SDA21:
5558         case R_PPC_EMB_RELSDA:
5559           {
5560             const char *name;
5561             const struct elf_link_hash_entry *sh;
5562             int reg;
5563
5564             BFD_ASSERT (sec != NULL);
5565             name = bfd_get_section_name (abfd, sec->output_section);
5566             if (((strncmp (name, ".sdata", 6) == 0
5567                   && (name[6] == 0 || name[6] == '.'))
5568                  || (strncmp (name, ".sbss", 5) == 0
5569                      && (name[5] == 0 || name[5] == '.'))))
5570               {
5571                 reg = 13;
5572                 sh = htab->sdata->sym_hash;
5573                 addend -= (sh->root.u.def.value
5574                            + sh->root.u.def.section->output_section->vma
5575                            + sh->root.u.def.section->output_offset);
5576               }
5577
5578             else if (strncmp (name, ".sdata2", 7) == 0
5579                      || strncmp (name, ".sbss2", 6) == 0)
5580               {
5581                 reg = 2;
5582                 sh = htab->sdata2->sym_hash;
5583                 addend -= (sh->root.u.def.value
5584                            + sh->root.u.def.section->output_section->vma
5585                            + sh->root.u.def.section->output_offset);
5586               }
5587
5588             else if (strcmp (name, ".PPC.EMB.sdata0") == 0
5589                      || strcmp (name, ".PPC.EMB.sbss0") == 0)
5590               {
5591                 reg = 0;
5592               }
5593
5594             else
5595               {
5596                 (*_bfd_error_handler)
5597                   (_("%B: the target (%s) of a %s relocation is "
5598                      "in the wrong output section (%s)"),
5599                    input_bfd,
5600                    sym_name,
5601                    howto->name,
5602                    name);
5603
5604                 bfd_set_error (bfd_error_bad_value);
5605                 ret = FALSE;
5606                 continue;
5607               }
5608
5609             if (r_type == R_PPC_EMB_SDA21)
5610               {                 /* fill in register field */
5611                 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5612                 insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
5613                 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5614               }
5615           }
5616           break;
5617
5618           /* Relocate against the beginning of the section.  */
5619         case R_PPC_SECTOFF:
5620         case R_PPC_SECTOFF_LO:
5621         case R_PPC_SECTOFF_HI:
5622         case R_PPC_SECTOFF_HA:
5623           BFD_ASSERT (sec != NULL);
5624           addend -= sec->output_section->vma;
5625           break;
5626
5627           /* Negative relocations.  */
5628         case R_PPC_EMB_NADDR32:
5629         case R_PPC_EMB_NADDR16:
5630         case R_PPC_EMB_NADDR16_LO:
5631         case R_PPC_EMB_NADDR16_HI:
5632         case R_PPC_EMB_NADDR16_HA:
5633           addend -= 2 * relocation;
5634           break;
5635
5636         case R_PPC_COPY:
5637         case R_PPC_GLOB_DAT:
5638         case R_PPC_JMP_SLOT:
5639         case R_PPC_RELATIVE:
5640         case R_PPC_PLT32:
5641         case R_PPC_PLTREL32:
5642         case R_PPC_PLT16_LO:
5643         case R_PPC_PLT16_HI:
5644         case R_PPC_PLT16_HA:
5645         case R_PPC_ADDR30:
5646         case R_PPC_EMB_RELSEC16:
5647         case R_PPC_EMB_RELST_LO:
5648         case R_PPC_EMB_RELST_HI:
5649         case R_PPC_EMB_RELST_HA:
5650         case R_PPC_EMB_BIT_FLD:
5651           (*_bfd_error_handler)
5652             (_("%B: relocation %s is not yet supported for symbol %s."),
5653              input_bfd,
5654              howto->name,
5655              sym_name);
5656
5657           bfd_set_error (bfd_error_invalid_operation);
5658           ret = FALSE;
5659           continue;
5660         }
5661
5662       /* Do any further special processing.  */
5663       switch (r_type)
5664         {
5665         default:
5666           break;
5667
5668         case R_PPC_ADDR16_HA:
5669         case R_PPC_GOT16_HA:
5670         case R_PPC_PLT16_HA:
5671         case R_PPC_SECTOFF_HA:
5672         case R_PPC_TPREL16_HA:
5673         case R_PPC_DTPREL16_HA:
5674         case R_PPC_GOT_TLSGD16_HA:
5675         case R_PPC_GOT_TLSLD16_HA:
5676         case R_PPC_GOT_TPREL16_HA:
5677         case R_PPC_GOT_DTPREL16_HA:
5678         case R_PPC_EMB_NADDR16_HA:
5679         case R_PPC_EMB_RELST_HA:
5680           /* It's just possible that this symbol is a weak symbol
5681              that's not actually defined anywhere.  In that case,
5682              'sec' would be NULL, and we should leave the symbol
5683              alone (it will be set to zero elsewhere in the link).  */
5684           if (sec != NULL)
5685             /* Add 0x10000 if sign bit in 0:15 is set.
5686                Bits 0:15 are not used.  */
5687             addend += 0x8000;
5688           break;
5689         }
5690
5691 #ifdef DEBUG
5692       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
5693                "offset = %ld, addend = %ld\n",
5694                howto->name,
5695                (int) r_type,
5696                sym_name,
5697                r_symndx,
5698                (long) rel->r_offset,
5699                (long) addend);
5700 #endif
5701
5702       if (unresolved_reloc
5703           && !((input_section->flags & SEC_DEBUGGING) != 0
5704                && h->def_dynamic))
5705         {
5706           (*_bfd_error_handler)
5707             (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
5708              input_bfd,
5709              input_section,
5710              (long) rel->r_offset,
5711              howto->name,
5712              sym_name);
5713           ret = FALSE;
5714         }
5715
5716       r = _bfd_final_link_relocate (howto,
5717                                     input_bfd,
5718                                     input_section,
5719                                     contents,
5720                                     rel->r_offset,
5721                                     relocation,
5722                                     addend);
5723
5724       if (r != bfd_reloc_ok)
5725         {
5726           if (sym_name == NULL)
5727             sym_name = "(null)";
5728           if (r == bfd_reloc_overflow)
5729             {
5730               if (warned)
5731                 continue;
5732               if (h != NULL
5733                   && h->root.type == bfd_link_hash_undefweak
5734                   && howto->pc_relative)
5735                 {
5736                   /* Assume this is a call protected by other code that
5737                      detect the symbol is undefined.  If this is the case,
5738                      we can safely ignore the overflow.  If not, the
5739                      program is hosed anyway, and a little warning isn't
5740                      going to help.  */
5741
5742                   continue;
5743                 }
5744
5745               if (! (*info->callbacks->reloc_overflow) (info,
5746                                                         (h ? &h->root : NULL),
5747                                                         sym_name,
5748                                                         howto->name,
5749                                                         rel->r_addend,
5750                                                         input_bfd,
5751                                                         input_section,
5752                                                         rel->r_offset))
5753                 return FALSE;
5754             }
5755           else
5756             {
5757               (*_bfd_error_handler)
5758                 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
5759                  input_bfd, input_section,
5760                  (long) rel->r_offset, howto->name, sym_name, (int) r);
5761               ret = FALSE;
5762             }
5763         }
5764     }
5765
5766 #ifdef DEBUG
5767   fprintf (stderr, "\n");
5768 #endif
5769
5770   return ret;
5771 }
5772
5773 static enum elf_reloc_type_class
5774 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
5775 {
5776   switch (ELF32_R_TYPE (rela->r_info))
5777     {
5778     case R_PPC_RELATIVE:
5779       return reloc_class_relative;
5780     case R_PPC_REL24:
5781     case R_PPC_ADDR24:
5782     case R_PPC_JMP_SLOT:
5783       return reloc_class_plt;
5784     case R_PPC_COPY:
5785       return reloc_class_copy;
5786     default:
5787       return reloc_class_normal;
5788     }
5789 }
5790 \f
5791 /* Support for core dump NOTE sections.  */
5792
5793 static bfd_boolean
5794 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
5795 {
5796   int offset;
5797   unsigned int size;
5798
5799   switch (note->descsz)
5800     {
5801     default:
5802       return FALSE;
5803
5804     case 268:           /* Linux/PPC.  */
5805       /* pr_cursig */
5806       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
5807
5808       /* pr_pid */
5809       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
5810
5811       /* pr_reg */
5812       offset = 72;
5813       size = 192;
5814
5815       break;
5816     }
5817
5818   /* Make a ".reg/999" section.  */
5819   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
5820                                           size, note->descpos + offset);
5821 }
5822
5823 static bfd_boolean
5824 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
5825 {
5826   switch (note->descsz)
5827     {
5828     default:
5829       return FALSE;
5830
5831     case 128:           /* Linux/PPC elf_prpsinfo.  */
5832       elf_tdata (abfd)->core_program
5833         = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
5834       elf_tdata (abfd)->core_command
5835         = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
5836     }
5837
5838   /* Note that for some reason, a spurious space is tacked
5839      onto the end of the args in some (at least one anyway)
5840      implementations, so strip it off if it exists.  */
5841
5842   {
5843     char *command = elf_tdata (abfd)->core_command;
5844     int n = strlen (command);
5845
5846     if (0 < n && command[n - 1] == ' ')
5847       command[n - 1] = '\0';
5848   }
5849
5850   return TRUE;
5851 }
5852 \f
5853 /* Very simple linked list structure for recording apuinfo values.  */
5854 typedef struct apuinfo_list
5855 {
5856   struct apuinfo_list *next;
5857   unsigned long value;
5858 }
5859 apuinfo_list;
5860
5861 static apuinfo_list *head;
5862
5863
5864 static void
5865 apuinfo_list_init (void)
5866 {
5867   head = NULL;
5868 }
5869
5870 static void
5871 apuinfo_list_add (unsigned long value)
5872 {
5873   apuinfo_list *entry = head;
5874
5875   while (entry != NULL)
5876     {
5877       if (entry->value == value)
5878         return;
5879       entry = entry->next;
5880     }
5881
5882   entry = bfd_malloc (sizeof (* entry));
5883   if (entry == NULL)
5884     return;
5885
5886   entry->value = value;
5887   entry->next  = head;
5888   head = entry;
5889 }
5890
5891 static unsigned
5892 apuinfo_list_length (void)
5893 {
5894   apuinfo_list *entry;
5895   unsigned long count;
5896
5897   for (entry = head, count = 0;
5898        entry;
5899        entry = entry->next)
5900     ++ count;
5901
5902   return count;
5903 }
5904
5905 static inline unsigned long
5906 apuinfo_list_element (unsigned long number)
5907 {
5908   apuinfo_list * entry;
5909
5910   for (entry = head;
5911        entry && number --;
5912        entry = entry->next)
5913     ;
5914
5915   return entry ? entry->value : 0;
5916 }
5917
5918 static void
5919 apuinfo_list_finish (void)
5920 {
5921   apuinfo_list *entry;
5922
5923   for (entry = head; entry;)
5924     {
5925       apuinfo_list *next = entry->next;
5926       free (entry);
5927       entry = next;
5928     }
5929
5930   head = NULL;
5931 }
5932
5933 #define APUINFO_SECTION_NAME    ".PPC.EMB.apuinfo"
5934 #define APUINFO_LABEL           "APUinfo"
5935
5936 /* Scan the input BFDs and create a linked list of
5937    the APUinfo values that will need to be emitted.  */
5938
5939 static void
5940 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
5941 {
5942   bfd *ibfd;
5943   asection *asec;
5944   char *buffer;
5945   unsigned num_input_sections;
5946   bfd_size_type output_section_size;
5947   unsigned i;
5948   unsigned num_entries;
5949   unsigned long offset;
5950   unsigned long length;
5951   const char *error_message = NULL;
5952
5953   if (link_info == NULL)
5954     return;
5955
5956   /* Scan the input bfds, looking for apuinfo sections.  */
5957   num_input_sections = 0;
5958   output_section_size = 0;
5959
5960   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
5961     {
5962       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
5963       if (asec)
5964         {
5965           ++ num_input_sections;
5966           output_section_size += asec->size;
5967         }
5968     }
5969
5970   /* We need at least one input sections
5971      in order to make merging worthwhile.  */
5972   if (num_input_sections < 1)
5973     return;
5974
5975   /* Just make sure that the output section exists as well.  */
5976   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
5977   if (asec == NULL)
5978     return;
5979
5980   /* Allocate a buffer for the contents of the input sections.  */
5981   buffer = bfd_malloc (output_section_size);
5982   if (buffer == NULL)
5983     return;
5984
5985   offset = 0;
5986   apuinfo_list_init ();
5987
5988   /* Read in the input sections contents.  */
5989   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
5990     {
5991       unsigned long datum;
5992       char *ptr;
5993
5994       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
5995       if (asec == NULL)
5996         continue;
5997
5998       length = asec->size;
5999       if (length < 24)
6000         {
6001           error_message = _("corrupt or empty %s section in %B");
6002           goto fail;
6003         }
6004
6005       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
6006           || (bfd_bread (buffer + offset, length, ibfd) != length))
6007         {
6008           error_message = _("unable to read in %s section from %B");
6009           goto fail;
6010         }
6011
6012       /* Process the contents of the section.  */
6013       ptr = buffer + offset;
6014       error_message = _("corrupt %s section in %B");
6015
6016       /* Verify the contents of the header.  Note - we have to
6017          extract the values this way in order to allow for a
6018          host whose endian-ness is different from the target.  */
6019       datum = bfd_get_32 (ibfd, ptr);
6020       if (datum != sizeof APUINFO_LABEL)
6021         goto fail;
6022
6023       datum = bfd_get_32 (ibfd, ptr + 8);
6024       if (datum != 0x2)
6025         goto fail;
6026
6027       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
6028         goto fail;
6029
6030       /* Get the number of bytes used for apuinfo entries.  */
6031       datum = bfd_get_32 (ibfd, ptr + 4);
6032       if (datum + 20 != length)
6033         goto fail;
6034
6035       /* Make sure that we do not run off the end of the section.  */
6036       if (offset + length > output_section_size)
6037         goto fail;
6038
6039       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
6040       for (i = 0; i < datum; i += 4)
6041         apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
6042
6043       /* Update the offset.  */
6044       offset += length;
6045     }
6046
6047   error_message = NULL;
6048
6049   /* Compute the size of the output section.  */
6050   num_entries = apuinfo_list_length ();
6051   output_section_size = 20 + num_entries * 4;
6052
6053   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
6054
6055   if (! bfd_set_section_size (abfd, asec, output_section_size))
6056     ibfd = abfd,
6057       error_message = _("warning: unable to set size of %s section in %B");
6058
6059  fail:
6060   free (buffer);
6061
6062   if (error_message)
6063     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
6064 }
6065
6066
6067 /* Prevent the output section from accumulating the input sections'
6068    contents.  We have already stored this in our linked list structure.  */
6069
6070 static bfd_boolean
6071 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
6072                        asection *asec,
6073                        bfd_byte *contents ATTRIBUTE_UNUSED)
6074 {
6075   return (apuinfo_list_length ()
6076           && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
6077 }
6078
6079
6080 /* Finally we can generate the output section.  */
6081
6082 static void
6083 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
6084 {
6085   bfd_byte *buffer;
6086   asection *asec;
6087   unsigned i;
6088   unsigned num_entries;
6089   bfd_size_type length;
6090
6091   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
6092   if (asec == NULL)
6093     return;
6094
6095   if (apuinfo_list_length () == 0)
6096     return;
6097
6098   length = asec->size;
6099   if (length < 20)
6100     return;
6101
6102   buffer = bfd_malloc (length);
6103   if (buffer == NULL)
6104     {
6105       (*_bfd_error_handler)
6106         (_("failed to allocate space for new APUinfo section."));
6107       return;
6108     }
6109
6110   /* Create the apuinfo header.  */
6111   num_entries = apuinfo_list_length ();
6112   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
6113   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
6114   bfd_put_32 (abfd, 0x2, buffer + 8);
6115   strcpy ((char *) buffer + 12, APUINFO_LABEL);
6116
6117   length = 20;
6118   for (i = 0; i < num_entries; i++)
6119     {
6120       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
6121       length += 4;
6122     }
6123
6124   if (length != asec->size)
6125     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
6126
6127   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
6128     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
6129
6130   free (buffer);
6131
6132   apuinfo_list_finish ();
6133 }
6134
6135 /* Return address for Ith PLT stub in section PLT, for relocation REL
6136    or (bfd_vma) -1 if it should not be included.  */
6137
6138 static bfd_vma
6139 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
6140                      const asection *plt ATTRIBUTE_UNUSED,
6141                      const arelent *rel)
6142 {
6143   return rel->address;
6144 }
6145
6146 /* Add extra PPC sections -- Note, for now, make .sbss2 and
6147    .PPC.EMB.sbss0 a normal section, and not a bss section so
6148    that the linker doesn't crater when trying to make more than
6149    2 sections.  */
6150
6151 static struct bfd_elf_special_section const ppc_elf_special_sections[]=
6152 {
6153   { ".tags",             5,  0, SHT_ORDERED,  SHF_ALLOC },
6154   { ".sdata",            6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
6155   { ".sbss",             5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
6156   { ".sdata2",           7, -2, SHT_PROGBITS, SHF_ALLOC },
6157   { ".sbss2",            6, -2, SHT_PROGBITS, SHF_ALLOC },
6158   { ".PPC.EMB.apuinfo", 16,  0, SHT_NOTE,     0 },
6159   { ".PPC.EMB.sdata0",  15,  0, SHT_PROGBITS, SHF_ALLOC },
6160   { ".PPC.EMB.sbss0",   14,  0, SHT_PROGBITS, SHF_ALLOC },
6161   { ".plt",              4,  0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
6162   { NULL,                0,  0, 0,            0 }
6163 };
6164 \f
6165 #define TARGET_LITTLE_SYM       bfd_elf32_powerpcle_vec
6166 #define TARGET_LITTLE_NAME      "elf32-powerpcle"
6167 #define TARGET_BIG_SYM          bfd_elf32_powerpc_vec
6168 #define TARGET_BIG_NAME         "elf32-powerpc"
6169 #define ELF_ARCH                bfd_arch_powerpc
6170 #define ELF_MACHINE_CODE        EM_PPC
6171 #ifdef __QNXTARGET__
6172 #define ELF_MAXPAGESIZE         0x1000
6173 #else
6174 #define ELF_MAXPAGESIZE         0x10000
6175 #endif
6176 #define ELF_MINPAGESIZE         0x1000
6177 #define elf_info_to_howto       ppc_elf_info_to_howto
6178
6179 #ifdef  EM_CYGNUS_POWERPC
6180 #define ELF_MACHINE_ALT1        EM_CYGNUS_POWERPC
6181 #endif
6182
6183 #ifdef EM_PPC_OLD
6184 #define ELF_MACHINE_ALT2        EM_PPC_OLD
6185 #endif
6186
6187 #define elf_backend_plt_not_loaded      1
6188 #define elf_backend_got_symbol_offset   4
6189 #define elf_backend_can_gc_sections     1
6190 #define elf_backend_can_refcount        1
6191 #define elf_backend_got_header_size     12
6192 #define elf_backend_rela_normal         1
6193
6194 #define bfd_elf32_mkobject                      ppc_elf_mkobject
6195 #define bfd_elf32_bfd_merge_private_bfd_data    ppc_elf_merge_private_bfd_data
6196 #define bfd_elf32_bfd_relax_section             ppc_elf_relax_section
6197 #define bfd_elf32_bfd_reloc_type_lookup         ppc_elf_reloc_type_lookup
6198 #define bfd_elf32_bfd_set_private_flags         ppc_elf_set_private_flags
6199 #define bfd_elf32_bfd_link_hash_table_create    ppc_elf_link_hash_table_create
6200
6201 #define elf_backend_object_p                    ppc_elf_object_p
6202 #define elf_backend_gc_mark_hook                ppc_elf_gc_mark_hook
6203 #define elf_backend_gc_sweep_hook               ppc_elf_gc_sweep_hook
6204 #define elf_backend_section_from_shdr           ppc_elf_section_from_shdr
6205 #define elf_backend_relocate_section            ppc_elf_relocate_section
6206 #define elf_backend_create_dynamic_sections     ppc_elf_create_dynamic_sections
6207 #define elf_backend_check_relocs                ppc_elf_check_relocs
6208 #define elf_backend_copy_indirect_symbol        ppc_elf_copy_indirect_symbol
6209 #define elf_backend_adjust_dynamic_symbol       ppc_elf_adjust_dynamic_symbol
6210 #define elf_backend_add_symbol_hook             ppc_elf_add_symbol_hook
6211 #define elf_backend_size_dynamic_sections       ppc_elf_size_dynamic_sections
6212 #define elf_backend_finish_dynamic_symbol       ppc_elf_finish_dynamic_symbol
6213 #define elf_backend_finish_dynamic_sections     ppc_elf_finish_dynamic_sections
6214 #define elf_backend_fake_sections               ppc_elf_fake_sections
6215 #define elf_backend_additional_program_headers  ppc_elf_additional_program_headers
6216 #define elf_backend_grok_prstatus               ppc_elf_grok_prstatus
6217 #define elf_backend_grok_psinfo                 ppc_elf_grok_psinfo
6218 #define elf_backend_reloc_type_class            ppc_elf_reloc_type_class
6219 #define elf_backend_begin_write_processing      ppc_elf_begin_write_processing
6220 #define elf_backend_final_write_processing      ppc_elf_final_write_processing
6221 #define elf_backend_write_section               ppc_elf_write_section
6222 #define elf_backend_special_sections            ppc_elf_special_sections
6223 #define elf_backend_plt_sym_val                 ppc_elf_plt_sym_val
6224
6225 #include "elf32-target.h"