1/* PowerPC-specific support for 32-bit ELF
2   Copyright (C) 1994-2017 Free Software Foundation, Inc.
3   Written by Ian Lance Taylor, Cygnus Support.
4
5   This file is part of BFD, the Binary File Descriptor library.
6
7   This program is free software; you can redistribute it and/or modify
8   it under the terms of the GNU General Public License as published by
9   the Free Software Foundation; either version 3 of the License, or
10   (at your option) any later version.
11
12   This program is distributed in the hope that it will be useful,
13   but WITHOUT ANY WARRANTY; without even the implied warranty of
14   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   GNU General Public License for more details.
16
17   You should have received a copy of the GNU General Public License
18   along with this program; if not, write to the
19   Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
20   Boston, MA 02110-1301, USA.  */
21
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 "sysdep.h"
29#include <stdarg.h>
30#include "bfd.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#include "dwarf2.h"
38#include "opcode/ppc.h"
39
40typedef enum split16_format_type
41{
42  split16a_type = 0,
43  split16d_type
44}
45split16_format_type;
46
47/* RELA relocations are used here.  */
48
49static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
50  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51static bfd_reloc_status_type ppc_elf_unhandled_reloc
52  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53
54/* Branch prediction bit for branch taken relocs.  */
55#define BRANCH_PREDICT_BIT 0x200000
56/* Mask to set RA in memory instructions.  */
57#define RA_REGISTER_MASK 0x001f0000
58/* Value to shift register by to insert RA.  */
59#define RA_REGISTER_SHIFT 16
60
61/* The name of the dynamic interpreter.  This is put in the .interp
62   section.  */
63#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
64
65/* For old-style PLT.  */
66/* The number of single-slot PLT entries (the rest use two slots).  */
67#define PLT_NUM_SINGLE_ENTRIES 8192
68
69/* For new-style .glink and .plt.  */
70#define GLINK_PLTRESOLVE 16*4
71#define GLINK_ENTRY_SIZE 4*4
72#define TLS_GET_ADDR_GLINK_SIZE 12*4
73
74/* VxWorks uses its own plt layout, filled in by the static linker.  */
75
76/* The standard VxWorks PLT entry.  */
77#define VXWORKS_PLT_ENTRY_SIZE 32
78static const bfd_vma ppc_elf_vxworks_plt_entry
79    [VXWORKS_PLT_ENTRY_SIZE / 4] =
80  {
81    0x3d800000, /* lis     r12,0                 */
82    0x818c0000, /* lwz     r12,0(r12)            */
83    0x7d8903a6, /* mtctr   r12                   */
84    0x4e800420, /* bctr                          */
85    0x39600000, /* li      r11,0                 */
86    0x48000000, /* b       14 <.PLT0resolve+0x4> */
87    0x60000000, /* nop                           */
88    0x60000000, /* nop                           */
89  };
90static const bfd_vma ppc_elf_vxworks_pic_plt_entry
91    [VXWORKS_PLT_ENTRY_SIZE / 4] =
92  {
93    0x3d9e0000, /* addis r12,r30,0 */
94    0x818c0000, /* lwz	 r12,0(r12) */
95    0x7d8903a6, /* mtctr r12 */
96    0x4e800420, /* bctr */
97    0x39600000, /* li	 r11,0 */
98    0x48000000, /* b	 14 <.PLT0resolve+0x4> 14: R_PPC_REL24 .PLTresolve */
99    0x60000000, /* nop */
100    0x60000000, /* nop */
101  };
102
103/* The initial VxWorks PLT entry.  */
104#define VXWORKS_PLT_INITIAL_ENTRY_SIZE 32
105static const bfd_vma ppc_elf_vxworks_plt0_entry
106    [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
107  {
108    0x3d800000, /* lis     r12,0        */
109    0x398c0000, /* addi    r12,r12,0    */
110    0x800c0008, /* lwz     r0,8(r12)    */
111    0x7c0903a6, /* mtctr   r0           */
112    0x818c0004, /* lwz     r12,4(r12)   */
113    0x4e800420, /* bctr                 */
114    0x60000000, /* nop                  */
115    0x60000000, /* nop                  */
116  };
117static const bfd_vma ppc_elf_vxworks_pic_plt0_entry
118    [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
119  {
120    0x819e0008, /* lwz	 r12,8(r30) */
121    0x7d8903a6, /* mtctr r12        */
122    0x819e0004, /* lwz	 r12,4(r30) */
123    0x4e800420, /* bctr             */
124    0x60000000, /* nop              */
125    0x60000000, /* nop              */
126    0x60000000, /* nop              */
127    0x60000000, /* nop              */
128  };
129
130/* For executables, we have some additional relocations in
131   .rela.plt.unloaded, for the kernel loader.  */
132
133/* The number of non-JMP_SLOT relocations per PLT0 slot. */
134#define VXWORKS_PLT_NON_JMP_SLOT_RELOCS 3
135/* The number of relocations in the PLTResolve slot. */
136#define VXWORKS_PLTRESOLVE_RELOCS 2
137/* The number of relocations in the PLTResolve slot when when creating
138   a shared library. */
139#define VXWORKS_PLTRESOLVE_RELOCS_SHLIB 0
140
141/* Some instructions.  */
142#define ADDIS_11_11	0x3d6b0000
143#define ADDIS_11_30	0x3d7e0000
144#define ADDIS_12_12	0x3d8c0000
145#define ADDI_11_11	0x396b0000
146#define ADD_0_11_11	0x7c0b5a14
147#define ADD_3_12_2	0x7c6c1214
148#define ADD_11_0_11	0x7d605a14
149#define B		0x48000000
150#define BA		0x48000002
151#define BCL_20_31	0x429f0005
152#define BCTR		0x4e800420
153#define BEQLR		0x4d820020
154#define CMPWI_11_0	0x2c0b0000
155#define LIS_11		0x3d600000
156#define LIS_12		0x3d800000
157#define LWZU_0_12	0x840c0000
158#define LWZ_0_12	0x800c0000
159#define LWZ_11_3	0x81630000
160#define LWZ_11_11	0x816b0000
161#define LWZ_11_30	0x817e0000
162#define LWZ_12_3	0x81830000
163#define LWZ_12_12	0x818c0000
164#define MR_0_3		0x7c601b78
165#define MR_3_0		0x7c030378
166#define MFLR_0		0x7c0802a6
167#define MFLR_12		0x7d8802a6
168#define MTCTR_0		0x7c0903a6
169#define MTCTR_11	0x7d6903a6
170#define MTLR_0		0x7c0803a6
171#define NOP		0x60000000
172#define SUB_11_11_12	0x7d6c5850
173
174/* Offset of tp and dtp pointers from start of TLS block.  */
175#define TP_OFFSET	0x7000
176#define DTP_OFFSET	0x8000
177
178/* The value of a defined global symbol.  */
179#define SYM_VAL(SYM) \
180  ((SYM)->root.u.def.section->output_section->vma	\
181   + (SYM)->root.u.def.section->output_offset		\
182   + (SYM)->root.u.def.value)
183
184static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
185
186static reloc_howto_type ppc_elf_howto_raw[] = {
187  /* This reloc does nothing.  */
188  HOWTO (R_PPC_NONE,		/* type */
189	 0,			/* rightshift */
190	 3,			/* size (0 = byte, 1 = short, 2 = long) */
191	 0,			/* bitsize */
192	 FALSE,			/* pc_relative */
193	 0,			/* bitpos */
194	 complain_overflow_dont, /* complain_on_overflow */
195	 bfd_elf_generic_reloc,	/* special_function */
196	 "R_PPC_NONE",		/* name */
197	 FALSE,			/* partial_inplace */
198	 0,			/* src_mask */
199	 0,			/* dst_mask */
200	 FALSE),		/* pcrel_offset */
201
202  /* A standard 32 bit relocation.  */
203  HOWTO (R_PPC_ADDR32,		/* type */
204	 0,			/* rightshift */
205	 2,			/* size (0 = byte, 1 = short, 2 = long) */
206	 32,			/* bitsize */
207	 FALSE,			/* pc_relative */
208	 0,			/* bitpos */
209	 complain_overflow_dont, /* complain_on_overflow */
210	 bfd_elf_generic_reloc,	/* special_function */
211	 "R_PPC_ADDR32",	/* name */
212	 FALSE,			/* partial_inplace */
213	 0,			/* src_mask */
214	 0xffffffff,		/* dst_mask */
215	 FALSE),		/* pcrel_offset */
216
217  /* An absolute 26 bit branch; the lower two bits must be zero.
218     FIXME: we don't check that, we just clear them.  */
219  HOWTO (R_PPC_ADDR24,		/* type */
220	 0,			/* rightshift */
221	 2,			/* size (0 = byte, 1 = short, 2 = long) */
222	 26,			/* bitsize */
223	 FALSE,			/* pc_relative */
224	 0,			/* bitpos */
225	 complain_overflow_signed, /* complain_on_overflow */
226	 bfd_elf_generic_reloc,	/* special_function */
227	 "R_PPC_ADDR24",	/* name */
228	 FALSE,			/* partial_inplace */
229	 0,			/* src_mask */
230	 0x3fffffc,		/* dst_mask */
231	 FALSE),		/* pcrel_offset */
232
233  /* A standard 16 bit relocation.  */
234  HOWTO (R_PPC_ADDR16,		/* type */
235	 0,			/* rightshift */
236	 1,			/* size (0 = byte, 1 = short, 2 = long) */
237	 16,			/* bitsize */
238	 FALSE,			/* pc_relative */
239	 0,			/* bitpos */
240	 complain_overflow_bitfield, /* complain_on_overflow */
241	 bfd_elf_generic_reloc,	/* special_function */
242	 "R_PPC_ADDR16",	/* name */
243	 FALSE,			/* partial_inplace */
244	 0,			/* src_mask */
245	 0xffff,		/* dst_mask */
246	 FALSE),		/* pcrel_offset */
247
248  /* A 16 bit relocation without overflow.  */
249  HOWTO (R_PPC_ADDR16_LO,	/* type */
250	 0,			/* rightshift */
251	 1,			/* size (0 = byte, 1 = short, 2 = long) */
252	 16,			/* bitsize */
253	 FALSE,			/* pc_relative */
254	 0,			/* bitpos */
255	 complain_overflow_dont,/* complain_on_overflow */
256	 bfd_elf_generic_reloc,	/* special_function */
257	 "R_PPC_ADDR16_LO",	/* name */
258	 FALSE,			/* partial_inplace */
259	 0,			/* src_mask */
260	 0xffff,		/* dst_mask */
261	 FALSE),		/* pcrel_offset */
262
263  /* The high order 16 bits of an address.  */
264  HOWTO (R_PPC_ADDR16_HI,	/* type */
265	 16,			/* rightshift */
266	 1,			/* size (0 = byte, 1 = short, 2 = long) */
267	 16,			/* bitsize */
268	 FALSE,			/* pc_relative */
269	 0,			/* bitpos */
270	 complain_overflow_dont, /* complain_on_overflow */
271	 bfd_elf_generic_reloc,	/* special_function */
272	 "R_PPC_ADDR16_HI",	/* name */
273	 FALSE,			/* partial_inplace */
274	 0,			/* src_mask */
275	 0xffff,		/* dst_mask */
276	 FALSE),		/* pcrel_offset */
277
278  /* The high order 16 bits of an address, plus 1 if the contents of
279     the low 16 bits, treated as a signed number, is negative.  */
280  HOWTO (R_PPC_ADDR16_HA,	/* type */
281	 16,			/* rightshift */
282	 1,			/* size (0 = byte, 1 = short, 2 = long) */
283	 16,			/* bitsize */
284	 FALSE,			/* pc_relative */
285	 0,			/* bitpos */
286	 complain_overflow_dont, /* complain_on_overflow */
287	 ppc_elf_addr16_ha_reloc, /* special_function */
288	 "R_PPC_ADDR16_HA",	/* name */
289	 FALSE,			/* partial_inplace */
290	 0,			/* src_mask */
291	 0xffff,		/* dst_mask */
292	 FALSE),		/* pcrel_offset */
293
294  /* An absolute 16 bit branch; the lower two bits must be zero.
295     FIXME: we don't check that, we just clear them.  */
296  HOWTO (R_PPC_ADDR14,		/* type */
297	 0,			/* rightshift */
298	 2,			/* size (0 = byte, 1 = short, 2 = long) */
299	 16,			/* bitsize */
300	 FALSE,			/* pc_relative */
301	 0,			/* bitpos */
302	 complain_overflow_signed, /* complain_on_overflow */
303	 bfd_elf_generic_reloc,	/* special_function */
304	 "R_PPC_ADDR14",	/* name */
305	 FALSE,			/* partial_inplace */
306	 0,			/* src_mask */
307	 0xfffc,		/* dst_mask */
308	 FALSE),		/* pcrel_offset */
309
310  /* An absolute 16 bit branch, for which bit 10 should be set to
311     indicate that the branch is expected to be taken.	The lower two
312     bits must be zero.  */
313  HOWTO (R_PPC_ADDR14_BRTAKEN,	/* type */
314	 0,			/* rightshift */
315	 2,			/* size (0 = byte, 1 = short, 2 = long) */
316	 16,			/* bitsize */
317	 FALSE,			/* pc_relative */
318	 0,			/* bitpos */
319	 complain_overflow_signed, /* complain_on_overflow */
320	 bfd_elf_generic_reloc,	/* special_function */
321	 "R_PPC_ADDR14_BRTAKEN",/* name */
322	 FALSE,			/* partial_inplace */
323	 0,			/* src_mask */
324	 0xfffc,		/* dst_mask */
325	 FALSE),		/* pcrel_offset */
326
327  /* An absolute 16 bit branch, for which bit 10 should be set to
328     indicate that the branch is not expected to be taken.  The lower
329     two bits must be zero.  */
330  HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
331	 0,			/* rightshift */
332	 2,			/* size (0 = byte, 1 = short, 2 = long) */
333	 16,			/* bitsize */
334	 FALSE,			/* pc_relative */
335	 0,			/* bitpos */
336	 complain_overflow_signed, /* complain_on_overflow */
337	 bfd_elf_generic_reloc,	/* special_function */
338	 "R_PPC_ADDR14_BRNTAKEN",/* name */
339	 FALSE,			/* partial_inplace */
340	 0,			/* src_mask */
341	 0xfffc,		/* dst_mask */
342	 FALSE),		/* pcrel_offset */
343
344  /* A relative 26 bit branch; the lower two bits must be zero.  */
345  HOWTO (R_PPC_REL24,		/* type */
346	 0,			/* rightshift */
347	 2,			/* size (0 = byte, 1 = short, 2 = long) */
348	 26,			/* bitsize */
349	 TRUE,			/* pc_relative */
350	 0,			/* bitpos */
351	 complain_overflow_signed, /* complain_on_overflow */
352	 bfd_elf_generic_reloc,	/* special_function */
353	 "R_PPC_REL24",		/* name */
354	 FALSE,			/* partial_inplace */
355	 0,			/* src_mask */
356	 0x3fffffc,		/* dst_mask */
357	 TRUE),			/* pcrel_offset */
358
359  /* A relative 16 bit branch; the lower two bits must be zero.  */
360  HOWTO (R_PPC_REL14,		/* type */
361	 0,			/* rightshift */
362	 2,			/* size (0 = byte, 1 = short, 2 = long) */
363	 16,			/* bitsize */
364	 TRUE,			/* pc_relative */
365	 0,			/* bitpos */
366	 complain_overflow_signed, /* complain_on_overflow */
367	 bfd_elf_generic_reloc,	/* special_function */
368	 "R_PPC_REL14",		/* name */
369	 FALSE,			/* partial_inplace */
370	 0,			/* src_mask */
371	 0xfffc,		/* dst_mask */
372	 TRUE),			/* pcrel_offset */
373
374  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
375     the branch is expected to be taken.  The lower two bits must be
376     zero.  */
377  HOWTO (R_PPC_REL14_BRTAKEN,	/* type */
378	 0,			/* rightshift */
379	 2,			/* size (0 = byte, 1 = short, 2 = long) */
380	 16,			/* bitsize */
381	 TRUE,			/* pc_relative */
382	 0,			/* bitpos */
383	 complain_overflow_signed, /* complain_on_overflow */
384	 bfd_elf_generic_reloc,	/* special_function */
385	 "R_PPC_REL14_BRTAKEN",	/* name */
386	 FALSE,			/* partial_inplace */
387	 0,			/* src_mask */
388	 0xfffc,		/* dst_mask */
389	 TRUE),			/* pcrel_offset */
390
391  /* A relative 16 bit branch.  Bit 10 should be set to indicate that
392     the branch is not expected to be taken.  The lower two bits must
393     be zero.  */
394  HOWTO (R_PPC_REL14_BRNTAKEN,	/* type */
395	 0,			/* rightshift */
396	 2,			/* size (0 = byte, 1 = short, 2 = long) */
397	 16,			/* bitsize */
398	 TRUE,			/* pc_relative */
399	 0,			/* bitpos */
400	 complain_overflow_signed, /* complain_on_overflow */
401	 bfd_elf_generic_reloc,	/* special_function */
402	 "R_PPC_REL14_BRNTAKEN",/* name */
403	 FALSE,			/* partial_inplace */
404	 0,			/* src_mask */
405	 0xfffc,		/* dst_mask */
406	 TRUE),			/* pcrel_offset */
407
408  /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
409     symbol.  */
410  HOWTO (R_PPC_GOT16,		/* type */
411	 0,			/* rightshift */
412	 1,			/* size (0 = byte, 1 = short, 2 = long) */
413	 16,			/* bitsize */
414	 FALSE,			/* pc_relative */
415	 0,			/* bitpos */
416	 complain_overflow_signed, /* complain_on_overflow */
417	 ppc_elf_unhandled_reloc, /* special_function */
418	 "R_PPC_GOT16",		/* name */
419	 FALSE,			/* partial_inplace */
420	 0,			/* src_mask */
421	 0xffff,		/* dst_mask */
422	 FALSE),		/* pcrel_offset */
423
424  /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
425     the symbol.  */
426  HOWTO (R_PPC_GOT16_LO,	/* type */
427	 0,			/* rightshift */
428	 1,			/* size (0 = byte, 1 = short, 2 = long) */
429	 16,			/* bitsize */
430	 FALSE,			/* pc_relative */
431	 0,			/* bitpos */
432	 complain_overflow_dont, /* complain_on_overflow */
433	 ppc_elf_unhandled_reloc, /* special_function */
434	 "R_PPC_GOT16_LO",	/* name */
435	 FALSE,			/* partial_inplace */
436	 0,			/* src_mask */
437	 0xffff,		/* dst_mask */
438	 FALSE),		/* pcrel_offset */
439
440  /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
441     the symbol.  */
442  HOWTO (R_PPC_GOT16_HI,	/* type */
443	 16,			/* rightshift */
444	 1,			/* size (0 = byte, 1 = short, 2 = long) */
445	 16,			/* bitsize */
446	 FALSE,			/* pc_relative */
447	 0,			/* bitpos */
448	 complain_overflow_dont, /* complain_on_overflow */
449	 ppc_elf_unhandled_reloc, /* special_function */
450	 "R_PPC_GOT16_HI",	/* name */
451	 FALSE,			/* partial_inplace */
452	 0,			/* src_mask */
453	 0xffff,		/* dst_mask */
454	 FALSE),		 /* pcrel_offset */
455
456  /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
457     the symbol.  */
458  HOWTO (R_PPC_GOT16_HA,	/* type */
459	 16,			/* rightshift */
460	 1,			/* size (0 = byte, 1 = short, 2 = long) */
461	 16,			/* bitsize */
462	 FALSE,			/* pc_relative */
463	 0,			/* bitpos */
464	 complain_overflow_dont, /* complain_on_overflow */
465	 ppc_elf_unhandled_reloc, /* special_function */
466	 "R_PPC_GOT16_HA",	/* name */
467	 FALSE,			/* partial_inplace */
468	 0,			/* src_mask */
469	 0xffff,		/* dst_mask */
470	 FALSE),		/* pcrel_offset */
471
472  /* Like R_PPC_REL24, but referring to the procedure linkage table
473     entry for the symbol.  */
474  HOWTO (R_PPC_PLTREL24,	/* type */
475	 0,			/* rightshift */
476	 2,			/* size (0 = byte, 1 = short, 2 = long) */
477	 26,			/* bitsize */
478	 TRUE,			/* pc_relative */
479	 0,			/* bitpos */
480	 complain_overflow_signed, /* complain_on_overflow */
481	 ppc_elf_unhandled_reloc, /* special_function */
482	 "R_PPC_PLTREL24",	/* name */
483	 FALSE,			/* partial_inplace */
484	 0,			/* src_mask */
485	 0x3fffffc,		/* dst_mask */
486	 TRUE),			/* pcrel_offset */
487
488  /* This is used only by the dynamic linker.  The symbol should exist
489     both in the object being run and in some shared library.  The
490     dynamic linker copies the data addressed by the symbol from the
491     shared library into the object, because the object being
492     run has to have the data at some particular address.  */
493  HOWTO (R_PPC_COPY,		/* type */
494	 0,			/* rightshift */
495	 2,			/* size (0 = byte, 1 = short, 2 = long) */
496	 32,			/* bitsize */
497	 FALSE,			/* pc_relative */
498	 0,			/* bitpos */
499	 complain_overflow_dont, /* complain_on_overflow */
500	 ppc_elf_unhandled_reloc, /* special_function */
501	 "R_PPC_COPY",		/* name */
502	 FALSE,			/* partial_inplace */
503	 0,			/* src_mask */
504	 0,			/* dst_mask */
505	 FALSE),		/* pcrel_offset */
506
507  /* Like R_PPC_ADDR32, but used when setting global offset table
508     entries.  */
509  HOWTO (R_PPC_GLOB_DAT,	/* type */
510	 0,			/* rightshift */
511	 2,			/* size (0 = byte, 1 = short, 2 = long) */
512	 32,			/* bitsize */
513	 FALSE,			/* pc_relative */
514	 0,			/* bitpos */
515	 complain_overflow_dont, /* complain_on_overflow */
516	 ppc_elf_unhandled_reloc, /* special_function */
517	 "R_PPC_GLOB_DAT",	/* name */
518	 FALSE,			/* partial_inplace */
519	 0,			/* src_mask */
520	 0xffffffff,		/* dst_mask */
521	 FALSE),		/* pcrel_offset */
522
523  /* Marks a procedure linkage table entry for a symbol.  */
524  HOWTO (R_PPC_JMP_SLOT,	/* type */
525	 0,			/* rightshift */
526	 2,			/* size (0 = byte, 1 = short, 2 = long) */
527	 32,			/* bitsize */
528	 FALSE,			/* pc_relative */
529	 0,			/* bitpos */
530	 complain_overflow_dont, /* complain_on_overflow */
531	 ppc_elf_unhandled_reloc, /* special_function */
532	 "R_PPC_JMP_SLOT",	/* name */
533	 FALSE,			/* partial_inplace */
534	 0,			/* src_mask */
535	 0,			/* dst_mask */
536	 FALSE),		/* pcrel_offset */
537
538  /* Used only by the dynamic linker.  When the object is run, this
539     longword is set to the load address of the object, plus the
540     addend.  */
541  HOWTO (R_PPC_RELATIVE,	/* type */
542	 0,			/* rightshift */
543	 2,			/* size (0 = byte, 1 = short, 2 = long) */
544	 32,			/* bitsize */
545	 FALSE,			/* pc_relative */
546	 0,			/* bitpos */
547	 complain_overflow_dont, /* complain_on_overflow */
548	 bfd_elf_generic_reloc,	 /* special_function */
549	 "R_PPC_RELATIVE",	/* name */
550	 FALSE,			/* partial_inplace */
551	 0,			/* src_mask */
552	 0xffffffff,		/* dst_mask */
553	 FALSE),		/* pcrel_offset */
554
555  /* Like R_PPC_REL24, but uses the value of the symbol within the
556     object rather than the final value.  Normally used for
557     _GLOBAL_OFFSET_TABLE_.  */
558  HOWTO (R_PPC_LOCAL24PC,	/* type */
559	 0,			/* rightshift */
560	 2,			/* size (0 = byte, 1 = short, 2 = long) */
561	 26,			/* bitsize */
562	 TRUE,			/* pc_relative */
563	 0,			/* bitpos */
564	 complain_overflow_signed, /* complain_on_overflow */
565	 bfd_elf_generic_reloc,	/* special_function */
566	 "R_PPC_LOCAL24PC",	/* name */
567	 FALSE,			/* partial_inplace */
568	 0,			/* src_mask */
569	 0x3fffffc,		/* dst_mask */
570	 TRUE),			/* pcrel_offset */
571
572  /* Like R_PPC_ADDR32, but may be unaligned.  */
573  HOWTO (R_PPC_UADDR32,		/* type */
574	 0,			/* rightshift */
575	 2,			/* size (0 = byte, 1 = short, 2 = long) */
576	 32,			/* bitsize */
577	 FALSE,			/* pc_relative */
578	 0,			/* bitpos */
579	 complain_overflow_dont, /* complain_on_overflow */
580	 bfd_elf_generic_reloc,	/* special_function */
581	 "R_PPC_UADDR32",	/* name */
582	 FALSE,			/* partial_inplace */
583	 0,			/* src_mask */
584	 0xffffffff,		/* dst_mask */
585	 FALSE),		/* pcrel_offset */
586
587  /* Like R_PPC_ADDR16, but may be unaligned.  */
588  HOWTO (R_PPC_UADDR16,		/* type */
589	 0,			/* rightshift */
590	 1,			/* size (0 = byte, 1 = short, 2 = long) */
591	 16,			/* bitsize */
592	 FALSE,			/* pc_relative */
593	 0,			/* bitpos */
594	 complain_overflow_bitfield, /* complain_on_overflow */
595	 bfd_elf_generic_reloc,	/* special_function */
596	 "R_PPC_UADDR16",	/* name */
597	 FALSE,			/* partial_inplace */
598	 0,			/* src_mask */
599	 0xffff,		/* dst_mask */
600	 FALSE),		/* pcrel_offset */
601
602  /* 32-bit PC relative */
603  HOWTO (R_PPC_REL32,		/* type */
604	 0,			/* rightshift */
605	 2,			/* size (0 = byte, 1 = short, 2 = long) */
606	 32,			/* bitsize */
607	 TRUE,			/* pc_relative */
608	 0,			/* bitpos */
609	 complain_overflow_dont, /* complain_on_overflow */
610	 bfd_elf_generic_reloc,	/* special_function */
611	 "R_PPC_REL32",		/* name */
612	 FALSE,			/* partial_inplace */
613	 0,			/* src_mask */
614	 0xffffffff,		/* dst_mask */
615	 TRUE),			/* pcrel_offset */
616
617  /* 32-bit relocation to the symbol's procedure linkage table.
618     FIXME: not supported.  */
619  HOWTO (R_PPC_PLT32,		/* type */
620	 0,			/* rightshift */
621	 2,			/* size (0 = byte, 1 = short, 2 = long) */
622	 32,			/* bitsize */
623	 FALSE,			/* pc_relative */
624	 0,			/* bitpos */
625	 complain_overflow_dont, /* complain_on_overflow */
626	 ppc_elf_unhandled_reloc, /* special_function */
627	 "R_PPC_PLT32",		/* name */
628	 FALSE,			/* partial_inplace */
629	 0,			/* src_mask */
630	 0,			/* dst_mask */
631	 FALSE),		/* pcrel_offset */
632
633  /* 32-bit PC relative relocation to the symbol's procedure linkage table.
634     FIXME: not supported.  */
635  HOWTO (R_PPC_PLTREL32,	/* type */
636	 0,			/* rightshift */
637	 2,			/* size (0 = byte, 1 = short, 2 = long) */
638	 32,			/* bitsize */
639	 TRUE,			/* pc_relative */
640	 0,			/* bitpos */
641	 complain_overflow_dont, /* complain_on_overflow */
642	 ppc_elf_unhandled_reloc, /* special_function */
643	 "R_PPC_PLTREL32",	/* name */
644	 FALSE,			/* partial_inplace */
645	 0,			/* src_mask */
646	 0,			/* dst_mask */
647	 TRUE),			/* pcrel_offset */
648
649  /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
650     the symbol.  */
651  HOWTO (R_PPC_PLT16_LO,	/* type */
652	 0,			/* rightshift */
653	 1,			/* size (0 = byte, 1 = short, 2 = long) */
654	 16,			/* bitsize */
655	 FALSE,			/* pc_relative */
656	 0,			/* bitpos */
657	 complain_overflow_dont, /* complain_on_overflow */
658	 ppc_elf_unhandled_reloc, /* special_function */
659	 "R_PPC_PLT16_LO",	/* name */
660	 FALSE,			/* partial_inplace */
661	 0,			/* src_mask */
662	 0xffff,		/* dst_mask */
663	 FALSE),		/* pcrel_offset */
664
665  /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
666     the symbol.  */
667  HOWTO (R_PPC_PLT16_HI,	/* type */
668	 16,			/* rightshift */
669	 1,			/* size (0 = byte, 1 = short, 2 = long) */
670	 16,			/* bitsize */
671	 FALSE,			/* pc_relative */
672	 0,			/* bitpos */
673	 complain_overflow_dont, /* complain_on_overflow */
674	 ppc_elf_unhandled_reloc, /* special_function */
675	 "R_PPC_PLT16_HI",	/* name */
676	 FALSE,			/* partial_inplace */
677	 0,			/* src_mask */
678	 0xffff,		/* dst_mask */
679	 FALSE),		 /* pcrel_offset */
680
681  /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
682     the symbol.  */
683  HOWTO (R_PPC_PLT16_HA,	/* type */
684	 16,			/* rightshift */
685	 1,			/* size (0 = byte, 1 = short, 2 = long) */
686	 16,			/* bitsize */
687	 FALSE,			/* pc_relative */
688	 0,			/* bitpos */
689	 complain_overflow_dont, /* complain_on_overflow */
690	 ppc_elf_unhandled_reloc, /* special_function */
691	 "R_PPC_PLT16_HA",	/* name */
692	 FALSE,			/* partial_inplace */
693	 0,			/* src_mask */
694	 0xffff,		/* dst_mask */
695	 FALSE),		/* pcrel_offset */
696
697  /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
698     small data items.  */
699  HOWTO (R_PPC_SDAREL16,	/* type */
700	 0,			/* rightshift */
701	 1,			/* size (0 = byte, 1 = short, 2 = long) */
702	 16,			/* bitsize */
703	 FALSE,			/* pc_relative */
704	 0,			/* bitpos */
705	 complain_overflow_signed, /* complain_on_overflow */
706	 ppc_elf_unhandled_reloc, /* special_function */
707	 "R_PPC_SDAREL16",	/* name */
708	 FALSE,			/* partial_inplace */
709	 0,			/* src_mask */
710	 0xffff,		/* dst_mask */
711	 FALSE),		/* pcrel_offset */
712
713  /* 16-bit section relative relocation.  */
714  HOWTO (R_PPC_SECTOFF,		/* type */
715	 0,			/* rightshift */
716	 1,			/* size (0 = byte, 1 = short, 2 = long) */
717	 16,			/* bitsize */
718	 FALSE,			/* pc_relative */
719	 0,			/* bitpos */
720	 complain_overflow_signed, /* complain_on_overflow */
721	 ppc_elf_unhandled_reloc, /* special_function */
722	 "R_PPC_SECTOFF",	/* name */
723	 FALSE,			/* partial_inplace */
724	 0,			/* src_mask */
725	 0xffff,		/* dst_mask */
726	 FALSE),		/* pcrel_offset */
727
728  /* 16-bit lower half section relative relocation.  */
729  HOWTO (R_PPC_SECTOFF_LO,	  /* type */
730	 0,			/* rightshift */
731	 1,			/* size (0 = byte, 1 = short, 2 = long) */
732	 16,			/* bitsize */
733	 FALSE,			/* pc_relative */
734	 0,			/* bitpos */
735	 complain_overflow_dont, /* complain_on_overflow */
736	 ppc_elf_unhandled_reloc, /* special_function */
737	 "R_PPC_SECTOFF_LO",	/* name */
738	 FALSE,			/* partial_inplace */
739	 0,			/* src_mask */
740	 0xffff,		/* dst_mask */
741	 FALSE),		/* pcrel_offset */
742
743  /* 16-bit upper half section relative relocation.  */
744  HOWTO (R_PPC_SECTOFF_HI,	/* type */
745	 16,			/* rightshift */
746	 1,			/* size (0 = byte, 1 = short, 2 = long) */
747	 16,			/* bitsize */
748	 FALSE,			/* pc_relative */
749	 0,			/* bitpos */
750	 complain_overflow_dont, /* complain_on_overflow */
751	 ppc_elf_unhandled_reloc, /* special_function */
752	 "R_PPC_SECTOFF_HI",	/* name */
753	 FALSE,			/* partial_inplace */
754	 0,			/* src_mask */
755	 0xffff,		/* dst_mask */
756	 FALSE),		 /* pcrel_offset */
757
758  /* 16-bit upper half adjusted section relative relocation.  */
759  HOWTO (R_PPC_SECTOFF_HA,	/* type */
760	 16,			/* rightshift */
761	 1,			/* size (0 = byte, 1 = short, 2 = long) */
762	 16,			/* bitsize */
763	 FALSE,			/* pc_relative */
764	 0,			/* bitpos */
765	 complain_overflow_dont, /* complain_on_overflow */
766	 ppc_elf_unhandled_reloc, /* special_function */
767	 "R_PPC_SECTOFF_HA",	/* name */
768	 FALSE,			/* partial_inplace */
769	 0,			/* src_mask */
770	 0xffff,		/* dst_mask */
771	 FALSE),		/* pcrel_offset */
772
773  /* Marker relocs for TLS.  */
774  HOWTO (R_PPC_TLS,
775	 0,			/* rightshift */
776	 2,			/* size (0 = byte, 1 = short, 2 = long) */
777	 32,			/* bitsize */
778	 FALSE,			/* pc_relative */
779	 0,			/* bitpos */
780	 complain_overflow_dont, /* complain_on_overflow */
781	 bfd_elf_generic_reloc,	/* special_function */
782	 "R_PPC_TLS",		/* name */
783	 FALSE,			/* partial_inplace */
784	 0,			/* src_mask */
785	 0,			/* dst_mask */
786	 FALSE),		/* pcrel_offset */
787
788  HOWTO (R_PPC_TLSGD,
789	 0,			/* rightshift */
790	 2,			/* size (0 = byte, 1 = short, 2 = long) */
791	 32,			/* bitsize */
792	 FALSE,			/* pc_relative */
793	 0,			/* bitpos */
794	 complain_overflow_dont, /* complain_on_overflow */
795	 bfd_elf_generic_reloc, /* special_function */
796	 "R_PPC_TLSGD",		/* name */
797	 FALSE,			/* partial_inplace */
798	 0,			/* src_mask */
799	 0,			/* dst_mask */
800	 FALSE),		/* pcrel_offset */
801
802  HOWTO (R_PPC_TLSLD,
803	 0,			/* rightshift */
804	 2,			/* size (0 = byte, 1 = short, 2 = long) */
805	 32,			/* bitsize */
806	 FALSE,			/* pc_relative */
807	 0,			/* bitpos */
808	 complain_overflow_dont, /* complain_on_overflow */
809	 bfd_elf_generic_reloc, /* special_function */
810	 "R_PPC_TLSLD",		/* name */
811	 FALSE,			/* partial_inplace */
812	 0,			/* src_mask */
813	 0,			/* dst_mask */
814	 FALSE),		/* pcrel_offset */
815
816  /* Computes the load module index of the load module that contains the
817     definition of its TLS sym.  */
818  HOWTO (R_PPC_DTPMOD32,
819	 0,			/* rightshift */
820	 2,			/* size (0 = byte, 1 = short, 2 = long) */
821	 32,			/* bitsize */
822	 FALSE,			/* pc_relative */
823	 0,			/* bitpos */
824	 complain_overflow_dont, /* complain_on_overflow */
825	 ppc_elf_unhandled_reloc, /* special_function */
826	 "R_PPC_DTPMOD32",	/* name */
827	 FALSE,			/* partial_inplace */
828	 0,			/* src_mask */
829	 0xffffffff,		/* dst_mask */
830	 FALSE),		/* pcrel_offset */
831
832  /* Computes a dtv-relative displacement, the difference between the value
833     of sym+add and the base address of the thread-local storage block that
834     contains the definition of sym, minus 0x8000.  */
835  HOWTO (R_PPC_DTPREL32,
836	 0,			/* rightshift */
837	 2,			/* size (0 = byte, 1 = short, 2 = long) */
838	 32,			/* bitsize */
839	 FALSE,			/* pc_relative */
840	 0,			/* bitpos */
841	 complain_overflow_dont, /* complain_on_overflow */
842	 ppc_elf_unhandled_reloc, /* special_function */
843	 "R_PPC_DTPREL32",	/* name */
844	 FALSE,			/* partial_inplace */
845	 0,			/* src_mask */
846	 0xffffffff,		/* dst_mask */
847	 FALSE),		/* pcrel_offset */
848
849  /* A 16 bit dtprel reloc.  */
850  HOWTO (R_PPC_DTPREL16,
851	 0,			/* rightshift */
852	 1,			/* size (0 = byte, 1 = short, 2 = long) */
853	 16,			/* bitsize */
854	 FALSE,			/* pc_relative */
855	 0,			/* bitpos */
856	 complain_overflow_signed, /* complain_on_overflow */
857	 ppc_elf_unhandled_reloc, /* special_function */
858	 "R_PPC_DTPREL16",	/* name */
859	 FALSE,			/* partial_inplace */
860	 0,			/* src_mask */
861	 0xffff,		/* dst_mask */
862	 FALSE),		/* pcrel_offset */
863
864  /* Like DTPREL16, but no overflow.  */
865  HOWTO (R_PPC_DTPREL16_LO,
866	 0,			/* rightshift */
867	 1,			/* size (0 = byte, 1 = short, 2 = long) */
868	 16,			/* bitsize */
869	 FALSE,			/* pc_relative */
870	 0,			/* bitpos */
871	 complain_overflow_dont, /* complain_on_overflow */
872	 ppc_elf_unhandled_reloc, /* special_function */
873	 "R_PPC_DTPREL16_LO",	/* name */
874	 FALSE,			/* partial_inplace */
875	 0,			/* src_mask */
876	 0xffff,		/* dst_mask */
877	 FALSE),		/* pcrel_offset */
878
879  /* Like DTPREL16_LO, but next higher group of 16 bits.  */
880  HOWTO (R_PPC_DTPREL16_HI,
881	 16,			/* rightshift */
882	 1,			/* size (0 = byte, 1 = short, 2 = long) */
883	 16,			/* bitsize */
884	 FALSE,			/* pc_relative */
885	 0,			/* bitpos */
886	 complain_overflow_dont, /* complain_on_overflow */
887	 ppc_elf_unhandled_reloc, /* special_function */
888	 "R_PPC_DTPREL16_HI",	/* name */
889	 FALSE,			/* partial_inplace */
890	 0,			/* src_mask */
891	 0xffff,		/* dst_mask */
892	 FALSE),		/* pcrel_offset */
893
894  /* Like DTPREL16_HI, but adjust for low 16 bits.  */
895  HOWTO (R_PPC_DTPREL16_HA,
896	 16,			/* rightshift */
897	 1,			/* size (0 = byte, 1 = short, 2 = long) */
898	 16,			/* bitsize */
899	 FALSE,			/* pc_relative */
900	 0,			/* bitpos */
901	 complain_overflow_dont, /* complain_on_overflow */
902	 ppc_elf_unhandled_reloc, /* special_function */
903	 "R_PPC_DTPREL16_HA",	/* name */
904	 FALSE,			/* partial_inplace */
905	 0,			/* src_mask */
906	 0xffff,		/* dst_mask */
907	 FALSE),		/* pcrel_offset */
908
909  /* Computes a tp-relative displacement, the difference between the value of
910     sym+add and the value of the thread pointer (r13).  */
911  HOWTO (R_PPC_TPREL32,
912	 0,			/* rightshift */
913	 2,			/* size (0 = byte, 1 = short, 2 = long) */
914	 32,			/* bitsize */
915	 FALSE,			/* pc_relative */
916	 0,			/* bitpos */
917	 complain_overflow_dont, /* complain_on_overflow */
918	 ppc_elf_unhandled_reloc, /* special_function */
919	 "R_PPC_TPREL32",	/* name */
920	 FALSE,			/* partial_inplace */
921	 0,			/* src_mask */
922	 0xffffffff,		/* dst_mask */
923	 FALSE),		/* pcrel_offset */
924
925  /* A 16 bit tprel reloc.  */
926  HOWTO (R_PPC_TPREL16,
927	 0,			/* rightshift */
928	 1,			/* size (0 = byte, 1 = short, 2 = long) */
929	 16,			/* bitsize */
930	 FALSE,			/* pc_relative */
931	 0,			/* bitpos */
932	 complain_overflow_signed, /* complain_on_overflow */
933	 ppc_elf_unhandled_reloc, /* special_function */
934	 "R_PPC_TPREL16",	/* name */
935	 FALSE,			/* partial_inplace */
936	 0,			/* src_mask */
937	 0xffff,		/* dst_mask */
938	 FALSE),		/* pcrel_offset */
939
940  /* Like TPREL16, but no overflow.  */
941  HOWTO (R_PPC_TPREL16_LO,
942	 0,			/* rightshift */
943	 1,			/* size (0 = byte, 1 = short, 2 = long) */
944	 16,			/* bitsize */
945	 FALSE,			/* pc_relative */
946	 0,			/* bitpos */
947	 complain_overflow_dont, /* complain_on_overflow */
948	 ppc_elf_unhandled_reloc, /* special_function */
949	 "R_PPC_TPREL16_LO",	/* name */
950	 FALSE,			/* partial_inplace */
951	 0,			/* src_mask */
952	 0xffff,		/* dst_mask */
953	 FALSE),		/* pcrel_offset */
954
955  /* Like TPREL16_LO, but next higher group of 16 bits.  */
956  HOWTO (R_PPC_TPREL16_HI,
957	 16,			/* rightshift */
958	 1,			/* size (0 = byte, 1 = short, 2 = long) */
959	 16,			/* bitsize */
960	 FALSE,			/* pc_relative */
961	 0,			/* bitpos */
962	 complain_overflow_dont, /* complain_on_overflow */
963	 ppc_elf_unhandled_reloc, /* special_function */
964	 "R_PPC_TPREL16_HI",	/* name */
965	 FALSE,			/* partial_inplace */
966	 0,			/* src_mask */
967	 0xffff,		/* dst_mask */
968	 FALSE),		/* pcrel_offset */
969
970  /* Like TPREL16_HI, but adjust for low 16 bits.  */
971  HOWTO (R_PPC_TPREL16_HA,
972	 16,			/* rightshift */
973	 1,			/* size (0 = byte, 1 = short, 2 = long) */
974	 16,			/* bitsize */
975	 FALSE,			/* pc_relative */
976	 0,			/* bitpos */
977	 complain_overflow_dont, /* complain_on_overflow */
978	 ppc_elf_unhandled_reloc, /* special_function */
979	 "R_PPC_TPREL16_HA",	/* name */
980	 FALSE,			/* partial_inplace */
981	 0,			/* src_mask */
982	 0xffff,		/* dst_mask */
983	 FALSE),		/* pcrel_offset */
984
985  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
986     with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
987     to the first entry.  */
988  HOWTO (R_PPC_GOT_TLSGD16,
989	 0,			/* rightshift */
990	 1,			/* size (0 = byte, 1 = short, 2 = long) */
991	 16,			/* bitsize */
992	 FALSE,			/* pc_relative */
993	 0,			/* bitpos */
994	 complain_overflow_signed, /* complain_on_overflow */
995	 ppc_elf_unhandled_reloc, /* special_function */
996	 "R_PPC_GOT_TLSGD16",	/* name */
997	 FALSE,			/* partial_inplace */
998	 0,			/* src_mask */
999	 0xffff,		/* dst_mask */
1000	 FALSE),		/* pcrel_offset */
1001
1002  /* Like GOT_TLSGD16, but no overflow.  */
1003  HOWTO (R_PPC_GOT_TLSGD16_LO,
1004	 0,			/* rightshift */
1005	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1006	 16,			/* bitsize */
1007	 FALSE,			/* pc_relative */
1008	 0,			/* bitpos */
1009	 complain_overflow_dont, /* complain_on_overflow */
1010	 ppc_elf_unhandled_reloc, /* special_function */
1011	 "R_PPC_GOT_TLSGD16_LO", /* name */
1012	 FALSE,			/* partial_inplace */
1013	 0,			/* src_mask */
1014	 0xffff,		/* dst_mask */
1015	 FALSE),		/* pcrel_offset */
1016
1017  /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1018  HOWTO (R_PPC_GOT_TLSGD16_HI,
1019	 16,			/* rightshift */
1020	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1021	 16,			/* bitsize */
1022	 FALSE,			/* pc_relative */
1023	 0,			/* bitpos */
1024	 complain_overflow_dont, /* complain_on_overflow */
1025	 ppc_elf_unhandled_reloc, /* special_function */
1026	 "R_PPC_GOT_TLSGD16_HI", /* name */
1027	 FALSE,			/* partial_inplace */
1028	 0,			/* src_mask */
1029	 0xffff,		/* dst_mask */
1030	 FALSE),		/* pcrel_offset */
1031
1032  /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1033  HOWTO (R_PPC_GOT_TLSGD16_HA,
1034	 16,			/* rightshift */
1035	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1036	 16,			/* bitsize */
1037	 FALSE,			/* pc_relative */
1038	 0,			/* bitpos */
1039	 complain_overflow_dont, /* complain_on_overflow */
1040	 ppc_elf_unhandled_reloc, /* special_function */
1041	 "R_PPC_GOT_TLSGD16_HA", /* name */
1042	 FALSE,			/* partial_inplace */
1043	 0,			/* src_mask */
1044	 0xffff,		/* dst_mask */
1045	 FALSE),		/* pcrel_offset */
1046
1047  /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1048     with values (sym+add)@dtpmod and zero, and computes the offset to the
1049     first entry.  */
1050  HOWTO (R_PPC_GOT_TLSLD16,
1051	 0,			/* rightshift */
1052	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1053	 16,			/* bitsize */
1054	 FALSE,			/* pc_relative */
1055	 0,			/* bitpos */
1056	 complain_overflow_signed, /* complain_on_overflow */
1057	 ppc_elf_unhandled_reloc, /* special_function */
1058	 "R_PPC_GOT_TLSLD16",	/* name */
1059	 FALSE,			/* partial_inplace */
1060	 0,			/* src_mask */
1061	 0xffff,		/* dst_mask */
1062	 FALSE),		/* pcrel_offset */
1063
1064  /* Like GOT_TLSLD16, but no overflow.  */
1065  HOWTO (R_PPC_GOT_TLSLD16_LO,
1066	 0,			/* rightshift */
1067	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1068	 16,			/* bitsize */
1069	 FALSE,			/* pc_relative */
1070	 0,			/* bitpos */
1071	 complain_overflow_dont, /* complain_on_overflow */
1072	 ppc_elf_unhandled_reloc, /* special_function */
1073	 "R_PPC_GOT_TLSLD16_LO", /* name */
1074	 FALSE,			/* partial_inplace */
1075	 0,			/* src_mask */
1076	 0xffff,		/* dst_mask */
1077	 FALSE),		/* pcrel_offset */
1078
1079  /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1080  HOWTO (R_PPC_GOT_TLSLD16_HI,
1081	 16,			/* rightshift */
1082	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1083	 16,			/* bitsize */
1084	 FALSE,			/* pc_relative */
1085	 0,			/* bitpos */
1086	 complain_overflow_dont, /* complain_on_overflow */
1087	 ppc_elf_unhandled_reloc, /* special_function */
1088	 "R_PPC_GOT_TLSLD16_HI", /* name */
1089	 FALSE,			/* partial_inplace */
1090	 0,			/* src_mask */
1091	 0xffff,		/* dst_mask */
1092	 FALSE),		/* pcrel_offset */
1093
1094  /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1095  HOWTO (R_PPC_GOT_TLSLD16_HA,
1096	 16,			/* rightshift */
1097	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1098	 16,			/* bitsize */
1099	 FALSE,			/* pc_relative */
1100	 0,			/* bitpos */
1101	 complain_overflow_dont, /* complain_on_overflow */
1102	 ppc_elf_unhandled_reloc, /* special_function */
1103	 "R_PPC_GOT_TLSLD16_HA", /* name */
1104	 FALSE,			/* partial_inplace */
1105	 0,			/* src_mask */
1106	 0xffff,		/* dst_mask */
1107	 FALSE),		/* pcrel_offset */
1108
1109  /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1110     the offset to the entry.  */
1111  HOWTO (R_PPC_GOT_DTPREL16,
1112	 0,			/* rightshift */
1113	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1114	 16,			/* bitsize */
1115	 FALSE,			/* pc_relative */
1116	 0,			/* bitpos */
1117	 complain_overflow_signed, /* complain_on_overflow */
1118	 ppc_elf_unhandled_reloc, /* special_function */
1119	 "R_PPC_GOT_DTPREL16",	/* name */
1120	 FALSE,			/* partial_inplace */
1121	 0,			/* src_mask */
1122	 0xffff,		/* dst_mask */
1123	 FALSE),		/* pcrel_offset */
1124
1125  /* Like GOT_DTPREL16, but no overflow.  */
1126  HOWTO (R_PPC_GOT_DTPREL16_LO,
1127	 0,			/* rightshift */
1128	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1129	 16,			/* bitsize */
1130	 FALSE,			/* pc_relative */
1131	 0,			/* bitpos */
1132	 complain_overflow_dont, /* complain_on_overflow */
1133	 ppc_elf_unhandled_reloc, /* special_function */
1134	 "R_PPC_GOT_DTPREL16_LO", /* name */
1135	 FALSE,			/* partial_inplace */
1136	 0,			/* src_mask */
1137	 0xffff,		/* dst_mask */
1138	 FALSE),		/* pcrel_offset */
1139
1140  /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
1141  HOWTO (R_PPC_GOT_DTPREL16_HI,
1142	 16,			/* rightshift */
1143	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1144	 16,			/* bitsize */
1145	 FALSE,			/* pc_relative */
1146	 0,			/* bitpos */
1147	 complain_overflow_dont, /* complain_on_overflow */
1148	 ppc_elf_unhandled_reloc, /* special_function */
1149	 "R_PPC_GOT_DTPREL16_HI", /* name */
1150	 FALSE,			/* partial_inplace */
1151	 0,			/* src_mask */
1152	 0xffff,		/* dst_mask */
1153	 FALSE),		/* pcrel_offset */
1154
1155  /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1156  HOWTO (R_PPC_GOT_DTPREL16_HA,
1157	 16,			/* rightshift */
1158	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1159	 16,			/* bitsize */
1160	 FALSE,			/* pc_relative */
1161	 0,			/* bitpos */
1162	 complain_overflow_dont, /* complain_on_overflow */
1163	 ppc_elf_unhandled_reloc, /* special_function */
1164	 "R_PPC_GOT_DTPREL16_HA", /* name */
1165	 FALSE,			/* partial_inplace */
1166	 0,			/* src_mask */
1167	 0xffff,		/* dst_mask */
1168	 FALSE),		/* pcrel_offset */
1169
1170  /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1171     offset to the entry.  */
1172  HOWTO (R_PPC_GOT_TPREL16,
1173	 0,			/* rightshift */
1174	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1175	 16,			/* bitsize */
1176	 FALSE,			/* pc_relative */
1177	 0,			/* bitpos */
1178	 complain_overflow_signed, /* complain_on_overflow */
1179	 ppc_elf_unhandled_reloc, /* special_function */
1180	 "R_PPC_GOT_TPREL16",	/* name */
1181	 FALSE,			/* partial_inplace */
1182	 0,			/* src_mask */
1183	 0xffff,		/* dst_mask */
1184	 FALSE),		/* pcrel_offset */
1185
1186  /* Like GOT_TPREL16, but no overflow.  */
1187  HOWTO (R_PPC_GOT_TPREL16_LO,
1188	 0,			/* rightshift */
1189	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1190	 16,			/* bitsize */
1191	 FALSE,			/* pc_relative */
1192	 0,			/* bitpos */
1193	 complain_overflow_dont, /* complain_on_overflow */
1194	 ppc_elf_unhandled_reloc, /* special_function */
1195	 "R_PPC_GOT_TPREL16_LO", /* name */
1196	 FALSE,			/* partial_inplace */
1197	 0,			/* src_mask */
1198	 0xffff,		/* dst_mask */
1199	 FALSE),		/* pcrel_offset */
1200
1201  /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
1202  HOWTO (R_PPC_GOT_TPREL16_HI,
1203	 16,			/* rightshift */
1204	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1205	 16,			/* bitsize */
1206	 FALSE,			/* pc_relative */
1207	 0,			/* bitpos */
1208	 complain_overflow_dont, /* complain_on_overflow */
1209	 ppc_elf_unhandled_reloc, /* special_function */
1210	 "R_PPC_GOT_TPREL16_HI", /* name */
1211	 FALSE,			/* partial_inplace */
1212	 0,			/* src_mask */
1213	 0xffff,		/* dst_mask */
1214	 FALSE),		/* pcrel_offset */
1215
1216  /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1217  HOWTO (R_PPC_GOT_TPREL16_HA,
1218	 16,			/* rightshift */
1219	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1220	 16,			/* bitsize */
1221	 FALSE,			/* pc_relative */
1222	 0,			/* bitpos */
1223	 complain_overflow_dont, /* complain_on_overflow */
1224	 ppc_elf_unhandled_reloc, /* special_function */
1225	 "R_PPC_GOT_TPREL16_HA", /* name */
1226	 FALSE,			/* partial_inplace */
1227	 0,			/* src_mask */
1228	 0xffff,		/* dst_mask */
1229	 FALSE),		/* pcrel_offset */
1230
1231  /* The remaining relocs are from the Embedded ELF ABI, and are not
1232     in the SVR4 ELF ABI.  */
1233
1234  /* 32 bit value resulting from the addend minus the symbol.  */
1235  HOWTO (R_PPC_EMB_NADDR32,	/* type */
1236	 0,			/* rightshift */
1237	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1238	 32,			/* bitsize */
1239	 FALSE,			/* pc_relative */
1240	 0,			/* bitpos */
1241	 complain_overflow_dont, /* complain_on_overflow */
1242	 ppc_elf_unhandled_reloc, /* special_function */
1243	 "R_PPC_EMB_NADDR32",	/* name */
1244	 FALSE,			/* partial_inplace */
1245	 0,			/* src_mask */
1246	 0xffffffff,		/* dst_mask */
1247	 FALSE),		/* pcrel_offset */
1248
1249  /* 16 bit value resulting from the addend minus the symbol.  */
1250  HOWTO (R_PPC_EMB_NADDR16,	/* type */
1251	 0,			/* rightshift */
1252	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1253	 16,			/* bitsize */
1254	 FALSE,			/* pc_relative */
1255	 0,			/* bitpos */
1256	 complain_overflow_signed, /* complain_on_overflow */
1257	 ppc_elf_unhandled_reloc, /* special_function */
1258	 "R_PPC_EMB_NADDR16",	/* name */
1259	 FALSE,			/* partial_inplace */
1260	 0,			/* src_mask */
1261	 0xffff,		/* dst_mask */
1262	 FALSE),		/* pcrel_offset */
1263
1264  /* 16 bit value resulting from the addend minus the symbol.  */
1265  HOWTO (R_PPC_EMB_NADDR16_LO,	/* type */
1266	 0,			/* rightshift */
1267	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1268	 16,			/* bitsize */
1269	 FALSE,			/* pc_relative */
1270	 0,			/* bitpos */
1271	 complain_overflow_dont,/* complain_on_overflow */
1272	 ppc_elf_unhandled_reloc, /* special_function */
1273	 "R_PPC_EMB_ADDR16_LO",	/* name */
1274	 FALSE,			/* partial_inplace */
1275	 0,			/* src_mask */
1276	 0xffff,		/* dst_mask */
1277	 FALSE),		/* pcrel_offset */
1278
1279  /* The high order 16 bits of the addend minus the symbol.  */
1280  HOWTO (R_PPC_EMB_NADDR16_HI,	/* type */
1281	 16,			/* rightshift */
1282	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1283	 16,			/* bitsize */
1284	 FALSE,			/* pc_relative */
1285	 0,			/* bitpos */
1286	 complain_overflow_dont, /* complain_on_overflow */
1287	 ppc_elf_unhandled_reloc, /* special_function */
1288	 "R_PPC_EMB_NADDR16_HI", /* name */
1289	 FALSE,			/* partial_inplace */
1290	 0,			/* src_mask */
1291	 0xffff,		/* dst_mask */
1292	 FALSE),		/* pcrel_offset */
1293
1294  /* The high order 16 bits of the result of the addend minus the address,
1295     plus 1 if the contents of the low 16 bits, treated as a signed number,
1296     is negative.  */
1297  HOWTO (R_PPC_EMB_NADDR16_HA,	/* type */
1298	 16,			/* rightshift */
1299	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1300	 16,			/* bitsize */
1301	 FALSE,			/* pc_relative */
1302	 0,			/* bitpos */
1303	 complain_overflow_dont, /* complain_on_overflow */
1304	 ppc_elf_unhandled_reloc, /* special_function */
1305	 "R_PPC_EMB_NADDR16_HA", /* name */
1306	 FALSE,			/* partial_inplace */
1307	 0,			/* src_mask */
1308	 0xffff,		/* dst_mask */
1309	 FALSE),		/* pcrel_offset */
1310
1311  /* 16 bit value resulting from allocating a 4 byte word to hold an
1312     address in the .sdata section, and returning the offset from
1313     _SDA_BASE_ for that relocation.  */
1314  HOWTO (R_PPC_EMB_SDAI16,	/* type */
1315	 0,			/* rightshift */
1316	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1317	 16,			/* bitsize */
1318	 FALSE,			/* pc_relative */
1319	 0,			/* bitpos */
1320	 complain_overflow_signed, /* complain_on_overflow */
1321	 ppc_elf_unhandled_reloc, /* special_function */
1322	 "R_PPC_EMB_SDAI16",	/* name */
1323	 FALSE,			/* partial_inplace */
1324	 0,			/* src_mask */
1325	 0xffff,		/* dst_mask */
1326	 FALSE),		/* pcrel_offset */
1327
1328  /* 16 bit value resulting from allocating a 4 byte word to hold an
1329     address in the .sdata2 section, and returning the offset from
1330     _SDA2_BASE_ for that relocation.  */
1331  HOWTO (R_PPC_EMB_SDA2I16,	/* type */
1332	 0,			/* rightshift */
1333	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1334	 16,			/* bitsize */
1335	 FALSE,			/* pc_relative */
1336	 0,			/* bitpos */
1337	 complain_overflow_signed, /* complain_on_overflow */
1338	 ppc_elf_unhandled_reloc, /* special_function */
1339	 "R_PPC_EMB_SDA2I16",	/* name */
1340	 FALSE,			/* partial_inplace */
1341	 0,			/* src_mask */
1342	 0xffff,		/* dst_mask */
1343	 FALSE),		/* pcrel_offset */
1344
1345  /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1346     small data items.	 */
1347  HOWTO (R_PPC_EMB_SDA2REL,	/* type */
1348	 0,			/* rightshift */
1349	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1350	 16,			/* bitsize */
1351	 FALSE,			/* pc_relative */
1352	 0,			/* bitpos */
1353	 complain_overflow_signed, /* complain_on_overflow */
1354	 ppc_elf_unhandled_reloc, /* special_function */
1355	 "R_PPC_EMB_SDA2REL",	/* name */
1356	 FALSE,			/* partial_inplace */
1357	 0,			/* src_mask */
1358	 0xffff,		/* dst_mask */
1359	 FALSE),		/* pcrel_offset */
1360
1361  /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1362     signed offset from the appropriate base, and filling in the register
1363     field with the appropriate register (0, 2, or 13).  */
1364  HOWTO (R_PPC_EMB_SDA21,	/* type */
1365	 0,			/* rightshift */
1366	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1367	 16,			/* bitsize */
1368	 FALSE,			/* pc_relative */
1369	 0,			/* bitpos */
1370	 complain_overflow_signed, /* complain_on_overflow */
1371	 ppc_elf_unhandled_reloc, /* special_function */
1372	 "R_PPC_EMB_SDA21",	/* name */
1373	 FALSE,			/* partial_inplace */
1374	 0,			/* src_mask */
1375	 0xffff,		/* dst_mask */
1376	 FALSE),		/* pcrel_offset */
1377
1378  /* Relocation not handled: R_PPC_EMB_MRKREF */
1379  /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1380  /* Relocation not handled: R_PPC_EMB_RELST_LO */
1381  /* Relocation not handled: R_PPC_EMB_RELST_HI */
1382  /* Relocation not handled: R_PPC_EMB_RELST_HA */
1383  /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1384
1385  /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1386     in the 16 bit signed offset from the appropriate base, and filling in the
1387     register field with the appropriate register (0, 2, or 13).  */
1388  HOWTO (R_PPC_EMB_RELSDA,	/* type */
1389	 0,			/* rightshift */
1390	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1391	 16,			/* bitsize */
1392	 FALSE,			/* pc_relative */
1393	 0,			/* bitpos */
1394	 complain_overflow_signed, /* complain_on_overflow */
1395	 ppc_elf_unhandled_reloc, /* special_function */
1396	 "R_PPC_EMB_RELSDA",	/* name */
1397	 FALSE,			/* partial_inplace */
1398	 0,			/* src_mask */
1399	 0xffff,		/* dst_mask */
1400	 FALSE),		/* pcrel_offset */
1401
1402  /* A relative 8 bit branch.  */
1403  HOWTO (R_PPC_VLE_REL8,	/* type */
1404	 1,			/* rightshift */
1405	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1406	 8,			/* bitsize */
1407	 TRUE,			/* pc_relative */
1408	 0,			/* bitpos */
1409	 complain_overflow_signed, /* complain_on_overflow */
1410	 bfd_elf_generic_reloc,	/* special_function */
1411	 "R_PPC_VLE_REL8",	/* name */
1412	 FALSE,			/* partial_inplace */
1413	 0,			/* src_mask */
1414	 0xff,			/* dst_mask */
1415	 TRUE),			/* pcrel_offset */
1416
1417  /* A relative 15 bit branch.  */
1418  HOWTO (R_PPC_VLE_REL15,	/* type */
1419	 1,			/* rightshift */
1420	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1421	 15,			/* bitsize */
1422	 TRUE,			/* pc_relative */
1423	 1,			/* bitpos */
1424	 complain_overflow_signed, /* complain_on_overflow */
1425	 bfd_elf_generic_reloc,	/* special_function */
1426	 "R_PPC_VLE_REL15",	/* name */
1427	 FALSE,			/* partial_inplace */
1428	 0,			/* src_mask */
1429	 0xfffe,		/* dst_mask */
1430	 TRUE),			/* pcrel_offset */
1431
1432  /* A relative 24 bit branch.  */
1433  HOWTO (R_PPC_VLE_REL24,	/* type */
1434	 1,			/* rightshift */
1435	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1436	 24,			/* bitsize */
1437	 TRUE,			/* pc_relative */
1438	 1,			/* bitpos */
1439	 complain_overflow_signed, /* complain_on_overflow */
1440	 bfd_elf_generic_reloc,	/* special_function */
1441	 "R_PPC_VLE_REL24",	/* name */
1442	 FALSE,			/* partial_inplace */
1443	 0,			/* src_mask */
1444	 0x1fffffe,		/* dst_mask */
1445	 TRUE),			/* pcrel_offset */
1446
1447  /* The 16 LSBS in split16a format.  */
1448  HOWTO (R_PPC_VLE_LO16A,	/* type */
1449	 0,			/* rightshift */
1450	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1451	 16,			/* bitsize */
1452	 FALSE,			/* pc_relative */
1453	 0,			/* bitpos */
1454	 complain_overflow_dont, /* complain_on_overflow */
1455	 ppc_elf_unhandled_reloc, /* special_function */
1456	 "R_PPC_VLE_LO16A",	/* name */
1457	 FALSE,			/* partial_inplace */
1458	 0,			/* src_mask */
1459	 0x1f07ff,		/* dst_mask */
1460	 FALSE),		/* pcrel_offset */
1461
1462  /* The 16 LSBS in split16d format.  */
1463  HOWTO (R_PPC_VLE_LO16D,	/* type */
1464	 0,			/* rightshift */
1465	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1466	 16,			/* bitsize */
1467	 FALSE,			/* pc_relative */
1468	 0,			/* bitpos */
1469	 complain_overflow_dont, /* complain_on_overflow */
1470	 ppc_elf_unhandled_reloc, /* special_function */
1471	 "R_PPC_VLE_LO16D",	/* name */
1472	 FALSE,			/* partial_inplace */
1473	 0,			/* src_mask */
1474	 0x3e007ff,		/* dst_mask */
1475	 FALSE),		/* pcrel_offset */
1476
1477  /* Bits 16-31 split16a format.  */
1478  HOWTO (R_PPC_VLE_HI16A,	/* type */
1479	 16,			/* rightshift */
1480	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1481	 16,			/* bitsize */
1482	 FALSE,			/* pc_relative */
1483	 0,			/* bitpos */
1484	 complain_overflow_dont, /* complain_on_overflow */
1485	 ppc_elf_unhandled_reloc, /* special_function */
1486	 "R_PPC_VLE_HI16A",	/* name */
1487	 FALSE,			/* partial_inplace */
1488	 0,			/* src_mask */
1489	 0x1f07ff,		/* dst_mask */
1490	 FALSE),		/* pcrel_offset */
1491
1492  /* Bits 16-31 split16d format.  */
1493  HOWTO (R_PPC_VLE_HI16D,	/* type */
1494	 16,			/* rightshift */
1495	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1496	 16,			/* bitsize */
1497	 FALSE,			/* pc_relative */
1498	 0,			/* bitpos */
1499	 complain_overflow_dont, /* complain_on_overflow */
1500	 ppc_elf_unhandled_reloc, /* special_function */
1501	 "R_PPC_VLE_HI16D",	/* name */
1502	 FALSE,			/* partial_inplace */
1503	 0,			/* src_mask */
1504	 0x3e007ff,		/* dst_mask */
1505	 FALSE),		/* pcrel_offset */
1506
1507  /* Bits 16-31 (High Adjusted) in split16a format.  */
1508  HOWTO (R_PPC_VLE_HA16A,	/* type */
1509	 16,			/* rightshift */
1510	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1511	 16,			/* bitsize */
1512	 FALSE,			/* pc_relative */
1513	 0,			/* bitpos */
1514	 complain_overflow_dont, /* complain_on_overflow */
1515	 ppc_elf_unhandled_reloc, /* special_function */
1516	 "R_PPC_VLE_HA16A",	/* name */
1517	 FALSE,			/* partial_inplace */
1518	 0,			/* src_mask */
1519	 0x1f07ff,		/* dst_mask */
1520	 FALSE),		/* pcrel_offset */
1521
1522  /* Bits 16-31 (High Adjusted) in split16d format.  */
1523  HOWTO (R_PPC_VLE_HA16D,	/* type */
1524	 16,			/* rightshift */
1525	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1526	 16,			/* bitsize */
1527	 FALSE,			/* pc_relative */
1528	 0,			/* bitpos */
1529	 complain_overflow_dont, /* complain_on_overflow */
1530	 ppc_elf_unhandled_reloc, /* special_function */
1531	 "R_PPC_VLE_HA16D",	/* name */
1532	 FALSE,			/* partial_inplace */
1533	 0,			/* src_mask */
1534	 0x3e007ff,		/* dst_mask */
1535	 FALSE),		/* pcrel_offset */
1536
1537  /* This reloc is like R_PPC_EMB_SDA21 but only applies to e_add16i
1538     instructions.  If the register base is 0 then the linker changes
1539     the e_add16i to an e_li instruction.  */
1540  HOWTO (R_PPC_VLE_SDA21,	/* type */
1541	 0,			/* rightshift */
1542	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1543	 16,			/* bitsize */
1544	 FALSE,			/* pc_relative */
1545	 0,			/* bitpos */
1546	 complain_overflow_signed, /* complain_on_overflow */
1547	 ppc_elf_unhandled_reloc, /* special_function */
1548	 "R_PPC_VLE_SDA21",	/* name */
1549	 FALSE,			/* partial_inplace */
1550	 0,			/* src_mask */
1551	 0xffff,		/* dst_mask */
1552	 FALSE),		/* pcrel_offset */
1553
1554  /* Like R_PPC_VLE_SDA21 but ignore overflow.  */
1555  HOWTO (R_PPC_VLE_SDA21_LO,	/* type */
1556	 0,			/* rightshift */
1557	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1558	 16,			/* bitsize */
1559	 FALSE,			/* pc_relative */
1560	 0,			/* bitpos */
1561	 complain_overflow_dont, /* complain_on_overflow */
1562	 ppc_elf_unhandled_reloc, /* special_function */
1563	 "R_PPC_VLE_SDA21_LO",	/* name */
1564	 FALSE,			/* partial_inplace */
1565	 0,			/* src_mask */
1566	 0xffff,		/* dst_mask */
1567	 FALSE),		/* pcrel_offset */
1568
1569  /* The 16 LSBS relative to _SDA_BASE_ in split16a format.  */
1570  HOWTO (R_PPC_VLE_SDAREL_LO16A,/* type */
1571	 0,			/* rightshift */
1572	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1573	 16,			/* bitsize */
1574	 FALSE,			/* pc_relative */
1575	 0,			/* bitpos */
1576	 complain_overflow_dont, /* complain_on_overflow */
1577	 ppc_elf_unhandled_reloc, /* special_function */
1578	 "R_PPC_VLE_SDAREL_LO16A", /* name */
1579	 FALSE,			/* partial_inplace */
1580	 0,			/* src_mask */
1581	 0x1f07ff,		/* dst_mask */
1582	 FALSE),		/* pcrel_offset */
1583
1584  /* The 16 LSBS relative to _SDA_BASE_ in split16d format.  */
1585  HOWTO (R_PPC_VLE_SDAREL_LO16D, /* type */
1586	 0,			/* rightshift */
1587	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1588	 16,			/* bitsize */
1589	 FALSE,			/* pc_relative */
1590	 0,			/* bitpos */
1591	 complain_overflow_dont, /* complain_on_overflow */
1592	 ppc_elf_unhandled_reloc, /* special_function */
1593	 "R_PPC_VLE_SDAREL_LO16D", /* name */
1594	 FALSE,			/* partial_inplace */
1595	 0,			/* src_mask */
1596	 0x3e007ff,		/* dst_mask */
1597	 FALSE),		/* pcrel_offset */
1598
1599  /* Bits 16-31 relative to _SDA_BASE_ in split16a format.  */
1600  HOWTO (R_PPC_VLE_SDAREL_HI16A, /* type */
1601	 16,			/* rightshift */
1602	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1603	 16,			/* bitsize */
1604	 FALSE,			/* pc_relative */
1605	 0,			/* bitpos */
1606	 complain_overflow_dont, /* complain_on_overflow */
1607	 ppc_elf_unhandled_reloc, /* special_function */
1608	 "R_PPC_VLE_SDAREL_HI16A", /* name */
1609	 FALSE,			/* partial_inplace */
1610	 0,			/* src_mask */
1611	 0x1f07ff,		/* dst_mask */
1612	 FALSE),		/* pcrel_offset */
1613
1614  /* Bits 16-31 relative to _SDA_BASE_ in split16d format.  */
1615  HOWTO (R_PPC_VLE_SDAREL_HI16D, /* type */
1616	 16,			/* rightshift */
1617	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1618	 16,			/* bitsize */
1619	 FALSE,			/* pc_relative */
1620	 0,			/* bitpos */
1621	 complain_overflow_dont, /* complain_on_overflow */
1622	 ppc_elf_unhandled_reloc, /* special_function */
1623	 "R_PPC_VLE_SDAREL_HI16D", /* name */
1624	 FALSE,			/* partial_inplace */
1625	 0,			/* src_mask */
1626	 0x3e007ff,		/* dst_mask */
1627	 FALSE),		/* pcrel_offset */
1628
1629  /* Bits 16-31 (HA) relative to _SDA_BASE split16a format.  */
1630  HOWTO (R_PPC_VLE_SDAREL_HA16A, /* type */
1631	 16,			/* rightshift */
1632	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1633	 16,			/* bitsize */
1634	 FALSE,			/* pc_relative */
1635	 0,			/* bitpos */
1636	 complain_overflow_dont, /* complain_on_overflow */
1637	 ppc_elf_unhandled_reloc, /* special_function */
1638	 "R_PPC_VLE_SDAREL_HA16A", /* name */
1639	 FALSE,			/* partial_inplace */
1640	 0,			/* src_mask */
1641	 0x1f07ff,		/* dst_mask */
1642	 FALSE),		/* pcrel_offset */
1643
1644  /* Bits 16-31 (HA) relative to _SDA_BASE split16d format.  */
1645  HOWTO (R_PPC_VLE_SDAREL_HA16D, /* type */
1646	 16,			/* rightshift */
1647	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1648	 16,			/* bitsize */
1649	 FALSE,			/* pc_relative */
1650	 0,			/* bitpos */
1651	 complain_overflow_dont, /* complain_on_overflow */
1652	 ppc_elf_unhandled_reloc, /* special_function */
1653	 "R_PPC_VLE_SDAREL_HA16D", /* name */
1654	 FALSE,			/* partial_inplace */
1655	 0,			/* src_mask */
1656	 0x3e007ff,		/* dst_mask */
1657	 FALSE),		/* pcrel_offset */
1658
1659  HOWTO (R_PPC_IRELATIVE,	/* type */
1660	 0,			/* rightshift */
1661	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1662	 32,			/* bitsize */
1663	 FALSE,			/* pc_relative */
1664	 0,			/* bitpos */
1665	 complain_overflow_dont, /* complain_on_overflow */
1666	 ppc_elf_unhandled_reloc, /* special_function */
1667	 "R_PPC_IRELATIVE",	/* name */
1668	 FALSE,			/* partial_inplace */
1669	 0,			/* src_mask */
1670	 0xffffffff,		/* dst_mask */
1671	 FALSE),		/* pcrel_offset */
1672
1673  /* A 16 bit relative relocation.  */
1674  HOWTO (R_PPC_REL16,		/* type */
1675	 0,			/* rightshift */
1676	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1677	 16,			/* bitsize */
1678	 TRUE,			/* pc_relative */
1679	 0,			/* bitpos */
1680	 complain_overflow_signed, /* complain_on_overflow */
1681	 bfd_elf_generic_reloc,	/* special_function */
1682	 "R_PPC_REL16",		/* name */
1683	 FALSE,			/* partial_inplace */
1684	 0,			/* src_mask */
1685	 0xffff,		/* dst_mask */
1686	 TRUE),			/* pcrel_offset */
1687
1688  /* A 16 bit relative relocation without overflow.  */
1689  HOWTO (R_PPC_REL16_LO,	/* type */
1690	 0,			/* rightshift */
1691	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1692	 16,			/* bitsize */
1693	 TRUE,			/* pc_relative */
1694	 0,			/* bitpos */
1695	 complain_overflow_dont,/* complain_on_overflow */
1696	 bfd_elf_generic_reloc,	/* special_function */
1697	 "R_PPC_REL16_LO",	/* name */
1698	 FALSE,			/* partial_inplace */
1699	 0,			/* src_mask */
1700	 0xffff,		/* dst_mask */
1701	 TRUE),			/* pcrel_offset */
1702
1703  /* The high order 16 bits of a relative address.  */
1704  HOWTO (R_PPC_REL16_HI,	/* type */
1705	 16,			/* rightshift */
1706	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1707	 16,			/* bitsize */
1708	 TRUE,			/* pc_relative */
1709	 0,			/* bitpos */
1710	 complain_overflow_dont, /* complain_on_overflow */
1711	 bfd_elf_generic_reloc,	/* special_function */
1712	 "R_PPC_REL16_HI",	/* name */
1713	 FALSE,			/* partial_inplace */
1714	 0,			/* src_mask */
1715	 0xffff,		/* dst_mask */
1716	 TRUE),			/* pcrel_offset */
1717
1718  /* The high order 16 bits of a relative address, plus 1 if the contents of
1719     the low 16 bits, treated as a signed number, is negative.  */
1720  HOWTO (R_PPC_REL16_HA,	/* type */
1721	 16,			/* rightshift */
1722	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1723	 16,			/* bitsize */
1724	 TRUE,			/* pc_relative */
1725	 0,			/* bitpos */
1726	 complain_overflow_dont, /* complain_on_overflow */
1727	 ppc_elf_addr16_ha_reloc, /* special_function */
1728	 "R_PPC_REL16_HA",	/* name */
1729	 FALSE,			/* partial_inplace */
1730	 0,			/* src_mask */
1731	 0xffff,		/* dst_mask */
1732	 TRUE),			/* pcrel_offset */
1733
1734  /* Like R_PPC_REL16_HA but for split field in addpcis.  */
1735  HOWTO (R_PPC_REL16DX_HA,	/* type */
1736	 16,			/* rightshift */
1737	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1738	 16,			/* bitsize */
1739	 TRUE,			/* pc_relative */
1740	 0,			/* bitpos */
1741	 complain_overflow_signed, /* complain_on_overflow */
1742	 ppc_elf_addr16_ha_reloc, /* special_function */
1743	 "R_PPC_REL16DX_HA",	/* name */
1744	 FALSE,			/* partial_inplace */
1745	 0,			/* src_mask */
1746	 0x1fffc1,		/* dst_mask */
1747	 TRUE),			/* pcrel_offset */
1748
1749  /* A split-field reloc for addpcis, non-relative (gas internal use only).  */
1750  HOWTO (R_PPC_16DX_HA,		/* type */
1751	 16,			/* rightshift */
1752	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1753	 16,			/* bitsize */
1754	 FALSE,			/* pc_relative */
1755	 0,			/* bitpos */
1756	 complain_overflow_signed, /* complain_on_overflow */
1757	 ppc_elf_addr16_ha_reloc, /* special_function */
1758	 "R_PPC_16DX_HA",	/* name */
1759	 FALSE,			/* partial_inplace */
1760	 0,			/* src_mask */
1761	 0x1fffc1,		/* dst_mask */
1762	 FALSE),		/* pcrel_offset */
1763
1764  /* GNU extension to record C++ vtable hierarchy.  */
1765  HOWTO (R_PPC_GNU_VTINHERIT,	/* type */
1766	 0,			/* rightshift */
1767	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1768	 0,			/* bitsize */
1769	 FALSE,			/* pc_relative */
1770	 0,			/* bitpos */
1771	 complain_overflow_dont, /* complain_on_overflow */
1772	 NULL,			/* special_function */
1773	 "R_PPC_GNU_VTINHERIT",	/* name */
1774	 FALSE,			/* partial_inplace */
1775	 0,			/* src_mask */
1776	 0,			/* dst_mask */
1777	 FALSE),		/* pcrel_offset */
1778
1779  /* GNU extension to record C++ vtable member usage.  */
1780  HOWTO (R_PPC_GNU_VTENTRY,	/* type */
1781	 0,			/* rightshift */
1782	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1783	 0,			/* bitsize */
1784	 FALSE,			/* pc_relative */
1785	 0,			/* bitpos */
1786	 complain_overflow_dont, /* complain_on_overflow */
1787	 NULL,			/* special_function */
1788	 "R_PPC_GNU_VTENTRY",	/* name */
1789	 FALSE,			/* partial_inplace */
1790	 0,			/* src_mask */
1791	 0,			/* dst_mask */
1792	 FALSE),		/* pcrel_offset */
1793
1794  /* Phony reloc to handle AIX style TOC entries.  */
1795  HOWTO (R_PPC_TOC16,		/* type */
1796	 0,			/* rightshift */
1797	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1798	 16,			/* bitsize */
1799	 FALSE,			/* pc_relative */
1800	 0,			/* bitpos */
1801	 complain_overflow_signed, /* complain_on_overflow */
1802	 ppc_elf_unhandled_reloc, /* special_function */
1803	 "R_PPC_TOC16",		/* name */
1804	 FALSE,			/* partial_inplace */
1805	 0,			/* src_mask */
1806	 0xffff,		/* dst_mask */
1807	 FALSE),		/* pcrel_offset */
1808};
1809
1810/* External 32-bit PPC structure for PRPSINFO.  This structure is
1811   ABI-defined, thus we choose to use char arrays here in order to
1812   avoid dealing with different types in different architectures.
1813
1814   The PPC 32-bit structure uses int for `pr_uid' and `pr_gid' while
1815   most non-PPC architectures use `short int'.
1816
1817   This structure will ultimately be written in the corefile's note
1818   section, as the PRPSINFO.  */
1819
1820struct elf_external_ppc_linux_prpsinfo32
1821  {
1822    char pr_state;			/* Numeric process state.  */
1823    char pr_sname;			/* Char for pr_state.  */
1824    char pr_zomb;			/* Zombie.  */
1825    char pr_nice;			/* Nice val.  */
1826    char pr_flag[4];			/* Flags.  */
1827    char pr_uid[4];
1828    char pr_gid[4];
1829    char pr_pid[4];
1830    char pr_ppid[4];
1831    char pr_pgrp[4];
1832    char pr_sid[4];
1833    char pr_fname[16];			/* Filename of executable.  */
1834    char pr_psargs[80];			/* Initial part of arg list.  */
1835  };
1836
1837/* Helper function to copy an elf_internal_linux_prpsinfo in host
1838   endian to an elf_external_ppc_linux_prpsinfo32 in target endian.  */
1839
1840static inline void
1841swap_ppc_linux_prpsinfo32_out (bfd *obfd,
1842			       const struct elf_internal_linux_prpsinfo *from,
1843			       struct elf_external_ppc_linux_prpsinfo32 *to)
1844{
1845  bfd_put_8 (obfd, from->pr_state, &to->pr_state);
1846  bfd_put_8 (obfd, from->pr_sname, &to->pr_sname);
1847  bfd_put_8 (obfd, from->pr_zomb, &to->pr_zomb);
1848  bfd_put_8 (obfd, from->pr_nice, &to->pr_nice);
1849  bfd_put_32 (obfd, from->pr_flag, to->pr_flag);
1850  bfd_put_32 (obfd, from->pr_uid, to->pr_uid);
1851  bfd_put_32 (obfd, from->pr_gid, to->pr_gid);
1852  bfd_put_32 (obfd, from->pr_pid, to->pr_pid);
1853  bfd_put_32 (obfd, from->pr_ppid, to->pr_ppid);
1854  bfd_put_32 (obfd, from->pr_pgrp, to->pr_pgrp);
1855  bfd_put_32 (obfd, from->pr_sid, to->pr_sid);
1856  strncpy (to->pr_fname, from->pr_fname, sizeof (to->pr_fname));
1857  strncpy (to->pr_psargs, from->pr_psargs, sizeof (to->pr_psargs));
1858}
1859
1860/* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1861
1862static void
1863ppc_elf_howto_init (void)
1864{
1865  unsigned int i, type;
1866
1867  for (i = 0;
1868       i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1869       i++)
1870    {
1871      type = ppc_elf_howto_raw[i].type;
1872      if (type >= (sizeof (ppc_elf_howto_table)
1873		   / sizeof (ppc_elf_howto_table[0])))
1874	abort ();
1875      ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1876    }
1877}
1878
1879static reloc_howto_type *
1880ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1881			   bfd_reloc_code_real_type code)
1882{
1883  enum elf_ppc_reloc_type r;
1884
1885  /* Initialize howto table if not already done.  */
1886  if (!ppc_elf_howto_table[R_PPC_ADDR32])
1887    ppc_elf_howto_init ();
1888
1889  switch (code)
1890    {
1891    default:
1892      return NULL;
1893
1894    case BFD_RELOC_NONE:		r = R_PPC_NONE;			break;
1895    case BFD_RELOC_32:			r = R_PPC_ADDR32;		break;
1896    case BFD_RELOC_PPC_BA26:		r = R_PPC_ADDR24;		break;
1897    case BFD_RELOC_PPC64_ADDR16_DS:
1898    case BFD_RELOC_16:			r = R_PPC_ADDR16;		break;
1899    case BFD_RELOC_PPC64_ADDR16_LO_DS:
1900    case BFD_RELOC_LO16:		r = R_PPC_ADDR16_LO;		break;
1901    case BFD_RELOC_HI16:		r = R_PPC_ADDR16_HI;		break;
1902    case BFD_RELOC_HI16_S:		r = R_PPC_ADDR16_HA;		break;
1903    case BFD_RELOC_PPC_BA16:		r = R_PPC_ADDR14;		break;
1904    case BFD_RELOC_PPC_BA16_BRTAKEN:	r = R_PPC_ADDR14_BRTAKEN;	break;
1905    case BFD_RELOC_PPC_BA16_BRNTAKEN:	r = R_PPC_ADDR14_BRNTAKEN;	break;
1906    case BFD_RELOC_PPC_B26:		r = R_PPC_REL24;		break;
1907    case BFD_RELOC_PPC_B16:		r = R_PPC_REL14;		break;
1908    case BFD_RELOC_PPC_B16_BRTAKEN:	r = R_PPC_REL14_BRTAKEN;	break;
1909    case BFD_RELOC_PPC_B16_BRNTAKEN:	r = R_PPC_REL14_BRNTAKEN;	break;
1910    case BFD_RELOC_PPC64_GOT16_DS:
1911    case BFD_RELOC_16_GOTOFF:		r = R_PPC_GOT16;		break;
1912    case BFD_RELOC_PPC64_GOT16_LO_DS:
1913    case BFD_RELOC_LO16_GOTOFF:		r = R_PPC_GOT16_LO;		break;
1914    case BFD_RELOC_HI16_GOTOFF:		r = R_PPC_GOT16_HI;		break;
1915    case BFD_RELOC_HI16_S_GOTOFF:	r = R_PPC_GOT16_HA;		break;
1916    case BFD_RELOC_24_PLT_PCREL:	r = R_PPC_PLTREL24;		break;
1917    case BFD_RELOC_PPC_COPY:		r = R_PPC_COPY;			break;
1918    case BFD_RELOC_PPC_GLOB_DAT:	r = R_PPC_GLOB_DAT;		break;
1919    case BFD_RELOC_PPC_LOCAL24PC:	r = R_PPC_LOCAL24PC;		break;
1920    case BFD_RELOC_32_PCREL:		r = R_PPC_REL32;		break;
1921    case BFD_RELOC_32_PLTOFF:		r = R_PPC_PLT32;		break;
1922    case BFD_RELOC_32_PLT_PCREL:	r = R_PPC_PLTREL32;		break;
1923    case BFD_RELOC_PPC64_PLT16_LO_DS:
1924    case BFD_RELOC_LO16_PLTOFF:		r = R_PPC_PLT16_LO;		break;
1925    case BFD_RELOC_HI16_PLTOFF:		r = R_PPC_PLT16_HI;		break;
1926    case BFD_RELOC_HI16_S_PLTOFF:	r = R_PPC_PLT16_HA;		break;
1927    case BFD_RELOC_GPREL16:		r = R_PPC_SDAREL16;		break;
1928    case BFD_RELOC_PPC64_SECTOFF_DS:
1929    case BFD_RELOC_16_BASEREL:		r = R_PPC_SECTOFF;		break;
1930    case BFD_RELOC_PPC64_SECTOFF_LO_DS:
1931    case BFD_RELOC_LO16_BASEREL:	r = R_PPC_SECTOFF_LO;		break;
1932    case BFD_RELOC_HI16_BASEREL:	r = R_PPC_SECTOFF_HI;		break;
1933    case BFD_RELOC_HI16_S_BASEREL:	r = R_PPC_SECTOFF_HA;		break;
1934    case BFD_RELOC_CTOR:		r = R_PPC_ADDR32;		break;
1935    case BFD_RELOC_PPC64_TOC16_DS:
1936    case BFD_RELOC_PPC_TOC16:		r = R_PPC_TOC16;		break;
1937    case BFD_RELOC_PPC_TLS:		r = R_PPC_TLS;			break;
1938    case BFD_RELOC_PPC_TLSGD:		r = R_PPC_TLSGD;		break;
1939    case BFD_RELOC_PPC_TLSLD:		r = R_PPC_TLSLD;		break;
1940    case BFD_RELOC_PPC_DTPMOD:		r = R_PPC_DTPMOD32;		break;
1941    case BFD_RELOC_PPC64_TPREL16_DS:
1942    case BFD_RELOC_PPC_TPREL16:		r = R_PPC_TPREL16;		break;
1943    case BFD_RELOC_PPC64_TPREL16_LO_DS:
1944    case BFD_RELOC_PPC_TPREL16_LO:	r = R_PPC_TPREL16_LO;		break;
1945    case BFD_RELOC_PPC_TPREL16_HI:	r = R_PPC_TPREL16_HI;		break;
1946    case BFD_RELOC_PPC_TPREL16_HA:	r = R_PPC_TPREL16_HA;		break;
1947    case BFD_RELOC_PPC_TPREL:		r = R_PPC_TPREL32;		break;
1948    case BFD_RELOC_PPC64_DTPREL16_DS:
1949    case BFD_RELOC_PPC_DTPREL16:	r = R_PPC_DTPREL16;		break;
1950    case BFD_RELOC_PPC64_DTPREL16_LO_DS:
1951    case BFD_RELOC_PPC_DTPREL16_LO:	r = R_PPC_DTPREL16_LO;		break;
1952    case BFD_RELOC_PPC_DTPREL16_HI:	r = R_PPC_DTPREL16_HI;		break;
1953    case BFD_RELOC_PPC_DTPREL16_HA:	r = R_PPC_DTPREL16_HA;		break;
1954    case BFD_RELOC_PPC_DTPREL:		r = R_PPC_DTPREL32;		break;
1955    case BFD_RELOC_PPC_GOT_TLSGD16:	r = R_PPC_GOT_TLSGD16;		break;
1956    case BFD_RELOC_PPC_GOT_TLSGD16_LO:	r = R_PPC_GOT_TLSGD16_LO;	break;
1957    case BFD_RELOC_PPC_GOT_TLSGD16_HI:	r = R_PPC_GOT_TLSGD16_HI;	break;
1958    case BFD_RELOC_PPC_GOT_TLSGD16_HA:	r = R_PPC_GOT_TLSGD16_HA;	break;
1959    case BFD_RELOC_PPC_GOT_TLSLD16:	r = R_PPC_GOT_TLSLD16;		break;
1960    case BFD_RELOC_PPC_GOT_TLSLD16_LO:	r = R_PPC_GOT_TLSLD16_LO;	break;
1961    case BFD_RELOC_PPC_GOT_TLSLD16_HI:	r = R_PPC_GOT_TLSLD16_HI;	break;
1962    case BFD_RELOC_PPC_GOT_TLSLD16_HA:	r = R_PPC_GOT_TLSLD16_HA;	break;
1963    case BFD_RELOC_PPC_GOT_TPREL16:	r = R_PPC_GOT_TPREL16;		break;
1964    case BFD_RELOC_PPC_GOT_TPREL16_LO:	r = R_PPC_GOT_TPREL16_LO;	break;
1965    case BFD_RELOC_PPC_GOT_TPREL16_HI:	r = R_PPC_GOT_TPREL16_HI;	break;
1966    case BFD_RELOC_PPC_GOT_TPREL16_HA:	r = R_PPC_GOT_TPREL16_HA;	break;
1967    case BFD_RELOC_PPC_GOT_DTPREL16:	r = R_PPC_GOT_DTPREL16;		break;
1968    case BFD_RELOC_PPC_GOT_DTPREL16_LO:	r = R_PPC_GOT_DTPREL16_LO;	break;
1969    case BFD_RELOC_PPC_GOT_DTPREL16_HI:	r = R_PPC_GOT_DTPREL16_HI;	break;
1970    case BFD_RELOC_PPC_GOT_DTPREL16_HA:	r = R_PPC_GOT_DTPREL16_HA;	break;
1971    case BFD_RELOC_PPC_EMB_NADDR32:	r = R_PPC_EMB_NADDR32;		break;
1972    case BFD_RELOC_PPC_EMB_NADDR16:	r = R_PPC_EMB_NADDR16;		break;
1973    case BFD_RELOC_PPC_EMB_NADDR16_LO:	r = R_PPC_EMB_NADDR16_LO;	break;
1974    case BFD_RELOC_PPC_EMB_NADDR16_HI:	r = R_PPC_EMB_NADDR16_HI;	break;
1975    case BFD_RELOC_PPC_EMB_NADDR16_HA:	r = R_PPC_EMB_NADDR16_HA;	break;
1976    case BFD_RELOC_PPC_EMB_SDAI16:	r = R_PPC_EMB_SDAI16;		break;
1977    case BFD_RELOC_PPC_EMB_SDA2I16:	r = R_PPC_EMB_SDA2I16;		break;
1978    case BFD_RELOC_PPC_EMB_SDA2REL:	r = R_PPC_EMB_SDA2REL;		break;
1979    case BFD_RELOC_PPC_EMB_SDA21:	r = R_PPC_EMB_SDA21;		break;
1980    case BFD_RELOC_PPC_EMB_MRKREF:	r = R_PPC_EMB_MRKREF;		break;
1981    case BFD_RELOC_PPC_EMB_RELSEC16:	r = R_PPC_EMB_RELSEC16;		break;
1982    case BFD_RELOC_PPC_EMB_RELST_LO:	r = R_PPC_EMB_RELST_LO;		break;
1983    case BFD_RELOC_PPC_EMB_RELST_HI:	r = R_PPC_EMB_RELST_HI;		break;
1984    case BFD_RELOC_PPC_EMB_RELST_HA:	r = R_PPC_EMB_RELST_HA;		break;
1985    case BFD_RELOC_PPC_EMB_BIT_FLD:	r = R_PPC_EMB_BIT_FLD;		break;
1986    case BFD_RELOC_PPC_EMB_RELSDA:	r = R_PPC_EMB_RELSDA;		break;
1987    case BFD_RELOC_PPC_VLE_REL8:	r = R_PPC_VLE_REL8;		break;
1988    case BFD_RELOC_PPC_VLE_REL15:	r = R_PPC_VLE_REL15;		break;
1989    case BFD_RELOC_PPC_VLE_REL24:	r = R_PPC_VLE_REL24;		break;
1990    case BFD_RELOC_PPC_VLE_LO16A:	r = R_PPC_VLE_LO16A;		break;
1991    case BFD_RELOC_PPC_VLE_LO16D:	r = R_PPC_VLE_LO16D;		break;
1992    case BFD_RELOC_PPC_VLE_HI16A:	r = R_PPC_VLE_HI16A;		break;
1993    case BFD_RELOC_PPC_VLE_HI16D:	r = R_PPC_VLE_HI16D;		break;
1994    case BFD_RELOC_PPC_VLE_HA16A:	r = R_PPC_VLE_HA16A;		break;
1995    case BFD_RELOC_PPC_VLE_HA16D:	r = R_PPC_VLE_HA16D;		break;
1996    case BFD_RELOC_PPC_VLE_SDA21:	r = R_PPC_VLE_SDA21;		break;
1997    case BFD_RELOC_PPC_VLE_SDA21_LO:	r = R_PPC_VLE_SDA21_LO;		break;
1998    case BFD_RELOC_PPC_VLE_SDAREL_LO16A:
1999      r = R_PPC_VLE_SDAREL_LO16A;
2000      break;
2001    case BFD_RELOC_PPC_VLE_SDAREL_LO16D:
2002      r = R_PPC_VLE_SDAREL_LO16D;
2003      break;
2004    case BFD_RELOC_PPC_VLE_SDAREL_HI16A:
2005      r = R_PPC_VLE_SDAREL_HI16A;
2006      break;
2007    case BFD_RELOC_PPC_VLE_SDAREL_HI16D:
2008      r = R_PPC_VLE_SDAREL_HI16D;
2009      break;
2010    case BFD_RELOC_PPC_VLE_SDAREL_HA16A:
2011      r = R_PPC_VLE_SDAREL_HA16A;
2012      break;
2013    case BFD_RELOC_PPC_VLE_SDAREL_HA16D:
2014      r = R_PPC_VLE_SDAREL_HA16D;
2015      break;
2016    case BFD_RELOC_16_PCREL:		r = R_PPC_REL16;		break;
2017    case BFD_RELOC_LO16_PCREL:		r = R_PPC_REL16_LO;		break;
2018    case BFD_RELOC_HI16_PCREL:		r = R_PPC_REL16_HI;		break;
2019    case BFD_RELOC_HI16_S_PCREL:	r = R_PPC_REL16_HA;		break;
2020    case BFD_RELOC_PPC_16DX_HA:		r = R_PPC_16DX_HA;		break;
2021    case BFD_RELOC_PPC_REL16DX_HA:	r = R_PPC_REL16DX_HA;		break;
2022    case BFD_RELOC_VTABLE_INHERIT:	r = R_PPC_GNU_VTINHERIT;	break;
2023    case BFD_RELOC_VTABLE_ENTRY:	r = R_PPC_GNU_VTENTRY;		break;
2024    }
2025
2026  return ppc_elf_howto_table[r];
2027};
2028
2029static reloc_howto_type *
2030ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2031			   const char *r_name)
2032{
2033  unsigned int i;
2034
2035  for (i = 0;
2036       i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
2037       i++)
2038    if (ppc_elf_howto_raw[i].name != NULL
2039	&& strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
2040      return &ppc_elf_howto_raw[i];
2041
2042  return NULL;
2043}
2044
2045/* Set the howto pointer for a PowerPC ELF reloc.  */
2046
2047static void
2048ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
2049		       arelent *cache_ptr,
2050		       Elf_Internal_Rela *dst)
2051{
2052  unsigned int r_type;
2053
2054  /* Initialize howto table if not already done.  */
2055  if (!ppc_elf_howto_table[R_PPC_ADDR32])
2056    ppc_elf_howto_init ();
2057
2058  r_type = ELF32_R_TYPE (dst->r_info);
2059  if (r_type >= R_PPC_max)
2060    {
2061      /* xgettext:c-format */
2062      _bfd_error_handler (_("%B: unrecognised PPC reloc number: %d"),
2063			  abfd, r_type);
2064      bfd_set_error (bfd_error_bad_value);
2065      r_type = R_PPC_NONE;
2066    }
2067  cache_ptr->howto = ppc_elf_howto_table[r_type];
2068
2069  /* Just because the above assert didn't trigger doesn't mean that
2070     ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation.  */
2071  if (!cache_ptr->howto)
2072    {
2073      /* xgettext:c-format */
2074      _bfd_error_handler (_("%B: invalid relocation type %d"),
2075			  abfd, r_type);
2076      bfd_set_error (bfd_error_bad_value);
2077
2078      cache_ptr->howto = ppc_elf_howto_table[R_PPC_NONE];
2079    }
2080}
2081
2082/* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
2083
2084static bfd_reloc_status_type
2085ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
2086			 arelent *reloc_entry,
2087			 asymbol *symbol,
2088			 void *data ATTRIBUTE_UNUSED,
2089			 asection *input_section,
2090			 bfd *output_bfd,
2091			 char **error_message ATTRIBUTE_UNUSED)
2092{
2093  enum elf_ppc_reloc_type r_type;
2094  long insn;
2095  bfd_size_type octets;
2096  bfd_vma value;
2097
2098  if (output_bfd != NULL)
2099    {
2100      reloc_entry->address += input_section->output_offset;
2101      return bfd_reloc_ok;
2102    }
2103
2104  reloc_entry->addend += 0x8000;
2105  r_type = reloc_entry->howto->type;
2106  if (r_type != R_PPC_REL16DX_HA)
2107    return bfd_reloc_continue;
2108
2109  value = 0;
2110  if (!bfd_is_com_section (symbol->section))
2111    value = symbol->value;
2112  value += (reloc_entry->addend
2113	    + symbol->section->output_offset
2114	    + symbol->section->output_section->vma);
2115  value -= (reloc_entry->address
2116	    + input_section->output_offset
2117	    + input_section->output_section->vma);
2118  value >>= 16;
2119
2120  octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2121  insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2122  insn &= ~0x1fffc1;
2123  insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
2124  bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2125  return bfd_reloc_ok;
2126}
2127
2128static bfd_reloc_status_type
2129ppc_elf_unhandled_reloc (bfd *abfd,
2130			 arelent *reloc_entry,
2131			 asymbol *symbol,
2132			 void *data,
2133			 asection *input_section,
2134			 bfd *output_bfd,
2135			 char **error_message)
2136{
2137  /* If this is a relocatable link (output_bfd test tells us), just
2138     call the generic function.  Any adjustment will be done at final
2139     link time.  */
2140  if (output_bfd != NULL)
2141    return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2142				  input_section, output_bfd, error_message);
2143
2144  if (error_message != NULL)
2145    {
2146      static char buf[60];
2147      sprintf (buf, _("generic linker can't handle %s"),
2148	       reloc_entry->howto->name);
2149      *error_message = buf;
2150    }
2151  return bfd_reloc_dangerous;
2152}
2153
2154/* Sections created by the linker.  */
2155
2156typedef struct elf_linker_section
2157{
2158  /* Pointer to the bfd section.  */
2159  asection *section;
2160  /* Section name.  */
2161  const char *name;
2162  /* Associated bss section name.  */
2163  const char *bss_name;
2164  /* Associated symbol name.  */
2165  const char *sym_name;
2166  /* Associated symbol.  */
2167  struct elf_link_hash_entry *sym;
2168} elf_linker_section_t;
2169
2170/* Linked list of allocated pointer entries.  This hangs off of the
2171   symbol lists, and provides allows us to return different pointers,
2172   based on different addend's.  */
2173
2174typedef struct elf_linker_section_pointers
2175{
2176  /* next allocated pointer for this symbol */
2177  struct elf_linker_section_pointers *next;
2178  /* offset of pointer from beginning of section */
2179  bfd_vma offset;
2180  /* addend used */
2181  bfd_vma addend;
2182  /* which linker section this is */
2183  elf_linker_section_t *lsect;
2184} elf_linker_section_pointers_t;
2185
2186struct ppc_elf_obj_tdata
2187{
2188  struct elf_obj_tdata elf;
2189
2190  /* A mapping from local symbols to offsets into the various linker
2191     sections added.  This is index by the symbol index.  */
2192  elf_linker_section_pointers_t **linker_section_pointers;
2193
2194  /* Flags used to auto-detect plt type.  */
2195  unsigned int makes_plt_call : 1;
2196  unsigned int has_rel16 : 1;
2197};
2198
2199#define ppc_elf_tdata(bfd) \
2200  ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
2201
2202#define elf_local_ptr_offsets(bfd) \
2203  (ppc_elf_tdata (bfd)->linker_section_pointers)
2204
2205#define is_ppc_elf(bfd) \
2206  (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2207   && elf_object_id (bfd) == PPC32_ELF_DATA)
2208
2209/* Override the generic function because we store some extras.  */
2210
2211static bfd_boolean
2212ppc_elf_mkobject (bfd *abfd)
2213{
2214  return bfd_elf_allocate_object (abfd, sizeof (struct ppc_elf_obj_tdata),
2215				  PPC32_ELF_DATA);
2216}
2217
2218/* When defaulting arch/mach, decode apuinfo to find a better match.  */
2219
2220bfd_boolean
2221_bfd_elf_ppc_set_arch (bfd *abfd)
2222{
2223  unsigned long mach = 0;
2224  asection *s;
2225  unsigned char *contents;
2226
2227  if (abfd->arch_info->bits_per_word == 32
2228      && bfd_big_endian (abfd))
2229    {
2230
2231      for (s = abfd->sections; s != NULL; s = s->next)
2232	if ((elf_section_data (s)->this_hdr.sh_flags & SHF_PPC_VLE) != 0)
2233	  break;
2234      if (s != NULL)
2235	mach = bfd_mach_ppc_vle;
2236    }
2237
2238  if (mach == 0)
2239    {
2240      s = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2241      if (s != NULL && bfd_malloc_and_get_section (abfd, s, &contents))
2242	{
2243	  unsigned int apuinfo_size = bfd_get_32 (abfd, contents + 4);
2244	  unsigned int i;
2245
2246	  for (i = 20; i < apuinfo_size + 20 && i + 4 <= s->size; i += 4)
2247	    {
2248	      unsigned int val = bfd_get_32 (abfd, contents + i);
2249	      switch (val >> 16)
2250		{
2251		case PPC_APUINFO_PMR:
2252		case PPC_APUINFO_RFMCI:
2253		  if (mach == 0)
2254		    mach = bfd_mach_ppc_titan;
2255		  break;
2256
2257		case PPC_APUINFO_ISEL:
2258		case PPC_APUINFO_CACHELCK:
2259		  if (mach == bfd_mach_ppc_titan)
2260		    mach = bfd_mach_ppc_e500mc;
2261		  break;
2262
2263		case PPC_APUINFO_SPE:
2264		case PPC_APUINFO_EFS:
2265		case PPC_APUINFO_BRLOCK:
2266		  if (mach != bfd_mach_ppc_vle)
2267		    mach = bfd_mach_ppc_e500;
2268		  break;
2269
2270		case PPC_APUINFO_VLE:
2271		  mach = bfd_mach_ppc_vle;
2272		  break;
2273
2274		default:
2275		  mach = -1ul;
2276		}
2277	    }
2278	  free (contents);
2279	}
2280    }
2281
2282  if (mach != 0 && mach != -1ul)
2283    {
2284      const bfd_arch_info_type *arch;
2285
2286      for (arch = abfd->arch_info->next; arch; arch = arch->next)
2287	if (arch->mach == mach)
2288	  {
2289	    abfd->arch_info = arch;
2290	    break;
2291	  }
2292    }
2293  return TRUE;
2294}
2295
2296/* Fix bad default arch selected for a 32 bit input bfd when the
2297   default is 64 bit.  Also select arch based on apuinfo.  */
2298
2299static bfd_boolean
2300ppc_elf_object_p (bfd *abfd)
2301{
2302  if (!abfd->arch_info->the_default)
2303    return TRUE;
2304
2305  if (abfd->arch_info->bits_per_word == 64)
2306    {
2307      Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2308
2309      if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
2310	{
2311	  /* Relies on arch after 64 bit default being 32 bit default.  */
2312	  abfd->arch_info = abfd->arch_info->next;
2313	  BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
2314	}
2315    }
2316  return _bfd_elf_ppc_set_arch (abfd);
2317}
2318
2319/* Function to set whether a module needs the -mrelocatable bit set.  */
2320
2321static bfd_boolean
2322ppc_elf_set_private_flags (bfd *abfd, flagword flags)
2323{
2324  BFD_ASSERT (!elf_flags_init (abfd)
2325	      || elf_elfheader (abfd)->e_flags == flags);
2326
2327  elf_elfheader (abfd)->e_flags = flags;
2328  elf_flags_init (abfd) = TRUE;
2329  return TRUE;
2330}
2331
2332/* Support for core dump NOTE sections.  */
2333
2334static bfd_boolean
2335ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2336{
2337  int offset;
2338  unsigned int size;
2339
2340  switch (note->descsz)
2341    {
2342    default:
2343      return FALSE;
2344
2345    case 268:		/* Linux/PPC.  */
2346      /* pr_cursig */
2347      elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2348
2349      /* pr_pid */
2350      elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
2351
2352      /* pr_reg */
2353      offset = 72;
2354      size = 192;
2355
2356      break;
2357    }
2358
2359  /* Make a ".reg/999" section.  */
2360  return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2361					  size, note->descpos + offset);
2362}
2363
2364static bfd_boolean
2365ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2366{
2367  switch (note->descsz)
2368    {
2369    default:
2370      return FALSE;
2371
2372    case 128:		/* Linux/PPC elf_prpsinfo.  */
2373      elf_tdata (abfd)->core->pid
2374	= bfd_get_32 (abfd, note->descdata + 16);
2375      elf_tdata (abfd)->core->program
2376	= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
2377      elf_tdata (abfd)->core->command
2378	= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
2379    }
2380
2381  /* Note that for some reason, a spurious space is tacked
2382     onto the end of the args in some (at least one anyway)
2383     implementations, so strip it off if it exists.  */
2384
2385  {
2386    char *command = elf_tdata (abfd)->core->command;
2387    int n = strlen (command);
2388
2389    if (0 < n && command[n - 1] == ' ')
2390      command[n - 1] = '\0';
2391  }
2392
2393  return TRUE;
2394}
2395
2396char *
2397elfcore_write_ppc_linux_prpsinfo32
2398  (bfd *abfd,
2399   char *buf,
2400   int *bufsiz,
2401   const struct elf_internal_linux_prpsinfo *prpsinfo)
2402{
2403  struct elf_external_ppc_linux_prpsinfo32 data;
2404
2405  swap_ppc_linux_prpsinfo32_out (abfd, prpsinfo, &data);
2406  return elfcore_write_note (abfd, buf, bufsiz,
2407			     "CORE", NT_PRPSINFO, &data, sizeof (data));
2408}
2409
2410static char *
2411ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
2412{
2413  switch (note_type)
2414    {
2415    default:
2416      return NULL;
2417
2418    case NT_PRPSINFO:
2419      {
2420	char data[128];
2421	va_list ap;
2422
2423	va_start (ap, note_type);
2424	memset (data, 0, sizeof (data));
2425	strncpy (data + 32, va_arg (ap, const char *), 16);
2426	strncpy (data + 48, va_arg (ap, const char *), 80);
2427	va_end (ap);
2428	return elfcore_write_note (abfd, buf, bufsiz,
2429				   "CORE", note_type, data, sizeof (data));
2430      }
2431
2432    case NT_PRSTATUS:
2433      {
2434	char data[268];
2435	va_list ap;
2436	long pid;
2437	int cursig;
2438	const void *greg;
2439
2440	va_start (ap, note_type);
2441	memset (data, 0, 72);
2442	pid = va_arg (ap, long);
2443	bfd_put_32 (abfd, pid, data + 24);
2444	cursig = va_arg (ap, int);
2445	bfd_put_16 (abfd, cursig, data + 12);
2446	greg = va_arg (ap, const void *);
2447	memcpy (data + 72, greg, 192);
2448	memset (data + 264, 0, 4);
2449	va_end (ap);
2450	return elfcore_write_note (abfd, buf, bufsiz,
2451				   "CORE", note_type, data, sizeof (data));
2452      }
2453    }
2454}
2455
2456static flagword
2457ppc_elf_lookup_section_flags (char *flag_name)
2458{
2459
2460  if (!strcmp (flag_name, "SHF_PPC_VLE"))
2461    return SHF_PPC_VLE;
2462
2463  return 0;
2464}
2465
2466/* Return address for Ith PLT stub in section PLT, for relocation REL
2467   or (bfd_vma) -1 if it should not be included.  */
2468
2469static bfd_vma
2470ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
2471		     const asection *plt ATTRIBUTE_UNUSED,
2472		     const arelent *rel)
2473{
2474  return rel->address;
2475}
2476
2477/* Handle a PowerPC specific section when reading an object file.  This
2478   is called when bfd_section_from_shdr finds a section with an unknown
2479   type.  */
2480
2481static bfd_boolean
2482ppc_elf_section_from_shdr (bfd *abfd,
2483			   Elf_Internal_Shdr *hdr,
2484			   const char *name,
2485			   int shindex)
2486{
2487  asection *newsect;
2488  flagword flags;
2489
2490  if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
2491    return FALSE;
2492
2493  newsect = hdr->bfd_section;
2494  flags = bfd_get_section_flags (abfd, newsect);
2495  if (hdr->sh_flags & SHF_EXCLUDE)
2496    flags |= SEC_EXCLUDE;
2497
2498  if (hdr->sh_type == SHT_ORDERED)
2499    flags |= SEC_SORT_ENTRIES;
2500
2501  bfd_set_section_flags (abfd, newsect, flags);
2502  return TRUE;
2503}
2504
2505/* Set up any other section flags and such that may be necessary.  */
2506
2507static bfd_boolean
2508ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
2509		       Elf_Internal_Shdr *shdr,
2510		       asection *asect)
2511{
2512  if ((asect->flags & SEC_SORT_ENTRIES) != 0)
2513    shdr->sh_type = SHT_ORDERED;
2514
2515  return TRUE;
2516}
2517
2518/* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
2519   need to bump up the number of section headers.  */
2520
2521static int
2522ppc_elf_additional_program_headers (bfd *abfd,
2523				    struct bfd_link_info *info ATTRIBUTE_UNUSED)
2524{
2525  asection *s;
2526  int ret = 0;
2527
2528  s = bfd_get_section_by_name (abfd, ".sbss2");
2529  if (s != NULL && (s->flags & SEC_ALLOC) != 0)
2530    ++ret;
2531
2532  s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
2533  if (s != NULL && (s->flags & SEC_ALLOC) != 0)
2534    ++ret;
2535
2536  return ret;
2537}
2538
2539/* Modify the segment map for VLE executables.  */
2540
2541bfd_boolean
2542ppc_elf_modify_segment_map (bfd *abfd,
2543			    struct bfd_link_info *info ATTRIBUTE_UNUSED)
2544{
2545  struct elf_segment_map *m;
2546
2547  /* At this point in the link, output sections have already been sorted by
2548     LMA and assigned to segments.  All that is left to do is to ensure
2549     there is no mixing of VLE & non-VLE sections in a text segment.
2550     If we find that case, we split the segment.
2551     We maintain the original output section order.  */
2552
2553  for (m = elf_seg_map (abfd); m != NULL; m = m->next)
2554    {
2555      struct elf_segment_map *n;
2556      bfd_size_type amt;
2557      unsigned int j, k;
2558      unsigned int p_flags;
2559
2560      if (m->p_type != PT_LOAD || m->count == 0)
2561	continue;
2562
2563      for (p_flags = PF_R, j = 0; j != m->count; ++j)
2564	{
2565	  if ((m->sections[j]->flags & SEC_READONLY) == 0)
2566	    p_flags |= PF_W;
2567	  if ((m->sections[j]->flags & SEC_CODE) != 0)
2568	    {
2569	      p_flags |= PF_X;
2570	      if ((elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0)
2571		p_flags |= PF_PPC_VLE;
2572	      break;
2573	    }
2574	}
2575      if (j != m->count)
2576	while (++j != m->count)
2577	  {
2578	    unsigned int p_flags1 = PF_R;
2579
2580	    if ((m->sections[j]->flags & SEC_READONLY) == 0)
2581	      p_flags1 |= PF_W;
2582	    if ((m->sections[j]->flags & SEC_CODE) != 0)
2583	      {
2584		p_flags1 |= PF_X;
2585		if ((elf_section_flags (m->sections[j]) & SHF_PPC_VLE) != 0)
2586		  p_flags1 |= PF_PPC_VLE;
2587		if (((p_flags1 ^ p_flags) & PF_PPC_VLE) != 0)
2588		  break;
2589	      }
2590	    p_flags |= p_flags1;
2591	  }
2592      /* If we're splitting a segment which originally contained rw
2593	 sections then those sections might now only be in one of the
2594	 two parts.  So always set p_flags if splitting, even if we
2595	 are being called for objcopy with p_flags_valid set.  */
2596      if (j != m->count || !m->p_flags_valid)
2597	{
2598	  m->p_flags_valid = 1;
2599	  m->p_flags = p_flags;
2600	}
2601      if (j == m->count)
2602	continue;
2603
2604      /* Sections 0..j-1 stay in this (current) segment,
2605	 the remainder are put in a new segment.
2606	 The scan resumes with the new segment.  */
2607
2608      amt = sizeof (struct elf_segment_map);
2609      amt += (m->count - j - 1) * sizeof (asection *);
2610      n = (struct elf_segment_map *) bfd_zalloc (abfd, amt);
2611      if (n == NULL)
2612        return FALSE;
2613
2614      n->p_type = PT_LOAD;
2615      n->count = m->count - j;
2616      for (k = 0; k < n->count; ++k)
2617	n->sections[k] = m->sections[j + k];
2618      m->count = j;
2619      m->p_size_valid = 0;
2620      n->next = m->next;
2621      m->next = n;
2622    }
2623
2624  return TRUE;
2625}
2626
2627/* Add extra PPC sections -- Note, for now, make .sbss2 and
2628   .PPC.EMB.sbss0 a normal section, and not a bss section so
2629   that the linker doesn't crater when trying to make more than
2630   2 sections.  */
2631
2632static const struct bfd_elf_special_section ppc_elf_special_sections[] =
2633{
2634  { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, SHF_ALLOC + SHF_EXECINSTR },
2635  { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2636  { STRING_COMMA_LEN (".sbss2"), -2, SHT_PROGBITS, SHF_ALLOC },
2637  { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2638  { STRING_COMMA_LEN (".sdata2"), -2, SHT_PROGBITS, SHF_ALLOC },
2639  { STRING_COMMA_LEN (".tags"), 0, SHT_ORDERED, SHF_ALLOC },
2640  { STRING_COMMA_LEN (APUINFO_SECTION_NAME), 0, SHT_NOTE, 0 },
2641  { STRING_COMMA_LEN (".PPC.EMB.sbss0"), 0, SHT_PROGBITS, SHF_ALLOC },
2642  { STRING_COMMA_LEN (".PPC.EMB.sdata0"), 0, SHT_PROGBITS, SHF_ALLOC },
2643  { NULL, 0, 0, 0, 0 }
2644};
2645
2646/* This is what we want for new plt/got.  */
2647static struct bfd_elf_special_section ppc_alt_plt =
2648  { STRING_COMMA_LEN (".plt"),             0, SHT_PROGBITS, SHF_ALLOC };
2649
2650static const struct bfd_elf_special_section *
2651ppc_elf_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2652{
2653  const struct bfd_elf_special_section *ssect;
2654
2655  /* See if this is one of the special sections.  */
2656  if (sec->name == NULL)
2657    return NULL;
2658
2659  ssect = _bfd_elf_get_special_section (sec->name, ppc_elf_special_sections,
2660					sec->use_rela_p);
2661  if (ssect != NULL)
2662    {
2663      if (ssect == ppc_elf_special_sections && (sec->flags & SEC_LOAD) != 0)
2664	ssect = &ppc_alt_plt;
2665      return ssect;
2666    }
2667
2668  return _bfd_elf_get_sec_type_attr (abfd, sec);
2669}
2670
2671/* Very simple linked list structure for recording apuinfo values.  */
2672typedef struct apuinfo_list
2673{
2674  struct apuinfo_list *next;
2675  unsigned long value;
2676}
2677apuinfo_list;
2678
2679static apuinfo_list *head;
2680static bfd_boolean apuinfo_set;
2681
2682static void
2683apuinfo_list_init (void)
2684{
2685  head = NULL;
2686  apuinfo_set = FALSE;
2687}
2688
2689static void
2690apuinfo_list_add (unsigned long value)
2691{
2692  apuinfo_list *entry = head;
2693
2694  while (entry != NULL)
2695    {
2696      if (entry->value == value)
2697	return;
2698      entry = entry->next;
2699    }
2700
2701  entry = bfd_malloc (sizeof (* entry));
2702  if (entry == NULL)
2703    return;
2704
2705  entry->value = value;
2706  entry->next  = head;
2707  head = entry;
2708}
2709
2710static unsigned
2711apuinfo_list_length (void)
2712{
2713  apuinfo_list *entry;
2714  unsigned long count;
2715
2716  for (entry = head, count = 0;
2717       entry;
2718       entry = entry->next)
2719    ++ count;
2720
2721  return count;
2722}
2723
2724static inline unsigned long
2725apuinfo_list_element (unsigned long number)
2726{
2727  apuinfo_list * entry;
2728
2729  for (entry = head;
2730       entry && number --;
2731       entry = entry->next)
2732    ;
2733
2734  return entry ? entry->value : 0;
2735}
2736
2737static void
2738apuinfo_list_finish (void)
2739{
2740  apuinfo_list *entry;
2741
2742  for (entry = head; entry;)
2743    {
2744      apuinfo_list *next = entry->next;
2745      free (entry);
2746      entry = next;
2747    }
2748
2749  head = NULL;
2750}
2751
2752/* Scan the input BFDs and create a linked list of
2753   the APUinfo values that will need to be emitted.  */
2754
2755static void
2756ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
2757{
2758  bfd *ibfd;
2759  asection *asec;
2760  char *buffer = NULL;
2761  bfd_size_type largest_input_size = 0;
2762  unsigned i;
2763  unsigned long length;
2764  const char *error_message = NULL;
2765
2766  if (link_info == NULL)
2767    return;
2768
2769  apuinfo_list_init ();
2770
2771  /* Read in the input sections contents.  */
2772  for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link.next)
2773    {
2774      unsigned long datum;
2775
2776      asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
2777      if (asec == NULL)
2778	continue;
2779
2780      /* xgettext:c-format */
2781      error_message = _("corrupt %s section in %B");
2782      length = asec->size;
2783      if (length < 20)
2784	goto fail;
2785
2786      apuinfo_set = TRUE;
2787      if (largest_input_size < asec->size)
2788	{
2789	  if (buffer)
2790	    free (buffer);
2791	  largest_input_size = asec->size;
2792	  buffer = bfd_malloc (largest_input_size);
2793	  if (!buffer)
2794	    return;
2795	}
2796
2797      if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
2798	  || (bfd_bread (buffer, length, ibfd) != length))
2799	{
2800	  /* xgettext:c-format */
2801	  error_message = _("unable to read in %s section from %B");
2802	  goto fail;
2803	}
2804
2805      /* Verify the contents of the header.  Note - we have to
2806	 extract the values this way in order to allow for a
2807	 host whose endian-ness is different from the target.  */
2808      datum = bfd_get_32 (ibfd, buffer);
2809      if (datum != sizeof APUINFO_LABEL)
2810	goto fail;
2811
2812      datum = bfd_get_32 (ibfd, buffer + 8);
2813      if (datum != 0x2)
2814	goto fail;
2815
2816      if (strcmp (buffer + 12, APUINFO_LABEL) != 0)
2817	goto fail;
2818
2819      /* Get the number of bytes used for apuinfo entries.  */
2820      datum = bfd_get_32 (ibfd, buffer + 4);
2821      if (datum + 20 != length)
2822	goto fail;
2823
2824      /* Scan the apuinfo section, building a list of apuinfo numbers.  */
2825      for (i = 0; i < datum; i += 4)
2826	apuinfo_list_add (bfd_get_32 (ibfd, buffer + 20 + i));
2827    }
2828
2829  error_message = NULL;
2830
2831  if (apuinfo_set)
2832    {
2833      /* Compute the size of the output section.  */
2834      unsigned num_entries = apuinfo_list_length ();
2835
2836      /* Set the output section size, if it exists.  */
2837      asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2838
2839      if (asec && ! bfd_set_section_size (abfd, asec, 20 + num_entries * 4))
2840	{
2841	  ibfd = abfd;
2842	  /* xgettext:c-format */
2843	  error_message = _("warning: unable to set size of %s section in %B");
2844	}
2845    }
2846
2847 fail:
2848  if (buffer)
2849    free (buffer);
2850
2851  if (error_message)
2852    _bfd_error_handler (error_message, ibfd, APUINFO_SECTION_NAME);
2853}
2854
2855/* Prevent the output section from accumulating the input sections'
2856   contents.  We have already stored this in our linked list structure.  */
2857
2858static bfd_boolean
2859ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
2860		       struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2861		       asection *asec,
2862		       bfd_byte *contents ATTRIBUTE_UNUSED)
2863{
2864  return apuinfo_set && strcmp (asec->name, APUINFO_SECTION_NAME) == 0;
2865}
2866
2867/* Finally we can generate the output section.  */
2868
2869static void
2870ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
2871{
2872  bfd_byte *buffer;
2873  asection *asec;
2874  unsigned i;
2875  unsigned num_entries;
2876  bfd_size_type length;
2877
2878  asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2879  if (asec == NULL)
2880    return;
2881
2882  if (!apuinfo_set)
2883    return;
2884
2885  length = asec->size;
2886  if (length < 20)
2887    return;
2888
2889  buffer = bfd_malloc (length);
2890  if (buffer == NULL)
2891    {
2892      _bfd_error_handler
2893	(_("failed to allocate space for new APUinfo section."));
2894      return;
2895    }
2896
2897  /* Create the apuinfo header.  */
2898  num_entries = apuinfo_list_length ();
2899  bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2900  bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2901  bfd_put_32 (abfd, 0x2, buffer + 8);
2902  strcpy ((char *) buffer + 12, APUINFO_LABEL);
2903
2904  length = 20;
2905  for (i = 0; i < num_entries; i++)
2906    {
2907      bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2908      length += 4;
2909    }
2910
2911  if (length != asec->size)
2912    _bfd_error_handler (_("failed to compute new APUinfo section."));
2913
2914  if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2915    _bfd_error_handler (_("failed to install new APUinfo section."));
2916
2917  free (buffer);
2918
2919  apuinfo_list_finish ();
2920}
2921
2922static bfd_boolean
2923is_nonpic_glink_stub (bfd *abfd, asection *glink, bfd_vma off)
2924{
2925  bfd_byte buf[GLINK_ENTRY_SIZE];
2926
2927  if (!bfd_get_section_contents (abfd, glink, buf, off, GLINK_ENTRY_SIZE))
2928    return FALSE;
2929
2930  return ((bfd_get_32 (abfd, buf + 0) & 0xffff0000) == LIS_11
2931	  && (bfd_get_32 (abfd, buf + 4) & 0xffff0000) == LWZ_11_11
2932	  && bfd_get_32 (abfd, buf + 8) == MTCTR_11
2933	  && bfd_get_32 (abfd, buf + 12) == BCTR);
2934}
2935
2936static bfd_boolean
2937section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
2938{
2939  bfd_vma vma = *(bfd_vma *) ptr;
2940  return ((section->flags & SEC_ALLOC) != 0
2941	  && section->vma <= vma
2942	  && vma < section->vma + section->size);
2943}
2944
2945static long
2946ppc_elf_get_synthetic_symtab (bfd *abfd, long symcount, asymbol **syms,
2947			      long dynsymcount, asymbol **dynsyms,
2948			      asymbol **ret)
2949{
2950  bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2951  asection *plt, *relplt, *dynamic, *glink;
2952  bfd_vma glink_vma = 0;
2953  bfd_vma resolv_vma = 0;
2954  bfd_vma stub_vma;
2955  asymbol *s;
2956  arelent *p;
2957  long count, i;
2958  size_t size;
2959  char *names;
2960  bfd_byte buf[4];
2961
2962  *ret = NULL;
2963
2964  if ((abfd->flags & (DYNAMIC | EXEC_P)) == 0)
2965    return 0;
2966
2967  if (dynsymcount <= 0)
2968    return 0;
2969
2970  relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2971  if (relplt == NULL)
2972    return 0;
2973
2974  plt = bfd_get_section_by_name (abfd, ".plt");
2975  if (plt == NULL)
2976    return 0;
2977
2978  /* Call common code to handle old-style executable PLTs.  */
2979  if (elf_section_flags (plt) & SHF_EXECINSTR)
2980    return _bfd_elf_get_synthetic_symtab (abfd, symcount, syms,
2981					  dynsymcount, dynsyms, ret);
2982
2983  /* If this object was prelinked, the prelinker stored the address
2984     of .glink at got[1].  If it wasn't prelinked, got[1] will be zero.  */
2985  dynamic = bfd_get_section_by_name (abfd, ".dynamic");
2986  if (dynamic != NULL)
2987    {
2988      bfd_byte *dynbuf, *extdyn, *extdynend;
2989      size_t extdynsize;
2990      void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
2991
2992      if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
2993	return -1;
2994
2995      extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
2996      swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
2997
2998      extdyn = dynbuf;
2999      extdynend = extdyn + dynamic->size;
3000      for (; extdyn < extdynend; extdyn += extdynsize)
3001	{
3002	  Elf_Internal_Dyn dyn;
3003	  (*swap_dyn_in) (abfd, extdyn, &dyn);
3004
3005	  if (dyn.d_tag == DT_NULL)
3006	    break;
3007
3008	  if (dyn.d_tag == DT_PPC_GOT)
3009	    {
3010	      unsigned int g_o_t = dyn.d_un.d_val;
3011	      asection *got = bfd_get_section_by_name (abfd, ".got");
3012	      if (got != NULL
3013		  && bfd_get_section_contents (abfd, got, buf,
3014					       g_o_t - got->vma + 4, 4))
3015		glink_vma = bfd_get_32 (abfd, buf);
3016	      break;
3017	    }
3018	}
3019      free (dynbuf);
3020    }
3021
3022  /* Otherwise we read the first plt entry.  */
3023  if (glink_vma == 0)
3024    {
3025      if (bfd_get_section_contents (abfd, plt, buf, 0, 4))
3026	glink_vma = bfd_get_32 (abfd, buf);
3027    }
3028
3029  if (glink_vma == 0)
3030    return 0;
3031
3032  /* The .glink section usually does not survive the final
3033     link; search for the section (usually .text) where the
3034     glink stubs now reside.  */
3035  glink = bfd_sections_find_if (abfd, section_covers_vma, &glink_vma);
3036  if (glink == NULL)
3037    return 0;
3038
3039  /* Determine glink PLT resolver by reading the relative branch
3040     from the first glink stub.  */
3041  if (bfd_get_section_contents (abfd, glink, buf,
3042				glink_vma - glink->vma, 4))
3043    {
3044      unsigned int insn = bfd_get_32 (abfd, buf);
3045
3046      /* The first glink stub may either branch to the resolver ...  */
3047      insn ^= B;
3048      if ((insn & ~0x3fffffc) == 0)
3049	resolv_vma = glink_vma + (insn ^ 0x2000000) - 0x2000000;
3050
3051      /* ... or fall through a bunch of NOPs.  */
3052      else if ((insn ^ B ^ NOP) == 0)
3053	for (i = 4;
3054	     bfd_get_section_contents (abfd, glink, buf,
3055				       glink_vma - glink->vma + i, 4);
3056	     i += 4)
3057	  if (bfd_get_32 (abfd, buf) != NOP)
3058	    {
3059	      resolv_vma = glink_vma + i;
3060	      break;
3061	    }
3062    }
3063
3064  count = relplt->size / sizeof (Elf32_External_Rela);
3065  /* If the stubs are those for -shared/-pie then we might have
3066     multiple stubs for each plt entry.  If that is the case then
3067     there is no way to associate stubs with their plt entries short
3068     of figuring out the GOT pointer value used in the stub.  */
3069  if (!is_nonpic_glink_stub (abfd, glink,
3070			     glink_vma - GLINK_ENTRY_SIZE - glink->vma))
3071    return 0;
3072
3073  slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3074  if (! (*slurp_relocs) (abfd, relplt, dynsyms, TRUE))
3075    return -1;
3076
3077  size = count * sizeof (asymbol);
3078  p = relplt->relocation;
3079  for (i = 0; i < count; i++, p++)
3080    {
3081      size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3082      if (p->addend != 0)
3083	size += sizeof ("+0x") - 1 + 8;
3084    }
3085
3086  size += sizeof (asymbol) + sizeof ("__glink");
3087
3088  if (resolv_vma)
3089    size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3090
3091  s = *ret = bfd_malloc (size);
3092  if (s == NULL)
3093    return -1;
3094
3095  stub_vma = glink_vma;
3096  names = (char *) (s + count + 1 + (resolv_vma != 0));
3097  p = relplt->relocation + count - 1;
3098  for (i = 0; i < count; i++)
3099    {
3100      size_t len;
3101
3102      *s = **p->sym_ptr_ptr;
3103      /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set.  Since
3104	 we are defining a symbol, ensure one of them is set.  */
3105      if ((s->flags & BSF_LOCAL) == 0)
3106	s->flags |= BSF_GLOBAL;
3107      s->flags |= BSF_SYNTHETIC;
3108      s->section = glink;
3109      stub_vma -= 16;
3110      if (strcmp ((*p->sym_ptr_ptr)->name, "__tls_get_addr_opt") == 0)
3111	stub_vma -= 32;
3112      s->value = stub_vma - glink->vma;
3113      s->name = names;
3114      s->udata.p = NULL;
3115      len = strlen ((*p->sym_ptr_ptr)->name);
3116      memcpy (names, (*p->sym_ptr_ptr)->name, len);
3117      names += len;
3118      if (p->addend != 0)
3119	{
3120	  memcpy (names, "+0x", sizeof ("+0x") - 1);
3121	  names += sizeof ("+0x") - 1;
3122	  bfd_sprintf_vma (abfd, names, p->addend);
3123	  names += strlen (names);
3124	}
3125      memcpy (names, "@plt", sizeof ("@plt"));
3126      names += sizeof ("@plt");
3127      ++s;
3128      --p;
3129    }
3130
3131  /* Add a symbol at the start of the glink branch table.  */
3132  memset (s, 0, sizeof *s);
3133  s->the_bfd = abfd;
3134  s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3135  s->section = glink;
3136  s->value = glink_vma - glink->vma;
3137  s->name = names;
3138  memcpy (names, "__glink", sizeof ("__glink"));
3139  names += sizeof ("__glink");
3140  s++;
3141  count++;
3142
3143  if (resolv_vma)
3144    {
3145      /* Add a symbol for the glink PLT resolver.  */
3146      memset (s, 0, sizeof *s);
3147      s->the_bfd = abfd;
3148      s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3149      s->section = glink;
3150      s->value = resolv_vma - glink->vma;
3151      s->name = names;
3152      memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3153      names += sizeof ("__glink_PLTresolve");
3154      s++;
3155      count++;
3156    }
3157
3158  return count;
3159}
3160
3161/* The following functions are specific to the ELF linker, while
3162   functions above are used generally.  They appear in this file more
3163   or less in the order in which they are called.  eg.
3164   ppc_elf_check_relocs is called early in the link process,
3165   ppc_elf_finish_dynamic_sections is one of the last functions
3166   called.  */
3167
3168/* Track PLT entries needed for a given symbol.  We might need more
3169   than one glink entry per symbol when generating a pic binary.  */
3170struct plt_entry
3171{
3172  struct plt_entry *next;
3173
3174  /* -fPIC uses multiple GOT sections, one per file, called ".got2".
3175     This field stores the offset into .got2 used to initialise the
3176     GOT pointer reg.  It will always be at least 32768.  (Current
3177     gcc always uses an offset of 32768, but ld -r will pack .got2
3178     sections together resulting in larger offsets).  */
3179  bfd_vma addend;
3180
3181  /* The .got2 section.  */
3182  asection *sec;
3183
3184  /* PLT refcount or offset.  */
3185  union
3186    {
3187      bfd_signed_vma refcount;
3188      bfd_vma offset;
3189    } plt;
3190
3191  /* .glink stub offset.  */
3192  bfd_vma glink_offset;
3193};
3194
3195/* Of those relocs that might be copied as dynamic relocs, this function
3196   selects those that must be copied when linking a shared library,
3197   even when the symbol is local.  */
3198
3199static int
3200must_be_dyn_reloc (struct bfd_link_info *info,
3201		   enum elf_ppc_reloc_type r_type)
3202{
3203  switch (r_type)
3204    {
3205    default:
3206      return 1;
3207
3208    case R_PPC_REL24:
3209    case R_PPC_REL14:
3210    case R_PPC_REL14_BRTAKEN:
3211    case R_PPC_REL14_BRNTAKEN:
3212    case R_PPC_REL32:
3213      return 0;
3214
3215    case R_PPC_TPREL32:
3216    case R_PPC_TPREL16:
3217    case R_PPC_TPREL16_LO:
3218    case R_PPC_TPREL16_HI:
3219    case R_PPC_TPREL16_HA:
3220      return !bfd_link_executable (info);
3221    }
3222}
3223
3224/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3225   copying dynamic variables from a shared lib into an app's dynbss
3226   section, and instead use a dynamic relocation to point into the
3227   shared lib.  */
3228#define ELIMINATE_COPY_RELOCS 1
3229
3230/* Used to track dynamic relocations for local symbols.  */
3231struct ppc_dyn_relocs
3232{
3233  struct ppc_dyn_relocs *next;
3234
3235  /* The input section of the reloc.  */
3236  asection *sec;
3237
3238  /* Total number of relocs copied for the input section.  */
3239  unsigned int count : 31;
3240
3241  /* Whether this entry is for STT_GNU_IFUNC symbols.  */
3242  unsigned int ifunc : 1;
3243};
3244
3245/* PPC ELF linker hash entry.  */
3246
3247struct ppc_elf_link_hash_entry
3248{
3249  struct elf_link_hash_entry elf;
3250
3251  /* If this symbol is used in the linker created sections, the processor
3252     specific backend uses this field to map the field into the offset
3253     from the beginning of the section.  */
3254  elf_linker_section_pointers_t *linker_section_pointer;
3255
3256  /* Track dynamic relocs copied for this symbol.  */
3257  struct elf_dyn_relocs *dyn_relocs;
3258
3259  /* Contexts in which symbol is used in the GOT (or TOC).
3260     TLS_GD .. TLS_TLS bits are or'd into the mask as the
3261     corresponding relocs are encountered during check_relocs.
3262     tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3263     indicate the corresponding GOT entry type is not needed.  */
3264#define TLS_GD		 1	/* GD reloc. */
3265#define TLS_LD		 2	/* LD reloc. */
3266#define TLS_TPREL	 4	/* TPREL reloc, => IE. */
3267#define TLS_DTPREL	 8	/* DTPREL reloc, => LD. */
3268#define TLS_TLS		16	/* Any TLS reloc.  */
3269#define TLS_TPRELGD	32	/* TPREL reloc resulting from GD->IE. */
3270#define PLT_IFUNC	64	/* STT_GNU_IFUNC.  */
3271  char tls_mask;
3272
3273  /* Nonzero if we have seen a small data relocation referring to this
3274     symbol.  */
3275  unsigned char has_sda_refs : 1;
3276
3277  /* Flag use of given relocations.  */
3278  unsigned char has_addr16_ha : 1;
3279  unsigned char has_addr16_lo : 1;
3280};
3281
3282#define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
3283
3284/* PPC ELF linker hash table.  */
3285
3286struct ppc_elf_link_hash_table
3287{
3288  struct elf_link_hash_table elf;
3289
3290  /* Various options passed from the linker.  */
3291  struct ppc_elf_params *params;
3292
3293  /* Short-cuts to get to dynamic linker sections.  */
3294  asection *glink;
3295  asection *dynsbss;
3296  asection *relsbss;
3297  elf_linker_section_t sdata[2];
3298  asection *sbss;
3299  asection *glink_eh_frame;
3300
3301  /* The (unloaded but important) .rela.plt.unloaded on VxWorks.  */
3302  asection *srelplt2;
3303
3304  /* Shortcut to __tls_get_addr.  */
3305  struct elf_link_hash_entry *tls_get_addr;
3306
3307  /* The bfd that forced an old-style PLT.  */
3308  bfd *old_bfd;
3309
3310  /* TLS local dynamic got entry handling.  */
3311  union {
3312    bfd_signed_vma refcount;
3313    bfd_vma offset;
3314  } tlsld_got;
3315
3316  /* Offset of branch table to PltResolve function in glink.  */
3317  bfd_vma glink_pltresolve;
3318
3319  /* Size of reserved GOT entries.  */
3320  unsigned int got_header_size;
3321  /* Non-zero if allocating the header left a gap.  */
3322  unsigned int got_gap;
3323
3324  /* The type of PLT we have chosen to use.  */
3325  enum ppc_elf_plt_type plt_type;
3326
3327  /* True if the target system is VxWorks.  */
3328  unsigned int is_vxworks:1;
3329
3330  /* The size of PLT entries.  */
3331  int plt_entry_size;
3332  /* The distance between adjacent PLT slots.  */
3333  int plt_slot_size;
3334  /* The size of the first PLT entry.  */
3335  int plt_initial_entry_size;
3336
3337  /* Small local sym cache.  */
3338  struct sym_cache sym_cache;
3339};
3340
3341/* Rename some of the generic section flags to better document how they
3342   are used for ppc32.  The flags are only valid for ppc32 elf objects.  */
3343
3344/* Nonzero if this section has TLS related relocations.  */
3345#define has_tls_reloc sec_flg0
3346
3347/* Nonzero if this section has a call to __tls_get_addr.  */
3348#define has_tls_get_addr_call sec_flg1
3349
3350/* Get the PPC ELF linker hash table from a link_info structure.  */
3351
3352#define ppc_elf_hash_table(p) \
3353  (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3354  == PPC32_ELF_DATA ? ((struct ppc_elf_link_hash_table *) ((p)->hash)) : NULL)
3355
3356/* Create an entry in a PPC ELF linker hash table.  */
3357
3358static struct bfd_hash_entry *
3359ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
3360			   struct bfd_hash_table *table,
3361			   const char *string)
3362{
3363  /* Allocate the structure if it has not already been allocated by a
3364     subclass.  */
3365  if (entry == NULL)
3366    {
3367      entry = bfd_hash_allocate (table,
3368				 sizeof (struct ppc_elf_link_hash_entry));
3369      if (entry == NULL)
3370	return entry;
3371    }
3372
3373  /* Call the allocation method of the superclass.  */
3374  entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3375  if (entry != NULL)
3376    {
3377      ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
3378      ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
3379      ppc_elf_hash_entry (entry)->tls_mask = 0;
3380      ppc_elf_hash_entry (entry)->has_sda_refs = 0;
3381    }
3382
3383  return entry;
3384}
3385
3386/* Create a PPC ELF linker hash table.  */
3387
3388static struct bfd_link_hash_table *
3389ppc_elf_link_hash_table_create (bfd *abfd)
3390{
3391  struct ppc_elf_link_hash_table *ret;
3392  static struct ppc_elf_params default_params
3393    = { PLT_OLD, 0, 1, 0, 0, 12, 0, 0, 0 };
3394
3395  ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
3396  if (ret == NULL)
3397    return NULL;
3398
3399  if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
3400				      ppc_elf_link_hash_newfunc,
3401				      sizeof (struct ppc_elf_link_hash_entry),
3402				      PPC32_ELF_DATA))
3403    {
3404      free (ret);
3405      return NULL;
3406    }
3407
3408  ret->elf.init_plt_refcount.refcount = 0;
3409  ret->elf.init_plt_refcount.glist = NULL;
3410  ret->elf.init_plt_offset.offset = 0;
3411  ret->elf.init_plt_offset.glist = NULL;
3412
3413  ret->params = &default_params;
3414
3415  ret->sdata[0].name = ".sdata";
3416  ret->sdata[0].sym_name = "_SDA_BASE_";
3417  ret->sdata[0].bss_name = ".sbss";
3418
3419  ret->sdata[1].name = ".sdata2";
3420  ret->sdata[1].sym_name = "_SDA2_BASE_";
3421  ret->sdata[1].bss_name = ".sbss2";
3422
3423  ret->plt_entry_size = 12;
3424  ret->plt_slot_size = 8;
3425  ret->plt_initial_entry_size = 72;
3426
3427  return &ret->elf.root;
3428}
3429
3430/* Hook linker params into hash table.  */
3431
3432void
3433ppc_elf_link_params (struct bfd_link_info *info, struct ppc_elf_params *params)
3434{
3435  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
3436
3437  if (htab)
3438    htab->params = params;
3439  params->pagesize_p2 = bfd_log2 (params->pagesize);
3440}
3441
3442/* Create .got and the related sections.  */
3443
3444static bfd_boolean
3445ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
3446{
3447  struct ppc_elf_link_hash_table *htab;
3448
3449  if (!_bfd_elf_create_got_section (abfd, info))
3450    return FALSE;
3451
3452  htab = ppc_elf_hash_table (info);
3453  if (!htab->is_vxworks)
3454    {
3455      /* The powerpc .got has a blrl instruction in it.  Mark it
3456	 executable.  */
3457      flagword flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
3458			| SEC_IN_MEMORY | SEC_LINKER_CREATED);
3459      if (!bfd_set_section_flags (abfd, htab->elf.sgot, flags))
3460	return FALSE;
3461    }
3462
3463  return TRUE;
3464}
3465
3466/* Create a special linker section, used for R_PPC_EMB_SDAI16 and
3467   R_PPC_EMB_SDA2I16 pointers.  These sections become part of .sdata
3468   and .sdata2.  Create _SDA_BASE_ and _SDA2_BASE too.  */
3469
3470static bfd_boolean
3471ppc_elf_create_linker_section (bfd *abfd,
3472			       struct bfd_link_info *info,
3473			       flagword flags,
3474			       elf_linker_section_t *lsect)
3475{
3476  asection *s;
3477
3478  flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3479	    | SEC_LINKER_CREATED);
3480
3481  s = bfd_make_section_anyway_with_flags (abfd, lsect->name, flags);
3482  if (s == NULL)
3483    return FALSE;
3484  lsect->section = s;
3485
3486  /* Define the sym on the first section of this name.  */
3487  s = bfd_get_section_by_name (abfd, lsect->name);
3488
3489  lsect->sym = _bfd_elf_define_linkage_sym (abfd, info, s, lsect->sym_name);
3490  if (lsect->sym == NULL)
3491    return FALSE;
3492  lsect->sym->root.u.def.value = 0x8000;
3493  return TRUE;
3494}
3495
3496static bfd_boolean
3497ppc_elf_create_glink (bfd *abfd, struct bfd_link_info *info)
3498{
3499  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
3500  asection *s;
3501  flagword flags;
3502
3503  flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY | SEC_HAS_CONTENTS
3504	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3505  s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags);
3506  htab->glink = s;
3507  if (s == NULL
3508      || !bfd_set_section_alignment (abfd, s,
3509				     htab->params->ppc476_workaround ? 6 : 4))
3510    return FALSE;
3511
3512  if (!info->no_ld_generated_unwind_info)
3513    {
3514      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3515	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3516      s = bfd_make_section_anyway_with_flags (abfd, ".eh_frame", flags);
3517      htab->glink_eh_frame = s;
3518      if (s == NULL
3519	  || !bfd_set_section_alignment (abfd, s, 2))
3520	return FALSE;
3521    }
3522
3523  flags = SEC_ALLOC | SEC_LINKER_CREATED;
3524  s = bfd_make_section_anyway_with_flags (abfd, ".iplt", flags);
3525  htab->elf.iplt = s;
3526  if (s == NULL
3527      || !bfd_set_section_alignment (abfd, s, 4))
3528    return FALSE;
3529
3530  flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3531	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3532  s = bfd_make_section_anyway_with_flags (abfd, ".rela.iplt", flags);
3533  htab->elf.irelplt = s;
3534  if (s == NULL
3535      || ! bfd_set_section_alignment (abfd, s, 2))
3536    return FALSE;
3537
3538  if (!ppc_elf_create_linker_section (abfd, info, 0,
3539				      &htab->sdata[0]))
3540    return FALSE;
3541
3542  if (!ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
3543				      &htab->sdata[1]))
3544    return FALSE;
3545
3546  return TRUE;
3547}
3548
3549/* We have to create .dynsbss and .rela.sbss here so that they get mapped
3550   to output sections (just like _bfd_elf_create_dynamic_sections has
3551   to create .dynbss and .rela.bss).  */
3552
3553static bfd_boolean
3554ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
3555{
3556  struct ppc_elf_link_hash_table *htab;
3557  asection *s;
3558  flagword flags;
3559
3560  htab = ppc_elf_hash_table (info);
3561
3562  if (htab->elf.sgot == NULL
3563      && !ppc_elf_create_got (abfd, info))
3564    return FALSE;
3565
3566  if (!_bfd_elf_create_dynamic_sections (abfd, info))
3567    return FALSE;
3568
3569  if (htab->glink == NULL
3570      && !ppc_elf_create_glink (abfd, info))
3571    return FALSE;
3572
3573  s = bfd_make_section_anyway_with_flags (abfd, ".dynsbss",
3574					  SEC_ALLOC | SEC_LINKER_CREATED);
3575  htab->dynsbss = s;
3576  if (s == NULL)
3577    return FALSE;
3578
3579  if (! bfd_link_pic (info))
3580    {
3581      flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
3582	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3583      s = bfd_make_section_anyway_with_flags (abfd, ".rela.sbss", flags);
3584      htab->relsbss = s;
3585      if (s == NULL
3586	  || ! bfd_set_section_alignment (abfd, s, 2))
3587	return FALSE;
3588    }
3589
3590  if (htab->is_vxworks
3591      && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
3592    return FALSE;
3593
3594  s = htab->elf.splt;
3595  flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
3596  if (htab->plt_type == PLT_VXWORKS)
3597    /* The VxWorks PLT is a loaded section with contents.  */
3598    flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
3599  return bfd_set_section_flags (abfd, s, flags);
3600}
3601
3602/* Copy the extra info we tack onto an elf_link_hash_entry.  */
3603
3604static void
3605ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
3606			      struct elf_link_hash_entry *dir,
3607			      struct elf_link_hash_entry *ind)
3608{
3609  struct ppc_elf_link_hash_entry *edir, *eind;
3610
3611  edir = (struct ppc_elf_link_hash_entry *) dir;
3612  eind = (struct ppc_elf_link_hash_entry *) ind;
3613
3614  edir->tls_mask |= eind->tls_mask;
3615  edir->has_sda_refs |= eind->has_sda_refs;
3616
3617  /* If called to transfer flags for a weakdef during processing
3618     of elf_adjust_dynamic_symbol, don't copy non_got_ref.
3619     We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3620  if (!(ELIMINATE_COPY_RELOCS
3621	&& eind->elf.root.type != bfd_link_hash_indirect
3622	&& edir->elf.dynamic_adjusted))
3623    edir->elf.non_got_ref |= eind->elf.non_got_ref;
3624
3625  if (edir->elf.versioned != versioned_hidden)
3626    edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3627  edir->elf.ref_regular |= eind->elf.ref_regular;
3628  edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
3629  edir->elf.needs_plt |= eind->elf.needs_plt;
3630  edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
3631
3632  if (eind->dyn_relocs != NULL)
3633    {
3634      if (edir->dyn_relocs != NULL)
3635	{
3636	  struct elf_dyn_relocs **pp;
3637	  struct elf_dyn_relocs *p;
3638
3639	  /* Add reloc counts against the indirect sym to the direct sym
3640	     list.  Merge any entries against the same section.  */
3641	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3642	    {
3643	      struct elf_dyn_relocs *q;
3644
3645	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
3646		if (q->sec == p->sec)
3647		  {
3648		    q->pc_count += p->pc_count;
3649		    q->count += p->count;
3650		    *pp = p->next;
3651		    break;
3652		  }
3653	      if (q == NULL)
3654		pp = &p->next;
3655	    }
3656	  *pp = edir->dyn_relocs;
3657	}
3658
3659      edir->dyn_relocs = eind->dyn_relocs;
3660      eind->dyn_relocs = NULL;
3661    }
3662
3663  /* If we were called to copy over info for a weak sym, that's all.
3664     You might think dyn_relocs need not be copied over;  After all,
3665     both syms will be dynamic or both non-dynamic so we're just
3666     moving reloc accounting around.  However, ELIMINATE_COPY_RELOCS
3667     code in ppc_elf_adjust_dynamic_symbol needs to check for
3668     dyn_relocs in read-only sections, and it does so on what is the
3669     DIR sym here.  */
3670  if (eind->elf.root.type != bfd_link_hash_indirect)
3671    return;
3672
3673  /* Copy over the GOT refcount entries that we may have already seen to
3674     the symbol which just became indirect.  */
3675  edir->elf.got.refcount += eind->elf.got.refcount;
3676  eind->elf.got.refcount = 0;
3677
3678  /* And plt entries.  */
3679  if (eind->elf.plt.plist != NULL)
3680    {
3681      if (edir->elf.plt.plist != NULL)
3682	{
3683	  struct plt_entry **entp;
3684	  struct plt_entry *ent;
3685
3686	  for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3687	    {
3688	      struct plt_entry *dent;
3689
3690	      for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3691		if (dent->sec == ent->sec && dent->addend == ent->addend)
3692		  {
3693		    dent->plt.refcount += ent->plt.refcount;
3694		    *entp = ent->next;
3695		    break;
3696		  }
3697	      if (dent == NULL)
3698		entp = &ent->next;
3699	    }
3700	  *entp = edir->elf.plt.plist;
3701	}
3702
3703      edir->elf.plt.plist = eind->elf.plt.plist;
3704      eind->elf.plt.plist = NULL;
3705    }
3706
3707  if (eind->elf.dynindx != -1)
3708    {
3709      if (edir->elf.dynindx != -1)
3710	_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
3711				edir->elf.dynstr_index);
3712      edir->elf.dynindx = eind->elf.dynindx;
3713      edir->elf.dynstr_index = eind->elf.dynstr_index;
3714      eind->elf.dynindx = -1;
3715      eind->elf.dynstr_index = 0;
3716    }
3717}
3718
3719/* Hook called by the linker routine which adds symbols from an object
3720   file.  We use it to put .comm items in .sbss, and not .bss.  */
3721
3722static bfd_boolean
3723ppc_elf_add_symbol_hook (bfd *abfd,
3724			 struct bfd_link_info *info,
3725			 Elf_Internal_Sym *sym,
3726			 const char **namep ATTRIBUTE_UNUSED,
3727			 flagword *flagsp ATTRIBUTE_UNUSED,
3728			 asection **secp,
3729			 bfd_vma *valp)
3730{
3731  if (sym->st_shndx == SHN_COMMON
3732      && !bfd_link_relocatable (info)
3733      && is_ppc_elf (info->output_bfd)
3734      && sym->st_size <= elf_gp_size (abfd))
3735    {
3736      /* Common symbols less than or equal to -G nn bytes are automatically
3737	 put into .sbss.  */
3738      struct ppc_elf_link_hash_table *htab;
3739
3740      htab = ppc_elf_hash_table (info);
3741      if (htab->sbss == NULL)
3742	{
3743	  flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
3744
3745	  if (!htab->elf.dynobj)
3746	    htab->elf.dynobj = abfd;
3747
3748	  htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
3749							   ".sbss",
3750							   flags);
3751	  if (htab->sbss == NULL)
3752	    return FALSE;
3753	}
3754
3755      *secp = htab->sbss;
3756      *valp = sym->st_size;
3757    }
3758
3759  if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC
3760      && (abfd->flags & DYNAMIC) == 0
3761      && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
3762    elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
3763
3764  return TRUE;
3765}
3766
3767/* Find a linker generated pointer with a given addend and type.  */
3768
3769static elf_linker_section_pointers_t *
3770elf_find_pointer_linker_section
3771  (elf_linker_section_pointers_t *linker_pointers,
3772   bfd_vma addend,
3773   elf_linker_section_t *lsect)
3774{
3775  for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
3776    if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
3777      return linker_pointers;
3778
3779  return NULL;
3780}
3781
3782/* Allocate a pointer to live in a linker created section.  */
3783
3784static bfd_boolean
3785elf_allocate_pointer_linker_section (bfd *abfd,
3786				     elf_linker_section_t *lsect,
3787				     struct elf_link_hash_entry *h,
3788				     const Elf_Internal_Rela *rel)
3789{
3790  elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
3791  elf_linker_section_pointers_t *linker_section_ptr;
3792  unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
3793  bfd_size_type amt;
3794
3795  BFD_ASSERT (lsect != NULL);
3796
3797  /* Is this a global symbol?  */
3798  if (h != NULL)
3799    {
3800      struct ppc_elf_link_hash_entry *eh;
3801
3802      /* Has this symbol already been allocated?  If so, our work is done.  */
3803      eh = (struct ppc_elf_link_hash_entry *) h;
3804      if (elf_find_pointer_linker_section (eh->linker_section_pointer,
3805					   rel->r_addend,
3806					   lsect))
3807	return TRUE;
3808
3809      ptr_linker_section_ptr = &eh->linker_section_pointer;
3810    }
3811  else
3812    {
3813      BFD_ASSERT (is_ppc_elf (abfd));
3814
3815      /* Allocation of a pointer to a local symbol.  */
3816      elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
3817
3818      /* Allocate a table to hold the local symbols if first time.  */
3819      if (!ptr)
3820	{
3821	  unsigned int num_symbols = elf_symtab_hdr (abfd).sh_info;
3822
3823	  amt = num_symbols;
3824	  amt *= sizeof (elf_linker_section_pointers_t *);
3825	  ptr = bfd_zalloc (abfd, amt);
3826
3827	  if (!ptr)
3828	    return FALSE;
3829
3830	  elf_local_ptr_offsets (abfd) = ptr;
3831	}
3832
3833      /* Has this symbol already been allocated?  If so, our work is done.  */
3834      if (elf_find_pointer_linker_section (ptr[r_symndx],
3835					   rel->r_addend,
3836					   lsect))
3837	return TRUE;
3838
3839      ptr_linker_section_ptr = &ptr[r_symndx];
3840    }
3841
3842  /* Allocate space for a pointer in the linker section, and allocate
3843     a new pointer record from internal memory.  */
3844  BFD_ASSERT (ptr_linker_section_ptr != NULL);
3845  amt = sizeof (elf_linker_section_pointers_t);
3846  linker_section_ptr = bfd_alloc (abfd, amt);
3847
3848  if (!linker_section_ptr)
3849    return FALSE;
3850
3851  linker_section_ptr->next = *ptr_linker_section_ptr;
3852  linker_section_ptr->addend = rel->r_addend;
3853  linker_section_ptr->lsect = lsect;
3854  *ptr_linker_section_ptr = linker_section_ptr;
3855
3856  if (!bfd_set_section_alignment (lsect->section->owner, lsect->section, 2))
3857    return FALSE;
3858  linker_section_ptr->offset = lsect->section->size;
3859  lsect->section->size += 4;
3860
3861#ifdef DEBUG
3862  fprintf (stderr,
3863	   "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
3864	   lsect->name, (long) linker_section_ptr->offset,
3865	   (long) lsect->section->size);
3866#endif
3867
3868  return TRUE;
3869}
3870
3871static struct plt_entry **
3872update_local_sym_info (bfd *abfd,
3873		       Elf_Internal_Shdr *symtab_hdr,
3874		       unsigned long r_symndx,
3875		       int tls_type)
3876{
3877  bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
3878  struct plt_entry **local_plt;
3879  char *local_got_tls_masks;
3880
3881  if (local_got_refcounts == NULL)
3882    {
3883      bfd_size_type size = symtab_hdr->sh_info;
3884
3885      size *= (sizeof (*local_got_refcounts)
3886	       + sizeof (*local_plt)
3887	       + sizeof (*local_got_tls_masks));
3888      local_got_refcounts = bfd_zalloc (abfd, size);
3889      if (local_got_refcounts == NULL)
3890	return NULL;
3891      elf_local_got_refcounts (abfd) = local_got_refcounts;
3892    }
3893
3894  local_plt = (struct plt_entry **) (local_got_refcounts + symtab_hdr->sh_info);
3895  local_got_tls_masks = (char *) (local_plt + symtab_hdr->sh_info);
3896  local_got_tls_masks[r_symndx] |= tls_type;
3897  if (tls_type != PLT_IFUNC)
3898    local_got_refcounts[r_symndx] += 1;
3899  return local_plt + r_symndx;
3900}
3901
3902static bfd_boolean
3903update_plt_info (bfd *abfd, struct plt_entry **plist,
3904		 asection *sec, bfd_vma addend)
3905{
3906  struct plt_entry *ent;
3907
3908  if (addend < 32768)
3909    sec = NULL;
3910  for (ent = *plist; ent != NULL; ent = ent->next)
3911    if (ent->sec == sec && ent->addend == addend)
3912      break;
3913  if (ent == NULL)
3914    {
3915      bfd_size_type amt = sizeof (*ent);
3916      ent = bfd_alloc (abfd, amt);
3917      if (ent == NULL)
3918	return FALSE;
3919      ent->next = *plist;
3920      ent->sec = sec;
3921      ent->addend = addend;
3922      ent->plt.refcount = 0;
3923      *plist = ent;
3924    }
3925  ent->plt.refcount += 1;
3926  return TRUE;
3927}
3928
3929static struct plt_entry *
3930find_plt_ent (struct plt_entry **plist, asection *sec, bfd_vma addend)
3931{
3932  struct plt_entry *ent;
3933
3934  if (addend < 32768)
3935    sec = NULL;
3936  for (ent = *plist; ent != NULL; ent = ent->next)
3937    if (ent->sec == sec && ent->addend == addend)
3938      break;
3939  return ent;
3940}
3941
3942static bfd_boolean
3943is_branch_reloc (enum elf_ppc_reloc_type r_type)
3944{
3945  return (r_type == R_PPC_PLTREL24
3946	  || r_type == R_PPC_LOCAL24PC
3947	  || r_type == R_PPC_REL24
3948	  || r_type == R_PPC_REL14
3949	  || r_type == R_PPC_REL14_BRTAKEN
3950	  || r_type == R_PPC_REL14_BRNTAKEN
3951	  || r_type == R_PPC_ADDR24
3952	  || r_type == R_PPC_ADDR14
3953	  || r_type == R_PPC_ADDR14_BRTAKEN
3954	  || r_type == R_PPC_ADDR14_BRNTAKEN
3955	  || r_type == R_PPC_VLE_REL24);
3956}
3957
3958static void
3959bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3960{
3961  _bfd_error_handler
3962    /* xgettext:c-format */
3963    (_("%B: relocation %s cannot be used when making a shared object"),
3964     abfd,
3965     ppc_elf_howto_table[r_type]->name);
3966  bfd_set_error (bfd_error_bad_value);
3967}
3968
3969/* Look through the relocs for a section during the first phase, and
3970   allocate space in the global offset table or procedure linkage
3971   table.  */
3972
3973static bfd_boolean
3974ppc_elf_check_relocs (bfd *abfd,
3975		      struct bfd_link_info *info,
3976		      asection *sec,
3977		      const Elf_Internal_Rela *relocs)
3978{
3979  struct ppc_elf_link_hash_table *htab;
3980  Elf_Internal_Shdr *symtab_hdr;
3981  struct elf_link_hash_entry **sym_hashes;
3982  const Elf_Internal_Rela *rel;
3983  const Elf_Internal_Rela *rel_end;
3984  asection *got2, *sreloc;
3985  struct elf_link_hash_entry *tga;
3986
3987  if (bfd_link_relocatable (info))
3988    return TRUE;
3989
3990  /* Don't do anything special with non-loaded, non-alloced sections.
3991     In particular, any relocs in such sections should not affect GOT
3992     and PLT reference counting (ie. we don't allow them to create GOT
3993     or PLT entries), there's no possibility or desire to optimize TLS
3994     relocs, and there's not much point in propagating relocs to shared
3995     libs that the dynamic linker won't relocate.  */
3996  if ((sec->flags & SEC_ALLOC) == 0)
3997    return TRUE;
3998
3999#ifdef DEBUG
4000  _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
4001		      sec, abfd);
4002#endif
4003
4004  BFD_ASSERT (is_ppc_elf (abfd));
4005
4006  /* Initialize howto table if not already done.  */
4007  if (!ppc_elf_howto_table[R_PPC_ADDR32])
4008    ppc_elf_howto_init ();
4009
4010  htab = ppc_elf_hash_table (info);
4011  if (htab->glink == NULL)
4012    {
4013      if (htab->elf.dynobj == NULL)
4014	htab->elf.dynobj = abfd;
4015      if (!ppc_elf_create_glink (htab->elf.dynobj, info))
4016	return FALSE;
4017    }
4018  tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4019			      FALSE, FALSE, TRUE);
4020  symtab_hdr = &elf_symtab_hdr (abfd);
4021  sym_hashes = elf_sym_hashes (abfd);
4022  got2 = bfd_get_section_by_name (abfd, ".got2");
4023  sreloc = NULL;
4024
4025  rel_end = relocs + sec->reloc_count;
4026  for (rel = relocs; rel < rel_end; rel++)
4027    {
4028      unsigned long r_symndx;
4029      enum elf_ppc_reloc_type r_type;
4030      struct elf_link_hash_entry *h;
4031      int tls_type;
4032      struct plt_entry **ifunc;
4033
4034      r_symndx = ELF32_R_SYM (rel->r_info);
4035      if (r_symndx < symtab_hdr->sh_info)
4036	h = NULL;
4037      else
4038	{
4039	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4040	  while (h->root.type == bfd_link_hash_indirect
4041		 || h->root.type == bfd_link_hash_warning)
4042	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4043
4044	  /* PR15323, ref flags aren't set for references in the same
4045	     object.  */
4046	  h->root.non_ir_ref = 1;
4047	}
4048
4049      /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
4050	 This shows up in particular in an R_PPC_ADDR32 in the eabi
4051	 startup code.  */
4052      if (h != NULL
4053	  && htab->elf.sgot == NULL
4054	  && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
4055	{
4056	  if (htab->elf.dynobj == NULL)
4057	    htab->elf.dynobj = abfd;
4058	  if (!ppc_elf_create_got (htab->elf.dynobj, info))
4059	    return FALSE;
4060	  BFD_ASSERT (h == htab->elf.hgot);
4061	}
4062
4063      tls_type = 0;
4064      r_type = ELF32_R_TYPE (rel->r_info);
4065      ifunc = NULL;
4066      if (h == NULL && !htab->is_vxworks)
4067	{
4068	  Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4069							  abfd, r_symndx);
4070	  if (isym == NULL)
4071	    return FALSE;
4072
4073	  if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4074	    {
4075	      /* Set PLT_IFUNC flag for this sym, no GOT entry yet.  */
4076	      ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
4077					     PLT_IFUNC);
4078	      if (ifunc == NULL)
4079		return FALSE;
4080
4081	      /* STT_GNU_IFUNC symbols must have a PLT entry;
4082		 In a non-pie executable even when there are
4083		 no plt calls.  */
4084	      if (!bfd_link_pic (info)
4085		  || is_branch_reloc (r_type))
4086		{
4087		  bfd_vma addend = 0;
4088		  if (r_type == R_PPC_PLTREL24)
4089		    {
4090		      ppc_elf_tdata (abfd)->makes_plt_call = 1;
4091		      if (bfd_link_pic (info))
4092			addend = rel->r_addend;
4093		    }
4094		  if (!update_plt_info (abfd, ifunc, got2, addend))
4095		    return FALSE;
4096		}
4097	    }
4098	}
4099
4100      if (!htab->is_vxworks
4101	  && is_branch_reloc (r_type)
4102	  && h != NULL
4103	  && h == tga)
4104	{
4105	  if (rel != relocs
4106	      && (ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSGD
4107		  || ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSLD))
4108	    /* We have a new-style __tls_get_addr call with a marker
4109	       reloc.  */
4110	    ;
4111	  else
4112	    /* Mark this section as having an old-style call.  */
4113	    sec->has_tls_get_addr_call = 1;
4114	}
4115
4116      switch (r_type)
4117	{
4118	case R_PPC_TLSGD:
4119	case R_PPC_TLSLD:
4120	  /* These special tls relocs tie a call to __tls_get_addr with
4121	     its parameter symbol.  */
4122	  break;
4123
4124	case R_PPC_GOT_TLSLD16:
4125	case R_PPC_GOT_TLSLD16_LO:
4126	case R_PPC_GOT_TLSLD16_HI:
4127	case R_PPC_GOT_TLSLD16_HA:
4128	  tls_type = TLS_TLS | TLS_LD;
4129	  goto dogottls;
4130
4131	case R_PPC_GOT_TLSGD16:
4132	case R_PPC_GOT_TLSGD16_LO:
4133	case R_PPC_GOT_TLSGD16_HI:
4134	case R_PPC_GOT_TLSGD16_HA:
4135	  tls_type = TLS_TLS | TLS_GD;
4136	  goto dogottls;
4137
4138	case R_PPC_GOT_TPREL16:
4139	case R_PPC_GOT_TPREL16_LO:
4140	case R_PPC_GOT_TPREL16_HI:
4141	case R_PPC_GOT_TPREL16_HA:
4142	  if (bfd_link_pic (info))
4143	    info->flags |= DF_STATIC_TLS;
4144	  tls_type = TLS_TLS | TLS_TPREL;
4145	  goto dogottls;
4146
4147	case R_PPC_GOT_DTPREL16:
4148	case R_PPC_GOT_DTPREL16_LO:
4149	case R_PPC_GOT_DTPREL16_HI:
4150	case R_PPC_GOT_DTPREL16_HA:
4151	  tls_type = TLS_TLS | TLS_DTPREL;
4152	dogottls:
4153	  sec->has_tls_reloc = 1;
4154	  /* Fall through.  */
4155
4156	  /* GOT16 relocations */
4157	case R_PPC_GOT16:
4158	case R_PPC_GOT16_LO:
4159	case R_PPC_GOT16_HI:
4160	case R_PPC_GOT16_HA:
4161	  /* This symbol requires a global offset table entry.  */
4162	  if (htab->elf.sgot == NULL)
4163	    {
4164	      if (htab->elf.dynobj == NULL)
4165		htab->elf.dynobj = abfd;
4166	      if (!ppc_elf_create_got (htab->elf.dynobj, info))
4167		return FALSE;
4168	    }
4169	  if (h != NULL)
4170	    {
4171	      h->got.refcount += 1;
4172	      ppc_elf_hash_entry (h)->tls_mask |= tls_type;
4173	    }
4174	  else
4175	    /* This is a global offset table entry for a local symbol.  */
4176	    if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
4177	      return FALSE;
4178
4179	  /* We may also need a plt entry if the symbol turns out to be
4180	     an ifunc.  */
4181	  if (h != NULL && !bfd_link_pic (info))
4182	    {
4183	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
4184		return FALSE;
4185	    }
4186	  break;
4187
4188	  /* Indirect .sdata relocation.  */
4189	case R_PPC_EMB_SDAI16:
4190	  if (bfd_link_pic (info))
4191	    {
4192	      bad_shared_reloc (abfd, r_type);
4193	      return FALSE;
4194	    }
4195	  htab->sdata[0].sym->ref_regular = 1;
4196	  if (!elf_allocate_pointer_linker_section (abfd, &htab->sdata[0],
4197						    h, rel))
4198	    return FALSE;
4199	  if (h != NULL)
4200	    {
4201	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
4202	      h->non_got_ref = TRUE;
4203	    }
4204	  break;
4205
4206	  /* Indirect .sdata2 relocation.  */
4207	case R_PPC_EMB_SDA2I16:
4208	  if (bfd_link_pic (info))
4209	    {
4210	      bad_shared_reloc (abfd, r_type);
4211	      return FALSE;
4212	    }
4213	  htab->sdata[1].sym->ref_regular = 1;
4214	  if (!elf_allocate_pointer_linker_section (abfd, &htab->sdata[1],
4215						    h, rel))
4216	    return FALSE;
4217	  if (h != NULL)
4218	    {
4219	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
4220	      h->non_got_ref = TRUE;
4221	    }
4222	  break;
4223
4224	case R_PPC_SDAREL16:
4225	  htab->sdata[0].sym->ref_regular = 1;
4226	  /* Fall through.  */
4227
4228	case R_PPC_VLE_SDAREL_LO16A:
4229	case R_PPC_VLE_SDAREL_LO16D:
4230	case R_PPC_VLE_SDAREL_HI16A:
4231	case R_PPC_VLE_SDAREL_HI16D:
4232	case R_PPC_VLE_SDAREL_HA16A:
4233	case R_PPC_VLE_SDAREL_HA16D:
4234	  if (h != NULL)
4235	    {
4236	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
4237	      h->non_got_ref = TRUE;
4238	    }
4239	  break;
4240
4241	case R_PPC_VLE_REL8:
4242	case R_PPC_VLE_REL15:
4243	case R_PPC_VLE_REL24:
4244	case R_PPC_VLE_LO16A:
4245	case R_PPC_VLE_LO16D:
4246	case R_PPC_VLE_HI16A:
4247	case R_PPC_VLE_HI16D:
4248	case R_PPC_VLE_HA16A:
4249	case R_PPC_VLE_HA16D:
4250	  break;
4251
4252	case R_PPC_EMB_SDA2REL:
4253	  if (bfd_link_pic (info))
4254	    {
4255	      bad_shared_reloc (abfd, r_type);
4256	      return FALSE;
4257	    }
4258	  htab->sdata[1].sym->ref_regular = 1;
4259	  if (h != NULL)
4260	    {
4261	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
4262	      h->non_got_ref = TRUE;
4263	    }
4264	  break;
4265
4266	case R_PPC_VLE_SDA21_LO:
4267	case R_PPC_VLE_SDA21:
4268	case R_PPC_EMB_SDA21:
4269	case R_PPC_EMB_RELSDA:
4270	  if (bfd_link_pic (info))
4271	    {
4272	      bad_shared_reloc (abfd, r_type);
4273	      return FALSE;
4274	    }
4275	  if (h != NULL)
4276	    {
4277	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
4278	      h->non_got_ref = TRUE;
4279	    }
4280	  break;
4281
4282	case R_PPC_EMB_NADDR32:
4283	case R_PPC_EMB_NADDR16:
4284	case R_PPC_EMB_NADDR16_LO:
4285	case R_PPC_EMB_NADDR16_HI:
4286	case R_PPC_EMB_NADDR16_HA:
4287	  if (bfd_link_pic (info))
4288	    {
4289	      bad_shared_reloc (abfd, r_type);
4290	      return FALSE;
4291	    }
4292	  if (h != NULL)
4293	    h->non_got_ref = TRUE;
4294	  break;
4295
4296	case R_PPC_PLTREL24:
4297	  if (h == NULL)
4298	    break;
4299	  /* Fall through */
4300	case R_PPC_PLT32:
4301	case R_PPC_PLTREL32:
4302	case R_PPC_PLT16_LO:
4303	case R_PPC_PLT16_HI:
4304	case R_PPC_PLT16_HA:
4305#ifdef DEBUG
4306	  fprintf (stderr, "Reloc requires a PLT entry\n");
4307#endif
4308	  /* This symbol requires a procedure linkage table entry.  */
4309	  if (h == NULL)
4310	    {
4311	      if (ifunc == NULL)
4312		{
4313		  /* It does not make sense to have a procedure linkage
4314		     table entry for a non-ifunc local symbol.  */
4315		  info->callbacks->einfo
4316		    /* xgettext:c-format */
4317		    (_("%P: %H: %s reloc against local symbol\n"),
4318		     abfd, sec, rel->r_offset,
4319		     ppc_elf_howto_table[r_type]->name);
4320		  bfd_set_error (bfd_error_bad_value);
4321		  return FALSE;
4322		}
4323	    }
4324	  else
4325	    {
4326	      bfd_vma addend = 0;
4327
4328	      if (r_type == R_PPC_PLTREL24)
4329		{
4330		  ppc_elf_tdata (abfd)->makes_plt_call = 1;
4331		  if (bfd_link_pic (info))
4332		    addend = rel->r_addend;
4333		}
4334	      h->needs_plt = 1;
4335	      if (!update_plt_info (abfd, &h->plt.plist, got2, addend))
4336		return FALSE;
4337	    }
4338	  break;
4339
4340	  /* The following relocations don't need to propagate the
4341	     relocation if linking a shared object since they are
4342	     section relative.  */
4343	case R_PPC_SECTOFF:
4344	case R_PPC_SECTOFF_LO:
4345	case R_PPC_SECTOFF_HI:
4346	case R_PPC_SECTOFF_HA:
4347	case R_PPC_DTPREL16:
4348	case R_PPC_DTPREL16_LO:
4349	case R_PPC_DTPREL16_HI:
4350	case R_PPC_DTPREL16_HA:
4351	case R_PPC_TOC16:
4352	  break;
4353
4354	case R_PPC_REL16:
4355	case R_PPC_REL16_LO:
4356	case R_PPC_REL16_HI:
4357	case R_PPC_REL16_HA:
4358	case R_PPC_REL16DX_HA:
4359	  ppc_elf_tdata (abfd)->has_rel16 = 1;
4360	  break;
4361
4362	  /* These are just markers.  */
4363	case R_PPC_TLS:
4364	case R_PPC_EMB_MRKREF:
4365	case R_PPC_NONE:
4366	case R_PPC_max:
4367	case R_PPC_RELAX:
4368	case R_PPC_RELAX_PLT:
4369	case R_PPC_RELAX_PLTREL24:
4370	case R_PPC_16DX_HA:
4371	  break;
4372
4373	  /* These should only appear in dynamic objects.  */
4374	case R_PPC_COPY:
4375	case R_PPC_GLOB_DAT:
4376	case R_PPC_JMP_SLOT:
4377	case R_PPC_RELATIVE:
4378	case R_PPC_IRELATIVE:
4379	  break;
4380
4381	  /* These aren't handled yet.  We'll report an error later.  */
4382	case R_PPC_ADDR30:
4383	case R_PPC_EMB_RELSEC16:
4384	case R_PPC_EMB_RELST_LO:
4385	case R_PPC_EMB_RELST_HI:
4386	case R_PPC_EMB_RELST_HA:
4387	case R_PPC_EMB_BIT_FLD:
4388	  break;
4389
4390	  /* This refers only to functions defined in the shared library.  */
4391	case R_PPC_LOCAL24PC:
4392	  if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
4393	    {
4394	      htab->plt_type = PLT_OLD;
4395	      htab->old_bfd = abfd;
4396	    }
4397	  if (h != NULL && h->type == STT_GNU_IFUNC)
4398	    {
4399	      h->needs_plt = 1;
4400	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
4401		return FALSE;
4402	    }
4403	  break;
4404
4405	  /* This relocation describes the C++ object vtable hierarchy.
4406	     Reconstruct it for later use during GC.  */
4407	case R_PPC_GNU_VTINHERIT:
4408	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4409	    return FALSE;
4410	  break;
4411
4412	  /* This relocation describes which C++ vtable entries are actually
4413	     used.  Record for later use during GC.  */
4414	case R_PPC_GNU_VTENTRY:
4415	  BFD_ASSERT (h != NULL);
4416	  if (h != NULL
4417	      && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4418	    return FALSE;
4419	  break;
4420
4421	  /* We shouldn't really be seeing these.  */
4422	case R_PPC_TPREL32:
4423	case R_PPC_TPREL16:
4424	case R_PPC_TPREL16_LO:
4425	case R_PPC_TPREL16_HI:
4426	case R_PPC_TPREL16_HA:
4427	  if (bfd_link_pic (info))
4428	    info->flags |= DF_STATIC_TLS;
4429	  goto dodyn;
4430
4431	  /* Nor these.  */
4432	case R_PPC_DTPMOD32:
4433	case R_PPC_DTPREL32:
4434	  goto dodyn;
4435
4436	case R_PPC_REL32:
4437	  if (h == NULL
4438	      && got2 != NULL
4439	      && (sec->flags & SEC_CODE) != 0
4440	      && bfd_link_pic (info)
4441	      && htab->plt_type == PLT_UNSET)
4442	    {
4443	      /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
4444		 the start of a function, which assembles to a REL32
4445		 reference to .got2.  If we detect one of these, then
4446		 force the old PLT layout because the linker cannot
4447		 reliably deduce the GOT pointer value needed for
4448		 PLT call stubs.  */
4449	      asection *s;
4450	      Elf_Internal_Sym *isym;
4451
4452	      isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4453					    abfd, r_symndx);
4454	      if (isym == NULL)
4455		return FALSE;
4456
4457	      s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4458	      if (s == got2)
4459		{
4460		  htab->plt_type = PLT_OLD;
4461		  htab->old_bfd = abfd;
4462		}
4463	    }
4464	  if (h == NULL || h == htab->elf.hgot)
4465	    break;
4466	  /* fall through */
4467
4468	case R_PPC_ADDR32:
4469	case R_PPC_ADDR16:
4470	case R_PPC_ADDR16_LO:
4471	case R_PPC_ADDR16_HI:
4472	case R_PPC_ADDR16_HA:
4473	case R_PPC_UADDR32:
4474	case R_PPC_UADDR16:
4475	  if (h != NULL && !bfd_link_pic (info))
4476	    {
4477	      /* We may need a plt entry if the symbol turns out to be
4478		 a function defined in a dynamic object.  */
4479	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
4480		return FALSE;
4481
4482	      /* We may need a copy reloc too.  */
4483	      h->non_got_ref = 1;
4484	      h->pointer_equality_needed = 1;
4485	      if (r_type == R_PPC_ADDR16_HA)
4486		ppc_elf_hash_entry (h)->has_addr16_ha = 1;
4487	      if (r_type == R_PPC_ADDR16_LO)
4488		ppc_elf_hash_entry (h)->has_addr16_lo = 1;
4489	    }
4490	  goto dodyn;
4491
4492	case R_PPC_REL24:
4493	case R_PPC_REL14:
4494	case R_PPC_REL14_BRTAKEN:
4495	case R_PPC_REL14_BRNTAKEN:
4496	  if (h == NULL)
4497	    break;
4498	  if (h == htab->elf.hgot)
4499	    {
4500	      if (htab->plt_type == PLT_UNSET)
4501		{
4502		  htab->plt_type = PLT_OLD;
4503		  htab->old_bfd = abfd;
4504		}
4505	      break;
4506	    }
4507	  /* fall through */
4508
4509	case R_PPC_ADDR24:
4510	case R_PPC_ADDR14:
4511	case R_PPC_ADDR14_BRTAKEN:
4512	case R_PPC_ADDR14_BRNTAKEN:
4513	  if (h != NULL && !bfd_link_pic (info))
4514	    {
4515	      /* We may need a plt entry if the symbol turns out to be
4516		 a function defined in a dynamic object.  */
4517	      h->needs_plt = 1;
4518	      if (!update_plt_info (abfd, &h->plt.plist, NULL, 0))
4519		return FALSE;
4520	      break;
4521	    }
4522
4523	dodyn:
4524	  /* If we are creating a shared library, and this is a reloc
4525	     against a global symbol, or a non PC relative reloc
4526	     against a local symbol, then we need to copy the reloc
4527	     into the shared library.  However, if we are linking with
4528	     -Bsymbolic, we do not need to copy a reloc against a
4529	     global symbol which is defined in an object we are
4530	     including in the link (i.e., DEF_REGULAR is set).  At
4531	     this point we have not seen all the input files, so it is
4532	     possible that DEF_REGULAR is not set now but will be set
4533	     later (it is never cleared).  In case of a weak definition,
4534	     DEF_REGULAR may be cleared later by a strong definition in
4535	     a shared library.  We account for that possibility below by
4536	     storing information in the dyn_relocs field of the hash
4537	     table entry.  A similar situation occurs when creating
4538	     shared libraries and symbol visibility changes render the
4539	     symbol local.
4540
4541	     If on the other hand, we are creating an executable, we
4542	     may need to keep relocations for symbols satisfied by a
4543	     dynamic library if we manage to avoid copy relocs for the
4544	     symbol.  */
4545	  if ((bfd_link_pic (info)
4546	       && (must_be_dyn_reloc (info, r_type)
4547		   || (h != NULL
4548		       && (!SYMBOLIC_BIND (info, h)
4549			   || h->root.type == bfd_link_hash_defweak
4550			   || !h->def_regular))))
4551	      || (ELIMINATE_COPY_RELOCS
4552		  && !bfd_link_pic (info)
4553		  && h != NULL
4554		  && (h->root.type == bfd_link_hash_defweak
4555		      || !h->def_regular)))
4556	    {
4557#ifdef DEBUG
4558	      fprintf (stderr,
4559		       "ppc_elf_check_relocs needs to "
4560		       "create relocation for %s\n",
4561		       (h && h->root.root.string
4562			? h->root.root.string : "<unknown>"));
4563#endif
4564	      if (sreloc == NULL)
4565		{
4566		  if (htab->elf.dynobj == NULL)
4567		    htab->elf.dynobj = abfd;
4568
4569		  sreloc = _bfd_elf_make_dynamic_reloc_section
4570		    (sec, htab->elf.dynobj, 2, abfd, /*rela?*/ TRUE);
4571
4572		  if (sreloc == NULL)
4573		    return FALSE;
4574		}
4575
4576	      /* If this is a global symbol, we count the number of
4577		 relocations we need for this symbol.  */
4578	      if (h != NULL)
4579		{
4580		  struct elf_dyn_relocs *p;
4581		  struct elf_dyn_relocs **rel_head;
4582
4583		  rel_head = &ppc_elf_hash_entry (h)->dyn_relocs;
4584		  p = *rel_head;
4585		  if (p == NULL || p->sec != sec)
4586		    {
4587		      p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4588		      if (p == NULL)
4589			return FALSE;
4590		      p->next = *rel_head;
4591		      *rel_head = p;
4592		      p->sec = sec;
4593		      p->count = 0;
4594		      p->pc_count = 0;
4595		    }
4596		  p->count += 1;
4597		  if (!must_be_dyn_reloc (info, r_type))
4598		    p->pc_count += 1;
4599		}
4600	      else
4601		{
4602		  /* Track dynamic relocs needed for local syms too.
4603		     We really need local syms available to do this
4604		     easily.  Oh well.  */
4605		  struct ppc_dyn_relocs *p;
4606		  struct ppc_dyn_relocs **rel_head;
4607		  bfd_boolean is_ifunc;
4608		  asection *s;
4609		  void *vpp;
4610		  Elf_Internal_Sym *isym;
4611
4612		  isym = bfd_sym_from_r_symndx (&htab->sym_cache,
4613						abfd, r_symndx);
4614		  if (isym == NULL)
4615		    return FALSE;
4616
4617		  s = bfd_section_from_elf_index (abfd, isym->st_shndx);
4618		  if (s == NULL)
4619		    s = sec;
4620
4621		  vpp = &elf_section_data (s)->local_dynrel;
4622		  rel_head = (struct ppc_dyn_relocs **) vpp;
4623		  is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
4624		  p = *rel_head;
4625		  if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
4626		    p = p->next;
4627		  if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
4628		    {
4629		      p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4630		      if (p == NULL)
4631			return FALSE;
4632		      p->next = *rel_head;
4633		      *rel_head = p;
4634		      p->sec = sec;
4635		      p->ifunc = is_ifunc;
4636		      p->count = 0;
4637		    }
4638		  p->count += 1;
4639		}
4640	    }
4641
4642	  break;
4643	}
4644    }
4645
4646  return TRUE;
4647}
4648
4649/* Warn for conflicting Tag_GNU_Power_ABI_FP attributes between IBFD
4650   and OBFD, and merge non-conflicting ones.  */
4651void
4652_bfd_elf_ppc_merge_fp_attributes (bfd *ibfd, struct bfd_link_info *info)
4653{
4654  bfd *obfd = info->output_bfd;
4655  obj_attribute *in_attr, *in_attrs;
4656  obj_attribute *out_attr, *out_attrs;
4657
4658  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4659  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4660
4661  in_attr = &in_attrs[Tag_GNU_Power_ABI_FP];
4662  out_attr = &out_attrs[Tag_GNU_Power_ABI_FP];
4663
4664  if (in_attr->i != out_attr->i)
4665    {
4666      int in_fp = in_attr->i & 3;
4667      int out_fp = out_attr->i & 3;
4668
4669      if (in_fp == 0)
4670	;
4671      else if (out_fp == 0)
4672	{
4673	  out_attr->type = 1;
4674	  out_attr->i ^= in_fp;
4675	}
4676      else if (out_fp != 2 && in_fp == 2)
4677	_bfd_error_handler
4678	  /* xgettext:c-format */
4679	  (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
4680      else if (out_fp == 2 && in_fp != 2)
4681	_bfd_error_handler
4682	  /* xgettext:c-format */
4683	  (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
4684      else if (out_fp == 1 && in_fp == 3)
4685	_bfd_error_handler
4686	  /* xgettext:c-format */
4687	  (_("Warning: %B uses double-precision hard float, "
4688	     "%B uses single-precision hard float"), obfd, ibfd);
4689      else if (out_fp == 3 && in_fp == 1)
4690	_bfd_error_handler
4691	  /* xgettext:c-format */
4692	  (_("Warning: %B uses double-precision hard float, "
4693	     "%B uses single-precision hard float"), ibfd, obfd);
4694
4695      in_fp = in_attr->i & 0xc;
4696      out_fp = out_attr->i & 0xc;
4697      if (in_fp == 0)
4698	;
4699      else if (out_fp == 0)
4700	{
4701	  out_attr->type = 1;
4702	  out_attr->i ^= in_fp;
4703	}
4704      else if (out_fp != 2 * 4 && in_fp == 2 * 4)
4705	_bfd_error_handler
4706	  /* xgettext:c-format */
4707	  (_("Warning: %B uses 64-bit long double, "
4708	     "%B uses 128-bit long double"), ibfd, obfd);
4709      else if (in_fp != 2 * 4 && out_fp == 2 * 4)
4710	_bfd_error_handler
4711	  /* xgettext:c-format */
4712	  (_("Warning: %B uses 64-bit long double, "
4713	     "%B uses 128-bit long double"), obfd, ibfd);
4714      else if (out_fp == 1 * 4 && in_fp == 3 * 4)
4715	_bfd_error_handler
4716	  /* xgettext:c-format */
4717	  (_("Warning: %B uses IBM long double, "
4718	     "%B uses IEEE long double"), ibfd, obfd);
4719      else if (out_fp == 3 * 4 && in_fp == 1 * 4)
4720	_bfd_error_handler
4721	  /* xgettext:c-format */
4722	  (_("Warning: %B uses IBM long double, "
4723	     "%B uses IEEE long double"), obfd, ibfd);
4724    }
4725}
4726
4727/* Merge object attributes from IBFD into OBFD.  Warn if
4728   there are conflicting attributes.  */
4729static bfd_boolean
4730ppc_elf_merge_obj_attributes (bfd *ibfd, struct bfd_link_info *info)
4731{
4732  bfd *obfd;
4733  obj_attribute *in_attr, *in_attrs;
4734  obj_attribute *out_attr, *out_attrs;
4735
4736  _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
4737
4738  obfd = info->output_bfd;
4739  in_attrs = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
4740  out_attrs = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
4741
4742  /* Check for conflicting Tag_GNU_Power_ABI_Vector attributes and
4743     merge non-conflicting ones.  */
4744  in_attr = &in_attrs[Tag_GNU_Power_ABI_Vector];
4745  out_attr = &out_attrs[Tag_GNU_Power_ABI_Vector];
4746  if (in_attr->i != out_attr->i)
4747    {
4748      int in_vec = in_attr->i & 3;
4749      int out_vec = out_attr->i & 3;
4750
4751      if (in_vec == 0)
4752	;
4753      else if (out_vec == 0)
4754	{
4755	  out_attr->type = 1;
4756	  out_attr->i = in_vec;
4757	}
4758      /* For now, allow generic to transition to AltiVec or SPE
4759	 without a warning.  If GCC marked files with their stack
4760	 alignment and used don't-care markings for files which are
4761	 not affected by the vector ABI, we could warn about this
4762	 case too.  */
4763      else if (in_vec == 1)
4764	;
4765      else if (out_vec == 1)
4766	{
4767	  out_attr->type = 1;
4768	  out_attr->i = in_vec;
4769	}
4770      else if (out_vec < in_vec)
4771	_bfd_error_handler
4772	  /* xgettext:c-format */
4773	  (_("Warning: %B uses AltiVec vector ABI, %B uses SPE vector ABI"),
4774	   obfd, ibfd);
4775      else if (out_vec > in_vec)
4776	_bfd_error_handler
4777	  /* xgettext:c-format */
4778	  (_("Warning: %B uses AltiVec vector ABI, %B uses SPE vector ABI"),
4779	   ibfd, obfd);
4780    }
4781
4782  /* Check for conflicting Tag_GNU_Power_ABI_Struct_Return attributes
4783     and merge non-conflicting ones.  */
4784  in_attr = &in_attrs[Tag_GNU_Power_ABI_Struct_Return];
4785  out_attr = &out_attrs[Tag_GNU_Power_ABI_Struct_Return];
4786  if (in_attr->i != out_attr->i)
4787    {
4788      int in_struct = in_attr->i & 3;
4789      int out_struct = out_attr->i & 3;
4790
4791      if (in_struct == 0 || in_struct == 3)
4792       ;
4793      else if (out_struct == 0)
4794	{
4795	  out_attr->type = 1;
4796	  out_attr->i = in_struct;
4797	}
4798      else if (out_struct < in_struct)
4799	_bfd_error_handler
4800	  /* xgettext:c-format */
4801	  (_("Warning: %B uses r3/r4 for small structure returns, "
4802	     "%B uses memory"), obfd, ibfd);
4803      else if (out_struct > in_struct)
4804	_bfd_error_handler
4805	  /* xgettext:c-format */
4806	  (_("Warning: %B uses r3/r4 for small structure returns, "
4807	     "%B uses memory"), ibfd, obfd);
4808    }
4809
4810  /* Merge Tag_compatibility attributes and any common GNU ones.  */
4811  _bfd_elf_merge_object_attributes (ibfd, info);
4812
4813  return TRUE;
4814}
4815
4816/* Merge backend specific data from an object file to the output
4817   object file when linking.  */
4818
4819static bfd_boolean
4820ppc_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
4821{
4822  bfd *obfd = info->output_bfd;
4823  flagword old_flags;
4824  flagword new_flags;
4825  bfd_boolean error;
4826
4827  if (!is_ppc_elf (ibfd) || !is_ppc_elf (obfd))
4828    return TRUE;
4829
4830  /* Check if we have the same endianness.  */
4831  if (! _bfd_generic_verify_endian_match (ibfd, info))
4832    return FALSE;
4833
4834  if (!ppc_elf_merge_obj_attributes (ibfd, info))
4835    return FALSE;
4836
4837  new_flags = elf_elfheader (ibfd)->e_flags;
4838  old_flags = elf_elfheader (obfd)->e_flags;
4839  if (!elf_flags_init (obfd))
4840    {
4841      /* First call, no flags set.  */
4842      elf_flags_init (obfd) = TRUE;
4843      elf_elfheader (obfd)->e_flags = new_flags;
4844    }
4845
4846  /* Compatible flags are ok.  */
4847  else if (new_flags == old_flags)
4848    ;
4849
4850  /* Incompatible flags.  */
4851  else
4852    {
4853      /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
4854	 to be linked with either.  */
4855      error = FALSE;
4856      if ((new_flags & EF_PPC_RELOCATABLE) != 0
4857	  && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
4858	{
4859	  error = TRUE;
4860	  _bfd_error_handler
4861	    (_("%B: compiled with -mrelocatable and linked with "
4862	       "modules compiled normally"), ibfd);
4863	}
4864      else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
4865	       && (old_flags & EF_PPC_RELOCATABLE) != 0)
4866	{
4867	  error = TRUE;
4868	  _bfd_error_handler
4869	    (_("%B: compiled normally and linked with "
4870	       "modules compiled with -mrelocatable"), ibfd);
4871	}
4872
4873      /* The output is -mrelocatable-lib iff both the input files are.  */
4874      if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
4875	elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
4876
4877      /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
4878	 but each input file is either -mrelocatable or -mrelocatable-lib.  */
4879      if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
4880	  && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
4881	  && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
4882	elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
4883
4884      /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
4885	 any module uses it.  */
4886      elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
4887
4888      new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
4889      old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
4890
4891      /* Warn about any other mismatches.  */
4892      if (new_flags != old_flags)
4893	{
4894	  error = TRUE;
4895	  _bfd_error_handler
4896	    /* xgettext:c-format */
4897	    (_("%B: uses different e_flags (0x%lx) fields "
4898	       "than previous modules (0x%lx)"),
4899	     ibfd, (long) new_flags, (long) old_flags);
4900	}
4901
4902      if (error)
4903	{
4904	  bfd_set_error (bfd_error_bad_value);
4905	  return FALSE;
4906	}
4907    }
4908
4909  return TRUE;
4910}
4911
4912static void
4913ppc_elf_vle_split16 (bfd *input_bfd,
4914		     asection *input_section,
4915		     unsigned long offset,
4916		     bfd_byte *loc,
4917		     bfd_vma value,
4918		     split16_format_type split16_format,
4919		     bfd_boolean fixup)
4920{
4921  unsigned int insn, opcode, top5;
4922
4923  insn = bfd_get_32 (input_bfd, loc);
4924  opcode = insn & 0xfc00f800;
4925  if (opcode == E_OR2I_INSN
4926      || opcode == E_AND2I_DOT_INSN
4927      || opcode == E_OR2IS_INSN
4928      || opcode == E_LIS_INSN
4929      || opcode == E_AND2IS_DOT_INSN)
4930    {
4931      if (split16_format != split16a_type)
4932	{
4933	  if (fixup)
4934	    split16_format = split16a_type;
4935	  else
4936	    _bfd_error_handler
4937	      /* xgettext:c-format */
4938	      (_("%B(%A+0x%lx): expected 16A style relocation on 0x%08x insn"),
4939	       input_bfd, input_section, offset, opcode);
4940	}
4941    }
4942  else if (opcode == E_ADD2I_DOT_INSN
4943	   || opcode == E_ADD2IS_INSN
4944	   || opcode == E_CMP16I_INSN
4945	   || opcode == E_MULL2I_INSN
4946	   || opcode == E_CMPL16I_INSN
4947	   || opcode == E_CMPH16I_INSN
4948	   || opcode == E_CMPHL16I_INSN)
4949    {
4950      if (split16_format != split16d_type)
4951	{
4952	  if (fixup)
4953	    split16_format = split16d_type;
4954	  else
4955	    _bfd_error_handler
4956	      /* xgettext:c-format */
4957	      (_("%B(%A+0x%lx): expected 16D style relocation on 0x%08x insn"),
4958	       input_bfd, input_section, offset, opcode);
4959	}
4960    }
4961  top5 = value & 0xf800;
4962  top5 = top5 << (split16_format == split16a_type ? 5 : 10);
4963  insn &= (split16_format == split16a_type ? ~0x1f07ff : ~0x3e007ff);
4964  insn |= top5;
4965  insn |= value & 0x7ff;
4966  bfd_put_32 (input_bfd, insn, loc);
4967}
4968
4969/* Choose which PLT scheme to use, and set .plt flags appropriately.
4970   Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
4971int
4972ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
4973			   struct bfd_link_info *info)
4974{
4975  struct ppc_elf_link_hash_table *htab;
4976  flagword flags;
4977
4978  htab = ppc_elf_hash_table (info);
4979
4980  if (htab->plt_type == PLT_UNSET)
4981    {
4982      struct elf_link_hash_entry *h;
4983
4984      if (htab->params->plt_style == PLT_OLD)
4985	htab->plt_type = PLT_OLD;
4986      else if (bfd_link_pic (info)
4987	       && htab->elf.dynamic_sections_created
4988	       && (h = elf_link_hash_lookup (&htab->elf, "_mcount",
4989					     FALSE, FALSE, TRUE)) != NULL
4990	       && (h->type == STT_FUNC
4991		   || h->needs_plt)
4992	       && h->ref_regular
4993	       && !(SYMBOL_CALLS_LOCAL (info, h)
4994		    || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4995			&& h->root.type == bfd_link_hash_undefweak)))
4996	{
4997	  /* Profiling of shared libs (and pies) is not supported with
4998	     secure plt, because ppc32 does profiling before a
4999	     function prologue and a secure plt pic call stubs needs
5000	     r30 to be set up.  */
5001	  htab->plt_type = PLT_OLD;
5002	}
5003      else
5004	{
5005	  bfd *ibfd;
5006	  enum ppc_elf_plt_type plt_type = htab->params->plt_style;
5007
5008	  /* Look through the reloc flags left by ppc_elf_check_relocs.
5009	     Use the old style bss plt if a file makes plt calls
5010	     without using the new relocs, and if ld isn't given
5011	     --secure-plt and we never see REL16 relocs.  */
5012	  if (plt_type == PLT_UNSET)
5013	    plt_type = PLT_OLD;
5014	  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link.next)
5015	    if (is_ppc_elf (ibfd))
5016	      {
5017		if (ppc_elf_tdata (ibfd)->has_rel16)
5018		  plt_type = PLT_NEW;
5019		else if (ppc_elf_tdata (ibfd)->makes_plt_call)
5020		  {
5021		    plt_type = PLT_OLD;
5022		    htab->old_bfd = ibfd;
5023		    break;
5024		  }
5025	      }
5026	  htab->plt_type = plt_type;
5027	}
5028    }
5029  if (htab->plt_type == PLT_OLD && htab->params->plt_style == PLT_NEW)
5030    {
5031      if (htab->old_bfd != NULL)
5032	info->callbacks->einfo (_("%P: bss-plt forced due to %B\n"),
5033				htab->old_bfd);
5034      else
5035	info->callbacks->einfo (_("%P: bss-plt forced by profiling\n"));
5036    }
5037
5038  BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
5039
5040  if (htab->plt_type == PLT_NEW)
5041    {
5042      flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
5043	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
5044
5045      /* The new PLT is a loaded section.  */
5046      if (htab->elf.splt != NULL
5047	  && !bfd_set_section_flags (htab->elf.dynobj, htab->elf.splt, flags))
5048	return -1;
5049
5050      /* The new GOT is not executable.  */
5051      if (htab->elf.sgot != NULL
5052	  && !bfd_set_section_flags (htab->elf.dynobj, htab->elf.sgot, flags))
5053	return -1;
5054    }
5055  else
5056    {
5057      /* Stop an unused .glink section from affecting .text alignment.  */
5058      if (htab->glink != NULL
5059	  && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
5060	return -1;
5061    }
5062  return htab->plt_type == PLT_NEW;
5063}
5064
5065/* Return the section that should be marked against GC for a given
5066   relocation.  */
5067
5068static asection *
5069ppc_elf_gc_mark_hook (asection *sec,
5070		      struct bfd_link_info *info,
5071		      Elf_Internal_Rela *rel,
5072		      struct elf_link_hash_entry *h,
5073		      Elf_Internal_Sym *sym)
5074{
5075  if (h != NULL)
5076    switch (ELF32_R_TYPE (rel->r_info))
5077      {
5078      case R_PPC_GNU_VTINHERIT:
5079      case R_PPC_GNU_VTENTRY:
5080	return NULL;
5081      }
5082
5083  return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
5084}
5085
5086/* Update the got, plt and dynamic reloc reference counts for the
5087   section being removed.  */
5088
5089static bfd_boolean
5090ppc_elf_gc_sweep_hook (bfd *abfd,
5091		       struct bfd_link_info *info,
5092		       asection *sec,
5093		       const Elf_Internal_Rela *relocs)
5094{
5095  struct ppc_elf_link_hash_table *htab;
5096  Elf_Internal_Shdr *symtab_hdr;
5097  struct elf_link_hash_entry **sym_hashes;
5098  bfd_signed_vma *local_got_refcounts;
5099  const Elf_Internal_Rela *rel, *relend;
5100  asection *got2;
5101
5102  if (bfd_link_relocatable (info))
5103    return TRUE;
5104
5105  if ((sec->flags & SEC_ALLOC) == 0)
5106    return TRUE;
5107
5108  elf_section_data (sec)->local_dynrel = NULL;
5109
5110  htab = ppc_elf_hash_table (info);
5111  symtab_hdr = &elf_symtab_hdr (abfd);
5112  sym_hashes = elf_sym_hashes (abfd);
5113  local_got_refcounts = elf_local_got_refcounts (abfd);
5114  got2 = bfd_get_section_by_name (abfd, ".got2");
5115
5116  relend = relocs + sec->reloc_count;
5117  for (rel = relocs; rel < relend; rel++)
5118    {
5119      unsigned long r_symndx;
5120      enum elf_ppc_reloc_type r_type;
5121      struct elf_link_hash_entry *h = NULL;
5122
5123      r_symndx = ELF32_R_SYM (rel->r_info);
5124      if (r_symndx >= symtab_hdr->sh_info)
5125	{
5126	  struct elf_dyn_relocs **pp, *p;
5127	  struct ppc_elf_link_hash_entry *eh;
5128
5129	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5130	  while (h->root.type == bfd_link_hash_indirect
5131		 || h->root.type == bfd_link_hash_warning)
5132	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
5133	  eh = (struct ppc_elf_link_hash_entry *) h;
5134
5135	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5136	    if (p->sec == sec)
5137	      {
5138		/* Everything must go for SEC.  */
5139		*pp = p->next;
5140		break;
5141	      }
5142	}
5143
5144      r_type = ELF32_R_TYPE (rel->r_info);
5145      if (!htab->is_vxworks
5146	  && h == NULL
5147	  && local_got_refcounts != NULL
5148	  && (!bfd_link_pic (info)
5149	      || is_branch_reloc (r_type)))
5150	{
5151	  struct plt_entry **local_plt = (struct plt_entry **)
5152	    (local_got_refcounts + symtab_hdr->sh_info);
5153	  char *local_got_tls_masks = (char *)
5154	    (local_plt + symtab_hdr->sh_info);
5155	  if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
5156	    {
5157	      struct plt_entry **ifunc = local_plt + r_symndx;
5158	      bfd_vma addend = 0;
5159	      struct plt_entry *ent;
5160
5161	      if (r_type == R_PPC_PLTREL24 && bfd_link_pic (info))
5162		addend = rel->r_addend;
5163	      ent = find_plt_ent (ifunc, got2, addend);
5164	      if (ent->plt.refcount > 0)
5165		ent->plt.refcount -= 1;
5166	      continue;
5167	    }
5168	}
5169
5170      switch (r_type)
5171	{
5172	case R_PPC_GOT_TLSLD16:
5173	case R_PPC_GOT_TLSLD16_LO:
5174	case R_PPC_GOT_TLSLD16_HI:
5175	case R_PPC_GOT_TLSLD16_HA:
5176	case R_PPC_GOT_TLSGD16:
5177	case R_PPC_GOT_TLSGD16_LO:
5178	case R_PPC_GOT_TLSGD16_HI:
5179	case R_PPC_GOT_TLSGD16_HA:
5180	case R_PPC_GOT_TPREL16:
5181	case R_PPC_GOT_TPREL16_LO:
5182	case R_PPC_GOT_TPREL16_HI:
5183	case R_PPC_GOT_TPREL16_HA:
5184	case R_PPC_GOT_DTPREL16:
5185	case R_PPC_GOT_DTPREL16_LO:
5186	case R_PPC_GOT_DTPREL16_HI:
5187	case R_PPC_GOT_DTPREL16_HA:
5188	case R_PPC_GOT16:
5189	case R_PPC_GOT16_LO:
5190	case R_PPC_GOT16_HI:
5191	case R_PPC_GOT16_HA:
5192	  if (h != NULL)
5193	    {
5194	      if (h->got.refcount > 0)
5195		h->got.refcount--;
5196	      if (!bfd_link_pic (info))
5197		{
5198		  struct plt_entry *ent;
5199
5200		  ent = find_plt_ent (&h->plt.plist, NULL, 0);
5201		  if (ent != NULL && ent->plt.refcount > 0)
5202		    ent->plt.refcount -= 1;
5203		}
5204	    }
5205	  else if (local_got_refcounts != NULL)
5206	    {
5207	      if (local_got_refcounts[r_symndx] > 0)
5208		local_got_refcounts[r_symndx]--;
5209	    }
5210	  break;
5211
5212	case R_PPC_REL24:
5213	case R_PPC_REL14:
5214	case R_PPC_REL14_BRTAKEN:
5215	case R_PPC_REL14_BRNTAKEN:
5216	case R_PPC_REL32:
5217	  if (h == NULL || h == htab->elf.hgot)
5218	    break;
5219	  /* Fall through.  */
5220
5221	case R_PPC_ADDR32:
5222	case R_PPC_ADDR24:
5223	case R_PPC_ADDR16:
5224	case R_PPC_ADDR16_LO:
5225	case R_PPC_ADDR16_HI:
5226	case R_PPC_ADDR16_HA:
5227	case R_PPC_ADDR14:
5228	case R_PPC_ADDR14_BRTAKEN:
5229	case R_PPC_ADDR14_BRNTAKEN:
5230	case R_PPC_UADDR32:
5231	case R_PPC_UADDR16:
5232	  if (bfd_link_pic (info))
5233	    break;
5234	  /* Fall through.  */
5235
5236	case R_PPC_PLT32:
5237	case R_PPC_PLTREL24:
5238	case R_PPC_PLTREL32:
5239	case R_PPC_PLT16_LO:
5240	case R_PPC_PLT16_HI:
5241	case R_PPC_PLT16_HA:
5242	  if (h != NULL)
5243	    {
5244	      bfd_vma addend = 0;
5245	      struct plt_entry *ent;
5246
5247	      if (r_type == R_PPC_PLTREL24 && bfd_link_pic (info))
5248		addend = rel->r_addend;
5249	      ent = find_plt_ent (&h->plt.plist, got2, addend);
5250	      if (ent != NULL && ent->plt.refcount > 0)
5251		ent->plt.refcount -= 1;
5252	    }
5253	  break;
5254
5255	default:
5256	  break;
5257	}
5258    }
5259  return TRUE;
5260}
5261
5262/* Set plt output section type, htab->tls_get_addr, and call the
5263   generic ELF tls_setup function.  */
5264
5265asection *
5266ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
5267{
5268  struct ppc_elf_link_hash_table *htab;
5269
5270  htab = ppc_elf_hash_table (info);
5271  htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5272					     FALSE, FALSE, TRUE);
5273  if (htab->plt_type != PLT_NEW)
5274    htab->params->no_tls_get_addr_opt = TRUE;
5275
5276  if (!htab->params->no_tls_get_addr_opt)
5277    {
5278      struct elf_link_hash_entry *opt, *tga;
5279      opt = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
5280				  FALSE, FALSE, TRUE);
5281      if (opt != NULL
5282	  && (opt->root.type == bfd_link_hash_defined
5283	      || opt->root.type == bfd_link_hash_defweak))
5284	{
5285	  /* If glibc supports an optimized __tls_get_addr call stub,
5286	     signalled by the presence of __tls_get_addr_opt, and we'll
5287	     be calling __tls_get_addr via a plt call stub, then
5288	     make __tls_get_addr point to __tls_get_addr_opt.  */
5289	  tga = htab->tls_get_addr;
5290	  if (htab->elf.dynamic_sections_created
5291	      && tga != NULL
5292	      && (tga->type == STT_FUNC
5293		  || tga->needs_plt)
5294	      && !(SYMBOL_CALLS_LOCAL (info, tga)
5295		   || (ELF_ST_VISIBILITY (tga->other) != STV_DEFAULT
5296		       && tga->root.type == bfd_link_hash_undefweak)))
5297	    {
5298	      struct plt_entry *ent;
5299	      for (ent = tga->plt.plist; ent != NULL; ent = ent->next)
5300		if (ent->plt.refcount > 0)
5301		  break;
5302	      if (ent != NULL)
5303		{
5304		  tga->root.type = bfd_link_hash_indirect;
5305		  tga->root.u.i.link = &opt->root;
5306		  ppc_elf_copy_indirect_symbol (info, opt, tga);
5307		  opt->forced_local = 0;
5308		  if (opt->dynindx != -1)
5309		    {
5310		      /* Use __tls_get_addr_opt in dynamic relocations.  */
5311		      opt->dynindx = -1;
5312		      _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
5313					      opt->dynstr_index);
5314		      if (!bfd_elf_link_record_dynamic_symbol (info, opt))
5315			return FALSE;
5316		    }
5317		  htab->tls_get_addr = opt;
5318		}
5319	    }
5320	}
5321      else
5322	htab->params->no_tls_get_addr_opt = TRUE;
5323    }
5324  if (htab->plt_type == PLT_NEW
5325      && htab->elf.splt != NULL
5326      && htab->elf.splt->output_section != NULL)
5327    {
5328      elf_section_type (htab->elf.splt->output_section) = SHT_PROGBITS;
5329      elf_section_flags (htab->elf.splt->output_section) = SHF_ALLOC + SHF_WRITE;
5330    }
5331
5332  return _bfd_elf_tls_setup (obfd, info);
5333}
5334
5335/* Return TRUE iff REL is a branch reloc with a global symbol matching
5336   HASH.  */
5337
5338static bfd_boolean
5339branch_reloc_hash_match (const bfd *ibfd,
5340			 const Elf_Internal_Rela *rel,
5341			 const struct elf_link_hash_entry *hash)
5342{
5343  Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
5344  enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
5345  unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
5346
5347  if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
5348    {
5349      struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5350      struct elf_link_hash_entry *h;
5351
5352      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5353      while (h->root.type == bfd_link_hash_indirect
5354	     || h->root.type == bfd_link_hash_warning)
5355	h = (struct elf_link_hash_entry *) h->root.u.i.link;
5356      if (h == hash)
5357	return TRUE;
5358    }
5359  return FALSE;
5360}
5361
5362/* Run through all the TLS relocs looking for optimization
5363   opportunities.  */
5364
5365bfd_boolean
5366ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
5367		      struct bfd_link_info *info)
5368{
5369  bfd *ibfd;
5370  asection *sec;
5371  struct ppc_elf_link_hash_table *htab;
5372  int pass;
5373
5374  if (!bfd_link_executable (info))
5375    return TRUE;
5376
5377  htab = ppc_elf_hash_table (info);
5378  if (htab == NULL)
5379    return FALSE;
5380
5381  /* Make two passes through the relocs.  First time check that tls
5382     relocs involved in setting up a tls_get_addr call are indeed
5383     followed by such a call.  If they are not, don't do any tls
5384     optimization.  On the second pass twiddle tls_mask flags to
5385     notify relocate_section that optimization can be done, and
5386     adjust got and plt refcounts.  */
5387  for (pass = 0; pass < 2; ++pass)
5388    for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
5389      {
5390	Elf_Internal_Sym *locsyms = NULL;
5391	Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
5392	asection *got2 = bfd_get_section_by_name (ibfd, ".got2");
5393
5394	for (sec = ibfd->sections; sec != NULL; sec = sec->next)
5395	  if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
5396	    {
5397	      Elf_Internal_Rela *relstart, *rel, *relend;
5398	      int expecting_tls_get_addr = 0;
5399
5400	      /* Read the relocations.  */
5401	      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
5402						    info->keep_memory);
5403	      if (relstart == NULL)
5404		return FALSE;
5405
5406	      relend = relstart + sec->reloc_count;
5407	      for (rel = relstart; rel < relend; rel++)
5408		{
5409		  enum elf_ppc_reloc_type r_type;
5410		  unsigned long r_symndx;
5411		  struct elf_link_hash_entry *h = NULL;
5412		  char *tls_mask;
5413		  char tls_set, tls_clear;
5414		  bfd_boolean is_local;
5415		  bfd_signed_vma *got_count;
5416
5417		  r_symndx = ELF32_R_SYM (rel->r_info);
5418		  if (r_symndx >= symtab_hdr->sh_info)
5419		    {
5420		      struct elf_link_hash_entry **sym_hashes;
5421
5422		      sym_hashes = elf_sym_hashes (ibfd);
5423		      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5424		      while (h->root.type == bfd_link_hash_indirect
5425			     || h->root.type == bfd_link_hash_warning)
5426			h = (struct elf_link_hash_entry *) h->root.u.i.link;
5427		    }
5428
5429		  is_local = FALSE;
5430		  if (h == NULL
5431		      || !h->def_dynamic)
5432		    is_local = TRUE;
5433
5434		  r_type = ELF32_R_TYPE (rel->r_info);
5435		  /* If this section has old-style __tls_get_addr calls
5436		     without marker relocs, then check that each
5437		     __tls_get_addr call reloc is preceded by a reloc
5438		     that conceivably belongs to the __tls_get_addr arg
5439		     setup insn.  If we don't find matching arg setup
5440		     relocs, don't do any tls optimization.  */
5441		  if (pass == 0
5442		      && sec->has_tls_get_addr_call
5443		      && h != NULL
5444		      && h == htab->tls_get_addr
5445		      && !expecting_tls_get_addr
5446		      && is_branch_reloc (r_type))
5447		    {
5448		      info->callbacks->minfo ("%H __tls_get_addr lost arg, "
5449					      "TLS optimization disabled\n",
5450					      ibfd, sec, rel->r_offset);
5451		      if (elf_section_data (sec)->relocs != relstart)
5452			free (relstart);
5453		      return TRUE;
5454		    }
5455
5456		  expecting_tls_get_addr = 0;
5457		  switch (r_type)
5458		    {
5459		    case R_PPC_GOT_TLSLD16:
5460		    case R_PPC_GOT_TLSLD16_LO:
5461		      expecting_tls_get_addr = 1;
5462		      /* Fall through.  */
5463
5464		    case R_PPC_GOT_TLSLD16_HI:
5465		    case R_PPC_GOT_TLSLD16_HA:
5466		      /* These relocs should never be against a symbol
5467			 defined in a shared lib.  Leave them alone if
5468			 that turns out to be the case.  */
5469		      if (!is_local)
5470			continue;
5471
5472		      /* LD -> LE */
5473		      tls_set = 0;
5474		      tls_clear = TLS_LD;
5475		      break;
5476
5477		    case R_PPC_GOT_TLSGD16:
5478		    case R_PPC_GOT_TLSGD16_LO:
5479		      expecting_tls_get_addr = 1;
5480		      /* Fall through.  */
5481
5482		    case R_PPC_GOT_TLSGD16_HI:
5483		    case R_PPC_GOT_TLSGD16_HA:
5484		      if (is_local)
5485			/* GD -> LE */
5486			tls_set = 0;
5487		      else
5488			/* GD -> IE */
5489			tls_set = TLS_TLS | TLS_TPRELGD;
5490		      tls_clear = TLS_GD;
5491		      break;
5492
5493		    case R_PPC_GOT_TPREL16:
5494		    case R_PPC_GOT_TPREL16_LO:
5495		    case R_PPC_GOT_TPREL16_HI:
5496		    case R_PPC_GOT_TPREL16_HA:
5497		      if (is_local)
5498			{
5499			  /* IE -> LE */
5500			  tls_set = 0;
5501			  tls_clear = TLS_TPREL;
5502			  break;
5503			}
5504		      else
5505			continue;
5506
5507		    case R_PPC_TLSGD:
5508		    case R_PPC_TLSLD:
5509		      expecting_tls_get_addr = 2;
5510		      tls_set = 0;
5511		      tls_clear = 0;
5512		      break;
5513
5514		    default:
5515		      continue;
5516		    }
5517
5518		  if (pass == 0)
5519		    {
5520		      if (!expecting_tls_get_addr
5521			  || (expecting_tls_get_addr == 1
5522			      && !sec->has_tls_get_addr_call))
5523			continue;
5524
5525		      if (rel + 1 < relend
5526			  && branch_reloc_hash_match (ibfd, rel + 1,
5527						      htab->tls_get_addr))
5528			continue;
5529
5530		      /* Uh oh, we didn't find the expected call.  We
5531			 could just mark this symbol to exclude it
5532			 from tls optimization but it's safer to skip
5533			 the entire optimization.  */
5534		      info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
5535						"TLS optimization disabled\n"),
5536					      ibfd, sec, rel->r_offset);
5537		      if (elf_section_data (sec)->relocs != relstart)
5538			free (relstart);
5539		      return TRUE;
5540		    }
5541
5542		  if (expecting_tls_get_addr)
5543		    {
5544		      struct plt_entry *ent;
5545		      bfd_vma addend = 0;
5546
5547		      if (bfd_link_pic (info)
5548			  && ELF32_R_TYPE (rel[1].r_info) == R_PPC_PLTREL24)
5549			addend = rel[1].r_addend;
5550		      ent = find_plt_ent (&htab->tls_get_addr->plt.plist,
5551					  got2, addend);
5552		      if (ent != NULL && ent->plt.refcount > 0)
5553			ent->plt.refcount -= 1;
5554
5555		      if (expecting_tls_get_addr == 2)
5556			continue;
5557		    }
5558
5559		  if (h != NULL)
5560		    {
5561		      tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
5562		      got_count = &h->got.refcount;
5563		    }
5564		  else
5565		    {
5566		      bfd_signed_vma *lgot_refs;
5567		      struct plt_entry **local_plt;
5568		      char *lgot_masks;
5569
5570		      if (locsyms == NULL)
5571			{
5572			  locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5573			  if (locsyms == NULL)
5574			    locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5575							    symtab_hdr->sh_info,
5576							    0, NULL, NULL, NULL);
5577			  if (locsyms == NULL)
5578			    {
5579			      if (elf_section_data (sec)->relocs != relstart)
5580				free (relstart);
5581			      return FALSE;
5582			    }
5583			}
5584		      lgot_refs = elf_local_got_refcounts (ibfd);
5585		      if (lgot_refs == NULL)
5586			abort ();
5587		      local_plt = (struct plt_entry **)
5588			(lgot_refs + symtab_hdr->sh_info);
5589		      lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
5590		      tls_mask = &lgot_masks[r_symndx];
5591		      got_count = &lgot_refs[r_symndx];
5592		    }
5593
5594		  if (tls_set == 0)
5595		    {
5596		      /* We managed to get rid of a got entry.  */
5597		      if (*got_count > 0)
5598			*got_count -= 1;
5599		    }
5600
5601		  *tls_mask |= tls_set;
5602		  *tls_mask &= ~tls_clear;
5603		}
5604
5605	      if (elf_section_data (sec)->relocs != relstart)
5606		free (relstart);
5607	    }
5608
5609	if (locsyms != NULL
5610	    && (symtab_hdr->contents != (unsigned char *) locsyms))
5611	  {
5612	    if (!info->keep_memory)
5613	      free (locsyms);
5614	    else
5615	      symtab_hdr->contents = (unsigned char *) locsyms;
5616	  }
5617      }
5618  return TRUE;
5619}
5620
5621/* Return true if we have dynamic relocs that apply to read-only sections.  */
5622
5623static bfd_boolean
5624readonly_dynrelocs (struct elf_link_hash_entry *h)
5625{
5626  struct elf_dyn_relocs *p;
5627
5628  for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
5629    {
5630      asection *s = p->sec->output_section;
5631
5632      if (s != NULL
5633	  && ((s->flags & (SEC_READONLY | SEC_ALLOC))
5634	      == (SEC_READONLY | SEC_ALLOC)))
5635	return TRUE;
5636    }
5637  return FALSE;
5638}
5639
5640/* Adjust a symbol defined by a dynamic object and referenced by a
5641   regular object.  The current definition is in some section of the
5642   dynamic object, but we're not including those sections.  We have to
5643   change the definition to something the rest of the link can
5644   understand.  */
5645
5646static bfd_boolean
5647ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5648			       struct elf_link_hash_entry *h)
5649{
5650  struct ppc_elf_link_hash_table *htab;
5651  asection *s;
5652
5653#ifdef DEBUG
5654  fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
5655	   h->root.root.string);
5656#endif
5657
5658  /* Make sure we know what is going on here.  */
5659  htab = ppc_elf_hash_table (info);
5660  BFD_ASSERT (htab->elf.dynobj != NULL
5661	      && (h->needs_plt
5662		  || h->type == STT_GNU_IFUNC
5663		  || h->u.weakdef != NULL
5664		  || (h->def_dynamic
5665		      && h->ref_regular
5666		      && !h->def_regular)));
5667
5668  /* Deal with function syms.  */
5669  if (h->type == STT_FUNC
5670      || h->type == STT_GNU_IFUNC
5671      || h->needs_plt)
5672    {
5673      /* Clear procedure linkage table information for any symbol that
5674	 won't need a .plt entry.  */
5675      struct plt_entry *ent;
5676      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5677	if (ent->plt.refcount > 0)
5678	  break;
5679      if (ent == NULL
5680	  || (h->type != STT_GNU_IFUNC
5681	      && (SYMBOL_CALLS_LOCAL (info, h)
5682		  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5683		      && h->root.type == bfd_link_hash_undefweak))))
5684	{
5685	  /* A PLT entry is not required/allowed when:
5686
5687	     1. We are not using ld.so; because then the PLT entry
5688	     can't be set up, so we can't use one.  In this case,
5689	     ppc_elf_adjust_dynamic_symbol won't even be called.
5690
5691	     2. GC has rendered the entry unused.
5692
5693	     3. We know for certain that a call to this symbol
5694	     will go to this object, or will remain undefined.  */
5695	  h->plt.plist = NULL;
5696	  h->needs_plt = 0;
5697	  h->pointer_equality_needed = 0;
5698	}
5699      else
5700	{
5701	  /* Taking a function's address in a read/write section
5702	     doesn't require us to define the function symbol in the
5703	     executable on a plt call stub.  A dynamic reloc can
5704	     be used instead.  */
5705	  if (h->pointer_equality_needed
5706	      && h->type != STT_GNU_IFUNC
5707	      && !htab->is_vxworks
5708	      && !ppc_elf_hash_entry (h)->has_sda_refs
5709	      && !readonly_dynrelocs (h))
5710	    {
5711	      h->pointer_equality_needed = 0;
5712	      h->non_got_ref = 0;
5713	    }
5714
5715	  /* After adjust_dynamic_symbol, non_got_ref set in the
5716	     non-shared case means that we have allocated space in
5717	     .dynbss for the symbol and thus dyn_relocs for this
5718	     symbol should be discarded.
5719	     If we get here we know we are making a PLT entry for this
5720	     symbol, and in an executable we'd normally resolve
5721	     relocations against this symbol to the PLT entry.  Allow
5722	     dynamic relocs if the reference is weak, and the dynamic
5723	     relocs will not cause text relocation.  */
5724	  else if (!h->ref_regular_nonweak
5725		   && h->non_got_ref
5726		   && h->type != STT_GNU_IFUNC
5727		   && !htab->is_vxworks
5728		   && !ppc_elf_hash_entry (h)->has_sda_refs
5729		   && !readonly_dynrelocs (h))
5730	    h->non_got_ref = 0;
5731	}
5732      h->protected_def = 0;
5733      return TRUE;
5734    }
5735  else
5736    h->plt.plist = NULL;
5737
5738  /* If this is a weak symbol, and there is a real definition, the
5739     processor independent code will have arranged for us to see the
5740     real definition first, and we can just use the same value.  */
5741  if (h->u.weakdef != NULL)
5742    {
5743      BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5744		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5745      h->root.u.def.section = h->u.weakdef->root.u.def.section;
5746      h->root.u.def.value = h->u.weakdef->root.u.def.value;
5747      if (ELIMINATE_COPY_RELOCS)
5748	h->non_got_ref = h->u.weakdef->non_got_ref;
5749      return TRUE;
5750    }
5751
5752  /* This is a reference to a symbol defined by a dynamic object which
5753     is not a function.  */
5754
5755  /* If we are creating a shared library, we must presume that the
5756     only references to the symbol are via the global offset table.
5757     For such cases we need not do anything here; the relocations will
5758     be handled correctly by relocate_section.  */
5759  if (bfd_link_pic (info))
5760    {
5761      h->protected_def = 0;
5762      return TRUE;
5763    }
5764
5765  /* If there are no references to this symbol that do not use the
5766     GOT, we don't need to generate a copy reloc.  */
5767  if (!h->non_got_ref)
5768    {
5769      h->protected_def = 0;
5770      return TRUE;
5771    }
5772
5773  /* Protected variables do not work with .dynbss.  The copy in
5774     .dynbss won't be used by the shared library with the protected
5775     definition for the variable.  Editing to PIC, or text relocations
5776     are preferable to an incorrect program.  */
5777  if (h->protected_def)
5778    {
5779      if (ELIMINATE_COPY_RELOCS
5780	  && ppc_elf_hash_entry (h)->has_addr16_ha
5781	  && ppc_elf_hash_entry (h)->has_addr16_lo
5782	  && htab->params->pic_fixup == 0
5783	  && info->disable_target_specific_optimizations <= 1)
5784	htab->params->pic_fixup = 1;
5785      h->non_got_ref = 0;
5786      return TRUE;
5787    }
5788
5789  /* If -z nocopyreloc was given, we won't generate them either.  */
5790  if (info->nocopyreloc)
5791    {
5792      h->non_got_ref = 0;
5793      return TRUE;
5794    }
5795
5796   /* If we didn't find any dynamic relocs in read-only sections, then
5797      we'll be keeping the dynamic relocs and avoiding the copy reloc.
5798      We can't do this if there are any small data relocations.  This
5799      doesn't work on VxWorks, where we can not have dynamic
5800      relocations (other than copy and jump slot relocations) in an
5801      executable.  */
5802  if (ELIMINATE_COPY_RELOCS
5803      && !ppc_elf_hash_entry (h)->has_sda_refs
5804      && !htab->is_vxworks
5805      && !h->def_regular
5806      && !readonly_dynrelocs (h))
5807    {
5808      h->non_got_ref = 0;
5809      return TRUE;
5810    }
5811
5812  /* We must allocate the symbol in our .dynbss section, which will
5813     become part of the .bss section of the executable.  There will be
5814     an entry for this symbol in the .dynsym section.  The dynamic
5815     object will contain position independent code, so all references
5816     from the dynamic object to this symbol will go through the global
5817     offset table.  The dynamic linker will use the .dynsym entry to
5818     determine the address it must put in the global offset table, so
5819     both the dynamic object and the regular object will refer to the
5820     same memory location for the variable.
5821
5822     Of course, if the symbol is referenced using SDAREL relocs, we
5823     must instead allocate it in .sbss.  */
5824
5825  if (ppc_elf_hash_entry (h)->has_sda_refs)
5826    s = htab->dynsbss;
5827  else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
5828    s = htab->elf.sdynrelro;
5829  else
5830    s = htab->elf.sdynbss;
5831  BFD_ASSERT (s != NULL);
5832
5833  /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
5834     copy the initial value out of the dynamic object and into the
5835     runtime process image.  We need to remember the offset into the
5836     .rela.bss section we are going to use.  */
5837  if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
5838    {
5839      asection *srel;
5840
5841      if (ppc_elf_hash_entry (h)->has_sda_refs)
5842	srel = htab->relsbss;
5843      else if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
5844	srel = htab->elf.sreldynrelro;
5845      else
5846	srel = htab->elf.srelbss;
5847      BFD_ASSERT (srel != NULL);
5848      srel->size += sizeof (Elf32_External_Rela);
5849      h->needs_copy = 1;
5850    }
5851
5852  return _bfd_elf_adjust_dynamic_copy (info, h, s);
5853}
5854
5855/* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
5856   xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
5857   specifying the addend on the plt relocation.  For -fpic code, the sym
5858   is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
5859   xxxxxxxx.got2.plt_pic32.<callee>.  */
5860
5861static bfd_boolean
5862add_stub_sym (struct plt_entry *ent,
5863	      struct elf_link_hash_entry *h,
5864	      struct bfd_link_info *info)
5865{
5866  struct elf_link_hash_entry *sh;
5867  size_t len1, len2, len3;
5868  char *name;
5869  const char *stub;
5870  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
5871
5872  if (bfd_link_pic (info))
5873    stub = ".plt_pic32.";
5874  else
5875    stub = ".plt_call32.";
5876
5877  len1 = strlen (h->root.root.string);
5878  len2 = strlen (stub);
5879  len3 = 0;
5880  if (ent->sec)
5881    len3 = strlen (ent->sec->name);
5882  name = bfd_malloc (len1 + len2 + len3 + 9);
5883  if (name == NULL)
5884    return FALSE;
5885  sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
5886  if (ent->sec)
5887    memcpy (name + 8, ent->sec->name, len3);
5888  memcpy (name + 8 + len3, stub, len2);
5889  memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
5890  sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
5891  if (sh == NULL)
5892    return FALSE;
5893  if (sh->root.type == bfd_link_hash_new)
5894    {
5895      sh->root.type = bfd_link_hash_defined;
5896      sh->root.u.def.section = htab->glink;
5897      sh->root.u.def.value = ent->glink_offset;
5898      sh->ref_regular = 1;
5899      sh->def_regular = 1;
5900      sh->ref_regular_nonweak = 1;
5901      sh->forced_local = 1;
5902      sh->non_elf = 0;
5903      sh->root.linker_def = 1;
5904    }
5905  return TRUE;
5906}
5907
5908/* Allocate NEED contiguous space in .got, and return the offset.
5909   Handles allocation of the got header when crossing 32k.  */
5910
5911static bfd_vma
5912allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
5913{
5914  bfd_vma where;
5915  unsigned int max_before_header;
5916
5917  if (htab->plt_type == PLT_VXWORKS)
5918    {
5919      where = htab->elf.sgot->size;
5920      htab->elf.sgot->size += need;
5921    }
5922  else
5923    {
5924      max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
5925      if (need <= htab->got_gap)
5926	{
5927	  where = max_before_header - htab->got_gap;
5928	  htab->got_gap -= need;
5929	}
5930      else
5931	{
5932	  if (htab->elf.sgot->size + need > max_before_header
5933	      && htab->elf.sgot->size <= max_before_header)
5934	    {
5935	      htab->got_gap = max_before_header - htab->elf.sgot->size;
5936	      htab->elf.sgot->size = max_before_header + htab->got_header_size;
5937	    }
5938	  where = htab->elf.sgot->size;
5939	  htab->elf.sgot->size += need;
5940	}
5941    }
5942  return where;
5943}
5944
5945/* Allocate space in associated reloc sections for dynamic relocs.  */
5946
5947static bfd_boolean
5948allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5949{
5950  struct bfd_link_info *info = inf;
5951  struct ppc_elf_link_hash_entry *eh;
5952  struct ppc_elf_link_hash_table *htab;
5953  struct elf_dyn_relocs *p;
5954
5955  if (h->root.type == bfd_link_hash_indirect)
5956    return TRUE;
5957
5958  htab = ppc_elf_hash_table (info);
5959  if (htab->elf.dynamic_sections_created
5960      || h->type == STT_GNU_IFUNC)
5961    {
5962      struct plt_entry *ent;
5963      bfd_boolean doneone = FALSE;
5964      bfd_vma plt_offset = 0, glink_offset = 0;
5965      bfd_boolean dyn;
5966
5967      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5968	if (ent->plt.refcount > 0)
5969	  {
5970	    /* Make sure this symbol is output as a dynamic symbol.  */
5971	    if (h->dynindx == -1
5972		&& !h->forced_local
5973		&& !h->def_regular
5974		&& htab->elf.dynamic_sections_created)
5975	      {
5976		if (! bfd_elf_link_record_dynamic_symbol (info, h))
5977		  return FALSE;
5978	      }
5979
5980	    dyn = htab->elf.dynamic_sections_created;
5981	    if (bfd_link_pic (info)
5982		|| h->type == STT_GNU_IFUNC
5983		|| WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
5984	      {
5985		asection *s = htab->elf.splt;
5986		if (!dyn || h->dynindx == -1)
5987		  s = htab->elf.iplt;
5988
5989		if (htab->plt_type == PLT_NEW || !dyn || h->dynindx == -1)
5990		  {
5991		    if (!doneone)
5992		      {
5993			plt_offset = s->size;
5994			s->size += 4;
5995		      }
5996		    ent->plt.offset = plt_offset;
5997
5998		    s = htab->glink;
5999		    if (!doneone || bfd_link_pic (info))
6000		      {
6001			glink_offset = s->size;
6002			s->size += GLINK_ENTRY_SIZE;
6003			if (h == htab->tls_get_addr
6004			    && !htab->params->no_tls_get_addr_opt)
6005			  s->size += TLS_GET_ADDR_GLINK_SIZE - GLINK_ENTRY_SIZE;
6006		      }
6007		    if (!doneone
6008			&& !bfd_link_pic (info)
6009			&& h->def_dynamic
6010			&& !h->def_regular)
6011		      {
6012			h->root.u.def.section = s;
6013			h->root.u.def.value = glink_offset;
6014		      }
6015		    ent->glink_offset = glink_offset;
6016
6017		    if (htab->params->emit_stub_syms
6018			&& !add_stub_sym (ent, h, info))
6019		      return FALSE;
6020		  }
6021		else
6022		  {
6023		    if (!doneone)
6024		      {
6025			/* If this is the first .plt entry, make room
6026			   for the special first entry.  */
6027			if (s->size == 0)
6028			  s->size += htab->plt_initial_entry_size;
6029
6030			/* The PowerPC PLT is actually composed of two
6031			   parts, the first part is 2 words (for a load
6032			   and a jump), and then there is a remaining
6033			   word available at the end.  */
6034			plt_offset = (htab->plt_initial_entry_size
6035				      + (htab->plt_slot_size
6036					 * ((s->size
6037					     - htab->plt_initial_entry_size)
6038					    / htab->plt_entry_size)));
6039
6040			/* If this symbol is not defined in a regular
6041			   file, and we are not generating a shared
6042			   library, then set the symbol to this location
6043			   in the .plt.  This is to avoid text
6044			   relocations, and is required to make
6045			   function pointers compare as equal between
6046			   the normal executable and the shared library.  */
6047			if (! bfd_link_pic (info)
6048			    && h->def_dynamic
6049			    && !h->def_regular)
6050			  {
6051			    h->root.u.def.section = s;
6052			    h->root.u.def.value = plt_offset;
6053			  }
6054
6055			/* Make room for this entry.  */
6056			s->size += htab->plt_entry_size;
6057			/* After the 8192nd entry, room for two entries
6058			   is allocated.  */
6059			if (htab->plt_type == PLT_OLD
6060			    && (s->size - htab->plt_initial_entry_size)
6061				/ htab->plt_entry_size
6062			       > PLT_NUM_SINGLE_ENTRIES)
6063			  s->size += htab->plt_entry_size;
6064		      }
6065		    ent->plt.offset = plt_offset;
6066		  }
6067
6068		/* We also need to make an entry in the .rela.plt section.  */
6069		if (!doneone)
6070		  {
6071		    if (!htab->elf.dynamic_sections_created
6072			|| h->dynindx == -1)
6073		      htab->elf.irelplt->size += sizeof (Elf32_External_Rela);
6074		    else
6075		      {
6076			htab->elf.srelplt->size += sizeof (Elf32_External_Rela);
6077
6078			if (htab->plt_type == PLT_VXWORKS)
6079			  {
6080			    /* Allocate space for the unloaded relocations.  */
6081			    if (!bfd_link_pic (info)
6082				&& htab->elf.dynamic_sections_created)
6083			      {
6084				if (ent->plt.offset
6085				    == (bfd_vma) htab->plt_initial_entry_size)
6086				  {
6087				    htab->srelplt2->size
6088				      += (sizeof (Elf32_External_Rela)
6089					  * VXWORKS_PLTRESOLVE_RELOCS);
6090				  }
6091
6092				htab->srelplt2->size
6093				  += (sizeof (Elf32_External_Rela)
6094				      * VXWORKS_PLT_NON_JMP_SLOT_RELOCS);
6095			      }
6096
6097			    /* Every PLT entry has an associated GOT entry in
6098			       .got.plt.  */
6099			    htab->elf.sgotplt->size += 4;
6100			  }
6101		      }
6102		    doneone = TRUE;
6103		  }
6104	      }
6105	    else
6106	      ent->plt.offset = (bfd_vma) -1;
6107	  }
6108	else
6109	  ent->plt.offset = (bfd_vma) -1;
6110
6111      if (!doneone)
6112	{
6113	  h->plt.plist = NULL;
6114	  h->needs_plt = 0;
6115	}
6116    }
6117  else
6118    {
6119      h->plt.plist = NULL;
6120      h->needs_plt = 0;
6121    }
6122
6123  eh = (struct ppc_elf_link_hash_entry *) h;
6124  if (eh->elf.got.refcount > 0
6125      || (ELIMINATE_COPY_RELOCS
6126	  && !eh->elf.def_regular
6127	  && eh->elf.protected_def
6128	  && eh->has_addr16_ha
6129	  && eh->has_addr16_lo
6130	  && htab->params->pic_fixup > 0))
6131    {
6132      bfd_boolean dyn;
6133      unsigned int need;
6134
6135      /* Make sure this symbol is output as a dynamic symbol.  */
6136      if (eh->elf.dynindx == -1
6137	  && !eh->elf.forced_local
6138	  && eh->elf.type != STT_GNU_IFUNC
6139	  && htab->elf.dynamic_sections_created)
6140	{
6141	  if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
6142	    return FALSE;
6143	}
6144
6145      need = 0;
6146      if ((eh->tls_mask & TLS_TLS) != 0)
6147	{
6148	  if ((eh->tls_mask & TLS_LD) != 0)
6149	    {
6150	      if (!eh->elf.def_dynamic)
6151		/* We'll just use htab->tlsld_got.offset.  This should
6152		   always be the case.  It's a little odd if we have
6153		   a local dynamic reloc against a non-local symbol.  */
6154		htab->tlsld_got.refcount += 1;
6155	      else
6156		need += 8;
6157	    }
6158	  if ((eh->tls_mask & TLS_GD) != 0)
6159	    need += 8;
6160	  if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
6161	    need += 4;
6162	  if ((eh->tls_mask & TLS_DTPREL) != 0)
6163	    need += 4;
6164	}
6165      else
6166	need += 4;
6167      if (need == 0)
6168	eh->elf.got.offset = (bfd_vma) -1;
6169      else
6170	{
6171	  eh->elf.got.offset = allocate_got (htab, need);
6172	  dyn = htab->elf.dynamic_sections_created;
6173	  if ((bfd_link_pic (info)
6174	       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
6175	      && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
6176		  || eh->elf.root.type != bfd_link_hash_undefweak))
6177	    {
6178	      asection *rsec = htab->elf.srelgot;
6179
6180	      if (eh->elf.type == STT_GNU_IFUNC)
6181		rsec = htab->elf.irelplt;
6182	      /* All the entries we allocated need relocs.
6183		 Except LD only needs one.  */
6184	      if ((eh->tls_mask & TLS_LD) != 0
6185		  && eh->elf.def_dynamic)
6186		need -= 4;
6187	      rsec->size += need * (sizeof (Elf32_External_Rela) / 4);
6188	    }
6189	}
6190    }
6191  else
6192    eh->elf.got.offset = (bfd_vma) -1;
6193
6194  if (eh->dyn_relocs == NULL
6195      || !htab->elf.dynamic_sections_created)
6196    return TRUE;
6197
6198  /* In the shared -Bsymbolic case, discard space allocated for
6199     dynamic pc-relative relocs against symbols which turn out to be
6200     defined in regular objects.  For the normal shared case, discard
6201     space for relocs that have become local due to symbol visibility
6202     changes.  */
6203
6204  if (bfd_link_pic (info))
6205    {
6206      /* Relocs that use pc_count are those that appear on a call insn,
6207	 or certain REL relocs (see must_be_dyn_reloc) that can be
6208	 generated via assembly.  We want calls to protected symbols to
6209	 resolve directly to the function rather than going via the plt.
6210	 If people want function pointer comparisons to work as expected
6211	 then they should avoid writing weird assembly.  */
6212      if (SYMBOL_CALLS_LOCAL (info, h))
6213	{
6214	  struct elf_dyn_relocs **pp;
6215
6216	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6217	    {
6218	      p->count -= p->pc_count;
6219	      p->pc_count = 0;
6220	      if (p->count == 0)
6221		*pp = p->next;
6222	      else
6223		pp = &p->next;
6224	    }
6225	}
6226
6227      if (htab->is_vxworks)
6228	{
6229	  struct elf_dyn_relocs **pp;
6230
6231	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
6232	    {
6233	      if (strcmp (p->sec->output_section->name, ".tls_vars") == 0)
6234		*pp = p->next;
6235	      else
6236		pp = &p->next;
6237	    }
6238	}
6239
6240      /* Discard relocs on undefined symbols that must be local.  */
6241      if (eh->dyn_relocs != NULL
6242	  && h->root.type == bfd_link_hash_undefined
6243	  && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
6244	      || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
6245	eh->dyn_relocs = NULL;
6246
6247      /* Also discard relocs on undefined weak syms with non-default
6248	 visibility.  */
6249      if (eh->dyn_relocs != NULL
6250	  && h->root.type == bfd_link_hash_undefweak)
6251	{
6252	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
6253	    eh->dyn_relocs = NULL;
6254
6255	  /* Make sure undefined weak symbols are output as a dynamic
6256	     symbol in PIEs.  */
6257	  else if (h->dynindx == -1
6258		   && !h->forced_local
6259		   && !h->def_regular)
6260	    {
6261	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
6262		return FALSE;
6263	    }
6264	}
6265    }
6266  else if (ELIMINATE_COPY_RELOCS)
6267    {
6268      /* For the non-shared case, discard space for relocs against
6269	 symbols which turn out to need copy relocs or are not
6270	 dynamic.  */
6271
6272      if (!h->non_got_ref
6273	  && !h->def_regular
6274	  && !(h->protected_def
6275	       && eh->has_addr16_ha
6276	       && eh->has_addr16_lo
6277	       && htab->params->pic_fixup > 0))
6278	{
6279	  /* Make sure this symbol is output as a dynamic symbol.
6280	     Undefined weak syms won't yet be marked as dynamic.  */
6281	  if (h->dynindx == -1
6282	      && !h->forced_local)
6283	    {
6284	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
6285		return FALSE;
6286	    }
6287
6288	  /* If that succeeded, we know we'll be keeping all the
6289	     relocs.  */
6290	  if (h->dynindx != -1)
6291	    goto keep;
6292	}
6293
6294      eh->dyn_relocs = NULL;
6295
6296    keep: ;
6297    }
6298
6299  /* Finally, allocate space.  */
6300  for (p = eh->dyn_relocs; p != NULL; p = p->next)
6301    {
6302      asection *sreloc = elf_section_data (p->sec)->sreloc;
6303      if (eh->elf.type == STT_GNU_IFUNC)
6304	sreloc = htab->elf.irelplt;
6305      sreloc->size += p->count * sizeof (Elf32_External_Rela);
6306    }
6307
6308  return TRUE;
6309}
6310
6311/* Set DF_TEXTREL if we find any dynamic relocs that apply to
6312   read-only sections.  */
6313
6314static bfd_boolean
6315maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
6316{
6317  if (h->root.type == bfd_link_hash_indirect)
6318    return TRUE;
6319
6320  if (readonly_dynrelocs (h))
6321    {
6322      ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
6323
6324      /* Not an error, just cut short the traversal.  */
6325      return FALSE;
6326    }
6327  return TRUE;
6328}
6329
6330static const unsigned char glink_eh_frame_cie[] =
6331{
6332  0, 0, 0, 16,				/* length.  */
6333  0, 0, 0, 0,				/* id.  */
6334  1,					/* CIE version.  */
6335  'z', 'R', 0,				/* Augmentation string.  */
6336  4,					/* Code alignment.  */
6337  0x7c,					/* Data alignment.  */
6338  65,					/* RA reg.  */
6339  1,					/* Augmentation size.  */
6340  DW_EH_PE_pcrel | DW_EH_PE_sdata4,	/* FDE encoding.  */
6341  DW_CFA_def_cfa, 1, 0			/* def_cfa: r1 offset 0.  */
6342};
6343
6344/* Set the sizes of the dynamic sections.  */
6345
6346static bfd_boolean
6347ppc_elf_size_dynamic_sections (bfd *output_bfd,
6348			       struct bfd_link_info *info)
6349{
6350  struct ppc_elf_link_hash_table *htab;
6351  asection *s;
6352  bfd_boolean relocs;
6353  bfd *ibfd;
6354
6355#ifdef DEBUG
6356  fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
6357#endif
6358
6359  htab = ppc_elf_hash_table (info);
6360  BFD_ASSERT (htab->elf.dynobj != NULL);
6361
6362  if (elf_hash_table (info)->dynamic_sections_created)
6363    {
6364      /* Set the contents of the .interp section to the interpreter.  */
6365      if (bfd_link_executable (info) && !info->nointerp)
6366	{
6367	  s = bfd_get_linker_section (htab->elf.dynobj, ".interp");
6368	  BFD_ASSERT (s != NULL);
6369	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
6370	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
6371	}
6372    }
6373
6374  if (htab->plt_type == PLT_OLD)
6375    htab->got_header_size = 16;
6376  else if (htab->plt_type == PLT_NEW)
6377    htab->got_header_size = 12;
6378
6379  /* Set up .got offsets for local syms, and space for local dynamic
6380     relocs.  */
6381  for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
6382    {
6383      bfd_signed_vma *local_got;
6384      bfd_signed_vma *end_local_got;
6385      struct plt_entry **local_plt;
6386      struct plt_entry **end_local_plt;
6387      char *lgot_masks;
6388      bfd_size_type locsymcount;
6389      Elf_Internal_Shdr *symtab_hdr;
6390
6391      if (!is_ppc_elf (ibfd))
6392	continue;
6393
6394      for (s = ibfd->sections; s != NULL; s = s->next)
6395	{
6396	  struct ppc_dyn_relocs *p;
6397
6398	  for (p = ((struct ppc_dyn_relocs *)
6399		    elf_section_data (s)->local_dynrel);
6400	       p != NULL;
6401	       p = p->next)
6402	    {
6403	      if (!bfd_is_abs_section (p->sec)
6404		  && bfd_is_abs_section (p->sec->output_section))
6405		{
6406		  /* Input section has been discarded, either because
6407		     it is a copy of a linkonce section or due to
6408		     linker script /DISCARD/, so we'll be discarding
6409		     the relocs too.  */
6410		}
6411	      else if (htab->is_vxworks
6412		       && strcmp (p->sec->output_section->name,
6413				  ".tls_vars") == 0)
6414		{
6415		  /* Relocations in vxworks .tls_vars sections are
6416		     handled specially by the loader.  */
6417		}
6418	      else if (p->count != 0)
6419		{
6420		  asection *sreloc = elf_section_data (p->sec)->sreloc;
6421		  if (p->ifunc)
6422		    sreloc = htab->elf.irelplt;
6423		  sreloc->size += p->count * sizeof (Elf32_External_Rela);
6424		  if ((p->sec->output_section->flags
6425		       & (SEC_READONLY | SEC_ALLOC))
6426		      == (SEC_READONLY | SEC_ALLOC))
6427		    info->flags |= DF_TEXTREL;
6428		}
6429	    }
6430	}
6431
6432      local_got = elf_local_got_refcounts (ibfd);
6433      if (!local_got)
6434	continue;
6435
6436      symtab_hdr = &elf_symtab_hdr (ibfd);
6437      locsymcount = symtab_hdr->sh_info;
6438      end_local_got = local_got + locsymcount;
6439      local_plt = (struct plt_entry **) end_local_got;
6440      end_local_plt = local_plt + locsymcount;
6441      lgot_masks = (char *) end_local_plt;
6442
6443      for (; local_got < end_local_got; ++local_got, ++lgot_masks)
6444	if (*local_got > 0)
6445	  {
6446	    unsigned int need = 0;
6447	    if ((*lgot_masks & TLS_TLS) != 0)
6448	      {
6449		if ((*lgot_masks & TLS_GD) != 0)
6450		  need += 8;
6451		if ((*lgot_masks & TLS_LD) != 0)
6452		  htab->tlsld_got.refcount += 1;
6453		if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
6454		  need += 4;
6455		if ((*lgot_masks & TLS_DTPREL) != 0)
6456		  need += 4;
6457	      }
6458	    else
6459	      need += 4;
6460	    if (need == 0)
6461	      *local_got = (bfd_vma) -1;
6462	    else
6463	      {
6464		*local_got = allocate_got (htab, need);
6465		if (bfd_link_pic (info))
6466		  {
6467		    asection *srel = htab->elf.srelgot;
6468		    if ((*lgot_masks & PLT_IFUNC) != 0)
6469		      srel = htab->elf.irelplt;
6470		    srel->size += need * (sizeof (Elf32_External_Rela) / 4);
6471		  }
6472	      }
6473	  }
6474	else
6475	  *local_got = (bfd_vma) -1;
6476
6477      if (htab->is_vxworks)
6478	continue;
6479
6480      /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt.  */
6481      for (; local_plt < end_local_plt; ++local_plt)
6482	{
6483	  struct plt_entry *ent;
6484	  bfd_boolean doneone = FALSE;
6485	  bfd_vma plt_offset = 0, glink_offset = 0;
6486
6487	  for (ent = *local_plt; ent != NULL; ent = ent->next)
6488	    if (ent->plt.refcount > 0)
6489	      {
6490		s = htab->elf.iplt;
6491
6492		if (!doneone)
6493		  {
6494		    plt_offset = s->size;
6495		    s->size += 4;
6496		  }
6497		ent->plt.offset = plt_offset;
6498
6499		s = htab->glink;
6500		if (!doneone || bfd_link_pic (info))
6501		  {
6502		    glink_offset = s->size;
6503		    s->size += GLINK_ENTRY_SIZE;
6504		  }
6505		ent->glink_offset = glink_offset;
6506
6507		if (!doneone)
6508		  {
6509		    htab->elf.irelplt->size += sizeof (Elf32_External_Rela);
6510		    doneone = TRUE;
6511		  }
6512	      }
6513	    else
6514	      ent->plt.offset = (bfd_vma) -1;
6515	}
6516    }
6517
6518  /* Allocate space for global sym dynamic relocs.  */
6519  elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
6520
6521  if (htab->tlsld_got.refcount > 0)
6522    {
6523      htab->tlsld_got.offset = allocate_got (htab, 8);
6524      if (bfd_link_pic (info))
6525	htab->elf.srelgot->size += sizeof (Elf32_External_Rela);
6526    }
6527  else
6528    htab->tlsld_got.offset = (bfd_vma) -1;
6529
6530  if (htab->elf.sgot != NULL && htab->plt_type != PLT_VXWORKS)
6531    {
6532      unsigned int g_o_t = 32768;
6533
6534      /* If we haven't allocated the header, do so now.  When we get here,
6535	 for old plt/got the got size will be 0 to 32764 (not allocated),
6536	 or 32780 to 65536 (header allocated).  For new plt/got, the
6537	 corresponding ranges are 0 to 32768 and 32780 to 65536.  */
6538      if (htab->elf.sgot->size <= 32768)
6539	{
6540	  g_o_t = htab->elf.sgot->size;
6541	  if (htab->plt_type == PLT_OLD)
6542	    g_o_t += 4;
6543	  htab->elf.sgot->size += htab->got_header_size;
6544	}
6545
6546      htab->elf.hgot->root.u.def.value = g_o_t;
6547    }
6548  if (bfd_link_pic (info))
6549    {
6550      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
6551
6552      sda->root.u.def.section = htab->elf.hgot->root.u.def.section;
6553      sda->root.u.def.value = htab->elf.hgot->root.u.def.value;
6554    }
6555  if (info->emitrelocations)
6556    {
6557      struct elf_link_hash_entry *sda = htab->sdata[0].sym;
6558
6559      if (sda != NULL && sda->ref_regular)
6560	sda->root.u.def.section->flags |= SEC_KEEP;
6561      sda = htab->sdata[1].sym;
6562      if (sda != NULL && sda->ref_regular)
6563	sda->root.u.def.section->flags |= SEC_KEEP;
6564    }
6565
6566  if (htab->glink != NULL
6567      && htab->glink->size != 0
6568      && htab->elf.dynamic_sections_created)
6569    {
6570      htab->glink_pltresolve = htab->glink->size;
6571      /* Space for the branch table.  ??? We don't need entries for
6572	 non-dynamic symbols in this table.  This case can arise with
6573	 static ifuncs or forced local ifuncs.  */
6574      htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
6575      /* Pad out to align the start of PLTresolve.  */
6576      htab->glink->size += -htab->glink->size & (htab->params->ppc476_workaround
6577						 ? 63 : 15);
6578      htab->glink->size += GLINK_PLTRESOLVE;
6579
6580      if (htab->params->emit_stub_syms)
6581	{
6582	  struct elf_link_hash_entry *sh;
6583	  sh = elf_link_hash_lookup (&htab->elf, "__glink",
6584				     TRUE, FALSE, FALSE);
6585	  if (sh == NULL)
6586	    return FALSE;
6587	  if (sh->root.type == bfd_link_hash_new)
6588	    {
6589	      sh->root.type = bfd_link_hash_defined;
6590	      sh->root.u.def.section = htab->glink;
6591	      sh->root.u.def.value = htab->glink_pltresolve;
6592	      sh->ref_regular = 1;
6593	      sh->def_regular = 1;
6594	      sh->ref_regular_nonweak = 1;
6595	      sh->forced_local = 1;
6596	      sh->non_elf = 0;
6597	      sh->root.linker_def = 1;
6598	    }
6599	  sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
6600				     TRUE, FALSE, FALSE);
6601	  if (sh == NULL)
6602	    return FALSE;
6603	  if (sh->root.type == bfd_link_hash_new)
6604	    {
6605	      sh->root.type = bfd_link_hash_defined;
6606	      sh->root.u.def.section = htab->glink;
6607	      sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
6608	      sh->ref_regular = 1;
6609	      sh->def_regular = 1;
6610	      sh->ref_regular_nonweak = 1;
6611	      sh->forced_local = 1;
6612	      sh->non_elf = 0;
6613	      sh->root.linker_def = 1;
6614	    }
6615	}
6616    }
6617
6618  if (htab->glink != NULL
6619      && htab->glink->size != 0
6620      && htab->glink_eh_frame != NULL
6621      && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
6622      && _bfd_elf_eh_frame_present (info))
6623    {
6624      s = htab->glink_eh_frame;
6625      s->size = sizeof (glink_eh_frame_cie) + 20;
6626      if (bfd_link_pic (info))
6627	{
6628	  s->size += 4;
6629	  if (htab->glink->size - GLINK_PLTRESOLVE + 8 >= 256)
6630	    s->size += 4;
6631	}
6632    }
6633
6634  /* We've now determined the sizes of the various dynamic sections.
6635     Allocate memory for them.  */
6636  relocs = FALSE;
6637  for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
6638    {
6639      bfd_boolean strip_section = TRUE;
6640
6641      if ((s->flags & SEC_LINKER_CREATED) == 0)
6642	continue;
6643
6644      if (s == htab->elf.splt
6645	  || s == htab->elf.sgot)
6646	{
6647	  /* We'd like to strip these sections if they aren't needed, but if
6648	     we've exported dynamic symbols from them we must leave them.
6649	     It's too late to tell BFD to get rid of the symbols.  */
6650	  if (htab->elf.hplt != NULL)
6651	    strip_section = FALSE;
6652	  /* Strip this section if we don't need it; see the
6653	     comment below.  */
6654	}
6655      else if (s == htab->elf.iplt
6656	       || s == htab->glink
6657	       || s == htab->glink_eh_frame
6658	       || s == htab->elf.sgotplt
6659	       || s == htab->sbss
6660	       || s == htab->elf.sdynbss
6661	       || s == htab->elf.sdynrelro
6662	       || s == htab->dynsbss)
6663	{
6664	  /* Strip these too.  */
6665	}
6666      else if (s == htab->sdata[0].section
6667	       || s == htab->sdata[1].section)
6668	{
6669	  strip_section = (s->flags & SEC_KEEP) == 0;
6670	}
6671      else if (CONST_STRNEQ (bfd_get_section_name (htab->elf.dynobj, s),
6672			     ".rela"))
6673	{
6674	  if (s->size != 0)
6675	    {
6676	      /* Remember whether there are any relocation sections.  */
6677	      relocs = TRUE;
6678
6679	      /* We use the reloc_count field as a counter if we need
6680		 to copy relocs into the output file.  */
6681	      s->reloc_count = 0;
6682	    }
6683	}
6684      else
6685	{
6686	  /* It's not one of our sections, so don't allocate space.  */
6687	  continue;
6688	}
6689
6690      if (s->size == 0 && strip_section)
6691	{
6692	  /* If we don't need this section, strip it from the
6693	     output file.  This is mostly to handle .rela.bss and
6694	     .rela.plt.  We must create both sections in
6695	     create_dynamic_sections, because they must be created
6696	     before the linker maps input sections to output
6697	     sections.  The linker does that before
6698	     adjust_dynamic_symbol is called, and it is that
6699	     function which decides whether anything needs to go
6700	     into these sections.  */
6701	  s->flags |= SEC_EXCLUDE;
6702	  continue;
6703	}
6704
6705      if ((s->flags & SEC_HAS_CONTENTS) == 0)
6706	continue;
6707
6708      /* Allocate memory for the section contents.  */
6709      s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
6710      if (s->contents == NULL)
6711	return FALSE;
6712    }
6713
6714  if (htab->elf.dynamic_sections_created)
6715    {
6716      /* Add some entries to the .dynamic section.  We fill in the
6717	 values later, in ppc_elf_finish_dynamic_sections, but we
6718	 must add the entries now so that we get the correct size for
6719	 the .dynamic section.  The DT_DEBUG entry is filled in by the
6720	 dynamic linker and used by the debugger.  */
6721#define add_dynamic_entry(TAG, VAL) \
6722  _bfd_elf_add_dynamic_entry (info, TAG, VAL)
6723
6724      if (bfd_link_executable (info))
6725	{
6726	  if (!add_dynamic_entry (DT_DEBUG, 0))
6727	    return FALSE;
6728	}
6729
6730      if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
6731	{
6732	  if (!add_dynamic_entry (DT_PLTGOT, 0)
6733	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
6734	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
6735	      || !add_dynamic_entry (DT_JMPREL, 0))
6736	    return FALSE;
6737	}
6738
6739      if (htab->plt_type == PLT_NEW
6740	  && htab->glink != NULL
6741	  && htab->glink->size != 0)
6742	{
6743	  if (!add_dynamic_entry (DT_PPC_GOT, 0))
6744	    return FALSE;
6745	  if (!htab->params->no_tls_get_addr_opt
6746	      && htab->tls_get_addr != NULL
6747	      && htab->tls_get_addr->plt.plist != NULL
6748	      && !add_dynamic_entry (DT_PPC_OPT, PPC_OPT_TLS))
6749	    return FALSE;
6750	}
6751
6752      if (relocs)
6753	{
6754	  if (!add_dynamic_entry (DT_RELA, 0)
6755	      || !add_dynamic_entry (DT_RELASZ, 0)
6756	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
6757	    return FALSE;
6758	}
6759
6760      /* If any dynamic relocs apply to a read-only section, then we
6761	 need a DT_TEXTREL entry.  */
6762      if ((info->flags & DF_TEXTREL) == 0)
6763	elf_link_hash_traverse (elf_hash_table (info), maybe_set_textrel,
6764				info);
6765
6766      if ((info->flags & DF_TEXTREL) != 0)
6767	{
6768	  if (!add_dynamic_entry (DT_TEXTREL, 0))
6769	    return FALSE;
6770	}
6771      if (htab->is_vxworks
6772	  && !elf_vxworks_add_dynamic_entries (output_bfd, info))
6773	return FALSE;
6774   }
6775#undef add_dynamic_entry
6776
6777  if (htab->glink_eh_frame != NULL
6778      && htab->glink_eh_frame->contents != NULL)
6779    {
6780      unsigned char *p = htab->glink_eh_frame->contents;
6781      bfd_vma val;
6782
6783      memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
6784      /* CIE length (rewrite in case little-endian).  */
6785      bfd_put_32 (htab->elf.dynobj, sizeof (glink_eh_frame_cie) - 4, p);
6786      p += sizeof (glink_eh_frame_cie);
6787      /* FDE length.  */
6788      val = htab->glink_eh_frame->size - 4 - sizeof (glink_eh_frame_cie);
6789      bfd_put_32 (htab->elf.dynobj, val, p);
6790      p += 4;
6791      /* CIE pointer.  */
6792      val = p - htab->glink_eh_frame->contents;
6793      bfd_put_32 (htab->elf.dynobj, val, p);
6794      p += 4;
6795      /* Offset to .glink.  Set later.  */
6796      p += 4;
6797      /* .glink size.  */
6798      bfd_put_32 (htab->elf.dynobj, htab->glink->size, p);
6799      p += 4;
6800      /* Augmentation.  */
6801      p += 1;
6802
6803      if (bfd_link_pic (info)
6804	  && htab->elf.dynamic_sections_created)
6805	{
6806	  bfd_vma adv = (htab->glink->size - GLINK_PLTRESOLVE + 8) >> 2;
6807	  if (adv < 64)
6808	    *p++ = DW_CFA_advance_loc + adv;
6809	  else if (adv < 256)
6810	    {
6811	      *p++ = DW_CFA_advance_loc1;
6812	      *p++ = adv;
6813	    }
6814	  else if (adv < 65536)
6815	    {
6816	      *p++ = DW_CFA_advance_loc2;
6817	      bfd_put_16 (htab->elf.dynobj, adv, p);
6818	      p += 2;
6819	    }
6820	  else
6821	    {
6822	      *p++ = DW_CFA_advance_loc4;
6823	      bfd_put_32 (htab->elf.dynobj, adv, p);
6824	      p += 4;
6825	    }
6826	  *p++ = DW_CFA_register;
6827	  *p++ = 65;
6828	  p++;
6829	  *p++ = DW_CFA_advance_loc + 4;
6830	  *p++ = DW_CFA_restore_extended;
6831	  *p++ = 65;
6832	}
6833      BFD_ASSERT ((bfd_vma) ((p + 3 - htab->glink_eh_frame->contents) & -4)
6834		  == htab->glink_eh_frame->size);
6835    }
6836
6837  return TRUE;
6838}
6839
6840/* Arrange to have _SDA_BASE_ or _SDA2_BASE_ stripped from the output
6841   if it looks like nothing is using them.  */
6842
6843static void
6844maybe_strip_sdasym (bfd *output_bfd, elf_linker_section_t *lsect)
6845{
6846  struct elf_link_hash_entry *sda = lsect->sym;
6847
6848  if (sda != NULL && !sda->ref_regular && sda->dynindx == -1)
6849    {
6850      asection *s;
6851
6852      s = bfd_get_section_by_name (output_bfd, lsect->name);
6853      if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
6854	{
6855	  s = bfd_get_section_by_name (output_bfd, lsect->bss_name);
6856	  if (s == NULL || bfd_section_removed_from_list (output_bfd, s))
6857	    {
6858	      sda->def_regular = 0;
6859	      /* This is somewhat magic.  See elf_link_output_extsym.  */
6860	      sda->ref_dynamic = 1;
6861	      sda->forced_local = 0;
6862	    }
6863	}
6864    }
6865}
6866
6867void
6868ppc_elf_maybe_strip_sdata_syms (struct bfd_link_info *info)
6869{
6870  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
6871
6872  if (htab != NULL)
6873    {
6874      maybe_strip_sdasym (info->output_bfd, &htab->sdata[0]);
6875      maybe_strip_sdasym (info->output_bfd, &htab->sdata[1]);
6876    }
6877}
6878
6879
6880/* Return TRUE if symbol should be hashed in the `.gnu.hash' section.  */
6881
6882static bfd_boolean
6883ppc_elf_hash_symbol (struct elf_link_hash_entry *h)
6884{
6885  if (h->plt.plist != NULL
6886      && !h->def_regular
6887      && (!h->pointer_equality_needed
6888	  || !h->ref_regular_nonweak))
6889    return FALSE;
6890
6891  return _bfd_elf_hash_symbol (h);
6892}
6893
6894#define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
6895
6896/* Relaxation trampolines.  r12 is available for clobbering (r11, is
6897   used for some functions that are allowed to break the ABI).  */
6898static const int shared_stub_entry[] =
6899  {
6900    0x7c0802a6, /* mflr 0 */
6901    0x429f0005, /* bcl 20, 31, .Lxxx */
6902    0x7d8802a6, /* mflr 12 */
6903    0x3d8c0000, /* addis 12, 12, (xxx-.Lxxx)@ha */
6904    0x398c0000, /* addi 12, 12, (xxx-.Lxxx)@l */
6905    0x7c0803a6, /* mtlr 0 */
6906    0x7d8903a6, /* mtctr 12 */
6907    0x4e800420, /* bctr */
6908  };
6909
6910static const int stub_entry[] =
6911  {
6912    0x3d800000, /* lis 12,xxx@ha */
6913    0x398c0000, /* addi 12,12,xxx@l */
6914    0x7d8903a6, /* mtctr 12 */
6915    0x4e800420, /* bctr */
6916  };
6917
6918struct ppc_elf_relax_info
6919{
6920  unsigned int workaround_size;
6921  unsigned int picfixup_size;
6922};
6923
6924/* This function implements long branch trampolines, and the ppc476
6925   icache bug workaround.  Any section needing trampolines or patch
6926   space for the workaround has its size extended so that we can
6927   add trampolines at the end of the section.  */
6928
6929static bfd_boolean
6930ppc_elf_relax_section (bfd *abfd,
6931		       asection *isec,
6932		       struct bfd_link_info *link_info,
6933		       bfd_boolean *again)
6934{
6935  struct one_branch_fixup
6936  {
6937    struct one_branch_fixup *next;
6938    asection *tsec;
6939    /* Final link, can use the symbol offset.  For a
6940       relocatable link we use the symbol's index.  */
6941    bfd_vma toff;
6942    bfd_vma trampoff;
6943  };
6944
6945  Elf_Internal_Shdr *symtab_hdr;
6946  bfd_byte *contents = NULL;
6947  Elf_Internal_Sym *isymbuf = NULL;
6948  Elf_Internal_Rela *internal_relocs = NULL;
6949  Elf_Internal_Rela *irel, *irelend = NULL;
6950  struct one_branch_fixup *branch_fixups = NULL;
6951  struct ppc_elf_relax_info *relax_info = NULL;
6952  unsigned changes = 0;
6953  bfd_boolean workaround_change;
6954  struct ppc_elf_link_hash_table *htab;
6955  bfd_size_type trampbase, trampoff, newsize, picfixup_size;
6956  asection *got2;
6957  bfd_boolean maybe_pasted;
6958
6959  *again = FALSE;
6960
6961  /* No need to do anything with non-alloc or non-code sections.  */
6962  if ((isec->flags & SEC_ALLOC) == 0
6963      || (isec->flags & SEC_CODE) == 0
6964      || (isec->flags & SEC_LINKER_CREATED) != 0
6965      || isec->size < 4)
6966    return TRUE;
6967
6968  /* We cannot represent the required PIC relocs in the output, so don't
6969     do anything.  The linker doesn't support mixing -shared and -r
6970     anyway.  */
6971  if (bfd_link_relocatable (link_info) && bfd_link_pic (link_info))
6972    return TRUE;
6973
6974  htab = ppc_elf_hash_table (link_info);
6975  if (htab == NULL)
6976    return TRUE;
6977
6978  isec->size = (isec->size + 3) & -4;
6979  if (isec->rawsize == 0)
6980    isec->rawsize = isec->size;
6981  trampbase = isec->size;
6982
6983  BFD_ASSERT (isec->sec_info_type == SEC_INFO_TYPE_NONE
6984	      || isec->sec_info_type == SEC_INFO_TYPE_TARGET);
6985  isec->sec_info_type = SEC_INFO_TYPE_TARGET;
6986
6987  if (htab->params->ppc476_workaround
6988      || htab->params->pic_fixup > 0)
6989    {
6990      if (elf_section_data (isec)->sec_info == NULL)
6991	{
6992	  elf_section_data (isec)->sec_info
6993	    = bfd_zalloc (abfd, sizeof (struct ppc_elf_relax_info));
6994	  if (elf_section_data (isec)->sec_info == NULL)
6995	    return FALSE;
6996	}
6997      relax_info = elf_section_data (isec)->sec_info;
6998      trampbase -= relax_info->workaround_size;
6999    }
7000
7001  maybe_pasted = (strcmp (isec->output_section->name, ".init") == 0
7002		  || strcmp (isec->output_section->name, ".fini") == 0);
7003  /* Space for a branch around any trampolines.  */
7004  trampoff = trampbase;
7005  if (maybe_pasted && trampbase == isec->rawsize)
7006    trampoff += 4;
7007
7008  symtab_hdr = &elf_symtab_hdr (abfd);
7009  picfixup_size = 0;
7010  if (htab->params->branch_trampolines
7011      || htab->params->pic_fixup > 0)
7012    {
7013      /* Get a copy of the native relocations.  */
7014      if (isec->reloc_count != 0)
7015	{
7016	  internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
7017						       link_info->keep_memory);
7018	  if (internal_relocs == NULL)
7019	    goto error_return;
7020	}
7021
7022      got2 = bfd_get_section_by_name (abfd, ".got2");
7023
7024      irelend = internal_relocs + isec->reloc_count;
7025      for (irel = internal_relocs; irel < irelend; irel++)
7026	{
7027	  unsigned long r_type = ELF32_R_TYPE (irel->r_info);
7028	  bfd_vma toff, roff;
7029	  asection *tsec;
7030	  struct one_branch_fixup *f;
7031	  size_t insn_offset = 0;
7032	  bfd_vma max_branch_offset = 0, val;
7033	  bfd_byte *hit_addr;
7034	  unsigned long t0;
7035	  struct elf_link_hash_entry *h;
7036	  struct plt_entry **plist;
7037	  unsigned char sym_type;
7038
7039	  switch (r_type)
7040	    {
7041	    case R_PPC_REL24:
7042	    case R_PPC_LOCAL24PC:
7043	    case R_PPC_PLTREL24:
7044	      max_branch_offset = 1 << 25;
7045	      break;
7046
7047	    case R_PPC_REL14:
7048	    case R_PPC_REL14_BRTAKEN:
7049	    case R_PPC_REL14_BRNTAKEN:
7050	      max_branch_offset = 1 << 15;
7051	      break;
7052
7053	    case R_PPC_ADDR16_HA:
7054	      if (htab->params->pic_fixup > 0)
7055		break;
7056	      continue;
7057
7058	    default:
7059	      continue;
7060	    }
7061
7062	  /* Get the value of the symbol referred to by the reloc.  */
7063	  h = NULL;
7064	  if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
7065	    {
7066	      /* A local symbol.  */
7067	      Elf_Internal_Sym *isym;
7068
7069	      /* Read this BFD's local symbols.  */
7070	      if (isymbuf == NULL)
7071		{
7072		  isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
7073		  if (isymbuf == NULL)
7074		    isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
7075						    symtab_hdr->sh_info, 0,
7076						    NULL, NULL, NULL);
7077		  if (isymbuf == 0)
7078		    goto error_return;
7079		}
7080	      isym = isymbuf + ELF32_R_SYM (irel->r_info);
7081	      if (isym->st_shndx == SHN_UNDEF)
7082		tsec = bfd_und_section_ptr;
7083	      else if (isym->st_shndx == SHN_ABS)
7084		tsec = bfd_abs_section_ptr;
7085	      else if (isym->st_shndx == SHN_COMMON)
7086		tsec = bfd_com_section_ptr;
7087	      else
7088		tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
7089
7090	      toff = isym->st_value;
7091	      sym_type = ELF_ST_TYPE (isym->st_info);
7092	    }
7093	  else
7094	    {
7095	      /* Global symbol handling.  */
7096	      unsigned long indx;
7097
7098	      indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
7099	      h = elf_sym_hashes (abfd)[indx];
7100
7101	      while (h->root.type == bfd_link_hash_indirect
7102		     || h->root.type == bfd_link_hash_warning)
7103		h = (struct elf_link_hash_entry *) h->root.u.i.link;
7104
7105	      if (h->root.type == bfd_link_hash_defined
7106		  || h->root.type == bfd_link_hash_defweak)
7107		{
7108		  tsec = h->root.u.def.section;
7109		  toff = h->root.u.def.value;
7110		}
7111	      else if (h->root.type == bfd_link_hash_undefined
7112		       || h->root.type == bfd_link_hash_undefweak)
7113		{
7114		  tsec = bfd_und_section_ptr;
7115		  toff = bfd_link_relocatable (link_info) ? indx : 0;
7116		}
7117	      else
7118		continue;
7119
7120	      /* If this branch is to __tls_get_addr then we may later
7121		 optimise away the call.  We won't be needing a long-
7122		 branch stub in that case.  */
7123	      if (bfd_link_executable (link_info)
7124		  && h == htab->tls_get_addr
7125		  && irel != internal_relocs)
7126		{
7127		  unsigned long t_symndx = ELF32_R_SYM (irel[-1].r_info);
7128		  unsigned long t_rtype = ELF32_R_TYPE (irel[-1].r_info);
7129		  unsigned int tls_mask = 0;
7130
7131		  /* The previous reloc should be one of R_PPC_TLSGD or
7132		     R_PPC_TLSLD, or for older object files, a reloc
7133		     on the __tls_get_addr arg setup insn.  Get tls
7134		     mask bits from the symbol on that reloc.  */
7135		  if (t_symndx < symtab_hdr->sh_info)
7136		    {
7137		      bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
7138
7139		      if (local_got_offsets != NULL)
7140			{
7141			  struct plt_entry **local_plt = (struct plt_entry **)
7142			    (local_got_offsets + symtab_hdr->sh_info);
7143			  char *lgot_masks = (char *)
7144			    (local_plt + symtab_hdr->sh_info);
7145			  tls_mask = lgot_masks[t_symndx];
7146			}
7147		    }
7148		  else
7149		    {
7150		      struct elf_link_hash_entry *th
7151			= elf_sym_hashes (abfd)[t_symndx - symtab_hdr->sh_info];
7152
7153		      while (th->root.type == bfd_link_hash_indirect
7154			     || th->root.type == bfd_link_hash_warning)
7155			th = (struct elf_link_hash_entry *) th->root.u.i.link;
7156
7157		      tls_mask
7158			= ((struct ppc_elf_link_hash_entry *) th)->tls_mask;
7159		    }
7160
7161		  /* The mask bits tell us if the call will be
7162		     optimised away.  */
7163		  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
7164		      && (t_rtype == R_PPC_TLSGD
7165			  || t_rtype == R_PPC_GOT_TLSGD16
7166			  || t_rtype == R_PPC_GOT_TLSGD16_LO))
7167		    continue;
7168		  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
7169		      && (t_rtype == R_PPC_TLSLD
7170			  || t_rtype == R_PPC_GOT_TLSLD16
7171			  || t_rtype == R_PPC_GOT_TLSLD16_LO))
7172		    continue;
7173		}
7174
7175	      sym_type = h->type;
7176	    }
7177
7178	  if (r_type == R_PPC_ADDR16_HA)
7179	    {
7180	      if (h != NULL
7181		  && !h->def_regular
7182		  && h->protected_def
7183		  && ppc_elf_hash_entry (h)->has_addr16_ha
7184		  && ppc_elf_hash_entry (h)->has_addr16_lo)
7185		picfixup_size += 12;
7186	      continue;
7187	    }
7188
7189	  /* The condition here under which we call find_plt_ent must
7190	     match that in relocate_section.  If we call find_plt_ent here
7191	     but not in relocate_section, or vice versa, then the branch
7192	     destination used here may be incorrect.  */
7193	  plist = NULL;
7194	  if (h != NULL)
7195	    {
7196	      /* We know is_branch_reloc (r_type) is true.  */
7197	      if (h->type == STT_GNU_IFUNC
7198		  || r_type == R_PPC_PLTREL24)
7199		plist = &h->plt.plist;
7200	    }
7201	  else if (sym_type == STT_GNU_IFUNC
7202		   && elf_local_got_offsets (abfd) != NULL)
7203	    {
7204	      bfd_vma *local_got_offsets = elf_local_got_offsets (abfd);
7205	      struct plt_entry **local_plt = (struct plt_entry **)
7206		(local_got_offsets + symtab_hdr->sh_info);
7207	      plist = local_plt + ELF32_R_SYM (irel->r_info);
7208	    }
7209	  if (plist != NULL)
7210	    {
7211	      bfd_vma addend = 0;
7212	      struct plt_entry *ent;
7213
7214	      if (r_type == R_PPC_PLTREL24 && bfd_link_pic (link_info))
7215		addend = irel->r_addend;
7216	      ent = find_plt_ent (plist, got2, addend);
7217	      if (ent != NULL)
7218		{
7219		  if (htab->plt_type == PLT_NEW
7220		      || h == NULL
7221		      || !htab->elf.dynamic_sections_created
7222		      || h->dynindx == -1)
7223		    {
7224		      tsec = htab->glink;
7225		      toff = ent->glink_offset;
7226		    }
7227		  else
7228		    {
7229		      tsec = htab->elf.splt;
7230		      toff = ent->plt.offset;
7231		    }
7232		}
7233	    }
7234
7235	  /* If the branch and target are in the same section, you have
7236	     no hope of adding stubs.  We'll error out later should the
7237	     branch overflow.  */
7238	  if (tsec == isec)
7239	    continue;
7240
7241	  /* There probably isn't any reason to handle symbols in
7242	     SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
7243	     attribute for a code section, and we are only looking at
7244	     branches.  However, implement it correctly here as a
7245	     reference for other target relax_section functions.  */
7246	  if (0 && tsec->sec_info_type == SEC_INFO_TYPE_MERGE)
7247	    {
7248	      /* At this stage in linking, no SEC_MERGE symbol has been
7249		 adjusted, so all references to such symbols need to be
7250		 passed through _bfd_merged_section_offset.  (Later, in
7251		 relocate_section, all SEC_MERGE symbols *except* for
7252		 section symbols have been adjusted.)
7253
7254		 gas may reduce relocations against symbols in SEC_MERGE
7255		 sections to a relocation against the section symbol when
7256		 the original addend was zero.  When the reloc is against
7257		 a section symbol we should include the addend in the
7258		 offset passed to _bfd_merged_section_offset, since the
7259		 location of interest is the original symbol.  On the
7260		 other hand, an access to "sym+addend" where "sym" is not
7261		 a section symbol should not include the addend;  Such an
7262		 access is presumed to be an offset from "sym";  The
7263		 location of interest is just "sym".  */
7264	      if (sym_type == STT_SECTION)
7265		toff += irel->r_addend;
7266
7267	      toff
7268		= _bfd_merged_section_offset (abfd, &tsec,
7269					      elf_section_data (tsec)->sec_info,
7270					      toff);
7271
7272	      if (sym_type != STT_SECTION)
7273		toff += irel->r_addend;
7274	    }
7275	  /* PLTREL24 addends are special.  */
7276	  else if (r_type != R_PPC_PLTREL24)
7277	    toff += irel->r_addend;
7278
7279	  /* Attempted -shared link of non-pic code loses.  */
7280	  if ((!bfd_link_relocatable (link_info)
7281	       && tsec == bfd_und_section_ptr)
7282	      || tsec->output_section == NULL
7283	      || (tsec->owner != NULL
7284		  && (tsec->owner->flags & BFD_PLUGIN) != 0))
7285	    continue;
7286
7287	  roff = irel->r_offset;
7288
7289	  /* If the branch is in range, no need to do anything.  */
7290	  if (tsec != bfd_und_section_ptr
7291	      && (!bfd_link_relocatable (link_info)
7292		  /* A relocatable link may have sections moved during
7293		     final link, so do not presume they remain in range.  */
7294		  || tsec->output_section == isec->output_section))
7295	    {
7296	      bfd_vma symaddr, reladdr;
7297
7298	      symaddr = tsec->output_section->vma + tsec->output_offset + toff;
7299	      reladdr = isec->output_section->vma + isec->output_offset + roff;
7300	      if (symaddr - reladdr + max_branch_offset
7301		  < 2 * max_branch_offset)
7302		continue;
7303	    }
7304
7305	  /* Look for an existing fixup to this address.  */
7306	  for (f = branch_fixups; f ; f = f->next)
7307	    if (f->tsec == tsec && f->toff == toff)
7308	      break;
7309
7310	  if (f == NULL)
7311	    {
7312	      size_t size;
7313	      unsigned long stub_rtype;
7314
7315	      val = trampoff - roff;
7316	      if (val >= max_branch_offset)
7317		/* Oh dear, we can't reach a trampoline.  Don't try to add
7318		   one.  We'll report an error later.  */
7319		continue;
7320
7321	      if (bfd_link_pic (link_info))
7322		{
7323		  size = 4 * ARRAY_SIZE (shared_stub_entry);
7324		  insn_offset = 12;
7325		}
7326	      else
7327		{
7328		  size = 4 * ARRAY_SIZE (stub_entry);
7329		  insn_offset = 0;
7330		}
7331	      stub_rtype = R_PPC_RELAX;
7332	      if (tsec == htab->elf.splt
7333		  || tsec == htab->glink)
7334		{
7335		  stub_rtype = R_PPC_RELAX_PLT;
7336		  if (r_type == R_PPC_PLTREL24)
7337		    stub_rtype = R_PPC_RELAX_PLTREL24;
7338		}
7339
7340	      /* Hijack the old relocation.  Since we need two
7341		 relocations for this use a "composite" reloc.  */
7342	      irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
7343					   stub_rtype);
7344	      irel->r_offset = trampoff + insn_offset;
7345	      if (r_type == R_PPC_PLTREL24
7346		  && stub_rtype != R_PPC_RELAX_PLTREL24)
7347		irel->r_addend = 0;
7348
7349	      /* Record the fixup so we don't do it again this section.  */
7350	      f = bfd_malloc (sizeof (*f));
7351	      f->next = branch_fixups;
7352	      f->tsec = tsec;
7353	      f->toff = toff;
7354	      f->trampoff = trampoff;
7355	      branch_fixups = f;
7356
7357	      trampoff += size;
7358	      changes++;
7359	    }
7360	  else
7361	    {
7362	      val = f->trampoff - roff;
7363	      if (val >= max_branch_offset)
7364		continue;
7365
7366	      /* Nop out the reloc, since we're finalizing things here.  */
7367	      irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
7368	    }
7369
7370	  /* Get the section contents.  */
7371	  if (contents == NULL)
7372	    {
7373	      /* Get cached copy if it exists.  */
7374	      if (elf_section_data (isec)->this_hdr.contents != NULL)
7375		contents = elf_section_data (isec)->this_hdr.contents;
7376	      /* Go get them off disk.  */
7377	      else if (!bfd_malloc_and_get_section (abfd, isec, &contents))
7378		goto error_return;
7379	    }
7380
7381	  /* Fix up the existing branch to hit the trampoline.  */
7382	  hit_addr = contents + roff;
7383	  switch (r_type)
7384	    {
7385	    case R_PPC_REL24:
7386	    case R_PPC_LOCAL24PC:
7387	    case R_PPC_PLTREL24:
7388	      t0 = bfd_get_32 (abfd, hit_addr);
7389	      t0 &= ~0x3fffffc;
7390	      t0 |= val & 0x3fffffc;
7391	      bfd_put_32 (abfd, t0, hit_addr);
7392	      break;
7393
7394	    case R_PPC_REL14:
7395	    case R_PPC_REL14_BRTAKEN:
7396	    case R_PPC_REL14_BRNTAKEN:
7397	      t0 = bfd_get_32 (abfd, hit_addr);
7398	      t0 &= ~0xfffc;
7399	      t0 |= val & 0xfffc;
7400	      bfd_put_32 (abfd, t0, hit_addr);
7401	      break;
7402	    }
7403	}
7404
7405      while (branch_fixups != NULL)
7406	{
7407	  struct one_branch_fixup *f = branch_fixups;
7408	  branch_fixups = branch_fixups->next;
7409	  free (f);
7410	}
7411    }
7412
7413  workaround_change = FALSE;
7414  newsize = trampoff;
7415  if (htab->params->ppc476_workaround
7416      && (!bfd_link_relocatable (link_info)
7417	  || isec->output_section->alignment_power >= htab->params->pagesize_p2))
7418    {
7419      bfd_vma addr, end_addr;
7420      unsigned int crossings;
7421      bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
7422
7423      addr = isec->output_section->vma + isec->output_offset;
7424      end_addr = addr + trampoff;
7425      addr &= -pagesize;
7426      crossings = ((end_addr & -pagesize) - addr) >> htab->params->pagesize_p2;
7427      if (crossings != 0)
7428	{
7429	  /* Keep space aligned, to ensure the patch code itself does
7430	     not cross a page.  Don't decrease size calculated on a
7431	     previous pass as otherwise we might never settle on a layout.  */
7432	  newsize = 15 - ((end_addr - 1) & 15);
7433	  newsize += crossings * 16;
7434	  if (relax_info->workaround_size < newsize)
7435	    {
7436	      relax_info->workaround_size = newsize;
7437	      workaround_change = TRUE;
7438	    }
7439	  /* Ensure relocate_section is called.  */
7440	  isec->flags |= SEC_RELOC;
7441	}
7442      newsize = trampoff + relax_info->workaround_size;
7443    }
7444
7445  if (htab->params->pic_fixup > 0)
7446    {
7447      picfixup_size -= relax_info->picfixup_size;
7448      if (picfixup_size != 0)
7449	relax_info->picfixup_size += picfixup_size;
7450      newsize += relax_info->picfixup_size;
7451    }
7452
7453  if (changes != 0 || picfixup_size != 0 || workaround_change)
7454    isec->size = newsize;
7455
7456  if (isymbuf != NULL
7457      && symtab_hdr->contents != (unsigned char *) isymbuf)
7458    {
7459      if (! link_info->keep_memory)
7460	free (isymbuf);
7461      else
7462	{
7463	  /* Cache the symbols for elf_link_input_bfd.  */
7464	  symtab_hdr->contents = (unsigned char *) isymbuf;
7465	}
7466    }
7467
7468  if (contents != NULL
7469      && elf_section_data (isec)->this_hdr.contents != contents)
7470    {
7471      if (!changes && !link_info->keep_memory)
7472	free (contents);
7473      else
7474	{
7475	  /* Cache the section contents for elf_link_input_bfd.  */
7476	  elf_section_data (isec)->this_hdr.contents = contents;
7477	}
7478    }
7479
7480  changes += picfixup_size;
7481  if (changes != 0)
7482    {
7483      /* Append sufficient NOP relocs so we can write out relocation
7484	 information for the trampolines.  */
7485      Elf_Internal_Shdr *rel_hdr;
7486      Elf_Internal_Rela *new_relocs = bfd_malloc ((changes + isec->reloc_count)
7487						  * sizeof (*new_relocs));
7488      unsigned ix;
7489
7490      if (!new_relocs)
7491	goto error_return;
7492      memcpy (new_relocs, internal_relocs,
7493	      isec->reloc_count * sizeof (*new_relocs));
7494      for (ix = changes; ix--;)
7495	{
7496	  irel = new_relocs + ix + isec->reloc_count;
7497
7498	  irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
7499	}
7500      if (internal_relocs != elf_section_data (isec)->relocs)
7501	free (internal_relocs);
7502      elf_section_data (isec)->relocs = new_relocs;
7503      isec->reloc_count += changes;
7504      rel_hdr = _bfd_elf_single_rel_hdr (isec);
7505      rel_hdr->sh_size += changes * rel_hdr->sh_entsize;
7506    }
7507  else if (internal_relocs != NULL
7508	   && elf_section_data (isec)->relocs != internal_relocs)
7509    free (internal_relocs);
7510
7511  *again = changes != 0 || workaround_change;
7512  return TRUE;
7513
7514 error_return:
7515  while (branch_fixups != NULL)
7516    {
7517      struct one_branch_fixup *f = branch_fixups;
7518      branch_fixups = branch_fixups->next;
7519      free (f);
7520    }
7521  if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
7522    free (isymbuf);
7523  if (contents != NULL
7524      && elf_section_data (isec)->this_hdr.contents != contents)
7525    free (contents);
7526  if (internal_relocs != NULL
7527      && elf_section_data (isec)->relocs != internal_relocs)
7528    free (internal_relocs);
7529  return FALSE;
7530}
7531
7532/* What to do when ld finds relocations against symbols defined in
7533   discarded sections.  */
7534
7535static unsigned int
7536ppc_elf_action_discarded (asection *sec)
7537{
7538  if (strcmp (".fixup", sec->name) == 0)
7539    return 0;
7540
7541  if (strcmp (".got2", sec->name) == 0)
7542    return 0;
7543
7544  return _bfd_elf_default_action_discarded (sec);
7545}
7546
7547/* Fill in the address for a pointer generated in a linker section.  */
7548
7549static bfd_vma
7550elf_finish_pointer_linker_section (bfd *input_bfd,
7551				   elf_linker_section_t *lsect,
7552				   struct elf_link_hash_entry *h,
7553				   bfd_vma relocation,
7554				   const Elf_Internal_Rela *rel)
7555{
7556  elf_linker_section_pointers_t *linker_section_ptr;
7557
7558  BFD_ASSERT (lsect != NULL);
7559
7560  if (h != NULL)
7561    {
7562      /* Handle global symbol.  */
7563      struct ppc_elf_link_hash_entry *eh;
7564
7565      eh = (struct ppc_elf_link_hash_entry *) h;
7566      BFD_ASSERT (eh->elf.def_regular);
7567      linker_section_ptr = eh->linker_section_pointer;
7568    }
7569  else
7570    {
7571      /* Handle local symbol.  */
7572      unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
7573
7574      BFD_ASSERT (is_ppc_elf (input_bfd));
7575      BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
7576      linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
7577    }
7578
7579  linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
7580							rel->r_addend,
7581							lsect);
7582  BFD_ASSERT (linker_section_ptr != NULL);
7583
7584  /* Offset will always be a multiple of four, so use the bottom bit
7585     as a "written" flag.  */
7586  if ((linker_section_ptr->offset & 1) == 0)
7587    {
7588      bfd_put_32 (lsect->section->owner,
7589		  relocation + linker_section_ptr->addend,
7590		  lsect->section->contents + linker_section_ptr->offset);
7591      linker_section_ptr->offset += 1;
7592    }
7593
7594  relocation = (lsect->section->output_section->vma
7595		+ lsect->section->output_offset
7596		+ linker_section_ptr->offset - 1
7597		- SYM_VAL (lsect->sym));
7598
7599#ifdef DEBUG
7600  fprintf (stderr,
7601	   "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
7602	   lsect->name, (long) relocation, (long) relocation);
7603#endif
7604
7605  return relocation;
7606}
7607
7608#define PPC_LO(v) ((v) & 0xffff)
7609#define PPC_HI(v) (((v) >> 16) & 0xffff)
7610#define PPC_HA(v) PPC_HI ((v) + 0x8000)
7611
7612static void
7613write_glink_stub (struct plt_entry *ent, asection *plt_sec, unsigned char *p,
7614		  struct bfd_link_info *info)
7615{
7616  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
7617  bfd *output_bfd = info->output_bfd;
7618  bfd_vma plt;
7619
7620  plt = ((ent->plt.offset & ~1)
7621	 + plt_sec->output_section->vma
7622	 + plt_sec->output_offset);
7623
7624  if (bfd_link_pic (info))
7625    {
7626      bfd_vma got = 0;
7627
7628      if (ent->addend >= 32768)
7629	got = (ent->addend
7630	       + ent->sec->output_section->vma
7631	       + ent->sec->output_offset);
7632      else if (htab->elf.hgot != NULL)
7633	got = SYM_VAL (htab->elf.hgot);
7634
7635      plt -= got;
7636
7637      if (plt + 0x8000 < 0x10000)
7638	{
7639	  bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
7640	  p += 4;
7641	  bfd_put_32 (output_bfd, MTCTR_11, p);
7642	  p += 4;
7643	  bfd_put_32 (output_bfd, BCTR, p);
7644	  p += 4;
7645	  bfd_put_32 (output_bfd, htab->params->ppc476_workaround ? BA : NOP, p);
7646	  p += 4;
7647	}
7648      else
7649	{
7650	  bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
7651	  p += 4;
7652	  bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7653	  p += 4;
7654	  bfd_put_32 (output_bfd, MTCTR_11, p);
7655	  p += 4;
7656	  bfd_put_32 (output_bfd, BCTR, p);
7657	  p += 4;
7658	}
7659    }
7660  else
7661    {
7662      bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
7663      p += 4;
7664      bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7665      p += 4;
7666      bfd_put_32 (output_bfd, MTCTR_11, p);
7667      p += 4;
7668      bfd_put_32 (output_bfd, BCTR, p);
7669      p += 4;
7670    }
7671}
7672
7673/* Return true if symbol is defined statically.  */
7674
7675static bfd_boolean
7676is_static_defined (struct elf_link_hash_entry *h)
7677{
7678  return ((h->root.type == bfd_link_hash_defined
7679	   || h->root.type == bfd_link_hash_defweak)
7680	  && h->root.u.def.section != NULL
7681	  && h->root.u.def.section->output_section != NULL);
7682}
7683
7684/* If INSN is an opcode that may be used with an @tls operand, return
7685   the transformed insn for TLS optimisation, otherwise return 0.  If
7686   REG is non-zero only match an insn with RB or RA equal to REG.  */
7687
7688unsigned int
7689_bfd_elf_ppc_at_tls_transform (unsigned int insn, unsigned int reg)
7690{
7691  unsigned int rtra;
7692
7693  if ((insn & (0x3f << 26)) != 31 << 26)
7694    return 0;
7695
7696  if (reg == 0 || ((insn >> 11) & 0x1f) == reg)
7697    rtra = insn & ((1 << 26) - (1 << 16));
7698  else if (((insn >> 16) & 0x1f) == reg)
7699    rtra = (insn & (0x1f << 21)) | ((insn & (0x1f << 11)) << 5);
7700  else
7701    return 0;
7702
7703  if ((insn & (0x3ff << 1)) == 266 << 1)
7704    /* add -> addi.  */
7705    insn = 14 << 26;
7706  else if ((insn & (0x1f << 1)) == 23 << 1
7707	   && ((insn & (0x1f << 6)) < 14 << 6
7708	       || ((insn & (0x1f << 6)) >= 16 << 6
7709		   && (insn & (0x1f << 6)) < 24 << 6)))
7710    /* load and store indexed -> dform.  */
7711    insn = (32 | ((insn >> 6) & 0x1f)) << 26;
7712  else if ((insn & (((0x1a << 5) | 0x1f) << 1)) == 21 << 1)
7713    /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
7714    insn = ((58 | ((insn >> 6) & 4)) << 26) | ((insn >> 6) & 1);
7715  else if ((insn & (((0x1f << 5) | 0x1f) << 1)) == 341 << 1)
7716    /* lwax -> lwa.  */
7717    insn = (58 << 26) | 2;
7718  else
7719    return 0;
7720  insn |= rtra;
7721  return insn;
7722}
7723
7724/* If INSN is an opcode that may be used with an @tprel operand, return
7725   the transformed insn for an undefined weak symbol, ie. with the
7726   thread pointer REG operand removed.  Otherwise return 0.  */
7727
7728unsigned int
7729_bfd_elf_ppc_at_tprel_transform (unsigned int insn, unsigned int reg)
7730{
7731  if ((insn & (0x1f << 16)) == reg << 16
7732      && ((insn & (0x3f << 26)) == 14u << 26 /* addi */
7733	  || (insn & (0x3f << 26)) == 15u << 26 /* addis */
7734	  || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
7735	  || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
7736	  || (insn & (0x3f << 26)) == 36u << 26 /* stw */
7737	  || (insn & (0x3f << 26)) == 38u << 26 /* stb */
7738	  || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
7739	  || (insn & (0x3f << 26)) == 42u << 26 /* lha */
7740	  || (insn & (0x3f << 26)) == 44u << 26 /* sth */
7741	  || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
7742	  || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
7743	  || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
7744	  || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
7745	  || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
7746	  || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
7747	  || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
7748	      && (insn & 3) != 1)
7749	  || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
7750	      && ((insn & 3) == 0 || (insn & 3) == 3))))
7751    {
7752      insn &= ~(0x1f << 16);
7753    }
7754  else if ((insn & (0x1f << 21)) == reg << 21
7755	   && ((insn & (0x3e << 26)) == 24u << 26 /* ori, oris */
7756	       || (insn & (0x3e << 26)) == 26u << 26 /* xori,xoris */
7757	       || (insn & (0x3e << 26)) == 28u << 26 /* andi,andis */))
7758    {
7759      insn &= ~(0x1f << 21);
7760      insn |= (insn & (0x1f << 16)) << 5;
7761      if ((insn & (0x3e << 26)) == 26 << 26 /* xori,xoris */)
7762	insn -= 2 >> 26;  /* convert to ori,oris */
7763    }
7764  else
7765    insn = 0;
7766  return insn;
7767}
7768
7769static bfd_boolean
7770is_insn_ds_form (unsigned int insn)
7771{
7772  return ((insn & (0x3f << 26)) == 58u << 26 /* ld,ldu,lwa */
7773	  || (insn & (0x3f << 26)) == 62u << 26 /* std,stdu,stq */
7774	  || (insn & (0x3f << 26)) == 57u << 26 /* lfdp */
7775	  || (insn & (0x3f << 26)) == 61u << 26 /* stfdp */);
7776}
7777
7778static bfd_boolean
7779is_insn_dq_form (unsigned int insn)
7780{
7781  return ((insn & (0x3f << 26)) == 56u << 26 /* lq */
7782	  || ((insn & (0x3f << 26)) == (61u << 26) /* lxv, stxv */
7783	      && (insn & 3) == 1));
7784}
7785
7786/* The RELOCATE_SECTION function is called by the ELF backend linker
7787   to handle the relocations for a section.
7788
7789   The relocs are always passed as Rela structures; if the section
7790   actually uses Rel structures, the r_addend field will always be
7791   zero.
7792
7793   This function is responsible for adjust the section contents as
7794   necessary, and (if using Rela relocs and generating a
7795   relocatable output file) adjusting the reloc addend as
7796   necessary.
7797
7798   This function does not have to worry about setting the reloc
7799   address or the reloc symbol index.
7800
7801   LOCAL_SYMS is a pointer to the swapped in local symbols.
7802
7803   LOCAL_SECTIONS is an array giving the section in the input file
7804   corresponding to the st_shndx field of each local symbol.
7805
7806   The global hash table entry for the global symbols can be found
7807   via elf_sym_hashes (input_bfd).
7808
7809   When generating relocatable output, this function must handle
7810   STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
7811   going to be the section symbol corresponding to the output
7812   section, which means that the addend must be adjusted
7813   accordingly.  */
7814
7815static bfd_boolean
7816ppc_elf_relocate_section (bfd *output_bfd,
7817			  struct bfd_link_info *info,
7818			  bfd *input_bfd,
7819			  asection *input_section,
7820			  bfd_byte *contents,
7821			  Elf_Internal_Rela *relocs,
7822			  Elf_Internal_Sym *local_syms,
7823			  asection **local_sections)
7824{
7825  Elf_Internal_Shdr *symtab_hdr;
7826  struct elf_link_hash_entry **sym_hashes;
7827  struct ppc_elf_link_hash_table *htab;
7828  Elf_Internal_Rela *rel;
7829  Elf_Internal_Rela *wrel;
7830  Elf_Internal_Rela *relend;
7831  Elf_Internal_Rela outrel;
7832  asection *got2;
7833  bfd_vma *local_got_offsets;
7834  bfd_boolean ret = TRUE;
7835  bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
7836  bfd_boolean is_vxworks_tls;
7837  unsigned int picfixup_size = 0;
7838  struct ppc_elf_relax_info *relax_info = NULL;
7839
7840#ifdef DEBUG
7841  _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
7842		      "%ld relocations%s",
7843		      input_bfd, input_section,
7844		      (long) input_section->reloc_count,
7845		      (bfd_link_relocatable (info)) ? " (relocatable)" : "");
7846#endif
7847
7848  got2 = bfd_get_section_by_name (input_bfd, ".got2");
7849
7850  /* Initialize howto table if not already done.  */
7851  if (!ppc_elf_howto_table[R_PPC_ADDR32])
7852    ppc_elf_howto_init ();
7853
7854  htab = ppc_elf_hash_table (info);
7855  local_got_offsets = elf_local_got_offsets (input_bfd);
7856  symtab_hdr = &elf_symtab_hdr (input_bfd);
7857  sym_hashes = elf_sym_hashes (input_bfd);
7858  /* We have to handle relocations in vxworks .tls_vars sections
7859     specially, because the dynamic loader is 'weird'.  */
7860  is_vxworks_tls = (htab->is_vxworks && bfd_link_pic (info)
7861		    && !strcmp (input_section->output_section->name,
7862				".tls_vars"));
7863  if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET)
7864    relax_info = elf_section_data (input_section)->sec_info;
7865  rel = wrel = relocs;
7866  relend = relocs + input_section->reloc_count;
7867  for (; rel < relend; wrel++, rel++)
7868    {
7869      enum elf_ppc_reloc_type r_type;
7870      bfd_vma addend;
7871      bfd_reloc_status_type r;
7872      Elf_Internal_Sym *sym;
7873      asection *sec;
7874      struct elf_link_hash_entry *h;
7875      const char *sym_name;
7876      reloc_howto_type *howto;
7877      unsigned long r_symndx;
7878      bfd_vma relocation;
7879      bfd_vma branch_bit, from;
7880      bfd_boolean unresolved_reloc;
7881      bfd_boolean warned;
7882      unsigned int tls_type, tls_mask, tls_gd;
7883      struct plt_entry **ifunc;
7884      struct reloc_howto_struct alt_howto;
7885
7886    again:
7887      r_type = ELF32_R_TYPE (rel->r_info);
7888      sym = NULL;
7889      sec = NULL;
7890      h = NULL;
7891      unresolved_reloc = FALSE;
7892      warned = FALSE;
7893      r_symndx = ELF32_R_SYM (rel->r_info);
7894
7895      if (r_symndx < symtab_hdr->sh_info)
7896	{
7897	  sym = local_syms + r_symndx;
7898	  sec = local_sections[r_symndx];
7899	  sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
7900
7901	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
7902	}
7903      else
7904	{
7905	  bfd_boolean ignored;
7906
7907	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
7908				   r_symndx, symtab_hdr, sym_hashes,
7909				   h, sec, relocation,
7910				   unresolved_reloc, warned, ignored);
7911
7912	  sym_name = h->root.root.string;
7913	}
7914
7915      if (sec != NULL && discarded_section (sec))
7916	{
7917	  /* For relocs against symbols from removed linkonce sections,
7918	     or sections discarded by a linker script, we just want the
7919	     section contents zeroed.  Avoid any special processing.  */
7920	  howto = NULL;
7921	  if (r_type < R_PPC_max)
7922	    howto = ppc_elf_howto_table[r_type];
7923
7924	  _bfd_clear_contents (howto, input_bfd, input_section,
7925			       contents + rel->r_offset);
7926	  wrel->r_offset = rel->r_offset;
7927	  wrel->r_info = 0;
7928	  wrel->r_addend = 0;
7929
7930	  /* For ld -r, remove relocations in debug sections against
7931	     sections defined in discarded sections.  Not done for
7932	     non-debug to preserve relocs in .eh_frame which the
7933	     eh_frame editing code expects to be present.  */
7934	  if (bfd_link_relocatable (info)
7935	      && (input_section->flags & SEC_DEBUGGING))
7936	    wrel--;
7937
7938	  continue;
7939	}
7940
7941      if (bfd_link_relocatable (info))
7942	{
7943	  if (got2 != NULL
7944	      && r_type == R_PPC_PLTREL24
7945	      && rel->r_addend != 0)
7946	    {
7947	      /* R_PPC_PLTREL24 is rather special.  If non-zero, the
7948		 addend specifies the GOT pointer offset within .got2.  */
7949	      rel->r_addend += got2->output_offset;
7950	    }
7951	  if (r_type != R_PPC_RELAX_PLT
7952	      && r_type != R_PPC_RELAX_PLTREL24
7953	      && r_type != R_PPC_RELAX)
7954	    goto copy_reloc;
7955	}
7956
7957      /* TLS optimizations.  Replace instruction sequences and relocs
7958	 based on information we collected in tls_optimize.  We edit
7959	 RELOCS so that --emit-relocs will output something sensible
7960	 for the final instruction stream.  */
7961      tls_mask = 0;
7962      tls_gd = 0;
7963      if (h != NULL)
7964	tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
7965      else if (local_got_offsets != NULL)
7966	{
7967	  struct plt_entry **local_plt;
7968	  char *lgot_masks;
7969	  local_plt
7970	    = (struct plt_entry **) (local_got_offsets + symtab_hdr->sh_info);
7971	  lgot_masks = (char *) (local_plt + symtab_hdr->sh_info);
7972	  tls_mask = lgot_masks[r_symndx];
7973	}
7974
7975      /* Ensure reloc mapping code below stays sane.  */
7976      if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
7977	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
7978	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
7979	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
7980	  || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
7981	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
7982	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
7983	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
7984	abort ();
7985      switch (r_type)
7986	{
7987	default:
7988	  break;
7989
7990	case R_PPC_GOT_TPREL16:
7991	case R_PPC_GOT_TPREL16_LO:
7992	  if ((tls_mask & TLS_TLS) != 0
7993	      && (tls_mask & TLS_TPREL) == 0)
7994	    {
7995	      bfd_vma insn;
7996
7997	      insn = bfd_get_32 (input_bfd,
7998				 contents + rel->r_offset - d_offset);
7999	      insn &= 31 << 21;
8000	      insn |= 0x3c020000;	/* addis 0,2,0 */
8001	      bfd_put_32 (input_bfd, insn,
8002			  contents + rel->r_offset - d_offset);
8003	      r_type = R_PPC_TPREL16_HA;
8004	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8005	    }
8006	  break;
8007
8008	case R_PPC_TLS:
8009	  if ((tls_mask & TLS_TLS) != 0
8010	      && (tls_mask & TLS_TPREL) == 0)
8011	    {
8012	      bfd_vma insn;
8013
8014	      insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
8015	      insn = _bfd_elf_ppc_at_tls_transform (insn, 2);
8016	      if (insn == 0)
8017		abort ();
8018	      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8019	      r_type = R_PPC_TPREL16_LO;
8020	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8021
8022	      /* Was PPC_TLS which sits on insn boundary, now
8023		 PPC_TPREL16_LO which is at low-order half-word.  */
8024	      rel->r_offset += d_offset;
8025	    }
8026	  break;
8027
8028	case R_PPC_GOT_TLSGD16_HI:
8029	case R_PPC_GOT_TLSGD16_HA:
8030	  tls_gd = TLS_TPRELGD;
8031	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
8032	    goto tls_gdld_hi;
8033	  break;
8034
8035	case R_PPC_GOT_TLSLD16_HI:
8036	case R_PPC_GOT_TLSLD16_HA:
8037	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
8038	    {
8039	    tls_gdld_hi:
8040	      if ((tls_mask & tls_gd) != 0)
8041		r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
8042			  + R_PPC_GOT_TPREL16);
8043	      else
8044		{
8045		  rel->r_offset -= d_offset;
8046		  bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
8047		  r_type = R_PPC_NONE;
8048		}
8049	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8050	    }
8051	  break;
8052
8053	case R_PPC_GOT_TLSGD16:
8054	case R_PPC_GOT_TLSGD16_LO:
8055	  tls_gd = TLS_TPRELGD;
8056	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
8057	    goto tls_ldgd_opt;
8058	  break;
8059
8060	case R_PPC_GOT_TLSLD16:
8061	case R_PPC_GOT_TLSLD16_LO:
8062	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
8063	    {
8064	      unsigned int insn1, insn2;
8065	      bfd_vma offset;
8066
8067	    tls_ldgd_opt:
8068	      offset = (bfd_vma) -1;
8069	      /* If not using the newer R_PPC_TLSGD/LD to mark
8070		 __tls_get_addr calls, we must trust that the call
8071		 stays with its arg setup insns, ie. that the next
8072		 reloc is the __tls_get_addr call associated with
8073		 the current reloc.  Edit both insns.  */
8074	      if (input_section->has_tls_get_addr_call
8075		  && rel + 1 < relend
8076		  && branch_reloc_hash_match (input_bfd, rel + 1,
8077					      htab->tls_get_addr))
8078		offset = rel[1].r_offset;
8079	      /* We read the low GOT_TLS insn because we need to keep
8080		 the destination reg.  It may be something other than
8081		 the usual r3, and moved to r3 before the call by
8082		 intervening code.  */
8083	      insn1 = bfd_get_32 (input_bfd,
8084				  contents + rel->r_offset - d_offset);
8085	      if ((tls_mask & tls_gd) != 0)
8086		{
8087		  /* IE */
8088		  insn1 &= (0x1f << 21) | (0x1f << 16);
8089		  insn1 |= 32 << 26;	/* lwz */
8090		  if (offset != (bfd_vma) -1)
8091		    {
8092		      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8093		      insn2 = 0x7c631214;	/* add 3,3,2 */
8094		      bfd_put_32 (input_bfd, insn2, contents + offset);
8095		    }
8096		  r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
8097			    + R_PPC_GOT_TPREL16);
8098		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8099		}
8100	      else
8101		{
8102		  /* LE */
8103		  insn1 &= 0x1f << 21;
8104		  insn1 |= 0x3c020000;	/* addis r,2,0 */
8105		  if (tls_gd == 0)
8106		    {
8107		      /* Was an LD reloc.  */
8108		      for (r_symndx = 0;
8109			   r_symndx < symtab_hdr->sh_info;
8110			   r_symndx++)
8111			if (local_sections[r_symndx] == sec)
8112			  break;
8113		      if (r_symndx >= symtab_hdr->sh_info)
8114			r_symndx = STN_UNDEF;
8115		      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8116		      if (r_symndx != STN_UNDEF)
8117			rel->r_addend -= (local_syms[r_symndx].st_value
8118					  + sec->output_offset
8119					  + sec->output_section->vma);
8120		    }
8121		  r_type = R_PPC_TPREL16_HA;
8122		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8123		  if (offset != (bfd_vma) -1)
8124		    {
8125		      rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
8126		      rel[1].r_offset = offset + d_offset;
8127		      rel[1].r_addend = rel->r_addend;
8128		      insn2 = 0x38630000;	/* addi 3,3,0 */
8129		      bfd_put_32 (input_bfd, insn2, contents + offset);
8130		    }
8131		}
8132	      bfd_put_32 (input_bfd, insn1,
8133			  contents + rel->r_offset - d_offset);
8134	      if (tls_gd == 0)
8135		{
8136		  /* We changed the symbol on an LD reloc.  Start over
8137		     in order to get h, sym, sec etc. right.  */
8138		  goto again;
8139		}
8140	    }
8141	  break;
8142
8143	case R_PPC_TLSGD:
8144	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
8145	    {
8146	      unsigned int insn2;
8147	      bfd_vma offset = rel->r_offset;
8148
8149	      if ((tls_mask & TLS_TPRELGD) != 0)
8150		{
8151		  /* IE */
8152		  r_type = R_PPC_NONE;
8153		  insn2 = 0x7c631214;	/* add 3,3,2 */
8154		}
8155	      else
8156		{
8157		  /* LE */
8158		  r_type = R_PPC_TPREL16_LO;
8159		  rel->r_offset += d_offset;
8160		  insn2 = 0x38630000;	/* addi 3,3,0 */
8161		}
8162	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
8163	      bfd_put_32 (input_bfd, insn2, contents + offset);
8164	      /* Zap the reloc on the _tls_get_addr call too.  */
8165	      BFD_ASSERT (offset == rel[1].r_offset);
8166	      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8167	    }
8168	  break;
8169
8170	case R_PPC_TLSLD:
8171	  if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
8172	    {
8173	      unsigned int insn2;
8174
8175	      for (r_symndx = 0;
8176		   r_symndx < symtab_hdr->sh_info;
8177		   r_symndx++)
8178		if (local_sections[r_symndx] == sec)
8179		  break;
8180	      if (r_symndx >= symtab_hdr->sh_info)
8181		r_symndx = STN_UNDEF;
8182	      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
8183	      if (r_symndx != STN_UNDEF)
8184		rel->r_addend -= (local_syms[r_symndx].st_value
8185				  + sec->output_offset
8186				  + sec->output_section->vma);
8187
8188	      rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
8189	      rel->r_offset += d_offset;
8190	      insn2 = 0x38630000;	/* addi 3,3,0 */
8191	      bfd_put_32 (input_bfd, insn2,
8192			  contents + rel->r_offset - d_offset);
8193	      /* Zap the reloc on the _tls_get_addr call too.  */
8194	      BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
8195	      rel[1].r_info = ELF32_R_INFO (STN_UNDEF, R_PPC_NONE);
8196	      goto again;
8197	    }
8198	  break;
8199	}
8200
8201      /* Handle other relocations that tweak non-addend part of insn.  */
8202      branch_bit = 0;
8203      switch (r_type)
8204	{
8205	default:
8206	  break;
8207
8208	  /* Branch taken prediction relocations.  */
8209	case R_PPC_ADDR14_BRTAKEN:
8210	case R_PPC_REL14_BRTAKEN:
8211	  branch_bit = BRANCH_PREDICT_BIT;
8212	  /* Fall through.  */
8213
8214	  /* Branch not taken prediction relocations.  */
8215	case R_PPC_ADDR14_BRNTAKEN:
8216	case R_PPC_REL14_BRNTAKEN:
8217	  {
8218	    bfd_vma insn;
8219
8220	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
8221	    insn &= ~BRANCH_PREDICT_BIT;
8222	    insn |= branch_bit;
8223
8224	    from = (rel->r_offset
8225		    + input_section->output_offset
8226		    + input_section->output_section->vma);
8227
8228	    /* Invert 'y' bit if not the default.  */
8229	    if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
8230	      insn ^= BRANCH_PREDICT_BIT;
8231
8232	    bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
8233	    break;
8234	  }
8235	}
8236
8237      if (ELIMINATE_COPY_RELOCS
8238	  && h != NULL
8239	  && !h->def_regular
8240	  && h->protected_def
8241	  && ppc_elf_hash_entry (h)->has_addr16_ha
8242	  && ppc_elf_hash_entry (h)->has_addr16_lo
8243	  && htab->params->pic_fixup > 0)
8244	{
8245	  /* Convert lis;addi or lis;load/store accessing a protected
8246	     variable defined in a shared library to PIC.  */
8247	  unsigned int insn;
8248
8249	  if (r_type == R_PPC_ADDR16_HA)
8250	    {
8251	      insn = bfd_get_32 (input_bfd,
8252				 contents + rel->r_offset - d_offset);
8253	      if ((insn & (0x3f << 26)) == (15u << 26)
8254		  && (insn & (0x1f << 16)) == 0 /* lis */)
8255		{
8256		  bfd_byte *p;
8257		  bfd_vma off;
8258		  bfd_vma got_addr;
8259
8260		  p = (contents + input_section->size
8261		       - relax_info->workaround_size
8262		       - relax_info->picfixup_size
8263		       + picfixup_size);
8264		  off = (p - contents) - (rel->r_offset - d_offset);
8265		  if (off > 0x1fffffc || (off & 3) != 0)
8266		    info->callbacks->einfo
8267		      (_("%P: %H: fixup branch overflow\n"),
8268		       input_bfd, input_section, rel->r_offset);
8269
8270		  bfd_put_32 (input_bfd, B | off,
8271			      contents + rel->r_offset - d_offset);
8272		  got_addr = (htab->elf.sgot->output_section->vma
8273			      + htab->elf.sgot->output_offset
8274			      + (h->got.offset & ~1));
8275		  wrel->r_offset = (p - contents) + d_offset;
8276		  wrel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_HA);
8277		  wrel->r_addend = got_addr;
8278		  insn &= ~0xffff;
8279		  insn |= ((unsigned int )(got_addr + 0x8000) >> 16) & 0xffff;
8280		  bfd_put_32 (input_bfd, insn, p);
8281
8282		  /* Convert lis to lwz, loading address from GOT.  */
8283		  insn &= ~0xffff;
8284		  insn ^= (32u ^ 15u) << 26;
8285		  insn |= (insn & (0x1f << 21)) >> 5;
8286		  insn |= got_addr & 0xffff;
8287		  bfd_put_32 (input_bfd, insn, p + 4);
8288
8289		  bfd_put_32 (input_bfd, B | ((-4 - off) & 0x3ffffff), p + 8);
8290		  picfixup_size += 12;
8291
8292		  /* Use one of the spare relocs, so --emit-relocs
8293		     output is reasonable.  */
8294		  memmove (rel + 1, rel, (relend - rel - 1) * sizeof (*rel));
8295		  wrel++, rel++;
8296		  rel->r_offset = wrel[-1].r_offset + 4;
8297		  rel->r_info = ELF32_R_INFO (0, R_PPC_ADDR16_LO);
8298		  rel->r_addend = wrel[-1].r_addend;
8299
8300		  /* Continue on as if we had a got reloc, to output
8301		     dynamic reloc.  */
8302		  r_type = R_PPC_GOT16_LO;
8303		}
8304	      else
8305		info->callbacks->einfo
8306		  /* xgettext:c-format */
8307		  (_("%P: %H: error: %s with unexpected instruction %x\n"),
8308		   input_bfd, input_section, rel->r_offset,
8309		   "R_PPC_ADDR16_HA", insn);
8310	    }
8311	  else if (r_type == R_PPC_ADDR16_LO)
8312	    {
8313	      insn = bfd_get_32 (input_bfd,
8314				 contents + rel->r_offset - d_offset);
8315	      if ((insn & (0x3f << 26)) == 14u << 26    /* addi */
8316		  || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8317		  || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8318		  || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8319		  || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8320		  || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8321		  || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8322		  || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8323		  || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8324		  || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8325		  || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8326		  || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8327		  || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8328		  || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8329		  || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8330		      && (insn & 3) != 1)
8331		  || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8332		      && ((insn & 3) == 0 || (insn & 3) == 3)))
8333		{
8334		  /* Arrange to apply the reloc addend, if any.  */
8335		  relocation = 0;
8336		  unresolved_reloc = FALSE;
8337		  rel->r_info = ELF32_R_INFO (0, r_type);
8338		}
8339	      else
8340		info->callbacks->einfo
8341		  /* xgettext:c-format */
8342		  (_("%P: %H: error: %s with unexpected instruction %x\n"),
8343		   input_bfd, input_section, rel->r_offset,
8344		   "R_PPC_ADDR16_LO", insn);
8345	    }
8346	}
8347
8348      ifunc = NULL;
8349      if (!htab->is_vxworks)
8350	{
8351	  struct plt_entry *ent;
8352
8353	  if (h != NULL)
8354	    {
8355	      if (h->type == STT_GNU_IFUNC)
8356		ifunc = &h->plt.plist;
8357	    }
8358	  else if (local_got_offsets != NULL
8359		   && ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8360	    {
8361	      struct plt_entry **local_plt;
8362
8363	      local_plt = (struct plt_entry **) (local_got_offsets
8364						 + symtab_hdr->sh_info);
8365	      ifunc = local_plt + r_symndx;
8366	    }
8367
8368	  ent = NULL;
8369	  if (ifunc != NULL
8370	      && (!bfd_link_pic (info)
8371		  || is_branch_reloc (r_type)))
8372	    {
8373	      addend = 0;
8374	      if (r_type == R_PPC_PLTREL24 && bfd_link_pic (info))
8375		addend = rel->r_addend;
8376	      ent = find_plt_ent (ifunc, got2, addend);
8377	    }
8378	  if (ent != NULL)
8379	    {
8380	      if (bfd_link_pic (info)
8381		  && ent->sec != got2
8382		  && htab->plt_type != PLT_NEW
8383		  && (!htab->elf.dynamic_sections_created
8384		      || h == NULL
8385		      || h->dynindx == -1))
8386		{
8387		  /* Uh oh, we are going to create a pic glink stub
8388		     for an ifunc (here for h == NULL and later in
8389		     finish_dynamic_symbol for h != NULL), and
8390		     apparently are using code compiled with
8391		     -mbss-plt.  The difficulty is that -mbss-plt code
8392		     gives no indication via a magic PLTREL24 addend
8393		     whether r30 is equal to _GLOBAL_OFFSET_TABLE_ or
8394		     is pointing into a .got2 section (and how far
8395		     into .got2).  */
8396		    info->callbacks->einfo
8397		      /* xgettext:c-format */
8398		      (_("%X%P: %H: unsupported bss-plt -fPIC ifunc %s\n"),
8399		       input_bfd, input_section, rel->r_offset, sym_name);
8400		}
8401	      if (h == NULL && (ent->plt.offset & 1) == 0)
8402		{
8403		  Elf_Internal_Rela rela;
8404		  bfd_byte *loc;
8405
8406		  rela.r_offset = (htab->elf.iplt->output_section->vma
8407				   + htab->elf.iplt->output_offset
8408				   + ent->plt.offset);
8409		  rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
8410		  rela.r_addend = relocation;
8411		  loc = htab->elf.irelplt->contents;
8412		  loc += (htab->elf.irelplt->reloc_count++
8413			  * sizeof (Elf32_External_Rela));
8414		  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
8415
8416		  ent->plt.offset |= 1;
8417		}
8418	      if (h == NULL && (ent->glink_offset & 1) == 0)
8419		{
8420		  unsigned char *p = ((unsigned char *) htab->glink->contents
8421				      + ent->glink_offset);
8422		  write_glink_stub (ent, htab->elf.iplt, p, info);
8423		  ent->glink_offset |= 1;
8424		}
8425
8426	      unresolved_reloc = FALSE;
8427	      if (htab->plt_type == PLT_NEW
8428		  || !htab->elf.dynamic_sections_created
8429		  || h == NULL
8430		  || h->dynindx == -1)
8431		relocation = (htab->glink->output_section->vma
8432			      + htab->glink->output_offset
8433			      + (ent->glink_offset & ~1));
8434	      else
8435		relocation = (htab->elf.splt->output_section->vma
8436			      + htab->elf.splt->output_offset
8437			      + ent->plt.offset);
8438	    }
8439	}
8440
8441      addend = rel->r_addend;
8442      tls_type = 0;
8443      howto = NULL;
8444      if (r_type < R_PPC_max)
8445	howto = ppc_elf_howto_table[r_type];
8446      switch (r_type)
8447	{
8448	default:
8449	  info->callbacks->einfo
8450	    /* xgettext:c-format */
8451	    (_("%P: %B: unknown relocation type %d for symbol %s\n"),
8452	     input_bfd, (int) r_type, sym_name);
8453
8454	  bfd_set_error (bfd_error_bad_value);
8455	  ret = FALSE;
8456	  goto copy_reloc;
8457
8458	case R_PPC_NONE:
8459	case R_PPC_TLS:
8460	case R_PPC_TLSGD:
8461	case R_PPC_TLSLD:
8462	case R_PPC_EMB_MRKREF:
8463	case R_PPC_GNU_VTINHERIT:
8464	case R_PPC_GNU_VTENTRY:
8465	  goto copy_reloc;
8466
8467	  /* GOT16 relocations.  Like an ADDR16 using the symbol's
8468	     address in the GOT as relocation value instead of the
8469	     symbol's value itself.  Also, create a GOT entry for the
8470	     symbol and put the symbol value there.  */
8471	case R_PPC_GOT_TLSGD16:
8472	case R_PPC_GOT_TLSGD16_LO:
8473	case R_PPC_GOT_TLSGD16_HI:
8474	case R_PPC_GOT_TLSGD16_HA:
8475	  tls_type = TLS_TLS | TLS_GD;
8476	  goto dogot;
8477
8478	case R_PPC_GOT_TLSLD16:
8479	case R_PPC_GOT_TLSLD16_LO:
8480	case R_PPC_GOT_TLSLD16_HI:
8481	case R_PPC_GOT_TLSLD16_HA:
8482	  tls_type = TLS_TLS | TLS_LD;
8483	  goto dogot;
8484
8485	case R_PPC_GOT_TPREL16:
8486	case R_PPC_GOT_TPREL16_LO:
8487	case R_PPC_GOT_TPREL16_HI:
8488	case R_PPC_GOT_TPREL16_HA:
8489	  tls_type = TLS_TLS | TLS_TPREL;
8490	  goto dogot;
8491
8492	case R_PPC_GOT_DTPREL16:
8493	case R_PPC_GOT_DTPREL16_LO:
8494	case R_PPC_GOT_DTPREL16_HI:
8495	case R_PPC_GOT_DTPREL16_HA:
8496	  tls_type = TLS_TLS | TLS_DTPREL;
8497	  goto dogot;
8498
8499	case R_PPC_GOT16:
8500	case R_PPC_GOT16_LO:
8501	case R_PPC_GOT16_HI:
8502	case R_PPC_GOT16_HA:
8503	  tls_mask = 0;
8504	dogot:
8505	  {
8506	    /* Relocation is to the entry for this symbol in the global
8507	       offset table.  */
8508	    bfd_vma off;
8509	    bfd_vma *offp;
8510	    unsigned long indx;
8511
8512	    if (htab->elf.sgot == NULL)
8513	      abort ();
8514
8515	    indx = 0;
8516	    if (tls_type == (TLS_TLS | TLS_LD)
8517		&& (h == NULL
8518		    || !h->def_dynamic))
8519	      offp = &htab->tlsld_got.offset;
8520	    else if (h != NULL)
8521	      {
8522		bfd_boolean dyn;
8523		dyn = htab->elf.dynamic_sections_created;
8524		if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info), h)
8525		    || (bfd_link_pic (info)
8526			&& SYMBOL_REFERENCES_LOCAL (info, h)))
8527		  /* This is actually a static link, or it is a
8528		     -Bsymbolic link and the symbol is defined
8529		     locally, or the symbol was forced to be local
8530		     because of a version file.  */
8531		  ;
8532		else
8533		  {
8534		    BFD_ASSERT (h->dynindx != -1);
8535		    indx = h->dynindx;
8536		    unresolved_reloc = FALSE;
8537		  }
8538		offp = &h->got.offset;
8539	      }
8540	    else
8541	      {
8542		if (local_got_offsets == NULL)
8543		  abort ();
8544		offp = &local_got_offsets[r_symndx];
8545	      }
8546
8547	    /* The offset must always be a multiple of 4.  We use the
8548	       least significant bit to record whether we have already
8549	       processed this entry.  */
8550	    off = *offp;
8551	    if ((off & 1) != 0)
8552	      off &= ~1;
8553	    else
8554	      {
8555		unsigned int tls_m = (tls_mask
8556				      & (TLS_LD | TLS_GD | TLS_DTPREL
8557					 | TLS_TPREL | TLS_TPRELGD));
8558
8559		if (offp == &htab->tlsld_got.offset)
8560		  tls_m = TLS_LD;
8561		else if (h == NULL
8562			 || !h->def_dynamic)
8563		  tls_m &= ~TLS_LD;
8564
8565		/* We might have multiple got entries for this sym.
8566		   Initialize them all.  */
8567		do
8568		  {
8569		    int tls_ty = 0;
8570
8571		    if ((tls_m & TLS_LD) != 0)
8572		      {
8573			tls_ty = TLS_TLS | TLS_LD;
8574			tls_m &= ~TLS_LD;
8575		      }
8576		    else if ((tls_m & TLS_GD) != 0)
8577		      {
8578			tls_ty = TLS_TLS | TLS_GD;
8579			tls_m &= ~TLS_GD;
8580		      }
8581		    else if ((tls_m & TLS_DTPREL) != 0)
8582		      {
8583			tls_ty = TLS_TLS | TLS_DTPREL;
8584			tls_m &= ~TLS_DTPREL;
8585		      }
8586		    else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
8587		      {
8588			tls_ty = TLS_TLS | TLS_TPREL;
8589			tls_m = 0;
8590		      }
8591
8592		    /* Generate relocs for the dynamic linker.  */
8593		    if ((bfd_link_pic (info) || indx != 0)
8594			&& (offp == &htab->tlsld_got.offset
8595			    || h == NULL
8596			    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
8597			    || h->root.type != bfd_link_hash_undefweak))
8598		      {
8599			asection *rsec = htab->elf.srelgot;
8600			bfd_byte * loc;
8601
8602			if (ifunc != NULL)
8603			  rsec = htab->elf.irelplt;
8604			outrel.r_offset = (htab->elf.sgot->output_section->vma
8605					   + htab->elf.sgot->output_offset
8606					   + off);
8607			outrel.r_addend = 0;
8608			if (tls_ty & (TLS_LD | TLS_GD))
8609			  {
8610			    outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
8611			    if (tls_ty == (TLS_TLS | TLS_GD))
8612			      {
8613				loc = rsec->contents;
8614				loc += (rsec->reloc_count++
8615					* sizeof (Elf32_External_Rela));
8616				bfd_elf32_swap_reloca_out (output_bfd,
8617							   &outrel, loc);
8618				outrel.r_offset += 4;
8619				outrel.r_info
8620				  = ELF32_R_INFO (indx, R_PPC_DTPREL32);
8621			      }
8622			  }
8623			else if (tls_ty == (TLS_TLS | TLS_DTPREL))
8624			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
8625			else if (tls_ty == (TLS_TLS | TLS_TPREL))
8626			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
8627			else if (indx != 0)
8628			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
8629			else if (ifunc != NULL)
8630			  outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
8631			else
8632			  outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
8633			if (indx == 0 && tls_ty != (TLS_TLS | TLS_LD))
8634			  {
8635			    outrel.r_addend += relocation;
8636			    if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
8637			      {
8638				if (htab->elf.tls_sec == NULL)
8639				  outrel.r_addend = 0;
8640				else
8641				  outrel.r_addend -= htab->elf.tls_sec->vma;
8642			      }
8643			  }
8644			loc = rsec->contents;
8645			loc += (rsec->reloc_count++
8646				* sizeof (Elf32_External_Rela));
8647			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
8648		      }
8649
8650		    /* Init the .got section contents if we're not
8651		       emitting a reloc.  */
8652		    else
8653		      {
8654			bfd_vma value = relocation;
8655
8656			if (tls_ty == (TLS_TLS | TLS_LD))
8657			  value = 1;
8658			else if (tls_ty != 0)
8659			  {
8660			    if (htab->elf.tls_sec == NULL)
8661			      value = 0;
8662			    else
8663			      {
8664				value -= htab->elf.tls_sec->vma + DTP_OFFSET;
8665				if (tls_ty == (TLS_TLS | TLS_TPREL))
8666				  value += DTP_OFFSET - TP_OFFSET;
8667			      }
8668
8669			    if (tls_ty == (TLS_TLS | TLS_GD))
8670			      {
8671				bfd_put_32 (input_bfd, value,
8672					    htab->elf.sgot->contents + off + 4);
8673				value = 1;
8674			      }
8675			  }
8676			bfd_put_32 (input_bfd, value,
8677				    htab->elf.sgot->contents + off);
8678		      }
8679
8680		    off += 4;
8681		    if (tls_ty & (TLS_LD | TLS_GD))
8682		      off += 4;
8683		  }
8684		while (tls_m != 0);
8685
8686		off = *offp;
8687		*offp = off | 1;
8688	      }
8689
8690	    if (off >= (bfd_vma) -2)
8691	      abort ();
8692
8693	    if ((tls_type & TLS_TLS) != 0)
8694	      {
8695		if (tls_type != (TLS_TLS | TLS_LD))
8696		  {
8697		    if ((tls_mask & TLS_LD) != 0
8698			&& !(h == NULL
8699			     || !h->def_dynamic))
8700		      off += 8;
8701		    if (tls_type != (TLS_TLS | TLS_GD))
8702		      {
8703			if ((tls_mask & TLS_GD) != 0)
8704			  off += 8;
8705			if (tls_type != (TLS_TLS | TLS_DTPREL))
8706			  {
8707			    if ((tls_mask & TLS_DTPREL) != 0)
8708			      off += 4;
8709			  }
8710		      }
8711		  }
8712	      }
8713
8714	    /* If here for a picfixup, we're done.  */
8715	    if (r_type != ELF32_R_TYPE (rel->r_info))
8716	      goto copy_reloc;
8717
8718	    relocation = (htab->elf.sgot->output_section->vma
8719			  + htab->elf.sgot->output_offset
8720			  + off
8721			  - SYM_VAL (htab->elf.hgot));
8722
8723	    /* Addends on got relocations don't make much sense.
8724	       x+off@got is actually x@got+off, and since the got is
8725	       generated by a hash table traversal, the value in the
8726	       got at entry m+n bears little relation to the entry m.  */
8727	    if (addend != 0)
8728	      info->callbacks->einfo
8729		/* xgettext:c-format */
8730		(_("%P: %H: non-zero addend on %s reloc against `%s'\n"),
8731		 input_bfd, input_section, rel->r_offset,
8732		 howto->name,
8733		 sym_name);
8734	  }
8735	  break;
8736
8737	  /* Relocations that need no special processing.  */
8738	case R_PPC_LOCAL24PC:
8739	  /* It makes no sense to point a local relocation
8740	     at a symbol not in this object.  */
8741	  if (unresolved_reloc)
8742	    {
8743	      (*info->callbacks->undefined_symbol) (info,
8744						    h->root.root.string,
8745						    input_bfd,
8746						    input_section,
8747						    rel->r_offset,
8748						    TRUE);
8749	      goto copy_reloc;
8750	    }
8751	  if (h != NULL && h->type == STT_GNU_IFUNC && bfd_link_pic (info))
8752	    {
8753	      /* @local on an ifunc does not really make sense since
8754		 the ifunc resolver can take you anywhere.  More
8755		 seriously, calls to ifuncs must go through a plt call
8756		 stub, and for pic the plt call stubs uses r30 to
8757		 access the PLT.  The problem is that a call that is
8758		 local won't have the +32k reloc addend trick marking
8759		 -fPIC code, so the linker won't know whether r30 is
8760		 _GLOBAL_OFFSET_TABLE_ or pointing into a .got2 section.  */
8761	      /* xgettext:c-format */
8762	      info->callbacks->einfo (_("%X%P: %H: @local call to ifunc %s\n"),
8763				      input_bfd, input_section, rel->r_offset,
8764				      h->root.root.string);
8765	    }
8766	  break;
8767
8768	case R_PPC_DTPREL16:
8769	case R_PPC_DTPREL16_LO:
8770	case R_PPC_DTPREL16_HI:
8771	case R_PPC_DTPREL16_HA:
8772	  if (htab->elf.tls_sec != NULL)
8773	    addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
8774	  break;
8775
8776	  /* Relocations that may need to be propagated if this is a shared
8777	     object.  */
8778	case R_PPC_TPREL16:
8779	case R_PPC_TPREL16_LO:
8780	case R_PPC_TPREL16_HI:
8781	case R_PPC_TPREL16_HA:
8782	  if (h != NULL
8783	      && h->root.type == bfd_link_hash_undefweak
8784	      && h->dynindx == -1)
8785	    {
8786	      /* Make this relocation against an undefined weak symbol
8787		 resolve to zero.  This is really just a tweak, since
8788		 code using weak externs ought to check that they are
8789		 defined before using them.  */
8790	      bfd_byte *p = contents + rel->r_offset - d_offset;
8791	      unsigned int insn = bfd_get_32 (input_bfd, p);
8792	      insn = _bfd_elf_ppc_at_tprel_transform (insn, 2);
8793	      if (insn != 0)
8794		bfd_put_32 (input_bfd, insn, p);
8795	      break;
8796	    }
8797	  if (htab->elf.tls_sec != NULL)
8798	    addend -= htab->elf.tls_sec->vma + TP_OFFSET;
8799	  /* The TPREL16 relocs shouldn't really be used in shared
8800	     libs as they will result in DT_TEXTREL being set, but
8801	     support them anyway.  */
8802	  goto dodyn;
8803
8804	case R_PPC_TPREL32:
8805	  if (htab->elf.tls_sec != NULL)
8806	    addend -= htab->elf.tls_sec->vma + TP_OFFSET;
8807	  goto dodyn;
8808
8809	case R_PPC_DTPREL32:
8810	  if (htab->elf.tls_sec != NULL)
8811	    addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
8812	  goto dodyn;
8813
8814	case R_PPC_DTPMOD32:
8815	  relocation = 1;
8816	  addend = 0;
8817	  goto dodyn;
8818
8819	case R_PPC_REL16:
8820	case R_PPC_REL16_LO:
8821	case R_PPC_REL16_HI:
8822	case R_PPC_REL16_HA:
8823	case R_PPC_REL16DX_HA:
8824	  break;
8825
8826	case R_PPC_REL32:
8827	  if (h == NULL || h == htab->elf.hgot)
8828	    break;
8829	  /* fall through */
8830
8831	case R_PPC_ADDR32:
8832	case R_PPC_ADDR16:
8833	case R_PPC_ADDR16_LO:
8834	case R_PPC_ADDR16_HI:
8835	case R_PPC_ADDR16_HA:
8836	case R_PPC_UADDR32:
8837	case R_PPC_UADDR16:
8838	  goto dodyn;
8839
8840	case R_PPC_VLE_REL8:
8841	case R_PPC_VLE_REL15:
8842	case R_PPC_VLE_REL24:
8843	case R_PPC_REL24:
8844	case R_PPC_REL14:
8845	case R_PPC_REL14_BRTAKEN:
8846	case R_PPC_REL14_BRNTAKEN:
8847	  /* If these relocations are not to a named symbol, they can be
8848	     handled right here, no need to bother the dynamic linker.  */
8849	  if (SYMBOL_CALLS_LOCAL (info, h)
8850	      || h == htab->elf.hgot)
8851	    break;
8852	  /* fall through */
8853
8854	case R_PPC_ADDR24:
8855	case R_PPC_ADDR14:
8856	case R_PPC_ADDR14_BRTAKEN:
8857	case R_PPC_ADDR14_BRNTAKEN:
8858	  if (h != NULL && !bfd_link_pic (info))
8859	    break;
8860	  /* fall through */
8861
8862	dodyn:
8863	  if ((input_section->flags & SEC_ALLOC) == 0
8864	      || is_vxworks_tls)
8865	    break;
8866
8867	  if ((bfd_link_pic (info)
8868	       && !(h != NULL
8869		    && ((h->root.type == bfd_link_hash_undefined
8870			 && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
8871			     || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
8872			|| (h->root.type == bfd_link_hash_undefweak
8873			    && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)))
8874	       && (must_be_dyn_reloc (info, r_type)
8875		   || !SYMBOL_CALLS_LOCAL (info, h)))
8876	      || (ELIMINATE_COPY_RELOCS
8877		  && !bfd_link_pic (info)
8878		  && h != NULL
8879		  && h->dynindx != -1
8880		  && !h->non_got_ref
8881		  && !h->def_regular
8882		  && !(h->protected_def
8883		       && ppc_elf_hash_entry (h)->has_addr16_ha
8884		       && ppc_elf_hash_entry (h)->has_addr16_lo
8885		       && htab->params->pic_fixup > 0)))
8886	    {
8887	      int skip;
8888	      bfd_byte *loc;
8889	      asection *sreloc;
8890#ifdef DEBUG
8891	      fprintf (stderr, "ppc_elf_relocate_section needs to "
8892		       "create relocation for %s\n",
8893		       (h && h->root.root.string
8894			? h->root.root.string : "<unknown>"));
8895#endif
8896
8897	      /* When generating a shared object, these relocations
8898		 are copied into the output file to be resolved at run
8899		 time.  */
8900	      sreloc = elf_section_data (input_section)->sreloc;
8901	      if (ifunc)
8902		sreloc = htab->elf.irelplt;
8903	      if (sreloc == NULL)
8904		return FALSE;
8905
8906	      skip = 0;
8907	      outrel.r_offset = _bfd_elf_section_offset (output_bfd, info,
8908							 input_section,
8909							 rel->r_offset);
8910	      if (outrel.r_offset == (bfd_vma) -1
8911		  || outrel.r_offset == (bfd_vma) -2)
8912		skip = (int) outrel.r_offset;
8913	      outrel.r_offset += (input_section->output_section->vma
8914				  + input_section->output_offset);
8915
8916	      if (skip)
8917		memset (&outrel, 0, sizeof outrel);
8918	      else if ((h != NULL
8919			&& (h->root.type == bfd_link_hash_undefined
8920			    || h->root.type == bfd_link_hash_undefweak))
8921		       || !SYMBOL_REFERENCES_LOCAL (info, h))
8922		{
8923		  BFD_ASSERT (h->dynindx != -1);
8924		  unresolved_reloc = FALSE;
8925		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
8926		  outrel.r_addend = rel->r_addend;
8927		}
8928	      else
8929		{
8930		  outrel.r_addend = relocation + rel->r_addend;
8931
8932		  if (r_type != R_PPC_ADDR32)
8933		    {
8934		      long indx = 0;
8935
8936		      if (ifunc != NULL)
8937			{
8938			  /* If we get here when building a static
8939			     executable, then the libc startup function
8940			     responsible for applying indirect function
8941			     relocations is going to complain about
8942			     the reloc type.
8943			     If we get here when building a dynamic
8944			     executable, it will be because we have
8945			     a text relocation.  The dynamic loader
8946			     will set the text segment writable and
8947			     non-executable to apply text relocations.
8948			     So we'll segfault when trying to run the
8949			     indirection function to resolve the reloc.  */
8950			  info->callbacks->einfo
8951			    /* xgettext:c-format */
8952			    (_("%P: %H: relocation %s for indirect "
8953			       "function %s unsupported\n"),
8954			     input_bfd, input_section, rel->r_offset,
8955			     howto->name,
8956			     sym_name);
8957			  ret = FALSE;
8958			}
8959		      else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
8960			;
8961		      else if (sec == NULL || sec->owner == NULL)
8962			{
8963			  bfd_set_error (bfd_error_bad_value);
8964			  ret = FALSE;
8965			}
8966		      else
8967			{
8968			  asection *osec;
8969
8970			  /* We are turning this relocation into one
8971			     against a section symbol.  It would be
8972			     proper to subtract the symbol's value,
8973			     osec->vma, from the emitted reloc addend,
8974			     but ld.so expects buggy relocs.
8975			     FIXME: Why not always use a zero index?  */
8976			  osec = sec->output_section;
8977			  indx = elf_section_data (osec)->dynindx;
8978			  if (indx == 0)
8979			    {
8980			      osec = htab->elf.text_index_section;
8981			      indx = elf_section_data (osec)->dynindx;
8982			    }
8983			  BFD_ASSERT (indx != 0);
8984#ifdef DEBUG
8985			  if (indx == 0)
8986			    printf ("indx=%ld section=%s flags=%08x name=%s\n",
8987				    indx, osec->name, osec->flags,
8988				    h->root.root.string);
8989#endif
8990			}
8991
8992		      outrel.r_info = ELF32_R_INFO (indx, r_type);
8993		    }
8994		  else if (ifunc != NULL)
8995		    outrel.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
8996		  else
8997		    outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
8998		}
8999
9000	      loc = sreloc->contents;
9001	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
9002	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
9003
9004	      if (skip == -1)
9005		goto copy_reloc;
9006
9007	      /* This reloc will be computed at runtime.  We clear the memory
9008		 so that it contains predictable value.  */
9009	      if (! skip
9010		  && ((input_section->flags & SEC_ALLOC) != 0
9011		      || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
9012		{
9013		  relocation = howto->pc_relative ? outrel.r_offset : 0;
9014		  addend = 0;
9015		  break;
9016		}
9017	    }
9018	  break;
9019
9020	case R_PPC_RELAX_PLT:
9021	case R_PPC_RELAX_PLTREL24:
9022	  if (h != NULL)
9023	    {
9024	      struct plt_entry *ent;
9025	      bfd_vma got2_addend = 0;
9026
9027	      if (r_type == R_PPC_RELAX_PLTREL24)
9028		{
9029		  if (bfd_link_pic (info))
9030		    got2_addend = addend;
9031		  addend = 0;
9032		}
9033	      ent = find_plt_ent (&h->plt.plist, got2, got2_addend);
9034	      if (htab->plt_type == PLT_NEW)
9035		relocation = (htab->glink->output_section->vma
9036			      + htab->glink->output_offset
9037			      + ent->glink_offset);
9038	      else
9039		relocation = (htab->elf.splt->output_section->vma
9040			      + htab->elf.splt->output_offset
9041			      + ent->plt.offset);
9042	    }
9043	  /* Fall through.  */
9044
9045	case R_PPC_RELAX:
9046	  {
9047	    const int *stub;
9048	    size_t size;
9049	    size_t insn_offset = rel->r_offset;
9050	    unsigned int insn;
9051
9052	    if (bfd_link_pic (info))
9053	      {
9054		relocation -= (input_section->output_section->vma
9055			       + input_section->output_offset
9056			       + rel->r_offset - 4);
9057		stub = shared_stub_entry;
9058		bfd_put_32 (input_bfd, stub[0], contents + insn_offset - 12);
9059		bfd_put_32 (input_bfd, stub[1], contents + insn_offset - 8);
9060		bfd_put_32 (input_bfd, stub[2], contents + insn_offset - 4);
9061		stub += 3;
9062		size = ARRAY_SIZE (shared_stub_entry) - 3;
9063	      }
9064	    else
9065	      {
9066		stub = stub_entry;
9067		size = ARRAY_SIZE (stub_entry);
9068	      }
9069
9070	    relocation += addend;
9071	    if (bfd_link_relocatable (info))
9072	      relocation = 0;
9073
9074	    /* First insn is HA, second is LO.  */
9075	    insn = *stub++;
9076	    insn |= ((relocation + 0x8000) >> 16) & 0xffff;
9077	    bfd_put_32 (input_bfd, insn, contents + insn_offset);
9078	    insn_offset += 4;
9079
9080	    insn = *stub++;
9081	    insn |= relocation & 0xffff;
9082	    bfd_put_32 (input_bfd, insn, contents + insn_offset);
9083	    insn_offset += 4;
9084	    size -= 2;
9085
9086	    while (size != 0)
9087	      {
9088		insn = *stub++;
9089		--size;
9090		bfd_put_32 (input_bfd, insn, contents + insn_offset);
9091		insn_offset += 4;
9092	      }
9093
9094	    /* Rewrite the reloc and convert one of the trailing nop
9095	       relocs to describe this relocation.  */
9096	    BFD_ASSERT (ELF32_R_TYPE (relend[-1].r_info) == R_PPC_NONE);
9097	    /* The relocs are at the bottom 2 bytes */
9098	    wrel->r_offset = rel->r_offset + d_offset;
9099	    wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_HA);
9100	    wrel->r_addend = rel->r_addend;
9101	    memmove (wrel + 1, wrel, (relend - wrel - 1) * sizeof (*wrel));
9102	    wrel++, rel++;
9103	    wrel->r_offset += 4;
9104	    wrel->r_info = ELF32_R_INFO (r_symndx, R_PPC_ADDR16_LO);
9105	  }
9106	  continue;
9107
9108	  /* Indirect .sdata relocation.  */
9109	case R_PPC_EMB_SDAI16:
9110	  BFD_ASSERT (htab->sdata[0].section != NULL);
9111	  if (!is_static_defined (htab->sdata[0].sym))
9112	    {
9113	      unresolved_reloc = TRUE;
9114	      break;
9115	    }
9116	  relocation
9117	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
9118						 h, relocation, rel);
9119	  addend = 0;
9120	  break;
9121
9122	  /* Indirect .sdata2 relocation.  */
9123	case R_PPC_EMB_SDA2I16:
9124	  BFD_ASSERT (htab->sdata[1].section != NULL);
9125	  if (!is_static_defined (htab->sdata[1].sym))
9126	    {
9127	      unresolved_reloc = TRUE;
9128	      break;
9129	    }
9130	  relocation
9131	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
9132						 h, relocation, rel);
9133	  addend = 0;
9134	  break;
9135
9136	  /* Handle the TOC16 reloc.  We want to use the offset within the .got
9137	     section, not the actual VMA.  This is appropriate when generating
9138	     an embedded ELF object, for which the .got section acts like the
9139	     AIX .toc section.  */
9140	case R_PPC_TOC16:			/* phony GOT16 relocations */
9141	  if (sec == NULL || sec->output_section == NULL)
9142	    {
9143	      unresolved_reloc = TRUE;
9144	      break;
9145	    }
9146	  BFD_ASSERT (strcmp (bfd_get_section_name (sec->owner, sec),
9147			      ".got") == 0
9148		      || strcmp (bfd_get_section_name (sec->owner, sec),
9149				 ".cgot") == 0);
9150
9151	  addend -= sec->output_section->vma + sec->output_offset + 0x8000;
9152	  break;
9153
9154	case R_PPC_PLTREL24:
9155	  if (h != NULL && ifunc == NULL)
9156	    {
9157	      struct plt_entry *ent;
9158
9159	      ent = find_plt_ent (&h->plt.plist, got2,
9160				  bfd_link_pic (info) ? addend : 0);
9161	      if (ent == NULL
9162		  || htab->elf.splt == NULL)
9163		{
9164		  /* We didn't make a PLT entry for this symbol.  This
9165		     happens when statically linking PIC code, or when
9166		     using -Bsymbolic.  */
9167		}
9168	      else
9169		{
9170		  /* Relocation is to the entry for this symbol in the
9171		     procedure linkage table.  */
9172		  unresolved_reloc = FALSE;
9173		  if (htab->plt_type == PLT_NEW)
9174		    relocation = (htab->glink->output_section->vma
9175				  + htab->glink->output_offset
9176				  + ent->glink_offset);
9177		  else
9178		    relocation = (htab->elf.splt->output_section->vma
9179				  + htab->elf.splt->output_offset
9180				  + ent->plt.offset);
9181		}
9182	    }
9183
9184	  /* R_PPC_PLTREL24 is rather special.  If non-zero, the
9185	     addend specifies the GOT pointer offset within .got2.
9186	     Don't apply it to the relocation field.  */
9187	  addend = 0;
9188	  break;
9189
9190	  /* Relocate against _SDA_BASE_.  */
9191	case R_PPC_SDAREL16:
9192	  {
9193	    const char *name;
9194	    struct elf_link_hash_entry *sda = htab->sdata[0].sym;
9195
9196	    if (sec == NULL
9197		|| sec->output_section == NULL
9198		|| !is_static_defined (sda))
9199	      {
9200		unresolved_reloc = TRUE;
9201		break;
9202	      }
9203	    addend -= SYM_VAL (sda);
9204
9205	    name = bfd_get_section_name (output_bfd, sec->output_section);
9206	    if (!(strcmp (name, ".sdata") == 0
9207		  || strcmp (name, ".sbss") == 0))
9208	      {
9209		info->callbacks->einfo
9210		  /* xgettext:c-format */
9211		  (_("%P: %B: the target (%s) of a %s relocation is "
9212		     "in the wrong output section (%s)\n"),
9213		   input_bfd,
9214		   sym_name,
9215		   howto->name,
9216		   name);
9217	      }
9218	  }
9219	  break;
9220
9221	  /* Relocate against _SDA2_BASE_.  */
9222	case R_PPC_EMB_SDA2REL:
9223	  {
9224	    const char *name;
9225	    struct elf_link_hash_entry *sda = htab->sdata[1].sym;
9226
9227	    if (sec == NULL
9228		|| sec->output_section == NULL
9229		|| !is_static_defined (sda))
9230	      {
9231		unresolved_reloc = TRUE;
9232		break;
9233	      }
9234	    addend -= SYM_VAL (sda);
9235
9236	    name = bfd_get_section_name (output_bfd, sec->output_section);
9237	    if (!(strcmp (name, ".sdata2") == 0
9238		  || strcmp (name, ".sbss2") == 0))
9239	      {
9240		info->callbacks->einfo
9241		  /* xgettext:c-format */
9242		  (_("%P: %B: the target (%s) of a %s relocation is "
9243		     "in the wrong output section (%s)\n"),
9244		   input_bfd,
9245		   sym_name,
9246		   howto->name,
9247		   name);
9248	      }
9249	  }
9250	  break;
9251
9252	case R_PPC_VLE_LO16A:
9253	  relocation = relocation + addend;
9254	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9255			       contents + rel->r_offset, relocation,
9256			       split16a_type, htab->params->vle_reloc_fixup);
9257	  goto copy_reloc;
9258
9259	case R_PPC_VLE_LO16D:
9260	  relocation = relocation + addend;
9261	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9262			       contents + rel->r_offset, relocation,
9263			       split16d_type, htab->params->vle_reloc_fixup);
9264	  goto copy_reloc;
9265
9266	case R_PPC_VLE_HI16A:
9267	  relocation = (relocation + addend) >> 16;
9268	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9269			       contents + rel->r_offset, relocation,
9270			       split16a_type, htab->params->vle_reloc_fixup);
9271	  goto copy_reloc;
9272
9273	case R_PPC_VLE_HI16D:
9274	  relocation = (relocation + addend) >> 16;
9275	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9276			       contents + rel->r_offset, relocation,
9277			       split16d_type, htab->params->vle_reloc_fixup);
9278	  goto copy_reloc;
9279
9280	case R_PPC_VLE_HA16A:
9281	  relocation = (relocation + addend + 0x8000) >> 16;
9282	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9283			       contents + rel->r_offset, relocation,
9284			       split16a_type, htab->params->vle_reloc_fixup);
9285	  goto copy_reloc;
9286
9287	case R_PPC_VLE_HA16D:
9288	  relocation = (relocation + addend + 0x8000) >> 16;
9289	  ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9290			       contents + rel->r_offset, relocation,
9291			       split16d_type, htab->params->vle_reloc_fixup);
9292	  goto copy_reloc;
9293
9294	  /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
9295	case R_PPC_EMB_SDA21:
9296	case R_PPC_VLE_SDA21:
9297	case R_PPC_EMB_RELSDA:
9298	case R_PPC_VLE_SDA21_LO:
9299	  {
9300	    const char *name;
9301	    int reg;
9302	    unsigned int insn;
9303	    struct elf_link_hash_entry *sda = NULL;
9304
9305	    if (sec == NULL || sec->output_section == NULL)
9306	      {
9307		unresolved_reloc = TRUE;
9308		break;
9309	      }
9310
9311	    name = bfd_get_section_name (output_bfd, sec->output_section);
9312	    if (strcmp (name, ".sdata") == 0
9313		|| strcmp (name, ".sbss") == 0)
9314	      {
9315		reg = 13;
9316		sda = htab->sdata[0].sym;
9317	      }
9318	    else if (strcmp (name, ".sdata2") == 0
9319		     || strcmp (name, ".sbss2") == 0)
9320	      {
9321		reg = 2;
9322		sda = htab->sdata[1].sym;
9323	      }
9324	    else if (strcmp (name, ".PPC.EMB.sdata0") == 0
9325		     || strcmp (name, ".PPC.EMB.sbss0") == 0)
9326	      {
9327		reg = 0;
9328	      }
9329	    else
9330	      {
9331		info->callbacks->einfo
9332		  /* xgettext:c-format */
9333		  (_("%P: %B: the target (%s) of a %s relocation is "
9334		     "in the wrong output section (%s)\n"),
9335		   input_bfd,
9336		   sym_name,
9337		   howto->name,
9338		   name);
9339
9340		bfd_set_error (bfd_error_bad_value);
9341		ret = FALSE;
9342		goto copy_reloc;
9343	      }
9344
9345	    if (sda != NULL)
9346	      {
9347		if (!is_static_defined (sda))
9348		  {
9349		    unresolved_reloc = TRUE;
9350		    break;
9351		  }
9352		addend -= SYM_VAL (sda);
9353	      }
9354
9355	    insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
9356	    if (reg == 0
9357		&& (r_type == R_PPC_VLE_SDA21
9358		    || r_type == R_PPC_VLE_SDA21_LO))
9359	      {
9360		relocation = relocation + addend;
9361		addend = 0;
9362
9363		/* Force e_li insn, keeping RT from original insn.  */
9364		insn &= 0x1f << 21;
9365		insn |= 28u << 26;
9366
9367		/* We have an li20 field, bits 17..20, 11..15, 21..31.  */
9368		/* Top 4 bits of value to 17..20.  */
9369		insn |= (relocation & 0xf0000) >> 5;
9370		/* Next 5 bits of the value to 11..15.  */
9371		insn |= (relocation & 0xf800) << 5;
9372		/* And the final 11 bits of the value to bits 21 to 31.  */
9373		insn |= relocation & 0x7ff;
9374
9375		bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9376
9377		if (r_type == R_PPC_VLE_SDA21
9378		    && ((relocation + 0x80000) & 0xffffffff) > 0x100000)
9379		  goto overflow;
9380		goto copy_reloc;
9381	      }
9382	    else if (r_type == R_PPC_EMB_SDA21
9383		     || r_type == R_PPC_VLE_SDA21
9384		     || r_type == R_PPC_VLE_SDA21_LO)
9385	      {
9386		/* Fill in register field.  */
9387		insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
9388	      }
9389	    bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9390	  }
9391	  break;
9392
9393	case R_PPC_VLE_SDAREL_LO16A:
9394	case R_PPC_VLE_SDAREL_LO16D:
9395	case R_PPC_VLE_SDAREL_HI16A:
9396	case R_PPC_VLE_SDAREL_HI16D:
9397	case R_PPC_VLE_SDAREL_HA16A:
9398	case R_PPC_VLE_SDAREL_HA16D:
9399	  {
9400	    bfd_vma value;
9401	    const char *name;
9402	    struct elf_link_hash_entry *sda = NULL;
9403
9404	    if (sec == NULL || sec->output_section == NULL)
9405	      {
9406		unresolved_reloc = TRUE;
9407		break;
9408	      }
9409
9410	    name = bfd_get_section_name (output_bfd, sec->output_section);
9411	    if (strcmp (name, ".sdata") == 0
9412		|| strcmp (name, ".sbss") == 0)
9413	      sda = htab->sdata[0].sym;
9414	    else if (strcmp (name, ".sdata2") == 0
9415		     || strcmp (name, ".sbss2") == 0)
9416	      sda = htab->sdata[1].sym;
9417	    else
9418	      {
9419		_bfd_error_handler
9420		  /* xgettext:c-format */
9421		  (_("%B: the target (%s) of a %s relocation is "
9422		     "in the wrong output section (%s)"),
9423		   input_bfd,
9424		   sym_name,
9425		   howto->name,
9426		   name);
9427
9428		bfd_set_error (bfd_error_bad_value);
9429		ret = FALSE;
9430		goto copy_reloc;
9431	      }
9432
9433	    if (sda == NULL || !is_static_defined (sda))
9434	      {
9435		unresolved_reloc = TRUE;
9436		break;
9437	      }
9438	    value = relocation + addend - SYM_VAL (sda);
9439
9440	    if (r_type == R_PPC_VLE_SDAREL_LO16A)
9441	      ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9442				   contents + rel->r_offset, value,
9443				   split16a_type,
9444				   htab->params->vle_reloc_fixup);
9445	    else if (r_type == R_PPC_VLE_SDAREL_LO16D)
9446	      ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9447				   contents + rel->r_offset, value,
9448				   split16d_type,
9449				   htab->params->vle_reloc_fixup);
9450	    else if (r_type == R_PPC_VLE_SDAREL_HI16A)
9451	      {
9452		value = value >> 16;
9453		ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9454				     contents + rel->r_offset, value,
9455				     split16a_type,
9456				     htab->params->vle_reloc_fixup);
9457	      }
9458	    else if (r_type == R_PPC_VLE_SDAREL_HI16D)
9459	      {
9460		value = value >> 16;
9461		ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9462				     contents + rel->r_offset, value,
9463				     split16d_type,
9464				     htab->params->vle_reloc_fixup);
9465	      }
9466	    else if (r_type == R_PPC_VLE_SDAREL_HA16A)
9467	      {
9468		value = (value + 0x8000) >> 16;
9469		ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9470				     contents + rel->r_offset, value,
9471				     split16a_type,
9472				     htab->params->vle_reloc_fixup);
9473	      }
9474	    else if (r_type == R_PPC_VLE_SDAREL_HA16D)
9475	      {
9476		value = (value + 0x8000) >> 16;
9477		ppc_elf_vle_split16 (input_bfd, input_section, rel->r_offset,
9478				     contents + rel->r_offset, value,
9479				     split16d_type,
9480				     htab->params->vle_reloc_fixup);
9481	      }
9482	  }
9483	  goto copy_reloc;
9484
9485	  /* Relocate against the beginning of the section.  */
9486	case R_PPC_SECTOFF:
9487	case R_PPC_SECTOFF_LO:
9488	case R_PPC_SECTOFF_HI:
9489	case R_PPC_SECTOFF_HA:
9490	  if (sec == NULL || sec->output_section == NULL)
9491	    {
9492	      unresolved_reloc = TRUE;
9493	      break;
9494	    }
9495	  addend -= sec->output_section->vma;
9496	  break;
9497
9498	  /* Negative relocations.  */
9499	case R_PPC_EMB_NADDR32:
9500	case R_PPC_EMB_NADDR16:
9501	case R_PPC_EMB_NADDR16_LO:
9502	case R_PPC_EMB_NADDR16_HI:
9503	case R_PPC_EMB_NADDR16_HA:
9504	  addend -= 2 * relocation;
9505	  break;
9506
9507	case R_PPC_COPY:
9508	case R_PPC_GLOB_DAT:
9509	case R_PPC_JMP_SLOT:
9510	case R_PPC_RELATIVE:
9511	case R_PPC_IRELATIVE:
9512	case R_PPC_PLT32:
9513	case R_PPC_PLTREL32:
9514	case R_PPC_PLT16_LO:
9515	case R_PPC_PLT16_HI:
9516	case R_PPC_PLT16_HA:
9517	case R_PPC_ADDR30:
9518	case R_PPC_EMB_RELSEC16:
9519	case R_PPC_EMB_RELST_LO:
9520	case R_PPC_EMB_RELST_HI:
9521	case R_PPC_EMB_RELST_HA:
9522	case R_PPC_EMB_BIT_FLD:
9523	  info->callbacks->einfo
9524	    /* xgettext:c-format */
9525	    (_("%P: %B: relocation %s is not yet supported for symbol %s\n"),
9526	     input_bfd,
9527	     howto->name,
9528	     sym_name);
9529
9530	  bfd_set_error (bfd_error_invalid_operation);
9531	  ret = FALSE;
9532	  goto copy_reloc;
9533	}
9534
9535      /* Do any further special processing.  */
9536      switch (r_type)
9537	{
9538	default:
9539	  break;
9540
9541	case R_PPC_ADDR16_HA:
9542	case R_PPC_REL16_HA:
9543	case R_PPC_REL16DX_HA:
9544	case R_PPC_SECTOFF_HA:
9545	case R_PPC_TPREL16_HA:
9546	case R_PPC_DTPREL16_HA:
9547	case R_PPC_EMB_NADDR16_HA:
9548	case R_PPC_EMB_RELST_HA:
9549	  /* It's just possible that this symbol is a weak symbol
9550	     that's not actually defined anywhere.  In that case,
9551	     'sec' would be NULL, and we should leave the symbol
9552	     alone (it will be set to zero elsewhere in the link).  */
9553	  if (sec == NULL)
9554	    break;
9555	  /* Fall through.  */
9556
9557	case R_PPC_PLT16_HA:
9558	case R_PPC_GOT16_HA:
9559	case R_PPC_GOT_TLSGD16_HA:
9560	case R_PPC_GOT_TLSLD16_HA:
9561	case R_PPC_GOT_TPREL16_HA:
9562	case R_PPC_GOT_DTPREL16_HA:
9563	  /* Add 0x10000 if sign bit in 0:15 is set.
9564	     Bits 0:15 are not used.  */
9565	  addend += 0x8000;
9566	  break;
9567
9568	case R_PPC_ADDR16:
9569	case R_PPC_ADDR16_LO:
9570	case R_PPC_GOT16:
9571	case R_PPC_GOT16_LO:
9572	case R_PPC_SDAREL16:
9573	case R_PPC_SECTOFF:
9574	case R_PPC_SECTOFF_LO:
9575	case R_PPC_DTPREL16:
9576	case R_PPC_DTPREL16_LO:
9577	case R_PPC_TPREL16:
9578	case R_PPC_TPREL16_LO:
9579	case R_PPC_GOT_TLSGD16:
9580	case R_PPC_GOT_TLSGD16_LO:
9581	case R_PPC_GOT_TLSLD16:
9582	case R_PPC_GOT_TLSLD16_LO:
9583	case R_PPC_GOT_DTPREL16:
9584	case R_PPC_GOT_DTPREL16_LO:
9585	case R_PPC_GOT_TPREL16:
9586	case R_PPC_GOT_TPREL16_LO:
9587	  {
9588	    /* The 32-bit ABI lacks proper relocations to deal with
9589	       certain 64-bit instructions.  Prevent damage to bits
9590	       that make up part of the insn opcode.  */
9591	    unsigned int insn, mask, lobit;
9592
9593	    insn = bfd_get_32 (input_bfd,
9594			       contents + rel->r_offset - d_offset);
9595	    mask = 0;
9596	    if (is_insn_ds_form (insn))
9597	      mask = 3;
9598	    else if (is_insn_dq_form (insn))
9599	      mask = 15;
9600	    else
9601	      break;
9602	    relocation += addend;
9603	    addend = insn & mask;
9604	    lobit = mask & relocation;
9605	    if (lobit != 0)
9606	      {
9607		relocation ^= lobit;
9608		info->callbacks->einfo
9609		  /* xgettext:c-format */
9610		  (_("%P: %H: error: %s against `%s' not a multiple of %u\n"),
9611		   input_bfd, input_section, rel->r_offset,
9612		   howto->name, sym_name, mask + 1);
9613		bfd_set_error (bfd_error_bad_value);
9614		ret = FALSE;
9615	      }
9616	  }
9617	  break;
9618	}
9619
9620#ifdef DEBUG
9621      fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
9622	       "offset = %ld, addend = %ld\n",
9623	       howto->name,
9624	       (int) r_type,
9625	       sym_name,
9626	       r_symndx,
9627	       (long) rel->r_offset,
9628	       (long) addend);
9629#endif
9630
9631      if (unresolved_reloc
9632	  && !((input_section->flags & SEC_DEBUGGING) != 0
9633	       && h->def_dynamic)
9634	  && _bfd_elf_section_offset (output_bfd, info, input_section,
9635				      rel->r_offset) != (bfd_vma) -1)
9636	{
9637	  info->callbacks->einfo
9638	    /* xgettext:c-format */
9639	    (_("%P: %H: unresolvable %s relocation against symbol `%s'\n"),
9640	     input_bfd, input_section, rel->r_offset,
9641	     howto->name,
9642	     sym_name);
9643	  ret = FALSE;
9644	}
9645
9646      /* 16-bit fields in insns mostly have signed values, but a
9647	 few insns have 16-bit unsigned values.  Really, we should
9648	 have different reloc types.  */
9649      if (howto->complain_on_overflow != complain_overflow_dont
9650	  && howto->dst_mask == 0xffff
9651	  && (input_section->flags & SEC_CODE) != 0)
9652	{
9653	  enum complain_overflow complain = complain_overflow_signed;
9654
9655	  if ((elf_section_flags (input_section) & SHF_PPC_VLE) == 0)
9656	    {
9657	      unsigned int insn;
9658
9659	      insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
9660	      if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
9661		complain = complain_overflow_bitfield;
9662	      else if ((insn & (0x3f << 26)) == 28u << 26 /* andi */
9663		       || (insn & (0x3f << 26)) == 24u << 26 /* ori */
9664		       || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
9665		complain = complain_overflow_unsigned;
9666	    }
9667	  if (howto->complain_on_overflow != complain)
9668	    {
9669	      alt_howto = *howto;
9670	      alt_howto.complain_on_overflow = complain;
9671	      howto = &alt_howto;
9672	    }
9673	}
9674
9675      if (r_type == R_PPC_REL16DX_HA)
9676	{
9677	  /* Split field reloc isn't handled by _bfd_final_link_relocate.  */
9678	  if (rel->r_offset + 4 > input_section->size)
9679	    r = bfd_reloc_outofrange;
9680	  else
9681	    {
9682	      unsigned int insn;
9683
9684	      relocation += addend;
9685	      relocation -= (rel->r_offset
9686			     + input_section->output_offset
9687			     + input_section->output_section->vma);
9688	      relocation >>= 16;
9689	      insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
9690	      insn &= ~0x1fffc1;
9691	      insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
9692	      bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
9693	      r = bfd_reloc_ok;
9694	    }
9695	}
9696      else
9697	r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
9698				      rel->r_offset, relocation, addend);
9699
9700      if (r != bfd_reloc_ok)
9701	{
9702	  if (r == bfd_reloc_overflow)
9703	    {
9704	    overflow:
9705	      /* On code like "if (foo) foo();" don't report overflow
9706		 on a branch to zero when foo is undefined.  */
9707	      if (!warned
9708		  && !(h != NULL
9709		       && (h->root.type == bfd_link_hash_undefweak
9710			   || h->root.type == bfd_link_hash_undefined)
9711		       && is_branch_reloc (r_type)))
9712		info->callbacks->reloc_overflow
9713		  (info, (h ? &h->root : NULL), sym_name, howto->name,
9714		   rel->r_addend, input_bfd, input_section, rel->r_offset);
9715	    }
9716	  else
9717	    {
9718	      info->callbacks->einfo
9719		/* xgettext:c-format */
9720		(_("%P: %H: %s reloc against `%s': error %d\n"),
9721		 input_bfd, input_section, rel->r_offset,
9722		 howto->name, sym_name, (int) r);
9723	      ret = FALSE;
9724	    }
9725	}
9726    copy_reloc:
9727      if (wrel != rel)
9728	*wrel = *rel;
9729    }
9730
9731  if (wrel != rel)
9732    {
9733      Elf_Internal_Shdr *rel_hdr;
9734      size_t deleted = rel - wrel;
9735
9736      rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
9737      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
9738      if (rel_hdr->sh_size == 0)
9739	{
9740	  /* It is too late to remove an empty reloc section.  Leave
9741	     one NONE reloc.
9742	     ??? What is wrong with an empty section???  */
9743	  rel_hdr->sh_size = rel_hdr->sh_entsize;
9744	  deleted -= 1;
9745	  wrel++;
9746	}
9747      relend = wrel;
9748      rel_hdr = _bfd_elf_single_rel_hdr (input_section);
9749      rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
9750      input_section->reloc_count -= deleted;
9751    }
9752
9753#ifdef DEBUG
9754  fprintf (stderr, "\n");
9755#endif
9756
9757  if (input_section->sec_info_type == SEC_INFO_TYPE_TARGET
9758      && input_section->size != input_section->rawsize
9759      && (strcmp (input_section->output_section->name, ".init") == 0
9760	  || strcmp (input_section->output_section->name, ".fini") == 0))
9761    {
9762      /* Branch around the trampolines.  */
9763      unsigned int insn = B + input_section->size - input_section->rawsize;
9764      bfd_put_32 (input_bfd, insn, contents + input_section->rawsize);
9765    }
9766
9767  if (htab->params->ppc476_workaround
9768      && input_section->sec_info_type == SEC_INFO_TYPE_TARGET
9769      && (!bfd_link_relocatable (info)
9770	  || (input_section->output_section->alignment_power
9771	      >= htab->params->pagesize_p2)))
9772    {
9773      bfd_vma start_addr, end_addr, addr;
9774      bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
9775
9776      if (relax_info->workaround_size != 0)
9777	{
9778	  bfd_byte *p;
9779	  unsigned int n;
9780	  bfd_byte fill[4];
9781
9782	  bfd_put_32 (input_bfd, BA, fill);
9783	  p = contents + input_section->size - relax_info->workaround_size;
9784	  n = relax_info->workaround_size >> 2;
9785	  while (n--)
9786	    {
9787	      memcpy (p, fill, 4);
9788	      p += 4;
9789	    }
9790	}
9791
9792      /* The idea is: Replace the last instruction on a page with a
9793	 branch to a patch area.  Put the insn there followed by a
9794	 branch back to the next page.  Complicated a little by
9795	 needing to handle moved conditional branches, and by not
9796	 wanting to touch data-in-text.  */
9797
9798      start_addr = (input_section->output_section->vma
9799		    + input_section->output_offset);
9800      end_addr = (start_addr + input_section->size
9801		  - relax_info->workaround_size);
9802      for (addr = ((start_addr & -pagesize) + pagesize - 4);
9803	   addr < end_addr;
9804	   addr += pagesize)
9805	{
9806	  bfd_vma offset = addr - start_addr;
9807	  Elf_Internal_Rela *lo, *hi;
9808	  bfd_boolean is_data;
9809	  bfd_vma patch_off, patch_addr;
9810	  unsigned int insn;
9811
9812	  /* Do we have a data reloc at this offset?  If so, leave
9813	     the word alone.  */
9814	  is_data = FALSE;
9815	  lo = relocs;
9816	  hi = relend;
9817	  rel = NULL;
9818	  while (lo < hi)
9819	    {
9820	      rel = lo + (hi - lo) / 2;
9821	      if (rel->r_offset < offset)
9822		lo = rel + 1;
9823	      else if (rel->r_offset > offset + 3)
9824		hi = rel;
9825	      else
9826		{
9827		  switch (ELF32_R_TYPE (rel->r_info))
9828		    {
9829		    case R_PPC_ADDR32:
9830		    case R_PPC_UADDR32:
9831		    case R_PPC_REL32:
9832		    case R_PPC_ADDR30:
9833		      is_data = TRUE;
9834		      break;
9835		    default:
9836		      break;
9837		    }
9838		  break;
9839		}
9840	    }
9841	  if (is_data)
9842	    continue;
9843
9844	  /* Some instructions can be left alone too.  Unconditional
9845	     branches, except for bcctr with BO=0x14 (bctr, bctrl),
9846	     avoid the icache failure.
9847
9848	     The problem occurs due to prefetch across a page boundary
9849	     where stale instructions can be fetched from the next
9850	     page, and the mechanism for flushing these bad
9851	     instructions fails under certain circumstances.  The
9852	     unconditional branches:
9853	     1) Branch: b, bl, ba, bla,
9854	     2) Branch Conditional: bc, bca, bcl, bcla,
9855	     3) Branch Conditional to Link Register: bclr, bclrl,
9856	     where (2) and (3) have BO=0x14 making them unconditional,
9857	     prevent the bad prefetch because the prefetch itself is
9858	     affected by these instructions.  This happens even if the
9859	     instruction is not executed.
9860
9861	     A bctr example:
9862	     .
9863	     .	lis 9,new_page@ha
9864	     .	addi 9,9,new_page@l
9865	     .	mtctr 9
9866	     .	bctr
9867	     .	nop
9868	     .	nop
9869	     . new_page:
9870	     .
9871	     The bctr is not predicted taken due to ctr not being
9872	     ready, so prefetch continues on past the bctr into the
9873	     new page which might have stale instructions.  If they
9874	     fail to be flushed, then they will be executed after the
9875	     bctr executes.  Either of the following modifications
9876	     prevent the bad prefetch from happening in the first
9877	     place:
9878	     .
9879	     .	lis 9,new_page@ha	 lis 9,new_page@ha
9880	     .	addi 9,9,new_page@l	 addi 9,9,new_page@l
9881	     .	mtctr 9			 mtctr 9
9882	     .	bctr			 bctr
9883	     .	nop			 b somewhere_else
9884	     .	b somewhere_else	 nop
9885	     . new_page:		new_page:
9886	     .  */
9887	  insn = bfd_get_32 (input_bfd, contents + offset);
9888	  if ((insn & (0x3f << 26)) == (18u << 26)          /* b,bl,ba,bla */
9889	      || ((insn & (0x3f << 26)) == (16u << 26)      /* bc,bcl,bca,bcla*/
9890		  && (insn & (0x14 << 21)) == (0x14 << 21)) /*   with BO=0x14 */
9891	      || ((insn & (0x3f << 26)) == (19u << 26)
9892		  && (insn & (0x3ff << 1)) == (16u << 1)    /* bclr,bclrl */
9893		  && (insn & (0x14 << 21)) == (0x14 << 21)))/*   with BO=0x14 */
9894	    continue;
9895
9896	  patch_addr = (start_addr + input_section->size
9897			- relax_info->workaround_size);
9898	  patch_addr = (patch_addr + 15) & -16;
9899	  patch_off = patch_addr - start_addr;
9900	  bfd_put_32 (input_bfd, B + patch_off - offset, contents + offset);
9901
9902	  if (rel != NULL
9903	      && rel->r_offset >= offset
9904	      && rel->r_offset < offset + 4)
9905	    {
9906	      asection *sreloc;
9907
9908	      /* If the insn we are patching had a reloc, adjust the
9909		 reloc r_offset so that the reloc applies to the moved
9910		 location.  This matters for -r and --emit-relocs.  */
9911	      if (rel + 1 != relend)
9912		{
9913		  Elf_Internal_Rela tmp = *rel;
9914
9915		  /* Keep the relocs sorted by r_offset.  */
9916		  memmove (rel, rel + 1, (relend - (rel + 1)) * sizeof (*rel));
9917		  relend[-1] = tmp;
9918		}
9919	      relend[-1].r_offset += patch_off - offset;
9920
9921	      /* Adjust REL16 addends too.  */
9922	      switch (ELF32_R_TYPE (relend[-1].r_info))
9923		{
9924		case R_PPC_REL16:
9925		case R_PPC_REL16_LO:
9926		case R_PPC_REL16_HI:
9927		case R_PPC_REL16_HA:
9928		  relend[-1].r_addend += patch_off - offset;
9929		  break;
9930		default:
9931		  break;
9932		}
9933
9934	      /* If we are building a PIE or shared library with
9935		 non-PIC objects, perhaps we had a dynamic reloc too?
9936		 If so, the dynamic reloc must move with the insn.  */
9937	      sreloc = elf_section_data (input_section)->sreloc;
9938	      if (sreloc != NULL)
9939		{
9940		  Elf32_External_Rela *slo, *shi, *srelend;
9941		  bfd_vma soffset;
9942
9943		  slo = (Elf32_External_Rela *) sreloc->contents;
9944		  shi = srelend = slo + sreloc->reloc_count;
9945		  soffset = (offset + input_section->output_section->vma
9946			     + input_section->output_offset);
9947		  while (slo < shi)
9948		    {
9949		      Elf32_External_Rela *srel = slo + (shi - slo) / 2;
9950		      bfd_elf32_swap_reloca_in (output_bfd, (bfd_byte *) srel,
9951						&outrel);
9952		      if (outrel.r_offset < soffset)
9953			slo = srel + 1;
9954		      else if (outrel.r_offset > soffset + 3)
9955			shi = srel;
9956		      else
9957			{
9958			  if (srel + 1 != srelend)
9959			    {
9960			      memmove (srel, srel + 1,
9961				       (srelend - (srel + 1)) * sizeof (*srel));
9962			      srel = srelend - 1;
9963			    }
9964			  outrel.r_offset += patch_off - offset;
9965			  bfd_elf32_swap_reloca_out (output_bfd, &outrel,
9966						     (bfd_byte *) srel);
9967			  break;
9968			}
9969		    }
9970		}
9971	    }
9972	  else
9973	    rel = NULL;
9974
9975	  if ((insn & (0x3f << 26)) == (16u << 26) /* bc */
9976	      && (insn & 2) == 0 /* relative */)
9977	    {
9978	      bfd_vma delta = ((insn & 0xfffc) ^ 0x8000) - 0x8000;
9979
9980	      delta += offset - patch_off;
9981	      if (bfd_link_relocatable (info) && rel != NULL)
9982		delta = 0;
9983	      if (!bfd_link_relocatable (info) && rel != NULL)
9984		{
9985		  enum elf_ppc_reloc_type r_type;
9986
9987		  r_type = ELF32_R_TYPE (relend[-1].r_info);
9988		  if (r_type == R_PPC_REL14_BRTAKEN)
9989		    insn |= BRANCH_PREDICT_BIT;
9990		  else if (r_type == R_PPC_REL14_BRNTAKEN)
9991		    insn &= ~BRANCH_PREDICT_BIT;
9992		  else
9993		    BFD_ASSERT (r_type == R_PPC_REL14);
9994
9995		  if ((r_type == R_PPC_REL14_BRTAKEN
9996		       || r_type == R_PPC_REL14_BRNTAKEN)
9997		      && delta + 0x8000 < 0x10000
9998		      && (bfd_signed_vma) delta < 0)
9999		    insn ^= BRANCH_PREDICT_BIT;
10000		}
10001	      if (delta + 0x8000 < 0x10000)
10002		{
10003		  bfd_put_32 (input_bfd,
10004			      (insn & ~0xfffc) | (delta & 0xfffc),
10005			      contents + patch_off);
10006		  patch_off += 4;
10007		  bfd_put_32 (input_bfd,
10008			      B | ((offset + 4 - patch_off) & 0x3fffffc),
10009			      contents + patch_off);
10010		  patch_off += 4;
10011		}
10012	      else
10013		{
10014		  if (rel != NULL)
10015		    {
10016		      unsigned int r_sym = ELF32_R_SYM (relend[-1].r_info);
10017
10018		      relend[-1].r_offset += 8;
10019		      relend[-1].r_info = ELF32_R_INFO (r_sym, R_PPC_REL24);
10020		    }
10021		  bfd_put_32 (input_bfd,
10022			      (insn & ~0xfffc) | 8,
10023			      contents + patch_off);
10024		  patch_off += 4;
10025		  bfd_put_32 (input_bfd,
10026			      B | ((offset + 4 - patch_off) & 0x3fffffc),
10027			      contents + patch_off);
10028		  patch_off += 4;
10029		  bfd_put_32 (input_bfd,
10030			      B | ((delta - 8) & 0x3fffffc),
10031			      contents + patch_off);
10032		  patch_off += 4;
10033		}
10034	    }
10035	  else
10036	    {
10037	      bfd_put_32 (input_bfd, insn, contents + patch_off);
10038	      patch_off += 4;
10039	      bfd_put_32 (input_bfd,
10040			  B | ((offset + 4 - patch_off) & 0x3fffffc),
10041			  contents + patch_off);
10042	      patch_off += 4;
10043	    }
10044	  BFD_ASSERT (patch_off <= input_section->size);
10045	  relax_info->workaround_size = input_section->size - patch_off;
10046	}
10047    }
10048
10049  return ret;
10050}
10051
10052/* Finish up dynamic symbol handling.  We set the contents of various
10053   dynamic sections here.  */
10054
10055static bfd_boolean
10056ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
10057			       struct bfd_link_info *info,
10058			       struct elf_link_hash_entry *h,
10059			       Elf_Internal_Sym *sym)
10060{
10061  struct ppc_elf_link_hash_table *htab;
10062  struct plt_entry *ent;
10063  bfd_boolean doneone;
10064
10065#ifdef DEBUG
10066  fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
10067	   h->root.root.string);
10068#endif
10069
10070  htab = ppc_elf_hash_table (info);
10071  BFD_ASSERT (htab->elf.dynobj != NULL);
10072
10073  doneone = FALSE;
10074  for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10075    if (ent->plt.offset != (bfd_vma) -1)
10076      {
10077	if (!doneone)
10078	  {
10079	    Elf_Internal_Rela rela;
10080	    bfd_byte *loc;
10081	    bfd_vma reloc_index;
10082
10083	    if (htab->plt_type == PLT_NEW
10084		|| !htab->elf.dynamic_sections_created
10085		|| h->dynindx == -1)
10086	      reloc_index = ent->plt.offset / 4;
10087	    else
10088	      {
10089		reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
10090			       / htab->plt_slot_size);
10091		if (reloc_index > PLT_NUM_SINGLE_ENTRIES
10092		    && htab->plt_type == PLT_OLD)
10093		  reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
10094	      }
10095
10096	    /* This symbol has an entry in the procedure linkage table.
10097	       Set it up.  */
10098	    if (htab->plt_type == PLT_VXWORKS
10099		&& htab->elf.dynamic_sections_created
10100		&& h->dynindx != -1)
10101	      {
10102		bfd_vma got_offset;
10103		const bfd_vma *plt_entry;
10104
10105		/* The first three entries in .got.plt are reserved.  */
10106		got_offset = (reloc_index + 3) * 4;
10107
10108		/* Use the right PLT. */
10109		plt_entry = bfd_link_pic (info) ? ppc_elf_vxworks_pic_plt_entry
10110			    : ppc_elf_vxworks_plt_entry;
10111
10112		/* Fill in the .plt on VxWorks.  */
10113		if (bfd_link_pic (info))
10114		  {
10115		    bfd_put_32 (output_bfd,
10116				plt_entry[0] | PPC_HA (got_offset),
10117				htab->elf.splt->contents + ent->plt.offset + 0);
10118		    bfd_put_32 (output_bfd,
10119				plt_entry[1] | PPC_LO (got_offset),
10120				htab->elf.splt->contents + ent->plt.offset + 4);
10121		  }
10122		else
10123		  {
10124		    bfd_vma got_loc = got_offset + SYM_VAL (htab->elf.hgot);
10125
10126		    bfd_put_32 (output_bfd,
10127				plt_entry[0] | PPC_HA (got_loc),
10128				htab->elf.splt->contents + ent->plt.offset + 0);
10129		    bfd_put_32 (output_bfd,
10130				plt_entry[1] | PPC_LO (got_loc),
10131				htab->elf.splt->contents + ent->plt.offset + 4);
10132		  }
10133
10134		bfd_put_32 (output_bfd, plt_entry[2],
10135			    htab->elf.splt->contents + ent->plt.offset + 8);
10136		bfd_put_32 (output_bfd, plt_entry[3],
10137			    htab->elf.splt->contents + ent->plt.offset + 12);
10138
10139		/* This instruction is an immediate load.  The value loaded is
10140		   the byte offset of the R_PPC_JMP_SLOT relocation from the
10141		   start of the .rela.plt section.  The value is stored in the
10142		   low-order 16 bits of the load instruction.  */
10143		/* NOTE: It appears that this is now an index rather than a
10144		   prescaled offset.  */
10145		bfd_put_32 (output_bfd,
10146			    plt_entry[4] | reloc_index,
10147			    htab->elf.splt->contents + ent->plt.offset + 16);
10148		/* This instruction is a PC-relative branch whose target is
10149		   the start of the PLT section.  The address of this branch
10150		   instruction is 20 bytes beyond the start of this PLT entry.
10151		   The address is encoded in bits 6-29, inclusive.  The value
10152		   stored is right-shifted by two bits, permitting a 26-bit
10153		   offset.  */
10154		bfd_put_32 (output_bfd,
10155			    (plt_entry[5]
10156			     | (-(ent->plt.offset + 20) & 0x03fffffc)),
10157			    htab->elf.splt->contents + ent->plt.offset + 20);
10158		bfd_put_32 (output_bfd, plt_entry[6],
10159			    htab->elf.splt->contents + ent->plt.offset + 24);
10160		bfd_put_32 (output_bfd, plt_entry[7],
10161			    htab->elf.splt->contents + ent->plt.offset + 28);
10162
10163		/* Fill in the GOT entry corresponding to this PLT slot with
10164		   the address immediately after the "bctr" instruction
10165		   in this PLT entry.  */
10166		bfd_put_32 (output_bfd, (htab->elf.splt->output_section->vma
10167					 + htab->elf.splt->output_offset
10168					 + ent->plt.offset + 16),
10169			    htab->elf.sgotplt->contents + got_offset);
10170
10171		if (!bfd_link_pic (info))
10172		  {
10173		    /* Fill in a couple of entries in .rela.plt.unloaded.  */
10174		    loc = htab->srelplt2->contents
10175		      + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
10176			  * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
10177			 * sizeof (Elf32_External_Rela));
10178
10179		    /* Provide the @ha relocation for the first instruction.  */
10180		    rela.r_offset = (htab->elf.splt->output_section->vma
10181				     + htab->elf.splt->output_offset
10182				     + ent->plt.offset + 2);
10183		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
10184						R_PPC_ADDR16_HA);
10185		    rela.r_addend = got_offset;
10186		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10187		    loc += sizeof (Elf32_External_Rela);
10188
10189		    /* Provide the @l relocation for the second instruction.  */
10190		    rela.r_offset = (htab->elf.splt->output_section->vma
10191				     + htab->elf.splt->output_offset
10192				     + ent->plt.offset + 6);
10193		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
10194						R_PPC_ADDR16_LO);
10195		    rela.r_addend = got_offset;
10196		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10197		    loc += sizeof (Elf32_External_Rela);
10198
10199		    /* Provide a relocation for the GOT entry corresponding to this
10200		       PLT slot.  Point it at the middle of the .plt entry.  */
10201		    rela.r_offset = (htab->elf.sgotplt->output_section->vma
10202				     + htab->elf.sgotplt->output_offset
10203				     + got_offset);
10204		    rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
10205						R_PPC_ADDR32);
10206		    rela.r_addend = ent->plt.offset + 16;
10207		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10208		  }
10209
10210		/* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
10211		   In particular, the offset for the relocation is not the
10212		   address of the PLT entry for this function, as specified
10213		   by the ABI.  Instead, the offset is set to the address of
10214		   the GOT slot for this function.  See EABI 4.4.4.1.  */
10215		rela.r_offset = (htab->elf.sgotplt->output_section->vma
10216				 + htab->elf.sgotplt->output_offset
10217				 + got_offset);
10218
10219	      }
10220	    else
10221	      {
10222		asection *splt = htab->elf.splt;
10223		if (!htab->elf.dynamic_sections_created
10224		    || h->dynindx == -1)
10225		  splt = htab->elf.iplt;
10226
10227		rela.r_offset = (splt->output_section->vma
10228				 + splt->output_offset
10229				 + ent->plt.offset);
10230		if (htab->plt_type == PLT_OLD
10231		    || !htab->elf.dynamic_sections_created
10232		    || h->dynindx == -1)
10233		  {
10234		    /* We don't need to fill in the .plt.  The ppc dynamic
10235		       linker will fill it in.  */
10236		  }
10237		else
10238		  {
10239		    bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
10240				   + htab->glink->output_section->vma
10241				   + htab->glink->output_offset);
10242		    bfd_put_32 (output_bfd, val,
10243				splt->contents + ent->plt.offset);
10244		  }
10245	      }
10246
10247	    /* Fill in the entry in the .rela.plt section.  */
10248	    rela.r_addend = 0;
10249	    if (!htab->elf.dynamic_sections_created
10250		|| h->dynindx == -1)
10251	      {
10252		BFD_ASSERT (h->type == STT_GNU_IFUNC
10253			    && h->def_regular
10254			    && (h->root.type == bfd_link_hash_defined
10255				|| h->root.type == bfd_link_hash_defweak));
10256		rela.r_info = ELF32_R_INFO (0, R_PPC_IRELATIVE);
10257		rela.r_addend = SYM_VAL (h);
10258	      }
10259	    else
10260	      rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
10261
10262	    if (!htab->elf.dynamic_sections_created
10263		|| h->dynindx == -1)
10264	      loc = (htab->elf.irelplt->contents
10265		     + (htab->elf.irelplt->reloc_count++
10266			* sizeof (Elf32_External_Rela)));
10267	    else
10268	      loc = (htab->elf.srelplt->contents
10269		     + reloc_index * sizeof (Elf32_External_Rela));
10270	    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10271
10272	    if (!h->def_regular)
10273	      {
10274		/* Mark the symbol as undefined, rather than as
10275		   defined in the .plt section.  Leave the value if
10276		   there were any relocations where pointer equality
10277		   matters (this is a clue for the dynamic linker, to
10278		   make function pointer comparisons work between an
10279		   application and shared library), otherwise set it
10280		   to zero.  */
10281		sym->st_shndx = SHN_UNDEF;
10282		if (!h->pointer_equality_needed)
10283		  sym->st_value = 0;
10284		else if (!h->ref_regular_nonweak)
10285		  {
10286		    /* This breaks function pointer comparisons, but
10287		       that is better than breaking tests for a NULL
10288		       function pointer.  */
10289		    sym->st_value = 0;
10290		  }
10291	      }
10292	    else if (h->type == STT_GNU_IFUNC
10293		     && !bfd_link_pic (info))
10294	      {
10295		/* Set the value of ifunc symbols in a non-pie
10296		   executable to the glink entry.  This is to avoid
10297		   text relocations.  We can't do this for ifunc in
10298		   allocate_dynrelocs, as we do for normal dynamic
10299		   function symbols with plt entries, because we need
10300		   to keep the original value around for the ifunc
10301		   relocation.  */
10302		sym->st_shndx = (_bfd_elf_section_from_bfd_section
10303				 (output_bfd, htab->glink->output_section));
10304		sym->st_value = (ent->glink_offset
10305				 + htab->glink->output_offset
10306				 + htab->glink->output_section->vma);
10307	      }
10308	    doneone = TRUE;
10309	  }
10310
10311	if (htab->plt_type == PLT_NEW
10312	    || !htab->elf.dynamic_sections_created
10313	    || h->dynindx == -1)
10314	  {
10315	    unsigned char *p;
10316	    asection *splt = htab->elf.splt;
10317	    if (!htab->elf.dynamic_sections_created
10318		|| h->dynindx == -1)
10319	      splt = htab->elf.iplt;
10320
10321	    p = (unsigned char *) htab->glink->contents + ent->glink_offset;
10322
10323	    if (h == htab->tls_get_addr && !htab->params->no_tls_get_addr_opt)
10324	      {
10325		bfd_put_32 (output_bfd, LWZ_11_3, p);
10326		p += 4;
10327		bfd_put_32 (output_bfd, LWZ_12_3 + 4, p);
10328		p += 4;
10329		bfd_put_32 (output_bfd, MR_0_3, p);
10330		p += 4;
10331		bfd_put_32 (output_bfd, CMPWI_11_0, p);
10332		p += 4;
10333		bfd_put_32 (output_bfd, ADD_3_12_2, p);
10334		p += 4;
10335		bfd_put_32 (output_bfd, BEQLR, p);
10336		p += 4;
10337		bfd_put_32 (output_bfd, MR_3_0, p);
10338		p += 4;
10339		bfd_put_32 (output_bfd, NOP, p);
10340		p += 4;
10341	      }
10342
10343	    write_glink_stub (ent, splt, p, info);
10344
10345	    if (!bfd_link_pic (info))
10346	      /* We only need one non-PIC glink stub.  */
10347	      break;
10348	  }
10349	else
10350	  break;
10351      }
10352
10353  if (h->needs_copy)
10354    {
10355      asection *s;
10356      Elf_Internal_Rela rela;
10357      bfd_byte *loc;
10358
10359      /* This symbols needs a copy reloc.  Set it up.  */
10360
10361#ifdef DEBUG
10362      fprintf (stderr, ", copy");
10363#endif
10364
10365      BFD_ASSERT (h->dynindx != -1);
10366
10367      if (ppc_elf_hash_entry (h)->has_sda_refs)
10368	s = htab->relsbss;
10369      else if (h->root.u.def.section == htab->elf.sdynrelro)
10370	s = htab->elf.sreldynrelro;
10371      else
10372	s = htab->elf.srelbss;
10373      BFD_ASSERT (s != NULL);
10374
10375      rela.r_offset = SYM_VAL (h);
10376      rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
10377      rela.r_addend = 0;
10378      loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
10379      bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10380    }
10381
10382#ifdef DEBUG
10383  fprintf (stderr, "\n");
10384#endif
10385
10386  return TRUE;
10387}
10388
10389static enum elf_reloc_type_class
10390ppc_elf_reloc_type_class (const struct bfd_link_info *info,
10391			  const asection *rel_sec,
10392			  const Elf_Internal_Rela *rela)
10393{
10394  struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
10395
10396  if (rel_sec == htab->elf.irelplt)
10397    return reloc_class_ifunc;
10398
10399  switch (ELF32_R_TYPE (rela->r_info))
10400    {
10401    case R_PPC_RELATIVE:
10402      return reloc_class_relative;
10403    case R_PPC_JMP_SLOT:
10404      return reloc_class_plt;
10405    case R_PPC_COPY:
10406      return reloc_class_copy;
10407    default:
10408      return reloc_class_normal;
10409    }
10410}
10411
10412/* Finish up the dynamic sections.  */
10413
10414static bfd_boolean
10415ppc_elf_finish_dynamic_sections (bfd *output_bfd,
10416				 struct bfd_link_info *info)
10417{
10418  asection *sdyn;
10419  struct ppc_elf_link_hash_table *htab;
10420  bfd_vma got;
10421  bfd *dynobj;
10422  bfd_boolean ret = TRUE;
10423
10424#ifdef DEBUG
10425  fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
10426#endif
10427
10428  htab = ppc_elf_hash_table (info);
10429  dynobj = htab->elf.dynobj;
10430  sdyn = bfd_get_linker_section (dynobj, ".dynamic");
10431
10432  got = 0;
10433  if (htab->elf.hgot != NULL)
10434    got = SYM_VAL (htab->elf.hgot);
10435
10436  if (htab->elf.dynamic_sections_created)
10437    {
10438      Elf32_External_Dyn *dyncon, *dynconend;
10439
10440      BFD_ASSERT (htab->elf.splt != NULL && sdyn != NULL);
10441
10442      dyncon = (Elf32_External_Dyn *) sdyn->contents;
10443      dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
10444      for (; dyncon < dynconend; dyncon++)
10445	{
10446	  Elf_Internal_Dyn dyn;
10447	  asection *s;
10448
10449	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
10450
10451	  switch (dyn.d_tag)
10452	    {
10453	    case DT_PLTGOT:
10454	      if (htab->is_vxworks)
10455		s = htab->elf.sgotplt;
10456	      else
10457		s = htab->elf.splt;
10458	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10459	      break;
10460
10461	    case DT_PLTRELSZ:
10462	      dyn.d_un.d_val = htab->elf.srelplt->size;
10463	      break;
10464
10465	    case DT_JMPREL:
10466	      s = htab->elf.srelplt;
10467	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
10468	      break;
10469
10470	    case DT_PPC_GOT:
10471	      dyn.d_un.d_ptr = got;
10472	      break;
10473
10474	    default:
10475	      if (htab->is_vxworks
10476		  && elf_vxworks_finish_dynamic_entry (output_bfd, &dyn))
10477		break;
10478	      continue;
10479	    }
10480
10481	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
10482	}
10483    }
10484
10485  if (htab->elf.sgot != NULL
10486      && htab->elf.sgot->output_section != bfd_abs_section_ptr)
10487    {
10488      if (htab->elf.hgot->root.u.def.section == htab->elf.sgot
10489	  || htab->elf.hgot->root.u.def.section == htab->elf.sgotplt)
10490	{
10491	  unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
10492
10493	  p += htab->elf.hgot->root.u.def.value;
10494	  if (htab->plt_type == PLT_OLD)
10495	    {
10496	      /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
10497		 so that a function can easily find the address of
10498		 _GLOBAL_OFFSET_TABLE_.  */
10499	      BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
10500			  < htab->elf.hgot->root.u.def.section->size);
10501	      bfd_put_32 (output_bfd, 0x4e800021, p - 4);
10502	    }
10503
10504	  if (sdyn != NULL)
10505	    {
10506	      bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
10507	      BFD_ASSERT (htab->elf.hgot->root.u.def.value
10508			  < htab->elf.hgot->root.u.def.section->size);
10509	      bfd_put_32 (output_bfd, val, p);
10510	    }
10511	}
10512      else
10513	{
10514	  /* xgettext:c-format */
10515	  info->callbacks->einfo (_("%P: %s not defined in linker created %s\n"),
10516				  htab->elf.hgot->root.root.string,
10517				  (htab->elf.sgotplt != NULL
10518				   ? htab->elf.sgotplt->name
10519				   : htab->elf.sgot->name));
10520	  bfd_set_error (bfd_error_bad_value);
10521	  ret = FALSE;
10522	}
10523
10524      elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 4;
10525    }
10526
10527  /* Fill in the first entry in the VxWorks procedure linkage table.  */
10528  if (htab->is_vxworks
10529      && htab->elf.splt != NULL
10530      && htab->elf.splt->size != 0
10531      && htab->elf.splt->output_section != bfd_abs_section_ptr)
10532    {
10533      asection *splt = htab->elf.splt;
10534      /* Use the right PLT. */
10535      const bfd_vma *plt_entry = (bfd_link_pic (info)
10536				  ? ppc_elf_vxworks_pic_plt0_entry
10537				  : ppc_elf_vxworks_plt0_entry);
10538
10539      if (!bfd_link_pic (info))
10540	{
10541	  bfd_vma got_value = SYM_VAL (htab->elf.hgot);
10542
10543	  bfd_put_32 (output_bfd, plt_entry[0] | PPC_HA (got_value),
10544		      splt->contents +  0);
10545	  bfd_put_32 (output_bfd, plt_entry[1] | PPC_LO (got_value),
10546		      splt->contents +  4);
10547	}
10548      else
10549	{
10550	  bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
10551	  bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
10552	}
10553      bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
10554      bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
10555      bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
10556      bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
10557      bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
10558      bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
10559
10560      if (! bfd_link_pic (info))
10561	{
10562	  Elf_Internal_Rela rela;
10563	  bfd_byte *loc;
10564
10565	  loc = htab->srelplt2->contents;
10566
10567	  /* Output the @ha relocation for the first instruction.  */
10568	  rela.r_offset = (htab->elf.splt->output_section->vma
10569			   + htab->elf.splt->output_offset
10570			   + 2);
10571	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
10572	  rela.r_addend = 0;
10573	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10574	  loc += sizeof (Elf32_External_Rela);
10575
10576	  /* Output the @l relocation for the second instruction.  */
10577	  rela.r_offset = (htab->elf.splt->output_section->vma
10578			   + htab->elf.splt->output_offset
10579			   + 6);
10580	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
10581	  rela.r_addend = 0;
10582	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
10583	  loc += sizeof (Elf32_External_Rela);
10584
10585	  /* Fix up the remaining relocations.  They may have the wrong
10586	     symbol index for _G_O_T_ or _P_L_T_ depending on the order
10587	     in which symbols were output.  */
10588	  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
10589	    {
10590	      Elf_Internal_Rela rel;
10591
10592	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10593	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
10594	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10595	      loc += sizeof (Elf32_External_Rela);
10596
10597	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10598	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
10599	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10600	      loc += sizeof (Elf32_External_Rela);
10601
10602	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
10603	      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
10604	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
10605	      loc += sizeof (Elf32_External_Rela);
10606	    }
10607	}
10608    }
10609
10610  if (htab->glink != NULL
10611      && htab->glink->contents != NULL
10612      && htab->elf.dynamic_sections_created)
10613    {
10614      unsigned char *p;
10615      unsigned char *endp;
10616      bfd_vma res0;
10617      unsigned int i;
10618
10619      /*
10620       * PIC glink code is the following:
10621       *
10622       * # ith PLT code stub.
10623       *   addis 11,30,(plt+(i-1)*4-got)@ha
10624       *   lwz 11,(plt+(i-1)*4-got)@l(11)
10625       *   mtctr 11
10626       *   bctr
10627       *
10628       * # A table of branches, one for each plt entry.
10629       * # The idea is that the plt call stub loads ctr and r11 with these
10630       * # addresses, so (r11 - res_0) gives the plt index * 4.
10631       * res_0:	b PLTresolve
10632       * res_1:	b PLTresolve
10633       * .
10634       * # Some number of entries towards the end can be nops
10635       * res_n_m3: nop
10636       * res_n_m2: nop
10637       * res_n_m1:
10638       *
10639       * PLTresolve:
10640       *    addis 11,11,(1f-res_0)@ha
10641       *    mflr 0
10642       *    bcl 20,31,1f
10643       * 1: addi 11,11,(1b-res_0)@l
10644       *    mflr 12
10645       *    mtlr 0
10646       *    sub 11,11,12                # r11 = index * 4
10647       *    addis 12,12,(got+4-1b)@ha
10648       *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
10649       *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
10650       *    mtctr 0
10651       *    add 0,11,11
10652       *    add 11,0,11                 # r11 = index * 12 = reloc offset.
10653       *    bctr
10654       */
10655      static const unsigned int pic_plt_resolve[] =
10656	{
10657	  ADDIS_11_11,
10658	  MFLR_0,
10659	  BCL_20_31,
10660	  ADDI_11_11,
10661	  MFLR_12,
10662	  MTLR_0,
10663	  SUB_11_11_12,
10664	  ADDIS_12_12,
10665	  LWZ_0_12,
10666	  LWZ_12_12,
10667	  MTCTR_0,
10668	  ADD_0_11_11,
10669	  ADD_11_0_11,
10670	  BCTR,
10671	  NOP,
10672	  NOP
10673	};
10674
10675      /*
10676       * Non-PIC glink code is a little simpler.
10677       *
10678       * # ith PLT code stub.
10679       *   lis 11,(plt+(i-1)*4)@ha
10680       *   lwz 11,(plt+(i-1)*4)@l(11)
10681       *   mtctr 11
10682       *   bctr
10683       *
10684       * The branch table is the same, then comes
10685       *
10686       * PLTresolve:
10687       *    lis 12,(got+4)@ha
10688       *    addis 11,11,(-res_0)@ha
10689       *    lwz 0,(got+4)@l(12)         # got[1] address of dl_runtime_resolve
10690       *    addi 11,11,(-res_0)@l       # r11 = index * 4
10691       *    mtctr 0
10692       *    add 0,11,11
10693       *    lwz 12,(got+8)@l(12)        # got[2] contains the map address
10694       *    add 11,0,11                 # r11 = index * 12 = reloc offset.
10695       *    bctr
10696       */
10697      static const unsigned int plt_resolve[] =
10698	{
10699	  LIS_12,
10700	  ADDIS_11_11,
10701	  LWZ_0_12,
10702	  ADDI_11_11,
10703	  MTCTR_0,
10704	  ADD_0_11_11,
10705	  LWZ_12_12,
10706	  ADD_11_0_11,
10707	  BCTR,
10708	  NOP,
10709	  NOP,
10710	  NOP,
10711	  NOP,
10712	  NOP,
10713	  NOP,
10714	  NOP
10715	};
10716
10717      if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
10718	abort ();
10719      if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
10720	abort ();
10721
10722      /* Build the branch table, one for each plt entry (less one),
10723	 and perhaps some padding.  */
10724      p = htab->glink->contents;
10725      p += htab->glink_pltresolve;
10726      endp = htab->glink->contents;
10727      endp += htab->glink->size - GLINK_PLTRESOLVE;
10728      while (p < endp - (htab->params->ppc476_workaround ? 0 : 8 * 4))
10729	{
10730	  bfd_put_32 (output_bfd, B + endp - p, p);
10731	  p += 4;
10732	}
10733      while (p < endp)
10734	{
10735	  bfd_put_32 (output_bfd, NOP, p);
10736	  p += 4;
10737	}
10738
10739      res0 = (htab->glink_pltresolve
10740	      + htab->glink->output_section->vma
10741	      + htab->glink->output_offset);
10742
10743      if (htab->params->ppc476_workaround)
10744	{
10745	  /* Ensure that a call stub at the end of a page doesn't
10746	     result in prefetch over the end of the page into the
10747	     glink branch table.  */
10748	  bfd_vma pagesize = (bfd_vma) 1 << htab->params->pagesize_p2;
10749	  bfd_vma page_addr;
10750	  bfd_vma glink_start = (htab->glink->output_section->vma
10751				 + htab->glink->output_offset);
10752
10753	  for (page_addr = res0 & -pagesize;
10754	       page_addr > glink_start;
10755	       page_addr -= pagesize)
10756	    {
10757	      /* We have a plt call stub that may need fixing.  */
10758	      bfd_byte *loc;
10759	      unsigned int insn;
10760
10761	      loc = htab->glink->contents + page_addr - 4 - glink_start;
10762	      insn = bfd_get_32 (output_bfd, loc);
10763	      if (insn == BCTR)
10764		{
10765		  /* By alignment, we know that there must be at least
10766		     one other call stub before this one.  */
10767		  insn = bfd_get_32 (output_bfd, loc - 16);
10768		  if (insn == BCTR)
10769		    bfd_put_32 (output_bfd, B | (-16 & 0x3fffffc), loc);
10770		  else
10771		    bfd_put_32 (output_bfd, B | (-20 & 0x3fffffc), loc);
10772		}
10773	    }
10774	}
10775
10776      /* Last comes the PLTresolve stub.  */
10777      if (bfd_link_pic (info))
10778	{
10779	  bfd_vma bcl;
10780
10781	  for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
10782	    {
10783	      unsigned int insn = pic_plt_resolve[i];
10784
10785	      if (htab->params->ppc476_workaround && insn == NOP)
10786		insn = BA + 0;
10787	      bfd_put_32 (output_bfd, insn, p);
10788	      p += 4;
10789	    }
10790	  p -= 4 * ARRAY_SIZE (pic_plt_resolve);
10791
10792	  bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
10793		 + htab->glink->output_section->vma
10794		 + htab->glink->output_offset);
10795
10796	  bfd_put_32 (output_bfd,
10797		      ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
10798	  bfd_put_32 (output_bfd,
10799		      ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
10800	  bfd_put_32 (output_bfd,
10801		      ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
10802	  if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
10803	    {
10804	      bfd_put_32 (output_bfd,
10805			  LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
10806	      bfd_put_32 (output_bfd,
10807			  LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
10808	    }
10809	  else
10810	    {
10811	      bfd_put_32 (output_bfd,
10812			  LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
10813	      bfd_put_32 (output_bfd,
10814			  LWZ_12_12 + 4, p + 9*4);
10815	    }
10816	}
10817      else
10818	{
10819	  for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
10820	    {
10821	      unsigned int insn = plt_resolve[i];
10822
10823	      if (htab->params->ppc476_workaround && insn == NOP)
10824		insn = BA + 0;
10825	      bfd_put_32 (output_bfd, insn, p);
10826	      p += 4;
10827	    }
10828	  p -= 4 * ARRAY_SIZE (plt_resolve);
10829
10830	  bfd_put_32 (output_bfd,
10831		      LIS_12 + PPC_HA (got + 4), p + 0*4);
10832	  bfd_put_32 (output_bfd,
10833		      ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
10834	  bfd_put_32 (output_bfd,
10835		      ADDI_11_11 + PPC_LO (-res0), p + 3*4);
10836	  if (PPC_HA (got + 4) == PPC_HA (got + 8))
10837	    {
10838	      bfd_put_32 (output_bfd,
10839			  LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
10840	      bfd_put_32 (output_bfd,
10841			  LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
10842	    }
10843	  else
10844	    {
10845	      bfd_put_32 (output_bfd,
10846			  LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
10847	      bfd_put_32 (output_bfd,
10848			  LWZ_12_12 + 4, p + 6*4);
10849	    }
10850	}
10851    }
10852
10853  if (htab->glink_eh_frame != NULL
10854      && htab->glink_eh_frame->contents != NULL)
10855    {
10856      unsigned char *p = htab->glink_eh_frame->contents;
10857      bfd_vma val;
10858
10859      p += sizeof (glink_eh_frame_cie);
10860      /* FDE length.  */
10861      p += 4;
10862      /* CIE pointer.  */
10863      p += 4;
10864      /* Offset to .glink.  */
10865      val = (htab->glink->output_section->vma
10866	     + htab->glink->output_offset);
10867      val -= (htab->glink_eh_frame->output_section->vma
10868	      + htab->glink_eh_frame->output_offset);
10869      val -= p - htab->glink_eh_frame->contents;
10870      bfd_put_32 (htab->elf.dynobj, val, p);
10871
10872      if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
10873	  && !_bfd_elf_write_section_eh_frame (output_bfd, info,
10874					       htab->glink_eh_frame,
10875					       htab->glink_eh_frame->contents))
10876	return FALSE;
10877    }
10878
10879  return ret;
10880}
10881
10882#define TARGET_LITTLE_SYM	powerpc_elf32_le_vec
10883#define TARGET_LITTLE_NAME	"elf32-powerpcle"
10884#define TARGET_BIG_SYM		powerpc_elf32_vec
10885#define TARGET_BIG_NAME		"elf32-powerpc"
10886#define ELF_ARCH		bfd_arch_powerpc
10887#define ELF_TARGET_ID		PPC32_ELF_DATA
10888#define ELF_MACHINE_CODE	EM_PPC
10889#if defined(__QNXTARGET__) || defined(__HAIKU_TARGET__)
10890#define ELF_MAXPAGESIZE		0x1000
10891#define ELF_COMMONPAGESIZE	0x1000
10892#else
10893#define ELF_MAXPAGESIZE		0x10000
10894#define ELF_COMMONPAGESIZE	0x10000
10895#endif
10896#define ELF_MINPAGESIZE		0x1000
10897#define elf_info_to_howto	ppc_elf_info_to_howto
10898
10899#ifdef  EM_CYGNUS_POWERPC
10900#define ELF_MACHINE_ALT1	EM_CYGNUS_POWERPC
10901#endif
10902
10903#ifdef EM_PPC_OLD
10904#define ELF_MACHINE_ALT2	EM_PPC_OLD
10905#endif
10906
10907#define elf_backend_plt_not_loaded	1
10908#define elf_backend_want_dynrelro	1
10909#define elf_backend_can_gc_sections	1
10910#define elf_backend_can_refcount	1
10911#define elf_backend_rela_normal		1
10912#define elf_backend_caches_rawsize	1
10913
10914#define bfd_elf32_mkobject			ppc_elf_mkobject
10915#define bfd_elf32_bfd_merge_private_bfd_data	ppc_elf_merge_private_bfd_data
10916#define bfd_elf32_bfd_relax_section		ppc_elf_relax_section
10917#define bfd_elf32_bfd_reloc_type_lookup		ppc_elf_reloc_type_lookup
10918#define bfd_elf32_bfd_reloc_name_lookup		ppc_elf_reloc_name_lookup
10919#define bfd_elf32_bfd_set_private_flags		ppc_elf_set_private_flags
10920#define bfd_elf32_bfd_link_hash_table_create	ppc_elf_link_hash_table_create
10921#define bfd_elf32_get_synthetic_symtab		ppc_elf_get_synthetic_symtab
10922
10923#define elf_backend_object_p			ppc_elf_object_p
10924#define elf_backend_gc_mark_hook		ppc_elf_gc_mark_hook
10925#define elf_backend_gc_sweep_hook		ppc_elf_gc_sweep_hook
10926#define elf_backend_section_from_shdr		ppc_elf_section_from_shdr
10927#define elf_backend_relocate_section		ppc_elf_relocate_section
10928#define elf_backend_create_dynamic_sections	ppc_elf_create_dynamic_sections
10929#define elf_backend_check_relocs		ppc_elf_check_relocs
10930#define elf_backend_copy_indirect_symbol	ppc_elf_copy_indirect_symbol
10931#define elf_backend_adjust_dynamic_symbol	ppc_elf_adjust_dynamic_symbol
10932#define elf_backend_add_symbol_hook		ppc_elf_add_symbol_hook
10933#define elf_backend_size_dynamic_sections	ppc_elf_size_dynamic_sections
10934#define elf_backend_hash_symbol			ppc_elf_hash_symbol
10935#define elf_backend_finish_dynamic_symbol	ppc_elf_finish_dynamic_symbol
10936#define elf_backend_finish_dynamic_sections	ppc_elf_finish_dynamic_sections
10937#define elf_backend_fake_sections		ppc_elf_fake_sections
10938#define elf_backend_additional_program_headers	ppc_elf_additional_program_headers
10939#define elf_backend_modify_segment_map     	ppc_elf_modify_segment_map
10940#define elf_backend_grok_prstatus		ppc_elf_grok_prstatus
10941#define elf_backend_grok_psinfo			ppc_elf_grok_psinfo
10942#define elf_backend_write_core_note		ppc_elf_write_core_note
10943#define elf_backend_reloc_type_class		ppc_elf_reloc_type_class
10944#define elf_backend_begin_write_processing	ppc_elf_begin_write_processing
10945#define elf_backend_final_write_processing	ppc_elf_final_write_processing
10946#define elf_backend_write_section		ppc_elf_write_section
10947#define elf_backend_get_sec_type_attr		ppc_elf_get_sec_type_attr
10948#define elf_backend_plt_sym_val			ppc_elf_plt_sym_val
10949#define elf_backend_action_discarded		ppc_elf_action_discarded
10950#define elf_backend_init_index_section		_bfd_elf_init_1_index_section
10951#define elf_backend_lookup_section_flags_hook	ppc_elf_lookup_section_flags
10952
10953#include "elf32-target.h"
10954
10955/* FreeBSD Target */
10956
10957#undef  TARGET_LITTLE_SYM
10958#undef  TARGET_LITTLE_NAME
10959
10960#undef  TARGET_BIG_SYM
10961#define TARGET_BIG_SYM  powerpc_elf32_fbsd_vec
10962#undef  TARGET_BIG_NAME
10963#define TARGET_BIG_NAME "elf32-powerpc-freebsd"
10964
10965#undef  ELF_OSABI
10966#define ELF_OSABI	ELFOSABI_FREEBSD
10967
10968#undef  elf32_bed
10969#define elf32_bed	elf32_powerpc_fbsd_bed
10970
10971#include "elf32-target.h"
10972
10973/* VxWorks Target */
10974
10975#undef TARGET_LITTLE_SYM
10976#undef TARGET_LITTLE_NAME
10977
10978#undef TARGET_BIG_SYM
10979#define TARGET_BIG_SYM		powerpc_elf32_vxworks_vec
10980#undef TARGET_BIG_NAME
10981#define TARGET_BIG_NAME		"elf32-powerpc-vxworks"
10982
10983#undef  ELF_OSABI
10984
10985/* VxWorks uses the elf default section flags for .plt.  */
10986static const struct bfd_elf_special_section *
10987ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
10988{
10989  if (sec->name == NULL)
10990    return NULL;
10991
10992  if (strcmp (sec->name, ".plt") == 0)
10993    return _bfd_elf_get_sec_type_attr (abfd, sec);
10994
10995  return ppc_elf_get_sec_type_attr (abfd, sec);
10996}
10997
10998/* Like ppc_elf_link_hash_table_create, but overrides
10999   appropriately for VxWorks.  */
11000static struct bfd_link_hash_table *
11001ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
11002{
11003  struct bfd_link_hash_table *ret;
11004
11005  ret = ppc_elf_link_hash_table_create (abfd);
11006  if (ret)
11007    {
11008      struct ppc_elf_link_hash_table *htab
11009        = (struct ppc_elf_link_hash_table *)ret;
11010      htab->is_vxworks = 1;
11011      htab->plt_type = PLT_VXWORKS;
11012      htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
11013      htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
11014      htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
11015    }
11016  return ret;
11017}
11018
11019/* Tweak magic VxWorks symbols as they are loaded.  */
11020static bfd_boolean
11021ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
11022				 struct bfd_link_info *info,
11023				 Elf_Internal_Sym *sym,
11024				 const char **namep ATTRIBUTE_UNUSED,
11025				 flagword *flagsp ATTRIBUTE_UNUSED,
11026				 asection **secp,
11027				 bfd_vma *valp)
11028{
11029  if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
11030				   valp))
11031    return FALSE;
11032
11033  return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
11034}
11035
11036static void
11037ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
11038{
11039  ppc_elf_final_write_processing(abfd, linker);
11040  elf_vxworks_final_write_processing(abfd, linker);
11041}
11042
11043/* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
11044   define it.  */
11045#undef elf_backend_want_plt_sym
11046#define elf_backend_want_plt_sym		1
11047#undef elf_backend_want_got_plt
11048#define elf_backend_want_got_plt		1
11049#undef elf_backend_got_symbol_offset
11050#define elf_backend_got_symbol_offset		0
11051#undef elf_backend_plt_not_loaded
11052#define elf_backend_plt_not_loaded		0
11053#undef elf_backend_plt_readonly
11054#define elf_backend_plt_readonly		1
11055#undef elf_backend_got_header_size
11056#define elf_backend_got_header_size		12
11057#undef elf_backend_dtrel_excludes_plt
11058#define elf_backend_dtrel_excludes_plt		1
11059
11060#undef bfd_elf32_get_synthetic_symtab
11061
11062#undef bfd_elf32_bfd_link_hash_table_create
11063#define bfd_elf32_bfd_link_hash_table_create \
11064  ppc_elf_vxworks_link_hash_table_create
11065#undef elf_backend_add_symbol_hook
11066#define elf_backend_add_symbol_hook \
11067  ppc_elf_vxworks_add_symbol_hook
11068#undef elf_backend_link_output_symbol_hook
11069#define elf_backend_link_output_symbol_hook \
11070  elf_vxworks_link_output_symbol_hook
11071#undef elf_backend_final_write_processing
11072#define elf_backend_final_write_processing \
11073  ppc_elf_vxworks_final_write_processing
11074#undef elf_backend_get_sec_type_attr
11075#define elf_backend_get_sec_type_attr \
11076  ppc_elf_vxworks_get_sec_type_attr
11077#undef elf_backend_emit_relocs
11078#define elf_backend_emit_relocs \
11079  elf_vxworks_emit_relocs
11080
11081#undef elf32_bed
11082#define elf32_bed				ppc_elf_vxworks_bed
11083#undef elf_backend_post_process_headers
11084
11085#include "elf32-target.h"
11086