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