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