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