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