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