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