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