1 /* PowerPC64-specific support for 64-bit ELF.
2    Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
3    Free Software Foundation, Inc.
4    Written by Linus Nordberg, Swox AB <info@swox.com>,
5    based on elf32-ppc.c by Ian Lance Taylor.
6    Largely rewritten by Alan Modra <amodra@bigpond.net.au>
7 
8    This file is part of BFD, the Binary File Descriptor library.
9 
10    This program is free software; you can redistribute it and/or modify
11    it under the terms of the GNU General Public License as published by
12    the Free Software Foundation; either version 2 of the License, or
13    (at your option) any later version.
14 
15    This program is distributed in the hope that it will be useful,
16    but WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18    GNU General Public License for more details.
19 
20    You should have received a copy of the GNU General Public License along
21    with this program; if not, write to the Free Software Foundation, Inc.,
22    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
23 
24 /* The 64-bit PowerPC ELF ABI may be found at
25    http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26    http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html  */
27 
28 #include "bfd.h"
29 #include "sysdep.h"
30 #include "bfdlink.h"
31 #include "libbfd.h"
32 #include "elf-bfd.h"
33 #include "elf/ppc64.h"
34 #include "elf64-ppc.h"
35 
36 static bfd_reloc_status_type ppc64_elf_ha_reloc
37   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
38 static bfd_reloc_status_type ppc64_elf_branch_reloc
39   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
41   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
43   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
45   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type ppc64_elf_toc_reloc
47   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
49   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type ppc64_elf_toc64_reloc
51   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
53   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_vma opd_entry_value
55   (asection *, bfd_vma, asection **, bfd_vma *);
56 
57 #define TARGET_LITTLE_SYM	bfd_elf64_powerpcle_vec
58 #define TARGET_LITTLE_NAME	"elf64-powerpcle"
59 #define TARGET_BIG_SYM		bfd_elf64_powerpc_vec
60 #define TARGET_BIG_NAME		"elf64-powerpc"
61 #define ELF_ARCH		bfd_arch_powerpc
62 #define ELF_MACHINE_CODE	EM_PPC64
63 #define ELF_MAXPAGESIZE		0x10000
64 #define elf_info_to_howto	ppc64_elf_info_to_howto
65 
66 #define elf_backend_want_got_sym 0
67 #define elf_backend_want_plt_sym 0
68 #define elf_backend_plt_alignment 3
69 #define elf_backend_plt_not_loaded 1
70 #define elf_backend_got_header_size 8
71 #define elf_backend_can_gc_sections 1
72 #define elf_backend_can_refcount 1
73 #define elf_backend_rela_normal 1
74 
75 #define bfd_elf64_mkobject		      ppc64_elf_mkobject
76 #define bfd_elf64_bfd_reloc_type_lookup	      ppc64_elf_reloc_type_lookup
77 #define bfd_elf64_bfd_merge_private_bfd_data  ppc64_elf_merge_private_bfd_data
78 #define bfd_elf64_new_section_hook	      ppc64_elf_new_section_hook
79 #define bfd_elf64_bfd_link_hash_table_create  ppc64_elf_link_hash_table_create
80 #define bfd_elf64_bfd_link_hash_table_free    ppc64_elf_link_hash_table_free
81 #define bfd_elf64_get_synthetic_symtab	      ppc64_elf_get_synthetic_symtab
82 
83 #define elf_backend_object_p		      ppc64_elf_object_p
84 #define elf_backend_grok_prstatus	      ppc64_elf_grok_prstatus
85 #define elf_backend_grok_psinfo		      ppc64_elf_grok_psinfo
86 #define elf_backend_create_dynamic_sections   ppc64_elf_create_dynamic_sections
87 #define elf_backend_copy_indirect_symbol      ppc64_elf_copy_indirect_symbol
88 #define elf_backend_add_symbol_hook	      ppc64_elf_add_symbol_hook
89 #define elf_backend_check_directives	      ppc64_elf_check_directives
90 #define elf_backend_archive_symbol_lookup     ppc64_elf_archive_symbol_lookup
91 #define elf_backend_check_relocs	      ppc64_elf_check_relocs
92 #define elf_backend_gc_mark_hook	      ppc64_elf_gc_mark_hook
93 #define elf_backend_gc_sweep_hook	      ppc64_elf_gc_sweep_hook
94 #define elf_backend_adjust_dynamic_symbol     ppc64_elf_adjust_dynamic_symbol
95 #define elf_backend_hide_symbol		      ppc64_elf_hide_symbol
96 #define elf_backend_always_size_sections      ppc64_elf_func_desc_adjust
97 #define elf_backend_size_dynamic_sections     ppc64_elf_size_dynamic_sections
98 #define elf_backend_relocate_section	      ppc64_elf_relocate_section
99 #define elf_backend_finish_dynamic_symbol     ppc64_elf_finish_dynamic_symbol
100 #define elf_backend_reloc_type_class	      ppc64_elf_reloc_type_class
101 #define elf_backend_finish_dynamic_sections   ppc64_elf_finish_dynamic_sections
102 #define elf_backend_link_output_symbol_hook   ppc64_elf_output_symbol_hook
103 #define elf_backend_get_sec_type_attr	      ppc64_elf_get_sec_type_attr
104 
105 /* The name of the dynamic interpreter.  This is put in the .interp
106    section.  */
107 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
108 
109 /* The size in bytes of an entry in the procedure linkage table.  */
110 #define PLT_ENTRY_SIZE 24
111 
112 /* The initial size of the plt reserved for the dynamic linker.  */
113 #define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
114 
115 /* TOC base pointers offset from start of TOC.  */
116 #define TOC_BASE_OFF	0x8000
117 
118 /* Offset of tp and dtp pointers from start of TLS block.  */
119 #define TP_OFFSET	0x7000
120 #define DTP_OFFSET	0x8000
121 
122 /* .plt call stub instructions.  The normal stub is like this, but
123    sometimes the .plt entry crosses a 64k boundary and we need to
124    insert an addis to adjust r12.  */
125 #define PLT_CALL_STUB_SIZE (7*4)
126 #define ADDIS_R12_R2	0x3d820000	/* addis %r12,%r2,xxx@ha     */
127 #define STD_R2_40R1	0xf8410028	/* std	 %r2,40(%r1)	     */
128 #define LD_R11_0R12	0xe96c0000	/* ld	 %r11,xxx+0@l(%r12)  */
129 #define LD_R2_0R12	0xe84c0000	/* ld	 %r2,xxx+8@l(%r12)   */
130 #define MTCTR_R11	0x7d6903a6	/* mtctr %r11		     */
131 					/* ld	 %r11,xxx+16@l(%r12) */
132 #define BCTR		0x4e800420	/* bctr			     */
133 
134 
135 #define ADDIS_R2_R2	0x3c420000	/* addis %r2,%r2,off@ha  */
136 #define ADDI_R2_R2	0x38420000	/* addi  %r2,%r2,off@l   */
137 
138 #define LD_R2_40R1	0xe8410028	/* ld    %r2,40(%r1)     */
139 
140 /* glink call stub instructions.  We enter with the index in R0, and the
141    address of glink entry in CTR.  From that, we can calculate PLT0.  */
142 #define GLINK_CALL_STUB_SIZE (16*4)
143 #define MFCTR_R12	0x7d8902a6	/* mfctr  %r12			*/
144 #define SLDI_R11_R0_3	0x780b1f24	/* sldi	  %r11,%r0,3		*/
145 #define ADDIC_R2_R0_32K 0x34408000	/* addic. %r2,%r0,-32768	*/
146 #define SUB_R12_R12_R11 0x7d8b6050	/* sub	  %r12,%r12,%r11	*/
147 #define SRADI_R2_R2_63	0x7c42fe76	/* sradi  %r2,%r2,63		*/
148 #define SLDI_R11_R0_2	0x780b1764	/* sldi	  %r11,%r0,2		*/
149 #define AND_R2_R2_R11	0x7c425838	/* and	  %r2,%r2,%r11		*/
150 					/* sub	  %r12,%r12,%r11	*/
151 #define ADD_R12_R12_R2	0x7d8c1214	/* add	  %r12,%r12,%r2		*/
152 #define ADDIS_R12_R12	0x3d8c0000	/* addis  %r12,%r12,xxx@ha	*/
153 					/* ld	  %r11,xxx@l(%r12)	*/
154 #define ADDI_R12_R12	0x398c0000	/* addi	  %r12,%r12,xxx@l	*/
155 					/* ld	  %r2,8(%r12)		*/
156 					/* mtctr  %r11			*/
157 					/* ld	  %r11,16(%r12)		*/
158 					/* bctr				*/
159 
160 /* Pad with this.  */
161 #define NOP		0x60000000
162 
163 /* Some other nops.  */
164 #define CROR_151515	0x4def7b82
165 #define CROR_313131	0x4ffffb82
166 
167 /* .glink entries for the first 32k functions are two instructions.  */
168 #define LI_R0_0		0x38000000	/* li    %r0,0		*/
169 #define B_DOT		0x48000000	/* b     .		*/
170 
171 /* After that, we need two instructions to load the index, followed by
172    a branch.  */
173 #define LIS_R0_0	0x3c000000	/* lis   %r0,0		*/
174 #define ORI_R0_R0_0	0x60000000	/* ori	 %r0,%r0,0	*/
175 
176 /* Instructions used by the save and restore reg functions.  */
177 #define STD_R0_0R1	0xf8010000	/* std   %r0,0(%r1)	*/
178 #define STD_R0_0R12	0xf80c0000	/* std   %r0,0(%r12)	*/
179 #define LD_R0_0R1	0xe8010000	/* ld    %r0,0(%r1)	*/
180 #define LD_R0_0R12	0xe80c0000	/* ld    %r0,0(%r12)	*/
181 #define STFD_FR0_0R1	0xd8010000	/* stfd  %fr0,0(%r1)	*/
182 #define LFD_FR0_0R1	0xc8010000	/* lfd   %fr0,0(%r1)	*/
183 #define LI_R12_0	0x39800000	/* li    %r12,0		*/
184 #define STVX_VR0_R12_R0	0x7c0c01ce	/* stvx  %v0,%r12,%r0	*/
185 #define LVX_VR0_R12_R0	0x7c0c00ce	/* lvx   %v0,%r12,%r0	*/
186 #define MTLR_R0		0x7c0803a6	/* mtlr  %r0		*/
187 #define BLR		0x4e800020	/* blr			*/
188 
189 /* Since .opd is an array of descriptors and each entry will end up
190    with identical R_PPC64_RELATIVE relocs, there is really no need to
191    propagate .opd relocs;  The dynamic linker should be taught to
192    relocate .opd without reloc entries.  */
193 #ifndef NO_OPD_RELOCS
194 #define NO_OPD_RELOCS 0
195 #endif
196 
197 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
198 
199 /* Relocation HOWTO's.  */
200 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
201 
202 static reloc_howto_type ppc64_elf_howto_raw[] = {
203   /* This reloc does nothing.  */
204   HOWTO (R_PPC64_NONE,		/* type */
205 	 0,			/* rightshift */
206 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
207 	 32,			/* bitsize */
208 	 FALSE,			/* pc_relative */
209 	 0,			/* bitpos */
210 	 complain_overflow_dont, /* complain_on_overflow */
211 	 bfd_elf_generic_reloc,	/* special_function */
212 	 "R_PPC64_NONE",	/* name */
213 	 FALSE,			/* partial_inplace */
214 	 0,			/* src_mask */
215 	 0,			/* dst_mask */
216 	 FALSE),		/* pcrel_offset */
217 
218   /* A standard 32 bit relocation.  */
219   HOWTO (R_PPC64_ADDR32,	/* type */
220 	 0,			/* rightshift */
221 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
222 	 32,			/* bitsize */
223 	 FALSE,			/* pc_relative */
224 	 0,			/* bitpos */
225 	 complain_overflow_bitfield, /* complain_on_overflow */
226 	 bfd_elf_generic_reloc,	/* special_function */
227 	 "R_PPC64_ADDR32",	/* name */
228 	 FALSE,			/* partial_inplace */
229 	 0,			/* src_mask */
230 	 0xffffffff,		/* dst_mask */
231 	 FALSE),		/* pcrel_offset */
232 
233   /* An absolute 26 bit branch; the lower two bits must be zero.
234      FIXME: we don't check that, we just clear them.  */
235   HOWTO (R_PPC64_ADDR24,	/* type */
236 	 0,			/* rightshift */
237 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
238 	 26,			/* bitsize */
239 	 FALSE,			/* pc_relative */
240 	 0,			/* bitpos */
241 	 complain_overflow_bitfield, /* complain_on_overflow */
242 	 bfd_elf_generic_reloc,	/* special_function */
243 	 "R_PPC64_ADDR24",	/* name */
244 	 FALSE,			/* partial_inplace */
245 	 0,			/* src_mask */
246 	 0x03fffffc,		/* dst_mask */
247 	 FALSE),		/* pcrel_offset */
248 
249   /* A standard 16 bit relocation.  */
250   HOWTO (R_PPC64_ADDR16,	/* type */
251 	 0,			/* rightshift */
252 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
253 	 16,			/* bitsize */
254 	 FALSE,			/* pc_relative */
255 	 0,			/* bitpos */
256 	 complain_overflow_bitfield, /* complain_on_overflow */
257 	 bfd_elf_generic_reloc,	/* special_function */
258 	 "R_PPC64_ADDR16",	/* name */
259 	 FALSE,			/* partial_inplace */
260 	 0,			/* src_mask */
261 	 0xffff,		/* dst_mask */
262 	 FALSE),		/* pcrel_offset */
263 
264   /* A 16 bit relocation without overflow.  */
265   HOWTO (R_PPC64_ADDR16_LO,	/* type */
266 	 0,			/* rightshift */
267 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
268 	 16,			/* bitsize */
269 	 FALSE,			/* pc_relative */
270 	 0,			/* bitpos */
271 	 complain_overflow_dont,/* complain_on_overflow */
272 	 bfd_elf_generic_reloc,	/* special_function */
273 	 "R_PPC64_ADDR16_LO",	/* name */
274 	 FALSE,			/* partial_inplace */
275 	 0,			/* src_mask */
276 	 0xffff,		/* dst_mask */
277 	 FALSE),		/* pcrel_offset */
278 
279   /* Bits 16-31 of an address.  */
280   HOWTO (R_PPC64_ADDR16_HI,	/* type */
281 	 16,			/* rightshift */
282 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
283 	 16,			/* bitsize */
284 	 FALSE,			/* pc_relative */
285 	 0,			/* bitpos */
286 	 complain_overflow_dont, /* complain_on_overflow */
287 	 bfd_elf_generic_reloc,	/* special_function */
288 	 "R_PPC64_ADDR16_HI",	/* name */
289 	 FALSE,			/* partial_inplace */
290 	 0,			/* src_mask */
291 	 0xffff,		/* dst_mask */
292 	 FALSE),		/* pcrel_offset */
293 
294   /* Bits 16-31 of an address, plus 1 if the contents of the low 16
295      bits, treated as a signed number, is negative.  */
296   HOWTO (R_PPC64_ADDR16_HA,	/* type */
297 	 16,			/* rightshift */
298 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
299 	 16,			/* bitsize */
300 	 FALSE,			/* pc_relative */
301 	 0,			/* bitpos */
302 	 complain_overflow_dont, /* complain_on_overflow */
303 	 ppc64_elf_ha_reloc,	/* special_function */
304 	 "R_PPC64_ADDR16_HA",	/* name */
305 	 FALSE,			/* partial_inplace */
306 	 0,			/* src_mask */
307 	 0xffff,		/* dst_mask */
308 	 FALSE),		/* pcrel_offset */
309 
310   /* An absolute 16 bit branch; the lower two bits must be zero.
311      FIXME: we don't check that, we just clear them.  */
312   HOWTO (R_PPC64_ADDR14,	/* type */
313 	 0,			/* rightshift */
314 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
315 	 16,			/* bitsize */
316 	 FALSE,			/* pc_relative */
317 	 0,			/* bitpos */
318 	 complain_overflow_bitfield, /* complain_on_overflow */
319 	 ppc64_elf_branch_reloc, /* special_function */
320 	 "R_PPC64_ADDR14",	/* name */
321 	 FALSE,			/* partial_inplace */
322 	 0,			/* src_mask */
323 	 0x0000fffc,		/* dst_mask */
324 	 FALSE),		/* pcrel_offset */
325 
326   /* An absolute 16 bit branch, for which bit 10 should be set to
327      indicate that the branch is expected to be taken.  The lower two
328      bits must be zero.  */
329   HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
330 	 0,			/* rightshift */
331 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
332 	 16,			/* bitsize */
333 	 FALSE,			/* pc_relative */
334 	 0,			/* bitpos */
335 	 complain_overflow_bitfield, /* complain_on_overflow */
336 	 ppc64_elf_brtaken_reloc, /* special_function */
337 	 "R_PPC64_ADDR14_BRTAKEN",/* name */
338 	 FALSE,			/* partial_inplace */
339 	 0,			/* src_mask */
340 	 0x0000fffc,		/* dst_mask */
341 	 FALSE),		/* pcrel_offset */
342 
343   /* An absolute 16 bit branch, for which bit 10 should be set to
344      indicate that the branch is not expected to be taken.  The lower
345      two bits must be zero.  */
346   HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
347 	 0,			/* rightshift */
348 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
349 	 16,			/* bitsize */
350 	 FALSE,			/* pc_relative */
351 	 0,			/* bitpos */
352 	 complain_overflow_bitfield, /* complain_on_overflow */
353 	 ppc64_elf_brtaken_reloc, /* special_function */
354 	 "R_PPC64_ADDR14_BRNTAKEN",/* name */
355 	 FALSE,			/* partial_inplace */
356 	 0,			/* src_mask */
357 	 0x0000fffc,		/* dst_mask */
358 	 FALSE),		/* pcrel_offset */
359 
360   /* A relative 26 bit branch; the lower two bits must be zero.  */
361   HOWTO (R_PPC64_REL24,		/* type */
362 	 0,			/* rightshift */
363 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
364 	 26,			/* bitsize */
365 	 TRUE,			/* pc_relative */
366 	 0,			/* bitpos */
367 	 complain_overflow_signed, /* complain_on_overflow */
368 	 ppc64_elf_branch_reloc, /* special_function */
369 	 "R_PPC64_REL24",	/* name */
370 	 FALSE,			/* partial_inplace */
371 	 0,			/* src_mask */
372 	 0x03fffffc,		/* dst_mask */
373 	 TRUE),			/* pcrel_offset */
374 
375   /* A relative 16 bit branch; the lower two bits must be zero.  */
376   HOWTO (R_PPC64_REL14,		/* type */
377 	 0,			/* rightshift */
378 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
379 	 16,			/* bitsize */
380 	 TRUE,			/* pc_relative */
381 	 0,			/* bitpos */
382 	 complain_overflow_signed, /* complain_on_overflow */
383 	 ppc64_elf_branch_reloc, /* special_function */
384 	 "R_PPC64_REL14",	/* name */
385 	 FALSE,			/* partial_inplace */
386 	 0,			/* src_mask */
387 	 0x0000fffc,		/* dst_mask */
388 	 TRUE),			/* pcrel_offset */
389 
390   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
391      the branch is expected to be taken.  The lower two bits must be
392      zero.  */
393   HOWTO (R_PPC64_REL14_BRTAKEN,	/* type */
394 	 0,			/* rightshift */
395 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
396 	 16,			/* bitsize */
397 	 TRUE,			/* pc_relative */
398 	 0,			/* bitpos */
399 	 complain_overflow_signed, /* complain_on_overflow */
400 	 ppc64_elf_brtaken_reloc, /* special_function */
401 	 "R_PPC64_REL14_BRTAKEN", /* name */
402 	 FALSE,			/* partial_inplace */
403 	 0,			/* src_mask */
404 	 0x0000fffc,		/* dst_mask */
405 	 TRUE),			/* pcrel_offset */
406 
407   /* A relative 16 bit branch.  Bit 10 should be set to indicate that
408      the branch is not expected to be taken.  The lower two bits must
409      be zero.  */
410   HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
411 	 0,			/* rightshift */
412 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
413 	 16,			/* bitsize */
414 	 TRUE,			/* pc_relative */
415 	 0,			/* bitpos */
416 	 complain_overflow_signed, /* complain_on_overflow */
417 	 ppc64_elf_brtaken_reloc, /* special_function */
418 	 "R_PPC64_REL14_BRNTAKEN",/* name */
419 	 FALSE,			/* partial_inplace */
420 	 0,			/* src_mask */
421 	 0x0000fffc,		/* dst_mask */
422 	 TRUE),			/* pcrel_offset */
423 
424   /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
425      symbol.  */
426   HOWTO (R_PPC64_GOT16,		/* type */
427 	 0,			/* rightshift */
428 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
429 	 16,			/* bitsize */
430 	 FALSE,			/* pc_relative */
431 	 0,			/* bitpos */
432 	 complain_overflow_signed, /* complain_on_overflow */
433 	 ppc64_elf_unhandled_reloc, /* special_function */
434 	 "R_PPC64_GOT16",	/* name */
435 	 FALSE,			/* partial_inplace */
436 	 0,			/* src_mask */
437 	 0xffff,		/* dst_mask */
438 	 FALSE),		/* pcrel_offset */
439 
440   /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
441      the symbol.  */
442   HOWTO (R_PPC64_GOT16_LO,	/* type */
443 	 0,			/* rightshift */
444 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
445 	 16,			/* bitsize */
446 	 FALSE,			/* pc_relative */
447 	 0,			/* bitpos */
448 	 complain_overflow_dont, /* complain_on_overflow */
449 	 ppc64_elf_unhandled_reloc, /* special_function */
450 	 "R_PPC64_GOT16_LO",	/* name */
451 	 FALSE,			/* partial_inplace */
452 	 0,			/* src_mask */
453 	 0xffff,		/* dst_mask */
454 	 FALSE),		/* pcrel_offset */
455 
456   /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
457      the symbol.  */
458   HOWTO (R_PPC64_GOT16_HI,	/* type */
459 	 16,			/* rightshift */
460 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
461 	 16,			/* bitsize */
462 	 FALSE,			/* pc_relative */
463 	 0,			/* bitpos */
464 	 complain_overflow_dont,/* complain_on_overflow */
465 	 ppc64_elf_unhandled_reloc, /* special_function */
466 	 "R_PPC64_GOT16_HI",	/* name */
467 	 FALSE,			/* partial_inplace */
468 	 0,			/* src_mask */
469 	 0xffff,		/* dst_mask */
470 	 FALSE),		/* pcrel_offset */
471 
472   /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
473      the symbol.  */
474   HOWTO (R_PPC64_GOT16_HA,	/* type */
475 	 16,			/* rightshift */
476 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
477 	 16,			/* bitsize */
478 	 FALSE,			/* pc_relative */
479 	 0,			/* bitpos */
480 	 complain_overflow_dont,/* complain_on_overflow */
481 	 ppc64_elf_unhandled_reloc, /* special_function */
482 	 "R_PPC64_GOT16_HA",	/* name */
483 	 FALSE,			/* partial_inplace */
484 	 0,			/* src_mask */
485 	 0xffff,		/* dst_mask */
486 	 FALSE),		/* pcrel_offset */
487 
488   /* This is used only by the dynamic linker.  The symbol should exist
489      both in the object being run and in some shared library.  The
490      dynamic linker copies the data addressed by the symbol from the
491      shared library into the object, because the object being
492      run has to have the data at some particular address.  */
493   HOWTO (R_PPC64_COPY,		/* type */
494 	 0,			/* rightshift */
495 	 0,			/* this one is variable size */
496 	 0,			/* bitsize */
497 	 FALSE,			/* pc_relative */
498 	 0,			/* bitpos */
499 	 complain_overflow_dont, /* complain_on_overflow */
500 	 ppc64_elf_unhandled_reloc, /* special_function */
501 	 "R_PPC64_COPY",	/* name */
502 	 FALSE,			/* partial_inplace */
503 	 0,			/* src_mask */
504 	 0,			/* dst_mask */
505 	 FALSE),		/* pcrel_offset */
506 
507   /* Like R_PPC64_ADDR64, but used when setting global offset table
508      entries.  */
509   HOWTO (R_PPC64_GLOB_DAT,	/* type */
510 	 0,			/* rightshift */
511 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
512 	 64,			/* bitsize */
513 	 FALSE,			/* pc_relative */
514 	 0,			/* bitpos */
515 	 complain_overflow_dont, /* complain_on_overflow */
516 	 ppc64_elf_unhandled_reloc,  /* special_function */
517 	 "R_PPC64_GLOB_DAT",	/* name */
518 	 FALSE,			/* partial_inplace */
519 	 0,			/* src_mask */
520 	 ONES (64),		/* dst_mask */
521 	 FALSE),		/* pcrel_offset */
522 
523   /* Created by the link editor.  Marks a procedure linkage table
524      entry for a symbol.  */
525   HOWTO (R_PPC64_JMP_SLOT,	/* type */
526 	 0,			/* rightshift */
527 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
528 	 0,			/* bitsize */
529 	 FALSE,			/* pc_relative */
530 	 0,			/* bitpos */
531 	 complain_overflow_dont, /* complain_on_overflow */
532 	 ppc64_elf_unhandled_reloc, /* special_function */
533 	 "R_PPC64_JMP_SLOT",	/* name */
534 	 FALSE,			/* partial_inplace */
535 	 0,			/* src_mask */
536 	 0,			/* dst_mask */
537 	 FALSE),		/* pcrel_offset */
538 
539   /* Used only by the dynamic linker.  When the object is run, this
540      doubleword64 is set to the load address of the object, plus the
541      addend.  */
542   HOWTO (R_PPC64_RELATIVE,	/* type */
543 	 0,			/* rightshift */
544 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
545 	 64,			/* bitsize */
546 	 FALSE,			/* pc_relative */
547 	 0,			/* bitpos */
548 	 complain_overflow_dont, /* complain_on_overflow */
549 	 bfd_elf_generic_reloc,	/* special_function */
550 	 "R_PPC64_RELATIVE",	/* name */
551 	 FALSE,			/* partial_inplace */
552 	 0,			/* src_mask */
553 	 ONES (64),		/* dst_mask */
554 	 FALSE),		/* pcrel_offset */
555 
556   /* Like R_PPC64_ADDR32, but may be unaligned.  */
557   HOWTO (R_PPC64_UADDR32,	/* type */
558 	 0,			/* rightshift */
559 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
560 	 32,			/* bitsize */
561 	 FALSE,			/* pc_relative */
562 	 0,			/* bitpos */
563 	 complain_overflow_bitfield, /* complain_on_overflow */
564 	 bfd_elf_generic_reloc,	/* special_function */
565 	 "R_PPC64_UADDR32",	/* name */
566 	 FALSE,			/* partial_inplace */
567 	 0,			/* src_mask */
568 	 0xffffffff,		/* dst_mask */
569 	 FALSE),		/* pcrel_offset */
570 
571   /* Like R_PPC64_ADDR16, but may be unaligned.  */
572   HOWTO (R_PPC64_UADDR16,	/* type */
573 	 0,			/* rightshift */
574 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
575 	 16,			/* bitsize */
576 	 FALSE,			/* pc_relative */
577 	 0,			/* bitpos */
578 	 complain_overflow_bitfield, /* complain_on_overflow */
579 	 bfd_elf_generic_reloc,	/* special_function */
580 	 "R_PPC64_UADDR16",	/* name */
581 	 FALSE,			/* partial_inplace */
582 	 0,			/* src_mask */
583 	 0xffff,		/* dst_mask */
584 	 FALSE),		/* pcrel_offset */
585 
586   /* 32-bit PC relative.  */
587   HOWTO (R_PPC64_REL32,		/* type */
588 	 0,			/* rightshift */
589 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
590 	 32,			/* bitsize */
591 	 TRUE,			/* pc_relative */
592 	 0,			/* bitpos */
593 	 /* FIXME: Verify.  Was complain_overflow_bitfield.  */
594 	 complain_overflow_signed, /* complain_on_overflow */
595 	 bfd_elf_generic_reloc,	/* special_function */
596 	 "R_PPC64_REL32",	/* name */
597 	 FALSE,			/* partial_inplace */
598 	 0,			/* src_mask */
599 	 0xffffffff,		/* dst_mask */
600 	 TRUE),			/* pcrel_offset */
601 
602   /* 32-bit relocation to the symbol's procedure linkage table.  */
603   HOWTO (R_PPC64_PLT32,		/* type */
604 	 0,			/* rightshift */
605 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
606 	 32,			/* bitsize */
607 	 FALSE,			/* pc_relative */
608 	 0,			/* bitpos */
609 	 complain_overflow_bitfield, /* complain_on_overflow */
610 	 ppc64_elf_unhandled_reloc, /* special_function */
611 	 "R_PPC64_PLT32",	/* name */
612 	 FALSE,			/* partial_inplace */
613 	 0,			/* src_mask */
614 	 0xffffffff,		/* dst_mask */
615 	 FALSE),		/* pcrel_offset */
616 
617   /* 32-bit PC relative relocation to the symbol's procedure linkage table.
618      FIXME: R_PPC64_PLTREL32 not supported.  */
619   HOWTO (R_PPC64_PLTREL32,	/* type */
620 	 0,			/* rightshift */
621 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
622 	 32,			/* bitsize */
623 	 TRUE,			/* pc_relative */
624 	 0,			/* bitpos */
625 	 complain_overflow_signed, /* complain_on_overflow */
626 	 bfd_elf_generic_reloc,	/* special_function */
627 	 "R_PPC64_PLTREL32",	/* name */
628 	 FALSE,			/* partial_inplace */
629 	 0,			/* src_mask */
630 	 0xffffffff,		/* dst_mask */
631 	 TRUE),			/* pcrel_offset */
632 
633   /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
634      the symbol.  */
635   HOWTO (R_PPC64_PLT16_LO,	/* type */
636 	 0,			/* rightshift */
637 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
638 	 16,			/* bitsize */
639 	 FALSE,			/* pc_relative */
640 	 0,			/* bitpos */
641 	 complain_overflow_dont, /* complain_on_overflow */
642 	 ppc64_elf_unhandled_reloc, /* special_function */
643 	 "R_PPC64_PLT16_LO",	/* name */
644 	 FALSE,			/* partial_inplace */
645 	 0,			/* src_mask */
646 	 0xffff,		/* dst_mask */
647 	 FALSE),		/* pcrel_offset */
648 
649   /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
650      the symbol.  */
651   HOWTO (R_PPC64_PLT16_HI,	/* type */
652 	 16,			/* rightshift */
653 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
654 	 16,			/* bitsize */
655 	 FALSE,			/* pc_relative */
656 	 0,			/* bitpos */
657 	 complain_overflow_dont, /* complain_on_overflow */
658 	 ppc64_elf_unhandled_reloc, /* special_function */
659 	 "R_PPC64_PLT16_HI",	/* name */
660 	 FALSE,			/* partial_inplace */
661 	 0,			/* src_mask */
662 	 0xffff,		/* dst_mask */
663 	 FALSE),		/* pcrel_offset */
664 
665   /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
666      the symbol.  */
667   HOWTO (R_PPC64_PLT16_HA,	/* type */
668 	 16,			/* rightshift */
669 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
670 	 16,			/* bitsize */
671 	 FALSE,			/* pc_relative */
672 	 0,			/* bitpos */
673 	 complain_overflow_dont, /* complain_on_overflow */
674 	 ppc64_elf_unhandled_reloc, /* special_function */
675 	 "R_PPC64_PLT16_HA",	/* name */
676 	 FALSE,			/* partial_inplace */
677 	 0,			/* src_mask */
678 	 0xffff,		/* dst_mask */
679 	 FALSE),		/* pcrel_offset */
680 
681   /* 16-bit section relative relocation.  */
682   HOWTO (R_PPC64_SECTOFF,	/* type */
683 	 0,			/* rightshift */
684 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
685 	 16,			/* bitsize */
686 	 FALSE,			/* pc_relative */
687 	 0,			/* bitpos */
688 	 complain_overflow_bitfield, /* complain_on_overflow */
689 	 ppc64_elf_sectoff_reloc, /* special_function */
690 	 "R_PPC64_SECTOFF",	/* name */
691 	 FALSE,			/* partial_inplace */
692 	 0,			/* src_mask */
693 	 0xffff,		/* dst_mask */
694 	 FALSE),		/* pcrel_offset */
695 
696   /* Like R_PPC64_SECTOFF, but no overflow warning.  */
697   HOWTO (R_PPC64_SECTOFF_LO,	/* type */
698 	 0,			/* rightshift */
699 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
700 	 16,			/* bitsize */
701 	 FALSE,			/* pc_relative */
702 	 0,			/* bitpos */
703 	 complain_overflow_dont, /* complain_on_overflow */
704 	 ppc64_elf_sectoff_reloc, /* special_function */
705 	 "R_PPC64_SECTOFF_LO",	/* name */
706 	 FALSE,			/* partial_inplace */
707 	 0,			/* src_mask */
708 	 0xffff,		/* dst_mask */
709 	 FALSE),		/* pcrel_offset */
710 
711   /* 16-bit upper half section relative relocation.  */
712   HOWTO (R_PPC64_SECTOFF_HI,	/* type */
713 	 16,			/* rightshift */
714 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
715 	 16,			/* bitsize */
716 	 FALSE,			/* pc_relative */
717 	 0,			/* bitpos */
718 	 complain_overflow_dont, /* complain_on_overflow */
719 	 ppc64_elf_sectoff_reloc, /* special_function */
720 	 "R_PPC64_SECTOFF_HI",	/* name */
721 	 FALSE,			/* partial_inplace */
722 	 0,			/* src_mask */
723 	 0xffff,		/* dst_mask */
724 	 FALSE),		/* pcrel_offset */
725 
726   /* 16-bit upper half adjusted section relative relocation.  */
727   HOWTO (R_PPC64_SECTOFF_HA,	/* type */
728 	 16,			/* rightshift */
729 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
730 	 16,			/* bitsize */
731 	 FALSE,			/* pc_relative */
732 	 0,			/* bitpos */
733 	 complain_overflow_dont, /* complain_on_overflow */
734 	 ppc64_elf_sectoff_ha_reloc, /* special_function */
735 	 "R_PPC64_SECTOFF_HA",	/* name */
736 	 FALSE,			/* partial_inplace */
737 	 0,			/* src_mask */
738 	 0xffff,		/* dst_mask */
739 	 FALSE),		/* pcrel_offset */
740 
741   /* Like R_PPC64_REL24 without touching the two least significant bits.  */
742   HOWTO (R_PPC64_REL30,		/* type */
743 	 2,			/* rightshift */
744 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
745 	 30,			/* bitsize */
746 	 TRUE,			/* pc_relative */
747 	 0,			/* bitpos */
748 	 complain_overflow_dont, /* complain_on_overflow */
749 	 bfd_elf_generic_reloc, /* special_function */
750 	 "R_PPC64_REL30",	/* name */
751 	 FALSE,			/* partial_inplace */
752 	 0,			/* src_mask */
753 	 0xfffffffc,		/* dst_mask */
754 	 TRUE),			/* pcrel_offset */
755 
756   /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI.  */
757 
758   /* A standard 64-bit relocation.  */
759   HOWTO (R_PPC64_ADDR64,	/* type */
760 	 0,			/* rightshift */
761 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
762 	 64,			/* bitsize */
763 	 FALSE,			/* pc_relative */
764 	 0,			/* bitpos */
765 	 complain_overflow_dont, /* complain_on_overflow */
766 	 bfd_elf_generic_reloc,	/* special_function */
767 	 "R_PPC64_ADDR64",	/* name */
768 	 FALSE,			/* partial_inplace */
769 	 0,			/* src_mask */
770 	 ONES (64),		/* dst_mask */
771 	 FALSE),		/* pcrel_offset */
772 
773   /* The bits 32-47 of an address.  */
774   HOWTO (R_PPC64_ADDR16_HIGHER,	/* type */
775 	 32,			/* rightshift */
776 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
777 	 16,			/* bitsize */
778 	 FALSE,			/* pc_relative */
779 	 0,			/* bitpos */
780 	 complain_overflow_dont, /* complain_on_overflow */
781 	 bfd_elf_generic_reloc,	/* special_function */
782 	 "R_PPC64_ADDR16_HIGHER", /* name */
783 	 FALSE,			/* partial_inplace */
784 	 0,			/* src_mask */
785 	 0xffff,		/* dst_mask */
786 	 FALSE),		/* pcrel_offset */
787 
788   /* The bits 32-47 of an address, plus 1 if the contents of the low
789      16 bits, treated as a signed number, is negative.  */
790   HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
791 	 32,			/* rightshift */
792 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
793 	 16,			/* bitsize */
794 	 FALSE,			/* pc_relative */
795 	 0,			/* bitpos */
796 	 complain_overflow_dont, /* complain_on_overflow */
797 	 ppc64_elf_ha_reloc,	/* special_function */
798 	 "R_PPC64_ADDR16_HIGHERA", /* name */
799 	 FALSE,			/* partial_inplace */
800 	 0,			/* src_mask */
801 	 0xffff,		/* dst_mask */
802 	 FALSE),		/* pcrel_offset */
803 
804   /* The bits 48-63 of an address.  */
805   HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
806 	 48,			/* rightshift */
807 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
808 	 16,			/* bitsize */
809 	 FALSE,			/* pc_relative */
810 	 0,			/* bitpos */
811 	 complain_overflow_dont, /* complain_on_overflow */
812 	 bfd_elf_generic_reloc,	/* special_function */
813 	 "R_PPC64_ADDR16_HIGHEST", /* name */
814 	 FALSE,			/* partial_inplace */
815 	 0,			/* src_mask */
816 	 0xffff,		/* dst_mask */
817 	 FALSE),		/* pcrel_offset */
818 
819   /* The bits 48-63 of an address, plus 1 if the contents of the low
820      16 bits, treated as a signed number, is negative.  */
821   HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
822 	 48,			/* rightshift */
823 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
824 	 16,			/* bitsize */
825 	 FALSE,			/* pc_relative */
826 	 0,			/* bitpos */
827 	 complain_overflow_dont, /* complain_on_overflow */
828 	 ppc64_elf_ha_reloc,	/* special_function */
829 	 "R_PPC64_ADDR16_HIGHESTA", /* name */
830 	 FALSE,			/* partial_inplace */
831 	 0,			/* src_mask */
832 	 0xffff,		/* dst_mask */
833 	 FALSE),		/* pcrel_offset */
834 
835   /* Like ADDR64, but may be unaligned.  */
836   HOWTO (R_PPC64_UADDR64,	/* type */
837 	 0,			/* rightshift */
838 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
839 	 64,			/* bitsize */
840 	 FALSE,			/* pc_relative */
841 	 0,			/* bitpos */
842 	 complain_overflow_dont, /* complain_on_overflow */
843 	 bfd_elf_generic_reloc,	/* special_function */
844 	 "R_PPC64_UADDR64",	/* name */
845 	 FALSE,			/* partial_inplace */
846 	 0,			/* src_mask */
847 	 ONES (64),		/* dst_mask */
848 	 FALSE),		/* pcrel_offset */
849 
850   /* 64-bit relative relocation.  */
851   HOWTO (R_PPC64_REL64,		/* type */
852 	 0,			/* rightshift */
853 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
854 	 64,			/* bitsize */
855 	 TRUE,			/* pc_relative */
856 	 0,			/* bitpos */
857 	 complain_overflow_dont, /* complain_on_overflow */
858 	 bfd_elf_generic_reloc,	/* special_function */
859 	 "R_PPC64_REL64",	/* name */
860 	 FALSE,			/* partial_inplace */
861 	 0,			/* src_mask */
862 	 ONES (64),		/* dst_mask */
863 	 TRUE),			/* pcrel_offset */
864 
865   /* 64-bit relocation to the symbol's procedure linkage table.  */
866   HOWTO (R_PPC64_PLT64,		/* type */
867 	 0,			/* rightshift */
868 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
869 	 64,			/* bitsize */
870 	 FALSE,			/* pc_relative */
871 	 0,			/* bitpos */
872 	 complain_overflow_dont, /* complain_on_overflow */
873 	 ppc64_elf_unhandled_reloc, /* special_function */
874 	 "R_PPC64_PLT64",	/* name */
875 	 FALSE,			/* partial_inplace */
876 	 0,			/* src_mask */
877 	 ONES (64),		/* dst_mask */
878 	 FALSE),		/* pcrel_offset */
879 
880   /* 64-bit PC relative relocation to the symbol's procedure linkage
881      table.  */
882   /* FIXME: R_PPC64_PLTREL64 not supported.  */
883   HOWTO (R_PPC64_PLTREL64,	/* type */
884 	 0,			/* rightshift */
885 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
886 	 64,			/* bitsize */
887 	 TRUE,			/* pc_relative */
888 	 0,			/* bitpos */
889 	 complain_overflow_dont, /* complain_on_overflow */
890 	 ppc64_elf_unhandled_reloc, /* special_function */
891 	 "R_PPC64_PLTREL64",	/* name */
892 	 FALSE,			/* partial_inplace */
893 	 0,			/* src_mask */
894 	 ONES (64),		/* dst_mask */
895 	 TRUE),			/* pcrel_offset */
896 
897   /* 16 bit TOC-relative relocation.  */
898 
899   /* R_PPC64_TOC16	  47	   half16*	S + A - .TOC.  */
900   HOWTO (R_PPC64_TOC16,		/* type */
901 	 0,			/* rightshift */
902 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
903 	 16,			/* bitsize */
904 	 FALSE,			/* pc_relative */
905 	 0,			/* bitpos */
906 	 complain_overflow_signed, /* complain_on_overflow */
907 	 ppc64_elf_toc_reloc,	/* special_function */
908 	 "R_PPC64_TOC16",	/* name */
909 	 FALSE,			/* partial_inplace */
910 	 0,			/* src_mask */
911 	 0xffff,		/* dst_mask */
912 	 FALSE),		/* pcrel_offset */
913 
914   /* 16 bit TOC-relative relocation without overflow.  */
915 
916   /* R_PPC64_TOC16_LO	  48	   half16	 #lo (S + A - .TOC.)  */
917   HOWTO (R_PPC64_TOC16_LO,	/* type */
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 	 ppc64_elf_toc_reloc,	/* special_function */
925 	 "R_PPC64_TOC16_LO",	/* name */
926 	 FALSE,			/* partial_inplace */
927 	 0,			/* src_mask */
928 	 0xffff,		/* dst_mask */
929 	 FALSE),		/* pcrel_offset */
930 
931   /* 16 bit TOC-relative relocation, high 16 bits.  */
932 
933   /* R_PPC64_TOC16_HI	  49	   half16	 #hi (S + A - .TOC.)  */
934   HOWTO (R_PPC64_TOC16_HI,	/* type */
935 	 16,			/* rightshift */
936 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
937 	 16,			/* bitsize */
938 	 FALSE,			/* pc_relative */
939 	 0,			/* bitpos */
940 	 complain_overflow_dont, /* complain_on_overflow */
941 	 ppc64_elf_toc_reloc,	/* special_function */
942 	 "R_PPC64_TOC16_HI",	/* name */
943 	 FALSE,			/* partial_inplace */
944 	 0,			/* src_mask */
945 	 0xffff,		/* dst_mask */
946 	 FALSE),		/* pcrel_offset */
947 
948   /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
949      contents of the low 16 bits, treated as a signed number, is
950      negative.  */
951 
952   /* R_PPC64_TOC16_HA	  50	   half16	 #ha (S + A - .TOC.)  */
953   HOWTO (R_PPC64_TOC16_HA,	/* type */
954 	 16,			/* rightshift */
955 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
956 	 16,			/* bitsize */
957 	 FALSE,			/* pc_relative */
958 	 0,			/* bitpos */
959 	 complain_overflow_dont, /* complain_on_overflow */
960 	 ppc64_elf_toc_ha_reloc, /* special_function */
961 	 "R_PPC64_TOC16_HA",	/* name */
962 	 FALSE,			/* partial_inplace */
963 	 0,			/* src_mask */
964 	 0xffff,		/* dst_mask */
965 	 FALSE),		/* pcrel_offset */
966 
967   /* 64-bit relocation; insert value of TOC base (.TOC.).  */
968 
969   /* R_PPC64_TOC		  51	   doubleword64	 .TOC.  */
970   HOWTO (R_PPC64_TOC,		/* type */
971 	 0,			/* rightshift */
972 	 4,			/* size (0=byte, 1=short, 2=long, 4=64 bits) */
973 	 64,			/* bitsize */
974 	 FALSE,			/* pc_relative */
975 	 0,			/* bitpos */
976 	 complain_overflow_bitfield, /* complain_on_overflow */
977 	 ppc64_elf_toc64_reloc,	/* special_function */
978 	 "R_PPC64_TOC",		/* name */
979 	 FALSE,			/* partial_inplace */
980 	 0,			/* src_mask */
981 	 ONES (64),		/* dst_mask */
982 	 FALSE),		/* pcrel_offset */
983 
984   /* Like R_PPC64_GOT16, but also informs the link editor that the
985      value to relocate may (!) refer to a PLT entry which the link
986      editor (a) may replace with the symbol value.  If the link editor
987      is unable to fully resolve the symbol, it may (b) create a PLT
988      entry and store the address to the new PLT entry in the GOT.
989      This permits lazy resolution of function symbols at run time.
990      The link editor may also skip all of this and just (c) emit a
991      R_PPC64_GLOB_DAT to tie the symbol to the GOT entry.  */
992   /* FIXME: R_PPC64_PLTGOT16 not implemented.  */
993     HOWTO (R_PPC64_PLTGOT16,	/* type */
994 	 0,			/* rightshift */
995 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
996 	 16,			/* bitsize */
997 	 FALSE,			/* pc_relative */
998 	 0,			/* bitpos */
999 	 complain_overflow_signed, /* complain_on_overflow */
1000 	 ppc64_elf_unhandled_reloc, /* special_function */
1001 	 "R_PPC64_PLTGOT16",	/* name */
1002 	 FALSE,			/* partial_inplace */
1003 	 0,			/* src_mask */
1004 	 0xffff,		/* dst_mask */
1005 	 FALSE),		/* pcrel_offset */
1006 
1007   /* Like R_PPC64_PLTGOT16, but without overflow.  */
1008   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1009   HOWTO (R_PPC64_PLTGOT16_LO,	/* type */
1010 	 0,			/* 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 	 ppc64_elf_unhandled_reloc, /* special_function */
1017 	 "R_PPC64_PLTGOT16_LO",	/* name */
1018 	 FALSE,			/* partial_inplace */
1019 	 0,			/* src_mask */
1020 	 0xffff,		/* dst_mask */
1021 	 FALSE),		/* pcrel_offset */
1022 
1023   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address.  */
1024   /* FIXME: R_PPC64_PLTGOT16_HI not implemented.  */
1025   HOWTO (R_PPC64_PLTGOT16_HI,	/* type */
1026 	 16,			/* rightshift */
1027 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1028 	 16,			/* bitsize */
1029 	 FALSE,			/* pc_relative */
1030 	 0,			/* bitpos */
1031 	 complain_overflow_dont, /* complain_on_overflow */
1032 	 ppc64_elf_unhandled_reloc, /* special_function */
1033 	 "R_PPC64_PLTGOT16_HI",	/* name */
1034 	 FALSE,			/* partial_inplace */
1035 	 0,			/* src_mask */
1036 	 0xffff,		/* dst_mask */
1037 	 FALSE),		/* pcrel_offset */
1038 
1039   /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1040      1 if the contents of the low 16 bits, treated as a signed number,
1041      is negative.  */
1042   /* FIXME: R_PPC64_PLTGOT16_HA not implemented.  */
1043   HOWTO (R_PPC64_PLTGOT16_HA,	/* type */
1044 	 16,			/* rightshift */
1045 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1046 	 16,			/* bitsize */
1047 	 FALSE,			/* pc_relative */
1048 	 0,			/* bitpos */
1049 	 complain_overflow_dont,/* complain_on_overflow */
1050 	 ppc64_elf_unhandled_reloc, /* special_function */
1051 	 "R_PPC64_PLTGOT16_HA",	/* name */
1052 	 FALSE,			/* partial_inplace */
1053 	 0,			/* src_mask */
1054 	 0xffff,		/* dst_mask */
1055 	 FALSE),		/* pcrel_offset */
1056 
1057   /* Like R_PPC64_ADDR16, but for instructions with a DS field.  */
1058   HOWTO (R_PPC64_ADDR16_DS,	/* type */
1059 	 0,			/* rightshift */
1060 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1061 	 16,			/* bitsize */
1062 	 FALSE,			/* pc_relative */
1063 	 0,			/* bitpos */
1064 	 complain_overflow_bitfield, /* complain_on_overflow */
1065 	 bfd_elf_generic_reloc,	/* special_function */
1066 	 "R_PPC64_ADDR16_DS",	/* name */
1067 	 FALSE,			/* partial_inplace */
1068 	 0,			/* src_mask */
1069 	 0xfffc,		/* dst_mask */
1070 	 FALSE),		/* pcrel_offset */
1071 
1072   /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field.  */
1073   HOWTO (R_PPC64_ADDR16_LO_DS,	/* type */
1074 	 0,			/* rightshift */
1075 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1076 	 16,			/* bitsize */
1077 	 FALSE,			/* pc_relative */
1078 	 0,			/* bitpos */
1079 	 complain_overflow_dont,/* complain_on_overflow */
1080 	 bfd_elf_generic_reloc,	/* special_function */
1081 	 "R_PPC64_ADDR16_LO_DS",/* name */
1082 	 FALSE,			/* partial_inplace */
1083 	 0,			/* src_mask */
1084 	 0xfffc,		/* dst_mask */
1085 	 FALSE),		/* pcrel_offset */
1086 
1087   /* Like R_PPC64_GOT16, but for instructions with a DS field.  */
1088   HOWTO (R_PPC64_GOT16_DS,	/* type */
1089 	 0,			/* rightshift */
1090 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1091 	 16,			/* bitsize */
1092 	 FALSE,			/* pc_relative */
1093 	 0,			/* bitpos */
1094 	 complain_overflow_signed, /* complain_on_overflow */
1095 	 ppc64_elf_unhandled_reloc, /* special_function */
1096 	 "R_PPC64_GOT16_DS",	/* name */
1097 	 FALSE,			/* partial_inplace */
1098 	 0,			/* src_mask */
1099 	 0xfffc,		/* dst_mask */
1100 	 FALSE),		/* pcrel_offset */
1101 
1102   /* Like R_PPC64_GOT16_LO, but for instructions with a DS field.  */
1103   HOWTO (R_PPC64_GOT16_LO_DS,	/* type */
1104 	 0,			/* rightshift */
1105 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1106 	 16,			/* bitsize */
1107 	 FALSE,			/* pc_relative */
1108 	 0,			/* bitpos */
1109 	 complain_overflow_dont, /* complain_on_overflow */
1110 	 ppc64_elf_unhandled_reloc, /* special_function */
1111 	 "R_PPC64_GOT16_LO_DS",	/* name */
1112 	 FALSE,			/* partial_inplace */
1113 	 0,			/* src_mask */
1114 	 0xfffc,		/* dst_mask */
1115 	 FALSE),		/* pcrel_offset */
1116 
1117   /* Like R_PPC64_PLT16_LO, but for instructions with a DS field.  */
1118   HOWTO (R_PPC64_PLT16_LO_DS,	/* type */
1119 	 0,			/* rightshift */
1120 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1121 	 16,			/* bitsize */
1122 	 FALSE,			/* pc_relative */
1123 	 0,			/* bitpos */
1124 	 complain_overflow_dont, /* complain_on_overflow */
1125 	 ppc64_elf_unhandled_reloc, /* special_function */
1126 	 "R_PPC64_PLT16_LO_DS",	/* name */
1127 	 FALSE,			/* partial_inplace */
1128 	 0,			/* src_mask */
1129 	 0xfffc,		/* dst_mask */
1130 	 FALSE),		/* pcrel_offset */
1131 
1132   /* Like R_PPC64_SECTOFF, but for instructions with a DS field.  */
1133   HOWTO (R_PPC64_SECTOFF_DS,	/* type */
1134 	 0,			/* rightshift */
1135 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1136 	 16,			/* bitsize */
1137 	 FALSE,			/* pc_relative */
1138 	 0,			/* bitpos */
1139 	 complain_overflow_bitfield, /* complain_on_overflow */
1140 	 ppc64_elf_sectoff_reloc, /* special_function */
1141 	 "R_PPC64_SECTOFF_DS",	/* name */
1142 	 FALSE,			/* partial_inplace */
1143 	 0,			/* src_mask */
1144 	 0xfffc,		/* dst_mask */
1145 	 FALSE),		/* pcrel_offset */
1146 
1147   /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field.  */
1148   HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
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_dont, /* complain_on_overflow */
1155 	 ppc64_elf_sectoff_reloc, /* special_function */
1156 	 "R_PPC64_SECTOFF_LO_DS",/* name */
1157 	 FALSE,			/* partial_inplace */
1158 	 0,			/* src_mask */
1159 	 0xfffc,		/* dst_mask */
1160 	 FALSE),		/* pcrel_offset */
1161 
1162   /* Like R_PPC64_TOC16, but for instructions with a DS field.  */
1163   HOWTO (R_PPC64_TOC16_DS,	/* type */
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_signed, /* complain_on_overflow */
1170 	 ppc64_elf_toc_reloc,	/* special_function */
1171 	 "R_PPC64_TOC16_DS",	/* name */
1172 	 FALSE,			/* partial_inplace */
1173 	 0,			/* src_mask */
1174 	 0xfffc,		/* dst_mask */
1175 	 FALSE),		/* pcrel_offset */
1176 
1177   /* Like R_PPC64_TOC16_LO, but for instructions with a DS field.  */
1178   HOWTO (R_PPC64_TOC16_LO_DS,	/* type */
1179 	 0,			/* 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 	 ppc64_elf_toc_reloc,	/* special_function */
1186 	 "R_PPC64_TOC16_LO_DS",	/* name */
1187 	 FALSE,			/* partial_inplace */
1188 	 0,			/* src_mask */
1189 	 0xfffc,		/* dst_mask */
1190 	 FALSE),		/* pcrel_offset */
1191 
1192   /* Like R_PPC64_PLTGOT16, but for instructions with a DS field.  */
1193   /* FIXME: R_PPC64_PLTGOT16_DS not implemented.  */
1194     HOWTO (R_PPC64_PLTGOT16_DS,	/* type */
1195 	 0,			/* rightshift */
1196 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1197 	 16,			/* bitsize */
1198 	 FALSE,			/* pc_relative */
1199 	 0,			/* bitpos */
1200 	 complain_overflow_signed, /* complain_on_overflow */
1201 	 ppc64_elf_unhandled_reloc, /* special_function */
1202 	 "R_PPC64_PLTGOT16_DS",	/* name */
1203 	 FALSE,			/* partial_inplace */
1204 	 0,			/* src_mask */
1205 	 0xfffc,		/* dst_mask */
1206 	 FALSE),		/* pcrel_offset */
1207 
1208   /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field.  */
1209   /* FIXME: R_PPC64_PLTGOT16_LO not implemented.  */
1210   HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1211 	 0,			/* rightshift */
1212 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1213 	 16,			/* bitsize */
1214 	 FALSE,			/* pc_relative */
1215 	 0,			/* bitpos */
1216 	 complain_overflow_dont, /* complain_on_overflow */
1217 	 ppc64_elf_unhandled_reloc, /* special_function */
1218 	 "R_PPC64_PLTGOT16_LO_DS",/* name */
1219 	 FALSE,			/* partial_inplace */
1220 	 0,			/* src_mask */
1221 	 0xfffc,		/* dst_mask */
1222 	 FALSE),		/* pcrel_offset */
1223 
1224   /* Marker reloc for TLS.  */
1225   HOWTO (R_PPC64_TLS,
1226 	 0,			/* rightshift */
1227 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1228 	 32,			/* bitsize */
1229 	 FALSE,			/* pc_relative */
1230 	 0,			/* bitpos */
1231 	 complain_overflow_dont, /* complain_on_overflow */
1232 	 bfd_elf_generic_reloc,	/* special_function */
1233 	 "R_PPC64_TLS",		/* name */
1234 	 FALSE,			/* partial_inplace */
1235 	 0,			/* src_mask */
1236 	 0,			/* dst_mask */
1237 	 FALSE),		/* pcrel_offset */
1238 
1239   /* Computes the load module index of the load module that contains the
1240      definition of its TLS sym.  */
1241   HOWTO (R_PPC64_DTPMOD64,
1242 	 0,			/* rightshift */
1243 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1244 	 64,			/* bitsize */
1245 	 FALSE,			/* pc_relative */
1246 	 0,			/* bitpos */
1247 	 complain_overflow_dont, /* complain_on_overflow */
1248 	 ppc64_elf_unhandled_reloc, /* special_function */
1249 	 "R_PPC64_DTPMOD64",	/* name */
1250 	 FALSE,			/* partial_inplace */
1251 	 0,			/* src_mask */
1252 	 ONES (64),		/* dst_mask */
1253 	 FALSE),		/* pcrel_offset */
1254 
1255   /* Computes a dtv-relative displacement, the difference between the value
1256      of sym+add and the base address of the thread-local storage block that
1257      contains the definition of sym, minus 0x8000.  */
1258   HOWTO (R_PPC64_DTPREL64,
1259 	 0,			/* rightshift */
1260 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1261 	 64,			/* bitsize */
1262 	 FALSE,			/* pc_relative */
1263 	 0,			/* bitpos */
1264 	 complain_overflow_dont, /* complain_on_overflow */
1265 	 ppc64_elf_unhandled_reloc, /* special_function */
1266 	 "R_PPC64_DTPREL64",	/* name */
1267 	 FALSE,			/* partial_inplace */
1268 	 0,			/* src_mask */
1269 	 ONES (64),		/* dst_mask */
1270 	 FALSE),		/* pcrel_offset */
1271 
1272   /* A 16 bit dtprel reloc.  */
1273   HOWTO (R_PPC64_DTPREL16,
1274 	 0,			/* rightshift */
1275 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1276 	 16,			/* bitsize */
1277 	 FALSE,			/* pc_relative */
1278 	 0,			/* bitpos */
1279 	 complain_overflow_signed, /* complain_on_overflow */
1280 	 ppc64_elf_unhandled_reloc, /* special_function */
1281 	 "R_PPC64_DTPREL16",	/* name */
1282 	 FALSE,			/* partial_inplace */
1283 	 0,			/* src_mask */
1284 	 0xffff,		/* dst_mask */
1285 	 FALSE),		/* pcrel_offset */
1286 
1287   /* Like DTPREL16, but no overflow.  */
1288   HOWTO (R_PPC64_DTPREL16_LO,
1289 	 0,			/* rightshift */
1290 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1291 	 16,			/* bitsize */
1292 	 FALSE,			/* pc_relative */
1293 	 0,			/* bitpos */
1294 	 complain_overflow_dont, /* complain_on_overflow */
1295 	 ppc64_elf_unhandled_reloc, /* special_function */
1296 	 "R_PPC64_DTPREL16_LO",	/* name */
1297 	 FALSE,			/* partial_inplace */
1298 	 0,			/* src_mask */
1299 	 0xffff,		/* dst_mask */
1300 	 FALSE),		/* pcrel_offset */
1301 
1302   /* Like DTPREL16_LO, but next higher group of 16 bits.  */
1303   HOWTO (R_PPC64_DTPREL16_HI,
1304 	 16,			/* rightshift */
1305 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1306 	 16,			/* bitsize */
1307 	 FALSE,			/* pc_relative */
1308 	 0,			/* bitpos */
1309 	 complain_overflow_dont, /* complain_on_overflow */
1310 	 ppc64_elf_unhandled_reloc, /* special_function */
1311 	 "R_PPC64_DTPREL16_HI",	/* name */
1312 	 FALSE,			/* partial_inplace */
1313 	 0,			/* src_mask */
1314 	 0xffff,		/* dst_mask */
1315 	 FALSE),		/* pcrel_offset */
1316 
1317   /* Like DTPREL16_HI, but adjust for low 16 bits.  */
1318   HOWTO (R_PPC64_DTPREL16_HA,
1319 	 16,			/* rightshift */
1320 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1321 	 16,			/* bitsize */
1322 	 FALSE,			/* pc_relative */
1323 	 0,			/* bitpos */
1324 	 complain_overflow_dont, /* complain_on_overflow */
1325 	 ppc64_elf_unhandled_reloc, /* special_function */
1326 	 "R_PPC64_DTPREL16_HA",	/* name */
1327 	 FALSE,			/* partial_inplace */
1328 	 0,			/* src_mask */
1329 	 0xffff,		/* dst_mask */
1330 	 FALSE),		/* pcrel_offset */
1331 
1332   /* Like DTPREL16_HI, but next higher group of 16 bits.  */
1333   HOWTO (R_PPC64_DTPREL16_HIGHER,
1334 	 32,			/* rightshift */
1335 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1336 	 16,			/* bitsize */
1337 	 FALSE,			/* pc_relative */
1338 	 0,			/* bitpos */
1339 	 complain_overflow_dont, /* complain_on_overflow */
1340 	 ppc64_elf_unhandled_reloc, /* special_function */
1341 	 "R_PPC64_DTPREL16_HIGHER", /* name */
1342 	 FALSE,			/* partial_inplace */
1343 	 0,			/* src_mask */
1344 	 0xffff,		/* dst_mask */
1345 	 FALSE),		/* pcrel_offset */
1346 
1347   /* Like DTPREL16_HIGHER, but adjust for low 16 bits.  */
1348   HOWTO (R_PPC64_DTPREL16_HIGHERA,
1349 	 32,			/* rightshift */
1350 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1351 	 16,			/* bitsize */
1352 	 FALSE,			/* pc_relative */
1353 	 0,			/* bitpos */
1354 	 complain_overflow_dont, /* complain_on_overflow */
1355 	 ppc64_elf_unhandled_reloc, /* special_function */
1356 	 "R_PPC64_DTPREL16_HIGHERA", /* name */
1357 	 FALSE,			/* partial_inplace */
1358 	 0,			/* src_mask */
1359 	 0xffff,		/* dst_mask */
1360 	 FALSE),		/* pcrel_offset */
1361 
1362   /* Like DTPREL16_HIGHER, but next higher group of 16 bits.  */
1363   HOWTO (R_PPC64_DTPREL16_HIGHEST,
1364 	 48,			/* rightshift */
1365 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1366 	 16,			/* bitsize */
1367 	 FALSE,			/* pc_relative */
1368 	 0,			/* bitpos */
1369 	 complain_overflow_dont, /* complain_on_overflow */
1370 	 ppc64_elf_unhandled_reloc, /* special_function */
1371 	 "R_PPC64_DTPREL16_HIGHEST", /* name */
1372 	 FALSE,			/* partial_inplace */
1373 	 0,			/* src_mask */
1374 	 0xffff,		/* dst_mask */
1375 	 FALSE),		/* pcrel_offset */
1376 
1377   /* Like DTPREL16_HIGHEST, but adjust for low 16 bits.  */
1378   HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1379 	 48,			/* rightshift */
1380 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1381 	 16,			/* bitsize */
1382 	 FALSE,			/* pc_relative */
1383 	 0,			/* bitpos */
1384 	 complain_overflow_dont, /* complain_on_overflow */
1385 	 ppc64_elf_unhandled_reloc, /* special_function */
1386 	 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1387 	 FALSE,			/* partial_inplace */
1388 	 0,			/* src_mask */
1389 	 0xffff,		/* dst_mask */
1390 	 FALSE),		/* pcrel_offset */
1391 
1392   /* Like DTPREL16, but for insns with a DS field.  */
1393   HOWTO (R_PPC64_DTPREL16_DS,
1394 	 0,			/* rightshift */
1395 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1396 	 16,			/* bitsize */
1397 	 FALSE,			/* pc_relative */
1398 	 0,			/* bitpos */
1399 	 complain_overflow_signed, /* complain_on_overflow */
1400 	 ppc64_elf_unhandled_reloc, /* special_function */
1401 	 "R_PPC64_DTPREL16_DS",	/* name */
1402 	 FALSE,			/* partial_inplace */
1403 	 0,			/* src_mask */
1404 	 0xfffc,		/* dst_mask */
1405 	 FALSE),		/* pcrel_offset */
1406 
1407   /* Like DTPREL16_DS, but no overflow.  */
1408   HOWTO (R_PPC64_DTPREL16_LO_DS,
1409 	 0,			/* rightshift */
1410 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1411 	 16,			/* bitsize */
1412 	 FALSE,			/* pc_relative */
1413 	 0,			/* bitpos */
1414 	 complain_overflow_dont, /* complain_on_overflow */
1415 	 ppc64_elf_unhandled_reloc, /* special_function */
1416 	 "R_PPC64_DTPREL16_LO_DS", /* name */
1417 	 FALSE,			/* partial_inplace */
1418 	 0,			/* src_mask */
1419 	 0xfffc,		/* dst_mask */
1420 	 FALSE),		/* pcrel_offset */
1421 
1422   /* Computes a tp-relative displacement, the difference between the value of
1423      sym+add and the value of the thread pointer (r13).  */
1424   HOWTO (R_PPC64_TPREL64,
1425 	 0,			/* rightshift */
1426 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1427 	 64,			/* bitsize */
1428 	 FALSE,			/* pc_relative */
1429 	 0,			/* bitpos */
1430 	 complain_overflow_dont, /* complain_on_overflow */
1431 	 ppc64_elf_unhandled_reloc, /* special_function */
1432 	 "R_PPC64_TPREL64",	/* name */
1433 	 FALSE,			/* partial_inplace */
1434 	 0,			/* src_mask */
1435 	 ONES (64),		/* dst_mask */
1436 	 FALSE),		/* pcrel_offset */
1437 
1438   /* A 16 bit tprel reloc.  */
1439   HOWTO (R_PPC64_TPREL16,
1440 	 0,			/* rightshift */
1441 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1442 	 16,			/* bitsize */
1443 	 FALSE,			/* pc_relative */
1444 	 0,			/* bitpos */
1445 	 complain_overflow_signed, /* complain_on_overflow */
1446 	 ppc64_elf_unhandled_reloc, /* special_function */
1447 	 "R_PPC64_TPREL16",	/* name */
1448 	 FALSE,			/* partial_inplace */
1449 	 0,			/* src_mask */
1450 	 0xffff,		/* dst_mask */
1451 	 FALSE),		/* pcrel_offset */
1452 
1453   /* Like TPREL16, but no overflow.  */
1454   HOWTO (R_PPC64_TPREL16_LO,
1455 	 0,			/* rightshift */
1456 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1457 	 16,			/* bitsize */
1458 	 FALSE,			/* pc_relative */
1459 	 0,			/* bitpos */
1460 	 complain_overflow_dont, /* complain_on_overflow */
1461 	 ppc64_elf_unhandled_reloc, /* special_function */
1462 	 "R_PPC64_TPREL16_LO",	/* name */
1463 	 FALSE,			/* partial_inplace */
1464 	 0,			/* src_mask */
1465 	 0xffff,		/* dst_mask */
1466 	 FALSE),		/* pcrel_offset */
1467 
1468   /* Like TPREL16_LO, but next higher group of 16 bits.  */
1469   HOWTO (R_PPC64_TPREL16_HI,
1470 	 16,			/* rightshift */
1471 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1472 	 16,			/* bitsize */
1473 	 FALSE,			/* pc_relative */
1474 	 0,			/* bitpos */
1475 	 complain_overflow_dont, /* complain_on_overflow */
1476 	 ppc64_elf_unhandled_reloc, /* special_function */
1477 	 "R_PPC64_TPREL16_HI",	/* name */
1478 	 FALSE,			/* partial_inplace */
1479 	 0,			/* src_mask */
1480 	 0xffff,		/* dst_mask */
1481 	 FALSE),		/* pcrel_offset */
1482 
1483   /* Like TPREL16_HI, but adjust for low 16 bits.  */
1484   HOWTO (R_PPC64_TPREL16_HA,
1485 	 16,			/* rightshift */
1486 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1487 	 16,			/* bitsize */
1488 	 FALSE,			/* pc_relative */
1489 	 0,			/* bitpos */
1490 	 complain_overflow_dont, /* complain_on_overflow */
1491 	 ppc64_elf_unhandled_reloc, /* special_function */
1492 	 "R_PPC64_TPREL16_HA",	/* name */
1493 	 FALSE,			/* partial_inplace */
1494 	 0,			/* src_mask */
1495 	 0xffff,		/* dst_mask */
1496 	 FALSE),		/* pcrel_offset */
1497 
1498   /* Like TPREL16_HI, but next higher group of 16 bits.  */
1499   HOWTO (R_PPC64_TPREL16_HIGHER,
1500 	 32,			/* rightshift */
1501 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1502 	 16,			/* bitsize */
1503 	 FALSE,			/* pc_relative */
1504 	 0,			/* bitpos */
1505 	 complain_overflow_dont, /* complain_on_overflow */
1506 	 ppc64_elf_unhandled_reloc, /* special_function */
1507 	 "R_PPC64_TPREL16_HIGHER",	/* name */
1508 	 FALSE,			/* partial_inplace */
1509 	 0,			/* src_mask */
1510 	 0xffff,		/* dst_mask */
1511 	 FALSE),		/* pcrel_offset */
1512 
1513   /* Like TPREL16_HIGHER, but adjust for low 16 bits.  */
1514   HOWTO (R_PPC64_TPREL16_HIGHERA,
1515 	 32,			/* rightshift */
1516 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1517 	 16,			/* bitsize */
1518 	 FALSE,			/* pc_relative */
1519 	 0,			/* bitpos */
1520 	 complain_overflow_dont, /* complain_on_overflow */
1521 	 ppc64_elf_unhandled_reloc, /* special_function */
1522 	 "R_PPC64_TPREL16_HIGHERA", /* name */
1523 	 FALSE,			/* partial_inplace */
1524 	 0,			/* src_mask */
1525 	 0xffff,		/* dst_mask */
1526 	 FALSE),		/* pcrel_offset */
1527 
1528   /* Like TPREL16_HIGHER, but next higher group of 16 bits.  */
1529   HOWTO (R_PPC64_TPREL16_HIGHEST,
1530 	 48,			/* rightshift */
1531 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1532 	 16,			/* bitsize */
1533 	 FALSE,			/* pc_relative */
1534 	 0,			/* bitpos */
1535 	 complain_overflow_dont, /* complain_on_overflow */
1536 	 ppc64_elf_unhandled_reloc, /* special_function */
1537 	 "R_PPC64_TPREL16_HIGHEST", /* name */
1538 	 FALSE,			/* partial_inplace */
1539 	 0,			/* src_mask */
1540 	 0xffff,		/* dst_mask */
1541 	 FALSE),		/* pcrel_offset */
1542 
1543   /* Like TPREL16_HIGHEST, but adjust for low 16 bits.  */
1544   HOWTO (R_PPC64_TPREL16_HIGHESTA,
1545 	 48,			/* rightshift */
1546 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1547 	 16,			/* bitsize */
1548 	 FALSE,			/* pc_relative */
1549 	 0,			/* bitpos */
1550 	 complain_overflow_dont, /* complain_on_overflow */
1551 	 ppc64_elf_unhandled_reloc, /* special_function */
1552 	 "R_PPC64_TPREL16_HIGHESTA", /* name */
1553 	 FALSE,			/* partial_inplace */
1554 	 0,			/* src_mask */
1555 	 0xffff,		/* dst_mask */
1556 	 FALSE),		/* pcrel_offset */
1557 
1558   /* Like TPREL16, but for insns with a DS field.  */
1559   HOWTO (R_PPC64_TPREL16_DS,
1560 	 0,			/* rightshift */
1561 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1562 	 16,			/* bitsize */
1563 	 FALSE,			/* pc_relative */
1564 	 0,			/* bitpos */
1565 	 complain_overflow_signed, /* complain_on_overflow */
1566 	 ppc64_elf_unhandled_reloc, /* special_function */
1567 	 "R_PPC64_TPREL16_DS",	/* name */
1568 	 FALSE,			/* partial_inplace */
1569 	 0,			/* src_mask */
1570 	 0xfffc,		/* dst_mask */
1571 	 FALSE),		/* pcrel_offset */
1572 
1573   /* Like TPREL16_DS, but no overflow.  */
1574   HOWTO (R_PPC64_TPREL16_LO_DS,
1575 	 0,			/* rightshift */
1576 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1577 	 16,			/* bitsize */
1578 	 FALSE,			/* pc_relative */
1579 	 0,			/* bitpos */
1580 	 complain_overflow_dont, /* complain_on_overflow */
1581 	 ppc64_elf_unhandled_reloc, /* special_function */
1582 	 "R_PPC64_TPREL16_LO_DS", /* name */
1583 	 FALSE,			/* partial_inplace */
1584 	 0,			/* src_mask */
1585 	 0xfffc,		/* dst_mask */
1586 	 FALSE),		/* pcrel_offset */
1587 
1588   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1589      with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1590      to the first entry relative to the TOC base (r2).  */
1591   HOWTO (R_PPC64_GOT_TLSGD16,
1592 	 0,			/* rightshift */
1593 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1594 	 16,			/* bitsize */
1595 	 FALSE,			/* pc_relative */
1596 	 0,			/* bitpos */
1597 	 complain_overflow_signed, /* complain_on_overflow */
1598 	 ppc64_elf_unhandled_reloc, /* special_function */
1599 	 "R_PPC64_GOT_TLSGD16",	/* name */
1600 	 FALSE,			/* partial_inplace */
1601 	 0,			/* src_mask */
1602 	 0xffff,		/* dst_mask */
1603 	 FALSE),		/* pcrel_offset */
1604 
1605   /* Like GOT_TLSGD16, but no overflow.  */
1606   HOWTO (R_PPC64_GOT_TLSGD16_LO,
1607 	 0,			/* rightshift */
1608 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1609 	 16,			/* bitsize */
1610 	 FALSE,			/* pc_relative */
1611 	 0,			/* bitpos */
1612 	 complain_overflow_dont, /* complain_on_overflow */
1613 	 ppc64_elf_unhandled_reloc, /* special_function */
1614 	 "R_PPC64_GOT_TLSGD16_LO", /* name */
1615 	 FALSE,			/* partial_inplace */
1616 	 0,			/* src_mask */
1617 	 0xffff,		/* dst_mask */
1618 	 FALSE),		/* pcrel_offset */
1619 
1620   /* Like GOT_TLSGD16_LO, but next higher group of 16 bits.  */
1621   HOWTO (R_PPC64_GOT_TLSGD16_HI,
1622 	 16,			/* rightshift */
1623 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1624 	 16,			/* bitsize */
1625 	 FALSE,			/* pc_relative */
1626 	 0,			/* bitpos */
1627 	 complain_overflow_dont, /* complain_on_overflow */
1628 	 ppc64_elf_unhandled_reloc, /* special_function */
1629 	 "R_PPC64_GOT_TLSGD16_HI", /* name */
1630 	 FALSE,			/* partial_inplace */
1631 	 0,			/* src_mask */
1632 	 0xffff,		/* dst_mask */
1633 	 FALSE),		/* pcrel_offset */
1634 
1635   /* Like GOT_TLSGD16_HI, but adjust for low 16 bits.  */
1636   HOWTO (R_PPC64_GOT_TLSGD16_HA,
1637 	 16,			/* rightshift */
1638 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1639 	 16,			/* bitsize */
1640 	 FALSE,			/* pc_relative */
1641 	 0,			/* bitpos */
1642 	 complain_overflow_dont, /* complain_on_overflow */
1643 	 ppc64_elf_unhandled_reloc, /* special_function */
1644 	 "R_PPC64_GOT_TLSGD16_HA", /* name */
1645 	 FALSE,			/* partial_inplace */
1646 	 0,			/* src_mask */
1647 	 0xffff,		/* dst_mask */
1648 	 FALSE),		/* pcrel_offset */
1649 
1650   /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1651      with values (sym+add)@dtpmod and zero, and computes the offset to the
1652      first entry relative to the TOC base (r2).  */
1653   HOWTO (R_PPC64_GOT_TLSLD16,
1654 	 0,			/* rightshift */
1655 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1656 	 16,			/* bitsize */
1657 	 FALSE,			/* pc_relative */
1658 	 0,			/* bitpos */
1659 	 complain_overflow_signed, /* complain_on_overflow */
1660 	 ppc64_elf_unhandled_reloc, /* special_function */
1661 	 "R_PPC64_GOT_TLSLD16",	/* name */
1662 	 FALSE,			/* partial_inplace */
1663 	 0,			/* src_mask */
1664 	 0xffff,		/* dst_mask */
1665 	 FALSE),		/* pcrel_offset */
1666 
1667   /* Like GOT_TLSLD16, but no overflow.  */
1668   HOWTO (R_PPC64_GOT_TLSLD16_LO,
1669 	 0,			/* rightshift */
1670 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1671 	 16,			/* bitsize */
1672 	 FALSE,			/* pc_relative */
1673 	 0,			/* bitpos */
1674 	 complain_overflow_dont, /* complain_on_overflow */
1675 	 ppc64_elf_unhandled_reloc, /* special_function */
1676 	 "R_PPC64_GOT_TLSLD16_LO", /* name */
1677 	 FALSE,			/* partial_inplace */
1678 	 0,			/* src_mask */
1679 	 0xffff,		/* dst_mask */
1680 	 FALSE),		/* pcrel_offset */
1681 
1682   /* Like GOT_TLSLD16_LO, but next higher group of 16 bits.  */
1683   HOWTO (R_PPC64_GOT_TLSLD16_HI,
1684 	 16,			/* rightshift */
1685 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1686 	 16,			/* bitsize */
1687 	 FALSE,			/* pc_relative */
1688 	 0,			/* bitpos */
1689 	 complain_overflow_dont, /* complain_on_overflow */
1690 	 ppc64_elf_unhandled_reloc, /* special_function */
1691 	 "R_PPC64_GOT_TLSLD16_HI", /* name */
1692 	 FALSE,			/* partial_inplace */
1693 	 0,			/* src_mask */
1694 	 0xffff,		/* dst_mask */
1695 	 FALSE),		/* pcrel_offset */
1696 
1697   /* Like GOT_TLSLD16_HI, but adjust for low 16 bits.  */
1698   HOWTO (R_PPC64_GOT_TLSLD16_HA,
1699 	 16,			/* rightshift */
1700 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1701 	 16,			/* bitsize */
1702 	 FALSE,			/* pc_relative */
1703 	 0,			/* bitpos */
1704 	 complain_overflow_dont, /* complain_on_overflow */
1705 	 ppc64_elf_unhandled_reloc, /* special_function */
1706 	 "R_PPC64_GOT_TLSLD16_HA", /* name */
1707 	 FALSE,			/* partial_inplace */
1708 	 0,			/* src_mask */
1709 	 0xffff,		/* dst_mask */
1710 	 FALSE),		/* pcrel_offset */
1711 
1712   /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1713      the offset to the entry relative to the TOC base (r2).  */
1714   HOWTO (R_PPC64_GOT_DTPREL16_DS,
1715 	 0,			/* rightshift */
1716 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1717 	 16,			/* bitsize */
1718 	 FALSE,			/* pc_relative */
1719 	 0,			/* bitpos */
1720 	 complain_overflow_signed, /* complain_on_overflow */
1721 	 ppc64_elf_unhandled_reloc, /* special_function */
1722 	 "R_PPC64_GOT_DTPREL16_DS", /* name */
1723 	 FALSE,			/* partial_inplace */
1724 	 0,			/* src_mask */
1725 	 0xfffc,		/* dst_mask */
1726 	 FALSE),		/* pcrel_offset */
1727 
1728   /* Like GOT_DTPREL16_DS, but no overflow.  */
1729   HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1730 	 0,			/* rightshift */
1731 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1732 	 16,			/* bitsize */
1733 	 FALSE,			/* pc_relative */
1734 	 0,			/* bitpos */
1735 	 complain_overflow_dont, /* complain_on_overflow */
1736 	 ppc64_elf_unhandled_reloc, /* special_function */
1737 	 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1738 	 FALSE,			/* partial_inplace */
1739 	 0,			/* src_mask */
1740 	 0xfffc,		/* dst_mask */
1741 	 FALSE),		/* pcrel_offset */
1742 
1743   /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits.  */
1744   HOWTO (R_PPC64_GOT_DTPREL16_HI,
1745 	 16,			/* rightshift */
1746 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1747 	 16,			/* bitsize */
1748 	 FALSE,			/* pc_relative */
1749 	 0,			/* bitpos */
1750 	 complain_overflow_dont, /* complain_on_overflow */
1751 	 ppc64_elf_unhandled_reloc, /* special_function */
1752 	 "R_PPC64_GOT_DTPREL16_HI", /* name */
1753 	 FALSE,			/* partial_inplace */
1754 	 0,			/* src_mask */
1755 	 0xffff,		/* dst_mask */
1756 	 FALSE),		/* pcrel_offset */
1757 
1758   /* Like GOT_DTPREL16_HI, but adjust for low 16 bits.  */
1759   HOWTO (R_PPC64_GOT_DTPREL16_HA,
1760 	 16,			/* rightshift */
1761 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1762 	 16,			/* bitsize */
1763 	 FALSE,			/* pc_relative */
1764 	 0,			/* bitpos */
1765 	 complain_overflow_dont, /* complain_on_overflow */
1766 	 ppc64_elf_unhandled_reloc, /* special_function */
1767 	 "R_PPC64_GOT_DTPREL16_HA", /* name */
1768 	 FALSE,			/* partial_inplace */
1769 	 0,			/* src_mask */
1770 	 0xffff,		/* dst_mask */
1771 	 FALSE),		/* pcrel_offset */
1772 
1773   /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1774      offset to the entry relative to the TOC base (r2).  */
1775   HOWTO (R_PPC64_GOT_TPREL16_DS,
1776 	 0,			/* rightshift */
1777 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1778 	 16,			/* bitsize */
1779 	 FALSE,			/* pc_relative */
1780 	 0,			/* bitpos */
1781 	 complain_overflow_signed, /* complain_on_overflow */
1782 	 ppc64_elf_unhandled_reloc, /* special_function */
1783 	 "R_PPC64_GOT_TPREL16_DS", /* name */
1784 	 FALSE,			/* partial_inplace */
1785 	 0,			/* src_mask */
1786 	 0xfffc,		/* dst_mask */
1787 	 FALSE),		/* pcrel_offset */
1788 
1789   /* Like GOT_TPREL16_DS, but no overflow.  */
1790   HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1791 	 0,			/* rightshift */
1792 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1793 	 16,			/* bitsize */
1794 	 FALSE,			/* pc_relative */
1795 	 0,			/* bitpos */
1796 	 complain_overflow_dont, /* complain_on_overflow */
1797 	 ppc64_elf_unhandled_reloc, /* special_function */
1798 	 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1799 	 FALSE,			/* partial_inplace */
1800 	 0,			/* src_mask */
1801 	 0xfffc,		/* dst_mask */
1802 	 FALSE),		/* pcrel_offset */
1803 
1804   /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits.  */
1805   HOWTO (R_PPC64_GOT_TPREL16_HI,
1806 	 16,			/* rightshift */
1807 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1808 	 16,			/* bitsize */
1809 	 FALSE,			/* pc_relative */
1810 	 0,			/* bitpos */
1811 	 complain_overflow_dont, /* complain_on_overflow */
1812 	 ppc64_elf_unhandled_reloc, /* special_function */
1813 	 "R_PPC64_GOT_TPREL16_HI", /* name */
1814 	 FALSE,			/* partial_inplace */
1815 	 0,			/* src_mask */
1816 	 0xffff,		/* dst_mask */
1817 	 FALSE),		/* pcrel_offset */
1818 
1819   /* Like GOT_TPREL16_HI, but adjust for low 16 bits.  */
1820   HOWTO (R_PPC64_GOT_TPREL16_HA,
1821 	 16,			/* rightshift */
1822 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1823 	 16,			/* bitsize */
1824 	 FALSE,			/* pc_relative */
1825 	 0,			/* bitpos */
1826 	 complain_overflow_dont, /* complain_on_overflow */
1827 	 ppc64_elf_unhandled_reloc, /* special_function */
1828 	 "R_PPC64_GOT_TPREL16_HA", /* name */
1829 	 FALSE,			/* partial_inplace */
1830 	 0,			/* src_mask */
1831 	 0xffff,		/* dst_mask */
1832 	 FALSE),		/* pcrel_offset */
1833 
1834   /* GNU extension to record C++ vtable hierarchy.  */
1835   HOWTO (R_PPC64_GNU_VTINHERIT,	/* type */
1836 	 0,			/* rightshift */
1837 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1838 	 0,			/* bitsize */
1839 	 FALSE,			/* pc_relative */
1840 	 0,			/* bitpos */
1841 	 complain_overflow_dont, /* complain_on_overflow */
1842 	 NULL,			/* special_function */
1843 	 "R_PPC64_GNU_VTINHERIT", /* name */
1844 	 FALSE,			/* partial_inplace */
1845 	 0,			/* src_mask */
1846 	 0,			/* dst_mask */
1847 	 FALSE),		/* pcrel_offset */
1848 
1849   /* GNU extension to record C++ vtable member usage.  */
1850   HOWTO (R_PPC64_GNU_VTENTRY,	/* type */
1851 	 0,			/* rightshift */
1852 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
1853 	 0,			/* bitsize */
1854 	 FALSE,			/* pc_relative */
1855 	 0,			/* bitpos */
1856 	 complain_overflow_dont, /* complain_on_overflow */
1857 	 NULL,			/* special_function */
1858 	 "R_PPC64_GNU_VTENTRY",	/* name */
1859 	 FALSE,			/* partial_inplace */
1860 	 0,			/* src_mask */
1861 	 0,			/* dst_mask */
1862 	 FALSE),		/* pcrel_offset */
1863 };
1864 
1865 
1866 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
1867    be done.  */
1868 
1869 static void
ppc_howto_init(void)1870 ppc_howto_init (void)
1871 {
1872   unsigned int i, type;
1873 
1874   for (i = 0;
1875        i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1876        i++)
1877     {
1878       type = ppc64_elf_howto_raw[i].type;
1879       BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1880 			  / sizeof (ppc64_elf_howto_table[0])));
1881       ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1882     }
1883 }
1884 
1885 static reloc_howto_type *
ppc64_elf_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)1886 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1887 			     bfd_reloc_code_real_type code)
1888 {
1889   enum elf_ppc64_reloc_type r = R_PPC64_NONE;
1890 
1891   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1892     /* Initialize howto table if needed.  */
1893     ppc_howto_init ();
1894 
1895   switch (code)
1896     {
1897     default:
1898       return NULL;
1899 
1900     case BFD_RELOC_NONE:			r = R_PPC64_NONE;
1901       break;
1902     case BFD_RELOC_32:				r = R_PPC64_ADDR32;
1903       break;
1904     case BFD_RELOC_PPC_BA26:			r = R_PPC64_ADDR24;
1905       break;
1906     case BFD_RELOC_16:				r = R_PPC64_ADDR16;
1907       break;
1908     case BFD_RELOC_LO16:			r = R_PPC64_ADDR16_LO;
1909       break;
1910     case BFD_RELOC_HI16:			r = R_PPC64_ADDR16_HI;
1911       break;
1912     case BFD_RELOC_HI16_S:			r = R_PPC64_ADDR16_HA;
1913       break;
1914     case BFD_RELOC_PPC_BA16:			r = R_PPC64_ADDR14;
1915       break;
1916     case BFD_RELOC_PPC_BA16_BRTAKEN:		r = R_PPC64_ADDR14_BRTAKEN;
1917       break;
1918     case BFD_RELOC_PPC_BA16_BRNTAKEN:		r = R_PPC64_ADDR14_BRNTAKEN;
1919       break;
1920     case BFD_RELOC_PPC_B26:			r = R_PPC64_REL24;
1921       break;
1922     case BFD_RELOC_PPC_B16:			r = R_PPC64_REL14;
1923       break;
1924     case BFD_RELOC_PPC_B16_BRTAKEN:		r = R_PPC64_REL14_BRTAKEN;
1925       break;
1926     case BFD_RELOC_PPC_B16_BRNTAKEN:		r = R_PPC64_REL14_BRNTAKEN;
1927       break;
1928     case BFD_RELOC_16_GOTOFF:			r = R_PPC64_GOT16;
1929       break;
1930     case BFD_RELOC_LO16_GOTOFF:			r = R_PPC64_GOT16_LO;
1931       break;
1932     case BFD_RELOC_HI16_GOTOFF:			r = R_PPC64_GOT16_HI;
1933       break;
1934     case BFD_RELOC_HI16_S_GOTOFF:		r = R_PPC64_GOT16_HA;
1935       break;
1936     case BFD_RELOC_PPC_COPY:			r = R_PPC64_COPY;
1937       break;
1938     case BFD_RELOC_PPC_GLOB_DAT:		r = R_PPC64_GLOB_DAT;
1939       break;
1940     case BFD_RELOC_32_PCREL:			r = R_PPC64_REL32;
1941       break;
1942     case BFD_RELOC_32_PLTOFF:			r = R_PPC64_PLT32;
1943       break;
1944     case BFD_RELOC_32_PLT_PCREL:		r = R_PPC64_PLTREL32;
1945       break;
1946     case BFD_RELOC_LO16_PLTOFF:			r = R_PPC64_PLT16_LO;
1947       break;
1948     case BFD_RELOC_HI16_PLTOFF:			r = R_PPC64_PLT16_HI;
1949       break;
1950     case BFD_RELOC_HI16_S_PLTOFF:		r = R_PPC64_PLT16_HA;
1951       break;
1952     case BFD_RELOC_16_BASEREL:			r = R_PPC64_SECTOFF;
1953       break;
1954     case BFD_RELOC_LO16_BASEREL:		r = R_PPC64_SECTOFF_LO;
1955       break;
1956     case BFD_RELOC_HI16_BASEREL:		r = R_PPC64_SECTOFF_HI;
1957       break;
1958     case BFD_RELOC_HI16_S_BASEREL:		r = R_PPC64_SECTOFF_HA;
1959       break;
1960     case BFD_RELOC_CTOR:			r = R_PPC64_ADDR64;
1961       break;
1962     case BFD_RELOC_64:				r = R_PPC64_ADDR64;
1963       break;
1964     case BFD_RELOC_PPC64_HIGHER:		r = R_PPC64_ADDR16_HIGHER;
1965       break;
1966     case BFD_RELOC_PPC64_HIGHER_S:		r = R_PPC64_ADDR16_HIGHERA;
1967       break;
1968     case BFD_RELOC_PPC64_HIGHEST:		r = R_PPC64_ADDR16_HIGHEST;
1969       break;
1970     case BFD_RELOC_PPC64_HIGHEST_S:		r = R_PPC64_ADDR16_HIGHESTA;
1971       break;
1972     case BFD_RELOC_64_PCREL:			r = R_PPC64_REL64;
1973       break;
1974     case BFD_RELOC_64_PLTOFF:			r = R_PPC64_PLT64;
1975       break;
1976     case BFD_RELOC_64_PLT_PCREL:		r = R_PPC64_PLTREL64;
1977       break;
1978     case BFD_RELOC_PPC_TOC16:			r = R_PPC64_TOC16;
1979       break;
1980     case BFD_RELOC_PPC64_TOC16_LO:		r = R_PPC64_TOC16_LO;
1981       break;
1982     case BFD_RELOC_PPC64_TOC16_HI:		r = R_PPC64_TOC16_HI;
1983       break;
1984     case BFD_RELOC_PPC64_TOC16_HA:		r = R_PPC64_TOC16_HA;
1985       break;
1986     case BFD_RELOC_PPC64_TOC:			r = R_PPC64_TOC;
1987       break;
1988     case BFD_RELOC_PPC64_PLTGOT16:		r = R_PPC64_PLTGOT16;
1989       break;
1990     case BFD_RELOC_PPC64_PLTGOT16_LO:		r = R_PPC64_PLTGOT16_LO;
1991       break;
1992     case BFD_RELOC_PPC64_PLTGOT16_HI:		r = R_PPC64_PLTGOT16_HI;
1993       break;
1994     case BFD_RELOC_PPC64_PLTGOT16_HA:		r = R_PPC64_PLTGOT16_HA;
1995       break;
1996     case BFD_RELOC_PPC64_ADDR16_DS:		r = R_PPC64_ADDR16_DS;
1997       break;
1998     case BFD_RELOC_PPC64_ADDR16_LO_DS:		r = R_PPC64_ADDR16_LO_DS;
1999       break;
2000     case BFD_RELOC_PPC64_GOT16_DS:		r = R_PPC64_GOT16_DS;
2001       break;
2002     case BFD_RELOC_PPC64_GOT16_LO_DS:		r = R_PPC64_GOT16_LO_DS;
2003       break;
2004     case BFD_RELOC_PPC64_PLT16_LO_DS:		r = R_PPC64_PLT16_LO_DS;
2005       break;
2006     case BFD_RELOC_PPC64_SECTOFF_DS:		r = R_PPC64_SECTOFF_DS;
2007       break;
2008     case BFD_RELOC_PPC64_SECTOFF_LO_DS:		r = R_PPC64_SECTOFF_LO_DS;
2009       break;
2010     case BFD_RELOC_PPC64_TOC16_DS:		r = R_PPC64_TOC16_DS;
2011       break;
2012     case BFD_RELOC_PPC64_TOC16_LO_DS:		r = R_PPC64_TOC16_LO_DS;
2013       break;
2014     case BFD_RELOC_PPC64_PLTGOT16_DS:		r = R_PPC64_PLTGOT16_DS;
2015       break;
2016     case BFD_RELOC_PPC64_PLTGOT16_LO_DS:	r = R_PPC64_PLTGOT16_LO_DS;
2017       break;
2018     case BFD_RELOC_PPC_TLS:			r = R_PPC64_TLS;
2019       break;
2020     case BFD_RELOC_PPC_DTPMOD:			r = R_PPC64_DTPMOD64;
2021       break;
2022     case BFD_RELOC_PPC_TPREL16:			r = R_PPC64_TPREL16;
2023       break;
2024     case BFD_RELOC_PPC_TPREL16_LO:		r = R_PPC64_TPREL16_LO;
2025       break;
2026     case BFD_RELOC_PPC_TPREL16_HI:		r = R_PPC64_TPREL16_HI;
2027       break;
2028     case BFD_RELOC_PPC_TPREL16_HA:		r = R_PPC64_TPREL16_HA;
2029       break;
2030     case BFD_RELOC_PPC_TPREL:			r = R_PPC64_TPREL64;
2031       break;
2032     case BFD_RELOC_PPC_DTPREL16:		r = R_PPC64_DTPREL16;
2033       break;
2034     case BFD_RELOC_PPC_DTPREL16_LO:		r = R_PPC64_DTPREL16_LO;
2035       break;
2036     case BFD_RELOC_PPC_DTPREL16_HI:		r = R_PPC64_DTPREL16_HI;
2037       break;
2038     case BFD_RELOC_PPC_DTPREL16_HA:		r = R_PPC64_DTPREL16_HA;
2039       break;
2040     case BFD_RELOC_PPC_DTPREL:			r = R_PPC64_DTPREL64;
2041       break;
2042     case BFD_RELOC_PPC_GOT_TLSGD16:		r = R_PPC64_GOT_TLSGD16;
2043       break;
2044     case BFD_RELOC_PPC_GOT_TLSGD16_LO:		r = R_PPC64_GOT_TLSGD16_LO;
2045       break;
2046     case BFD_RELOC_PPC_GOT_TLSGD16_HI:		r = R_PPC64_GOT_TLSGD16_HI;
2047       break;
2048     case BFD_RELOC_PPC_GOT_TLSGD16_HA:		r = R_PPC64_GOT_TLSGD16_HA;
2049       break;
2050     case BFD_RELOC_PPC_GOT_TLSLD16:		r = R_PPC64_GOT_TLSLD16;
2051       break;
2052     case BFD_RELOC_PPC_GOT_TLSLD16_LO:		r = R_PPC64_GOT_TLSLD16_LO;
2053       break;
2054     case BFD_RELOC_PPC_GOT_TLSLD16_HI:		r = R_PPC64_GOT_TLSLD16_HI;
2055       break;
2056     case BFD_RELOC_PPC_GOT_TLSLD16_HA:		r = R_PPC64_GOT_TLSLD16_HA;
2057       break;
2058     case BFD_RELOC_PPC_GOT_TPREL16:		r = R_PPC64_GOT_TPREL16_DS;
2059       break;
2060     case BFD_RELOC_PPC_GOT_TPREL16_LO:		r = R_PPC64_GOT_TPREL16_LO_DS;
2061       break;
2062     case BFD_RELOC_PPC_GOT_TPREL16_HI:		r = R_PPC64_GOT_TPREL16_HI;
2063       break;
2064     case BFD_RELOC_PPC_GOT_TPREL16_HA:		r = R_PPC64_GOT_TPREL16_HA;
2065       break;
2066     case BFD_RELOC_PPC_GOT_DTPREL16:		r = R_PPC64_GOT_DTPREL16_DS;
2067       break;
2068     case BFD_RELOC_PPC_GOT_DTPREL16_LO:		r = R_PPC64_GOT_DTPREL16_LO_DS;
2069       break;
2070     case BFD_RELOC_PPC_GOT_DTPREL16_HI:		r = R_PPC64_GOT_DTPREL16_HI;
2071       break;
2072     case BFD_RELOC_PPC_GOT_DTPREL16_HA:		r = R_PPC64_GOT_DTPREL16_HA;
2073       break;
2074     case BFD_RELOC_PPC64_TPREL16_DS:		r = R_PPC64_TPREL16_DS;
2075       break;
2076     case BFD_RELOC_PPC64_TPREL16_LO_DS:		r = R_PPC64_TPREL16_LO_DS;
2077       break;
2078     case BFD_RELOC_PPC64_TPREL16_HIGHER:	r = R_PPC64_TPREL16_HIGHER;
2079       break;
2080     case BFD_RELOC_PPC64_TPREL16_HIGHERA:	r = R_PPC64_TPREL16_HIGHERA;
2081       break;
2082     case BFD_RELOC_PPC64_TPREL16_HIGHEST:	r = R_PPC64_TPREL16_HIGHEST;
2083       break;
2084     case BFD_RELOC_PPC64_TPREL16_HIGHESTA:	r = R_PPC64_TPREL16_HIGHESTA;
2085       break;
2086     case BFD_RELOC_PPC64_DTPREL16_DS:		r = R_PPC64_DTPREL16_DS;
2087       break;
2088     case BFD_RELOC_PPC64_DTPREL16_LO_DS:	r = R_PPC64_DTPREL16_LO_DS;
2089       break;
2090     case BFD_RELOC_PPC64_DTPREL16_HIGHER:	r = R_PPC64_DTPREL16_HIGHER;
2091       break;
2092     case BFD_RELOC_PPC64_DTPREL16_HIGHERA:	r = R_PPC64_DTPREL16_HIGHERA;
2093       break;
2094     case BFD_RELOC_PPC64_DTPREL16_HIGHEST:	r = R_PPC64_DTPREL16_HIGHEST;
2095       break;
2096     case BFD_RELOC_PPC64_DTPREL16_HIGHESTA:	r = R_PPC64_DTPREL16_HIGHESTA;
2097       break;
2098     case BFD_RELOC_VTABLE_INHERIT:		r = R_PPC64_GNU_VTINHERIT;
2099       break;
2100     case BFD_RELOC_VTABLE_ENTRY:		r = R_PPC64_GNU_VTENTRY;
2101       break;
2102     }
2103 
2104   return ppc64_elf_howto_table[r];
2105 };
2106 
2107 /* Set the howto pointer for a PowerPC ELF reloc.  */
2108 
2109 static void
ppc64_elf_info_to_howto(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr,Elf_Internal_Rela * dst)2110 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2111 			 Elf_Internal_Rela *dst)
2112 {
2113   unsigned int type;
2114 
2115   /* Initialize howto table if needed.  */
2116   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2117     ppc_howto_init ();
2118 
2119   type = ELF64_R_TYPE (dst->r_info);
2120   if (type >= (sizeof (ppc64_elf_howto_table)
2121 	       / sizeof (ppc64_elf_howto_table[0])))
2122     {
2123       (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2124 			     abfd, (int) type);
2125       type = R_PPC64_NONE;
2126     }
2127   cache_ptr->howto = ppc64_elf_howto_table[type];
2128 }
2129 
2130 /* Handle the R_PPC64_ADDR16_HA and similar relocs.  */
2131 
2132 static bfd_reloc_status_type
ppc64_elf_ha_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2133 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2134 		    void *data, asection *input_section,
2135 		    bfd *output_bfd, char **error_message)
2136 {
2137   /* If this is a relocatable link (output_bfd test tells us), just
2138      call the generic function.  Any adjustment will be done at final
2139      link time.  */
2140   if (output_bfd != NULL)
2141     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2142 				  input_section, output_bfd, error_message);
2143 
2144   /* Adjust the addend for sign extension of the low 16 bits.
2145      We won't actually be using the low 16 bits, so trashing them
2146      doesn't matter.  */
2147   reloc_entry->addend += 0x8000;
2148   return bfd_reloc_continue;
2149 }
2150 
2151 static bfd_reloc_status_type
ppc64_elf_branch_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2152 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2153 			void *data, asection *input_section,
2154 			bfd *output_bfd, char **error_message)
2155 {
2156   if (output_bfd != NULL)
2157     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2158 				  input_section, output_bfd, error_message);
2159 
2160   if (strcmp (symbol->section->name, ".opd") == 0
2161       && (symbol->section->owner->flags & DYNAMIC) == 0)
2162     {
2163       bfd_vma dest = opd_entry_value (symbol->section,
2164 				      symbol->value + reloc_entry->addend,
2165 				      NULL, NULL);
2166       if (dest != (bfd_vma) -1)
2167 	reloc_entry->addend = dest - (symbol->value
2168 				      + symbol->section->output_section->vma
2169 				      + symbol->section->output_offset);
2170     }
2171   return bfd_reloc_continue;
2172 }
2173 
2174 static bfd_reloc_status_type
ppc64_elf_brtaken_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2175 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2176 			 void *data, asection *input_section,
2177 			 bfd *output_bfd, char **error_message)
2178 {
2179   long insn;
2180   enum elf_ppc64_reloc_type r_type;
2181   bfd_size_type octets;
2182   /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
2183   bfd_boolean is_power4 = FALSE;
2184 
2185   /* If this is a relocatable link (output_bfd test tells us), just
2186      call the generic function.  Any adjustment will be done at final
2187      link time.  */
2188   if (output_bfd != NULL)
2189     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2190 				  input_section, output_bfd, error_message);
2191 
2192   octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2193   insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2194   insn &= ~(0x01 << 21);
2195   r_type = reloc_entry->howto->type;
2196   if (r_type == R_PPC64_ADDR14_BRTAKEN
2197       || r_type == R_PPC64_REL14_BRTAKEN)
2198     insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
2199 
2200   if (is_power4)
2201     {
2202       /* Set 'a' bit.  This is 0b00010 in BO field for branch
2203 	 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2204 	 for branch on CTR insns (BO == 1a00t or 1a01t).  */
2205       if ((insn & (0x14 << 21)) == (0x04 << 21))
2206 	insn |= 0x02 << 21;
2207       else if ((insn & (0x14 << 21)) == (0x10 << 21))
2208 	insn |= 0x08 << 21;
2209       else
2210 	goto out;
2211     }
2212   else
2213     {
2214       bfd_vma target = 0;
2215       bfd_vma from;
2216 
2217       if (!bfd_is_com_section (symbol->section))
2218 	target = symbol->value;
2219       target += symbol->section->output_section->vma;
2220       target += symbol->section->output_offset;
2221       target += reloc_entry->addend;
2222 
2223       from = (reloc_entry->address
2224 	      + input_section->output_offset
2225 	      + input_section->output_section->vma);
2226 
2227       /* Invert 'y' bit if not the default.  */
2228       if ((bfd_signed_vma) (target - from) < 0)
2229 	insn ^= 0x01 << 21;
2230     }
2231   bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2232  out:
2233   return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2234 				 input_section, output_bfd, error_message);
2235 }
2236 
2237 static bfd_reloc_status_type
ppc64_elf_sectoff_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2238 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2239 			 void *data, asection *input_section,
2240 			 bfd *output_bfd, char **error_message)
2241 {
2242   /* If this is a relocatable link (output_bfd test tells us), just
2243      call the generic function.  Any adjustment will be done at final
2244      link time.  */
2245   if (output_bfd != NULL)
2246     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2247 				  input_section, output_bfd, error_message);
2248 
2249   /* Subtract the symbol section base address.  */
2250   reloc_entry->addend -= symbol->section->output_section->vma;
2251   return bfd_reloc_continue;
2252 }
2253 
2254 static bfd_reloc_status_type
ppc64_elf_sectoff_ha_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2255 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2256 			    void *data, asection *input_section,
2257 			    bfd *output_bfd, char **error_message)
2258 {
2259   /* If this is a relocatable link (output_bfd test tells us), just
2260      call the generic function.  Any adjustment will be done at final
2261      link time.  */
2262   if (output_bfd != NULL)
2263     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2264 				  input_section, output_bfd, error_message);
2265 
2266   /* Subtract the symbol section base address.  */
2267   reloc_entry->addend -= symbol->section->output_section->vma;
2268 
2269   /* Adjust the addend for sign extension of the low 16 bits.  */
2270   reloc_entry->addend += 0x8000;
2271   return bfd_reloc_continue;
2272 }
2273 
2274 static bfd_reloc_status_type
ppc64_elf_toc_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2275 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2276 		     void *data, asection *input_section,
2277 		     bfd *output_bfd, char **error_message)
2278 {
2279   bfd_vma TOCstart;
2280 
2281   /* If this is a relocatable link (output_bfd test tells us), just
2282      call the generic function.  Any adjustment will be done at final
2283      link time.  */
2284   if (output_bfd != NULL)
2285     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2286 				  input_section, output_bfd, error_message);
2287 
2288   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2289   if (TOCstart == 0)
2290     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2291 
2292   /* Subtract the TOC base address.  */
2293   reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2294   return bfd_reloc_continue;
2295 }
2296 
2297 static bfd_reloc_status_type
ppc64_elf_toc_ha_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2298 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2299 			void *data, asection *input_section,
2300 			bfd *output_bfd, char **error_message)
2301 {
2302   bfd_vma TOCstart;
2303 
2304   /* If this is a relocatable link (output_bfd test tells us), just
2305      call the generic function.  Any adjustment will be done at final
2306      link time.  */
2307   if (output_bfd != NULL)
2308     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2309 				  input_section, output_bfd, error_message);
2310 
2311   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2312   if (TOCstart == 0)
2313     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2314 
2315   /* Subtract the TOC base address.  */
2316   reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2317 
2318   /* Adjust the addend for sign extension of the low 16 bits.  */
2319   reloc_entry->addend += 0x8000;
2320   return bfd_reloc_continue;
2321 }
2322 
2323 static bfd_reloc_status_type
ppc64_elf_toc64_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2324 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2325 		       void *data, asection *input_section,
2326 		       bfd *output_bfd, char **error_message)
2327 {
2328   bfd_vma TOCstart;
2329   bfd_size_type octets;
2330 
2331   /* If this is a relocatable link (output_bfd test tells us), just
2332      call the generic function.  Any adjustment will be done at final
2333      link time.  */
2334   if (output_bfd != NULL)
2335     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2336 				  input_section, output_bfd, error_message);
2337 
2338   TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2339   if (TOCstart == 0)
2340     TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2341 
2342   octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2343   bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2344   return bfd_reloc_ok;
2345 }
2346 
2347 static bfd_reloc_status_type
ppc64_elf_unhandled_reloc(bfd * abfd,arelent * reloc_entry,asymbol * symbol,void * data,asection * input_section,bfd * output_bfd,char ** error_message)2348 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2349 			   void *data, asection *input_section,
2350 			   bfd *output_bfd, char **error_message)
2351 {
2352   /* If this is a relocatable link (output_bfd test tells us), just
2353      call the generic function.  Any adjustment will be done at final
2354      link time.  */
2355   if (output_bfd != NULL)
2356     return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2357 				  input_section, output_bfd, error_message);
2358 
2359   if (error_message != NULL)
2360     {
2361       static char buf[60];
2362       sprintf (buf, "generic linker can't handle %s",
2363 	       reloc_entry->howto->name);
2364       *error_message = buf;
2365     }
2366   return bfd_reloc_dangerous;
2367 }
2368 
2369 struct ppc64_elf_obj_tdata
2370 {
2371   struct elf_obj_tdata elf;
2372 
2373   /* Shortcuts to dynamic linker sections.  */
2374   asection *got;
2375   asection *relgot;
2376 
2377   union {
2378     /* Used during garbage collection.  We attach global symbols defined
2379        on removed .opd entries to this section so that the sym is removed.  */
2380     asection *deleted_section;
2381 
2382     /* Used when adding symbols.  */
2383     bfd_boolean has_dotsym;
2384   } u;
2385 
2386   /* TLS local dynamic got entry handling.  Suppose for multiple GOT
2387      sections means we potentially need one of these for each input bfd.  */
2388   union {
2389     bfd_signed_vma refcount;
2390     bfd_vma offset;
2391   } tlsld_got;
2392 
2393   /* A copy of relocs before they are modified for --emit-relocs.  */
2394   Elf_Internal_Rela *opd_relocs;
2395 };
2396 
2397 #define ppc64_elf_tdata(bfd) \
2398   ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2399 
2400 #define ppc64_tlsld_got(bfd) \
2401   (&ppc64_elf_tdata (bfd)->tlsld_got)
2402 
2403 /* Override the generic function because we store some extras.  */
2404 
2405 static bfd_boolean
ppc64_elf_mkobject(bfd * abfd)2406 ppc64_elf_mkobject (bfd *abfd)
2407 {
2408   bfd_size_type amt = sizeof (struct ppc64_elf_obj_tdata);
2409   abfd->tdata.any = bfd_zalloc (abfd, amt);
2410   if (abfd->tdata.any == NULL)
2411     return FALSE;
2412   return TRUE;
2413 }
2414 
2415 /* Return 1 if target is one of ours.  */
2416 
2417 static bfd_boolean
is_ppc64_elf_target(const struct bfd_target * targ)2418 is_ppc64_elf_target (const struct bfd_target *targ)
2419 {
2420   extern const bfd_target bfd_elf64_powerpc_vec;
2421   extern const bfd_target bfd_elf64_powerpcle_vec;
2422 
2423   return targ == &bfd_elf64_powerpc_vec || targ == &bfd_elf64_powerpcle_vec;
2424 }
2425 
2426 /* Fix bad default arch selected for a 64 bit input bfd when the
2427    default is 32 bit.  */
2428 
2429 static bfd_boolean
ppc64_elf_object_p(bfd * abfd)2430 ppc64_elf_object_p (bfd *abfd)
2431 {
2432   if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2433     {
2434       Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2435 
2436       if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2437 	{
2438 	  /* Relies on arch after 32 bit default being 64 bit default.  */
2439 	  abfd->arch_info = abfd->arch_info->next;
2440 	  BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2441 	}
2442     }
2443   return TRUE;
2444 }
2445 
2446 /* Support for core dump NOTE sections.  */
2447 
2448 static bfd_boolean
ppc64_elf_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)2449 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2450 {
2451   size_t offset, size;
2452 
2453   if (note->descsz != 504)
2454     return FALSE;
2455 
2456   /* pr_cursig */
2457   elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2458 
2459   /* pr_pid */
2460   elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2461 
2462   /* pr_reg */
2463   offset = 112;
2464   size = 384;
2465 
2466   /* Make a ".reg/999" section.  */
2467   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2468 					  size, note->descpos + offset);
2469 }
2470 
2471 static bfd_boolean
ppc64_elf_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)2472 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2473 {
2474   if (note->descsz != 136)
2475     return FALSE;
2476 
2477   elf_tdata (abfd)->core_program
2478     = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2479   elf_tdata (abfd)->core_command
2480     = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2481 
2482   return TRUE;
2483 }
2484 
2485 /* Merge backend specific data from an object file to the output
2486    object file when linking.  */
2487 
2488 static bfd_boolean
ppc64_elf_merge_private_bfd_data(bfd * ibfd,bfd * obfd)2489 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
2490 {
2491   /* Check if we have the same endianess.  */
2492   if (ibfd->xvec->byteorder != obfd->xvec->byteorder
2493       && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
2494       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2495     {
2496       const char *msg;
2497 
2498       if (bfd_big_endian (ibfd))
2499 	msg = _("%B: compiled for a big endian system "
2500 		"and target is little endian");
2501       else
2502 	msg = _("%B: compiled for a little endian system "
2503 		"and target is big endian");
2504 
2505       (*_bfd_error_handler) (msg, ibfd);
2506 
2507       bfd_set_error (bfd_error_wrong_format);
2508       return FALSE;
2509     }
2510 
2511   return TRUE;
2512 }
2513 
2514 /* Add extra PPC sections.  */
2515 
2516 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2517 {
2518   { ".plt",     4,  0, SHT_NOBITS,   0 },
2519   { ".sbss",    5, -2, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2520   { ".sdata",   6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2521   { ".toc",     4,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2522   { ".toc1",    5,  0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2523   { ".tocbss",  7,  0, SHT_NOBITS,   SHF_ALLOC + SHF_WRITE },
2524   { NULL,       0,  0, 0,            0 }
2525 };
2526 
2527 static const struct bfd_elf_special_section *
ppc64_elf_get_sec_type_attr(bfd * abfd,asection * sec)2528 ppc64_elf_get_sec_type_attr (bfd *abfd, asection *sec)
2529 {
2530   const struct bfd_elf_special_section *ssect;
2531 
2532   /* See if this is one of the special sections.  */
2533   if (sec->name == NULL)
2534     return NULL;
2535 
2536   ssect = _bfd_elf_get_special_section (sec->name,
2537 					ppc64_elf_special_sections,
2538 					sec->use_rela_p);
2539   if (ssect != NULL)
2540     return ssect;
2541 
2542   return _bfd_elf_get_sec_type_attr (abfd, sec);
2543 }
2544 
2545 struct _ppc64_elf_section_data
2546 {
2547   struct bfd_elf_section_data elf;
2548 
2549   /* An array with one entry for each opd function descriptor.  */
2550   union
2551   {
2552     /* Points to the function code section for local opd entries.  */
2553     asection **func_sec;
2554     /* After editing .opd, adjust references to opd local syms.  */
2555     long *adjust;
2556   } opd;
2557 
2558   /* An array for toc sections, indexed by offset/8.
2559      Specifies the relocation symbol index used at a given toc offset.  */
2560   unsigned *t_symndx;
2561 };
2562 
2563 #define ppc64_elf_section_data(sec) \
2564   ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2565 
2566 static bfd_boolean
ppc64_elf_new_section_hook(bfd * abfd,asection * sec)2567 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2568 {
2569   struct _ppc64_elf_section_data *sdata;
2570   bfd_size_type amt = sizeof (*sdata);
2571 
2572   sdata = bfd_zalloc (abfd, amt);
2573   if (sdata == NULL)
2574     return FALSE;
2575   sec->used_by_bfd = sdata;
2576 
2577   return _bfd_elf_new_section_hook (abfd, sec);
2578 }
2579 
2580 static void *
get_opd_info(asection * sec)2581 get_opd_info (asection * sec)
2582 {
2583   if (sec != NULL
2584       && ppc64_elf_section_data (sec) != NULL
2585       && ppc64_elf_section_data (sec)->opd.adjust != NULL)
2586     return ppc64_elf_section_data (sec)->opd.adjust;
2587   return NULL;
2588 }
2589 
2590 /* Parameters for the qsort hook.  */
2591 static asection *synthetic_opd;
2592 static bfd_boolean synthetic_relocatable;
2593 
2594 /* qsort comparison function for ppc64_elf_get_synthetic_symtab.  */
2595 
2596 static int
compare_symbols(const void * ap,const void * bp)2597 compare_symbols (const void *ap, const void *bp)
2598 {
2599   const asymbol *a = * (const asymbol **) ap;
2600   const asymbol *b = * (const asymbol **) bp;
2601 
2602   /* Section symbols first.  */
2603   if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2604     return -1;
2605   if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2606     return 1;
2607 
2608   /* then .opd symbols.  */
2609   if (a->section == synthetic_opd && b->section != synthetic_opd)
2610     return -1;
2611   if (a->section != synthetic_opd && b->section == synthetic_opd)
2612     return 1;
2613 
2614   /* then other code symbols.  */
2615   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2616       == (SEC_CODE | SEC_ALLOC)
2617       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2618 	 != (SEC_CODE | SEC_ALLOC))
2619     return -1;
2620 
2621   if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2622       != (SEC_CODE | SEC_ALLOC)
2623       && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2624 	 == (SEC_CODE | SEC_ALLOC))
2625     return 1;
2626 
2627   if (synthetic_relocatable)
2628     {
2629       if (a->section->id < b->section->id)
2630 	return -1;
2631 
2632       if (a->section->id > b->section->id)
2633 	return 1;
2634     }
2635 
2636   if (a->value + a->section->vma < b->value + b->section->vma)
2637     return -1;
2638 
2639   if (a->value + a->section->vma > b->value + b->section->vma)
2640     return 1;
2641 
2642   return 0;
2643 }
2644 
2645 /* Search SYMS for a symbol of the given VALUE.  */
2646 
2647 static asymbol *
sym_exists_at(asymbol ** syms,long lo,long hi,int id,bfd_vma value)2648 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
2649 {
2650   long mid;
2651 
2652   if (id == -1)
2653     {
2654       while (lo < hi)
2655 	{
2656 	  mid = (lo + hi) >> 1;
2657 	  if (syms[mid]->value + syms[mid]->section->vma < value)
2658 	    lo = mid + 1;
2659 	  else if (syms[mid]->value + syms[mid]->section->vma > value)
2660 	    hi = mid;
2661 	  else
2662 	    return syms[mid];
2663 	}
2664     }
2665   else
2666     {
2667       while (lo < hi)
2668 	{
2669 	  mid = (lo + hi) >> 1;
2670 	  if (syms[mid]->section->id < id)
2671 	    lo = mid + 1;
2672 	  else if (syms[mid]->section->id > id)
2673 	    hi = mid;
2674 	  else if (syms[mid]->value < value)
2675 	    lo = mid + 1;
2676 	  else if (syms[mid]->value > value)
2677 	    hi = mid;
2678 	  else
2679 	    return syms[mid];
2680 	}
2681     }
2682   return NULL;
2683 }
2684 
2685 /* Create synthetic symbols, effectively restoring "dot-symbol" function
2686    entry syms.  */
2687 
2688 static long
ppc64_elf_get_synthetic_symtab(bfd * abfd,long static_count,asymbol ** static_syms,long dyn_count,asymbol ** dyn_syms,asymbol ** ret)2689 ppc64_elf_get_synthetic_symtab (bfd *abfd,
2690 				long static_count, asymbol **static_syms,
2691 				long dyn_count, asymbol **dyn_syms,
2692 				asymbol **ret)
2693 {
2694   asymbol *s;
2695   long i;
2696   long count;
2697   char *names;
2698   long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
2699   asection *opd;
2700   bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
2701   asymbol **syms;
2702 
2703   *ret = NULL;
2704 
2705   opd = bfd_get_section_by_name (abfd, ".opd");
2706   if (opd == NULL)
2707     return 0;
2708 
2709   symcount = static_count;
2710   if (!relocatable)
2711     symcount += dyn_count;
2712   if (symcount == 0)
2713     return 0;
2714 
2715   syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2716   if (syms == NULL)
2717     return -1;
2718 
2719   if (!relocatable && static_count != 0 && dyn_count != 0)
2720     {
2721       /* Use both symbol tables.  */
2722       memcpy (syms, static_syms, static_count * sizeof (*syms));
2723       memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
2724     }
2725   else if (!relocatable && static_count == 0)
2726     memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2727   else
2728     memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
2729 
2730   synthetic_opd = opd;
2731   synthetic_relocatable = relocatable;
2732   qsort (syms, symcount, sizeof (*syms), compare_symbols);
2733 
2734   if (!relocatable && symcount > 1)
2735     {
2736       long j;
2737       /* Trim duplicate syms, since we may have merged the normal and
2738 	 dynamic symbols.  Actually, we only care about syms that have
2739 	 different values, so trim any with the same value.  */
2740       for (i = 1, j = 1; i < symcount; ++i)
2741 	if (syms[i - 1]->value + syms[i - 1]->section->vma
2742 	    != syms[i]->value + syms[i]->section->vma)
2743 	  syms[j++] = syms[i];
2744       symcount = j;
2745     }
2746 
2747   i = 0;
2748   if (syms[i]->section == opd)
2749     ++i;
2750   codesecsym = i;
2751 
2752   for (; i < symcount; ++i)
2753     if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2754 	 != (SEC_CODE | SEC_ALLOC))
2755 	|| (syms[i]->flags & BSF_SECTION_SYM) == 0)
2756       break;
2757   codesecsymend = i;
2758 
2759   for (; i < symcount; ++i)
2760     if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2761       break;
2762   secsymend = i;
2763 
2764   for (; i < symcount; ++i)
2765     if (syms[i]->section != opd)
2766       break;
2767   opdsymend = i;
2768 
2769   for (; i < symcount; ++i)
2770     if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2771 	!= (SEC_CODE | SEC_ALLOC))
2772       break;
2773   symcount = i;
2774 
2775   count = 0;
2776   if (opdsymend == secsymend)
2777     goto done;
2778 
2779   if (relocatable)
2780     {
2781       bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2782       arelent *r;
2783       size_t size;
2784       long relcount;
2785 
2786       slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2787       relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2788       if (relcount == 0)
2789 	goto done;
2790 
2791       if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
2792 	{
2793 	  count = -1;
2794 	  goto done;
2795 	}
2796 
2797       size = 0;
2798       for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2799 	{
2800 	  asymbol *sym;
2801 
2802 	  while (r < opd->relocation + relcount
2803 		 && r->address < syms[i]->value + opd->vma)
2804 	    ++r;
2805 
2806 	  if (r == opd->relocation + relcount)
2807 	    break;
2808 
2809 	  if (r->address != syms[i]->value + opd->vma)
2810 	    continue;
2811 
2812 	  if (r->howto->type != R_PPC64_ADDR64)
2813 	    continue;
2814 
2815 	  sym = *r->sym_ptr_ptr;
2816 	  if (!sym_exists_at (syms, opdsymend, symcount,
2817 			      sym->section->id, sym->value + r->addend))
2818 	    {
2819 	      ++count;
2820 	      size += sizeof (asymbol);
2821 	      size += strlen (syms[i]->name) + 2;
2822 	    }
2823 	}
2824 
2825       s = *ret = bfd_malloc (size);
2826       if (s == NULL)
2827 	{
2828 	  count = -1;
2829 	  goto done;
2830 	}
2831 
2832       names = (char *) (s + count);
2833 
2834       for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
2835 	{
2836 	  asymbol *sym;
2837 
2838 	  while (r < opd->relocation + relcount
2839 		 && r->address < syms[i]->value + opd->vma)
2840 	    ++r;
2841 
2842 	  if (r == opd->relocation + relcount)
2843 	    break;
2844 
2845 	  if (r->address != syms[i]->value + opd->vma)
2846 	    continue;
2847 
2848 	  if (r->howto->type != R_PPC64_ADDR64)
2849 	    continue;
2850 
2851 	  sym = *r->sym_ptr_ptr;
2852 	  if (!sym_exists_at (syms, opdsymend, symcount,
2853 			      sym->section->id, sym->value + r->addend))
2854 	    {
2855 	      size_t len;
2856 
2857 	      *s = *syms[i];
2858 	      s->section = sym->section;
2859 	      s->value = sym->value + r->addend;
2860 	      s->name = names;
2861 	      *names++ = '.';
2862 	      len = strlen (syms[i]->name);
2863 	      memcpy (names, syms[i]->name, len + 1);
2864 	      names += len + 1;
2865 	      s++;
2866 	    }
2867 	}
2868     }
2869   else
2870     {
2871       bfd_byte *contents;
2872       size_t size;
2873 
2874       if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2875 	{
2876 	  if (contents)
2877 	    {
2878 	    free_contents_and_exit:
2879 	      free (contents);
2880 	    }
2881 	  count = -1;
2882 	  goto done;
2883 	}
2884 
2885       size = 0;
2886       for (i = secsymend; i < opdsymend; ++i)
2887 	{
2888 	  bfd_vma ent;
2889 
2890 	  ent = bfd_get_64 (abfd, contents + syms[i]->value);
2891 	  if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2892 	    {
2893 	      ++count;
2894 	      size += sizeof (asymbol);
2895 	      size += strlen (syms[i]->name) + 2;
2896 	    }
2897 	}
2898 
2899       s = *ret = bfd_malloc (size);
2900       if (s == NULL)
2901 	goto free_contents_and_exit;
2902 
2903       names = (char *) (s + count);
2904 
2905       for (i = secsymend; i < opdsymend; ++i)
2906 	{
2907 	  bfd_vma ent;
2908 
2909 	  ent = bfd_get_64 (abfd, contents + syms[i]->value);
2910 	  if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2911 	    {
2912 	      long lo, hi;
2913 	      size_t len;
2914 	      asection *sec = abfd->sections;
2915 
2916 	      *s = *syms[i];
2917 	      lo = codesecsym;
2918 	      hi = codesecsymend;
2919 	      while (lo < hi)
2920 		{
2921 		  long mid = (lo + hi) >> 1;
2922 		  if (syms[mid]->section->vma < ent)
2923 		    lo = mid + 1;
2924 		  else if (syms[mid]->section->vma > ent)
2925 		    hi = mid;
2926 		  else
2927 		    {
2928 		      sec = syms[mid]->section;
2929 		      break;
2930 		    }
2931 		}
2932 
2933 	      if (lo >= hi && lo > codesecsym)
2934 		sec = syms[lo - 1]->section;
2935 
2936 	      for (; sec != NULL; sec = sec->next)
2937 		{
2938 		  if (sec->vma > ent)
2939 		    break;
2940 		  if ((sec->flags & SEC_ALLOC) == 0
2941 		      || (sec->flags & SEC_LOAD) == 0)
2942 		    break;
2943 		  if ((sec->flags & SEC_CODE) != 0)
2944 		    s->section = sec;
2945 		}
2946 	      s->value = ent - s->section->vma;
2947 	      s->name = names;
2948 	      *names++ = '.';
2949 	      len = strlen (syms[i]->name);
2950 	      memcpy (names, syms[i]->name, len + 1);
2951 	      names += len + 1;
2952 	      s++;
2953 	    }
2954 	}
2955       free (contents);
2956     }
2957 
2958  done:
2959   free (syms);
2960   return count;
2961 }
2962 
2963 /* The following functions are specific to the ELF linker, while
2964    functions above are used generally.  Those named ppc64_elf_* are
2965    called by the main ELF linker code.  They appear in this file more
2966    or less in the order in which they are called.  eg.
2967    ppc64_elf_check_relocs is called early in the link process,
2968    ppc64_elf_finish_dynamic_sections is one of the last functions
2969    called.
2970 
2971    PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2972    functions have both a function code symbol and a function descriptor
2973    symbol.  A call to foo in a relocatable object file looks like:
2974 
2975    .		.text
2976    .	x:
2977    .		bl	.foo
2978    .		nop
2979 
2980    The function definition in another object file might be:
2981 
2982    .		.section .opd
2983    .	foo:	.quad	.foo
2984    .		.quad	.TOC.@tocbase
2985    .		.quad	0
2986    .
2987    .		.text
2988    .	.foo:	blr
2989 
2990    When the linker resolves the call during a static link, the branch
2991    unsurprisingly just goes to .foo and the .opd information is unused.
2992    If the function definition is in a shared library, things are a little
2993    different:  The call goes via a plt call stub, the opd information gets
2994    copied to the plt, and the linker patches the nop.
2995 
2996    .	x:
2997    .		bl	.foo_stub
2998    .		ld	2,40(1)
2999    .
3000    .
3001    .	.foo_stub:
3002    .		addis	12,2,Lfoo@toc@ha	# in practice, the call stub
3003    .		addi	12,12,Lfoo@toc@l	# is slightly optimized, but
3004    .		std	2,40(1)			# this is the general idea
3005    .		ld	11,0(12)
3006    .		ld	2,8(12)
3007    .		mtctr	11
3008    .		ld	11,16(12)
3009    .		bctr
3010    .
3011    .		.section .plt
3012    .	Lfoo:	reloc (R_PPC64_JMP_SLOT, foo)
3013 
3014    The "reloc ()" notation is supposed to indicate that the linker emits
3015    an R_PPC64_JMP_SLOT reloc against foo.  The dynamic linker does the opd
3016    copying.
3017 
3018    What are the difficulties here?  Well, firstly, the relocations
3019    examined by the linker in check_relocs are against the function code
3020    sym .foo, while the dynamic relocation in the plt is emitted against
3021    the function descriptor symbol, foo.  Somewhere along the line, we need
3022    to carefully copy dynamic link information from one symbol to the other.
3023    Secondly, the generic part of the elf linker will make .foo a dynamic
3024    symbol as is normal for most other backends.  We need foo dynamic
3025    instead, at least for an application final link.  However, when
3026    creating a shared library containing foo, we need to have both symbols
3027    dynamic so that references to .foo are satisfied during the early
3028    stages of linking.  Otherwise the linker might decide to pull in a
3029    definition from some other object, eg. a static library.
3030 
3031    Update: As of August 2004, we support a new convention.  Function
3032    calls may use the function descriptor symbol, ie. "bl foo".  This
3033    behaves exactly as "bl .foo".  */
3034 
3035 /* The linker needs to keep track of the number of relocs that it
3036    decides to copy as dynamic relocs in check_relocs for each symbol.
3037    This is so that it can later discard them if they are found to be
3038    unnecessary.  We store the information in a field extending the
3039    regular ELF linker hash table.  */
3040 
3041 struct ppc_dyn_relocs
3042 {
3043   struct ppc_dyn_relocs *next;
3044 
3045   /* The input section of the reloc.  */
3046   asection *sec;
3047 
3048   /* Total number of relocs copied for the input section.  */
3049   bfd_size_type count;
3050 
3051   /* Number of pc-relative relocs copied for the input section.  */
3052   bfd_size_type pc_count;
3053 };
3054 
3055 /* Track GOT entries needed for a given symbol.  We might need more
3056    than one got entry per symbol.  */
3057 struct got_entry
3058 {
3059   struct got_entry *next;
3060 
3061   /* The symbol addend that we'll be placing in the GOT.  */
3062   bfd_vma addend;
3063 
3064   /* Unlike other ELF targets, we use separate GOT entries for the same
3065      symbol referenced from different input files.  This is to support
3066      automatic multiple TOC/GOT sections, where the TOC base can vary
3067      from one input file to another.
3068 
3069      Point to the BFD owning this GOT entry.  */
3070   bfd *owner;
3071 
3072   /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3073      TLS_TPREL or TLS_DTPREL for tls entries.  */
3074   char tls_type;
3075 
3076   /* Reference count until size_dynamic_sections, GOT offset thereafter.  */
3077   union
3078     {
3079       bfd_signed_vma refcount;
3080       bfd_vma offset;
3081     } got;
3082 };
3083 
3084 /* The same for PLT.  */
3085 struct plt_entry
3086 {
3087   struct plt_entry *next;
3088 
3089   bfd_vma addend;
3090 
3091   union
3092     {
3093       bfd_signed_vma refcount;
3094       bfd_vma offset;
3095     } plt;
3096 };
3097 
3098 /* Of those relocs that might be copied as dynamic relocs, this macro
3099    selects those that must be copied when linking a shared library,
3100    even when the symbol is local.  */
3101 
3102 #define MUST_BE_DYN_RELOC(RTYPE)		\
3103   ((RTYPE) != R_PPC64_REL32			\
3104    && (RTYPE) != R_PPC64_REL64			\
3105    && (RTYPE) != R_PPC64_REL30)
3106 
3107 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3108    copying dynamic variables from a shared lib into an app's dynbss
3109    section, and instead use a dynamic relocation to point into the
3110    shared lib.  With code that gcc generates, it's vital that this be
3111    enabled;  In the PowerPC64 ABI, the address of a function is actually
3112    the address of a function descriptor, which resides in the .opd
3113    section.  gcc uses the descriptor directly rather than going via the
3114    GOT as some other ABI's do, which means that initialized function
3115    pointers must reference the descriptor.  Thus, a function pointer
3116    initialized to the address of a function in a shared library will
3117    either require a copy reloc, or a dynamic reloc.  Using a copy reloc
3118    redefines the function descriptor symbol to point to the copy.  This
3119    presents a problem as a plt entry for that function is also
3120    initialized from the function descriptor symbol and the copy reloc
3121    may not be initialized first.  */
3122 #define ELIMINATE_COPY_RELOCS 1
3123 
3124 /* Section name for stubs is the associated section name plus this
3125    string.  */
3126 #define STUB_SUFFIX ".stub"
3127 
3128 /* Linker stubs.
3129    ppc_stub_long_branch:
3130    Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3131    destination, but a 24 bit branch in a stub section will reach.
3132    .	b	dest
3133 
3134    ppc_stub_plt_branch:
3135    Similar to the above, but a 24 bit branch in the stub section won't
3136    reach its destination.
3137    .	addis	%r12,%r2,xxx@toc@ha
3138    .	ld	%r11,xxx@toc@l(%r12)
3139    .	mtctr	%r11
3140    .	bctr
3141 
3142    ppc_stub_plt_call:
3143    Used to call a function in a shared library.  If it so happens that
3144    the plt entry referenced crosses a 64k boundary, then an extra
3145    "addis %r12,%r12,1" will be inserted before the load at xxx+8 or
3146    xxx+16 as appropriate.
3147    .	addis	%r12,%r2,xxx@toc@ha
3148    .	std	%r2,40(%r1)
3149    .	ld	%r11,xxx+0@toc@l(%r12)
3150    .	ld	%r2,xxx+8@toc@l(%r12)
3151    .	mtctr	%r11
3152    .	ld	%r11,xxx+16@toc@l(%r12)
3153    .	bctr
3154 
3155    ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3156    code to adjust the value and save r2 to support multiple toc sections.
3157    A ppc_stub_long_branch with an r2 offset looks like:
3158    .	std	%r2,40(%r1)
3159    .	addis	%r2,%r2,off@ha
3160    .	addi	%r2,%r2,off@l
3161    .	b	dest
3162 
3163    A ppc_stub_plt_branch with an r2 offset looks like:
3164    .	std	%r2,40(%r1)
3165    .	addis	%r12,%r2,xxx@toc@ha
3166    .	ld	%r11,xxx@toc@l(%r12)
3167    .	addis	%r2,%r2,off@ha
3168    .	addi	%r2,%r2,off@l
3169    .	mtctr	%r11
3170    .	bctr
3171 */
3172 
3173 enum ppc_stub_type {
3174   ppc_stub_none,
3175   ppc_stub_long_branch,
3176   ppc_stub_long_branch_r2off,
3177   ppc_stub_plt_branch,
3178   ppc_stub_plt_branch_r2off,
3179   ppc_stub_plt_call
3180 };
3181 
3182 struct ppc_stub_hash_entry {
3183 
3184   /* Base hash table entry structure.  */
3185   struct bfd_hash_entry root;
3186 
3187   enum ppc_stub_type stub_type;
3188 
3189   /* The stub section.  */
3190   asection *stub_sec;
3191 
3192   /* Offset within stub_sec of the beginning of this stub.  */
3193   bfd_vma stub_offset;
3194 
3195   /* Given the symbol's value and its section we can determine its final
3196      value when building the stubs (so the stub knows where to jump.  */
3197   bfd_vma target_value;
3198   asection *target_section;
3199 
3200   /* The symbol table entry, if any, that this was derived from.  */
3201   struct ppc_link_hash_entry *h;
3202 
3203   /* And the reloc addend that this was derived from.  */
3204   bfd_vma addend;
3205 
3206   /* Where this stub is being called from, or, in the case of combined
3207      stub sections, the first input section in the group.  */
3208   asection *id_sec;
3209 };
3210 
3211 struct ppc_branch_hash_entry {
3212 
3213   /* Base hash table entry structure.  */
3214   struct bfd_hash_entry root;
3215 
3216   /* Offset within .branch_lt.  */
3217   unsigned int offset;
3218 
3219   /* Generation marker.  */
3220   unsigned int iter;
3221 };
3222 
3223 struct ppc_link_hash_entry
3224 {
3225   struct elf_link_hash_entry elf;
3226 
3227   /* A pointer to the most recently used stub hash entry against this
3228      symbol.  */
3229   struct ppc_stub_hash_entry *stub_cache;
3230 
3231   /* Track dynamic relocs copied for this symbol.  */
3232   struct ppc_dyn_relocs *dyn_relocs;
3233 
3234   /* Link between function code and descriptor symbols.  */
3235   struct ppc_link_hash_entry *oh;
3236 
3237   /* Flag function code and descriptor symbols.  */
3238   unsigned int is_func:1;
3239   unsigned int is_func_descriptor:1;
3240   unsigned int fake:1;
3241 
3242   /* Whether global opd/toc sym has been adjusted or not.
3243      After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3244      should be set for all globals defined in any opd/toc section.  */
3245   unsigned int adjust_done:1;
3246 
3247   /* Set if we twiddled this symbol to weak at some stage.  */
3248   unsigned int was_undefined:1;
3249 
3250   /* Contexts in which symbol is used in the GOT (or TOC).
3251      TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3252      corresponding relocs are encountered during check_relocs.
3253      tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3254      indicate the corresponding GOT entry type is not needed.
3255      tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3256      a TPREL one.  We use a separate flag rather than setting TPREL
3257      just for convenience in distinguishing the two cases.  */
3258 #define TLS_GD		 1	/* GD reloc. */
3259 #define TLS_LD		 2	/* LD reloc. */
3260 #define TLS_TPREL	 4	/* TPREL reloc, => IE. */
3261 #define TLS_DTPREL	 8	/* DTPREL reloc, => LD. */
3262 #define TLS_TLS		16	/* Any TLS reloc.  */
3263 #define TLS_EXPLICIT	32	/* Marks TOC section TLS relocs. */
3264 #define TLS_TPRELGD	64	/* TPREL reloc resulting from GD->IE. */
3265   char tls_mask;
3266 };
3267 
3268 /* ppc64 ELF linker hash table.  */
3269 
3270 struct ppc_link_hash_table
3271 {
3272   struct elf_link_hash_table elf;
3273 
3274   /* The stub hash table.  */
3275   struct bfd_hash_table stub_hash_table;
3276 
3277   /* Another hash table for plt_branch stubs.  */
3278   struct bfd_hash_table branch_hash_table;
3279 
3280   /* Linker stub bfd.  */
3281   bfd *stub_bfd;
3282 
3283   /* Linker call-backs.  */
3284   asection * (*add_stub_section) (const char *, asection *);
3285   void (*layout_sections_again) (void);
3286 
3287   /* Array to keep track of which stub sections have been created, and
3288      information on stub grouping.  */
3289   struct map_stub {
3290     /* This is the section to which stubs in the group will be attached.  */
3291     asection *link_sec;
3292     /* The stub section.  */
3293     asection *stub_sec;
3294     /* Along with elf_gp, specifies the TOC pointer used in this group.  */
3295     bfd_vma toc_off;
3296   } *stub_group;
3297 
3298   /* Temp used when calculating TOC pointers.  */
3299   bfd_vma toc_curr;
3300 
3301   /* Highest input section id.  */
3302   int top_id;
3303 
3304   /* Highest output section index.  */
3305   int top_index;
3306 
3307   /* List of input sections for each output section.  */
3308   asection **input_list;
3309 
3310   /* Short-cuts to get to dynamic linker sections.  */
3311   asection *got;
3312   asection *plt;
3313   asection *relplt;
3314   asection *dynbss;
3315   asection *relbss;
3316   asection *glink;
3317   asection *sfpr;
3318   asection *brlt;
3319   asection *relbrlt;
3320 
3321   /* Shortcut to .__tls_get_addr and __tls_get_addr.  */
3322   struct ppc_link_hash_entry *tls_get_addr;
3323   struct ppc_link_hash_entry *tls_get_addr_fd;
3324 
3325   /* Statistics.  */
3326   unsigned long stub_count[ppc_stub_plt_call];
3327 
3328   /* Number of stubs against global syms.  */
3329   unsigned long stub_globals;
3330 
3331   /* Set if we should emit symbols for stubs.  */
3332   unsigned int emit_stub_syms:1;
3333 
3334   /* Support for multiple toc sections.  */
3335   unsigned int no_multi_toc:1;
3336   unsigned int multi_toc_needed:1;
3337 
3338   /* Set on error.  */
3339   unsigned int stub_error:1;
3340 
3341   /* Flag set when small branches are detected.  Used to
3342      select suitable defaults for the stub group size.  */
3343   unsigned int has_14bit_branch:1;
3344 
3345   /* Temp used by ppc64_elf_check_directives.  */
3346   unsigned int twiddled_syms:1;
3347 
3348   /* Incremented every time we size stubs.  */
3349   unsigned int stub_iteration;
3350 
3351   /* Small local sym to section mapping cache.  */
3352   struct sym_sec_cache sym_sec;
3353 };
3354 
3355 /* Rename some of the generic section flags to better document how they
3356    are used here.  */
3357 #define has_toc_reloc has_gp_reloc
3358 #define makes_toc_func_call need_finalize_relax
3359 #define call_check_in_progress reloc_done
3360 
3361 /* Get the ppc64 ELF linker hash table from a link_info structure.  */
3362 
3363 #define ppc_hash_table(p) \
3364   ((struct ppc_link_hash_table *) ((p)->hash))
3365 
3366 #define ppc_stub_hash_lookup(table, string, create, copy) \
3367   ((struct ppc_stub_hash_entry *) \
3368    bfd_hash_lookup ((table), (string), (create), (copy)))
3369 
3370 #define ppc_branch_hash_lookup(table, string, create, copy) \
3371   ((struct ppc_branch_hash_entry *) \
3372    bfd_hash_lookup ((table), (string), (create), (copy)))
3373 
3374 /* Create an entry in the stub hash table.  */
3375 
3376 static struct bfd_hash_entry *
stub_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)3377 stub_hash_newfunc (struct bfd_hash_entry *entry,
3378 		   struct bfd_hash_table *table,
3379 		   const char *string)
3380 {
3381   /* Allocate the structure if it has not already been allocated by a
3382      subclass.  */
3383   if (entry == NULL)
3384     {
3385       entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3386       if (entry == NULL)
3387 	return entry;
3388     }
3389 
3390   /* Call the allocation method of the superclass.  */
3391   entry = bfd_hash_newfunc (entry, table, string);
3392   if (entry != NULL)
3393     {
3394       struct ppc_stub_hash_entry *eh;
3395 
3396       /* Initialize the local fields.  */
3397       eh = (struct ppc_stub_hash_entry *) entry;
3398       eh->stub_type = ppc_stub_none;
3399       eh->stub_sec = NULL;
3400       eh->stub_offset = 0;
3401       eh->target_value = 0;
3402       eh->target_section = NULL;
3403       eh->h = NULL;
3404       eh->id_sec = NULL;
3405     }
3406 
3407   return entry;
3408 }
3409 
3410 /* Create an entry in the branch hash table.  */
3411 
3412 static struct bfd_hash_entry *
branch_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)3413 branch_hash_newfunc (struct bfd_hash_entry *entry,
3414 		     struct bfd_hash_table *table,
3415 		     const char *string)
3416 {
3417   /* Allocate the structure if it has not already been allocated by a
3418      subclass.  */
3419   if (entry == NULL)
3420     {
3421       entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3422       if (entry == NULL)
3423 	return entry;
3424     }
3425 
3426   /* Call the allocation method of the superclass.  */
3427   entry = bfd_hash_newfunc (entry, table, string);
3428   if (entry != NULL)
3429     {
3430       struct ppc_branch_hash_entry *eh;
3431 
3432       /* Initialize the local fields.  */
3433       eh = (struct ppc_branch_hash_entry *) entry;
3434       eh->offset = 0;
3435       eh->iter = 0;
3436     }
3437 
3438   return entry;
3439 }
3440 
3441 /* Create an entry in a ppc64 ELF linker hash table.  */
3442 
3443 static struct bfd_hash_entry *
link_hash_newfunc(struct bfd_hash_entry * entry,struct bfd_hash_table * table,const char * string)3444 link_hash_newfunc (struct bfd_hash_entry *entry,
3445 		   struct bfd_hash_table *table,
3446 		   const char *string)
3447 {
3448   /* Allocate the structure if it has not already been allocated by a
3449      subclass.  */
3450   if (entry == NULL)
3451     {
3452       entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3453       if (entry == NULL)
3454 	return entry;
3455     }
3456 
3457   /* Call the allocation method of the superclass.  */
3458   entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3459   if (entry != NULL)
3460     {
3461       struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3462 
3463       memset (&eh->stub_cache, 0,
3464 	      (sizeof (struct ppc_link_hash_entry)
3465 	       - offsetof (struct ppc_link_hash_entry, stub_cache)));
3466     }
3467 
3468   return entry;
3469 }
3470 
3471 /* Create a ppc64 ELF linker hash table.  */
3472 
3473 static struct bfd_link_hash_table *
ppc64_elf_link_hash_table_create(bfd * abfd)3474 ppc64_elf_link_hash_table_create (bfd *abfd)
3475 {
3476   struct ppc_link_hash_table *htab;
3477   bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3478 
3479   htab = bfd_zmalloc (amt);
3480   if (htab == NULL)
3481     return NULL;
3482 
3483   if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
3484     {
3485       free (htab);
3486       return NULL;
3487     }
3488 
3489   /* Init the stub hash table too.  */
3490   if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
3491     return NULL;
3492 
3493   /* And the branch hash table.  */
3494   if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
3495     return NULL;
3496 
3497   /* Initializing two fields of the union is just cosmetic.  We really
3498      only care about glist, but when compiled on a 32-bit host the
3499      bfd_vma fields are larger.  Setting the bfd_vma to zero makes
3500      debugger inspection of these fields look nicer.  */
3501   htab->elf.init_got_refcount.refcount = 0;
3502   htab->elf.init_got_refcount.glist = NULL;
3503   htab->elf.init_plt_refcount.refcount = 0;
3504   htab->elf.init_plt_refcount.glist = NULL;
3505   htab->elf.init_got_offset.offset = 0;
3506   htab->elf.init_got_offset.glist = NULL;
3507   htab->elf.init_plt_offset.offset = 0;
3508   htab->elf.init_plt_offset.glist = NULL;
3509 
3510   return &htab->elf.root;
3511 }
3512 
3513 /* Free the derived linker hash table.  */
3514 
3515 static void
ppc64_elf_link_hash_table_free(struct bfd_link_hash_table * hash)3516 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
3517 {
3518   struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3519 
3520   bfd_hash_table_free (&ret->stub_hash_table);
3521   bfd_hash_table_free (&ret->branch_hash_table);
3522   _bfd_generic_link_hash_table_free (hash);
3523 }
3524 
3525 /* Satisfy the ELF linker by filling in some fields in our fake bfd.  */
3526 
3527 void
ppc64_elf_init_stub_bfd(bfd * abfd,struct bfd_link_info * info)3528 ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3529 {
3530   struct ppc_link_hash_table *htab;
3531 
3532   elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3533 
3534 /* Always hook our dynamic sections into the first bfd, which is the
3535    linker created stub bfd.  This ensures that the GOT header is at
3536    the start of the output TOC section.  */
3537   htab = ppc_hash_table (info);
3538   htab->stub_bfd = abfd;
3539   htab->elf.dynobj = abfd;
3540 }
3541 
3542 /* Build a name for an entry in the stub hash table.  */
3543 
3544 static char *
ppc_stub_name(const asection * input_section,const asection * sym_sec,const struct ppc_link_hash_entry * h,const Elf_Internal_Rela * rel)3545 ppc_stub_name (const asection *input_section,
3546 	       const asection *sym_sec,
3547 	       const struct ppc_link_hash_entry *h,
3548 	       const Elf_Internal_Rela *rel)
3549 {
3550   char *stub_name;
3551   bfd_size_type len;
3552 
3553   /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3554      offsets from a sym as a branch target?  In fact, we could
3555      probably assume the addend is always zero.  */
3556   BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3557 
3558   if (h)
3559     {
3560       len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3561       stub_name = bfd_malloc (len);
3562       if (stub_name == NULL)
3563 	return stub_name;
3564 
3565       sprintf (stub_name, "%08x.%s+%x",
3566 	       input_section->id & 0xffffffff,
3567 	       h->elf.root.root.string,
3568 	       (int) rel->r_addend & 0xffffffff);
3569     }
3570   else
3571     {
3572       len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
3573       stub_name = bfd_malloc (len);
3574       if (stub_name == NULL)
3575 	return stub_name;
3576 
3577       sprintf (stub_name, "%08x.%x:%x+%x",
3578 	       input_section->id & 0xffffffff,
3579 	       sym_sec->id & 0xffffffff,
3580 	       (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3581 	       (int) rel->r_addend & 0xffffffff);
3582     }
3583   if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
3584     stub_name[len - 2] = 0;
3585   return stub_name;
3586 }
3587 
3588 /* Look up an entry in the stub hash.  Stub entries are cached because
3589    creating the stub name takes a bit of time.  */
3590 
3591 static struct ppc_stub_hash_entry *
ppc_get_stub_entry(const asection * input_section,const asection * sym_sec,struct ppc_link_hash_entry * h,const Elf_Internal_Rela * rel,struct ppc_link_hash_table * htab)3592 ppc_get_stub_entry (const asection *input_section,
3593 		    const asection *sym_sec,
3594 		    struct ppc_link_hash_entry *h,
3595 		    const Elf_Internal_Rela *rel,
3596 		    struct ppc_link_hash_table *htab)
3597 {
3598   struct ppc_stub_hash_entry *stub_entry;
3599   const asection *id_sec;
3600 
3601   /* If this input section is part of a group of sections sharing one
3602      stub section, then use the id of the first section in the group.
3603      Stub names need to include a section id, as there may well be
3604      more than one stub used to reach say, printf, and we need to
3605      distinguish between them.  */
3606   id_sec = htab->stub_group[input_section->id].link_sec;
3607 
3608   if (h != NULL && h->stub_cache != NULL
3609       && h->stub_cache->h == h
3610       && h->stub_cache->id_sec == id_sec)
3611     {
3612       stub_entry = h->stub_cache;
3613     }
3614   else
3615     {
3616       char *stub_name;
3617 
3618       stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3619       if (stub_name == NULL)
3620 	return NULL;
3621 
3622       stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
3623 					 stub_name, FALSE, FALSE);
3624       if (h != NULL)
3625 	h->stub_cache = stub_entry;
3626 
3627       free (stub_name);
3628     }
3629 
3630   return stub_entry;
3631 }
3632 
3633 /* Add a new stub entry to the stub hash.  Not all fields of the new
3634    stub entry are initialised.  */
3635 
3636 static struct ppc_stub_hash_entry *
ppc_add_stub(const char * stub_name,asection * section,struct ppc_link_hash_table * htab)3637 ppc_add_stub (const char *stub_name,
3638 	      asection *section,
3639 	      struct ppc_link_hash_table *htab)
3640 {
3641   asection *link_sec;
3642   asection *stub_sec;
3643   struct ppc_stub_hash_entry *stub_entry;
3644 
3645   link_sec = htab->stub_group[section->id].link_sec;
3646   stub_sec = htab->stub_group[section->id].stub_sec;
3647   if (stub_sec == NULL)
3648     {
3649       stub_sec = htab->stub_group[link_sec->id].stub_sec;
3650       if (stub_sec == NULL)
3651 	{
3652 	  size_t namelen;
3653 	  bfd_size_type len;
3654 	  char *s_name;
3655 
3656 	  namelen = strlen (link_sec->name);
3657 	  len = namelen + sizeof (STUB_SUFFIX);
3658 	  s_name = bfd_alloc (htab->stub_bfd, len);
3659 	  if (s_name == NULL)
3660 	    return NULL;
3661 
3662 	  memcpy (s_name, link_sec->name, namelen);
3663 	  memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
3664 	  stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3665 	  if (stub_sec == NULL)
3666 	    return NULL;
3667 	  htab->stub_group[link_sec->id].stub_sec = stub_sec;
3668 	}
3669       htab->stub_group[section->id].stub_sec = stub_sec;
3670     }
3671 
3672   /* Enter this entry into the linker stub hash table.  */
3673   stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
3674 				     TRUE, FALSE);
3675   if (stub_entry == NULL)
3676     {
3677       (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3678 			     section->owner, stub_name);
3679       return NULL;
3680     }
3681 
3682   stub_entry->stub_sec = stub_sec;
3683   stub_entry->stub_offset = 0;
3684   stub_entry->id_sec = link_sec;
3685   return stub_entry;
3686 }
3687 
3688 /* Create sections for linker generated code.  */
3689 
3690 static bfd_boolean
create_linkage_sections(bfd * dynobj,struct bfd_link_info * info)3691 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
3692 {
3693   struct ppc_link_hash_table *htab;
3694   flagword flags;
3695 
3696   htab = ppc_hash_table (info);
3697 
3698   /* Create .sfpr for code to save and restore fp regs.  */
3699   flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3700 	   | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3701   htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
3702 						   flags);
3703   if (htab->sfpr == NULL
3704       || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
3705     return FALSE;
3706 
3707   /* Create .glink for lazy dynamic linking support.  */
3708   htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
3709 						    flags);
3710   if (htab->glink == NULL
3711       || ! bfd_set_section_alignment (dynobj, htab->glink, 2))
3712     return FALSE;
3713 
3714   /* Create .branch_lt for plt_branch stubs.  */
3715   flags = (SEC_ALLOC | SEC_LOAD
3716 	   | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3717   htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
3718 						   flags);
3719   if (htab->brlt == NULL
3720       || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
3721     return FALSE;
3722 
3723   if (info->shared || info->emitrelocations)
3724     {
3725       flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3726 	       | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
3727       htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
3728 							  ".rela.branch_lt",
3729 							  flags);
3730       if (!htab->relbrlt
3731 	  || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
3732 	return FALSE;
3733     }
3734   return TRUE;
3735 }
3736 
3737 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3738    not already done.  */
3739 
3740 static bfd_boolean
create_got_section(bfd * abfd,struct bfd_link_info * info)3741 create_got_section (bfd *abfd, struct bfd_link_info *info)
3742 {
3743   asection *got, *relgot;
3744   flagword flags;
3745   struct ppc_link_hash_table *htab = ppc_hash_table (info);
3746 
3747   if (!htab->got)
3748     {
3749       if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3750 	return FALSE;
3751 
3752       htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3753       if (!htab->got)
3754 	abort ();
3755     }
3756 
3757   flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3758 	   | SEC_LINKER_CREATED);
3759 
3760   got = bfd_make_section_with_flags (abfd, ".got", flags);
3761   if (!got
3762       || !bfd_set_section_alignment (abfd, got, 3))
3763     return FALSE;
3764 
3765   relgot = bfd_make_section_with_flags (abfd, ".rela.got",
3766 					flags | SEC_READONLY);
3767   if (!relgot
3768       || ! bfd_set_section_alignment (abfd, relgot, 3))
3769     return FALSE;
3770 
3771   ppc64_elf_tdata (abfd)->got = got;
3772   ppc64_elf_tdata (abfd)->relgot = relgot;
3773   return TRUE;
3774 }
3775 
3776 /* Create the dynamic sections, and set up shortcuts.  */
3777 
3778 static bfd_boolean
ppc64_elf_create_dynamic_sections(bfd * dynobj,struct bfd_link_info * info)3779 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
3780 {
3781   struct ppc_link_hash_table *htab;
3782 
3783   if (!_bfd_elf_create_dynamic_sections (dynobj, info))
3784     return FALSE;
3785 
3786   htab = ppc_hash_table (info);
3787   if (!htab->got)
3788     htab->got = bfd_get_section_by_name (dynobj, ".got");
3789   htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3790   htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3791   htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
3792   if (!info->shared)
3793     htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
3794 
3795   if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
3796       || (!info->shared && !htab->relbss))
3797     abort ();
3798 
3799   return TRUE;
3800 }
3801 
3802 /* Merge PLT info on FROM with that on TO.  */
3803 
3804 static void
move_plt_plist(struct ppc_link_hash_entry * from,struct ppc_link_hash_entry * to)3805 move_plt_plist (struct ppc_link_hash_entry *from,
3806 		struct ppc_link_hash_entry *to)
3807 {
3808   if (from->elf.plt.plist != NULL)
3809     {
3810       if (to->elf.plt.plist != NULL)
3811 	{
3812 	  struct plt_entry **entp;
3813 	  struct plt_entry *ent;
3814 
3815 	  for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
3816 	    {
3817 	      struct plt_entry *dent;
3818 
3819 	      for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
3820 		if (dent->addend == ent->addend)
3821 		  {
3822 		    dent->plt.refcount += ent->plt.refcount;
3823 		    *entp = ent->next;
3824 		    break;
3825 		  }
3826 	      if (dent == NULL)
3827 		entp = &ent->next;
3828 	    }
3829 	  *entp = to->elf.plt.plist;
3830 	}
3831 
3832       to->elf.plt.plist = from->elf.plt.plist;
3833       from->elf.plt.plist = NULL;
3834     }
3835 }
3836 
3837 /* Copy the extra info we tack onto an elf_link_hash_entry.  */
3838 
3839 static void
ppc64_elf_copy_indirect_symbol(const struct elf_backend_data * bed ATTRIBUTE_UNUSED,struct elf_link_hash_entry * dir,struct elf_link_hash_entry * ind)3840 ppc64_elf_copy_indirect_symbol
3841   (const struct elf_backend_data *bed ATTRIBUTE_UNUSED,
3842    struct elf_link_hash_entry *dir,
3843    struct elf_link_hash_entry *ind)
3844 {
3845   struct ppc_link_hash_entry *edir, *eind;
3846 
3847   edir = (struct ppc_link_hash_entry *) dir;
3848   eind = (struct ppc_link_hash_entry *) ind;
3849 
3850   /* Copy over any dynamic relocs we may have on the indirect sym.  */
3851   if (eind->dyn_relocs != NULL)
3852     {
3853       if (edir->dyn_relocs != NULL)
3854 	{
3855 	  struct ppc_dyn_relocs **pp;
3856 	  struct ppc_dyn_relocs *p;
3857 
3858 	  if (eind->elf.root.type == bfd_link_hash_indirect)
3859 	    abort ();
3860 
3861 	  /* Add reloc counts against the weak sym to the strong sym
3862 	     list.  Merge any entries against the same section.  */
3863 	  for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3864 	    {
3865 	      struct ppc_dyn_relocs *q;
3866 
3867 	      for (q = edir->dyn_relocs; q != NULL; q = q->next)
3868 		if (q->sec == p->sec)
3869 		  {
3870 		    q->pc_count += p->pc_count;
3871 		    q->count += p->count;
3872 		    *pp = p->next;
3873 		    break;
3874 		  }
3875 	      if (q == NULL)
3876 		pp = &p->next;
3877 	    }
3878 	  *pp = edir->dyn_relocs;
3879 	}
3880 
3881       edir->dyn_relocs = eind->dyn_relocs;
3882       eind->dyn_relocs = NULL;
3883     }
3884 
3885   edir->is_func |= eind->is_func;
3886   edir->is_func_descriptor |= eind->is_func_descriptor;
3887   edir->tls_mask |= eind->tls_mask;
3888 
3889   /* If called to transfer flags for a weakdef during processing
3890      of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
3891      We clear it ourselves for ELIMINATE_COPY_RELOCS.  */
3892   if (!(ELIMINATE_COPY_RELOCS
3893 	&& eind->elf.root.type != bfd_link_hash_indirect
3894 	&& edir->elf.dynamic_adjusted))
3895     edir->elf.non_got_ref |= eind->elf.non_got_ref;
3896 
3897   edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3898   edir->elf.ref_regular |= eind->elf.ref_regular;
3899   edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
3900   edir->elf.needs_plt |= eind->elf.needs_plt;
3901 
3902   /* If we were called to copy over info for a weak sym, that's all.  */
3903   if (eind->elf.root.type != bfd_link_hash_indirect)
3904     return;
3905 
3906   /* Copy over got entries that we may have already seen to the
3907      symbol which just became indirect.  */
3908   if (eind->elf.got.glist != NULL)
3909     {
3910       if (edir->elf.got.glist != NULL)
3911 	{
3912 	  struct got_entry **entp;
3913 	  struct got_entry *ent;
3914 
3915 	  for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3916 	    {
3917 	      struct got_entry *dent;
3918 
3919 	      for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3920 		if (dent->addend == ent->addend
3921 		    && dent->owner == ent->owner
3922 		    && dent->tls_type == ent->tls_type)
3923 		  {
3924 		    dent->got.refcount += ent->got.refcount;
3925 		    *entp = ent->next;
3926 		    break;
3927 		  }
3928 	      if (dent == NULL)
3929 		entp = &ent->next;
3930 	    }
3931 	  *entp = edir->elf.got.glist;
3932 	}
3933 
3934       edir->elf.got.glist = eind->elf.got.glist;
3935       eind->elf.got.glist = NULL;
3936     }
3937 
3938   /* And plt entries.  */
3939   move_plt_plist (eind, edir);
3940 
3941   if (edir->elf.dynindx == -1)
3942     {
3943       edir->elf.dynindx = eind->elf.dynindx;
3944       edir->elf.dynstr_index = eind->elf.dynstr_index;
3945       eind->elf.dynindx = -1;
3946       eind->elf.dynstr_index = 0;
3947     }
3948   else
3949     BFD_ASSERT (eind->elf.dynindx == -1);
3950 }
3951 
3952 /* Find the function descriptor hash entry from the given function code
3953    hash entry FH.  Link the entries via their OH fields.  */
3954 
3955 static struct ppc_link_hash_entry *
get_fdh(struct ppc_link_hash_entry * fh,struct ppc_link_hash_table * htab)3956 get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
3957 {
3958   struct ppc_link_hash_entry *fdh = fh->oh;
3959 
3960   if (fdh == NULL)
3961     {
3962       const char *fd_name = fh->elf.root.root.string + 1;
3963 
3964       fdh = (struct ppc_link_hash_entry *)
3965 	elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
3966       if (fdh != NULL)
3967 	{
3968 	  fdh->is_func_descriptor = 1;
3969 	  fdh->oh = fh;
3970 	  fh->is_func = 1;
3971 	  fh->oh = fdh;
3972 	}
3973     }
3974 
3975   return fdh;
3976 }
3977 
3978 /* Make a fake function descriptor sym for the code sym FH.  */
3979 
3980 static struct ppc_link_hash_entry *
make_fdh(struct bfd_link_info * info,struct ppc_link_hash_entry * fh)3981 make_fdh (struct bfd_link_info *info,
3982 	  struct ppc_link_hash_entry *fh)
3983 {
3984   bfd *abfd;
3985   asymbol *newsym;
3986   struct bfd_link_hash_entry *bh;
3987   struct ppc_link_hash_entry *fdh;
3988 
3989   abfd = fh->elf.root.u.undef.abfd;
3990   newsym = bfd_make_empty_symbol (abfd);
3991   newsym->name = fh->elf.root.root.string + 1;
3992   newsym->section = bfd_und_section_ptr;
3993   newsym->value = 0;
3994   newsym->flags = BSF_WEAK;
3995 
3996   bh = NULL;
3997   if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
3998 					 newsym->flags, newsym->section,
3999 					 newsym->value, NULL, FALSE, FALSE,
4000 					 &bh))
4001     return NULL;
4002 
4003   fdh = (struct ppc_link_hash_entry *) bh;
4004   fdh->elf.non_elf = 0;
4005   fdh->fake = 1;
4006   fdh->is_func_descriptor = 1;
4007   fdh->oh = fh;
4008   fh->is_func = 1;
4009   fh->oh = fdh;
4010   return fdh;
4011 }
4012 
4013 /* Hacks to support old ABI code.
4014    When making function calls, old ABI code references function entry
4015    points (dot symbols), while new ABI code references the function
4016    descriptor symbol.  We need to make any combination of reference and
4017    definition work together, without breaking archive linking.
4018 
4019    For a defined function "foo" and an undefined call to "bar":
4020    An old object defines "foo" and ".foo", references ".bar" (possibly
4021    "bar" too).
4022    A new object defines "foo" and references "bar".
4023 
4024    A new object thus has no problem with its undefined symbols being
4025    satisfied by definitions in an old object.  On the other hand, the
4026    old object won't have ".bar" satisfied by a new object.  */
4027 
4028 /* Fix function descriptor symbols defined in .opd sections to be
4029    function type.  */
4030 
4031 static bfd_boolean
ppc64_elf_add_symbol_hook(bfd * ibfd,struct bfd_link_info * info ATTRIBUTE_UNUSED,Elf_Internal_Sym * isym,const char ** name,flagword * flags ATTRIBUTE_UNUSED,asection ** sec,bfd_vma * value ATTRIBUTE_UNUSED)4032 ppc64_elf_add_symbol_hook (bfd *ibfd,
4033 			   struct bfd_link_info *info ATTRIBUTE_UNUSED,
4034 			   Elf_Internal_Sym *isym,
4035 			   const char **name,
4036 			   flagword *flags ATTRIBUTE_UNUSED,
4037 			   asection **sec,
4038 			   bfd_vma *value ATTRIBUTE_UNUSED)
4039 {
4040   if (*sec != NULL
4041       && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
4042     isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4043 
4044   if ((*name)[0] == '.'
4045       && ELF_ST_BIND (isym->st_info) == STB_GLOBAL
4046       && ELF_ST_TYPE (isym->st_info) < STT_SECTION
4047       && is_ppc64_elf_target (ibfd->xvec))
4048     ppc64_elf_tdata (ibfd)->u.has_dotsym = 1;
4049 
4050   return TRUE;
4051 }
4052 
4053 /* This function makes an old ABI object reference to ".bar" cause the
4054    inclusion of a new ABI object archive that defines "bar".
4055    NAME is a symbol defined in an archive.  Return a symbol in the hash
4056    table that might be satisfied by the archive symbols.  */
4057 
4058 static struct elf_link_hash_entry *
ppc64_elf_archive_symbol_lookup(bfd * abfd,struct bfd_link_info * info,const char * name)4059 ppc64_elf_archive_symbol_lookup (bfd *abfd,
4060 				 struct bfd_link_info *info,
4061 				 const char *name)
4062 {
4063   struct elf_link_hash_entry *h;
4064   char *dot_name;
4065   size_t len;
4066 
4067   h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4068   if (h != NULL
4069       /* Don't return this sym if it is a fake function descriptor
4070 	 created by add_symbol_adjust.  */
4071       && !(h->root.type == bfd_link_hash_undefweak
4072 	   && ((struct ppc_link_hash_entry *) h)->fake))
4073     return h;
4074 
4075   if (name[0] == '.')
4076     return h;
4077 
4078   len = strlen (name);
4079   dot_name = bfd_alloc (abfd, len + 2);
4080   if (dot_name == NULL)
4081     return (struct elf_link_hash_entry *) 0 - 1;
4082   dot_name[0] = '.';
4083   memcpy (dot_name + 1, name, len + 1);
4084   h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4085   bfd_release (abfd, dot_name);
4086   return h;
4087 }
4088 
4089 /* This function satisfies all old ABI object references to ".bar" if a
4090    new ABI object defines "bar".  Well, at least, undefined dot symbols
4091    are made weak.  This stops later archive searches from including an
4092    object if we already have a function descriptor definition.  It also
4093    prevents the linker complaining about undefined symbols.
4094    We also check and correct mismatched symbol visibility here.  The
4095    most restrictive visibility of the function descriptor and the
4096    function entry symbol is used.  */
4097 
4098 struct add_symbol_adjust_data
4099 {
4100   struct bfd_link_info *info;
4101   bfd_boolean ok;
4102 };
4103 
4104 static bfd_boolean
add_symbol_adjust(struct elf_link_hash_entry * h,void * inf)4105 add_symbol_adjust (struct elf_link_hash_entry *h, void *inf)
4106 {
4107   struct add_symbol_adjust_data *data;
4108   struct ppc_link_hash_table *htab;
4109   struct ppc_link_hash_entry *eh;
4110   struct ppc_link_hash_entry *fdh;
4111 
4112   if (h->root.type == bfd_link_hash_indirect)
4113     return TRUE;
4114 
4115   if (h->root.type == bfd_link_hash_warning)
4116     h = (struct elf_link_hash_entry *) h->root.u.i.link;
4117 
4118   if (h->root.root.string[0] != '.')
4119     return TRUE;
4120 
4121   data = inf;
4122   htab = ppc_hash_table (data->info);
4123   eh = (struct ppc_link_hash_entry *) h;
4124   fdh = get_fdh (eh, htab);
4125   if (fdh == NULL
4126       && !data->info->relocatable
4127       && (eh->elf.root.type == bfd_link_hash_undefined
4128 	  || eh->elf.root.type == bfd_link_hash_undefweak)
4129       && eh->elf.ref_regular)
4130     {
4131       /* Make an undefweak function descriptor sym, which is enough to
4132 	 pull in an --as-needed shared lib, but won't cause link
4133 	 errors.  Archives are handled elsewhere.  */
4134       fdh = make_fdh (data->info, eh);
4135       if (fdh == NULL)
4136 	data->ok = FALSE;
4137       else
4138 	fdh->elf.ref_regular = 1;
4139     }
4140   else if (fdh != NULL)
4141     {
4142       unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4143       unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4144       if (entry_vis < descr_vis)
4145 	fdh->elf.other += entry_vis - descr_vis;
4146       else if (entry_vis > descr_vis)
4147 	eh->elf.other += descr_vis - entry_vis;
4148 
4149       if ((fdh->elf.root.type == bfd_link_hash_defined
4150 	   || fdh->elf.root.type == bfd_link_hash_defweak)
4151 	  && eh->elf.root.type == bfd_link_hash_undefined)
4152 	{
4153 	  eh->elf.root.type = bfd_link_hash_undefweak;
4154 	  eh->was_undefined = 1;
4155 	  htab->twiddled_syms = 1;
4156 	}
4157     }
4158 
4159   return TRUE;
4160 }
4161 
4162 static bfd_boolean
ppc64_elf_check_directives(bfd * abfd,struct bfd_link_info * info)4163 ppc64_elf_check_directives (bfd *abfd, struct bfd_link_info *info)
4164 {
4165   struct ppc_link_hash_table *htab;
4166   struct add_symbol_adjust_data data;
4167 
4168   if (!is_ppc64_elf_target (abfd->xvec))
4169     return TRUE;
4170 
4171   if (!ppc64_elf_tdata (abfd)->u.has_dotsym)
4172     return TRUE;
4173   ppc64_elf_tdata (abfd)->u.deleted_section = NULL;
4174 
4175   htab = ppc_hash_table (info);
4176   if (!is_ppc64_elf_target (htab->elf.root.creator))
4177     return TRUE;
4178 
4179   data.info = info;
4180   data.ok = TRUE;
4181   elf_link_hash_traverse (&htab->elf, add_symbol_adjust, &data);
4182 
4183   /* We need to fix the undefs list for any syms we have twiddled to
4184      undef_weak.  */
4185   if (htab->twiddled_syms)
4186     {
4187       bfd_link_repair_undef_list (&htab->elf.root);
4188       htab->twiddled_syms = 0;
4189     }
4190   return data.ok;
4191 }
4192 
4193 static bfd_boolean
update_local_sym_info(bfd * abfd,Elf_Internal_Shdr * symtab_hdr,unsigned long r_symndx,bfd_vma r_addend,int tls_type)4194 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4195 		       unsigned long r_symndx, bfd_vma r_addend, int tls_type)
4196 {
4197   struct got_entry **local_got_ents = elf_local_got_ents (abfd);
4198   char *local_got_tls_masks;
4199 
4200   if (local_got_ents == NULL)
4201     {
4202       bfd_size_type size = symtab_hdr->sh_info;
4203 
4204       size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4205       local_got_ents = bfd_zalloc (abfd, size);
4206       if (local_got_ents == NULL)
4207 	return FALSE;
4208       elf_local_got_ents (abfd) = local_got_ents;
4209     }
4210 
4211   if ((tls_type & TLS_EXPLICIT) == 0)
4212     {
4213       struct got_entry *ent;
4214 
4215       for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
4216 	if (ent->addend == r_addend
4217 	    && ent->owner == abfd
4218 	    && ent->tls_type == tls_type)
4219 	  break;
4220       if (ent == NULL)
4221 	{
4222 	  bfd_size_type amt = sizeof (*ent);
4223 	  ent = bfd_alloc (abfd, amt);
4224 	  if (ent == NULL)
4225 	    return FALSE;
4226 	  ent->next = local_got_ents[r_symndx];
4227 	  ent->addend = r_addend;
4228 	  ent->owner = abfd;
4229 	  ent->tls_type = tls_type;
4230 	  ent->got.refcount = 0;
4231 	  local_got_ents[r_symndx] = ent;
4232 	}
4233       ent->got.refcount += 1;
4234     }
4235 
4236   local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4237   local_got_tls_masks[r_symndx] |= tls_type;
4238   return TRUE;
4239 }
4240 
4241 static bfd_boolean
update_plt_info(bfd * abfd,struct ppc_link_hash_entry * eh,bfd_vma addend)4242 update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
4243 {
4244   struct plt_entry *ent;
4245 
4246   for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4247     if (ent->addend == addend)
4248       break;
4249   if (ent == NULL)
4250     {
4251       bfd_size_type amt = sizeof (*ent);
4252       ent = bfd_alloc (abfd, amt);
4253       if (ent == NULL)
4254 	return FALSE;
4255       ent->next = eh->elf.plt.plist;
4256       ent->addend = addend;
4257       ent->plt.refcount = 0;
4258       eh->elf.plt.plist = ent;
4259     }
4260   ent->plt.refcount += 1;
4261   eh->elf.needs_plt = 1;
4262   if (eh->elf.root.root.string[0] == '.'
4263       && eh->elf.root.root.string[1] != '\0')
4264     eh->is_func = 1;
4265   return TRUE;
4266 }
4267 
4268 /* Look through the relocs for a section during the first phase, and
4269    calculate needed space in the global offset table, procedure
4270    linkage table, and dynamic reloc sections.  */
4271 
4272 static bfd_boolean
ppc64_elf_check_relocs(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)4273 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4274 			asection *sec, const Elf_Internal_Rela *relocs)
4275 {
4276   struct ppc_link_hash_table *htab;
4277   Elf_Internal_Shdr *symtab_hdr;
4278   struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4279   const Elf_Internal_Rela *rel;
4280   const Elf_Internal_Rela *rel_end;
4281   asection *sreloc;
4282   asection **opd_sym_map;
4283 
4284   if (info->relocatable)
4285     return TRUE;
4286 
4287   /* Don't do anything special with non-loaded, non-alloced sections.
4288      In particular, any relocs in such sections should not affect GOT
4289      and PLT reference counting (ie. we don't allow them to create GOT
4290      or PLT entries), there's no possibility or desire to optimize TLS
4291      relocs, and there's not much point in propagating relocs to shared
4292      libs that the dynamic linker won't relocate.  */
4293   if ((sec->flags & SEC_ALLOC) == 0)
4294     return TRUE;
4295 
4296   htab = ppc_hash_table (info);
4297   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
4298 
4299   sym_hashes = elf_sym_hashes (abfd);
4300   sym_hashes_end = (sym_hashes
4301 		    + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4302 		    - symtab_hdr->sh_info);
4303 
4304   sreloc = NULL;
4305   opd_sym_map = NULL;
4306   if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4307     {
4308       /* Garbage collection needs some extra help with .opd sections.
4309 	 We don't want to necessarily keep everything referenced by
4310 	 relocs in .opd, as that would keep all functions.  Instead,
4311 	 if we reference an .opd symbol (a function descriptor), we
4312 	 want to keep the function code symbol's section.  This is
4313 	 easy for global symbols, but for local syms we need to keep
4314 	 information about the associated function section.  Later, if
4315 	 edit_opd deletes entries, we'll use this array to adjust
4316 	 local syms in .opd.  */
4317       union opd_info {
4318 	asection *func_section;
4319 	long entry_adjust;
4320       };
4321       bfd_size_type amt;
4322 
4323       amt = sec->size * sizeof (union opd_info) / 8;
4324       opd_sym_map = bfd_zalloc (abfd, amt);
4325       if (opd_sym_map == NULL)
4326 	return FALSE;
4327       ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map;
4328     }
4329 
4330   if (htab->sfpr == NULL
4331       && !create_linkage_sections (htab->elf.dynobj, info))
4332     return FALSE;
4333 
4334   rel_end = relocs + sec->reloc_count;
4335   for (rel = relocs; rel < rel_end; rel++)
4336     {
4337       unsigned long r_symndx;
4338       struct elf_link_hash_entry *h;
4339       enum elf_ppc64_reloc_type r_type;
4340       int tls_type = 0;
4341 
4342       r_symndx = ELF64_R_SYM (rel->r_info);
4343       if (r_symndx < symtab_hdr->sh_info)
4344 	h = NULL;
4345       else
4346 	{
4347 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4348 	  while (h->root.type == bfd_link_hash_indirect
4349 		 || h->root.type == bfd_link_hash_warning)
4350 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
4351 	}
4352 
4353       r_type = ELF64_R_TYPE (rel->r_info);
4354       switch (r_type)
4355 	{
4356 	case R_PPC64_GOT_TLSLD16:
4357 	case R_PPC64_GOT_TLSLD16_LO:
4358 	case R_PPC64_GOT_TLSLD16_HI:
4359 	case R_PPC64_GOT_TLSLD16_HA:
4360 	  ppc64_tlsld_got (abfd)->refcount += 1;
4361 	  tls_type = TLS_TLS | TLS_LD;
4362 	  goto dogottls;
4363 
4364 	case R_PPC64_GOT_TLSGD16:
4365 	case R_PPC64_GOT_TLSGD16_LO:
4366 	case R_PPC64_GOT_TLSGD16_HI:
4367 	case R_PPC64_GOT_TLSGD16_HA:
4368 	  tls_type = TLS_TLS | TLS_GD;
4369 	  goto dogottls;
4370 
4371 	case R_PPC64_GOT_TPREL16_DS:
4372 	case R_PPC64_GOT_TPREL16_LO_DS:
4373 	case R_PPC64_GOT_TPREL16_HI:
4374 	case R_PPC64_GOT_TPREL16_HA:
4375 	  if (info->shared)
4376 	    info->flags |= DF_STATIC_TLS;
4377 	  tls_type = TLS_TLS | TLS_TPREL;
4378 	  goto dogottls;
4379 
4380 	case R_PPC64_GOT_DTPREL16_DS:
4381 	case R_PPC64_GOT_DTPREL16_LO_DS:
4382 	case R_PPC64_GOT_DTPREL16_HI:
4383 	case R_PPC64_GOT_DTPREL16_HA:
4384 	  tls_type = TLS_TLS | TLS_DTPREL;
4385 	dogottls:
4386 	  sec->has_tls_reloc = 1;
4387 	  /* Fall thru */
4388 
4389 	case R_PPC64_GOT16:
4390 	case R_PPC64_GOT16_DS:
4391 	case R_PPC64_GOT16_HA:
4392 	case R_PPC64_GOT16_HI:
4393 	case R_PPC64_GOT16_LO:
4394 	case R_PPC64_GOT16_LO_DS:
4395 	  /* This symbol requires a global offset table entry.  */
4396 	  sec->has_toc_reloc = 1;
4397 	  if (ppc64_elf_tdata (abfd)->got == NULL
4398 	      && !create_got_section (abfd, info))
4399 	    return FALSE;
4400 
4401 	  if (h != NULL)
4402 	    {
4403 	      struct ppc_link_hash_entry *eh;
4404 	      struct got_entry *ent;
4405 
4406 	      eh = (struct ppc_link_hash_entry *) h;
4407 	      for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4408 		if (ent->addend == rel->r_addend
4409 		    && ent->owner == abfd
4410 		    && ent->tls_type == tls_type)
4411 		  break;
4412 	      if (ent == NULL)
4413 		{
4414 		  bfd_size_type amt = sizeof (*ent);
4415 		  ent = bfd_alloc (abfd, amt);
4416 		  if (ent == NULL)
4417 		    return FALSE;
4418 		  ent->next = eh->elf.got.glist;
4419 		  ent->addend = rel->r_addend;
4420 		  ent->owner = abfd;
4421 		  ent->tls_type = tls_type;
4422 		  ent->got.refcount = 0;
4423 		  eh->elf.got.glist = ent;
4424 		}
4425 	      ent->got.refcount += 1;
4426 	      eh->tls_mask |= tls_type;
4427 	    }
4428 	  else
4429 	    /* This is a global offset table entry for a local symbol.  */
4430 	    if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4431 					rel->r_addend, tls_type))
4432 	      return FALSE;
4433 	  break;
4434 
4435 	case R_PPC64_PLT16_HA:
4436 	case R_PPC64_PLT16_HI:
4437 	case R_PPC64_PLT16_LO:
4438 	case R_PPC64_PLT32:
4439 	case R_PPC64_PLT64:
4440 	  /* This symbol requires a procedure linkage table entry.  We
4441 	     actually build the entry in adjust_dynamic_symbol,
4442 	     because this might be a case of linking PIC code without
4443 	     linking in any dynamic objects, in which case we don't
4444 	     need to generate a procedure linkage table after all.  */
4445 	  if (h == NULL)
4446 	    {
4447 	      /* It does not make sense to have a procedure linkage
4448 		 table entry for a local symbol.  */
4449 	      bfd_set_error (bfd_error_bad_value);
4450 	      return FALSE;
4451 	    }
4452 	  else
4453 	    if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4454 				  rel->r_addend))
4455 	      return FALSE;
4456 	  break;
4457 
4458 	  /* The following relocations don't need to propagate the
4459 	     relocation if linking a shared object since they are
4460 	     section relative.  */
4461 	case R_PPC64_SECTOFF:
4462 	case R_PPC64_SECTOFF_LO:
4463 	case R_PPC64_SECTOFF_HI:
4464 	case R_PPC64_SECTOFF_HA:
4465 	case R_PPC64_SECTOFF_DS:
4466 	case R_PPC64_SECTOFF_LO_DS:
4467 	case R_PPC64_DTPREL16:
4468 	case R_PPC64_DTPREL16_LO:
4469 	case R_PPC64_DTPREL16_HI:
4470 	case R_PPC64_DTPREL16_HA:
4471 	case R_PPC64_DTPREL16_DS:
4472 	case R_PPC64_DTPREL16_LO_DS:
4473 	case R_PPC64_DTPREL16_HIGHER:
4474 	case R_PPC64_DTPREL16_HIGHERA:
4475 	case R_PPC64_DTPREL16_HIGHEST:
4476 	case R_PPC64_DTPREL16_HIGHESTA:
4477 	  break;
4478 
4479 	  /* Nor do these.  */
4480 	case R_PPC64_TOC16:
4481 	case R_PPC64_TOC16_LO:
4482 	case R_PPC64_TOC16_HI:
4483 	case R_PPC64_TOC16_HA:
4484 	case R_PPC64_TOC16_DS:
4485 	case R_PPC64_TOC16_LO_DS:
4486 	  sec->has_toc_reloc = 1;
4487 	  break;
4488 
4489 	  /* This relocation describes the C++ object vtable hierarchy.
4490 	     Reconstruct it for later use during GC.  */
4491 	case R_PPC64_GNU_VTINHERIT:
4492 	  if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
4493 	    return FALSE;
4494 	  break;
4495 
4496 	  /* This relocation describes which C++ vtable entries are actually
4497 	     used.  Record for later use during GC.  */
4498 	case R_PPC64_GNU_VTENTRY:
4499 	  if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
4500 	    return FALSE;
4501 	  break;
4502 
4503 	case R_PPC64_REL14:
4504 	case R_PPC64_REL14_BRTAKEN:
4505 	case R_PPC64_REL14_BRNTAKEN:
4506 	  htab->has_14bit_branch = 1;
4507 	  /* Fall through.  */
4508 
4509 	case R_PPC64_REL24:
4510 	  if (h != NULL)
4511 	    {
4512 	      /* We may need a .plt entry if the function this reloc
4513 		 refers to is in a shared lib.  */
4514 	      if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4515 				    rel->r_addend))
4516 		return FALSE;
4517 	      if (h == &htab->tls_get_addr->elf
4518 		  || h == &htab->tls_get_addr_fd->elf)
4519 		sec->has_tls_reloc = 1;
4520 	      else if (htab->tls_get_addr == NULL
4521 		       && !strncmp (h->root.root.string, ".__tls_get_addr", 15)
4522 		       && (h->root.root.string[15] == 0
4523 			   || h->root.root.string[15] == '@'))
4524 		{
4525 		  htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4526 		  sec->has_tls_reloc = 1;
4527 		}
4528 	      else if (htab->tls_get_addr_fd == NULL
4529 		       && !strncmp (h->root.root.string, "__tls_get_addr", 14)
4530 		       && (h->root.root.string[14] == 0
4531 			   || h->root.root.string[14] == '@'))
4532 		{
4533 		  htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
4534 		  sec->has_tls_reloc = 1;
4535 		}
4536 	    }
4537 	  break;
4538 
4539 	case R_PPC64_TPREL64:
4540 	  tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4541 	  if (info->shared)
4542 	    info->flags |= DF_STATIC_TLS;
4543 	  goto dotlstoc;
4544 
4545 	case R_PPC64_DTPMOD64:
4546 	  if (rel + 1 < rel_end
4547 	      && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4548 	      && rel[1].r_offset == rel->r_offset + 8)
4549 	    tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
4550 	  else
4551 	    tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
4552 	  goto dotlstoc;
4553 
4554 	case R_PPC64_DTPREL64:
4555 	  tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4556 	  if (rel != relocs
4557 	      && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4558 	      && rel[-1].r_offset == rel->r_offset - 8)
4559 	    /* This is the second reloc of a dtpmod, dtprel pair.
4560 	       Don't mark with TLS_DTPREL.  */
4561 	    goto dodyn;
4562 
4563 	dotlstoc:
4564 	  sec->has_tls_reloc = 1;
4565 	  if (h != NULL)
4566 	    {
4567 	      struct ppc_link_hash_entry *eh;
4568 	      eh = (struct ppc_link_hash_entry *) h;
4569 	      eh->tls_mask |= tls_type;
4570 	    }
4571 	  else
4572 	    if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4573 					rel->r_addend, tls_type))
4574 	      return FALSE;
4575 
4576 	  if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4577 	    {
4578 	      /* One extra to simplify get_tls_mask.  */
4579 	      bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4580 	      ppc64_elf_section_data (sec)->t_symndx = bfd_zalloc (abfd, amt);
4581 	      if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4582 		return FALSE;
4583 	    }
4584 	  BFD_ASSERT (rel->r_offset % 8 == 0);
4585 	  ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8] = r_symndx;
4586 
4587 	  /* Mark the second slot of a GD or LD entry.
4588 	     -1 to indicate GD and -2 to indicate LD.  */
4589 	  if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4590 	    ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -1;
4591 	  else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4592 	    ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -2;
4593 	  goto dodyn;
4594 
4595 	case R_PPC64_TPREL16:
4596 	case R_PPC64_TPREL16_LO:
4597 	case R_PPC64_TPREL16_HI:
4598 	case R_PPC64_TPREL16_HA:
4599 	case R_PPC64_TPREL16_DS:
4600 	case R_PPC64_TPREL16_LO_DS:
4601 	case R_PPC64_TPREL16_HIGHER:
4602 	case R_PPC64_TPREL16_HIGHERA:
4603 	case R_PPC64_TPREL16_HIGHEST:
4604 	case R_PPC64_TPREL16_HIGHESTA:
4605 	  if (info->shared)
4606 	    {
4607 	      info->flags |= DF_STATIC_TLS;
4608 	      goto dodyn;
4609 	    }
4610 	  break;
4611 
4612 	case R_PPC64_ADDR64:
4613 	  if (opd_sym_map != NULL
4614 	      && rel + 1 < rel_end
4615 	      && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
4616 	    {
4617 	      if (h != NULL)
4618 		{
4619 		  if (h->root.root.string[0] == '.'
4620 		      && h->root.root.string[1] != 0
4621 		      && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4622 		    ;
4623 		  else
4624 		    ((struct ppc_link_hash_entry *) h)->is_func = 1;
4625 		}
4626 	      else
4627 		{
4628 		  asection *s;
4629 
4630 		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4631 						 r_symndx);
4632 		  if (s == NULL)
4633 		    return FALSE;
4634 		  else if (s != sec)
4635 		    opd_sym_map[rel->r_offset / 8] = s;
4636 		}
4637 	    }
4638 	  /* Fall through.  */
4639 
4640 	case R_PPC64_REL30:
4641 	case R_PPC64_REL32:
4642 	case R_PPC64_REL64:
4643 	case R_PPC64_ADDR14:
4644 	case R_PPC64_ADDR14_BRNTAKEN:
4645 	case R_PPC64_ADDR14_BRTAKEN:
4646 	case R_PPC64_ADDR16:
4647 	case R_PPC64_ADDR16_DS:
4648 	case R_PPC64_ADDR16_HA:
4649 	case R_PPC64_ADDR16_HI:
4650 	case R_PPC64_ADDR16_HIGHER:
4651 	case R_PPC64_ADDR16_HIGHERA:
4652 	case R_PPC64_ADDR16_HIGHEST:
4653 	case R_PPC64_ADDR16_HIGHESTA:
4654 	case R_PPC64_ADDR16_LO:
4655 	case R_PPC64_ADDR16_LO_DS:
4656 	case R_PPC64_ADDR24:
4657 	case R_PPC64_ADDR32:
4658 	case R_PPC64_UADDR16:
4659 	case R_PPC64_UADDR32:
4660 	case R_PPC64_UADDR64:
4661 	case R_PPC64_TOC:
4662 	  if (h != NULL && !info->shared)
4663 	    /* We may need a copy reloc.  */
4664 	    h->non_got_ref = 1;
4665 
4666 	  /* Don't propagate .opd relocs.  */
4667 	  if (NO_OPD_RELOCS && opd_sym_map != NULL)
4668 	    break;
4669 
4670 	  /* If we are creating a shared library, and this is a reloc
4671 	     against a global symbol, or a non PC relative reloc
4672 	     against a local symbol, then we need to copy the reloc
4673 	     into the shared library.  However, if we are linking with
4674 	     -Bsymbolic, we do not need to copy a reloc against a
4675 	     global symbol which is defined in an object we are
4676 	     including in the link (i.e., DEF_REGULAR is set).  At
4677 	     this point we have not seen all the input files, so it is
4678 	     possible that DEF_REGULAR is not set now but will be set
4679 	     later (it is never cleared).  In case of a weak definition,
4680 	     DEF_REGULAR may be cleared later by a strong definition in
4681 	     a shared library.  We account for that possibility below by
4682 	     storing information in the dyn_relocs field of the hash
4683 	     table entry.  A similar situation occurs when creating
4684 	     shared libraries and symbol visibility changes render the
4685 	     symbol local.
4686 
4687 	     If on the other hand, we are creating an executable, we
4688 	     may need to keep relocations for symbols satisfied by a
4689 	     dynamic library if we manage to avoid copy relocs for the
4690 	     symbol.  */
4691 	dodyn:
4692 	  if ((info->shared
4693 	       && (MUST_BE_DYN_RELOC (r_type)
4694 		   || (h != NULL
4695 		       && (! info->symbolic
4696 			   || h->root.type == bfd_link_hash_defweak
4697 			   || !h->def_regular))))
4698 	      || (ELIMINATE_COPY_RELOCS
4699 		  && !info->shared
4700 		  && h != NULL
4701 		  && (h->root.type == bfd_link_hash_defweak
4702 		      || !h->def_regular)))
4703 	    {
4704 	      struct ppc_dyn_relocs *p;
4705 	      struct ppc_dyn_relocs **head;
4706 
4707 	      /* We must copy these reloc types into the output file.
4708 		 Create a reloc section in dynobj and make room for
4709 		 this reloc.  */
4710 	      if (sreloc == NULL)
4711 		{
4712 		  const char *name;
4713 		  bfd *dynobj;
4714 
4715 		  name = (bfd_elf_string_from_elf_section
4716 			  (abfd,
4717 			   elf_elfheader (abfd)->e_shstrndx,
4718 			   elf_section_data (sec)->rel_hdr.sh_name));
4719 		  if (name == NULL)
4720 		    return FALSE;
4721 
4722 		  if (strncmp (name, ".rela", 5) != 0
4723 		      || strcmp (bfd_get_section_name (abfd, sec),
4724 				 name + 5) != 0)
4725 		    {
4726 		      (*_bfd_error_handler)
4727 			(_("%B: bad relocation section name `%s\'"),
4728 			 abfd, name);
4729 		      bfd_set_error (bfd_error_bad_value);
4730 		    }
4731 
4732 		  dynobj = htab->elf.dynobj;
4733 		  sreloc = bfd_get_section_by_name (dynobj, name);
4734 		  if (sreloc == NULL)
4735 		    {
4736 		      flagword flags;
4737 
4738 		      flags = (SEC_HAS_CONTENTS | SEC_READONLY
4739 			       | SEC_IN_MEMORY | SEC_LINKER_CREATED
4740 			       | SEC_ALLOC | SEC_LOAD);
4741 		      sreloc = bfd_make_section_with_flags (dynobj,
4742 							    name,
4743 							    flags);
4744 		      if (sreloc == NULL
4745 			  || ! bfd_set_section_alignment (dynobj, sreloc, 3))
4746 			return FALSE;
4747 		    }
4748 		  elf_section_data (sec)->sreloc = sreloc;
4749 		}
4750 
4751 	      /* If this is a global symbol, we count the number of
4752 		 relocations we need for this symbol.  */
4753 	      if (h != NULL)
4754 		{
4755 		  head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
4756 		}
4757 	      else
4758 		{
4759 		  /* Track dynamic relocs needed for local syms too.
4760 		     We really need local syms available to do this
4761 		     easily.  Oh well.  */
4762 
4763 		  asection *s;
4764 		  s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4765 						 sec, r_symndx);
4766 		  if (s == NULL)
4767 		    return FALSE;
4768 
4769 		  head = ((struct ppc_dyn_relocs **)
4770 			  &elf_section_data (s)->local_dynrel);
4771 		}
4772 
4773 	      p = *head;
4774 	      if (p == NULL || p->sec != sec)
4775 		{
4776 		  p = bfd_alloc (htab->elf.dynobj, sizeof *p);
4777 		  if (p == NULL)
4778 		    return FALSE;
4779 		  p->next = *head;
4780 		  *head = p;
4781 		  p->sec = sec;
4782 		  p->count = 0;
4783 		  p->pc_count = 0;
4784 		}
4785 
4786 	      p->count += 1;
4787 	      if (!MUST_BE_DYN_RELOC (r_type))
4788 		p->pc_count += 1;
4789 	    }
4790 	  break;
4791 
4792 	default:
4793 	  break;
4794 	}
4795     }
4796 
4797   return TRUE;
4798 }
4799 
4800 /* OFFSET in OPD_SEC specifies a function descriptor.  Return the address
4801    of the code entry point, and its section.  */
4802 
4803 static bfd_vma
opd_entry_value(asection * opd_sec,bfd_vma offset,asection ** code_sec,bfd_vma * code_off)4804 opd_entry_value (asection *opd_sec,
4805 		 bfd_vma offset,
4806 		 asection **code_sec,
4807 		 bfd_vma *code_off)
4808 {
4809   bfd *opd_bfd = opd_sec->owner;
4810   Elf_Internal_Rela *relocs;
4811   Elf_Internal_Rela *lo, *hi, *look;
4812   bfd_vma val;
4813 
4814   /* No relocs implies we are linking a --just-symbols object.  */
4815   if (opd_sec->reloc_count == 0)
4816     {
4817       bfd_vma val;
4818 
4819       if (!bfd_get_section_contents (opd_bfd, opd_sec, &val, offset, 8))
4820 	return (bfd_vma) -1;
4821 
4822       if (code_sec != NULL)
4823 	{
4824 	  asection *sec, *likely = NULL;
4825 	  for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
4826 	    if (sec->vma <= val
4827 		&& (sec->flags & SEC_LOAD) != 0
4828 		&& (sec->flags & SEC_ALLOC) != 0)
4829 	      likely = sec;
4830 	  if (likely != NULL)
4831 	    {
4832 	      *code_sec = likely;
4833 	      if (code_off != NULL)
4834 		*code_off = val - likely->vma;
4835 	    }
4836 	}
4837       return val;
4838     }
4839 
4840   relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
4841   if (relocs == NULL)
4842     relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
4843 
4844   /* Go find the opd reloc at the sym address.  */
4845   lo = relocs;
4846   BFD_ASSERT (lo != NULL);
4847   hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
4848   val = (bfd_vma) -1;
4849   while (lo < hi)
4850     {
4851       look = lo + (hi - lo) / 2;
4852       if (look->r_offset < offset)
4853 	lo = look + 1;
4854       else if (look->r_offset > offset)
4855 	hi = look;
4856       else
4857 	{
4858 	  Elf_Internal_Shdr *symtab_hdr = &elf_tdata (opd_bfd)->symtab_hdr;
4859 	  if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
4860 	      && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
4861 	    {
4862 	      unsigned long symndx = ELF64_R_SYM (look->r_info);
4863 	      asection *sec;
4864 
4865 	      if (symndx < symtab_hdr->sh_info)
4866 		{
4867 		  Elf_Internal_Sym *sym;
4868 
4869 		  sym = (Elf_Internal_Sym *) symtab_hdr->contents;
4870 		  if (sym == NULL)
4871 		    {
4872 		      sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
4873 						  symtab_hdr->sh_info,
4874 						  0, NULL, NULL, NULL);
4875 		      if (sym == NULL)
4876 			break;
4877 		      symtab_hdr->contents = (bfd_byte *) sym;
4878 		    }
4879 
4880 		  sym += symndx;
4881 		  val = sym->st_value;
4882 		  sec = NULL;
4883 		  if ((sym->st_shndx != SHN_UNDEF
4884 		       && sym->st_shndx < SHN_LORESERVE)
4885 		      || sym->st_shndx > SHN_HIRESERVE)
4886 		    sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
4887 		  BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
4888 		}
4889 	      else
4890 		{
4891 		  struct elf_link_hash_entry **sym_hashes;
4892 		  struct elf_link_hash_entry *rh;
4893 
4894 		  sym_hashes = elf_sym_hashes (opd_bfd);
4895 		  rh = sym_hashes[symndx - symtab_hdr->sh_info];
4896 		  while (rh->root.type == bfd_link_hash_indirect
4897 			 || rh->root.type == bfd_link_hash_warning)
4898 		    rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
4899 		  BFD_ASSERT (rh->root.type == bfd_link_hash_defined
4900 			      || rh->root.type == bfd_link_hash_defweak);
4901 		  val = rh->root.u.def.value;
4902 		  sec = rh->root.u.def.section;
4903 		}
4904 	      val += look->r_addend;
4905 	      if (code_off != NULL)
4906 		*code_off = val;
4907 	      if (code_sec != NULL)
4908 		*code_sec = sec;
4909 	      if (sec != NULL && sec->output_section != NULL)
4910 		val += sec->output_section->vma + sec->output_offset;
4911 	    }
4912 	  break;
4913 	}
4914     }
4915 
4916   return val;
4917 }
4918 
4919 /* Return the section that should be marked against GC for a given
4920    relocation.  */
4921 
4922 static asection *
ppc64_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)4923 ppc64_elf_gc_mark_hook (asection *sec,
4924 			struct bfd_link_info *info,
4925 			Elf_Internal_Rela *rel,
4926 			struct elf_link_hash_entry *h,
4927 			Elf_Internal_Sym *sym)
4928 {
4929   asection *rsec;
4930 
4931   /* First mark all our entry sym sections.  */
4932   if (info->gc_sym_list != NULL)
4933     {
4934       struct ppc_link_hash_table *htab = ppc_hash_table (info);
4935       struct bfd_sym_chain *sym = info->gc_sym_list;
4936 
4937       info->gc_sym_list = NULL;
4938       do
4939 	{
4940 	  struct ppc_link_hash_entry *eh;
4941 
4942 	  eh = (struct ppc_link_hash_entry *)
4943 	    elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
4944 	  if (eh == NULL)
4945 	    continue;
4946 	  if (eh->elf.root.type != bfd_link_hash_defined
4947 	      && eh->elf.root.type != bfd_link_hash_defweak)
4948 	    continue;
4949 
4950 	  if (eh->is_func_descriptor
4951 	      && (eh->oh->elf.root.type == bfd_link_hash_defined
4952 		  || eh->oh->elf.root.type == bfd_link_hash_defweak))
4953 	    rsec = eh->oh->elf.root.u.def.section;
4954 	  else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4955 		   && opd_entry_value (eh->elf.root.u.def.section,
4956 				       eh->elf.root.u.def.value,
4957 				       &rsec, NULL) != (bfd_vma) -1)
4958 	    ;
4959 	  else
4960 	    continue;
4961 
4962 	  if (!rsec->gc_mark)
4963 	    _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4964 
4965 	  rsec = eh->elf.root.u.def.section;
4966 	  if (!rsec->gc_mark)
4967 	    _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4968 
4969 	  sym = sym->next;
4970 	}
4971       while (sym != NULL);
4972     }
4973 
4974   /* Syms return NULL if we're marking .opd, so we avoid marking all
4975      function sections, as all functions are referenced in .opd.  */
4976   rsec = NULL;
4977   if (get_opd_info (sec) != NULL)
4978     return rsec;
4979 
4980   if (h != NULL)
4981     {
4982       enum elf_ppc64_reloc_type r_type;
4983       struct ppc_link_hash_entry *eh;
4984 
4985       r_type = ELF64_R_TYPE (rel->r_info);
4986       switch (r_type)
4987 	{
4988 	case R_PPC64_GNU_VTINHERIT:
4989 	case R_PPC64_GNU_VTENTRY:
4990 	  break;
4991 
4992 	default:
4993 	  switch (h->root.type)
4994 	    {
4995 	    case bfd_link_hash_defined:
4996 	    case bfd_link_hash_defweak:
4997 	      eh = (struct ppc_link_hash_entry *) h;
4998 	      if (eh->oh != NULL
4999 		  && eh->oh->is_func_descriptor
5000 		  && (eh->oh->elf.root.type == bfd_link_hash_defined
5001 		      || eh->oh->elf.root.type == bfd_link_hash_defweak))
5002 		eh = eh->oh;
5003 
5004 	      /* Function descriptor syms cause the associated
5005 		 function code sym section to be marked.  */
5006 	      if (eh->is_func_descriptor
5007 		  && (eh->oh->elf.root.type == bfd_link_hash_defined
5008 		      || eh->oh->elf.root.type == bfd_link_hash_defweak))
5009 		{
5010 		  /* They also mark their opd section.  */
5011 		  if (!eh->elf.root.u.def.section->gc_mark)
5012 		    _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
5013 				      ppc64_elf_gc_mark_hook);
5014 
5015 		  rsec = eh->oh->elf.root.u.def.section;
5016 		}
5017 	      else if (get_opd_info (eh->elf.root.u.def.section) != NULL
5018 		       && opd_entry_value (eh->elf.root.u.def.section,
5019 					   eh->elf.root.u.def.value,
5020 					   &rsec, NULL) != (bfd_vma) -1)
5021 		{
5022 		  if (!eh->elf.root.u.def.section->gc_mark)
5023 		    _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
5024 				      ppc64_elf_gc_mark_hook);
5025 		}
5026 	      else
5027 		rsec = h->root.u.def.section;
5028 	      break;
5029 
5030 	    case bfd_link_hash_common:
5031 	      rsec = h->root.u.c.p->section;
5032 	      break;
5033 
5034 	    default:
5035 	      break;
5036 	    }
5037 	}
5038     }
5039   else
5040     {
5041       asection **opd_sym_section;
5042 
5043       rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
5044       opd_sym_section = get_opd_info (rsec);
5045       if (opd_sym_section != NULL)
5046 	{
5047 	  if (!rsec->gc_mark)
5048 	    _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
5049 
5050 	  rsec = opd_sym_section[(sym->st_value + rel->r_addend) / 8];
5051 	}
5052     }
5053 
5054   return rsec;
5055 }
5056 
5057 /* Update the .got, .plt. and dynamic reloc reference counts for the
5058    section being removed.  */
5059 
5060 static bfd_boolean
ppc64_elf_gc_sweep_hook(bfd * abfd,struct bfd_link_info * info,asection * sec,const Elf_Internal_Rela * relocs)5061 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5062 			 asection *sec, const Elf_Internal_Rela *relocs)
5063 {
5064   struct ppc_link_hash_table *htab;
5065   Elf_Internal_Shdr *symtab_hdr;
5066   struct elf_link_hash_entry **sym_hashes;
5067   struct got_entry **local_got_ents;
5068   const Elf_Internal_Rela *rel, *relend;
5069 
5070   if ((sec->flags & SEC_ALLOC) == 0)
5071     return TRUE;
5072 
5073   elf_section_data (sec)->local_dynrel = NULL;
5074 
5075   htab = ppc_hash_table (info);
5076   symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5077   sym_hashes = elf_sym_hashes (abfd);
5078   local_got_ents = elf_local_got_ents (abfd);
5079 
5080   relend = relocs + sec->reloc_count;
5081   for (rel = relocs; rel < relend; rel++)
5082     {
5083       unsigned long r_symndx;
5084       enum elf_ppc64_reloc_type r_type;
5085       struct elf_link_hash_entry *h = NULL;
5086       char tls_type = 0;
5087 
5088       r_symndx = ELF64_R_SYM (rel->r_info);
5089       r_type = ELF64_R_TYPE (rel->r_info);
5090       if (r_symndx >= symtab_hdr->sh_info)
5091 	{
5092 	  struct ppc_link_hash_entry *eh;
5093 	  struct ppc_dyn_relocs **pp;
5094 	  struct ppc_dyn_relocs *p;
5095 
5096 	  h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5097 	  while (h->root.type == bfd_link_hash_indirect
5098 		 || h->root.type == bfd_link_hash_warning)
5099 	    h = (struct elf_link_hash_entry *) h->root.u.i.link;
5100 	  eh = (struct ppc_link_hash_entry *) h;
5101 
5102 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5103 	    if (p->sec == sec)
5104 	      {
5105 		/* Everything must go for SEC.  */
5106 		*pp = p->next;
5107 		break;
5108 	      }
5109 	}
5110 
5111       switch (r_type)
5112 	{
5113 	case R_PPC64_GOT_TLSLD16:
5114 	case R_PPC64_GOT_TLSLD16_LO:
5115 	case R_PPC64_GOT_TLSLD16_HI:
5116 	case R_PPC64_GOT_TLSLD16_HA:
5117 	  ppc64_tlsld_got (abfd)->refcount -= 1;
5118 	  tls_type = TLS_TLS | TLS_LD;
5119 	  goto dogot;
5120 
5121 	case R_PPC64_GOT_TLSGD16:
5122 	case R_PPC64_GOT_TLSGD16_LO:
5123 	case R_PPC64_GOT_TLSGD16_HI:
5124 	case R_PPC64_GOT_TLSGD16_HA:
5125 	  tls_type = TLS_TLS | TLS_GD;
5126 	  goto dogot;
5127 
5128 	case R_PPC64_GOT_TPREL16_DS:
5129 	case R_PPC64_GOT_TPREL16_LO_DS:
5130 	case R_PPC64_GOT_TPREL16_HI:
5131 	case R_PPC64_GOT_TPREL16_HA:
5132 	  tls_type = TLS_TLS | TLS_TPREL;
5133 	  goto dogot;
5134 
5135 	case R_PPC64_GOT_DTPREL16_DS:
5136 	case R_PPC64_GOT_DTPREL16_LO_DS:
5137 	case R_PPC64_GOT_DTPREL16_HI:
5138 	case R_PPC64_GOT_DTPREL16_HA:
5139 	  tls_type = TLS_TLS | TLS_DTPREL;
5140 	  goto dogot;
5141 
5142 	case R_PPC64_GOT16:
5143 	case R_PPC64_GOT16_DS:
5144 	case R_PPC64_GOT16_HA:
5145 	case R_PPC64_GOT16_HI:
5146 	case R_PPC64_GOT16_LO:
5147 	case R_PPC64_GOT16_LO_DS:
5148 	dogot:
5149 	  {
5150 	    struct got_entry *ent;
5151 
5152 	    if (h != NULL)
5153 	      ent = h->got.glist;
5154 	    else
5155 	      ent = local_got_ents[r_symndx];
5156 
5157 	    for (; ent != NULL; ent = ent->next)
5158 	      if (ent->addend == rel->r_addend
5159 		  && ent->owner == abfd
5160 		  && ent->tls_type == tls_type)
5161 		break;
5162 	    if (ent == NULL)
5163 	      abort ();
5164 	    if (ent->got.refcount > 0)
5165 	      ent->got.refcount -= 1;
5166 	  }
5167 	  break;
5168 
5169 	case R_PPC64_PLT16_HA:
5170 	case R_PPC64_PLT16_HI:
5171 	case R_PPC64_PLT16_LO:
5172 	case R_PPC64_PLT32:
5173 	case R_PPC64_PLT64:
5174 	case R_PPC64_REL14:
5175 	case R_PPC64_REL14_BRNTAKEN:
5176 	case R_PPC64_REL14_BRTAKEN:
5177 	case R_PPC64_REL24:
5178 	  if (h != NULL)
5179 	    {
5180 	      struct plt_entry *ent;
5181 
5182 	      for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5183 		if (ent->addend == rel->r_addend)
5184 		  break;
5185 	      if (ent == NULL)
5186 		abort ();
5187 	      if (ent->plt.refcount > 0)
5188 		ent->plt.refcount -= 1;
5189 	    }
5190 	  break;
5191 
5192 	default:
5193 	  break;
5194 	}
5195     }
5196   return TRUE;
5197 }
5198 
5199 /* The maximum size of .sfpr.  */
5200 #define SFPR_MAX (218*4)
5201 
5202 struct sfpr_def_parms
5203 {
5204   const char name[12];
5205   unsigned char lo, hi;
5206   bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5207   bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5208 };
5209 
5210 /* Auto-generate _save*, _rest* functions in .sfpr.  */
5211 
5212 static unsigned int
sfpr_define(struct bfd_link_info * info,const struct sfpr_def_parms * parm)5213 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5214 {
5215   struct ppc_link_hash_table *htab = ppc_hash_table (info);
5216   unsigned int i;
5217   size_t len = strlen (parm->name);
5218   bfd_boolean writing = FALSE;
5219   char sym[16];
5220 
5221   memcpy (sym, parm->name, len);
5222   sym[len + 2] = 0;
5223 
5224   for (i = parm->lo; i <= parm->hi; i++)
5225     {
5226       struct elf_link_hash_entry *h;
5227 
5228       sym[len + 0] = i / 10 + '0';
5229       sym[len + 1] = i % 10 + '0';
5230       h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5231       if (h != NULL
5232 	  && !h->def_regular)
5233 	{
5234 	  h->root.type = bfd_link_hash_defined;
5235 	  h->root.u.def.section = htab->sfpr;
5236 	  h->root.u.def.value = htab->sfpr->size;
5237 	  h->type = STT_FUNC;
5238 	  h->def_regular = 1;
5239 	  _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5240 	  writing = TRUE;
5241 	  if (htab->sfpr->contents == NULL)
5242 	    {
5243 	      htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5244 	      if (htab->sfpr->contents == NULL)
5245 		return FALSE;
5246 	    }
5247 	}
5248       if (writing)
5249 	{
5250 	  bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5251 	  if (i != parm->hi)
5252 	    p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5253 	  else
5254 	    p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5255 	  htab->sfpr->size = p - htab->sfpr->contents;
5256 	}
5257     }
5258 
5259   return TRUE;
5260 }
5261 
5262 static bfd_byte *
savegpr0(bfd * abfd,bfd_byte * p,int r)5263 savegpr0 (bfd *abfd, bfd_byte *p, int r)
5264 {
5265   bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5266   return p + 4;
5267 }
5268 
5269 static bfd_byte *
savegpr0_tail(bfd * abfd,bfd_byte * p,int r)5270 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5271 {
5272   p = savegpr0 (abfd, p, r);
5273   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5274   p = p + 4;
5275   bfd_put_32 (abfd, BLR, p);
5276   return p + 4;
5277 }
5278 
5279 static bfd_byte *
restgpr0(bfd * abfd,bfd_byte * p,int r)5280 restgpr0 (bfd *abfd, bfd_byte *p, int r)
5281 {
5282   bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5283   return p + 4;
5284 }
5285 
5286 static bfd_byte *
restgpr0_tail(bfd * abfd,bfd_byte * p,int r)5287 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5288 {
5289   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5290   p = p + 4;
5291   p = restgpr0 (abfd, p, r);
5292   bfd_put_32 (abfd, MTLR_R0, p);
5293   p = p + 4;
5294   if (r == 29)
5295     {
5296       p = restgpr0 (abfd, p, 30);
5297       p = restgpr0 (abfd, p, 31);
5298     }
5299   bfd_put_32 (abfd, BLR, p);
5300   return p + 4;
5301 }
5302 
5303 static bfd_byte *
savegpr1(bfd * abfd,bfd_byte * p,int r)5304 savegpr1 (bfd *abfd, bfd_byte *p, int r)
5305 {
5306   bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5307   return p + 4;
5308 }
5309 
5310 static bfd_byte *
savegpr1_tail(bfd * abfd,bfd_byte * p,int r)5311 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5312 {
5313   p = savegpr1 (abfd, p, r);
5314   bfd_put_32 (abfd, BLR, p);
5315   return p + 4;
5316 }
5317 
5318 static bfd_byte *
restgpr1(bfd * abfd,bfd_byte * p,int r)5319 restgpr1 (bfd *abfd, bfd_byte *p, int r)
5320 {
5321   bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5322   return p + 4;
5323 }
5324 
5325 static bfd_byte *
restgpr1_tail(bfd * abfd,bfd_byte * p,int r)5326 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5327 {
5328   p = restgpr1 (abfd, p, r);
5329   bfd_put_32 (abfd, BLR, p);
5330   return p + 4;
5331 }
5332 
5333 static bfd_byte *
savefpr(bfd * abfd,bfd_byte * p,int r)5334 savefpr (bfd *abfd, bfd_byte *p, int r)
5335 {
5336   bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5337   return p + 4;
5338 }
5339 
5340 static bfd_byte *
savefpr0_tail(bfd * abfd,bfd_byte * p,int r)5341 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5342 {
5343   p = savefpr (abfd, p, r);
5344   bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5345   p = p + 4;
5346   bfd_put_32 (abfd, BLR, p);
5347   return p + 4;
5348 }
5349 
5350 static bfd_byte *
restfpr(bfd * abfd,bfd_byte * p,int r)5351 restfpr (bfd *abfd, bfd_byte *p, int r)
5352 {
5353   bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5354   return p + 4;
5355 }
5356 
5357 static bfd_byte *
restfpr0_tail(bfd * abfd,bfd_byte * p,int r)5358 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5359 {
5360   bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5361   p = p + 4;
5362   p = restfpr (abfd, p, r);
5363   bfd_put_32 (abfd, MTLR_R0, p);
5364   p = p + 4;
5365   if (r == 29)
5366     {
5367       p = restfpr (abfd, p, 30);
5368       p = restfpr (abfd, p, 31);
5369     }
5370   bfd_put_32 (abfd, BLR, p);
5371   return p + 4;
5372 }
5373 
5374 static bfd_byte *
savefpr1_tail(bfd * abfd,bfd_byte * p,int r)5375 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5376 {
5377   p = savefpr (abfd, p, r);
5378   bfd_put_32 (abfd, BLR, p);
5379   return p + 4;
5380 }
5381 
5382 static bfd_byte *
restfpr1_tail(bfd * abfd,bfd_byte * p,int r)5383 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5384 {
5385   p = restfpr (abfd, p, r);
5386   bfd_put_32 (abfd, BLR, p);
5387   return p + 4;
5388 }
5389 
5390 static bfd_byte *
savevr(bfd * abfd,bfd_byte * p,int r)5391 savevr (bfd *abfd, bfd_byte *p, int r)
5392 {
5393   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5394   p = p + 4;
5395   bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5396   return p + 4;
5397 }
5398 
5399 static bfd_byte *
savevr_tail(bfd * abfd,bfd_byte * p,int r)5400 savevr_tail (bfd *abfd, bfd_byte *p, int r)
5401 {
5402   p = savevr (abfd, p, r);
5403   bfd_put_32 (abfd, BLR, p);
5404   return p + 4;
5405 }
5406 
5407 static bfd_byte *
restvr(bfd * abfd,bfd_byte * p,int r)5408 restvr (bfd *abfd, bfd_byte *p, int r)
5409 {
5410   bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5411   p = p + 4;
5412   bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5413   return p + 4;
5414 }
5415 
5416 static bfd_byte *
restvr_tail(bfd * abfd,bfd_byte * p,int r)5417 restvr_tail (bfd *abfd, bfd_byte *p, int r)
5418 {
5419   p = restvr (abfd, p, r);
5420   bfd_put_32 (abfd, BLR, p);
5421   return p + 4;
5422 }
5423 
5424 /* Called via elf_link_hash_traverse to transfer dynamic linking
5425    information on function code symbol entries to their corresponding
5426    function descriptor symbol entries.  */
5427 
5428 static bfd_boolean
func_desc_adjust(struct elf_link_hash_entry * h,void * inf)5429 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5430 {
5431   struct bfd_link_info *info;
5432   struct ppc_link_hash_table *htab;
5433   struct plt_entry *ent;
5434   struct ppc_link_hash_entry *fh;
5435   struct ppc_link_hash_entry *fdh;
5436   bfd_boolean force_local;
5437 
5438   fh = (struct ppc_link_hash_entry *) h;
5439   if (fh->elf.root.type == bfd_link_hash_indirect)
5440     return TRUE;
5441 
5442   if (fh->elf.root.type == bfd_link_hash_warning)
5443     fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
5444 
5445   info = inf;
5446   htab = ppc_hash_table (info);
5447 
5448   /* Resolve undefined references to dot-symbols as the value
5449      in the function descriptor, if we have one in a regular object.
5450      This is to satisfy cases like ".quad .foo".  Calls to functions
5451      in dynamic objects are handled elsewhere.  */
5452   if (fh->elf.root.type == bfd_link_hash_undefweak
5453       && fh->was_undefined
5454       && (fh->oh->elf.root.type == bfd_link_hash_defined
5455 	  || fh->oh->elf.root.type == bfd_link_hash_defweak)
5456       && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5457       && opd_entry_value (fh->oh->elf.root.u.def.section,
5458 			  fh->oh->elf.root.u.def.value,
5459 			  &fh->elf.root.u.def.section,
5460 			  &fh->elf.root.u.def.value) != (bfd_vma) -1)
5461     {
5462       fh->elf.root.type = fh->oh->elf.root.type;
5463       fh->elf.forced_local = 1;
5464     }
5465 
5466   /* If this is a function code symbol, transfer dynamic linking
5467      information to the function descriptor symbol.  */
5468   if (!fh->is_func)
5469     return TRUE;
5470 
5471   for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
5472     if (ent->plt.refcount > 0)
5473       break;
5474   if (ent == NULL
5475       || fh->elf.root.root.string[0] != '.'
5476       || fh->elf.root.root.string[1] == '\0')
5477     return TRUE;
5478 
5479   /* Find the corresponding function descriptor symbol.  Create it
5480      as undefined if necessary.  */
5481 
5482   fdh = get_fdh (fh, htab);
5483   if (fdh != NULL)
5484     while (fdh->elf.root.type == bfd_link_hash_indirect
5485 	   || fdh->elf.root.type == bfd_link_hash_warning)
5486       fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5487 
5488   if (fdh == NULL
5489       && info->shared
5490       && (fh->elf.root.type == bfd_link_hash_undefined
5491 	  || fh->elf.root.type == bfd_link_hash_undefweak))
5492     {
5493       fdh = make_fdh (info, fh);
5494       if (fdh == NULL)
5495 	return FALSE;
5496     }
5497 
5498   /* Fake function descriptors are made undefweak.  If the function
5499      code symbol is strong undefined, make the fake sym the same.
5500      If the function code symbol is defined, then force the fake
5501      descriptor local;  We can't support overriding of symbols in a
5502      shared library on a fake descriptor.  */
5503 
5504   if (fdh != NULL
5505       && fdh->fake
5506       && fdh->elf.root.type == bfd_link_hash_undefweak)
5507     {
5508       if (fh->elf.root.type == bfd_link_hash_undefined)
5509 	{
5510 	  fdh->elf.root.type = bfd_link_hash_undefined;
5511 	  bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
5512 	}
5513       else if (fh->elf.root.type == bfd_link_hash_defined
5514 	       || fh->elf.root.type == bfd_link_hash_defweak)
5515 	{
5516 	  _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
5517 	}
5518     }
5519 
5520   if (fdh != NULL
5521       && !fdh->elf.forced_local
5522       && (info->shared
5523 	  || fdh->elf.def_dynamic
5524 	  || fdh->elf.ref_dynamic
5525 	  || (fdh->elf.root.type == bfd_link_hash_undefweak
5526 	      && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5527     {
5528       if (fdh->elf.dynindx == -1)
5529 	if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5530 	  return FALSE;
5531       fdh->elf.ref_regular |= fh->elf.ref_regular;
5532       fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
5533       fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
5534       fdh->elf.non_got_ref |= fh->elf.non_got_ref;
5535       if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
5536 	{
5537 	  move_plt_plist (fh, fdh);
5538 	  fdh->elf.needs_plt = 1;
5539 	}
5540       fdh->is_func_descriptor = 1;
5541       fdh->oh = fh;
5542       fh->oh = fdh;
5543     }
5544 
5545   /* Now that the info is on the function descriptor, clear the
5546      function code sym info.  Any function code syms for which we
5547      don't have a definition in a regular file, we force local.
5548      This prevents a shared library from exporting syms that have
5549      been imported from another library.  Function code syms that
5550      are really in the library we must leave global to prevent the
5551      linker dragging in a definition from a static library.  */
5552   force_local = (!fh->elf.def_regular
5553 		 || fdh == NULL
5554 		 || !fdh->elf.def_regular
5555 		 || fdh->elf.forced_local);
5556   _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5557 
5558   return TRUE;
5559 }
5560 
5561 /* Called near the start of bfd_elf_size_dynamic_sections.  We use
5562    this hook to a) provide some gcc support functions, and b) transfer
5563    dynamic linking information gathered so far on function code symbol
5564    entries, to their corresponding function descriptor symbol entries.  */
5565 
5566 static bfd_boolean
ppc64_elf_func_desc_adjust(bfd * obfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)5567 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5568 			    struct bfd_link_info *info)
5569 {
5570   struct ppc_link_hash_table *htab;
5571   unsigned int i;
5572   const struct sfpr_def_parms funcs[] =
5573     {
5574       { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5575       { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5576       { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5577       { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5578       { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5579       { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5580       { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5581       { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5582       { "._savef", 14, 31, savefpr, savefpr1_tail },
5583       { "._restf", 14, 31, restfpr, restfpr1_tail },
5584       { "_savevr_", 20, 31, savevr, savevr_tail },
5585       { "_restvr_", 20, 31, restvr, restvr_tail }
5586     };
5587 
5588   htab = ppc_hash_table (info);
5589   if (htab->sfpr == NULL)
5590     /* We don't have any relocs.  */
5591     return TRUE;
5592 
5593   /* Provide any missing _save* and _rest* functions.  */
5594   htab->sfpr->size = 0;
5595   for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5596     if (!sfpr_define (info, &funcs[i]))
5597       return FALSE;
5598 
5599   elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
5600 
5601   if (htab->sfpr->size == 0)
5602     htab->sfpr->flags |= SEC_EXCLUDE;
5603 
5604   return TRUE;
5605 }
5606 
5607 /* Adjust a symbol defined by a dynamic object and referenced by a
5608    regular object.  The current definition is in some section of the
5609    dynamic object, but we're not including those sections.  We have to
5610    change the definition to something the rest of the link can
5611    understand.  */
5612 
5613 static bfd_boolean
ppc64_elf_adjust_dynamic_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h)5614 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5615 				 struct elf_link_hash_entry *h)
5616 {
5617   struct ppc_link_hash_table *htab;
5618   asection *s;
5619   unsigned int power_of_two;
5620 
5621   htab = ppc_hash_table (info);
5622 
5623   /* Deal with function syms.  */
5624   if (h->type == STT_FUNC
5625       || h->needs_plt)
5626     {
5627       /* Clear procedure linkage table information for any symbol that
5628 	 won't need a .plt entry.  */
5629       struct plt_entry *ent;
5630       for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5631 	if (ent->plt.refcount > 0)
5632 	  break;
5633       if (ent == NULL
5634 	  || SYMBOL_CALLS_LOCAL (info, h)
5635 	  || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5636 	      && h->root.type == bfd_link_hash_undefweak))
5637 	{
5638 	  h->plt.plist = NULL;
5639 	  h->needs_plt = 0;
5640 	}
5641     }
5642   else
5643     h->plt.plist = NULL;
5644 
5645   /* If this is a weak symbol, and there is a real definition, the
5646      processor independent code will have arranged for us to see the
5647      real definition first, and we can just use the same value.  */
5648   if (h->u.weakdef != NULL)
5649     {
5650       BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5651 		  || h->u.weakdef->root.type == bfd_link_hash_defweak);
5652       h->root.u.def.section = h->u.weakdef->root.u.def.section;
5653       h->root.u.def.value = h->u.weakdef->root.u.def.value;
5654       if (ELIMINATE_COPY_RELOCS)
5655 	h->non_got_ref = h->u.weakdef->non_got_ref;
5656       return TRUE;
5657     }
5658 
5659   /* If we are creating a shared library, we must presume that the
5660      only references to the symbol are via the global offset table.
5661      For such cases we need not do anything here; the relocations will
5662      be handled correctly by relocate_section.  */
5663   if (info->shared)
5664     return TRUE;
5665 
5666   /* If there are no references to this symbol that do not use the
5667      GOT, we don't need to generate a copy reloc.  */
5668   if (!h->non_got_ref)
5669     return TRUE;
5670 
5671   if (ELIMINATE_COPY_RELOCS)
5672     {
5673       struct ppc_link_hash_entry * eh;
5674       struct ppc_dyn_relocs *p;
5675 
5676       eh = (struct ppc_link_hash_entry *) h;
5677       for (p = eh->dyn_relocs; p != NULL; p = p->next)
5678 	{
5679 	  s = p->sec->output_section;
5680 	  if (s != NULL && (s->flags & SEC_READONLY) != 0)
5681 	    break;
5682 	}
5683 
5684       /* If we didn't find any dynamic relocs in read-only sections, then
5685 	 we'll be keeping the dynamic relocs and avoiding the copy reloc.  */
5686       if (p == NULL)
5687 	{
5688 	  h->non_got_ref = 0;
5689 	  return TRUE;
5690 	}
5691     }
5692 
5693   if (h->plt.plist != NULL)
5694     {
5695       /* We should never get here, but unfortunately there are versions
5696 	 of gcc out there that improperly (for this ABI) put initialized
5697 	 function pointers, vtable refs and suchlike in read-only
5698 	 sections.  Allow them to proceed, but warn that this might
5699 	 break at runtime.  */
5700       (*_bfd_error_handler)
5701 	(_("copy reloc against `%s' requires lazy plt linking; "
5702 	   "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5703 	 h->root.root.string);
5704     }
5705 
5706   /* This is a reference to a symbol defined by a dynamic object which
5707      is not a function.  */
5708 
5709   /* We must allocate the symbol in our .dynbss section, which will
5710      become part of the .bss section of the executable.  There will be
5711      an entry for this symbol in the .dynsym section.  The dynamic
5712      object will contain position independent code, so all references
5713      from the dynamic object to this symbol will go through the global
5714      offset table.  The dynamic linker will use the .dynsym entry to
5715      determine the address it must put in the global offset table, so
5716      both the dynamic object and the regular object will refer to the
5717      same memory location for the variable.  */
5718 
5719   /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5720      to copy the initial value out of the dynamic object and into the
5721      runtime process image.  We need to remember the offset into the
5722      .rela.bss section we are going to use.  */
5723   if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5724     {
5725       htab->relbss->size += sizeof (Elf64_External_Rela);
5726       h->needs_copy = 1;
5727     }
5728 
5729   /* We need to figure out the alignment required for this symbol.  I
5730      have no idea how ELF linkers handle this.  */
5731   power_of_two = bfd_log2 (h->size);
5732   if (power_of_two > 4)
5733     power_of_two = 4;
5734 
5735   /* Apply the required alignment.  */
5736   s = htab->dynbss;
5737   s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
5738   if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5739     {
5740       if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
5741 	return FALSE;
5742     }
5743 
5744   /* Define the symbol as being at this point in the section.  */
5745   h->root.u.def.section = s;
5746   h->root.u.def.value = s->size;
5747 
5748   /* Increment the section size to make room for the symbol.  */
5749   s->size += h->size;
5750 
5751   return TRUE;
5752 }
5753 
5754 /* If given a function descriptor symbol, hide both the function code
5755    sym and the descriptor.  */
5756 static void
ppc64_elf_hide_symbol(struct bfd_link_info * info,struct elf_link_hash_entry * h,bfd_boolean force_local)5757 ppc64_elf_hide_symbol (struct bfd_link_info *info,
5758 		       struct elf_link_hash_entry *h,
5759 		       bfd_boolean force_local)
5760 {
5761   struct ppc_link_hash_entry *eh;
5762   _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5763 
5764   eh = (struct ppc_link_hash_entry *) h;
5765   if (eh->is_func_descriptor)
5766     {
5767       struct ppc_link_hash_entry *fh = eh->oh;
5768 
5769       if (fh == NULL)
5770 	{
5771 	  const char *p, *q;
5772 	  struct ppc_link_hash_table *htab;
5773 	  char save;
5774 
5775 	  /* We aren't supposed to use alloca in BFD because on
5776 	     systems which do not have alloca the version in libiberty
5777 	     calls xmalloc, which might cause the program to crash
5778 	     when it runs out of memory.  This function doesn't have a
5779 	     return status, so there's no way to gracefully return an
5780 	     error.  So cheat.  We know that string[-1] can be safely
5781 	     accessed;  It's either a string in an ELF string table,
5782 	     or allocated in an objalloc structure.  */
5783 
5784 	  p = eh->elf.root.root.string - 1;
5785 	  save = *p;
5786 	  *(char *) p = '.';
5787 	  htab = ppc_hash_table (info);
5788 	  fh = (struct ppc_link_hash_entry *)
5789 	    elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5790 	  *(char *) p = save;
5791 
5792 	  /* Unfortunately, if it so happens that the string we were
5793 	     looking for was allocated immediately before this string,
5794 	     then we overwrote the string terminator.  That's the only
5795 	     reason the lookup should fail.  */
5796 	  if (fh == NULL)
5797 	    {
5798 	      q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5799 	      while (q >= eh->elf.root.root.string && *q == *p)
5800 		--q, --p;
5801 	      if (q < eh->elf.root.root.string && *p == '.')
5802 		fh = (struct ppc_link_hash_entry *)
5803 		  elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
5804 	    }
5805 	  if (fh != NULL)
5806 	    {
5807 	      eh->oh = fh;
5808 	      fh->oh = eh;
5809 	    }
5810 	}
5811       if (fh != NULL)
5812 	_bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5813     }
5814 }
5815 
5816 static bfd_boolean
get_sym_h(struct elf_link_hash_entry ** hp,Elf_Internal_Sym ** symp,asection ** symsecp,char ** tls_maskp,Elf_Internal_Sym ** locsymsp,unsigned long r_symndx,bfd * ibfd)5817 get_sym_h (struct elf_link_hash_entry **hp,
5818 	   Elf_Internal_Sym **symp,
5819 	   asection **symsecp,
5820 	   char **tls_maskp,
5821 	   Elf_Internal_Sym **locsymsp,
5822 	   unsigned long r_symndx,
5823 	   bfd *ibfd)
5824 {
5825   Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5826 
5827   if (r_symndx >= symtab_hdr->sh_info)
5828     {
5829       struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5830       struct elf_link_hash_entry *h;
5831 
5832       h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5833       while (h->root.type == bfd_link_hash_indirect
5834 	     || h->root.type == bfd_link_hash_warning)
5835 	h = (struct elf_link_hash_entry *) h->root.u.i.link;
5836 
5837       if (hp != NULL)
5838 	*hp = h;
5839 
5840       if (symp != NULL)
5841 	*symp = NULL;
5842 
5843       if (symsecp != NULL)
5844 	{
5845 	  asection *symsec = NULL;
5846 	  if (h->root.type == bfd_link_hash_defined
5847 	      || h->root.type == bfd_link_hash_defweak)
5848 	    symsec = h->root.u.def.section;
5849 	  *symsecp = symsec;
5850 	}
5851 
5852       if (tls_maskp != NULL)
5853 	{
5854 	  struct ppc_link_hash_entry *eh;
5855 
5856 	  eh = (struct ppc_link_hash_entry *) h;
5857 	  *tls_maskp = &eh->tls_mask;
5858 	}
5859     }
5860   else
5861     {
5862       Elf_Internal_Sym *sym;
5863       Elf_Internal_Sym *locsyms = *locsymsp;
5864 
5865       if (locsyms == NULL)
5866 	{
5867 	  locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5868 	  if (locsyms == NULL)
5869 	    locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5870 					    symtab_hdr->sh_info,
5871 					    0, NULL, NULL, NULL);
5872 	  if (locsyms == NULL)
5873 	    return FALSE;
5874 	  *locsymsp = locsyms;
5875 	}
5876       sym = locsyms + r_symndx;
5877 
5878       if (hp != NULL)
5879 	*hp = NULL;
5880 
5881       if (symp != NULL)
5882 	*symp = sym;
5883 
5884       if (symsecp != NULL)
5885 	{
5886 	  asection *symsec = NULL;
5887 	  if ((sym->st_shndx != SHN_UNDEF
5888 	       && sym->st_shndx < SHN_LORESERVE)
5889 	      || sym->st_shndx > SHN_HIRESERVE)
5890 	    symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5891 	  *symsecp = symsec;
5892 	}
5893 
5894       if (tls_maskp != NULL)
5895 	{
5896 	  struct got_entry **lgot_ents;
5897 	  char *tls_mask;
5898 
5899 	  tls_mask = NULL;
5900 	  lgot_ents = elf_local_got_ents (ibfd);
5901 	  if (lgot_ents != NULL)
5902 	    {
5903 	      char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
5904 	      tls_mask = &lgot_masks[r_symndx];
5905 	    }
5906 	  *tls_maskp = tls_mask;
5907 	}
5908     }
5909   return TRUE;
5910 }
5911 
5912 /* Returns TLS_MASKP for the given REL symbol.  Function return is 0 on
5913    error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
5914    type suitable for optimization, and 1 otherwise.  */
5915 
5916 static int
get_tls_mask(char ** tls_maskp,unsigned long * toc_symndx,Elf_Internal_Sym ** locsymsp,const Elf_Internal_Rela * rel,bfd * ibfd)5917 get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
5918 	      Elf_Internal_Sym **locsymsp,
5919 	      const Elf_Internal_Rela *rel, bfd *ibfd)
5920 {
5921   unsigned long r_symndx;
5922   int next_r;
5923   struct elf_link_hash_entry *h;
5924   Elf_Internal_Sym *sym;
5925   asection *sec;
5926   bfd_vma off;
5927 
5928   r_symndx = ELF64_R_SYM (rel->r_info);
5929   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5930     return 0;
5931 
5932   if ((*tls_maskp != NULL && **tls_maskp != 0)
5933       || sec == NULL
5934       || ppc64_elf_section_data (sec)->t_symndx == NULL)
5935     return 1;
5936 
5937   /* Look inside a TOC section too.  */
5938   if (h != NULL)
5939     {
5940       BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5941       off = h->root.u.def.value;
5942     }
5943   else
5944     off = sym->st_value;
5945   off += rel->r_addend;
5946   BFD_ASSERT (off % 8 == 0);
5947   r_symndx = ppc64_elf_section_data (sec)->t_symndx[off / 8];
5948   next_r = ppc64_elf_section_data (sec)->t_symndx[off / 8 + 1];
5949   if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
5950     return 0;
5951   if (toc_symndx != NULL)
5952     *toc_symndx = r_symndx;
5953   if ((h == NULL
5954        || ((h->root.type == bfd_link_hash_defined
5955 	    || h->root.type == bfd_link_hash_defweak)
5956 	   && !h->def_dynamic))
5957       && (next_r == -1 || next_r == -2))
5958     return 1 - next_r;
5959   return 1;
5960 }
5961 
5962 /* Adjust all global syms defined in opd sections.  In gcc generated
5963    code for the old ABI, these will already have been done.  */
5964 
5965 static bfd_boolean
adjust_opd_syms(struct elf_link_hash_entry * h,void * inf ATTRIBUTE_UNUSED)5966 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
5967 {
5968   struct ppc_link_hash_entry *eh;
5969   asection *sym_sec;
5970   long *opd_adjust;
5971 
5972   if (h->root.type == bfd_link_hash_indirect)
5973     return TRUE;
5974 
5975   if (h->root.type == bfd_link_hash_warning)
5976     h = (struct elf_link_hash_entry *) h->root.u.i.link;
5977 
5978   if (h->root.type != bfd_link_hash_defined
5979       && h->root.type != bfd_link_hash_defweak)
5980     return TRUE;
5981 
5982   eh = (struct ppc_link_hash_entry *) h;
5983   if (eh->adjust_done)
5984     return TRUE;
5985 
5986   sym_sec = eh->elf.root.u.def.section;
5987   opd_adjust = get_opd_info (sym_sec);
5988   if (opd_adjust != NULL)
5989     {
5990       long adjust = opd_adjust[eh->elf.root.u.def.value / 8];
5991       if (adjust == -1)
5992 	{
5993 	  /* This entry has been deleted.  */
5994 	  asection *dsec = ppc64_elf_tdata (sym_sec->owner)->u.deleted_section;
5995 	  if (dsec == NULL)
5996 	    {
5997 	      for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
5998 		if (elf_discarded_section (dsec))
5999 		  {
6000 		    ppc64_elf_tdata (sym_sec->owner)->u.deleted_section = dsec;
6001 		    break;
6002 		  }
6003 	    }
6004 	  eh->elf.root.u.def.value = 0;
6005 	  eh->elf.root.u.def.section = dsec;
6006 	}
6007       else
6008 	eh->elf.root.u.def.value += adjust;
6009       eh->adjust_done = 1;
6010     }
6011   return TRUE;
6012 }
6013 
6014 /* Handles decrementing dynamic reloc counts for the reloc specified by
6015    R_INFO in section SEC.  If LOCAL_SYMS is NULL, then H and SYM_SEC
6016    have already been determined.  */
6017 
6018 static bfd_boolean
dec_dynrel_count(bfd_vma r_info,asection * sec,struct bfd_link_info * info,Elf_Internal_Sym ** local_syms,struct elf_link_hash_entry * h,asection * sym_sec)6019 dec_dynrel_count (bfd_vma r_info,
6020 		  asection *sec,
6021 		  struct bfd_link_info *info,
6022 		  Elf_Internal_Sym **local_syms,
6023 		  struct elf_link_hash_entry *h,
6024 		  asection *sym_sec)
6025 {
6026   enum elf_ppc64_reloc_type r_type;
6027   struct ppc_dyn_relocs *p;
6028   struct ppc_dyn_relocs **pp;
6029 
6030   /* Can this reloc be dynamic?  This switch, and later tests here
6031      should be kept in sync with the code in check_relocs.  */
6032   r_type = ELF64_R_TYPE (r_info);
6033   switch (r_type)
6034     {
6035     default:
6036       return TRUE;
6037 
6038     case R_PPC64_TPREL16:
6039     case R_PPC64_TPREL16_LO:
6040     case R_PPC64_TPREL16_HI:
6041     case R_PPC64_TPREL16_HA:
6042     case R_PPC64_TPREL16_DS:
6043     case R_PPC64_TPREL16_LO_DS:
6044     case R_PPC64_TPREL16_HIGHER:
6045     case R_PPC64_TPREL16_HIGHERA:
6046     case R_PPC64_TPREL16_HIGHEST:
6047     case R_PPC64_TPREL16_HIGHESTA:
6048       if (!info->shared)
6049 	return TRUE;
6050 
6051     case R_PPC64_TPREL64:
6052     case R_PPC64_DTPMOD64:
6053     case R_PPC64_DTPREL64:
6054     case R_PPC64_ADDR64:
6055     case R_PPC64_REL30:
6056     case R_PPC64_REL32:
6057     case R_PPC64_REL64:
6058     case R_PPC64_ADDR14:
6059     case R_PPC64_ADDR14_BRNTAKEN:
6060     case R_PPC64_ADDR14_BRTAKEN:
6061     case R_PPC64_ADDR16:
6062     case R_PPC64_ADDR16_DS:
6063     case R_PPC64_ADDR16_HA:
6064     case R_PPC64_ADDR16_HI:
6065     case R_PPC64_ADDR16_HIGHER:
6066     case R_PPC64_ADDR16_HIGHERA:
6067     case R_PPC64_ADDR16_HIGHEST:
6068     case R_PPC64_ADDR16_HIGHESTA:
6069     case R_PPC64_ADDR16_LO:
6070     case R_PPC64_ADDR16_LO_DS:
6071     case R_PPC64_ADDR24:
6072     case R_PPC64_ADDR32:
6073     case R_PPC64_UADDR16:
6074     case R_PPC64_UADDR32:
6075     case R_PPC64_UADDR64:
6076     case R_PPC64_TOC:
6077       break;
6078     }
6079 
6080   if (local_syms != NULL)
6081     {
6082       unsigned long r_symndx;
6083       Elf_Internal_Sym *sym;
6084       bfd *ibfd = sec->owner;
6085 
6086       r_symndx = ELF64_R_SYM (r_info);
6087       if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
6088 	return FALSE;
6089     }
6090 
6091   if ((info->shared
6092        && (MUST_BE_DYN_RELOC (r_type)
6093 	   || (h != NULL
6094 	       && (!info->symbolic
6095 		   || h->root.type == bfd_link_hash_defweak
6096 		   || !h->def_regular))))
6097       || (ELIMINATE_COPY_RELOCS
6098 	  && !info->shared
6099 	  && h != NULL
6100 	  && (h->root.type == bfd_link_hash_defweak
6101 	      || !h->def_regular)))
6102     ;
6103   else
6104     return TRUE;
6105 
6106   if (h != NULL)
6107     pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6108   else if (sym_sec != NULL)
6109     pp = (struct ppc_dyn_relocs **) &elf_section_data (sym_sec)->local_dynrel;
6110   else
6111     pp = (struct ppc_dyn_relocs **) &elf_section_data (sec)->local_dynrel;
6112 
6113   while ((p = *pp) != NULL)
6114     {
6115       if (p->sec == sec)
6116 	{
6117 	  if (!MUST_BE_DYN_RELOC (r_type))
6118 	    p->pc_count -= 1;
6119 	  p->count -= 1;
6120 	  if (p->count == 0)
6121 	    *pp = p->next;
6122 	  return TRUE;
6123 	}
6124       pp = &p->next;
6125     }
6126 
6127   (*_bfd_error_handler) (_("dynreloc miscount for %B, section %A"),
6128 			   sec->owner, sec);
6129   bfd_set_error (bfd_error_bad_value);
6130   return FALSE;
6131 }
6132 
6133 /* Remove unused Official Procedure Descriptor entries.  Currently we
6134    only remove those associated with functions in discarded link-once
6135    sections, or weakly defined functions that have been overridden.  It
6136    would be possible to remove many more entries for statically linked
6137    applications.  */
6138 
6139 bfd_boolean
ppc64_elf_edit_opd(bfd * obfd,struct bfd_link_info * info,bfd_boolean no_opd_opt,bfd_boolean non_overlapping)6140 ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
6141 		    bfd_boolean no_opd_opt,
6142 		    bfd_boolean non_overlapping)
6143 {
6144   bfd *ibfd;
6145   bfd_boolean some_edited = FALSE;
6146   asection *need_pad = NULL;
6147 
6148   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6149     {
6150       asection *sec;
6151       Elf_Internal_Rela *relstart, *rel, *relend;
6152       Elf_Internal_Shdr *symtab_hdr;
6153       Elf_Internal_Sym *local_syms;
6154       struct elf_link_hash_entry **sym_hashes;
6155       bfd_vma offset;
6156       bfd_size_type amt;
6157       long *opd_adjust;
6158       bfd_boolean need_edit, add_aux_fields;
6159       bfd_size_type cnt_16b = 0;
6160 
6161       sec = bfd_get_section_by_name (ibfd, ".opd");
6162       if (sec == NULL || sec->size == 0)
6163 	continue;
6164 
6165       amt = sec->size * sizeof (long) / 8;
6166       opd_adjust = get_opd_info (sec);
6167       if (opd_adjust == NULL)
6168 	{
6169 	  /* check_relocs hasn't been called.  Must be a ld -r link
6170 	     or --just-symbols object.   */
6171 	  opd_adjust = bfd_alloc (obfd, amt);
6172 	  if (opd_adjust == NULL)
6173 	    return FALSE;
6174 	  ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
6175 	}
6176       memset (opd_adjust, 0, amt);
6177 
6178       if (no_opd_opt)
6179 	continue;
6180 
6181       if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
6182 	continue;
6183 
6184       if (sec->output_section == bfd_abs_section_ptr)
6185 	continue;
6186 
6187       /* Look through the section relocs.  */
6188       if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
6189 	continue;
6190 
6191       local_syms = NULL;
6192       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6193       sym_hashes = elf_sym_hashes (ibfd);
6194 
6195       /* Read the relocations.  */
6196       relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6197 					    info->keep_memory);
6198       if (relstart == NULL)
6199 	return FALSE;
6200 
6201       /* First run through the relocs to check they are sane, and to
6202 	 determine whether we need to edit this opd section.  */
6203       need_edit = FALSE;
6204       need_pad = sec;
6205       offset = 0;
6206       relend = relstart + sec->reloc_count;
6207       for (rel = relstart; rel < relend; )
6208 	{
6209 	  enum elf_ppc64_reloc_type r_type;
6210 	  unsigned long r_symndx;
6211 	  asection *sym_sec;
6212 	  struct elf_link_hash_entry *h;
6213 	  Elf_Internal_Sym *sym;
6214 
6215 	  /* .opd contains a regular array of 16 or 24 byte entries.  We're
6216 	     only interested in the reloc pointing to a function entry
6217 	     point.  */
6218 	  if (rel->r_offset != offset
6219 	      || rel + 1 >= relend
6220 	      || (rel + 1)->r_offset != offset + 8)
6221 	    {
6222 	      /* If someone messes with .opd alignment then after a
6223 		 "ld -r" we might have padding in the middle of .opd.
6224 		 Also, there's nothing to prevent someone putting
6225 		 something silly in .opd with the assembler.  No .opd
6226 		 optimization for them!  */
6227 	    broken_opd:
6228 	      (*_bfd_error_handler)
6229 		(_("%B: .opd is not a regular array of opd entries"), ibfd);
6230 	      need_edit = FALSE;
6231 	      break;
6232 	    }
6233 
6234 	  if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
6235 	      || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
6236 	    {
6237 	      (*_bfd_error_handler)
6238 		(_("%B: unexpected reloc type %u in .opd section"),
6239 		 ibfd, r_type);
6240 	      need_edit = FALSE;
6241 	      break;
6242 	    }
6243 
6244 	  r_symndx = ELF64_R_SYM (rel->r_info);
6245 	  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6246 			  r_symndx, ibfd))
6247 	    goto error_ret;
6248 
6249 	  if (sym_sec == NULL || sym_sec->owner == NULL)
6250 	    {
6251 	      const char *sym_name;
6252 	      if (h != NULL)
6253 		sym_name = h->root.root.string;
6254 	      else
6255 		sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
6256 					     sym_sec);
6257 
6258 	      (*_bfd_error_handler)
6259 		(_("%B: undefined sym `%s' in .opd section"),
6260 		 ibfd, sym_name);
6261 	      need_edit = FALSE;
6262 	      break;
6263 	    }
6264 
6265 	  /* opd entries are always for functions defined in the
6266 	     current input bfd.  If the symbol isn't defined in the
6267 	     input bfd, then we won't be using the function in this
6268 	     bfd;  It must be defined in a linkonce section in another
6269 	     bfd, or is weak.  It's also possible that we are
6270 	     discarding the function due to a linker script /DISCARD/,
6271 	     which we test for via the output_section.  */
6272 	  if (sym_sec->owner != ibfd
6273 	      || sym_sec->output_section == bfd_abs_section_ptr)
6274 	    need_edit = TRUE;
6275 
6276 	  rel += 2;
6277 	  if (rel == relend
6278 	      || (rel + 1 == relend && rel->r_offset == offset + 16))
6279 	    {
6280 	      if (sec->size == offset + 24)
6281 		{
6282 		  need_pad = NULL;
6283 		  break;
6284 		}
6285 	      if (rel == relend && sec->size == offset + 16)
6286 		{
6287 		  cnt_16b++;
6288 		  break;
6289 		}
6290 	      goto broken_opd;
6291 	    }
6292 
6293 	  if (rel->r_offset == offset + 24)
6294 	    offset += 24;
6295 	  else if (rel->r_offset != offset + 16)
6296 	    goto broken_opd;
6297 	  else if (rel + 1 < relend
6298 		   && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6299 		   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6300 	    {
6301 	      offset += 16;
6302 	      cnt_16b++;
6303 	    }
6304 	  else if (rel + 2 < relend
6305 		   && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6306 		   && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6307 	    {
6308 	      offset += 24;
6309 	      rel += 1;
6310 	    }
6311 	  else
6312 	    goto broken_opd;
6313 	}
6314 
6315       add_aux_fields = non_overlapping && cnt_16b > 0;
6316 
6317       if (need_edit || add_aux_fields)
6318 	{
6319 	  Elf_Internal_Rela *write_rel;
6320 	  bfd_byte *rptr, *wptr;
6321 	  bfd_byte *new_contents = NULL;
6322 	  bfd_boolean skip;
6323 	  long opd_ent_size;
6324 
6325 	  /* This seems a waste of time as input .opd sections are all
6326 	     zeros as generated by gcc, but I suppose there's no reason
6327 	     this will always be so.  We might start putting something in
6328 	     the third word of .opd entries.  */
6329 	  if ((sec->flags & SEC_IN_MEMORY) == 0)
6330 	    {
6331 	      bfd_byte *loc;
6332 	      if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6333 		{
6334 		  if (loc != NULL)
6335 		    free (loc);
6336 		error_ret:
6337 		  if (local_syms != NULL
6338 		      && symtab_hdr->contents != (unsigned char *) local_syms)
6339 		    free (local_syms);
6340 		  if (elf_section_data (sec)->relocs != relstart)
6341 		    free (relstart);
6342 		  return FALSE;
6343 		}
6344 	      sec->contents = loc;
6345 	      sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6346 	    }
6347 
6348 	  elf_section_data (sec)->relocs = relstart;
6349 
6350 	  new_contents = sec->contents;
6351 	  if (add_aux_fields)
6352 	    {
6353 	      new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6354 	      if (new_contents == NULL)
6355 		return FALSE;
6356 	      need_pad = FALSE;
6357 	    }
6358 	  wptr = new_contents;
6359 	  rptr = sec->contents;
6360 
6361 	  write_rel = relstart;
6362 	  skip = FALSE;
6363 	  offset = 0;
6364 	  opd_ent_size = 0;
6365 	  for (rel = relstart; rel < relend; rel++)
6366 	    {
6367 	      unsigned long r_symndx;
6368 	      asection *sym_sec;
6369 	      struct elf_link_hash_entry *h;
6370 	      Elf_Internal_Sym *sym;
6371 
6372 	      r_symndx = ELF64_R_SYM (rel->r_info);
6373 	      if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6374 			      r_symndx, ibfd))
6375 		goto error_ret;
6376 
6377 	      if (rel->r_offset == offset)
6378 		{
6379 		  struct ppc_link_hash_entry *fdh = NULL;
6380 
6381 		  /* See if the .opd entry is full 24 byte or
6382 		     16 byte (with fd_aux entry overlapped with next
6383 		     fd_func).  */
6384 		  opd_ent_size = 24;
6385 		  if ((rel + 2 == relend && sec->size == offset + 16)
6386 		      || (rel + 3 < relend
6387 			  && rel[2].r_offset == offset + 16
6388 			  && rel[3].r_offset == offset + 24
6389 			  && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6390 			  && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6391 		    opd_ent_size = 16;
6392 
6393 		  if (h != NULL
6394 		      && h->root.root.string[0] == '.')
6395 		    {
6396 		      fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6397 				     ppc_hash_table (info));
6398 		      if (fdh != NULL
6399 			  && fdh->elf.root.type != bfd_link_hash_defined
6400 			  && fdh->elf.root.type != bfd_link_hash_defweak)
6401 			fdh = NULL;
6402 		    }
6403 
6404 		  skip = (sym_sec->owner != ibfd
6405 			  || sym_sec->output_section == bfd_abs_section_ptr);
6406 		  if (skip)
6407 		    {
6408 		      if (fdh != NULL && sym_sec->owner == ibfd)
6409 			{
6410 			  /* Arrange for the function descriptor sym
6411 			     to be dropped.  */
6412 			  fdh->elf.root.u.def.value = 0;
6413 			  fdh->elf.root.u.def.section = sym_sec;
6414 			}
6415 		      opd_adjust[rel->r_offset / 8] = -1;
6416 		    }
6417 		  else
6418 		    {
6419 		      /* We'll be keeping this opd entry.  */
6420 
6421 		      if (fdh != NULL)
6422 			{
6423 			  /* Redefine the function descriptor symbol to
6424 			     this location in the opd section.  It is
6425 			     necessary to update the value here rather
6426 			     than using an array of adjustments as we do
6427 			     for local symbols, because various places
6428 			     in the generic ELF code use the value
6429 			     stored in u.def.value.  */
6430 			  fdh->elf.root.u.def.value = wptr - new_contents;
6431 			  fdh->adjust_done = 1;
6432 			}
6433 
6434 		      /* Local syms are a bit tricky.  We could
6435 			 tweak them as they can be cached, but
6436 			 we'd need to look through the local syms
6437 			 for the function descriptor sym which we
6438 			 don't have at the moment.  So keep an
6439 			 array of adjustments.  */
6440 		      opd_adjust[rel->r_offset / 8]
6441 			= (wptr - new_contents) - (rptr - sec->contents);
6442 
6443 		      if (wptr != rptr)
6444 			memcpy (wptr, rptr, opd_ent_size);
6445 		      wptr += opd_ent_size;
6446 		      if (add_aux_fields && opd_ent_size == 16)
6447 			{
6448 			  memset (wptr, '\0', 8);
6449 			  wptr += 8;
6450 			}
6451 		    }
6452 		  rptr += opd_ent_size;
6453 		  offset += opd_ent_size;
6454 		}
6455 
6456 	      if (skip)
6457 		{
6458 		  if (!dec_dynrel_count (rel->r_info, sec, info,
6459 					 NULL, h, sym_sec))
6460 		    goto error_ret;
6461 		}
6462 	      else
6463 		{
6464 		  /* We need to adjust any reloc offsets to point to the
6465 		     new opd entries.  While we're at it, we may as well
6466 		     remove redundant relocs.  */
6467 		  rel->r_offset += opd_adjust[(offset - opd_ent_size) / 8];
6468 		  if (write_rel != rel)
6469 		    memcpy (write_rel, rel, sizeof (*rel));
6470 		  ++write_rel;
6471 		}
6472 	    }
6473 
6474 	  sec->size = wptr - new_contents;
6475 	  sec->reloc_count = write_rel - relstart;
6476 	  if (add_aux_fields)
6477 	    {
6478 	      free (sec->contents);
6479 	      sec->contents = new_contents;
6480 	    }
6481 
6482 	  /* Fudge the size too, as this is used later in
6483 	     elf_bfd_final_link if we are emitting relocs.  */
6484 	  elf_section_data (sec)->rel_hdr.sh_size
6485 	    = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6486 	  BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
6487 	  some_edited = TRUE;
6488 	}
6489       else if (elf_section_data (sec)->relocs != relstart)
6490 	free (relstart);
6491 
6492       if (local_syms != NULL
6493 	  && symtab_hdr->contents != (unsigned char *) local_syms)
6494 	{
6495 	  if (!info->keep_memory)
6496 	    free (local_syms);
6497 	  else
6498 	    symtab_hdr->contents = (unsigned char *) local_syms;
6499 	}
6500     }
6501 
6502   if (some_edited)
6503     elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6504 
6505   /* If we are doing a final link and the last .opd entry is just 16 byte
6506      long, add a 8 byte padding after it.  */
6507   if (need_pad != NULL && !info->relocatable)
6508     {
6509       bfd_byte *p;
6510 
6511       if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6512 	{
6513 	  BFD_ASSERT (need_pad->size > 0);
6514 
6515 	  p = bfd_malloc (need_pad->size + 8);
6516 	  if (p == NULL)
6517 	    return FALSE;
6518 
6519 	  if (! bfd_get_section_contents (need_pad->owner, need_pad,
6520 					  p, 0, need_pad->size))
6521 	    return FALSE;
6522 
6523 	  need_pad->contents = p;
6524 	  need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6525 	}
6526       else
6527 	{
6528 	  p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6529 	  if (p == NULL)
6530 	    return FALSE;
6531 
6532 	  need_pad->contents = p;
6533 	}
6534 
6535       memset (need_pad->contents + need_pad->size, 0, 8);
6536       need_pad->size += 8;
6537     }
6538 
6539   return TRUE;
6540 }
6541 
6542 /* Set htab->tls_get_addr and call the generic ELF tls_setup function.  */
6543 
6544 asection *
ppc64_elf_tls_setup(bfd * obfd,struct bfd_link_info * info)6545 ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
6546 {
6547   struct ppc_link_hash_table *htab;
6548 
6549   htab = ppc_hash_table (info);
6550   if (htab->tls_get_addr != NULL)
6551     {
6552       struct ppc_link_hash_entry *h = htab->tls_get_addr;
6553 
6554       while (h->elf.root.type == bfd_link_hash_indirect
6555 	     || h->elf.root.type == bfd_link_hash_warning)
6556 	h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6557 
6558       htab->tls_get_addr = h;
6559 
6560       if (htab->tls_get_addr_fd == NULL
6561 	  && h->oh != NULL
6562 	  && h->oh->is_func_descriptor
6563 	  && (h->oh->elf.root.type == bfd_link_hash_defined
6564 	      || h->oh->elf.root.type == bfd_link_hash_defweak))
6565 	htab->tls_get_addr_fd = h->oh;
6566     }
6567 
6568   if (htab->tls_get_addr_fd != NULL)
6569     {
6570       struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6571 
6572       while (h->elf.root.type == bfd_link_hash_indirect
6573 	     || h->elf.root.type == bfd_link_hash_warning)
6574 	h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6575 
6576       htab->tls_get_addr_fd = h;
6577     }
6578 
6579   return _bfd_elf_tls_setup (obfd, info);
6580 }
6581 
6582 /* Run through all the TLS relocs looking for optimization
6583    opportunities.  The linker has been hacked (see ppc64elf.em) to do
6584    a preliminary section layout so that we know the TLS segment
6585    offsets.  We can't optimize earlier because some optimizations need
6586    to know the tp offset, and we need to optimize before allocating
6587    dynamic relocations.  */
6588 
6589 bfd_boolean
ppc64_elf_tls_optimize(bfd * obfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)6590 ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6591 {
6592   bfd *ibfd;
6593   asection *sec;
6594   struct ppc_link_hash_table *htab;
6595 
6596   if (info->relocatable || info->shared)
6597     return TRUE;
6598 
6599   htab = ppc_hash_table (info);
6600   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6601     {
6602       Elf_Internal_Sym *locsyms = NULL;
6603 
6604       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6605 	if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6606 	  {
6607 	    Elf_Internal_Rela *relstart, *rel, *relend;
6608 	    int expecting_tls_get_addr;
6609 
6610 	    /* Read the relocations.  */
6611 	    relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
6612 						  info->keep_memory);
6613 	    if (relstart == NULL)
6614 	      return FALSE;
6615 
6616 	    expecting_tls_get_addr = 0;
6617 	    relend = relstart + sec->reloc_count;
6618 	    for (rel = relstart; rel < relend; rel++)
6619 	      {
6620 		enum elf_ppc64_reloc_type r_type;
6621 		unsigned long r_symndx;
6622 		struct elf_link_hash_entry *h;
6623 		Elf_Internal_Sym *sym;
6624 		asection *sym_sec;
6625 		char *tls_mask;
6626 		char tls_set, tls_clear, tls_type = 0;
6627 		bfd_vma value;
6628 		bfd_boolean ok_tprel, is_local;
6629 
6630 		r_symndx = ELF64_R_SYM (rel->r_info);
6631 		if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
6632 				r_symndx, ibfd))
6633 		  {
6634 		  err_free_rel:
6635 		    if (elf_section_data (sec)->relocs != relstart)
6636 		      free (relstart);
6637 		    if (locsyms != NULL
6638 			&& (elf_tdata (ibfd)->symtab_hdr.contents
6639 			    != (unsigned char *) locsyms))
6640 		      free (locsyms);
6641 		    return FALSE;
6642 		  }
6643 
6644 		if (h != NULL)
6645 		  {
6646 		    if (h->root.type != bfd_link_hash_defined
6647 			&& h->root.type != bfd_link_hash_defweak)
6648 		      continue;
6649 		    value = h->root.u.def.value;
6650 		  }
6651 		else
6652 		  /* Symbols referenced by TLS relocs must be of type
6653 		     STT_TLS.  So no need for .opd local sym adjust.  */
6654 		  value = sym->st_value;
6655 
6656 		ok_tprel = FALSE;
6657 		is_local = FALSE;
6658 		if (h == NULL
6659 		    || !h->def_dynamic)
6660 		  {
6661 		    is_local = TRUE;
6662 		    value += sym_sec->output_offset;
6663 		    value += sym_sec->output_section->vma;
6664 		    value -= htab->elf.tls_sec->vma;
6665 		    ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6666 				< (bfd_vma) 1 << 32);
6667 		  }
6668 
6669 		r_type = ELF64_R_TYPE (rel->r_info);
6670 		switch (r_type)
6671 		  {
6672 		  case R_PPC64_GOT_TLSLD16:
6673 		  case R_PPC64_GOT_TLSLD16_LO:
6674 		  case R_PPC64_GOT_TLSLD16_HI:
6675 		  case R_PPC64_GOT_TLSLD16_HA:
6676 		    /* These relocs should never be against a symbol
6677 		       defined in a shared lib.  Leave them alone if
6678 		       that turns out to be the case.  */
6679 		    ppc64_tlsld_got (ibfd)->refcount -= 1;
6680 		    if (!is_local)
6681 		      continue;
6682 
6683 		    /* LD -> LE */
6684 		    tls_set = 0;
6685 		    tls_clear = TLS_LD;
6686 		    tls_type = TLS_TLS | TLS_LD;
6687 		    expecting_tls_get_addr = 1;
6688 		    break;
6689 
6690 		  case R_PPC64_GOT_TLSGD16:
6691 		  case R_PPC64_GOT_TLSGD16_LO:
6692 		  case R_PPC64_GOT_TLSGD16_HI:
6693 		  case R_PPC64_GOT_TLSGD16_HA:
6694 		    if (ok_tprel)
6695 		      /* GD -> LE */
6696 		      tls_set = 0;
6697 		    else
6698 		      /* GD -> IE */
6699 		      tls_set = TLS_TLS | TLS_TPRELGD;
6700 		    tls_clear = TLS_GD;
6701 		    tls_type = TLS_TLS | TLS_GD;
6702 		    expecting_tls_get_addr = 1;
6703 		    break;
6704 
6705 		  case R_PPC64_GOT_TPREL16_DS:
6706 		  case R_PPC64_GOT_TPREL16_LO_DS:
6707 		  case R_PPC64_GOT_TPREL16_HI:
6708 		  case R_PPC64_GOT_TPREL16_HA:
6709 		    expecting_tls_get_addr = 0;
6710 		    if (ok_tprel)
6711 		      {
6712 			/* IE -> LE */
6713 			tls_set = 0;
6714 			tls_clear = TLS_TPREL;
6715 			tls_type = TLS_TLS | TLS_TPREL;
6716 			break;
6717 		      }
6718 		    else
6719 		      continue;
6720 
6721 		  case R_PPC64_REL14:
6722 		  case R_PPC64_REL14_BRTAKEN:
6723 		  case R_PPC64_REL14_BRNTAKEN:
6724 		  case R_PPC64_REL24:
6725 		    if (h != NULL
6726 			&& (h == &htab->tls_get_addr->elf
6727 			    || h == &htab->tls_get_addr_fd->elf))
6728 		      {
6729 			if (!expecting_tls_get_addr
6730 			    && rel != relstart
6731 			    && ((ELF64_R_TYPE (rel[-1].r_info)
6732 				 == R_PPC64_TOC16)
6733 				|| (ELF64_R_TYPE (rel[-1].r_info)
6734 				    == R_PPC64_TOC16_LO)))
6735 			  {
6736 			    /* Check for toc tls entries.  */
6737 			    char *toc_tls;
6738 			    int retval;
6739 
6740 			    retval = get_tls_mask (&toc_tls, NULL, &locsyms,
6741 						   rel - 1, ibfd);
6742 			    if (retval == 0)
6743 			      goto err_free_rel;
6744 			    if (toc_tls != NULL)
6745 			      expecting_tls_get_addr = retval > 1;
6746 			  }
6747 
6748 			if (expecting_tls_get_addr)
6749 			  {
6750 			    struct plt_entry *ent;
6751 			    for (ent = h->plt.plist; ent; ent = ent->next)
6752 			      if (ent->addend == 0)
6753 				{
6754 				  if (ent->plt.refcount > 0)
6755 				    ent->plt.refcount -= 1;
6756 				  break;
6757 				}
6758 			  }
6759 		      }
6760 		    expecting_tls_get_addr = 0;
6761 		    continue;
6762 
6763 		  case R_PPC64_TPREL64:
6764 		    expecting_tls_get_addr = 0;
6765 		    if (ok_tprel)
6766 		      {
6767 			/* IE -> LE */
6768 			tls_set = TLS_EXPLICIT;
6769 			tls_clear = TLS_TPREL;
6770 			break;
6771 		      }
6772 		    else
6773 		      continue;
6774 
6775 		  case R_PPC64_DTPMOD64:
6776 		    expecting_tls_get_addr = 0;
6777 		    if (rel + 1 < relend
6778 			&& (rel[1].r_info
6779 			    == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6780 			&& rel[1].r_offset == rel->r_offset + 8)
6781 		      {
6782 			if (ok_tprel)
6783 			  /* GD -> LE */
6784 			  tls_set = TLS_EXPLICIT | TLS_GD;
6785 			else
6786 			  /* GD -> IE */
6787 			  tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6788 			tls_clear = TLS_GD;
6789 		      }
6790 		    else
6791 		      {
6792 			if (!is_local)
6793 			  continue;
6794 
6795 			/* LD -> LE */
6796 			tls_set = TLS_EXPLICIT;
6797 			tls_clear = TLS_LD;
6798 		      }
6799 		    break;
6800 
6801 		  default:
6802 		    expecting_tls_get_addr = 0;
6803 		    continue;
6804 		  }
6805 
6806 		if ((tls_set & TLS_EXPLICIT) == 0)
6807 		  {
6808 		    struct got_entry *ent;
6809 
6810 		    /* Adjust got entry for this reloc.  */
6811 		    if (h != NULL)
6812 		      ent = h->got.glist;
6813 		    else
6814 		      ent = elf_local_got_ents (ibfd)[r_symndx];
6815 
6816 		    for (; ent != NULL; ent = ent->next)
6817 		      if (ent->addend == rel->r_addend
6818 			  && ent->owner == ibfd
6819 			  && ent->tls_type == tls_type)
6820 			break;
6821 		    if (ent == NULL)
6822 		      abort ();
6823 
6824 		    if (tls_set == 0)
6825 		      {
6826 			/* We managed to get rid of a got entry.  */
6827 			if (ent->got.refcount > 0)
6828 			  ent->got.refcount -= 1;
6829 		      }
6830 		  }
6831 		else
6832 		  {
6833 		    /* If we got rid of a DTPMOD/DTPREL reloc pair then
6834 		       we'll lose one or two dyn relocs.  */
6835 		    if (!dec_dynrel_count (rel->r_info, sec, info,
6836 					   NULL, h, sym_sec))
6837 		      return FALSE;
6838 
6839 		    if (tls_set == (TLS_EXPLICIT | TLS_GD))
6840 		      {
6841 			if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
6842 					       NULL, h, sym_sec))
6843 			  return FALSE;
6844 		      }
6845 		  }
6846 
6847 		*tls_mask |= tls_set;
6848 		*tls_mask &= ~tls_clear;
6849 	      }
6850 
6851 	    if (elf_section_data (sec)->relocs != relstart)
6852 	      free (relstart);
6853 	  }
6854 
6855       if (locsyms != NULL
6856 	  && (elf_tdata (ibfd)->symtab_hdr.contents
6857 	      != (unsigned char *) locsyms))
6858 	{
6859 	  if (!info->keep_memory)
6860 	    free (locsyms);
6861 	  else
6862 	    elf_tdata (ibfd)->symtab_hdr.contents = (unsigned char *) locsyms;
6863 	}
6864     }
6865   return TRUE;
6866 }
6867 
6868 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
6869    the values of any global symbols in a toc section that has been
6870    edited.  Globals in toc sections should be a rarity, so this function
6871    sets a flag if any are found in toc sections other than the one just
6872    edited, so that futher hash table traversals can be avoided.  */
6873 
6874 struct adjust_toc_info
6875 {
6876   asection *toc;
6877   unsigned long *skip;
6878   bfd_boolean global_toc_syms;
6879 };
6880 
6881 static bfd_boolean
adjust_toc_syms(struct elf_link_hash_entry * h,void * inf)6882 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
6883 {
6884   struct ppc_link_hash_entry *eh;
6885   struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
6886 
6887   if (h->root.type == bfd_link_hash_indirect)
6888     return TRUE;
6889 
6890   if (h->root.type == bfd_link_hash_warning)
6891     h = (struct elf_link_hash_entry *) h->root.u.i.link;
6892 
6893   if (h->root.type != bfd_link_hash_defined
6894       && h->root.type != bfd_link_hash_defweak)
6895     return TRUE;
6896 
6897   eh = (struct ppc_link_hash_entry *) h;
6898   if (eh->adjust_done)
6899     return TRUE;
6900 
6901   if (eh->elf.root.u.def.section == toc_inf->toc)
6902     {
6903       unsigned long skip = toc_inf->skip[eh->elf.root.u.def.value >> 3];
6904       if (skip != (unsigned long) -1)
6905 	eh->elf.root.u.def.value -= skip;
6906       else
6907 	{
6908 	  (*_bfd_error_handler)
6909 	    (_("%s defined in removed toc entry"), eh->elf.root.root.string);
6910 	  eh->elf.root.u.def.section = &bfd_abs_section;
6911 	  eh->elf.root.u.def.value = 0;
6912 	}
6913       eh->adjust_done = 1;
6914     }
6915   else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
6916     toc_inf->global_toc_syms = TRUE;
6917 
6918   return TRUE;
6919 }
6920 
6921 /* Examine all relocs referencing .toc sections in order to remove
6922    unused .toc entries.  */
6923 
6924 bfd_boolean
ppc64_elf_edit_toc(bfd * obfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)6925 ppc64_elf_edit_toc (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6926 {
6927   bfd *ibfd;
6928   struct adjust_toc_info toc_inf;
6929 
6930   toc_inf.global_toc_syms = TRUE;
6931   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6932     {
6933       asection *toc, *sec;
6934       Elf_Internal_Shdr *symtab_hdr;
6935       Elf_Internal_Sym *local_syms;
6936       struct elf_link_hash_entry **sym_hashes;
6937       Elf_Internal_Rela *relstart, *rel;
6938       unsigned long *skip, *drop;
6939       unsigned char *used;
6940       unsigned char *keep, last, some_unused;
6941 
6942       toc = bfd_get_section_by_name (ibfd, ".toc");
6943       if (toc == NULL
6944 	  || toc->size == 0
6945 	  || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
6946 	  || elf_discarded_section (toc))
6947 	continue;
6948 
6949       local_syms = NULL;
6950       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6951       sym_hashes = elf_sym_hashes (ibfd);
6952 
6953       /* Look at sections dropped from the final link.  */
6954       skip = NULL;
6955       relstart = NULL;
6956       for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6957 	{
6958 	  if (sec->reloc_count == 0
6959 	      || !elf_discarded_section (sec)
6960 	      || get_opd_info (sec)
6961 	      || (sec->flags & SEC_ALLOC) == 0
6962 	      || (sec->flags & SEC_DEBUGGING) != 0)
6963 	    continue;
6964 
6965 	  relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
6966 	  if (relstart == NULL)
6967 	    goto error_ret;
6968 
6969 	  /* Run through the relocs to see which toc entries might be
6970 	     unused.  */
6971 	  for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
6972 	    {
6973 	      enum elf_ppc64_reloc_type r_type;
6974 	      unsigned long r_symndx;
6975 	      asection *sym_sec;
6976 	      struct elf_link_hash_entry *h;
6977 	      Elf_Internal_Sym *sym;
6978 	      bfd_vma val;
6979 
6980 	      r_type = ELF64_R_TYPE (rel->r_info);
6981 	      switch (r_type)
6982 		{
6983 		default:
6984 		  continue;
6985 
6986 		case R_PPC64_TOC16:
6987 		case R_PPC64_TOC16_LO:
6988 		case R_PPC64_TOC16_HI:
6989 		case R_PPC64_TOC16_HA:
6990 		case R_PPC64_TOC16_DS:
6991 		case R_PPC64_TOC16_LO_DS:
6992 		  break;
6993 		}
6994 
6995 	      r_symndx = ELF64_R_SYM (rel->r_info);
6996 	      if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6997 			      r_symndx, ibfd))
6998 		goto error_ret;
6999 
7000 	      if (sym_sec != toc)
7001 		continue;
7002 
7003 	      if (h != NULL)
7004 		val = h->root.u.def.value;
7005 	      else
7006 		val = sym->st_value;
7007 	      val += rel->r_addend;
7008 
7009 	      if (val >= toc->size)
7010 		continue;
7011 
7012 	      /* Anything in the toc ought to be aligned to 8 bytes.
7013 		 If not, don't mark as unused.  */
7014 	      if (val & 7)
7015 		continue;
7016 
7017 	      if (skip == NULL)
7018 		{
7019 		  skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 7) / 8);
7020 		  if (skip == NULL)
7021 		    goto error_ret;
7022 		}
7023 
7024 	      skip[val >> 3] = 1;
7025 	    }
7026 
7027 	  if (elf_section_data (sec)->relocs != relstart)
7028 	    free (relstart);
7029 	}
7030 
7031       if (skip == NULL)
7032 	continue;
7033 
7034       used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
7035       if (used == NULL)
7036 	{
7037 	error_ret:
7038 	  if (local_syms != NULL
7039 	      && symtab_hdr->contents != (unsigned char *) local_syms)
7040 	    free (local_syms);
7041 	  if (sec != NULL
7042 	      && relstart != NULL
7043 	      && elf_section_data (sec)->relocs != relstart)
7044 	    free (relstart);
7045 	  if (skip != NULL)
7046 	    free (skip);
7047 	  return FALSE;
7048 	}
7049 
7050       /* Now check all kept sections that might reference the toc.  */
7051       for (sec = ibfd->sections;
7052 	   sec != NULL;
7053 	   /* Check the toc itself last.  */
7054 	   sec = (sec == toc ? NULL
7055 		  : sec->next == toc && sec->next->next ? sec->next->next
7056 		  : sec->next == NULL ? toc
7057 		  : sec->next))
7058 	{
7059 	  int repeat;
7060 
7061 	  if (sec->reloc_count == 0
7062 	      || elf_discarded_section (sec)
7063 	      || get_opd_info (sec)
7064 	      || (sec->flags & SEC_ALLOC) == 0
7065 	      || (sec->flags & SEC_DEBUGGING) != 0)
7066 	    continue;
7067 
7068 	  relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, TRUE);
7069 	  if (relstart == NULL)
7070 	    goto error_ret;
7071 
7072 	  /* Mark toc entries referenced as used.  */
7073 	  repeat = 0;
7074 	  do
7075 	    for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7076 	      {
7077 		enum elf_ppc64_reloc_type r_type;
7078 		unsigned long r_symndx;
7079 		asection *sym_sec;
7080 		struct elf_link_hash_entry *h;
7081 		Elf_Internal_Sym *sym;
7082 		bfd_vma val;
7083 
7084 		r_type = ELF64_R_TYPE (rel->r_info);
7085 		switch (r_type)
7086 		  {
7087 		  case R_PPC64_TOC16:
7088 		  case R_PPC64_TOC16_LO:
7089 		  case R_PPC64_TOC16_HI:
7090 		  case R_PPC64_TOC16_HA:
7091 		  case R_PPC64_TOC16_DS:
7092 		  case R_PPC64_TOC16_LO_DS:
7093 		    /* In case we're taking addresses of toc entries.  */
7094 		  case R_PPC64_ADDR64:
7095 		    break;
7096 
7097 		  default:
7098 		    continue;
7099 		  }
7100 
7101 		r_symndx = ELF64_R_SYM (rel->r_info);
7102 		if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7103 				r_symndx, ibfd))
7104 		  {
7105 		    free (used);
7106 		    goto error_ret;
7107 		  }
7108 
7109 		if (sym_sec != toc)
7110 		  continue;
7111 
7112 		if (h != NULL)
7113 		  val = h->root.u.def.value;
7114 		else
7115 		  val = sym->st_value;
7116 		val += rel->r_addend;
7117 
7118 		if (val >= toc->size)
7119 		  continue;
7120 
7121 		/* For the toc section, we only mark as used if
7122 		   this entry itself isn't unused.  */
7123 		if (sec == toc
7124 		    && !used[val >> 3]
7125 		    && (used[rel->r_offset >> 3]
7126 			|| !skip[rel->r_offset >> 3]))
7127 		  /* Do all the relocs again, to catch reference
7128 		     chains.  */
7129 		  repeat = 1;
7130 
7131 		used[val >> 3] = 1;
7132 	      }
7133 	  while (repeat);
7134 	}
7135 
7136       /* Merge the used and skip arrays.  Assume that TOC
7137 	 doublewords not appearing as either used or unused belong
7138 	 to to an entry more than one doubleword in size.  */
7139       for (drop = skip, keep = used, last = 0, some_unused = 0;
7140 	   drop < skip + (toc->size + 7) / 8;
7141 	   ++drop, ++keep)
7142 	{
7143 	  if (*keep)
7144 	    {
7145 	      *drop = 0;
7146 	      last = 0;
7147 	    }
7148 	  else if (*drop)
7149 	    {
7150 	      some_unused = 1;
7151 	      last = 1;
7152 	    }
7153 	  else
7154 	    *drop = last;
7155 	}
7156 
7157       free (used);
7158 
7159       if (some_unused)
7160 	{
7161 	  bfd_byte *contents, *src;
7162 	  unsigned long off;
7163 
7164 	  /* Shuffle the toc contents, and at the same time convert the
7165 	     skip array from booleans into offsets.  */
7166 	  if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
7167 	    goto error_ret;
7168 
7169 	  elf_section_data (toc)->this_hdr.contents = contents;
7170 
7171 	  for (src = contents, off = 0, drop = skip;
7172 	       src < contents + toc->size;
7173 	       src += 8, ++drop)
7174 	    {
7175 	      if (*drop)
7176 		{
7177 		  *drop = (unsigned long) -1;
7178 		  off += 8;
7179 		}
7180 	      else if (off != 0)
7181 		{
7182 		  *drop = off;
7183 		  memcpy (src - off, src, 8);
7184 		}
7185 	    }
7186 	  toc->rawsize = toc->size;
7187 	  toc->size = src - contents - off;
7188 
7189 	  if (toc->reloc_count != 0)
7190 	    {
7191 	      Elf_Internal_Rela *wrel;
7192 	      bfd_size_type sz;
7193 
7194 	      /* Read toc relocs.  */
7195 	      relstart = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
7196 						    TRUE);
7197 	      if (relstart == NULL)
7198 		goto error_ret;
7199 
7200 	      /* Remove unused toc relocs, and adjust those we keep.  */
7201 	      wrel = relstart;
7202 	      for (rel = relstart; rel < relstart + toc->reloc_count; ++rel)
7203 		if (skip[rel->r_offset >> 3] != (unsigned long) -1)
7204 		  {
7205 		    wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
7206 		    wrel->r_info = rel->r_info;
7207 		    wrel->r_addend = rel->r_addend;
7208 		    ++wrel;
7209 		  }
7210 		else if (!dec_dynrel_count (rel->r_info, toc, info,
7211 					    &local_syms, NULL, NULL))
7212 		  goto error_ret;
7213 
7214 	      toc->reloc_count = wrel - relstart;
7215 	      sz = elf_section_data (toc)->rel_hdr.sh_entsize;
7216 	      elf_section_data (toc)->rel_hdr.sh_size = toc->reloc_count * sz;
7217 	      BFD_ASSERT (elf_section_data (toc)->rel_hdr2 == NULL);
7218 	    }
7219 
7220 	  /* Adjust addends for relocs against the toc section sym.  */
7221 	  for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7222 	    {
7223 	      if (sec->reloc_count == 0
7224 		  || elf_discarded_section (sec))
7225 		continue;
7226 
7227 	      relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7228 						    TRUE);
7229 	      if (relstart == NULL)
7230 		goto error_ret;
7231 
7232 	      for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7233 		{
7234 		  enum elf_ppc64_reloc_type r_type;
7235 		  unsigned long r_symndx;
7236 		  asection *sym_sec;
7237 		  struct elf_link_hash_entry *h;
7238 		  Elf_Internal_Sym *sym;
7239 
7240 		  r_type = ELF64_R_TYPE (rel->r_info);
7241 		  switch (r_type)
7242 		    {
7243 		    default:
7244 		      continue;
7245 
7246 		    case R_PPC64_TOC16:
7247 		    case R_PPC64_TOC16_LO:
7248 		    case R_PPC64_TOC16_HI:
7249 		    case R_PPC64_TOC16_HA:
7250 		    case R_PPC64_TOC16_DS:
7251 		    case R_PPC64_TOC16_LO_DS:
7252 		    case R_PPC64_ADDR64:
7253 		      break;
7254 		    }
7255 
7256 		  r_symndx = ELF64_R_SYM (rel->r_info);
7257 		  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7258 				  r_symndx, ibfd))
7259 		    goto error_ret;
7260 
7261 		  if (sym_sec != toc || h != NULL || sym->st_value != 0)
7262 		    continue;
7263 
7264 		  rel->r_addend -= skip[rel->r_addend >> 3];
7265 		}
7266 	    }
7267 
7268 	  /* We shouldn't have local or global symbols defined in the TOC,
7269 	     but handle them anyway.  */
7270 	  if (local_syms != NULL)
7271 	    {
7272 	      Elf_Internal_Sym *sym;
7273 
7274 	      for (sym = local_syms;
7275 		   sym < local_syms + symtab_hdr->sh_info;
7276 		   ++sym)
7277 		if (sym->st_shndx != SHN_UNDEF
7278 		    && (sym->st_shndx < SHN_LORESERVE
7279 			|| sym->st_shndx > SHN_HIRESERVE)
7280 		    && sym->st_value != 0
7281 		    && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
7282 		  {
7283 		    if (skip[sym->st_value >> 3] != (unsigned long) -1)
7284 		      sym->st_value -= skip[sym->st_value >> 3];
7285 		    else
7286 		      {
7287 			(*_bfd_error_handler)
7288 			  (_("%s defined in removed toc entry"),
7289 			   bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7290 					     NULL));
7291 			sym->st_value = 0;
7292 			sym->st_shndx = SHN_ABS;
7293 		      }
7294 		    symtab_hdr->contents = (unsigned char *) local_syms;
7295 		  }
7296 	    }
7297 
7298 	  /* Finally, adjust any global syms defined in the toc.  */
7299 	  if (toc_inf.global_toc_syms)
7300 	    {
7301 	      toc_inf.toc = toc;
7302 	      toc_inf.skip = skip;
7303 	      toc_inf.global_toc_syms = FALSE;
7304 	      elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
7305 				      &toc_inf);
7306 	    }
7307 	}
7308 
7309       if (local_syms != NULL
7310 	  && symtab_hdr->contents != (unsigned char *) local_syms)
7311 	{
7312 	  if (!info->keep_memory)
7313 	    free (local_syms);
7314 	  else
7315 	    symtab_hdr->contents = (unsigned char *) local_syms;
7316 	}
7317       free (skip);
7318     }
7319 
7320   return TRUE;
7321 }
7322 
7323 /* Allocate space in .plt, .got and associated reloc sections for
7324    dynamic relocs.  */
7325 
7326 static bfd_boolean
allocate_dynrelocs(struct elf_link_hash_entry * h,void * inf)7327 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
7328 {
7329   struct bfd_link_info *info;
7330   struct ppc_link_hash_table *htab;
7331   asection *s;
7332   struct ppc_link_hash_entry *eh;
7333   struct ppc_dyn_relocs *p;
7334   struct got_entry *gent;
7335 
7336   if (h->root.type == bfd_link_hash_indirect)
7337     return TRUE;
7338 
7339   if (h->root.type == bfd_link_hash_warning)
7340     h = (struct elf_link_hash_entry *) h->root.u.i.link;
7341 
7342   info = (struct bfd_link_info *) inf;
7343   htab = ppc_hash_table (info);
7344 
7345   if (htab->elf.dynamic_sections_created
7346       && h->dynindx != -1
7347       && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
7348     {
7349       struct plt_entry *pent;
7350       bfd_boolean doneone = FALSE;
7351       for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7352 	if (pent->plt.refcount > 0)
7353 	  {
7354 	    /* If this is the first .plt entry, make room for the special
7355 	       first entry.  */
7356 	    s = htab->plt;
7357 	    if (s->size == 0)
7358 	      s->size += PLT_INITIAL_ENTRY_SIZE;
7359 
7360 	    pent->plt.offset = s->size;
7361 
7362 	    /* Make room for this entry.  */
7363 	    s->size += PLT_ENTRY_SIZE;
7364 
7365 	    /* Make room for the .glink code.  */
7366 	    s = htab->glink;
7367 	    if (s->size == 0)
7368 	      s->size += GLINK_CALL_STUB_SIZE;
7369 	    /* We need bigger stubs past index 32767.  */
7370 	    if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
7371 	      s->size += 4;
7372 	    s->size += 2*4;
7373 
7374 	    /* We also need to make an entry in the .rela.plt section.  */
7375 	    s = htab->relplt;
7376 	    s->size += sizeof (Elf64_External_Rela);
7377 	    doneone = TRUE;
7378 	  }
7379 	else
7380 	  pent->plt.offset = (bfd_vma) -1;
7381       if (!doneone)
7382 	{
7383 	  h->plt.plist = NULL;
7384 	  h->needs_plt = 0;
7385 	}
7386     }
7387   else
7388     {
7389       h->plt.plist = NULL;
7390       h->needs_plt = 0;
7391     }
7392 
7393   eh = (struct ppc_link_hash_entry *) h;
7394   /* Run through the TLS GD got entries first if we're changing them
7395      to TPREL.  */
7396   if ((eh->tls_mask & TLS_TPRELGD) != 0)
7397     for (gent = h->got.glist; gent != NULL; gent = gent->next)
7398       if (gent->got.refcount > 0
7399 	  && (gent->tls_type & TLS_GD) != 0)
7400 	{
7401 	  /* This was a GD entry that has been converted to TPREL.  If
7402 	     there happens to be a TPREL entry we can use that one.  */
7403 	  struct got_entry *ent;
7404 	  for (ent = h->got.glist; ent != NULL; ent = ent->next)
7405 	    if (ent->got.refcount > 0
7406 		&& (ent->tls_type & TLS_TPREL) != 0
7407 		&& ent->addend == gent->addend
7408 		&& ent->owner == gent->owner)
7409 	      {
7410 		gent->got.refcount = 0;
7411 		break;
7412 	      }
7413 
7414 	  /* If not, then we'll be using our own TPREL entry.  */
7415 	  if (gent->got.refcount != 0)
7416 	    gent->tls_type = TLS_TLS | TLS_TPREL;
7417 	}
7418 
7419   for (gent = h->got.glist; gent != NULL; gent = gent->next)
7420     if (gent->got.refcount > 0)
7421       {
7422 	bfd_boolean dyn;
7423 
7424 	/* Make sure this symbol is output as a dynamic symbol.
7425 	   Undefined weak syms won't yet be marked as dynamic,
7426 	   nor will all TLS symbols.  */
7427 	if (h->dynindx == -1
7428 	    && !h->forced_local)
7429 	  {
7430 	    if (! bfd_elf_link_record_dynamic_symbol (info, h))
7431 	      return FALSE;
7432 	  }
7433 
7434 	if ((gent->tls_type & TLS_LD) != 0
7435 	    && !h->def_dynamic)
7436 	  {
7437 	    gent->got.offset = ppc64_tlsld_got (gent->owner)->offset;
7438 	    continue;
7439 	  }
7440 
7441 	s = ppc64_elf_tdata (gent->owner)->got;
7442 	gent->got.offset = s->size;
7443 	s->size
7444 	  += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
7445 	dyn = htab->elf.dynamic_sections_created;
7446 	if ((info->shared
7447 	     || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
7448 	    && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7449 		|| h->root.type != bfd_link_hash_undefweak))
7450 	  ppc64_elf_tdata (gent->owner)->relgot->size
7451 	    += (gent->tls_type & eh->tls_mask & TLS_GD
7452 		? 2 * sizeof (Elf64_External_Rela)
7453 		: sizeof (Elf64_External_Rela));
7454       }
7455     else
7456       gent->got.offset = (bfd_vma) -1;
7457 
7458   if (eh->dyn_relocs == NULL)
7459     return TRUE;
7460 
7461   /* In the shared -Bsymbolic case, discard space allocated for
7462      dynamic pc-relative relocs against symbols which turn out to be
7463      defined in regular objects.  For the normal shared case, discard
7464      space for relocs that have become local due to symbol visibility
7465      changes.  */
7466 
7467   if (info->shared)
7468     {
7469       /* Relocs that use pc_count are those that appear on a call insn,
7470 	 or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
7471 	 generated via assembly.  We want calls to protected symbols to
7472 	 resolve directly to the function rather than going via the plt.
7473 	 If people want function pointer comparisons to work as expected
7474 	 then they should avoid writing weird assembly.  */
7475       if (SYMBOL_CALLS_LOCAL (info, h))
7476 	{
7477 	  struct ppc_dyn_relocs **pp;
7478 
7479 	  for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
7480 	    {
7481 	      p->count -= p->pc_count;
7482 	      p->pc_count = 0;
7483 	      if (p->count == 0)
7484 		*pp = p->next;
7485 	      else
7486 		pp = &p->next;
7487 	    }
7488 	}
7489 
7490       /* Also discard relocs on undefined weak syms with non-default
7491 	 visibility.  */
7492       if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7493 	  && h->root.type == bfd_link_hash_undefweak)
7494 	eh->dyn_relocs = NULL;
7495     }
7496   else if (ELIMINATE_COPY_RELOCS)
7497     {
7498       /* For the non-shared case, discard space for relocs against
7499 	 symbols which turn out to need copy relocs or are not
7500 	 dynamic.  */
7501 
7502       if (!h->non_got_ref
7503 	  && h->def_dynamic
7504 	  && !h->def_regular)
7505 	{
7506 	  /* Make sure this symbol is output as a dynamic symbol.
7507 	     Undefined weak syms won't yet be marked as dynamic.  */
7508 	  if (h->dynindx == -1
7509 	      && !h->forced_local)
7510 	    {
7511 	      if (! bfd_elf_link_record_dynamic_symbol (info, h))
7512 		return FALSE;
7513 	    }
7514 
7515 	  /* If that succeeded, we know we'll be keeping all the
7516 	     relocs.  */
7517 	  if (h->dynindx != -1)
7518 	    goto keep;
7519 	}
7520 
7521       eh->dyn_relocs = NULL;
7522 
7523     keep: ;
7524     }
7525 
7526   /* Finally, allocate space.  */
7527   for (p = eh->dyn_relocs; p != NULL; p = p->next)
7528     {
7529       asection *sreloc = elf_section_data (p->sec)->sreloc;
7530       sreloc->size += p->count * sizeof (Elf64_External_Rela);
7531     }
7532 
7533   return TRUE;
7534 }
7535 
7536 /* Find any dynamic relocs that apply to read-only sections.  */
7537 
7538 static bfd_boolean
readonly_dynrelocs(struct elf_link_hash_entry * h,void * inf)7539 readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
7540 {
7541   struct ppc_link_hash_entry *eh;
7542   struct ppc_dyn_relocs *p;
7543 
7544   if (h->root.type == bfd_link_hash_warning)
7545     h = (struct elf_link_hash_entry *) h->root.u.i.link;
7546 
7547   eh = (struct ppc_link_hash_entry *) h;
7548   for (p = eh->dyn_relocs; p != NULL; p = p->next)
7549     {
7550       asection *s = p->sec->output_section;
7551 
7552       if (s != NULL && (s->flags & SEC_READONLY) != 0)
7553 	{
7554 	  struct bfd_link_info *info = inf;
7555 
7556 	  info->flags |= DF_TEXTREL;
7557 
7558 	  /* Not an error, just cut short the traversal.  */
7559 	  return FALSE;
7560 	}
7561     }
7562   return TRUE;
7563 }
7564 
7565 /* Set the sizes of the dynamic sections.  */
7566 
7567 static bfd_boolean
ppc64_elf_size_dynamic_sections(bfd * output_bfd ATTRIBUTE_UNUSED,struct bfd_link_info * info)7568 ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
7569 				 struct bfd_link_info *info)
7570 {
7571   struct ppc_link_hash_table *htab;
7572   bfd *dynobj;
7573   asection *s;
7574   bfd_boolean relocs;
7575   bfd *ibfd;
7576 
7577   htab = ppc_hash_table (info);
7578   dynobj = htab->elf.dynobj;
7579   if (dynobj == NULL)
7580     abort ();
7581 
7582   if (htab->elf.dynamic_sections_created)
7583     {
7584       /* Set the contents of the .interp section to the interpreter.  */
7585       if (info->executable)
7586 	{
7587 	  s = bfd_get_section_by_name (dynobj, ".interp");
7588 	  if (s == NULL)
7589 	    abort ();
7590 	  s->size = sizeof ELF_DYNAMIC_INTERPRETER;
7591 	  s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
7592 	}
7593     }
7594 
7595   /* Set up .got offsets for local syms, and space for local dynamic
7596      relocs.  */
7597   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7598     {
7599       struct got_entry **lgot_ents;
7600       struct got_entry **end_lgot_ents;
7601       char *lgot_masks;
7602       bfd_size_type locsymcount;
7603       Elf_Internal_Shdr *symtab_hdr;
7604       asection *srel;
7605 
7606       if (!is_ppc64_elf_target (ibfd->xvec))
7607 	continue;
7608 
7609       if (ppc64_tlsld_got (ibfd)->refcount > 0)
7610 	{
7611 	  s = ppc64_elf_tdata (ibfd)->got;
7612 	  ppc64_tlsld_got (ibfd)->offset = s->size;
7613 	  s->size += 16;
7614 	  if (info->shared)
7615 	    {
7616 	      srel = ppc64_elf_tdata (ibfd)->relgot;
7617 	      srel->size += sizeof (Elf64_External_Rela);
7618 	    }
7619 	}
7620       else
7621 	ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
7622 
7623       for (s = ibfd->sections; s != NULL; s = s->next)
7624 	{
7625 	  struct ppc_dyn_relocs *p;
7626 
7627 	  for (p = *((struct ppc_dyn_relocs **)
7628 		     &elf_section_data (s)->local_dynrel);
7629 	       p != NULL;
7630 	       p = p->next)
7631 	    {
7632 	      if (!bfd_is_abs_section (p->sec)
7633 		  && bfd_is_abs_section (p->sec->output_section))
7634 		{
7635 		  /* Input section has been discarded, either because
7636 		     it is a copy of a linkonce section or due to
7637 		     linker script /DISCARD/, so we'll be discarding
7638 		     the relocs too.  */
7639 		}
7640 	      else if (p->count != 0)
7641 		{
7642 		  srel = elf_section_data (p->sec)->sreloc;
7643 		  srel->size += p->count * sizeof (Elf64_External_Rela);
7644 		  if ((p->sec->output_section->flags & SEC_READONLY) != 0)
7645 		    info->flags |= DF_TEXTREL;
7646 		}
7647 	    }
7648 	}
7649 
7650       lgot_ents = elf_local_got_ents (ibfd);
7651       if (!lgot_ents)
7652 	continue;
7653 
7654       symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
7655       locsymcount = symtab_hdr->sh_info;
7656       end_lgot_ents = lgot_ents + locsymcount;
7657       lgot_masks = (char *) end_lgot_ents;
7658       s = ppc64_elf_tdata (ibfd)->got;
7659       srel = ppc64_elf_tdata (ibfd)->relgot;
7660       for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
7661 	{
7662 	  struct got_entry *ent;
7663 
7664 	  for (ent = *lgot_ents; ent != NULL; ent = ent->next)
7665 	    if (ent->got.refcount > 0)
7666 	      {
7667 		if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
7668 		  {
7669 		    if (ppc64_tlsld_got (ibfd)->offset == (bfd_vma) -1)
7670 		      {
7671 			ppc64_tlsld_got (ibfd)->offset = s->size;
7672 			s->size += 16;
7673 			if (info->shared)
7674 			  srel->size += sizeof (Elf64_External_Rela);
7675 		      }
7676 		    ent->got.offset = ppc64_tlsld_got (ibfd)->offset;
7677 		  }
7678 		else
7679 		  {
7680 		    ent->got.offset = s->size;
7681 		    if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
7682 		      {
7683 			s->size += 16;
7684 			if (info->shared)
7685 			  srel->size += 2 * sizeof (Elf64_External_Rela);
7686 		      }
7687 		    else
7688 		      {
7689 			s->size += 8;
7690 			if (info->shared)
7691 			  srel->size += sizeof (Elf64_External_Rela);
7692 		      }
7693 		  }
7694 	      }
7695 	    else
7696 	      ent->got.offset = (bfd_vma) -1;
7697 	}
7698     }
7699 
7700   /* Allocate global sym .plt and .got entries, and space for global
7701      sym dynamic relocs.  */
7702   elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
7703 
7704   /* We now have determined the sizes of the various dynamic sections.
7705      Allocate memory for them.  */
7706   relocs = FALSE;
7707   for (s = dynobj->sections; s != NULL; s = s->next)
7708     {
7709       if ((s->flags & SEC_LINKER_CREATED) == 0)
7710 	continue;
7711 
7712       if (s == htab->brlt || s == htab->relbrlt)
7713 	/* These haven't been allocated yet;  don't strip.  */
7714 	continue;
7715       else if (s == htab->got
7716 	       || s == htab->plt
7717 	       || s == htab->glink)
7718 	{
7719 	  /* Strip this section if we don't need it; see the
7720 	     comment below.  */
7721 	}
7722       else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
7723 	{
7724 	  if (s->size == 0)
7725 	    {
7726 	      /* If we don't need this section, strip it from the
7727 		 output file.  This is mostly to handle .rela.bss and
7728 		 .rela.plt.  We must create both sections in
7729 		 create_dynamic_sections, because they must be created
7730 		 before the linker maps input sections to output
7731 		 sections.  The linker does that before
7732 		 adjust_dynamic_symbol is called, and it is that
7733 		 function which decides whether anything needs to go
7734 		 into these sections.  */
7735 	    }
7736 	  else
7737 	    {
7738 	      if (s != htab->relplt)
7739 		relocs = TRUE;
7740 
7741 	      /* We use the reloc_count field as a counter if we need
7742 		 to copy relocs into the output file.  */
7743 	      s->reloc_count = 0;
7744 	    }
7745 	}
7746       else
7747 	{
7748 	  /* It's not one of our sections, so don't allocate space.  */
7749 	  continue;
7750 	}
7751 
7752       if (s->size == 0)
7753 	{
7754 	  s->flags |= SEC_EXCLUDE;
7755 	  continue;
7756 	}
7757 
7758       /* .plt is in the bss section.  We don't initialise it.  */
7759       if (s == htab->plt)
7760 	continue;
7761 
7762       /* Allocate memory for the section contents.  We use bfd_zalloc
7763 	 here in case unused entries are not reclaimed before the
7764 	 section's contents are written out.  This should not happen,
7765 	 but this way if it does we get a R_PPC64_NONE reloc in .rela
7766 	 sections instead of garbage.
7767 	 We also rely on the section contents being zero when writing
7768 	 the GOT.  */
7769       s->contents = bfd_zalloc (dynobj, s->size);
7770       if (s->contents == NULL)
7771 	return FALSE;
7772     }
7773 
7774   for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7775     {
7776       if (!is_ppc64_elf_target (ibfd->xvec))
7777 	continue;
7778 
7779       s = ppc64_elf_tdata (ibfd)->got;
7780       if (s != NULL && s != htab->got)
7781 	{
7782 	  if (s->size == 0)
7783 	    s->flags |= SEC_EXCLUDE;
7784 	  else
7785 	    {
7786 	      s->contents = bfd_zalloc (ibfd, s->size);
7787 	      if (s->contents == NULL)
7788 		return FALSE;
7789 	    }
7790 	}
7791       s = ppc64_elf_tdata (ibfd)->relgot;
7792       if (s != NULL)
7793 	{
7794 	  if (s->size == 0)
7795 	    s->flags |= SEC_EXCLUDE;
7796 	  else
7797 	    {
7798 	      s->contents = bfd_zalloc (ibfd, s->size);
7799 	      if (s->contents == NULL)
7800 		return FALSE;
7801 	      relocs = TRUE;
7802 	      s->reloc_count = 0;
7803 	    }
7804 	}
7805     }
7806 
7807   if (htab->elf.dynamic_sections_created)
7808     {
7809       /* Add some entries to the .dynamic section.  We fill in the
7810 	 values later, in ppc64_elf_finish_dynamic_sections, but we
7811 	 must add the entries now so that we get the correct size for
7812 	 the .dynamic section.  The DT_DEBUG entry is filled in by the
7813 	 dynamic linker and used by the debugger.  */
7814 #define add_dynamic_entry(TAG, VAL) \
7815   _bfd_elf_add_dynamic_entry (info, TAG, VAL)
7816 
7817       if (info->executable)
7818 	{
7819 	  if (!add_dynamic_entry (DT_DEBUG, 0))
7820 	    return FALSE;
7821 	}
7822 
7823       if (htab->plt != NULL && htab->plt->size != 0)
7824 	{
7825 	  if (!add_dynamic_entry (DT_PLTGOT, 0)
7826 	      || !add_dynamic_entry (DT_PLTRELSZ, 0)
7827 	      || !add_dynamic_entry (DT_PLTREL, DT_RELA)
7828 	      || !add_dynamic_entry (DT_JMPREL, 0)
7829 	      || !add_dynamic_entry (DT_PPC64_GLINK, 0))
7830 	    return FALSE;
7831 	}
7832 
7833       if (NO_OPD_RELOCS)
7834 	{
7835 	  if (!add_dynamic_entry (DT_PPC64_OPD, 0)
7836 	      || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
7837 	    return FALSE;
7838 	}
7839 
7840       if (relocs)
7841 	{
7842 	  if (!add_dynamic_entry (DT_RELA, 0)
7843 	      || !add_dynamic_entry (DT_RELASZ, 0)
7844 	      || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
7845 	    return FALSE;
7846 
7847 	  /* If any dynamic relocs apply to a read-only section,
7848 	     then we need a DT_TEXTREL entry.  */
7849 	  if ((info->flags & DF_TEXTREL) == 0)
7850 	    elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
7851 
7852 	  if ((info->flags & DF_TEXTREL) != 0)
7853 	    {
7854 	      if (!add_dynamic_entry (DT_TEXTREL, 0))
7855 		return FALSE;
7856 	    }
7857 	}
7858     }
7859 #undef add_dynamic_entry
7860 
7861   return TRUE;
7862 }
7863 
7864 /* Determine the type of stub needed, if any, for a call.  */
7865 
7866 static inline enum ppc_stub_type
ppc_type_of_stub(asection * input_sec,const Elf_Internal_Rela * rel,struct ppc_link_hash_entry ** hash,bfd_vma destination)7867 ppc_type_of_stub (asection *input_sec,
7868 		  const Elf_Internal_Rela *rel,
7869 		  struct ppc_link_hash_entry **hash,
7870 		  bfd_vma destination)
7871 {
7872   struct ppc_link_hash_entry *h = *hash;
7873   bfd_vma location;
7874   bfd_vma branch_offset;
7875   bfd_vma max_branch_offset;
7876   enum elf_ppc64_reloc_type r_type;
7877 
7878   if (h != NULL)
7879     {
7880       if (h->oh != NULL
7881 	  && h->oh->is_func_descriptor)
7882 	h = h->oh;
7883 
7884       if (h->elf.dynindx != -1)
7885 	{
7886 	  struct plt_entry *ent;
7887 
7888 	  for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
7889 	    if (ent->addend == rel->r_addend
7890 		&& ent->plt.offset != (bfd_vma) -1)
7891 	      {
7892 		*hash = h;
7893 		return ppc_stub_plt_call;
7894 	      }
7895 	}
7896 
7897       if (!(h->elf.root.type == bfd_link_hash_defined
7898 	    || h->elf.root.type == bfd_link_hash_defweak)
7899 	  || h->elf.root.u.def.section->output_section == NULL)
7900 	return ppc_stub_none;
7901     }
7902 
7903   /* Determine where the call point is.  */
7904   location = (input_sec->output_offset
7905 	      + input_sec->output_section->vma
7906 	      + rel->r_offset);
7907 
7908   branch_offset = destination - location;
7909   r_type = ELF64_R_TYPE (rel->r_info);
7910 
7911   /* Determine if a long branch stub is needed.  */
7912   max_branch_offset = 1 << 25;
7913   if (r_type != R_PPC64_REL24)
7914     max_branch_offset = 1 << 15;
7915 
7916   if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
7917     /* We need a stub.  Figure out whether a long_branch or plt_branch
7918        is needed later.  */
7919     return ppc_stub_long_branch;
7920 
7921   return ppc_stub_none;
7922 }
7923 
7924 /* Build a .plt call stub.  */
7925 
7926 static inline bfd_byte *
build_plt_stub(bfd * obfd,bfd_byte * p,int offset)7927 build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
7928 {
7929 #define PPC_LO(v) ((v) & 0xffff)
7930 #define PPC_HI(v) (((v) >> 16) & 0xffff)
7931 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
7932 
7933   bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p),	p += 4;
7934   bfd_put_32 (obfd, STD_R2_40R1, p),			p += 4;
7935   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),	p += 4;
7936   if (PPC_HA (offset + 8) != PPC_HA (offset))
7937     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),		p += 4;
7938   offset += 8;
7939   bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p),	p += 4;
7940   if (PPC_HA (offset + 8) != PPC_HA (offset))
7941     bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p),		p += 4;
7942   offset += 8;
7943   bfd_put_32 (obfd, MTCTR_R11, p),			p += 4;
7944   bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p),	p += 4;
7945   bfd_put_32 (obfd, BCTR, p),				p += 4;
7946   return p;
7947 }
7948 
7949 static bfd_boolean
ppc_build_one_stub(struct bfd_hash_entry * gen_entry,void * in_arg)7950 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
7951 {
7952   struct ppc_stub_hash_entry *stub_entry;
7953   struct ppc_branch_hash_entry *br_entry;
7954   struct bfd_link_info *info;
7955   struct ppc_link_hash_table *htab;
7956   bfd_byte *loc;
7957   bfd_byte *p;
7958   unsigned int indx;
7959   struct plt_entry *ent;
7960   bfd_vma dest, off;
7961   int size;
7962 
7963   /* Massage our args to the form they really have.  */
7964   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
7965   info = in_arg;
7966 
7967   htab = ppc_hash_table (info);
7968 
7969   /* Make a note of the offset within the stubs for this entry.  */
7970   stub_entry->stub_offset = stub_entry->stub_sec->size;
7971   loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
7972 
7973   htab->stub_count[stub_entry->stub_type - 1] += 1;
7974   switch (stub_entry->stub_type)
7975     {
7976     case ppc_stub_long_branch:
7977     case ppc_stub_long_branch_r2off:
7978       /* Branches are relative.  This is where we are going to.  */
7979       off = dest = (stub_entry->target_value
7980 		    + stub_entry->target_section->output_offset
7981 		    + stub_entry->target_section->output_section->vma);
7982 
7983       /* And this is where we are coming from.  */
7984       off -= (stub_entry->stub_offset
7985 	      + stub_entry->stub_sec->output_offset
7986 	      + stub_entry->stub_sec->output_section->vma);
7987 
7988       if (stub_entry->stub_type != ppc_stub_long_branch_r2off)
7989 	size = 4;
7990       else
7991 	{
7992 	  bfd_vma r2off;
7993 
7994 	  r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7995 		   - htab->stub_group[stub_entry->id_sec->id].toc_off);
7996 	  bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
7997 	  loc += 4;
7998 	  bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
7999 	  loc += 4;
8000 	  bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
8001 	  loc += 4;
8002 	  off -= 12;
8003 	  size = 16;
8004 	}
8005       bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
8006 
8007       BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
8008 
8009       if (info->emitrelocations)
8010 	{
8011 	  Elf_Internal_Rela *relocs, *r;
8012 	  struct bfd_elf_section_data *elfsec_data;
8013 
8014 	  elfsec_data = elf_section_data (stub_entry->stub_sec);
8015 	  relocs = elfsec_data->relocs;
8016 	  if (relocs == NULL)
8017 	    {
8018 	      bfd_size_type relsize;
8019 	      relsize = stub_entry->stub_sec->reloc_count * sizeof (*relocs);
8020 	      relocs = bfd_alloc (htab->stub_bfd, relsize);
8021 	      if (relocs == NULL)
8022 		return FALSE;
8023 	      elfsec_data->relocs = relocs;
8024 	      elfsec_data->rel_hdr.sh_size = relsize;
8025 	      elfsec_data->rel_hdr.sh_entsize = 24;
8026 	      stub_entry->stub_sec->reloc_count = 0;
8027 	    }
8028 	  r = relocs + stub_entry->stub_sec->reloc_count;
8029 	  stub_entry->stub_sec->reloc_count += 1;
8030 	  r->r_offset = loc - stub_entry->stub_sec->contents;
8031 	  r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
8032 	  r->r_addend = dest;
8033 	  if (stub_entry->h != NULL)
8034 	    {
8035 	      struct elf_link_hash_entry **hashes;
8036 	      unsigned long symndx;
8037 	      struct ppc_link_hash_entry *h;
8038 
8039 	      hashes = elf_sym_hashes (htab->stub_bfd);
8040 	      if (hashes == NULL)
8041 		{
8042 		  bfd_size_type hsize;
8043 
8044 		  hsize = (htab->stub_globals + 1) * sizeof (*hashes);
8045 		  hashes = bfd_zalloc (htab->stub_bfd, hsize);
8046 		  if (hashes == NULL)
8047 		    return FALSE;
8048 		  elf_sym_hashes (htab->stub_bfd) = hashes;
8049 		  htab->stub_globals = 1;
8050 		}
8051 	      symndx = htab->stub_globals++;
8052 	      h = stub_entry->h;
8053 	      hashes[symndx] = &h->elf;
8054 	      r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
8055 	      if (h->oh != NULL && h->oh->is_func)
8056 		h = h->oh;
8057 	      if (h->elf.root.u.def.section != stub_entry->target_section)
8058 		/* H is an opd symbol.  The addend must be zero.  */
8059 		r->r_addend = 0;
8060 	      else
8061 		{
8062 		  off = (h->elf.root.u.def.value
8063 			 + h->elf.root.u.def.section->output_offset
8064 			 + h->elf.root.u.def.section->output_section->vma);
8065 		  r->r_addend -= off;
8066 		}
8067 	    }
8068 	}
8069       break;
8070 
8071     case ppc_stub_plt_branch:
8072     case ppc_stub_plt_branch_r2off:
8073       br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
8074 					 stub_entry->root.string + 9,
8075 					 FALSE, FALSE);
8076       if (br_entry == NULL)
8077 	{
8078 	  (*_bfd_error_handler) (_("can't find branch stub `%s'"),
8079 				 stub_entry->root.string + 9);
8080 	  htab->stub_error = TRUE;
8081 	  return FALSE;
8082 	}
8083 
8084       off = (stub_entry->target_value
8085 	     + stub_entry->target_section->output_offset
8086 	     + stub_entry->target_section->output_section->vma);
8087 
8088       bfd_put_64 (htab->brlt->owner, off,
8089 		  htab->brlt->contents + br_entry->offset);
8090 
8091       if (htab->relbrlt != NULL)
8092 	{
8093 	  /* Create a reloc for the branch lookup table entry.  */
8094 	  Elf_Internal_Rela rela;
8095 	  bfd_byte *rl;
8096 
8097 	  rela.r_offset = (br_entry->offset
8098 			   + htab->brlt->output_offset
8099 			   + htab->brlt->output_section->vma);
8100 	  rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
8101 	  rela.r_addend = off;
8102 
8103 	  rl = htab->relbrlt->contents;
8104 	  rl += htab->relbrlt->reloc_count++ * sizeof (Elf64_External_Rela);
8105 	  bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
8106 	}
8107 
8108       off = (br_entry->offset
8109 	     + htab->brlt->output_offset
8110 	     + htab->brlt->output_section->vma
8111 	     - elf_gp (htab->brlt->output_section->owner)
8112 	     - htab->stub_group[stub_entry->id_sec->id].toc_off);
8113 
8114       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
8115 	{
8116 	  (*_bfd_error_handler)
8117 	    (_("linkage table error against `%s'"),
8118 	     stub_entry->root.string);
8119 	  bfd_set_error (bfd_error_bad_value);
8120 	  htab->stub_error = TRUE;
8121 	  return FALSE;
8122 	}
8123 
8124       indx = off;
8125       if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
8126 	{
8127 	  bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
8128 	  loc += 4;
8129 	  bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
8130 	  size = 16;
8131 	}
8132       else
8133 	{
8134 	  bfd_vma r2off;
8135 
8136 	  r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
8137 		   - htab->stub_group[stub_entry->id_sec->id].toc_off);
8138 	  bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
8139 	  loc += 4;
8140 	  bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
8141 	  loc += 4;
8142 	  bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
8143 	  loc += 4;
8144 	  bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
8145 	  loc += 4;
8146 	  bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
8147 	  size = 28;
8148 	}
8149       loc += 4;
8150       bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
8151       loc += 4;
8152       bfd_put_32 (htab->stub_bfd, BCTR, loc);
8153       break;
8154 
8155     case ppc_stub_plt_call:
8156       /* Do the best we can for shared libraries built without
8157 	 exporting ".foo" for each "foo".  This can happen when symbol
8158 	 versioning scripts strip all bar a subset of symbols.  */
8159       if (stub_entry->h->oh != NULL
8160 	  && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
8161 	  && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
8162 	{
8163 	  /* Point the symbol at the stub.  There may be multiple stubs,
8164 	     we don't really care;  The main thing is to make this sym
8165 	     defined somewhere.  Maybe defining the symbol in the stub
8166 	     section is a silly idea.  If we didn't do this, htab->top_id
8167 	     could disappear.  */
8168 	  stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
8169 	  stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
8170 	  stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
8171 	}
8172 
8173       /* Now build the stub.  */
8174       off = (bfd_vma) -1;
8175       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8176 	if (ent->addend == stub_entry->addend)
8177 	  {
8178 	    off = ent->plt.offset;
8179 	    break;
8180 	  }
8181       if (off >= (bfd_vma) -2)
8182 	abort ();
8183 
8184       off &= ~ (bfd_vma) 1;
8185       off += (htab->plt->output_offset
8186 	      + htab->plt->output_section->vma
8187 	      - elf_gp (htab->plt->output_section->owner)
8188 	      - htab->stub_group[stub_entry->id_sec->id].toc_off);
8189 
8190       if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
8191 	{
8192 	  (*_bfd_error_handler)
8193 	    (_("linkage table error against `%s'"),
8194 	     stub_entry->h->elf.root.root.string);
8195 	  bfd_set_error (bfd_error_bad_value);
8196 	  htab->stub_error = TRUE;
8197 	  return FALSE;
8198 	}
8199 
8200       p = build_plt_stub (htab->stub_bfd, loc, off);
8201       size = p - loc;
8202       break;
8203 
8204     default:
8205       BFD_FAIL ();
8206       return FALSE;
8207     }
8208 
8209   stub_entry->stub_sec->size += size;
8210 
8211   if (htab->emit_stub_syms)
8212     {
8213       struct elf_link_hash_entry *h;
8214       size_t len1, len2;
8215       char *name;
8216       const char *const stub_str[] = { "long_branch",
8217 				       "long_branch_r2off",
8218 				       "plt_branch",
8219 				       "plt_branch_r2off",
8220 				       "plt_call" };
8221 
8222       len1 = strlen (stub_str[stub_entry->stub_type - 1]);
8223       len2 = strlen (stub_entry->root.string);
8224       name = bfd_malloc (len1 + len2 + 2);
8225       if (name == NULL)
8226 	return FALSE;
8227       memcpy (name, stub_entry->root.string, 9);
8228       memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
8229       memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
8230       h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
8231       if (h == NULL)
8232 	return FALSE;
8233       if (h->root.type == bfd_link_hash_new)
8234 	{
8235 	  h->root.type = bfd_link_hash_defined;
8236 	  h->root.u.def.section = stub_entry->stub_sec;
8237 	  h->root.u.def.value = stub_entry->stub_offset;
8238 	  h->ref_regular = 1;
8239 	  h->def_regular = 1;
8240 	  h->ref_regular_nonweak = 1;
8241 	  h->forced_local = 1;
8242 	  h->non_elf = 0;
8243 	}
8244     }
8245 
8246   return TRUE;
8247 }
8248 
8249 /* As above, but don't actually build the stub.  Just bump offset so
8250    we know stub section sizes, and select plt_branch stubs where
8251    long_branch stubs won't do.  */
8252 
8253 static bfd_boolean
ppc_size_one_stub(struct bfd_hash_entry * gen_entry,void * in_arg)8254 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
8255 {
8256   struct ppc_stub_hash_entry *stub_entry;
8257   struct bfd_link_info *info;
8258   struct ppc_link_hash_table *htab;
8259   bfd_vma off;
8260   int size;
8261 
8262   /* Massage our args to the form they really have.  */
8263   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
8264   info = in_arg;
8265 
8266   htab = ppc_hash_table (info);
8267 
8268   if (stub_entry->stub_type == ppc_stub_plt_call)
8269     {
8270       struct plt_entry *ent;
8271       off = (bfd_vma) -1;
8272       for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8273 	if (ent->addend == stub_entry->addend)
8274 	  {
8275 	    off = ent->plt.offset & ~(bfd_vma) 1;
8276 	    break;
8277 	  }
8278       if (off >= (bfd_vma) -2)
8279 	abort ();
8280       off += (htab->plt->output_offset
8281 	      + htab->plt->output_section->vma
8282 	      - elf_gp (htab->plt->output_section->owner)
8283 	      - htab->stub_group[stub_entry->id_sec->id].toc_off);
8284 
8285       size = PLT_CALL_STUB_SIZE;
8286       if (PPC_HA (off + 16) != PPC_HA (off))
8287 	size += 4;
8288     }
8289   else
8290     {
8291       /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
8292 	 variants.  */
8293       off = (stub_entry->target_value
8294 	     + stub_entry->target_section->output_offset
8295 	     + stub_entry->target_section->output_section->vma);
8296       off -= (stub_entry->stub_sec->size
8297 	      + stub_entry->stub_sec->output_offset
8298 	      + stub_entry->stub_sec->output_section->vma);
8299 
8300       /* Reset the stub type from the plt variant in case we now
8301 	 can reach with a shorter stub.  */
8302       if (stub_entry->stub_type >= ppc_stub_plt_branch)
8303 	stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
8304 
8305       size = 4;
8306       if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
8307 	{
8308 	  off -= 12;
8309 	  size = 16;
8310 	}
8311 
8312       /* If the branch offset if too big, use a ppc_stub_plt_branch.  */
8313       if (off + (1 << 25) >= (bfd_vma) (1 << 26))
8314 	{
8315 	  struct ppc_branch_hash_entry *br_entry;
8316 
8317 	  br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
8318 					     stub_entry->root.string + 9,
8319 					     TRUE, FALSE);
8320 	  if (br_entry == NULL)
8321 	    {
8322 	      (*_bfd_error_handler) (_("can't build branch stub `%s'"),
8323 				     stub_entry->root.string + 9);
8324 	      htab->stub_error = TRUE;
8325 	      return FALSE;
8326 	    }
8327 
8328 	  if (br_entry->iter != htab->stub_iteration)
8329 	    {
8330 	      br_entry->iter = htab->stub_iteration;
8331 	      br_entry->offset = htab->brlt->size;
8332 	      htab->brlt->size += 8;
8333 
8334 	      if (htab->relbrlt != NULL)
8335 		htab->relbrlt->size += sizeof (Elf64_External_Rela);
8336 	    }
8337 
8338 	  stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
8339 	  size = 16;
8340 	  if (stub_entry->stub_type != ppc_stub_plt_branch)
8341 	    size = 28;
8342 	}
8343 
8344       if (info->emitrelocations
8345 	  && (stub_entry->stub_type == ppc_stub_long_branch
8346 	      || stub_entry->stub_type == ppc_stub_long_branch_r2off))
8347 	stub_entry->stub_sec->reloc_count += 1;
8348     }
8349 
8350   stub_entry->stub_sec->size += size;
8351   return TRUE;
8352 }
8353 
8354 /* Set up various things so that we can make a list of input sections
8355    for each output section included in the link.  Returns -1 on error,
8356    0 when no stubs will be needed, and 1 on success.  */
8357 
8358 int
ppc64_elf_setup_section_lists(bfd * output_bfd,struct bfd_link_info * info,int no_multi_toc)8359 ppc64_elf_setup_section_lists (bfd *output_bfd,
8360 			       struct bfd_link_info *info,
8361 			       int no_multi_toc)
8362 {
8363   bfd *input_bfd;
8364   int top_id, top_index, id;
8365   asection *section;
8366   asection **input_list;
8367   bfd_size_type amt;
8368   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8369 
8370   htab->no_multi_toc = no_multi_toc;
8371 
8372   if (htab->brlt == NULL)
8373     return 0;
8374 
8375   /* Find the top input section id.  */
8376   for (input_bfd = info->input_bfds, top_id = 3;
8377        input_bfd != NULL;
8378        input_bfd = input_bfd->link_next)
8379     {
8380       for (section = input_bfd->sections;
8381 	   section != NULL;
8382 	   section = section->next)
8383 	{
8384 	  if (top_id < section->id)
8385 	    top_id = section->id;
8386 	}
8387     }
8388 
8389   htab->top_id = top_id;
8390   amt = sizeof (struct map_stub) * (top_id + 1);
8391   htab->stub_group = bfd_zmalloc (amt);
8392   if (htab->stub_group == NULL)
8393     return -1;
8394 
8395   /* Set toc_off for com, und, abs and ind sections.  */
8396   for (id = 0; id < 3; id++)
8397     htab->stub_group[id].toc_off = TOC_BASE_OFF;
8398 
8399   elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
8400 
8401   /* We can't use output_bfd->section_count here to find the top output
8402      section index as some sections may have been removed, and
8403      strip_excluded_output_sections doesn't renumber the indices.  */
8404   for (section = output_bfd->sections, top_index = 0;
8405        section != NULL;
8406        section = section->next)
8407     {
8408       if (top_index < section->index)
8409 	top_index = section->index;
8410     }
8411 
8412   htab->top_index = top_index;
8413   amt = sizeof (asection *) * (top_index + 1);
8414   input_list = bfd_zmalloc (amt);
8415   htab->input_list = input_list;
8416   if (input_list == NULL)
8417     return -1;
8418 
8419   return 1;
8420 }
8421 
8422 /* The linker repeatedly calls this function for each TOC input section
8423    and linker generated GOT section.  Group input bfds such that the toc
8424    within a group is less than 64k in size.  Will break with cute linker
8425    scripts that play games with dot in the output toc section.  */
8426 
8427 void
ppc64_elf_next_toc_section(struct bfd_link_info * info,asection * isec)8428 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
8429 {
8430   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8431 
8432   if (!htab->no_multi_toc)
8433     {
8434       bfd_vma addr = isec->output_offset + isec->output_section->vma;
8435       bfd_vma off = addr - htab->toc_curr;
8436 
8437       if (off + isec->size > 0x10000)
8438 	htab->toc_curr = addr;
8439 
8440       elf_gp (isec->owner) = (htab->toc_curr
8441 			      - elf_gp (isec->output_section->owner)
8442 			      + TOC_BASE_OFF);
8443     }
8444 }
8445 
8446 /* Called after the last call to the above function.  */
8447 
8448 void
ppc64_elf_reinit_toc(bfd * output_bfd,struct bfd_link_info * info)8449 ppc64_elf_reinit_toc (bfd *output_bfd, struct bfd_link_info *info)
8450 {
8451   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8452 
8453   htab->multi_toc_needed = htab->toc_curr != elf_gp (output_bfd);
8454 
8455   /* toc_curr tracks the TOC offset used for code sections below in
8456      ppc64_elf_next_input_section.  Start off at 0x8000.  */
8457   htab->toc_curr = TOC_BASE_OFF;
8458 }
8459 
8460 /* No toc references were found in ISEC.  If the code in ISEC makes no
8461    calls, then there's no need to use toc adjusting stubs when branching
8462    into ISEC.  Actually, indirect calls from ISEC are OK as they will
8463    load r2.  Returns -1 on error, 0 for no stub needed, 1 for stub
8464    needed, and 2 if a cyclical call-graph was found but no other reason
8465    for a stub was detected.  If called from the top level, a return of
8466    2 means the same as a return of 0.  */
8467 
8468 static int
toc_adjusting_stub_needed(struct bfd_link_info * info,asection * isec)8469 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
8470 {
8471   Elf_Internal_Rela *relstart, *rel;
8472   Elf_Internal_Sym *local_syms;
8473   int ret;
8474   struct ppc_link_hash_table *htab;
8475 
8476   /* We know none of our code bearing sections will need toc stubs.  */
8477   if ((isec->flags & SEC_LINKER_CREATED) != 0)
8478     return 0;
8479 
8480   if (isec->size == 0)
8481     return 0;
8482 
8483   if (isec->output_section == NULL)
8484     return 0;
8485 
8486   /* Hack for linux kernel.  .fixup contains branches, but only back to
8487      the function that hit an exception.  */
8488   if (strcmp (isec->name, ".fixup") == 0)
8489     return 0;
8490 
8491   if (isec->reloc_count == 0)
8492     return 0;
8493 
8494   relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
8495 					info->keep_memory);
8496   if (relstart == NULL)
8497     return -1;
8498 
8499   /* Look for branches to outside of this section.  */
8500   local_syms = NULL;
8501   ret = 0;
8502   htab = ppc_hash_table (info);
8503   for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
8504     {
8505       enum elf_ppc64_reloc_type r_type;
8506       unsigned long r_symndx;
8507       struct elf_link_hash_entry *h;
8508       Elf_Internal_Sym *sym;
8509       asection *sym_sec;
8510       long *opd_adjust;
8511       bfd_vma sym_value;
8512       bfd_vma dest;
8513 
8514       r_type = ELF64_R_TYPE (rel->r_info);
8515       if (r_type != R_PPC64_REL24
8516 	  && r_type != R_PPC64_REL14
8517 	  && r_type != R_PPC64_REL14_BRTAKEN
8518 	  && r_type != R_PPC64_REL14_BRNTAKEN)
8519 	continue;
8520 
8521       r_symndx = ELF64_R_SYM (rel->r_info);
8522       if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
8523 		      isec->owner))
8524 	{
8525 	  ret = -1;
8526 	  break;
8527 	}
8528 
8529       /* Calls to dynamic lib functions go through a plt call stub
8530 	 that uses r2.  Branches to undefined symbols might be a call
8531 	 using old-style dot symbols that can be satisfied by a plt
8532 	 call into a new-style dynamic library.  */
8533       if (sym_sec == NULL)
8534 	{
8535 	  struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
8536 	  if (eh != NULL
8537 	      && eh->oh != NULL
8538 	      && eh->oh->elf.plt.plist != NULL)
8539 	    {
8540 	      ret = 1;
8541 	      break;
8542 	    }
8543 
8544 	  /* Ignore other undefined symbols.  */
8545 	  continue;
8546 	}
8547 
8548       /* Assume branches to other sections not included in the link need
8549 	 stubs too, to cover -R and absolute syms.  */
8550       if (sym_sec->output_section == NULL)
8551 	{
8552 	  ret = 1;
8553 	  break;
8554 	}
8555 
8556       if (h == NULL)
8557 	sym_value = sym->st_value;
8558       else
8559 	{
8560 	  if (h->root.type != bfd_link_hash_defined
8561 	      && h->root.type != bfd_link_hash_defweak)
8562 	    abort ();
8563 	  sym_value = h->root.u.def.value;
8564 	}
8565       sym_value += rel->r_addend;
8566 
8567       /* If this branch reloc uses an opd sym, find the code section.  */
8568       opd_adjust = get_opd_info (sym_sec);
8569       if (opd_adjust != NULL)
8570 	{
8571 	  if (h == NULL)
8572 	    {
8573 	      long adjust;
8574 
8575 	      adjust = opd_adjust[sym->st_value / 8];
8576 	      if (adjust == -1)
8577 		/* Assume deleted functions won't ever be called.  */
8578 		continue;
8579 	      sym_value += adjust;
8580 	    }
8581 
8582 	  dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
8583 	  if (dest == (bfd_vma) -1)
8584 	    continue;
8585 	}
8586       else
8587 	dest = (sym_value
8588 		+ sym_sec->output_offset
8589 		+ sym_sec->output_section->vma);
8590 
8591       /* Ignore branch to self.  */
8592       if (sym_sec == isec)
8593 	continue;
8594 
8595       /* If the called function uses the toc, we need a stub.  */
8596       if (sym_sec->has_toc_reloc
8597 	  || sym_sec->makes_toc_func_call)
8598 	{
8599 	  ret = 1;
8600 	  break;
8601 	}
8602 
8603       /* Assume any branch that needs a long branch stub might in fact
8604 	 need a plt_branch stub.  A plt_branch stub uses r2.  */
8605       else if (dest - (isec->output_offset
8606 		       + isec->output_section->vma
8607 		       + rel->r_offset) + (1 << 25) >= (2 << 25))
8608 	{
8609 	  ret = 1;
8610 	  break;
8611 	}
8612 
8613       /* If calling back to a section in the process of being tested, we
8614 	 can't say for sure that no toc adjusting stubs are needed, so
8615 	 don't return zero.  */
8616       else if (sym_sec->call_check_in_progress)
8617 	ret = 2;
8618 
8619       /* Branches to another section that itself doesn't have any TOC
8620 	 references are OK.  Recursively call ourselves to check.  */
8621       else if (sym_sec->id <= htab->top_id
8622 	       && htab->stub_group[sym_sec->id].toc_off == 0)
8623 	{
8624 	  int recur;
8625 
8626 	  /* Mark current section as indeterminate, so that other
8627 	     sections that call back to current won't be marked as
8628 	     known.  */
8629 	  isec->call_check_in_progress = 1;
8630 	  recur = toc_adjusting_stub_needed (info, sym_sec);
8631 	  isec->call_check_in_progress = 0;
8632 
8633 	  if (recur < 0)
8634 	    {
8635 	      /* An error.  Exit.  */
8636 	      ret = -1;
8637 	      break;
8638 	    }
8639 	  else if (recur <= 1)
8640 	    {
8641 	      /* Known result.  Mark as checked and set section flag.  */
8642 	      htab->stub_group[sym_sec->id].toc_off = 1;
8643 	      if (recur != 0)
8644 		{
8645 		  sym_sec->makes_toc_func_call = 1;
8646 		  ret = 1;
8647 		  break;
8648 		}
8649 	    }
8650 	  else
8651 	    {
8652 	      /* Unknown result.  Continue checking.  */
8653 	      ret = 2;
8654 	    }
8655 	}
8656     }
8657 
8658   if (local_syms != NULL
8659       && (elf_tdata (isec->owner)->symtab_hdr.contents
8660 	  != (unsigned char *) local_syms))
8661     free (local_syms);
8662   if (elf_section_data (isec)->relocs != relstart)
8663     free (relstart);
8664 
8665   return ret;
8666 }
8667 
8668 /* The linker repeatedly calls this function for each input section,
8669    in the order that input sections are linked into output sections.
8670    Build lists of input sections to determine groupings between which
8671    we may insert linker stubs.  */
8672 
8673 bfd_boolean
ppc64_elf_next_input_section(struct bfd_link_info * info,asection * isec)8674 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
8675 {
8676   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8677 
8678   if ((isec->output_section->flags & SEC_CODE) != 0
8679       && isec->output_section->index <= htab->top_index)
8680     {
8681       asection **list = htab->input_list + isec->output_section->index;
8682       /* Steal the link_sec pointer for our list.  */
8683 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
8684       /* This happens to make the list in reverse order,
8685 	 which is what we want.  */
8686       PREV_SEC (isec) = *list;
8687       *list = isec;
8688     }
8689 
8690   if (htab->multi_toc_needed)
8691     {
8692       /* If a code section has a function that uses the TOC then we need
8693 	 to use the right TOC (obviously).  Also, make sure that .opd gets
8694 	 the correct TOC value for R_PPC64_TOC relocs that don't have or
8695 	 can't find their function symbol (shouldn't ever happen now).  */
8696       if (isec->has_toc_reloc || (isec->flags & SEC_CODE) == 0)
8697 	{
8698 	  if (elf_gp (isec->owner) != 0)
8699 	    htab->toc_curr = elf_gp (isec->owner);
8700 	}
8701       else if (htab->stub_group[isec->id].toc_off == 0)
8702 	{
8703 	  int ret = toc_adjusting_stub_needed (info, isec);
8704 	  if (ret < 0)
8705 	    return FALSE;
8706 	  else
8707 	    isec->makes_toc_func_call = ret & 1;
8708 	}
8709     }
8710 
8711   /* Functions that don't use the TOC can belong in any TOC group.
8712      Use the last TOC base.  This happens to make _init and _fini
8713      pasting work.  */
8714   htab->stub_group[isec->id].toc_off = htab->toc_curr;
8715   return TRUE;
8716 }
8717 
8718 /* See whether we can group stub sections together.  Grouping stub
8719    sections may result in fewer stubs.  More importantly, we need to
8720    put all .init* and .fini* stubs at the beginning of the .init or
8721    .fini output sections respectively, because glibc splits the
8722    _init and _fini functions into multiple parts.  Putting a stub in
8723    the middle of a function is not a good idea.  */
8724 
8725 static void
group_sections(struct ppc_link_hash_table * htab,bfd_size_type stub_group_size,bfd_boolean stubs_always_before_branch)8726 group_sections (struct ppc_link_hash_table *htab,
8727 		bfd_size_type stub_group_size,
8728 		bfd_boolean stubs_always_before_branch)
8729 {
8730   asection **list = htab->input_list + htab->top_index;
8731   do
8732     {
8733       asection *tail = *list;
8734       while (tail != NULL)
8735 	{
8736 	  asection *curr;
8737 	  asection *prev;
8738 	  bfd_size_type total;
8739 	  bfd_boolean big_sec;
8740 	  bfd_vma curr_toc;
8741 
8742 	  curr = tail;
8743 	  total = tail->size;
8744 	  big_sec = total >= stub_group_size;
8745 	  curr_toc = htab->stub_group[tail->id].toc_off;
8746 
8747 	  while ((prev = PREV_SEC (curr)) != NULL
8748 		 && ((total += curr->output_offset - prev->output_offset)
8749 		     < stub_group_size)
8750 		 && htab->stub_group[prev->id].toc_off == curr_toc)
8751 	    curr = prev;
8752 
8753 	  /* OK, the size from the start of CURR to the end is less
8754 	     than stub_group_size and thus can be handled by one stub
8755 	     section.  (or the tail section is itself larger than
8756 	     stub_group_size, in which case we may be toast.)  We
8757 	     should really be keeping track of the total size of stubs
8758 	     added here, as stubs contribute to the final output
8759 	     section size.  That's a little tricky, and this way will
8760 	     only break if stubs added make the total size more than
8761 	     2^25, ie. for the default stub_group_size, if stubs total
8762 	     more than 2097152 bytes, or nearly 75000 plt call stubs.  */
8763 	  do
8764 	    {
8765 	      prev = PREV_SEC (tail);
8766 	      /* Set up this stub group.  */
8767 	      htab->stub_group[tail->id].link_sec = curr;
8768 	    }
8769 	  while (tail != curr && (tail = prev) != NULL);
8770 
8771 	  /* But wait, there's more!  Input sections up to stub_group_size
8772 	     bytes before the stub section can be handled by it too.
8773 	     Don't do this if we have a really large section after the
8774 	     stubs, as adding more stubs increases the chance that
8775 	     branches may not reach into the stub section.  */
8776 	  if (!stubs_always_before_branch && !big_sec)
8777 	    {
8778 	      total = 0;
8779 	      while (prev != NULL
8780 		     && ((total += tail->output_offset - prev->output_offset)
8781 			 < stub_group_size)
8782 		     && htab->stub_group[prev->id].toc_off == curr_toc)
8783 		{
8784 		  tail = prev;
8785 		  prev = PREV_SEC (tail);
8786 		  htab->stub_group[tail->id].link_sec = curr;
8787 		}
8788 	    }
8789 	  tail = prev;
8790 	}
8791     }
8792   while (list-- != htab->input_list);
8793   free (htab->input_list);
8794 #undef PREV_SEC
8795 }
8796 
8797 /* Determine and set the size of the stub section for a final link.
8798 
8799    The basic idea here is to examine all the relocations looking for
8800    PC-relative calls to a target that is unreachable with a "bl"
8801    instruction.  */
8802 
8803 bfd_boolean
ppc64_elf_size_stubs(bfd * output_bfd,struct bfd_link_info * info,bfd_signed_vma group_size,asection * (* add_stub_section)(const char *,asection *),void (* layout_sections_again)(void))8804 ppc64_elf_size_stubs (bfd *output_bfd,
8805 		      struct bfd_link_info *info,
8806 		      bfd_signed_vma group_size,
8807 		      asection *(*add_stub_section) (const char *, asection *),
8808 		      void (*layout_sections_again) (void))
8809 {
8810   bfd_size_type stub_group_size;
8811   bfd_boolean stubs_always_before_branch;
8812   struct ppc_link_hash_table *htab = ppc_hash_table (info);
8813 
8814   /* Stash our params away.  */
8815   htab->add_stub_section = add_stub_section;
8816   htab->layout_sections_again = layout_sections_again;
8817   stubs_always_before_branch = group_size < 0;
8818   if (group_size < 0)
8819     stub_group_size = -group_size;
8820   else
8821     stub_group_size = group_size;
8822   if (stub_group_size == 1)
8823     {
8824       /* Default values.  */
8825       if (stubs_always_before_branch)
8826 	{
8827 	  stub_group_size = 0x1e00000;
8828 	  if (htab->has_14bit_branch)
8829 	    stub_group_size = 0x7800;
8830 	}
8831       else
8832 	{
8833 	  stub_group_size = 0x1c00000;
8834 	  if (htab->has_14bit_branch)
8835 	    stub_group_size = 0x7000;
8836 	}
8837     }
8838 
8839   group_sections (htab, stub_group_size, stubs_always_before_branch);
8840 
8841   while (1)
8842     {
8843       bfd *input_bfd;
8844       unsigned int bfd_indx;
8845       asection *stub_sec;
8846       bfd_boolean stub_changed;
8847 
8848       htab->stub_iteration += 1;
8849       stub_changed = FALSE;
8850 
8851       for (input_bfd = info->input_bfds, bfd_indx = 0;
8852 	   input_bfd != NULL;
8853 	   input_bfd = input_bfd->link_next, bfd_indx++)
8854 	{
8855 	  Elf_Internal_Shdr *symtab_hdr;
8856 	  asection *section;
8857 	  Elf_Internal_Sym *local_syms = NULL;
8858 
8859 	  /* We'll need the symbol table in a second.  */
8860 	  symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8861 	  if (symtab_hdr->sh_info == 0)
8862 	    continue;
8863 
8864 	  /* Walk over each section attached to the input bfd.  */
8865 	  for (section = input_bfd->sections;
8866 	       section != NULL;
8867 	       section = section->next)
8868 	    {
8869 	      Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
8870 
8871 	      /* If there aren't any relocs, then there's nothing more
8872 		 to do.  */
8873 	      if ((section->flags & SEC_RELOC) == 0
8874 		  || section->reloc_count == 0)
8875 		continue;
8876 
8877 	      /* If this section is a link-once section that will be
8878 		 discarded, then don't create any stubs.  */
8879 	      if (section->output_section == NULL
8880 		  || section->output_section->owner != output_bfd)
8881 		continue;
8882 
8883 	      /* Get the relocs.  */
8884 	      internal_relocs
8885 		= _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
8886 					     info->keep_memory);
8887 	      if (internal_relocs == NULL)
8888 		goto error_ret_free_local;
8889 
8890 	      /* Now examine each relocation.  */
8891 	      irela = internal_relocs;
8892 	      irelaend = irela + section->reloc_count;
8893 	      for (; irela < irelaend; irela++)
8894 		{
8895 		  enum elf_ppc64_reloc_type r_type;
8896 		  unsigned int r_indx;
8897 		  enum ppc_stub_type stub_type;
8898 		  struct ppc_stub_hash_entry *stub_entry;
8899 		  asection *sym_sec, *code_sec;
8900 		  bfd_vma sym_value;
8901 		  bfd_vma destination;
8902 		  bfd_boolean ok_dest;
8903 		  struct ppc_link_hash_entry *hash;
8904 		  struct ppc_link_hash_entry *fdh;
8905 		  struct elf_link_hash_entry *h;
8906 		  Elf_Internal_Sym *sym;
8907 		  char *stub_name;
8908 		  const asection *id_sec;
8909 		  long *opd_adjust;
8910 
8911 		  r_type = ELF64_R_TYPE (irela->r_info);
8912 		  r_indx = ELF64_R_SYM (irela->r_info);
8913 
8914 		  if (r_type >= R_PPC64_max)
8915 		    {
8916 		      bfd_set_error (bfd_error_bad_value);
8917 		      goto error_ret_free_internal;
8918 		    }
8919 
8920 		  /* Only look for stubs on branch instructions.  */
8921 		  if (r_type != R_PPC64_REL24
8922 		      && r_type != R_PPC64_REL14
8923 		      && r_type != R_PPC64_REL14_BRTAKEN
8924 		      && r_type != R_PPC64_REL14_BRNTAKEN)
8925 		    continue;
8926 
8927 		  /* Now determine the call target, its name, value,
8928 		     section.  */
8929 		  if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8930 				  r_indx, input_bfd))
8931 		    goto error_ret_free_internal;
8932 		  hash = (struct ppc_link_hash_entry *) h;
8933 
8934 		  ok_dest = FALSE;
8935 		  fdh = NULL;
8936 		  if (hash == NULL)
8937 		    {
8938 		      sym_value = sym->st_value;
8939 		      ok_dest = TRUE;
8940 		    }
8941 		  else
8942 		    {
8943 		      sym_value = 0;
8944 		      /* Recognise an old ABI func code entry sym, and
8945 			 use the func descriptor sym instead.  */
8946 		      if (hash->elf.root.root.string[0] == '.'
8947 			  && (fdh = get_fdh (hash, htab)) != NULL)
8948 			{
8949 			  if (fdh->elf.root.type == bfd_link_hash_defined
8950 			      || fdh->elf.root.type == bfd_link_hash_defweak)
8951 			    {
8952 			      sym_sec = fdh->elf.root.u.def.section;
8953 			      sym_value = fdh->elf.root.u.def.value;
8954 			      if (sym_sec->output_section != NULL)
8955 				ok_dest = TRUE;
8956 			    }
8957 			  else
8958 			    fdh = NULL;
8959 			}
8960 		      else if (hash->elf.root.type == bfd_link_hash_defined
8961 			       || hash->elf.root.type == bfd_link_hash_defweak)
8962 			{
8963 			  sym_value = hash->elf.root.u.def.value;
8964 			  if (sym_sec->output_section != NULL)
8965 			    ok_dest = TRUE;
8966 			}
8967 		      else if (hash->elf.root.type == bfd_link_hash_undefweak)
8968 			;
8969 		      else if (hash->elf.root.type == bfd_link_hash_undefined)
8970 			;
8971 		      else
8972 			{
8973 			  bfd_set_error (bfd_error_bad_value);
8974 			  goto error_ret_free_internal;
8975 			}
8976 		    }
8977 
8978 		  destination = 0;
8979 		  if (ok_dest)
8980 		    {
8981 		      sym_value += irela->r_addend;
8982 		      destination = (sym_value
8983 				     + sym_sec->output_offset
8984 				     + sym_sec->output_section->vma);
8985 		    }
8986 
8987 		  code_sec = sym_sec;
8988 		  opd_adjust = get_opd_info (sym_sec);
8989 		  if (opd_adjust != NULL)
8990 		    {
8991 		      bfd_vma dest;
8992 
8993 		      if (hash == NULL)
8994 			{
8995 			  long adjust = opd_adjust[sym_value / 8];
8996 			  if (adjust == -1)
8997 			    continue;
8998 			  sym_value += adjust;
8999 			}
9000 		      dest = opd_entry_value (sym_sec, sym_value,
9001 					      &code_sec, &sym_value);
9002 		      if (dest != (bfd_vma) -1)
9003 			{
9004 			  destination = dest;
9005 			  if (fdh != NULL)
9006 			    {
9007 			      /* Fixup old ABI sym to point at code
9008 				 entry.  */
9009 			      hash->elf.root.type = bfd_link_hash_defweak;
9010 			      hash->elf.root.u.def.section = code_sec;
9011 			      hash->elf.root.u.def.value = sym_value;
9012 			    }
9013 			}
9014 		    }
9015 
9016 		  /* Determine what (if any) linker stub is needed.  */
9017 		  stub_type = ppc_type_of_stub (section, irela, &hash,
9018 						destination);
9019 
9020 		  if (stub_type != ppc_stub_plt_call)
9021 		    {
9022 		      /* Check whether we need a TOC adjusting stub.
9023 			 Since the linker pastes together pieces from
9024 			 different object files when creating the
9025 			 _init and _fini functions, it may be that a
9026 			 call to what looks like a local sym is in
9027 			 fact a call needing a TOC adjustment.  */
9028 		      if (code_sec != NULL
9029 			  && code_sec->output_section != NULL
9030 			  && (htab->stub_group[code_sec->id].toc_off
9031 			      != htab->stub_group[section->id].toc_off)
9032 			  && (code_sec->has_toc_reloc
9033 			      || code_sec->makes_toc_func_call))
9034 			stub_type = ppc_stub_long_branch_r2off;
9035 		    }
9036 
9037 		  if (stub_type == ppc_stub_none)
9038 		    continue;
9039 
9040 		  /* __tls_get_addr calls might be eliminated.  */
9041 		  if (stub_type != ppc_stub_plt_call
9042 		      && hash != NULL
9043 		      && (hash == htab->tls_get_addr
9044 			  || hash == htab->tls_get_addr_fd)
9045 		      && section->has_tls_reloc
9046 		      && irela != internal_relocs)
9047 		    {
9048 		      /* Get tls info.  */
9049 		      char *tls_mask;
9050 
9051 		      if (!get_tls_mask (&tls_mask, NULL, &local_syms,
9052 					 irela - 1, input_bfd))
9053 			goto error_ret_free_internal;
9054 		      if (*tls_mask != 0)
9055 			continue;
9056 		    }
9057 
9058 		  /* Support for grouping stub sections.  */
9059 		  id_sec = htab->stub_group[section->id].link_sec;
9060 
9061 		  /* Get the name of this stub.  */
9062 		  stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
9063 		  if (!stub_name)
9064 		    goto error_ret_free_internal;
9065 
9066 		  stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
9067 						     stub_name, FALSE, FALSE);
9068 		  if (stub_entry != NULL)
9069 		    {
9070 		      /* The proper stub has already been created.  */
9071 		      free (stub_name);
9072 		      continue;
9073 		    }
9074 
9075 		  stub_entry = ppc_add_stub (stub_name, section, htab);
9076 		  if (stub_entry == NULL)
9077 		    {
9078 		      free (stub_name);
9079 		    error_ret_free_internal:
9080 		      if (elf_section_data (section)->relocs == NULL)
9081 			free (internal_relocs);
9082 		    error_ret_free_local:
9083 		      if (local_syms != NULL
9084 			  && (symtab_hdr->contents
9085 			      != (unsigned char *) local_syms))
9086 			free (local_syms);
9087 		      return FALSE;
9088 		    }
9089 
9090 		  stub_entry->stub_type = stub_type;
9091 		  stub_entry->target_value = sym_value;
9092 		  stub_entry->target_section = code_sec;
9093 		  stub_entry->h = hash;
9094 		  stub_entry->addend = irela->r_addend;
9095 
9096 		  if (stub_entry->h != NULL)
9097 		    htab->stub_globals += 1;
9098 
9099 		  stub_changed = TRUE;
9100 		}
9101 
9102 	      /* We're done with the internal relocs, free them.  */
9103 	      if (elf_section_data (section)->relocs != internal_relocs)
9104 		free (internal_relocs);
9105 	    }
9106 
9107 	  if (local_syms != NULL
9108 	      && symtab_hdr->contents != (unsigned char *) local_syms)
9109 	    {
9110 	      if (!info->keep_memory)
9111 		free (local_syms);
9112 	      else
9113 		symtab_hdr->contents = (unsigned char *) local_syms;
9114 	    }
9115 	}
9116 
9117       if (!stub_changed)
9118 	break;
9119 
9120       /* OK, we've added some stubs.  Find out the new size of the
9121 	 stub sections.  */
9122       for (stub_sec = htab->stub_bfd->sections;
9123 	   stub_sec != NULL;
9124 	   stub_sec = stub_sec->next)
9125 	if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
9126 	  {
9127 	    stub_sec->size = 0;
9128 	    stub_sec->reloc_count = 0;
9129 	  }
9130 
9131       htab->brlt->size = 0;
9132       if (htab->relbrlt != NULL)
9133 	htab->relbrlt->size = 0;
9134 
9135       bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
9136 
9137       /* Ask the linker to do its stuff.  */
9138       (*htab->layout_sections_again) ();
9139     }
9140 
9141   /* It would be nice to strip .branch_lt from the output if the
9142      section is empty, but it's too late.  If we strip sections here,
9143      the dynamic symbol table is corrupted since the section symbol
9144      for the stripped section isn't written.  */
9145 
9146   return TRUE;
9147 }
9148 
9149 /* Called after we have determined section placement.  If sections
9150    move, we'll be called again.  Provide a value for TOCstart.  */
9151 
9152 bfd_vma
ppc64_elf_toc(bfd * obfd)9153 ppc64_elf_toc (bfd *obfd)
9154 {
9155   asection *s;
9156   bfd_vma TOCstart;
9157 
9158   /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
9159      order.  The TOC starts where the first of these sections starts.  */
9160   s = bfd_get_section_by_name (obfd, ".got");
9161   if (s == NULL)
9162     s = bfd_get_section_by_name (obfd, ".toc");
9163   if (s == NULL)
9164     s = bfd_get_section_by_name (obfd, ".tocbss");
9165   if (s == NULL)
9166     s = bfd_get_section_by_name (obfd, ".plt");
9167   if (s == NULL)
9168     {
9169       /* This may happen for
9170 	 o  references to TOC base (SYM@toc / TOC[tc0]) without a
9171 	 .toc directive
9172 	 o  bad linker script
9173 	 o --gc-sections and empty TOC sections
9174 
9175 	 FIXME: Warn user?  */
9176 
9177       /* Look for a likely section.  We probably won't even be
9178 	 using TOCstart.  */
9179       for (s = obfd->sections; s != NULL; s = s->next)
9180 	if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
9181 	    == (SEC_ALLOC | SEC_SMALL_DATA))
9182 	  break;
9183       if (s == NULL)
9184 	for (s = obfd->sections; s != NULL; s = s->next)
9185 	  if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
9186 	      == (SEC_ALLOC | SEC_SMALL_DATA))
9187 	    break;
9188       if (s == NULL)
9189 	for (s = obfd->sections; s != NULL; s = s->next)
9190 	  if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
9191 	    break;
9192       if (s == NULL)
9193 	for (s = obfd->sections; s != NULL; s = s->next)
9194 	  if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
9195 	    break;
9196     }
9197 
9198   TOCstart = 0;
9199   if (s != NULL)
9200     TOCstart = s->output_section->vma + s->output_offset;
9201 
9202   return TOCstart;
9203 }
9204 
9205 /* Build all the stubs associated with the current output file.
9206    The stubs are kept in a hash table attached to the main linker
9207    hash table.  This function is called via gldelf64ppc_finish.  */
9208 
9209 bfd_boolean
ppc64_elf_build_stubs(bfd_boolean emit_stub_syms,struct bfd_link_info * info,char ** stats)9210 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
9211 		       struct bfd_link_info *info,
9212 		       char **stats)
9213 {
9214   struct ppc_link_hash_table *htab = ppc_hash_table (info);
9215   asection *stub_sec;
9216   bfd_byte *p;
9217   int stub_sec_count = 0;
9218 
9219   htab->emit_stub_syms = emit_stub_syms;
9220 
9221   /* Allocate memory to hold the linker stubs.  */
9222   for (stub_sec = htab->stub_bfd->sections;
9223        stub_sec != NULL;
9224        stub_sec = stub_sec->next)
9225     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
9226 	&& stub_sec->size != 0)
9227       {
9228 	stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
9229 	if (stub_sec->contents == NULL)
9230 	  return FALSE;
9231 	/* We want to check that built size is the same as calculated
9232 	   size.  rawsize is a convenient location to use.  */
9233 	stub_sec->rawsize = stub_sec->size;
9234 	stub_sec->size = 0;
9235       }
9236 
9237   if (htab->plt != NULL)
9238     {
9239       unsigned int indx;
9240       bfd_vma plt0;
9241 
9242       /* Build the .glink plt call stub.  */
9243       plt0 = (htab->plt->output_section->vma
9244 	      + htab->plt->output_offset
9245 	      - (htab->glink->output_section->vma
9246 		 + htab->glink->output_offset
9247 		 + GLINK_CALL_STUB_SIZE));
9248       if (plt0 + 0x80008000 > 0xffffffff)
9249 	{
9250 	  (*_bfd_error_handler) (_(".glink and .plt too far apart"));
9251 	  bfd_set_error (bfd_error_bad_value);
9252 	  return FALSE;
9253 	}
9254 
9255       if (htab->emit_stub_syms)
9256 	{
9257 	  struct elf_link_hash_entry *h;
9258 	  h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
9259 	  if (h == NULL)
9260 	    return FALSE;
9261 	  if (h->root.type == bfd_link_hash_new)
9262 	    {
9263 	      h->root.type = bfd_link_hash_defined;
9264 	      h->root.u.def.section = htab->glink;
9265 	      h->root.u.def.value = 0;
9266 	      h->ref_regular = 1;
9267 	      h->def_regular = 1;
9268 	      h->ref_regular_nonweak = 1;
9269 	      h->forced_local = 1;
9270 	      h->non_elf = 0;
9271 	    }
9272 	}
9273       p = htab->glink->contents;
9274       bfd_put_32 (htab->glink->owner, MFCTR_R12, p);
9275       p += 4;
9276       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_3, p);
9277       p += 4;
9278       bfd_put_32 (htab->glink->owner, ADDIC_R2_R0_32K, p);
9279       p += 4;
9280       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
9281       p += 4;
9282       bfd_put_32 (htab->glink->owner, SRADI_R2_R2_63, p);
9283       p += 4;
9284       bfd_put_32 (htab->glink->owner, SLDI_R11_R0_2, p);
9285       p += 4;
9286       bfd_put_32 (htab->glink->owner, AND_R2_R2_R11, p);
9287       p += 4;
9288       bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
9289       p += 4;
9290       bfd_put_32 (htab->glink->owner, ADD_R12_R12_R2, p);
9291       p += 4;
9292       bfd_put_32 (htab->glink->owner, ADDIS_R12_R12 | PPC_HA (plt0), p);
9293       p += 4;
9294       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | PPC_LO (plt0), p);
9295       p += 4;
9296       bfd_put_32 (htab->glink->owner, ADDI_R12_R12 | PPC_LO (plt0), p);
9297       p += 4;
9298       bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
9299       p += 4;
9300       bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
9301       p += 4;
9302       bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
9303       p += 4;
9304       bfd_put_32 (htab->glink->owner, BCTR, p);
9305       p += 4;
9306 
9307       /* Build the .glink lazy link call stubs.  */
9308       indx = 0;
9309       while (p < htab->glink->contents + htab->glink->size)
9310 	{
9311 	  if (indx < 0x8000)
9312 	    {
9313 	      bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
9314 	      p += 4;
9315 	    }
9316 	  else
9317 	    {
9318 	      bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
9319 	      p += 4;
9320 	      bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
9321 	      p += 4;
9322 	    }
9323 	  bfd_put_32 (htab->glink->owner,
9324 		      B_DOT | ((htab->glink->contents - p) & 0x3fffffc), p);
9325 	  indx++;
9326 	  p += 4;
9327 	}
9328       htab->glink->rawsize = p - htab->glink->contents;
9329     }
9330 
9331   if (htab->brlt->size != 0)
9332     {
9333       htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
9334 					 htab->brlt->size);
9335       if (htab->brlt->contents == NULL)
9336 	return FALSE;
9337     }
9338   if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
9339     {
9340       htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
9341 					    htab->relbrlt->size);
9342       if (htab->relbrlt->contents == NULL)
9343 	return FALSE;
9344     }
9345 
9346   /* Build the stubs as directed by the stub hash table.  */
9347   bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
9348 
9349   for (stub_sec = htab->stub_bfd->sections;
9350        stub_sec != NULL;
9351        stub_sec = stub_sec->next)
9352     if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
9353       {
9354 	stub_sec_count += 1;
9355 	if (stub_sec->rawsize != stub_sec->size)
9356 	  break;
9357       }
9358 
9359   if (stub_sec != NULL
9360       || htab->glink->rawsize != htab->glink->size)
9361     {
9362       htab->stub_error = TRUE;
9363       (*_bfd_error_handler) (_("stubs don't match calculated size"));
9364     }
9365 
9366   if (htab->stub_error)
9367     return FALSE;
9368 
9369   if (stats != NULL)
9370     {
9371       *stats = bfd_malloc (500);
9372       if (*stats == NULL)
9373 	return FALSE;
9374 
9375       sprintf (*stats, _("linker stubs in %u group%s\n"
9376 			 "  branch       %lu\n"
9377 			 "  toc adjust   %lu\n"
9378 			 "  long branch  %lu\n"
9379 			 "  long toc adj %lu\n"
9380 			 "  plt call     %lu"),
9381 	       stub_sec_count,
9382 	       stub_sec_count == 1 ? "" : "s",
9383 	       htab->stub_count[ppc_stub_long_branch - 1],
9384 	       htab->stub_count[ppc_stub_long_branch_r2off - 1],
9385 	       htab->stub_count[ppc_stub_plt_branch - 1],
9386 	       htab->stub_count[ppc_stub_plt_branch_r2off - 1],
9387 	       htab->stub_count[ppc_stub_plt_call - 1]);
9388     }
9389   return TRUE;
9390 }
9391 
9392 /* This function undoes the changes made by add_symbol_adjust.  */
9393 
9394 static bfd_boolean
undo_symbol_twiddle(struct elf_link_hash_entry * h,void * inf ATTRIBUTE_UNUSED)9395 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
9396 {
9397   struct ppc_link_hash_entry *eh;
9398 
9399   if (h->root.type == bfd_link_hash_indirect)
9400     return TRUE;
9401 
9402   if (h->root.type == bfd_link_hash_warning)
9403     h = (struct elf_link_hash_entry *) h->root.u.i.link;
9404 
9405   eh = (struct ppc_link_hash_entry *) h;
9406   if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
9407     return TRUE;
9408 
9409   eh->elf.root.type = bfd_link_hash_undefined;
9410   return TRUE;
9411 }
9412 
9413 void
ppc64_elf_restore_symbols(struct bfd_link_info * info)9414 ppc64_elf_restore_symbols (struct bfd_link_info *info)
9415 {
9416   struct ppc_link_hash_table *htab = ppc_hash_table (info);
9417   elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
9418 }
9419 
9420 /* The RELOCATE_SECTION function is called by the ELF backend linker
9421    to handle the relocations for a section.
9422 
9423    The relocs are always passed as Rela structures; if the section
9424    actually uses Rel structures, the r_addend field will always be
9425    zero.
9426 
9427    This function is responsible for adjust the section contents as
9428    necessary, and (if using Rela relocs and generating a
9429    relocatable output file) adjusting the reloc addend as
9430    necessary.
9431 
9432    This function does not have to worry about setting the reloc
9433    address or the reloc symbol index.
9434 
9435    LOCAL_SYMS is a pointer to the swapped in local symbols.
9436 
9437    LOCAL_SECTIONS is an array giving the section in the input file
9438    corresponding to the st_shndx field of each local symbol.
9439 
9440    The global hash table entry for the global symbols can be found
9441    via elf_sym_hashes (input_bfd).
9442 
9443    When generating relocatable output, this function must handle
9444    STB_LOCAL/STT_SECTION symbols specially.  The output symbol is
9445    going to be the section symbol corresponding to the output
9446    section, which means that the addend must be adjusted
9447    accordingly.  */
9448 
9449 static bfd_boolean
ppc64_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)9450 ppc64_elf_relocate_section (bfd *output_bfd,
9451 			    struct bfd_link_info *info,
9452 			    bfd *input_bfd,
9453 			    asection *input_section,
9454 			    bfd_byte *contents,
9455 			    Elf_Internal_Rela *relocs,
9456 			    Elf_Internal_Sym *local_syms,
9457 			    asection **local_sections)
9458 {
9459   struct ppc_link_hash_table *htab;
9460   Elf_Internal_Shdr *symtab_hdr;
9461   struct elf_link_hash_entry **sym_hashes;
9462   Elf_Internal_Rela *rel;
9463   Elf_Internal_Rela *relend;
9464   Elf_Internal_Rela outrel;
9465   bfd_byte *loc;
9466   struct got_entry **local_got_ents;
9467   bfd_vma TOCstart;
9468   bfd_boolean ret = TRUE;
9469   bfd_boolean is_opd;
9470   /* Disabled until we sort out how ld should choose 'y' vs 'at'.  */
9471   bfd_boolean is_power4 = FALSE;
9472 
9473   if (info->relocatable)
9474     return TRUE;
9475 
9476   /* Initialize howto table if needed.  */
9477   if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9478     ppc_howto_init ();
9479 
9480   htab = ppc_hash_table (info);
9481 
9482   /* Don't relocate stub sections.  */
9483   if (input_section->owner == htab->stub_bfd)
9484     return TRUE;
9485 
9486   local_got_ents = elf_local_got_ents (input_bfd);
9487   TOCstart = elf_gp (output_bfd);
9488   symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
9489   sym_hashes = elf_sym_hashes (input_bfd);
9490   is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL;
9491 
9492   rel = relocs;
9493   relend = relocs + input_section->reloc_count;
9494   for (; rel < relend; rel++)
9495     {
9496       enum elf_ppc64_reloc_type r_type;
9497       bfd_vma addend;
9498       bfd_reloc_status_type r;
9499       Elf_Internal_Sym *sym;
9500       asection *sec;
9501       struct elf_link_hash_entry *h_elf;
9502       struct ppc_link_hash_entry *h;
9503       struct ppc_link_hash_entry *fdh;
9504       const char *sym_name;
9505       unsigned long r_symndx, toc_symndx;
9506       char tls_mask, tls_gd, tls_type;
9507       char sym_type;
9508       bfd_vma relocation;
9509       bfd_boolean unresolved_reloc;
9510       bfd_boolean warned;
9511       unsigned long insn, mask;
9512       struct ppc_stub_hash_entry *stub_entry;
9513       bfd_vma max_br_offset;
9514       bfd_vma from;
9515 
9516       r_type = ELF64_R_TYPE (rel->r_info);
9517       r_symndx = ELF64_R_SYM (rel->r_info);
9518 
9519       /* For old style R_PPC64_TOC relocs with a zero symbol, use the
9520 	 symbol of the previous ADDR64 reloc.  The symbol gives us the
9521 	 proper TOC base to use.  */
9522       if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
9523 	  && rel != relocs
9524 	  && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
9525 	  && is_opd)
9526 	r_symndx = ELF64_R_SYM (rel[-1].r_info);
9527 
9528       sym = NULL;
9529       sec = NULL;
9530       h_elf = NULL;
9531       sym_name = NULL;
9532       unresolved_reloc = FALSE;
9533       warned = FALSE;
9534 
9535       if (r_symndx < symtab_hdr->sh_info)
9536 	{
9537 	  /* It's a local symbol.  */
9538 	  long *opd_adjust;
9539 
9540 	  sym = local_syms + r_symndx;
9541 	  sec = local_sections[r_symndx];
9542 	  sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
9543 	  sym_type = ELF64_ST_TYPE (sym->st_info);
9544 	  relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
9545 	  opd_adjust = get_opd_info (sec);
9546 	  if (opd_adjust != NULL)
9547 	    {
9548 	      long adjust = opd_adjust[(sym->st_value + rel->r_addend) / 8];
9549 	      if (adjust == -1)
9550 		relocation = 0;
9551 	      else
9552 		relocation += adjust;
9553 	    }
9554 	}
9555       else
9556 	{
9557 	  RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
9558 				   r_symndx, symtab_hdr, sym_hashes,
9559 				   h_elf, sec, relocation,
9560 				   unresolved_reloc, warned);
9561 	  sym_name = h_elf->root.root.string;
9562 	  sym_type = h_elf->type;
9563 	}
9564       h = (struct ppc_link_hash_entry *) h_elf;
9565 
9566       /* TLS optimizations.  Replace instruction sequences and relocs
9567 	 based on information we collected in tls_optimize.  We edit
9568 	 RELOCS so that --emit-relocs will output something sensible
9569 	 for the final instruction stream.  */
9570       tls_mask = 0;
9571       tls_gd = 0;
9572       toc_symndx = 0;
9573       if (IS_PPC64_TLS_RELOC (r_type))
9574 	{
9575 	  if (h != NULL)
9576 	    tls_mask = h->tls_mask;
9577 	  else if (local_got_ents != NULL)
9578 	    {
9579 	      char *lgot_masks;
9580 	      lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
9581 	      tls_mask = lgot_masks[r_symndx];
9582 	    }
9583 	  if (tls_mask == 0 && r_type == R_PPC64_TLS)
9584 	    {
9585 	      /* Check for toc tls entries.  */
9586 	      char *toc_tls;
9587 
9588 	      if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
9589 				 rel, input_bfd))
9590 		return FALSE;
9591 
9592 	      if (toc_tls)
9593 		tls_mask = *toc_tls;
9594 	    }
9595 	}
9596 
9597       /* Check that tls relocs are used with tls syms, and non-tls
9598 	 relocs are used with non-tls syms.  */
9599       if (r_symndx != 0
9600 	  && r_type != R_PPC64_NONE
9601 	  && (h == NULL
9602 	      || h->elf.root.type == bfd_link_hash_defined
9603 	      || h->elf.root.type == bfd_link_hash_defweak)
9604 	  && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
9605 	{
9606 	  if (r_type == R_PPC64_TLS && tls_mask != 0)
9607 	    /* R_PPC64_TLS is OK against a symbol in the TOC.  */
9608 	    ;
9609 	  else
9610 	    (*_bfd_error_handler)
9611 	      (sym_type == STT_TLS
9612 	       ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
9613 	       : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
9614 	       input_bfd,
9615 	       input_section,
9616 	       (long) rel->r_offset,
9617 	       ppc64_elf_howto_table[r_type]->name,
9618 	       sym_name);
9619 	}
9620 
9621       /* Ensure reloc mapping code below stays sane.  */
9622       if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
9623 	  || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
9624 	  || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TLSGD16 & 3)
9625 	  || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
9626 	  || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
9627 	  || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
9628 	  || (R_PPC64_GOT_TLSLD16 & 3)    != (R_PPC64_GOT_TPREL16_DS & 3)
9629 	  || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
9630 	  || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
9631 	  || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
9632 	abort ();
9633 
9634       switch (r_type)
9635 	{
9636 	default:
9637 	  break;
9638 
9639 	case R_PPC64_TOC16:
9640 	case R_PPC64_TOC16_LO:
9641 	case R_PPC64_TOC16_DS:
9642 	case R_PPC64_TOC16_LO_DS:
9643 	  {
9644 	    /* Check for toc tls entries.  */
9645 	    char *toc_tls;
9646 	    int retval;
9647 
9648 	    retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
9649 				   rel, input_bfd);
9650 	    if (retval == 0)
9651 	      return FALSE;
9652 
9653 	    if (toc_tls)
9654 	      {
9655 		tls_mask = *toc_tls;
9656 		if (r_type == R_PPC64_TOC16_DS
9657 		    || r_type == R_PPC64_TOC16_LO_DS)
9658 		  {
9659 		    if (tls_mask != 0
9660 			&& (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
9661 		      goto toctprel;
9662 		  }
9663 		else
9664 		  {
9665 		    /* If we found a GD reloc pair, then we might be
9666 		       doing a GD->IE transition.  */
9667 		    if (retval == 2)
9668 		      {
9669 			tls_gd = TLS_TPRELGD;
9670 			if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9671 			  goto tls_get_addr_check;
9672 		      }
9673 		    else if (retval == 3)
9674 		      {
9675 			if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
9676 			  goto tls_get_addr_check;
9677 		      }
9678 		  }
9679 	      }
9680 	  }
9681 	  break;
9682 
9683 	case R_PPC64_GOT_TPREL16_DS:
9684 	case R_PPC64_GOT_TPREL16_LO_DS:
9685 	  if (tls_mask != 0
9686 	      && (tls_mask & TLS_TPREL) == 0)
9687 	    {
9688 	    toctprel:
9689 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
9690 	      insn &= 31 << 21;
9691 	      insn |= 0x3c0d0000;	/* addis 0,13,0 */
9692 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
9693 	      r_type = R_PPC64_TPREL16_HA;
9694 	      if (toc_symndx != 0)
9695 		{
9696 		  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
9697 		  /* We changed the symbol.  Start over in order to
9698 		     get h, sym, sec etc. right.  */
9699 		  rel--;
9700 		  continue;
9701 		}
9702 	      else
9703 		rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9704 	    }
9705 	  break;
9706 
9707 	case R_PPC64_TLS:
9708 	  if (tls_mask != 0
9709 	      && (tls_mask & TLS_TPREL) == 0)
9710 	    {
9711 	      bfd_vma rtra;
9712 	      insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
9713 	      if ((insn & ((0x3f << 26) | (31 << 11)))
9714 		  == ((31 << 26) | (13 << 11)))
9715 		rtra = insn & ((1 << 26) - (1 << 16));
9716 	      else if ((insn & ((0x3f << 26) | (31 << 16)))
9717 		       == ((31 << 26) | (13 << 16)))
9718 		rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
9719 	      else
9720 		abort ();
9721 	      if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
9722 		/* add -> addi.  */
9723 		insn = 14 << 26;
9724 	      else if ((insn & (31 << 1)) == 23 << 1
9725 		       && ((insn & (31 << 6)) < 14 << 6
9726 			   || ((insn & (31 << 6)) >= 16 << 6
9727 			       && (insn & (31 << 6)) < 24 << 6)))
9728 		/* load and store indexed -> dform.  */
9729 		insn = (32 | ((insn >> 6) & 31)) << 26;
9730 	      else if ((insn & (31 << 1)) == 21 << 1
9731 		       && (insn & (0x1a << 6)) == 0)
9732 		/* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu.  */
9733 		insn = (((58 | ((insn >> 6) & 4)) << 26)
9734 			| ((insn >> 6) & 1));
9735 	      else if ((insn & (31 << 1)) == 21 << 1
9736 		       && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
9737 		/* lwax -> lwa.  */
9738 		insn = (58 << 26) | 2;
9739 	      else
9740 		abort ();
9741 	      insn |= rtra;
9742 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
9743 	      /* Was PPC64_TLS which sits on insn boundary, now
9744 		 PPC64_TPREL16_LO which is at insn+2.  */
9745 	      rel->r_offset += 2;
9746 	      r_type = R_PPC64_TPREL16_LO;
9747 	      if (toc_symndx != 0)
9748 		{
9749 		  rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
9750 		  /* We changed the symbol.  Start over in order to
9751 		     get h, sym, sec etc. right.  */
9752 		  rel--;
9753 		  continue;
9754 		}
9755 	      else
9756 		rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9757 	    }
9758 	  break;
9759 
9760 	case R_PPC64_GOT_TLSGD16_HI:
9761 	case R_PPC64_GOT_TLSGD16_HA:
9762 	  tls_gd = TLS_TPRELGD;
9763 	  if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9764 	    goto tls_gdld_hi;
9765 	  break;
9766 
9767 	case R_PPC64_GOT_TLSLD16_HI:
9768 	case R_PPC64_GOT_TLSLD16_HA:
9769 	  if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
9770 	    {
9771 	    tls_gdld_hi:
9772 	      if ((tls_mask & tls_gd) != 0)
9773 		r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
9774 			  + R_PPC64_GOT_TPREL16_DS);
9775 	      else
9776 		{
9777 		  bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9778 		  rel->r_offset -= 2;
9779 		  r_type = R_PPC64_NONE;
9780 		}
9781 	      rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9782 	    }
9783 	  break;
9784 
9785 	case R_PPC64_GOT_TLSGD16:
9786 	case R_PPC64_GOT_TLSGD16_LO:
9787 	  tls_gd = TLS_TPRELGD;
9788 	  if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9789 	    goto tls_get_addr_check;
9790 	  break;
9791 
9792 	case R_PPC64_GOT_TLSLD16:
9793 	case R_PPC64_GOT_TLSLD16_LO:
9794 	  if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
9795 	    {
9796 	    tls_get_addr_check:
9797 	      if (rel + 1 < relend)
9798 		{
9799 		  enum elf_ppc64_reloc_type r_type2;
9800 		  unsigned long r_symndx2;
9801 		  struct elf_link_hash_entry *h2;
9802 		  bfd_vma insn1, insn2, insn3;
9803 		  bfd_vma offset;
9804 
9805 		  /* The next instruction should be a call to
9806 		     __tls_get_addr.  Peek at the reloc to be sure.  */
9807 		  r_type2 = ELF64_R_TYPE (rel[1].r_info);
9808 		  r_symndx2 = ELF64_R_SYM (rel[1].r_info);
9809 		  if (r_symndx2 < symtab_hdr->sh_info
9810 		      || (r_type2 != R_PPC64_REL14
9811 			  && r_type2 != R_PPC64_REL14_BRTAKEN
9812 			  && r_type2 != R_PPC64_REL14_BRNTAKEN
9813 			  && r_type2 != R_PPC64_REL24))
9814 		    break;
9815 
9816 		  h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
9817 		  while (h2->root.type == bfd_link_hash_indirect
9818 			 || h2->root.type == bfd_link_hash_warning)
9819 		    h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
9820 		  if (h2 == NULL || (h2 != &htab->tls_get_addr->elf
9821 				     && h2 != &htab->tls_get_addr_fd->elf))
9822 		    break;
9823 
9824 		  /* OK, it checks out.  Replace the call.  */
9825 		  offset = rel[1].r_offset;
9826 		  insn1 = bfd_get_32 (output_bfd,
9827 				      contents + rel->r_offset - 2);
9828 		  insn3 = bfd_get_32 (output_bfd,
9829 				      contents + offset + 4);
9830 		  if ((tls_mask & tls_gd) != 0)
9831 		    {
9832 		      /* IE */
9833 		      insn1 &= (1 << 26) - (1 << 2);
9834 		      insn1 |= 58 << 26;	/* ld */
9835 		      insn2 = 0x7c636a14;	/* add 3,3,13 */
9836 		      rel[1].r_info = ELF64_R_INFO (r_symndx2, R_PPC64_NONE);
9837 		      if ((tls_mask & TLS_EXPLICIT) == 0)
9838 			r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
9839 				  + R_PPC64_GOT_TPREL16_DS);
9840 		      else
9841 			r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
9842 		      rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9843 		    }
9844 		  else
9845 		    {
9846 		      /* LE */
9847 		      insn1 = 0x3c6d0000;	/* addis 3,13,0 */
9848 		      insn2 = 0x38630000;	/* addi 3,3,0 */
9849 		      if (tls_gd == 0)
9850 			{
9851 			  /* Was an LD reloc.  */
9852 			  r_symndx = 0;
9853 			  rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
9854 			  rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
9855 			}
9856 		      else if (toc_symndx != 0)
9857 			r_symndx = toc_symndx;
9858 		      r_type = R_PPC64_TPREL16_HA;
9859 		      rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9860 		      rel[1].r_info = ELF64_R_INFO (r_symndx,
9861 						    R_PPC64_TPREL16_LO);
9862 		      rel[1].r_offset += 2;
9863 		    }
9864 		  if (insn3 == NOP
9865 		      || insn3 == CROR_151515 || insn3 == CROR_313131)
9866 		    {
9867 		      insn3 = insn2;
9868 		      insn2 = NOP;
9869 		      rel[1].r_offset += 4;
9870 		    }
9871 		  bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
9872 		  bfd_put_32 (output_bfd, insn2, contents + offset);
9873 		  bfd_put_32 (output_bfd, insn3, contents + offset + 4);
9874 		  if (tls_gd == 0 || toc_symndx != 0)
9875 		    {
9876 		      /* We changed the symbol.  Start over in order
9877 			 to get h, sym, sec etc. right.  */
9878 		      rel--;
9879 		      continue;
9880 		    }
9881 		}
9882 	    }
9883 	  break;
9884 
9885 	case R_PPC64_DTPMOD64:
9886 	  if (rel + 1 < relend
9887 	      && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
9888 	      && rel[1].r_offset == rel->r_offset + 8)
9889 	    {
9890 	      if ((tls_mask & TLS_GD) == 0)
9891 		{
9892 		  rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
9893 		  if ((tls_mask & TLS_TPRELGD) != 0)
9894 		    r_type = R_PPC64_TPREL64;
9895 		  else
9896 		    {
9897 		      bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
9898 		      r_type = R_PPC64_NONE;
9899 		    }
9900 		  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9901 		}
9902 	    }
9903 	  else
9904 	    {
9905 	      if ((tls_mask & TLS_LD) == 0)
9906 		{
9907 		  bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
9908 		  r_type = R_PPC64_NONE;
9909 		  rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9910 		}
9911 	    }
9912 	  break;
9913 
9914 	case R_PPC64_TPREL64:
9915 	  if ((tls_mask & TLS_TPREL) == 0)
9916 	    {
9917 	      r_type = R_PPC64_NONE;
9918 	      rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9919 	    }
9920 	  break;
9921 	}
9922 
9923       /* Handle other relocations that tweak non-addend part of insn.  */
9924       insn = 0;
9925       max_br_offset = 1 << 25;
9926       addend = rel->r_addend;
9927       switch (r_type)
9928 	{
9929 	default:
9930 	  break;
9931 
9932 	  /* Branch taken prediction relocations.  */
9933 	case R_PPC64_ADDR14_BRTAKEN:
9934 	case R_PPC64_REL14_BRTAKEN:
9935 	  insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field.  */
9936 	  /* Fall thru.  */
9937 
9938 	  /* Branch not taken prediction relocations.  */
9939 	case R_PPC64_ADDR14_BRNTAKEN:
9940 	case R_PPC64_REL14_BRNTAKEN:
9941 	  insn |= bfd_get_32 (output_bfd,
9942 			      contents + rel->r_offset) & ~(0x01 << 21);
9943 	  /* Fall thru.  */
9944 
9945 	case R_PPC64_REL14:
9946 	  max_br_offset = 1 << 15;
9947 	  /* Fall thru.  */
9948 
9949 	case R_PPC64_REL24:
9950 	  /* Calls to functions with a different TOC, such as calls to
9951 	     shared objects, need to alter the TOC pointer.  This is
9952 	     done using a linkage stub.  A REL24 branching to these
9953 	     linkage stubs needs to be followed by a nop, as the nop
9954 	     will be replaced with an instruction to restore the TOC
9955 	     base pointer.  */
9956 	  stub_entry = NULL;
9957 	  fdh = h;
9958 	  if (((h != NULL
9959 		&& (((fdh = h->oh) != NULL
9960 		     && fdh->elf.plt.plist != NULL)
9961 		    || (fdh = h)->elf.plt.plist != NULL))
9962 	       || (sec != NULL
9963 		   && sec->output_section != NULL
9964 		   && sec->id <= htab->top_id
9965 		   && (htab->stub_group[sec->id].toc_off
9966 		       != htab->stub_group[input_section->id].toc_off)))
9967 	      && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
9968 						   rel, htab)) != NULL
9969 	      && (stub_entry->stub_type == ppc_stub_plt_call
9970 		  || stub_entry->stub_type == ppc_stub_plt_branch_r2off
9971 		  || stub_entry->stub_type == ppc_stub_long_branch_r2off))
9972 	    {
9973 	      bfd_boolean can_plt_call = FALSE;
9974 
9975 	      if (rel->r_offset + 8 <= input_section->size)
9976 		{
9977 		  unsigned long nop;
9978 		  nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
9979 		  if (nop == NOP
9980 		      || nop == CROR_151515 || nop == CROR_313131)
9981 		    {
9982 		      bfd_put_32 (input_bfd, LD_R2_40R1,
9983 				  contents + rel->r_offset + 4);
9984 		      can_plt_call = TRUE;
9985 		    }
9986 		}
9987 
9988 	      if (!can_plt_call)
9989 		{
9990 		  if (stub_entry->stub_type == ppc_stub_plt_call)
9991 		    {
9992 		      /* If this is a plain branch rather than a branch
9993 			 and link, don't require a nop.  */
9994 		      unsigned long br;
9995 		      br = bfd_get_32 (input_bfd, contents + rel->r_offset);
9996 		      if ((br & 1) == 0)
9997 			can_plt_call = TRUE;
9998 		    }
9999 		  else if (h != NULL
10000 			   && strcmp (h->elf.root.root.string,
10001 				      ".__libc_start_main") == 0)
10002 		    {
10003 		      /* Allow crt1 branch to go via a toc adjusting stub.  */
10004 		      can_plt_call = TRUE;
10005 		    }
10006 		  else
10007 		    {
10008 		      if (strcmp (input_section->output_section->name,
10009 				  ".init") == 0
10010 			  || strcmp (input_section->output_section->name,
10011 				     ".fini") == 0)
10012 			(*_bfd_error_handler)
10013 			  (_("%B(%A+0x%lx): automatic multiple TOCs "
10014 			     "not supported using your crt files; "
10015 			     "recompile with -mminimal-toc or upgrade gcc"),
10016 			   input_bfd,
10017 			   input_section,
10018 			   (long) rel->r_offset);
10019 		      else
10020 			(*_bfd_error_handler)
10021 			  (_("%B(%A+0x%lx): sibling call optimization to `%s' "
10022 			     "does not allow automatic multiple TOCs; "
10023 			     "recompile with -mminimal-toc or "
10024 			     "-fno-optimize-sibling-calls, "
10025 			     "or make `%s' extern"),
10026 			   input_bfd,
10027 			   input_section,
10028 			   (long) rel->r_offset,
10029 			   sym_name,
10030 			   sym_name);
10031 		      bfd_set_error (bfd_error_bad_value);
10032 		      ret = FALSE;
10033 		    }
10034 		}
10035 
10036 	      if (can_plt_call
10037 		  && stub_entry->stub_type == ppc_stub_plt_call)
10038 		unresolved_reloc = FALSE;
10039 	    }
10040 
10041 	  if (stub_entry == NULL
10042 	      && get_opd_info (sec) != NULL)
10043 	    {
10044 	      /* The branch destination is the value of the opd entry. */
10045 	      bfd_vma off = (relocation - sec->output_section->vma
10046 			     - sec->output_offset + rel->r_addend);
10047 	      bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
10048 	      if (dest != (bfd_vma) -1)
10049 		{
10050 		  relocation = dest;
10051 		  addend = 0;
10052 		}
10053 	    }
10054 
10055 	  /* If the branch is out of reach we ought to have a long
10056 	     branch stub.  */
10057 	  from = (rel->r_offset
10058 		  + input_section->output_offset
10059 		  + input_section->output_section->vma);
10060 
10061 	  if (stub_entry == NULL
10062 	      && (relocation + rel->r_addend - from + max_br_offset
10063 		  >= 2 * max_br_offset)
10064 	      && r_type != R_PPC64_ADDR14_BRTAKEN
10065 	      && r_type != R_PPC64_ADDR14_BRNTAKEN)
10066 	    stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
10067 					     htab);
10068 
10069 	  if (stub_entry != NULL)
10070 	    {
10071 	      /* Munge up the value and addend so that we call the stub
10072 		 rather than the procedure directly.  */
10073 	      relocation = (stub_entry->stub_offset
10074 			    + stub_entry->stub_sec->output_offset
10075 			    + stub_entry->stub_sec->output_section->vma);
10076 	      addend = 0;
10077 	    }
10078 
10079 	  if (insn != 0)
10080 	    {
10081 	      if (is_power4)
10082 		{
10083 		  /* Set 'a' bit.  This is 0b00010 in BO field for branch
10084 		     on CR(BI) insns (BO == 001at or 011at), and 0b01000
10085 		     for branch on CTR insns (BO == 1a00t or 1a01t).  */
10086 		  if ((insn & (0x14 << 21)) == (0x04 << 21))
10087 		    insn |= 0x02 << 21;
10088 		  else if ((insn & (0x14 << 21)) == (0x10 << 21))
10089 		    insn |= 0x08 << 21;
10090 		  else
10091 		    break;
10092 		}
10093 	      else
10094 		{
10095 		  /* Invert 'y' bit if not the default.  */
10096 		  if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
10097 		    insn ^= 0x01 << 21;
10098 		}
10099 
10100 	      bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
10101 	    }
10102 
10103 	  /* NOP out calls to undefined weak functions.
10104 	     We can thus call a weak function without first
10105 	     checking whether the function is defined.  */
10106 	  else if (h != NULL
10107 		   && h->elf.root.type == bfd_link_hash_undefweak
10108 		   && r_type == R_PPC64_REL24
10109 		   && relocation == 0
10110 		   && rel->r_addend == 0)
10111 	    {
10112 	      bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
10113 	      continue;
10114 	    }
10115 	  break;
10116 	}
10117 
10118       /* Set `addend'.  */
10119       tls_type = 0;
10120       switch (r_type)
10121 	{
10122 	default:
10123 	  (*_bfd_error_handler)
10124 	    (_("%B: unknown relocation type %d for symbol %s"),
10125 	     input_bfd, (int) r_type, sym_name);
10126 
10127 	  bfd_set_error (bfd_error_bad_value);
10128 	  ret = FALSE;
10129 	  continue;
10130 
10131 	case R_PPC64_NONE:
10132 	case R_PPC64_TLS:
10133 	case R_PPC64_GNU_VTINHERIT:
10134 	case R_PPC64_GNU_VTENTRY:
10135 	  continue;
10136 
10137 	  /* GOT16 relocations.  Like an ADDR16 using the symbol's
10138 	     address in the GOT as relocation value instead of the
10139 	     symbol's value itself.  Also, create a GOT entry for the
10140 	     symbol and put the symbol value there.  */
10141 	case R_PPC64_GOT_TLSGD16:
10142 	case R_PPC64_GOT_TLSGD16_LO:
10143 	case R_PPC64_GOT_TLSGD16_HI:
10144 	case R_PPC64_GOT_TLSGD16_HA:
10145 	  tls_type = TLS_TLS | TLS_GD;
10146 	  goto dogot;
10147 
10148 	case R_PPC64_GOT_TLSLD16:
10149 	case R_PPC64_GOT_TLSLD16_LO:
10150 	case R_PPC64_GOT_TLSLD16_HI:
10151 	case R_PPC64_GOT_TLSLD16_HA:
10152 	  tls_type = TLS_TLS | TLS_LD;
10153 	  goto dogot;
10154 
10155 	case R_PPC64_GOT_TPREL16_DS:
10156 	case R_PPC64_GOT_TPREL16_LO_DS:
10157 	case R_PPC64_GOT_TPREL16_HI:
10158 	case R_PPC64_GOT_TPREL16_HA:
10159 	  tls_type = TLS_TLS | TLS_TPREL;
10160 	  goto dogot;
10161 
10162 	case R_PPC64_GOT_DTPREL16_DS:
10163 	case R_PPC64_GOT_DTPREL16_LO_DS:
10164 	case R_PPC64_GOT_DTPREL16_HI:
10165 	case R_PPC64_GOT_DTPREL16_HA:
10166 	  tls_type = TLS_TLS | TLS_DTPREL;
10167 	  goto dogot;
10168 
10169 	case R_PPC64_GOT16:
10170 	case R_PPC64_GOT16_LO:
10171 	case R_PPC64_GOT16_HI:
10172 	case R_PPC64_GOT16_HA:
10173 	case R_PPC64_GOT16_DS:
10174 	case R_PPC64_GOT16_LO_DS:
10175 	dogot:
10176 	  {
10177 	    /* Relocation is to the entry for this symbol in the global
10178 	       offset table.  */
10179 	    asection *got;
10180 	    bfd_vma *offp;
10181 	    bfd_vma off;
10182 	    unsigned long indx = 0;
10183 
10184 	    if (tls_type == (TLS_TLS | TLS_LD)
10185 		&& (h == NULL
10186 		    || !h->elf.def_dynamic))
10187 	      offp = &ppc64_tlsld_got (input_bfd)->offset;
10188 	    else
10189 	      {
10190 		struct got_entry *ent;
10191 
10192 		if (h != NULL)
10193 		  {
10194 		    bfd_boolean dyn = htab->elf.dynamic_sections_created;
10195 		    if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
10196 							  &h->elf)
10197 			|| (info->shared
10198 			    && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
10199 		      /* This is actually a static link, or it is a
10200 			 -Bsymbolic link and the symbol is defined
10201 			 locally, or the symbol was forced to be local
10202 			 because of a version file.  */
10203 		      ;
10204 		    else
10205 		      {
10206 			indx = h->elf.dynindx;
10207 			unresolved_reloc = FALSE;
10208 		      }
10209 		    ent = h->elf.got.glist;
10210 		  }
10211 		else
10212 		  {
10213 		    if (local_got_ents == NULL)
10214 		      abort ();
10215 		    ent = local_got_ents[r_symndx];
10216 		  }
10217 
10218 		for (; ent != NULL; ent = ent->next)
10219 		  if (ent->addend == rel->r_addend
10220 		      && ent->owner == input_bfd
10221 		      && ent->tls_type == tls_type)
10222 		    break;
10223 		if (ent == NULL)
10224 		  abort ();
10225 		offp = &ent->got.offset;
10226 	      }
10227 
10228 	    got = ppc64_elf_tdata (input_bfd)->got;
10229 	    if (got == NULL)
10230 	      abort ();
10231 
10232 	    /* The offset must always be a multiple of 8.  We use the
10233 	       least significant bit to record whether we have already
10234 	       processed this entry.  */
10235 	    off = *offp;
10236 	    if ((off & 1) != 0)
10237 	      off &= ~1;
10238 	    else
10239 	      {
10240 		/* Generate relocs for the dynamic linker, except in
10241 		   the case of TLSLD where we'll use one entry per
10242 		   module.  */
10243 		asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
10244 
10245 		*offp = off | 1;
10246 		if ((info->shared || indx != 0)
10247 		    && (h == NULL
10248 			|| ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10249 			|| h->elf.root.type != bfd_link_hash_undefweak))
10250 		  {
10251 		    outrel.r_offset = (got->output_section->vma
10252 				       + got->output_offset
10253 				       + off);
10254 		    outrel.r_addend = rel->r_addend;
10255 		    if (tls_type & (TLS_LD | TLS_GD))
10256 		      {
10257 			outrel.r_addend = 0;
10258 			outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
10259 			if (tls_type == (TLS_TLS | TLS_GD))
10260 			  {
10261 			    loc = relgot->contents;
10262 			    loc += (relgot->reloc_count++
10263 				    * sizeof (Elf64_External_Rela));
10264 			    bfd_elf64_swap_reloca_out (output_bfd,
10265 						       &outrel, loc);
10266 			    outrel.r_offset += 8;
10267 			    outrel.r_addend = rel->r_addend;
10268 			    outrel.r_info
10269 			      = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
10270 			  }
10271 		      }
10272 		    else if (tls_type == (TLS_TLS | TLS_DTPREL))
10273 		      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
10274 		    else if (tls_type == (TLS_TLS | TLS_TPREL))
10275 		      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
10276 		    else if (indx == 0)
10277 		      {
10278 			outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
10279 
10280 			/* Write the .got section contents for the sake
10281 			   of prelink.  */
10282 			loc = got->contents + off;
10283 			bfd_put_64 (output_bfd, outrel.r_addend + relocation,
10284 				    loc);
10285 		      }
10286 		    else
10287 		      outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
10288 
10289 		    if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
10290 		      {
10291 			outrel.r_addend += relocation;
10292 			if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
10293 			  outrel.r_addend -= htab->elf.tls_sec->vma;
10294 		      }
10295 		    loc = relgot->contents;
10296 		    loc += (relgot->reloc_count++
10297 			    * sizeof (Elf64_External_Rela));
10298 		    bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
10299 		  }
10300 
10301 		/* Init the .got section contents here if we're not
10302 		   emitting a reloc.  */
10303 		else
10304 		  {
10305 		    relocation += rel->r_addend;
10306 		    if (tls_type == (TLS_TLS | TLS_LD))
10307 		      relocation = 1;
10308 		    else if (tls_type != 0)
10309 		      {
10310 			relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
10311 			if (tls_type == (TLS_TLS | TLS_TPREL))
10312 			  relocation += DTP_OFFSET - TP_OFFSET;
10313 
10314 			if (tls_type == (TLS_TLS | TLS_GD))
10315 			  {
10316 			    bfd_put_64 (output_bfd, relocation,
10317 					got->contents + off + 8);
10318 			    relocation = 1;
10319 			  }
10320 		      }
10321 
10322 		    bfd_put_64 (output_bfd, relocation,
10323 				got->contents + off);
10324 		  }
10325 	      }
10326 
10327 	    if (off >= (bfd_vma) -2)
10328 	      abort ();
10329 
10330 	    relocation = got->output_offset + off;
10331 
10332 	    /* TOC base (r2) is TOC start plus 0x8000.  */
10333 	    addend = -TOC_BASE_OFF;
10334 	  }
10335 	  break;
10336 
10337 	case R_PPC64_PLT16_HA:
10338 	case R_PPC64_PLT16_HI:
10339 	case R_PPC64_PLT16_LO:
10340 	case R_PPC64_PLT32:
10341 	case R_PPC64_PLT64:
10342 	  /* Relocation is to the entry for this symbol in the
10343 	     procedure linkage table.  */
10344 
10345 	  /* Resolve a PLT reloc against a local symbol directly,
10346 	     without using the procedure linkage table.  */
10347 	  if (h == NULL)
10348 	    break;
10349 
10350 	  /* It's possible that we didn't make a PLT entry for this
10351 	     symbol.  This happens when statically linking PIC code,
10352 	     or when using -Bsymbolic.  Go find a match if there is a
10353 	     PLT entry.  */
10354 	  if (htab->plt != NULL)
10355 	    {
10356 	      struct plt_entry *ent;
10357 	      for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
10358 		if (ent->addend == rel->r_addend
10359 		    && ent->plt.offset != (bfd_vma) -1)
10360 		  {
10361 		    relocation = (htab->plt->output_section->vma
10362 				  + htab->plt->output_offset
10363 				  + ent->plt.offset);
10364 		    unresolved_reloc = FALSE;
10365 		  }
10366 	    }
10367 	  break;
10368 
10369 	case R_PPC64_TOC:
10370 	  /* Relocation value is TOC base.  */
10371 	  relocation = TOCstart;
10372 	  if (r_symndx == 0)
10373 	    relocation += htab->stub_group[input_section->id].toc_off;
10374 	  else if (unresolved_reloc)
10375 	    ;
10376 	  else if (sec != NULL && sec->id <= htab->top_id)
10377 	    relocation += htab->stub_group[sec->id].toc_off;
10378 	  else
10379 	    unresolved_reloc = TRUE;
10380 	  goto dodyn2;
10381 
10382 	  /* TOC16 relocs.  We want the offset relative to the TOC base,
10383 	     which is the address of the start of the TOC plus 0x8000.
10384 	     The TOC consists of sections .got, .toc, .tocbss, and .plt,
10385 	     in this order.  */
10386 	case R_PPC64_TOC16:
10387 	case R_PPC64_TOC16_LO:
10388 	case R_PPC64_TOC16_HI:
10389 	case R_PPC64_TOC16_DS:
10390 	case R_PPC64_TOC16_LO_DS:
10391 	case R_PPC64_TOC16_HA:
10392 	  addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
10393 	  break;
10394 
10395 	  /* Relocate against the beginning of the section.  */
10396 	case R_PPC64_SECTOFF:
10397 	case R_PPC64_SECTOFF_LO:
10398 	case R_PPC64_SECTOFF_HI:
10399 	case R_PPC64_SECTOFF_DS:
10400 	case R_PPC64_SECTOFF_LO_DS:
10401 	case R_PPC64_SECTOFF_HA:
10402 	  if (sec != NULL)
10403 	    addend -= sec->output_section->vma;
10404 	  break;
10405 
10406 	case R_PPC64_REL14:
10407 	case R_PPC64_REL14_BRNTAKEN:
10408 	case R_PPC64_REL14_BRTAKEN:
10409 	case R_PPC64_REL24:
10410 	  break;
10411 
10412 	case R_PPC64_TPREL16:
10413 	case R_PPC64_TPREL16_LO:
10414 	case R_PPC64_TPREL16_HI:
10415 	case R_PPC64_TPREL16_HA:
10416 	case R_PPC64_TPREL16_DS:
10417 	case R_PPC64_TPREL16_LO_DS:
10418 	case R_PPC64_TPREL16_HIGHER:
10419 	case R_PPC64_TPREL16_HIGHERA:
10420 	case R_PPC64_TPREL16_HIGHEST:
10421 	case R_PPC64_TPREL16_HIGHESTA:
10422 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
10423 	  if (info->shared)
10424 	    /* The TPREL16 relocs shouldn't really be used in shared
10425 	       libs as they will result in DT_TEXTREL being set, but
10426 	       support them anyway.  */
10427 	    goto dodyn;
10428 	  break;
10429 
10430 	case R_PPC64_DTPREL16:
10431 	case R_PPC64_DTPREL16_LO:
10432 	case R_PPC64_DTPREL16_HI:
10433 	case R_PPC64_DTPREL16_HA:
10434 	case R_PPC64_DTPREL16_DS:
10435 	case R_PPC64_DTPREL16_LO_DS:
10436 	case R_PPC64_DTPREL16_HIGHER:
10437 	case R_PPC64_DTPREL16_HIGHERA:
10438 	case R_PPC64_DTPREL16_HIGHEST:
10439 	case R_PPC64_DTPREL16_HIGHESTA:
10440 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
10441 	  break;
10442 
10443 	case R_PPC64_DTPMOD64:
10444 	  relocation = 1;
10445 	  addend = 0;
10446 	  goto dodyn;
10447 
10448 	case R_PPC64_TPREL64:
10449 	  addend -= htab->elf.tls_sec->vma + TP_OFFSET;
10450 	  goto dodyn;
10451 
10452 	case R_PPC64_DTPREL64:
10453 	  addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
10454 	  /* Fall thru */
10455 
10456 	  /* Relocations that may need to be propagated if this is a
10457 	     dynamic object.  */
10458 	case R_PPC64_REL30:
10459 	case R_PPC64_REL32:
10460 	case R_PPC64_REL64:
10461 	case R_PPC64_ADDR14:
10462 	case R_PPC64_ADDR14_BRNTAKEN:
10463 	case R_PPC64_ADDR14_BRTAKEN:
10464 	case R_PPC64_ADDR16:
10465 	case R_PPC64_ADDR16_DS:
10466 	case R_PPC64_ADDR16_HA:
10467 	case R_PPC64_ADDR16_HI:
10468 	case R_PPC64_ADDR16_HIGHER:
10469 	case R_PPC64_ADDR16_HIGHERA:
10470 	case R_PPC64_ADDR16_HIGHEST:
10471 	case R_PPC64_ADDR16_HIGHESTA:
10472 	case R_PPC64_ADDR16_LO:
10473 	case R_PPC64_ADDR16_LO_DS:
10474 	case R_PPC64_ADDR24:
10475 	case R_PPC64_ADDR32:
10476 	case R_PPC64_ADDR64:
10477 	case R_PPC64_UADDR16:
10478 	case R_PPC64_UADDR32:
10479 	case R_PPC64_UADDR64:
10480 	  /* r_symndx will be zero only for relocs against symbols
10481 	     from removed linkonce sections, or sections discarded by
10482 	     a linker script.  */
10483 	dodyn:
10484 	  if (r_symndx == 0)
10485 	    break;
10486 	  /* Fall thru.  */
10487 
10488 	dodyn2:
10489 	  if ((input_section->flags & SEC_ALLOC) == 0)
10490 	    break;
10491 
10492 	  if (NO_OPD_RELOCS && is_opd)
10493 	    break;
10494 
10495 	  if ((info->shared
10496 	       && (h == NULL
10497 		   || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10498 		   || h->elf.root.type != bfd_link_hash_undefweak)
10499 	       && (MUST_BE_DYN_RELOC (r_type)
10500 		   || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
10501 	      || (ELIMINATE_COPY_RELOCS
10502 		  && !info->shared
10503 		  && h != NULL
10504 		  && h->elf.dynindx != -1
10505 		  && !h->elf.non_got_ref
10506 		  && h->elf.def_dynamic
10507 		  && !h->elf.def_regular))
10508 	    {
10509 	      Elf_Internal_Rela outrel;
10510 	      bfd_boolean skip, relocate;
10511 	      asection *sreloc;
10512 	      bfd_byte *loc;
10513 	      bfd_vma out_off;
10514 
10515 	      /* When generating a dynamic object, these relocations
10516 		 are copied into the output file to be resolved at run
10517 		 time.  */
10518 
10519 	      skip = FALSE;
10520 	      relocate = FALSE;
10521 
10522 	      out_off = _bfd_elf_section_offset (output_bfd, info,
10523 						 input_section, rel->r_offset);
10524 	      if (out_off == (bfd_vma) -1)
10525 		skip = TRUE;
10526 	      else if (out_off == (bfd_vma) -2)
10527 		skip = TRUE, relocate = TRUE;
10528 	      out_off += (input_section->output_section->vma
10529 			  + input_section->output_offset);
10530 	      outrel.r_offset = out_off;
10531 	      outrel.r_addend = rel->r_addend;
10532 
10533 	      /* Optimize unaligned reloc use.  */
10534 	      if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
10535 		  || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
10536 		r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
10537 	      else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
10538 		       || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
10539 		r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
10540 	      else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
10541 		       || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
10542 		r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
10543 
10544 	      if (skip)
10545 		memset (&outrel, 0, sizeof outrel);
10546 	      else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
10547 		       && !is_opd
10548 		       && r_type != R_PPC64_TOC)
10549 		outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
10550 	      else
10551 		{
10552 		  /* This symbol is local, or marked to become local,
10553 		     or this is an opd section reloc which must point
10554 		     at a local function.  */
10555 		  outrel.r_addend += relocation;
10556 		  if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
10557 		    {
10558 		      if (is_opd && h != NULL)
10559 			{
10560 			  /* Lie about opd entries.  This case occurs
10561 			     when building shared libraries and we
10562 			     reference a function in another shared
10563 			     lib.  The same thing happens for a weak
10564 			     definition in an application that's
10565 			     overridden by a strong definition in a
10566 			     shared lib.  (I believe this is a generic
10567 			     bug in binutils handling of weak syms.)
10568 			     In these cases we won't use the opd
10569 			     entry in this lib.  */
10570 			  unresolved_reloc = FALSE;
10571 			}
10572 		      outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10573 
10574 		      /* We need to relocate .opd contents for ld.so.
10575 			 Prelink also wants simple and consistent rules
10576 			 for relocs.  This make all RELATIVE relocs have
10577 			 *r_offset equal to r_addend.  */
10578 		      relocate = TRUE;
10579 		    }
10580 		  else
10581 		    {
10582 		      long indx = 0;
10583 
10584 		      if (bfd_is_abs_section (sec))
10585 			;
10586 		      else if (sec == NULL || sec->owner == NULL)
10587 			{
10588 			  bfd_set_error (bfd_error_bad_value);
10589 			  return FALSE;
10590 			}
10591 		      else
10592 			{
10593 			  asection *osec;
10594 
10595 			  osec = sec->output_section;
10596 			  indx = elf_section_data (osec)->dynindx;
10597 
10598 			  /* We are turning this relocation into one
10599 			     against a section symbol, so subtract out
10600 			     the output section's address but not the
10601 			     offset of the input section in the output
10602 			     section.  */
10603 			  outrel.r_addend -= osec->vma;
10604 			}
10605 
10606 		      outrel.r_info = ELF64_R_INFO (indx, r_type);
10607 		    }
10608 		}
10609 
10610 	      sreloc = elf_section_data (input_section)->sreloc;
10611 	      if (sreloc == NULL)
10612 		abort ();
10613 
10614 	      loc = sreloc->contents;
10615 	      loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
10616 	      bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
10617 
10618 	      /* If this reloc is against an external symbol, it will
10619 		 be computed at runtime, so there's no need to do
10620 		 anything now.  However, for the sake of prelink ensure
10621 		 that the section contents are a known value.  */
10622 	      if (! relocate)
10623 		{
10624 		  unresolved_reloc = FALSE;
10625 		  /* The value chosen here is quite arbitrary as ld.so
10626 		     ignores section contents except for the special
10627 		     case of .opd where the contents might be accessed
10628 		     before relocation.  Choose zero, as that won't
10629 		     cause reloc overflow.  */
10630 		  relocation = 0;
10631 		  addend = 0;
10632 		  /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
10633 		     to improve backward compatibility with older
10634 		     versions of ld.  */
10635 		  if (r_type == R_PPC64_ADDR64)
10636 		    addend = outrel.r_addend;
10637 		  /* Adjust pc_relative relocs to have zero in *r_offset.  */
10638 		  else if (ppc64_elf_howto_table[r_type]->pc_relative)
10639 		    addend = (input_section->output_section->vma
10640 			      + input_section->output_offset
10641 			      + rel->r_offset);
10642 		}
10643 	    }
10644 	  break;
10645 
10646 	case R_PPC64_COPY:
10647 	case R_PPC64_GLOB_DAT:
10648 	case R_PPC64_JMP_SLOT:
10649 	case R_PPC64_RELATIVE:
10650 	  /* We shouldn't ever see these dynamic relocs in relocatable
10651 	     files.  */
10652 	  /* Fall through.  */
10653 
10654 	case R_PPC64_PLTGOT16:
10655 	case R_PPC64_PLTGOT16_DS:
10656 	case R_PPC64_PLTGOT16_HA:
10657 	case R_PPC64_PLTGOT16_HI:
10658 	case R_PPC64_PLTGOT16_LO:
10659 	case R_PPC64_PLTGOT16_LO_DS:
10660 	case R_PPC64_PLTREL32:
10661 	case R_PPC64_PLTREL64:
10662 	  /* These ones haven't been implemented yet.  */
10663 
10664 	  (*_bfd_error_handler)
10665 	    (_("%B: relocation %s is not supported for symbol %s."),
10666 	     input_bfd,
10667 	     ppc64_elf_howto_table[r_type]->name, sym_name);
10668 
10669 	  bfd_set_error (bfd_error_invalid_operation);
10670 	  ret = FALSE;
10671 	  continue;
10672 	}
10673 
10674       /* Do any further special processing.  */
10675       switch (r_type)
10676 	{
10677 	default:
10678 	  break;
10679 
10680 	case R_PPC64_ADDR16_HA:
10681 	case R_PPC64_ADDR16_HIGHERA:
10682 	case R_PPC64_ADDR16_HIGHESTA:
10683 	case R_PPC64_GOT16_HA:
10684 	case R_PPC64_PLTGOT16_HA:
10685 	case R_PPC64_PLT16_HA:
10686 	case R_PPC64_TOC16_HA:
10687 	case R_PPC64_SECTOFF_HA:
10688 	case R_PPC64_TPREL16_HA:
10689 	case R_PPC64_DTPREL16_HA:
10690 	case R_PPC64_GOT_TLSGD16_HA:
10691 	case R_PPC64_GOT_TLSLD16_HA:
10692 	case R_PPC64_GOT_TPREL16_HA:
10693 	case R_PPC64_GOT_DTPREL16_HA:
10694 	case R_PPC64_TPREL16_HIGHER:
10695 	case R_PPC64_TPREL16_HIGHERA:
10696 	case R_PPC64_TPREL16_HIGHEST:
10697 	case R_PPC64_TPREL16_HIGHESTA:
10698 	case R_PPC64_DTPREL16_HIGHER:
10699 	case R_PPC64_DTPREL16_HIGHERA:
10700 	case R_PPC64_DTPREL16_HIGHEST:
10701 	case R_PPC64_DTPREL16_HIGHESTA:
10702 	  /* It's just possible that this symbol is a weak symbol
10703 	     that's not actually defined anywhere. In that case,
10704 	     'sec' would be NULL, and we should leave the symbol
10705 	     alone (it will be set to zero elsewhere in the link).  */
10706 	  if (sec != NULL)
10707 	    /* Add 0x10000 if sign bit in 0:15 is set.
10708 	       Bits 0:15 are not used.  */
10709 	    addend += 0x8000;
10710 	  break;
10711 
10712 	case R_PPC64_ADDR16_DS:
10713 	case R_PPC64_ADDR16_LO_DS:
10714 	case R_PPC64_GOT16_DS:
10715 	case R_PPC64_GOT16_LO_DS:
10716 	case R_PPC64_PLT16_LO_DS:
10717 	case R_PPC64_SECTOFF_DS:
10718 	case R_PPC64_SECTOFF_LO_DS:
10719 	case R_PPC64_TOC16_DS:
10720 	case R_PPC64_TOC16_LO_DS:
10721 	case R_PPC64_PLTGOT16_DS:
10722 	case R_PPC64_PLTGOT16_LO_DS:
10723 	case R_PPC64_GOT_TPREL16_DS:
10724 	case R_PPC64_GOT_TPREL16_LO_DS:
10725 	case R_PPC64_GOT_DTPREL16_DS:
10726 	case R_PPC64_GOT_DTPREL16_LO_DS:
10727 	case R_PPC64_TPREL16_DS:
10728 	case R_PPC64_TPREL16_LO_DS:
10729 	case R_PPC64_DTPREL16_DS:
10730 	case R_PPC64_DTPREL16_LO_DS:
10731 	  insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
10732 	  mask = 3;
10733 	  /* If this reloc is against an lq insn, then the value must be
10734 	     a multiple of 16.  This is somewhat of a hack, but the
10735 	     "correct" way to do this by defining _DQ forms of all the
10736 	     _DS relocs bloats all reloc switches in this file.  It
10737 	     doesn't seem to make much sense to use any of these relocs
10738 	     in data, so testing the insn should be safe.  */
10739 	  if ((insn & (0x3f << 26)) == (56u << 26))
10740 	    mask = 15;
10741 	  if (((relocation + addend) & mask) != 0)
10742 	    {
10743 	      (*_bfd_error_handler)
10744 		(_("%B: error: relocation %s not a multiple of %d"),
10745 		 input_bfd,
10746 		 ppc64_elf_howto_table[r_type]->name,
10747 		 mask + 1);
10748 	      bfd_set_error (bfd_error_bad_value);
10749 	      ret = FALSE;
10750 	      continue;
10751 	    }
10752 	  break;
10753 	}
10754 
10755       /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
10756 	 because such sections are not SEC_ALLOC and thus ld.so will
10757 	 not process them.  */
10758       if (unresolved_reloc
10759 	  && !((input_section->flags & SEC_DEBUGGING) != 0
10760 	       && h->elf.def_dynamic))
10761 	{
10762 	  (*_bfd_error_handler)
10763 	    (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
10764 	     input_bfd,
10765 	     input_section,
10766 	     (long) rel->r_offset,
10767 	     ppc64_elf_howto_table[(int) r_type]->name,
10768 	     h->elf.root.root.string);
10769 	  ret = FALSE;
10770 	}
10771 
10772       r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
10773 				    input_bfd,
10774 				    input_section,
10775 				    contents,
10776 				    rel->r_offset,
10777 				    relocation,
10778 				    addend);
10779 
10780       if (r != bfd_reloc_ok)
10781 	{
10782 	  if (sym_name == NULL)
10783 	    sym_name = "(null)";
10784 	  if (r == bfd_reloc_overflow)
10785 	    {
10786 	      if (warned)
10787 		continue;
10788 	      if (h != NULL
10789 		  && h->elf.root.type == bfd_link_hash_undefweak
10790 		  && ppc64_elf_howto_table[r_type]->pc_relative)
10791 		{
10792 		  /* Assume this is a call protected by other code that
10793 		     detects the symbol is undefined.  If this is the case,
10794 		     we can safely ignore the overflow.  If not, the
10795 		     program is hosed anyway, and a little warning isn't
10796 		     going to help.  */
10797 
10798 		  continue;
10799 		}
10800 
10801 	      if (!((*info->callbacks->reloc_overflow)
10802 		    (info, (h ? &h->elf.root : NULL), sym_name,
10803 		     ppc64_elf_howto_table[r_type]->name,
10804 		     rel->r_addend, input_bfd, input_section, rel->r_offset)))
10805 		return FALSE;
10806 	    }
10807 	  else
10808 	    {
10809 	      (*_bfd_error_handler)
10810 		(_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
10811 		 input_bfd,
10812 		 input_section,
10813 		 (long) rel->r_offset,
10814 		 ppc64_elf_howto_table[r_type]->name,
10815 		 sym_name,
10816 		 (int) r);
10817 	      ret = FALSE;
10818 	    }
10819 	}
10820     }
10821 
10822   /* If we're emitting relocations, then shortly after this function
10823      returns, reloc offsets and addends for this section will be
10824      adjusted.  Worse, reloc symbol indices will be for the output
10825      file rather than the input.  Save a copy of the relocs for
10826      opd_entry_value.  */
10827   if (is_opd && info->emitrelocations)
10828     {
10829       bfd_size_type amt;
10830       amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
10831       rel = bfd_alloc (input_bfd, amt);
10832       BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
10833       ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
10834       if (rel == NULL)
10835 	return FALSE;
10836       memcpy (rel, relocs, amt);
10837     }
10838   return ret;
10839 }
10840 
10841 /* Adjust the value of any local symbols in opd sections.  */
10842 
10843 static bfd_boolean
ppc64_elf_output_symbol_hook(struct bfd_link_info * info,const char * name ATTRIBUTE_UNUSED,Elf_Internal_Sym * elfsym,asection * input_sec,struct elf_link_hash_entry * h)10844 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
10845 			      const char *name ATTRIBUTE_UNUSED,
10846 			      Elf_Internal_Sym *elfsym,
10847 			      asection *input_sec,
10848 			      struct elf_link_hash_entry *h)
10849 {
10850   long *opd_adjust, adjust;
10851   bfd_vma value;
10852 
10853   if (h != NULL)
10854     return TRUE;
10855 
10856   opd_adjust = get_opd_info (input_sec);
10857   if (opd_adjust == NULL)
10858     return TRUE;
10859 
10860   value = elfsym->st_value - input_sec->output_offset;
10861   if (!info->relocatable)
10862     value -= input_sec->output_section->vma;
10863 
10864   adjust = opd_adjust[value / 8];
10865   if (adjust == -1)
10866     elfsym->st_value = 0;
10867   else
10868     elfsym->st_value += adjust;
10869   return TRUE;
10870 }
10871 
10872 /* Finish up dynamic symbol handling.  We set the contents of various
10873    dynamic sections here.  */
10874 
10875 static bfd_boolean
ppc64_elf_finish_dynamic_symbol(bfd * output_bfd,struct bfd_link_info * info,struct elf_link_hash_entry * h,Elf_Internal_Sym * sym)10876 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
10877 				 struct bfd_link_info *info,
10878 				 struct elf_link_hash_entry *h,
10879 				 Elf_Internal_Sym *sym)
10880 {
10881   struct ppc_link_hash_table *htab;
10882   bfd *dynobj;
10883   struct plt_entry *ent;
10884   Elf_Internal_Rela rela;
10885   bfd_byte *loc;
10886 
10887   htab = ppc_hash_table (info);
10888   dynobj = htab->elf.dynobj;
10889 
10890   for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10891     if (ent->plt.offset != (bfd_vma) -1)
10892       {
10893 	/* This symbol has an entry in the procedure linkage
10894 	   table.  Set it up.  */
10895 
10896 	if (htab->plt == NULL
10897 	    || htab->relplt == NULL
10898 	    || htab->glink == NULL)
10899 	  abort ();
10900 
10901 	/* Create a JMP_SLOT reloc to inform the dynamic linker to
10902 	   fill in the PLT entry.  */
10903 	rela.r_offset = (htab->plt->output_section->vma
10904 			 + htab->plt->output_offset
10905 			 + ent->plt.offset);
10906 	rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
10907 	rela.r_addend = ent->addend;
10908 
10909 	loc = htab->relplt->contents;
10910 	loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
10911 		* sizeof (Elf64_External_Rela));
10912 	bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
10913       }
10914 
10915   if (h->needs_copy)
10916     {
10917       Elf_Internal_Rela rela;
10918       bfd_byte *loc;
10919 
10920       /* This symbol needs a copy reloc.  Set it up.  */
10921 
10922       if (h->dynindx == -1
10923 	  || (h->root.type != bfd_link_hash_defined
10924 	      && h->root.type != bfd_link_hash_defweak)
10925 	  || htab->relbss == NULL)
10926 	abort ();
10927 
10928       rela.r_offset = (h->root.u.def.value
10929 		       + h->root.u.def.section->output_section->vma
10930 		       + h->root.u.def.section->output_offset);
10931       rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
10932       rela.r_addend = 0;
10933       loc = htab->relbss->contents;
10934       loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
10935       bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
10936     }
10937 
10938   /* Mark some specially defined symbols as absolute.  */
10939   if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
10940     sym->st_shndx = SHN_ABS;
10941 
10942   return TRUE;
10943 }
10944 
10945 /* Used to decide how to sort relocs in an optimal manner for the
10946    dynamic linker, before writing them out.  */
10947 
10948 static enum elf_reloc_type_class
ppc64_elf_reloc_type_class(const Elf_Internal_Rela * rela)10949 ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
10950 {
10951   enum elf_ppc64_reloc_type r_type;
10952 
10953   r_type = ELF64_R_TYPE (rela->r_info);
10954   switch (r_type)
10955     {
10956     case R_PPC64_RELATIVE:
10957       return reloc_class_relative;
10958     case R_PPC64_JMP_SLOT:
10959       return reloc_class_plt;
10960     case R_PPC64_COPY:
10961       return reloc_class_copy;
10962     default:
10963       return reloc_class_normal;
10964     }
10965 }
10966 
10967 /* Finish up the dynamic sections.  */
10968 
10969 static bfd_boolean
ppc64_elf_finish_dynamic_sections(bfd * output_bfd,struct bfd_link_info * info)10970 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
10971 				   struct bfd_link_info *info)
10972 {
10973   struct ppc_link_hash_table *htab;
10974   bfd *dynobj;
10975   asection *sdyn;
10976 
10977   htab = ppc_hash_table (info);
10978   dynobj = htab->elf.dynobj;
10979   sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10980 
10981   if (htab->elf.dynamic_sections_created)
10982     {
10983       Elf64_External_Dyn *dyncon, *dynconend;
10984 
10985       if (sdyn == NULL || htab->got == NULL)
10986 	abort ();
10987 
10988       dyncon = (Elf64_External_Dyn *) sdyn->contents;
10989       dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
10990       for (; dyncon < dynconend; dyncon++)
10991 	{
10992 	  Elf_Internal_Dyn dyn;
10993 	  asection *s;
10994 
10995 	  bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
10996 
10997 	  switch (dyn.d_tag)
10998 	    {
10999 	    default:
11000 	      continue;
11001 
11002 	    case DT_PPC64_GLINK:
11003 	      s = htab->glink;
11004 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11005 	      /* We stupidly defined DT_PPC64_GLINK to be the start
11006 		 of glink rather than the first entry point, which is
11007 		 what ld.so needs, and now have a bigger stub to
11008 		 support automatic multiple TOCs.  */
11009 	      dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
11010 	      break;
11011 
11012 	    case DT_PPC64_OPD:
11013 	      s = bfd_get_section_by_name (output_bfd, ".opd");
11014 	      if (s == NULL)
11015 		continue;
11016 	      dyn.d_un.d_ptr = s->vma;
11017 	      break;
11018 
11019 	    case DT_PPC64_OPDSZ:
11020 	      s = bfd_get_section_by_name (output_bfd, ".opd");
11021 	      if (s == NULL)
11022 		continue;
11023 	      dyn.d_un.d_val = s->size;
11024 	      break;
11025 
11026 	    case DT_PLTGOT:
11027 	      s = htab->plt;
11028 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11029 	      break;
11030 
11031 	    case DT_JMPREL:
11032 	      s = htab->relplt;
11033 	      dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
11034 	      break;
11035 
11036 	    case DT_PLTRELSZ:
11037 	      dyn.d_un.d_val = htab->relplt->size;
11038 	      break;
11039 
11040 	    case DT_RELASZ:
11041 	      /* Don't count procedure linkage table relocs in the
11042 		 overall reloc count.  */
11043 	      s = htab->relplt;
11044 	      if (s == NULL)
11045 		continue;
11046 	      dyn.d_un.d_val -= s->size;
11047 	      break;
11048 
11049 	    case DT_RELA:
11050 	      /* We may not be using the standard ELF linker script.
11051 		 If .rela.plt is the first .rela section, we adjust
11052 		 DT_RELA to not include it.  */
11053 	      s = htab->relplt;
11054 	      if (s == NULL)
11055 		continue;
11056 	      if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
11057 		continue;
11058 	      dyn.d_un.d_ptr += s->size;
11059 	      break;
11060 	    }
11061 
11062 	  bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
11063 	}
11064     }
11065 
11066   if (htab->got != NULL && htab->got->size != 0)
11067     {
11068       /* Fill in the first entry in the global offset table.
11069 	 We use it to hold the link-time TOCbase.  */
11070       bfd_put_64 (output_bfd,
11071 		  elf_gp (output_bfd) + TOC_BASE_OFF,
11072 		  htab->got->contents);
11073 
11074       /* Set .got entry size.  */
11075       elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
11076     }
11077 
11078   if (htab->plt != NULL && htab->plt->size != 0)
11079     {
11080       /* Set .plt entry size.  */
11081       elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
11082 	= PLT_ENTRY_SIZE;
11083     }
11084 
11085   /* We need to handle writing out multiple GOT sections ourselves,
11086      since we didn't add them to DYNOBJ.  We know dynobj is the first
11087      bfd.  */
11088   while ((dynobj = dynobj->link_next) != NULL)
11089     {
11090       asection *s;
11091 
11092       if (!is_ppc64_elf_target (dynobj->xvec))
11093 	continue;
11094 
11095       s = ppc64_elf_tdata (dynobj)->got;
11096       if (s != NULL
11097 	  && s->size != 0
11098 	  && s->output_section != bfd_abs_section_ptr
11099 	  && !bfd_set_section_contents (output_bfd, s->output_section,
11100 					s->contents, s->output_offset,
11101 					s->size))
11102 	return FALSE;
11103       s = ppc64_elf_tdata (dynobj)->relgot;
11104       if (s != NULL
11105 	  && s->size != 0
11106 	  && s->output_section != bfd_abs_section_ptr
11107 	  && !bfd_set_section_contents (output_bfd, s->output_section,
11108 					s->contents, s->output_offset,
11109 					s->size))
11110 	return FALSE;
11111     }
11112 
11113   return TRUE;
11114 }
11115 
11116 #include "elf64-target.h"
11117