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