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