xref: /NextBSD/contrib/binutils/bfd/elf32-ppc.c (revision 287e3b14e9552995def1802ec9c5034f4adf28ec)
1 /* PowerPC-specific support for 32-bit ELF
2    Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003,
3    2004, 2005, 2006, 2007 Free Software Foundation, Inc.
4    Written by Ian Lance Taylor, Cygnus Support.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the
20    Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
21    Boston, MA 02110-1301, USA.  */
22 
23 /* This file is based on a preliminary PowerPC ELF ABI.  The
24    information may not match the final PowerPC ELF ABI.  It includes
25    suggestions from the in-progress Embedded PowerPC ABI, and that
26    information may also not match.  */
27 
28 #include "sysdep.h"
29 #include <stdarg.h>
30 #include "bfd.h"
31 #include "bfdlink.h"
32 #include "libbfd.h"
33 #include "elf-bfd.h"
34 #include "elf/ppc.h"
35 #include "elf32-ppc.h"
36 #include "elf-vxworks.h"
37 
38 /* RELA relocations are used here.  */
39 
40 static bfd_reloc_status_type ppc_elf_addr16_ha_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc_elf_unhandled_reloc
43   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 
45 /* Branch prediction bit for branch taken relocs.  */
46 #define BRANCH_PREDICT_BIT 0x200000
47 /* Mask to set RA in memory instructions.  */
48 #define RA_REGISTER_MASK 0x001f0000
49 /* Value to shift register by to insert RA.  */
50 #define RA_REGISTER_SHIFT 16
51 
52 /* The name of the dynamic interpreter.  This is put in the .interp
53    section.  */
54 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
55 
56 /* For old-style PLT.  */
57 /* The number of single-slot PLT entries (the rest use two slots).  */
58 #define PLT_NUM_SINGLE_ENTRIES 8192
59 
60 /* For new-style .glink and .plt.  */
61 #define GLINK_PLTRESOLVE 16*4
62 #define GLINK_ENTRY_SIZE 4*4
63 
64 /* VxWorks uses its own plt layout, filled in by the static linker.  */
65 
66 /* The standard VxWorks PLT entry.  */
67 #define VXWORKS_PLT_ENTRY_SIZE 32
68 static const bfd_vma ppc_elf_vxworks_plt_entry
69     [VXWORKS_PLT_ENTRY_SIZE / 4] =
70   {
71     0x3d800000, /* lis     r12,0                 */
72     0x818c0000, /* lwz     r12,0(r12)            */
73     0x7d8903a6, /* mtctr   r12                   */
74     0x4e800420, /* bctr                          */
75     0x39600000, /* li      r11,0                 */
76     0x48000000, /* b       14 <.PLT0resolve+0x4> */
77     0x60000000, /* nop                           */
78     0x60000000, /* nop                           */
79   };
80 static const bfd_vma ppc_elf_vxworks_pic_plt_entry
81     [VXWORKS_PLT_ENTRY_SIZE / 4] =
82   {
83     0x3d9e0000, /* addis r12,r30,0 */
84     0x818c0000, /* lwz	 r12,0(r12) */
85     0x7d8903a6, /* mtctr r12 */
86     0x4e800420, /* bctr */
87     0x39600000, /* li	 r11,0 */
88     0x48000000, /* b	 14 <.PLT0resolve+0x4> 14: R_PPC_REL24 .PLTresolve */
89     0x60000000, /* nop */
90     0x60000000, /* nop */
91   };
92 
93 /* The initial VxWorks PLT entry.  */
94 #define VXWORKS_PLT_INITIAL_ENTRY_SIZE 32
95 static const bfd_vma ppc_elf_vxworks_plt0_entry
96     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
97   {
98     0x3d800000, /* lis     r12,0        */
99     0x398c0000, /* addi    r12,r12,0    */
100     0x800c0008, /* lwz     r0,8(r12)    */
101     0x7c0903a6, /* mtctr   r0           */
102     0x818c0004, /* lwz     r12,4(r12)   */
103     0x4e800420, /* bctr                 */
104     0x60000000, /* nop                  */
105     0x60000000, /* nop                  */
106   };
107 static const bfd_vma ppc_elf_vxworks_pic_plt0_entry
108     [VXWORKS_PLT_INITIAL_ENTRY_SIZE / 4] =
109   {
110     0x819e0008, /* lwz	 r12,8(r30) */
111     0x7d8903a6, /* mtctr r12        */
112     0x819e0004, /* lwz	 r12,4(r30) */
113     0x4e800420, /* bctr             */
114     0x60000000, /* nop              */
115     0x60000000, /* nop              */
116     0x60000000, /* nop              */
117     0x60000000, /* nop              */
118   };
119 
120 /* For executables, we have some additional relocations in
121    .rela.plt.unloaded, for the kernel loader.  */
122 
123 /* The number of non-JMP_SLOT relocations per PLT0 slot. */
124 #define VXWORKS_PLT_NON_JMP_SLOT_RELOCS 3
125 /* The number of relocations in the PLTResolve slot. */
126 #define VXWORKS_PLTRESOLVE_RELOCS 2
127 /* The number of relocations in the PLTResolve slot when when creating
128    a shared library. */
129 #define VXWORKS_PLTRESOLVE_RELOCS_SHLIB 0
130 
131 /* Some instructions.  */
132 #define ADDIS_11_11	0x3d6b0000
133 #define ADDIS_11_30	0x3d7e0000
134 #define ADDIS_12_12	0x3d8c0000
135 #define ADDI_11_11	0x396b0000
136 #define ADD_0_11_11	0x7c0b5a14
137 #define ADD_11_0_11	0x7d605a14
138 #define B		0x48000000
139 #define BCL_20_31	0x429f0005
140 #define BCTR		0x4e800420
141 #define LIS_11		0x3d600000
142 #define LIS_12		0x3d800000
143 #define LWZU_0_12	0x840c0000
144 #define LWZ_0_12	0x800c0000
145 #define LWZ_11_11	0x816b0000
146 #define LWZ_11_30	0x817e0000
147 #define LWZ_12_12	0x818c0000
148 #define MFLR_0		0x7c0802a6
149 #define MFLR_12		0x7d8802a6
150 #define MTCTR_0		0x7c0903a6
151 #define MTCTR_11	0x7d6903a6
152 #define MTLR_0		0x7c0803a6
153 #define NOP		0x60000000
154 #define SUB_11_11_12	0x7d6c5850
155 
156 /* Offset of tp and dtp pointers from start of TLS block.  */
157 #define TP_OFFSET	0x7000
158 #define DTP_OFFSET	0x8000
159 
160 static reloc_howto_type *ppc_elf_howto_table[R_PPC_max];
161 
162 static reloc_howto_type ppc_elf_howto_raw[] = {
163   /* This reloc does nothing.  */
164   HOWTO (R_PPC_NONE,		/* type */
165 	 0,			/* rightshift */
166 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
167 	 32,			/* bitsize */
168 	 FALSE,			/* pc_relative */
169 	 0,			/* bitpos */
170 	 complain_overflow_bitfield, /* complain_on_overflow */
171 	 bfd_elf_generic_reloc,	/* special_function */
172 	 "R_PPC_NONE",		/* name */
173 	 FALSE,			/* partial_inplace */
174 	 0,			/* src_mask */
175 	 0,			/* dst_mask */
176 	 FALSE),		/* pcrel_offset */
177 
178   /* A standard 32 bit relocation.  */
179   HOWTO (R_PPC_ADDR32,		/* type */
180 	 0,			/* rightshift */
181 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
182 	 32,			/* bitsize */
183 	 FALSE,			/* pc_relative */
184 	 0,			/* bitpos */
185 	 complain_overflow_bitfield, /* complain_on_overflow */
186 	 bfd_elf_generic_reloc,	/* special_function */
187 	 "R_PPC_ADDR32",	/* name */
188 	 FALSE,			/* partial_inplace */
189 	 0,			/* src_mask */
190 	 0xffffffff,		/* dst_mask */
191 	 FALSE),		/* pcrel_offset */
192 
193   /* An absolute 26 bit branch; the lower two bits must be zero.
194      FIXME: we don't check that, we just clear them.  */
195   HOWTO (R_PPC_ADDR24,		/* type */
196 	 0,			/* rightshift */
197 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
198 	 26,			/* bitsize */
199 	 FALSE,			/* pc_relative */
200 	 0,			/* bitpos */
201 	 complain_overflow_bitfield, /* complain_on_overflow */
202 	 bfd_elf_generic_reloc,	/* special_function */
203 	 "R_PPC_ADDR24",	/* name */
204 	 FALSE,			/* partial_inplace */
205 	 0,			/* src_mask */
206 	 0x3fffffc,		/* dst_mask */
207 	 FALSE),		/* pcrel_offset */
208 
209   /* A standard 16 bit relocation.  */
210   HOWTO (R_PPC_ADDR16,		/* type */
211 	 0,			/* rightshift */
212 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
213 	 16,			/* bitsize */
214 	 FALSE,			/* pc_relative */
215 	 0,			/* bitpos */
216 	 complain_overflow_bitfield, /* complain_on_overflow */
217 	 bfd_elf_generic_reloc,	/* special_function */
218 	 "R_PPC_ADDR16",	/* name */
219 	 FALSE,			/* partial_inplace */
220 	 0,			/* src_mask */
221 	 0xffff,		/* dst_mask */
222 	 FALSE),		/* pcrel_offset */
223 
224   /* A 16 bit relocation without overflow.  */
225   HOWTO (R_PPC_ADDR16_LO,	/* type */
226 	 0,			/* rightshift */
227 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
228 	 16,			/* bitsize */
229 	 FALSE,			/* pc_relative */
230 	 0,			/* bitpos */
231 	 complain_overflow_dont,/* complain_on_overflow */
232 	 bfd_elf_generic_reloc,	/* special_function */
233 	 "R_PPC_ADDR16_LO",	/* name */
234 	 FALSE,			/* partial_inplace */
235 	 0,			/* src_mask */
236 	 0xffff,		/* dst_mask */
237 	 FALSE),		/* pcrel_offset */
238 
239   /* The high order 16 bits of an address.  */
240   HOWTO (R_PPC_ADDR16_HI,	/* type */
241 	 16,			/* rightshift */
242 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
243 	 16,			/* bitsize */
244 	 FALSE,			/* pc_relative */
245 	 0,			/* bitpos */
246 	 complain_overflow_dont, /* complain_on_overflow */
247 	 bfd_elf_generic_reloc,	/* special_function */
248 	 "R_PPC_ADDR16_HI",	/* name */
249 	 FALSE,			/* partial_inplace */
250 	 0,			/* src_mask */
251 	 0xffff,		/* dst_mask */
252 	 FALSE),		/* pcrel_offset */
253 
254   /* The high order 16 bits of an address, plus 1 if the contents of
255      the low 16 bits, treated as a signed number, is negative.  */
256   HOWTO (R_PPC_ADDR16_HA,	/* type */
257 	 16,			/* rightshift */
258 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
259 	 16,			/* bitsize */
260 	 FALSE,			/* pc_relative */
261 	 0,			/* bitpos */
262 	 complain_overflow_dont, /* complain_on_overflow */
263 	 ppc_elf_addr16_ha_reloc, /* special_function */
264 	 "R_PPC_ADDR16_HA",	/* name */
265 	 FALSE,			/* partial_inplace */
266 	 0,			/* src_mask */
267 	 0xffff,		/* dst_mask */
268 	 FALSE),		/* pcrel_offset */
269 
270   /* An absolute 16 bit branch; the lower two bits must be zero.
271      FIXME: we don't check that, we just clear them.  */
272   HOWTO (R_PPC_ADDR14,		/* type */
273 	 0,			/* rightshift */
274 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
275 	 16,			/* bitsize */
276 	 FALSE,			/* pc_relative */
277 	 0,			/* bitpos */
278 	 complain_overflow_bitfield, /* complain_on_overflow */
279 	 bfd_elf_generic_reloc,	/* special_function */
280 	 "R_PPC_ADDR14",	/* name */
281 	 FALSE,			/* partial_inplace */
282 	 0,			/* src_mask */
283 	 0xfffc,		/* dst_mask */
284 	 FALSE),		/* pcrel_offset */
285 
286   /* An absolute 16 bit branch, for which bit 10 should be set to
287      indicate that the branch is expected to be taken.	The lower two
288      bits must be zero.  */
289   HOWTO (R_PPC_ADDR14_BRTAKEN,	/* type */
290 	 0,			/* rightshift */
291 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
292 	 16,			/* bitsize */
293 	 FALSE,			/* pc_relative */
294 	 0,			/* bitpos */
295 	 complain_overflow_bitfield, /* complain_on_overflow */
296 	 bfd_elf_generic_reloc,	/* special_function */
297 	 "R_PPC_ADDR14_BRTAKEN",/* name */
298 	 FALSE,			/* partial_inplace */
299 	 0,			/* src_mask */
300 	 0xfffc,		/* dst_mask */
301 	 FALSE),		/* pcrel_offset */
302 
303   /* An absolute 16 bit branch, for which bit 10 should be set to
304      indicate that the branch is not expected to be taken.  The lower
305      two bits must be zero.  */
306   HOWTO (R_PPC_ADDR14_BRNTAKEN, /* type */
307 	 0,			/* rightshift */
308 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
309 	 16,			/* bitsize */
310 	 FALSE,			/* pc_relative */
311 	 0,			/* bitpos */
312 	 complain_overflow_bitfield, /* complain_on_overflow */
313 	 bfd_elf_generic_reloc,	/* special_function */
314 	 "R_PPC_ADDR14_BRNTAKEN",/* name */
315 	 FALSE,			/* partial_inplace */
316 	 0,			/* src_mask */
317 	 0xfffc,		/* dst_mask */
318 	 FALSE),		/* pcrel_offset */
319 
320   /* A relative 26 bit branch; the lower two bits must be zero.  */
321   HOWTO (R_PPC_REL24,		/* type */
322 	 0,			/* rightshift */
323 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
324 	 26,			/* bitsize */
325 	 TRUE,			/* pc_relative */
326 	 0,			/* bitpos */
327 	 complain_overflow_signed, /* complain_on_overflow */
328 	 bfd_elf_generic_reloc,	/* special_function */
329 	 "R_PPC_REL24",		/* name */
330 	 FALSE,			/* partial_inplace */
331 	 0,			/* src_mask */
332 	 0x3fffffc,		/* dst_mask */
333 	 TRUE),			/* pcrel_offset */
334 
335   /* A relative 16 bit branch; the lower two bits must be zero.  */
336   HOWTO (R_PPC_REL14,		/* type */
337 	 0,			/* rightshift */
338 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
339 	 16,			/* bitsize */
340 	 TRUE,			/* pc_relative */
341 	 0,			/* bitpos */
342 	 complain_overflow_signed, /* complain_on_overflow */
343 	 bfd_elf_generic_reloc,	/* special_function */
344 	 "R_PPC_REL14",		/* name */
345 	 FALSE,			/* partial_inplace */
346 	 0,			/* src_mask */
347 	 0xfffc,		/* dst_mask */
348 	 TRUE),			/* pcrel_offset */
349 
350   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
351      the branch is expected to be taken.  The lower two bits must be
352      zero.  */
353   HOWTO (R_PPC_REL14_BRTAKEN,	/* type */
354 	 0,			/* rightshift */
355 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
356 	 16,			/* bitsize */
357 	 TRUE,			/* pc_relative */
358 	 0,			/* bitpos */
359 	 complain_overflow_signed, /* complain_on_overflow */
360 	 bfd_elf_generic_reloc,	/* special_function */
361 	 "R_PPC_REL14_BRTAKEN",	/* name */
362 	 FALSE,			/* partial_inplace */
363 	 0,			/* src_mask */
364 	 0xfffc,		/* dst_mask */
365 	 TRUE),			/* pcrel_offset */
366 
367   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
368      the branch is not expected to be taken.  The lower two bits must
369      be zero.  */
370   HOWTO (R_PPC_REL14_BRNTAKEN,	/* type */
371 	 0,			/* rightshift */
372 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
373 	 16,			/* bitsize */
374 	 TRUE,			/* pc_relative */
375 	 0,			/* bitpos */
376 	 complain_overflow_signed, /* complain_on_overflow */
377 	 bfd_elf_generic_reloc,	/* special_function */
378 	 "R_PPC_REL14_BRNTAKEN",/* name */
379 	 FALSE,			/* partial_inplace */
380 	 0,			/* src_mask */
381 	 0xfffc,		/* dst_mask */
382 	 TRUE),			/* pcrel_offset */
383 
384   /* Like R_PPC_ADDR16, but referring to the GOT table entry for the
385      symbol.  */
386   HOWTO (R_PPC_GOT16,		/* type */
387 	 0,			/* rightshift */
388 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
389 	 16,			/* bitsize */
390 	 FALSE,			/* pc_relative */
391 	 0,			/* bitpos */
392 	 complain_overflow_signed, /* complain_on_overflow */
393 	 bfd_elf_generic_reloc,	/* special_function */
394 	 "R_PPC_GOT16",		/* name */
395 	 FALSE,			/* partial_inplace */
396 	 0,			/* src_mask */
397 	 0xffff,		/* dst_mask */
398 	 FALSE),		/* pcrel_offset */
399 
400   /* Like R_PPC_ADDR16_LO, but referring to the GOT table entry for
401      the symbol.  */
402   HOWTO (R_PPC_GOT16_LO,	/* type */
403 	 0,			/* rightshift */
404 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
405 	 16,			/* bitsize */
406 	 FALSE,			/* pc_relative */
407 	 0,			/* bitpos */
408 	 complain_overflow_dont, /* complain_on_overflow */
409 	 bfd_elf_generic_reloc,	/* special_function */
410 	 "R_PPC_GOT16_LO",	/* name */
411 	 FALSE,			/* partial_inplace */
412 	 0,			/* src_mask */
413 	 0xffff,		/* dst_mask */
414 	 FALSE),		/* pcrel_offset */
415 
416   /* Like R_PPC_ADDR16_HI, but referring to the GOT table entry for
417      the symbol.  */
418   HOWTO (R_PPC_GOT16_HI,	/* type */
419 	 16,			/* rightshift */
420 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
421 	 16,			/* bitsize */
422 	 FALSE,			/* pc_relative */
423 	 0,			/* bitpos */
424 	 complain_overflow_bitfield, /* complain_on_overflow */
425 	 bfd_elf_generic_reloc,	/* special_function */
426 	 "R_PPC_GOT16_HI",	/* name */
427 	 FALSE,			/* partial_inplace */
428 	 0,			/* src_mask */
429 	 0xffff,		/* dst_mask */
430 	 FALSE),		 /* pcrel_offset */
431 
432   /* Like R_PPC_ADDR16_HA, but referring to the GOT table entry for
433      the symbol.  */
434   HOWTO (R_PPC_GOT16_HA,	/* type */
435 	 16,			/* rightshift */
436 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
437 	 16,			/* bitsize */
438 	 FALSE,			/* pc_relative */
439 	 0,			/* bitpos */
440 	 complain_overflow_bitfield, /* complain_on_overflow */
441 	 ppc_elf_addr16_ha_reloc, /* special_function */
442 	 "R_PPC_GOT16_HA",	/* name */
443 	 FALSE,			/* partial_inplace */
444 	 0,			/* src_mask */
445 	 0xffff,		/* dst_mask */
446 	 FALSE),		/* pcrel_offset */
447 
448   /* Like R_PPC_REL24, but referring to the procedure linkage table
449      entry for the symbol.  */
450   HOWTO (R_PPC_PLTREL24,	/* type */
451 	 0,			/* rightshift */
452 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
453 	 26,			/* bitsize */
454 	 TRUE,			/* pc_relative */
455 	 0,			/* bitpos */
456 	 complain_overflow_signed,  /* complain_on_overflow */
457 	 bfd_elf_generic_reloc,	/* special_function */
458 	 "R_PPC_PLTREL24",	/* name */
459 	 FALSE,			/* partial_inplace */
460 	 0,			/* src_mask */
461 	 0x3fffffc,		/* dst_mask */
462 	 TRUE),			/* pcrel_offset */
463 
464   /* This is used only by the dynamic linker.  The symbol should exist
465      both in the object being run and in some shared library.  The
466      dynamic linker copies the data addressed by the symbol from the
467      shared library into the object, because the object being
468      run has to have the data at some particular address.  */
469   HOWTO (R_PPC_COPY,		/* type */
470 	 0,			/* rightshift */
471 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
472 	 32,			/* bitsize */
473 	 FALSE,			/* pc_relative */
474 	 0,			/* bitpos */
475 	 complain_overflow_bitfield, /* complain_on_overflow */
476 	 bfd_elf_generic_reloc,	 /* special_function */
477 	 "R_PPC_COPY",		/* name */
478 	 FALSE,			/* partial_inplace */
479 	 0,			/* src_mask */
480 	 0,			/* dst_mask */
481 	 FALSE),		/* pcrel_offset */
482 
483   /* Like R_PPC_ADDR32, but used when setting global offset table
484      entries.  */
485   HOWTO (R_PPC_GLOB_DAT,	/* type */
486 	 0,			/* rightshift */
487 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
488 	 32,			/* bitsize */
489 	 FALSE,			/* pc_relative */
490 	 0,			/* bitpos */
491 	 complain_overflow_bitfield, /* complain_on_overflow */
492 	 bfd_elf_generic_reloc,	 /* special_function */
493 	 "R_PPC_GLOB_DAT",	/* name */
494 	 FALSE,			/* partial_inplace */
495 	 0,			/* src_mask */
496 	 0xffffffff,		/* dst_mask */
497 	 FALSE),		/* pcrel_offset */
498 
499   /* Marks a procedure linkage table entry for a symbol.  */
500   HOWTO (R_PPC_JMP_SLOT,	/* type */
501 	 0,			/* rightshift */
502 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
503 	 32,			/* bitsize */
504 	 FALSE,			/* pc_relative */
505 	 0,			/* bitpos */
506 	 complain_overflow_bitfield, /* complain_on_overflow */
507 	 bfd_elf_generic_reloc,	 /* special_function */
508 	 "R_PPC_JMP_SLOT",	/* name */
509 	 FALSE,			/* partial_inplace */
510 	 0,			/* src_mask */
511 	 0,			/* dst_mask */
512 	 FALSE),		/* pcrel_offset */
513 
514   /* Used only by the dynamic linker.  When the object is run, this
515      longword is set to the load address of the object, plus the
516      addend.  */
517   HOWTO (R_PPC_RELATIVE,	/* type */
518 	 0,			/* rightshift */
519 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
520 	 32,			/* bitsize */
521 	 FALSE,			/* pc_relative */
522 	 0,			/* bitpos */
523 	 complain_overflow_bitfield, /* complain_on_overflow */
524 	 bfd_elf_generic_reloc,	 /* special_function */
525 	 "R_PPC_RELATIVE",	/* name */
526 	 FALSE,			/* partial_inplace */
527 	 0,			/* src_mask */
528 	 0xffffffff,		/* dst_mask */
529 	 FALSE),		/* pcrel_offset */
530 
531   /* Like R_PPC_REL24, but uses the value of the symbol within the
532      object rather than the final value.  Normally used for
533      _GLOBAL_OFFSET_TABLE_.  */
534   HOWTO (R_PPC_LOCAL24PC,	/* type */
535 	 0,			/* rightshift */
536 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
537 	 26,			/* bitsize */
538 	 TRUE,			/* pc_relative */
539 	 0,			/* bitpos */
540 	 complain_overflow_signed, /* complain_on_overflow */
541 	 bfd_elf_generic_reloc,	/* special_function */
542 	 "R_PPC_LOCAL24PC",	/* name */
543 	 FALSE,			/* partial_inplace */
544 	 0,			/* src_mask */
545 	 0x3fffffc,		/* dst_mask */
546 	 TRUE),			/* pcrel_offset */
547 
548   /* Like R_PPC_ADDR32, but may be unaligned.  */
549   HOWTO (R_PPC_UADDR32,		/* type */
550 	 0,			/* rightshift */
551 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
552 	 32,			/* bitsize */
553 	 FALSE,			/* pc_relative */
554 	 0,			/* bitpos */
555 	 complain_overflow_bitfield, /* complain_on_overflow */
556 	 bfd_elf_generic_reloc,	/* special_function */
557 	 "R_PPC_UADDR32",	/* name */
558 	 FALSE,			/* partial_inplace */
559 	 0,			/* src_mask */
560 	 0xffffffff,		/* dst_mask */
561 	 FALSE),		/* pcrel_offset */
562 
563   /* Like R_PPC_ADDR16, but may be unaligned.  */
564   HOWTO (R_PPC_UADDR16,		/* type */
565 	 0,			/* rightshift */
566 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
567 	 16,			/* bitsize */
568 	 FALSE,			/* pc_relative */
569 	 0,			/* bitpos */
570 	 complain_overflow_bitfield, /* complain_on_overflow */
571 	 bfd_elf_generic_reloc,	/* special_function */
572 	 "R_PPC_UADDR16",	/* name */
573 	 FALSE,			/* partial_inplace */
574 	 0,			/* src_mask */
575 	 0xffff,		/* dst_mask */
576 	 FALSE),		/* pcrel_offset */
577 
578   /* 32-bit PC relative */
579   HOWTO (R_PPC_REL32,		/* type */
580 	 0,			/* rightshift */
581 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
582 	 32,			/* bitsize */
583 	 TRUE,			/* pc_relative */
584 	 0,			/* bitpos */
585 	 complain_overflow_bitfield, /* complain_on_overflow */
586 	 bfd_elf_generic_reloc,	/* special_function */
587 	 "R_PPC_REL32",		/* name */
588 	 FALSE,			/* partial_inplace */
589 	 0,			/* src_mask */
590 	 0xffffffff,		/* dst_mask */
591 	 TRUE),			/* pcrel_offset */
592 
593   /* 32-bit relocation to the symbol's procedure linkage table.
594      FIXME: not supported.  */
595   HOWTO (R_PPC_PLT32,		/* type */
596 	 0,			/* rightshift */
597 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
598 	 32,			/* bitsize */
599 	 FALSE,			/* pc_relative */
600 	 0,			/* bitpos */
601 	 complain_overflow_bitfield, /* complain_on_overflow */
602 	 bfd_elf_generic_reloc,	/* special_function */
603 	 "R_PPC_PLT32",		/* name */
604 	 FALSE,			/* partial_inplace */
605 	 0,			/* src_mask */
606 	 0,			/* dst_mask */
607 	 FALSE),		/* pcrel_offset */
608 
609   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
610      FIXME: not supported.  */
611   HOWTO (R_PPC_PLTREL32,	/* type */
612 	 0,			/* rightshift */
613 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
614 	 32,			/* bitsize */
615 	 TRUE,			/* pc_relative */
616 	 0,			/* bitpos */
617 	 complain_overflow_bitfield, /* complain_on_overflow */
618 	 bfd_elf_generic_reloc,	/* special_function */
619 	 "R_PPC_PLTREL32",	/* name */
620 	 FALSE,			/* partial_inplace */
621 	 0,			/* src_mask */
622 	 0,			/* dst_mask */
623 	 TRUE),			/* pcrel_offset */
624 
625   /* Like R_PPC_ADDR16_LO, but referring to the PLT table entry for
626      the symbol.  */
627   HOWTO (R_PPC_PLT16_LO,	/* type */
628 	 0,			/* rightshift */
629 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
630 	 16,			/* bitsize */
631 	 FALSE,			/* pc_relative */
632 	 0,			/* bitpos */
633 	 complain_overflow_dont, /* complain_on_overflow */
634 	 bfd_elf_generic_reloc,	/* special_function */
635 	 "R_PPC_PLT16_LO",	/* name */
636 	 FALSE,			/* partial_inplace */
637 	 0,			/* src_mask */
638 	 0xffff,		/* dst_mask */
639 	 FALSE),		/* pcrel_offset */
640 
641   /* Like R_PPC_ADDR16_HI, but referring to the PLT table entry for
642      the symbol.  */
643   HOWTO (R_PPC_PLT16_HI,	/* type */
644 	 16,			/* rightshift */
645 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
646 	 16,			/* bitsize */
647 	 FALSE,			/* pc_relative */
648 	 0,			/* bitpos */
649 	 complain_overflow_bitfield, /* complain_on_overflow */
650 	 bfd_elf_generic_reloc,	/* special_function */
651 	 "R_PPC_PLT16_HI",	/* name */
652 	 FALSE,			/* partial_inplace */
653 	 0,			/* src_mask */
654 	 0xffff,		/* dst_mask */
655 	 FALSE),		 /* pcrel_offset */
656 
657   /* Like R_PPC_ADDR16_HA, but referring to the PLT table entry for
658      the symbol.  */
659   HOWTO (R_PPC_PLT16_HA,	/* type */
660 	 16,			/* rightshift */
661 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
662 	 16,			/* bitsize */
663 	 FALSE,			/* pc_relative */
664 	 0,			/* bitpos */
665 	 complain_overflow_bitfield, /* complain_on_overflow */
666 	 ppc_elf_addr16_ha_reloc, /* special_function */
667 	 "R_PPC_PLT16_HA",	/* name */
668 	 FALSE,			/* partial_inplace */
669 	 0,			/* src_mask */
670 	 0xffff,		/* dst_mask */
671 	 FALSE),		/* pcrel_offset */
672 
673   /* A sign-extended 16 bit value relative to _SDA_BASE_, for use with
674      small data items.  */
675   HOWTO (R_PPC_SDAREL16,	/* type */
676 	 0,			/* rightshift */
677 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
678 	 16,			/* bitsize */
679 	 FALSE,			/* pc_relative */
680 	 0,			/* bitpos */
681 	 complain_overflow_signed, /* complain_on_overflow */
682 	 bfd_elf_generic_reloc,	/* special_function */
683 	 "R_PPC_SDAREL16",	/* name */
684 	 FALSE,			/* partial_inplace */
685 	 0,			/* src_mask */
686 	 0xffff,		/* dst_mask */
687 	 FALSE),		/* pcrel_offset */
688 
689   /* 16-bit section relative relocation.  */
690   HOWTO (R_PPC_SECTOFF,		/* type */
691 	 0,			/* rightshift */
692 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
693 	 16,			/* bitsize */
694 	 FALSE,			/* pc_relative */
695 	 0,			/* bitpos */
696 	 complain_overflow_bitfield, /* complain_on_overflow */
697 	 bfd_elf_generic_reloc,	/* special_function */
698 	 "R_PPC_SECTOFF",	/* name */
699 	 FALSE,			/* partial_inplace */
700 	 0,			/* src_mask */
701 	 0xffff,		/* dst_mask */
702 	 FALSE),		/* pcrel_offset */
703 
704   /* 16-bit lower half section relative relocation.  */
705   HOWTO (R_PPC_SECTOFF_LO,	  /* type */
706 	 0,			/* rightshift */
707 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
708 	 16,			/* bitsize */
709 	 FALSE,			/* pc_relative */
710 	 0,			/* bitpos */
711 	 complain_overflow_dont, /* complain_on_overflow */
712 	 bfd_elf_generic_reloc,	/* special_function */
713 	 "R_PPC_SECTOFF_LO",	/* name */
714 	 FALSE,			/* partial_inplace */
715 	 0,			/* src_mask */
716 	 0xffff,		/* dst_mask */
717 	 FALSE),		/* pcrel_offset */
718 
719   /* 16-bit upper half section relative relocation.  */
720   HOWTO (R_PPC_SECTOFF_HI,	/* type */
721 	 16,			/* rightshift */
722 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
723 	 16,			/* bitsize */
724 	 FALSE,			/* pc_relative */
725 	 0,			/* bitpos */
726 	 complain_overflow_bitfield, /* complain_on_overflow */
727 	 bfd_elf_generic_reloc,	/* special_function */
728 	 "R_PPC_SECTOFF_HI",	/* name */
729 	 FALSE,			/* partial_inplace */
730 	 0,			/* src_mask */
731 	 0xffff,		/* dst_mask */
732 	 FALSE),		 /* pcrel_offset */
733 
734   /* 16-bit upper half adjusted section relative relocation.  */
735   HOWTO (R_PPC_SECTOFF_HA,	/* type */
736 	 16,			/* rightshift */
737 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
738 	 16,			/* bitsize */
739 	 FALSE,			/* pc_relative */
740 	 0,			/* bitpos */
741 	 complain_overflow_bitfield, /* complain_on_overflow */
742 	 ppc_elf_addr16_ha_reloc, /* special_function */
743 	 "R_PPC_SECTOFF_HA",	/* name */
744 	 FALSE,			/* partial_inplace */
745 	 0,			/* src_mask */
746 	 0xffff,		/* dst_mask */
747 	 FALSE),		/* pcrel_offset */
748 
749   /* Marker relocs for TLS.  */
750   HOWTO (R_PPC_TLS,
751 	 0,			/* rightshift */
752 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
753 	 32,			/* bitsize */
754 	 FALSE,			/* pc_relative */
755 	 0,			/* bitpos */
756 	 complain_overflow_dont, /* complain_on_overflow */
757 	 bfd_elf_generic_reloc,	/* special_function */
758 	 "R_PPC_TLS",		/* name */
759 	 FALSE,			/* partial_inplace */
760 	 0,			/* src_mask */
761 	 0,			/* dst_mask */
762 	 FALSE),		/* pcrel_offset */
763 
764   HOWTO (R_PPC_TLSGD,
765 	 0,			/* rightshift */
766 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
767 	 32,			/* bitsize */
768 	 FALSE,			/* pc_relative */
769 	 0,			/* bitpos */
770 	 complain_overflow_dont, /* complain_on_overflow */
771 	 bfd_elf_generic_reloc, /* special_function */
772 	 "R_PPC_TLSGD",		/* name */
773 	 FALSE,			/* partial_inplace */
774 	 0,			/* src_mask */
775 	 0,			/* dst_mask */
776 	 FALSE),		/* pcrel_offset */
777 
778   HOWTO (R_PPC_TLSLD,
779 	 0,			/* rightshift */
780 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
781 	 32,			/* bitsize */
782 	 FALSE,			/* pc_relative */
783 	 0,			/* bitpos */
784 	 complain_overflow_dont, /* complain_on_overflow */
785 	 bfd_elf_generic_reloc, /* special_function */
786 	 "R_PPC_TLSLD",		/* name */
787 	 FALSE,			/* partial_inplace */
788 	 0,			/* src_mask */
789 	 0,			/* dst_mask */
790 	 FALSE),		/* pcrel_offset */
791 
792   /* Computes the load module index of the load module that contains the
793      definition of its TLS sym.  */
794   HOWTO (R_PPC_DTPMOD32,
795 	 0,			/* rightshift */
796 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
797 	 32,			/* bitsize */
798 	 FALSE,			/* pc_relative */
799 	 0,			/* bitpos */
800 	 complain_overflow_dont, /* complain_on_overflow */
801 	 ppc_elf_unhandled_reloc, /* special_function */
802 	 "R_PPC_DTPMOD32",	/* name */
803 	 FALSE,			/* partial_inplace */
804 	 0,			/* src_mask */
805 	 0xffffffff,		/* dst_mask */
806 	 FALSE),		/* pcrel_offset */
807 
808   /* Computes a dtv-relative displacement, the difference between the value
809      of sym+add and the base address of the thread-local storage block that
810      contains the definition of sym, minus 0x8000.  */
811   HOWTO (R_PPC_DTPREL32,
812 	 0,			/* rightshift */
813 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
814 	 32,			/* bitsize */
815 	 FALSE,			/* pc_relative */
816 	 0,			/* bitpos */
817 	 complain_overflow_dont, /* complain_on_overflow */
818 	 ppc_elf_unhandled_reloc, /* special_function */
819 	 "R_PPC_DTPREL32",	/* name */
820 	 FALSE,			/* partial_inplace */
821 	 0,			/* src_mask */
822 	 0xffffffff,		/* dst_mask */
823 	 FALSE),		/* pcrel_offset */
824 
825   /* A 16 bit dtprel reloc.  */
826   HOWTO (R_PPC_DTPREL16,
827 	 0,			/* rightshift */
828 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
829 	 16,			/* bitsize */
830 	 FALSE,			/* pc_relative */
831 	 0,			/* bitpos */
832 	 complain_overflow_signed, /* complain_on_overflow */
833 	 ppc_elf_unhandled_reloc, /* special_function */
834 	 "R_PPC_DTPREL16",	/* name */
835 	 FALSE,			/* partial_inplace */
836 	 0,			/* src_mask */
837 	 0xffff,		/* dst_mask */
838 	 FALSE),		/* pcrel_offset */
839 
840   /* Like DTPREL16, but no overflow.  */
841   HOWTO (R_PPC_DTPREL16_LO,
842 	 0,			/* rightshift */
843 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
844 	 16,			/* bitsize */
845 	 FALSE,			/* pc_relative */
846 	 0,			/* bitpos */
847 	 complain_overflow_dont, /* complain_on_overflow */
848 	 ppc_elf_unhandled_reloc, /* special_function */
849 	 "R_PPC_DTPREL16_LO",	/* name */
850 	 FALSE,			/* partial_inplace */
851 	 0,			/* src_mask */
852 	 0xffff,		/* dst_mask */
853 	 FALSE),		/* pcrel_offset */
854 
855   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
856   HOWTO (R_PPC_DTPREL16_HI,
857 	 16,			/* rightshift */
858 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
859 	 16,			/* bitsize */
860 	 FALSE,			/* pc_relative */
861 	 0,			/* bitpos */
862 	 complain_overflow_dont, /* complain_on_overflow */
863 	 ppc_elf_unhandled_reloc, /* special_function */
864 	 "R_PPC_DTPREL16_HI",	/* name */
865 	 FALSE,			/* partial_inplace */
866 	 0,			/* src_mask */
867 	 0xffff,		/* dst_mask */
868 	 FALSE),		/* pcrel_offset */
869 
870   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
871   HOWTO (R_PPC_DTPREL16_HA,
872 	 16,			/* rightshift */
873 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
874 	 16,			/* bitsize */
875 	 FALSE,			/* pc_relative */
876 	 0,			/* bitpos */
877 	 complain_overflow_dont, /* complain_on_overflow */
878 	 ppc_elf_unhandled_reloc, /* special_function */
879 	 "R_PPC_DTPREL16_HA",	/* name */
880 	 FALSE,			/* partial_inplace */
881 	 0,			/* src_mask */
882 	 0xffff,		/* dst_mask */
883 	 FALSE),		/* pcrel_offset */
884 
885   /* Computes a tp-relative displacement, the difference between the value of
886      sym+add and the value of the thread pointer (r13).  */
887   HOWTO (R_PPC_TPREL32,
888 	 0,			/* rightshift */
889 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
890 	 32,			/* bitsize */
891 	 FALSE,			/* pc_relative */
892 	 0,			/* bitpos */
893 	 complain_overflow_dont, /* complain_on_overflow */
894 	 ppc_elf_unhandled_reloc, /* special_function */
895 	 "R_PPC_TPREL32",	/* name */
896 	 FALSE,			/* partial_inplace */
897 	 0,			/* src_mask */
898 	 0xffffffff,		/* dst_mask */
899 	 FALSE),		/* pcrel_offset */
900 
901   /* A 16 bit tprel reloc.  */
902   HOWTO (R_PPC_TPREL16,
903 	 0,			/* rightshift */
904 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
905 	 16,			/* bitsize */
906 	 FALSE,			/* pc_relative */
907 	 0,			/* bitpos */
908 	 complain_overflow_signed, /* complain_on_overflow */
909 	 ppc_elf_unhandled_reloc, /* special_function */
910 	 "R_PPC_TPREL16",	/* name */
911 	 FALSE,			/* partial_inplace */
912 	 0,			/* src_mask */
913 	 0xffff,		/* dst_mask */
914 	 FALSE),		/* pcrel_offset */
915 
916   /* Like TPREL16, but no overflow.  */
917   HOWTO (R_PPC_TPREL16_LO,
918 	 0,			/* rightshift */
919 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
920 	 16,			/* bitsize */
921 	 FALSE,			/* pc_relative */
922 	 0,			/* bitpos */
923 	 complain_overflow_dont, /* complain_on_overflow */
924 	 ppc_elf_unhandled_reloc, /* special_function */
925 	 "R_PPC_TPREL16_LO",	/* name */
926 	 FALSE,			/* partial_inplace */
927 	 0,			/* src_mask */
928 	 0xffff,		/* dst_mask */
929 	 FALSE),		/* pcrel_offset */
930 
931   /* Like TPREL16_LO, but next higher group of 16 bits.  */
932   HOWTO (R_PPC_TPREL16_HI,
933 	 16,			/* rightshift */
934 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
935 	 16,			/* bitsize */
936 	 FALSE,			/* pc_relative */
937 	 0,			/* bitpos */
938 	 complain_overflow_dont, /* complain_on_overflow */
939 	 ppc_elf_unhandled_reloc, /* special_function */
940 	 "R_PPC_TPREL16_HI",	/* name */
941 	 FALSE,			/* partial_inplace */
942 	 0,			/* src_mask */
943 	 0xffff,		/* dst_mask */
944 	 FALSE),		/* pcrel_offset */
945 
946   /* Like TPREL16_HI, but adjust for low 16 bits.  */
947   HOWTO (R_PPC_TPREL16_HA,
948 	 16,			/* rightshift */
949 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
950 	 16,			/* bitsize */
951 	 FALSE,			/* pc_relative */
952 	 0,			/* bitpos */
953 	 complain_overflow_dont, /* complain_on_overflow */
954 	 ppc_elf_unhandled_reloc, /* special_function */
955 	 "R_PPC_TPREL16_HA",	/* name */
956 	 FALSE,			/* partial_inplace */
957 	 0,			/* src_mask */
958 	 0xffff,		/* dst_mask */
959 	 FALSE),		/* pcrel_offset */
960 
961   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
962      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
963      to the first entry.  */
964   HOWTO (R_PPC_GOT_TLSGD16,
965 	 0,			/* rightshift */
966 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
967 	 16,			/* bitsize */
968 	 FALSE,			/* pc_relative */
969 	 0,			/* bitpos */
970 	 complain_overflow_signed, /* complain_on_overflow */
971 	 ppc_elf_unhandled_reloc, /* special_function */
972 	 "R_PPC_GOT_TLSGD16",	/* name */
973 	 FALSE,			/* partial_inplace */
974 	 0,			/* src_mask */
975 	 0xffff,		/* dst_mask */
976 	 FALSE),		/* pcrel_offset */
977 
978   /* Like GOT_TLSGD16, but no overflow.  */
979   HOWTO (R_PPC_GOT_TLSGD16_LO,
980 	 0,			/* rightshift */
981 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
982 	 16,			/* bitsize */
983 	 FALSE,			/* pc_relative */
984 	 0,			/* bitpos */
985 	 complain_overflow_dont, /* complain_on_overflow */
986 	 ppc_elf_unhandled_reloc, /* special_function */
987 	 "R_PPC_GOT_TLSGD16_LO", /* name */
988 	 FALSE,			/* partial_inplace */
989 	 0,			/* src_mask */
990 	 0xffff,		/* dst_mask */
991 	 FALSE),		/* pcrel_offset */
992 
993   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
994   HOWTO (R_PPC_GOT_TLSGD16_HI,
995 	 16,			/* rightshift */
996 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
997 	 16,			/* bitsize */
998 	 FALSE,			/* pc_relative */
999 	 0,			/* bitpos */
1000 	 complain_overflow_dont, /* complain_on_overflow */
1001 	 ppc_elf_unhandled_reloc, /* special_function */
1002 	 "R_PPC_GOT_TLSGD16_HI", /* name */
1003 	 FALSE,			/* partial_inplace */
1004 	 0,			/* src_mask */
1005 	 0xffff,		/* dst_mask */
1006 	 FALSE),		/* pcrel_offset */
1007 
1008   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1009   HOWTO (R_PPC_GOT_TLSGD16_HA,
1010 	 16,			/* rightshift */
1011 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1012 	 16,			/* bitsize */
1013 	 FALSE,			/* pc_relative */
1014 	 0,			/* bitpos */
1015 	 complain_overflow_dont, /* complain_on_overflow */
1016 	 ppc_elf_unhandled_reloc, /* special_function */
1017 	 "R_PPC_GOT_TLSGD16_HA", /* name */
1018 	 FALSE,			/* partial_inplace */
1019 	 0,			/* src_mask */
1020 	 0xffff,		/* dst_mask */
1021 	 FALSE),		/* pcrel_offset */
1022 
1023   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1024      with values (sym+add)@dtpmod and zero, and computes the offset to the
1025      first entry.  */
1026   HOWTO (R_PPC_GOT_TLSLD16,
1027 	 0,			/* rightshift */
1028 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1029 	 16,			/* bitsize */
1030 	 FALSE,			/* pc_relative */
1031 	 0,			/* bitpos */
1032 	 complain_overflow_signed, /* complain_on_overflow */
1033 	 ppc_elf_unhandled_reloc, /* special_function */
1034 	 "R_PPC_GOT_TLSLD16",	/* name */
1035 	 FALSE,			/* partial_inplace */
1036 	 0,			/* src_mask */
1037 	 0xffff,		/* dst_mask */
1038 	 FALSE),		/* pcrel_offset */
1039 
1040   /* Like GOT_TLSLD16, but no overflow.  */
1041   HOWTO (R_PPC_GOT_TLSLD16_LO,
1042 	 0,			/* rightshift */
1043 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1044 	 16,			/* bitsize */
1045 	 FALSE,			/* pc_relative */
1046 	 0,			/* bitpos */
1047 	 complain_overflow_dont, /* complain_on_overflow */
1048 	 ppc_elf_unhandled_reloc, /* special_function */
1049 	 "R_PPC_GOT_TLSLD16_LO", /* name */
1050 	 FALSE,			/* partial_inplace */
1051 	 0,			/* src_mask */
1052 	 0xffff,		/* dst_mask */
1053 	 FALSE),		/* pcrel_offset */
1054 
1055   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1056   HOWTO (R_PPC_GOT_TLSLD16_HI,
1057 	 16,			/* rightshift */
1058 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1059 	 16,			/* bitsize */
1060 	 FALSE,			/* pc_relative */
1061 	 0,			/* bitpos */
1062 	 complain_overflow_dont, /* complain_on_overflow */
1063 	 ppc_elf_unhandled_reloc, /* special_function */
1064 	 "R_PPC_GOT_TLSLD16_HI", /* name */
1065 	 FALSE,			/* partial_inplace */
1066 	 0,			/* src_mask */
1067 	 0xffff,		/* dst_mask */
1068 	 FALSE),		/* pcrel_offset */
1069 
1070   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1071   HOWTO (R_PPC_GOT_TLSLD16_HA,
1072 	 16,			/* rightshift */
1073 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1074 	 16,			/* bitsize */
1075 	 FALSE,			/* pc_relative */
1076 	 0,			/* bitpos */
1077 	 complain_overflow_dont, /* complain_on_overflow */
1078 	 ppc_elf_unhandled_reloc, /* special_function */
1079 	 "R_PPC_GOT_TLSLD16_HA", /* name */
1080 	 FALSE,			/* partial_inplace */
1081 	 0,			/* src_mask */
1082 	 0xffff,		/* dst_mask */
1083 	 FALSE),		/* pcrel_offset */
1084 
1085   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1086      the offset to the entry.  */
1087   HOWTO (R_PPC_GOT_DTPREL16,
1088 	 0,			/* rightshift */
1089 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1090 	 16,			/* bitsize */
1091 	 FALSE,			/* pc_relative */
1092 	 0,			/* bitpos */
1093 	 complain_overflow_signed, /* complain_on_overflow */
1094 	 ppc_elf_unhandled_reloc, /* special_function */
1095 	 "R_PPC_GOT_DTPREL16",	/* name */
1096 	 FALSE,			/* partial_inplace */
1097 	 0,			/* src_mask */
1098 	 0xffff,		/* dst_mask */
1099 	 FALSE),		/* pcrel_offset */
1100 
1101   /* Like GOT_DTPREL16, but no overflow.  */
1102   HOWTO (R_PPC_GOT_DTPREL16_LO,
1103 	 0,			/* rightshift */
1104 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1105 	 16,			/* bitsize */
1106 	 FALSE,			/* pc_relative */
1107 	 0,			/* bitpos */
1108 	 complain_overflow_dont, /* complain_on_overflow */
1109 	 ppc_elf_unhandled_reloc, /* special_function */
1110 	 "R_PPC_GOT_DTPREL16_LO", /* name */
1111 	 FALSE,			/* partial_inplace */
1112 	 0,			/* src_mask */
1113 	 0xffff,		/* dst_mask */
1114 	 FALSE),		/* pcrel_offset */
1115 
1116   /* Like GOT_DTPREL16_LO, but next higher group of 16 bits.  */
1117   HOWTO (R_PPC_GOT_DTPREL16_HI,
1118 	 16,			/* rightshift */
1119 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1120 	 16,			/* bitsize */
1121 	 FALSE,			/* pc_relative */
1122 	 0,			/* bitpos */
1123 	 complain_overflow_dont, /* complain_on_overflow */
1124 	 ppc_elf_unhandled_reloc, /* special_function */
1125 	 "R_PPC_GOT_DTPREL16_HI", /* name */
1126 	 FALSE,			/* partial_inplace */
1127 	 0,			/* src_mask */
1128 	 0xffff,		/* dst_mask */
1129 	 FALSE),		/* pcrel_offset */
1130 
1131   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1132   HOWTO (R_PPC_GOT_DTPREL16_HA,
1133 	 16,			/* rightshift */
1134 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1135 	 16,			/* bitsize */
1136 	 FALSE,			/* pc_relative */
1137 	 0,			/* bitpos */
1138 	 complain_overflow_dont, /* complain_on_overflow */
1139 	 ppc_elf_unhandled_reloc, /* special_function */
1140 	 "R_PPC_GOT_DTPREL16_HA", /* name */
1141 	 FALSE,			/* partial_inplace */
1142 	 0,			/* src_mask */
1143 	 0xffff,		/* dst_mask */
1144 	 FALSE),		/* pcrel_offset */
1145 
1146   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1147      offset to the entry.  */
1148   HOWTO (R_PPC_GOT_TPREL16,
1149 	 0,			/* rightshift */
1150 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1151 	 16,			/* bitsize */
1152 	 FALSE,			/* pc_relative */
1153 	 0,			/* bitpos */
1154 	 complain_overflow_signed, /* complain_on_overflow */
1155 	 ppc_elf_unhandled_reloc, /* special_function */
1156 	 "R_PPC_GOT_TPREL16",	/* name */
1157 	 FALSE,			/* partial_inplace */
1158 	 0,			/* src_mask */
1159 	 0xffff,		/* dst_mask */
1160 	 FALSE),		/* pcrel_offset */
1161 
1162   /* Like GOT_TPREL16, but no overflow.  */
1163   HOWTO (R_PPC_GOT_TPREL16_LO,
1164 	 0,			/* rightshift */
1165 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1166 	 16,			/* bitsize */
1167 	 FALSE,			/* pc_relative */
1168 	 0,			/* bitpos */
1169 	 complain_overflow_dont, /* complain_on_overflow */
1170 	 ppc_elf_unhandled_reloc, /* special_function */
1171 	 "R_PPC_GOT_TPREL16_LO", /* name */
1172 	 FALSE,			/* partial_inplace */
1173 	 0,			/* src_mask */
1174 	 0xffff,		/* dst_mask */
1175 	 FALSE),		/* pcrel_offset */
1176 
1177   /* Like GOT_TPREL16_LO, but next higher group of 16 bits.  */
1178   HOWTO (R_PPC_GOT_TPREL16_HI,
1179 	 16,			/* rightshift */
1180 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1181 	 16,			/* bitsize */
1182 	 FALSE,			/* pc_relative */
1183 	 0,			/* bitpos */
1184 	 complain_overflow_dont, /* complain_on_overflow */
1185 	 ppc_elf_unhandled_reloc, /* special_function */
1186 	 "R_PPC_GOT_TPREL16_HI", /* name */
1187 	 FALSE,			/* partial_inplace */
1188 	 0,			/* src_mask */
1189 	 0xffff,		/* dst_mask */
1190 	 FALSE),		/* pcrel_offset */
1191 
1192   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1193   HOWTO (R_PPC_GOT_TPREL16_HA,
1194 	 16,			/* rightshift */
1195 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1196 	 16,			/* bitsize */
1197 	 FALSE,			/* pc_relative */
1198 	 0,			/* bitpos */
1199 	 complain_overflow_dont, /* complain_on_overflow */
1200 	 ppc_elf_unhandled_reloc, /* special_function */
1201 	 "R_PPC_GOT_TPREL16_HA", /* name */
1202 	 FALSE,			/* partial_inplace */
1203 	 0,			/* src_mask */
1204 	 0xffff,		/* dst_mask */
1205 	 FALSE),		/* pcrel_offset */
1206 
1207   /* The remaining relocs are from the Embedded ELF ABI, and are not
1208      in the SVR4 ELF ABI.  */
1209 
1210   /* 32 bit value resulting from the addend minus the symbol.  */
1211   HOWTO (R_PPC_EMB_NADDR32,	/* type */
1212 	 0,			/* rightshift */
1213 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1214 	 32,			/* bitsize */
1215 	 FALSE,			/* pc_relative */
1216 	 0,			/* bitpos */
1217 	 complain_overflow_bitfield, /* complain_on_overflow */
1218 	 bfd_elf_generic_reloc,	/* special_function */
1219 	 "R_PPC_EMB_NADDR32",	/* name */
1220 	 FALSE,			/* partial_inplace */
1221 	 0,			/* src_mask */
1222 	 0xffffffff,		/* dst_mask */
1223 	 FALSE),		/* pcrel_offset */
1224 
1225   /* 16 bit value resulting from the addend minus the symbol.  */
1226   HOWTO (R_PPC_EMB_NADDR16,	/* type */
1227 	 0,			/* rightshift */
1228 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1229 	 16,			/* bitsize */
1230 	 FALSE,			/* pc_relative */
1231 	 0,			/* bitpos */
1232 	 complain_overflow_bitfield, /* complain_on_overflow */
1233 	 bfd_elf_generic_reloc,	/* special_function */
1234 	 "R_PPC_EMB_NADDR16",	/* name */
1235 	 FALSE,			/* partial_inplace */
1236 	 0,			/* src_mask */
1237 	 0xffff,		/* dst_mask */
1238 	 FALSE),		/* pcrel_offset */
1239 
1240   /* 16 bit value resulting from the addend minus the symbol.  */
1241   HOWTO (R_PPC_EMB_NADDR16_LO,	/* type */
1242 	 0,			/* rightshift */
1243 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1244 	 16,			/* bitsize */
1245 	 FALSE,			/* pc_relative */
1246 	 0,			/* bitpos */
1247 	 complain_overflow_dont,/* complain_on_overflow */
1248 	 bfd_elf_generic_reloc,	/* special_function */
1249 	 "R_PPC_EMB_ADDR16_LO",	/* name */
1250 	 FALSE,			/* partial_inplace */
1251 	 0,			/* src_mask */
1252 	 0xffff,		/* dst_mask */
1253 	 FALSE),		/* pcrel_offset */
1254 
1255   /* The high order 16 bits of the addend minus the symbol.  */
1256   HOWTO (R_PPC_EMB_NADDR16_HI,	/* type */
1257 	 16,			/* rightshift */
1258 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1259 	 16,			/* bitsize */
1260 	 FALSE,			/* pc_relative */
1261 	 0,			/* bitpos */
1262 	 complain_overflow_dont, /* complain_on_overflow */
1263 	 bfd_elf_generic_reloc,	/* special_function */
1264 	 "R_PPC_EMB_NADDR16_HI", /* name */
1265 	 FALSE,			/* partial_inplace */
1266 	 0,			/* src_mask */
1267 	 0xffff,		/* dst_mask */
1268 	 FALSE),		/* pcrel_offset */
1269 
1270   /* The high order 16 bits of the result of the addend minus the address,
1271      plus 1 if the contents of the low 16 bits, treated as a signed number,
1272      is negative.  */
1273   HOWTO (R_PPC_EMB_NADDR16_HA,	/* type */
1274 	 16,			/* rightshift */
1275 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1276 	 16,			/* bitsize */
1277 	 FALSE,			/* pc_relative */
1278 	 0,			/* bitpos */
1279 	 complain_overflow_dont, /* complain_on_overflow */
1280 	 ppc_elf_addr16_ha_reloc, /* special_function */
1281 	 "R_PPC_EMB_NADDR16_HA", /* name */
1282 	 FALSE,			/* partial_inplace */
1283 	 0,			/* src_mask */
1284 	 0xffff,		/* dst_mask */
1285 	 FALSE),		/* pcrel_offset */
1286 
1287   /* 16 bit value resulting from allocating a 4 byte word to hold an
1288      address in the .sdata section, and returning the offset from
1289      _SDA_BASE_ for that relocation.  */
1290   HOWTO (R_PPC_EMB_SDAI16,	/* type */
1291 	 0,			/* rightshift */
1292 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1293 	 16,			/* bitsize */
1294 	 FALSE,			/* pc_relative */
1295 	 0,			/* bitpos */
1296 	 complain_overflow_bitfield, /* complain_on_overflow */
1297 	 bfd_elf_generic_reloc,	/* special_function */
1298 	 "R_PPC_EMB_SDAI16",	/* name */
1299 	 FALSE,			/* partial_inplace */
1300 	 0,			/* src_mask */
1301 	 0xffff,		/* dst_mask */
1302 	 FALSE),		/* pcrel_offset */
1303 
1304   /* 16 bit value resulting from allocating a 4 byte word to hold an
1305      address in the .sdata2 section, and returning the offset from
1306      _SDA2_BASE_ for that relocation.  */
1307   HOWTO (R_PPC_EMB_SDA2I16,	/* type */
1308 	 0,			/* rightshift */
1309 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1310 	 16,			/* bitsize */
1311 	 FALSE,			/* pc_relative */
1312 	 0,			/* bitpos */
1313 	 complain_overflow_bitfield, /* complain_on_overflow */
1314 	 bfd_elf_generic_reloc,	/* special_function */
1315 	 "R_PPC_EMB_SDA2I16",	/* name */
1316 	 FALSE,			/* partial_inplace */
1317 	 0,			/* src_mask */
1318 	 0xffff,		/* dst_mask */
1319 	 FALSE),		/* pcrel_offset */
1320 
1321   /* A sign-extended 16 bit value relative to _SDA2_BASE_, for use with
1322      small data items.	 */
1323   HOWTO (R_PPC_EMB_SDA2REL,	/* type */
1324 	 0,			/* rightshift */
1325 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1326 	 16,			/* bitsize */
1327 	 FALSE,			/* pc_relative */
1328 	 0,			/* bitpos */
1329 	 complain_overflow_signed, /* complain_on_overflow */
1330 	 bfd_elf_generic_reloc,	/* special_function */
1331 	 "R_PPC_EMB_SDA2REL",	/* name */
1332 	 FALSE,			/* partial_inplace */
1333 	 0,			/* src_mask */
1334 	 0xffff,		/* dst_mask */
1335 	 FALSE),		/* pcrel_offset */
1336 
1337   /* Relocate against either _SDA_BASE_ or _SDA2_BASE_, filling in the 16 bit
1338      signed offset from the appropriate base, and filling in the register
1339      field with the appropriate register (0, 2, or 13).  */
1340   HOWTO (R_PPC_EMB_SDA21,	/* type */
1341 	 0,			/* rightshift */
1342 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1343 	 16,			/* bitsize */
1344 	 FALSE,			/* pc_relative */
1345 	 0,			/* bitpos */
1346 	 complain_overflow_signed, /* complain_on_overflow */
1347 	 bfd_elf_generic_reloc,	/* special_function */
1348 	 "R_PPC_EMB_SDA21",	/* name */
1349 	 FALSE,			/* partial_inplace */
1350 	 0,			/* src_mask */
1351 	 0xffff,		/* dst_mask */
1352 	 FALSE),		/* pcrel_offset */
1353 
1354   /* Relocation not handled: R_PPC_EMB_MRKREF */
1355   /* Relocation not handled: R_PPC_EMB_RELSEC16 */
1356   /* Relocation not handled: R_PPC_EMB_RELST_LO */
1357   /* Relocation not handled: R_PPC_EMB_RELST_HI */
1358   /* Relocation not handled: R_PPC_EMB_RELST_HA */
1359   /* Relocation not handled: R_PPC_EMB_BIT_FLD */
1360 
1361   /* PC relative relocation against either _SDA_BASE_ or _SDA2_BASE_, filling
1362      in the 16 bit signed offset from the appropriate base, and filling in the
1363      register field with the appropriate register (0, 2, or 13).  */
1364   HOWTO (R_PPC_EMB_RELSDA,	/* type */
1365 	 0,			/* rightshift */
1366 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1367 	 16,			/* bitsize */
1368 	 TRUE,			/* pc_relative */
1369 	 0,			/* bitpos */
1370 	 complain_overflow_signed, /* complain_on_overflow */
1371 	 bfd_elf_generic_reloc,	/* special_function */
1372 	 "R_PPC_EMB_RELSDA",	/* name */
1373 	 FALSE,			/* partial_inplace */
1374 	 0,			/* src_mask */
1375 	 0xffff,		/* dst_mask */
1376 	 FALSE),		/* pcrel_offset */
1377 
1378   /* A 16 bit relative relocation.  */
1379   HOWTO (R_PPC_REL16,		/* type */
1380 	 0,			/* rightshift */
1381 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1382 	 16,			/* bitsize */
1383 	 TRUE,			/* pc_relative */
1384 	 0,			/* bitpos */
1385 	 complain_overflow_bitfield, /* complain_on_overflow */
1386 	 bfd_elf_generic_reloc,	/* special_function */
1387 	 "R_PPC_REL16",		/* name */
1388 	 FALSE,			/* partial_inplace */
1389 	 0,			/* src_mask */
1390 	 0xffff,		/* dst_mask */
1391 	 TRUE),			/* pcrel_offset */
1392 
1393   /* A 16 bit relative relocation without overflow.  */
1394   HOWTO (R_PPC_REL16_LO,	/* type */
1395 	 0,			/* rightshift */
1396 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1397 	 16,			/* bitsize */
1398 	 TRUE,			/* pc_relative */
1399 	 0,			/* bitpos */
1400 	 complain_overflow_dont,/* complain_on_overflow */
1401 	 bfd_elf_generic_reloc,	/* special_function */
1402 	 "R_PPC_REL16_LO",	/* name */
1403 	 FALSE,			/* partial_inplace */
1404 	 0,			/* src_mask */
1405 	 0xffff,		/* dst_mask */
1406 	 TRUE),			/* pcrel_offset */
1407 
1408   /* The high order 16 bits of a relative address.  */
1409   HOWTO (R_PPC_REL16_HI,	/* type */
1410 	 16,			/* rightshift */
1411 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1412 	 16,			/* bitsize */
1413 	 TRUE,			/* pc_relative */
1414 	 0,			/* bitpos */
1415 	 complain_overflow_dont, /* complain_on_overflow */
1416 	 bfd_elf_generic_reloc,	/* special_function */
1417 	 "R_PPC_REL16_HI",	/* name */
1418 	 FALSE,			/* partial_inplace */
1419 	 0,			/* src_mask */
1420 	 0xffff,		/* dst_mask */
1421 	 TRUE),			/* pcrel_offset */
1422 
1423   /* The high order 16 bits of a relative address, plus 1 if the contents of
1424      the low 16 bits, treated as a signed number, is negative.  */
1425   HOWTO (R_PPC_REL16_HA,	/* type */
1426 	 16,			/* rightshift */
1427 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1428 	 16,			/* bitsize */
1429 	 TRUE,			/* pc_relative */
1430 	 0,			/* bitpos */
1431 	 complain_overflow_dont, /* complain_on_overflow */
1432 	 ppc_elf_addr16_ha_reloc, /* special_function */
1433 	 "R_PPC_REL16_HA",	/* name */
1434 	 FALSE,			/* partial_inplace */
1435 	 0,			/* src_mask */
1436 	 0xffff,		/* dst_mask */
1437 	 TRUE),			/* pcrel_offset */
1438 
1439   /* GNU extension to record C++ vtable hierarchy.  */
1440   HOWTO (R_PPC_GNU_VTINHERIT,	/* type */
1441 	 0,			/* rightshift */
1442 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1443 	 0,			/* bitsize */
1444 	 FALSE,			/* pc_relative */
1445 	 0,			/* bitpos */
1446 	 complain_overflow_dont, /* complain_on_overflow */
1447 	 NULL,			/* special_function */
1448 	 "R_PPC_GNU_VTINHERIT",	/* name */
1449 	 FALSE,			/* partial_inplace */
1450 	 0,			/* src_mask */
1451 	 0,			/* dst_mask */
1452 	 FALSE),		/* pcrel_offset */
1453 
1454   /* GNU extension to record C++ vtable member usage.  */
1455   HOWTO (R_PPC_GNU_VTENTRY,	/* type */
1456 	 0,			/* rightshift */
1457 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1458 	 0,			/* bitsize */
1459 	 FALSE,			/* pc_relative */
1460 	 0,			/* bitpos */
1461 	 complain_overflow_dont, /* complain_on_overflow */
1462 	 NULL,			/* special_function */
1463 	 "R_PPC_GNU_VTENTRY",	/* name */
1464 	 FALSE,			/* partial_inplace */
1465 	 0,			/* src_mask */
1466 	 0,			/* dst_mask */
1467 	 FALSE),		/* pcrel_offset */
1468 
1469   /* Phony reloc to handle AIX style TOC entries.  */
1470   HOWTO (R_PPC_TOC16,		/* type */
1471 	 0,			/* rightshift */
1472 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1473 	 16,			/* bitsize */
1474 	 FALSE,			/* pc_relative */
1475 	 0,			/* bitpos */
1476 	 complain_overflow_signed, /* complain_on_overflow */
1477 	 bfd_elf_generic_reloc,	/* special_function */
1478 	 "R_PPC_TOC16",		/* name */
1479 	 FALSE,			/* partial_inplace */
1480 	 0,			/* src_mask */
1481 	 0xffff,		/* dst_mask */
1482 	 FALSE),		/* pcrel_offset */
1483 };
1484 
1485 /* Initialize the ppc_elf_howto_table, so that linear accesses can be done.  */
1486 
1487 static void
ppc_elf_howto_init(void)1488 ppc_elf_howto_init (void)
1489 {
1490   unsigned int i, type;
1491 
1492   for (i = 0;
1493        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1494        i++)
1495     {
1496       type = ppc_elf_howto_raw[i].type;
1497       if (type >= (sizeof (ppc_elf_howto_table)
1498 		   / sizeof (ppc_elf_howto_table[0])))
1499 	abort ();
1500       ppc_elf_howto_table[type] = &ppc_elf_howto_raw[i];
1501     }
1502 }
1503 
1504 static reloc_howto_type *
ppc_elf_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)1505 ppc_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1506 			   bfd_reloc_code_real_type code)
1507 {
1508   enum elf_ppc_reloc_type r;
1509 
1510   /* Initialize howto table if not already done.  */
1511   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1512     ppc_elf_howto_init ();
1513 
1514   switch (code)
1515     {
1516     default:
1517       return NULL;
1518 
1519     case BFD_RELOC_NONE:		r = R_PPC_NONE;			break;
1520     case BFD_RELOC_32:			r = R_PPC_ADDR32;		break;
1521     case BFD_RELOC_PPC_BA26:		r = R_PPC_ADDR24;		break;
1522     case BFD_RELOC_16:			r = R_PPC_ADDR16;		break;
1523     case BFD_RELOC_LO16:		r = R_PPC_ADDR16_LO;		break;
1524     case BFD_RELOC_HI16:		r = R_PPC_ADDR16_HI;		break;
1525     case BFD_RELOC_HI16_S:		r = R_PPC_ADDR16_HA;		break;
1526     case BFD_RELOC_PPC_BA16:		r = R_PPC_ADDR14;		break;
1527     case BFD_RELOC_PPC_BA16_BRTAKEN:	r = R_PPC_ADDR14_BRTAKEN;	break;
1528     case BFD_RELOC_PPC_BA16_BRNTAKEN:	r = R_PPC_ADDR14_BRNTAKEN;	break;
1529     case BFD_RELOC_PPC_B26:		r = R_PPC_REL24;		break;
1530     case BFD_RELOC_PPC_B16:		r = R_PPC_REL14;		break;
1531     case BFD_RELOC_PPC_B16_BRTAKEN:	r = R_PPC_REL14_BRTAKEN;	break;
1532     case BFD_RELOC_PPC_B16_BRNTAKEN:	r = R_PPC_REL14_BRNTAKEN;	break;
1533     case BFD_RELOC_16_GOTOFF:		r = R_PPC_GOT16;		break;
1534     case BFD_RELOC_LO16_GOTOFF:		r = R_PPC_GOT16_LO;		break;
1535     case BFD_RELOC_HI16_GOTOFF:		r = R_PPC_GOT16_HI;		break;
1536     case BFD_RELOC_HI16_S_GOTOFF:	r = R_PPC_GOT16_HA;		break;
1537     case BFD_RELOC_24_PLT_PCREL:	r = R_PPC_PLTREL24;		break;
1538     case BFD_RELOC_PPC_COPY:		r = R_PPC_COPY;			break;
1539     case BFD_RELOC_PPC_GLOB_DAT:	r = R_PPC_GLOB_DAT;		break;
1540     case BFD_RELOC_PPC_LOCAL24PC:	r = R_PPC_LOCAL24PC;		break;
1541     case BFD_RELOC_32_PCREL:		r = R_PPC_REL32;		break;
1542     case BFD_RELOC_32_PLTOFF:		r = R_PPC_PLT32;		break;
1543     case BFD_RELOC_32_PLT_PCREL:	r = R_PPC_PLTREL32;		break;
1544     case BFD_RELOC_LO16_PLTOFF:		r = R_PPC_PLT16_LO;		break;
1545     case BFD_RELOC_HI16_PLTOFF:		r = R_PPC_PLT16_HI;		break;
1546     case BFD_RELOC_HI16_S_PLTOFF:	r = R_PPC_PLT16_HA;		break;
1547     case BFD_RELOC_GPREL16:		r = R_PPC_SDAREL16;		break;
1548     case BFD_RELOC_16_BASEREL:		r = R_PPC_SECTOFF;		break;
1549     case BFD_RELOC_LO16_BASEREL:	r = R_PPC_SECTOFF_LO;		break;
1550     case BFD_RELOC_HI16_BASEREL:	r = R_PPC_SECTOFF_HI;		break;
1551     case BFD_RELOC_HI16_S_BASEREL:	r = R_PPC_SECTOFF_HA;		break;
1552     case BFD_RELOC_CTOR:		r = R_PPC_ADDR32;		break;
1553     case BFD_RELOC_PPC_TOC16:		r = R_PPC_TOC16;		break;
1554     case BFD_RELOC_PPC_TLS:		r = R_PPC_TLS;			break;
1555     case BFD_RELOC_PPC_TLSGD:		r = R_PPC_TLSGD;		break;
1556     case BFD_RELOC_PPC_TLSLD:		r = R_PPC_TLSLD;		break;
1557     case BFD_RELOC_PPC_DTPMOD:		r = R_PPC_DTPMOD32;		break;
1558     case BFD_RELOC_PPC_TPREL16:		r = R_PPC_TPREL16;		break;
1559     case BFD_RELOC_PPC_TPREL16_LO:	r = R_PPC_TPREL16_LO;		break;
1560     case BFD_RELOC_PPC_TPREL16_HI:	r = R_PPC_TPREL16_HI;		break;
1561     case BFD_RELOC_PPC_TPREL16_HA:	r = R_PPC_TPREL16_HA;		break;
1562     case BFD_RELOC_PPC_TPREL:		r = R_PPC_TPREL32;		break;
1563     case BFD_RELOC_PPC_DTPREL16:	r = R_PPC_DTPREL16;		break;
1564     case BFD_RELOC_PPC_DTPREL16_LO:	r = R_PPC_DTPREL16_LO;		break;
1565     case BFD_RELOC_PPC_DTPREL16_HI:	r = R_PPC_DTPREL16_HI;		break;
1566     case BFD_RELOC_PPC_DTPREL16_HA:	r = R_PPC_DTPREL16_HA;		break;
1567     case BFD_RELOC_PPC_DTPREL:		r = R_PPC_DTPREL32;		break;
1568     case BFD_RELOC_PPC_GOT_TLSGD16:	r = R_PPC_GOT_TLSGD16;		break;
1569     case BFD_RELOC_PPC_GOT_TLSGD16_LO:	r = R_PPC_GOT_TLSGD16_LO;	break;
1570     case BFD_RELOC_PPC_GOT_TLSGD16_HI:	r = R_PPC_GOT_TLSGD16_HI;	break;
1571     case BFD_RELOC_PPC_GOT_TLSGD16_HA:	r = R_PPC_GOT_TLSGD16_HA;	break;
1572     case BFD_RELOC_PPC_GOT_TLSLD16:	r = R_PPC_GOT_TLSLD16;		break;
1573     case BFD_RELOC_PPC_GOT_TLSLD16_LO:	r = R_PPC_GOT_TLSLD16_LO;	break;
1574     case BFD_RELOC_PPC_GOT_TLSLD16_HI:	r = R_PPC_GOT_TLSLD16_HI;	break;
1575     case BFD_RELOC_PPC_GOT_TLSLD16_HA:	r = R_PPC_GOT_TLSLD16_HA;	break;
1576     case BFD_RELOC_PPC_GOT_TPREL16:	r = R_PPC_GOT_TPREL16;		break;
1577     case BFD_RELOC_PPC_GOT_TPREL16_LO:	r = R_PPC_GOT_TPREL16_LO;	break;
1578     case BFD_RELOC_PPC_GOT_TPREL16_HI:	r = R_PPC_GOT_TPREL16_HI;	break;
1579     case BFD_RELOC_PPC_GOT_TPREL16_HA:	r = R_PPC_GOT_TPREL16_HA;	break;
1580     case BFD_RELOC_PPC_GOT_DTPREL16:	r = R_PPC_GOT_DTPREL16;		break;
1581     case BFD_RELOC_PPC_GOT_DTPREL16_LO:	r = R_PPC_GOT_DTPREL16_LO;	break;
1582     case BFD_RELOC_PPC_GOT_DTPREL16_HI:	r = R_PPC_GOT_DTPREL16_HI;	break;
1583     case BFD_RELOC_PPC_GOT_DTPREL16_HA:	r = R_PPC_GOT_DTPREL16_HA;	break;
1584     case BFD_RELOC_PPC_EMB_NADDR32:	r = R_PPC_EMB_NADDR32;		break;
1585     case BFD_RELOC_PPC_EMB_NADDR16:	r = R_PPC_EMB_NADDR16;		break;
1586     case BFD_RELOC_PPC_EMB_NADDR16_LO:	r = R_PPC_EMB_NADDR16_LO;	break;
1587     case BFD_RELOC_PPC_EMB_NADDR16_HI:	r = R_PPC_EMB_NADDR16_HI;	break;
1588     case BFD_RELOC_PPC_EMB_NADDR16_HA:	r = R_PPC_EMB_NADDR16_HA;	break;
1589     case BFD_RELOC_PPC_EMB_SDAI16:	r = R_PPC_EMB_SDAI16;		break;
1590     case BFD_RELOC_PPC_EMB_SDA2I16:	r = R_PPC_EMB_SDA2I16;		break;
1591     case BFD_RELOC_PPC_EMB_SDA2REL:	r = R_PPC_EMB_SDA2REL;		break;
1592     case BFD_RELOC_PPC_EMB_SDA21:	r = R_PPC_EMB_SDA21;		break;
1593     case BFD_RELOC_PPC_EMB_MRKREF:	r = R_PPC_EMB_MRKREF;		break;
1594     case BFD_RELOC_PPC_EMB_RELSEC16:	r = R_PPC_EMB_RELSEC16;		break;
1595     case BFD_RELOC_PPC_EMB_RELST_LO:	r = R_PPC_EMB_RELST_LO;		break;
1596     case BFD_RELOC_PPC_EMB_RELST_HI:	r = R_PPC_EMB_RELST_HI;		break;
1597     case BFD_RELOC_PPC_EMB_RELST_HA:	r = R_PPC_EMB_RELST_HA;		break;
1598     case BFD_RELOC_PPC_EMB_BIT_FLD:	r = R_PPC_EMB_BIT_FLD;		break;
1599     case BFD_RELOC_PPC_EMB_RELSDA:	r = R_PPC_EMB_RELSDA;		break;
1600     case BFD_RELOC_16_PCREL:		r = R_PPC_REL16;		break;
1601     case BFD_RELOC_LO16_PCREL:		r = R_PPC_REL16_LO;		break;
1602     case BFD_RELOC_HI16_PCREL:		r = R_PPC_REL16_HI;		break;
1603     case BFD_RELOC_HI16_S_PCREL:	r = R_PPC_REL16_HA;		break;
1604     case BFD_RELOC_VTABLE_INHERIT:	r = R_PPC_GNU_VTINHERIT;	break;
1605     case BFD_RELOC_VTABLE_ENTRY:	r = R_PPC_GNU_VTENTRY;		break;
1606     }
1607 
1608   return ppc_elf_howto_table[r];
1609 };
1610 
1611 static reloc_howto_type *
ppc_elf_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)1612 ppc_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1613 			   const char *r_name)
1614 {
1615   unsigned int i;
1616 
1617   for (i = 0;
1618        i < sizeof (ppc_elf_howto_raw) / sizeof (ppc_elf_howto_raw[0]);
1619        i++)
1620     if (ppc_elf_howto_raw[i].name != NULL
1621 	&& strcasecmp (ppc_elf_howto_raw[i].name, r_name) == 0)
1622       return &ppc_elf_howto_raw[i];
1623 
1624   return NULL;
1625 }
1626 
1627 /* Set the howto pointer for a PowerPC ELF reloc.  */
1628 
1629 static void
ppc_elf_info_to_howto(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)1630 ppc_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED,
1631 		       arelent *cache_ptr,
1632 		       Elf_Internal_Rela *dst)
1633 {
1634   /* Initialize howto table if not already done.  */
1635   if (!ppc_elf_howto_table[R_PPC_ADDR32])
1636     ppc_elf_howto_init ();
1637 
1638   BFD_ASSERT (ELF32_R_TYPE (dst->r_info) < (unsigned int) R_PPC_max);
1639   cache_ptr->howto = ppc_elf_howto_table[ELF32_R_TYPE (dst->r_info)];
1640 
1641   /* Just because the above assert didn't trigger doesn't mean that
1642      ELF32_R_TYPE (dst->r_info) is necessarily a valid relocation.  */
1643   if (!cache_ptr->howto)
1644     {
1645       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
1646                              abfd, ELF32_R_TYPE (dst->r_info));
1647       bfd_set_error (bfd_error_bad_value);
1648 
1649       cache_ptr->howto = ppc_elf_howto_table[R_PPC_NONE];
1650     }
1651 }
1652 
1653 /* Handle the R_PPC_ADDR16_HA and R_PPC_REL16_HA relocs.  */
1654 
1655 static bfd_reloc_status_type
ppc_elf_addr16_ha_reloc(bfd * abfd ATTRIBUTE_UNUSED,arelent * reloc_entry,asymbol * symbol,void * data ATTRIBUTE_UNUSED,asection * input_section,bfd * output_bfd,char ** error_message ATTRIBUTE_UNUSED)1656 ppc_elf_addr16_ha_reloc (bfd *abfd ATTRIBUTE_UNUSED,
1657 			 arelent *reloc_entry,
1658 			 asymbol *symbol,
1659 			 void *data ATTRIBUTE_UNUSED,
1660 			 asection *input_section,
1661 			 bfd *output_bfd,
1662 			 char **error_message ATTRIBUTE_UNUSED)
1663 {
1664   bfd_vma relocation;
1665 
1666   if (output_bfd != NULL)
1667     {
1668       reloc_entry->address += input_section->output_offset;
1669       return bfd_reloc_ok;
1670     }
1671 
1672   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
1673     return bfd_reloc_outofrange;
1674 
1675   if (bfd_is_com_section (symbol->section))
1676     relocation = 0;
1677   else
1678     relocation = symbol->value;
1679 
1680   relocation += symbol->section->output_section->vma;
1681   relocation += symbol->section->output_offset;
1682   relocation += reloc_entry->addend;
1683   if (reloc_entry->howto->pc_relative)
1684     relocation -= reloc_entry->address;
1685 
1686   reloc_entry->addend += (relocation & 0x8000) << 1;
1687 
1688   return bfd_reloc_continue;
1689 }
1690 
1691 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)1692 ppc_elf_unhandled_reloc (bfd *abfd,
1693 			 arelent *reloc_entry,
1694 			 asymbol *symbol,
1695 			 void *data,
1696 			 asection *input_section,
1697 			 bfd *output_bfd,
1698 			 char **error_message)
1699 {
1700   /* If this is a relocatable link (output_bfd test tells us), just
1701      call the generic function.  Any adjustment will be done at final
1702      link time.  */
1703   if (output_bfd != NULL)
1704     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
1705 				  input_section, output_bfd, error_message);
1706 
1707   if (error_message != NULL)
1708     {
1709       static char buf[60];
1710       sprintf (buf, _("generic linker can't handle %s"),
1711 	       reloc_entry->howto->name);
1712       *error_message = buf;
1713     }
1714   return bfd_reloc_dangerous;
1715 }
1716 
1717 /* Sections created by the linker.  */
1718 
1719 typedef struct elf_linker_section
1720 {
1721   /* Pointer to the bfd section.  */
1722   asection *section;
1723   /* Section name.  */
1724   const char *name;
1725   /* Associated bss section name.  */
1726   const char *bss_name;
1727   /* Associated symbol name.  */
1728   const char *sym_name;
1729   /* Associated symbol.  */
1730   struct elf_link_hash_entry *sym;
1731 } elf_linker_section_t;
1732 
1733 /* Linked list of allocated pointer entries.  This hangs off of the
1734    symbol lists, and provides allows us to return different pointers,
1735    based on different addend's.  */
1736 
1737 typedef struct elf_linker_section_pointers
1738 {
1739   /* next allocated pointer for this symbol */
1740   struct elf_linker_section_pointers *next;
1741   /* offset of pointer from beginning of section */
1742   bfd_vma offset;
1743   /* addend used */
1744   bfd_vma addend;
1745   /* which linker section this is */
1746   elf_linker_section_t *lsect;
1747 } elf_linker_section_pointers_t;
1748 
1749 struct ppc_elf_obj_tdata
1750 {
1751   struct elf_obj_tdata elf;
1752 
1753   /* A mapping from local symbols to offsets into the various linker
1754      sections added.  This is index by the symbol index.  */
1755   elf_linker_section_pointers_t **linker_section_pointers;
1756 
1757   /* Flags used to auto-detect plt type.  */
1758   unsigned int makes_plt_call : 1;
1759   unsigned int has_rel16 : 1;
1760 };
1761 
1762 #define ppc_elf_tdata(bfd) \
1763   ((struct ppc_elf_obj_tdata *) (bfd)->tdata.any)
1764 
1765 #define elf_local_ptr_offsets(bfd) \
1766   (ppc_elf_tdata (bfd)->linker_section_pointers)
1767 
1768 /* Override the generic function because we store some extras.  */
1769 
1770 static bfd_boolean
ppc_elf_mkobject(bfd * abfd)1771 ppc_elf_mkobject (bfd *abfd)
1772 {
1773   if (abfd->tdata.any == NULL)
1774     {
1775       bfd_size_type amt = sizeof (struct ppc_elf_obj_tdata);
1776       abfd->tdata.any = bfd_zalloc (abfd, amt);
1777       if (abfd->tdata.any == NULL)
1778 	return FALSE;
1779     }
1780   return bfd_elf_mkobject (abfd);
1781 }
1782 
1783 /* Fix bad default arch selected for a 32 bit input bfd when the
1784    default is 64 bit.  */
1785 
1786 static bfd_boolean
ppc_elf_object_p(bfd * abfd)1787 ppc_elf_object_p (bfd *abfd)
1788 {
1789   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 64)
1790     {
1791       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
1792 
1793       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS32)
1794 	{
1795 	  /* Relies on arch after 64 bit default being 32 bit default.  */
1796 	  abfd->arch_info = abfd->arch_info->next;
1797 	  BFD_ASSERT (abfd->arch_info->bits_per_word == 32);
1798 	}
1799     }
1800   return TRUE;
1801 }
1802 
1803 /* Function to set whether a module needs the -mrelocatable bit set.  */
1804 
1805 static bfd_boolean
ppc_elf_set_private_flags(bfd * abfd,flagword flags)1806 ppc_elf_set_private_flags (bfd *abfd, flagword flags)
1807 {
1808   BFD_ASSERT (!elf_flags_init (abfd)
1809 	      || elf_elfheader (abfd)->e_flags == flags);
1810 
1811   elf_elfheader (abfd)->e_flags = flags;
1812   elf_flags_init (abfd) = TRUE;
1813   return TRUE;
1814 }
1815 
1816 /* Support for core dump NOTE sections.  */
1817 
1818 static bfd_boolean
ppc_elf_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)1819 ppc_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
1820 {
1821   int offset;
1822   unsigned int size;
1823 
1824   switch (note->descsz)
1825     {
1826     default:
1827       return FALSE;
1828 
1829     case 268:		/* Linux/PPC.  */
1830       /* pr_cursig */
1831       elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
1832 
1833       /* pr_pid */
1834       elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 24);
1835 
1836       /* pr_reg */
1837       offset = 72;
1838       size = 192;
1839 
1840       break;
1841     }
1842 
1843   /* Make a ".reg/999" section.  */
1844   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
1845 					  size, note->descpos + offset);
1846 }
1847 
1848 static bfd_boolean
ppc_elf_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)1849 ppc_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
1850 {
1851   switch (note->descsz)
1852     {
1853     default:
1854       return FALSE;
1855 
1856     case 128:		/* Linux/PPC elf_prpsinfo.  */
1857       elf_tdata (abfd)->core_program
1858 	= _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
1859       elf_tdata (abfd)->core_command
1860 	= _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
1861     }
1862 
1863   /* Note that for some reason, a spurious space is tacked
1864      onto the end of the args in some (at least one anyway)
1865      implementations, so strip it off if it exists.  */
1866 
1867   {
1868     char *command = elf_tdata (abfd)->core_command;
1869     int n = strlen (command);
1870 
1871     if (0 < n && command[n - 1] == ' ')
1872       command[n - 1] = '\0';
1873   }
1874 
1875   return TRUE;
1876 }
1877 
1878 static char *
ppc_elf_write_core_note(bfd * abfd,char * buf,int * bufsiz,int note_type,...)1879 ppc_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type, ...)
1880 {
1881   switch (note_type)
1882     {
1883     default:
1884       return NULL;
1885 
1886     case NT_PRPSINFO:
1887       {
1888 	char data[128];
1889 	va_list ap;
1890 
1891 	va_start (ap, note_type);
1892 	memset (data, 0, 32);
1893 	strncpy (data + 32, va_arg (ap, const char *), 16);
1894 	strncpy (data + 48, va_arg (ap, const char *), 80);
1895 	va_end (ap);
1896 	return elfcore_write_note (abfd, buf, bufsiz,
1897 				   "CORE", note_type, data, sizeof (data));
1898       }
1899 
1900     case NT_PRSTATUS:
1901       {
1902 	char data[268];
1903 	va_list ap;
1904 	long pid;
1905 	int cursig;
1906 	const void *greg;
1907 
1908 	va_start (ap, note_type);
1909 	memset (data, 0, 72);
1910 	pid = va_arg (ap, long);
1911 	bfd_put_32 (abfd, pid, data + 24);
1912 	cursig = va_arg (ap, int);
1913 	bfd_put_16 (abfd, cursig, data + 12);
1914 	greg = va_arg (ap, const void *);
1915 	memcpy (data + 72, greg, 192);
1916 	memset (data + 264, 0, 4);
1917 	va_end (ap);
1918 	return elfcore_write_note (abfd, buf, bufsiz,
1919 				   "CORE", note_type, data, sizeof (data));
1920       }
1921     }
1922 }
1923 
1924 /* Return address for Ith PLT stub in section PLT, for relocation REL
1925    or (bfd_vma) -1 if it should not be included.  */
1926 
1927 static bfd_vma
ppc_elf_plt_sym_val(bfd_vma i ATTRIBUTE_UNUSED,const asection * plt ATTRIBUTE_UNUSED,const arelent * rel)1928 ppc_elf_plt_sym_val (bfd_vma i ATTRIBUTE_UNUSED,
1929 		     const asection *plt ATTRIBUTE_UNUSED,
1930 		     const arelent *rel)
1931 {
1932   return rel->address;
1933 }
1934 
1935 /* Handle a PowerPC specific section when reading an object file.  This
1936    is called when bfd_section_from_shdr finds a section with an unknown
1937    type.  */
1938 
1939 static bfd_boolean
ppc_elf_section_from_shdr(bfd * abfd,Elf_Internal_Shdr * hdr,const char * name,int shindex)1940 ppc_elf_section_from_shdr (bfd *abfd,
1941 			   Elf_Internal_Shdr *hdr,
1942 			   const char *name,
1943 			   int shindex)
1944 {
1945   asection *newsect;
1946   flagword flags;
1947 
1948   if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name, shindex))
1949     return FALSE;
1950 
1951   newsect = hdr->bfd_section;
1952   flags = bfd_get_section_flags (abfd, newsect);
1953   if (hdr->sh_flags & SHF_EXCLUDE)
1954     flags |= SEC_EXCLUDE;
1955 
1956   if (hdr->sh_type == SHT_ORDERED)
1957     flags |= SEC_SORT_ENTRIES;
1958 
1959   bfd_set_section_flags (abfd, newsect, flags);
1960   return TRUE;
1961 }
1962 
1963 /* Set up any other section flags and such that may be necessary.  */
1964 
1965 static bfd_boolean
ppc_elf_fake_sections(bfd * abfd ATTRIBUTE_UNUSED,Elf_Internal_Shdr * shdr,asection * asect)1966 ppc_elf_fake_sections (bfd *abfd ATTRIBUTE_UNUSED,
1967 		       Elf_Internal_Shdr *shdr,
1968 		       asection *asect)
1969 {
1970   if ((asect->flags & (SEC_GROUP | SEC_EXCLUDE)) == SEC_EXCLUDE)
1971     shdr->sh_flags |= SHF_EXCLUDE;
1972 
1973   if ((asect->flags & SEC_SORT_ENTRIES) != 0)
1974     shdr->sh_type = SHT_ORDERED;
1975 
1976   return TRUE;
1977 }
1978 
1979 /* If we have .sbss2 or .PPC.EMB.sbss0 output sections, we
1980    need to bump up the number of section headers.  */
1981 
1982 static int
ppc_elf_additional_program_headers(bfd * abfd,struct bfd_link_info * info ATTRIBUTE_UNUSED)1983 ppc_elf_additional_program_headers (bfd *abfd,
1984 				    struct bfd_link_info *info ATTRIBUTE_UNUSED)
1985 {
1986   asection *s;
1987   int ret = 0;
1988 
1989   s = bfd_get_section_by_name (abfd, ".sbss2");
1990   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1991     ++ret;
1992 
1993   s = bfd_get_section_by_name (abfd, ".PPC.EMB.sbss0");
1994   if (s != NULL && (s->flags & SEC_ALLOC) != 0)
1995     ++ret;
1996 
1997   return ret;
1998 }
1999 
2000 /* Add extra PPC sections -- Note, for now, make .sbss2 and
2001    .PPC.EMB.sbss0 a normal section, and not a bss section so
2002    that the linker doesn't crater when trying to make more than
2003    2 sections.  */
2004 
2005 static const struct bfd_elf_special_section ppc_elf_special_sections[] =
2006 {
2007   { STRING_COMMA_LEN (".plt"),             0, SHT_NOBITS,   SHF_ALLOC + SHF_EXECINSTR },
2008   { STRING_COMMA_LEN (".sbss"),           -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2009   { STRING_COMMA_LEN (".sbss2"),          -2, SHT_PROGBITS, SHF_ALLOC },
2010   { STRING_COMMA_LEN (".sdata"),          -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2011   { STRING_COMMA_LEN (".sdata2"),         -2, SHT_PROGBITS, SHF_ALLOC },
2012   { STRING_COMMA_LEN (".tags"),            0, SHT_ORDERED,  SHF_ALLOC },
2013   { STRING_COMMA_LEN (".PPC.EMB.apuinfo"), 0, SHT_NOTE,     0 },
2014   { STRING_COMMA_LEN (".PPC.EMB.sbss0"),   0, SHT_PROGBITS, SHF_ALLOC },
2015   { STRING_COMMA_LEN (".PPC.EMB.sdata0"),  0, SHT_PROGBITS, SHF_ALLOC },
2016   { NULL,                              0,  0, 0,            0 }
2017 };
2018 
2019 /* This is what we want for new plt/got.  */
2020 static struct bfd_elf_special_section ppc_alt_plt =
2021   { STRING_COMMA_LEN (".plt"),             0, SHT_PROGBITS, SHF_ALLOC };
2022 
2023 static const struct bfd_elf_special_section *
ppc_elf_get_sec_type_attr(bfd * abfd ATTRIBUTE_UNUSED,asection * sec)2024 ppc_elf_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2025 {
2026   const struct bfd_elf_special_section *ssect;
2027 
2028   /* See if this is one of the special sections.  */
2029   if (sec->name == NULL)
2030     return NULL;
2031 
2032   ssect = _bfd_elf_get_special_section (sec->name, ppc_elf_special_sections,
2033 					sec->use_rela_p);
2034   if (ssect != NULL)
2035     {
2036       if (ssect == ppc_elf_special_sections && (sec->flags & SEC_LOAD) != 0)
2037 	ssect = &ppc_alt_plt;
2038       return ssect;
2039     }
2040 
2041   return _bfd_elf_get_sec_type_attr (abfd, sec);
2042 }
2043 
2044 /* Very simple linked list structure for recording apuinfo values.  */
2045 typedef struct apuinfo_list
2046 {
2047   struct apuinfo_list *next;
2048   unsigned long value;
2049 }
2050 apuinfo_list;
2051 
2052 static apuinfo_list *head;
2053 
2054 
2055 static void
apuinfo_list_init(void)2056 apuinfo_list_init (void)
2057 {
2058   head = NULL;
2059 }
2060 
2061 static void
apuinfo_list_add(unsigned long value)2062 apuinfo_list_add (unsigned long value)
2063 {
2064   apuinfo_list *entry = head;
2065 
2066   while (entry != NULL)
2067     {
2068       if (entry->value == value)
2069 	return;
2070       entry = entry->next;
2071     }
2072 
2073   entry = bfd_malloc (sizeof (* entry));
2074   if (entry == NULL)
2075     return;
2076 
2077   entry->value = value;
2078   entry->next  = head;
2079   head = entry;
2080 }
2081 
2082 static unsigned
apuinfo_list_length(void)2083 apuinfo_list_length (void)
2084 {
2085   apuinfo_list *entry;
2086   unsigned long count;
2087 
2088   for (entry = head, count = 0;
2089        entry;
2090        entry = entry->next)
2091     ++ count;
2092 
2093   return count;
2094 }
2095 
2096 static inline unsigned long
apuinfo_list_element(unsigned long number)2097 apuinfo_list_element (unsigned long number)
2098 {
2099   apuinfo_list * entry;
2100 
2101   for (entry = head;
2102        entry && number --;
2103        entry = entry->next)
2104     ;
2105 
2106   return entry ? entry->value : 0;
2107 }
2108 
2109 static void
apuinfo_list_finish(void)2110 apuinfo_list_finish (void)
2111 {
2112   apuinfo_list *entry;
2113 
2114   for (entry = head; entry;)
2115     {
2116       apuinfo_list *next = entry->next;
2117       free (entry);
2118       entry = next;
2119     }
2120 
2121   head = NULL;
2122 }
2123 
2124 #define APUINFO_SECTION_NAME	".PPC.EMB.apuinfo"
2125 #define APUINFO_LABEL		"APUinfo"
2126 
2127 /* Scan the input BFDs and create a linked list of
2128    the APUinfo values that will need to be emitted.  */
2129 
2130 static void
ppc_elf_begin_write_processing(bfd * abfd,struct bfd_link_info * link_info)2131 ppc_elf_begin_write_processing (bfd *abfd, struct bfd_link_info *link_info)
2132 {
2133   bfd *ibfd;
2134   asection *asec;
2135   char *buffer;
2136   unsigned num_input_sections;
2137   bfd_size_type	output_section_size;
2138   unsigned i;
2139   unsigned num_entries;
2140   unsigned long	offset;
2141   unsigned long length;
2142   const char *error_message = NULL;
2143 
2144   if (link_info == NULL)
2145     return;
2146 
2147   /* Scan the input bfds, looking for apuinfo sections.  */
2148   num_input_sections = 0;
2149   output_section_size = 0;
2150 
2151   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
2152     {
2153       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
2154       if (asec)
2155 	{
2156 	  ++ num_input_sections;
2157 	  output_section_size += asec->size;
2158 	}
2159     }
2160 
2161   /* We need at least one input sections
2162      in order to make merging worthwhile.  */
2163   if (num_input_sections < 1)
2164     return;
2165 
2166   /* Just make sure that the output section exists as well.  */
2167   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2168   if (asec == NULL)
2169     return;
2170 
2171   /* Allocate a buffer for the contents of the input sections.  */
2172   buffer = bfd_malloc (output_section_size);
2173   if (buffer == NULL)
2174     return;
2175 
2176   offset = 0;
2177   apuinfo_list_init ();
2178 
2179   /* Read in the input sections contents.  */
2180   for (ibfd = link_info->input_bfds; ibfd; ibfd = ibfd->link_next)
2181     {
2182       unsigned long datum;
2183       char *ptr;
2184 
2185       asec = bfd_get_section_by_name (ibfd, APUINFO_SECTION_NAME);
2186       if (asec == NULL)
2187 	continue;
2188 
2189       length = asec->size;
2190       if (length < 24)
2191 	{
2192 	  error_message = _("corrupt or empty %s section in %B");
2193 	  goto fail;
2194 	}
2195 
2196       if (bfd_seek (ibfd, asec->filepos, SEEK_SET) != 0
2197 	  || (bfd_bread (buffer + offset, length, ibfd) != length))
2198 	{
2199 	  error_message = _("unable to read in %s section from %B");
2200 	  goto fail;
2201 	}
2202 
2203       /* Process the contents of the section.  */
2204       ptr = buffer + offset;
2205       error_message = _("corrupt %s section in %B");
2206 
2207       /* Verify the contents of the header.  Note - we have to
2208 	 extract the values this way in order to allow for a
2209 	 host whose endian-ness is different from the target.  */
2210       datum = bfd_get_32 (ibfd, ptr);
2211       if (datum != sizeof APUINFO_LABEL)
2212 	goto fail;
2213 
2214       datum = bfd_get_32 (ibfd, ptr + 8);
2215       if (datum != 0x2)
2216 	goto fail;
2217 
2218       if (strcmp (ptr + 12, APUINFO_LABEL) != 0)
2219 	goto fail;
2220 
2221       /* Get the number of bytes used for apuinfo entries.  */
2222       datum = bfd_get_32 (ibfd, ptr + 4);
2223       if (datum + 20 != length)
2224 	goto fail;
2225 
2226       /* Make sure that we do not run off the end of the section.  */
2227       if (offset + length > output_section_size)
2228 	goto fail;
2229 
2230       /* Scan the apuinfo section, building a list of apuinfo numbers.  */
2231       for (i = 0; i < datum; i += 4)
2232 	apuinfo_list_add (bfd_get_32 (ibfd, ptr + 20 + i));
2233 
2234       /* Update the offset.  */
2235       offset += length;
2236     }
2237 
2238   error_message = NULL;
2239 
2240   /* Compute the size of the output section.  */
2241   num_entries = apuinfo_list_length ();
2242   output_section_size = 20 + num_entries * 4;
2243 
2244   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2245 
2246   if (! bfd_set_section_size (abfd, asec, output_section_size))
2247     ibfd = abfd,
2248       error_message = _("warning: unable to set size of %s section in %B");
2249 
2250  fail:
2251   free (buffer);
2252 
2253   if (error_message)
2254     (*_bfd_error_handler) (error_message, ibfd, APUINFO_SECTION_NAME);
2255 }
2256 
2257 /* Prevent the output section from accumulating the input sections'
2258    contents.  We have already stored this in our linked list structure.  */
2259 
2260 static bfd_boolean
ppc_elf_write_section(bfd * abfd ATTRIBUTE_UNUSED,struct bfd_link_info * link_info ATTRIBUTE_UNUSED,asection * asec,bfd_byte * contents ATTRIBUTE_UNUSED)2261 ppc_elf_write_section (bfd *abfd ATTRIBUTE_UNUSED,
2262 		       struct bfd_link_info *link_info ATTRIBUTE_UNUSED,
2263 		       asection *asec,
2264 		       bfd_byte *contents ATTRIBUTE_UNUSED)
2265 {
2266   return (apuinfo_list_length ()
2267 	  && strcmp (asec->name, APUINFO_SECTION_NAME) == 0);
2268 }
2269 
2270 /* Finally we can generate the output section.  */
2271 
2272 static void
ppc_elf_final_write_processing(bfd * abfd,bfd_boolean linker ATTRIBUTE_UNUSED)2273 ppc_elf_final_write_processing (bfd *abfd, bfd_boolean linker ATTRIBUTE_UNUSED)
2274 {
2275   bfd_byte *buffer;
2276   asection *asec;
2277   unsigned i;
2278   unsigned num_entries;
2279   bfd_size_type length;
2280 
2281   asec = bfd_get_section_by_name (abfd, APUINFO_SECTION_NAME);
2282   if (asec == NULL)
2283     return;
2284 
2285   if (apuinfo_list_length () == 0)
2286     return;
2287 
2288   length = asec->size;
2289   if (length < 20)
2290     return;
2291 
2292   buffer = bfd_malloc (length);
2293   if (buffer == NULL)
2294     {
2295       (*_bfd_error_handler)
2296 	(_("failed to allocate space for new APUinfo section."));
2297       return;
2298     }
2299 
2300   /* Create the apuinfo header.  */
2301   num_entries = apuinfo_list_length ();
2302   bfd_put_32 (abfd, sizeof APUINFO_LABEL, buffer);
2303   bfd_put_32 (abfd, num_entries * 4, buffer + 4);
2304   bfd_put_32 (abfd, 0x2, buffer + 8);
2305   strcpy ((char *) buffer + 12, APUINFO_LABEL);
2306 
2307   length = 20;
2308   for (i = 0; i < num_entries; i++)
2309     {
2310       bfd_put_32 (abfd, apuinfo_list_element (i), buffer + length);
2311       length += 4;
2312     }
2313 
2314   if (length != asec->size)
2315     (*_bfd_error_handler) (_("failed to compute new APUinfo section."));
2316 
2317   if (! bfd_set_section_contents (abfd, asec, buffer, (file_ptr) 0, length))
2318     (*_bfd_error_handler) (_("failed to install new APUinfo section."));
2319 
2320   free (buffer);
2321 
2322   apuinfo_list_finish ();
2323 }
2324 
2325 /* The following functions are specific to the ELF linker, while
2326    functions above are used generally.  They appear in this file more
2327    or less in the order in which they are called.  eg.
2328    ppc_elf_check_relocs is called early in the link process,
2329    ppc_elf_finish_dynamic_sections is one of the last functions
2330    called.  */
2331 
2332 /* The PPC linker needs to keep track of the number of relocs that it
2333    decides to copy as dynamic relocs in check_relocs for each symbol.
2334    This is so that it can later discard them if they are found to be
2335    unnecessary.  We store the information in a field extending the
2336    regular ELF linker hash table.  */
2337 
2338 struct ppc_elf_dyn_relocs
2339 {
2340   struct ppc_elf_dyn_relocs *next;
2341 
2342   /* The input section of the reloc.  */
2343   asection *sec;
2344 
2345   /* Total number of relocs copied for the input section.  */
2346   bfd_size_type count;
2347 
2348   /* Number of pc-relative relocs copied for the input section.  */
2349   bfd_size_type pc_count;
2350 };
2351 
2352 /* Track PLT entries needed for a given symbol.  We might need more
2353    than one glink entry per symbol.  */
2354 struct plt_entry
2355 {
2356   struct plt_entry *next;
2357 
2358   /* -fPIC uses multiple GOT sections, one per file, called ".got2".
2359      This field stores the offset into .got2 used to initialise the
2360      GOT pointer reg.  It will always be at least 32768 (and for
2361      current gcc this is the only offset used).  */
2362   bfd_vma addend;
2363 
2364   /* The .got2 section.  */
2365   asection *sec;
2366 
2367   /* PLT refcount or offset.  */
2368   union
2369     {
2370       bfd_signed_vma refcount;
2371       bfd_vma offset;
2372     } plt;
2373 
2374   /* .glink stub offset.  */
2375   bfd_vma glink_offset;
2376 };
2377 
2378 /* Of those relocs that might be copied as dynamic relocs, this function
2379    selects those that must be copied when linking a shared library,
2380    even when the symbol is local.  */
2381 
2382 static int
must_be_dyn_reloc(struct bfd_link_info * info,enum elf_ppc_reloc_type r_type)2383 must_be_dyn_reloc (struct bfd_link_info *info,
2384 		   enum elf_ppc_reloc_type r_type)
2385 {
2386   switch (r_type)
2387     {
2388     default:
2389       return 1;
2390 
2391     case R_PPC_REL24:
2392     case R_PPC_REL14:
2393     case R_PPC_REL14_BRTAKEN:
2394     case R_PPC_REL14_BRNTAKEN:
2395     case R_PPC_REL32:
2396       return 0;
2397 
2398     case R_PPC_TPREL32:
2399     case R_PPC_TPREL16:
2400     case R_PPC_TPREL16_LO:
2401     case R_PPC_TPREL16_HI:
2402     case R_PPC_TPREL16_HA:
2403       return !info->executable;
2404     }
2405 }
2406 
2407 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2408    copying dynamic variables from a shared lib into an app's dynbss
2409    section, and instead use a dynamic relocation to point into the
2410    shared lib.  */
2411 #define ELIMINATE_COPY_RELOCS 1
2412 
2413 /* PPC ELF linker hash entry.  */
2414 
2415 struct ppc_elf_link_hash_entry
2416 {
2417   struct elf_link_hash_entry elf;
2418 
2419   /* If this symbol is used in the linker created sections, the processor
2420      specific backend uses this field to map the field into the offset
2421      from the beginning of the section.  */
2422   elf_linker_section_pointers_t *linker_section_pointer;
2423 
2424   /* Track dynamic relocs copied for this symbol.  */
2425   struct ppc_elf_dyn_relocs *dyn_relocs;
2426 
2427   /* Contexts in which symbol is used in the GOT (or TOC).
2428      TLS_GD .. TLS_TLS bits are or'd into the mask as the
2429      corresponding relocs are encountered during check_relocs.
2430      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2431      indicate the corresponding GOT entry type is not needed.  */
2432 #define TLS_GD		 1	/* GD reloc. */
2433 #define TLS_LD		 2	/* LD reloc. */
2434 #define TLS_TPREL	 4	/* TPREL reloc, => IE. */
2435 #define TLS_DTPREL	 8	/* DTPREL reloc, => LD. */
2436 #define TLS_TLS		16	/* Any TLS reloc.  */
2437 #define TLS_TPRELGD	32	/* TPREL reloc resulting from GD->IE. */
2438   char tls_mask;
2439 
2440   /* Nonzero if we have seen a small data relocation referring to this
2441      symbol.  */
2442   unsigned char has_sda_refs;
2443 };
2444 
2445 #define ppc_elf_hash_entry(ent) ((struct ppc_elf_link_hash_entry *) (ent))
2446 
2447 /* PPC ELF linker hash table.  */
2448 
2449 struct ppc_elf_link_hash_table
2450 {
2451   struct elf_link_hash_table elf;
2452 
2453   /* Short-cuts to get to dynamic linker sections.  */
2454   asection *got;
2455   asection *relgot;
2456   asection *glink;
2457   asection *plt;
2458   asection *relplt;
2459   asection *dynbss;
2460   asection *relbss;
2461   asection *dynsbss;
2462   asection *relsbss;
2463   elf_linker_section_t sdata[2];
2464   asection *sbss;
2465 
2466   /* The (unloaded but important) .rela.plt.unloaded on VxWorks.  */
2467   asection *srelplt2;
2468 
2469   /* The .got.plt section (VxWorks only)*/
2470   asection *sgotplt;
2471 
2472   /* Shortcut to __tls_get_addr.  */
2473   struct elf_link_hash_entry *tls_get_addr;
2474 
2475   /* The bfd that forced an old-style PLT.  */
2476   bfd *old_bfd;
2477 
2478   /* TLS local dynamic got entry handling.  */
2479   union {
2480     bfd_signed_vma refcount;
2481     bfd_vma offset;
2482   } tlsld_got;
2483 
2484   /* Offset of PltResolve function in glink.  */
2485   bfd_vma glink_pltresolve;
2486 
2487   /* Size of reserved GOT entries.  */
2488   unsigned int got_header_size;
2489   /* Non-zero if allocating the header left a gap.  */
2490   unsigned int got_gap;
2491 
2492   /* The type of PLT we have chosen to use.  */
2493   enum ppc_elf_plt_type plt_type;
2494 
2495   /* Set if we should emit symbols for stubs.  */
2496   unsigned int emit_stub_syms:1;
2497 
2498   /* True if the target system is VxWorks.  */
2499   unsigned int is_vxworks:1;
2500 
2501   /* The size of PLT entries.  */
2502   int plt_entry_size;
2503   /* The distance between adjacent PLT slots.  */
2504   int plt_slot_size;
2505   /* The size of the first PLT entry.  */
2506   int plt_initial_entry_size;
2507 
2508   /* Small local sym to section mapping cache.  */
2509   struct sym_sec_cache sym_sec;
2510 };
2511 
2512 /* Get the PPC ELF linker hash table from a link_info structure.  */
2513 
2514 #define ppc_elf_hash_table(p) \
2515   ((struct ppc_elf_link_hash_table *) (p)->hash)
2516 
2517 /* Create an entry in a PPC ELF linker hash table.  */
2518 
2519 static struct bfd_hash_entry *
ppc_elf_link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)2520 ppc_elf_link_hash_newfunc (struct bfd_hash_entry *entry,
2521 			   struct bfd_hash_table *table,
2522 			   const char *string)
2523 {
2524   /* Allocate the structure if it has not already been allocated by a
2525      subclass.  */
2526   if (entry == NULL)
2527     {
2528       entry = bfd_hash_allocate (table,
2529 				 sizeof (struct ppc_elf_link_hash_entry));
2530       if (entry == NULL)
2531 	return entry;
2532     }
2533 
2534   /* Call the allocation method of the superclass.  */
2535   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
2536   if (entry != NULL)
2537     {
2538       ppc_elf_hash_entry (entry)->linker_section_pointer = NULL;
2539       ppc_elf_hash_entry (entry)->dyn_relocs = NULL;
2540       ppc_elf_hash_entry (entry)->tls_mask = 0;
2541     }
2542 
2543   return entry;
2544 }
2545 
2546 /* Create a PPC ELF linker hash table.  */
2547 
2548 static struct bfd_link_hash_table *
ppc_elf_link_hash_table_create(bfd * abfd)2549 ppc_elf_link_hash_table_create (bfd *abfd)
2550 {
2551   struct ppc_elf_link_hash_table *ret;
2552 
2553   ret = bfd_zmalloc (sizeof (struct ppc_elf_link_hash_table));
2554   if (ret == NULL)
2555     return NULL;
2556 
2557   if (!_bfd_elf_link_hash_table_init (&ret->elf, abfd,
2558 				      ppc_elf_link_hash_newfunc,
2559 				      sizeof (struct ppc_elf_link_hash_entry)))
2560     {
2561       free (ret);
2562       return NULL;
2563     }
2564 
2565   ret->elf.init_plt_refcount.refcount = 0;
2566   ret->elf.init_plt_refcount.glist = NULL;
2567   ret->elf.init_plt_offset.offset = 0;
2568   ret->elf.init_plt_offset.glist = NULL;
2569 
2570   ret->sdata[0].name = ".sdata";
2571   ret->sdata[0].sym_name = "_SDA_BASE_";
2572   ret->sdata[0].bss_name = ".sbss";
2573 
2574   ret->sdata[1].name = ".sdata2";
2575   ret->sdata[1].sym_name = "_SDA2_BASE_";
2576   ret->sdata[1].bss_name = ".sbss2";
2577 
2578   ret->plt_entry_size = 12;
2579   ret->plt_slot_size = 8;
2580   ret->plt_initial_entry_size = 72;
2581 
2582   return &ret->elf.root;
2583 }
2584 
2585 /* Create .got and the related sections.  */
2586 
2587 static bfd_boolean
ppc_elf_create_got(bfd * abfd,struct bfd_link_info * info)2588 ppc_elf_create_got (bfd *abfd, struct bfd_link_info *info)
2589 {
2590   struct ppc_elf_link_hash_table *htab;
2591   asection *s;
2592   flagword flags;
2593 
2594   if (!_bfd_elf_create_got_section (abfd, info))
2595     return FALSE;
2596 
2597   htab = ppc_elf_hash_table (info);
2598   htab->got = s = bfd_get_section_by_name (abfd, ".got");
2599   if (s == NULL)
2600     abort ();
2601 
2602   if (htab->is_vxworks)
2603     {
2604       htab->sgotplt = bfd_get_section_by_name (abfd, ".got.plt");
2605       if (!htab->sgotplt)
2606 	abort ();
2607     }
2608   else
2609     {
2610       /* The powerpc .got has a blrl instruction in it.  Mark it
2611 	 executable.  */
2612       flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_HAS_CONTENTS
2613 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2614       if (!bfd_set_section_flags (abfd, s, flags))
2615 	return FALSE;
2616     }
2617 
2618   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2619 	   | SEC_LINKER_CREATED | SEC_READONLY);
2620   htab->relgot = bfd_make_section_with_flags (abfd, ".rela.got", flags);
2621   if (!htab->relgot
2622       || ! bfd_set_section_alignment (abfd, htab->relgot, 2))
2623     return FALSE;
2624 
2625   return TRUE;
2626 }
2627 
2628 /* We have to create .dynsbss and .rela.sbss here so that they get mapped
2629    to output sections (just like _bfd_elf_create_dynamic_sections has
2630    to create .dynbss and .rela.bss).  */
2631 
2632 static bfd_boolean
ppc_elf_create_dynamic_sections(bfd * abfd,struct bfd_link_info * info)2633 ppc_elf_create_dynamic_sections (bfd *abfd, struct bfd_link_info *info)
2634 {
2635   struct ppc_elf_link_hash_table *htab;
2636   asection *s;
2637   flagword flags;
2638 
2639   htab = ppc_elf_hash_table (info);
2640 
2641   if (htab->got == NULL
2642       && !ppc_elf_create_got (abfd, info))
2643     return FALSE;
2644 
2645   if (!_bfd_elf_create_dynamic_sections (abfd, info))
2646     return FALSE;
2647 
2648   flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
2649 	   | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2650 
2651   s = bfd_make_section_anyway_with_flags (abfd, ".glink", flags | SEC_CODE);
2652   htab->glink = s;
2653   if (s == NULL
2654       || !bfd_set_section_alignment (abfd, s, 4))
2655     return FALSE;
2656 
2657   htab->dynbss = bfd_get_section_by_name (abfd, ".dynbss");
2658   s = bfd_make_section_with_flags (abfd, ".dynsbss",
2659 				   SEC_ALLOC | SEC_LINKER_CREATED);
2660   htab->dynsbss = s;
2661   if (s == NULL)
2662     return FALSE;
2663 
2664   if (! info->shared)
2665     {
2666       htab->relbss = bfd_get_section_by_name (abfd, ".rela.bss");
2667       s = bfd_make_section_with_flags (abfd, ".rela.sbss", flags);
2668       htab->relsbss = s;
2669       if (s == NULL
2670 	  || ! bfd_set_section_alignment (abfd, s, 2))
2671 	return FALSE;
2672     }
2673 
2674   if (htab->is_vxworks
2675       && !elf_vxworks_create_dynamic_sections (abfd, info, &htab->srelplt2))
2676     return FALSE;
2677 
2678   htab->relplt = bfd_get_section_by_name (abfd, ".rela.plt");
2679   htab->plt = s = bfd_get_section_by_name (abfd, ".plt");
2680   if (s == NULL)
2681     abort ();
2682 
2683   flags = SEC_ALLOC | SEC_CODE | SEC_LINKER_CREATED;
2684   if (htab->plt_type == PLT_VXWORKS)
2685     /* The VxWorks PLT is a loaded section with contents.  */
2686     flags |= SEC_HAS_CONTENTS | SEC_LOAD | SEC_READONLY;
2687   return bfd_set_section_flags (abfd, s, flags);
2688 }
2689 
2690 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
2691 
2692 static void
ppc_elf_copy_indirect_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * dir,struct elf_link_hash_entry * ind)2693 ppc_elf_copy_indirect_symbol (struct bfd_link_info *info,
2694 			      struct elf_link_hash_entry *dir,
2695 			      struct elf_link_hash_entry *ind)
2696 {
2697   struct ppc_elf_link_hash_entry *edir, *eind;
2698 
2699   edir = (struct ppc_elf_link_hash_entry *) dir;
2700   eind = (struct ppc_elf_link_hash_entry *) ind;
2701 
2702   if (eind->dyn_relocs != NULL)
2703     {
2704       if (edir->dyn_relocs != NULL)
2705 	{
2706 	  struct ppc_elf_dyn_relocs **pp;
2707 	  struct ppc_elf_dyn_relocs *p;
2708 
2709 	  /* Add reloc counts against the indirect sym to the direct sym
2710 	     list.  Merge any entries against the same section.  */
2711 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
2712 	    {
2713 	      struct ppc_elf_dyn_relocs *q;
2714 
2715 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
2716 		if (q->sec == p->sec)
2717 		  {
2718 		    q->pc_count += p->pc_count;
2719 		    q->count += p->count;
2720 		    *pp = p->next;
2721 		    break;
2722 		  }
2723 	      if (q == NULL)
2724 		pp = &p->next;
2725 	    }
2726 	  *pp = edir->dyn_relocs;
2727 	}
2728 
2729       edir->dyn_relocs = eind->dyn_relocs;
2730       eind->dyn_relocs = NULL;
2731     }
2732 
2733   edir->tls_mask |= eind->tls_mask;
2734   edir->has_sda_refs |= eind->has_sda_refs;
2735 
2736   /* If called to transfer flags for a weakdef during processing
2737      of elf_adjust_dynamic_symbol, don't copy non_got_ref.
2738      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
2739   if (!(ELIMINATE_COPY_RELOCS
2740 	&& eind->elf.root.type != bfd_link_hash_indirect
2741 	&& edir->elf.dynamic_adjusted))
2742     edir->elf.non_got_ref |= eind->elf.non_got_ref;
2743 
2744   edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
2745   edir->elf.ref_regular |= eind->elf.ref_regular;
2746   edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
2747   edir->elf.needs_plt |= eind->elf.needs_plt;
2748 
2749   /* If we were called to copy over info for a weak sym, that's all.  */
2750   if (eind->elf.root.type != bfd_link_hash_indirect)
2751     return;
2752 
2753   /* Copy over the GOT refcount entries that we may have already seen to
2754      the symbol which just became indirect.  */
2755   edir->elf.got.refcount += eind->elf.got.refcount;
2756   eind->elf.got.refcount = 0;
2757 
2758   /* And plt entries.  */
2759   if (eind->elf.plt.plist != NULL)
2760     {
2761       if (edir->elf.plt.plist != NULL)
2762 	{
2763 	  struct plt_entry **entp;
2764 	  struct plt_entry *ent;
2765 
2766 	  for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
2767 	    {
2768 	      struct plt_entry *dent;
2769 
2770 	      for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
2771 		if (dent->sec == ent->sec && dent->addend == ent->addend)
2772 		  {
2773 		    dent->plt.refcount += ent->plt.refcount;
2774 		    *entp = ent->next;
2775 		    break;
2776 		  }
2777 	      if (dent == NULL)
2778 		entp = &ent->next;
2779 	    }
2780 	  *entp = edir->elf.plt.plist;
2781 	}
2782 
2783       edir->elf.plt.plist = eind->elf.plt.plist;
2784       eind->elf.plt.plist = NULL;
2785     }
2786 
2787   if (eind->elf.dynindx != -1)
2788     {
2789       if (edir->elf.dynindx != -1)
2790 	_bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
2791 				edir->elf.dynstr_index);
2792       edir->elf.dynindx = eind->elf.dynindx;
2793       edir->elf.dynstr_index = eind->elf.dynstr_index;
2794       eind->elf.dynindx = -1;
2795       eind->elf.dynstr_index = 0;
2796     }
2797 }
2798 
2799 /* Return 1 if target is one of ours.  */
2800 
2801 static bfd_boolean
is_ppc_elf_target(const struct bfd_target * targ)2802 is_ppc_elf_target (const struct bfd_target *targ)
2803 {
2804   extern const bfd_target bfd_elf32_powerpc_vec;
2805   extern const bfd_target bfd_elf32_powerpc_vxworks_vec;
2806   extern const bfd_target bfd_elf32_powerpcle_vec;
2807 
2808   return (targ == &bfd_elf32_powerpc_vec
2809 	  || targ == &bfd_elf32_powerpc_vxworks_vec
2810 	  || targ == &bfd_elf32_powerpcle_vec);
2811 }
2812 
2813 /* Hook called by the linker routine which adds symbols from an object
2814    file.  We use it to put .comm items in .sbss, and not .bss.  */
2815 
2816 static bfd_boolean
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)2817 ppc_elf_add_symbol_hook (bfd *abfd,
2818 			 struct bfd_link_info *info,
2819 			 Elf_Internal_Sym *sym,
2820 			 const char **namep ATTRIBUTE_UNUSED,
2821 			 flagword *flagsp ATTRIBUTE_UNUSED,
2822 			 asection **secp,
2823 			 bfd_vma *valp)
2824 {
2825   if (sym->st_shndx == SHN_COMMON
2826       && !info->relocatable
2827       && sym->st_size <= elf_gp_size (abfd)
2828       && is_ppc_elf_target (info->hash->creator))
2829     {
2830       /* Common symbols less than or equal to -G nn bytes are automatically
2831 	 put into .sbss.  */
2832       struct ppc_elf_link_hash_table *htab;
2833 
2834       htab = ppc_elf_hash_table (info);
2835       if (htab->sbss == NULL)
2836 	{
2837 	  flagword flags = SEC_IS_COMMON | SEC_LINKER_CREATED;
2838 
2839 	  if (!htab->elf.dynobj)
2840 	    htab->elf.dynobj = abfd;
2841 
2842 	  htab->sbss = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2843 							   ".sbss",
2844 							   flags);
2845 	  if (htab->sbss == NULL)
2846 	    return FALSE;
2847 	}
2848 
2849       *secp = htab->sbss;
2850       *valp = sym->st_size;
2851     }
2852 
2853   return TRUE;
2854 }
2855 
2856 static bfd_boolean
create_sdata_sym(struct ppc_elf_link_hash_table * htab,elf_linker_section_t * lsect)2857 create_sdata_sym (struct ppc_elf_link_hash_table *htab,
2858 		  elf_linker_section_t *lsect)
2859 {
2860   lsect->sym = elf_link_hash_lookup (&htab->elf, lsect->sym_name,
2861 				     TRUE, FALSE, TRUE);
2862   if (lsect->sym == NULL)
2863     return FALSE;
2864   if (lsect->sym->root.type == bfd_link_hash_new)
2865     lsect->sym->non_elf = 0;
2866   lsect->sym->ref_regular = 1;
2867   return TRUE;
2868 }
2869 
2870 /* Create a special linker section.  */
2871 
2872 static bfd_boolean
ppc_elf_create_linker_section(bfd * abfd,struct bfd_link_info * info,flagword flags,elf_linker_section_t * lsect)2873 ppc_elf_create_linker_section (bfd *abfd,
2874 			       struct bfd_link_info *info,
2875 			       flagword flags,
2876 			       elf_linker_section_t *lsect)
2877 {
2878   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
2879   asection *s;
2880 
2881   flags |= (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
2882 	    | SEC_LINKER_CREATED);
2883 
2884   /* Record the first bfd that needs the special sections.  */
2885   if (!htab->elf.dynobj)
2886     htab->elf.dynobj = abfd;
2887 
2888   s = bfd_make_section_anyway_with_flags (htab->elf.dynobj,
2889 					  lsect->name,
2890 					  flags);
2891   if (s == NULL
2892       || !bfd_set_section_alignment (htab->elf.dynobj, s, 2))
2893     return FALSE;
2894   lsect->section = s;
2895 
2896   return create_sdata_sym (htab, lsect);
2897 }
2898 
2899 /* Find a linker generated pointer with a given addend and type.  */
2900 
2901 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)2902 elf_find_pointer_linker_section
2903   (elf_linker_section_pointers_t *linker_pointers,
2904    bfd_vma addend,
2905    elf_linker_section_t *lsect)
2906 {
2907   for ( ; linker_pointers != NULL; linker_pointers = linker_pointers->next)
2908     if (lsect == linker_pointers->lsect && addend == linker_pointers->addend)
2909       return linker_pointers;
2910 
2911   return NULL;
2912 }
2913 
2914 /* Allocate a pointer to live in a linker created section.  */
2915 
2916 static bfd_boolean
elf_create_pointer_linker_section(bfd * abfd,elf_linker_section_t * lsect,struct elf_link_hash_entry * h,const Elf_Internal_Rela * rel)2917 elf_create_pointer_linker_section (bfd *abfd,
2918 				   elf_linker_section_t *lsect,
2919 				   struct elf_link_hash_entry *h,
2920 				   const Elf_Internal_Rela *rel)
2921 {
2922   elf_linker_section_pointers_t **ptr_linker_section_ptr = NULL;
2923   elf_linker_section_pointers_t *linker_section_ptr;
2924   unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
2925   bfd_size_type amt;
2926 
2927   BFD_ASSERT (lsect != NULL);
2928 
2929   /* Is this a global symbol?  */
2930   if (h != NULL)
2931     {
2932       struct ppc_elf_link_hash_entry *eh;
2933 
2934       /* Has this symbol already been allocated?  If so, our work is done.  */
2935       eh = (struct ppc_elf_link_hash_entry *) h;
2936       if (elf_find_pointer_linker_section (eh->linker_section_pointer,
2937 					   rel->r_addend,
2938 					   lsect))
2939 	return TRUE;
2940 
2941       ptr_linker_section_ptr = &eh->linker_section_pointer;
2942     }
2943   else
2944     {
2945       /* Allocation of a pointer to a local symbol.  */
2946       elf_linker_section_pointers_t **ptr = elf_local_ptr_offsets (abfd);
2947 
2948       /* Allocate a table to hold the local symbols if first time.  */
2949       if (!ptr)
2950 	{
2951 	  unsigned int num_symbols = elf_tdata (abfd)->symtab_hdr.sh_info;
2952 
2953 	  amt = num_symbols;
2954 	  amt *= sizeof (elf_linker_section_pointers_t *);
2955 	  ptr = bfd_zalloc (abfd, amt);
2956 
2957 	  if (!ptr)
2958 	    return FALSE;
2959 
2960 	  elf_local_ptr_offsets (abfd) = ptr;
2961 	}
2962 
2963       /* Has this symbol already been allocated?  If so, our work is done.  */
2964       if (elf_find_pointer_linker_section (ptr[r_symndx],
2965 					   rel->r_addend,
2966 					   lsect))
2967 	return TRUE;
2968 
2969       ptr_linker_section_ptr = &ptr[r_symndx];
2970     }
2971 
2972   /* Allocate space for a pointer in the linker section, and allocate
2973      a new pointer record from internal memory.  */
2974   BFD_ASSERT (ptr_linker_section_ptr != NULL);
2975   amt = sizeof (elf_linker_section_pointers_t);
2976   linker_section_ptr = bfd_alloc (abfd, amt);
2977 
2978   if (!linker_section_ptr)
2979     return FALSE;
2980 
2981   linker_section_ptr->next = *ptr_linker_section_ptr;
2982   linker_section_ptr->addend = rel->r_addend;
2983   linker_section_ptr->lsect = lsect;
2984   *ptr_linker_section_ptr = linker_section_ptr;
2985 
2986   linker_section_ptr->offset = lsect->section->size;
2987   lsect->section->size += 4;
2988 
2989 #ifdef DEBUG
2990   fprintf (stderr,
2991 	   "Create pointer in linker section %s, offset = %ld, section size = %ld\n",
2992 	   lsect->name, (long) linker_section_ptr->offset,
2993 	   (long) lsect->section->size);
2994 #endif
2995 
2996   return TRUE;
2997 }
2998 
2999 static bfd_boolean
update_local_sym_info(bfd * abfd,Elf_Internal_Shdr * symtab_hdr,unsigned long r_symndx,int tls_type)3000 update_local_sym_info (bfd *abfd,
3001 		       Elf_Internal_Shdr *symtab_hdr,
3002 		       unsigned long r_symndx,
3003 		       int tls_type)
3004 {
3005   bfd_signed_vma *local_got_refcounts = elf_local_got_refcounts (abfd);
3006   char *local_got_tls_masks;
3007 
3008   if (local_got_refcounts == NULL)
3009     {
3010       bfd_size_type size = symtab_hdr->sh_info;
3011 
3012       size *= sizeof (*local_got_refcounts) + sizeof (*local_got_tls_masks);
3013       local_got_refcounts = bfd_zalloc (abfd, size);
3014       if (local_got_refcounts == NULL)
3015 	return FALSE;
3016       elf_local_got_refcounts (abfd) = local_got_refcounts;
3017     }
3018 
3019   local_got_refcounts[r_symndx] += 1;
3020   local_got_tls_masks = (char *) (local_got_refcounts + symtab_hdr->sh_info);
3021   local_got_tls_masks[r_symndx] |= tls_type;
3022   return TRUE;
3023 }
3024 
3025 static bfd_boolean
update_plt_info(bfd * abfd,struct elf_link_hash_entry * h,asection * sec,bfd_vma addend)3026 update_plt_info (bfd *abfd, struct elf_link_hash_entry *h,
3027 		 asection *sec, bfd_vma addend)
3028 {
3029   struct plt_entry *ent;
3030 
3031   if (addend < 32768)
3032     sec = NULL;
3033   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
3034     if (ent->sec == sec && ent->addend == addend)
3035       break;
3036   if (ent == NULL)
3037     {
3038       bfd_size_type amt = sizeof (*ent);
3039       ent = bfd_alloc (abfd, amt);
3040       if (ent == NULL)
3041 	return FALSE;
3042       ent->next = h->plt.plist;
3043       ent->sec = sec;
3044       ent->addend = addend;
3045       ent->plt.refcount = 0;
3046       h->plt.plist = ent;
3047     }
3048   ent->plt.refcount += 1;
3049   return TRUE;
3050 }
3051 
3052 static struct plt_entry *
find_plt_ent(struct elf_link_hash_entry * h,asection * sec,bfd_vma addend)3053 find_plt_ent (struct elf_link_hash_entry *h, asection *sec, bfd_vma addend)
3054 {
3055   struct plt_entry *ent;
3056 
3057   if (addend < 32768)
3058     sec = NULL;
3059   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
3060     if (ent->sec == sec && ent->addend == addend)
3061       break;
3062   return ent;
3063 }
3064 
3065 static void
bad_shared_reloc(bfd * abfd,enum elf_ppc_reloc_type r_type)3066 bad_shared_reloc (bfd *abfd, enum elf_ppc_reloc_type r_type)
3067 {
3068   (*_bfd_error_handler)
3069     (_("%B: relocation %s cannot be used when making a shared object"),
3070      abfd,
3071      ppc_elf_howto_table[r_type]->name);
3072   bfd_set_error (bfd_error_bad_value);
3073 }
3074 
3075 /* Look through the relocs for a section during the first phase, and
3076    allocate space in the global offset table or procedure linkage
3077    table.  */
3078 
3079 static bfd_boolean
ppc_elf_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)3080 ppc_elf_check_relocs (bfd *abfd,
3081 		      struct bfd_link_info *info,
3082 		      asection *sec,
3083 		      const Elf_Internal_Rela *relocs)
3084 {
3085   struct ppc_elf_link_hash_table *htab;
3086   Elf_Internal_Shdr *symtab_hdr;
3087   struct elf_link_hash_entry **sym_hashes;
3088   const Elf_Internal_Rela *rel;
3089   const Elf_Internal_Rela *rel_end;
3090   asection *got2, *sreloc;
3091   struct elf_link_hash_entry *tga;
3092 
3093   if (info->relocatable)
3094     return TRUE;
3095 
3096   /* Don't do anything special with non-loaded, non-alloced sections.
3097      In particular, any relocs in such sections should not affect GOT
3098      and PLT reference counting (ie. we don't allow them to create GOT
3099      or PLT entries), there's no possibility or desire to optimize TLS
3100      relocs, and there's not much point in propagating relocs to shared
3101      libs that the dynamic linker won't relocate.  */
3102   if ((sec->flags & SEC_ALLOC) == 0)
3103     return TRUE;
3104 
3105 #ifdef DEBUG
3106   _bfd_error_handler ("ppc_elf_check_relocs called for section %A in %B",
3107 		      sec, abfd);
3108 #endif
3109 
3110   /* Initialize howto table if not already done.  */
3111   if (!ppc_elf_howto_table[R_PPC_ADDR32])
3112     ppc_elf_howto_init ();
3113 
3114   htab = ppc_elf_hash_table (info);
3115   tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
3116 			      FALSE, FALSE, TRUE);
3117   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3118   sym_hashes = elf_sym_hashes (abfd);
3119   got2 = bfd_get_section_by_name (abfd, ".got2");
3120   sreloc = NULL;
3121 
3122   rel_end = relocs + sec->reloc_count;
3123   for (rel = relocs; rel < rel_end; rel++)
3124     {
3125       unsigned long r_symndx;
3126       enum elf_ppc_reloc_type r_type;
3127       struct elf_link_hash_entry *h;
3128       int tls_type;
3129 
3130       r_symndx = ELF32_R_SYM (rel->r_info);
3131       if (r_symndx < symtab_hdr->sh_info)
3132 	h = NULL;
3133       else
3134 	{
3135 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3136 	  while (h->root.type == bfd_link_hash_indirect
3137 		 || h->root.type == bfd_link_hash_warning)
3138 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
3139 	}
3140 
3141       /* If a relocation refers to _GLOBAL_OFFSET_TABLE_, create the .got.
3142 	 This shows up in particular in an R_PPC_ADDR32 in the eabi
3143 	 startup code.  */
3144       if (h != NULL
3145 	  && htab->got == NULL
3146 	  && strcmp (h->root.root.string, "_GLOBAL_OFFSET_TABLE_") == 0)
3147 	{
3148 	  if (htab->elf.dynobj == NULL)
3149 	    htab->elf.dynobj = abfd;
3150 	  if (!ppc_elf_create_got (htab->elf.dynobj, info))
3151 	    return FALSE;
3152 	  BFD_ASSERT (h == htab->elf.hgot);
3153 	}
3154 
3155       tls_type = 0;
3156       r_type = ELF32_R_TYPE (rel->r_info);
3157       if (h != NULL && h == tga)
3158 	switch (r_type)
3159 	  {
3160 	  default:
3161 	    break;
3162 
3163 	  case R_PPC_PLTREL24:
3164 	  case R_PPC_LOCAL24PC:
3165 	  case R_PPC_REL24:
3166 	  case R_PPC_REL14:
3167 	  case R_PPC_REL14_BRTAKEN:
3168 	  case R_PPC_REL14_BRNTAKEN:
3169 	  case R_PPC_ADDR24:
3170 	  case R_PPC_ADDR14:
3171 	  case R_PPC_ADDR14_BRTAKEN:
3172 	  case R_PPC_ADDR14_BRNTAKEN:
3173 	    if (rel != relocs
3174 		&& (ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSGD
3175 		    || ELF32_R_TYPE (rel[-1].r_info) == R_PPC_TLSLD))
3176 	      /* We have a new-style __tls_get_addr call with a marker
3177 		 reloc.  */
3178 	      ;
3179 	    else
3180 	      /* Mark this section as having an old-style call.  */
3181 	      sec->has_tls_get_addr_call = 1;
3182 	    break;
3183 	  }
3184 
3185       switch (r_type)
3186 	{
3187 	case R_PPC_TLSGD:
3188 	case R_PPC_TLSLD:
3189 	  /* These special tls relocs tie a call to __tls_get_addr with
3190 	     its parameter symbol.  */
3191 	  break;
3192 
3193 	case R_PPC_GOT_TLSLD16:
3194 	case R_PPC_GOT_TLSLD16_LO:
3195 	case R_PPC_GOT_TLSLD16_HI:
3196 	case R_PPC_GOT_TLSLD16_HA:
3197 	  tls_type = TLS_TLS | TLS_LD;
3198 	  goto dogottls;
3199 
3200 	case R_PPC_GOT_TLSGD16:
3201 	case R_PPC_GOT_TLSGD16_LO:
3202 	case R_PPC_GOT_TLSGD16_HI:
3203 	case R_PPC_GOT_TLSGD16_HA:
3204 	  tls_type = TLS_TLS | TLS_GD;
3205 	  goto dogottls;
3206 
3207 	case R_PPC_GOT_TPREL16:
3208 	case R_PPC_GOT_TPREL16_LO:
3209 	case R_PPC_GOT_TPREL16_HI:
3210 	case R_PPC_GOT_TPREL16_HA:
3211 	  if (!info->executable)
3212 	    info->flags |= DF_STATIC_TLS;
3213 	  tls_type = TLS_TLS | TLS_TPREL;
3214 	  goto dogottls;
3215 
3216 	case R_PPC_GOT_DTPREL16:
3217 	case R_PPC_GOT_DTPREL16_LO:
3218 	case R_PPC_GOT_DTPREL16_HI:
3219 	case R_PPC_GOT_DTPREL16_HA:
3220 	  tls_type = TLS_TLS | TLS_DTPREL;
3221 	dogottls:
3222 	  sec->has_tls_reloc = 1;
3223 	  /* Fall thru */
3224 
3225 	  /* GOT16 relocations */
3226 	case R_PPC_GOT16:
3227 	case R_PPC_GOT16_LO:
3228 	case R_PPC_GOT16_HI:
3229 	case R_PPC_GOT16_HA:
3230 	  /* This symbol requires a global offset table entry.  */
3231 	  if (htab->got == NULL)
3232 	    {
3233 	      if (htab->elf.dynobj == NULL)
3234 		htab->elf.dynobj = abfd;
3235 	      if (!ppc_elf_create_got (htab->elf.dynobj, info))
3236 		return FALSE;
3237 	    }
3238 	  if (h != NULL)
3239 	    {
3240 	      h->got.refcount += 1;
3241 	      ppc_elf_hash_entry (h)->tls_mask |= tls_type;
3242 	    }
3243 	  else
3244 	    /* This is a global offset table entry for a local symbol.  */
3245 	    if (!update_local_sym_info (abfd, symtab_hdr, r_symndx, tls_type))
3246 	      return FALSE;
3247 	  break;
3248 
3249 	  /* Indirect .sdata relocation.  */
3250 	case R_PPC_EMB_SDAI16:
3251 	  if (info->shared)
3252 	    {
3253 	      bad_shared_reloc (abfd, r_type);
3254 	      return FALSE;
3255 	    }
3256 	  if (htab->sdata[0].section == NULL
3257 	      && !ppc_elf_create_linker_section (abfd, info, 0,
3258 						 &htab->sdata[0]))
3259 	    return FALSE;
3260 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[0],
3261 						  h, rel))
3262 	    return FALSE;
3263 	  if (h != NULL)
3264 	    {
3265 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3266 	      h->non_got_ref = TRUE;
3267 	    }
3268 	  break;
3269 
3270 	  /* Indirect .sdata2 relocation.  */
3271 	case R_PPC_EMB_SDA2I16:
3272 	  if (info->shared)
3273 	    {
3274 	      bad_shared_reloc (abfd, r_type);
3275 	      return FALSE;
3276 	    }
3277 	  if (htab->sdata[1].section == NULL
3278 	      && !ppc_elf_create_linker_section (abfd, info, SEC_READONLY,
3279 						 &htab->sdata[1]))
3280 	    return FALSE;
3281 	  if (!elf_create_pointer_linker_section (abfd, &htab->sdata[1],
3282 						  h, rel))
3283 	    return FALSE;
3284 	  if (h != NULL)
3285 	    {
3286 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3287 	      h->non_got_ref = TRUE;
3288 	    }
3289 	  break;
3290 
3291 	case R_PPC_SDAREL16:
3292 	  if (info->shared)
3293 	    {
3294 	      bad_shared_reloc (abfd, r_type);
3295 	      return FALSE;
3296 	    }
3297 	  if (htab->sdata[0].sym == NULL
3298 	      && !create_sdata_sym (htab, &htab->sdata[0]))
3299 	    return FALSE;
3300 	  if (h != NULL)
3301 	    {
3302 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3303 	      h->non_got_ref = TRUE;
3304 	    }
3305 	  break;
3306 
3307 	case R_PPC_EMB_SDA2REL:
3308 	  if (info->shared)
3309 	    {
3310 	      bad_shared_reloc (abfd, r_type);
3311 	      return FALSE;
3312 	    }
3313 	  if (htab->sdata[1].sym == NULL
3314 	      && !create_sdata_sym (htab, &htab->sdata[1]))
3315 	    return FALSE;
3316 	  if (h != NULL)
3317 	    {
3318 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3319 	      h->non_got_ref = TRUE;
3320 	    }
3321 	  break;
3322 
3323 	case R_PPC_EMB_SDA21:
3324 	case R_PPC_EMB_RELSDA:
3325 	  if (info->shared)
3326 	    {
3327 	      bad_shared_reloc (abfd, r_type);
3328 	      return FALSE;
3329 	    }
3330 	  if (htab->sdata[0].sym == NULL
3331 	      && !create_sdata_sym (htab, &htab->sdata[0]))
3332 	    return FALSE;
3333 	  if (htab->sdata[1].sym == NULL
3334 	      && !create_sdata_sym (htab, &htab->sdata[1]))
3335 	    return FALSE;
3336 	  if (h != NULL)
3337 	    {
3338 	      ppc_elf_hash_entry (h)->has_sda_refs = TRUE;
3339 	      h->non_got_ref = TRUE;
3340 	    }
3341 	  break;
3342 
3343 	case R_PPC_EMB_NADDR32:
3344 	case R_PPC_EMB_NADDR16:
3345 	case R_PPC_EMB_NADDR16_LO:
3346 	case R_PPC_EMB_NADDR16_HI:
3347 	case R_PPC_EMB_NADDR16_HA:
3348 	  if (info->shared)
3349 	    {
3350 	      bad_shared_reloc (abfd, r_type);
3351 	      return FALSE;
3352 	    }
3353 	  if (h != NULL)
3354 	    h->non_got_ref = TRUE;
3355 	  break;
3356 
3357 	case R_PPC_PLT32:
3358 	case R_PPC_PLTREL24:
3359 	case R_PPC_PLTREL32:
3360 	case R_PPC_PLT16_LO:
3361 	case R_PPC_PLT16_HI:
3362 	case R_PPC_PLT16_HA:
3363 #ifdef DEBUG
3364 	  fprintf (stderr, "Reloc requires a PLT entry\n");
3365 #endif
3366 	  /* This symbol requires a procedure linkage table entry.  We
3367 	     actually build the entry in finish_dynamic_symbol,
3368 	     because this might be a case of linking PIC code without
3369 	     linking in any dynamic objects, in which case we don't
3370 	     need to generate a procedure linkage table after all.  */
3371 
3372 	  if (h == NULL)
3373 	    {
3374 	      /* It does not make sense to have a procedure linkage
3375 		 table entry for a local symbol.  */
3376 	      (*_bfd_error_handler) (_("%B(%A+0x%lx): %s reloc against "
3377 				       "local symbol"),
3378 				     abfd,
3379 				     sec,
3380 				     (long) rel->r_offset,
3381 				     ppc_elf_howto_table[r_type]->name);
3382 	      bfd_set_error (bfd_error_bad_value);
3383 	      return FALSE;
3384 	    }
3385 	  else
3386 	    {
3387 	      bfd_vma addend = 0;
3388 
3389 	      if (r_type == R_PPC_PLTREL24)
3390 		{
3391 		  ppc_elf_tdata (abfd)->makes_plt_call = 1;
3392 		  addend = rel->r_addend;
3393 		}
3394 	      h->needs_plt = 1;
3395 	      if (!update_plt_info (abfd, h, got2, addend))
3396 		return FALSE;
3397 	    }
3398 	  break;
3399 
3400 	  /* The following relocations don't need to propagate the
3401 	     relocation if linking a shared object since they are
3402 	     section relative.  */
3403 	case R_PPC_SECTOFF:
3404 	case R_PPC_SECTOFF_LO:
3405 	case R_PPC_SECTOFF_HI:
3406 	case R_PPC_SECTOFF_HA:
3407 	case R_PPC_DTPREL16:
3408 	case R_PPC_DTPREL16_LO:
3409 	case R_PPC_DTPREL16_HI:
3410 	case R_PPC_DTPREL16_HA:
3411 	case R_PPC_TOC16:
3412 	  break;
3413 
3414 	case R_PPC_REL16:
3415 	case R_PPC_REL16_LO:
3416 	case R_PPC_REL16_HI:
3417 	case R_PPC_REL16_HA:
3418 	  ppc_elf_tdata (abfd)->has_rel16 = 1;
3419 	  break;
3420 
3421 	  /* These are just markers.  */
3422 	case R_PPC_TLS:
3423 	case R_PPC_EMB_MRKREF:
3424 	case R_PPC_NONE:
3425 	case R_PPC_max:
3426 	  break;
3427 
3428 	  /* These should only appear in dynamic objects.  */
3429 	case R_PPC_COPY:
3430 	case R_PPC_GLOB_DAT:
3431 	case R_PPC_JMP_SLOT:
3432 	case R_PPC_RELATIVE:
3433 	  break;
3434 
3435 	  /* These aren't handled yet.  We'll report an error later.  */
3436 	case R_PPC_ADDR30:
3437 	case R_PPC_EMB_RELSEC16:
3438 	case R_PPC_EMB_RELST_LO:
3439 	case R_PPC_EMB_RELST_HI:
3440 	case R_PPC_EMB_RELST_HA:
3441 	case R_PPC_EMB_BIT_FLD:
3442 	  break;
3443 
3444 	  /* This refers only to functions defined in the shared library.  */
3445 	case R_PPC_LOCAL24PC:
3446 	  if (h != NULL && h == htab->elf.hgot && htab->plt_type == PLT_UNSET)
3447 	    {
3448 	      htab->plt_type = PLT_OLD;
3449 	      htab->old_bfd = abfd;
3450 	    }
3451 	  break;
3452 
3453 	  /* This relocation describes the C++ object vtable hierarchy.
3454 	     Reconstruct it for later use during GC.  */
3455 	case R_PPC_GNU_VTINHERIT:
3456 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
3457 	    return FALSE;
3458 	  break;
3459 
3460 	  /* This relocation describes which C++ vtable entries are actually
3461 	     used.  Record for later use during GC.  */
3462 	case R_PPC_GNU_VTENTRY:
3463 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
3464 	    return FALSE;
3465 	  break;
3466 
3467 	  /* We shouldn't really be seeing these.  */
3468 	case R_PPC_TPREL32:
3469 	case R_PPC_TPREL16:
3470 	case R_PPC_TPREL16_LO:
3471 	case R_PPC_TPREL16_HI:
3472 	case R_PPC_TPREL16_HA:
3473 	  if (!info->executable)
3474 	    info->flags |= DF_STATIC_TLS;
3475 	  goto dodyn;
3476 
3477 	  /* Nor these.  */
3478 	case R_PPC_DTPMOD32:
3479 	case R_PPC_DTPREL32:
3480 	  goto dodyn;
3481 
3482 	case R_PPC_REL32:
3483 	  if (h == NULL
3484 	      && got2 != NULL
3485 	      && (sec->flags & SEC_CODE) != 0
3486 	      && (info->shared || info->pie)
3487 	      && htab->plt_type == PLT_UNSET)
3488 	    {
3489 	      /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
3490 		 the start of a function, which assembles to a REL32
3491 		 reference to .got2.  If we detect one of these, then
3492 		 force the old PLT layout because the linker cannot
3493 		 reliably deduce the GOT pointer value needed for
3494 		 PLT call stubs.  */
3495 	      asection *s;
3496 
3497 	      s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
3498 					     r_symndx);
3499 	      if (s == got2)
3500 		{
3501 		  htab->plt_type = PLT_OLD;
3502 		  htab->old_bfd = abfd;
3503 		}
3504 	    }
3505 	  if (h == NULL || h == htab->elf.hgot)
3506 	    break;
3507 	  goto dodyn1;
3508 
3509 	case R_PPC_REL24:
3510 	case R_PPC_REL14:
3511 	case R_PPC_REL14_BRTAKEN:
3512 	case R_PPC_REL14_BRNTAKEN:
3513 	  if (h == NULL)
3514 	    break;
3515 	  if (h == htab->elf.hgot)
3516 	    {
3517 	      if (htab->plt_type == PLT_UNSET)
3518 		{
3519 		  htab->plt_type = PLT_OLD;
3520 		  htab->old_bfd = abfd;
3521 		}
3522 	      break;
3523 	    }
3524 	  /* fall through */
3525 
3526 	case R_PPC_ADDR32:
3527 	case R_PPC_ADDR24:
3528 	case R_PPC_ADDR16:
3529 	case R_PPC_ADDR16_LO:
3530 	case R_PPC_ADDR16_HI:
3531 	case R_PPC_ADDR16_HA:
3532 	case R_PPC_ADDR14:
3533 	case R_PPC_ADDR14_BRTAKEN:
3534 	case R_PPC_ADDR14_BRNTAKEN:
3535 	case R_PPC_UADDR32:
3536 	case R_PPC_UADDR16:
3537 	dodyn1:
3538 	  if (h != NULL && !info->shared)
3539 	    {
3540 	      /* We may need a plt entry if the symbol turns out to be
3541 		 a function defined in a dynamic object.  */
3542 	      if (!update_plt_info (abfd, h, NULL, 0))
3543 		return FALSE;
3544 
3545 	      /* We may need a copy reloc too.  */
3546 	      h->non_got_ref = 1;
3547 	    }
3548 
3549 	dodyn:
3550 	  /* If we are creating a shared library, and this is a reloc
3551 	     against a global symbol, or a non PC relative reloc
3552 	     against a local symbol, then we need to copy the reloc
3553 	     into the shared library.  However, if we are linking with
3554 	     -Bsymbolic, we do not need to copy a reloc against a
3555 	     global symbol which is defined in an object we are
3556 	     including in the link (i.e., DEF_REGULAR is set).  At
3557 	     this point we have not seen all the input files, so it is
3558 	     possible that DEF_REGULAR is not set now but will be set
3559 	     later (it is never cleared).  In case of a weak definition,
3560 	     DEF_REGULAR may be cleared later by a strong definition in
3561 	     a shared library.  We account for that possibility below by
3562 	     storing information in the dyn_relocs field of the hash
3563 	     table entry.  A similar situation occurs when creating
3564 	     shared libraries and symbol visibility changes render the
3565 	     symbol local.
3566 
3567 	     If on the other hand, we are creating an executable, we
3568 	     may need to keep relocations for symbols satisfied by a
3569 	     dynamic library if we manage to avoid copy relocs for the
3570 	     symbol.  */
3571 	  if ((info->shared
3572 	       && (must_be_dyn_reloc (info, r_type)
3573 		   || (h != NULL
3574 		       && (! info->symbolic
3575 			   || h->root.type == bfd_link_hash_defweak
3576 			   || !h->def_regular))))
3577 	      || (ELIMINATE_COPY_RELOCS
3578 		  && !info->shared
3579 		  && h != NULL
3580 		  && (h->root.type == bfd_link_hash_defweak
3581 		      || !h->def_regular)))
3582 	    {
3583 	      struct ppc_elf_dyn_relocs *p;
3584 	      struct ppc_elf_dyn_relocs **head;
3585 
3586 #ifdef DEBUG
3587 	      fprintf (stderr,
3588 		       "ppc_elf_check_relocs needs to "
3589 		       "create relocation for %s\n",
3590 		       (h && h->root.root.string
3591 			? h->root.root.string : "<unknown>"));
3592 #endif
3593 	      if (sreloc == NULL)
3594 		{
3595 		  const char *name;
3596 
3597 		  name = (bfd_elf_string_from_elf_section
3598 			  (abfd,
3599 			   elf_elfheader (abfd)->e_shstrndx,
3600 			   elf_section_data (sec)->rel_hdr.sh_name));
3601 		  if (name == NULL)
3602 		    return FALSE;
3603 
3604 		  BFD_ASSERT (CONST_STRNEQ (name, ".rela")
3605 			      && strcmp (bfd_get_section_name (abfd, sec),
3606 					 name + 5) == 0);
3607 
3608 		  if (htab->elf.dynobj == NULL)
3609 		    htab->elf.dynobj = abfd;
3610 		  sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
3611 		  if (sreloc == NULL)
3612 		    {
3613 		      flagword flags;
3614 
3615 		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
3616 			       | SEC_IN_MEMORY | SEC_LINKER_CREATED
3617 			       | SEC_ALLOC | SEC_LOAD);
3618 		      sreloc = bfd_make_section_with_flags (htab->elf.dynobj,
3619 							    name,
3620 							    flags);
3621 		      if (sreloc == NULL
3622 			  || ! bfd_set_section_alignment (htab->elf.dynobj,
3623 							  sreloc, 2))
3624 			return FALSE;
3625 		    }
3626 		  elf_section_data (sec)->sreloc = sreloc;
3627 		}
3628 
3629 	      /* If this is a global symbol, we count the number of
3630 		 relocations we need for this symbol.  */
3631 	      if (h != NULL)
3632 		{
3633 		  head = &ppc_elf_hash_entry (h)->dyn_relocs;
3634 		}
3635 	      else
3636 		{
3637 		  /* Track dynamic relocs needed for local syms too.
3638 		     We really need local syms available to do this
3639 		     easily.  Oh well.  */
3640 
3641 		  asection *s;
3642 		  void *vpp;
3643 
3644 		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
3645 						 sec, r_symndx);
3646 		  if (s == NULL)
3647 		    return FALSE;
3648 
3649 		  vpp = &elf_section_data (s)->local_dynrel;
3650 		  head = (struct ppc_elf_dyn_relocs **) vpp;
3651 		}
3652 
3653 	      p = *head;
3654 	      if (p == NULL || p->sec != sec)
3655 		{
3656 		  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
3657 		  if (p == NULL)
3658 		    return FALSE;
3659 		  p->next = *head;
3660 		  *head = p;
3661 		  p->sec = sec;
3662 		  p->count = 0;
3663 		  p->pc_count = 0;
3664 		}
3665 
3666 	      p->count += 1;
3667 	      if (!must_be_dyn_reloc (info, r_type))
3668 		p->pc_count += 1;
3669 	    }
3670 
3671 	  break;
3672 	}
3673     }
3674 
3675   return TRUE;
3676 }
3677 
3678 
3679 /* Merge object attributes from IBFD into OBFD.  Raise an error if
3680    there are conflicting attributes.  */
3681 static bfd_boolean
ppc_elf_merge_obj_attributes(bfd * ibfd,bfd * obfd)3682 ppc_elf_merge_obj_attributes (bfd *ibfd, bfd *obfd)
3683 {
3684   obj_attribute *in_attr;
3685   obj_attribute *out_attr;
3686 
3687   if (!elf_known_obj_attributes_proc (obfd)[0].i)
3688     {
3689       /* This is the first object.  Copy the attributes.  */
3690       _bfd_elf_copy_obj_attributes (ibfd, obfd);
3691 
3692       /* Use the Tag_null value to indicate the attributes have been
3693 	 initialized.  */
3694       elf_known_obj_attributes_proc (obfd)[0].i = 1;
3695 
3696       return TRUE;
3697     }
3698 
3699   /* Check for conflicting Tag_GNU_Power_ABI_FP attributes and merge
3700      non-conflicting ones.  */
3701   in_attr = elf_known_obj_attributes (ibfd)[OBJ_ATTR_GNU];
3702   out_attr = elf_known_obj_attributes (obfd)[OBJ_ATTR_GNU];
3703   if (in_attr[Tag_GNU_Power_ABI_FP].i != out_attr[Tag_GNU_Power_ABI_FP].i)
3704     {
3705       out_attr[Tag_GNU_Power_ABI_FP].type = 1;
3706       if (out_attr[Tag_GNU_Power_ABI_FP].i == 0)
3707 	out_attr[Tag_GNU_Power_ABI_FP].i = in_attr[Tag_GNU_Power_ABI_FP].i;
3708       else if (in_attr[Tag_GNU_Power_ABI_FP].i == 0)
3709 	;
3710       else if (out_attr[Tag_GNU_Power_ABI_FP].i == 1
3711 	       && in_attr[Tag_GNU_Power_ABI_FP].i == 2)
3712 	_bfd_error_handler
3713 	  (_("Warning: %B uses hard float, %B uses soft float"), obfd, ibfd);
3714       else if (out_attr[Tag_GNU_Power_ABI_FP].i == 2
3715 	       && in_attr[Tag_GNU_Power_ABI_FP].i == 1)
3716 	_bfd_error_handler
3717 	  (_("Warning: %B uses hard float, %B uses soft float"), ibfd, obfd);
3718       else if (in_attr[Tag_GNU_Power_ABI_FP].i > 2)
3719 	_bfd_error_handler
3720 	  (_("Warning: %B uses unknown floating point ABI %d"), ibfd,
3721 	   in_attr[Tag_GNU_Power_ABI_FP].i);
3722       else
3723 	_bfd_error_handler
3724 	  (_("Warning: %B uses unknown floating point ABI %d"), obfd,
3725 	   out_attr[Tag_GNU_Power_ABI_FP].i);
3726     }
3727 
3728   /* Merge Tag_compatibility attributes and any common GNU ones.  */
3729   _bfd_elf_merge_object_attributes (ibfd, obfd);
3730 
3731   return TRUE;
3732 }
3733 
3734 /* Merge backend specific data from an object file to the output
3735    object file when linking.  */
3736 
3737 static bfd_boolean
ppc_elf_merge_private_bfd_data(bfd * ibfd,bfd * obfd)3738 ppc_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
3739 {
3740   flagword old_flags;
3741   flagword new_flags;
3742   bfd_boolean error;
3743 
3744   if (!is_ppc_elf_target (ibfd->xvec)
3745       || !is_ppc_elf_target (obfd->xvec))
3746     return TRUE;
3747 
3748   /* Check if we have the same endianess.  */
3749   if (! _bfd_generic_verify_endian_match (ibfd, obfd))
3750     return FALSE;
3751 
3752   if (!ppc_elf_merge_obj_attributes (ibfd, obfd))
3753     return FALSE;
3754 
3755   new_flags = elf_elfheader (ibfd)->e_flags;
3756   old_flags = elf_elfheader (obfd)->e_flags;
3757   if (!elf_flags_init (obfd))
3758     {
3759       /* First call, no flags set.  */
3760       elf_flags_init (obfd) = TRUE;
3761       elf_elfheader (obfd)->e_flags = new_flags;
3762     }
3763 
3764   /* Compatible flags are ok.  */
3765   else if (new_flags == old_flags)
3766     ;
3767 
3768   /* Incompatible flags.  */
3769   else
3770     {
3771       /* Warn about -mrelocatable mismatch.  Allow -mrelocatable-lib
3772 	 to be linked with either.  */
3773       error = FALSE;
3774       if ((new_flags & EF_PPC_RELOCATABLE) != 0
3775 	  && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
3776 	{
3777 	  error = TRUE;
3778 	  (*_bfd_error_handler)
3779 	    (_("%B: compiled with -mrelocatable and linked with "
3780 	       "modules compiled normally"), ibfd);
3781 	}
3782       else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
3783 	       && (old_flags & EF_PPC_RELOCATABLE) != 0)
3784 	{
3785 	  error = TRUE;
3786 	  (*_bfd_error_handler)
3787 	    (_("%B: compiled normally and linked with "
3788 	       "modules compiled with -mrelocatable"), ibfd);
3789 	}
3790 
3791       /* The output is -mrelocatable-lib iff both the input files are.  */
3792       if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
3793 	elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
3794 
3795       /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
3796 	 but each input file is either -mrelocatable or -mrelocatable-lib.  */
3797       if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
3798 	  && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
3799 	  && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
3800 	elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
3801 
3802       /* Do not warn about eabi vs. V.4 mismatch, just or in the bit if
3803 	 any module uses it.  */
3804       elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
3805 
3806       new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3807       old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
3808 
3809       /* Warn about any other mismatches.  */
3810       if (new_flags != old_flags)
3811 	{
3812 	  error = TRUE;
3813 	  (*_bfd_error_handler)
3814 	    (_("%B: uses different e_flags (0x%lx) fields "
3815 	       "than previous modules (0x%lx)"),
3816 	     ibfd, (long) new_flags, (long) old_flags);
3817 	}
3818 
3819       if (error)
3820 	{
3821 	  bfd_set_error (bfd_error_bad_value);
3822 	  return FALSE;
3823 	}
3824     }
3825 
3826   return TRUE;
3827 }
3828 
3829 /* Choose which PLT scheme to use, and set .plt flags appropriately.
3830    Returns -1 on error, 0 for old PLT, 1 for new PLT.  */
3831 int
ppc_elf_select_plt_layout(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info,enum ppc_elf_plt_type plt_style,int emit_stub_syms)3832 ppc_elf_select_plt_layout (bfd *output_bfd ATTRIBUTE_UNUSED,
3833 			   struct bfd_link_info *info,
3834 			   enum ppc_elf_plt_type plt_style,
3835 			   int emit_stub_syms)
3836 {
3837   struct ppc_elf_link_hash_table *htab;
3838   flagword flags;
3839 
3840   htab = ppc_elf_hash_table (info);
3841 
3842   if (htab->plt_type == PLT_UNSET)
3843     {
3844       if (plt_style == PLT_OLD)
3845 	htab->plt_type = PLT_OLD;
3846       else
3847 	{
3848 	  bfd *ibfd;
3849 	  enum ppc_elf_plt_type plt_type = plt_style;
3850 
3851 	  /* Look through the reloc flags left by ppc_elf_check_relocs.
3852 	     Use the old style bss plt if a file makes plt calls
3853 	     without using the new relocs, and if ld isn't given
3854 	     --secure-plt and we never see REL16 relocs.  */
3855 	  if (plt_type == PLT_UNSET)
3856 	    plt_type = PLT_OLD;
3857 	  for (ibfd = info->input_bfds; ibfd; ibfd = ibfd->link_next)
3858 	    if (is_ppc_elf_target (ibfd->xvec))
3859 	      {
3860 		if (ppc_elf_tdata (ibfd)->has_rel16)
3861 		  plt_type = PLT_NEW;
3862 		else if (ppc_elf_tdata (ibfd)->makes_plt_call)
3863 		  {
3864 		    plt_type = PLT_OLD;
3865 		    htab->old_bfd = ibfd;
3866 		    break;
3867 		  }
3868 	      }
3869 	  htab->plt_type = plt_type;
3870 	}
3871     }
3872   if (htab->plt_type == PLT_OLD && plt_style == PLT_NEW)
3873     info->callbacks->info (_("Using bss-plt due to %B"), htab->old_bfd);
3874 
3875   htab->emit_stub_syms = emit_stub_syms;
3876 
3877   BFD_ASSERT (htab->plt_type != PLT_VXWORKS);
3878 
3879   if (htab->plt_type == PLT_NEW)
3880     {
3881       flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
3882 	       | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3883 
3884       /* The new PLT is a loaded section.  */
3885       if (htab->plt != NULL
3886 	  && !bfd_set_section_flags (htab->elf.dynobj, htab->plt, flags))
3887 	return -1;
3888 
3889       /* The new GOT is not executable.  */
3890       if (htab->got != NULL
3891 	  && !bfd_set_section_flags (htab->elf.dynobj, htab->got, flags))
3892 	return -1;
3893     }
3894   else
3895     {
3896       /* Stop an unused .glink section from affecting .text alignment.  */
3897       if (htab->glink != NULL
3898 	  && !bfd_set_section_alignment (htab->elf.dynobj, htab->glink, 0))
3899 	return -1;
3900     }
3901   return htab->plt_type == PLT_NEW;
3902 }
3903 
3904 /* Return the section that should be marked against GC for a given
3905    relocation.  */
3906 
3907 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)3908 ppc_elf_gc_mark_hook (asection *sec,
3909 		      struct bfd_link_info *info,
3910 		      Elf_Internal_Rela *rel,
3911 		      struct elf_link_hash_entry *h,
3912 		      Elf_Internal_Sym *sym)
3913 {
3914   if (h != NULL)
3915     switch (ELF32_R_TYPE (rel->r_info))
3916       {
3917       case R_PPC_GNU_VTINHERIT:
3918       case R_PPC_GNU_VTENTRY:
3919 	return NULL;
3920       }
3921 
3922   return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
3923 }
3924 
3925 /* Update the got, plt and dynamic reloc reference counts for the
3926    section being removed.  */
3927 
3928 static bfd_boolean
ppc_elf_gc_sweep_hook(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)3929 ppc_elf_gc_sweep_hook (bfd *abfd,
3930 		       struct bfd_link_info *info,
3931 		       asection *sec,
3932 		       const Elf_Internal_Rela *relocs)
3933 {
3934   struct ppc_elf_link_hash_table *htab;
3935   Elf_Internal_Shdr *symtab_hdr;
3936   struct elf_link_hash_entry **sym_hashes;
3937   bfd_signed_vma *local_got_refcounts;
3938   const Elf_Internal_Rela *rel, *relend;
3939   asection *got2;
3940 
3941   if ((sec->flags & SEC_ALLOC) == 0)
3942     return TRUE;
3943 
3944   elf_section_data (sec)->local_dynrel = NULL;
3945 
3946   htab = ppc_elf_hash_table (info);
3947   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
3948   sym_hashes = elf_sym_hashes (abfd);
3949   local_got_refcounts = elf_local_got_refcounts (abfd);
3950   got2 = bfd_get_section_by_name (abfd, ".got2");
3951 
3952   relend = relocs + sec->reloc_count;
3953   for (rel = relocs; rel < relend; rel++)
3954     {
3955       unsigned long r_symndx;
3956       enum elf_ppc_reloc_type r_type;
3957       struct elf_link_hash_entry *h = NULL;
3958 
3959       r_symndx = ELF32_R_SYM (rel->r_info);
3960       if (r_symndx >= symtab_hdr->sh_info)
3961 	{
3962 	  struct ppc_elf_dyn_relocs **pp, *p;
3963 	  struct ppc_elf_link_hash_entry *eh;
3964 
3965 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3966 	  while (h->root.type == bfd_link_hash_indirect
3967 		 || h->root.type == bfd_link_hash_warning)
3968 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
3969 	  eh = (struct ppc_elf_link_hash_entry *) h;
3970 
3971 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
3972 	    if (p->sec == sec)
3973 	      {
3974 		/* Everything must go for SEC.  */
3975 		*pp = p->next;
3976 		break;
3977 	      }
3978 	}
3979 
3980       r_type = ELF32_R_TYPE (rel->r_info);
3981       switch (r_type)
3982 	{
3983 	case R_PPC_GOT_TLSLD16:
3984 	case R_PPC_GOT_TLSLD16_LO:
3985 	case R_PPC_GOT_TLSLD16_HI:
3986 	case R_PPC_GOT_TLSLD16_HA:
3987 	case R_PPC_GOT_TLSGD16:
3988 	case R_PPC_GOT_TLSGD16_LO:
3989 	case R_PPC_GOT_TLSGD16_HI:
3990 	case R_PPC_GOT_TLSGD16_HA:
3991 	case R_PPC_GOT_TPREL16:
3992 	case R_PPC_GOT_TPREL16_LO:
3993 	case R_PPC_GOT_TPREL16_HI:
3994 	case R_PPC_GOT_TPREL16_HA:
3995 	case R_PPC_GOT_DTPREL16:
3996 	case R_PPC_GOT_DTPREL16_LO:
3997 	case R_PPC_GOT_DTPREL16_HI:
3998 	case R_PPC_GOT_DTPREL16_HA:
3999 	case R_PPC_GOT16:
4000 	case R_PPC_GOT16_LO:
4001 	case R_PPC_GOT16_HI:
4002 	case R_PPC_GOT16_HA:
4003 	  if (h != NULL)
4004 	    {
4005 	      if (h->got.refcount > 0)
4006 		h->got.refcount--;
4007 	    }
4008 	  else if (local_got_refcounts != NULL)
4009 	    {
4010 	      if (local_got_refcounts[r_symndx] > 0)
4011 		local_got_refcounts[r_symndx]--;
4012 	    }
4013 	  break;
4014 
4015 	case R_PPC_REL24:
4016 	case R_PPC_REL14:
4017 	case R_PPC_REL14_BRTAKEN:
4018 	case R_PPC_REL14_BRNTAKEN:
4019 	case R_PPC_REL32:
4020 	  if (h == NULL || h == htab->elf.hgot)
4021 	    break;
4022 	  /* Fall thru */
4023 
4024 	case R_PPC_ADDR32:
4025 	case R_PPC_ADDR24:
4026 	case R_PPC_ADDR16:
4027 	case R_PPC_ADDR16_LO:
4028 	case R_PPC_ADDR16_HI:
4029 	case R_PPC_ADDR16_HA:
4030 	case R_PPC_ADDR14:
4031 	case R_PPC_ADDR14_BRTAKEN:
4032 	case R_PPC_ADDR14_BRNTAKEN:
4033 	case R_PPC_UADDR32:
4034 	case R_PPC_UADDR16:
4035 	  if (info->shared)
4036 	    break;
4037 
4038 	case R_PPC_PLT32:
4039 	case R_PPC_PLTREL24:
4040 	case R_PPC_PLTREL32:
4041 	case R_PPC_PLT16_LO:
4042 	case R_PPC_PLT16_HI:
4043 	case R_PPC_PLT16_HA:
4044 	  if (h != NULL)
4045 	    {
4046 	      bfd_vma addend = r_type == R_PPC_PLTREL24 ? rel->r_addend : 0;
4047 	      struct plt_entry *ent = find_plt_ent (h, got2, addend);
4048 	      if (ent->plt.refcount > 0)
4049 		ent->plt.refcount -= 1;
4050 	    }
4051 	  break;
4052 
4053 	default:
4054 	  break;
4055 	}
4056     }
4057   return TRUE;
4058 }
4059 
4060 /* Set plt output section type, htab->tls_get_addr, and call the
4061    generic ELF tls_setup function.  */
4062 
4063 asection *
ppc_elf_tls_setup(bfd * obfd,struct bfd_link_info * info)4064 ppc_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
4065 {
4066   struct ppc_elf_link_hash_table *htab;
4067 
4068   htab = ppc_elf_hash_table (info);
4069   if (htab->plt_type == PLT_NEW
4070       && htab->plt != NULL
4071       && htab->plt->output_section != NULL)
4072     {
4073       elf_section_type (htab->plt->output_section) = SHT_PROGBITS;
4074       elf_section_flags (htab->plt->output_section) = SHF_ALLOC + SHF_WRITE;
4075     }
4076 
4077   htab->tls_get_addr = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
4078 					     FALSE, FALSE, TRUE);
4079   return _bfd_elf_tls_setup (obfd, info);
4080 }
4081 
4082 /* Return TRUE iff REL is a branch reloc with a global symbol matching
4083    HASH.  */
4084 
4085 static bfd_boolean
branch_reloc_hash_match(const bfd * ibfd,const Elf_Internal_Rela * rel,const struct elf_link_hash_entry * hash)4086 branch_reloc_hash_match (const bfd *ibfd,
4087 			 const Elf_Internal_Rela *rel,
4088 			 const struct elf_link_hash_entry *hash)
4089 {
4090   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4091   enum elf_ppc_reloc_type r_type = ELF32_R_TYPE (rel->r_info);
4092   unsigned int r_symndx = ELF32_R_SYM (rel->r_info);
4093 
4094   if (r_symndx >= symtab_hdr->sh_info
4095       && (r_type == R_PPC_PLTREL24
4096 	  || r_type == R_PPC_LOCAL24PC
4097 	  || r_type == R_PPC_REL14
4098 	  || r_type == R_PPC_REL14_BRTAKEN
4099 	  || r_type == R_PPC_REL14_BRNTAKEN
4100 	  || r_type == R_PPC_REL24
4101 	  || r_type == R_PPC_ADDR24
4102 	  || r_type == R_PPC_ADDR14
4103 	  || r_type == R_PPC_ADDR14_BRTAKEN
4104 	  || r_type == R_PPC_ADDR14_BRNTAKEN))
4105     {
4106       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
4107       struct elf_link_hash_entry *h;
4108 
4109       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4110       while (h->root.type == bfd_link_hash_indirect
4111 	     || h->root.type == bfd_link_hash_warning)
4112 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
4113       if (h == hash)
4114 	return TRUE;
4115     }
4116   return FALSE;
4117 }
4118 
4119 /* Run through all the TLS relocs looking for optimization
4120    opportunities.  */
4121 
4122 bfd_boolean
ppc_elf_tls_optimize(bfd * obfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)4123 ppc_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED,
4124 		      struct bfd_link_info *info)
4125 {
4126   bfd *ibfd;
4127   asection *sec;
4128   struct ppc_elf_link_hash_table *htab;
4129   int pass;
4130 
4131   if (info->relocatable || !info->executable)
4132     return TRUE;
4133 
4134   htab = ppc_elf_hash_table (info);
4135   /* Make two passes through the relocs.  First time check that tls
4136      relocs involved in setting up a tls_get_addr call are indeed
4137      followed by such a call.  If they are not, exclude them from
4138      the optimizations done on the second pass.  */
4139   for (pass = 0; pass < 2; ++pass)
4140     for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4141       {
4142 	Elf_Internal_Sym *locsyms = NULL;
4143 	Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4144 
4145 	for (sec = ibfd->sections; sec != NULL; sec = sec->next)
4146 	  if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
4147 	    {
4148 	      Elf_Internal_Rela *relstart, *rel, *relend;
4149 
4150 	      /* Read the relocations.  */
4151 	      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
4152 						    info->keep_memory);
4153 	      if (relstart == NULL)
4154 		return FALSE;
4155 
4156 	      relend = relstart + sec->reloc_count;
4157 	      for (rel = relstart; rel < relend; rel++)
4158 		{
4159 		  enum elf_ppc_reloc_type r_type;
4160 		  unsigned long r_symndx;
4161 		  struct elf_link_hash_entry *h = NULL;
4162 		  char *tls_mask;
4163 		  char tls_set, tls_clear;
4164 		  bfd_boolean is_local;
4165 		  int expecting_tls_get_addr;
4166 		  bfd_signed_vma *got_count;
4167 
4168 		  r_symndx = ELF32_R_SYM (rel->r_info);
4169 		  if (r_symndx >= symtab_hdr->sh_info)
4170 		    {
4171 		      struct elf_link_hash_entry **sym_hashes;
4172 
4173 		      sym_hashes = elf_sym_hashes (ibfd);
4174 		      h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4175 		      while (h->root.type == bfd_link_hash_indirect
4176 			     || h->root.type == bfd_link_hash_warning)
4177 			h = (struct elf_link_hash_entry *) h->root.u.i.link;
4178 		    }
4179 
4180 		  expecting_tls_get_addr = 0;
4181 		  is_local = FALSE;
4182 		  if (h == NULL
4183 		      || !h->def_dynamic)
4184 		    is_local = TRUE;
4185 
4186 		  r_type = ELF32_R_TYPE (rel->r_info);
4187 		  switch (r_type)
4188 		    {
4189 		    case R_PPC_GOT_TLSLD16:
4190 		    case R_PPC_GOT_TLSLD16_LO:
4191 		      expecting_tls_get_addr = 1;
4192 		      /* Fall thru */
4193 
4194 		    case R_PPC_GOT_TLSLD16_HI:
4195 		    case R_PPC_GOT_TLSLD16_HA:
4196 		      /* These relocs should never be against a symbol
4197 			 defined in a shared lib.  Leave them alone if
4198 			 that turns out to be the case.  */
4199 		      if (!is_local)
4200 			continue;
4201 
4202 		      /* LD -> LE */
4203 		      tls_set = 0;
4204 		      tls_clear = TLS_LD;
4205 		      break;
4206 
4207 		    case R_PPC_GOT_TLSGD16:
4208 		    case R_PPC_GOT_TLSGD16_LO:
4209 		      expecting_tls_get_addr = 1;
4210 		      /* Fall thru */
4211 
4212 		    case R_PPC_GOT_TLSGD16_HI:
4213 		    case R_PPC_GOT_TLSGD16_HA:
4214 		      if (is_local)
4215 			/* GD -> LE */
4216 			tls_set = 0;
4217 		      else
4218 			/* GD -> IE */
4219 			tls_set = TLS_TLS | TLS_TPRELGD;
4220 		      tls_clear = TLS_GD;
4221 		      break;
4222 
4223 		    case R_PPC_GOT_TPREL16:
4224 		    case R_PPC_GOT_TPREL16_LO:
4225 		    case R_PPC_GOT_TPREL16_HI:
4226 		    case R_PPC_GOT_TPREL16_HA:
4227 		      if (is_local)
4228 			{
4229 			  /* IE -> LE */
4230 			  tls_set = 0;
4231 			  tls_clear = TLS_TPREL;
4232 			  break;
4233 			}
4234 		      else
4235 			continue;
4236 
4237 		    default:
4238 		      continue;
4239 		    }
4240 
4241 		  if (pass == 0)
4242 		    {
4243 		      if (!expecting_tls_get_addr
4244 			  || !sec->has_tls_get_addr_call)
4245 			continue;
4246 
4247 		      if (rel + 1 < relend
4248 			  && branch_reloc_hash_match (ibfd, rel + 1,
4249 						      htab->tls_get_addr))
4250 			continue;
4251 
4252 		      /* Uh oh, we didn't find the expected call.  We
4253 			 could just mark this symbol to exclude it
4254 			 from tls optimization but it's safer to skip
4255 			 the entire section.  */
4256 		      sec->has_tls_reloc = 0;
4257 		      break;
4258 		    }
4259 
4260 		  if (h != NULL)
4261 		    {
4262 		      tls_mask = &ppc_elf_hash_entry (h)->tls_mask;
4263 		      got_count = &h->got.refcount;
4264 		    }
4265 		  else
4266 		    {
4267 		      Elf_Internal_Sym *sym;
4268 		      bfd_signed_vma *lgot_refs;
4269 		      char *lgot_masks;
4270 
4271 		      if (locsyms == NULL)
4272 			{
4273 			  locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
4274 			  if (locsyms == NULL)
4275 			    locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
4276 							    symtab_hdr->sh_info,
4277 							    0, NULL, NULL, NULL);
4278 			  if (locsyms == NULL)
4279 			    {
4280 			      if (elf_section_data (sec)->relocs != relstart)
4281 				free (relstart);
4282 			      return FALSE;
4283 			    }
4284 			}
4285 		      sym = locsyms + r_symndx;
4286 		      lgot_refs = elf_local_got_refcounts (ibfd);
4287 		      if (lgot_refs == NULL)
4288 			abort ();
4289 		      lgot_masks = (char *) (lgot_refs + symtab_hdr->sh_info);
4290 		      tls_mask = &lgot_masks[r_symndx];
4291 		      got_count = &lgot_refs[r_symndx];
4292 		    }
4293 
4294 		  if (tls_set == 0)
4295 		    {
4296 		      /* We managed to get rid of a got entry.  */
4297 		      if (*got_count > 0)
4298 			*got_count -= 1;
4299 		    }
4300 
4301 		  if (expecting_tls_get_addr)
4302 		    {
4303 		      struct plt_entry *ent;
4304 
4305 		      ent = find_plt_ent (htab->tls_get_addr, NULL, 0);
4306 		      if (ent != NULL && ent->plt.refcount > 0)
4307 			ent->plt.refcount -= 1;
4308 		    }
4309 
4310 		  *tls_mask |= tls_set;
4311 		  *tls_mask &= ~tls_clear;
4312 		}
4313 
4314 	      if (elf_section_data (sec)->relocs != relstart)
4315 		free (relstart);
4316 	    }
4317 
4318 	if (locsyms != NULL
4319 	    && (symtab_hdr->contents != (unsigned char *) locsyms))
4320 	  {
4321 	    if (!info->keep_memory)
4322 	      free (locsyms);
4323 	    else
4324 	      symtab_hdr->contents = (unsigned char *) locsyms;
4325 	  }
4326       }
4327   return TRUE;
4328 }
4329 
4330 /* Adjust a symbol defined by a dynamic object and referenced by a
4331    regular object.  The current definition is in some section of the
4332    dynamic object, but we're not including those sections.  We have to
4333    change the definition to something the rest of the link can
4334    understand.  */
4335 
4336 static bfd_boolean
ppc_elf_adjust_dynamic_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h)4337 ppc_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
4338 			       struct elf_link_hash_entry *h)
4339 {
4340   struct ppc_elf_link_hash_table *htab;
4341   asection *s;
4342 
4343 #ifdef DEBUG
4344   fprintf (stderr, "ppc_elf_adjust_dynamic_symbol called for %s\n",
4345 	   h->root.root.string);
4346 #endif
4347 
4348   /* Make sure we know what is going on here.  */
4349   htab = ppc_elf_hash_table (info);
4350   BFD_ASSERT (htab->elf.dynobj != NULL
4351 	      && (h->needs_plt
4352 		  || h->u.weakdef != NULL
4353 		  || (h->def_dynamic
4354 		      && h->ref_regular
4355 		      && !h->def_regular)));
4356 
4357   /* Deal with function syms.  */
4358   if (h->type == STT_FUNC
4359       || h->needs_plt)
4360     {
4361       /* Clear procedure linkage table information for any symbol that
4362 	 won't need a .plt entry.  */
4363       struct plt_entry *ent;
4364       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4365 	if (ent->plt.refcount > 0)
4366 	  break;
4367       if (ent == NULL
4368 	  || SYMBOL_CALLS_LOCAL (info, h)
4369 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
4370 	      && h->root.type == bfd_link_hash_undefweak))
4371 	{
4372 	  /* A PLT entry is not required/allowed when:
4373 
4374 	     1. We are not using ld.so; because then the PLT entry
4375 	     can't be set up, so we can't use one.  In this case,
4376 	     ppc_elf_adjust_dynamic_symbol won't even be called.
4377 
4378 	     2. GC has rendered the entry unused.
4379 
4380 	     3. We know for certain that a call to this symbol
4381 	     will go to this object, or will remain undefined.  */
4382 	  h->plt.plist = NULL;
4383 	  h->needs_plt = 0;
4384 	}
4385       return TRUE;
4386     }
4387   else
4388     h->plt.plist = NULL;
4389 
4390   /* If this is a weak symbol, and there is a real definition, the
4391      processor independent code will have arranged for us to see the
4392      real definition first, and we can just use the same value.  */
4393   if (h->u.weakdef != NULL)
4394     {
4395       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
4396 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
4397       h->root.u.def.section = h->u.weakdef->root.u.def.section;
4398       h->root.u.def.value = h->u.weakdef->root.u.def.value;
4399       if (ELIMINATE_COPY_RELOCS)
4400 	h->non_got_ref = h->u.weakdef->non_got_ref;
4401       return TRUE;
4402     }
4403 
4404   /* This is a reference to a symbol defined by a dynamic object which
4405      is not a function.  */
4406 
4407   /* If we are creating a shared library, we must presume that the
4408      only references to the symbol are via the global offset table.
4409      For such cases we need not do anything here; the relocations will
4410      be handled correctly by relocate_section.  */
4411   if (info->shared)
4412     return TRUE;
4413 
4414   /* If there are no references to this symbol that do not use the
4415      GOT, we don't need to generate a copy reloc.  */
4416   if (!h->non_got_ref)
4417     return TRUE;
4418 
4419    /* If we didn't find any dynamic relocs in read-only sections, then we'll
4420       be keeping the dynamic relocs and avoiding the copy reloc.  We can't
4421       do this if there are any small data relocations.  */
4422   if (ELIMINATE_COPY_RELOCS
4423       && !ppc_elf_hash_entry (h)->has_sda_refs)
4424     {
4425       struct ppc_elf_dyn_relocs *p;
4426       for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4427 	{
4428 	  s = p->sec->output_section;
4429 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
4430 	    break;
4431 	}
4432 
4433       if (p == NULL)
4434 	{
4435 	  h->non_got_ref = 0;
4436 	  return TRUE;
4437 	}
4438     }
4439 
4440   if (h->size == 0)
4441     {
4442       (*_bfd_error_handler) (_("dynamic variable `%s' is zero size"),
4443 			     h->root.root.string);
4444       return TRUE;
4445     }
4446 
4447   /* We must allocate the symbol in our .dynbss section, which will
4448      become part of the .bss section of the executable.  There will be
4449      an entry for this symbol in the .dynsym section.  The dynamic
4450      object will contain position independent code, so all references
4451      from the dynamic object to this symbol will go through the global
4452      offset table.  The dynamic linker will use the .dynsym entry to
4453      determine the address it must put in the global offset table, so
4454      both the dynamic object and the regular object will refer to the
4455      same memory location for the variable.
4456 
4457      Of course, if the symbol is referenced using SDAREL relocs, we
4458      must instead allocate it in .sbss.  */
4459 
4460   if (ppc_elf_hash_entry (h)->has_sda_refs)
4461     s = htab->dynsbss;
4462   else
4463     s = htab->dynbss;
4464   BFD_ASSERT (s != NULL);
4465 
4466   /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
4467      copy the initial value out of the dynamic object and into the
4468      runtime process image.  We need to remember the offset into the
4469      .rela.bss section we are going to use.  */
4470   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
4471     {
4472       asection *srel;
4473 
4474       if (ppc_elf_hash_entry (h)->has_sda_refs)
4475 	srel = htab->relsbss;
4476       else
4477 	srel = htab->relbss;
4478       BFD_ASSERT (srel != NULL);
4479       srel->size += sizeof (Elf32_External_Rela);
4480       h->needs_copy = 1;
4481     }
4482 
4483   return _bfd_elf_adjust_dynamic_copy (h, s);
4484 }
4485 
4486 /* Generate a symbol to mark plt call stubs.  For non-PIC code the sym is
4487    xxxxxxxx.plt_call32.<callee> where xxxxxxxx is a hex number, usually 0,
4488    specifying the addend on the plt relocation.  For -fpic code, the sym
4489    is xxxxxxxx.plt_pic32.<callee>, and for -fPIC
4490    xxxxxxxx.got2.plt_pic32.<callee>.  */
4491 
4492 static bfd_boolean
add_stub_sym(struct plt_entry * ent,struct elf_link_hash_entry * h,struct bfd_link_info * info)4493 add_stub_sym (struct plt_entry *ent,
4494 	      struct elf_link_hash_entry *h,
4495 	      struct bfd_link_info *info)
4496 {
4497   struct elf_link_hash_entry *sh;
4498   size_t len1, len2, len3;
4499   char *name;
4500   const char *stub;
4501   struct ppc_elf_link_hash_table *htab = ppc_elf_hash_table (info);
4502 
4503   if (info->shared || info->pie)
4504     stub = ".plt_pic32.";
4505   else
4506     stub = ".plt_call32.";
4507 
4508   len1 = strlen (h->root.root.string);
4509   len2 = strlen (stub);
4510   len3 = 0;
4511   if (ent->sec)
4512     len3 = strlen (ent->sec->name);
4513   name = bfd_malloc (len1 + len2 + len3 + 9);
4514   if (name == NULL)
4515     return FALSE;
4516   sprintf (name, "%08x", (unsigned) ent->addend & 0xffffffff);
4517   if (ent->sec)
4518     memcpy (name + 8, ent->sec->name, len3);
4519   memcpy (name + 8 + len3, stub, len2);
4520   memcpy (name + 8 + len3 + len2, h->root.root.string, len1 + 1);
4521   sh = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
4522   if (sh == NULL)
4523     return FALSE;
4524   if (sh->root.type == bfd_link_hash_new)
4525     {
4526       sh->root.type = bfd_link_hash_defined;
4527       sh->root.u.def.section = htab->glink;
4528       sh->root.u.def.value = ent->glink_offset;
4529       sh->ref_regular = 1;
4530       sh->def_regular = 1;
4531       sh->ref_regular_nonweak = 1;
4532       sh->forced_local = 1;
4533       sh->non_elf = 0;
4534     }
4535   return TRUE;
4536 }
4537 
4538 /* Allocate NEED contiguous space in .got, and return the offset.
4539    Handles allocation of the got header when crossing 32k.  */
4540 
4541 static bfd_vma
allocate_got(struct ppc_elf_link_hash_table * htab,unsigned int need)4542 allocate_got (struct ppc_elf_link_hash_table *htab, unsigned int need)
4543 {
4544   bfd_vma where;
4545   unsigned int max_before_header;
4546 
4547   if (htab->plt_type == PLT_VXWORKS)
4548     {
4549       where = htab->got->size;
4550       htab->got->size += need;
4551     }
4552   else
4553     {
4554       max_before_header = htab->plt_type == PLT_NEW ? 32768 : 32764;
4555       if (need <= htab->got_gap)
4556 	{
4557 	  where = max_before_header - htab->got_gap;
4558 	  htab->got_gap -= need;
4559 	}
4560       else
4561 	{
4562 	  if (htab->got->size + need > max_before_header
4563 	      && htab->got->size <= max_before_header)
4564 	    {
4565 	      htab->got_gap = max_before_header - htab->got->size;
4566 	      htab->got->size = max_before_header + htab->got_header_size;
4567 	    }
4568 	  where = htab->got->size;
4569 	  htab->got->size += need;
4570 	}
4571     }
4572   return where;
4573 }
4574 
4575 /* Allocate space in associated reloc sections for dynamic relocs.  */
4576 
4577 static bfd_boolean
allocate_dynrelocs(struct elf_link_hash_entry * h,void * inf)4578 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
4579 {
4580   struct bfd_link_info *info = inf;
4581   struct ppc_elf_link_hash_entry *eh;
4582   struct ppc_elf_link_hash_table *htab;
4583   struct ppc_elf_dyn_relocs *p;
4584 
4585   if (h->root.type == bfd_link_hash_indirect)
4586     return TRUE;
4587 
4588   if (h->root.type == bfd_link_hash_warning)
4589     /* When warning symbols are created, they **replace** the "real"
4590        entry in the hash table, thus we never get to see the real
4591        symbol in a hash traversal.  So look at it now.  */
4592     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4593 
4594   htab = ppc_elf_hash_table (info);
4595   if (htab->elf.dynamic_sections_created)
4596     {
4597       struct plt_entry *ent;
4598       bfd_boolean doneone = FALSE;
4599       bfd_vma plt_offset = 0, glink_offset = 0;
4600 
4601       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
4602 	if (ent->plt.refcount > 0)
4603 	  {
4604 	    /* Make sure this symbol is output as a dynamic symbol.  */
4605 	    if (h->dynindx == -1
4606 		&& !h->forced_local)
4607 	      {
4608 		if (! bfd_elf_link_record_dynamic_symbol (info, h))
4609 		  return FALSE;
4610 	      }
4611 
4612 	    if (info->shared
4613 		|| WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, 0, h))
4614 	      {
4615 		asection *s = htab->plt;
4616 
4617 		if (htab->plt_type == PLT_NEW)
4618 		  {
4619 		    if (!doneone)
4620 		      {
4621 			plt_offset = s->size;
4622 			s->size += 4;
4623 		      }
4624 		    ent->plt.offset = plt_offset;
4625 
4626 		    s = htab->glink;
4627 		    if (!doneone || info->shared || info->pie)
4628 		      {
4629 			glink_offset = s->size;
4630 			s->size += GLINK_ENTRY_SIZE;
4631 		      }
4632 		    if (!doneone
4633 			&& !info->shared
4634 			&& !h->def_regular)
4635 		      {
4636 			h->root.u.def.section = s;
4637 			h->root.u.def.value = glink_offset;
4638 		      }
4639 		    ent->glink_offset = glink_offset;
4640 
4641 		    if (htab->emit_stub_syms
4642 			&& !add_stub_sym (ent, h, info))
4643 		      return FALSE;
4644 		  }
4645 		else
4646 		  {
4647 		    if (!doneone)
4648 		      {
4649 			/* If this is the first .plt entry, make room
4650 			   for the special first entry.  */
4651 			if (s->size == 0)
4652 			  s->size += htab->plt_initial_entry_size;
4653 
4654 			/* The PowerPC PLT is actually composed of two
4655 			   parts, the first part is 2 words (for a load
4656 			   and a jump), and then there is a remaining
4657 			   word available at the end.  */
4658 			plt_offset = (htab->plt_initial_entry_size
4659 				      + (htab->plt_slot_size
4660 					 * ((s->size
4661 					     - htab->plt_initial_entry_size)
4662 					    / htab->plt_entry_size)));
4663 
4664 			/* If this symbol is not defined in a regular
4665 			   file, and we are not generating a shared
4666 			   library, then set the symbol to this location
4667 			   in the .plt.  This is required to make
4668 			   function pointers compare as equal between
4669 			   the normal executable and the shared library.  */
4670 			if (! info->shared
4671 			    && !h->def_regular)
4672 			  {
4673 			    h->root.u.def.section = s;
4674 			    h->root.u.def.value = plt_offset;
4675 			  }
4676 
4677 			/* Make room for this entry.  */
4678 			s->size += htab->plt_entry_size;
4679 			/* After the 8192nd entry, room for two entries
4680 			   is allocated.  */
4681 			if (htab->plt_type == PLT_OLD
4682 			    && (s->size - htab->plt_initial_entry_size)
4683 				/ htab->plt_entry_size
4684 			       > PLT_NUM_SINGLE_ENTRIES)
4685 			  s->size += htab->plt_entry_size;
4686 		      }
4687 		    ent->plt.offset = plt_offset;
4688 		  }
4689 
4690 		/* We also need to make an entry in the .rela.plt section.  */
4691 		if (!doneone)
4692 		  {
4693 		    htab->relplt->size += sizeof (Elf32_External_Rela);
4694 
4695 		    if (htab->plt_type == PLT_VXWORKS)
4696 		      {
4697 			/* Allocate space for the unloaded relocations.  */
4698 			if (!info->shared)
4699 			  {
4700 			    if (ent->plt.offset
4701 				== (bfd_vma) htab->plt_initial_entry_size)
4702 			      {
4703 				htab->srelplt2->size
4704 				  += sizeof (Elf32_External_Rela)
4705 				      * VXWORKS_PLTRESOLVE_RELOCS;
4706 			      }
4707 
4708 			    htab->srelplt2->size
4709 			      += sizeof (Elf32_External_Rela)
4710 				  * VXWORKS_PLT_NON_JMP_SLOT_RELOCS;
4711 			  }
4712 
4713 			/* Every PLT entry has an associated GOT entry in
4714 			   .got.plt.  */
4715 			htab->sgotplt->size += 4;
4716 		      }
4717 		    doneone = TRUE;
4718 		  }
4719 	      }
4720 	    else
4721 	      ent->plt.offset = (bfd_vma) -1;
4722 	  }
4723 	else
4724 	  ent->plt.offset = (bfd_vma) -1;
4725 
4726       if (!doneone)
4727 	{
4728 	  h->plt.plist = NULL;
4729 	  h->needs_plt = 0;
4730 	}
4731     }
4732   else
4733     {
4734       h->plt.plist = NULL;
4735       h->needs_plt = 0;
4736     }
4737 
4738   eh = (struct ppc_elf_link_hash_entry *) h;
4739   if (eh->elf.got.refcount > 0)
4740     {
4741       /* Make sure this symbol is output as a dynamic symbol.  */
4742       if (eh->elf.dynindx == -1
4743 	  && !eh->elf.forced_local)
4744 	{
4745 	  if (!bfd_elf_link_record_dynamic_symbol (info, &eh->elf))
4746 	    return FALSE;
4747 	}
4748 
4749       if (eh->tls_mask == (TLS_TLS | TLS_LD)
4750 	  && !eh->elf.def_dynamic)
4751 	{
4752 	  /* If just an LD reloc, we'll just use htab->tlsld_got.offset.  */
4753 	  htab->tlsld_got.refcount += 1;
4754 	  eh->elf.got.offset = (bfd_vma) -1;
4755 	}
4756       else
4757 	{
4758 	  bfd_boolean dyn;
4759 	  unsigned int need = 0;
4760 	  if ((eh->tls_mask & TLS_TLS) != 0)
4761 	    {
4762 	      if ((eh->tls_mask & TLS_LD) != 0)
4763 		need += 8;
4764 	      if ((eh->tls_mask & TLS_GD) != 0)
4765 		need += 8;
4766 	      if ((eh->tls_mask & (TLS_TPREL | TLS_TPRELGD)) != 0)
4767 		need += 4;
4768 	      if ((eh->tls_mask & TLS_DTPREL) != 0)
4769 		need += 4;
4770 	    }
4771 	  else
4772 	    need += 4;
4773 	  eh->elf.got.offset = allocate_got (htab, need);
4774 	  dyn = htab->elf.dynamic_sections_created;
4775 	  if ((info->shared
4776 	       || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, &eh->elf))
4777 	      && (ELF_ST_VISIBILITY (eh->elf.other) == STV_DEFAULT
4778 		  || eh->elf.root.type != bfd_link_hash_undefweak))
4779 	    {
4780 	      /* All the entries we allocated need relocs.
4781 		 Except LD only needs one.  */
4782 	      if ((eh->tls_mask & TLS_LD) != 0)
4783 		need -= 4;
4784 	      htab->relgot->size += need * (sizeof (Elf32_External_Rela) / 4);
4785 	    }
4786 	}
4787     }
4788   else
4789     eh->elf.got.offset = (bfd_vma) -1;
4790 
4791   if (eh->dyn_relocs == NULL)
4792     return TRUE;
4793 
4794   /* In the shared -Bsymbolic case, discard space allocated for
4795      dynamic pc-relative relocs against symbols which turn out to be
4796      defined in regular objects.  For the normal shared case, discard
4797      space for relocs that have become local due to symbol visibility
4798      changes.  */
4799 
4800   if (info->shared)
4801     {
4802       /* Relocs that use pc_count are those that appear on a call insn,
4803 	 or certain REL relocs (see must_be_dyn_reloc) that can be
4804 	 generated via assembly.  We want calls to protected symbols to
4805 	 resolve directly to the function rather than going via the plt.
4806 	 If people want function pointer comparisons to work as expected
4807 	 then they should avoid writing weird assembly.  */
4808       if (SYMBOL_CALLS_LOCAL (info, h))
4809 	{
4810 	  struct ppc_elf_dyn_relocs **pp;
4811 
4812 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
4813 	    {
4814 	      p->count -= p->pc_count;
4815 	      p->pc_count = 0;
4816 	      if (p->count == 0)
4817 		*pp = p->next;
4818 	      else
4819 		pp = &p->next;
4820 	    }
4821 	}
4822 
4823       /* Also discard relocs on undefined weak syms with non-default
4824 	 visibility.  */
4825       if (eh->dyn_relocs != NULL
4826 	  && h->root.type == bfd_link_hash_undefweak)
4827 	{
4828 	  if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
4829 	    eh->dyn_relocs = NULL;
4830 
4831 	  /* Make sure undefined weak symbols are output as a dynamic
4832 	     symbol in PIEs.  */
4833 	  else if (h->dynindx == -1
4834 		   && !h->forced_local)
4835 	    {
4836 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
4837 		return FALSE;
4838 	    }
4839 	}
4840     }
4841   else if (ELIMINATE_COPY_RELOCS)
4842     {
4843       /* For the non-shared case, discard space for relocs against
4844 	 symbols which turn out to need copy relocs or are not
4845 	 dynamic.  */
4846 
4847       if (!h->non_got_ref
4848 	  && h->def_dynamic
4849 	  && !h->def_regular)
4850 	{
4851 	  /* Make sure this symbol is output as a dynamic symbol.
4852 	     Undefined weak syms won't yet be marked as dynamic.  */
4853 	  if (h->dynindx == -1
4854 	      && !h->forced_local)
4855 	    {
4856 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
4857 		return FALSE;
4858 	    }
4859 
4860 	  /* If that succeeded, we know we'll be keeping all the
4861 	     relocs.  */
4862 	  if (h->dynindx != -1)
4863 	    goto keep;
4864 	}
4865 
4866       eh->dyn_relocs = NULL;
4867 
4868     keep: ;
4869     }
4870 
4871   /* Finally, allocate space.  */
4872   for (p = eh->dyn_relocs; p != NULL; p = p->next)
4873     {
4874       asection *sreloc = elf_section_data (p->sec)->sreloc;
4875       sreloc->size += p->count * sizeof (Elf32_External_Rela);
4876     }
4877 
4878   return TRUE;
4879 }
4880 
4881 /* Find any dynamic relocs that apply to read-only sections.  */
4882 
4883 static bfd_boolean
readonly_dynrelocs(struct elf_link_hash_entry * h,void * info)4884 readonly_dynrelocs (struct elf_link_hash_entry *h, void *info)
4885 {
4886   struct ppc_elf_dyn_relocs *p;
4887 
4888   if (h->root.type == bfd_link_hash_indirect)
4889     return TRUE;
4890 
4891   if (h->root.type == bfd_link_hash_warning)
4892     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4893 
4894   for (p = ppc_elf_hash_entry (h)->dyn_relocs; p != NULL; p = p->next)
4895     {
4896       asection *s = p->sec->output_section;
4897 
4898       if (s != NULL
4899 	  && ((s->flags & (SEC_READONLY | SEC_ALLOC))
4900 	      == (SEC_READONLY | SEC_ALLOC)))
4901 	{
4902 	  ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
4903 
4904 	  /* Not an error, just cut short the traversal.  */
4905 	  return FALSE;
4906 	}
4907     }
4908   return TRUE;
4909 }
4910 
4911 /* Set the sizes of the dynamic sections.  */
4912 
4913 static bfd_boolean
ppc_elf_size_dynamic_sections(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)4914 ppc_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
4915 			       struct bfd_link_info *info)
4916 {
4917   struct ppc_elf_link_hash_table *htab;
4918   asection *s;
4919   bfd_boolean relocs;
4920   bfd *ibfd;
4921 
4922 #ifdef DEBUG
4923   fprintf (stderr, "ppc_elf_size_dynamic_sections called\n");
4924 #endif
4925 
4926   htab = ppc_elf_hash_table (info);
4927   BFD_ASSERT (htab->elf.dynobj != NULL);
4928 
4929   if (elf_hash_table (info)->dynamic_sections_created)
4930     {
4931       /* Set the contents of the .interp section to the interpreter.  */
4932       if (info->executable)
4933 	{
4934 	  s = bfd_get_section_by_name (htab->elf.dynobj, ".interp");
4935 	  BFD_ASSERT (s != NULL);
4936 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
4937 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
4938 	}
4939     }
4940 
4941   if (htab->plt_type == PLT_OLD)
4942     htab->got_header_size = 16;
4943   else if (htab->plt_type == PLT_NEW)
4944     htab->got_header_size = 12;
4945 
4946   /* Set up .got offsets for local syms, and space for local dynamic
4947      relocs.  */
4948   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
4949     {
4950       bfd_signed_vma *local_got;
4951       bfd_signed_vma *end_local_got;
4952       char *lgot_masks;
4953       bfd_size_type locsymcount;
4954       Elf_Internal_Shdr *symtab_hdr;
4955 
4956       if (!is_ppc_elf_target (ibfd->xvec))
4957 	continue;
4958 
4959       for (s = ibfd->sections; s != NULL; s = s->next)
4960 	{
4961 	  struct ppc_elf_dyn_relocs *p;
4962 
4963 	  for (p = ((struct ppc_elf_dyn_relocs *)
4964 		    elf_section_data (s)->local_dynrel);
4965 	       p != NULL;
4966 	       p = p->next)
4967 	    {
4968 	      if (!bfd_is_abs_section (p->sec)
4969 		  && bfd_is_abs_section (p->sec->output_section))
4970 		{
4971 		  /* Input section has been discarded, either because
4972 		     it is a copy of a linkonce section or due to
4973 		     linker script /DISCARD/, so we'll be discarding
4974 		     the relocs too.  */
4975 		}
4976 	      else if (p->count != 0)
4977 		{
4978 		  elf_section_data (p->sec)->sreloc->size
4979 		    += p->count * sizeof (Elf32_External_Rela);
4980 		  if ((p->sec->output_section->flags
4981 		       & (SEC_READONLY | SEC_ALLOC))
4982 		      == (SEC_READONLY | SEC_ALLOC))
4983 		    info->flags |= DF_TEXTREL;
4984 		}
4985 	    }
4986 	}
4987 
4988       local_got = elf_local_got_refcounts (ibfd);
4989       if (!local_got)
4990 	continue;
4991 
4992       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
4993       locsymcount = symtab_hdr->sh_info;
4994       end_local_got = local_got + locsymcount;
4995       lgot_masks = (char *) end_local_got;
4996       for (; local_got < end_local_got; ++local_got, ++lgot_masks)
4997 	if (*local_got > 0)
4998 	  {
4999 	    if (*lgot_masks == (TLS_TLS | TLS_LD))
5000 	      {
5001 		/* If just an LD reloc, we'll just use
5002 		   htab->tlsld_got.offset.  */
5003 		htab->tlsld_got.refcount += 1;
5004 		*local_got = (bfd_vma) -1;
5005 	      }
5006 	    else
5007 	      {
5008 		unsigned int need = 0;
5009 		if ((*lgot_masks & TLS_TLS) != 0)
5010 		  {
5011 		    if ((*lgot_masks & TLS_GD) != 0)
5012 		      need += 8;
5013 		    if ((*lgot_masks & (TLS_TPREL | TLS_TPRELGD)) != 0)
5014 		      need += 4;
5015 		    if ((*lgot_masks & TLS_DTPREL) != 0)
5016 		      need += 4;
5017 		  }
5018 		else
5019 		  need += 4;
5020 		*local_got = allocate_got (htab, need);
5021 		if (info->shared)
5022 		  htab->relgot->size += (need
5023 					 * (sizeof (Elf32_External_Rela) / 4));
5024 	      }
5025 	  }
5026 	else
5027 	  *local_got = (bfd_vma) -1;
5028     }
5029 
5030   /* Allocate space for global sym dynamic relocs.  */
5031   elf_link_hash_traverse (elf_hash_table (info), allocate_dynrelocs, info);
5032 
5033   if (htab->tlsld_got.refcount > 0)
5034     {
5035       htab->tlsld_got.offset = allocate_got (htab, 8);
5036       if (info->shared)
5037 	htab->relgot->size += sizeof (Elf32_External_Rela);
5038     }
5039   else
5040     htab->tlsld_got.offset = (bfd_vma) -1;
5041 
5042   if (htab->got != NULL && htab->plt_type != PLT_VXWORKS)
5043     {
5044       unsigned int g_o_t = 32768;
5045 
5046       /* If we haven't allocated the header, do so now.  When we get here,
5047 	 for old plt/got the got size will be 0 to 32764 (not allocated),
5048 	 or 32780 to 65536 (header allocated).  For new plt/got, the
5049 	 corresponding ranges are 0 to 32768 and 32780 to 65536.  */
5050       if (htab->got->size <= 32768)
5051 	{
5052 	  g_o_t = htab->got->size;
5053 	  if (htab->plt_type == PLT_OLD)
5054 	    g_o_t += 4;
5055 	  htab->got->size += htab->got_header_size;
5056 	}
5057 
5058       htab->elf.hgot->root.u.def.value = g_o_t;
5059     }
5060 
5061   if (htab->glink != NULL && htab->glink->size != 0)
5062     {
5063       htab->glink_pltresolve = htab->glink->size;
5064       /* Space for the branch table.  */
5065       htab->glink->size += htab->glink->size / (GLINK_ENTRY_SIZE / 4) - 4;
5066       /* Pad out to align the start of PLTresolve.  */
5067       htab->glink->size += -htab->glink->size & 15;
5068       htab->glink->size += GLINK_PLTRESOLVE;
5069 
5070       if (htab->emit_stub_syms)
5071 	{
5072 	  struct elf_link_hash_entry *sh;
5073 	  sh = elf_link_hash_lookup (&htab->elf, "__glink",
5074 				     TRUE, FALSE, FALSE);
5075 	  if (sh == NULL)
5076 	    return FALSE;
5077 	  if (sh->root.type == bfd_link_hash_new)
5078 	    {
5079 	      sh->root.type = bfd_link_hash_defined;
5080 	      sh->root.u.def.section = htab->glink;
5081 	      sh->root.u.def.value = htab->glink_pltresolve;
5082 	      sh->ref_regular = 1;
5083 	      sh->def_regular = 1;
5084 	      sh->ref_regular_nonweak = 1;
5085 	      sh->forced_local = 1;
5086 	      sh->non_elf = 0;
5087 	    }
5088 	  sh = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
5089 				     TRUE, FALSE, FALSE);
5090 	  if (sh == NULL)
5091 	    return FALSE;
5092 	  if (sh->root.type == bfd_link_hash_new)
5093 	    {
5094 	      sh->root.type = bfd_link_hash_defined;
5095 	      sh->root.u.def.section = htab->glink;
5096 	      sh->root.u.def.value = htab->glink->size - GLINK_PLTRESOLVE;
5097 	      sh->ref_regular = 1;
5098 	      sh->def_regular = 1;
5099 	      sh->ref_regular_nonweak = 1;
5100 	      sh->forced_local = 1;
5101 	      sh->non_elf = 0;
5102 	    }
5103 	}
5104     }
5105 
5106   /* We've now determined the sizes of the various dynamic sections.
5107      Allocate memory for them.  */
5108   relocs = FALSE;
5109   for (s = htab->elf.dynobj->sections; s != NULL; s = s->next)
5110     {
5111       bfd_boolean strip_section = TRUE;
5112 
5113       if ((s->flags & SEC_LINKER_CREATED) == 0)
5114 	continue;
5115 
5116       if (s == htab->plt
5117 	  || s == htab->glink
5118 	  || s == htab->got
5119 	  || s == htab->sgotplt
5120 	  || s == htab->sbss
5121 	  || s == htab->dynbss
5122 	  || s == htab->dynsbss)
5123 	{
5124 	  /* We'd like to strip these sections if they aren't needed, but if
5125 	     we've exported dynamic symbols from them we must leave them.
5126 	     It's too late to tell BFD to get rid of the symbols.  */
5127 	  if ((s == htab->plt || s == htab->got) && htab->elf.hplt != NULL)
5128 	    strip_section = FALSE;
5129 	  /* Strip this section if we don't need it; see the
5130 	     comment below.  */
5131 	}
5132       else if (s == htab->sdata[0].section
5133 	       || s == htab->sdata[1].section)
5134 	{
5135 	  /* Strip these too.  */
5136 	}
5137       else if (CONST_STRNEQ (bfd_get_section_name (dynobj, s), ".rela"))
5138 	{
5139 	  if (s->size != 0)
5140 	    {
5141 	      /* Remember whether there are any relocation sections.  */
5142 	      relocs = TRUE;
5143 
5144 	      /* We use the reloc_count field as a counter if we need
5145 		 to copy relocs into the output file.  */
5146 	      s->reloc_count = 0;
5147 	    }
5148 	}
5149       else
5150 	{
5151 	  /* It's not one of our sections, so don't allocate space.  */
5152 	  continue;
5153 	}
5154 
5155       if (s->size == 0 && strip_section)
5156 	{
5157 	  /* If we don't need this section, strip it from the
5158 	     output file.  This is mostly to handle .rela.bss and
5159 	     .rela.plt.  We must create both sections in
5160 	     create_dynamic_sections, because they must be created
5161 	     before the linker maps input sections to output
5162 	     sections.  The linker does that before
5163 	     adjust_dynamic_symbol is called, and it is that
5164 	     function which decides whether anything needs to go
5165 	     into these sections.  */
5166 	  s->flags |= SEC_EXCLUDE;
5167 	  continue;
5168 	}
5169 
5170       if ((s->flags & SEC_HAS_CONTENTS) == 0)
5171 	continue;
5172 
5173       /* Allocate memory for the section contents.  */
5174       s->contents = bfd_zalloc (htab->elf.dynobj, s->size);
5175       if (s->contents == NULL)
5176 	return FALSE;
5177     }
5178 
5179   if (htab->elf.dynamic_sections_created)
5180     {
5181       /* Add some entries to the .dynamic section.  We fill in the
5182 	 values later, in ppc_elf_finish_dynamic_sections, but we
5183 	 must add the entries now so that we get the correct size for
5184 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
5185 	 dynamic linker and used by the debugger.  */
5186 #define add_dynamic_entry(TAG, VAL) \
5187   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
5188 
5189       if (info->executable)
5190 	{
5191 	  if (!add_dynamic_entry (DT_DEBUG, 0))
5192 	    return FALSE;
5193 	}
5194 
5195       if (htab->plt != NULL && htab->plt->size != 0)
5196 	{
5197 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
5198 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
5199 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5200 	      || !add_dynamic_entry (DT_JMPREL, 0))
5201 	    return FALSE;
5202 	}
5203 
5204       if (htab->glink != NULL && htab->glink->size != 0)
5205 	{
5206 	  if (!add_dynamic_entry (DT_PPC_GOT, 0))
5207 	    return FALSE;
5208 	}
5209 
5210       if (relocs)
5211 	{
5212 	  if (!add_dynamic_entry (DT_RELA, 0)
5213 	      || !add_dynamic_entry (DT_RELASZ, 0)
5214 	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf32_External_Rela)))
5215 	    return FALSE;
5216 	}
5217 
5218       /* If any dynamic relocs apply to a read-only section, then we
5219 	 need a DT_TEXTREL entry.  */
5220       if ((info->flags & DF_TEXTREL) == 0)
5221 	elf_link_hash_traverse (elf_hash_table (info), readonly_dynrelocs,
5222 				info);
5223 
5224       if ((info->flags & DF_TEXTREL) != 0)
5225 	{
5226 	  if (!add_dynamic_entry (DT_TEXTREL, 0))
5227 	    return FALSE;
5228 	}
5229     }
5230 #undef add_dynamic_entry
5231 
5232   return TRUE;
5233 }
5234 
5235 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
5236 
5237 static const int shared_stub_entry[] =
5238   {
5239     0x7c0802a6, /* mflr 0 */
5240     0x429f0005, /* bcl 20, 31, .Lxxx */
5241     0x7d6802a6, /* mflr 11 */
5242     0x3d6b0000, /* addis 11, 11, (xxx-.Lxxx)@ha */
5243     0x396b0018, /* addi 11, 11, (xxx-.Lxxx)@l */
5244     0x7c0803a6, /* mtlr 0 */
5245     0x7d6903a6, /* mtctr 11 */
5246     0x4e800420, /* bctr */
5247   };
5248 
5249 static const int stub_entry[] =
5250   {
5251     0x3d600000, /* lis 11,xxx@ha */
5252     0x396b0000, /* addi 11,11,xxx@l */
5253     0x7d6903a6, /* mtctr 11 */
5254     0x4e800420, /* bctr */
5255   };
5256 
5257 static bfd_boolean
ppc_elf_relax_section(bfd * abfd,asection * isec,struct bfd_link_info * link_info,bfd_boolean * again)5258 ppc_elf_relax_section (bfd *abfd,
5259 		       asection *isec,
5260 		       struct bfd_link_info *link_info,
5261 		       bfd_boolean *again)
5262 {
5263   struct one_fixup
5264   {
5265     struct one_fixup *next;
5266     asection *tsec;
5267     bfd_vma toff;
5268     bfd_vma trampoff;
5269   };
5270 
5271   Elf_Internal_Shdr *symtab_hdr;
5272   bfd_byte *contents = NULL;
5273   Elf_Internal_Sym *isymbuf = NULL;
5274   Elf_Internal_Rela *internal_relocs = NULL;
5275   Elf_Internal_Rela *irel, *irelend;
5276   struct one_fixup *fixups = NULL;
5277   bfd_boolean changed;
5278   struct ppc_elf_link_hash_table *htab;
5279   bfd_size_type trampoff;
5280   asection *got2;
5281 
5282   *again = FALSE;
5283 
5284   /* Nothing to do if there are no relocations, and no need to do
5285      anything with non-alloc sections.  */
5286   if ((isec->flags & SEC_ALLOC) == 0
5287       || (isec->flags & SEC_RELOC) == 0
5288       || isec->reloc_count == 0)
5289     return TRUE;
5290 
5291   trampoff = (isec->size + 3) & (bfd_vma) -4;
5292   /* Space for a branch around any trampolines.  */
5293   trampoff += 4;
5294 
5295   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5296 
5297   /* Get a copy of the native relocations.  */
5298   internal_relocs = _bfd_elf_link_read_relocs (abfd, isec, NULL, NULL,
5299 					       link_info->keep_memory);
5300   if (internal_relocs == NULL)
5301     goto error_return;
5302 
5303   htab = ppc_elf_hash_table (link_info);
5304   got2 = bfd_get_section_by_name (abfd, ".got2");
5305 
5306   irelend = internal_relocs + isec->reloc_count;
5307   for (irel = internal_relocs; irel < irelend; irel++)
5308     {
5309       unsigned long r_type = ELF32_R_TYPE (irel->r_info);
5310       bfd_vma symaddr, reladdr, toff, roff;
5311       asection *tsec;
5312       struct one_fixup *f;
5313       size_t insn_offset = 0;
5314       bfd_vma max_branch_offset, val;
5315       bfd_byte *hit_addr;
5316       unsigned long t0;
5317       unsigned char sym_type;
5318 
5319       switch (r_type)
5320 	{
5321 	case R_PPC_REL24:
5322 	case R_PPC_LOCAL24PC:
5323 	case R_PPC_PLTREL24:
5324 	  max_branch_offset = 1 << 25;
5325 	  break;
5326 
5327 	case R_PPC_REL14:
5328 	case R_PPC_REL14_BRTAKEN:
5329 	case R_PPC_REL14_BRNTAKEN:
5330 	  max_branch_offset = 1 << 15;
5331 	  break;
5332 
5333 	default:
5334 	  continue;
5335 	}
5336 
5337       /* Get the value of the symbol referred to by the reloc.  */
5338       if (ELF32_R_SYM (irel->r_info) < symtab_hdr->sh_info)
5339 	{
5340 	  /* A local symbol.  */
5341 	  Elf_Internal_Sym *isym;
5342 
5343 	  /* Read this BFD's local symbols.  */
5344 	  if (isymbuf == NULL)
5345 	    {
5346 	      isymbuf = (Elf_Internal_Sym *) symtab_hdr->contents;
5347 	      if (isymbuf == NULL)
5348 		isymbuf = bfd_elf_get_elf_syms (abfd, symtab_hdr,
5349 						symtab_hdr->sh_info, 0,
5350 						NULL, NULL, NULL);
5351 	      if (isymbuf == 0)
5352 		goto error_return;
5353 	    }
5354 	  isym = isymbuf + ELF32_R_SYM (irel->r_info);
5355 	  if (isym->st_shndx == SHN_UNDEF)
5356 	    continue;	/* We can't do anything with undefined symbols.  */
5357 	  else if (isym->st_shndx == SHN_ABS)
5358 	    tsec = bfd_abs_section_ptr;
5359 	  else if (isym->st_shndx == SHN_COMMON)
5360 	    tsec = bfd_com_section_ptr;
5361 	  else
5362 	    tsec = bfd_section_from_elf_index (abfd, isym->st_shndx);
5363 
5364 	  toff = isym->st_value;
5365 	  sym_type = ELF_ST_TYPE (isym->st_info);
5366 	}
5367       else
5368 	{
5369 	  /* Global symbol handling.  */
5370 	  unsigned long indx;
5371 	  struct elf_link_hash_entry *h;
5372 
5373 	  indx = ELF32_R_SYM (irel->r_info) - symtab_hdr->sh_info;
5374 	  h = elf_sym_hashes (abfd)[indx];
5375 
5376 	  while (h->root.type == bfd_link_hash_indirect
5377 		 || h->root.type == bfd_link_hash_warning)
5378 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
5379 
5380 	  tsec = NULL;
5381 	  toff = 0;
5382 	  if (r_type == R_PPC_PLTREL24
5383 	      && htab->plt != NULL)
5384 	    {
5385 	      struct plt_entry *ent = find_plt_ent (h, got2, irel->r_addend);
5386 
5387 	      if (ent != NULL)
5388 		{
5389 		  if (htab->plt_type == PLT_NEW)
5390 		    {
5391 		      tsec = htab->glink;
5392 		      toff = ent->glink_offset;
5393 		    }
5394 		  else
5395 		    {
5396 		      tsec = htab->plt;
5397 		      toff = ent->plt.offset;
5398 		    }
5399 		}
5400 	    }
5401 	  if (tsec != NULL)
5402 	    ;
5403 	  else if (h->root.type == bfd_link_hash_defined
5404 		   || h->root.type == bfd_link_hash_defweak)
5405 	    {
5406 	      tsec = h->root.u.def.section;
5407 	      toff = h->root.u.def.value;
5408 	    }
5409 	  else
5410 	    continue;
5411 
5412 	  sym_type = h->type;
5413 	}
5414 
5415       /* If the branch and target are in the same section, you have
5416 	 no hope of adding stubs.  We'll error out later should the
5417 	 branch overflow.  */
5418       if (tsec == isec)
5419 	continue;
5420 
5421       /* There probably isn't any reason to handle symbols in
5422 	 SEC_MERGE sections;  SEC_MERGE doesn't seem a likely
5423 	 attribute for a code section, and we are only looking at
5424 	 branches.  However, implement it correctly here as a
5425 	 reference for other target relax_section functions.  */
5426       if (0 && tsec->sec_info_type == ELF_INFO_TYPE_MERGE)
5427 	{
5428 	  /* At this stage in linking, no SEC_MERGE symbol has been
5429 	     adjusted, so all references to such symbols need to be
5430 	     passed through _bfd_merged_section_offset.  (Later, in
5431 	     relocate_section, all SEC_MERGE symbols *except* for
5432 	     section symbols have been adjusted.)
5433 
5434 	     gas may reduce relocations against symbols in SEC_MERGE
5435 	     sections to a relocation against the section symbol when
5436 	     the original addend was zero.  When the reloc is against
5437 	     a section symbol we should include the addend in the
5438 	     offset passed to _bfd_merged_section_offset, since the
5439 	     location of interest is the original symbol.  On the
5440 	     other hand, an access to "sym+addend" where "sym" is not
5441 	     a section symbol should not include the addend;  Such an
5442 	     access is presumed to be an offset from "sym";  The
5443 	     location of interest is just "sym".  */
5444 	  if (sym_type == STT_SECTION)
5445 	    toff += irel->r_addend;
5446 
5447 	  toff = _bfd_merged_section_offset (abfd, &tsec,
5448 					     elf_section_data (tsec)->sec_info,
5449 					     toff);
5450 
5451 	  if (sym_type != STT_SECTION)
5452 	    toff += irel->r_addend;
5453 	}
5454       /* PLTREL24 addends are special.  */
5455       else if (r_type != R_PPC_PLTREL24)
5456 	toff += irel->r_addend;
5457 
5458       /* Attempted -shared link of non-pic code loses.  */
5459       if (tsec->output_section == NULL)
5460 	continue;
5461 
5462       symaddr = tsec->output_section->vma + tsec->output_offset + toff;
5463 
5464       roff = irel->r_offset;
5465       reladdr = isec->output_section->vma + isec->output_offset + roff;
5466 
5467       /* If the branch is in range, no need to do anything.  */
5468       if (symaddr - reladdr + max_branch_offset < 2 * max_branch_offset)
5469 	continue;
5470 
5471       /* Look for an existing fixup to this address.  */
5472       for (f = fixups; f ; f = f->next)
5473 	if (f->tsec == tsec && f->toff == toff)
5474 	  break;
5475 
5476       if (f == NULL)
5477 	{
5478 	  size_t size;
5479 	  unsigned long stub_rtype;
5480 
5481 	  val = trampoff - roff;
5482 	  if (val >= max_branch_offset)
5483 	    /* Oh dear, we can't reach a trampoline.  Don't try to add
5484 	       one.  We'll report an error later.  */
5485 	    continue;
5486 
5487 	  if (link_info->shared)
5488 	    {
5489 	      size = 4 * ARRAY_SIZE (shared_stub_entry);
5490 	      insn_offset = 12;
5491 	      stub_rtype = R_PPC_RELAX32PC;
5492 	    }
5493 	  else
5494 	    {
5495 	      size = 4 * ARRAY_SIZE (stub_entry);
5496 	      insn_offset = 0;
5497 	      stub_rtype = R_PPC_RELAX32;
5498 	    }
5499 
5500 	  if (R_PPC_RELAX32_PLT - R_PPC_RELAX32
5501 	      != R_PPC_RELAX32PC_PLT - R_PPC_RELAX32PC)
5502 	    abort ();
5503 	  if (tsec == htab->plt
5504 	      || tsec == htab->glink)
5505 	    stub_rtype += R_PPC_RELAX32_PLT - R_PPC_RELAX32;
5506 
5507 	  /* Hijack the old relocation.  Since we need two
5508 	     relocations for this use a "composite" reloc.  */
5509 	  irel->r_info = ELF32_R_INFO (ELF32_R_SYM (irel->r_info),
5510 				       stub_rtype);
5511 	  irel->r_offset = trampoff + insn_offset;
5512 
5513 	  /* Record the fixup so we don't do it again this section.  */
5514 	  f = bfd_malloc (sizeof (*f));
5515 	  f->next = fixups;
5516 	  f->tsec = tsec;
5517 	  f->toff = toff;
5518 	  f->trampoff = trampoff;
5519 	  fixups = f;
5520 
5521 	  trampoff += size;
5522 	}
5523       else
5524 	{
5525 	  val = f->trampoff - roff;
5526 	  if (val >= max_branch_offset)
5527 	    continue;
5528 
5529 	  /* Nop out the reloc, since we're finalizing things here.  */
5530 	  irel->r_info = ELF32_R_INFO (0, R_PPC_NONE);
5531 	}
5532 
5533       /* Get the section contents.  */
5534       if (contents == NULL)
5535 	{
5536 	  /* Get cached copy if it exists.  */
5537 	  if (elf_section_data (isec)->this_hdr.contents != NULL)
5538 	    contents = elf_section_data (isec)->this_hdr.contents;
5539 	  else
5540 	    {
5541 	      /* Go get them off disk.  */
5542 	      if (!bfd_malloc_and_get_section (abfd, isec, &contents))
5543 		goto error_return;
5544 	    }
5545 	}
5546 
5547       /* Fix up the existing branch to hit the trampoline.  */
5548       hit_addr = contents + roff;
5549       switch (r_type)
5550 	{
5551 	case R_PPC_REL24:
5552 	case R_PPC_LOCAL24PC:
5553 	case R_PPC_PLTREL24:
5554 	  t0 = bfd_get_32 (abfd, hit_addr);
5555 	  t0 &= ~0x3fffffc;
5556 	  t0 |= val & 0x3fffffc;
5557 	  bfd_put_32 (abfd, t0, hit_addr);
5558 	  break;
5559 
5560 	case R_PPC_REL14:
5561 	case R_PPC_REL14_BRTAKEN:
5562 	case R_PPC_REL14_BRNTAKEN:
5563 	  t0 = bfd_get_32 (abfd, hit_addr);
5564 	  t0 &= ~0xfffc;
5565 	  t0 |= val & 0xfffc;
5566 	  bfd_put_32 (abfd, t0, hit_addr);
5567 	  break;
5568 	}
5569     }
5570 
5571   /* Write out the trampolines.  */
5572   changed = fixups != NULL;
5573   if (fixups != NULL)
5574     {
5575       const int *stub;
5576       bfd_byte *dest;
5577       bfd_vma val;
5578       int i, size;
5579 
5580       do
5581 	{
5582 	  struct one_fixup *f = fixups;
5583 	  fixups = fixups->next;
5584 	  free (f);
5585 	}
5586       while (fixups);
5587 
5588       contents = bfd_realloc (contents, trampoff);
5589       if (contents == NULL)
5590 	goto error_return;
5591 
5592       isec->size = (isec->size + 3) & (bfd_vma) -4;
5593       /* Branch around the trampolines.  */
5594       val = trampoff - isec->size + 0x48000000;
5595       dest = contents + isec->size;
5596       isec->size = trampoff;
5597       bfd_put_32 (abfd, val, dest);
5598       dest += 4;
5599 
5600       if (link_info->shared)
5601 	{
5602 	  stub = shared_stub_entry;
5603 	  size = ARRAY_SIZE (shared_stub_entry);
5604 	}
5605       else
5606 	{
5607 	  stub = stub_entry;
5608 	  size = ARRAY_SIZE (stub_entry);
5609 	}
5610 
5611       i = 0;
5612       while (dest < contents + trampoff)
5613 	{
5614 	  bfd_put_32 (abfd, stub[i], dest);
5615 	  i++;
5616 	  if (i == size)
5617 	    i = 0;
5618 	  dest += 4;
5619 	}
5620       BFD_ASSERT (i == 0);
5621     }
5622 
5623   if (isymbuf != NULL
5624       && symtab_hdr->contents != (unsigned char *) isymbuf)
5625     {
5626       if (! link_info->keep_memory)
5627 	free (isymbuf);
5628       else
5629 	{
5630 	  /* Cache the symbols for elf_link_input_bfd.  */
5631 	  symtab_hdr->contents = (unsigned char *) isymbuf;
5632 	}
5633     }
5634 
5635   if (contents != NULL
5636       && elf_section_data (isec)->this_hdr.contents != contents)
5637     {
5638       if (!changed && !link_info->keep_memory)
5639 	free (contents);
5640       else
5641 	{
5642 	  /* Cache the section contents for elf_link_input_bfd.  */
5643 	  elf_section_data (isec)->this_hdr.contents = contents;
5644 	}
5645     }
5646 
5647   if (elf_section_data (isec)->relocs != internal_relocs)
5648     {
5649       if (!changed)
5650 	free (internal_relocs);
5651       else
5652 	elf_section_data (isec)->relocs = internal_relocs;
5653     }
5654 
5655   *again = changed;
5656   return TRUE;
5657 
5658  error_return:
5659   if (isymbuf != NULL && (unsigned char *) isymbuf != symtab_hdr->contents)
5660     free (isymbuf);
5661   if (contents != NULL
5662       && elf_section_data (isec)->this_hdr.contents != contents)
5663     free (contents);
5664   if (internal_relocs != NULL
5665       && elf_section_data (isec)->relocs != internal_relocs)
5666     free (internal_relocs);
5667   return FALSE;
5668 }
5669 
5670 /* What to do when ld finds relocations against symbols defined in
5671    discarded sections.  */
5672 
5673 static unsigned int
ppc_elf_action_discarded(asection * sec)5674 ppc_elf_action_discarded (asection *sec)
5675 {
5676   if (strcmp (".fixup", sec->name) == 0)
5677     return 0;
5678 
5679   if (strcmp (".got2", sec->name) == 0)
5680     return 0;
5681 
5682   return _bfd_elf_default_action_discarded (sec);
5683 }
5684 
5685 /* Fill in the address for a pointer generated in a linker section.  */
5686 
5687 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)5688 elf_finish_pointer_linker_section (bfd *input_bfd,
5689 				   elf_linker_section_t *lsect,
5690 				   struct elf_link_hash_entry *h,
5691 				   bfd_vma relocation,
5692 				   const Elf_Internal_Rela *rel)
5693 {
5694   elf_linker_section_pointers_t *linker_section_ptr;
5695 
5696   BFD_ASSERT (lsect != NULL);
5697 
5698   if (h != NULL)
5699     {
5700       /* Handle global symbol.  */
5701       struct ppc_elf_link_hash_entry *eh;
5702 
5703       eh = (struct ppc_elf_link_hash_entry *) h;
5704       BFD_ASSERT (eh->elf.def_regular);
5705       linker_section_ptr = eh->linker_section_pointer;
5706     }
5707   else
5708     {
5709       /* Handle local symbol.  */
5710       unsigned long r_symndx = ELF32_R_SYM (rel->r_info);
5711 
5712       BFD_ASSERT (elf_local_ptr_offsets (input_bfd) != NULL);
5713       linker_section_ptr = elf_local_ptr_offsets (input_bfd)[r_symndx];
5714     }
5715 
5716   linker_section_ptr = elf_find_pointer_linker_section (linker_section_ptr,
5717 							rel->r_addend,
5718 							lsect);
5719   BFD_ASSERT (linker_section_ptr != NULL);
5720 
5721   /* Offset will always be a multiple of four, so use the bottom bit
5722      as a "written" flag.  */
5723   if ((linker_section_ptr->offset & 1) == 0)
5724     {
5725       bfd_put_32 (lsect->section->owner,
5726 		  relocation + linker_section_ptr->addend,
5727 		  lsect->section->contents + linker_section_ptr->offset);
5728       linker_section_ptr->offset += 1;
5729     }
5730 
5731   relocation = (lsect->section->output_offset
5732 		+ linker_section_ptr->offset - 1
5733 		- 0x8000);
5734 
5735 #ifdef DEBUG
5736   fprintf (stderr,
5737 	   "Finish pointer in linker section %s, offset = %ld (0x%lx)\n",
5738 	   lsect->name, (long) relocation, (long) relocation);
5739 #endif
5740 
5741   /* Subtract out the addend, because it will get added back in by the normal
5742      processing.  */
5743   return relocation - linker_section_ptr->addend;
5744 }
5745 
5746 /* The RELOCATE_SECTION function is called by the ELF backend linker
5747    to handle the relocations for a section.
5748 
5749    The relocs are always passed as Rela structures; if the section
5750    actually uses Rel structures, the r_addend field will always be
5751    zero.
5752 
5753    This function is responsible for adjust the section contents as
5754    necessary, and (if using Rela relocs and generating a
5755    relocatable output file) adjusting the reloc addend as
5756    necessary.
5757 
5758    This function does not have to worry about setting the reloc
5759    address or the reloc symbol index.
5760 
5761    LOCAL_SYMS is a pointer to the swapped in local symbols.
5762 
5763    LOCAL_SECTIONS is an array giving the section in the input file
5764    corresponding to the st_shndx field of each local symbol.
5765 
5766    The global hash table entry for the global symbols can be found
5767    via elf_sym_hashes (input_bfd).
5768 
5769    When generating relocatable output, this function must handle
5770    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
5771    going to be the section symbol corresponding to the output
5772    section, which means that the addend must be adjusted
5773    accordingly.  */
5774 
5775 static bfd_boolean
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)5776 ppc_elf_relocate_section (bfd *output_bfd,
5777 			  struct bfd_link_info *info,
5778 			  bfd *input_bfd,
5779 			  asection *input_section,
5780 			  bfd_byte *contents,
5781 			  Elf_Internal_Rela *relocs,
5782 			  Elf_Internal_Sym *local_syms,
5783 			  asection **local_sections)
5784 {
5785   Elf_Internal_Shdr *symtab_hdr;
5786   struct elf_link_hash_entry **sym_hashes;
5787   struct ppc_elf_link_hash_table *htab;
5788   Elf_Internal_Rela *rel;
5789   Elf_Internal_Rela *relend;
5790   Elf_Internal_Rela outrel;
5791   bfd_byte *loc;
5792   asection *got2, *sreloc = NULL;
5793   bfd_vma *local_got_offsets;
5794   bfd_boolean ret = TRUE;
5795   bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
5796 
5797 #ifdef DEBUG
5798   _bfd_error_handler ("ppc_elf_relocate_section called for %B section %A, "
5799 		      "%ld relocations%s",
5800 		      input_bfd, input_section,
5801 		      (long) input_section->reloc_count,
5802 		      (info->relocatable) ? " (relocatable)" : "");
5803 #endif
5804 
5805   got2 = bfd_get_section_by_name (input_bfd, ".got2");
5806 
5807   /* Initialize howto table if not already done.  */
5808   if (!ppc_elf_howto_table[R_PPC_ADDR32])
5809     ppc_elf_howto_init ();
5810 
5811   htab = ppc_elf_hash_table (info);
5812   local_got_offsets = elf_local_got_offsets (input_bfd);
5813   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
5814   sym_hashes = elf_sym_hashes (input_bfd);
5815   rel = relocs;
5816   relend = relocs + input_section->reloc_count;
5817   for (; rel < relend; rel++)
5818     {
5819       enum elf_ppc_reloc_type r_type;
5820       bfd_vma addend;
5821       bfd_reloc_status_type r;
5822       Elf_Internal_Sym *sym;
5823       asection *sec;
5824       struct elf_link_hash_entry *h;
5825       const char *sym_name;
5826       reloc_howto_type *howto;
5827       unsigned long r_symndx;
5828       bfd_vma relocation;
5829       bfd_vma branch_bit, insn, from;
5830       bfd_boolean unresolved_reloc;
5831       bfd_boolean warned;
5832       unsigned int tls_type, tls_mask, tls_gd;
5833 
5834       r_type = ELF32_R_TYPE (rel->r_info);
5835       sym = NULL;
5836       sec = NULL;
5837       h = NULL;
5838       unresolved_reloc = FALSE;
5839       warned = FALSE;
5840       r_symndx = ELF32_R_SYM (rel->r_info);
5841 
5842       if (r_symndx < symtab_hdr->sh_info)
5843 	{
5844 	  sym = local_syms + r_symndx;
5845 	  sec = local_sections[r_symndx];
5846 	  sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
5847 
5848 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
5849 	}
5850       else
5851 	{
5852 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
5853 				   r_symndx, symtab_hdr, sym_hashes,
5854 				   h, sec, relocation,
5855 				   unresolved_reloc, warned);
5856 
5857 	  sym_name = h->root.root.string;
5858 	}
5859 
5860       if (sec != NULL && elf_discarded_section (sec))
5861 	{
5862 	  /* For relocs against symbols from removed linkonce sections,
5863 	     or sections discarded by a linker script, we just want the
5864 	     section contents zeroed.  Avoid any special processing.  */
5865 	  howto = NULL;
5866 	  if (r_type < R_PPC_max)
5867 	    howto = ppc_elf_howto_table[r_type];
5868 	  _bfd_clear_contents (howto, input_bfd, contents + rel->r_offset);
5869 	  rel->r_info = 0;
5870 	  rel->r_addend = 0;
5871 	  continue;
5872 	}
5873 
5874       if (info->relocatable)
5875 	{
5876 	  if (got2 != NULL
5877 	      && r_type == R_PPC_PLTREL24
5878 	      && rel->r_addend >= 32768)
5879 	    {
5880 	      /* R_PPC_PLTREL24 is rather special.  If non-zero, the
5881 		 addend specifies the GOT pointer offset within .got2.  */
5882 	      rel->r_addend += got2->output_offset;
5883 	    }
5884 	  continue;
5885 	}
5886 
5887       /* TLS optimizations.  Replace instruction sequences and relocs
5888 	 based on information we collected in tls_optimize.  We edit
5889 	 RELOCS so that --emit-relocs will output something sensible
5890 	 for the final instruction stream.  */
5891       tls_mask = 0;
5892       tls_gd = 0;
5893       if (h != NULL)
5894 	tls_mask = ((struct ppc_elf_link_hash_entry *) h)->tls_mask;
5895       else if (local_got_offsets != NULL)
5896 	{
5897 	  char *lgot_masks;
5898 	  lgot_masks = (char *) (local_got_offsets + symtab_hdr->sh_info);
5899 	  tls_mask = lgot_masks[r_symndx];
5900 	}
5901 
5902       /* Ensure reloc mapping code below stays sane.  */
5903       if ((R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TLSGD16 & 3)
5904 	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TLSGD16_LO & 3)
5905 	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TLSGD16_HI & 3)
5906 	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TLSGD16_HA & 3)
5907 	  || (R_PPC_GOT_TLSLD16 & 3)    != (R_PPC_GOT_TPREL16 & 3)
5908 	  || (R_PPC_GOT_TLSLD16_LO & 3) != (R_PPC_GOT_TPREL16_LO & 3)
5909 	  || (R_PPC_GOT_TLSLD16_HI & 3) != (R_PPC_GOT_TPREL16_HI & 3)
5910 	  || (R_PPC_GOT_TLSLD16_HA & 3) != (R_PPC_GOT_TPREL16_HA & 3))
5911 	abort ();
5912       switch (r_type)
5913 	{
5914 	default:
5915 	  break;
5916 
5917 	case R_PPC_GOT_TPREL16:
5918 	case R_PPC_GOT_TPREL16_LO:
5919 	  if (tls_mask != 0
5920 	      && (tls_mask & TLS_TPREL) == 0)
5921 	    {
5922 	      bfd_vma insn;
5923 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
5924 	      insn &= 31 << 21;
5925 	      insn |= 0x3c020000;	/* addis 0,2,0 */
5926 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
5927 	      r_type = R_PPC_TPREL16_HA;
5928 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5929 	    }
5930 	  break;
5931 
5932 	case R_PPC_TLS:
5933 	  if (tls_mask != 0
5934 	      && (tls_mask & TLS_TPREL) == 0)
5935 	    {
5936 	      bfd_vma insn, rtra;
5937 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
5938 	      if ((insn & ((31 << 26) | (31 << 11)))
5939 		  == ((31 << 26) | (2 << 11)))
5940 		rtra = insn & ((1 << 26) - (1 << 16));
5941 	      else if ((insn & ((31 << 26) | (31 << 16)))
5942 		       == ((31 << 26) | (2 << 16)))
5943 		rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
5944 	      else
5945 		abort ();
5946 	      if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
5947 		/* add -> addi.  */
5948 		insn = 14 << 26;
5949 	      else if ((insn & (31 << 1)) == 23 << 1
5950 		       && ((insn & (31 << 6)) < 14 << 6
5951 			   || ((insn & (31 << 6)) >= 16 << 6
5952 			       && (insn & (31 << 6)) < 24 << 6)))
5953 		/* load and store indexed -> dform.  */
5954 		insn = (32 | ((insn >> 6) & 31)) << 26;
5955 	      else if ((insn & (31 << 1)) == 21 << 1
5956 		       && (insn & (0x1a << 6)) == 0)
5957 		/* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
5958 		insn = (((58 | ((insn >> 6) & 4)) << 26)
5959 			| ((insn >> 6) & 1));
5960 	      else if ((insn & (31 << 1)) == 21 << 1
5961 		       && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
5962 		/* lwax -> lwa.  */
5963 		insn = (58 << 26) | 2;
5964 	      else
5965 		abort ();
5966 	      insn |= rtra;
5967 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5968 	      r_type = R_PPC_TPREL16_LO;
5969 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5970 
5971 	      /* Was PPC_TLS which sits on insn boundary, now
5972 		 PPC_TPREL16_LO which is at low-order half-word.  */
5973 	      rel->r_offset += d_offset;
5974 	    }
5975 	  break;
5976 
5977 	case R_PPC_GOT_TLSGD16_HI:
5978 	case R_PPC_GOT_TLSGD16_HA:
5979 	  tls_gd = TLS_TPRELGD;
5980 	  if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
5981 	    goto tls_gdld_hi;
5982 	  break;
5983 
5984 	case R_PPC_GOT_TLSLD16_HI:
5985 	case R_PPC_GOT_TLSLD16_HA:
5986 	  if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
5987 	    {
5988 	    tls_gdld_hi:
5989 	      if ((tls_mask & tls_gd) != 0)
5990 		r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
5991 			  + R_PPC_GOT_TPREL16);
5992 	      else
5993 		{
5994 		  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
5995 		  rel->r_offset -= d_offset;
5996 		  r_type = R_PPC_NONE;
5997 		}
5998 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
5999 	    }
6000 	  break;
6001 
6002 	case R_PPC_GOT_TLSGD16:
6003 	case R_PPC_GOT_TLSGD16_LO:
6004 	  tls_gd = TLS_TPRELGD;
6005 	  if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
6006 	    goto tls_ldgd_opt;
6007 	  break;
6008 
6009 	case R_PPC_GOT_TLSLD16:
6010 	case R_PPC_GOT_TLSLD16_LO:
6011 	  if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
6012 	    {
6013 	      unsigned int insn1, insn2;
6014 	      bfd_vma offset;
6015 
6016 	    tls_ldgd_opt:
6017 	      offset = (bfd_vma) -1;
6018 	      /* If not using the newer R_PPC_TLSGD/LD to mark
6019 		 __tls_get_addr calls, we must trust that the call
6020 		 stays with its arg setup insns, ie. that the next
6021 		 reloc is the __tls_get_addr call associated with
6022 		 the current reloc.  Edit both insns.  */
6023 	      if (input_section->has_tls_get_addr_call
6024 		  && rel + 1 < relend
6025 		  && branch_reloc_hash_match (input_bfd, rel + 1,
6026 					      htab->tls_get_addr))
6027 		offset = rel[1].r_offset;
6028 	      if ((tls_mask & tls_gd) != 0)
6029 		{
6030 		  /* IE */
6031 		  insn1 = bfd_get_32 (output_bfd,
6032 				      contents + rel->r_offset - d_offset);
6033 		  insn1 &= (1 << 26) - 1;
6034 		  insn1 |= 32 << 26;	/* lwz */
6035 		  if (offset != (bfd_vma) -1)
6036 		    {
6037 		      rel[1].r_info
6038 			= ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
6039 					R_PPC_NONE);
6040 		      insn2 = 0x7c631214;	/* add 3,3,2 */
6041 		      bfd_put_32 (output_bfd, insn2, contents + offset);
6042 		    }
6043 		  r_type = (((r_type - (R_PPC_GOT_TLSGD16 & 3)) & 3)
6044 			    + R_PPC_GOT_TPREL16);
6045 		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6046 		}
6047 	      else
6048 		{
6049 		  /* LE */
6050 		  insn1 = 0x3c620000;	/* addis 3,2,0 */
6051 		  if (tls_gd == 0)
6052 		    {
6053 		      /* Was an LD reloc.  */
6054 		      for (r_symndx = 0;
6055 			   r_symndx < symtab_hdr->sh_info;
6056 			   r_symndx++)
6057 			if (local_sections[r_symndx] == sec)
6058 			  break;
6059 		      if (r_symndx >= symtab_hdr->sh_info)
6060 			r_symndx = 0;
6061 		      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
6062 		      if (r_symndx != 0)
6063 			rel->r_addend -= (local_syms[r_symndx].st_value
6064 					  + sec->output_offset
6065 					  + sec->output_section->vma);
6066 		    }
6067 		  r_type = R_PPC_TPREL16_HA;
6068 		  rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6069 		  if (offset != (bfd_vma) -1)
6070 		    {
6071 		      rel[1].r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
6072 		      rel[1].r_offset = offset + d_offset;
6073 		      rel[1].r_addend = rel->r_addend;
6074 		      insn2 = 0x38630000;	/* addi 3,3,0 */
6075 		      bfd_put_32 (output_bfd, insn2, contents + offset);
6076 		    }
6077 		}
6078 	      bfd_put_32 (output_bfd, insn1,
6079 			  contents + rel->r_offset - d_offset);
6080 	      if (tls_gd == 0)
6081 		{
6082 		  /* We changed the symbol on an LD reloc.  Start over
6083 		     in order to get h, sym, sec etc. right.  */
6084 		  rel--;
6085 		  continue;
6086 		}
6087 	    }
6088 	  break;
6089 
6090 	case R_PPC_TLSGD:
6091 	  if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
6092 	    {
6093 	      unsigned int insn2;
6094 	      bfd_vma offset = rel->r_offset;
6095 
6096 	      if ((tls_mask & TLS_TPRELGD) != 0)
6097 		{
6098 		  /* IE */
6099 		  r_type = R_PPC_NONE;
6100 		  insn2 = 0x7c631214;	/* add 3,3,2 */
6101 		}
6102 	      else
6103 		{
6104 		  /* LE */
6105 		  r_type = R_PPC_TPREL16_LO;
6106 		  rel->r_offset += d_offset;
6107 		  insn2 = 0x38630000;	/* addi 3,3,0 */
6108 		}
6109 	      rel->r_info = ELF32_R_INFO (r_symndx, r_type);
6110 	      bfd_put_32 (output_bfd, insn2, contents + offset);
6111 	      /* Zap the reloc on the _tls_get_addr call too.  */
6112 	      BFD_ASSERT (offset == rel[1].r_offset);
6113 	      rel[1].r_info = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
6114 					    R_PPC_NONE);
6115 	    }
6116 	  break;
6117 
6118 	case R_PPC_TLSLD:
6119 	  if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
6120 	    {
6121 	      unsigned int insn2;
6122 
6123 	      for (r_symndx = 0;
6124 		   r_symndx < symtab_hdr->sh_info;
6125 		   r_symndx++)
6126 		if (local_sections[r_symndx] == sec)
6127 		  break;
6128 	      if (r_symndx >= symtab_hdr->sh_info)
6129 		r_symndx = 0;
6130 	      rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
6131 	      if (r_symndx != 0)
6132 		rel->r_addend -= (local_syms[r_symndx].st_value
6133 				  + sec->output_offset
6134 				  + sec->output_section->vma);
6135 
6136 	      rel->r_info = ELF32_R_INFO (r_symndx, R_PPC_TPREL16_LO);
6137 	      rel->r_offset += d_offset;
6138 	      insn2 = 0x38630000;	/* addi 3,3,0 */
6139 	      bfd_put_32 (output_bfd, insn2,
6140 			  contents + rel->r_offset - d_offset);
6141 	      /* Zap the reloc on the _tls_get_addr call too.  */
6142 	      BFD_ASSERT (rel->r_offset - d_offset == rel[1].r_offset);
6143 	      rel[1].r_info = ELF32_R_INFO (ELF32_R_SYM (rel[1].r_info),
6144 					    R_PPC_NONE);
6145 	      rel--;
6146 	      continue;
6147 	    }
6148 	  break;
6149 	}
6150 
6151       /* Handle other relocations that tweak non-addend part of insn.  */
6152       branch_bit = 0;
6153       switch (r_type)
6154 	{
6155 	default:
6156 	  break;
6157 
6158 	  /* Branch taken prediction relocations.  */
6159 	case R_PPC_ADDR14_BRTAKEN:
6160 	case R_PPC_REL14_BRTAKEN:
6161 	  branch_bit = BRANCH_PREDICT_BIT;
6162 	  /* Fall thru */
6163 
6164 	  /* Branch not taken prediction relocations.  */
6165 	case R_PPC_ADDR14_BRNTAKEN:
6166 	case R_PPC_REL14_BRNTAKEN:
6167 	  insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6168 	  insn &= ~BRANCH_PREDICT_BIT;
6169 	  insn |= branch_bit;
6170 
6171 	  from = (rel->r_offset
6172 		  + input_section->output_offset
6173 		  + input_section->output_section->vma);
6174 
6175 	  /* Invert 'y' bit if not the default.  */
6176 	  if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
6177 	    insn ^= BRANCH_PREDICT_BIT;
6178 
6179 	  bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6180 	  break;
6181 	}
6182 
6183       addend = rel->r_addend;
6184       tls_type = 0;
6185       howto = NULL;
6186       if (r_type < R_PPC_max)
6187 	howto = ppc_elf_howto_table[r_type];
6188       switch ((int) r_type)
6189 	{
6190 	default:
6191 	  (*_bfd_error_handler)
6192 	    (_("%B: unknown relocation type %d for symbol %s"),
6193 	     input_bfd, (int) r_type, sym_name);
6194 
6195 	  bfd_set_error (bfd_error_bad_value);
6196 	  ret = FALSE;
6197 	  continue;
6198 
6199 	case R_PPC_NONE:
6200 	case R_PPC_TLS:
6201 	case R_PPC_TLSGD:
6202 	case R_PPC_TLSLD:
6203 	case R_PPC_EMB_MRKREF:
6204 	case R_PPC_GNU_VTINHERIT:
6205 	case R_PPC_GNU_VTENTRY:
6206 	  continue;
6207 
6208 	  /* GOT16 relocations.  Like an ADDR16 using the symbol's
6209 	     address in the GOT as relocation value instead of the
6210 	     symbol's value itself.  Also, create a GOT entry for the
6211 	     symbol and put the symbol value there.  */
6212 	case R_PPC_GOT_TLSGD16:
6213 	case R_PPC_GOT_TLSGD16_LO:
6214 	case R_PPC_GOT_TLSGD16_HI:
6215 	case R_PPC_GOT_TLSGD16_HA:
6216 	  tls_type = TLS_TLS | TLS_GD;
6217 	  goto dogot;
6218 
6219 	case R_PPC_GOT_TLSLD16:
6220 	case R_PPC_GOT_TLSLD16_LO:
6221 	case R_PPC_GOT_TLSLD16_HI:
6222 	case R_PPC_GOT_TLSLD16_HA:
6223 	  tls_type = TLS_TLS | TLS_LD;
6224 	  goto dogot;
6225 
6226 	case R_PPC_GOT_TPREL16:
6227 	case R_PPC_GOT_TPREL16_LO:
6228 	case R_PPC_GOT_TPREL16_HI:
6229 	case R_PPC_GOT_TPREL16_HA:
6230 	  tls_type = TLS_TLS | TLS_TPREL;
6231 	  goto dogot;
6232 
6233 	case R_PPC_GOT_DTPREL16:
6234 	case R_PPC_GOT_DTPREL16_LO:
6235 	case R_PPC_GOT_DTPREL16_HI:
6236 	case R_PPC_GOT_DTPREL16_HA:
6237 	  tls_type = TLS_TLS | TLS_DTPREL;
6238 	  goto dogot;
6239 
6240 	case R_PPC_GOT16:
6241 	case R_PPC_GOT16_LO:
6242 	case R_PPC_GOT16_HI:
6243 	case R_PPC_GOT16_HA:
6244 	  tls_mask = 0;
6245 	dogot:
6246 	  {
6247 	    /* Relocation is to the entry for this symbol in the global
6248 	       offset table.  */
6249 	    bfd_vma off;
6250 	    bfd_vma *offp;
6251 	    unsigned long indx;
6252 
6253 	    if (htab->got == NULL)
6254 	      abort ();
6255 
6256 	    indx = 0;
6257 	    if (tls_type == (TLS_TLS | TLS_LD)
6258 		&& (h == NULL
6259 		    || !h->def_dynamic))
6260 	      offp = &htab->tlsld_got.offset;
6261 	    else if (h != NULL)
6262 	      {
6263 		bfd_boolean dyn;
6264 		dyn = htab->elf.dynamic_sections_created;
6265 		if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared, h)
6266 		    || (info->shared
6267 			&& SYMBOL_REFERENCES_LOCAL (info, h)))
6268 		  /* This is actually a static link, or it is a
6269 		     -Bsymbolic link and the symbol is defined
6270 		     locally, or the symbol was forced to be local
6271 		     because of a version file.  */
6272 		  ;
6273 		else
6274 		  {
6275 		    indx = h->dynindx;
6276 		    unresolved_reloc = FALSE;
6277 		  }
6278 		offp = &h->got.offset;
6279 	      }
6280 	    else
6281 	      {
6282 		if (local_got_offsets == NULL)
6283 		  abort ();
6284 		offp = &local_got_offsets[r_symndx];
6285 	      }
6286 
6287 	    /* The offset must always be a multiple of 4.  We use the
6288 	       least significant bit to record whether we have already
6289 	       processed this entry.  */
6290 	    off = *offp;
6291 	    if ((off & 1) != 0)
6292 	      off &= ~1;
6293 	    else
6294 	      {
6295 		unsigned int tls_m = (tls_mask
6296 				      & (TLS_LD | TLS_GD | TLS_DTPREL
6297 					 | TLS_TPREL | TLS_TPRELGD));
6298 
6299 		if (offp == &htab->tlsld_got.offset)
6300 		  tls_m = TLS_LD;
6301 		else if (h == NULL
6302 			 || !h->def_dynamic)
6303 		  tls_m &= ~TLS_LD;
6304 
6305 		/* We might have multiple got entries for this sym.
6306 		   Initialize them all.  */
6307 		do
6308 		  {
6309 		    int tls_ty = 0;
6310 
6311 		    if ((tls_m & TLS_LD) != 0)
6312 		      {
6313 			tls_ty = TLS_TLS | TLS_LD;
6314 			tls_m &= ~TLS_LD;
6315 		      }
6316 		    else if ((tls_m & TLS_GD) != 0)
6317 		      {
6318 			tls_ty = TLS_TLS | TLS_GD;
6319 			tls_m &= ~TLS_GD;
6320 		      }
6321 		    else if ((tls_m & TLS_DTPREL) != 0)
6322 		      {
6323 			tls_ty = TLS_TLS | TLS_DTPREL;
6324 			tls_m &= ~TLS_DTPREL;
6325 		      }
6326 		    else if ((tls_m & (TLS_TPREL | TLS_TPRELGD)) != 0)
6327 		      {
6328 			tls_ty = TLS_TLS | TLS_TPREL;
6329 			tls_m = 0;
6330 		      }
6331 
6332 		    /* Generate relocs for the dynamic linker.  */
6333 		    if ((info->shared || indx != 0)
6334 			&& (h == NULL
6335 			    || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6336 			    || h->root.type != bfd_link_hash_undefweak))
6337 		      {
6338 			outrel.r_offset = (htab->got->output_section->vma
6339 					   + htab->got->output_offset
6340 					   + off);
6341 			outrel.r_addend = 0;
6342 			if (tls_ty & (TLS_LD | TLS_GD))
6343 			  {
6344 			    outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPMOD32);
6345 			    if (tls_ty == (TLS_TLS | TLS_GD))
6346 			      {
6347 				loc = htab->relgot->contents;
6348 				loc += (htab->relgot->reloc_count++
6349 					* sizeof (Elf32_External_Rela));
6350 				bfd_elf32_swap_reloca_out (output_bfd,
6351 							   &outrel, loc);
6352 				outrel.r_offset += 4;
6353 				outrel.r_info
6354 				  = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6355 			      }
6356 			  }
6357 			else if (tls_ty == (TLS_TLS | TLS_DTPREL))
6358 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_DTPREL32);
6359 			else if (tls_ty == (TLS_TLS | TLS_TPREL))
6360 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_TPREL32);
6361 			else if (indx == 0)
6362 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_RELATIVE);
6363 			else
6364 			  outrel.r_info = ELF32_R_INFO (indx, R_PPC_GLOB_DAT);
6365 			if (indx == 0)
6366 			  {
6367 			    outrel.r_addend += relocation;
6368 			    if (tls_ty & (TLS_GD | TLS_DTPREL | TLS_TPREL))
6369 			      outrel.r_addend -= htab->elf.tls_sec->vma;
6370 			  }
6371 			loc = htab->relgot->contents;
6372 			loc += (htab->relgot->reloc_count++
6373 				* sizeof (Elf32_External_Rela));
6374 			bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6375 		      }
6376 
6377 		    /* Init the .got section contents if we're not
6378 		       emitting a reloc.  */
6379 		    else
6380 		      {
6381 			bfd_vma value = relocation;
6382 
6383 			if (tls_ty == (TLS_TLS | TLS_LD))
6384 			  value = 1;
6385 			else if (tls_ty != 0)
6386 			  {
6387 			    value -= htab->elf.tls_sec->vma + DTP_OFFSET;
6388 			    if (tls_ty == (TLS_TLS | TLS_TPREL))
6389 			      value += DTP_OFFSET - TP_OFFSET;
6390 
6391 			    if (tls_ty == (TLS_TLS | TLS_GD))
6392 			      {
6393 				bfd_put_32 (output_bfd, value,
6394 					    htab->got->contents + off + 4);
6395 				value = 1;
6396 			      }
6397 			  }
6398 			bfd_put_32 (output_bfd, value,
6399 				    htab->got->contents + off);
6400 		      }
6401 
6402 		    off += 4;
6403 		    if (tls_ty & (TLS_LD | TLS_GD))
6404 		      off += 4;
6405 		  }
6406 		while (tls_m != 0);
6407 
6408 		off = *offp;
6409 		*offp = off | 1;
6410 	      }
6411 
6412 	    if (off >= (bfd_vma) -2)
6413 	      abort ();
6414 
6415 	    if ((tls_type & TLS_TLS) != 0)
6416 	      {
6417 		if (tls_type != (TLS_TLS | TLS_LD))
6418 		  {
6419 		    if ((tls_mask & TLS_LD) != 0
6420 			&& !(h == NULL
6421 			     || !h->def_dynamic))
6422 		      off += 8;
6423 		    if (tls_type != (TLS_TLS | TLS_GD))
6424 		      {
6425 			if ((tls_mask & TLS_GD) != 0)
6426 			  off += 8;
6427 			if (tls_type != (TLS_TLS | TLS_DTPREL))
6428 			  {
6429 			    if ((tls_mask & TLS_DTPREL) != 0)
6430 			      off += 4;
6431 			  }
6432 		      }
6433 		  }
6434 	      }
6435 
6436 	    relocation = htab->got->output_offset + off;
6437 	    relocation -= htab->elf.hgot->root.u.def.value;
6438 
6439 	    /* Addends on got relocations don't make much sense.
6440 	       x+off@got is actually x@got+off, and since the got is
6441 	       generated by a hash table traversal, the value in the
6442 	       got at entry m+n bears little relation to the entry m.  */
6443 	    if (addend != 0)
6444 	      (*_bfd_error_handler)
6445 		(_("%B(%A+0x%lx): non-zero addend on %s reloc against `%s'"),
6446 		 input_bfd,
6447 		 input_section,
6448 		 (long) rel->r_offset,
6449 		 howto->name,
6450 		 sym_name);
6451 	  }
6452 	break;
6453 
6454 	/* Relocations that need no special processing.  */
6455 	case R_PPC_LOCAL24PC:
6456 	  /* It makes no sense to point a local relocation
6457 	     at a symbol not in this object.  */
6458 	  if (unresolved_reloc)
6459 	    {
6460 	      if (! (*info->callbacks->undefined_symbol) (info,
6461 							  h->root.root.string,
6462 							  input_bfd,
6463 							  input_section,
6464 							  rel->r_offset,
6465 							  TRUE))
6466 		return FALSE;
6467 	      continue;
6468 	    }
6469 	  break;
6470 
6471 	case R_PPC_DTPREL16:
6472 	case R_PPC_DTPREL16_LO:
6473 	case R_PPC_DTPREL16_HI:
6474 	case R_PPC_DTPREL16_HA:
6475 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6476 	  break;
6477 
6478 	  /* Relocations that may need to be propagated if this is a shared
6479 	     object.  */
6480 	case R_PPC_TPREL16:
6481 	case R_PPC_TPREL16_LO:
6482 	case R_PPC_TPREL16_HI:
6483 	case R_PPC_TPREL16_HA:
6484 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6485 	  /* The TPREL16 relocs shouldn't really be used in shared
6486 	     libs as they will result in DT_TEXTREL being set, but
6487 	     support them anyway.  */
6488 	  goto dodyn;
6489 
6490 	case R_PPC_TPREL32:
6491 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
6492 	  goto dodyn;
6493 
6494 	case R_PPC_DTPREL32:
6495 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
6496 	  goto dodyn;
6497 
6498 	case R_PPC_DTPMOD32:
6499 	  relocation = 1;
6500 	  addend = 0;
6501 	  goto dodyn;
6502 
6503 	case R_PPC_REL16:
6504 	case R_PPC_REL16_LO:
6505 	case R_PPC_REL16_HI:
6506 	case R_PPC_REL16_HA:
6507 	  break;
6508 
6509 	case R_PPC_REL24:
6510 	case R_PPC_REL32:
6511 	case R_PPC_REL14:
6512 	case R_PPC_REL14_BRTAKEN:
6513 	case R_PPC_REL14_BRNTAKEN:
6514 	  /* If these relocations are not to a named symbol, they can be
6515 	     handled right here, no need to bother the dynamic linker.  */
6516 	  if (SYMBOL_REFERENCES_LOCAL (info, h)
6517 	      || h == htab->elf.hgot)
6518 	    break;
6519 	  /* fall through */
6520 
6521 	  /* Relocations that always need to be propagated if this is a shared
6522 	     object.  */
6523 	case R_PPC_ADDR32:
6524 	case R_PPC_ADDR24:
6525 	case R_PPC_ADDR16:
6526 	case R_PPC_ADDR16_LO:
6527 	case R_PPC_ADDR16_HI:
6528 	case R_PPC_ADDR16_HA:
6529 	case R_PPC_ADDR14:
6530 	case R_PPC_ADDR14_BRTAKEN:
6531 	case R_PPC_ADDR14_BRNTAKEN:
6532 	case R_PPC_UADDR32:
6533 	case R_PPC_UADDR16:
6534 	dodyn:
6535 	  if ((input_section->flags & SEC_ALLOC) == 0)
6536 	    break;
6537 	  /* Fall thru.  */
6538 
6539 	  if ((info->shared
6540 	       && (h == NULL
6541 		   || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
6542 		   || h->root.type != bfd_link_hash_undefweak)
6543 	       && (must_be_dyn_reloc (info, r_type)
6544 		   || !SYMBOL_CALLS_LOCAL (info, h)))
6545 	      || (ELIMINATE_COPY_RELOCS
6546 		  && !info->shared
6547 		  && h != NULL
6548 		  && h->dynindx != -1
6549 		  && !h->non_got_ref
6550 		  && h->def_dynamic
6551 		  && !h->def_regular))
6552 	    {
6553 	      int skip;
6554 
6555 #ifdef DEBUG
6556 	      fprintf (stderr, "ppc_elf_relocate_section needs to "
6557 		       "create relocation for %s\n",
6558 		       (h && h->root.root.string
6559 			? h->root.root.string : "<unknown>"));
6560 #endif
6561 
6562 	      /* When generating a shared object, these relocations
6563 		 are copied into the output file to be resolved at run
6564 		 time.  */
6565 	      if (sreloc == NULL)
6566 		{
6567 		  const char *name;
6568 
6569 		  name = (bfd_elf_string_from_elf_section
6570 			  (input_bfd,
6571 			   elf_elfheader (input_bfd)->e_shstrndx,
6572 			   elf_section_data (input_section)->rel_hdr.sh_name));
6573 		  if (name == NULL)
6574 		    return FALSE;
6575 
6576 		  BFD_ASSERT (CONST_STRNEQ (name, ".rela")
6577 			      && strcmp (bfd_get_section_name (input_bfd,
6578 							       input_section),
6579 					 name + 5) == 0);
6580 
6581 		  sreloc = bfd_get_section_by_name (htab->elf.dynobj, name);
6582 		  BFD_ASSERT (sreloc != NULL);
6583 		}
6584 
6585 	      skip = 0;
6586 
6587 	      outrel.r_offset =
6588 		_bfd_elf_section_offset (output_bfd, info, input_section,
6589 					 rel->r_offset);
6590 	      if (outrel.r_offset == (bfd_vma) -1
6591 		  || outrel.r_offset == (bfd_vma) -2)
6592 		skip = (int) outrel.r_offset;
6593 	      outrel.r_offset += (input_section->output_section->vma
6594 				  + input_section->output_offset);
6595 
6596 	      if (skip)
6597 		memset (&outrel, 0, sizeof outrel);
6598 	      else if (!SYMBOL_REFERENCES_LOCAL (info, h))
6599 		{
6600 		  unresolved_reloc = FALSE;
6601 		  outrel.r_info = ELF32_R_INFO (h->dynindx, r_type);
6602 		  outrel.r_addend = rel->r_addend;
6603 		}
6604 	      else
6605 		{
6606 		  outrel.r_addend = relocation + rel->r_addend;
6607 
6608 		  if (r_type == R_PPC_ADDR32)
6609 		    outrel.r_info = ELF32_R_INFO (0, R_PPC_RELATIVE);
6610 		  else
6611 		    {
6612 		      long indx = 0;
6613 
6614 		      if (r_symndx == 0 || bfd_is_abs_section (sec))
6615 			;
6616 		      else if (sec == NULL || sec->owner == NULL)
6617 			{
6618 			  bfd_set_error (bfd_error_bad_value);
6619 			  return FALSE;
6620 			}
6621 		      else
6622 			{
6623 			  asection *osec;
6624 
6625 			  /* We are turning this relocation into one
6626 			     against a section symbol.  It would be
6627 			     proper to subtract the symbol's value,
6628 			     osec->vma, from the emitted reloc addend,
6629 			     but ld.so expects buggy relocs.  */
6630 			  osec = sec->output_section;
6631 			  indx = elf_section_data (osec)->dynindx;
6632 			  if (indx == 0)
6633 			    {
6634 			      osec = htab->elf.text_index_section;
6635 			      indx = elf_section_data (osec)->dynindx;
6636 			    }
6637 			  BFD_ASSERT (indx != 0);
6638 #ifdef DEBUG
6639 			  if (indx == 0)
6640 			    printf ("indx=%ld section=%s flags=%08x name=%s\n",
6641 				    indx, osec->name, osec->flags,
6642 				    h->root.root.string);
6643 #endif
6644 			}
6645 
6646 		      outrel.r_info = ELF32_R_INFO (indx, r_type);
6647 		    }
6648 		}
6649 
6650 	      loc = sreloc->contents;
6651 	      loc += sreloc->reloc_count++ * sizeof (Elf32_External_Rela);
6652 	      bfd_elf32_swap_reloca_out (output_bfd, &outrel, loc);
6653 
6654 	      if (skip == -1)
6655 		continue;
6656 
6657 	      /* This reloc will be computed at runtime.  We clear the memory
6658 		 so that it contains predictable value.  */
6659 	      if (! skip
6660 		  && ((input_section->flags & SEC_ALLOC) != 0
6661 		      || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
6662 		{
6663 		  relocation = howto->pc_relative ? outrel.r_offset : 0;
6664 		  addend = 0;
6665 		  break;
6666 		}
6667 	    }
6668 	  break;
6669 
6670 	case R_PPC_RELAX32PC_PLT:
6671 	case R_PPC_RELAX32_PLT:
6672 	  {
6673 	    struct plt_entry *ent = find_plt_ent (h, got2, addend);
6674 
6675 	    if (htab->plt_type == PLT_NEW)
6676 	      relocation = (htab->glink->output_section->vma
6677 			    + htab->glink->output_offset
6678 			    + ent->glink_offset);
6679 	    else
6680 	      relocation = (htab->plt->output_section->vma
6681 			    + htab->plt->output_offset
6682 			    + ent->plt.offset);
6683 	    addend = 0;
6684 	  }
6685 	  if (r_type == R_PPC_RELAX32_PLT)
6686 	    goto relax32;
6687 	  /* Fall thru */
6688 
6689 	case R_PPC_RELAX32PC:
6690 	  relocation -= (input_section->output_section->vma
6691 			 + input_section->output_offset
6692 			 + rel->r_offset - 4);
6693 	  /* Fall thru */
6694 
6695 	case R_PPC_RELAX32:
6696 	relax32:
6697 	  {
6698 	    unsigned long t0;
6699 	    unsigned long t1;
6700 
6701 	    t0 = bfd_get_32 (output_bfd, contents + rel->r_offset);
6702 	    t1 = bfd_get_32 (output_bfd, contents + rel->r_offset + 4);
6703 
6704 	    /* We're clearing the bits for R_PPC_ADDR16_HA
6705 	       and R_PPC_ADDR16_LO here.  */
6706 	    t0 &= ~0xffff;
6707 	    t1 &= ~0xffff;
6708 
6709 	    /* t0 is HA, t1 is LO */
6710 	    relocation += addend;
6711 	    t0 |= ((relocation + 0x8000) >> 16) & 0xffff;
6712 	    t1 |= relocation & 0xffff;
6713 
6714 	    bfd_put_32 (output_bfd, t0, contents + rel->r_offset);
6715 	    bfd_put_32 (output_bfd, t1, contents + rel->r_offset + 4);
6716 	  }
6717 	  continue;
6718 
6719 	  /* Indirect .sdata relocation.  */
6720 	case R_PPC_EMB_SDAI16:
6721 	  BFD_ASSERT (htab->sdata[0].section != NULL);
6722 	  relocation
6723 	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[0],
6724 						 h, relocation, rel);
6725 	  break;
6726 
6727 	  /* Indirect .sdata2 relocation.  */
6728 	case R_PPC_EMB_SDA2I16:
6729 	  BFD_ASSERT (htab->sdata[1].section != NULL);
6730 	  relocation
6731 	    = elf_finish_pointer_linker_section (input_bfd, &htab->sdata[1],
6732 						 h, relocation, rel);
6733 	  break;
6734 
6735 	  /* Handle the TOC16 reloc.  We want to use the offset within the .got
6736 	     section, not the actual VMA.  This is appropriate when generating
6737 	     an embedded ELF object, for which the .got section acts like the
6738 	     AIX .toc section.  */
6739 	case R_PPC_TOC16:			/* phony GOT16 relocations */
6740 	  BFD_ASSERT (sec != NULL);
6741 	  BFD_ASSERT (bfd_is_und_section (sec)
6742 		      || strcmp (bfd_get_section_name (abfd, sec), ".got") == 0
6743 		      || strcmp (bfd_get_section_name (abfd, sec), ".cgot") == 0);
6744 
6745 	    addend -= sec->output_section->vma + sec->output_offset + 0x8000;
6746 	  break;
6747 
6748 	case R_PPC_PLTREL24:
6749 	  /* Relocation is to the entry for this symbol in the
6750 	     procedure linkage table.  */
6751 	  {
6752 	    struct plt_entry *ent = find_plt_ent (h, got2, addend);
6753 
6754 	    addend = 0;
6755 	    if (ent == NULL
6756 		|| htab->plt == NULL)
6757 	      {
6758 		/* We didn't make a PLT entry for this symbol.  This
6759 		   happens when statically linking PIC code, or when
6760 		   using -Bsymbolic.  */
6761 		break;
6762 	      }
6763 
6764 	    unresolved_reloc = FALSE;
6765 	    if (htab->plt_type == PLT_NEW)
6766 	      relocation = (htab->glink->output_section->vma
6767 			    + htab->glink->output_offset
6768 			    + ent->glink_offset);
6769 	    else
6770 	      relocation = (htab->plt->output_section->vma
6771 			    + htab->plt->output_offset
6772 			    + ent->plt.offset);
6773 	  }
6774 	  break;
6775 
6776 	  /* Relocate against _SDA_BASE_.  */
6777 	case R_PPC_SDAREL16:
6778 	  {
6779 	    const char *name;
6780 	    struct elf_link_hash_entry *sh;
6781 
6782 	    BFD_ASSERT (sec != NULL);
6783 	    name = bfd_get_section_name (abfd, sec->output_section);
6784 	    if (! ((CONST_STRNEQ (name, ".sdata")
6785 		    && (name[6] == 0 || name[6] == '.'))
6786 		   || (CONST_STRNEQ (name, ".sbss")
6787 		       && (name[5] == 0 || name[5] == '.'))))
6788 	      {
6789 		(*_bfd_error_handler)
6790 		  (_("%B: the target (%s) of a %s relocation is "
6791 		     "in the wrong output section (%s)"),
6792 		   input_bfd,
6793 		   sym_name,
6794 		   howto->name,
6795 		   name);
6796 	      }
6797 	    sh = htab->sdata[0].sym;
6798 	    addend -= (sh->root.u.def.value
6799 		       + sh->root.u.def.section->output_offset
6800 		       + sh->root.u.def.section->output_section->vma);
6801 	  }
6802 	  break;
6803 
6804 	  /* Relocate against _SDA2_BASE_.  */
6805 	case R_PPC_EMB_SDA2REL:
6806 	  {
6807 	    const char *name;
6808 	    struct elf_link_hash_entry *sh;
6809 
6810 	    BFD_ASSERT (sec != NULL);
6811 	    name = bfd_get_section_name (abfd, sec->output_section);
6812 	    if (! (CONST_STRNEQ (name, ".sdata2")
6813 		   || CONST_STRNEQ (name, ".sbss2")))
6814 	      {
6815 		(*_bfd_error_handler)
6816 		  (_("%B: the target (%s) of a %s relocation is "
6817 		     "in the wrong output section (%s)"),
6818 		   input_bfd,
6819 		   sym_name,
6820 		   howto->name,
6821 		   name);
6822 
6823 		bfd_set_error (bfd_error_bad_value);
6824 		ret = FALSE;
6825 		continue;
6826 	      }
6827 	    sh = htab->sdata[1].sym;
6828 	    addend -= (sh->root.u.def.value
6829 		       + sh->root.u.def.section->output_offset
6830 		       + sh->root.u.def.section->output_section->vma);
6831 	  }
6832 	  break;
6833 
6834 	  /* Relocate against either _SDA_BASE_, _SDA2_BASE_, or 0.  */
6835 	case R_PPC_EMB_SDA21:
6836 	case R_PPC_EMB_RELSDA:
6837 	  {
6838 	    const char *name;
6839 	    int reg;
6840 	    struct elf_link_hash_entry *sh;
6841 
6842 	    BFD_ASSERT (sec != NULL);
6843 	    name = bfd_get_section_name (abfd, sec->output_section);
6844 	    if (((CONST_STRNEQ (name, ".sdata")
6845 		  && (name[6] == 0 || name[6] == '.'))
6846 		 || (CONST_STRNEQ (name, ".sbss")
6847 		     && (name[5] == 0 || name[5] == '.'))))
6848 	      {
6849 		reg = 13;
6850 		sh = htab->sdata[0].sym;
6851 		addend -= (sh->root.u.def.value
6852 			   + sh->root.u.def.section->output_offset
6853 			   + sh->root.u.def.section->output_section->vma);
6854 	      }
6855 
6856 	    else if (CONST_STRNEQ (name, ".sdata2")
6857 		     || CONST_STRNEQ (name, ".sbss2"))
6858 	      {
6859 		reg = 2;
6860 		sh = htab->sdata[1].sym;
6861 		addend -= (sh->root.u.def.value
6862 			   + sh->root.u.def.section->output_offset
6863 			   + sh->root.u.def.section->output_section->vma);
6864 	      }
6865 
6866 	    else if (strcmp (name, ".PPC.EMB.sdata0") == 0
6867 		     || strcmp (name, ".PPC.EMB.sbss0") == 0)
6868 	      {
6869 		reg = 0;
6870 	      }
6871 
6872 	    else
6873 	      {
6874 		(*_bfd_error_handler)
6875 		  (_("%B: the target (%s) of a %s relocation is "
6876 		     "in the wrong output section (%s)"),
6877 		   input_bfd,
6878 		   sym_name,
6879 		   howto->name,
6880 		   name);
6881 
6882 		bfd_set_error (bfd_error_bad_value);
6883 		ret = FALSE;
6884 		continue;
6885 	      }
6886 
6887 	    if (r_type == R_PPC_EMB_SDA21)
6888 	      {			/* fill in register field */
6889 		insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
6890 		insn = (insn & ~RA_REGISTER_MASK) | (reg << RA_REGISTER_SHIFT);
6891 		bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
6892 	      }
6893 	  }
6894 	  break;
6895 
6896 	  /* Relocate against the beginning of the section.  */
6897 	case R_PPC_SECTOFF:
6898 	case R_PPC_SECTOFF_LO:
6899 	case R_PPC_SECTOFF_HI:
6900 	case R_PPC_SECTOFF_HA:
6901 	  BFD_ASSERT (sec != NULL);
6902 	  addend -= sec->output_section->vma;
6903 	  break;
6904 
6905 	  /* Negative relocations.  */
6906 	case R_PPC_EMB_NADDR32:
6907 	case R_PPC_EMB_NADDR16:
6908 	case R_PPC_EMB_NADDR16_LO:
6909 	case R_PPC_EMB_NADDR16_HI:
6910 	case R_PPC_EMB_NADDR16_HA:
6911 	  addend -= 2 * relocation;
6912 	  break;
6913 
6914 	case R_PPC_COPY:
6915 	case R_PPC_GLOB_DAT:
6916 	case R_PPC_JMP_SLOT:
6917 	case R_PPC_RELATIVE:
6918 	case R_PPC_PLT32:
6919 	case R_PPC_PLTREL32:
6920 	case R_PPC_PLT16_LO:
6921 	case R_PPC_PLT16_HI:
6922 	case R_PPC_PLT16_HA:
6923 	case R_PPC_ADDR30:
6924 	case R_PPC_EMB_RELSEC16:
6925 	case R_PPC_EMB_RELST_LO:
6926 	case R_PPC_EMB_RELST_HI:
6927 	case R_PPC_EMB_RELST_HA:
6928 	case R_PPC_EMB_BIT_FLD:
6929 	  (*_bfd_error_handler)
6930 	    (_("%B: relocation %s is not yet supported for symbol %s."),
6931 	     input_bfd,
6932 	     howto->name,
6933 	     sym_name);
6934 
6935 	  bfd_set_error (bfd_error_invalid_operation);
6936 	  ret = FALSE;
6937 	  continue;
6938 	}
6939 
6940       /* Do any further special processing.  */
6941       switch (r_type)
6942 	{
6943 	default:
6944 	  break;
6945 
6946 	case R_PPC_ADDR16_HA:
6947 	case R_PPC_REL16_HA:
6948 	case R_PPC_SECTOFF_HA:
6949 	case R_PPC_TPREL16_HA:
6950 	case R_PPC_DTPREL16_HA:
6951 	case R_PPC_EMB_NADDR16_HA:
6952 	case R_PPC_EMB_RELST_HA:
6953 	  /* It's just possible that this symbol is a weak symbol
6954 	     that's not actually defined anywhere.  In that case,
6955 	     'sec' would be NULL, and we should leave the symbol
6956 	     alone (it will be set to zero elsewhere in the link).  */
6957 	  if (sec == NULL)
6958 	    break;
6959 	  /* Fall thru */
6960 
6961 	case R_PPC_PLT16_HA:
6962 	case R_PPC_GOT16_HA:
6963 	case R_PPC_GOT_TLSGD16_HA:
6964 	case R_PPC_GOT_TLSLD16_HA:
6965 	case R_PPC_GOT_TPREL16_HA:
6966 	case R_PPC_GOT_DTPREL16_HA:
6967 	  /* Add 0x10000 if sign bit in 0:15 is set.
6968 	     Bits 0:15 are not used.  */
6969 	  addend += 0x8000;
6970 	  break;
6971 	}
6972 
6973 #ifdef DEBUG
6974       fprintf (stderr, "\ttype = %s (%d), name = %s, symbol index = %ld, "
6975 	       "offset = %ld, addend = %ld\n",
6976 	       howto->name,
6977 	       (int) r_type,
6978 	       sym_name,
6979 	       r_symndx,
6980 	       (long) rel->r_offset,
6981 	       (long) addend);
6982 #endif
6983 
6984       if (unresolved_reloc
6985 	  && !((input_section->flags & SEC_DEBUGGING) != 0
6986 	       && h->def_dynamic))
6987 	{
6988 	  (*_bfd_error_handler)
6989 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
6990 	     input_bfd,
6991 	     input_section,
6992 	     (long) rel->r_offset,
6993 	     howto->name,
6994 	     sym_name);
6995 	  ret = FALSE;
6996 	}
6997 
6998       r = _bfd_final_link_relocate (howto,
6999 				    input_bfd,
7000 				    input_section,
7001 				    contents,
7002 				    rel->r_offset,
7003 				    relocation,
7004 				    addend);
7005 
7006       if (r != bfd_reloc_ok)
7007 	{
7008 	  if (r == bfd_reloc_overflow)
7009 	    {
7010 	      if (warned)
7011 		continue;
7012 	      if (h != NULL
7013 		  && h->root.type == bfd_link_hash_undefweak
7014 		  && howto->pc_relative)
7015 		{
7016 		  /* Assume this is a call protected by other code that
7017 		     detect the symbol is undefined.  If this is the case,
7018 		     we can safely ignore the overflow.  If not, the
7019 		     program is hosed anyway, and a little warning isn't
7020 		     going to help.  */
7021 
7022 		  continue;
7023 		}
7024 
7025 	      if (! (*info->callbacks->reloc_overflow) (info,
7026 							(h ? &h->root : NULL),
7027 							sym_name,
7028 							howto->name,
7029 							rel->r_addend,
7030 							input_bfd,
7031 							input_section,
7032 							rel->r_offset))
7033 		return FALSE;
7034 	    }
7035 	  else
7036 	    {
7037 	      (*_bfd_error_handler)
7038 		(_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
7039 		 input_bfd, input_section,
7040 		 (long) rel->r_offset, howto->name, sym_name, (int) r);
7041 	      ret = FALSE;
7042 	    }
7043 	}
7044     }
7045 
7046 #ifdef DEBUG
7047   fprintf (stderr, "\n");
7048 #endif
7049 
7050   return ret;
7051 }
7052 
7053 #define PPC_LO(v) ((v) & 0xffff)
7054 #define PPC_HI(v) (((v) >> 16) & 0xffff)
7055 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
7056 
7057 /* Finish up dynamic symbol handling.  We set the contents of various
7058    dynamic sections here.  */
7059 
7060 static bfd_boolean
ppc_elf_finish_dynamic_symbol(bfd * output_bfd,struct bfd_link_info * info,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)7061 ppc_elf_finish_dynamic_symbol (bfd *output_bfd,
7062 			       struct bfd_link_info *info,
7063 			       struct elf_link_hash_entry *h,
7064 			       Elf_Internal_Sym *sym)
7065 {
7066   struct ppc_elf_link_hash_table *htab;
7067   struct plt_entry *ent;
7068   bfd_boolean doneone;
7069 
7070 #ifdef DEBUG
7071   fprintf (stderr, "ppc_elf_finish_dynamic_symbol called for %s",
7072 	   h->root.root.string);
7073 #endif
7074 
7075   htab = ppc_elf_hash_table (info);
7076   BFD_ASSERT (htab->elf.dynobj != NULL);
7077 
7078   doneone = FALSE;
7079   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7080     if (ent->plt.offset != (bfd_vma) -1)
7081       {
7082 	if (!doneone)
7083 	  {
7084 	    Elf_Internal_Rela rela;
7085 	    bfd_byte *loc;
7086 	    bfd_vma reloc_index;
7087 
7088 	    if (htab->plt_type == PLT_NEW)
7089 	      reloc_index = ent->plt.offset / 4;
7090 	    else
7091 	      {
7092 		reloc_index = ((ent->plt.offset - htab->plt_initial_entry_size)
7093 			       / htab->plt_slot_size);
7094 		if (reloc_index > PLT_NUM_SINGLE_ENTRIES
7095 		    && htab->plt_type == PLT_OLD)
7096 		  reloc_index -= (reloc_index - PLT_NUM_SINGLE_ENTRIES) / 2;
7097 	      }
7098 
7099 	    /* This symbol has an entry in the procedure linkage table.
7100 	       Set it up.  */
7101 	    if (htab->plt_type == PLT_VXWORKS)
7102 	      {
7103 		bfd_vma got_offset;
7104 		const bfd_vma *plt_entry;
7105 
7106 		/* The first three entries in .got.plt are reserved.  */
7107 		got_offset = (reloc_index + 3) * 4;
7108 
7109 		/* Use the right PLT. */
7110 		plt_entry = info->shared ? ppc_elf_vxworks_pic_plt_entry
7111 			    : ppc_elf_vxworks_plt_entry;
7112 
7113 		/* Fill in the .plt on VxWorks.  */
7114 		if (info->shared)
7115 		  {
7116 		    bfd_vma got_offset_hi = (got_offset >> 16)
7117 					    + ((got_offset & 0x8000) >> 15);
7118 
7119 		    bfd_put_32 (output_bfd,
7120 				plt_entry[0] | (got_offset_hi & 0xffff),
7121 				htab->plt->contents + ent->plt.offset + 0);
7122 		    bfd_put_32 (output_bfd,
7123 				plt_entry[1] | (got_offset & 0xffff),
7124 				htab->plt->contents + ent->plt.offset + 4);
7125 		  }
7126 		else
7127 		  {
7128 		    bfd_vma got_loc
7129 		      = (got_offset
7130 			 + htab->elf.hgot->root.u.def.value
7131 			 + htab->elf.hgot->root.u.def.section->output_offset
7132 			 + htab->elf.hgot->root.u.def.section->output_section->vma);
7133 		    bfd_vma got_loc_hi = (got_loc >> 16)
7134 					 + ((got_loc & 0x8000) >> 15);
7135 
7136 		    bfd_put_32 (output_bfd,
7137 				plt_entry[0] | (got_loc_hi & 0xffff),
7138 				htab->plt->contents + ent->plt.offset + 0);
7139 		    bfd_put_32 (output_bfd,
7140 				plt_entry[1] | (got_loc & 0xffff),
7141 				htab->plt->contents + ent->plt.offset + 4);
7142 		  }
7143 
7144 		bfd_put_32 (output_bfd, plt_entry[2],
7145 			    htab->plt->contents + ent->plt.offset + 8);
7146 		bfd_put_32 (output_bfd, plt_entry[3],
7147 			    htab->plt->contents + ent->plt.offset + 12);
7148 
7149 		/* This instruction is an immediate load.  The value loaded is
7150 		   the byte offset of the R_PPC_JMP_SLOT relocation from the
7151 		   start of the .rela.plt section.  The value is stored in the
7152 		   low-order 16 bits of the load instruction.  */
7153 		/* NOTE: It appears that this is now an index rather than a
7154 		   prescaled offset.  */
7155 		bfd_put_32 (output_bfd,
7156 			    plt_entry[4] | reloc_index,
7157 			    htab->plt->contents + ent->plt.offset + 16);
7158 		/* This instruction is a PC-relative branch whose target is
7159 		   the start of the PLT section.  The address of this branch
7160 		   instruction is 20 bytes beyond the start of this PLT entry.
7161 		   The address is encoded in bits 6-29, inclusive.  The value
7162 		   stored is right-shifted by two bits, permitting a 26-bit
7163 		   offset.  */
7164 		bfd_put_32 (output_bfd,
7165 			    (plt_entry[5]
7166 			     | (-(ent->plt.offset + 20) & 0x03fffffc)),
7167 			    htab->plt->contents + ent->plt.offset + 20);
7168 		bfd_put_32 (output_bfd, plt_entry[6],
7169 			    htab->plt->contents + ent->plt.offset + 24);
7170 		bfd_put_32 (output_bfd, plt_entry[7],
7171 			    htab->plt->contents + ent->plt.offset + 28);
7172 
7173 		/* Fill in the GOT entry corresponding to this PLT slot with
7174 		   the address immediately after the the "bctr" instruction
7175 		   in this PLT entry.  */
7176 		bfd_put_32 (output_bfd, (htab->plt->output_section->vma
7177 					 + htab->plt->output_offset
7178 					 + ent->plt.offset + 16),
7179 			    htab->sgotplt->contents + got_offset);
7180 
7181 		if (!info->shared)
7182 		  {
7183 		    /* Fill in a couple of entries in .rela.plt.unloaded.  */
7184 		    loc = htab->srelplt2->contents
7185 		      + ((VXWORKS_PLTRESOLVE_RELOCS + reloc_index
7186 			  * VXWORKS_PLT_NON_JMP_SLOT_RELOCS)
7187 			 * sizeof (Elf32_External_Rela));
7188 
7189 		    /* Provide the @ha relocation for the first instruction.  */
7190 		    rela.r_offset = (htab->plt->output_section->vma
7191 				     + htab->plt->output_offset
7192 				     + ent->plt.offset + 2);
7193 		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7194 						R_PPC_ADDR16_HA);
7195 		    rela.r_addend = got_offset;
7196 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7197 		    loc += sizeof (Elf32_External_Rela);
7198 
7199 		    /* Provide the @l relocation for the second instruction.  */
7200 		    rela.r_offset = (htab->plt->output_section->vma
7201 				     + htab->plt->output_offset
7202 				     + ent->plt.offset + 6);
7203 		    rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx,
7204 						R_PPC_ADDR16_LO);
7205 		    rela.r_addend = got_offset;
7206 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7207 		    loc += sizeof (Elf32_External_Rela);
7208 
7209 		    /* Provide a relocation for the GOT entry corresponding to this
7210 		       PLT slot.  Point it at the middle of the .plt entry.  */
7211 		    rela.r_offset = (htab->sgotplt->output_section->vma
7212 				     + htab->sgotplt->output_offset
7213 				     + got_offset);
7214 		    rela.r_info = ELF32_R_INFO (htab->elf.hplt->indx,
7215 						R_PPC_ADDR32);
7216 		    rela.r_addend = ent->plt.offset + 16;
7217 		    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7218 		  }
7219 
7220 		/* VxWorks uses non-standard semantics for R_PPC_JMP_SLOT.
7221 		   In particular, the offset for the relocation is not the
7222 		   address of the PLT entry for this function, as specified
7223 		   by the ABI.  Instead, the offset is set to the address of
7224 		   the GOT slot for this function.  See EABI 4.4.4.1.  */
7225 		rela.r_offset = (htab->sgotplt->output_section->vma
7226 				 + htab->sgotplt->output_offset
7227 				 + got_offset);
7228 
7229 	      }
7230 	    else
7231 	      {
7232 		rela.r_offset = (htab->plt->output_section->vma
7233 				 + htab->plt->output_offset
7234 				 + ent->plt.offset);
7235 		if (htab->plt_type == PLT_OLD)
7236 		  {
7237 		    /* We don't need to fill in the .plt.  The ppc dynamic
7238 		       linker will fill it in.  */
7239 		  }
7240 		else
7241 		  {
7242 		    bfd_vma val = (htab->glink_pltresolve + ent->plt.offset
7243 				   + htab->glink->output_section->vma
7244 				   + htab->glink->output_offset);
7245 		    bfd_put_32 (output_bfd, val,
7246 				htab->plt->contents + ent->plt.offset);
7247 		  }
7248 	      }
7249 
7250 	    /* Fill in the entry in the .rela.plt section.  */
7251 	    rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_JMP_SLOT);
7252 	    rela.r_addend = 0;
7253 
7254 	    loc = (htab->relplt->contents
7255 		   + reloc_index * sizeof (Elf32_External_Rela));
7256 	    bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7257 
7258 	    if (!h->def_regular)
7259 	      {
7260 		/* Mark the symbol as undefined, rather than as defined in
7261 		   the .plt section.  Leave the value alone.  */
7262 		sym->st_shndx = SHN_UNDEF;
7263 		/* If the symbol is weak, we do need to clear the value.
7264 		   Otherwise, the PLT entry would provide a definition for
7265 		   the symbol even if the symbol wasn't defined anywhere,
7266 		   and so the symbol would never be NULL.  */
7267 		if (!h->ref_regular_nonweak)
7268 		  sym->st_value = 0;
7269 	      }
7270 	    doneone = TRUE;
7271 	  }
7272 
7273 	if (htab->plt_type == PLT_NEW)
7274 	  {
7275 	    bfd_vma plt;
7276 	    unsigned char *p;
7277 
7278 	    plt = (ent->plt.offset
7279 		   + htab->plt->output_section->vma
7280 		   + htab->plt->output_offset);
7281 	    p = (unsigned char *) htab->glink->contents + ent->glink_offset;
7282 
7283 	    if (info->shared || info->pie)
7284 	      {
7285 		bfd_vma got = 0;
7286 
7287 		if (ent->addend >= 32768)
7288 		  got = (ent->addend
7289 			 + ent->sec->output_section->vma
7290 			 + ent->sec->output_offset);
7291 		else if (htab->elf.hgot != NULL)
7292 		  got = (htab->elf.hgot->root.u.def.value
7293 			 + htab->elf.hgot->root.u.def.section->output_section->vma
7294 			 + htab->elf.hgot->root.u.def.section->output_offset);
7295 
7296 		plt -= got;
7297 
7298 		if (plt + 0x8000 < 0x10000)
7299 		  {
7300 		    bfd_put_32 (output_bfd, LWZ_11_30 + PPC_LO (plt), p);
7301 		    p += 4;
7302 		    bfd_put_32 (output_bfd, MTCTR_11, p);
7303 		    p += 4;
7304 		    bfd_put_32 (output_bfd, BCTR, p);
7305 		    p += 4;
7306 		    bfd_put_32 (output_bfd, NOP, p);
7307 		    p += 4;
7308 		  }
7309 		else
7310 		  {
7311 		    bfd_put_32 (output_bfd, ADDIS_11_30 + PPC_HA (plt), p);
7312 		    p += 4;
7313 		    bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7314 		    p += 4;
7315 		    bfd_put_32 (output_bfd, MTCTR_11, p);
7316 		    p += 4;
7317 		    bfd_put_32 (output_bfd, BCTR, p);
7318 		    p += 4;
7319 		  }
7320 	      }
7321 	    else
7322 	      {
7323 		bfd_put_32 (output_bfd, LIS_11 + PPC_HA (plt), p);
7324 		p += 4;
7325 		bfd_put_32 (output_bfd, LWZ_11_11 + PPC_LO (plt), p);
7326 		p += 4;
7327 		bfd_put_32 (output_bfd, MTCTR_11, p);
7328 		p += 4;
7329 		bfd_put_32 (output_bfd, BCTR, p);
7330 		p += 4;
7331 
7332 		/* We only need one non-PIC glink stub.  */
7333 		break;
7334 	      }
7335 	  }
7336 	else
7337 	  break;
7338       }
7339 
7340   if (h->needs_copy)
7341     {
7342       asection *s;
7343       Elf_Internal_Rela rela;
7344       bfd_byte *loc;
7345 
7346       /* This symbols needs a copy reloc.  Set it up.  */
7347 
7348 #ifdef DEBUG
7349       fprintf (stderr, ", copy");
7350 #endif
7351 
7352       BFD_ASSERT (h->dynindx != -1);
7353 
7354       if (ppc_elf_hash_entry (h)->has_sda_refs)
7355 	s = htab->relsbss;
7356       else
7357 	s = htab->relbss;
7358       BFD_ASSERT (s != NULL);
7359 
7360       rela.r_offset = (h->root.u.def.value
7361 		       + h->root.u.def.section->output_section->vma
7362 		       + h->root.u.def.section->output_offset);
7363       rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_COPY);
7364       rela.r_addend = 0;
7365       loc = s->contents + s->reloc_count++ * sizeof (Elf32_External_Rela);
7366       bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7367     }
7368 
7369 #ifdef DEBUG
7370   fprintf (stderr, "\n");
7371 #endif
7372 
7373   /* Mark some specially defined symbols as absolute.  */
7374   if (strcmp (h->root.root.string, "_DYNAMIC") == 0
7375       || (!htab->is_vxworks
7376 	  && (h == htab->elf.hgot
7377 	      || strcmp (h->root.root.string,
7378 			 "_PROCEDURE_LINKAGE_TABLE_") == 0)))
7379     sym->st_shndx = SHN_ABS;
7380 
7381   return TRUE;
7382 }
7383 
7384 static enum elf_reloc_type_class
ppc_elf_reloc_type_class(const Elf_Internal_Rela * rela)7385 ppc_elf_reloc_type_class (const Elf_Internal_Rela *rela)
7386 {
7387   switch (ELF32_R_TYPE (rela->r_info))
7388     {
7389     case R_PPC_RELATIVE:
7390       return reloc_class_relative;
7391     case R_PPC_REL24:
7392     case R_PPC_ADDR24:
7393     case R_PPC_JMP_SLOT:
7394       return reloc_class_plt;
7395     case R_PPC_COPY:
7396       return reloc_class_copy;
7397     default:
7398       return reloc_class_normal;
7399     }
7400 }
7401 
7402 /* Finish up the dynamic sections.  */
7403 
7404 static bfd_boolean
ppc_elf_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)7405 ppc_elf_finish_dynamic_sections (bfd *output_bfd,
7406 				 struct bfd_link_info *info)
7407 {
7408   asection *sdyn;
7409   asection *splt;
7410   struct ppc_elf_link_hash_table *htab;
7411   bfd_vma got;
7412   bfd * dynobj;
7413 
7414 #ifdef DEBUG
7415   fprintf (stderr, "ppc_elf_finish_dynamic_sections called\n");
7416 #endif
7417 
7418   htab = ppc_elf_hash_table (info);
7419   dynobj = elf_hash_table (info)->dynobj;
7420   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
7421   if (htab->is_vxworks)
7422     splt = bfd_get_section_by_name (dynobj, ".plt");
7423   else
7424     splt = NULL;
7425 
7426   got = 0;
7427   if (htab->elf.hgot != NULL)
7428     got = (htab->elf.hgot->root.u.def.value
7429 	   + htab->elf.hgot->root.u.def.section->output_section->vma
7430 	   + htab->elf.hgot->root.u.def.section->output_offset);
7431 
7432   if (htab->elf.dynamic_sections_created)
7433     {
7434       Elf32_External_Dyn *dyncon, *dynconend;
7435 
7436       BFD_ASSERT (htab->plt != NULL && sdyn != NULL);
7437 
7438       dyncon = (Elf32_External_Dyn *) sdyn->contents;
7439       dynconend = (Elf32_External_Dyn *) (sdyn->contents + sdyn->size);
7440       for (; dyncon < dynconend; dyncon++)
7441 	{
7442 	  Elf_Internal_Dyn dyn;
7443 	  asection *s;
7444 
7445 	  bfd_elf32_swap_dyn_in (dynobj, dyncon, &dyn);
7446 
7447 	  switch (dyn.d_tag)
7448 	    {
7449 	    case DT_PLTGOT:
7450 	      if (htab->is_vxworks)
7451 		s = htab->sgotplt;
7452 	      else
7453 		s = htab->plt;
7454 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7455 	      break;
7456 
7457 	    case DT_PLTRELSZ:
7458 	      dyn.d_un.d_val = htab->relplt->size;
7459 	      break;
7460 
7461 	    case DT_JMPREL:
7462 	      s = htab->relplt;
7463 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
7464 	      break;
7465 
7466 	    case DT_PPC_GOT:
7467 	      dyn.d_un.d_ptr = got;
7468 	      break;
7469 
7470 	    case DT_RELASZ:
7471 	      if (htab->is_vxworks)
7472 		{
7473 		  if (htab->relplt)
7474 		    dyn.d_un.d_ptr -= htab->relplt->size;
7475 		  break;
7476 		}
7477 	      continue;
7478 
7479 	    default:
7480 	      continue;
7481 	    }
7482 
7483 	  bfd_elf32_swap_dyn_out (output_bfd, &dyn, dyncon);
7484 	}
7485     }
7486 
7487   /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
7488      easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
7489   if (htab->got != NULL)
7490     {
7491       unsigned char *p = htab->got->contents;
7492       bfd_vma val;
7493 
7494       p += htab->elf.hgot->root.u.def.value;
7495       if (htab->plt_type == PLT_OLD)
7496 	bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
7497 
7498       val = 0;
7499       if (sdyn != NULL)
7500 	val = sdyn->output_section->vma + sdyn->output_offset;
7501       bfd_put_32 (output_bfd, val, p);
7502 
7503       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 4;
7504     }
7505 
7506   /* Fill in the first entry in the VxWorks procedure linkage table.  */
7507   if (splt && splt->size > 0)
7508     {
7509       /* Use the right PLT. */
7510       static const bfd_vma *plt_entry = NULL;
7511       plt_entry = info->shared ?
7512 	ppc_elf_vxworks_pic_plt0_entry : ppc_elf_vxworks_plt0_entry;
7513 
7514       if (!info->shared)
7515 	{
7516 	  bfd_vma got_value =
7517 	    (htab->elf.hgot->root.u.def.section->output_section->vma
7518 	     + htab->elf.hgot->root.u.def.section->output_offset
7519 	     + htab->elf.hgot->root.u.def.value);
7520 	  bfd_vma got_hi = (got_value >> 16) + ((got_value & 0x8000) >> 15);
7521 
7522 	  bfd_put_32 (output_bfd, plt_entry[0] | (got_hi & 0xffff),
7523 		      splt->contents +  0);
7524 	  bfd_put_32 (output_bfd, plt_entry[1] | (got_value & 0xffff),
7525 		      splt->contents +  4);
7526 	}
7527       else
7528 	{
7529 	  bfd_put_32 (output_bfd, plt_entry[0], splt->contents +  0);
7530 	  bfd_put_32 (output_bfd, plt_entry[1], splt->contents +  4);
7531 	}
7532       bfd_put_32 (output_bfd, plt_entry[2], splt->contents +  8);
7533       bfd_put_32 (output_bfd, plt_entry[3], splt->contents + 12);
7534       bfd_put_32 (output_bfd, plt_entry[4], splt->contents + 16);
7535       bfd_put_32 (output_bfd, plt_entry[5], splt->contents + 20);
7536       bfd_put_32 (output_bfd, plt_entry[6], splt->contents + 24);
7537       bfd_put_32 (output_bfd, plt_entry[7], splt->contents + 28);
7538 
7539       if (! info->shared)
7540 	{
7541 	  Elf_Internal_Rela rela;
7542 	  bfd_byte *loc;
7543 
7544 	  loc = htab->srelplt2->contents;
7545 
7546 	  /* Output the @ha relocation for the first instruction.  */
7547 	  rela.r_offset = (htab->plt->output_section->vma
7548 			   + htab->plt->output_offset
7549 			   + 2);
7550 	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7551 	  rela.r_addend = 0;
7552 	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7553 	  loc += sizeof (Elf32_External_Rela);
7554 
7555 	  /* Output the @l relocation for the second instruction.  */
7556 	  rela.r_offset = (htab->plt->output_section->vma
7557 			   + htab->plt->output_offset
7558 			   + 6);
7559 	  rela.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7560 	  rela.r_addend = 0;
7561 	  bfd_elf32_swap_reloca_out (output_bfd, &rela, loc);
7562 	  loc += sizeof (Elf32_External_Rela);
7563 
7564 	  /* Fix up the remaining relocations.  They may have the wrong
7565 	     symbol index for _G_O_T_ or _P_L_T_ depending on the order
7566 	     in which symbols were output.  */
7567 	  while (loc < htab->srelplt2->contents + htab->srelplt2->size)
7568 	    {
7569 	      Elf_Internal_Rela rel;
7570 
7571 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7572 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_HA);
7573 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7574 	      loc += sizeof (Elf32_External_Rela);
7575 
7576 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7577 	      rel.r_info = ELF32_R_INFO (htab->elf.hgot->indx, R_PPC_ADDR16_LO);
7578 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7579 	      loc += sizeof (Elf32_External_Rela);
7580 
7581 	      bfd_elf32_swap_reloc_in (output_bfd, loc, &rel);
7582 	      rel.r_info = ELF32_R_INFO (htab->elf.hplt->indx, R_PPC_ADDR32);
7583 	      bfd_elf32_swap_reloc_out (output_bfd, &rel, loc);
7584 	      loc += sizeof (Elf32_External_Rela);
7585 	    }
7586 	}
7587     }
7588 
7589   if (htab->glink != NULL && htab->glink->contents != NULL)
7590     {
7591       unsigned char *p;
7592       unsigned char *endp;
7593       bfd_vma res0;
7594       unsigned int i;
7595 
7596       /*
7597        * PIC glink code is the following:
7598        *
7599        * # ith PLT code stub.
7600        *   addis 11,30,(plt+(i-1)*4-got)@ha
7601        *   lwz 11,(plt+(i-1)*4-got)@l(11)
7602        *   mtctr 11
7603        *   bctr
7604        *
7605        * # A table of branches, one for each plt entry.
7606        * # The idea is that the plt call stub loads ctr (and r11) with these
7607        * # addresses, so (r11 - res_0) gives the plt index * 4.
7608        * res_0:	b PLTresolve
7609        * res_1:	b PLTresolve
7610        * .
7611        * # Some number of entries towards the end can be nops
7612        * res_n_m3: nop
7613        * res_n_m2: nop
7614        * res_n_m1:
7615        *
7616        * PLTresolve:
7617        *    addis 11,11,(1f-res_0)@ha
7618        *    mflr 0
7619        *    bcl 20,31,1f
7620        * 1: addi 11,11,(1b-res_0)@l
7621        *    mflr 12
7622        *    mtlr 0
7623        *    sub 11,11,12                # r11 = index * 4
7624        *    addis 12,12,(got+4-1b)@ha
7625        *    lwz 0,(got+4-1b)@l(12)      # got[1] address of dl_runtime_resolve
7626        *    lwz 12,(got+8-1b)@l(12)     # got[2] contains the map address
7627        *    mtctr 0
7628        *    add 0,11,11
7629        *    add 11,0,11                 # r11 = index * 12 = reloc offset.
7630        *    bctr
7631        */
7632       static const unsigned int pic_plt_resolve[] =
7633 	{
7634 	  ADDIS_11_11,
7635 	  MFLR_0,
7636 	  BCL_20_31,
7637 	  ADDI_11_11,
7638 	  MFLR_12,
7639 	  MTLR_0,
7640 	  SUB_11_11_12,
7641 	  ADDIS_12_12,
7642 	  LWZ_0_12,
7643 	  LWZ_12_12,
7644 	  MTCTR_0,
7645 	  ADD_0_11_11,
7646 	  ADD_11_0_11,
7647 	  BCTR,
7648 	  NOP,
7649 	  NOP
7650 	};
7651 
7652       static const unsigned int plt_resolve[] =
7653 	{
7654 	  LIS_12,
7655 	  ADDIS_11_11,
7656 	  LWZ_0_12,
7657 	  ADDI_11_11,
7658 	  MTCTR_0,
7659 	  ADD_0_11_11,
7660 	  LWZ_12_12,
7661 	  ADD_11_0_11,
7662 	  BCTR,
7663 	  NOP,
7664 	  NOP,
7665 	  NOP,
7666 	  NOP,
7667 	  NOP,
7668 	  NOP,
7669 	  NOP
7670 	};
7671 
7672       if (ARRAY_SIZE (pic_plt_resolve) != GLINK_PLTRESOLVE / 4)
7673 	abort ();
7674       if (ARRAY_SIZE (plt_resolve) != GLINK_PLTRESOLVE / 4)
7675 	abort ();
7676 
7677       /* Build the branch table, one for each plt entry (less one),
7678 	 and perhaps some padding.  */
7679       p = htab->glink->contents;
7680       p += htab->glink_pltresolve;
7681       endp = htab->glink->contents;
7682       endp += htab->glink->size - GLINK_PLTRESOLVE;
7683       while (p < endp - 8 * 4)
7684 	{
7685 	  bfd_put_32 (output_bfd, B + endp - p, p);
7686 	  p += 4;
7687 	}
7688       while (p < endp)
7689 	{
7690 	  bfd_put_32 (output_bfd, NOP, p);
7691 	  p += 4;
7692 	}
7693 
7694       res0 = (htab->glink_pltresolve
7695 	      + htab->glink->output_section->vma
7696 	      + htab->glink->output_offset);
7697 
7698       /* Last comes the PLTresolve stub.  */
7699       if (info->shared || info->pie)
7700 	{
7701 	  bfd_vma bcl;
7702 
7703 	  for (i = 0; i < ARRAY_SIZE (pic_plt_resolve); i++)
7704 	    {
7705 	      bfd_put_32 (output_bfd, pic_plt_resolve[i], p);
7706 	      p += 4;
7707 	    }
7708 	  p -= 4 * ARRAY_SIZE (pic_plt_resolve);
7709 
7710 	  bcl = (htab->glink->size - GLINK_PLTRESOLVE + 3*4
7711 		 + htab->glink->output_section->vma
7712 		 + htab->glink->output_offset);
7713 
7714 	  bfd_put_32 (output_bfd,
7715 		      ADDIS_11_11 + PPC_HA (bcl - res0), p + 0*4);
7716 	  bfd_put_32 (output_bfd,
7717 		      ADDI_11_11 + PPC_LO (bcl - res0), p + 3*4);
7718 	  bfd_put_32 (output_bfd,
7719 		      ADDIS_12_12 + PPC_HA (got + 4 - bcl), p + 7*4);
7720 	  if (PPC_HA (got + 4 - bcl) == PPC_HA (got + 8 - bcl))
7721 	    {
7722 	      bfd_put_32 (output_bfd,
7723 			  LWZ_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7724 	      bfd_put_32 (output_bfd,
7725 			  LWZ_12_12 + PPC_LO (got + 8 - bcl), p + 9*4);
7726 	    }
7727 	  else
7728 	    {
7729 	      bfd_put_32 (output_bfd,
7730 			  LWZU_0_12 + PPC_LO (got + 4 - bcl), p + 8*4);
7731 	      bfd_put_32 (output_bfd,
7732 			  LWZ_12_12 + 4, p + 9*4);
7733 	    }
7734 	}
7735       else
7736 	{
7737 	  for (i = 0; i < ARRAY_SIZE (plt_resolve); i++)
7738 	    {
7739 	      bfd_put_32 (output_bfd, plt_resolve[i], p);
7740 	      p += 4;
7741 	    }
7742 	  p -= 4 * ARRAY_SIZE (plt_resolve);
7743 
7744 	  bfd_put_32 (output_bfd,
7745 		      LIS_12 + PPC_HA (got + 4), p + 0*4);
7746 	  bfd_put_32 (output_bfd,
7747 		      ADDIS_11_11 + PPC_HA (-res0), p + 1*4);
7748 	  bfd_put_32 (output_bfd,
7749 		      ADDI_11_11 + PPC_LO (-res0), p + 3*4);
7750 	  if (PPC_HA (got + 4) == PPC_HA (got + 8))
7751 	    {
7752 	      bfd_put_32 (output_bfd,
7753 			  LWZ_0_12 + PPC_LO (got + 4), p + 2*4);
7754 	      bfd_put_32 (output_bfd,
7755 			  LWZ_12_12 + PPC_LO (got + 8), p + 6*4);
7756 	    }
7757 	  else
7758 	    {
7759 	      bfd_put_32 (output_bfd,
7760 			  LWZU_0_12 + PPC_LO (got + 4), p + 2*4);
7761 	      bfd_put_32 (output_bfd,
7762 			  LWZ_12_12 + 4, p + 6*4);
7763 	    }
7764 	}
7765     }
7766 
7767   return TRUE;
7768 }
7769 
7770 #define TARGET_LITTLE_SYM	bfd_elf32_powerpcle_vec
7771 #define TARGET_LITTLE_NAME	"elf32-powerpcle"
7772 #define TARGET_BIG_SYM		bfd_elf32_powerpc_vec
7773 #define TARGET_BIG_NAME		"elf32-powerpc-freebsd"
7774 #define ELF_ARCH		bfd_arch_powerpc
7775 #define ELF_MACHINE_CODE	EM_PPC
7776 #ifdef __QNXTARGET__
7777 #define ELF_MAXPAGESIZE		0x1000
7778 #else
7779 #define ELF_MAXPAGESIZE		0x10000
7780 #endif
7781 #define ELF_MINPAGESIZE		0x1000
7782 #define ELF_COMMONPAGESIZE	0x1000
7783 #define elf_info_to_howto	ppc_elf_info_to_howto
7784 
7785 #ifdef  EM_CYGNUS_POWERPC
7786 #define ELF_MACHINE_ALT1	EM_CYGNUS_POWERPC
7787 #endif
7788 
7789 #ifdef EM_PPC_OLD
7790 #define ELF_MACHINE_ALT2	EM_PPC_OLD
7791 #endif
7792 
7793 #define elf_backend_plt_not_loaded	1
7794 #define elf_backend_can_gc_sections	1
7795 #define elf_backend_can_refcount	1
7796 #define elf_backend_rela_normal		1
7797 
7798 #define bfd_elf32_mkobject			ppc_elf_mkobject
7799 #define bfd_elf32_bfd_merge_private_bfd_data	ppc_elf_merge_private_bfd_data
7800 #define bfd_elf32_bfd_relax_section		ppc_elf_relax_section
7801 #define bfd_elf32_bfd_reloc_type_lookup		ppc_elf_reloc_type_lookup
7802 #define bfd_elf32_bfd_reloc_name_lookup	ppc_elf_reloc_name_lookup
7803 #define bfd_elf32_bfd_set_private_flags		ppc_elf_set_private_flags
7804 #define bfd_elf32_bfd_link_hash_table_create	ppc_elf_link_hash_table_create
7805 
7806 #define elf_backend_object_p			ppc_elf_object_p
7807 #define elf_backend_gc_mark_hook		ppc_elf_gc_mark_hook
7808 #define elf_backend_gc_sweep_hook		ppc_elf_gc_sweep_hook
7809 #define elf_backend_section_from_shdr		ppc_elf_section_from_shdr
7810 #define elf_backend_relocate_section		ppc_elf_relocate_section
7811 #define elf_backend_create_dynamic_sections	ppc_elf_create_dynamic_sections
7812 #define elf_backend_check_relocs		ppc_elf_check_relocs
7813 #define elf_backend_copy_indirect_symbol	ppc_elf_copy_indirect_symbol
7814 #define elf_backend_adjust_dynamic_symbol	ppc_elf_adjust_dynamic_symbol
7815 #define elf_backend_add_symbol_hook		ppc_elf_add_symbol_hook
7816 #define elf_backend_size_dynamic_sections	ppc_elf_size_dynamic_sections
7817 #define elf_backend_finish_dynamic_symbol	ppc_elf_finish_dynamic_symbol
7818 #define elf_backend_finish_dynamic_sections	ppc_elf_finish_dynamic_sections
7819 #define elf_backend_fake_sections		ppc_elf_fake_sections
7820 #define elf_backend_additional_program_headers	ppc_elf_additional_program_headers
7821 #define elf_backend_grok_prstatus		ppc_elf_grok_prstatus
7822 #define elf_backend_grok_psinfo			ppc_elf_grok_psinfo
7823 #define elf_backend_write_core_note		ppc_elf_write_core_note
7824 #define elf_backend_reloc_type_class		ppc_elf_reloc_type_class
7825 #define elf_backend_begin_write_processing	ppc_elf_begin_write_processing
7826 #define elf_backend_final_write_processing	ppc_elf_final_write_processing
7827 #define elf_backend_write_section		ppc_elf_write_section
7828 #define elf_backend_get_sec_type_attr		ppc_elf_get_sec_type_attr
7829 #define elf_backend_plt_sym_val			ppc_elf_plt_sym_val
7830 #define elf_backend_action_discarded		ppc_elf_action_discarded
7831 #define elf_backend_init_index_section		_bfd_elf_init_1_index_section
7832 
7833 #include "elf32-target.h"
7834 
7835 /* VxWorks Target */
7836 
7837 #undef TARGET_LITTLE_SYM
7838 #undef TARGET_LITTLE_NAME
7839 
7840 #undef TARGET_BIG_SYM
7841 #define TARGET_BIG_SYM		bfd_elf32_powerpc_vxworks_vec
7842 #undef TARGET_BIG_NAME
7843 #define TARGET_BIG_NAME		"elf32-powerpc-vxworks"
7844 
7845 /* VxWorks uses the elf default section flags for .plt.  */
7846 static const struct bfd_elf_special_section *
ppc_elf_vxworks_get_sec_type_attr(bfd * abfd ATTRIBUTE_UNUSED,asection * sec)7847 ppc_elf_vxworks_get_sec_type_attr (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
7848 {
7849   if (sec->name == NULL)
7850     return NULL;
7851 
7852   if (strcmp (sec->name, ".plt") == 0)
7853     return _bfd_elf_get_sec_type_attr (abfd, sec);
7854 
7855   return ppc_elf_get_sec_type_attr (abfd, sec);
7856 }
7857 
7858 /* Like ppc_elf_link_hash_table_create, but overrides
7859    appropriately for VxWorks.  */
7860 static struct bfd_link_hash_table *
ppc_elf_vxworks_link_hash_table_create(bfd * abfd)7861 ppc_elf_vxworks_link_hash_table_create (bfd *abfd)
7862 {
7863   struct bfd_link_hash_table *ret;
7864 
7865   ret = ppc_elf_link_hash_table_create (abfd);
7866   if (ret)
7867     {
7868       struct ppc_elf_link_hash_table *htab
7869         = (struct ppc_elf_link_hash_table *)ret;
7870       htab->is_vxworks = 1;
7871       htab->plt_type = PLT_VXWORKS;
7872       htab->plt_entry_size = VXWORKS_PLT_ENTRY_SIZE;
7873       htab->plt_slot_size = VXWORKS_PLT_ENTRY_SIZE;
7874       htab->plt_initial_entry_size = VXWORKS_PLT_INITIAL_ENTRY_SIZE;
7875     }
7876   return ret;
7877 }
7878 
7879 /* Tweak magic VxWorks symbols as they are loaded.  */
7880 static bfd_boolean
ppc_elf_vxworks_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)7881 ppc_elf_vxworks_add_symbol_hook (bfd *abfd,
7882 				 struct bfd_link_info *info,
7883 				 Elf_Internal_Sym *sym,
7884 				 const char **namep ATTRIBUTE_UNUSED,
7885 				 flagword *flagsp ATTRIBUTE_UNUSED,
7886 				 asection **secp,
7887 				 bfd_vma *valp)
7888 {
7889   if (!elf_vxworks_add_symbol_hook(abfd, info, sym,namep, flagsp, secp,
7890 				   valp))
7891     return FALSE;
7892 
7893   return ppc_elf_add_symbol_hook(abfd, info, sym,namep, flagsp, secp, valp);
7894 }
7895 
7896 static void
ppc_elf_vxworks_final_write_processing(bfd * abfd,bfd_boolean linker)7897 ppc_elf_vxworks_final_write_processing (bfd *abfd, bfd_boolean linker)
7898 {
7899   ppc_elf_final_write_processing(abfd, linker);
7900   elf_vxworks_final_write_processing(abfd, linker);
7901 }
7902 
7903 /* On VxWorks, we emit relocations against _PROCEDURE_LINKAGE_TABLE_, so
7904    define it.  */
7905 #undef elf_backend_want_plt_sym
7906 #define elf_backend_want_plt_sym		1
7907 #undef elf_backend_want_got_plt
7908 #define elf_backend_want_got_plt		1
7909 #undef elf_backend_got_symbol_offset
7910 #define elf_backend_got_symbol_offset		0
7911 #undef elf_backend_plt_not_loaded
7912 #define elf_backend_plt_not_loaded		0
7913 #undef elf_backend_plt_readonly
7914 #define elf_backend_plt_readonly		1
7915 #undef elf_backend_got_header_size
7916 #define elf_backend_got_header_size		12
7917 
7918 #undef bfd_elf32_bfd_link_hash_table_create
7919 #define bfd_elf32_bfd_link_hash_table_create \
7920   ppc_elf_vxworks_link_hash_table_create
7921 #undef elf_backend_add_symbol_hook
7922 #define elf_backend_add_symbol_hook \
7923   ppc_elf_vxworks_add_symbol_hook
7924 #undef elf_backend_link_output_symbol_hook
7925 #define elf_backend_link_output_symbol_hook \
7926   elf_vxworks_link_output_symbol_hook
7927 #undef elf_backend_final_write_processing
7928 #define elf_backend_final_write_processing \
7929   ppc_elf_vxworks_final_write_processing
7930 #undef elf_backend_get_sec_type_attr
7931 #define elf_backend_get_sec_type_attr \
7932   ppc_elf_vxworks_get_sec_type_attr
7933 #undef elf_backend_emit_relocs
7934 #define elf_backend_emit_relocs \
7935   elf_vxworks_emit_relocs
7936 
7937 #undef elf32_bed
7938 #define elf32_bed				ppc_elf_vxworks_bed
7939 
7940 #include "elf32-target.h"
7941