argv.c (expandargv): Check for directories passed as @-files.
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2016 Free Software Foundation, Inc.
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
5 Largely rewritten by Alan Modra.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
22
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 #include "dwarf2.h"
37
38 static bfd_reloc_status_type ppc64_elf_ha_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_reloc
49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type ppc64_elf_toc64_reloc
53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
56 static bfd_vma opd_entry_value
57 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
58
59 #define TARGET_LITTLE_SYM powerpc_elf64_le_vec
60 #define TARGET_LITTLE_NAME "elf64-powerpcle"
61 #define TARGET_BIG_SYM powerpc_elf64_vec
62 #define TARGET_BIG_NAME "elf64-powerpc"
63 #define ELF_ARCH bfd_arch_powerpc
64 #define ELF_TARGET_ID PPC64_ELF_DATA
65 #define ELF_MACHINE_CODE EM_PPC64
66 #define ELF_MAXPAGESIZE 0x10000
67 #define ELF_COMMONPAGESIZE 0x10000
68 #define elf_info_to_howto ppc64_elf_info_to_howto
69
70 #define elf_backend_want_got_sym 0
71 #define elf_backend_want_plt_sym 0
72 #define elf_backend_plt_alignment 3
73 #define elf_backend_plt_not_loaded 1
74 #define elf_backend_got_header_size 8
75 #define elf_backend_can_gc_sections 1
76 #define elf_backend_can_refcount 1
77 #define elf_backend_rela_normal 1
78 #define elf_backend_dtrel_excludes_plt 1
79 #define elf_backend_default_execstack 0
80
81 #define bfd_elf64_mkobject ppc64_elf_mkobject
82 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
83 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
84 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
85 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
86 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
87 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
88 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
89 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
90 #define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
91
92 #define elf_backend_object_p ppc64_elf_object_p
93 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
94 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
95 #define elf_backend_write_core_note ppc64_elf_write_core_note
96 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
97 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
98 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
99 #define elf_backend_check_directives ppc64_elf_before_check_relocs
100 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
101 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
102 #define elf_backend_check_relocs ppc64_elf_check_relocs
103 #define elf_backend_gc_keep ppc64_elf_gc_keep
104 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
105 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
106 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
107 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
108 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
109 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
110 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
111 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
112 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
113 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
114 #define elf_backend_action_discarded ppc64_elf_action_discarded
115 #define elf_backend_relocate_section ppc64_elf_relocate_section
116 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
117 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
118 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
119 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
120 #define elf_backend_special_sections ppc64_elf_special_sections
121 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
122 #define elf_backend_merge_symbol ppc64_elf_merge_symbol
123
124 /* The name of the dynamic interpreter. This is put in the .interp
125 section. */
126 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
127
128 /* The size in bytes of an entry in the procedure linkage table. */
129 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
130
131 /* The initial size of the plt reserved for the dynamic linker. */
132 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
133
134 /* Offsets to some stack save slots. */
135 #define STK_LR 16
136 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
137 /* This one is dodgy. ELFv2 does not have a linker word, so use the
138 CR save slot. Used only by optimised __tls_get_addr call stub,
139 relying on __tls_get_addr_opt not saving CR.. */
140 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
141
142 /* TOC base pointers offset from start of TOC. */
143 #define TOC_BASE_OFF 0x8000
144 /* TOC base alignment. */
145 #define TOC_BASE_ALIGN 256
146
147 /* Offset of tp and dtp pointers from start of TLS block. */
148 #define TP_OFFSET 0x7000
149 #define DTP_OFFSET 0x8000
150
151 /* .plt call stub instructions. The normal stub is like this, but
152 sometimes the .plt entry crosses a 64k boundary and we need to
153 insert an addi to adjust r11. */
154 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
155 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
156 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
157 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
158 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
159 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
160 #define BCTR 0x4e800420 /* bctr */
161
162 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
163 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
164 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
165
166 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
167 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
168 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
169 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
170 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
171 #define BNECTR 0x4ca20420 /* bnectr+ */
172 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
173
174 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
175 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
176 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
177
178 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
179 #define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
180 #define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
181
182 #define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
183 #define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
184 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
185 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
186 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
187
188 /* glink call stub instructions. We enter with the index in R0. */
189 #define GLINK_CALL_STUB_SIZE (16*4)
190 /* 0: */
191 /* .quad plt0-1f */
192 /* __glink: */
193 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
194 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
195 /* 1: */
196 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
197 /* ld %2,(0b-1b)(%11) */
198 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
199 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
200 /* ld %12,0(%11) */
201 /* ld %2,8(%11) */
202 /* mtctr %12 */
203 /* ld %11,16(%11) */
204 /* bctr */
205 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
206 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
207 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
208 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
209 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
210
211 /* Pad with this. */
212 #define NOP 0x60000000
213
214 /* Some other nops. */
215 #define CROR_151515 0x4def7b82
216 #define CROR_313131 0x4ffffb82
217
218 /* .glink entries for the first 32k functions are two instructions. */
219 #define LI_R0_0 0x38000000 /* li %r0,0 */
220 #define B_DOT 0x48000000 /* b . */
221
222 /* After that, we need two instructions to load the index, followed by
223 a branch. */
224 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
225 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
226
227 /* Instructions used by the save and restore reg functions. */
228 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
229 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
230 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
231 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
232 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
233 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
234 #define LI_R12_0 0x39800000 /* li %r12,0 */
235 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
236 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
237 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
238 #define BLR 0x4e800020 /* blr */
239
240 /* Since .opd is an array of descriptors and each entry will end up
241 with identical R_PPC64_RELATIVE relocs, there is really no need to
242 propagate .opd relocs; The dynamic linker should be taught to
243 relocate .opd without reloc entries. */
244 #ifndef NO_OPD_RELOCS
245 #define NO_OPD_RELOCS 0
246 #endif
247
248 #ifndef ARRAY_SIZE
249 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
250 #endif
251
252 static inline int
253 abiversion (bfd *abfd)
254 {
255 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
256 }
257
258 static inline void
259 set_abiversion (bfd *abfd, int ver)
260 {
261 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
262 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
263 }
264 \f
265 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
266
267 /* Relocation HOWTO's. */
268 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
269
270 static reloc_howto_type ppc64_elf_howto_raw[] = {
271 /* This reloc does nothing. */
272 HOWTO (R_PPC64_NONE, /* type */
273 0, /* rightshift */
274 3, /* size (0 = byte, 1 = short, 2 = long) */
275 0, /* bitsize */
276 FALSE, /* pc_relative */
277 0, /* bitpos */
278 complain_overflow_dont, /* complain_on_overflow */
279 bfd_elf_generic_reloc, /* special_function */
280 "R_PPC64_NONE", /* name */
281 FALSE, /* partial_inplace */
282 0, /* src_mask */
283 0, /* dst_mask */
284 FALSE), /* pcrel_offset */
285
286 /* A standard 32 bit relocation. */
287 HOWTO (R_PPC64_ADDR32, /* type */
288 0, /* rightshift */
289 2, /* size (0 = byte, 1 = short, 2 = long) */
290 32, /* bitsize */
291 FALSE, /* pc_relative */
292 0, /* bitpos */
293 complain_overflow_bitfield, /* complain_on_overflow */
294 bfd_elf_generic_reloc, /* special_function */
295 "R_PPC64_ADDR32", /* name */
296 FALSE, /* partial_inplace */
297 0, /* src_mask */
298 0xffffffff, /* dst_mask */
299 FALSE), /* pcrel_offset */
300
301 /* An absolute 26 bit branch; the lower two bits must be zero.
302 FIXME: we don't check that, we just clear them. */
303 HOWTO (R_PPC64_ADDR24, /* type */
304 0, /* rightshift */
305 2, /* size (0 = byte, 1 = short, 2 = long) */
306 26, /* bitsize */
307 FALSE, /* pc_relative */
308 0, /* bitpos */
309 complain_overflow_bitfield, /* complain_on_overflow */
310 bfd_elf_generic_reloc, /* special_function */
311 "R_PPC64_ADDR24", /* name */
312 FALSE, /* partial_inplace */
313 0, /* src_mask */
314 0x03fffffc, /* dst_mask */
315 FALSE), /* pcrel_offset */
316
317 /* A standard 16 bit relocation. */
318 HOWTO (R_PPC64_ADDR16, /* type */
319 0, /* rightshift */
320 1, /* size (0 = byte, 1 = short, 2 = long) */
321 16, /* bitsize */
322 FALSE, /* pc_relative */
323 0, /* bitpos */
324 complain_overflow_bitfield, /* complain_on_overflow */
325 bfd_elf_generic_reloc, /* special_function */
326 "R_PPC64_ADDR16", /* name */
327 FALSE, /* partial_inplace */
328 0, /* src_mask */
329 0xffff, /* dst_mask */
330 FALSE), /* pcrel_offset */
331
332 /* A 16 bit relocation without overflow. */
333 HOWTO (R_PPC64_ADDR16_LO, /* type */
334 0, /* rightshift */
335 1, /* size (0 = byte, 1 = short, 2 = long) */
336 16, /* bitsize */
337 FALSE, /* pc_relative */
338 0, /* bitpos */
339 complain_overflow_dont,/* complain_on_overflow */
340 bfd_elf_generic_reloc, /* special_function */
341 "R_PPC64_ADDR16_LO", /* name */
342 FALSE, /* partial_inplace */
343 0, /* src_mask */
344 0xffff, /* dst_mask */
345 FALSE), /* pcrel_offset */
346
347 /* Bits 16-31 of an address. */
348 HOWTO (R_PPC64_ADDR16_HI, /* type */
349 16, /* rightshift */
350 1, /* size (0 = byte, 1 = short, 2 = long) */
351 16, /* bitsize */
352 FALSE, /* pc_relative */
353 0, /* bitpos */
354 complain_overflow_signed, /* complain_on_overflow */
355 bfd_elf_generic_reloc, /* special_function */
356 "R_PPC64_ADDR16_HI", /* name */
357 FALSE, /* partial_inplace */
358 0, /* src_mask */
359 0xffff, /* dst_mask */
360 FALSE), /* pcrel_offset */
361
362 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
363 bits, treated as a signed number, is negative. */
364 HOWTO (R_PPC64_ADDR16_HA, /* type */
365 16, /* rightshift */
366 1, /* size (0 = byte, 1 = short, 2 = long) */
367 16, /* bitsize */
368 FALSE, /* pc_relative */
369 0, /* bitpos */
370 complain_overflow_signed, /* complain_on_overflow */
371 ppc64_elf_ha_reloc, /* special_function */
372 "R_PPC64_ADDR16_HA", /* name */
373 FALSE, /* partial_inplace */
374 0, /* src_mask */
375 0xffff, /* dst_mask */
376 FALSE), /* pcrel_offset */
377
378 /* An absolute 16 bit branch; the lower two bits must be zero.
379 FIXME: we don't check that, we just clear them. */
380 HOWTO (R_PPC64_ADDR14, /* type */
381 0, /* rightshift */
382 2, /* size (0 = byte, 1 = short, 2 = long) */
383 16, /* bitsize */
384 FALSE, /* pc_relative */
385 0, /* bitpos */
386 complain_overflow_signed, /* complain_on_overflow */
387 ppc64_elf_branch_reloc, /* special_function */
388 "R_PPC64_ADDR14", /* name */
389 FALSE, /* partial_inplace */
390 0, /* src_mask */
391 0x0000fffc, /* dst_mask */
392 FALSE), /* pcrel_offset */
393
394 /* An absolute 16 bit branch, for which bit 10 should be set to
395 indicate that the branch is expected to be taken. The lower two
396 bits must be zero. */
397 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
398 0, /* rightshift */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
400 16, /* bitsize */
401 FALSE, /* pc_relative */
402 0, /* bitpos */
403 complain_overflow_signed, /* complain_on_overflow */
404 ppc64_elf_brtaken_reloc, /* special_function */
405 "R_PPC64_ADDR14_BRTAKEN",/* name */
406 FALSE, /* partial_inplace */
407 0, /* src_mask */
408 0x0000fffc, /* dst_mask */
409 FALSE), /* pcrel_offset */
410
411 /* An absolute 16 bit branch, for which bit 10 should be set to
412 indicate that the branch is not expected to be taken. The lower
413 two bits must be zero. */
414 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
415 0, /* rightshift */
416 2, /* size (0 = byte, 1 = short, 2 = long) */
417 16, /* bitsize */
418 FALSE, /* pc_relative */
419 0, /* bitpos */
420 complain_overflow_signed, /* complain_on_overflow */
421 ppc64_elf_brtaken_reloc, /* special_function */
422 "R_PPC64_ADDR14_BRNTAKEN",/* name */
423 FALSE, /* partial_inplace */
424 0, /* src_mask */
425 0x0000fffc, /* dst_mask */
426 FALSE), /* pcrel_offset */
427
428 /* A relative 26 bit branch; the lower two bits must be zero. */
429 HOWTO (R_PPC64_REL24, /* type */
430 0, /* rightshift */
431 2, /* size (0 = byte, 1 = short, 2 = long) */
432 26, /* bitsize */
433 TRUE, /* pc_relative */
434 0, /* bitpos */
435 complain_overflow_signed, /* complain_on_overflow */
436 ppc64_elf_branch_reloc, /* special_function */
437 "R_PPC64_REL24", /* name */
438 FALSE, /* partial_inplace */
439 0, /* src_mask */
440 0x03fffffc, /* dst_mask */
441 TRUE), /* pcrel_offset */
442
443 /* A relative 16 bit branch; the lower two bits must be zero. */
444 HOWTO (R_PPC64_REL14, /* type */
445 0, /* rightshift */
446 2, /* size (0 = byte, 1 = short, 2 = long) */
447 16, /* bitsize */
448 TRUE, /* pc_relative */
449 0, /* bitpos */
450 complain_overflow_signed, /* complain_on_overflow */
451 ppc64_elf_branch_reloc, /* special_function */
452 "R_PPC64_REL14", /* name */
453 FALSE, /* partial_inplace */
454 0, /* src_mask */
455 0x0000fffc, /* dst_mask */
456 TRUE), /* pcrel_offset */
457
458 /* A relative 16 bit branch. Bit 10 should be set to indicate that
459 the branch is expected to be taken. The lower two bits must be
460 zero. */
461 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
462 0, /* rightshift */
463 2, /* size (0 = byte, 1 = short, 2 = long) */
464 16, /* bitsize */
465 TRUE, /* pc_relative */
466 0, /* bitpos */
467 complain_overflow_signed, /* complain_on_overflow */
468 ppc64_elf_brtaken_reloc, /* special_function */
469 "R_PPC64_REL14_BRTAKEN", /* name */
470 FALSE, /* partial_inplace */
471 0, /* src_mask */
472 0x0000fffc, /* dst_mask */
473 TRUE), /* pcrel_offset */
474
475 /* A relative 16 bit branch. Bit 10 should be set to indicate that
476 the branch is not expected to be taken. The lower two bits must
477 be zero. */
478 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
479 0, /* rightshift */
480 2, /* size (0 = byte, 1 = short, 2 = long) */
481 16, /* bitsize */
482 TRUE, /* pc_relative */
483 0, /* bitpos */
484 complain_overflow_signed, /* complain_on_overflow */
485 ppc64_elf_brtaken_reloc, /* special_function */
486 "R_PPC64_REL14_BRNTAKEN",/* name */
487 FALSE, /* partial_inplace */
488 0, /* src_mask */
489 0x0000fffc, /* dst_mask */
490 TRUE), /* pcrel_offset */
491
492 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
493 symbol. */
494 HOWTO (R_PPC64_GOT16, /* type */
495 0, /* rightshift */
496 1, /* size (0 = byte, 1 = short, 2 = long) */
497 16, /* bitsize */
498 FALSE, /* pc_relative */
499 0, /* bitpos */
500 complain_overflow_signed, /* complain_on_overflow */
501 ppc64_elf_unhandled_reloc, /* special_function */
502 "R_PPC64_GOT16", /* name */
503 FALSE, /* partial_inplace */
504 0, /* src_mask */
505 0xffff, /* dst_mask */
506 FALSE), /* pcrel_offset */
507
508 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
509 the symbol. */
510 HOWTO (R_PPC64_GOT16_LO, /* type */
511 0, /* rightshift */
512 1, /* size (0 = byte, 1 = short, 2 = long) */
513 16, /* bitsize */
514 FALSE, /* pc_relative */
515 0, /* bitpos */
516 complain_overflow_dont, /* complain_on_overflow */
517 ppc64_elf_unhandled_reloc, /* special_function */
518 "R_PPC64_GOT16_LO", /* name */
519 FALSE, /* partial_inplace */
520 0, /* src_mask */
521 0xffff, /* dst_mask */
522 FALSE), /* pcrel_offset */
523
524 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
525 the symbol. */
526 HOWTO (R_PPC64_GOT16_HI, /* type */
527 16, /* rightshift */
528 1, /* size (0 = byte, 1 = short, 2 = long) */
529 16, /* bitsize */
530 FALSE, /* pc_relative */
531 0, /* bitpos */
532 complain_overflow_signed,/* complain_on_overflow */
533 ppc64_elf_unhandled_reloc, /* special_function */
534 "R_PPC64_GOT16_HI", /* name */
535 FALSE, /* partial_inplace */
536 0, /* src_mask */
537 0xffff, /* dst_mask */
538 FALSE), /* pcrel_offset */
539
540 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
541 the symbol. */
542 HOWTO (R_PPC64_GOT16_HA, /* type */
543 16, /* rightshift */
544 1, /* size (0 = byte, 1 = short, 2 = long) */
545 16, /* bitsize */
546 FALSE, /* pc_relative */
547 0, /* bitpos */
548 complain_overflow_signed,/* complain_on_overflow */
549 ppc64_elf_unhandled_reloc, /* special_function */
550 "R_PPC64_GOT16_HA", /* name */
551 FALSE, /* partial_inplace */
552 0, /* src_mask */
553 0xffff, /* dst_mask */
554 FALSE), /* pcrel_offset */
555
556 /* This is used only by the dynamic linker. The symbol should exist
557 both in the object being run and in some shared library. The
558 dynamic linker copies the data addressed by the symbol from the
559 shared library into the object, because the object being
560 run has to have the data at some particular address. */
561 HOWTO (R_PPC64_COPY, /* type */
562 0, /* rightshift */
563 0, /* this one is variable size */
564 0, /* bitsize */
565 FALSE, /* pc_relative */
566 0, /* bitpos */
567 complain_overflow_dont, /* complain_on_overflow */
568 ppc64_elf_unhandled_reloc, /* special_function */
569 "R_PPC64_COPY", /* name */
570 FALSE, /* partial_inplace */
571 0, /* src_mask */
572 0, /* dst_mask */
573 FALSE), /* pcrel_offset */
574
575 /* Like R_PPC64_ADDR64, but used when setting global offset table
576 entries. */
577 HOWTO (R_PPC64_GLOB_DAT, /* type */
578 0, /* rightshift */
579 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
580 64, /* bitsize */
581 FALSE, /* pc_relative */
582 0, /* bitpos */
583 complain_overflow_dont, /* complain_on_overflow */
584 ppc64_elf_unhandled_reloc, /* special_function */
585 "R_PPC64_GLOB_DAT", /* name */
586 FALSE, /* partial_inplace */
587 0, /* src_mask */
588 ONES (64), /* dst_mask */
589 FALSE), /* pcrel_offset */
590
591 /* Created by the link editor. Marks a procedure linkage table
592 entry for a symbol. */
593 HOWTO (R_PPC64_JMP_SLOT, /* type */
594 0, /* rightshift */
595 0, /* size (0 = byte, 1 = short, 2 = long) */
596 0, /* bitsize */
597 FALSE, /* pc_relative */
598 0, /* bitpos */
599 complain_overflow_dont, /* complain_on_overflow */
600 ppc64_elf_unhandled_reloc, /* special_function */
601 "R_PPC64_JMP_SLOT", /* name */
602 FALSE, /* partial_inplace */
603 0, /* src_mask */
604 0, /* dst_mask */
605 FALSE), /* pcrel_offset */
606
607 /* Used only by the dynamic linker. When the object is run, this
608 doubleword64 is set to the load address of the object, plus the
609 addend. */
610 HOWTO (R_PPC64_RELATIVE, /* type */
611 0, /* rightshift */
612 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
613 64, /* bitsize */
614 FALSE, /* pc_relative */
615 0, /* bitpos */
616 complain_overflow_dont, /* complain_on_overflow */
617 bfd_elf_generic_reloc, /* special_function */
618 "R_PPC64_RELATIVE", /* name */
619 FALSE, /* partial_inplace */
620 0, /* src_mask */
621 ONES (64), /* dst_mask */
622 FALSE), /* pcrel_offset */
623
624 /* Like R_PPC64_ADDR32, but may be unaligned. */
625 HOWTO (R_PPC64_UADDR32, /* type */
626 0, /* rightshift */
627 2, /* size (0 = byte, 1 = short, 2 = long) */
628 32, /* bitsize */
629 FALSE, /* pc_relative */
630 0, /* bitpos */
631 complain_overflow_bitfield, /* complain_on_overflow */
632 bfd_elf_generic_reloc, /* special_function */
633 "R_PPC64_UADDR32", /* name */
634 FALSE, /* partial_inplace */
635 0, /* src_mask */
636 0xffffffff, /* dst_mask */
637 FALSE), /* pcrel_offset */
638
639 /* Like R_PPC64_ADDR16, but may be unaligned. */
640 HOWTO (R_PPC64_UADDR16, /* type */
641 0, /* rightshift */
642 1, /* size (0 = byte, 1 = short, 2 = long) */
643 16, /* bitsize */
644 FALSE, /* pc_relative */
645 0, /* bitpos */
646 complain_overflow_bitfield, /* complain_on_overflow */
647 bfd_elf_generic_reloc, /* special_function */
648 "R_PPC64_UADDR16", /* name */
649 FALSE, /* partial_inplace */
650 0, /* src_mask */
651 0xffff, /* dst_mask */
652 FALSE), /* pcrel_offset */
653
654 /* 32-bit PC relative. */
655 HOWTO (R_PPC64_REL32, /* type */
656 0, /* rightshift */
657 2, /* size (0 = byte, 1 = short, 2 = long) */
658 32, /* bitsize */
659 TRUE, /* pc_relative */
660 0, /* bitpos */
661 complain_overflow_signed, /* complain_on_overflow */
662 bfd_elf_generic_reloc, /* special_function */
663 "R_PPC64_REL32", /* name */
664 FALSE, /* partial_inplace */
665 0, /* src_mask */
666 0xffffffff, /* dst_mask */
667 TRUE), /* pcrel_offset */
668
669 /* 32-bit relocation to the symbol's procedure linkage table. */
670 HOWTO (R_PPC64_PLT32, /* type */
671 0, /* rightshift */
672 2, /* size (0 = byte, 1 = short, 2 = long) */
673 32, /* bitsize */
674 FALSE, /* pc_relative */
675 0, /* bitpos */
676 complain_overflow_bitfield, /* complain_on_overflow */
677 ppc64_elf_unhandled_reloc, /* special_function */
678 "R_PPC64_PLT32", /* name */
679 FALSE, /* partial_inplace */
680 0, /* src_mask */
681 0xffffffff, /* dst_mask */
682 FALSE), /* pcrel_offset */
683
684 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
685 FIXME: R_PPC64_PLTREL32 not supported. */
686 HOWTO (R_PPC64_PLTREL32, /* type */
687 0, /* rightshift */
688 2, /* size (0 = byte, 1 = short, 2 = long) */
689 32, /* bitsize */
690 TRUE, /* pc_relative */
691 0, /* bitpos */
692 complain_overflow_signed, /* complain_on_overflow */
693 ppc64_elf_unhandled_reloc, /* special_function */
694 "R_PPC64_PLTREL32", /* name */
695 FALSE, /* partial_inplace */
696 0, /* src_mask */
697 0xffffffff, /* dst_mask */
698 TRUE), /* pcrel_offset */
699
700 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
701 the symbol. */
702 HOWTO (R_PPC64_PLT16_LO, /* type */
703 0, /* rightshift */
704 1, /* size (0 = byte, 1 = short, 2 = long) */
705 16, /* bitsize */
706 FALSE, /* pc_relative */
707 0, /* bitpos */
708 complain_overflow_dont, /* complain_on_overflow */
709 ppc64_elf_unhandled_reloc, /* special_function */
710 "R_PPC64_PLT16_LO", /* name */
711 FALSE, /* partial_inplace */
712 0, /* src_mask */
713 0xffff, /* dst_mask */
714 FALSE), /* pcrel_offset */
715
716 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
717 the symbol. */
718 HOWTO (R_PPC64_PLT16_HI, /* type */
719 16, /* rightshift */
720 1, /* size (0 = byte, 1 = short, 2 = long) */
721 16, /* bitsize */
722 FALSE, /* pc_relative */
723 0, /* bitpos */
724 complain_overflow_signed, /* complain_on_overflow */
725 ppc64_elf_unhandled_reloc, /* special_function */
726 "R_PPC64_PLT16_HI", /* name */
727 FALSE, /* partial_inplace */
728 0, /* src_mask */
729 0xffff, /* dst_mask */
730 FALSE), /* pcrel_offset */
731
732 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
733 the symbol. */
734 HOWTO (R_PPC64_PLT16_HA, /* type */
735 16, /* rightshift */
736 1, /* size (0 = byte, 1 = short, 2 = long) */
737 16, /* bitsize */
738 FALSE, /* pc_relative */
739 0, /* bitpos */
740 complain_overflow_signed, /* complain_on_overflow */
741 ppc64_elf_unhandled_reloc, /* special_function */
742 "R_PPC64_PLT16_HA", /* name */
743 FALSE, /* partial_inplace */
744 0, /* src_mask */
745 0xffff, /* dst_mask */
746 FALSE), /* pcrel_offset */
747
748 /* 16-bit section relative relocation. */
749 HOWTO (R_PPC64_SECTOFF, /* type */
750 0, /* rightshift */
751 1, /* size (0 = byte, 1 = short, 2 = long) */
752 16, /* bitsize */
753 FALSE, /* pc_relative */
754 0, /* bitpos */
755 complain_overflow_signed, /* complain_on_overflow */
756 ppc64_elf_sectoff_reloc, /* special_function */
757 "R_PPC64_SECTOFF", /* name */
758 FALSE, /* partial_inplace */
759 0, /* src_mask */
760 0xffff, /* dst_mask */
761 FALSE), /* pcrel_offset */
762
763 /* Like R_PPC64_SECTOFF, but no overflow warning. */
764 HOWTO (R_PPC64_SECTOFF_LO, /* type */
765 0, /* rightshift */
766 1, /* size (0 = byte, 1 = short, 2 = long) */
767 16, /* bitsize */
768 FALSE, /* pc_relative */
769 0, /* bitpos */
770 complain_overflow_dont, /* complain_on_overflow */
771 ppc64_elf_sectoff_reloc, /* special_function */
772 "R_PPC64_SECTOFF_LO", /* name */
773 FALSE, /* partial_inplace */
774 0, /* src_mask */
775 0xffff, /* dst_mask */
776 FALSE), /* pcrel_offset */
777
778 /* 16-bit upper half section relative relocation. */
779 HOWTO (R_PPC64_SECTOFF_HI, /* type */
780 16, /* rightshift */
781 1, /* size (0 = byte, 1 = short, 2 = long) */
782 16, /* bitsize */
783 FALSE, /* pc_relative */
784 0, /* bitpos */
785 complain_overflow_signed, /* complain_on_overflow */
786 ppc64_elf_sectoff_reloc, /* special_function */
787 "R_PPC64_SECTOFF_HI", /* name */
788 FALSE, /* partial_inplace */
789 0, /* src_mask */
790 0xffff, /* dst_mask */
791 FALSE), /* pcrel_offset */
792
793 /* 16-bit upper half adjusted section relative relocation. */
794 HOWTO (R_PPC64_SECTOFF_HA, /* type */
795 16, /* rightshift */
796 1, /* size (0 = byte, 1 = short, 2 = long) */
797 16, /* bitsize */
798 FALSE, /* pc_relative */
799 0, /* bitpos */
800 complain_overflow_signed, /* complain_on_overflow */
801 ppc64_elf_sectoff_ha_reloc, /* special_function */
802 "R_PPC64_SECTOFF_HA", /* name */
803 FALSE, /* partial_inplace */
804 0, /* src_mask */
805 0xffff, /* dst_mask */
806 FALSE), /* pcrel_offset */
807
808 /* Like R_PPC64_REL24 without touching the two least significant bits. */
809 HOWTO (R_PPC64_REL30, /* type */
810 2, /* rightshift */
811 2, /* size (0 = byte, 1 = short, 2 = long) */
812 30, /* bitsize */
813 TRUE, /* pc_relative */
814 0, /* bitpos */
815 complain_overflow_dont, /* complain_on_overflow */
816 bfd_elf_generic_reloc, /* special_function */
817 "R_PPC64_REL30", /* name */
818 FALSE, /* partial_inplace */
819 0, /* src_mask */
820 0xfffffffc, /* dst_mask */
821 TRUE), /* pcrel_offset */
822
823 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
824
825 /* A standard 64-bit relocation. */
826 HOWTO (R_PPC64_ADDR64, /* type */
827 0, /* rightshift */
828 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
829 64, /* bitsize */
830 FALSE, /* pc_relative */
831 0, /* bitpos */
832 complain_overflow_dont, /* complain_on_overflow */
833 bfd_elf_generic_reloc, /* special_function */
834 "R_PPC64_ADDR64", /* name */
835 FALSE, /* partial_inplace */
836 0, /* src_mask */
837 ONES (64), /* dst_mask */
838 FALSE), /* pcrel_offset */
839
840 /* The bits 32-47 of an address. */
841 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
842 32, /* rightshift */
843 1, /* size (0 = byte, 1 = short, 2 = long) */
844 16, /* bitsize */
845 FALSE, /* pc_relative */
846 0, /* bitpos */
847 complain_overflow_dont, /* complain_on_overflow */
848 bfd_elf_generic_reloc, /* special_function */
849 "R_PPC64_ADDR16_HIGHER", /* name */
850 FALSE, /* partial_inplace */
851 0, /* src_mask */
852 0xffff, /* dst_mask */
853 FALSE), /* pcrel_offset */
854
855 /* The bits 32-47 of an address, plus 1 if the contents of the low
856 16 bits, treated as a signed number, is negative. */
857 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
858 32, /* rightshift */
859 1, /* size (0 = byte, 1 = short, 2 = long) */
860 16, /* bitsize */
861 FALSE, /* pc_relative */
862 0, /* bitpos */
863 complain_overflow_dont, /* complain_on_overflow */
864 ppc64_elf_ha_reloc, /* special_function */
865 "R_PPC64_ADDR16_HIGHERA", /* name */
866 FALSE, /* partial_inplace */
867 0, /* src_mask */
868 0xffff, /* dst_mask */
869 FALSE), /* pcrel_offset */
870
871 /* The bits 48-63 of an address. */
872 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
873 48, /* rightshift */
874 1, /* size (0 = byte, 1 = short, 2 = long) */
875 16, /* bitsize */
876 FALSE, /* pc_relative */
877 0, /* bitpos */
878 complain_overflow_dont, /* complain_on_overflow */
879 bfd_elf_generic_reloc, /* special_function */
880 "R_PPC64_ADDR16_HIGHEST", /* name */
881 FALSE, /* partial_inplace */
882 0, /* src_mask */
883 0xffff, /* dst_mask */
884 FALSE), /* pcrel_offset */
885
886 /* The bits 48-63 of an address, plus 1 if the contents of the low
887 16 bits, treated as a signed number, is negative. */
888 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
889 48, /* rightshift */
890 1, /* size (0 = byte, 1 = short, 2 = long) */
891 16, /* bitsize */
892 FALSE, /* pc_relative */
893 0, /* bitpos */
894 complain_overflow_dont, /* complain_on_overflow */
895 ppc64_elf_ha_reloc, /* special_function */
896 "R_PPC64_ADDR16_HIGHESTA", /* name */
897 FALSE, /* partial_inplace */
898 0, /* src_mask */
899 0xffff, /* dst_mask */
900 FALSE), /* pcrel_offset */
901
902 /* Like ADDR64, but may be unaligned. */
903 HOWTO (R_PPC64_UADDR64, /* type */
904 0, /* rightshift */
905 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
906 64, /* bitsize */
907 FALSE, /* pc_relative */
908 0, /* bitpos */
909 complain_overflow_dont, /* complain_on_overflow */
910 bfd_elf_generic_reloc, /* special_function */
911 "R_PPC64_UADDR64", /* name */
912 FALSE, /* partial_inplace */
913 0, /* src_mask */
914 ONES (64), /* dst_mask */
915 FALSE), /* pcrel_offset */
916
917 /* 64-bit relative relocation. */
918 HOWTO (R_PPC64_REL64, /* type */
919 0, /* rightshift */
920 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
921 64, /* bitsize */
922 TRUE, /* pc_relative */
923 0, /* bitpos */
924 complain_overflow_dont, /* complain_on_overflow */
925 bfd_elf_generic_reloc, /* special_function */
926 "R_PPC64_REL64", /* name */
927 FALSE, /* partial_inplace */
928 0, /* src_mask */
929 ONES (64), /* dst_mask */
930 TRUE), /* pcrel_offset */
931
932 /* 64-bit relocation to the symbol's procedure linkage table. */
933 HOWTO (R_PPC64_PLT64, /* type */
934 0, /* rightshift */
935 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
936 64, /* bitsize */
937 FALSE, /* pc_relative */
938 0, /* bitpos */
939 complain_overflow_dont, /* complain_on_overflow */
940 ppc64_elf_unhandled_reloc, /* special_function */
941 "R_PPC64_PLT64", /* name */
942 FALSE, /* partial_inplace */
943 0, /* src_mask */
944 ONES (64), /* dst_mask */
945 FALSE), /* pcrel_offset */
946
947 /* 64-bit PC relative relocation to the symbol's procedure linkage
948 table. */
949 /* FIXME: R_PPC64_PLTREL64 not supported. */
950 HOWTO (R_PPC64_PLTREL64, /* type */
951 0, /* rightshift */
952 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
953 64, /* bitsize */
954 TRUE, /* pc_relative */
955 0, /* bitpos */
956 complain_overflow_dont, /* complain_on_overflow */
957 ppc64_elf_unhandled_reloc, /* special_function */
958 "R_PPC64_PLTREL64", /* name */
959 FALSE, /* partial_inplace */
960 0, /* src_mask */
961 ONES (64), /* dst_mask */
962 TRUE), /* pcrel_offset */
963
964 /* 16 bit TOC-relative relocation. */
965
966 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
967 HOWTO (R_PPC64_TOC16, /* type */
968 0, /* rightshift */
969 1, /* size (0 = byte, 1 = short, 2 = long) */
970 16, /* bitsize */
971 FALSE, /* pc_relative */
972 0, /* bitpos */
973 complain_overflow_signed, /* complain_on_overflow */
974 ppc64_elf_toc_reloc, /* special_function */
975 "R_PPC64_TOC16", /* name */
976 FALSE, /* partial_inplace */
977 0, /* src_mask */
978 0xffff, /* dst_mask */
979 FALSE), /* pcrel_offset */
980
981 /* 16 bit TOC-relative relocation without overflow. */
982
983 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
984 HOWTO (R_PPC64_TOC16_LO, /* type */
985 0, /* rightshift */
986 1, /* size (0 = byte, 1 = short, 2 = long) */
987 16, /* bitsize */
988 FALSE, /* pc_relative */
989 0, /* bitpos */
990 complain_overflow_dont, /* complain_on_overflow */
991 ppc64_elf_toc_reloc, /* special_function */
992 "R_PPC64_TOC16_LO", /* name */
993 FALSE, /* partial_inplace */
994 0, /* src_mask */
995 0xffff, /* dst_mask */
996 FALSE), /* pcrel_offset */
997
998 /* 16 bit TOC-relative relocation, high 16 bits. */
999
1000 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1001 HOWTO (R_PPC64_TOC16_HI, /* type */
1002 16, /* rightshift */
1003 1, /* size (0 = byte, 1 = short, 2 = long) */
1004 16, /* bitsize */
1005 FALSE, /* pc_relative */
1006 0, /* bitpos */
1007 complain_overflow_signed, /* complain_on_overflow */
1008 ppc64_elf_toc_reloc, /* special_function */
1009 "R_PPC64_TOC16_HI", /* name */
1010 FALSE, /* partial_inplace */
1011 0, /* src_mask */
1012 0xffff, /* dst_mask */
1013 FALSE), /* pcrel_offset */
1014
1015 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1016 contents of the low 16 bits, treated as a signed number, is
1017 negative. */
1018
1019 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1020 HOWTO (R_PPC64_TOC16_HA, /* type */
1021 16, /* rightshift */
1022 1, /* size (0 = byte, 1 = short, 2 = long) */
1023 16, /* bitsize */
1024 FALSE, /* pc_relative */
1025 0, /* bitpos */
1026 complain_overflow_signed, /* complain_on_overflow */
1027 ppc64_elf_toc_ha_reloc, /* special_function */
1028 "R_PPC64_TOC16_HA", /* name */
1029 FALSE, /* partial_inplace */
1030 0, /* src_mask */
1031 0xffff, /* dst_mask */
1032 FALSE), /* pcrel_offset */
1033
1034 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1035
1036 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1037 HOWTO (R_PPC64_TOC, /* type */
1038 0, /* rightshift */
1039 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1040 64, /* bitsize */
1041 FALSE, /* pc_relative */
1042 0, /* bitpos */
1043 complain_overflow_dont, /* complain_on_overflow */
1044 ppc64_elf_toc64_reloc, /* special_function */
1045 "R_PPC64_TOC", /* name */
1046 FALSE, /* partial_inplace */
1047 0, /* src_mask */
1048 ONES (64), /* dst_mask */
1049 FALSE), /* pcrel_offset */
1050
1051 /* Like R_PPC64_GOT16, but also informs the link editor that the
1052 value to relocate may (!) refer to a PLT entry which the link
1053 editor (a) may replace with the symbol value. If the link editor
1054 is unable to fully resolve the symbol, it may (b) create a PLT
1055 entry and store the address to the new PLT entry in the GOT.
1056 This permits lazy resolution of function symbols at run time.
1057 The link editor may also skip all of this and just (c) emit a
1058 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1059 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1060 HOWTO (R_PPC64_PLTGOT16, /* type */
1061 0, /* rightshift */
1062 1, /* size (0 = byte, 1 = short, 2 = long) */
1063 16, /* bitsize */
1064 FALSE, /* pc_relative */
1065 0, /* bitpos */
1066 complain_overflow_signed, /* complain_on_overflow */
1067 ppc64_elf_unhandled_reloc, /* special_function */
1068 "R_PPC64_PLTGOT16", /* name */
1069 FALSE, /* partial_inplace */
1070 0, /* src_mask */
1071 0xffff, /* dst_mask */
1072 FALSE), /* pcrel_offset */
1073
1074 /* Like R_PPC64_PLTGOT16, but without overflow. */
1075 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1076 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1077 0, /* rightshift */
1078 1, /* size (0 = byte, 1 = short, 2 = long) */
1079 16, /* bitsize */
1080 FALSE, /* pc_relative */
1081 0, /* bitpos */
1082 complain_overflow_dont, /* complain_on_overflow */
1083 ppc64_elf_unhandled_reloc, /* special_function */
1084 "R_PPC64_PLTGOT16_LO", /* name */
1085 FALSE, /* partial_inplace */
1086 0, /* src_mask */
1087 0xffff, /* dst_mask */
1088 FALSE), /* pcrel_offset */
1089
1090 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1091 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1092 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1093 16, /* rightshift */
1094 1, /* size (0 = byte, 1 = short, 2 = long) */
1095 16, /* bitsize */
1096 FALSE, /* pc_relative */
1097 0, /* bitpos */
1098 complain_overflow_signed, /* complain_on_overflow */
1099 ppc64_elf_unhandled_reloc, /* special_function */
1100 "R_PPC64_PLTGOT16_HI", /* name */
1101 FALSE, /* partial_inplace */
1102 0, /* src_mask */
1103 0xffff, /* dst_mask */
1104 FALSE), /* pcrel_offset */
1105
1106 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1107 1 if the contents of the low 16 bits, treated as a signed number,
1108 is negative. */
1109 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1110 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1111 16, /* rightshift */
1112 1, /* size (0 = byte, 1 = short, 2 = long) */
1113 16, /* bitsize */
1114 FALSE, /* pc_relative */
1115 0, /* bitpos */
1116 complain_overflow_signed, /* complain_on_overflow */
1117 ppc64_elf_unhandled_reloc, /* special_function */
1118 "R_PPC64_PLTGOT16_HA", /* name */
1119 FALSE, /* partial_inplace */
1120 0, /* src_mask */
1121 0xffff, /* dst_mask */
1122 FALSE), /* pcrel_offset */
1123
1124 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1125 HOWTO (R_PPC64_ADDR16_DS, /* type */
1126 0, /* rightshift */
1127 1, /* size (0 = byte, 1 = short, 2 = long) */
1128 16, /* bitsize */
1129 FALSE, /* pc_relative */
1130 0, /* bitpos */
1131 complain_overflow_signed, /* complain_on_overflow */
1132 bfd_elf_generic_reloc, /* special_function */
1133 "R_PPC64_ADDR16_DS", /* name */
1134 FALSE, /* partial_inplace */
1135 0, /* src_mask */
1136 0xfffc, /* dst_mask */
1137 FALSE), /* pcrel_offset */
1138
1139 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1140 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1141 0, /* rightshift */
1142 1, /* size (0 = byte, 1 = short, 2 = long) */
1143 16, /* bitsize */
1144 FALSE, /* pc_relative */
1145 0, /* bitpos */
1146 complain_overflow_dont,/* complain_on_overflow */
1147 bfd_elf_generic_reloc, /* special_function */
1148 "R_PPC64_ADDR16_LO_DS",/* name */
1149 FALSE, /* partial_inplace */
1150 0, /* src_mask */
1151 0xfffc, /* dst_mask */
1152 FALSE), /* pcrel_offset */
1153
1154 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1155 HOWTO (R_PPC64_GOT16_DS, /* type */
1156 0, /* rightshift */
1157 1, /* size (0 = byte, 1 = short, 2 = long) */
1158 16, /* bitsize */
1159 FALSE, /* pc_relative */
1160 0, /* bitpos */
1161 complain_overflow_signed, /* complain_on_overflow */
1162 ppc64_elf_unhandled_reloc, /* special_function */
1163 "R_PPC64_GOT16_DS", /* name */
1164 FALSE, /* partial_inplace */
1165 0, /* src_mask */
1166 0xfffc, /* dst_mask */
1167 FALSE), /* pcrel_offset */
1168
1169 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1170 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1171 0, /* rightshift */
1172 1, /* size (0 = byte, 1 = short, 2 = long) */
1173 16, /* bitsize */
1174 FALSE, /* pc_relative */
1175 0, /* bitpos */
1176 complain_overflow_dont, /* complain_on_overflow */
1177 ppc64_elf_unhandled_reloc, /* special_function */
1178 "R_PPC64_GOT16_LO_DS", /* name */
1179 FALSE, /* partial_inplace */
1180 0, /* src_mask */
1181 0xfffc, /* dst_mask */
1182 FALSE), /* pcrel_offset */
1183
1184 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1185 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1186 0, /* rightshift */
1187 1, /* size (0 = byte, 1 = short, 2 = long) */
1188 16, /* bitsize */
1189 FALSE, /* pc_relative */
1190 0, /* bitpos */
1191 complain_overflow_dont, /* complain_on_overflow */
1192 ppc64_elf_unhandled_reloc, /* special_function */
1193 "R_PPC64_PLT16_LO_DS", /* name */
1194 FALSE, /* partial_inplace */
1195 0, /* src_mask */
1196 0xfffc, /* dst_mask */
1197 FALSE), /* pcrel_offset */
1198
1199 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1200 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1201 0, /* rightshift */
1202 1, /* size (0 = byte, 1 = short, 2 = long) */
1203 16, /* bitsize */
1204 FALSE, /* pc_relative */
1205 0, /* bitpos */
1206 complain_overflow_signed, /* complain_on_overflow */
1207 ppc64_elf_sectoff_reloc, /* special_function */
1208 "R_PPC64_SECTOFF_DS", /* name */
1209 FALSE, /* partial_inplace */
1210 0, /* src_mask */
1211 0xfffc, /* dst_mask */
1212 FALSE), /* pcrel_offset */
1213
1214 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1215 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1216 0, /* rightshift */
1217 1, /* size (0 = byte, 1 = short, 2 = long) */
1218 16, /* bitsize */
1219 FALSE, /* pc_relative */
1220 0, /* bitpos */
1221 complain_overflow_dont, /* complain_on_overflow */
1222 ppc64_elf_sectoff_reloc, /* special_function */
1223 "R_PPC64_SECTOFF_LO_DS",/* name */
1224 FALSE, /* partial_inplace */
1225 0, /* src_mask */
1226 0xfffc, /* dst_mask */
1227 FALSE), /* pcrel_offset */
1228
1229 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1230 HOWTO (R_PPC64_TOC16_DS, /* type */
1231 0, /* rightshift */
1232 1, /* size (0 = byte, 1 = short, 2 = long) */
1233 16, /* bitsize */
1234 FALSE, /* pc_relative */
1235 0, /* bitpos */
1236 complain_overflow_signed, /* complain_on_overflow */
1237 ppc64_elf_toc_reloc, /* special_function */
1238 "R_PPC64_TOC16_DS", /* name */
1239 FALSE, /* partial_inplace */
1240 0, /* src_mask */
1241 0xfffc, /* dst_mask */
1242 FALSE), /* pcrel_offset */
1243
1244 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1245 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1246 0, /* rightshift */
1247 1, /* size (0 = byte, 1 = short, 2 = long) */
1248 16, /* bitsize */
1249 FALSE, /* pc_relative */
1250 0, /* bitpos */
1251 complain_overflow_dont, /* complain_on_overflow */
1252 ppc64_elf_toc_reloc, /* special_function */
1253 "R_PPC64_TOC16_LO_DS", /* name */
1254 FALSE, /* partial_inplace */
1255 0, /* src_mask */
1256 0xfffc, /* dst_mask */
1257 FALSE), /* pcrel_offset */
1258
1259 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1260 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1261 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1262 0, /* rightshift */
1263 1, /* size (0 = byte, 1 = short, 2 = long) */
1264 16, /* bitsize */
1265 FALSE, /* pc_relative */
1266 0, /* bitpos */
1267 complain_overflow_signed, /* complain_on_overflow */
1268 ppc64_elf_unhandled_reloc, /* special_function */
1269 "R_PPC64_PLTGOT16_DS", /* name */
1270 FALSE, /* partial_inplace */
1271 0, /* src_mask */
1272 0xfffc, /* dst_mask */
1273 FALSE), /* pcrel_offset */
1274
1275 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1276 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1277 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1278 0, /* rightshift */
1279 1, /* size (0 = byte, 1 = short, 2 = long) */
1280 16, /* bitsize */
1281 FALSE, /* pc_relative */
1282 0, /* bitpos */
1283 complain_overflow_dont, /* complain_on_overflow */
1284 ppc64_elf_unhandled_reloc, /* special_function */
1285 "R_PPC64_PLTGOT16_LO_DS",/* name */
1286 FALSE, /* partial_inplace */
1287 0, /* src_mask */
1288 0xfffc, /* dst_mask */
1289 FALSE), /* pcrel_offset */
1290
1291 /* Marker relocs for TLS. */
1292 HOWTO (R_PPC64_TLS,
1293 0, /* rightshift */
1294 2, /* size (0 = byte, 1 = short, 2 = long) */
1295 32, /* bitsize */
1296 FALSE, /* pc_relative */
1297 0, /* bitpos */
1298 complain_overflow_dont, /* complain_on_overflow */
1299 bfd_elf_generic_reloc, /* special_function */
1300 "R_PPC64_TLS", /* name */
1301 FALSE, /* partial_inplace */
1302 0, /* src_mask */
1303 0, /* dst_mask */
1304 FALSE), /* pcrel_offset */
1305
1306 HOWTO (R_PPC64_TLSGD,
1307 0, /* rightshift */
1308 2, /* size (0 = byte, 1 = short, 2 = long) */
1309 32, /* bitsize */
1310 FALSE, /* pc_relative */
1311 0, /* bitpos */
1312 complain_overflow_dont, /* complain_on_overflow */
1313 bfd_elf_generic_reloc, /* special_function */
1314 "R_PPC64_TLSGD", /* name */
1315 FALSE, /* partial_inplace */
1316 0, /* src_mask */
1317 0, /* dst_mask */
1318 FALSE), /* pcrel_offset */
1319
1320 HOWTO (R_PPC64_TLSLD,
1321 0, /* rightshift */
1322 2, /* size (0 = byte, 1 = short, 2 = long) */
1323 32, /* bitsize */
1324 FALSE, /* pc_relative */
1325 0, /* bitpos */
1326 complain_overflow_dont, /* complain_on_overflow */
1327 bfd_elf_generic_reloc, /* special_function */
1328 "R_PPC64_TLSLD", /* name */
1329 FALSE, /* partial_inplace */
1330 0, /* src_mask */
1331 0, /* dst_mask */
1332 FALSE), /* pcrel_offset */
1333
1334 HOWTO (R_PPC64_TOCSAVE,
1335 0, /* rightshift */
1336 2, /* size (0 = byte, 1 = short, 2 = long) */
1337 32, /* bitsize */
1338 FALSE, /* pc_relative */
1339 0, /* bitpos */
1340 complain_overflow_dont, /* complain_on_overflow */
1341 bfd_elf_generic_reloc, /* special_function */
1342 "R_PPC64_TOCSAVE", /* name */
1343 FALSE, /* partial_inplace */
1344 0, /* src_mask */
1345 0, /* dst_mask */
1346 FALSE), /* pcrel_offset */
1347
1348 /* Computes the load module index of the load module that contains the
1349 definition of its TLS sym. */
1350 HOWTO (R_PPC64_DTPMOD64,
1351 0, /* rightshift */
1352 4, /* size (0 = byte, 1 = short, 2 = long) */
1353 64, /* bitsize */
1354 FALSE, /* pc_relative */
1355 0, /* bitpos */
1356 complain_overflow_dont, /* complain_on_overflow */
1357 ppc64_elf_unhandled_reloc, /* special_function */
1358 "R_PPC64_DTPMOD64", /* name */
1359 FALSE, /* partial_inplace */
1360 0, /* src_mask */
1361 ONES (64), /* dst_mask */
1362 FALSE), /* pcrel_offset */
1363
1364 /* Computes a dtv-relative displacement, the difference between the value
1365 of sym+add and the base address of the thread-local storage block that
1366 contains the definition of sym, minus 0x8000. */
1367 HOWTO (R_PPC64_DTPREL64,
1368 0, /* rightshift */
1369 4, /* size (0 = byte, 1 = short, 2 = long) */
1370 64, /* bitsize */
1371 FALSE, /* pc_relative */
1372 0, /* bitpos */
1373 complain_overflow_dont, /* complain_on_overflow */
1374 ppc64_elf_unhandled_reloc, /* special_function */
1375 "R_PPC64_DTPREL64", /* name */
1376 FALSE, /* partial_inplace */
1377 0, /* src_mask */
1378 ONES (64), /* dst_mask */
1379 FALSE), /* pcrel_offset */
1380
1381 /* A 16 bit dtprel reloc. */
1382 HOWTO (R_PPC64_DTPREL16,
1383 0, /* rightshift */
1384 1, /* size (0 = byte, 1 = short, 2 = long) */
1385 16, /* bitsize */
1386 FALSE, /* pc_relative */
1387 0, /* bitpos */
1388 complain_overflow_signed, /* complain_on_overflow */
1389 ppc64_elf_unhandled_reloc, /* special_function */
1390 "R_PPC64_DTPREL16", /* name */
1391 FALSE, /* partial_inplace */
1392 0, /* src_mask */
1393 0xffff, /* dst_mask */
1394 FALSE), /* pcrel_offset */
1395
1396 /* Like DTPREL16, but no overflow. */
1397 HOWTO (R_PPC64_DTPREL16_LO,
1398 0, /* rightshift */
1399 1, /* size (0 = byte, 1 = short, 2 = long) */
1400 16, /* bitsize */
1401 FALSE, /* pc_relative */
1402 0, /* bitpos */
1403 complain_overflow_dont, /* complain_on_overflow */
1404 ppc64_elf_unhandled_reloc, /* special_function */
1405 "R_PPC64_DTPREL16_LO", /* name */
1406 FALSE, /* partial_inplace */
1407 0, /* src_mask */
1408 0xffff, /* dst_mask */
1409 FALSE), /* pcrel_offset */
1410
1411 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1412 HOWTO (R_PPC64_DTPREL16_HI,
1413 16, /* rightshift */
1414 1, /* size (0 = byte, 1 = short, 2 = long) */
1415 16, /* bitsize */
1416 FALSE, /* pc_relative */
1417 0, /* bitpos */
1418 complain_overflow_signed, /* complain_on_overflow */
1419 ppc64_elf_unhandled_reloc, /* special_function */
1420 "R_PPC64_DTPREL16_HI", /* name */
1421 FALSE, /* partial_inplace */
1422 0, /* src_mask */
1423 0xffff, /* dst_mask */
1424 FALSE), /* pcrel_offset */
1425
1426 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1427 HOWTO (R_PPC64_DTPREL16_HA,
1428 16, /* rightshift */
1429 1, /* size (0 = byte, 1 = short, 2 = long) */
1430 16, /* bitsize */
1431 FALSE, /* pc_relative */
1432 0, /* bitpos */
1433 complain_overflow_signed, /* complain_on_overflow */
1434 ppc64_elf_unhandled_reloc, /* special_function */
1435 "R_PPC64_DTPREL16_HA", /* name */
1436 FALSE, /* partial_inplace */
1437 0, /* src_mask */
1438 0xffff, /* dst_mask */
1439 FALSE), /* pcrel_offset */
1440
1441 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1442 HOWTO (R_PPC64_DTPREL16_HIGHER,
1443 32, /* rightshift */
1444 1, /* size (0 = byte, 1 = short, 2 = long) */
1445 16, /* bitsize */
1446 FALSE, /* pc_relative */
1447 0, /* bitpos */
1448 complain_overflow_dont, /* complain_on_overflow */
1449 ppc64_elf_unhandled_reloc, /* special_function */
1450 "R_PPC64_DTPREL16_HIGHER", /* name */
1451 FALSE, /* partial_inplace */
1452 0, /* src_mask */
1453 0xffff, /* dst_mask */
1454 FALSE), /* pcrel_offset */
1455
1456 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1457 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1458 32, /* rightshift */
1459 1, /* size (0 = byte, 1 = short, 2 = long) */
1460 16, /* bitsize */
1461 FALSE, /* pc_relative */
1462 0, /* bitpos */
1463 complain_overflow_dont, /* complain_on_overflow */
1464 ppc64_elf_unhandled_reloc, /* special_function */
1465 "R_PPC64_DTPREL16_HIGHERA", /* name */
1466 FALSE, /* partial_inplace */
1467 0, /* src_mask */
1468 0xffff, /* dst_mask */
1469 FALSE), /* pcrel_offset */
1470
1471 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1472 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1473 48, /* rightshift */
1474 1, /* size (0 = byte, 1 = short, 2 = long) */
1475 16, /* bitsize */
1476 FALSE, /* pc_relative */
1477 0, /* bitpos */
1478 complain_overflow_dont, /* complain_on_overflow */
1479 ppc64_elf_unhandled_reloc, /* special_function */
1480 "R_PPC64_DTPREL16_HIGHEST", /* name */
1481 FALSE, /* partial_inplace */
1482 0, /* src_mask */
1483 0xffff, /* dst_mask */
1484 FALSE), /* pcrel_offset */
1485
1486 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1487 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1488 48, /* rightshift */
1489 1, /* size (0 = byte, 1 = short, 2 = long) */
1490 16, /* bitsize */
1491 FALSE, /* pc_relative */
1492 0, /* bitpos */
1493 complain_overflow_dont, /* complain_on_overflow */
1494 ppc64_elf_unhandled_reloc, /* special_function */
1495 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1496 FALSE, /* partial_inplace */
1497 0, /* src_mask */
1498 0xffff, /* dst_mask */
1499 FALSE), /* pcrel_offset */
1500
1501 /* Like DTPREL16, but for insns with a DS field. */
1502 HOWTO (R_PPC64_DTPREL16_DS,
1503 0, /* rightshift */
1504 1, /* size (0 = byte, 1 = short, 2 = long) */
1505 16, /* bitsize */
1506 FALSE, /* pc_relative */
1507 0, /* bitpos */
1508 complain_overflow_signed, /* complain_on_overflow */
1509 ppc64_elf_unhandled_reloc, /* special_function */
1510 "R_PPC64_DTPREL16_DS", /* name */
1511 FALSE, /* partial_inplace */
1512 0, /* src_mask */
1513 0xfffc, /* dst_mask */
1514 FALSE), /* pcrel_offset */
1515
1516 /* Like DTPREL16_DS, but no overflow. */
1517 HOWTO (R_PPC64_DTPREL16_LO_DS,
1518 0, /* rightshift */
1519 1, /* size (0 = byte, 1 = short, 2 = long) */
1520 16, /* bitsize */
1521 FALSE, /* pc_relative */
1522 0, /* bitpos */
1523 complain_overflow_dont, /* complain_on_overflow */
1524 ppc64_elf_unhandled_reloc, /* special_function */
1525 "R_PPC64_DTPREL16_LO_DS", /* name */
1526 FALSE, /* partial_inplace */
1527 0, /* src_mask */
1528 0xfffc, /* dst_mask */
1529 FALSE), /* pcrel_offset */
1530
1531 /* Computes a tp-relative displacement, the difference between the value of
1532 sym+add and the value of the thread pointer (r13). */
1533 HOWTO (R_PPC64_TPREL64,
1534 0, /* rightshift */
1535 4, /* size (0 = byte, 1 = short, 2 = long) */
1536 64, /* bitsize */
1537 FALSE, /* pc_relative */
1538 0, /* bitpos */
1539 complain_overflow_dont, /* complain_on_overflow */
1540 ppc64_elf_unhandled_reloc, /* special_function */
1541 "R_PPC64_TPREL64", /* name */
1542 FALSE, /* partial_inplace */
1543 0, /* src_mask */
1544 ONES (64), /* dst_mask */
1545 FALSE), /* pcrel_offset */
1546
1547 /* A 16 bit tprel reloc. */
1548 HOWTO (R_PPC64_TPREL16,
1549 0, /* rightshift */
1550 1, /* size (0 = byte, 1 = short, 2 = long) */
1551 16, /* bitsize */
1552 FALSE, /* pc_relative */
1553 0, /* bitpos */
1554 complain_overflow_signed, /* complain_on_overflow */
1555 ppc64_elf_unhandled_reloc, /* special_function */
1556 "R_PPC64_TPREL16", /* name */
1557 FALSE, /* partial_inplace */
1558 0, /* src_mask */
1559 0xffff, /* dst_mask */
1560 FALSE), /* pcrel_offset */
1561
1562 /* Like TPREL16, but no overflow. */
1563 HOWTO (R_PPC64_TPREL16_LO,
1564 0, /* rightshift */
1565 1, /* size (0 = byte, 1 = short, 2 = long) */
1566 16, /* bitsize */
1567 FALSE, /* pc_relative */
1568 0, /* bitpos */
1569 complain_overflow_dont, /* complain_on_overflow */
1570 ppc64_elf_unhandled_reloc, /* special_function */
1571 "R_PPC64_TPREL16_LO", /* name */
1572 FALSE, /* partial_inplace */
1573 0, /* src_mask */
1574 0xffff, /* dst_mask */
1575 FALSE), /* pcrel_offset */
1576
1577 /* Like TPREL16_LO, but next higher group of 16 bits. */
1578 HOWTO (R_PPC64_TPREL16_HI,
1579 16, /* rightshift */
1580 1, /* size (0 = byte, 1 = short, 2 = long) */
1581 16, /* bitsize */
1582 FALSE, /* pc_relative */
1583 0, /* bitpos */
1584 complain_overflow_signed, /* complain_on_overflow */
1585 ppc64_elf_unhandled_reloc, /* special_function */
1586 "R_PPC64_TPREL16_HI", /* name */
1587 FALSE, /* partial_inplace */
1588 0, /* src_mask */
1589 0xffff, /* dst_mask */
1590 FALSE), /* pcrel_offset */
1591
1592 /* Like TPREL16_HI, but adjust for low 16 bits. */
1593 HOWTO (R_PPC64_TPREL16_HA,
1594 16, /* rightshift */
1595 1, /* size (0 = byte, 1 = short, 2 = long) */
1596 16, /* bitsize */
1597 FALSE, /* pc_relative */
1598 0, /* bitpos */
1599 complain_overflow_signed, /* complain_on_overflow */
1600 ppc64_elf_unhandled_reloc, /* special_function */
1601 "R_PPC64_TPREL16_HA", /* name */
1602 FALSE, /* partial_inplace */
1603 0, /* src_mask */
1604 0xffff, /* dst_mask */
1605 FALSE), /* pcrel_offset */
1606
1607 /* Like TPREL16_HI, but next higher group of 16 bits. */
1608 HOWTO (R_PPC64_TPREL16_HIGHER,
1609 32, /* rightshift */
1610 1, /* size (0 = byte, 1 = short, 2 = long) */
1611 16, /* bitsize */
1612 FALSE, /* pc_relative */
1613 0, /* bitpos */
1614 complain_overflow_dont, /* complain_on_overflow */
1615 ppc64_elf_unhandled_reloc, /* special_function */
1616 "R_PPC64_TPREL16_HIGHER", /* name */
1617 FALSE, /* partial_inplace */
1618 0, /* src_mask */
1619 0xffff, /* dst_mask */
1620 FALSE), /* pcrel_offset */
1621
1622 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1623 HOWTO (R_PPC64_TPREL16_HIGHERA,
1624 32, /* rightshift */
1625 1, /* size (0 = byte, 1 = short, 2 = long) */
1626 16, /* bitsize */
1627 FALSE, /* pc_relative */
1628 0, /* bitpos */
1629 complain_overflow_dont, /* complain_on_overflow */
1630 ppc64_elf_unhandled_reloc, /* special_function */
1631 "R_PPC64_TPREL16_HIGHERA", /* name */
1632 FALSE, /* partial_inplace */
1633 0, /* src_mask */
1634 0xffff, /* dst_mask */
1635 FALSE), /* pcrel_offset */
1636
1637 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1638 HOWTO (R_PPC64_TPREL16_HIGHEST,
1639 48, /* rightshift */
1640 1, /* size (0 = byte, 1 = short, 2 = long) */
1641 16, /* bitsize */
1642 FALSE, /* pc_relative */
1643 0, /* bitpos */
1644 complain_overflow_dont, /* complain_on_overflow */
1645 ppc64_elf_unhandled_reloc, /* special_function */
1646 "R_PPC64_TPREL16_HIGHEST", /* name */
1647 FALSE, /* partial_inplace */
1648 0, /* src_mask */
1649 0xffff, /* dst_mask */
1650 FALSE), /* pcrel_offset */
1651
1652 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1653 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1654 48, /* rightshift */
1655 1, /* size (0 = byte, 1 = short, 2 = long) */
1656 16, /* bitsize */
1657 FALSE, /* pc_relative */
1658 0, /* bitpos */
1659 complain_overflow_dont, /* complain_on_overflow */
1660 ppc64_elf_unhandled_reloc, /* special_function */
1661 "R_PPC64_TPREL16_HIGHESTA", /* name */
1662 FALSE, /* partial_inplace */
1663 0, /* src_mask */
1664 0xffff, /* dst_mask */
1665 FALSE), /* pcrel_offset */
1666
1667 /* Like TPREL16, but for insns with a DS field. */
1668 HOWTO (R_PPC64_TPREL16_DS,
1669 0, /* rightshift */
1670 1, /* size (0 = byte, 1 = short, 2 = long) */
1671 16, /* bitsize */
1672 FALSE, /* pc_relative */
1673 0, /* bitpos */
1674 complain_overflow_signed, /* complain_on_overflow */
1675 ppc64_elf_unhandled_reloc, /* special_function */
1676 "R_PPC64_TPREL16_DS", /* name */
1677 FALSE, /* partial_inplace */
1678 0, /* src_mask */
1679 0xfffc, /* dst_mask */
1680 FALSE), /* pcrel_offset */
1681
1682 /* Like TPREL16_DS, but no overflow. */
1683 HOWTO (R_PPC64_TPREL16_LO_DS,
1684 0, /* rightshift */
1685 1, /* size (0 = byte, 1 = short, 2 = long) */
1686 16, /* bitsize */
1687 FALSE, /* pc_relative */
1688 0, /* bitpos */
1689 complain_overflow_dont, /* complain_on_overflow */
1690 ppc64_elf_unhandled_reloc, /* special_function */
1691 "R_PPC64_TPREL16_LO_DS", /* name */
1692 FALSE, /* partial_inplace */
1693 0, /* src_mask */
1694 0xfffc, /* dst_mask */
1695 FALSE), /* pcrel_offset */
1696
1697 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1698 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1699 to the first entry relative to the TOC base (r2). */
1700 HOWTO (R_PPC64_GOT_TLSGD16,
1701 0, /* rightshift */
1702 1, /* size (0 = byte, 1 = short, 2 = long) */
1703 16, /* bitsize */
1704 FALSE, /* pc_relative */
1705 0, /* bitpos */
1706 complain_overflow_signed, /* complain_on_overflow */
1707 ppc64_elf_unhandled_reloc, /* special_function */
1708 "R_PPC64_GOT_TLSGD16", /* name */
1709 FALSE, /* partial_inplace */
1710 0, /* src_mask */
1711 0xffff, /* dst_mask */
1712 FALSE), /* pcrel_offset */
1713
1714 /* Like GOT_TLSGD16, but no overflow. */
1715 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1716 0, /* rightshift */
1717 1, /* size (0 = byte, 1 = short, 2 = long) */
1718 16, /* bitsize */
1719 FALSE, /* pc_relative */
1720 0, /* bitpos */
1721 complain_overflow_dont, /* complain_on_overflow */
1722 ppc64_elf_unhandled_reloc, /* special_function */
1723 "R_PPC64_GOT_TLSGD16_LO", /* name */
1724 FALSE, /* partial_inplace */
1725 0, /* src_mask */
1726 0xffff, /* dst_mask */
1727 FALSE), /* pcrel_offset */
1728
1729 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1730 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1731 16, /* rightshift */
1732 1, /* size (0 = byte, 1 = short, 2 = long) */
1733 16, /* bitsize */
1734 FALSE, /* pc_relative */
1735 0, /* bitpos */
1736 complain_overflow_signed, /* complain_on_overflow */
1737 ppc64_elf_unhandled_reloc, /* special_function */
1738 "R_PPC64_GOT_TLSGD16_HI", /* name */
1739 FALSE, /* partial_inplace */
1740 0, /* src_mask */
1741 0xffff, /* dst_mask */
1742 FALSE), /* pcrel_offset */
1743
1744 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1745 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1746 16, /* rightshift */
1747 1, /* size (0 = byte, 1 = short, 2 = long) */
1748 16, /* bitsize */
1749 FALSE, /* pc_relative */
1750 0, /* bitpos */
1751 complain_overflow_signed, /* complain_on_overflow */
1752 ppc64_elf_unhandled_reloc, /* special_function */
1753 "R_PPC64_GOT_TLSGD16_HA", /* name */
1754 FALSE, /* partial_inplace */
1755 0, /* src_mask */
1756 0xffff, /* dst_mask */
1757 FALSE), /* pcrel_offset */
1758
1759 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1760 with values (sym+add)@dtpmod and zero, and computes the offset to the
1761 first entry relative to the TOC base (r2). */
1762 HOWTO (R_PPC64_GOT_TLSLD16,
1763 0, /* rightshift */
1764 1, /* size (0 = byte, 1 = short, 2 = long) */
1765 16, /* bitsize */
1766 FALSE, /* pc_relative */
1767 0, /* bitpos */
1768 complain_overflow_signed, /* complain_on_overflow */
1769 ppc64_elf_unhandled_reloc, /* special_function */
1770 "R_PPC64_GOT_TLSLD16", /* name */
1771 FALSE, /* partial_inplace */
1772 0, /* src_mask */
1773 0xffff, /* dst_mask */
1774 FALSE), /* pcrel_offset */
1775
1776 /* Like GOT_TLSLD16, but no overflow. */
1777 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1778 0, /* rightshift */
1779 1, /* size (0 = byte, 1 = short, 2 = long) */
1780 16, /* bitsize */
1781 FALSE, /* pc_relative */
1782 0, /* bitpos */
1783 complain_overflow_dont, /* complain_on_overflow */
1784 ppc64_elf_unhandled_reloc, /* special_function */
1785 "R_PPC64_GOT_TLSLD16_LO", /* name */
1786 FALSE, /* partial_inplace */
1787 0, /* src_mask */
1788 0xffff, /* dst_mask */
1789 FALSE), /* pcrel_offset */
1790
1791 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1792 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1793 16, /* rightshift */
1794 1, /* size (0 = byte, 1 = short, 2 = long) */
1795 16, /* bitsize */
1796 FALSE, /* pc_relative */
1797 0, /* bitpos */
1798 complain_overflow_signed, /* complain_on_overflow */
1799 ppc64_elf_unhandled_reloc, /* special_function */
1800 "R_PPC64_GOT_TLSLD16_HI", /* name */
1801 FALSE, /* partial_inplace */
1802 0, /* src_mask */
1803 0xffff, /* dst_mask */
1804 FALSE), /* pcrel_offset */
1805
1806 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1807 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1808 16, /* rightshift */
1809 1, /* size (0 = byte, 1 = short, 2 = long) */
1810 16, /* bitsize */
1811 FALSE, /* pc_relative */
1812 0, /* bitpos */
1813 complain_overflow_signed, /* complain_on_overflow */
1814 ppc64_elf_unhandled_reloc, /* special_function */
1815 "R_PPC64_GOT_TLSLD16_HA", /* name */
1816 FALSE, /* partial_inplace */
1817 0, /* src_mask */
1818 0xffff, /* dst_mask */
1819 FALSE), /* pcrel_offset */
1820
1821 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1822 the offset to the entry relative to the TOC base (r2). */
1823 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1824 0, /* rightshift */
1825 1, /* size (0 = byte, 1 = short, 2 = long) */
1826 16, /* bitsize */
1827 FALSE, /* pc_relative */
1828 0, /* bitpos */
1829 complain_overflow_signed, /* complain_on_overflow */
1830 ppc64_elf_unhandled_reloc, /* special_function */
1831 "R_PPC64_GOT_DTPREL16_DS", /* name */
1832 FALSE, /* partial_inplace */
1833 0, /* src_mask */
1834 0xfffc, /* dst_mask */
1835 FALSE), /* pcrel_offset */
1836
1837 /* Like GOT_DTPREL16_DS, but no overflow. */
1838 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1839 0, /* rightshift */
1840 1, /* size (0 = byte, 1 = short, 2 = long) */
1841 16, /* bitsize */
1842 FALSE, /* pc_relative */
1843 0, /* bitpos */
1844 complain_overflow_dont, /* complain_on_overflow */
1845 ppc64_elf_unhandled_reloc, /* special_function */
1846 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1847 FALSE, /* partial_inplace */
1848 0, /* src_mask */
1849 0xfffc, /* dst_mask */
1850 FALSE), /* pcrel_offset */
1851
1852 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1853 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1854 16, /* rightshift */
1855 1, /* size (0 = byte, 1 = short, 2 = long) */
1856 16, /* bitsize */
1857 FALSE, /* pc_relative */
1858 0, /* bitpos */
1859 complain_overflow_signed, /* complain_on_overflow */
1860 ppc64_elf_unhandled_reloc, /* special_function */
1861 "R_PPC64_GOT_DTPREL16_HI", /* name */
1862 FALSE, /* partial_inplace */
1863 0, /* src_mask */
1864 0xffff, /* dst_mask */
1865 FALSE), /* pcrel_offset */
1866
1867 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1868 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1869 16, /* rightshift */
1870 1, /* size (0 = byte, 1 = short, 2 = long) */
1871 16, /* bitsize */
1872 FALSE, /* pc_relative */
1873 0, /* bitpos */
1874 complain_overflow_signed, /* complain_on_overflow */
1875 ppc64_elf_unhandled_reloc, /* special_function */
1876 "R_PPC64_GOT_DTPREL16_HA", /* name */
1877 FALSE, /* partial_inplace */
1878 0, /* src_mask */
1879 0xffff, /* dst_mask */
1880 FALSE), /* pcrel_offset */
1881
1882 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1883 offset to the entry relative to the TOC base (r2). */
1884 HOWTO (R_PPC64_GOT_TPREL16_DS,
1885 0, /* rightshift */
1886 1, /* size (0 = byte, 1 = short, 2 = long) */
1887 16, /* bitsize */
1888 FALSE, /* pc_relative */
1889 0, /* bitpos */
1890 complain_overflow_signed, /* complain_on_overflow */
1891 ppc64_elf_unhandled_reloc, /* special_function */
1892 "R_PPC64_GOT_TPREL16_DS", /* name */
1893 FALSE, /* partial_inplace */
1894 0, /* src_mask */
1895 0xfffc, /* dst_mask */
1896 FALSE), /* pcrel_offset */
1897
1898 /* Like GOT_TPREL16_DS, but no overflow. */
1899 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1900 0, /* rightshift */
1901 1, /* size (0 = byte, 1 = short, 2 = long) */
1902 16, /* bitsize */
1903 FALSE, /* pc_relative */
1904 0, /* bitpos */
1905 complain_overflow_dont, /* complain_on_overflow */
1906 ppc64_elf_unhandled_reloc, /* special_function */
1907 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1908 FALSE, /* partial_inplace */
1909 0, /* src_mask */
1910 0xfffc, /* dst_mask */
1911 FALSE), /* pcrel_offset */
1912
1913 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1914 HOWTO (R_PPC64_GOT_TPREL16_HI,
1915 16, /* rightshift */
1916 1, /* size (0 = byte, 1 = short, 2 = long) */
1917 16, /* bitsize */
1918 FALSE, /* pc_relative */
1919 0, /* bitpos */
1920 complain_overflow_signed, /* complain_on_overflow */
1921 ppc64_elf_unhandled_reloc, /* special_function */
1922 "R_PPC64_GOT_TPREL16_HI", /* name */
1923 FALSE, /* partial_inplace */
1924 0, /* src_mask */
1925 0xffff, /* dst_mask */
1926 FALSE), /* pcrel_offset */
1927
1928 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1929 HOWTO (R_PPC64_GOT_TPREL16_HA,
1930 16, /* rightshift */
1931 1, /* size (0 = byte, 1 = short, 2 = long) */
1932 16, /* bitsize */
1933 FALSE, /* pc_relative */
1934 0, /* bitpos */
1935 complain_overflow_signed, /* complain_on_overflow */
1936 ppc64_elf_unhandled_reloc, /* special_function */
1937 "R_PPC64_GOT_TPREL16_HA", /* name */
1938 FALSE, /* partial_inplace */
1939 0, /* src_mask */
1940 0xffff, /* dst_mask */
1941 FALSE), /* pcrel_offset */
1942
1943 HOWTO (R_PPC64_JMP_IREL, /* type */
1944 0, /* rightshift */
1945 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1946 0, /* bitsize */
1947 FALSE, /* pc_relative */
1948 0, /* bitpos */
1949 complain_overflow_dont, /* complain_on_overflow */
1950 ppc64_elf_unhandled_reloc, /* special_function */
1951 "R_PPC64_JMP_IREL", /* name */
1952 FALSE, /* partial_inplace */
1953 0, /* src_mask */
1954 0, /* dst_mask */
1955 FALSE), /* pcrel_offset */
1956
1957 HOWTO (R_PPC64_IRELATIVE, /* type */
1958 0, /* rightshift */
1959 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1960 64, /* bitsize */
1961 FALSE, /* pc_relative */
1962 0, /* bitpos */
1963 complain_overflow_dont, /* complain_on_overflow */
1964 bfd_elf_generic_reloc, /* special_function */
1965 "R_PPC64_IRELATIVE", /* name */
1966 FALSE, /* partial_inplace */
1967 0, /* src_mask */
1968 ONES (64), /* dst_mask */
1969 FALSE), /* pcrel_offset */
1970
1971 /* A 16 bit relative relocation. */
1972 HOWTO (R_PPC64_REL16, /* type */
1973 0, /* rightshift */
1974 1, /* size (0 = byte, 1 = short, 2 = long) */
1975 16, /* bitsize */
1976 TRUE, /* pc_relative */
1977 0, /* bitpos */
1978 complain_overflow_signed, /* complain_on_overflow */
1979 bfd_elf_generic_reloc, /* special_function */
1980 "R_PPC64_REL16", /* name */
1981 FALSE, /* partial_inplace */
1982 0, /* src_mask */
1983 0xffff, /* dst_mask */
1984 TRUE), /* pcrel_offset */
1985
1986 /* A 16 bit relative relocation without overflow. */
1987 HOWTO (R_PPC64_REL16_LO, /* type */
1988 0, /* rightshift */
1989 1, /* size (0 = byte, 1 = short, 2 = long) */
1990 16, /* bitsize */
1991 TRUE, /* pc_relative */
1992 0, /* bitpos */
1993 complain_overflow_dont,/* complain_on_overflow */
1994 bfd_elf_generic_reloc, /* special_function */
1995 "R_PPC64_REL16_LO", /* name */
1996 FALSE, /* partial_inplace */
1997 0, /* src_mask */
1998 0xffff, /* dst_mask */
1999 TRUE), /* pcrel_offset */
2000
2001 /* The high order 16 bits of a relative address. */
2002 HOWTO (R_PPC64_REL16_HI, /* type */
2003 16, /* rightshift */
2004 1, /* size (0 = byte, 1 = short, 2 = long) */
2005 16, /* bitsize */
2006 TRUE, /* pc_relative */
2007 0, /* bitpos */
2008 complain_overflow_signed, /* complain_on_overflow */
2009 bfd_elf_generic_reloc, /* special_function */
2010 "R_PPC64_REL16_HI", /* name */
2011 FALSE, /* partial_inplace */
2012 0, /* src_mask */
2013 0xffff, /* dst_mask */
2014 TRUE), /* pcrel_offset */
2015
2016 /* The high order 16 bits of a relative address, plus 1 if the contents of
2017 the low 16 bits, treated as a signed number, is negative. */
2018 HOWTO (R_PPC64_REL16_HA, /* type */
2019 16, /* rightshift */
2020 1, /* size (0 = byte, 1 = short, 2 = long) */
2021 16, /* bitsize */
2022 TRUE, /* pc_relative */
2023 0, /* bitpos */
2024 complain_overflow_signed, /* complain_on_overflow */
2025 ppc64_elf_ha_reloc, /* special_function */
2026 "R_PPC64_REL16_HA", /* name */
2027 FALSE, /* partial_inplace */
2028 0, /* src_mask */
2029 0xffff, /* dst_mask */
2030 TRUE), /* pcrel_offset */
2031
2032 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2033 HOWTO (R_PPC64_REL16DX_HA, /* type */
2034 16, /* rightshift */
2035 2, /* size (0 = byte, 1 = short, 2 = long) */
2036 16, /* bitsize */
2037 TRUE, /* pc_relative */
2038 0, /* bitpos */
2039 complain_overflow_signed, /* complain_on_overflow */
2040 ppc64_elf_ha_reloc, /* special_function */
2041 "R_PPC64_REL16DX_HA", /* name */
2042 FALSE, /* partial_inplace */
2043 0, /* src_mask */
2044 0x1fffc1, /* dst_mask */
2045 TRUE), /* pcrel_offset */
2046
2047 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2048 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2049 16, /* rightshift */
2050 1, /* size (0 = byte, 1 = short, 2 = long) */
2051 16, /* bitsize */
2052 FALSE, /* pc_relative */
2053 0, /* bitpos */
2054 complain_overflow_dont, /* complain_on_overflow */
2055 bfd_elf_generic_reloc, /* special_function */
2056 "R_PPC64_ADDR16_HIGH", /* name */
2057 FALSE, /* partial_inplace */
2058 0, /* src_mask */
2059 0xffff, /* dst_mask */
2060 FALSE), /* pcrel_offset */
2061
2062 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2063 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2064 16, /* rightshift */
2065 1, /* size (0 = byte, 1 = short, 2 = long) */
2066 16, /* bitsize */
2067 FALSE, /* pc_relative */
2068 0, /* bitpos */
2069 complain_overflow_dont, /* complain_on_overflow */
2070 ppc64_elf_ha_reloc, /* special_function */
2071 "R_PPC64_ADDR16_HIGHA", /* name */
2072 FALSE, /* partial_inplace */
2073 0, /* src_mask */
2074 0xffff, /* dst_mask */
2075 FALSE), /* pcrel_offset */
2076
2077 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2078 HOWTO (R_PPC64_DTPREL16_HIGH,
2079 16, /* rightshift */
2080 1, /* size (0 = byte, 1 = short, 2 = long) */
2081 16, /* bitsize */
2082 FALSE, /* pc_relative */
2083 0, /* bitpos */
2084 complain_overflow_dont, /* complain_on_overflow */
2085 ppc64_elf_unhandled_reloc, /* special_function */
2086 "R_PPC64_DTPREL16_HIGH", /* name */
2087 FALSE, /* partial_inplace */
2088 0, /* src_mask */
2089 0xffff, /* dst_mask */
2090 FALSE), /* pcrel_offset */
2091
2092 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2093 HOWTO (R_PPC64_DTPREL16_HIGHA,
2094 16, /* rightshift */
2095 1, /* size (0 = byte, 1 = short, 2 = long) */
2096 16, /* bitsize */
2097 FALSE, /* pc_relative */
2098 0, /* bitpos */
2099 complain_overflow_dont, /* complain_on_overflow */
2100 ppc64_elf_unhandled_reloc, /* special_function */
2101 "R_PPC64_DTPREL16_HIGHA", /* name */
2102 FALSE, /* partial_inplace */
2103 0, /* src_mask */
2104 0xffff, /* dst_mask */
2105 FALSE), /* pcrel_offset */
2106
2107 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2108 HOWTO (R_PPC64_TPREL16_HIGH,
2109 16, /* rightshift */
2110 1, /* size (0 = byte, 1 = short, 2 = long) */
2111 16, /* bitsize */
2112 FALSE, /* pc_relative */
2113 0, /* bitpos */
2114 complain_overflow_dont, /* complain_on_overflow */
2115 ppc64_elf_unhandled_reloc, /* special_function */
2116 "R_PPC64_TPREL16_HIGH", /* name */
2117 FALSE, /* partial_inplace */
2118 0, /* src_mask */
2119 0xffff, /* dst_mask */
2120 FALSE), /* pcrel_offset */
2121
2122 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2123 HOWTO (R_PPC64_TPREL16_HIGHA,
2124 16, /* rightshift */
2125 1, /* size (0 = byte, 1 = short, 2 = long) */
2126 16, /* bitsize */
2127 FALSE, /* pc_relative */
2128 0, /* bitpos */
2129 complain_overflow_dont, /* complain_on_overflow */
2130 ppc64_elf_unhandled_reloc, /* special_function */
2131 "R_PPC64_TPREL16_HIGHA", /* name */
2132 FALSE, /* partial_inplace */
2133 0, /* src_mask */
2134 0xffff, /* dst_mask */
2135 FALSE), /* pcrel_offset */
2136
2137 /* Marker reloc on ELFv2 large-model function entry. */
2138 HOWTO (R_PPC64_ENTRY,
2139 0, /* rightshift */
2140 2, /* size (0 = byte, 1 = short, 2 = long) */
2141 32, /* bitsize */
2142 FALSE, /* pc_relative */
2143 0, /* bitpos */
2144 complain_overflow_dont, /* complain_on_overflow */
2145 bfd_elf_generic_reloc, /* special_function */
2146 "R_PPC64_ENTRY", /* name */
2147 FALSE, /* partial_inplace */
2148 0, /* src_mask */
2149 0, /* dst_mask */
2150 FALSE), /* pcrel_offset */
2151
2152 /* Like ADDR64, but use local entry point of function. */
2153 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2154 0, /* rightshift */
2155 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2156 64, /* bitsize */
2157 FALSE, /* pc_relative */
2158 0, /* bitpos */
2159 complain_overflow_dont, /* complain_on_overflow */
2160 bfd_elf_generic_reloc, /* special_function */
2161 "R_PPC64_ADDR64_LOCAL", /* name */
2162 FALSE, /* partial_inplace */
2163 0, /* src_mask */
2164 ONES (64), /* dst_mask */
2165 FALSE), /* pcrel_offset */
2166
2167 /* GNU extension to record C++ vtable hierarchy. */
2168 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2169 0, /* rightshift */
2170 0, /* size (0 = byte, 1 = short, 2 = long) */
2171 0, /* bitsize */
2172 FALSE, /* pc_relative */
2173 0, /* bitpos */
2174 complain_overflow_dont, /* complain_on_overflow */
2175 NULL, /* special_function */
2176 "R_PPC64_GNU_VTINHERIT", /* name */
2177 FALSE, /* partial_inplace */
2178 0, /* src_mask */
2179 0, /* dst_mask */
2180 FALSE), /* pcrel_offset */
2181
2182 /* GNU extension to record C++ vtable member usage. */
2183 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2184 0, /* rightshift */
2185 0, /* size (0 = byte, 1 = short, 2 = long) */
2186 0, /* bitsize */
2187 FALSE, /* pc_relative */
2188 0, /* bitpos */
2189 complain_overflow_dont, /* complain_on_overflow */
2190 NULL, /* special_function */
2191 "R_PPC64_GNU_VTENTRY", /* name */
2192 FALSE, /* partial_inplace */
2193 0, /* src_mask */
2194 0, /* dst_mask */
2195 FALSE), /* pcrel_offset */
2196 };
2197
2198 \f
2199 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2200 be done. */
2201
2202 static void
2203 ppc_howto_init (void)
2204 {
2205 unsigned int i, type;
2206
2207 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2208 {
2209 type = ppc64_elf_howto_raw[i].type;
2210 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
2211 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2212 }
2213 }
2214
2215 static reloc_howto_type *
2216 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2217 bfd_reloc_code_real_type code)
2218 {
2219 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2220
2221 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2222 /* Initialize howto table if needed. */
2223 ppc_howto_init ();
2224
2225 switch (code)
2226 {
2227 default:
2228 return NULL;
2229
2230 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2231 break;
2232 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2233 break;
2234 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2235 break;
2236 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2237 break;
2238 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2239 break;
2240 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2241 break;
2242 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2243 break;
2244 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2245 break;
2246 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2247 break;
2248 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2249 break;
2250 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2251 break;
2252 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2253 break;
2254 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2255 break;
2256 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2257 break;
2258 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2259 break;
2260 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2261 break;
2262 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2263 break;
2264 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2265 break;
2266 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2267 break;
2268 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2269 break;
2270 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2271 break;
2272 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2273 break;
2274 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2275 break;
2276 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2277 break;
2278 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2279 break;
2280 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2281 break;
2282 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2283 break;
2284 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2285 break;
2286 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2287 break;
2288 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2289 break;
2290 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2291 break;
2292 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2293 break;
2294 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2295 break;
2296 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2297 break;
2298 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2299 break;
2300 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2301 break;
2302 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2303 break;
2304 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2305 break;
2306 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2307 break;
2308 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2309 break;
2310 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2311 break;
2312 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2313 break;
2314 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2315 break;
2316 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2317 break;
2318 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2319 break;
2320 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2321 break;
2322 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2323 break;
2324 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2325 break;
2326 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2327 break;
2328 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2329 break;
2330 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2331 break;
2332 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2333 break;
2334 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2335 break;
2336 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2337 break;
2338 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2339 break;
2340 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2341 break;
2342 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2343 break;
2344 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2345 break;
2346 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2347 break;
2348 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2349 break;
2350 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2351 break;
2352 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2353 break;
2354 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2355 break;
2356 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2357 break;
2358 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2359 break;
2360 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2361 break;
2362 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2363 break;
2364 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2365 break;
2366 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2367 break;
2368 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2369 break;
2370 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2371 break;
2372 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2373 break;
2374 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2375 break;
2376 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2377 break;
2378 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2379 break;
2380 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2381 break;
2382 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2383 break;
2384 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2385 break;
2386 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2387 break;
2388 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2389 break;
2390 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2391 break;
2392 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2393 break;
2394 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2395 break;
2396 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2397 break;
2398 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2399 break;
2400 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2401 break;
2402 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2403 break;
2404 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2405 break;
2406 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2407 break;
2408 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2409 break;
2410 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2411 break;
2412 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2413 break;
2414 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2415 break;
2416 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2417 break;
2418 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2419 break;
2420 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2421 break;
2422 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2423 break;
2424 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2425 break;
2426 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2427 break;
2428 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2429 break;
2430 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2431 break;
2432 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2433 break;
2434 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2435 break;
2436 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2437 break;
2438 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2439 break;
2440 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2441 break;
2442 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2443 break;
2444 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2445 break;
2446 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2447 break;
2448 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2449 break;
2450 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2451 break;
2452 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
2453 break;
2454 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
2455 break;
2456 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2457 break;
2458 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2459 break;
2460 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2461 break;
2462 }
2463
2464 return ppc64_elf_howto_table[r];
2465 };
2466
2467 static reloc_howto_type *
2468 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2469 const char *r_name)
2470 {
2471 unsigned int i;
2472
2473 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2474 if (ppc64_elf_howto_raw[i].name != NULL
2475 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2476 return &ppc64_elf_howto_raw[i];
2477
2478 return NULL;
2479 }
2480
2481 /* Set the howto pointer for a PowerPC ELF reloc. */
2482
2483 static void
2484 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2485 Elf_Internal_Rela *dst)
2486 {
2487 unsigned int type;
2488
2489 /* Initialize howto table if needed. */
2490 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2491 ppc_howto_init ();
2492
2493 type = ELF64_R_TYPE (dst->r_info);
2494 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
2495 {
2496 /* xgettext:c-format */
2497 _bfd_error_handler (_("%B: invalid relocation type %d"),
2498 abfd, (int) type);
2499 type = R_PPC64_NONE;
2500 }
2501 cache_ptr->howto = ppc64_elf_howto_table[type];
2502 }
2503
2504 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2505
2506 static bfd_reloc_status_type
2507 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2508 void *data, asection *input_section,
2509 bfd *output_bfd, char **error_message)
2510 {
2511 enum elf_ppc64_reloc_type r_type;
2512 long insn;
2513 bfd_size_type octets;
2514 bfd_vma value;
2515
2516 /* If this is a relocatable link (output_bfd test tells us), just
2517 call the generic function. Any adjustment will be done at final
2518 link time. */
2519 if (output_bfd != NULL)
2520 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2521 input_section, output_bfd, error_message);
2522
2523 /* Adjust the addend for sign extension of the low 16 bits.
2524 We won't actually be using the low 16 bits, so trashing them
2525 doesn't matter. */
2526 reloc_entry->addend += 0x8000;
2527 r_type = reloc_entry->howto->type;
2528 if (r_type != R_PPC64_REL16DX_HA)
2529 return bfd_reloc_continue;
2530
2531 value = 0;
2532 if (!bfd_is_com_section (symbol->section))
2533 value = symbol->value;
2534 value += (reloc_entry->addend
2535 + symbol->section->output_offset
2536 + symbol->section->output_section->vma);
2537 value -= (reloc_entry->address
2538 + input_section->output_offset
2539 + input_section->output_section->vma);
2540 value = (bfd_signed_vma) value >> 16;
2541
2542 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2543 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2544 insn &= ~0x1fffc1;
2545 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
2546 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2547 if (value + 0x8000 > 0xffff)
2548 return bfd_reloc_overflow;
2549 return bfd_reloc_ok;
2550 }
2551
2552 static bfd_reloc_status_type
2553 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2554 void *data, asection *input_section,
2555 bfd *output_bfd, char **error_message)
2556 {
2557 if (output_bfd != NULL)
2558 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2559 input_section, output_bfd, error_message);
2560
2561 if (strcmp (symbol->section->name, ".opd") == 0
2562 && (symbol->section->owner->flags & DYNAMIC) == 0)
2563 {
2564 bfd_vma dest = opd_entry_value (symbol->section,
2565 symbol->value + reloc_entry->addend,
2566 NULL, NULL, FALSE);
2567 if (dest != (bfd_vma) -1)
2568 reloc_entry->addend = dest - (symbol->value
2569 + symbol->section->output_section->vma
2570 + symbol->section->output_offset);
2571 }
2572 else
2573 {
2574 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2575
2576 if (symbol->section->owner != abfd
2577 && symbol->section->owner != NULL
2578 && abiversion (symbol->section->owner) >= 2)
2579 {
2580 unsigned int i;
2581
2582 for (i = 0; i < symbol->section->owner->symcount; ++i)
2583 {
2584 asymbol *symdef = symbol->section->owner->outsymbols[i];
2585
2586 if (strcmp (symdef->name, symbol->name) == 0)
2587 {
2588 elfsym = (elf_symbol_type *) symdef;
2589 break;
2590 }
2591 }
2592 }
2593 reloc_entry->addend
2594 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2595 }
2596 return bfd_reloc_continue;
2597 }
2598
2599 static bfd_reloc_status_type
2600 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2601 void *data, asection *input_section,
2602 bfd *output_bfd, char **error_message)
2603 {
2604 long insn;
2605 enum elf_ppc64_reloc_type r_type;
2606 bfd_size_type octets;
2607 /* Assume 'at' branch hints. */
2608 bfd_boolean is_isa_v2 = TRUE;
2609
2610 /* If this is a relocatable link (output_bfd test tells us), just
2611 call the generic function. Any adjustment will be done at final
2612 link time. */
2613 if (output_bfd != NULL)
2614 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2615 input_section, output_bfd, error_message);
2616
2617 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2618 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2619 insn &= ~(0x01 << 21);
2620 r_type = reloc_entry->howto->type;
2621 if (r_type == R_PPC64_ADDR14_BRTAKEN
2622 || r_type == R_PPC64_REL14_BRTAKEN)
2623 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2624
2625 if (is_isa_v2)
2626 {
2627 /* Set 'a' bit. This is 0b00010 in BO field for branch
2628 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2629 for branch on CTR insns (BO == 1a00t or 1a01t). */
2630 if ((insn & (0x14 << 21)) == (0x04 << 21))
2631 insn |= 0x02 << 21;
2632 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2633 insn |= 0x08 << 21;
2634 else
2635 goto out;
2636 }
2637 else
2638 {
2639 bfd_vma target = 0;
2640 bfd_vma from;
2641
2642 if (!bfd_is_com_section (symbol->section))
2643 target = symbol->value;
2644 target += symbol->section->output_section->vma;
2645 target += symbol->section->output_offset;
2646 target += reloc_entry->addend;
2647
2648 from = (reloc_entry->address
2649 + input_section->output_offset
2650 + input_section->output_section->vma);
2651
2652 /* Invert 'y' bit if not the default. */
2653 if ((bfd_signed_vma) (target - from) < 0)
2654 insn ^= 0x01 << 21;
2655 }
2656 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2657 out:
2658 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2659 input_section, output_bfd, error_message);
2660 }
2661
2662 static bfd_reloc_status_type
2663 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2664 void *data, asection *input_section,
2665 bfd *output_bfd, char **error_message)
2666 {
2667 /* If this is a relocatable link (output_bfd test tells us), just
2668 call the generic function. Any adjustment will be done at final
2669 link time. */
2670 if (output_bfd != NULL)
2671 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2672 input_section, output_bfd, error_message);
2673
2674 /* Subtract the symbol section base address. */
2675 reloc_entry->addend -= symbol->section->output_section->vma;
2676 return bfd_reloc_continue;
2677 }
2678
2679 static bfd_reloc_status_type
2680 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2681 void *data, asection *input_section,
2682 bfd *output_bfd, char **error_message)
2683 {
2684 /* If this is a relocatable link (output_bfd test tells us), just
2685 call the generic function. Any adjustment will be done at final
2686 link time. */
2687 if (output_bfd != NULL)
2688 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2689 input_section, output_bfd, error_message);
2690
2691 /* Subtract the symbol section base address. */
2692 reloc_entry->addend -= symbol->section->output_section->vma;
2693
2694 /* Adjust the addend for sign extension of the low 16 bits. */
2695 reloc_entry->addend += 0x8000;
2696 return bfd_reloc_continue;
2697 }
2698
2699 static bfd_reloc_status_type
2700 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2701 void *data, asection *input_section,
2702 bfd *output_bfd, char **error_message)
2703 {
2704 bfd_vma TOCstart;
2705
2706 /* If this is a relocatable link (output_bfd test tells us), just
2707 call the generic function. Any adjustment will be done at final
2708 link time. */
2709 if (output_bfd != NULL)
2710 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2711 input_section, output_bfd, error_message);
2712
2713 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2714 if (TOCstart == 0)
2715 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2716
2717 /* Subtract the TOC base address. */
2718 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2719 return bfd_reloc_continue;
2720 }
2721
2722 static bfd_reloc_status_type
2723 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2724 void *data, asection *input_section,
2725 bfd *output_bfd, char **error_message)
2726 {
2727 bfd_vma TOCstart;
2728
2729 /* If this is a relocatable link (output_bfd test tells us), just
2730 call the generic function. Any adjustment will be done at final
2731 link time. */
2732 if (output_bfd != NULL)
2733 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2734 input_section, output_bfd, error_message);
2735
2736 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2737 if (TOCstart == 0)
2738 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2739
2740 /* Subtract the TOC base address. */
2741 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2742
2743 /* Adjust the addend for sign extension of the low 16 bits. */
2744 reloc_entry->addend += 0x8000;
2745 return bfd_reloc_continue;
2746 }
2747
2748 static bfd_reloc_status_type
2749 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2750 void *data, asection *input_section,
2751 bfd *output_bfd, char **error_message)
2752 {
2753 bfd_vma TOCstart;
2754 bfd_size_type octets;
2755
2756 /* If this is a relocatable link (output_bfd test tells us), just
2757 call the generic function. Any adjustment will be done at final
2758 link time. */
2759 if (output_bfd != NULL)
2760 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2761 input_section, output_bfd, error_message);
2762
2763 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2764 if (TOCstart == 0)
2765 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2766
2767 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2768 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2769 return bfd_reloc_ok;
2770 }
2771
2772 static bfd_reloc_status_type
2773 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2774 void *data, asection *input_section,
2775 bfd *output_bfd, char **error_message)
2776 {
2777 /* If this is a relocatable link (output_bfd test tells us), just
2778 call the generic function. Any adjustment will be done at final
2779 link time. */
2780 if (output_bfd != NULL)
2781 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2782 input_section, output_bfd, error_message);
2783
2784 if (error_message != NULL)
2785 {
2786 static char buf[60];
2787 sprintf (buf, "generic linker can't handle %s",
2788 reloc_entry->howto->name);
2789 *error_message = buf;
2790 }
2791 return bfd_reloc_dangerous;
2792 }
2793
2794 /* Track GOT entries needed for a given symbol. We might need more
2795 than one got entry per symbol. */
2796 struct got_entry
2797 {
2798 struct got_entry *next;
2799
2800 /* The symbol addend that we'll be placing in the GOT. */
2801 bfd_vma addend;
2802
2803 /* Unlike other ELF targets, we use separate GOT entries for the same
2804 symbol referenced from different input files. This is to support
2805 automatic multiple TOC/GOT sections, where the TOC base can vary
2806 from one input file to another. After partitioning into TOC groups
2807 we merge entries within the group.
2808
2809 Point to the BFD owning this GOT entry. */
2810 bfd *owner;
2811
2812 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2813 TLS_TPREL or TLS_DTPREL for tls entries. */
2814 unsigned char tls_type;
2815
2816 /* Non-zero if got.ent points to real entry. */
2817 unsigned char is_indirect;
2818
2819 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2820 union
2821 {
2822 bfd_signed_vma refcount;
2823 bfd_vma offset;
2824 struct got_entry *ent;
2825 } got;
2826 };
2827
2828 /* The same for PLT. */
2829 struct plt_entry
2830 {
2831 struct plt_entry *next;
2832
2833 bfd_vma addend;
2834
2835 union
2836 {
2837 bfd_signed_vma refcount;
2838 bfd_vma offset;
2839 } plt;
2840 };
2841
2842 struct ppc64_elf_obj_tdata
2843 {
2844 struct elf_obj_tdata elf;
2845
2846 /* Shortcuts to dynamic linker sections. */
2847 asection *got;
2848 asection *relgot;
2849
2850 /* Used during garbage collection. We attach global symbols defined
2851 on removed .opd entries to this section so that the sym is removed. */
2852 asection *deleted_section;
2853
2854 /* TLS local dynamic got entry handling. Support for multiple GOT
2855 sections means we potentially need one of these for each input bfd. */
2856 struct got_entry tlsld_got;
2857
2858 union {
2859 /* A copy of relocs before they are modified for --emit-relocs. */
2860 Elf_Internal_Rela *relocs;
2861
2862 /* Section contents. */
2863 bfd_byte *contents;
2864 } opd;
2865
2866 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2867 the reloc to be in the range -32768 to 32767. */
2868 unsigned int has_small_toc_reloc : 1;
2869
2870 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2871 instruction not one we handle. */
2872 unsigned int unexpected_toc_insn : 1;
2873 };
2874
2875 #define ppc64_elf_tdata(bfd) \
2876 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2877
2878 #define ppc64_tlsld_got(bfd) \
2879 (&ppc64_elf_tdata (bfd)->tlsld_got)
2880
2881 #define is_ppc64_elf(bfd) \
2882 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2883 && elf_object_id (bfd) == PPC64_ELF_DATA)
2884
2885 /* Override the generic function because we store some extras. */
2886
2887 static bfd_boolean
2888 ppc64_elf_mkobject (bfd *abfd)
2889 {
2890 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2891 PPC64_ELF_DATA);
2892 }
2893
2894 /* Fix bad default arch selected for a 64 bit input bfd when the
2895 default is 32 bit. Also select arch based on apuinfo. */
2896
2897 static bfd_boolean
2898 ppc64_elf_object_p (bfd *abfd)
2899 {
2900 if (!abfd->arch_info->the_default)
2901 return TRUE;
2902
2903 if (abfd->arch_info->bits_per_word == 32)
2904 {
2905 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2906
2907 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2908 {
2909 /* Relies on arch after 32 bit default being 64 bit default. */
2910 abfd->arch_info = abfd->arch_info->next;
2911 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2912 }
2913 }
2914 return _bfd_elf_ppc_set_arch (abfd);
2915 }
2916
2917 /* Support for core dump NOTE sections. */
2918
2919 static bfd_boolean
2920 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2921 {
2922 size_t offset, size;
2923
2924 if (note->descsz != 504)
2925 return FALSE;
2926
2927 /* pr_cursig */
2928 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2929
2930 /* pr_pid */
2931 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2932
2933 /* pr_reg */
2934 offset = 112;
2935 size = 384;
2936
2937 /* Make a ".reg/999" section. */
2938 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2939 size, note->descpos + offset);
2940 }
2941
2942 static bfd_boolean
2943 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2944 {
2945 if (note->descsz != 136)
2946 return FALSE;
2947
2948 elf_tdata (abfd)->core->pid
2949 = bfd_get_32 (abfd, note->descdata + 24);
2950 elf_tdata (abfd)->core->program
2951 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2952 elf_tdata (abfd)->core->command
2953 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2954
2955 return TRUE;
2956 }
2957
2958 static char *
2959 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2960 ...)
2961 {
2962 switch (note_type)
2963 {
2964 default:
2965 return NULL;
2966
2967 case NT_PRPSINFO:
2968 {
2969 char data[136];
2970 va_list ap;
2971
2972 va_start (ap, note_type);
2973 memset (data, 0, sizeof (data));
2974 strncpy (data + 40, va_arg (ap, const char *), 16);
2975 strncpy (data + 56, va_arg (ap, const char *), 80);
2976 va_end (ap);
2977 return elfcore_write_note (abfd, buf, bufsiz,
2978 "CORE", note_type, data, sizeof (data));
2979 }
2980
2981 case NT_PRSTATUS:
2982 {
2983 char data[504];
2984 va_list ap;
2985 long pid;
2986 int cursig;
2987 const void *greg;
2988
2989 va_start (ap, note_type);
2990 memset (data, 0, 112);
2991 pid = va_arg (ap, long);
2992 bfd_put_32 (abfd, pid, data + 32);
2993 cursig = va_arg (ap, int);
2994 bfd_put_16 (abfd, cursig, data + 12);
2995 greg = va_arg (ap, const void *);
2996 memcpy (data + 112, greg, 384);
2997 memset (data + 496, 0, 8);
2998 va_end (ap);
2999 return elfcore_write_note (abfd, buf, bufsiz,
3000 "CORE", note_type, data, sizeof (data));
3001 }
3002 }
3003 }
3004
3005 /* Add extra PPC sections. */
3006
3007 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
3008 {
3009 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
3010 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3011 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3012 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3013 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3014 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3015 { NULL, 0, 0, 0, 0 }
3016 };
3017
3018 enum _ppc64_sec_type {
3019 sec_normal = 0,
3020 sec_opd = 1,
3021 sec_toc = 2
3022 };
3023
3024 struct _ppc64_elf_section_data
3025 {
3026 struct bfd_elf_section_data elf;
3027
3028 union
3029 {
3030 /* An array with one entry for each opd function descriptor,
3031 and some spares since opd entries may be either 16 or 24 bytes. */
3032 #define OPD_NDX(OFF) ((OFF) >> 4)
3033 struct _opd_sec_data
3034 {
3035 /* Points to the function code section for local opd entries. */
3036 asection **func_sec;
3037
3038 /* After editing .opd, adjust references to opd local syms. */
3039 long *adjust;
3040 } opd;
3041
3042 /* An array for toc sections, indexed by offset/8. */
3043 struct _toc_sec_data
3044 {
3045 /* Specifies the relocation symbol index used at a given toc offset. */
3046 unsigned *symndx;
3047
3048 /* And the relocation addend. */
3049 bfd_vma *add;
3050 } toc;
3051 } u;
3052
3053 enum _ppc64_sec_type sec_type:2;
3054
3055 /* Flag set when small branches are detected. Used to
3056 select suitable defaults for the stub group size. */
3057 unsigned int has_14bit_branch:1;
3058 };
3059
3060 #define ppc64_elf_section_data(sec) \
3061 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
3062
3063 static bfd_boolean
3064 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
3065 {
3066 if (!sec->used_by_bfd)
3067 {
3068 struct _ppc64_elf_section_data *sdata;
3069 bfd_size_type amt = sizeof (*sdata);
3070
3071 sdata = bfd_zalloc (abfd, amt);
3072 if (sdata == NULL)
3073 return FALSE;
3074 sec->used_by_bfd = sdata;
3075 }
3076
3077 return _bfd_elf_new_section_hook (abfd, sec);
3078 }
3079
3080 static struct _opd_sec_data *
3081 get_opd_info (asection * sec)
3082 {
3083 if (sec != NULL
3084 && ppc64_elf_section_data (sec) != NULL
3085 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
3086 return &ppc64_elf_section_data (sec)->u.opd;
3087 return NULL;
3088 }
3089 \f
3090 /* Parameters for the qsort hook. */
3091 static bfd_boolean synthetic_relocatable;
3092 static asection *synthetic_opd;
3093
3094 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
3095
3096 static int
3097 compare_symbols (const void *ap, const void *bp)
3098 {
3099 const asymbol *a = * (const asymbol **) ap;
3100 const asymbol *b = * (const asymbol **) bp;
3101
3102 /* Section symbols first. */
3103 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
3104 return -1;
3105 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
3106 return 1;
3107
3108 /* then .opd symbols. */
3109 if (synthetic_opd != NULL)
3110 {
3111 if (strcmp (a->section->name, ".opd") == 0
3112 && strcmp (b->section->name, ".opd") != 0)
3113 return -1;
3114 if (strcmp (a->section->name, ".opd") != 0
3115 && strcmp (b->section->name, ".opd") == 0)
3116 return 1;
3117 }
3118
3119 /* then other code symbols. */
3120 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3121 == (SEC_CODE | SEC_ALLOC)
3122 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3123 != (SEC_CODE | SEC_ALLOC))
3124 return -1;
3125
3126 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3127 != (SEC_CODE | SEC_ALLOC)
3128 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3129 == (SEC_CODE | SEC_ALLOC))
3130 return 1;
3131
3132 if (synthetic_relocatable)
3133 {
3134 if (a->section->id < b->section->id)
3135 return -1;
3136
3137 if (a->section->id > b->section->id)
3138 return 1;
3139 }
3140
3141 if (a->value + a->section->vma < b->value + b->section->vma)
3142 return -1;
3143
3144 if (a->value + a->section->vma > b->value + b->section->vma)
3145 return 1;
3146
3147 /* For syms with the same value, prefer strong dynamic global function
3148 syms over other syms. */
3149 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3150 return -1;
3151
3152 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3153 return 1;
3154
3155 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3156 return -1;
3157
3158 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3159 return 1;
3160
3161 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3162 return -1;
3163
3164 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3165 return 1;
3166
3167 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3168 return -1;
3169
3170 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3171 return 1;
3172
3173 return 0;
3174 }
3175
3176 /* Search SYMS for a symbol of the given VALUE. */
3177
3178 static asymbol *
3179 sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
3180 {
3181 long mid;
3182
3183 if (id == (unsigned) -1)
3184 {
3185 while (lo < hi)
3186 {
3187 mid = (lo + hi) >> 1;
3188 if (syms[mid]->value + syms[mid]->section->vma < value)
3189 lo = mid + 1;
3190 else if (syms[mid]->value + syms[mid]->section->vma > value)
3191 hi = mid;
3192 else
3193 return syms[mid];
3194 }
3195 }
3196 else
3197 {
3198 while (lo < hi)
3199 {
3200 mid = (lo + hi) >> 1;
3201 if (syms[mid]->section->id < id)
3202 lo = mid + 1;
3203 else if (syms[mid]->section->id > id)
3204 hi = mid;
3205 else if (syms[mid]->value < value)
3206 lo = mid + 1;
3207 else if (syms[mid]->value > value)
3208 hi = mid;
3209 else
3210 return syms[mid];
3211 }
3212 }
3213 return NULL;
3214 }
3215
3216 static bfd_boolean
3217 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3218 {
3219 bfd_vma vma = *(bfd_vma *) ptr;
3220 return ((section->flags & SEC_ALLOC) != 0
3221 && section->vma <= vma
3222 && vma < section->vma + section->size);
3223 }
3224
3225 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3226 entry syms. Also generate @plt symbols for the glink branch table.
3227 Returns count of synthetic symbols in RET or -1 on error. */
3228
3229 static long
3230 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3231 long static_count, asymbol **static_syms,
3232 long dyn_count, asymbol **dyn_syms,
3233 asymbol **ret)
3234 {
3235 asymbol *s;
3236 long i;
3237 long count;
3238 char *names;
3239 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3240 asection *opd = NULL;
3241 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3242 asymbol **syms;
3243 int abi = abiversion (abfd);
3244
3245 *ret = NULL;
3246
3247 if (abi < 2)
3248 {
3249 opd = bfd_get_section_by_name (abfd, ".opd");
3250 if (opd == NULL && abi == 1)
3251 return 0;
3252 }
3253
3254 symcount = static_count;
3255 if (!relocatable)
3256 symcount += dyn_count;
3257 if (symcount == 0)
3258 return 0;
3259
3260 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3261 if (syms == NULL)
3262 return -1;
3263
3264 if (!relocatable && static_count != 0 && dyn_count != 0)
3265 {
3266 /* Use both symbol tables. */
3267 memcpy (syms, static_syms, static_count * sizeof (*syms));
3268 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3269 }
3270 else if (!relocatable && static_count == 0)
3271 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3272 else
3273 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3274
3275 synthetic_relocatable = relocatable;
3276 synthetic_opd = opd;
3277 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3278
3279 if (!relocatable && symcount > 1)
3280 {
3281 long j;
3282 /* Trim duplicate syms, since we may have merged the normal and
3283 dynamic symbols. Actually, we only care about syms that have
3284 different values, so trim any with the same value. */
3285 for (i = 1, j = 1; i < symcount; ++i)
3286 if (syms[i - 1]->value + syms[i - 1]->section->vma
3287 != syms[i]->value + syms[i]->section->vma)
3288 syms[j++] = syms[i];
3289 symcount = j;
3290 }
3291
3292 i = 0;
3293 /* Note that here and in compare_symbols we can't compare opd and
3294 sym->section directly. With separate debug info files, the
3295 symbols will be extracted from the debug file while abfd passed
3296 to this function is the real binary. */
3297 if (opd != NULL && strcmp (syms[i]->section->name, ".opd") == 0)
3298 ++i;
3299 codesecsym = i;
3300
3301 for (; i < symcount; ++i)
3302 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3303 != (SEC_CODE | SEC_ALLOC))
3304 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3305 break;
3306 codesecsymend = i;
3307
3308 for (; i < symcount; ++i)
3309 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3310 break;
3311 secsymend = i;
3312
3313 if (opd != NULL)
3314 for (; i < symcount; ++i)
3315 if (strcmp (syms[i]->section->name, ".opd") != 0)
3316 break;
3317 opdsymend = i;
3318
3319 for (; i < symcount; ++i)
3320 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3321 != (SEC_CODE | SEC_ALLOC))
3322 break;
3323 symcount = i;
3324
3325 count = 0;
3326
3327 if (relocatable)
3328 {
3329 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3330 arelent *r;
3331 size_t size;
3332 long relcount;
3333
3334 if (opdsymend == secsymend)
3335 goto done;
3336
3337 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3338 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3339 if (relcount == 0)
3340 goto done;
3341
3342 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3343 {
3344 count = -1;
3345 goto done;
3346 }
3347
3348 size = 0;
3349 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3350 {
3351 asymbol *sym;
3352
3353 while (r < opd->relocation + relcount
3354 && r->address < syms[i]->value + opd->vma)
3355 ++r;
3356
3357 if (r == opd->relocation + relcount)
3358 break;
3359
3360 if (r->address != syms[i]->value + opd->vma)
3361 continue;
3362
3363 if (r->howto->type != R_PPC64_ADDR64)
3364 continue;
3365
3366 sym = *r->sym_ptr_ptr;
3367 if (!sym_exists_at (syms, opdsymend, symcount,
3368 sym->section->id, sym->value + r->addend))
3369 {
3370 ++count;
3371 size += sizeof (asymbol);
3372 size += strlen (syms[i]->name) + 2;
3373 }
3374 }
3375
3376 if (size == 0)
3377 goto done;
3378 s = *ret = bfd_malloc (size);
3379 if (s == NULL)
3380 {
3381 count = -1;
3382 goto done;
3383 }
3384
3385 names = (char *) (s + count);
3386
3387 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3388 {
3389 asymbol *sym;
3390
3391 while (r < opd->relocation + relcount
3392 && r->address < syms[i]->value + opd->vma)
3393 ++r;
3394
3395 if (r == opd->relocation + relcount)
3396 break;
3397
3398 if (r->address != syms[i]->value + opd->vma)
3399 continue;
3400
3401 if (r->howto->type != R_PPC64_ADDR64)
3402 continue;
3403
3404 sym = *r->sym_ptr_ptr;
3405 if (!sym_exists_at (syms, opdsymend, symcount,
3406 sym->section->id, sym->value + r->addend))
3407 {
3408 size_t len;
3409
3410 *s = *syms[i];
3411 s->flags |= BSF_SYNTHETIC;
3412 s->section = sym->section;
3413 s->value = sym->value + r->addend;
3414 s->name = names;
3415 *names++ = '.';
3416 len = strlen (syms[i]->name);
3417 memcpy (names, syms[i]->name, len + 1);
3418 names += len + 1;
3419 /* Have udata.p point back to the original symbol this
3420 synthetic symbol was derived from. */
3421 s->udata.p = syms[i];
3422 s++;
3423 }
3424 }
3425 }
3426 else
3427 {
3428 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3429 bfd_byte *contents = NULL;
3430 size_t size;
3431 long plt_count = 0;
3432 bfd_vma glink_vma = 0, resolv_vma = 0;
3433 asection *dynamic, *glink = NULL, *relplt = NULL;
3434 arelent *p;
3435
3436 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3437 {
3438 free_contents_and_exit_err:
3439 count = -1;
3440 free_contents_and_exit:
3441 if (contents)
3442 free (contents);
3443 goto done;
3444 }
3445
3446 size = 0;
3447 for (i = secsymend; i < opdsymend; ++i)
3448 {
3449 bfd_vma ent;
3450
3451 /* Ignore bogus symbols. */
3452 if (syms[i]->value > opd->size - 8)
3453 continue;
3454
3455 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3456 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3457 {
3458 ++count;
3459 size += sizeof (asymbol);
3460 size += strlen (syms[i]->name) + 2;
3461 }
3462 }
3463
3464 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3465 if (dyn_count != 0
3466 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3467 {
3468 bfd_byte *dynbuf, *extdyn, *extdynend;
3469 size_t extdynsize;
3470 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3471
3472 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3473 goto free_contents_and_exit_err;
3474
3475 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3476 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3477
3478 extdyn = dynbuf;
3479 extdynend = extdyn + dynamic->size;
3480 for (; extdyn < extdynend; extdyn += extdynsize)
3481 {
3482 Elf_Internal_Dyn dyn;
3483 (*swap_dyn_in) (abfd, extdyn, &dyn);
3484
3485 if (dyn.d_tag == DT_NULL)
3486 break;
3487
3488 if (dyn.d_tag == DT_PPC64_GLINK)
3489 {
3490 /* The first glink stub starts at offset 32; see
3491 comment in ppc64_elf_finish_dynamic_sections. */
3492 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
3493 /* The .glink section usually does not survive the final
3494 link; search for the section (usually .text) where the
3495 glink stubs now reside. */
3496 glink = bfd_sections_find_if (abfd, section_covers_vma,
3497 &glink_vma);
3498 break;
3499 }
3500 }
3501
3502 free (dynbuf);
3503 }
3504
3505 if (glink != NULL)
3506 {
3507 /* Determine __glink trampoline by reading the relative branch
3508 from the first glink stub. */
3509 bfd_byte buf[4];
3510 unsigned int off = 0;
3511
3512 while (bfd_get_section_contents (abfd, glink, buf,
3513 glink_vma + off - glink->vma, 4))
3514 {
3515 unsigned int insn = bfd_get_32 (abfd, buf);
3516 insn ^= B_DOT;
3517 if ((insn & ~0x3fffffc) == 0)
3518 {
3519 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3520 break;
3521 }
3522 off += 4;
3523 if (off > 4)
3524 break;
3525 }
3526
3527 if (resolv_vma)
3528 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3529
3530 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3531 if (relplt != NULL)
3532 {
3533 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3534 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3535 goto free_contents_and_exit_err;
3536
3537 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3538 size += plt_count * sizeof (asymbol);
3539
3540 p = relplt->relocation;
3541 for (i = 0; i < plt_count; i++, p++)
3542 {
3543 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3544 if (p->addend != 0)
3545 size += sizeof ("+0x") - 1 + 16;
3546 }
3547 }
3548 }
3549
3550 if (size == 0)
3551 goto free_contents_and_exit;
3552 s = *ret = bfd_malloc (size);
3553 if (s == NULL)
3554 goto free_contents_and_exit_err;
3555
3556 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3557
3558 for (i = secsymend; i < opdsymend; ++i)
3559 {
3560 bfd_vma ent;
3561
3562 if (syms[i]->value > opd->size - 8)
3563 continue;
3564
3565 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3566 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3567 {
3568 long lo, hi;
3569 size_t len;
3570 asection *sec = abfd->sections;
3571
3572 *s = *syms[i];
3573 lo = codesecsym;
3574 hi = codesecsymend;
3575 while (lo < hi)
3576 {
3577 long mid = (lo + hi) >> 1;
3578 if (syms[mid]->section->vma < ent)
3579 lo = mid + 1;
3580 else if (syms[mid]->section->vma > ent)
3581 hi = mid;
3582 else
3583 {
3584 sec = syms[mid]->section;
3585 break;
3586 }
3587 }
3588
3589 if (lo >= hi && lo > codesecsym)
3590 sec = syms[lo - 1]->section;
3591
3592 for (; sec != NULL; sec = sec->next)
3593 {
3594 if (sec->vma > ent)
3595 break;
3596 /* SEC_LOAD may not be set if SEC is from a separate debug
3597 info file. */
3598 if ((sec->flags & SEC_ALLOC) == 0)
3599 break;
3600 if ((sec->flags & SEC_CODE) != 0)
3601 s->section = sec;
3602 }
3603 s->flags |= BSF_SYNTHETIC;
3604 s->value = ent - s->section->vma;
3605 s->name = names;
3606 *names++ = '.';
3607 len = strlen (syms[i]->name);
3608 memcpy (names, syms[i]->name, len + 1);
3609 names += len + 1;
3610 /* Have udata.p point back to the original symbol this
3611 synthetic symbol was derived from. */
3612 s->udata.p = syms[i];
3613 s++;
3614 }
3615 }
3616 free (contents);
3617
3618 if (glink != NULL && relplt != NULL)
3619 {
3620 if (resolv_vma)
3621 {
3622 /* Add a symbol for the main glink trampoline. */
3623 memset (s, 0, sizeof *s);
3624 s->the_bfd = abfd;
3625 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3626 s->section = glink;
3627 s->value = resolv_vma - glink->vma;
3628 s->name = names;
3629 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3630 names += sizeof ("__glink_PLTresolve");
3631 s++;
3632 count++;
3633 }
3634
3635 /* FIXME: It would be very much nicer to put sym@plt on the
3636 stub rather than on the glink branch table entry. The
3637 objdump disassembler would then use a sensible symbol
3638 name on plt calls. The difficulty in doing so is
3639 a) finding the stubs, and,
3640 b) matching stubs against plt entries, and,
3641 c) there can be multiple stubs for a given plt entry.
3642
3643 Solving (a) could be done by code scanning, but older
3644 ppc64 binaries used different stubs to current code.
3645 (b) is the tricky one since you need to known the toc
3646 pointer for at least one function that uses a pic stub to
3647 be able to calculate the plt address referenced.
3648 (c) means gdb would need to set multiple breakpoints (or
3649 find the glink branch itself) when setting breakpoints
3650 for pending shared library loads. */
3651 p = relplt->relocation;
3652 for (i = 0; i < plt_count; i++, p++)
3653 {
3654 size_t len;
3655
3656 *s = **p->sym_ptr_ptr;
3657 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3658 we are defining a symbol, ensure one of them is set. */
3659 if ((s->flags & BSF_LOCAL) == 0)
3660 s->flags |= BSF_GLOBAL;
3661 s->flags |= BSF_SYNTHETIC;
3662 s->section = glink;
3663 s->value = glink_vma - glink->vma;
3664 s->name = names;
3665 s->udata.p = NULL;
3666 len = strlen ((*p->sym_ptr_ptr)->name);
3667 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3668 names += len;
3669 if (p->addend != 0)
3670 {
3671 memcpy (names, "+0x", sizeof ("+0x") - 1);
3672 names += sizeof ("+0x") - 1;
3673 bfd_sprintf_vma (abfd, names, p->addend);
3674 names += strlen (names);
3675 }
3676 memcpy (names, "@plt", sizeof ("@plt"));
3677 names += sizeof ("@plt");
3678 s++;
3679 if (abi < 2)
3680 {
3681 glink_vma += 8;
3682 if (i >= 0x8000)
3683 glink_vma += 4;
3684 }
3685 else
3686 glink_vma += 4;
3687 }
3688 count += plt_count;
3689 }
3690 }
3691
3692 done:
3693 free (syms);
3694 return count;
3695 }
3696 \f
3697 /* The following functions are specific to the ELF linker, while
3698 functions above are used generally. Those named ppc64_elf_* are
3699 called by the main ELF linker code. They appear in this file more
3700 or less in the order in which they are called. eg.
3701 ppc64_elf_check_relocs is called early in the link process,
3702 ppc64_elf_finish_dynamic_sections is one of the last functions
3703 called.
3704
3705 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3706 functions have both a function code symbol and a function descriptor
3707 symbol. A call to foo in a relocatable object file looks like:
3708
3709 . .text
3710 . x:
3711 . bl .foo
3712 . nop
3713
3714 The function definition in another object file might be:
3715
3716 . .section .opd
3717 . foo: .quad .foo
3718 . .quad .TOC.@tocbase
3719 . .quad 0
3720 .
3721 . .text
3722 . .foo: blr
3723
3724 When the linker resolves the call during a static link, the branch
3725 unsurprisingly just goes to .foo and the .opd information is unused.
3726 If the function definition is in a shared library, things are a little
3727 different: The call goes via a plt call stub, the opd information gets
3728 copied to the plt, and the linker patches the nop.
3729
3730 . x:
3731 . bl .foo_stub
3732 . ld 2,40(1)
3733 .
3734 .
3735 . .foo_stub:
3736 . std 2,40(1) # in practice, the call stub
3737 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3738 . addi 11,11,Lfoo@toc@l # this is the general idea
3739 . ld 12,0(11)
3740 . ld 2,8(11)
3741 . mtctr 12
3742 . ld 11,16(11)
3743 . bctr
3744 .
3745 . .section .plt
3746 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3747
3748 The "reloc ()" notation is supposed to indicate that the linker emits
3749 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3750 copying.
3751
3752 What are the difficulties here? Well, firstly, the relocations
3753 examined by the linker in check_relocs are against the function code
3754 sym .foo, while the dynamic relocation in the plt is emitted against
3755 the function descriptor symbol, foo. Somewhere along the line, we need
3756 to carefully copy dynamic link information from one symbol to the other.
3757 Secondly, the generic part of the elf linker will make .foo a dynamic
3758 symbol as is normal for most other backends. We need foo dynamic
3759 instead, at least for an application final link. However, when
3760 creating a shared library containing foo, we need to have both symbols
3761 dynamic so that references to .foo are satisfied during the early
3762 stages of linking. Otherwise the linker might decide to pull in a
3763 definition from some other object, eg. a static library.
3764
3765 Update: As of August 2004, we support a new convention. Function
3766 calls may use the function descriptor symbol, ie. "bl foo". This
3767 behaves exactly as "bl .foo". */
3768
3769 /* Of those relocs that might be copied as dynamic relocs, this function
3770 selects those that must be copied when linking a shared library,
3771 even when the symbol is local. */
3772
3773 static int
3774 must_be_dyn_reloc (struct bfd_link_info *info,
3775 enum elf_ppc64_reloc_type r_type)
3776 {
3777 switch (r_type)
3778 {
3779 default:
3780 return 1;
3781
3782 case R_PPC64_REL32:
3783 case R_PPC64_REL64:
3784 case R_PPC64_REL30:
3785 return 0;
3786
3787 case R_PPC64_TPREL16:
3788 case R_PPC64_TPREL16_LO:
3789 case R_PPC64_TPREL16_HI:
3790 case R_PPC64_TPREL16_HA:
3791 case R_PPC64_TPREL16_DS:
3792 case R_PPC64_TPREL16_LO_DS:
3793 case R_PPC64_TPREL16_HIGH:
3794 case R_PPC64_TPREL16_HIGHA:
3795 case R_PPC64_TPREL16_HIGHER:
3796 case R_PPC64_TPREL16_HIGHERA:
3797 case R_PPC64_TPREL16_HIGHEST:
3798 case R_PPC64_TPREL16_HIGHESTA:
3799 case R_PPC64_TPREL64:
3800 return !bfd_link_executable (info);
3801 }
3802 }
3803
3804 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3805 copying dynamic variables from a shared lib into an app's dynbss
3806 section, and instead use a dynamic relocation to point into the
3807 shared lib. With code that gcc generates, it's vital that this be
3808 enabled; In the PowerPC64 ABI, the address of a function is actually
3809 the address of a function descriptor, which resides in the .opd
3810 section. gcc uses the descriptor directly rather than going via the
3811 GOT as some other ABI's do, which means that initialized function
3812 pointers must reference the descriptor. Thus, a function pointer
3813 initialized to the address of a function in a shared library will
3814 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3815 redefines the function descriptor symbol to point to the copy. This
3816 presents a problem as a plt entry for that function is also
3817 initialized from the function descriptor symbol and the copy reloc
3818 may not be initialized first. */
3819 #define ELIMINATE_COPY_RELOCS 1
3820
3821 /* Section name for stubs is the associated section name plus this
3822 string. */
3823 #define STUB_SUFFIX ".stub"
3824
3825 /* Linker stubs.
3826 ppc_stub_long_branch:
3827 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3828 destination, but a 24 bit branch in a stub section will reach.
3829 . b dest
3830
3831 ppc_stub_plt_branch:
3832 Similar to the above, but a 24 bit branch in the stub section won't
3833 reach its destination.
3834 . addis %r11,%r2,xxx@toc@ha
3835 . ld %r12,xxx@toc@l(%r11)
3836 . mtctr %r12
3837 . bctr
3838
3839 ppc_stub_plt_call:
3840 Used to call a function in a shared library. If it so happens that
3841 the plt entry referenced crosses a 64k boundary, then an extra
3842 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3843 . std %r2,40(%r1)
3844 . addis %r11,%r2,xxx@toc@ha
3845 . ld %r12,xxx+0@toc@l(%r11)
3846 . mtctr %r12
3847 . ld %r2,xxx+8@toc@l(%r11)
3848 . ld %r11,xxx+16@toc@l(%r11)
3849 . bctr
3850
3851 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3852 code to adjust the value and save r2 to support multiple toc sections.
3853 A ppc_stub_long_branch with an r2 offset looks like:
3854 . std %r2,40(%r1)
3855 . addis %r2,%r2,off@ha
3856 . addi %r2,%r2,off@l
3857 . b dest
3858
3859 A ppc_stub_plt_branch with an r2 offset looks like:
3860 . std %r2,40(%r1)
3861 . addis %r11,%r2,xxx@toc@ha
3862 . ld %r12,xxx@toc@l(%r11)
3863 . addis %r2,%r2,off@ha
3864 . addi %r2,%r2,off@l
3865 . mtctr %r12
3866 . bctr
3867
3868 In cases where the "addis" instruction would add zero, the "addis" is
3869 omitted and following instructions modified slightly in some cases.
3870 */
3871
3872 enum ppc_stub_type {
3873 ppc_stub_none,
3874 ppc_stub_long_branch,
3875 ppc_stub_long_branch_r2off,
3876 ppc_stub_plt_branch,
3877 ppc_stub_plt_branch_r2off,
3878 ppc_stub_plt_call,
3879 ppc_stub_plt_call_r2save,
3880 ppc_stub_global_entry,
3881 ppc_stub_save_res
3882 };
3883
3884 /* Information on stub grouping. */
3885 struct map_stub
3886 {
3887 /* The stub section. */
3888 asection *stub_sec;
3889 /* This is the section to which stubs in the group will be attached. */
3890 asection *link_sec;
3891 /* Next group. */
3892 struct map_stub *next;
3893 /* Whether to emit a copy of register save/restore functions in this
3894 group. */
3895 int needs_save_res;
3896 };
3897
3898 struct ppc_stub_hash_entry {
3899
3900 /* Base hash table entry structure. */
3901 struct bfd_hash_entry root;
3902
3903 enum ppc_stub_type stub_type;
3904
3905 /* Group information. */
3906 struct map_stub *group;
3907
3908 /* Offset within stub_sec of the beginning of this stub. */
3909 bfd_vma stub_offset;
3910
3911 /* Given the symbol's value and its section we can determine its final
3912 value when building the stubs (so the stub knows where to jump. */
3913 bfd_vma target_value;
3914 asection *target_section;
3915
3916 /* The symbol table entry, if any, that this was derived from. */
3917 struct ppc_link_hash_entry *h;
3918 struct plt_entry *plt_ent;
3919
3920 /* Symbol st_other. */
3921 unsigned char other;
3922 };
3923
3924 struct ppc_branch_hash_entry {
3925
3926 /* Base hash table entry structure. */
3927 struct bfd_hash_entry root;
3928
3929 /* Offset within branch lookup table. */
3930 unsigned int offset;
3931
3932 /* Generation marker. */
3933 unsigned int iter;
3934 };
3935
3936 /* Used to track dynamic relocations for local symbols. */
3937 struct ppc_dyn_relocs
3938 {
3939 struct ppc_dyn_relocs *next;
3940
3941 /* The input section of the reloc. */
3942 asection *sec;
3943
3944 /* Total number of relocs copied for the input section. */
3945 unsigned int count : 31;
3946
3947 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3948 unsigned int ifunc : 1;
3949 };
3950
3951 struct ppc_link_hash_entry
3952 {
3953 struct elf_link_hash_entry elf;
3954
3955 union {
3956 /* A pointer to the most recently used stub hash entry against this
3957 symbol. */
3958 struct ppc_stub_hash_entry *stub_cache;
3959
3960 /* A pointer to the next symbol starting with a '.' */
3961 struct ppc_link_hash_entry *next_dot_sym;
3962 } u;
3963
3964 /* Track dynamic relocs copied for this symbol. */
3965 struct elf_dyn_relocs *dyn_relocs;
3966
3967 /* Chain of aliases referring to a weakdef. */
3968 struct ppc_link_hash_entry *weakref;
3969
3970 /* Link between function code and descriptor symbols. */
3971 struct ppc_link_hash_entry *oh;
3972
3973 /* Flag function code and descriptor symbols. */
3974 unsigned int is_func:1;
3975 unsigned int is_func_descriptor:1;
3976 unsigned int fake:1;
3977
3978 /* Whether global opd/toc sym has been adjusted or not.
3979 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3980 should be set for all globals defined in any opd/toc section. */
3981 unsigned int adjust_done:1;
3982
3983 /* Set if this is an out-of-line register save/restore function,
3984 with non-standard calling convention. */
3985 unsigned int save_res:1;
3986
3987 /* Contexts in which symbol is used in the GOT (or TOC).
3988 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3989 corresponding relocs are encountered during check_relocs.
3990 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3991 indicate the corresponding GOT entry type is not needed.
3992 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3993 a TPREL one. We use a separate flag rather than setting TPREL
3994 just for convenience in distinguishing the two cases. */
3995 #define TLS_GD 1 /* GD reloc. */
3996 #define TLS_LD 2 /* LD reloc. */
3997 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3998 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3999 #define TLS_TLS 16 /* Any TLS reloc. */
4000 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
4001 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
4002 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
4003 unsigned char tls_mask;
4004 };
4005
4006 /* ppc64 ELF linker hash table. */
4007
4008 struct ppc_link_hash_table
4009 {
4010 struct elf_link_hash_table elf;
4011
4012 /* The stub hash table. */
4013 struct bfd_hash_table stub_hash_table;
4014
4015 /* Another hash table for plt_branch stubs. */
4016 struct bfd_hash_table branch_hash_table;
4017
4018 /* Hash table for function prologue tocsave. */
4019 htab_t tocsave_htab;
4020
4021 /* Various options and other info passed from the linker. */
4022 struct ppc64_elf_params *params;
4023
4024 /* The size of sec_info below. */
4025 unsigned int sec_info_arr_size;
4026
4027 /* Per-section array of extra section info. Done this way rather
4028 than as part of ppc64_elf_section_data so we have the info for
4029 non-ppc64 sections. */
4030 struct
4031 {
4032 /* Along with elf_gp, specifies the TOC pointer used by this section. */
4033 bfd_vma toc_off;
4034
4035 union
4036 {
4037 /* The section group that this section belongs to. */
4038 struct map_stub *group;
4039 /* A temp section list pointer. */
4040 asection *list;
4041 } u;
4042 } *sec_info;
4043
4044 /* Linked list of groups. */
4045 struct map_stub *group;
4046
4047 /* Temp used when calculating TOC pointers. */
4048 bfd_vma toc_curr;
4049 bfd *toc_bfd;
4050 asection *toc_first_sec;
4051
4052 /* Used when adding symbols. */
4053 struct ppc_link_hash_entry *dot_syms;
4054
4055 /* Shortcuts to get to dynamic linker sections. */
4056 asection *dynbss;
4057 asection *relbss;
4058 asection *glink;
4059 asection *sfpr;
4060 asection *brlt;
4061 asection *relbrlt;
4062 asection *glink_eh_frame;
4063
4064 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4065 struct ppc_link_hash_entry *tls_get_addr;
4066 struct ppc_link_hash_entry *tls_get_addr_fd;
4067
4068 /* The size of reliplt used by got entry relocs. */
4069 bfd_size_type got_reli_size;
4070
4071 /* Statistics. */
4072 unsigned long stub_count[ppc_stub_global_entry];
4073
4074 /* Number of stubs against global syms. */
4075 unsigned long stub_globals;
4076
4077 /* Set if we're linking code with function descriptors. */
4078 unsigned int opd_abi:1;
4079
4080 /* Support for multiple toc sections. */
4081 unsigned int do_multi_toc:1;
4082 unsigned int multi_toc_needed:1;
4083 unsigned int second_toc_pass:1;
4084 unsigned int do_toc_opt:1;
4085
4086 /* Set on error. */
4087 unsigned int stub_error:1;
4088
4089 /* Whether func_desc_adjust needs to be run over symbols. */
4090 unsigned int need_func_desc_adj:1;
4091
4092 /* Incremented every time we size stubs. */
4093 unsigned int stub_iteration;
4094
4095 /* Small local sym cache. */
4096 struct sym_cache sym_cache;
4097 };
4098
4099 /* Rename some of the generic section flags to better document how they
4100 are used here. */
4101
4102 /* Nonzero if this section has TLS related relocations. */
4103 #define has_tls_reloc sec_flg0
4104
4105 /* Nonzero if this section has a call to __tls_get_addr. */
4106 #define has_tls_get_addr_call sec_flg1
4107
4108 /* Nonzero if this section has any toc or got relocs. */
4109 #define has_toc_reloc sec_flg2
4110
4111 /* Nonzero if this section has a call to another section that uses
4112 the toc or got. */
4113 #define makes_toc_func_call sec_flg3
4114
4115 /* Recursion protection when determining above flag. */
4116 #define call_check_in_progress sec_flg4
4117 #define call_check_done sec_flg5
4118
4119 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4120
4121 #define ppc_hash_table(p) \
4122 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4123 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4124
4125 #define ppc_stub_hash_lookup(table, string, create, copy) \
4126 ((struct ppc_stub_hash_entry *) \
4127 bfd_hash_lookup ((table), (string), (create), (copy)))
4128
4129 #define ppc_branch_hash_lookup(table, string, create, copy) \
4130 ((struct ppc_branch_hash_entry *) \
4131 bfd_hash_lookup ((table), (string), (create), (copy)))
4132
4133 /* Create an entry in the stub hash table. */
4134
4135 static struct bfd_hash_entry *
4136 stub_hash_newfunc (struct bfd_hash_entry *entry,
4137 struct bfd_hash_table *table,
4138 const char *string)
4139 {
4140 /* Allocate the structure if it has not already been allocated by a
4141 subclass. */
4142 if (entry == NULL)
4143 {
4144 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4145 if (entry == NULL)
4146 return entry;
4147 }
4148
4149 /* Call the allocation method of the superclass. */
4150 entry = bfd_hash_newfunc (entry, table, string);
4151 if (entry != NULL)
4152 {
4153 struct ppc_stub_hash_entry *eh;
4154
4155 /* Initialize the local fields. */
4156 eh = (struct ppc_stub_hash_entry *) entry;
4157 eh->stub_type = ppc_stub_none;
4158 eh->group = NULL;
4159 eh->stub_offset = 0;
4160 eh->target_value = 0;
4161 eh->target_section = NULL;
4162 eh->h = NULL;
4163 eh->plt_ent = NULL;
4164 eh->other = 0;
4165 }
4166
4167 return entry;
4168 }
4169
4170 /* Create an entry in the branch hash table. */
4171
4172 static struct bfd_hash_entry *
4173 branch_hash_newfunc (struct bfd_hash_entry *entry,
4174 struct bfd_hash_table *table,
4175 const char *string)
4176 {
4177 /* Allocate the structure if it has not already been allocated by a
4178 subclass. */
4179 if (entry == NULL)
4180 {
4181 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4182 if (entry == NULL)
4183 return entry;
4184 }
4185
4186 /* Call the allocation method of the superclass. */
4187 entry = bfd_hash_newfunc (entry, table, string);
4188 if (entry != NULL)
4189 {
4190 struct ppc_branch_hash_entry *eh;
4191
4192 /* Initialize the local fields. */
4193 eh = (struct ppc_branch_hash_entry *) entry;
4194 eh->offset = 0;
4195 eh->iter = 0;
4196 }
4197
4198 return entry;
4199 }
4200
4201 /* Create an entry in a ppc64 ELF linker hash table. */
4202
4203 static struct bfd_hash_entry *
4204 link_hash_newfunc (struct bfd_hash_entry *entry,
4205 struct bfd_hash_table *table,
4206 const char *string)
4207 {
4208 /* Allocate the structure if it has not already been allocated by a
4209 subclass. */
4210 if (entry == NULL)
4211 {
4212 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4213 if (entry == NULL)
4214 return entry;
4215 }
4216
4217 /* Call the allocation method of the superclass. */
4218 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4219 if (entry != NULL)
4220 {
4221 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4222
4223 memset (&eh->u.stub_cache, 0,
4224 (sizeof (struct ppc_link_hash_entry)
4225 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4226
4227 /* When making function calls, old ABI code references function entry
4228 points (dot symbols), while new ABI code references the function
4229 descriptor symbol. We need to make any combination of reference and
4230 definition work together, without breaking archive linking.
4231
4232 For a defined function "foo" and an undefined call to "bar":
4233 An old object defines "foo" and ".foo", references ".bar" (possibly
4234 "bar" too).
4235 A new object defines "foo" and references "bar".
4236
4237 A new object thus has no problem with its undefined symbols being
4238 satisfied by definitions in an old object. On the other hand, the
4239 old object won't have ".bar" satisfied by a new object.
4240
4241 Keep a list of newly added dot-symbols. */
4242
4243 if (string[0] == '.')
4244 {
4245 struct ppc_link_hash_table *htab;
4246
4247 htab = (struct ppc_link_hash_table *) table;
4248 eh->u.next_dot_sym = htab->dot_syms;
4249 htab->dot_syms = eh;
4250 }
4251 }
4252
4253 return entry;
4254 }
4255
4256 struct tocsave_entry {
4257 asection *sec;
4258 bfd_vma offset;
4259 };
4260
4261 static hashval_t
4262 tocsave_htab_hash (const void *p)
4263 {
4264 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4265 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4266 }
4267
4268 static int
4269 tocsave_htab_eq (const void *p1, const void *p2)
4270 {
4271 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4272 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4273 return e1->sec == e2->sec && e1->offset == e2->offset;
4274 }
4275
4276 /* Destroy a ppc64 ELF linker hash table. */
4277
4278 static void
4279 ppc64_elf_link_hash_table_free (bfd *obfd)
4280 {
4281 struct ppc_link_hash_table *htab;
4282
4283 htab = (struct ppc_link_hash_table *) obfd->link.hash;
4284 if (htab->tocsave_htab)
4285 htab_delete (htab->tocsave_htab);
4286 bfd_hash_table_free (&htab->branch_hash_table);
4287 bfd_hash_table_free (&htab->stub_hash_table);
4288 _bfd_elf_link_hash_table_free (obfd);
4289 }
4290
4291 /* Create a ppc64 ELF linker hash table. */
4292
4293 static struct bfd_link_hash_table *
4294 ppc64_elf_link_hash_table_create (bfd *abfd)
4295 {
4296 struct ppc_link_hash_table *htab;
4297 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4298
4299 htab = bfd_zmalloc (amt);
4300 if (htab == NULL)
4301 return NULL;
4302
4303 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4304 sizeof (struct ppc_link_hash_entry),
4305 PPC64_ELF_DATA))
4306 {
4307 free (htab);
4308 return NULL;
4309 }
4310
4311 /* Init the stub hash table too. */
4312 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4313 sizeof (struct ppc_stub_hash_entry)))
4314 {
4315 _bfd_elf_link_hash_table_free (abfd);
4316 return NULL;
4317 }
4318
4319 /* And the branch hash table. */
4320 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4321 sizeof (struct ppc_branch_hash_entry)))
4322 {
4323 bfd_hash_table_free (&htab->stub_hash_table);
4324 _bfd_elf_link_hash_table_free (abfd);
4325 return NULL;
4326 }
4327
4328 htab->tocsave_htab = htab_try_create (1024,
4329 tocsave_htab_hash,
4330 tocsave_htab_eq,
4331 NULL);
4332 if (htab->tocsave_htab == NULL)
4333 {
4334 ppc64_elf_link_hash_table_free (abfd);
4335 return NULL;
4336 }
4337 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
4338
4339 /* Initializing two fields of the union is just cosmetic. We really
4340 only care about glist, but when compiled on a 32-bit host the
4341 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4342 debugger inspection of these fields look nicer. */
4343 htab->elf.init_got_refcount.refcount = 0;
4344 htab->elf.init_got_refcount.glist = NULL;
4345 htab->elf.init_plt_refcount.refcount = 0;
4346 htab->elf.init_plt_refcount.glist = NULL;
4347 htab->elf.init_got_offset.offset = 0;
4348 htab->elf.init_got_offset.glist = NULL;
4349 htab->elf.init_plt_offset.offset = 0;
4350 htab->elf.init_plt_offset.glist = NULL;
4351
4352 return &htab->elf.root;
4353 }
4354
4355 /* Create sections for linker generated code. */
4356
4357 static bfd_boolean
4358 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4359 {
4360 struct ppc_link_hash_table *htab;
4361 flagword flags;
4362
4363 htab = ppc_hash_table (info);
4364
4365 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4366 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4367 if (htab->params->save_restore_funcs)
4368 {
4369 /* Create .sfpr for code to save and restore fp regs. */
4370 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4371 flags);
4372 if (htab->sfpr == NULL
4373 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4374 return FALSE;
4375 }
4376
4377 if (bfd_link_relocatable (info))
4378 return TRUE;
4379
4380 /* Create .glink for lazy dynamic linking support. */
4381 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4382 flags);
4383 if (htab->glink == NULL
4384 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4385 return FALSE;
4386
4387 if (!info->no_ld_generated_unwind_info)
4388 {
4389 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4390 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4391 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4392 ".eh_frame",
4393 flags);
4394 if (htab->glink_eh_frame == NULL
4395 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4396 return FALSE;
4397 }
4398
4399 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4400 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4401 if (htab->elf.iplt == NULL
4402 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4403 return FALSE;
4404
4405 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4406 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4407 htab->elf.irelplt
4408 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4409 if (htab->elf.irelplt == NULL
4410 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4411 return FALSE;
4412
4413 /* Create branch lookup table for plt_branch stubs. */
4414 flags = (SEC_ALLOC | SEC_LOAD
4415 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4416 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4417 flags);
4418 if (htab->brlt == NULL
4419 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4420 return FALSE;
4421
4422 if (!bfd_link_pic (info))
4423 return TRUE;
4424
4425 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4426 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4427 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4428 ".rela.branch_lt",
4429 flags);
4430 if (htab->relbrlt == NULL
4431 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4432 return FALSE;
4433
4434 return TRUE;
4435 }
4436
4437 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4438
4439 bfd_boolean
4440 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4441 struct ppc64_elf_params *params)
4442 {
4443 struct ppc_link_hash_table *htab;
4444
4445 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4446
4447 /* Always hook our dynamic sections into the first bfd, which is the
4448 linker created stub bfd. This ensures that the GOT header is at
4449 the start of the output TOC section. */
4450 htab = ppc_hash_table (info);
4451 htab->elf.dynobj = params->stub_bfd;
4452 htab->params = params;
4453
4454 return create_linkage_sections (htab->elf.dynobj, info);
4455 }
4456
4457 /* Build a name for an entry in the stub hash table. */
4458
4459 static char *
4460 ppc_stub_name (const asection *input_section,
4461 const asection *sym_sec,
4462 const struct ppc_link_hash_entry *h,
4463 const Elf_Internal_Rela *rel)
4464 {
4465 char *stub_name;
4466 ssize_t len;
4467
4468 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4469 offsets from a sym as a branch target? In fact, we could
4470 probably assume the addend is always zero. */
4471 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4472
4473 if (h)
4474 {
4475 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4476 stub_name = bfd_malloc (len);
4477 if (stub_name == NULL)
4478 return stub_name;
4479
4480 len = sprintf (stub_name, "%08x.%s+%x",
4481 input_section->id & 0xffffffff,
4482 h->elf.root.root.string,
4483 (int) rel->r_addend & 0xffffffff);
4484 }
4485 else
4486 {
4487 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4488 stub_name = bfd_malloc (len);
4489 if (stub_name == NULL)
4490 return stub_name;
4491
4492 len = sprintf (stub_name, "%08x.%x:%x+%x",
4493 input_section->id & 0xffffffff,
4494 sym_sec->id & 0xffffffff,
4495 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4496 (int) rel->r_addend & 0xffffffff);
4497 }
4498 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4499 stub_name[len - 2] = 0;
4500 return stub_name;
4501 }
4502
4503 /* Look up an entry in the stub hash. Stub entries are cached because
4504 creating the stub name takes a bit of time. */
4505
4506 static struct ppc_stub_hash_entry *
4507 ppc_get_stub_entry (const asection *input_section,
4508 const asection *sym_sec,
4509 struct ppc_link_hash_entry *h,
4510 const Elf_Internal_Rela *rel,
4511 struct ppc_link_hash_table *htab)
4512 {
4513 struct ppc_stub_hash_entry *stub_entry;
4514 struct map_stub *group;
4515
4516 /* If this input section is part of a group of sections sharing one
4517 stub section, then use the id of the first section in the group.
4518 Stub names need to include a section id, as there may well be
4519 more than one stub used to reach say, printf, and we need to
4520 distinguish between them. */
4521 group = htab->sec_info[input_section->id].u.group;
4522 if (group == NULL)
4523 return NULL;
4524
4525 if (h != NULL && h->u.stub_cache != NULL
4526 && h->u.stub_cache->h == h
4527 && h->u.stub_cache->group == group)
4528 {
4529 stub_entry = h->u.stub_cache;
4530 }
4531 else
4532 {
4533 char *stub_name;
4534
4535 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
4536 if (stub_name == NULL)
4537 return NULL;
4538
4539 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4540 stub_name, FALSE, FALSE);
4541 if (h != NULL)
4542 h->u.stub_cache = stub_entry;
4543
4544 free (stub_name);
4545 }
4546
4547 return stub_entry;
4548 }
4549
4550 /* Add a new stub entry to the stub hash. Not all fields of the new
4551 stub entry are initialised. */
4552
4553 static struct ppc_stub_hash_entry *
4554 ppc_add_stub (const char *stub_name,
4555 asection *section,
4556 struct bfd_link_info *info)
4557 {
4558 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4559 struct map_stub *group;
4560 asection *link_sec;
4561 asection *stub_sec;
4562 struct ppc_stub_hash_entry *stub_entry;
4563
4564 group = htab->sec_info[section->id].u.group;
4565 link_sec = group->link_sec;
4566 stub_sec = group->stub_sec;
4567 if (stub_sec == NULL)
4568 {
4569 size_t namelen;
4570 bfd_size_type len;
4571 char *s_name;
4572
4573 namelen = strlen (link_sec->name);
4574 len = namelen + sizeof (STUB_SUFFIX);
4575 s_name = bfd_alloc (htab->params->stub_bfd, len);
4576 if (s_name == NULL)
4577 return NULL;
4578
4579 memcpy (s_name, link_sec->name, namelen);
4580 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4581 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4582 if (stub_sec == NULL)
4583 return NULL;
4584 group->stub_sec = stub_sec;
4585 }
4586
4587 /* Enter this entry into the linker stub hash table. */
4588 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4589 TRUE, FALSE);
4590 if (stub_entry == NULL)
4591 {
4592 /* xgettext:c-format */
4593 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4594 section->owner, stub_name);
4595 return NULL;
4596 }
4597
4598 stub_entry->group = group;
4599 stub_entry->stub_offset = 0;
4600 return stub_entry;
4601 }
4602
4603 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4604 not already done. */
4605
4606 static bfd_boolean
4607 create_got_section (bfd *abfd, struct bfd_link_info *info)
4608 {
4609 asection *got, *relgot;
4610 flagword flags;
4611 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4612
4613 if (!is_ppc64_elf (abfd))
4614 return FALSE;
4615 if (htab == NULL)
4616 return FALSE;
4617
4618 if (!htab->elf.sgot
4619 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4620 return FALSE;
4621
4622 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4623 | SEC_LINKER_CREATED);
4624
4625 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4626 if (!got
4627 || !bfd_set_section_alignment (abfd, got, 3))
4628 return FALSE;
4629
4630 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4631 flags | SEC_READONLY);
4632 if (!relgot
4633 || ! bfd_set_section_alignment (abfd, relgot, 3))
4634 return FALSE;
4635
4636 ppc64_elf_tdata (abfd)->got = got;
4637 ppc64_elf_tdata (abfd)->relgot = relgot;
4638 return TRUE;
4639 }
4640
4641 /* Create the dynamic sections, and set up shortcuts. */
4642
4643 static bfd_boolean
4644 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4645 {
4646 struct ppc_link_hash_table *htab;
4647
4648 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4649 return FALSE;
4650
4651 htab = ppc_hash_table (info);
4652 if (htab == NULL)
4653 return FALSE;
4654
4655 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
4656 if (!bfd_link_pic (info))
4657 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
4658
4659 if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss
4660 || (!bfd_link_pic (info) && !htab->relbss))
4661 abort ();
4662
4663 return TRUE;
4664 }
4665
4666 /* Follow indirect and warning symbol links. */
4667
4668 static inline struct bfd_link_hash_entry *
4669 follow_link (struct bfd_link_hash_entry *h)
4670 {
4671 while (h->type == bfd_link_hash_indirect
4672 || h->type == bfd_link_hash_warning)
4673 h = h->u.i.link;
4674 return h;
4675 }
4676
4677 static inline struct elf_link_hash_entry *
4678 elf_follow_link (struct elf_link_hash_entry *h)
4679 {
4680 return (struct elf_link_hash_entry *) follow_link (&h->root);
4681 }
4682
4683 static inline struct ppc_link_hash_entry *
4684 ppc_follow_link (struct ppc_link_hash_entry *h)
4685 {
4686 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4687 }
4688
4689 /* Merge PLT info on FROM with that on TO. */
4690
4691 static void
4692 move_plt_plist (struct ppc_link_hash_entry *from,
4693 struct ppc_link_hash_entry *to)
4694 {
4695 if (from->elf.plt.plist != NULL)
4696 {
4697 if (to->elf.plt.plist != NULL)
4698 {
4699 struct plt_entry **entp;
4700 struct plt_entry *ent;
4701
4702 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4703 {
4704 struct plt_entry *dent;
4705
4706 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4707 if (dent->addend == ent->addend)
4708 {
4709 dent->plt.refcount += ent->plt.refcount;
4710 *entp = ent->next;
4711 break;
4712 }
4713 if (dent == NULL)
4714 entp = &ent->next;
4715 }
4716 *entp = to->elf.plt.plist;
4717 }
4718
4719 to->elf.plt.plist = from->elf.plt.plist;
4720 from->elf.plt.plist = NULL;
4721 }
4722 }
4723
4724 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4725
4726 static void
4727 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4728 struct elf_link_hash_entry *dir,
4729 struct elf_link_hash_entry *ind)
4730 {
4731 struct ppc_link_hash_entry *edir, *eind;
4732
4733 edir = (struct ppc_link_hash_entry *) dir;
4734 eind = (struct ppc_link_hash_entry *) ind;
4735
4736 edir->is_func |= eind->is_func;
4737 edir->is_func_descriptor |= eind->is_func_descriptor;
4738 edir->tls_mask |= eind->tls_mask;
4739 if (eind->oh != NULL)
4740 edir->oh = ppc_follow_link (eind->oh);
4741
4742 if (edir->elf.versioned != versioned_hidden)
4743 {
4744 /* If called to transfer flags for a weakdef during processing
4745 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4746 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4747 if (!(ELIMINATE_COPY_RELOCS
4748 && eind->elf.root.type != bfd_link_hash_indirect
4749 && edir->elf.dynamic_adjusted))
4750 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4751
4752 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4753 edir->elf.ref_regular |= eind->elf.ref_regular;
4754 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4755 edir->elf.needs_plt |= eind->elf.needs_plt;
4756 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4757 }
4758
4759 /* If we were called to copy over info for a weak sym, don't copy
4760 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4761 in order to simplify readonly_dynrelocs and save a field in the
4762 symbol hash entry, but that means dyn_relocs can't be used in any
4763 tests about a specific symbol, or affect other symbol flags which
4764 are then tested.
4765 Chain weakdefs so we can get from the weakdef back to an alias.
4766 The list is circular so that we don't need to use u.weakdef as
4767 well as this list to look at all aliases. */
4768 if (eind->elf.root.type != bfd_link_hash_indirect)
4769 {
4770 struct ppc_link_hash_entry *cur, *add, *next;
4771
4772 add = eind;
4773 do
4774 {
4775 cur = edir->weakref;
4776 if (cur != NULL)
4777 {
4778 do
4779 {
4780 /* We can be called twice for the same symbols.
4781 Don't make multiple loops. */
4782 if (cur == add)
4783 return;
4784 cur = cur->weakref;
4785 } while (cur != edir);
4786 }
4787 next = add->weakref;
4788 if (cur != add)
4789 {
4790 add->weakref = edir->weakref != NULL ? edir->weakref : edir;
4791 edir->weakref = add;
4792 }
4793 add = next;
4794 } while (add != NULL && add != eind);
4795 return;
4796 }
4797
4798 /* Copy over any dynamic relocs we may have on the indirect sym. */
4799 if (eind->dyn_relocs != NULL)
4800 {
4801 if (edir->dyn_relocs != NULL)
4802 {
4803 struct elf_dyn_relocs **pp;
4804 struct elf_dyn_relocs *p;
4805
4806 /* Add reloc counts against the indirect sym to the direct sym
4807 list. Merge any entries against the same section. */
4808 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4809 {
4810 struct elf_dyn_relocs *q;
4811
4812 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4813 if (q->sec == p->sec)
4814 {
4815 q->pc_count += p->pc_count;
4816 q->count += p->count;
4817 *pp = p->next;
4818 break;
4819 }
4820 if (q == NULL)
4821 pp = &p->next;
4822 }
4823 *pp = edir->dyn_relocs;
4824 }
4825
4826 edir->dyn_relocs = eind->dyn_relocs;
4827 eind->dyn_relocs = NULL;
4828 }
4829
4830 /* Copy over got entries that we may have already seen to the
4831 symbol which just became indirect. */
4832 if (eind->elf.got.glist != NULL)
4833 {
4834 if (edir->elf.got.glist != NULL)
4835 {
4836 struct got_entry **entp;
4837 struct got_entry *ent;
4838
4839 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4840 {
4841 struct got_entry *dent;
4842
4843 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4844 if (dent->addend == ent->addend
4845 && dent->owner == ent->owner
4846 && dent->tls_type == ent->tls_type)
4847 {
4848 dent->got.refcount += ent->got.refcount;
4849 *entp = ent->next;
4850 break;
4851 }
4852 if (dent == NULL)
4853 entp = &ent->next;
4854 }
4855 *entp = edir->elf.got.glist;
4856 }
4857
4858 edir->elf.got.glist = eind->elf.got.glist;
4859 eind->elf.got.glist = NULL;
4860 }
4861
4862 /* And plt entries. */
4863 move_plt_plist (eind, edir);
4864
4865 if (eind->elf.dynindx != -1)
4866 {
4867 if (edir->elf.dynindx != -1)
4868 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4869 edir->elf.dynstr_index);
4870 edir->elf.dynindx = eind->elf.dynindx;
4871 edir->elf.dynstr_index = eind->elf.dynstr_index;
4872 eind->elf.dynindx = -1;
4873 eind->elf.dynstr_index = 0;
4874 }
4875 }
4876
4877 /* Find the function descriptor hash entry from the given function code
4878 hash entry FH. Link the entries via their OH fields. */
4879
4880 static struct ppc_link_hash_entry *
4881 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4882 {
4883 struct ppc_link_hash_entry *fdh = fh->oh;
4884
4885 if (fdh == NULL)
4886 {
4887 const char *fd_name = fh->elf.root.root.string + 1;
4888
4889 fdh = (struct ppc_link_hash_entry *)
4890 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4891 if (fdh == NULL)
4892 return fdh;
4893
4894 fdh->is_func_descriptor = 1;
4895 fdh->oh = fh;
4896 fh->is_func = 1;
4897 fh->oh = fdh;
4898 }
4899
4900 fdh = ppc_follow_link (fdh);
4901 fdh->is_func_descriptor = 1;
4902 fdh->oh = fh;
4903 return fdh;
4904 }
4905
4906 /* Make a fake function descriptor sym for the undefined code sym FH. */
4907
4908 static struct ppc_link_hash_entry *
4909 make_fdh (struct bfd_link_info *info,
4910 struct ppc_link_hash_entry *fh)
4911 {
4912 bfd *abfd = fh->elf.root.u.undef.abfd;
4913 struct bfd_link_hash_entry *bh = NULL;
4914 struct ppc_link_hash_entry *fdh;
4915 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4916 ? BSF_WEAK
4917 : BSF_GLOBAL);
4918
4919 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4920 fh->elf.root.root.string + 1,
4921 flags, bfd_und_section_ptr, 0,
4922 NULL, FALSE, FALSE, &bh))
4923 return NULL;
4924
4925 fdh = (struct ppc_link_hash_entry *) bh;
4926 fdh->elf.non_elf = 0;
4927 fdh->fake = 1;
4928 fdh->is_func_descriptor = 1;
4929 fdh->oh = fh;
4930 fh->is_func = 1;
4931 fh->oh = fdh;
4932 return fdh;
4933 }
4934
4935 /* Fix function descriptor symbols defined in .opd sections to be
4936 function type. */
4937
4938 static bfd_boolean
4939 ppc64_elf_add_symbol_hook (bfd *ibfd,
4940 struct bfd_link_info *info,
4941 Elf_Internal_Sym *isym,
4942 const char **name,
4943 flagword *flags ATTRIBUTE_UNUSED,
4944 asection **sec,
4945 bfd_vma *value)
4946 {
4947 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4948 && (ibfd->flags & DYNAMIC) == 0
4949 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
4950 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
4951
4952 if (*sec != NULL
4953 && strcmp ((*sec)->name, ".opd") == 0)
4954 {
4955 asection *code_sec;
4956
4957 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4958 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4959 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4960
4961 /* If the symbol is a function defined in .opd, and the function
4962 code is in a discarded group, let it appear to be undefined. */
4963 if (!bfd_link_relocatable (info)
4964 && (*sec)->reloc_count != 0
4965 && opd_entry_value (*sec, *value, &code_sec, NULL,
4966 FALSE) != (bfd_vma) -1
4967 && discarded_section (code_sec))
4968 {
4969 *sec = bfd_und_section_ptr;
4970 isym->st_shndx = SHN_UNDEF;
4971 }
4972 }
4973 else if (*sec != NULL
4974 && strcmp ((*sec)->name, ".toc") == 0
4975 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4976 {
4977 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4978 if (htab != NULL)
4979 htab->params->object_in_toc = 1;
4980 }
4981
4982 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4983 {
4984 if (abiversion (ibfd) == 0)
4985 set_abiversion (ibfd, 2);
4986 else if (abiversion (ibfd) == 1)
4987 {
4988 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4989 " for ABI version 1\n"), name);
4990 bfd_set_error (bfd_error_bad_value);
4991 return FALSE;
4992 }
4993 }
4994
4995 return TRUE;
4996 }
4997
4998 /* Merge non-visibility st_other attributes: local entry point. */
4999
5000 static void
5001 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5002 const Elf_Internal_Sym *isym,
5003 bfd_boolean definition,
5004 bfd_boolean dynamic)
5005 {
5006 if (definition && !dynamic)
5007 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
5008 | ELF_ST_VISIBILITY (h->other));
5009 }
5010
5011 /* Hook called on merging a symbol. We use this to clear "fake" since
5012 we now have a real symbol. */
5013
5014 static bfd_boolean
5015 ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
5016 const Elf_Internal_Sym *isym ATTRIBUTE_UNUSED,
5017 asection **psec ATTRIBUTE_UNUSED,
5018 bfd_boolean newdef ATTRIBUTE_UNUSED,
5019 bfd_boolean olddef ATTRIBUTE_UNUSED,
5020 bfd *oldbfd ATTRIBUTE_UNUSED,
5021 const asection *oldsec ATTRIBUTE_UNUSED)
5022 {
5023 ((struct ppc_link_hash_entry *) h)->fake = 0;
5024 return TRUE;
5025 }
5026
5027 /* This function makes an old ABI object reference to ".bar" cause the
5028 inclusion of a new ABI object archive that defines "bar".
5029 NAME is a symbol defined in an archive. Return a symbol in the hash
5030 table that might be satisfied by the archive symbols. */
5031
5032 static struct elf_link_hash_entry *
5033 ppc64_elf_archive_symbol_lookup (bfd *abfd,
5034 struct bfd_link_info *info,
5035 const char *name)
5036 {
5037 struct elf_link_hash_entry *h;
5038 char *dot_name;
5039 size_t len;
5040
5041 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
5042 if (h != NULL
5043 /* Don't return this sym if it is a fake function descriptor
5044 created by add_symbol_adjust. */
5045 && !((struct ppc_link_hash_entry *) h)->fake)
5046 return h;
5047
5048 if (name[0] == '.')
5049 return h;
5050
5051 len = strlen (name);
5052 dot_name = bfd_alloc (abfd, len + 2);
5053 if (dot_name == NULL)
5054 return (struct elf_link_hash_entry *) 0 - 1;
5055 dot_name[0] = '.';
5056 memcpy (dot_name + 1, name, len + 1);
5057 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5058 bfd_release (abfd, dot_name);
5059 return h;
5060 }
5061
5062 /* This function satisfies all old ABI object references to ".bar" if a
5063 new ABI object defines "bar". Well, at least, undefined dot symbols
5064 are made weak. This stops later archive searches from including an
5065 object if we already have a function descriptor definition. It also
5066 prevents the linker complaining about undefined symbols.
5067 We also check and correct mismatched symbol visibility here. The
5068 most restrictive visibility of the function descriptor and the
5069 function entry symbol is used. */
5070
5071 static bfd_boolean
5072 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
5073 {
5074 struct ppc_link_hash_table *htab;
5075 struct ppc_link_hash_entry *fdh;
5076
5077 if (eh->elf.root.type == bfd_link_hash_warning)
5078 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5079
5080 if (eh->elf.root.type == bfd_link_hash_indirect)
5081 return TRUE;
5082
5083 if (eh->elf.root.root.string[0] != '.')
5084 abort ();
5085
5086 htab = ppc_hash_table (info);
5087 if (htab == NULL)
5088 return FALSE;
5089
5090 fdh = lookup_fdh (eh, htab);
5091 if (fdh == NULL
5092 && !bfd_link_relocatable (info)
5093 && (eh->elf.root.type == bfd_link_hash_undefined
5094 || eh->elf.root.type == bfd_link_hash_undefweak)
5095 && eh->elf.ref_regular)
5096 {
5097 /* Make an undefined function descriptor sym, in order to
5098 pull in an --as-needed shared lib. Archives are handled
5099 elsewhere. */
5100 fdh = make_fdh (info, eh);
5101 if (fdh == NULL)
5102 return FALSE;
5103 }
5104
5105 if (fdh != NULL)
5106 {
5107 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5108 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
5109
5110 /* Make both descriptor and entry symbol have the most
5111 constraining visibility of either symbol. */
5112 if (entry_vis < descr_vis)
5113 fdh->elf.other += entry_vis - descr_vis;
5114 else if (entry_vis > descr_vis)
5115 eh->elf.other += descr_vis - entry_vis;
5116
5117 /* Propagate reference flags from entry symbol to function
5118 descriptor symbol. */
5119 fdh->elf.root.non_ir_ref |= eh->elf.root.non_ir_ref;
5120 fdh->elf.ref_regular |= eh->elf.ref_regular;
5121 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5122
5123 if (!fdh->elf.forced_local
5124 && fdh->elf.dynindx == -1
5125 && fdh->elf.versioned != versioned_hidden
5126 && (bfd_link_dll (info)
5127 || fdh->elf.def_dynamic
5128 || fdh->elf.ref_dynamic)
5129 && (eh->elf.ref_regular
5130 || eh->elf.def_regular))
5131 {
5132 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5133 return FALSE;
5134 }
5135 }
5136
5137 return TRUE;
5138 }
5139
5140 /* Set up opd section info and abiversion for IBFD, and process list
5141 of dot-symbols we made in link_hash_newfunc. */
5142
5143 static bfd_boolean
5144 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
5145 {
5146 struct ppc_link_hash_table *htab;
5147 struct ppc_link_hash_entry **p, *eh;
5148 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
5149
5150 if (opd != NULL && opd->size != 0)
5151 {
5152 if (abiversion (ibfd) == 0)
5153 set_abiversion (ibfd, 1);
5154 else if (abiversion (ibfd) >= 2)
5155 {
5156 /* xgettext:c-format */
5157 info->callbacks->einfo (_("%P: %B .opd not allowed in ABI"
5158 " version %d\n"),
5159 ibfd, abiversion (ibfd));
5160 bfd_set_error (bfd_error_bad_value);
5161 return FALSE;
5162 }
5163
5164 if ((ibfd->flags & DYNAMIC) == 0
5165 && (opd->flags & SEC_RELOC) != 0
5166 && opd->reloc_count != 0
5167 && !bfd_is_abs_section (opd->output_section))
5168 {
5169 /* Garbage collection needs some extra help with .opd sections.
5170 We don't want to necessarily keep everything referenced by
5171 relocs in .opd, as that would keep all functions. Instead,
5172 if we reference an .opd symbol (a function descriptor), we
5173 want to keep the function code symbol's section. This is
5174 easy for global symbols, but for local syms we need to keep
5175 information about the associated function section. */
5176 bfd_size_type amt;
5177 asection **opd_sym_map;
5178
5179 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5180 opd_sym_map = bfd_zalloc (ibfd, amt);
5181 if (opd_sym_map == NULL)
5182 return FALSE;
5183 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5184 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5185 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5186 }
5187 }
5188
5189 if (!is_ppc64_elf (info->output_bfd))
5190 return TRUE;
5191 htab = ppc_hash_table (info);
5192 if (htab == NULL)
5193 return FALSE;
5194
5195 /* For input files without an explicit abiversion in e_flags
5196 we should have flagged any with symbol st_other bits set
5197 as ELFv1 and above flagged those with .opd as ELFv2.
5198 Set the output abiversion if not yet set, and for any input
5199 still ambiguous, take its abiversion from the output.
5200 Differences in ABI are reported later. */
5201 if (abiversion (info->output_bfd) == 0)
5202 set_abiversion (info->output_bfd, abiversion (ibfd));
5203 else if (abiversion (ibfd) == 0)
5204 set_abiversion (ibfd, abiversion (info->output_bfd));
5205
5206 p = &htab->dot_syms;
5207 while ((eh = *p) != NULL)
5208 {
5209 *p = NULL;
5210 if (&eh->elf == htab->elf.hgot)
5211 ;
5212 else if (htab->elf.hgot == NULL
5213 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5214 htab->elf.hgot = &eh->elf;
5215 else if (abiversion (ibfd) <= 1)
5216 {
5217 htab->need_func_desc_adj = 1;
5218 if (!add_symbol_adjust (eh, info))
5219 return FALSE;
5220 }
5221 p = &eh->u.next_dot_sym;
5222 }
5223 return TRUE;
5224 }
5225
5226 /* Undo hash table changes when an --as-needed input file is determined
5227 not to be needed. */
5228
5229 static bfd_boolean
5230 ppc64_elf_notice_as_needed (bfd *ibfd,
5231 struct bfd_link_info *info,
5232 enum notice_asneeded_action act)
5233 {
5234 if (act == notice_not_needed)
5235 {
5236 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5237
5238 if (htab == NULL)
5239 return FALSE;
5240
5241 htab->dot_syms = NULL;
5242 }
5243 return _bfd_elf_notice_as_needed (ibfd, info, act);
5244 }
5245
5246 /* If --just-symbols against a final linked binary, then assume we need
5247 toc adjusting stubs when calling functions defined there. */
5248
5249 static void
5250 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5251 {
5252 if ((sec->flags & SEC_CODE) != 0
5253 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5254 && is_ppc64_elf (sec->owner))
5255 {
5256 if (abiversion (sec->owner) >= 2
5257 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5258 sec->has_toc_reloc = 1;
5259 }
5260 _bfd_elf_link_just_syms (sec, info);
5261 }
5262
5263 static struct plt_entry **
5264 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5265 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5266 {
5267 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5268 struct plt_entry **local_plt;
5269 unsigned char *local_got_tls_masks;
5270
5271 if (local_got_ents == NULL)
5272 {
5273 bfd_size_type size = symtab_hdr->sh_info;
5274
5275 size *= (sizeof (*local_got_ents)
5276 + sizeof (*local_plt)
5277 + sizeof (*local_got_tls_masks));
5278 local_got_ents = bfd_zalloc (abfd, size);
5279 if (local_got_ents == NULL)
5280 return NULL;
5281 elf_local_got_ents (abfd) = local_got_ents;
5282 }
5283
5284 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5285 {
5286 struct got_entry *ent;
5287
5288 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5289 if (ent->addend == r_addend
5290 && ent->owner == abfd
5291 && ent->tls_type == tls_type)
5292 break;
5293 if (ent == NULL)
5294 {
5295 bfd_size_type amt = sizeof (*ent);
5296 ent = bfd_alloc (abfd, amt);
5297 if (ent == NULL)
5298 return FALSE;
5299 ent->next = local_got_ents[r_symndx];
5300 ent->addend = r_addend;
5301 ent->owner = abfd;
5302 ent->tls_type = tls_type;
5303 ent->is_indirect = FALSE;
5304 ent->got.refcount = 0;
5305 local_got_ents[r_symndx] = ent;
5306 }
5307 ent->got.refcount += 1;
5308 }
5309
5310 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5311 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5312 local_got_tls_masks[r_symndx] |= tls_type;
5313
5314 return local_plt + r_symndx;
5315 }
5316
5317 static bfd_boolean
5318 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5319 {
5320 struct plt_entry *ent;
5321
5322 for (ent = *plist; ent != NULL; ent = ent->next)
5323 if (ent->addend == addend)
5324 break;
5325 if (ent == NULL)
5326 {
5327 bfd_size_type amt = sizeof (*ent);
5328 ent = bfd_alloc (abfd, amt);
5329 if (ent == NULL)
5330 return FALSE;
5331 ent->next = *plist;
5332 ent->addend = addend;
5333 ent->plt.refcount = 0;
5334 *plist = ent;
5335 }
5336 ent->plt.refcount += 1;
5337 return TRUE;
5338 }
5339
5340 static bfd_boolean
5341 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5342 {
5343 return (r_type == R_PPC64_REL24
5344 || r_type == R_PPC64_REL14
5345 || r_type == R_PPC64_REL14_BRTAKEN
5346 || r_type == R_PPC64_REL14_BRNTAKEN
5347 || r_type == R_PPC64_ADDR24
5348 || r_type == R_PPC64_ADDR14
5349 || r_type == R_PPC64_ADDR14_BRTAKEN
5350 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5351 }
5352
5353 /* Look through the relocs for a section during the first phase, and
5354 calculate needed space in the global offset table, procedure
5355 linkage table, and dynamic reloc sections. */
5356
5357 static bfd_boolean
5358 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5359 asection *sec, const Elf_Internal_Rela *relocs)
5360 {
5361 struct ppc_link_hash_table *htab;
5362 Elf_Internal_Shdr *symtab_hdr;
5363 struct elf_link_hash_entry **sym_hashes;
5364 const Elf_Internal_Rela *rel;
5365 const Elf_Internal_Rela *rel_end;
5366 asection *sreloc;
5367 asection **opd_sym_map;
5368 struct elf_link_hash_entry *tga, *dottga;
5369
5370 if (bfd_link_relocatable (info))
5371 return TRUE;
5372
5373 /* Don't do anything special with non-loaded, non-alloced sections.
5374 In particular, any relocs in such sections should not affect GOT
5375 and PLT reference counting (ie. we don't allow them to create GOT
5376 or PLT entries), there's no possibility or desire to optimize TLS
5377 relocs, and there's not much point in propagating relocs to shared
5378 libs that the dynamic linker won't relocate. */
5379 if ((sec->flags & SEC_ALLOC) == 0)
5380 return TRUE;
5381
5382 BFD_ASSERT (is_ppc64_elf (abfd));
5383
5384 htab = ppc_hash_table (info);
5385 if (htab == NULL)
5386 return FALSE;
5387
5388 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5389 FALSE, FALSE, TRUE);
5390 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5391 FALSE, FALSE, TRUE);
5392 symtab_hdr = &elf_symtab_hdr (abfd);
5393 sym_hashes = elf_sym_hashes (abfd);
5394 sreloc = NULL;
5395 opd_sym_map = NULL;
5396 if (ppc64_elf_section_data (sec) != NULL
5397 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
5398 opd_sym_map = ppc64_elf_section_data (sec)->u.opd.func_sec;
5399
5400 rel_end = relocs + sec->reloc_count;
5401 for (rel = relocs; rel < rel_end; rel++)
5402 {
5403 unsigned long r_symndx;
5404 struct elf_link_hash_entry *h;
5405 enum elf_ppc64_reloc_type r_type;
5406 int tls_type;
5407 struct _ppc64_elf_section_data *ppc64_sec;
5408 struct plt_entry **ifunc, **plt_list;
5409
5410 r_symndx = ELF64_R_SYM (rel->r_info);
5411 if (r_symndx < symtab_hdr->sh_info)
5412 h = NULL;
5413 else
5414 {
5415 struct ppc_link_hash_entry *eh;
5416
5417 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5418 h = elf_follow_link (h);
5419 eh = (struct ppc_link_hash_entry *) h;
5420
5421 /* PR15323, ref flags aren't set for references in the same
5422 object. */
5423 h->root.non_ir_ref = 1;
5424 if (eh->is_func && eh->oh != NULL)
5425 eh->oh->elf.root.non_ir_ref = 1;
5426
5427 if (h == htab->elf.hgot)
5428 sec->has_toc_reloc = 1;
5429 }
5430
5431 tls_type = 0;
5432 ifunc = NULL;
5433 if (h != NULL)
5434 {
5435 if (h->type == STT_GNU_IFUNC)
5436 {
5437 h->needs_plt = 1;
5438 ifunc = &h->plt.plist;
5439 }
5440 }
5441 else
5442 {
5443 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5444 abfd, r_symndx);
5445 if (isym == NULL)
5446 return FALSE;
5447
5448 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5449 {
5450 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5451 rel->r_addend, PLT_IFUNC);
5452 if (ifunc == NULL)
5453 return FALSE;
5454 }
5455 }
5456
5457 r_type = ELF64_R_TYPE (rel->r_info);
5458 switch (r_type)
5459 {
5460 case R_PPC64_TLSGD:
5461 case R_PPC64_TLSLD:
5462 /* These special tls relocs tie a call to __tls_get_addr with
5463 its parameter symbol. */
5464 break;
5465
5466 case R_PPC64_GOT_TLSLD16:
5467 case R_PPC64_GOT_TLSLD16_LO:
5468 case R_PPC64_GOT_TLSLD16_HI:
5469 case R_PPC64_GOT_TLSLD16_HA:
5470 tls_type = TLS_TLS | TLS_LD;
5471 goto dogottls;
5472
5473 case R_PPC64_GOT_TLSGD16:
5474 case R_PPC64_GOT_TLSGD16_LO:
5475 case R_PPC64_GOT_TLSGD16_HI:
5476 case R_PPC64_GOT_TLSGD16_HA:
5477 tls_type = TLS_TLS | TLS_GD;
5478 goto dogottls;
5479
5480 case R_PPC64_GOT_TPREL16_DS:
5481 case R_PPC64_GOT_TPREL16_LO_DS:
5482 case R_PPC64_GOT_TPREL16_HI:
5483 case R_PPC64_GOT_TPREL16_HA:
5484 if (bfd_link_pic (info))
5485 info->flags |= DF_STATIC_TLS;
5486 tls_type = TLS_TLS | TLS_TPREL;
5487 goto dogottls;
5488
5489 case R_PPC64_GOT_DTPREL16_DS:
5490 case R_PPC64_GOT_DTPREL16_LO_DS:
5491 case R_PPC64_GOT_DTPREL16_HI:
5492 case R_PPC64_GOT_DTPREL16_HA:
5493 tls_type = TLS_TLS | TLS_DTPREL;
5494 dogottls:
5495 sec->has_tls_reloc = 1;
5496 /* Fall through */
5497
5498 case R_PPC64_GOT16:
5499 case R_PPC64_GOT16_DS:
5500 case R_PPC64_GOT16_HA:
5501 case R_PPC64_GOT16_HI:
5502 case R_PPC64_GOT16_LO:
5503 case R_PPC64_GOT16_LO_DS:
5504 /* This symbol requires a global offset table entry. */
5505 sec->has_toc_reloc = 1;
5506 if (r_type == R_PPC64_GOT_TLSLD16
5507 || r_type == R_PPC64_GOT_TLSGD16
5508 || r_type == R_PPC64_GOT_TPREL16_DS
5509 || r_type == R_PPC64_GOT_DTPREL16_DS
5510 || r_type == R_PPC64_GOT16
5511 || r_type == R_PPC64_GOT16_DS)
5512 {
5513 htab->do_multi_toc = 1;
5514 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5515 }
5516
5517 if (ppc64_elf_tdata (abfd)->got == NULL
5518 && !create_got_section (abfd, info))
5519 return FALSE;
5520
5521 if (h != NULL)
5522 {
5523 struct ppc_link_hash_entry *eh;
5524 struct got_entry *ent;
5525
5526 eh = (struct ppc_link_hash_entry *) h;
5527 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5528 if (ent->addend == rel->r_addend
5529 && ent->owner == abfd
5530 && ent->tls_type == tls_type)
5531 break;
5532 if (ent == NULL)
5533 {
5534 bfd_size_type amt = sizeof (*ent);
5535 ent = bfd_alloc (abfd, amt);
5536 if (ent == NULL)
5537 return FALSE;
5538 ent->next = eh->elf.got.glist;
5539 ent->addend = rel->r_addend;
5540 ent->owner = abfd;
5541 ent->tls_type = tls_type;
5542 ent->is_indirect = FALSE;
5543 ent->got.refcount = 0;
5544 eh->elf.got.glist = ent;
5545 }
5546 ent->got.refcount += 1;
5547 eh->tls_mask |= tls_type;
5548 }
5549 else
5550 /* This is a global offset table entry for a local symbol. */
5551 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5552 rel->r_addend, tls_type))
5553 return FALSE;
5554
5555 /* We may also need a plt entry if the symbol turns out to be
5556 an ifunc. */
5557 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
5558 {
5559 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5560 return FALSE;
5561 }
5562 break;
5563
5564 case R_PPC64_PLT16_HA:
5565 case R_PPC64_PLT16_HI:
5566 case R_PPC64_PLT16_LO:
5567 case R_PPC64_PLT32:
5568 case R_PPC64_PLT64:
5569 /* This symbol requires a procedure linkage table entry. */
5570 plt_list = ifunc;
5571 if (h != NULL)
5572 {
5573 h->needs_plt = 1;
5574 if (h->root.root.string[0] == '.'
5575 && h->root.root.string[1] != '\0')
5576 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5577 plt_list = &h->plt.plist;
5578 }
5579 if (plt_list == NULL)
5580 {
5581 /* It does not make sense to have a procedure linkage
5582 table entry for a non-ifunc local symbol. */
5583 info->callbacks->einfo
5584 /* xgettext:c-format */
5585 (_("%P: %H: %s reloc against local symbol\n"),
5586 abfd, sec, rel->r_offset,
5587 ppc64_elf_howto_table[r_type]->name);
5588 bfd_set_error (bfd_error_bad_value);
5589 return FALSE;
5590 }
5591 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5592 return FALSE;
5593 break;
5594
5595 /* The following relocations don't need to propagate the
5596 relocation if linking a shared object since they are
5597 section relative. */
5598 case R_PPC64_SECTOFF:
5599 case R_PPC64_SECTOFF_LO:
5600 case R_PPC64_SECTOFF_HI:
5601 case R_PPC64_SECTOFF_HA:
5602 case R_PPC64_SECTOFF_DS:
5603 case R_PPC64_SECTOFF_LO_DS:
5604 case R_PPC64_DTPREL16:
5605 case R_PPC64_DTPREL16_LO:
5606 case R_PPC64_DTPREL16_HI:
5607 case R_PPC64_DTPREL16_HA:
5608 case R_PPC64_DTPREL16_DS:
5609 case R_PPC64_DTPREL16_LO_DS:
5610 case R_PPC64_DTPREL16_HIGH:
5611 case R_PPC64_DTPREL16_HIGHA:
5612 case R_PPC64_DTPREL16_HIGHER:
5613 case R_PPC64_DTPREL16_HIGHERA:
5614 case R_PPC64_DTPREL16_HIGHEST:
5615 case R_PPC64_DTPREL16_HIGHESTA:
5616 break;
5617
5618 /* Nor do these. */
5619 case R_PPC64_REL16:
5620 case R_PPC64_REL16_LO:
5621 case R_PPC64_REL16_HI:
5622 case R_PPC64_REL16_HA:
5623 case R_PPC64_REL16DX_HA:
5624 break;
5625
5626 /* Not supported as a dynamic relocation. */
5627 case R_PPC64_ADDR64_LOCAL:
5628 if (bfd_link_pic (info))
5629 {
5630 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5631 ppc_howto_init ();
5632 /* xgettext:c-format */
5633 info->callbacks->einfo (_("%P: %H: %s reloc unsupported "
5634 "in shared libraries and PIEs.\n"),
5635 abfd, sec, rel->r_offset,
5636 ppc64_elf_howto_table[r_type]->name);
5637 bfd_set_error (bfd_error_bad_value);
5638 return FALSE;
5639 }
5640 break;
5641
5642 case R_PPC64_TOC16:
5643 case R_PPC64_TOC16_DS:
5644 htab->do_multi_toc = 1;
5645 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5646 /* Fall through. */
5647 case R_PPC64_TOC16_LO:
5648 case R_PPC64_TOC16_HI:
5649 case R_PPC64_TOC16_HA:
5650 case R_PPC64_TOC16_LO_DS:
5651 sec->has_toc_reloc = 1;
5652 break;
5653
5654 /* Marker reloc. */
5655 case R_PPC64_ENTRY:
5656 break;
5657
5658 /* This relocation describes the C++ object vtable hierarchy.
5659 Reconstruct it for later use during GC. */
5660 case R_PPC64_GNU_VTINHERIT:
5661 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5662 return FALSE;
5663 break;
5664
5665 /* This relocation describes which C++ vtable entries are actually
5666 used. Record for later use during GC. */
5667 case R_PPC64_GNU_VTENTRY:
5668 BFD_ASSERT (h != NULL);
5669 if (h != NULL
5670 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5671 return FALSE;
5672 break;
5673
5674 case R_PPC64_REL14:
5675 case R_PPC64_REL14_BRTAKEN:
5676 case R_PPC64_REL14_BRNTAKEN:
5677 {
5678 asection *dest = NULL;
5679
5680 /* Heuristic: If jumping outside our section, chances are
5681 we are going to need a stub. */
5682 if (h != NULL)
5683 {
5684 /* If the sym is weak it may be overridden later, so
5685 don't assume we know where a weak sym lives. */
5686 if (h->root.type == bfd_link_hash_defined)
5687 dest = h->root.u.def.section;
5688 }
5689 else
5690 {
5691 Elf_Internal_Sym *isym;
5692
5693 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5694 abfd, r_symndx);
5695 if (isym == NULL)
5696 return FALSE;
5697
5698 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5699 }
5700
5701 if (dest != sec)
5702 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5703 }
5704 /* Fall through. */
5705
5706 case R_PPC64_REL24:
5707 plt_list = ifunc;
5708 if (h != NULL)
5709 {
5710 h->needs_plt = 1;
5711 if (h->root.root.string[0] == '.'
5712 && h->root.root.string[1] != '\0')
5713 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5714
5715 if (h == tga || h == dottga)
5716 {
5717 sec->has_tls_reloc = 1;
5718 if (rel != relocs
5719 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5720 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5721 /* We have a new-style __tls_get_addr call with
5722 a marker reloc. */
5723 ;
5724 else
5725 /* Mark this section as having an old-style call. */
5726 sec->has_tls_get_addr_call = 1;
5727 }
5728 plt_list = &h->plt.plist;
5729 }
5730
5731 /* We may need a .plt entry if the function this reloc
5732 refers to is in a shared lib. */
5733 if (plt_list
5734 && !update_plt_info (abfd, plt_list, rel->r_addend))
5735 return FALSE;
5736 break;
5737
5738 case R_PPC64_ADDR14:
5739 case R_PPC64_ADDR14_BRNTAKEN:
5740 case R_PPC64_ADDR14_BRTAKEN:
5741 case R_PPC64_ADDR24:
5742 goto dodyn;
5743
5744 case R_PPC64_TPREL64:
5745 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5746 if (bfd_link_pic (info))
5747 info->flags |= DF_STATIC_TLS;
5748 goto dotlstoc;
5749
5750 case R_PPC64_DTPMOD64:
5751 if (rel + 1 < rel_end
5752 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5753 && rel[1].r_offset == rel->r_offset + 8)
5754 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5755 else
5756 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5757 goto dotlstoc;
5758
5759 case R_PPC64_DTPREL64:
5760 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5761 if (rel != relocs
5762 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5763 && rel[-1].r_offset == rel->r_offset - 8)
5764 /* This is the second reloc of a dtpmod, dtprel pair.
5765 Don't mark with TLS_DTPREL. */
5766 goto dodyn;
5767
5768 dotlstoc:
5769 sec->has_tls_reloc = 1;
5770 if (h != NULL)
5771 {
5772 struct ppc_link_hash_entry *eh;
5773 eh = (struct ppc_link_hash_entry *) h;
5774 eh->tls_mask |= tls_type;
5775 }
5776 else
5777 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5778 rel->r_addend, tls_type))
5779 return FALSE;
5780
5781 ppc64_sec = ppc64_elf_section_data (sec);
5782 if (ppc64_sec->sec_type != sec_toc)
5783 {
5784 bfd_size_type amt;
5785
5786 /* One extra to simplify get_tls_mask. */
5787 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5788 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5789 if (ppc64_sec->u.toc.symndx == NULL)
5790 return FALSE;
5791 amt = sec->size * sizeof (bfd_vma) / 8;
5792 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5793 if (ppc64_sec->u.toc.add == NULL)
5794 return FALSE;
5795 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5796 ppc64_sec->sec_type = sec_toc;
5797 }
5798 BFD_ASSERT (rel->r_offset % 8 == 0);
5799 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5800 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5801
5802 /* Mark the second slot of a GD or LD entry.
5803 -1 to indicate GD and -2 to indicate LD. */
5804 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5805 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5806 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5807 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5808 goto dodyn;
5809
5810 case R_PPC64_TPREL16:
5811 case R_PPC64_TPREL16_LO:
5812 case R_PPC64_TPREL16_HI:
5813 case R_PPC64_TPREL16_HA:
5814 case R_PPC64_TPREL16_DS:
5815 case R_PPC64_TPREL16_LO_DS:
5816 case R_PPC64_TPREL16_HIGH:
5817 case R_PPC64_TPREL16_HIGHA:
5818 case R_PPC64_TPREL16_HIGHER:
5819 case R_PPC64_TPREL16_HIGHERA:
5820 case R_PPC64_TPREL16_HIGHEST:
5821 case R_PPC64_TPREL16_HIGHESTA:
5822 if (bfd_link_pic (info))
5823 {
5824 info->flags |= DF_STATIC_TLS;
5825 goto dodyn;
5826 }
5827 break;
5828
5829 case R_PPC64_ADDR64:
5830 if (opd_sym_map != NULL
5831 && rel + 1 < rel_end
5832 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5833 {
5834 if (h != NULL)
5835 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5836 else
5837 {
5838 asection *s;
5839 Elf_Internal_Sym *isym;
5840
5841 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5842 abfd, r_symndx);
5843 if (isym == NULL)
5844 return FALSE;
5845
5846 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5847 if (s != NULL && s != sec)
5848 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5849 }
5850 }
5851 /* Fall through. */
5852
5853 case R_PPC64_ADDR16:
5854 case R_PPC64_ADDR16_DS:
5855 case R_PPC64_ADDR16_HA:
5856 case R_PPC64_ADDR16_HI:
5857 case R_PPC64_ADDR16_HIGH:
5858 case R_PPC64_ADDR16_HIGHA:
5859 case R_PPC64_ADDR16_HIGHER:
5860 case R_PPC64_ADDR16_HIGHERA:
5861 case R_PPC64_ADDR16_HIGHEST:
5862 case R_PPC64_ADDR16_HIGHESTA:
5863 case R_PPC64_ADDR16_LO:
5864 case R_PPC64_ADDR16_LO_DS:
5865 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
5866 && rel->r_addend == 0)
5867 {
5868 /* We may need a .plt entry if this reloc refers to a
5869 function in a shared lib. */
5870 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5871 return FALSE;
5872 h->pointer_equality_needed = 1;
5873 }
5874 /* Fall through. */
5875
5876 case R_PPC64_REL30:
5877 case R_PPC64_REL32:
5878 case R_PPC64_REL64:
5879 case R_PPC64_ADDR32:
5880 case R_PPC64_UADDR16:
5881 case R_PPC64_UADDR32:
5882 case R_PPC64_UADDR64:
5883 case R_PPC64_TOC:
5884 if (h != NULL && !bfd_link_pic (info))
5885 /* We may need a copy reloc. */
5886 h->non_got_ref = 1;
5887
5888 /* Don't propagate .opd relocs. */
5889 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5890 break;
5891
5892 /* If we are creating a shared library, and this is a reloc
5893 against a global symbol, or a non PC relative reloc
5894 against a local symbol, then we need to copy the reloc
5895 into the shared library. However, if we are linking with
5896 -Bsymbolic, we do not need to copy a reloc against a
5897 global symbol which is defined in an object we are
5898 including in the link (i.e., DEF_REGULAR is set). At
5899 this point we have not seen all the input files, so it is
5900 possible that DEF_REGULAR is not set now but will be set
5901 later (it is never cleared). In case of a weak definition,
5902 DEF_REGULAR may be cleared later by a strong definition in
5903 a shared library. We account for that possibility below by
5904 storing information in the dyn_relocs field of the hash
5905 table entry. A similar situation occurs when creating
5906 shared libraries and symbol visibility changes render the
5907 symbol local.
5908
5909 If on the other hand, we are creating an executable, we
5910 may need to keep relocations for symbols satisfied by a
5911 dynamic library if we manage to avoid copy relocs for the
5912 symbol. */
5913 dodyn:
5914 if ((bfd_link_pic (info)
5915 && (must_be_dyn_reloc (info, r_type)
5916 || (h != NULL
5917 && (!SYMBOLIC_BIND (info, h)
5918 || h->root.type == bfd_link_hash_defweak
5919 || !h->def_regular))))
5920 || (ELIMINATE_COPY_RELOCS
5921 && !bfd_link_pic (info)
5922 && h != NULL
5923 && (h->root.type == bfd_link_hash_defweak
5924 || !h->def_regular))
5925 || (!bfd_link_pic (info)
5926 && ifunc != NULL))
5927 {
5928 /* We must copy these reloc types into the output file.
5929 Create a reloc section in dynobj and make room for
5930 this reloc. */
5931 if (sreloc == NULL)
5932 {
5933 sreloc = _bfd_elf_make_dynamic_reloc_section
5934 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5935
5936 if (sreloc == NULL)
5937 return FALSE;
5938 }
5939
5940 /* If this is a global symbol, we count the number of
5941 relocations we need for this symbol. */
5942 if (h != NULL)
5943 {
5944 struct elf_dyn_relocs *p;
5945 struct elf_dyn_relocs **head;
5946
5947 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5948 p = *head;
5949 if (p == NULL || p->sec != sec)
5950 {
5951 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5952 if (p == NULL)
5953 return FALSE;
5954 p->next = *head;
5955 *head = p;
5956 p->sec = sec;
5957 p->count = 0;
5958 p->pc_count = 0;
5959 }
5960 p->count += 1;
5961 if (!must_be_dyn_reloc (info, r_type))
5962 p->pc_count += 1;
5963 }
5964 else
5965 {
5966 /* Track dynamic relocs needed for local syms too.
5967 We really need local syms available to do this
5968 easily. Oh well. */
5969 struct ppc_dyn_relocs *p;
5970 struct ppc_dyn_relocs **head;
5971 bfd_boolean is_ifunc;
5972 asection *s;
5973 void *vpp;
5974 Elf_Internal_Sym *isym;
5975
5976 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5977 abfd, r_symndx);
5978 if (isym == NULL)
5979 return FALSE;
5980
5981 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5982 if (s == NULL)
5983 s = sec;
5984
5985 vpp = &elf_section_data (s)->local_dynrel;
5986 head = (struct ppc_dyn_relocs **) vpp;
5987 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5988 p = *head;
5989 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5990 p = p->next;
5991 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5992 {
5993 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5994 if (p == NULL)
5995 return FALSE;
5996 p->next = *head;
5997 *head = p;
5998 p->sec = sec;
5999 p->ifunc = is_ifunc;
6000 p->count = 0;
6001 }
6002 p->count += 1;
6003 }
6004 }
6005 break;
6006
6007 default:
6008 break;
6009 }
6010 }
6011
6012 return TRUE;
6013 }
6014
6015 /* Merge backend specific data from an object file to the output
6016 object file when linking. */
6017
6018 static bfd_boolean
6019 ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6020 {
6021 bfd *obfd = info->output_bfd;
6022 unsigned long iflags, oflags;
6023
6024 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
6025 return TRUE;
6026
6027 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6028 return TRUE;
6029
6030 if (!_bfd_generic_verify_endian_match (ibfd, info))
6031 return FALSE;
6032
6033 iflags = elf_elfheader (ibfd)->e_flags;
6034 oflags = elf_elfheader (obfd)->e_flags;
6035
6036 if (iflags & ~EF_PPC64_ABI)
6037 {
6038 _bfd_error_handler
6039 /* xgettext:c-format */
6040 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
6041 bfd_set_error (bfd_error_bad_value);
6042 return FALSE;
6043 }
6044 else if (iflags != oflags && iflags != 0)
6045 {
6046 _bfd_error_handler
6047 /* xgettext:c-format */
6048 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
6049 ibfd, iflags, oflags);
6050 bfd_set_error (bfd_error_bad_value);
6051 return FALSE;
6052 }
6053
6054 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
6055
6056 /* Merge Tag_compatibility attributes and any common GNU ones. */
6057 _bfd_elf_merge_object_attributes (ibfd, info);
6058
6059 return TRUE;
6060 }
6061
6062 static bfd_boolean
6063 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6064 {
6065 /* Print normal ELF private data. */
6066 _bfd_elf_print_private_bfd_data (abfd, ptr);
6067
6068 if (elf_elfheader (abfd)->e_flags != 0)
6069 {
6070 FILE *file = ptr;
6071
6072 fprintf (file, _("private flags = 0x%lx:"),
6073 elf_elfheader (abfd)->e_flags);
6074
6075 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6076 fprintf (file, _(" [abiv%ld]"),
6077 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6078 fputc ('\n', file);
6079 }
6080
6081 return TRUE;
6082 }
6083
6084 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
6085 of the code entry point, and its section, which must be in the same
6086 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
6087
6088 static bfd_vma
6089 opd_entry_value (asection *opd_sec,
6090 bfd_vma offset,
6091 asection **code_sec,
6092 bfd_vma *code_off,
6093 bfd_boolean in_code_sec)
6094 {
6095 bfd *opd_bfd = opd_sec->owner;
6096 Elf_Internal_Rela *relocs;
6097 Elf_Internal_Rela *lo, *hi, *look;
6098 bfd_vma val;
6099
6100 /* No relocs implies we are linking a --just-symbols object, or looking
6101 at a final linked executable with addr2line or somesuch. */
6102 if (opd_sec->reloc_count == 0)
6103 {
6104 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
6105
6106 if (contents == NULL)
6107 {
6108 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6109 return (bfd_vma) -1;
6110 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6111 }
6112
6113 /* PR 17512: file: 64b9dfbb. */
6114 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
6115 return (bfd_vma) -1;
6116
6117 val = bfd_get_64 (opd_bfd, contents + offset);
6118 if (code_sec != NULL)
6119 {
6120 asection *sec, *likely = NULL;
6121
6122 if (in_code_sec)
6123 {
6124 sec = *code_sec;
6125 if (sec->vma <= val
6126 && val < sec->vma + sec->size)
6127 likely = sec;
6128 else
6129 val = -1;
6130 }
6131 else
6132 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6133 if (sec->vma <= val
6134 && (sec->flags & SEC_LOAD) != 0
6135 && (sec->flags & SEC_ALLOC) != 0)
6136 likely = sec;
6137 if (likely != NULL)
6138 {
6139 *code_sec = likely;
6140 if (code_off != NULL)
6141 *code_off = val - likely->vma;
6142 }
6143 }
6144 return val;
6145 }
6146
6147 BFD_ASSERT (is_ppc64_elf (opd_bfd));
6148
6149 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
6150 if (relocs == NULL)
6151 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
6152 /* PR 17512: file: df8e1fd6. */
6153 if (relocs == NULL)
6154 return (bfd_vma) -1;
6155
6156 /* Go find the opd reloc at the sym address. */
6157 lo = relocs;
6158 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
6159 val = (bfd_vma) -1;
6160 while (lo < hi)
6161 {
6162 look = lo + (hi - lo) / 2;
6163 if (look->r_offset < offset)
6164 lo = look + 1;
6165 else if (look->r_offset > offset)
6166 hi = look;
6167 else
6168 {
6169 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6170
6171 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6172 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6173 {
6174 unsigned long symndx = ELF64_R_SYM (look->r_info);
6175 asection *sec = NULL;
6176
6177 if (symndx >= symtab_hdr->sh_info
6178 && elf_sym_hashes (opd_bfd) != NULL)
6179 {
6180 struct elf_link_hash_entry **sym_hashes;
6181 struct elf_link_hash_entry *rh;
6182
6183 sym_hashes = elf_sym_hashes (opd_bfd);
6184 rh = sym_hashes[symndx - symtab_hdr->sh_info];
6185 if (rh != NULL)
6186 {
6187 rh = elf_follow_link (rh);
6188 if (rh->root.type != bfd_link_hash_defined
6189 && rh->root.type != bfd_link_hash_defweak)
6190 break;
6191 if (rh->root.u.def.section->owner == opd_bfd)
6192 {
6193 val = rh->root.u.def.value;
6194 sec = rh->root.u.def.section;
6195 }
6196 }
6197 }
6198
6199 if (sec == NULL)
6200 {
6201 Elf_Internal_Sym *sym;
6202
6203 if (symndx < symtab_hdr->sh_info)
6204 {
6205 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6206 if (sym == NULL)
6207 {
6208 size_t symcnt = symtab_hdr->sh_info;
6209 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6210 symcnt, 0,
6211 NULL, NULL, NULL);
6212 if (sym == NULL)
6213 break;
6214 symtab_hdr->contents = (bfd_byte *) sym;
6215 }
6216 sym += symndx;
6217 }
6218 else
6219 {
6220 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6221 1, symndx,
6222 NULL, NULL, NULL);
6223 if (sym == NULL)
6224 break;
6225 }
6226 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6227 if (sec == NULL)
6228 break;
6229 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6230 val = sym->st_value;
6231 }
6232
6233 val += look->r_addend;
6234 if (code_off != NULL)
6235 *code_off = val;
6236 if (code_sec != NULL)
6237 {
6238 if (in_code_sec && *code_sec != sec)
6239 return -1;
6240 else
6241 *code_sec = sec;
6242 }
6243 if (sec->output_section != NULL)
6244 val += sec->output_section->vma + sec->output_offset;
6245 }
6246 break;
6247 }
6248 }
6249
6250 return val;
6251 }
6252
6253 /* If the ELF symbol SYM might be a function in SEC, return the
6254 function size and set *CODE_OFF to the function's entry point,
6255 otherwise return zero. */
6256
6257 static bfd_size_type
6258 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6259 bfd_vma *code_off)
6260 {
6261 bfd_size_type size;
6262
6263 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6264 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6265 return 0;
6266
6267 size = 0;
6268 if (!(sym->flags & BSF_SYNTHETIC))
6269 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6270
6271 if (strcmp (sym->section->name, ".opd") == 0)
6272 {
6273 struct _opd_sec_data *opd = get_opd_info (sym->section);
6274 bfd_vma symval = sym->value;
6275
6276 if (opd != NULL
6277 && opd->adjust != NULL
6278 && elf_section_data (sym->section)->relocs != NULL)
6279 {
6280 /* opd_entry_value will use cached relocs that have been
6281 adjusted, but with raw symbols. That means both local
6282 and global symbols need adjusting. */
6283 long adjust = opd->adjust[OPD_NDX (symval)];
6284 if (adjust == -1)
6285 return 0;
6286 symval += adjust;
6287 }
6288
6289 if (opd_entry_value (sym->section, symval,
6290 &sec, code_off, TRUE) == (bfd_vma) -1)
6291 return 0;
6292 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6293 symbol. This size has nothing to do with the code size of the
6294 function, which is what we're supposed to return, but the
6295 code size isn't available without looking up the dot-sym.
6296 However, doing that would be a waste of time particularly
6297 since elf_find_function will look at the dot-sym anyway.
6298 Now, elf_find_function will keep the largest size of any
6299 function sym found at the code address of interest, so return
6300 1 here to avoid it incorrectly caching a larger function size
6301 for a small function. This does mean we return the wrong
6302 size for a new-ABI function of size 24, but all that does is
6303 disable caching for such functions. */
6304 if (size == 24)
6305 size = 1;
6306 }
6307 else
6308 {
6309 if (sym->section != sec)
6310 return 0;
6311 *code_off = sym->value;
6312 }
6313 if (size == 0)
6314 size = 1;
6315 return size;
6316 }
6317
6318 /* Return true if symbol is defined in a regular object file. */
6319
6320 static bfd_boolean
6321 is_static_defined (struct elf_link_hash_entry *h)
6322 {
6323 return ((h->root.type == bfd_link_hash_defined
6324 || h->root.type == bfd_link_hash_defweak)
6325 && h->root.u.def.section != NULL
6326 && h->root.u.def.section->output_section != NULL);
6327 }
6328
6329 /* If FDH is a function descriptor symbol, return the associated code
6330 entry symbol if it is defined. Return NULL otherwise. */
6331
6332 static struct ppc_link_hash_entry *
6333 defined_code_entry (struct ppc_link_hash_entry *fdh)
6334 {
6335 if (fdh->is_func_descriptor)
6336 {
6337 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6338 if (fh->elf.root.type == bfd_link_hash_defined
6339 || fh->elf.root.type == bfd_link_hash_defweak)
6340 return fh;
6341 }
6342 return NULL;
6343 }
6344
6345 /* If FH is a function code entry symbol, return the associated
6346 function descriptor symbol if it is defined. Return NULL otherwise. */
6347
6348 static struct ppc_link_hash_entry *
6349 defined_func_desc (struct ppc_link_hash_entry *fh)
6350 {
6351 if (fh->oh != NULL
6352 && fh->oh->is_func_descriptor)
6353 {
6354 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6355 if (fdh->elf.root.type == bfd_link_hash_defined
6356 || fdh->elf.root.type == bfd_link_hash_defweak)
6357 return fdh;
6358 }
6359 return NULL;
6360 }
6361
6362 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6363
6364 /* Garbage collect sections, after first dealing with dot-symbols. */
6365
6366 static bfd_boolean
6367 ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6368 {
6369 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6370
6371 if (htab != NULL && htab->need_func_desc_adj)
6372 {
6373 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6374 htab->need_func_desc_adj = 0;
6375 }
6376 return bfd_elf_gc_sections (abfd, info);
6377 }
6378
6379 /* Mark all our entry sym sections, both opd and code section. */
6380
6381 static void
6382 ppc64_elf_gc_keep (struct bfd_link_info *info)
6383 {
6384 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6385 struct bfd_sym_chain *sym;
6386
6387 if (htab == NULL)
6388 return;
6389
6390 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6391 {
6392 struct ppc_link_hash_entry *eh, *fh;
6393 asection *sec;
6394
6395 eh = (struct ppc_link_hash_entry *)
6396 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6397 if (eh == NULL)
6398 continue;
6399 if (eh->elf.root.type != bfd_link_hash_defined
6400 && eh->elf.root.type != bfd_link_hash_defweak)
6401 continue;
6402
6403 fh = defined_code_entry (eh);
6404 if (fh != NULL)
6405 {
6406 sec = fh->elf.root.u.def.section;
6407 sec->flags |= SEC_KEEP;
6408 }
6409 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6410 && opd_entry_value (eh->elf.root.u.def.section,
6411 eh->elf.root.u.def.value,
6412 &sec, NULL, FALSE) != (bfd_vma) -1)
6413 sec->flags |= SEC_KEEP;
6414
6415 sec = eh->elf.root.u.def.section;
6416 sec->flags |= SEC_KEEP;
6417 }
6418 }
6419
6420 /* Mark sections containing dynamically referenced symbols. When
6421 building shared libraries, we must assume that any visible symbol is
6422 referenced. */
6423
6424 static bfd_boolean
6425 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6426 {
6427 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6428 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6429 struct ppc_link_hash_entry *fdh;
6430 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6431
6432 /* Dynamic linking info is on the func descriptor sym. */
6433 fdh = defined_func_desc (eh);
6434 if (fdh != NULL)
6435 eh = fdh;
6436
6437 if ((eh->elf.root.type == bfd_link_hash_defined
6438 || eh->elf.root.type == bfd_link_hash_defweak)
6439 && (eh->elf.ref_dynamic
6440 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
6441 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6442 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6443 && (!bfd_link_executable (info)
6444 || info->export_dynamic
6445 || (eh->elf.dynamic
6446 && d != NULL
6447 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6448 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6449 || !bfd_hide_sym_by_version (info->version_info,
6450 eh->elf.root.root.string)))))
6451 {
6452 asection *code_sec;
6453 struct ppc_link_hash_entry *fh;
6454
6455 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6456
6457 /* Function descriptor syms cause the associated
6458 function code sym section to be marked. */
6459 fh = defined_code_entry (eh);
6460 if (fh != NULL)
6461 {
6462 code_sec = fh->elf.root.u.def.section;
6463 code_sec->flags |= SEC_KEEP;
6464 }
6465 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6466 && opd_entry_value (eh->elf.root.u.def.section,
6467 eh->elf.root.u.def.value,
6468 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6469 code_sec->flags |= SEC_KEEP;
6470 }
6471
6472 return TRUE;
6473 }
6474
6475 /* Return the section that should be marked against GC for a given
6476 relocation. */
6477
6478 static asection *
6479 ppc64_elf_gc_mark_hook (asection *sec,
6480 struct bfd_link_info *info,
6481 Elf_Internal_Rela *rel,
6482 struct elf_link_hash_entry *h,
6483 Elf_Internal_Sym *sym)
6484 {
6485 asection *rsec;
6486
6487 /* Syms return NULL if we're marking .opd, so we avoid marking all
6488 function sections, as all functions are referenced in .opd. */
6489 rsec = NULL;
6490 if (get_opd_info (sec) != NULL)
6491 return rsec;
6492
6493 if (h != NULL)
6494 {
6495 enum elf_ppc64_reloc_type r_type;
6496 struct ppc_link_hash_entry *eh, *fh, *fdh;
6497
6498 r_type = ELF64_R_TYPE (rel->r_info);
6499 switch (r_type)
6500 {
6501 case R_PPC64_GNU_VTINHERIT:
6502 case R_PPC64_GNU_VTENTRY:
6503 break;
6504
6505 default:
6506 switch (h->root.type)
6507 {
6508 case bfd_link_hash_defined:
6509 case bfd_link_hash_defweak:
6510 eh = (struct ppc_link_hash_entry *) h;
6511 fdh = defined_func_desc (eh);
6512 if (fdh != NULL)
6513 {
6514 /* -mcall-aixdesc code references the dot-symbol on
6515 a call reloc. Mark the function descriptor too
6516 against garbage collection. */
6517 fdh->elf.mark = 1;
6518 if (fdh->elf.u.weakdef != NULL)
6519 fdh->elf.u.weakdef->mark = 1;
6520 eh = fdh;
6521 }
6522
6523 /* Function descriptor syms cause the associated
6524 function code sym section to be marked. */
6525 fh = defined_code_entry (eh);
6526 if (fh != NULL)
6527 {
6528 /* They also mark their opd section. */
6529 eh->elf.root.u.def.section->gc_mark = 1;
6530
6531 rsec = fh->elf.root.u.def.section;
6532 }
6533 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6534 && opd_entry_value (eh->elf.root.u.def.section,
6535 eh->elf.root.u.def.value,
6536 &rsec, NULL, FALSE) != (bfd_vma) -1)
6537 eh->elf.root.u.def.section->gc_mark = 1;
6538 else
6539 rsec = h->root.u.def.section;
6540 break;
6541
6542 case bfd_link_hash_common:
6543 rsec = h->root.u.c.p->section;
6544 break;
6545
6546 default:
6547 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6548 }
6549 }
6550 }
6551 else
6552 {
6553 struct _opd_sec_data *opd;
6554
6555 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6556 opd = get_opd_info (rsec);
6557 if (opd != NULL && opd->func_sec != NULL)
6558 {
6559 rsec->gc_mark = 1;
6560
6561 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
6562 }
6563 }
6564
6565 return rsec;
6566 }
6567
6568 /* Update the .got, .plt. and dynamic reloc reference counts for the
6569 section being removed. */
6570
6571 static bfd_boolean
6572 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6573 asection *sec, const Elf_Internal_Rela *relocs)
6574 {
6575 struct ppc_link_hash_table *htab;
6576 Elf_Internal_Shdr *symtab_hdr;
6577 struct elf_link_hash_entry **sym_hashes;
6578 struct got_entry **local_got_ents;
6579 const Elf_Internal_Rela *rel, *relend;
6580
6581 if (bfd_link_relocatable (info))
6582 return TRUE;
6583
6584 if ((sec->flags & SEC_ALLOC) == 0)
6585 return TRUE;
6586
6587 elf_section_data (sec)->local_dynrel = NULL;
6588
6589 htab = ppc_hash_table (info);
6590 if (htab == NULL)
6591 return FALSE;
6592
6593 symtab_hdr = &elf_symtab_hdr (abfd);
6594 sym_hashes = elf_sym_hashes (abfd);
6595 local_got_ents = elf_local_got_ents (abfd);
6596
6597 relend = relocs + sec->reloc_count;
6598 for (rel = relocs; rel < relend; rel++)
6599 {
6600 unsigned long r_symndx;
6601 enum elf_ppc64_reloc_type r_type;
6602 struct elf_link_hash_entry *h = NULL;
6603 struct plt_entry **plt_list;
6604 unsigned char tls_type = 0;
6605
6606 r_symndx = ELF64_R_SYM (rel->r_info);
6607 r_type = ELF64_R_TYPE (rel->r_info);
6608 if (r_symndx >= symtab_hdr->sh_info)
6609 {
6610 struct ppc_link_hash_entry *eh;
6611 struct elf_dyn_relocs **pp;
6612 struct elf_dyn_relocs *p;
6613
6614 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6615 h = elf_follow_link (h);
6616 eh = (struct ppc_link_hash_entry *) h;
6617
6618 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6619 if (p->sec == sec)
6620 {
6621 /* Everything must go for SEC. */
6622 *pp = p->next;
6623 break;
6624 }
6625 }
6626
6627 switch (r_type)
6628 {
6629 case R_PPC64_GOT_TLSLD16:
6630 case R_PPC64_GOT_TLSLD16_LO:
6631 case R_PPC64_GOT_TLSLD16_HI:
6632 case R_PPC64_GOT_TLSLD16_HA:
6633 tls_type = TLS_TLS | TLS_LD;
6634 goto dogot;
6635
6636 case R_PPC64_GOT_TLSGD16:
6637 case R_PPC64_GOT_TLSGD16_LO:
6638 case R_PPC64_GOT_TLSGD16_HI:
6639 case R_PPC64_GOT_TLSGD16_HA:
6640 tls_type = TLS_TLS | TLS_GD;
6641 goto dogot;
6642
6643 case R_PPC64_GOT_TPREL16_DS:
6644 case R_PPC64_GOT_TPREL16_LO_DS:
6645 case R_PPC64_GOT_TPREL16_HI:
6646 case R_PPC64_GOT_TPREL16_HA:
6647 tls_type = TLS_TLS | TLS_TPREL;
6648 goto dogot;
6649
6650 case R_PPC64_GOT_DTPREL16_DS:
6651 case R_PPC64_GOT_DTPREL16_LO_DS:
6652 case R_PPC64_GOT_DTPREL16_HI:
6653 case R_PPC64_GOT_DTPREL16_HA:
6654 tls_type = TLS_TLS | TLS_DTPREL;
6655 goto dogot;
6656
6657 case R_PPC64_GOT16:
6658 case R_PPC64_GOT16_DS:
6659 case R_PPC64_GOT16_HA:
6660 case R_PPC64_GOT16_HI:
6661 case R_PPC64_GOT16_LO:
6662 case R_PPC64_GOT16_LO_DS:
6663 dogot:
6664 {
6665 struct got_entry *ent;
6666
6667 if (h != NULL)
6668 ent = h->got.glist;
6669 else
6670 ent = local_got_ents[r_symndx];
6671
6672 for (; ent != NULL; ent = ent->next)
6673 if (ent->addend == rel->r_addend
6674 && ent->owner == abfd
6675 && ent->tls_type == tls_type)
6676 break;
6677 if (ent == NULL)
6678 abort ();
6679 if (ent->got.refcount > 0)
6680 ent->got.refcount -= 1;
6681 }
6682 break;
6683
6684 case R_PPC64_PLT16_HA:
6685 case R_PPC64_PLT16_HI:
6686 case R_PPC64_PLT16_LO:
6687 case R_PPC64_PLT32:
6688 case R_PPC64_PLT64:
6689 case R_PPC64_REL14:
6690 case R_PPC64_REL14_BRNTAKEN:
6691 case R_PPC64_REL14_BRTAKEN:
6692 case R_PPC64_REL24:
6693 plt_list = NULL;
6694 if (h != NULL)
6695 plt_list = &h->plt.plist;
6696 else if (local_got_ents != NULL)
6697 {
6698 struct plt_entry **local_plt = (struct plt_entry **)
6699 (local_got_ents + symtab_hdr->sh_info);
6700 unsigned char *local_got_tls_masks = (unsigned char *)
6701 (local_plt + symtab_hdr->sh_info);
6702 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6703 plt_list = local_plt + r_symndx;
6704 }
6705 if (plt_list)
6706 {
6707 struct plt_entry *ent;
6708
6709 for (ent = *plt_list; ent != NULL; ent = ent->next)
6710 if (ent->addend == rel->r_addend)
6711 break;
6712 if (ent != NULL && ent->plt.refcount > 0)
6713 ent->plt.refcount -= 1;
6714 }
6715 break;
6716
6717 default:
6718 break;
6719 }
6720 }
6721 return TRUE;
6722 }
6723
6724 /* The maximum size of .sfpr. */
6725 #define SFPR_MAX (218*4)
6726
6727 struct sfpr_def_parms
6728 {
6729 const char name[12];
6730 unsigned char lo, hi;
6731 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6732 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6733 };
6734
6735 /* Auto-generate _save*, _rest* functions in .sfpr.
6736 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6737 instead. */
6738
6739 static bfd_boolean
6740 sfpr_define (struct bfd_link_info *info,
6741 const struct sfpr_def_parms *parm,
6742 asection *stub_sec)
6743 {
6744 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6745 unsigned int i;
6746 size_t len = strlen (parm->name);
6747 bfd_boolean writing = FALSE;
6748 char sym[16];
6749
6750 if (htab == NULL)
6751 return FALSE;
6752
6753 memcpy (sym, parm->name, len);
6754 sym[len + 2] = 0;
6755
6756 for (i = parm->lo; i <= parm->hi; i++)
6757 {
6758 struct ppc_link_hash_entry *h;
6759
6760 sym[len + 0] = i / 10 + '0';
6761 sym[len + 1] = i % 10 + '0';
6762 h = (struct ppc_link_hash_entry *)
6763 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
6764 if (stub_sec != NULL)
6765 {
6766 if (h != NULL
6767 && h->elf.root.type == bfd_link_hash_defined
6768 && h->elf.root.u.def.section == htab->sfpr)
6769 {
6770 struct elf_link_hash_entry *s;
6771 char buf[32];
6772 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6773 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6774 if (s == NULL)
6775 return FALSE;
6776 if (s->root.type == bfd_link_hash_new
6777 || (s->root.type = bfd_link_hash_defined
6778 && s->root.u.def.section == stub_sec))
6779 {
6780 s->root.type = bfd_link_hash_defined;
6781 s->root.u.def.section = stub_sec;
6782 s->root.u.def.value = (stub_sec->size
6783 + h->elf.root.u.def.value);
6784 s->ref_regular = 1;
6785 s->def_regular = 1;
6786 s->ref_regular_nonweak = 1;
6787 s->forced_local = 1;
6788 s->non_elf = 0;
6789 s->root.linker_def = 1;
6790 }
6791 }
6792 continue;
6793 }
6794 if (h != NULL)
6795 {
6796 h->save_res = 1;
6797 if (!h->elf.def_regular)
6798 {
6799 h->elf.root.type = bfd_link_hash_defined;
6800 h->elf.root.u.def.section = htab->sfpr;
6801 h->elf.root.u.def.value = htab->sfpr->size;
6802 h->elf.type = STT_FUNC;
6803 h->elf.def_regular = 1;
6804 h->elf.non_elf = 0;
6805 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6806 writing = TRUE;
6807 if (htab->sfpr->contents == NULL)
6808 {
6809 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6810 if (htab->sfpr->contents == NULL)
6811 return FALSE;
6812 }
6813 }
6814 }
6815 if (writing)
6816 {
6817 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6818 if (i != parm->hi)
6819 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6820 else
6821 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6822 htab->sfpr->size = p - htab->sfpr->contents;
6823 }
6824 }
6825
6826 return TRUE;
6827 }
6828
6829 static bfd_byte *
6830 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6831 {
6832 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6833 return p + 4;
6834 }
6835
6836 static bfd_byte *
6837 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6838 {
6839 p = savegpr0 (abfd, p, r);
6840 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6841 p = p + 4;
6842 bfd_put_32 (abfd, BLR, p);
6843 return p + 4;
6844 }
6845
6846 static bfd_byte *
6847 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6848 {
6849 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6850 return p + 4;
6851 }
6852
6853 static bfd_byte *
6854 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6855 {
6856 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6857 p = p + 4;
6858 p = restgpr0 (abfd, p, r);
6859 bfd_put_32 (abfd, MTLR_R0, p);
6860 p = p + 4;
6861 if (r == 29)
6862 {
6863 p = restgpr0 (abfd, p, 30);
6864 p = restgpr0 (abfd, p, 31);
6865 }
6866 bfd_put_32 (abfd, BLR, p);
6867 return p + 4;
6868 }
6869
6870 static bfd_byte *
6871 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6872 {
6873 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6874 return p + 4;
6875 }
6876
6877 static bfd_byte *
6878 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6879 {
6880 p = savegpr1 (abfd, p, r);
6881 bfd_put_32 (abfd, BLR, p);
6882 return p + 4;
6883 }
6884
6885 static bfd_byte *
6886 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6887 {
6888 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6889 return p + 4;
6890 }
6891
6892 static bfd_byte *
6893 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6894 {
6895 p = restgpr1 (abfd, p, r);
6896 bfd_put_32 (abfd, BLR, p);
6897 return p + 4;
6898 }
6899
6900 static bfd_byte *
6901 savefpr (bfd *abfd, bfd_byte *p, int r)
6902 {
6903 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6904 return p + 4;
6905 }
6906
6907 static bfd_byte *
6908 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6909 {
6910 p = savefpr (abfd, p, r);
6911 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6912 p = p + 4;
6913 bfd_put_32 (abfd, BLR, p);
6914 return p + 4;
6915 }
6916
6917 static bfd_byte *
6918 restfpr (bfd *abfd, bfd_byte *p, int r)
6919 {
6920 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6921 return p + 4;
6922 }
6923
6924 static bfd_byte *
6925 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6926 {
6927 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6928 p = p + 4;
6929 p = restfpr (abfd, p, r);
6930 bfd_put_32 (abfd, MTLR_R0, p);
6931 p = p + 4;
6932 if (r == 29)
6933 {
6934 p = restfpr (abfd, p, 30);
6935 p = restfpr (abfd, p, 31);
6936 }
6937 bfd_put_32 (abfd, BLR, p);
6938 return p + 4;
6939 }
6940
6941 static bfd_byte *
6942 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6943 {
6944 p = savefpr (abfd, p, r);
6945 bfd_put_32 (abfd, BLR, p);
6946 return p + 4;
6947 }
6948
6949 static bfd_byte *
6950 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6951 {
6952 p = restfpr (abfd, p, r);
6953 bfd_put_32 (abfd, BLR, p);
6954 return p + 4;
6955 }
6956
6957 static bfd_byte *
6958 savevr (bfd *abfd, bfd_byte *p, int r)
6959 {
6960 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6961 p = p + 4;
6962 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6963 return p + 4;
6964 }
6965
6966 static bfd_byte *
6967 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6968 {
6969 p = savevr (abfd, p, r);
6970 bfd_put_32 (abfd, BLR, p);
6971 return p + 4;
6972 }
6973
6974 static bfd_byte *
6975 restvr (bfd *abfd, bfd_byte *p, int r)
6976 {
6977 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6978 p = p + 4;
6979 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6980 return p + 4;
6981 }
6982
6983 static bfd_byte *
6984 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6985 {
6986 p = restvr (abfd, p, r);
6987 bfd_put_32 (abfd, BLR, p);
6988 return p + 4;
6989 }
6990
6991 /* Called via elf_link_hash_traverse to transfer dynamic linking
6992 information on function code symbol entries to their corresponding
6993 function descriptor symbol entries. */
6994
6995 static bfd_boolean
6996 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6997 {
6998 struct bfd_link_info *info;
6999 struct ppc_link_hash_table *htab;
7000 struct ppc_link_hash_entry *fh;
7001 struct ppc_link_hash_entry *fdh;
7002 bfd_boolean force_local;
7003
7004 fh = (struct ppc_link_hash_entry *) h;
7005 if (fh->elf.root.type == bfd_link_hash_indirect)
7006 return TRUE;
7007
7008 if (!fh->is_func)
7009 return TRUE;
7010
7011 if (fh->elf.root.root.string[0] != '.'
7012 || fh->elf.root.root.string[1] == '\0')
7013 return TRUE;
7014
7015 info = inf;
7016 htab = ppc_hash_table (info);
7017 if (htab == NULL)
7018 return FALSE;
7019
7020 /* Find the corresponding function descriptor symbol. */
7021 fdh = lookup_fdh (fh, htab);
7022
7023 /* Resolve undefined references to dot-symbols as the value
7024 in the function descriptor, if we have one in a regular object.
7025 This is to satisfy cases like ".quad .foo". Calls to functions
7026 in dynamic objects are handled elsewhere. */
7027 if ((fh->elf.root.type == bfd_link_hash_undefined
7028 || fh->elf.root.type == bfd_link_hash_undefweak)
7029 && (fdh->elf.root.type == bfd_link_hash_defined
7030 || fdh->elf.root.type == bfd_link_hash_defweak)
7031 && get_opd_info (fdh->elf.root.u.def.section) != NULL
7032 && opd_entry_value (fdh->elf.root.u.def.section,
7033 fdh->elf.root.u.def.value,
7034 &fh->elf.root.u.def.section,
7035 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
7036 {
7037 fh->elf.root.type = fdh->elf.root.type;
7038 fh->elf.forced_local = 1;
7039 fh->elf.def_regular = fdh->elf.def_regular;
7040 fh->elf.def_dynamic = fdh->elf.def_dynamic;
7041 }
7042
7043 if (!fh->elf.dynamic)
7044 {
7045 struct plt_entry *ent;
7046
7047 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
7048 if (ent->plt.refcount > 0)
7049 break;
7050 if (ent == NULL)
7051 return TRUE;
7052 }
7053
7054 /* Create a descriptor as undefined if necessary. */
7055 if (fdh == NULL
7056 && !bfd_link_executable (info)
7057 && (fh->elf.root.type == bfd_link_hash_undefined
7058 || fh->elf.root.type == bfd_link_hash_undefweak))
7059 {
7060 fdh = make_fdh (info, fh);
7061 if (fdh == NULL)
7062 return FALSE;
7063 }
7064
7065 /* We can't support overriding of symbols on a fake descriptor. */
7066 if (fdh != NULL
7067 && fdh->fake
7068 && (fh->elf.root.type == bfd_link_hash_defined
7069 || fh->elf.root.type == bfd_link_hash_defweak))
7070 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
7071
7072 /* Transfer dynamic linking information to the function descriptor. */
7073 if (fdh != NULL)
7074 {
7075 fdh->elf.ref_regular |= fh->elf.ref_regular;
7076 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
7077 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
7078 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
7079 fdh->elf.dynamic |= fh->elf.dynamic;
7080 fdh->elf.needs_plt |= (fh->elf.needs_plt
7081 || fh->elf.type == STT_FUNC
7082 || fh->elf.type == STT_GNU_IFUNC);
7083 move_plt_plist (fh, fdh);
7084
7085 if (!fdh->elf.forced_local
7086 && fh->elf.dynindx != -1)
7087 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
7088 return FALSE;
7089 }
7090
7091 /* Now that the info is on the function descriptor, clear the
7092 function code sym info. Any function code syms for which we
7093 don't have a definition in a regular file, we force local.
7094 This prevents a shared library from exporting syms that have
7095 been imported from another library. Function code syms that
7096 are really in the library we must leave global to prevent the
7097 linker dragging in a definition from a static library. */
7098 force_local = (!fh->elf.def_regular
7099 || fdh == NULL
7100 || !fdh->elf.def_regular
7101 || fdh->elf.forced_local);
7102 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7103
7104 return TRUE;
7105 }
7106
7107 static const struct sfpr_def_parms save_res_funcs[] =
7108 {
7109 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7110 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7111 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7112 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7113 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7114 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7115 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7116 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7117 { "._savef", 14, 31, savefpr, savefpr1_tail },
7118 { "._restf", 14, 31, restfpr, restfpr1_tail },
7119 { "_savevr_", 20, 31, savevr, savevr_tail },
7120 { "_restvr_", 20, 31, restvr, restvr_tail }
7121 };
7122
7123 /* Called near the start of bfd_elf_size_dynamic_sections. We use
7124 this hook to a) provide some gcc support functions, and b) transfer
7125 dynamic linking information gathered so far on function code symbol
7126 entries, to their corresponding function descriptor symbol entries. */
7127
7128 static bfd_boolean
7129 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7130 struct bfd_link_info *info)
7131 {
7132 struct ppc_link_hash_table *htab;
7133
7134 htab = ppc_hash_table (info);
7135 if (htab == NULL)
7136 return FALSE;
7137
7138 /* Provide any missing _save* and _rest* functions. */
7139 if (htab->sfpr != NULL)
7140 {
7141 unsigned int i;
7142
7143 htab->sfpr->size = 0;
7144 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7145 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7146 return FALSE;
7147 if (htab->sfpr->size == 0)
7148 htab->sfpr->flags |= SEC_EXCLUDE;
7149 }
7150
7151 if (bfd_link_relocatable (info))
7152 return TRUE;
7153
7154 if (htab->elf.hgot != NULL)
7155 {
7156 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7157 /* Make .TOC. defined so as to prevent it being made dynamic.
7158 The wrong value here is fixed later in ppc64_elf_set_toc. */
7159 if (!htab->elf.hgot->def_regular
7160 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7161 {
7162 htab->elf.hgot->root.type = bfd_link_hash_defined;
7163 htab->elf.hgot->root.u.def.value = 0;
7164 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7165 htab->elf.hgot->def_regular = 1;
7166 htab->elf.hgot->root.linker_def = 1;
7167 }
7168 htab->elf.hgot->type = STT_OBJECT;
7169 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7170 | STV_HIDDEN);
7171 }
7172
7173 if (htab->need_func_desc_adj)
7174 {
7175 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7176 htab->need_func_desc_adj = 0;
7177 }
7178
7179 return TRUE;
7180 }
7181
7182 /* Return true if we have dynamic relocs against H that apply to
7183 read-only sections. */
7184
7185 static bfd_boolean
7186 readonly_dynrelocs (struct elf_link_hash_entry *h)
7187 {
7188 struct ppc_link_hash_entry *eh;
7189 struct elf_dyn_relocs *p;
7190
7191 eh = (struct ppc_link_hash_entry *) h;
7192 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7193 {
7194 asection *s = p->sec->output_section;
7195
7196 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7197 return TRUE;
7198 }
7199 return FALSE;
7200 }
7201
7202 /* Return true if we have dynamic relocs against H or any of its weak
7203 aliases, that apply to read-only sections. */
7204
7205 static bfd_boolean
7206 alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7207 {
7208 struct ppc_link_hash_entry *eh;
7209
7210 eh = (struct ppc_link_hash_entry *) h;
7211 do
7212 {
7213 if (readonly_dynrelocs (&eh->elf))
7214 return TRUE;
7215 eh = eh->weakref;
7216 } while (eh != NULL && &eh->elf != h);
7217
7218 return FALSE;
7219 }
7220
7221 /* Return whether EH has pc-relative dynamic relocs. */
7222
7223 static bfd_boolean
7224 pc_dynrelocs (struct ppc_link_hash_entry *eh)
7225 {
7226 struct elf_dyn_relocs *p;
7227
7228 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7229 if (p->pc_count != 0)
7230 return TRUE;
7231 return FALSE;
7232 }
7233
7234 /* Return true if a global entry stub will be created for H. Valid
7235 for ELFv2 before plt entries have been allocated. */
7236
7237 static bfd_boolean
7238 global_entry_stub (struct elf_link_hash_entry *h)
7239 {
7240 struct plt_entry *pent;
7241
7242 if (!h->pointer_equality_needed
7243 || h->def_regular)
7244 return FALSE;
7245
7246 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7247 if (pent->plt.refcount > 0
7248 && pent->addend == 0)
7249 return TRUE;
7250
7251 return FALSE;
7252 }
7253
7254 /* Adjust a symbol defined by a dynamic object and referenced by a
7255 regular object. The current definition is in some section of the
7256 dynamic object, but we're not including those sections. We have to
7257 change the definition to something the rest of the link can
7258 understand. */
7259
7260 static bfd_boolean
7261 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7262 struct elf_link_hash_entry *h)
7263 {
7264 struct ppc_link_hash_table *htab;
7265 asection *s;
7266
7267 htab = ppc_hash_table (info);
7268 if (htab == NULL)
7269 return FALSE;
7270
7271 /* Deal with function syms. */
7272 if (h->type == STT_FUNC
7273 || h->type == STT_GNU_IFUNC
7274 || h->needs_plt)
7275 {
7276 /* Clear procedure linkage table information for any symbol that
7277 won't need a .plt entry. */
7278 struct plt_entry *ent;
7279 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7280 if (ent->plt.refcount > 0)
7281 break;
7282 if (ent == NULL
7283 || (h->type != STT_GNU_IFUNC
7284 && (SYMBOL_CALLS_LOCAL (info, h)
7285 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7286 && h->root.type == bfd_link_hash_undefweak)))
7287 || ((struct ppc_link_hash_entry *) h)->save_res)
7288 {
7289 h->plt.plist = NULL;
7290 h->needs_plt = 0;
7291 h->pointer_equality_needed = 0;
7292 }
7293 else if (abiversion (info->output_bfd) >= 2)
7294 {
7295 /* Taking a function's address in a read/write section
7296 doesn't require us to define the function symbol in the
7297 executable on a global entry stub. A dynamic reloc can
7298 be used instead. The reason we prefer a few more dynamic
7299 relocs is that calling via a global entry stub costs a
7300 few more instructions, and pointer_equality_needed causes
7301 extra work in ld.so when resolving these symbols. */
7302 if (global_entry_stub (h)
7303 && !alias_readonly_dynrelocs (h))
7304 {
7305 h->pointer_equality_needed = 0;
7306 /* After adjust_dynamic_symbol, non_got_ref set in
7307 the non-pic case means that dyn_relocs for this
7308 symbol should be discarded. */
7309 h->non_got_ref = 0;
7310 }
7311
7312 /* If making a plt entry, then we don't need copy relocs. */
7313 return TRUE;
7314 }
7315 }
7316 else
7317 h->plt.plist = NULL;
7318
7319 /* If this is a weak symbol, and there is a real definition, the
7320 processor independent code will have arranged for us to see the
7321 real definition first, and we can just use the same value. */
7322 if (h->u.weakdef != NULL)
7323 {
7324 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7325 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7326 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7327 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7328 if (ELIMINATE_COPY_RELOCS)
7329 h->non_got_ref = h->u.weakdef->non_got_ref;
7330 return TRUE;
7331 }
7332
7333 /* If we are creating a shared library, we must presume that the
7334 only references to the symbol are via the global offset table.
7335 For such cases we need not do anything here; the relocations will
7336 be handled correctly by relocate_section. */
7337 if (bfd_link_pic (info))
7338 return TRUE;
7339
7340 /* If there are no references to this symbol that do not use the
7341 GOT, we don't need to generate a copy reloc. */
7342 if (!h->non_got_ref)
7343 return TRUE;
7344
7345 /* Don't generate a copy reloc for symbols defined in the executable. */
7346 if (!h->def_dynamic || !h->ref_regular || h->def_regular
7347
7348 /* If -z nocopyreloc was given, don't generate them either. */
7349 || info->nocopyreloc
7350
7351 /* If we didn't find any dynamic relocs in read-only sections, then
7352 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7353 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
7354
7355 /* Protected variables do not work with .dynbss. The copy in
7356 .dynbss won't be used by the shared library with the protected
7357 definition for the variable. Text relocations are preferable
7358 to an incorrect program. */
7359 || h->protected_def)
7360 {
7361 h->non_got_ref = 0;
7362 return TRUE;
7363 }
7364
7365 if (h->plt.plist != NULL)
7366 {
7367 /* We should never get here, but unfortunately there are versions
7368 of gcc out there that improperly (for this ABI) put initialized
7369 function pointers, vtable refs and suchlike in read-only
7370 sections. Allow them to proceed, but warn that this might
7371 break at runtime. */
7372 info->callbacks->einfo
7373 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7374 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7375 h->root.root.string);
7376 }
7377
7378 /* This is a reference to a symbol defined by a dynamic object which
7379 is not a function. */
7380
7381 /* We must allocate the symbol in our .dynbss section, which will
7382 become part of the .bss section of the executable. There will be
7383 an entry for this symbol in the .dynsym section. The dynamic
7384 object will contain position independent code, so all references
7385 from the dynamic object to this symbol will go through the global
7386 offset table. The dynamic linker will use the .dynsym entry to
7387 determine the address it must put in the global offset table, so
7388 both the dynamic object and the regular object will refer to the
7389 same memory location for the variable. */
7390
7391 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7392 to copy the initial value out of the dynamic object and into the
7393 runtime process image. We need to remember the offset into the
7394 .rela.bss section we are going to use. */
7395 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7396 {
7397 htab->relbss->size += sizeof (Elf64_External_Rela);
7398 h->needs_copy = 1;
7399 }
7400
7401 s = htab->dynbss;
7402
7403 return _bfd_elf_adjust_dynamic_copy (info, h, s);
7404 }
7405
7406 /* If given a function descriptor symbol, hide both the function code
7407 sym and the descriptor. */
7408 static void
7409 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7410 struct elf_link_hash_entry *h,
7411 bfd_boolean force_local)
7412 {
7413 struct ppc_link_hash_entry *eh;
7414 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7415
7416 eh = (struct ppc_link_hash_entry *) h;
7417 if (eh->is_func_descriptor)
7418 {
7419 struct ppc_link_hash_entry *fh = eh->oh;
7420
7421 if (fh == NULL)
7422 {
7423 const char *p, *q;
7424 struct elf_link_hash_table *htab = elf_hash_table (info);
7425 char save;
7426
7427 /* We aren't supposed to use alloca in BFD because on
7428 systems which do not have alloca the version in libiberty
7429 calls xmalloc, which might cause the program to crash
7430 when it runs out of memory. This function doesn't have a
7431 return status, so there's no way to gracefully return an
7432 error. So cheat. We know that string[-1] can be safely
7433 accessed; It's either a string in an ELF string table,
7434 or allocated in an objalloc structure. */
7435
7436 p = eh->elf.root.root.string - 1;
7437 save = *p;
7438 *(char *) p = '.';
7439 fh = (struct ppc_link_hash_entry *)
7440 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7441 *(char *) p = save;
7442
7443 /* Unfortunately, if it so happens that the string we were
7444 looking for was allocated immediately before this string,
7445 then we overwrote the string terminator. That's the only
7446 reason the lookup should fail. */
7447 if (fh == NULL)
7448 {
7449 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7450 while (q >= eh->elf.root.root.string && *q == *p)
7451 --q, --p;
7452 if (q < eh->elf.root.root.string && *p == '.')
7453 fh = (struct ppc_link_hash_entry *)
7454 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7455 }
7456 if (fh != NULL)
7457 {
7458 eh->oh = fh;
7459 fh->oh = eh;
7460 }
7461 }
7462 if (fh != NULL)
7463 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7464 }
7465 }
7466
7467 static bfd_boolean
7468 get_sym_h (struct elf_link_hash_entry **hp,
7469 Elf_Internal_Sym **symp,
7470 asection **symsecp,
7471 unsigned char **tls_maskp,
7472 Elf_Internal_Sym **locsymsp,
7473 unsigned long r_symndx,
7474 bfd *ibfd)
7475 {
7476 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7477
7478 if (r_symndx >= symtab_hdr->sh_info)
7479 {
7480 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7481 struct elf_link_hash_entry *h;
7482
7483 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7484 h = elf_follow_link (h);
7485
7486 if (hp != NULL)
7487 *hp = h;
7488
7489 if (symp != NULL)
7490 *symp = NULL;
7491
7492 if (symsecp != NULL)
7493 {
7494 asection *symsec = NULL;
7495 if (h->root.type == bfd_link_hash_defined
7496 || h->root.type == bfd_link_hash_defweak)
7497 symsec = h->root.u.def.section;
7498 *symsecp = symsec;
7499 }
7500
7501 if (tls_maskp != NULL)
7502 {
7503 struct ppc_link_hash_entry *eh;
7504
7505 eh = (struct ppc_link_hash_entry *) h;
7506 *tls_maskp = &eh->tls_mask;
7507 }
7508 }
7509 else
7510 {
7511 Elf_Internal_Sym *sym;
7512 Elf_Internal_Sym *locsyms = *locsymsp;
7513
7514 if (locsyms == NULL)
7515 {
7516 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7517 if (locsyms == NULL)
7518 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7519 symtab_hdr->sh_info,
7520 0, NULL, NULL, NULL);
7521 if (locsyms == NULL)
7522 return FALSE;
7523 *locsymsp = locsyms;
7524 }
7525 sym = locsyms + r_symndx;
7526
7527 if (hp != NULL)
7528 *hp = NULL;
7529
7530 if (symp != NULL)
7531 *symp = sym;
7532
7533 if (symsecp != NULL)
7534 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7535
7536 if (tls_maskp != NULL)
7537 {
7538 struct got_entry **lgot_ents;
7539 unsigned char *tls_mask;
7540
7541 tls_mask = NULL;
7542 lgot_ents = elf_local_got_ents (ibfd);
7543 if (lgot_ents != NULL)
7544 {
7545 struct plt_entry **local_plt = (struct plt_entry **)
7546 (lgot_ents + symtab_hdr->sh_info);
7547 unsigned char *lgot_masks = (unsigned char *)
7548 (local_plt + symtab_hdr->sh_info);
7549 tls_mask = &lgot_masks[r_symndx];
7550 }
7551 *tls_maskp = tls_mask;
7552 }
7553 }
7554 return TRUE;
7555 }
7556
7557 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7558 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7559 type suitable for optimization, and 1 otherwise. */
7560
7561 static int
7562 get_tls_mask (unsigned char **tls_maskp,
7563 unsigned long *toc_symndx,
7564 bfd_vma *toc_addend,
7565 Elf_Internal_Sym **locsymsp,
7566 const Elf_Internal_Rela *rel,
7567 bfd *ibfd)
7568 {
7569 unsigned long r_symndx;
7570 int next_r;
7571 struct elf_link_hash_entry *h;
7572 Elf_Internal_Sym *sym;
7573 asection *sec;
7574 bfd_vma off;
7575
7576 r_symndx = ELF64_R_SYM (rel->r_info);
7577 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7578 return 0;
7579
7580 if ((*tls_maskp != NULL && **tls_maskp != 0)
7581 || sec == NULL
7582 || ppc64_elf_section_data (sec) == NULL
7583 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7584 return 1;
7585
7586 /* Look inside a TOC section too. */
7587 if (h != NULL)
7588 {
7589 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7590 off = h->root.u.def.value;
7591 }
7592 else
7593 off = sym->st_value;
7594 off += rel->r_addend;
7595 BFD_ASSERT (off % 8 == 0);
7596 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7597 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7598 if (toc_symndx != NULL)
7599 *toc_symndx = r_symndx;
7600 if (toc_addend != NULL)
7601 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7602 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7603 return 0;
7604 if ((h == NULL || is_static_defined (h))
7605 && (next_r == -1 || next_r == -2))
7606 return 1 - next_r;
7607 return 1;
7608 }
7609
7610 /* Find (or create) an entry in the tocsave hash table. */
7611
7612 static struct tocsave_entry *
7613 tocsave_find (struct ppc_link_hash_table *htab,
7614 enum insert_option insert,
7615 Elf_Internal_Sym **local_syms,
7616 const Elf_Internal_Rela *irela,
7617 bfd *ibfd)
7618 {
7619 unsigned long r_indx;
7620 struct elf_link_hash_entry *h;
7621 Elf_Internal_Sym *sym;
7622 struct tocsave_entry ent, *p;
7623 hashval_t hash;
7624 struct tocsave_entry **slot;
7625
7626 r_indx = ELF64_R_SYM (irela->r_info);
7627 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7628 return NULL;
7629 if (ent.sec == NULL || ent.sec->output_section == NULL)
7630 {
7631 _bfd_error_handler
7632 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7633 return NULL;
7634 }
7635
7636 if (h != NULL)
7637 ent.offset = h->root.u.def.value;
7638 else
7639 ent.offset = sym->st_value;
7640 ent.offset += irela->r_addend;
7641
7642 hash = tocsave_htab_hash (&ent);
7643 slot = ((struct tocsave_entry **)
7644 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7645 if (slot == NULL)
7646 return NULL;
7647
7648 if (*slot == NULL)
7649 {
7650 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7651 if (p == NULL)
7652 return NULL;
7653 *p = ent;
7654 *slot = p;
7655 }
7656 return *slot;
7657 }
7658
7659 /* Adjust all global syms defined in opd sections. In gcc generated
7660 code for the old ABI, these will already have been done. */
7661
7662 static bfd_boolean
7663 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7664 {
7665 struct ppc_link_hash_entry *eh;
7666 asection *sym_sec;
7667 struct _opd_sec_data *opd;
7668
7669 if (h->root.type == bfd_link_hash_indirect)
7670 return TRUE;
7671
7672 if (h->root.type != bfd_link_hash_defined
7673 && h->root.type != bfd_link_hash_defweak)
7674 return TRUE;
7675
7676 eh = (struct ppc_link_hash_entry *) h;
7677 if (eh->adjust_done)
7678 return TRUE;
7679
7680 sym_sec = eh->elf.root.u.def.section;
7681 opd = get_opd_info (sym_sec);
7682 if (opd != NULL && opd->adjust != NULL)
7683 {
7684 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
7685 if (adjust == -1)
7686 {
7687 /* This entry has been deleted. */
7688 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7689 if (dsec == NULL)
7690 {
7691 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7692 if (discarded_section (dsec))
7693 {
7694 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7695 break;
7696 }
7697 }
7698 eh->elf.root.u.def.value = 0;
7699 eh->elf.root.u.def.section = dsec;
7700 }
7701 else
7702 eh->elf.root.u.def.value += adjust;
7703 eh->adjust_done = 1;
7704 }
7705 return TRUE;
7706 }
7707
7708 /* Handles decrementing dynamic reloc counts for the reloc specified by
7709 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7710 have already been determined. */
7711
7712 static bfd_boolean
7713 dec_dynrel_count (bfd_vma r_info,
7714 asection *sec,
7715 struct bfd_link_info *info,
7716 Elf_Internal_Sym **local_syms,
7717 struct elf_link_hash_entry *h,
7718 Elf_Internal_Sym *sym)
7719 {
7720 enum elf_ppc64_reloc_type r_type;
7721 asection *sym_sec = NULL;
7722
7723 /* Can this reloc be dynamic? This switch, and later tests here
7724 should be kept in sync with the code in check_relocs. */
7725 r_type = ELF64_R_TYPE (r_info);
7726 switch (r_type)
7727 {
7728 default:
7729 return TRUE;
7730
7731 case R_PPC64_TPREL16:
7732 case R_PPC64_TPREL16_LO:
7733 case R_PPC64_TPREL16_HI:
7734 case R_PPC64_TPREL16_HA:
7735 case R_PPC64_TPREL16_DS:
7736 case R_PPC64_TPREL16_LO_DS:
7737 case R_PPC64_TPREL16_HIGH:
7738 case R_PPC64_TPREL16_HIGHA:
7739 case R_PPC64_TPREL16_HIGHER:
7740 case R_PPC64_TPREL16_HIGHERA:
7741 case R_PPC64_TPREL16_HIGHEST:
7742 case R_PPC64_TPREL16_HIGHESTA:
7743 if (!bfd_link_pic (info))
7744 return TRUE;
7745
7746 case R_PPC64_TPREL64:
7747 case R_PPC64_DTPMOD64:
7748 case R_PPC64_DTPREL64:
7749 case R_PPC64_ADDR64:
7750 case R_PPC64_REL30:
7751 case R_PPC64_REL32:
7752 case R_PPC64_REL64:
7753 case R_PPC64_ADDR14:
7754 case R_PPC64_ADDR14_BRNTAKEN:
7755 case R_PPC64_ADDR14_BRTAKEN:
7756 case R_PPC64_ADDR16:
7757 case R_PPC64_ADDR16_DS:
7758 case R_PPC64_ADDR16_HA:
7759 case R_PPC64_ADDR16_HI:
7760 case R_PPC64_ADDR16_HIGH:
7761 case R_PPC64_ADDR16_HIGHA:
7762 case R_PPC64_ADDR16_HIGHER:
7763 case R_PPC64_ADDR16_HIGHERA:
7764 case R_PPC64_ADDR16_HIGHEST:
7765 case R_PPC64_ADDR16_HIGHESTA:
7766 case R_PPC64_ADDR16_LO:
7767 case R_PPC64_ADDR16_LO_DS:
7768 case R_PPC64_ADDR24:
7769 case R_PPC64_ADDR32:
7770 case R_PPC64_UADDR16:
7771 case R_PPC64_UADDR32:
7772 case R_PPC64_UADDR64:
7773 case R_PPC64_TOC:
7774 break;
7775 }
7776
7777 if (local_syms != NULL)
7778 {
7779 unsigned long r_symndx;
7780 bfd *ibfd = sec->owner;
7781
7782 r_symndx = ELF64_R_SYM (r_info);
7783 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7784 return FALSE;
7785 }
7786
7787 if ((bfd_link_pic (info)
7788 && (must_be_dyn_reloc (info, r_type)
7789 || (h != NULL
7790 && (!SYMBOLIC_BIND (info, h)
7791 || h->root.type == bfd_link_hash_defweak
7792 || !h->def_regular))))
7793 || (ELIMINATE_COPY_RELOCS
7794 && !bfd_link_pic (info)
7795 && h != NULL
7796 && (h->root.type == bfd_link_hash_defweak
7797 || !h->def_regular)))
7798 ;
7799 else
7800 return TRUE;
7801
7802 if (h != NULL)
7803 {
7804 struct elf_dyn_relocs *p;
7805 struct elf_dyn_relocs **pp;
7806 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7807
7808 /* elf_gc_sweep may have already removed all dyn relocs associated
7809 with local syms for a given section. Also, symbol flags are
7810 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7811 report a dynreloc miscount. */
7812 if (*pp == NULL && info->gc_sections)
7813 return TRUE;
7814
7815 while ((p = *pp) != NULL)
7816 {
7817 if (p->sec == sec)
7818 {
7819 if (!must_be_dyn_reloc (info, r_type))
7820 p->pc_count -= 1;
7821 p->count -= 1;
7822 if (p->count == 0)
7823 *pp = p->next;
7824 return TRUE;
7825 }
7826 pp = &p->next;
7827 }
7828 }
7829 else
7830 {
7831 struct ppc_dyn_relocs *p;
7832 struct ppc_dyn_relocs **pp;
7833 void *vpp;
7834 bfd_boolean is_ifunc;
7835
7836 if (local_syms == NULL)
7837 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7838 if (sym_sec == NULL)
7839 sym_sec = sec;
7840
7841 vpp = &elf_section_data (sym_sec)->local_dynrel;
7842 pp = (struct ppc_dyn_relocs **) vpp;
7843
7844 if (*pp == NULL && info->gc_sections)
7845 return TRUE;
7846
7847 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7848 while ((p = *pp) != NULL)
7849 {
7850 if (p->sec == sec && p->ifunc == is_ifunc)
7851 {
7852 p->count -= 1;
7853 if (p->count == 0)
7854 *pp = p->next;
7855 return TRUE;
7856 }
7857 pp = &p->next;
7858 }
7859 }
7860
7861 /* xgettext:c-format */
7862 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7863 sec->owner, sec);
7864 bfd_set_error (bfd_error_bad_value);
7865 return FALSE;
7866 }
7867
7868 /* Remove unused Official Procedure Descriptor entries. Currently we
7869 only remove those associated with functions in discarded link-once
7870 sections, or weakly defined functions that have been overridden. It
7871 would be possible to remove many more entries for statically linked
7872 applications. */
7873
7874 bfd_boolean
7875 ppc64_elf_edit_opd (struct bfd_link_info *info)
7876 {
7877 bfd *ibfd;
7878 bfd_boolean some_edited = FALSE;
7879 asection *need_pad = NULL;
7880 struct ppc_link_hash_table *htab;
7881
7882 htab = ppc_hash_table (info);
7883 if (htab == NULL)
7884 return FALSE;
7885
7886 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7887 {
7888 asection *sec;
7889 Elf_Internal_Rela *relstart, *rel, *relend;
7890 Elf_Internal_Shdr *symtab_hdr;
7891 Elf_Internal_Sym *local_syms;
7892 struct _opd_sec_data *opd;
7893 bfd_boolean need_edit, add_aux_fields, broken;
7894 bfd_size_type cnt_16b = 0;
7895
7896 if (!is_ppc64_elf (ibfd))
7897 continue;
7898
7899 sec = bfd_get_section_by_name (ibfd, ".opd");
7900 if (sec == NULL || sec->size == 0)
7901 continue;
7902
7903 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7904 continue;
7905
7906 if (sec->output_section == bfd_abs_section_ptr)
7907 continue;
7908
7909 /* Look through the section relocs. */
7910 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7911 continue;
7912
7913 local_syms = NULL;
7914 symtab_hdr = &elf_symtab_hdr (ibfd);
7915
7916 /* Read the relocations. */
7917 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7918 info->keep_memory);
7919 if (relstart == NULL)
7920 return FALSE;
7921
7922 /* First run through the relocs to check they are sane, and to
7923 determine whether we need to edit this opd section. */
7924 need_edit = FALSE;
7925 broken = FALSE;
7926 need_pad = sec;
7927 relend = relstart + sec->reloc_count;
7928 for (rel = relstart; rel < relend; )
7929 {
7930 enum elf_ppc64_reloc_type r_type;
7931 unsigned long r_symndx;
7932 asection *sym_sec;
7933 struct elf_link_hash_entry *h;
7934 Elf_Internal_Sym *sym;
7935 bfd_vma offset;
7936
7937 /* .opd contains an array of 16 or 24 byte entries. We're
7938 only interested in the reloc pointing to a function entry
7939 point. */
7940 offset = rel->r_offset;
7941 if (rel + 1 == relend
7942 || rel[1].r_offset != offset + 8)
7943 {
7944 /* If someone messes with .opd alignment then after a
7945 "ld -r" we might have padding in the middle of .opd.
7946 Also, there's nothing to prevent someone putting
7947 something silly in .opd with the assembler. No .opd
7948 optimization for them! */
7949 broken_opd:
7950 _bfd_error_handler
7951 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7952 broken = TRUE;
7953 break;
7954 }
7955
7956 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7957 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7958 {
7959 _bfd_error_handler
7960 /* xgettext:c-format */
7961 (_("%B: unexpected reloc type %u in .opd section"),
7962 ibfd, r_type);
7963 broken = TRUE;
7964 break;
7965 }
7966
7967 r_symndx = ELF64_R_SYM (rel->r_info);
7968 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7969 r_symndx, ibfd))
7970 goto error_ret;
7971
7972 if (sym_sec == NULL || sym_sec->owner == NULL)
7973 {
7974 const char *sym_name;
7975 if (h != NULL)
7976 sym_name = h->root.root.string;
7977 else
7978 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7979 sym_sec);
7980
7981 _bfd_error_handler
7982 /* xgettext:c-format */
7983 (_("%B: undefined sym `%s' in .opd section"),
7984 ibfd, sym_name);
7985 broken = TRUE;
7986 break;
7987 }
7988
7989 /* opd entries are always for functions defined in the
7990 current input bfd. If the symbol isn't defined in the
7991 input bfd, then we won't be using the function in this
7992 bfd; It must be defined in a linkonce section in another
7993 bfd, or is weak. It's also possible that we are
7994 discarding the function due to a linker script /DISCARD/,
7995 which we test for via the output_section. */
7996 if (sym_sec->owner != ibfd
7997 || sym_sec->output_section == bfd_abs_section_ptr)
7998 need_edit = TRUE;
7999
8000 rel += 2;
8001 if (rel + 1 == relend
8002 || (rel + 2 < relend
8003 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
8004 ++rel;
8005
8006 if (rel == relend)
8007 {
8008 if (sec->size == offset + 24)
8009 {
8010 need_pad = NULL;
8011 break;
8012 }
8013 if (sec->size == offset + 16)
8014 {
8015 cnt_16b++;
8016 break;
8017 }
8018 goto broken_opd;
8019 }
8020 else if (rel + 1 < relend
8021 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
8022 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
8023 {
8024 if (rel[0].r_offset == offset + 16)
8025 cnt_16b++;
8026 else if (rel[0].r_offset != offset + 24)
8027 goto broken_opd;
8028 }
8029 else
8030 goto broken_opd;
8031 }
8032
8033 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
8034
8035 if (!broken && (need_edit || add_aux_fields))
8036 {
8037 Elf_Internal_Rela *write_rel;
8038 Elf_Internal_Shdr *rel_hdr;
8039 bfd_byte *rptr, *wptr;
8040 bfd_byte *new_contents;
8041 bfd_size_type amt;
8042
8043 new_contents = NULL;
8044 amt = OPD_NDX (sec->size) * sizeof (long);
8045 opd = &ppc64_elf_section_data (sec)->u.opd;
8046 opd->adjust = bfd_zalloc (sec->owner, amt);
8047 if (opd->adjust == NULL)
8048 return FALSE;
8049 ppc64_elf_section_data (sec)->sec_type = sec_opd;
8050
8051 /* This seems a waste of time as input .opd sections are all
8052 zeros as generated by gcc, but I suppose there's no reason
8053 this will always be so. We might start putting something in
8054 the third word of .opd entries. */
8055 if ((sec->flags & SEC_IN_MEMORY) == 0)
8056 {
8057 bfd_byte *loc;
8058 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
8059 {
8060 if (loc != NULL)
8061 free (loc);
8062 error_ret:
8063 if (local_syms != NULL
8064 && symtab_hdr->contents != (unsigned char *) local_syms)
8065 free (local_syms);
8066 if (elf_section_data (sec)->relocs != relstart)
8067 free (relstart);
8068 return FALSE;
8069 }
8070 sec->contents = loc;
8071 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8072 }
8073
8074 elf_section_data (sec)->relocs = relstart;
8075
8076 new_contents = sec->contents;
8077 if (add_aux_fields)
8078 {
8079 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
8080 if (new_contents == NULL)
8081 return FALSE;
8082 need_pad = NULL;
8083 }
8084 wptr = new_contents;
8085 rptr = sec->contents;
8086 write_rel = relstart;
8087 for (rel = relstart; rel < relend; )
8088 {
8089 unsigned long r_symndx;
8090 asection *sym_sec;
8091 struct elf_link_hash_entry *h;
8092 struct ppc_link_hash_entry *fdh = NULL;
8093 Elf_Internal_Sym *sym;
8094 long opd_ent_size;
8095 Elf_Internal_Rela *next_rel;
8096 bfd_boolean skip;
8097
8098 r_symndx = ELF64_R_SYM (rel->r_info);
8099 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8100 r_symndx, ibfd))
8101 goto error_ret;
8102
8103 next_rel = rel + 2;
8104 if (next_rel + 1 == relend
8105 || (next_rel + 2 < relend
8106 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8107 ++next_rel;
8108
8109 /* See if the .opd entry is full 24 byte or
8110 16 byte (with fd_aux entry overlapped with next
8111 fd_func). */
8112 opd_ent_size = 24;
8113 if (next_rel == relend)
8114 {
8115 if (sec->size == rel->r_offset + 16)
8116 opd_ent_size = 16;
8117 }
8118 else if (next_rel->r_offset == rel->r_offset + 16)
8119 opd_ent_size = 16;
8120
8121 if (h != NULL
8122 && h->root.root.string[0] == '.')
8123 {
8124 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8125 if (fdh != NULL)
8126 {
8127 fdh = ppc_follow_link (fdh);
8128 if (fdh->elf.root.type != bfd_link_hash_defined
8129 && fdh->elf.root.type != bfd_link_hash_defweak)
8130 fdh = NULL;
8131 }
8132 }
8133
8134 skip = (sym_sec->owner != ibfd
8135 || sym_sec->output_section == bfd_abs_section_ptr);
8136 if (skip)
8137 {
8138 if (fdh != NULL && sym_sec->owner == ibfd)
8139 {
8140 /* Arrange for the function descriptor sym
8141 to be dropped. */
8142 fdh->elf.root.u.def.value = 0;
8143 fdh->elf.root.u.def.section = sym_sec;
8144 }
8145 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
8146
8147 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
8148 rel = next_rel;
8149 else
8150 while (1)
8151 {
8152 if (!dec_dynrel_count (rel->r_info, sec, info,
8153 NULL, h, sym))
8154 goto error_ret;
8155
8156 if (++rel == next_rel)
8157 break;
8158
8159 r_symndx = ELF64_R_SYM (rel->r_info);
8160 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8161 r_symndx, ibfd))
8162 goto error_ret;
8163 }
8164 }
8165 else
8166 {
8167 /* We'll be keeping this opd entry. */
8168 long adjust;
8169
8170 if (fdh != NULL)
8171 {
8172 /* Redefine the function descriptor symbol to
8173 this location in the opd section. It is
8174 necessary to update the value here rather
8175 than using an array of adjustments as we do
8176 for local symbols, because various places
8177 in the generic ELF code use the value
8178 stored in u.def.value. */
8179 fdh->elf.root.u.def.value = wptr - new_contents;
8180 fdh->adjust_done = 1;
8181 }
8182
8183 /* Local syms are a bit tricky. We could
8184 tweak them as they can be cached, but
8185 we'd need to look through the local syms
8186 for the function descriptor sym which we
8187 don't have at the moment. So keep an
8188 array of adjustments. */
8189 adjust = (wptr - new_contents) - (rptr - sec->contents);
8190 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8191
8192 if (wptr != rptr)
8193 memcpy (wptr, rptr, opd_ent_size);
8194 wptr += opd_ent_size;
8195 if (add_aux_fields && opd_ent_size == 16)
8196 {
8197 memset (wptr, '\0', 8);
8198 wptr += 8;
8199 }
8200
8201 /* We need to adjust any reloc offsets to point to the
8202 new opd entries. */
8203 for ( ; rel != next_rel; ++rel)
8204 {
8205 rel->r_offset += adjust;
8206 if (write_rel != rel)
8207 memcpy (write_rel, rel, sizeof (*rel));
8208 ++write_rel;
8209 }
8210 }
8211
8212 rptr += opd_ent_size;
8213 }
8214
8215 sec->size = wptr - new_contents;
8216 sec->reloc_count = write_rel - relstart;
8217 if (add_aux_fields)
8218 {
8219 free (sec->contents);
8220 sec->contents = new_contents;
8221 }
8222
8223 /* Fudge the header size too, as this is used later in
8224 elf_bfd_final_link if we are emitting relocs. */
8225 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8226 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
8227 some_edited = TRUE;
8228 }
8229 else if (elf_section_data (sec)->relocs != relstart)
8230 free (relstart);
8231
8232 if (local_syms != NULL
8233 && symtab_hdr->contents != (unsigned char *) local_syms)
8234 {
8235 if (!info->keep_memory)
8236 free (local_syms);
8237 else
8238 symtab_hdr->contents = (unsigned char *) local_syms;
8239 }
8240 }
8241
8242 if (some_edited)
8243 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8244
8245 /* If we are doing a final link and the last .opd entry is just 16 byte
8246 long, add a 8 byte padding after it. */
8247 if (need_pad != NULL && !bfd_link_relocatable (info))
8248 {
8249 bfd_byte *p;
8250
8251 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8252 {
8253 BFD_ASSERT (need_pad->size > 0);
8254
8255 p = bfd_malloc (need_pad->size + 8);
8256 if (p == NULL)
8257 return FALSE;
8258
8259 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8260 p, 0, need_pad->size))
8261 return FALSE;
8262
8263 need_pad->contents = p;
8264 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8265 }
8266 else
8267 {
8268 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8269 if (p == NULL)
8270 return FALSE;
8271
8272 need_pad->contents = p;
8273 }
8274
8275 memset (need_pad->contents + need_pad->size, 0, 8);
8276 need_pad->size += 8;
8277 }
8278
8279 return TRUE;
8280 }
8281
8282 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8283
8284 asection *
8285 ppc64_elf_tls_setup (struct bfd_link_info *info)
8286 {
8287 struct ppc_link_hash_table *htab;
8288
8289 htab = ppc_hash_table (info);
8290 if (htab == NULL)
8291 return NULL;
8292
8293 if (abiversion (info->output_bfd) == 1)
8294 htab->opd_abi = 1;
8295
8296 if (htab->params->no_multi_toc)
8297 htab->do_multi_toc = 0;
8298 else if (!htab->do_multi_toc)
8299 htab->params->no_multi_toc = 1;
8300
8301 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8302 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8303 FALSE, FALSE, TRUE));
8304 /* Move dynamic linking info to the function descriptor sym. */
8305 if (htab->tls_get_addr != NULL)
8306 func_desc_adjust (&htab->tls_get_addr->elf, info);
8307 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8308 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8309 FALSE, FALSE, TRUE));
8310 if (htab->params->tls_get_addr_opt)
8311 {
8312 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8313
8314 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8315 FALSE, FALSE, TRUE);
8316 if (opt != NULL)
8317 func_desc_adjust (opt, info);
8318 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8319 FALSE, FALSE, TRUE);
8320 if (opt_fd != NULL
8321 && (opt_fd->root.type == bfd_link_hash_defined
8322 || opt_fd->root.type == bfd_link_hash_defweak))
8323 {
8324 /* If glibc supports an optimized __tls_get_addr call stub,
8325 signalled by the presence of __tls_get_addr_opt, and we'll
8326 be calling __tls_get_addr via a plt call stub, then
8327 make __tls_get_addr point to __tls_get_addr_opt. */
8328 tga_fd = &htab->tls_get_addr_fd->elf;
8329 if (htab->elf.dynamic_sections_created
8330 && tga_fd != NULL
8331 && (tga_fd->type == STT_FUNC
8332 || tga_fd->needs_plt)
8333 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8334 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
8335 && tga_fd->root.type == bfd_link_hash_undefweak)))
8336 {
8337 struct plt_entry *ent;
8338
8339 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8340 if (ent->plt.refcount > 0)
8341 break;
8342 if (ent != NULL)
8343 {
8344 tga_fd->root.type = bfd_link_hash_indirect;
8345 tga_fd->root.u.i.link = &opt_fd->root;
8346 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8347 opt_fd->forced_local = 0;
8348 if (opt_fd->dynindx != -1)
8349 {
8350 /* Use __tls_get_addr_opt in dynamic relocations. */
8351 opt_fd->dynindx = -1;
8352 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8353 opt_fd->dynstr_index);
8354 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8355 return NULL;
8356 }
8357 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8358 tga = &htab->tls_get_addr->elf;
8359 if (opt != NULL && tga != NULL)
8360 {
8361 tga->root.type = bfd_link_hash_indirect;
8362 tga->root.u.i.link = &opt->root;
8363 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8364 opt->forced_local = 0;
8365 _bfd_elf_link_hash_hide_symbol (info, opt,
8366 tga->forced_local);
8367 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8368 }
8369 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8370 htab->tls_get_addr_fd->is_func_descriptor = 1;
8371 if (htab->tls_get_addr != NULL)
8372 {
8373 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8374 htab->tls_get_addr->is_func = 1;
8375 }
8376 }
8377 }
8378 }
8379 else if (htab->params->tls_get_addr_opt < 0)
8380 htab->params->tls_get_addr_opt = 0;
8381 }
8382 return _bfd_elf_tls_setup (info->output_bfd, info);
8383 }
8384
8385 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8386 HASH1 or HASH2. */
8387
8388 static bfd_boolean
8389 branch_reloc_hash_match (const bfd *ibfd,
8390 const Elf_Internal_Rela *rel,
8391 const struct ppc_link_hash_entry *hash1,
8392 const struct ppc_link_hash_entry *hash2)
8393 {
8394 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8395 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8396 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8397
8398 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8399 {
8400 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8401 struct elf_link_hash_entry *h;
8402
8403 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8404 h = elf_follow_link (h);
8405 if (h == &hash1->elf || h == &hash2->elf)
8406 return TRUE;
8407 }
8408 return FALSE;
8409 }
8410
8411 /* Run through all the TLS relocs looking for optimization
8412 opportunities. The linker has been hacked (see ppc64elf.em) to do
8413 a preliminary section layout so that we know the TLS segment
8414 offsets. We can't optimize earlier because some optimizations need
8415 to know the tp offset, and we need to optimize before allocating
8416 dynamic relocations. */
8417
8418 bfd_boolean
8419 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8420 {
8421 bfd *ibfd;
8422 asection *sec;
8423 struct ppc_link_hash_table *htab;
8424 unsigned char *toc_ref;
8425 int pass;
8426
8427 if (!bfd_link_executable (info))
8428 return TRUE;
8429
8430 htab = ppc_hash_table (info);
8431 if (htab == NULL)
8432 return FALSE;
8433
8434 /* Make two passes over the relocs. On the first pass, mark toc
8435 entries involved with tls relocs, and check that tls relocs
8436 involved in setting up a tls_get_addr call are indeed followed by
8437 such a call. If they are not, we can't do any tls optimization.
8438 On the second pass twiddle tls_mask flags to notify
8439 relocate_section that optimization can be done, and adjust got
8440 and plt refcounts. */
8441 toc_ref = NULL;
8442 for (pass = 0; pass < 2; ++pass)
8443 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8444 {
8445 Elf_Internal_Sym *locsyms = NULL;
8446 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8447
8448 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8449 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8450 {
8451 Elf_Internal_Rela *relstart, *rel, *relend;
8452 bfd_boolean found_tls_get_addr_arg = 0;
8453
8454 /* Read the relocations. */
8455 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8456 info->keep_memory);
8457 if (relstart == NULL)
8458 {
8459 free (toc_ref);
8460 return FALSE;
8461 }
8462
8463 relend = relstart + sec->reloc_count;
8464 for (rel = relstart; rel < relend; rel++)
8465 {
8466 enum elf_ppc64_reloc_type r_type;
8467 unsigned long r_symndx;
8468 struct elf_link_hash_entry *h;
8469 Elf_Internal_Sym *sym;
8470 asection *sym_sec;
8471 unsigned char *tls_mask;
8472 unsigned char tls_set, tls_clear, tls_type = 0;
8473 bfd_vma value;
8474 bfd_boolean ok_tprel, is_local;
8475 long toc_ref_index = 0;
8476 int expecting_tls_get_addr = 0;
8477 bfd_boolean ret = FALSE;
8478
8479 r_symndx = ELF64_R_SYM (rel->r_info);
8480 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8481 r_symndx, ibfd))
8482 {
8483 err_free_rel:
8484 if (elf_section_data (sec)->relocs != relstart)
8485 free (relstart);
8486 if (toc_ref != NULL)
8487 free (toc_ref);
8488 if (locsyms != NULL
8489 && (elf_symtab_hdr (ibfd).contents
8490 != (unsigned char *) locsyms))
8491 free (locsyms);
8492 return ret;
8493 }
8494
8495 if (h != NULL)
8496 {
8497 if (h->root.type == bfd_link_hash_defined
8498 || h->root.type == bfd_link_hash_defweak)
8499 value = h->root.u.def.value;
8500 else if (h->root.type == bfd_link_hash_undefweak)
8501 value = 0;
8502 else
8503 {
8504 found_tls_get_addr_arg = 0;
8505 continue;
8506 }
8507 }
8508 else
8509 /* Symbols referenced by TLS relocs must be of type
8510 STT_TLS. So no need for .opd local sym adjust. */
8511 value = sym->st_value;
8512
8513 ok_tprel = FALSE;
8514 is_local = FALSE;
8515 if (h == NULL
8516 || !h->def_dynamic)
8517 {
8518 is_local = TRUE;
8519 if (h != NULL
8520 && h->root.type == bfd_link_hash_undefweak)
8521 ok_tprel = TRUE;
8522 else if (sym_sec != NULL
8523 && sym_sec->output_section != NULL)
8524 {
8525 value += sym_sec->output_offset;
8526 value += sym_sec->output_section->vma;
8527 value -= htab->elf.tls_sec->vma;
8528 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8529 < (bfd_vma) 1 << 32);
8530 }
8531 }
8532
8533 r_type = ELF64_R_TYPE (rel->r_info);
8534 /* If this section has old-style __tls_get_addr calls
8535 without marker relocs, then check that each
8536 __tls_get_addr call reloc is preceded by a reloc
8537 that conceivably belongs to the __tls_get_addr arg
8538 setup insn. If we don't find matching arg setup
8539 relocs, don't do any tls optimization. */
8540 if (pass == 0
8541 && sec->has_tls_get_addr_call
8542 && h != NULL
8543 && (h == &htab->tls_get_addr->elf
8544 || h == &htab->tls_get_addr_fd->elf)
8545 && !found_tls_get_addr_arg
8546 && is_branch_reloc (r_type))
8547 {
8548 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8549 "TLS optimization disabled\n"),
8550 ibfd, sec, rel->r_offset);
8551 ret = TRUE;
8552 goto err_free_rel;
8553 }
8554
8555 found_tls_get_addr_arg = 0;
8556 switch (r_type)
8557 {
8558 case R_PPC64_GOT_TLSLD16:
8559 case R_PPC64_GOT_TLSLD16_LO:
8560 expecting_tls_get_addr = 1;
8561 found_tls_get_addr_arg = 1;
8562 /* Fall through. */
8563
8564 case R_PPC64_GOT_TLSLD16_HI:
8565 case R_PPC64_GOT_TLSLD16_HA:
8566 /* These relocs should never be against a symbol
8567 defined in a shared lib. Leave them alone if
8568 that turns out to be the case. */
8569 if (!is_local)
8570 continue;
8571
8572 /* LD -> LE */
8573 tls_set = 0;
8574 tls_clear = TLS_LD;
8575 tls_type = TLS_TLS | TLS_LD;
8576 break;
8577
8578 case R_PPC64_GOT_TLSGD16:
8579 case R_PPC64_GOT_TLSGD16_LO:
8580 expecting_tls_get_addr = 1;
8581 found_tls_get_addr_arg = 1;
8582 /* Fall through. */
8583
8584 case R_PPC64_GOT_TLSGD16_HI:
8585 case R_PPC64_GOT_TLSGD16_HA:
8586 if (ok_tprel)
8587 /* GD -> LE */
8588 tls_set = 0;
8589 else
8590 /* GD -> IE */
8591 tls_set = TLS_TLS | TLS_TPRELGD;
8592 tls_clear = TLS_GD;
8593 tls_type = TLS_TLS | TLS_GD;
8594 break;
8595
8596 case R_PPC64_GOT_TPREL16_DS:
8597 case R_PPC64_GOT_TPREL16_LO_DS:
8598 case R_PPC64_GOT_TPREL16_HI:
8599 case R_PPC64_GOT_TPREL16_HA:
8600 if (ok_tprel)
8601 {
8602 /* IE -> LE */
8603 tls_set = 0;
8604 tls_clear = TLS_TPREL;
8605 tls_type = TLS_TLS | TLS_TPREL;
8606 break;
8607 }
8608 continue;
8609
8610 case R_PPC64_TLSGD:
8611 case R_PPC64_TLSLD:
8612 found_tls_get_addr_arg = 1;
8613 /* Fall through. */
8614
8615 case R_PPC64_TLS:
8616 case R_PPC64_TOC16:
8617 case R_PPC64_TOC16_LO:
8618 if (sym_sec == NULL || sym_sec != toc)
8619 continue;
8620
8621 /* Mark this toc entry as referenced by a TLS
8622 code sequence. We can do that now in the
8623 case of R_PPC64_TLS, and after checking for
8624 tls_get_addr for the TOC16 relocs. */
8625 if (toc_ref == NULL)
8626 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8627 if (toc_ref == NULL)
8628 goto err_free_rel;
8629
8630 if (h != NULL)
8631 value = h->root.u.def.value;
8632 else
8633 value = sym->st_value;
8634 value += rel->r_addend;
8635 if (value % 8 != 0)
8636 continue;
8637 BFD_ASSERT (value < toc->size
8638 && toc->output_offset % 8 == 0);
8639 toc_ref_index = (value + toc->output_offset) / 8;
8640 if (r_type == R_PPC64_TLS
8641 || r_type == R_PPC64_TLSGD
8642 || r_type == R_PPC64_TLSLD)
8643 {
8644 toc_ref[toc_ref_index] = 1;
8645 continue;
8646 }
8647
8648 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8649 continue;
8650
8651 tls_set = 0;
8652 tls_clear = 0;
8653 expecting_tls_get_addr = 2;
8654 break;
8655
8656 case R_PPC64_TPREL64:
8657 if (pass == 0
8658 || sec != toc
8659 || toc_ref == NULL
8660 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8661 continue;
8662 if (ok_tprel)
8663 {
8664 /* IE -> LE */
8665 tls_set = TLS_EXPLICIT;
8666 tls_clear = TLS_TPREL;
8667 break;
8668 }
8669 continue;
8670
8671 case R_PPC64_DTPMOD64:
8672 if (pass == 0
8673 || sec != toc
8674 || toc_ref == NULL
8675 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8676 continue;
8677 if (rel + 1 < relend
8678 && (rel[1].r_info
8679 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8680 && rel[1].r_offset == rel->r_offset + 8)
8681 {
8682 if (ok_tprel)
8683 /* GD -> LE */
8684 tls_set = TLS_EXPLICIT | TLS_GD;
8685 else
8686 /* GD -> IE */
8687 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8688 tls_clear = TLS_GD;
8689 }
8690 else
8691 {
8692 if (!is_local)
8693 continue;
8694
8695 /* LD -> LE */
8696 tls_set = TLS_EXPLICIT;
8697 tls_clear = TLS_LD;
8698 }
8699 break;
8700
8701 default:
8702 continue;
8703 }
8704
8705 if (pass == 0)
8706 {
8707 if (!expecting_tls_get_addr
8708 || !sec->has_tls_get_addr_call)
8709 continue;
8710
8711 if (rel + 1 < relend
8712 && branch_reloc_hash_match (ibfd, rel + 1,
8713 htab->tls_get_addr,
8714 htab->tls_get_addr_fd))
8715 {
8716 if (expecting_tls_get_addr == 2)
8717 {
8718 /* Check for toc tls entries. */
8719 unsigned char *toc_tls;
8720 int retval;
8721
8722 retval = get_tls_mask (&toc_tls, NULL, NULL,
8723 &locsyms,
8724 rel, ibfd);
8725 if (retval == 0)
8726 goto err_free_rel;
8727 if (toc_tls != NULL)
8728 {
8729 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8730 found_tls_get_addr_arg = 1;
8731 if (retval > 1)
8732 toc_ref[toc_ref_index] = 1;
8733 }
8734 }
8735 continue;
8736 }
8737
8738 if (expecting_tls_get_addr != 1)
8739 continue;
8740
8741 /* Uh oh, we didn't find the expected call. We
8742 could just mark this symbol to exclude it
8743 from tls optimization but it's safer to skip
8744 the entire optimization. */
8745 /* xgettext:c-format */
8746 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8747 "TLS optimization disabled\n"),
8748 ibfd, sec, rel->r_offset);
8749 ret = TRUE;
8750 goto err_free_rel;
8751 }
8752
8753 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8754 {
8755 struct plt_entry *ent;
8756 for (ent = htab->tls_get_addr->elf.plt.plist;
8757 ent != NULL;
8758 ent = ent->next)
8759 if (ent->addend == 0)
8760 {
8761 if (ent->plt.refcount > 0)
8762 {
8763 ent->plt.refcount -= 1;
8764 expecting_tls_get_addr = 0;
8765 }
8766 break;
8767 }
8768 }
8769
8770 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8771 {
8772 struct plt_entry *ent;
8773 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8774 ent != NULL;
8775 ent = ent->next)
8776 if (ent->addend == 0)
8777 {
8778 if (ent->plt.refcount > 0)
8779 ent->plt.refcount -= 1;
8780 break;
8781 }
8782 }
8783
8784 if (tls_clear == 0)
8785 continue;
8786
8787 if ((tls_set & TLS_EXPLICIT) == 0)
8788 {
8789 struct got_entry *ent;
8790
8791 /* Adjust got entry for this reloc. */
8792 if (h != NULL)
8793 ent = h->got.glist;
8794 else
8795 ent = elf_local_got_ents (ibfd)[r_symndx];
8796
8797 for (; ent != NULL; ent = ent->next)
8798 if (ent->addend == rel->r_addend
8799 && ent->owner == ibfd
8800 && ent->tls_type == tls_type)
8801 break;
8802 if (ent == NULL)
8803 abort ();
8804
8805 if (tls_set == 0)
8806 {
8807 /* We managed to get rid of a got entry. */
8808 if (ent->got.refcount > 0)
8809 ent->got.refcount -= 1;
8810 }
8811 }
8812 else
8813 {
8814 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8815 we'll lose one or two dyn relocs. */
8816 if (!dec_dynrel_count (rel->r_info, sec, info,
8817 NULL, h, sym))
8818 return FALSE;
8819
8820 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8821 {
8822 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8823 NULL, h, sym))
8824 return FALSE;
8825 }
8826 }
8827
8828 *tls_mask |= tls_set;
8829 *tls_mask &= ~tls_clear;
8830 }
8831
8832 if (elf_section_data (sec)->relocs != relstart)
8833 free (relstart);
8834 }
8835
8836 if (locsyms != NULL
8837 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8838 {
8839 if (!info->keep_memory)
8840 free (locsyms);
8841 else
8842 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8843 }
8844 }
8845
8846 if (toc_ref != NULL)
8847 free (toc_ref);
8848 return TRUE;
8849 }
8850
8851 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8852 the values of any global symbols in a toc section that has been
8853 edited. Globals in toc sections should be a rarity, so this function
8854 sets a flag if any are found in toc sections other than the one just
8855 edited, so that futher hash table traversals can be avoided. */
8856
8857 struct adjust_toc_info
8858 {
8859 asection *toc;
8860 unsigned long *skip;
8861 bfd_boolean global_toc_syms;
8862 };
8863
8864 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8865
8866 static bfd_boolean
8867 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8868 {
8869 struct ppc_link_hash_entry *eh;
8870 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8871 unsigned long i;
8872
8873 if (h->root.type != bfd_link_hash_defined
8874 && h->root.type != bfd_link_hash_defweak)
8875 return TRUE;
8876
8877 eh = (struct ppc_link_hash_entry *) h;
8878 if (eh->adjust_done)
8879 return TRUE;
8880
8881 if (eh->elf.root.u.def.section == toc_inf->toc)
8882 {
8883 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8884 i = toc_inf->toc->rawsize >> 3;
8885 else
8886 i = eh->elf.root.u.def.value >> 3;
8887
8888 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8889 {
8890 _bfd_error_handler
8891 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8892 do
8893 ++i;
8894 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8895 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8896 }
8897
8898 eh->elf.root.u.def.value -= toc_inf->skip[i];
8899 eh->adjust_done = 1;
8900 }
8901 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8902 toc_inf->global_toc_syms = TRUE;
8903
8904 return TRUE;
8905 }
8906
8907 /* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8908
8909 static bfd_boolean
8910 ok_lo_toc_insn (unsigned int insn)
8911 {
8912 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8913 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8914 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8915 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8916 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8917 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8918 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8919 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8920 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8921 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8922 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8923 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8924 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8925 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8926 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8927 && (insn & 3) != 1)
8928 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8929 && ((insn & 3) == 0 || (insn & 3) == 3))
8930 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8931 }
8932
8933 /* Examine all relocs referencing .toc sections in order to remove
8934 unused .toc entries. */
8935
8936 bfd_boolean
8937 ppc64_elf_edit_toc (struct bfd_link_info *info)
8938 {
8939 bfd *ibfd;
8940 struct adjust_toc_info toc_inf;
8941 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8942
8943 htab->do_toc_opt = 1;
8944 toc_inf.global_toc_syms = TRUE;
8945 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8946 {
8947 asection *toc, *sec;
8948 Elf_Internal_Shdr *symtab_hdr;
8949 Elf_Internal_Sym *local_syms;
8950 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8951 unsigned long *skip, *drop;
8952 unsigned char *used;
8953 unsigned char *keep, last, some_unused;
8954
8955 if (!is_ppc64_elf (ibfd))
8956 continue;
8957
8958 toc = bfd_get_section_by_name (ibfd, ".toc");
8959 if (toc == NULL
8960 || toc->size == 0
8961 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8962 || discarded_section (toc))
8963 continue;
8964
8965 toc_relocs = NULL;
8966 local_syms = NULL;
8967 symtab_hdr = &elf_symtab_hdr (ibfd);
8968
8969 /* Look at sections dropped from the final link. */
8970 skip = NULL;
8971 relstart = NULL;
8972 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8973 {
8974 if (sec->reloc_count == 0
8975 || !discarded_section (sec)
8976 || get_opd_info (sec)
8977 || (sec->flags & SEC_ALLOC) == 0
8978 || (sec->flags & SEC_DEBUGGING) != 0)
8979 continue;
8980
8981 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8982 if (relstart == NULL)
8983 goto error_ret;
8984
8985 /* Run through the relocs to see which toc entries might be
8986 unused. */
8987 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8988 {
8989 enum elf_ppc64_reloc_type r_type;
8990 unsigned long r_symndx;
8991 asection *sym_sec;
8992 struct elf_link_hash_entry *h;
8993 Elf_Internal_Sym *sym;
8994 bfd_vma val;
8995
8996 r_type = ELF64_R_TYPE (rel->r_info);
8997 switch (r_type)
8998 {
8999 default:
9000 continue;
9001
9002 case R_PPC64_TOC16:
9003 case R_PPC64_TOC16_LO:
9004 case R_PPC64_TOC16_HI:
9005 case R_PPC64_TOC16_HA:
9006 case R_PPC64_TOC16_DS:
9007 case R_PPC64_TOC16_LO_DS:
9008 break;
9009 }
9010
9011 r_symndx = ELF64_R_SYM (rel->r_info);
9012 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9013 r_symndx, ibfd))
9014 goto error_ret;
9015
9016 if (sym_sec != toc)
9017 continue;
9018
9019 if (h != NULL)
9020 val = h->root.u.def.value;
9021 else
9022 val = sym->st_value;
9023 val += rel->r_addend;
9024
9025 if (val >= toc->size)
9026 continue;
9027
9028 /* Anything in the toc ought to be aligned to 8 bytes.
9029 If not, don't mark as unused. */
9030 if (val & 7)
9031 continue;
9032
9033 if (skip == NULL)
9034 {
9035 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9036 if (skip == NULL)
9037 goto error_ret;
9038 }
9039
9040 skip[val >> 3] = ref_from_discarded;
9041 }
9042
9043 if (elf_section_data (sec)->relocs != relstart)
9044 free (relstart);
9045 }
9046
9047 /* For largetoc loads of address constants, we can convert
9048 . addis rx,2,addr@got@ha
9049 . ld ry,addr@got@l(rx)
9050 to
9051 . addis rx,2,addr@toc@ha
9052 . addi ry,rx,addr@toc@l
9053 when addr is within 2G of the toc pointer. This then means
9054 that the word storing "addr" in the toc is no longer needed. */
9055
9056 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9057 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9058 && toc->reloc_count != 0)
9059 {
9060 /* Read toc relocs. */
9061 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9062 info->keep_memory);
9063 if (toc_relocs == NULL)
9064 goto error_ret;
9065
9066 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9067 {
9068 enum elf_ppc64_reloc_type r_type;
9069 unsigned long r_symndx;
9070 asection *sym_sec;
9071 struct elf_link_hash_entry *h;
9072 Elf_Internal_Sym *sym;
9073 bfd_vma val, addr;
9074
9075 r_type = ELF64_R_TYPE (rel->r_info);
9076 if (r_type != R_PPC64_ADDR64)
9077 continue;
9078
9079 r_symndx = ELF64_R_SYM (rel->r_info);
9080 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9081 r_symndx, ibfd))
9082 goto error_ret;
9083
9084 if (sym_sec == NULL
9085 || sym_sec->output_section == NULL
9086 || discarded_section (sym_sec))
9087 continue;
9088
9089 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9090 continue;
9091
9092 if (h != NULL)
9093 {
9094 if (h->type == STT_GNU_IFUNC)
9095 continue;
9096 val = h->root.u.def.value;
9097 }
9098 else
9099 {
9100 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9101 continue;
9102 val = sym->st_value;
9103 }
9104 val += rel->r_addend;
9105 val += sym_sec->output_section->vma + sym_sec->output_offset;
9106
9107 /* We don't yet know the exact toc pointer value, but we
9108 know it will be somewhere in the toc section. Don't
9109 optimize if the difference from any possible toc
9110 pointer is outside [ff..f80008000, 7fff7fff]. */
9111 addr = toc->output_section->vma + TOC_BASE_OFF;
9112 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9113 continue;
9114
9115 addr = toc->output_section->vma + toc->output_section->rawsize;
9116 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9117 continue;
9118
9119 if (skip == NULL)
9120 {
9121 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9122 if (skip == NULL)
9123 goto error_ret;
9124 }
9125
9126 skip[rel->r_offset >> 3]
9127 |= can_optimize | ((rel - toc_relocs) << 2);
9128 }
9129 }
9130
9131 if (skip == NULL)
9132 continue;
9133
9134 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9135 if (used == NULL)
9136 {
9137 error_ret:
9138 if (local_syms != NULL
9139 && symtab_hdr->contents != (unsigned char *) local_syms)
9140 free (local_syms);
9141 if (sec != NULL
9142 && relstart != NULL
9143 && elf_section_data (sec)->relocs != relstart)
9144 free (relstart);
9145 if (toc_relocs != NULL
9146 && elf_section_data (toc)->relocs != toc_relocs)
9147 free (toc_relocs);
9148 if (skip != NULL)
9149 free (skip);
9150 return FALSE;
9151 }
9152
9153 /* Now check all kept sections that might reference the toc.
9154 Check the toc itself last. */
9155 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9156 : ibfd->sections);
9157 sec != NULL;
9158 sec = (sec == toc ? NULL
9159 : sec->next == NULL ? toc
9160 : sec->next == toc && toc->next ? toc->next
9161 : sec->next))
9162 {
9163 int repeat;
9164
9165 if (sec->reloc_count == 0
9166 || discarded_section (sec)
9167 || get_opd_info (sec)
9168 || (sec->flags & SEC_ALLOC) == 0
9169 || (sec->flags & SEC_DEBUGGING) != 0)
9170 continue;
9171
9172 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9173 info->keep_memory);
9174 if (relstart == NULL)
9175 {
9176 free (used);
9177 goto error_ret;
9178 }
9179
9180 /* Mark toc entries referenced as used. */
9181 do
9182 {
9183 repeat = 0;
9184 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9185 {
9186 enum elf_ppc64_reloc_type r_type;
9187 unsigned long r_symndx;
9188 asection *sym_sec;
9189 struct elf_link_hash_entry *h;
9190 Elf_Internal_Sym *sym;
9191 bfd_vma val;
9192 enum {no_check, check_lo, check_ha} insn_check;
9193
9194 r_type = ELF64_R_TYPE (rel->r_info);
9195 switch (r_type)
9196 {
9197 default:
9198 insn_check = no_check;
9199 break;
9200
9201 case R_PPC64_GOT_TLSLD16_HA:
9202 case R_PPC64_GOT_TLSGD16_HA:
9203 case R_PPC64_GOT_TPREL16_HA:
9204 case R_PPC64_GOT_DTPREL16_HA:
9205 case R_PPC64_GOT16_HA:
9206 case R_PPC64_TOC16_HA:
9207 insn_check = check_ha;
9208 break;
9209
9210 case R_PPC64_GOT_TLSLD16_LO:
9211 case R_PPC64_GOT_TLSGD16_LO:
9212 case R_PPC64_GOT_TPREL16_LO_DS:
9213 case R_PPC64_GOT_DTPREL16_LO_DS:
9214 case R_PPC64_GOT16_LO:
9215 case R_PPC64_GOT16_LO_DS:
9216 case R_PPC64_TOC16_LO:
9217 case R_PPC64_TOC16_LO_DS:
9218 insn_check = check_lo;
9219 break;
9220 }
9221
9222 if (insn_check != no_check)
9223 {
9224 bfd_vma off = rel->r_offset & ~3;
9225 unsigned char buf[4];
9226 unsigned int insn;
9227
9228 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9229 {
9230 free (used);
9231 goto error_ret;
9232 }
9233 insn = bfd_get_32 (ibfd, buf);
9234 if (insn_check == check_lo
9235 ? !ok_lo_toc_insn (insn)
9236 : ((insn & ((0x3f << 26) | 0x1f << 16))
9237 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9238 {
9239 char str[12];
9240
9241 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9242 sprintf (str, "%#08x", insn);
9243 info->callbacks->einfo
9244 /* xgettext:c-format */
9245 (_("%P: %H: toc optimization is not supported for"
9246 " %s instruction.\n"),
9247 ibfd, sec, rel->r_offset & ~3, str);
9248 }
9249 }
9250
9251 switch (r_type)
9252 {
9253 case R_PPC64_TOC16:
9254 case R_PPC64_TOC16_LO:
9255 case R_PPC64_TOC16_HI:
9256 case R_PPC64_TOC16_HA:
9257 case R_PPC64_TOC16_DS:
9258 case R_PPC64_TOC16_LO_DS:
9259 /* In case we're taking addresses of toc entries. */
9260 case R_PPC64_ADDR64:
9261 break;
9262
9263 default:
9264 continue;
9265 }
9266
9267 r_symndx = ELF64_R_SYM (rel->r_info);
9268 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9269 r_symndx, ibfd))
9270 {
9271 free (used);
9272 goto error_ret;
9273 }
9274
9275 if (sym_sec != toc)
9276 continue;
9277
9278 if (h != NULL)
9279 val = h->root.u.def.value;
9280 else
9281 val = sym->st_value;
9282 val += rel->r_addend;
9283
9284 if (val >= toc->size)
9285 continue;
9286
9287 if ((skip[val >> 3] & can_optimize) != 0)
9288 {
9289 bfd_vma off;
9290 unsigned char opc;
9291
9292 switch (r_type)
9293 {
9294 case R_PPC64_TOC16_HA:
9295 break;
9296
9297 case R_PPC64_TOC16_LO_DS:
9298 off = rel->r_offset;
9299 off += (bfd_big_endian (ibfd) ? -2 : 3);
9300 if (!bfd_get_section_contents (ibfd, sec, &opc,
9301 off, 1))
9302 {
9303 free (used);
9304 goto error_ret;
9305 }
9306 if ((opc & (0x3f << 2)) == (58u << 2))
9307 break;
9308 /* Fall through. */
9309
9310 default:
9311 /* Wrong sort of reloc, or not a ld. We may
9312 as well clear ref_from_discarded too. */
9313 skip[val >> 3] = 0;
9314 }
9315 }
9316
9317 if (sec != toc)
9318 used[val >> 3] = 1;
9319 /* For the toc section, we only mark as used if this
9320 entry itself isn't unused. */
9321 else if ((used[rel->r_offset >> 3]
9322 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9323 && !used[val >> 3])
9324 {
9325 /* Do all the relocs again, to catch reference
9326 chains. */
9327 repeat = 1;
9328 used[val >> 3] = 1;
9329 }
9330 }
9331 }
9332 while (repeat);
9333
9334 if (elf_section_data (sec)->relocs != relstart)
9335 free (relstart);
9336 }
9337
9338 /* Merge the used and skip arrays. Assume that TOC
9339 doublewords not appearing as either used or unused belong
9340 to to an entry more than one doubleword in size. */
9341 for (drop = skip, keep = used, last = 0, some_unused = 0;
9342 drop < skip + (toc->size + 7) / 8;
9343 ++drop, ++keep)
9344 {
9345 if (*keep)
9346 {
9347 *drop &= ~ref_from_discarded;
9348 if ((*drop & can_optimize) != 0)
9349 some_unused = 1;
9350 last = 0;
9351 }
9352 else if ((*drop & ref_from_discarded) != 0)
9353 {
9354 some_unused = 1;
9355 last = ref_from_discarded;
9356 }
9357 else
9358 *drop = last;
9359 }
9360
9361 free (used);
9362
9363 if (some_unused)
9364 {
9365 bfd_byte *contents, *src;
9366 unsigned long off;
9367 Elf_Internal_Sym *sym;
9368 bfd_boolean local_toc_syms = FALSE;
9369
9370 /* Shuffle the toc contents, and at the same time convert the
9371 skip array from booleans into offsets. */
9372 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9373 goto error_ret;
9374
9375 elf_section_data (toc)->this_hdr.contents = contents;
9376
9377 for (src = contents, off = 0, drop = skip;
9378 src < contents + toc->size;
9379 src += 8, ++drop)
9380 {
9381 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9382 off += 8;
9383 else if (off != 0)
9384 {
9385 *drop = off;
9386 memcpy (src - off, src, 8);
9387 }
9388 }
9389 *drop = off;
9390 toc->rawsize = toc->size;
9391 toc->size = src - contents - off;
9392
9393 /* Adjust addends for relocs against the toc section sym,
9394 and optimize any accesses we can. */
9395 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9396 {
9397 if (sec->reloc_count == 0
9398 || discarded_section (sec))
9399 continue;
9400
9401 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9402 info->keep_memory);
9403 if (relstart == NULL)
9404 goto error_ret;
9405
9406 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9407 {
9408 enum elf_ppc64_reloc_type r_type;
9409 unsigned long r_symndx;
9410 asection *sym_sec;
9411 struct elf_link_hash_entry *h;
9412 bfd_vma val;
9413
9414 r_type = ELF64_R_TYPE (rel->r_info);
9415 switch (r_type)
9416 {
9417 default:
9418 continue;
9419
9420 case R_PPC64_TOC16:
9421 case R_PPC64_TOC16_LO:
9422 case R_PPC64_TOC16_HI:
9423 case R_PPC64_TOC16_HA:
9424 case R_PPC64_TOC16_DS:
9425 case R_PPC64_TOC16_LO_DS:
9426 case R_PPC64_ADDR64:
9427 break;
9428 }
9429
9430 r_symndx = ELF64_R_SYM (rel->r_info);
9431 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9432 r_symndx, ibfd))
9433 goto error_ret;
9434
9435 if (sym_sec != toc)
9436 continue;
9437
9438 if (h != NULL)
9439 val = h->root.u.def.value;
9440 else
9441 {
9442 val = sym->st_value;
9443 if (val != 0)
9444 local_toc_syms = TRUE;
9445 }
9446
9447 val += rel->r_addend;
9448
9449 if (val > toc->rawsize)
9450 val = toc->rawsize;
9451 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9452 continue;
9453 else if ((skip[val >> 3] & can_optimize) != 0)
9454 {
9455 Elf_Internal_Rela *tocrel
9456 = toc_relocs + (skip[val >> 3] >> 2);
9457 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9458
9459 switch (r_type)
9460 {
9461 case R_PPC64_TOC16_HA:
9462 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9463 break;
9464
9465 case R_PPC64_TOC16_LO_DS:
9466 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9467 break;
9468
9469 default:
9470 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9471 ppc_howto_init ();
9472 info->callbacks->einfo
9473 /* xgettext:c-format */
9474 (_("%P: %H: %s references "
9475 "optimized away TOC entry\n"),
9476 ibfd, sec, rel->r_offset,
9477 ppc64_elf_howto_table[r_type]->name);
9478 bfd_set_error (bfd_error_bad_value);
9479 goto error_ret;
9480 }
9481 rel->r_addend = tocrel->r_addend;
9482 elf_section_data (sec)->relocs = relstart;
9483 continue;
9484 }
9485
9486 if (h != NULL || sym->st_value != 0)
9487 continue;
9488
9489 rel->r_addend -= skip[val >> 3];
9490 elf_section_data (sec)->relocs = relstart;
9491 }
9492
9493 if (elf_section_data (sec)->relocs != relstart)
9494 free (relstart);
9495 }
9496
9497 /* We shouldn't have local or global symbols defined in the TOC,
9498 but handle them anyway. */
9499 if (local_syms != NULL)
9500 for (sym = local_syms;
9501 sym < local_syms + symtab_hdr->sh_info;
9502 ++sym)
9503 if (sym->st_value != 0
9504 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9505 {
9506 unsigned long i;
9507
9508 if (sym->st_value > toc->rawsize)
9509 i = toc->rawsize >> 3;
9510 else
9511 i = sym->st_value >> 3;
9512
9513 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9514 {
9515 if (local_toc_syms)
9516 _bfd_error_handler
9517 (_("%s defined on removed toc entry"),
9518 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9519 do
9520 ++i;
9521 while ((skip[i] & (ref_from_discarded | can_optimize)));
9522 sym->st_value = (bfd_vma) i << 3;
9523 }
9524
9525 sym->st_value -= skip[i];
9526 symtab_hdr->contents = (unsigned char *) local_syms;
9527 }
9528
9529 /* Adjust any global syms defined in this toc input section. */
9530 if (toc_inf.global_toc_syms)
9531 {
9532 toc_inf.toc = toc;
9533 toc_inf.skip = skip;
9534 toc_inf.global_toc_syms = FALSE;
9535 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9536 &toc_inf);
9537 }
9538
9539 if (toc->reloc_count != 0)
9540 {
9541 Elf_Internal_Shdr *rel_hdr;
9542 Elf_Internal_Rela *wrel;
9543 bfd_size_type sz;
9544
9545 /* Remove unused toc relocs, and adjust those we keep. */
9546 if (toc_relocs == NULL)
9547 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9548 info->keep_memory);
9549 if (toc_relocs == NULL)
9550 goto error_ret;
9551
9552 wrel = toc_relocs;
9553 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9554 if ((skip[rel->r_offset >> 3]
9555 & (ref_from_discarded | can_optimize)) == 0)
9556 {
9557 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9558 wrel->r_info = rel->r_info;
9559 wrel->r_addend = rel->r_addend;
9560 ++wrel;
9561 }
9562 else if (!dec_dynrel_count (rel->r_info, toc, info,
9563 &local_syms, NULL, NULL))
9564 goto error_ret;
9565
9566 elf_section_data (toc)->relocs = toc_relocs;
9567 toc->reloc_count = wrel - toc_relocs;
9568 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9569 sz = rel_hdr->sh_entsize;
9570 rel_hdr->sh_size = toc->reloc_count * sz;
9571 }
9572 }
9573 else if (toc_relocs != NULL
9574 && elf_section_data (toc)->relocs != toc_relocs)
9575 free (toc_relocs);
9576
9577 if (local_syms != NULL
9578 && symtab_hdr->contents != (unsigned char *) local_syms)
9579 {
9580 if (!info->keep_memory)
9581 free (local_syms);
9582 else
9583 symtab_hdr->contents = (unsigned char *) local_syms;
9584 }
9585 free (skip);
9586 }
9587
9588 return TRUE;
9589 }
9590
9591 /* Return true iff input section I references the TOC using
9592 instructions limited to +/-32k offsets. */
9593
9594 bfd_boolean
9595 ppc64_elf_has_small_toc_reloc (asection *i)
9596 {
9597 return (is_ppc64_elf (i->owner)
9598 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9599 }
9600
9601 /* Allocate space for one GOT entry. */
9602
9603 static void
9604 allocate_got (struct elf_link_hash_entry *h,
9605 struct bfd_link_info *info,
9606 struct got_entry *gent)
9607 {
9608 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9609 bfd_boolean dyn;
9610 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9611 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9612 ? 16 : 8);
9613 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9614 ? 2 : 1) * sizeof (Elf64_External_Rela);
9615 asection *got = ppc64_elf_tdata (gent->owner)->got;
9616
9617 gent->got.offset = got->size;
9618 got->size += entsize;
9619
9620 dyn = htab->elf.dynamic_sections_created;
9621 if (h->type == STT_GNU_IFUNC)
9622 {
9623 htab->elf.irelplt->size += rentsize;
9624 htab->got_reli_size += rentsize;
9625 }
9626 else if ((bfd_link_pic (info)
9627 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9628 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9629 || h->root.type != bfd_link_hash_undefweak))
9630 {
9631 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9632 relgot->size += rentsize;
9633 }
9634 }
9635
9636 /* This function merges got entries in the same toc group. */
9637
9638 static void
9639 merge_got_entries (struct got_entry **pent)
9640 {
9641 struct got_entry *ent, *ent2;
9642
9643 for (ent = *pent; ent != NULL; ent = ent->next)
9644 if (!ent->is_indirect)
9645 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9646 if (!ent2->is_indirect
9647 && ent2->addend == ent->addend
9648 && ent2->tls_type == ent->tls_type
9649 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9650 {
9651 ent2->is_indirect = TRUE;
9652 ent2->got.ent = ent;
9653 }
9654 }
9655
9656 /* Allocate space in .plt, .got and associated reloc sections for
9657 dynamic relocs. */
9658
9659 static bfd_boolean
9660 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9661 {
9662 struct bfd_link_info *info;
9663 struct ppc_link_hash_table *htab;
9664 asection *s;
9665 struct ppc_link_hash_entry *eh;
9666 struct got_entry **pgent, *gent;
9667
9668 if (h->root.type == bfd_link_hash_indirect)
9669 return TRUE;
9670
9671 info = (struct bfd_link_info *) inf;
9672 htab = ppc_hash_table (info);
9673 if (htab == NULL)
9674 return FALSE;
9675
9676 eh = (struct ppc_link_hash_entry *) h;
9677 /* Run through the TLS GD got entries first if we're changing them
9678 to TPREL. */
9679 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9680 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9681 if (gent->got.refcount > 0
9682 && (gent->tls_type & TLS_GD) != 0)
9683 {
9684 /* This was a GD entry that has been converted to TPREL. If
9685 there happens to be a TPREL entry we can use that one. */
9686 struct got_entry *ent;
9687 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9688 if (ent->got.refcount > 0
9689 && (ent->tls_type & TLS_TPREL) != 0
9690 && ent->addend == gent->addend
9691 && ent->owner == gent->owner)
9692 {
9693 gent->got.refcount = 0;
9694 break;
9695 }
9696
9697 /* If not, then we'll be using our own TPREL entry. */
9698 if (gent->got.refcount != 0)
9699 gent->tls_type = TLS_TLS | TLS_TPREL;
9700 }
9701
9702 /* Remove any list entry that won't generate a word in the GOT before
9703 we call merge_got_entries. Otherwise we risk merging to empty
9704 entries. */
9705 pgent = &h->got.glist;
9706 while ((gent = *pgent) != NULL)
9707 if (gent->got.refcount > 0)
9708 {
9709 if ((gent->tls_type & TLS_LD) != 0
9710 && !h->def_dynamic)
9711 {
9712 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9713 *pgent = gent->next;
9714 }
9715 else
9716 pgent = &gent->next;
9717 }
9718 else
9719 *pgent = gent->next;
9720
9721 if (!htab->do_multi_toc)
9722 merge_got_entries (&h->got.glist);
9723
9724 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9725 if (!gent->is_indirect)
9726 {
9727 /* Make sure this symbol is output as a dynamic symbol.
9728 Undefined weak syms won't yet be marked as dynamic,
9729 nor will all TLS symbols. */
9730 if (h->dynindx == -1
9731 && !h->forced_local
9732 && h->type != STT_GNU_IFUNC
9733 && htab->elf.dynamic_sections_created)
9734 {
9735 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9736 return FALSE;
9737 }
9738
9739 if (!is_ppc64_elf (gent->owner))
9740 abort ();
9741
9742 allocate_got (h, info, gent);
9743 }
9744
9745 if (!htab->elf.dynamic_sections_created
9746 && h->type != STT_GNU_IFUNC)
9747 eh->dyn_relocs = NULL;
9748
9749 if (eh->dyn_relocs != NULL)
9750 {
9751 struct elf_dyn_relocs *p, **pp;
9752
9753 /* In the shared -Bsymbolic case, discard space allocated for
9754 dynamic pc-relative relocs against symbols which turn out to
9755 be defined in regular objects. For the normal shared case,
9756 discard space for relocs that have become local due to symbol
9757 visibility changes. */
9758
9759 if (bfd_link_pic (info))
9760 {
9761 /* Relocs that use pc_count are those that appear on a call
9762 insn, or certain REL relocs (see must_be_dyn_reloc) that
9763 can be generated via assembly. We want calls to
9764 protected symbols to resolve directly to the function
9765 rather than going via the plt. If people want function
9766 pointer comparisons to work as expected then they should
9767 avoid writing weird assembly. */
9768 if (SYMBOL_CALLS_LOCAL (info, h))
9769 {
9770 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9771 {
9772 p->count -= p->pc_count;
9773 p->pc_count = 0;
9774 if (p->count == 0)
9775 *pp = p->next;
9776 else
9777 pp = &p->next;
9778 }
9779 }
9780
9781 /* Also discard relocs on undefined weak syms with
9782 non-default visibility. */
9783 if (eh->dyn_relocs != NULL
9784 && h->root.type == bfd_link_hash_undefweak)
9785 {
9786 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9787 eh->dyn_relocs = NULL;
9788
9789 /* Make sure this symbol is output as a dynamic symbol.
9790 Undefined weak syms won't yet be marked as dynamic. */
9791 else if (h->dynindx == -1
9792 && !h->forced_local)
9793 {
9794 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9795 return FALSE;
9796 }
9797 }
9798 }
9799 else if (h->type == STT_GNU_IFUNC)
9800 {
9801 /* A plt entry is always created when making direct calls to
9802 an ifunc, even when building a static executable, but
9803 that doesn't cover all cases. We may have only an ifunc
9804 initialised function pointer for a given ifunc symbol.
9805
9806 For ELFv2, dynamic relocations are not required when
9807 generating a global entry PLT stub. */
9808 if (abiversion (info->output_bfd) >= 2)
9809 {
9810 if (global_entry_stub (h))
9811 eh->dyn_relocs = NULL;
9812 }
9813
9814 /* For ELFv1 we have function descriptors. Descriptors need
9815 to be treated like PLT entries and thus have dynamic
9816 relocations. One exception is when the function
9817 descriptor is copied into .dynbss (which should only
9818 happen with ancient versions of gcc). */
9819 else if (h->needs_copy)
9820 eh->dyn_relocs = NULL;
9821 }
9822 else if (ELIMINATE_COPY_RELOCS)
9823 {
9824 /* For the non-pic case, discard space for relocs against
9825 symbols which turn out to need copy relocs or are not
9826 dynamic. */
9827
9828 /* First make sure this symbol is output as a dynamic symbol.
9829 Undefined weak syms won't yet be marked as dynamic. */
9830 if (h->root.type == bfd_link_hash_undefweak
9831 && !h->non_got_ref
9832 && !h->def_regular
9833 && h->dynindx == -1
9834 && !h->forced_local
9835 && !bfd_elf_link_record_dynamic_symbol (info, h))
9836 return FALSE;
9837
9838 if (h->non_got_ref
9839 || h->def_regular
9840 || h->dynindx == -1)
9841 eh->dyn_relocs = NULL;
9842 }
9843
9844 /* Finally, allocate space. */
9845 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9846 {
9847 asection *sreloc = elf_section_data (p->sec)->sreloc;
9848 if (eh->elf.type == STT_GNU_IFUNC)
9849 sreloc = htab->elf.irelplt;
9850 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9851 }
9852 }
9853
9854 if ((htab->elf.dynamic_sections_created
9855 && h->dynindx != -1
9856 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
9857 || h->type == STT_GNU_IFUNC)
9858 {
9859 struct plt_entry *pent;
9860 bfd_boolean doneone = FALSE;
9861 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9862 if (pent->plt.refcount > 0)
9863 {
9864 if (!htab->elf.dynamic_sections_created
9865 || h->dynindx == -1)
9866 {
9867 s = htab->elf.iplt;
9868 pent->plt.offset = s->size;
9869 s->size += PLT_ENTRY_SIZE (htab);
9870 s = htab->elf.irelplt;
9871 }
9872 else
9873 {
9874 /* If this is the first .plt entry, make room for the special
9875 first entry. */
9876 s = htab->elf.splt;
9877 if (s->size == 0)
9878 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9879
9880 pent->plt.offset = s->size;
9881
9882 /* Make room for this entry. */
9883 s->size += PLT_ENTRY_SIZE (htab);
9884
9885 /* Make room for the .glink code. */
9886 s = htab->glink;
9887 if (s->size == 0)
9888 s->size += GLINK_CALL_STUB_SIZE;
9889 if (htab->opd_abi)
9890 {
9891 /* We need bigger stubs past index 32767. */
9892 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9893 s->size += 4;
9894 s->size += 2*4;
9895 }
9896 else
9897 s->size += 4;
9898
9899 /* We also need to make an entry in the .rela.plt section. */
9900 s = htab->elf.srelplt;
9901 }
9902 s->size += sizeof (Elf64_External_Rela);
9903 doneone = TRUE;
9904 }
9905 else
9906 pent->plt.offset = (bfd_vma) -1;
9907 if (!doneone)
9908 {
9909 h->plt.plist = NULL;
9910 h->needs_plt = 0;
9911 }
9912 }
9913 else
9914 {
9915 h->plt.plist = NULL;
9916 h->needs_plt = 0;
9917 }
9918
9919 return TRUE;
9920 }
9921
9922 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9923 to set up space for global entry stubs. These are put in glink,
9924 after the branch table. */
9925
9926 static bfd_boolean
9927 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9928 {
9929 struct bfd_link_info *info;
9930 struct ppc_link_hash_table *htab;
9931 struct plt_entry *pent;
9932 asection *s;
9933
9934 if (h->root.type == bfd_link_hash_indirect)
9935 return TRUE;
9936
9937 if (!h->pointer_equality_needed)
9938 return TRUE;
9939
9940 if (h->def_regular)
9941 return TRUE;
9942
9943 info = inf;
9944 htab = ppc_hash_table (info);
9945 if (htab == NULL)
9946 return FALSE;
9947
9948 s = htab->glink;
9949 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9950 if (pent->plt.offset != (bfd_vma) -1
9951 && pent->addend == 0)
9952 {
9953 /* For ELFv2, if this symbol is not defined in a regular file
9954 and we are not generating a shared library or pie, then we
9955 need to define the symbol in the executable on a call stub.
9956 This is to avoid text relocations. */
9957 s->size = (s->size + 15) & -16;
9958 h->root.type = bfd_link_hash_defined;
9959 h->root.u.def.section = s;
9960 h->root.u.def.value = s->size;
9961 s->size += 16;
9962 break;
9963 }
9964 return TRUE;
9965 }
9966
9967 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9968 read-only sections. */
9969
9970 static bfd_boolean
9971 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9972 {
9973 if (h->root.type == bfd_link_hash_indirect)
9974 return TRUE;
9975
9976 if (readonly_dynrelocs (h))
9977 {
9978 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9979
9980 /* Not an error, just cut short the traversal. */
9981 return FALSE;
9982 }
9983 return TRUE;
9984 }
9985
9986 /* Set the sizes of the dynamic sections. */
9987
9988 static bfd_boolean
9989 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9990 struct bfd_link_info *info)
9991 {
9992 struct ppc_link_hash_table *htab;
9993 bfd *dynobj;
9994 asection *s;
9995 bfd_boolean relocs;
9996 bfd *ibfd;
9997 struct got_entry *first_tlsld;
9998
9999 htab = ppc_hash_table (info);
10000 if (htab == NULL)
10001 return FALSE;
10002
10003 dynobj = htab->elf.dynobj;
10004 if (dynobj == NULL)
10005 abort ();
10006
10007 if (htab->elf.dynamic_sections_created)
10008 {
10009 /* Set the contents of the .interp section to the interpreter. */
10010 if (bfd_link_executable (info) && !info->nointerp)
10011 {
10012 s = bfd_get_linker_section (dynobj, ".interp");
10013 if (s == NULL)
10014 abort ();
10015 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10016 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10017 }
10018 }
10019
10020 /* Set up .got offsets for local syms, and space for local dynamic
10021 relocs. */
10022 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10023 {
10024 struct got_entry **lgot_ents;
10025 struct got_entry **end_lgot_ents;
10026 struct plt_entry **local_plt;
10027 struct plt_entry **end_local_plt;
10028 unsigned char *lgot_masks;
10029 bfd_size_type locsymcount;
10030 Elf_Internal_Shdr *symtab_hdr;
10031
10032 if (!is_ppc64_elf (ibfd))
10033 continue;
10034
10035 for (s = ibfd->sections; s != NULL; s = s->next)
10036 {
10037 struct ppc_dyn_relocs *p;
10038
10039 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10040 {
10041 if (!bfd_is_abs_section (p->sec)
10042 && bfd_is_abs_section (p->sec->output_section))
10043 {
10044 /* Input section has been discarded, either because
10045 it is a copy of a linkonce section or due to
10046 linker script /DISCARD/, so we'll be discarding
10047 the relocs too. */
10048 }
10049 else if (p->count != 0)
10050 {
10051 asection *srel = elf_section_data (p->sec)->sreloc;
10052 if (p->ifunc)
10053 srel = htab->elf.irelplt;
10054 srel->size += p->count * sizeof (Elf64_External_Rela);
10055 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10056 info->flags |= DF_TEXTREL;
10057 }
10058 }
10059 }
10060
10061 lgot_ents = elf_local_got_ents (ibfd);
10062 if (!lgot_ents)
10063 continue;
10064
10065 symtab_hdr = &elf_symtab_hdr (ibfd);
10066 locsymcount = symtab_hdr->sh_info;
10067 end_lgot_ents = lgot_ents + locsymcount;
10068 local_plt = (struct plt_entry **) end_lgot_ents;
10069 end_local_plt = local_plt + locsymcount;
10070 lgot_masks = (unsigned char *) end_local_plt;
10071 s = ppc64_elf_tdata (ibfd)->got;
10072 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10073 {
10074 struct got_entry **pent, *ent;
10075
10076 pent = lgot_ents;
10077 while ((ent = *pent) != NULL)
10078 if (ent->got.refcount > 0)
10079 {
10080 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
10081 {
10082 ppc64_tlsld_got (ibfd)->got.refcount += 1;
10083 *pent = ent->next;
10084 }
10085 else
10086 {
10087 unsigned int ent_size = 8;
10088 unsigned int rel_size = sizeof (Elf64_External_Rela);
10089
10090 ent->got.offset = s->size;
10091 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10092 {
10093 ent_size *= 2;
10094 rel_size *= 2;
10095 }
10096 s->size += ent_size;
10097 if ((*lgot_masks & PLT_IFUNC) != 0)
10098 {
10099 htab->elf.irelplt->size += rel_size;
10100 htab->got_reli_size += rel_size;
10101 }
10102 else if (bfd_link_pic (info))
10103 {
10104 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10105 srel->size += rel_size;
10106 }
10107 pent = &ent->next;
10108 }
10109 }
10110 else
10111 *pent = ent->next;
10112 }
10113
10114 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
10115 for (; local_plt < end_local_plt; ++local_plt)
10116 {
10117 struct plt_entry *ent;
10118
10119 for (ent = *local_plt; ent != NULL; ent = ent->next)
10120 if (ent->plt.refcount > 0)
10121 {
10122 s = htab->elf.iplt;
10123 ent->plt.offset = s->size;
10124 s->size += PLT_ENTRY_SIZE (htab);
10125
10126 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10127 }
10128 else
10129 ent->plt.offset = (bfd_vma) -1;
10130 }
10131 }
10132
10133 /* Allocate global sym .plt and .got entries, and space for global
10134 sym dynamic relocs. */
10135 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
10136 /* Stash the end of glink branch table. */
10137 if (htab->glink != NULL)
10138 htab->glink->rawsize = htab->glink->size;
10139
10140 if (!htab->opd_abi && !bfd_link_pic (info))
10141 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
10142
10143 first_tlsld = NULL;
10144 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10145 {
10146 struct got_entry *ent;
10147
10148 if (!is_ppc64_elf (ibfd))
10149 continue;
10150
10151 ent = ppc64_tlsld_got (ibfd);
10152 if (ent->got.refcount > 0)
10153 {
10154 if (!htab->do_multi_toc && first_tlsld != NULL)
10155 {
10156 ent->is_indirect = TRUE;
10157 ent->got.ent = first_tlsld;
10158 }
10159 else
10160 {
10161 if (first_tlsld == NULL)
10162 first_tlsld = ent;
10163 s = ppc64_elf_tdata (ibfd)->got;
10164 ent->got.offset = s->size;
10165 ent->owner = ibfd;
10166 s->size += 16;
10167 if (bfd_link_pic (info))
10168 {
10169 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10170 srel->size += sizeof (Elf64_External_Rela);
10171 }
10172 }
10173 }
10174 else
10175 ent->got.offset = (bfd_vma) -1;
10176 }
10177
10178 /* We now have determined the sizes of the various dynamic sections.
10179 Allocate memory for them. */
10180 relocs = FALSE;
10181 for (s = dynobj->sections; s != NULL; s = s->next)
10182 {
10183 if ((s->flags & SEC_LINKER_CREATED) == 0)
10184 continue;
10185
10186 if (s == htab->brlt || s == htab->relbrlt)
10187 /* These haven't been allocated yet; don't strip. */
10188 continue;
10189 else if (s == htab->elf.sgot
10190 || s == htab->elf.splt
10191 || s == htab->elf.iplt
10192 || s == htab->glink
10193 || s == htab->dynbss)
10194 {
10195 /* Strip this section if we don't need it; see the
10196 comment below. */
10197 }
10198 else if (s == htab->glink_eh_frame)
10199 {
10200 if (!bfd_is_abs_section (s->output_section))
10201 /* Not sized yet. */
10202 continue;
10203 }
10204 else if (CONST_STRNEQ (s->name, ".rela"))
10205 {
10206 if (s->size != 0)
10207 {
10208 if (s != htab->elf.srelplt)
10209 relocs = TRUE;
10210
10211 /* We use the reloc_count field as a counter if we need
10212 to copy relocs into the output file. */
10213 s->reloc_count = 0;
10214 }
10215 }
10216 else
10217 {
10218 /* It's not one of our sections, so don't allocate space. */
10219 continue;
10220 }
10221
10222 if (s->size == 0)
10223 {
10224 /* If we don't need this section, strip it from the
10225 output file. This is mostly to handle .rela.bss and
10226 .rela.plt. We must create both sections in
10227 create_dynamic_sections, because they must be created
10228 before the linker maps input sections to output
10229 sections. The linker does that before
10230 adjust_dynamic_symbol is called, and it is that
10231 function which decides whether anything needs to go
10232 into these sections. */
10233 s->flags |= SEC_EXCLUDE;
10234 continue;
10235 }
10236
10237 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10238 continue;
10239
10240 /* Allocate memory for the section contents. We use bfd_zalloc
10241 here in case unused entries are not reclaimed before the
10242 section's contents are written out. This should not happen,
10243 but this way if it does we get a R_PPC64_NONE reloc in .rela
10244 sections instead of garbage.
10245 We also rely on the section contents being zero when writing
10246 the GOT. */
10247 s->contents = bfd_zalloc (dynobj, s->size);
10248 if (s->contents == NULL)
10249 return FALSE;
10250 }
10251
10252 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10253 {
10254 if (!is_ppc64_elf (ibfd))
10255 continue;
10256
10257 s = ppc64_elf_tdata (ibfd)->got;
10258 if (s != NULL && s != htab->elf.sgot)
10259 {
10260 if (s->size == 0)
10261 s->flags |= SEC_EXCLUDE;
10262 else
10263 {
10264 s->contents = bfd_zalloc (ibfd, s->size);
10265 if (s->contents == NULL)
10266 return FALSE;
10267 }
10268 }
10269 s = ppc64_elf_tdata (ibfd)->relgot;
10270 if (s != NULL)
10271 {
10272 if (s->size == 0)
10273 s->flags |= SEC_EXCLUDE;
10274 else
10275 {
10276 s->contents = bfd_zalloc (ibfd, s->size);
10277 if (s->contents == NULL)
10278 return FALSE;
10279 relocs = TRUE;
10280 s->reloc_count = 0;
10281 }
10282 }
10283 }
10284
10285 if (htab->elf.dynamic_sections_created)
10286 {
10287 bfd_boolean tls_opt;
10288
10289 /* Add some entries to the .dynamic section. We fill in the
10290 values later, in ppc64_elf_finish_dynamic_sections, but we
10291 must add the entries now so that we get the correct size for
10292 the .dynamic section. The DT_DEBUG entry is filled in by the
10293 dynamic linker and used by the debugger. */
10294 #define add_dynamic_entry(TAG, VAL) \
10295 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10296
10297 if (bfd_link_executable (info))
10298 {
10299 if (!add_dynamic_entry (DT_DEBUG, 0))
10300 return FALSE;
10301 }
10302
10303 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
10304 {
10305 if (!add_dynamic_entry (DT_PLTGOT, 0)
10306 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10307 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
10308 || !add_dynamic_entry (DT_JMPREL, 0)
10309 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
10310 return FALSE;
10311 }
10312
10313 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
10314 {
10315 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10316 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
10317 return FALSE;
10318 }
10319
10320 tls_opt = (htab->params->tls_get_addr_opt
10321 && htab->tls_get_addr_fd != NULL
10322 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10323 if (tls_opt || !htab->opd_abi)
10324 {
10325 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10326 return FALSE;
10327 }
10328
10329 if (relocs)
10330 {
10331 if (!add_dynamic_entry (DT_RELA, 0)
10332 || !add_dynamic_entry (DT_RELASZ, 0)
10333 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
10334 return FALSE;
10335
10336 /* If any dynamic relocs apply to a read-only section,
10337 then we need a DT_TEXTREL entry. */
10338 if ((info->flags & DF_TEXTREL) == 0)
10339 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
10340
10341 if ((info->flags & DF_TEXTREL) != 0)
10342 {
10343 if (!add_dynamic_entry (DT_TEXTREL, 0))
10344 return FALSE;
10345 }
10346 }
10347 }
10348 #undef add_dynamic_entry
10349
10350 return TRUE;
10351 }
10352
10353 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10354
10355 static bfd_boolean
10356 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10357 {
10358 if (h->plt.plist != NULL
10359 && !h->def_regular
10360 && !h->pointer_equality_needed)
10361 return FALSE;
10362
10363 return _bfd_elf_hash_symbol (h);
10364 }
10365
10366 /* Determine the type of stub needed, if any, for a call. */
10367
10368 static inline enum ppc_stub_type
10369 ppc_type_of_stub (asection *input_sec,
10370 const Elf_Internal_Rela *rel,
10371 struct ppc_link_hash_entry **hash,
10372 struct plt_entry **plt_ent,
10373 bfd_vma destination,
10374 unsigned long local_off)
10375 {
10376 struct ppc_link_hash_entry *h = *hash;
10377 bfd_vma location;
10378 bfd_vma branch_offset;
10379 bfd_vma max_branch_offset;
10380 enum elf_ppc64_reloc_type r_type;
10381
10382 if (h != NULL)
10383 {
10384 struct plt_entry *ent;
10385 struct ppc_link_hash_entry *fdh = h;
10386 if (h->oh != NULL
10387 && h->oh->is_func_descriptor)
10388 {
10389 fdh = ppc_follow_link (h->oh);
10390 *hash = fdh;
10391 }
10392
10393 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10394 if (ent->addend == rel->r_addend
10395 && ent->plt.offset != (bfd_vma) -1)
10396 {
10397 *plt_ent = ent;
10398 return ppc_stub_plt_call;
10399 }
10400
10401 /* Here, we know we don't have a plt entry. If we don't have a
10402 either a defined function descriptor or a defined entry symbol
10403 in a regular object file, then it is pointless trying to make
10404 any other type of stub. */
10405 if (!is_static_defined (&fdh->elf)
10406 && !is_static_defined (&h->elf))
10407 return ppc_stub_none;
10408 }
10409 else if (elf_local_got_ents (input_sec->owner) != NULL)
10410 {
10411 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10412 struct plt_entry **local_plt = (struct plt_entry **)
10413 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10414 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10415
10416 if (local_plt[r_symndx] != NULL)
10417 {
10418 struct plt_entry *ent;
10419
10420 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10421 if (ent->addend == rel->r_addend
10422 && ent->plt.offset != (bfd_vma) -1)
10423 {
10424 *plt_ent = ent;
10425 return ppc_stub_plt_call;
10426 }
10427 }
10428 }
10429
10430 /* Determine where the call point is. */
10431 location = (input_sec->output_offset
10432 + input_sec->output_section->vma
10433 + rel->r_offset);
10434
10435 branch_offset = destination - location;
10436 r_type = ELF64_R_TYPE (rel->r_info);
10437
10438 /* Determine if a long branch stub is needed. */
10439 max_branch_offset = 1 << 25;
10440 if (r_type != R_PPC64_REL24)
10441 max_branch_offset = 1 << 15;
10442
10443 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10444 /* We need a stub. Figure out whether a long_branch or plt_branch
10445 is needed later. */
10446 return ppc_stub_long_branch;
10447
10448 return ppc_stub_none;
10449 }
10450
10451 /* With power7 weakly ordered memory model, it is possible for ld.so
10452 to update a plt entry in one thread and have another thread see a
10453 stale zero toc entry. To avoid this we need some sort of acquire
10454 barrier in the call stub. One solution is to make the load of the
10455 toc word seem to appear to depend on the load of the function entry
10456 word. Another solution is to test for r2 being zero, and branch to
10457 the appropriate glink entry if so.
10458
10459 . fake dep barrier compare
10460 . ld 12,xxx(2) ld 12,xxx(2)
10461 . mtctr 12 mtctr 12
10462 . xor 11,12,12 ld 2,xxx+8(2)
10463 . add 2,2,11 cmpldi 2,0
10464 . ld 2,xxx+8(2) bnectr+
10465 . bctr b <glink_entry>
10466
10467 The solution involving the compare turns out to be faster, so
10468 that's what we use unless the branch won't reach. */
10469
10470 #define ALWAYS_USE_FAKE_DEP 0
10471 #define ALWAYS_EMIT_R2SAVE 0
10472
10473 #define PPC_LO(v) ((v) & 0xffff)
10474 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10475 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10476
10477 static inline unsigned int
10478 plt_stub_size (struct ppc_link_hash_table *htab,
10479 struct ppc_stub_hash_entry *stub_entry,
10480 bfd_vma off)
10481 {
10482 unsigned size = 12;
10483
10484 if (ALWAYS_EMIT_R2SAVE
10485 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10486 size += 4;
10487 if (PPC_HA (off) != 0)
10488 size += 4;
10489 if (htab->opd_abi)
10490 {
10491 size += 4;
10492 if (htab->params->plt_static_chain)
10493 size += 4;
10494 if (htab->params->plt_thread_safe
10495 && htab->elf.dynamic_sections_created
10496 && stub_entry->h != NULL
10497 && stub_entry->h->elf.dynindx != -1)
10498 size += 8;
10499 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10500 size += 4;
10501 }
10502 if (stub_entry->h != NULL
10503 && (stub_entry->h == htab->tls_get_addr_fd
10504 || stub_entry->h == htab->tls_get_addr)
10505 && htab->params->tls_get_addr_opt)
10506 size += 13 * 4;
10507 return size;
10508 }
10509
10510 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10511 then return the padding needed to do so. */
10512 static inline unsigned int
10513 plt_stub_pad (struct ppc_link_hash_table *htab,
10514 struct ppc_stub_hash_entry *stub_entry,
10515 bfd_vma plt_off)
10516 {
10517 int stub_align = 1 << htab->params->plt_stub_align;
10518 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10519 bfd_vma stub_off = stub_entry->group->stub_sec->size;
10520
10521 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10522 > ((stub_size - 1) & -stub_align))
10523 return stub_align - (stub_off & (stub_align - 1));
10524 return 0;
10525 }
10526
10527 /* Build a .plt call stub. */
10528
10529 static inline bfd_byte *
10530 build_plt_stub (struct ppc_link_hash_table *htab,
10531 struct ppc_stub_hash_entry *stub_entry,
10532 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10533 {
10534 bfd *obfd = htab->params->stub_bfd;
10535 bfd_boolean plt_load_toc = htab->opd_abi;
10536 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10537 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10538 && htab->elf.dynamic_sections_created
10539 && stub_entry->h != NULL
10540 && stub_entry->h->elf.dynindx != -1);
10541 bfd_boolean use_fake_dep = plt_thread_safe;
10542 bfd_vma cmp_branch_off = 0;
10543
10544 if (!ALWAYS_USE_FAKE_DEP
10545 && plt_load_toc
10546 && plt_thread_safe
10547 && !((stub_entry->h == htab->tls_get_addr_fd
10548 || stub_entry->h == htab->tls_get_addr)
10549 && htab->params->tls_get_addr_opt))
10550 {
10551 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10552 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10553 / PLT_ENTRY_SIZE (htab));
10554 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10555 bfd_vma to, from;
10556
10557 if (pltindex > 32768)
10558 glinkoff += (pltindex - 32768) * 4;
10559 to = (glinkoff
10560 + htab->glink->output_offset
10561 + htab->glink->output_section->vma);
10562 from = (p - stub_entry->group->stub_sec->contents
10563 + 4 * (ALWAYS_EMIT_R2SAVE
10564 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10565 + 4 * (PPC_HA (offset) != 0)
10566 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10567 != PPC_HA (offset))
10568 + 4 * (plt_static_chain != 0)
10569 + 20
10570 + stub_entry->group->stub_sec->output_offset
10571 + stub_entry->group->stub_sec->output_section->vma);
10572 cmp_branch_off = to - from;
10573 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10574 }
10575
10576 if (PPC_HA (offset) != 0)
10577 {
10578 if (r != NULL)
10579 {
10580 if (ALWAYS_EMIT_R2SAVE
10581 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10582 r[0].r_offset += 4;
10583 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10584 r[1].r_offset = r[0].r_offset + 4;
10585 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10586 r[1].r_addend = r[0].r_addend;
10587 if (plt_load_toc)
10588 {
10589 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10590 {
10591 r[2].r_offset = r[1].r_offset + 4;
10592 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10593 r[2].r_addend = r[0].r_addend;
10594 }
10595 else
10596 {
10597 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10598 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10599 r[2].r_addend = r[0].r_addend + 8;
10600 if (plt_static_chain)
10601 {
10602 r[3].r_offset = r[2].r_offset + 4;
10603 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10604 r[3].r_addend = r[0].r_addend + 16;
10605 }
10606 }
10607 }
10608 }
10609 if (ALWAYS_EMIT_R2SAVE
10610 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10611 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10612 if (plt_load_toc)
10613 {
10614 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10615 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10616 }
10617 else
10618 {
10619 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10620 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10621 }
10622 if (plt_load_toc
10623 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10624 {
10625 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10626 offset = 0;
10627 }
10628 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10629 if (plt_load_toc)
10630 {
10631 if (use_fake_dep)
10632 {
10633 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10634 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10635 }
10636 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10637 if (plt_static_chain)
10638 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10639 }
10640 }
10641 else
10642 {
10643 if (r != NULL)
10644 {
10645 if (ALWAYS_EMIT_R2SAVE
10646 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10647 r[0].r_offset += 4;
10648 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10649 if (plt_load_toc)
10650 {
10651 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10652 {
10653 r[1].r_offset = r[0].r_offset + 4;
10654 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10655 r[1].r_addend = r[0].r_addend;
10656 }
10657 else
10658 {
10659 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10660 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10661 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10662 if (plt_static_chain)
10663 {
10664 r[2].r_offset = r[1].r_offset + 4;
10665 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10666 r[2].r_addend = r[0].r_addend + 8;
10667 }
10668 }
10669 }
10670 }
10671 if (ALWAYS_EMIT_R2SAVE
10672 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10673 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10674 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10675 if (plt_load_toc
10676 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10677 {
10678 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10679 offset = 0;
10680 }
10681 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10682 if (plt_load_toc)
10683 {
10684 if (use_fake_dep)
10685 {
10686 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10687 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10688 }
10689 if (plt_static_chain)
10690 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10691 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10692 }
10693 }
10694 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10695 {
10696 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10697 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10698 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10699 }
10700 else
10701 bfd_put_32 (obfd, BCTR, p), p += 4;
10702 return p;
10703 }
10704
10705 /* Build a special .plt call stub for __tls_get_addr. */
10706
10707 #define LD_R11_0R3 0xe9630000
10708 #define LD_R12_0R3 0xe9830000
10709 #define MR_R0_R3 0x7c601b78
10710 #define CMPDI_R11_0 0x2c2b0000
10711 #define ADD_R3_R12_R13 0x7c6c6a14
10712 #define BEQLR 0x4d820020
10713 #define MR_R3_R0 0x7c030378
10714 #define STD_R11_0R1 0xf9610000
10715 #define BCTRL 0x4e800421
10716 #define LD_R11_0R1 0xe9610000
10717 #define MTLR_R11 0x7d6803a6
10718
10719 static inline bfd_byte *
10720 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10721 struct ppc_stub_hash_entry *stub_entry,
10722 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10723 {
10724 bfd *obfd = htab->params->stub_bfd;
10725
10726 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10727 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10728 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10729 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10730 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10731 bfd_put_32 (obfd, BEQLR, p), p += 4;
10732 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10733 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10734 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10735
10736 if (r != NULL)
10737 r[0].r_offset += 9 * 4;
10738 p = build_plt_stub (htab, stub_entry, p, offset, r);
10739 bfd_put_32 (obfd, BCTRL, p - 4);
10740
10741 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10742 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10743 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10744 bfd_put_32 (obfd, BLR, p), p += 4;
10745
10746 return p;
10747 }
10748
10749 static Elf_Internal_Rela *
10750 get_relocs (asection *sec, int count)
10751 {
10752 Elf_Internal_Rela *relocs;
10753 struct bfd_elf_section_data *elfsec_data;
10754
10755 elfsec_data = elf_section_data (sec);
10756 relocs = elfsec_data->relocs;
10757 if (relocs == NULL)
10758 {
10759 bfd_size_type relsize;
10760 relsize = sec->reloc_count * sizeof (*relocs);
10761 relocs = bfd_alloc (sec->owner, relsize);
10762 if (relocs == NULL)
10763 return NULL;
10764 elfsec_data->relocs = relocs;
10765 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10766 sizeof (Elf_Internal_Shdr));
10767 if (elfsec_data->rela.hdr == NULL)
10768 return NULL;
10769 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10770 * sizeof (Elf64_External_Rela));
10771 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10772 sec->reloc_count = 0;
10773 }
10774 relocs += sec->reloc_count;
10775 sec->reloc_count += count;
10776 return relocs;
10777 }
10778
10779 static bfd_vma
10780 get_r2off (struct bfd_link_info *info,
10781 struct ppc_stub_hash_entry *stub_entry)
10782 {
10783 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10784 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
10785
10786 if (r2off == 0)
10787 {
10788 /* Support linking -R objects. Get the toc pointer from the
10789 opd entry. */
10790 char buf[8];
10791 if (!htab->opd_abi)
10792 return r2off;
10793 asection *opd = stub_entry->h->elf.root.u.def.section;
10794 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10795
10796 if (strcmp (opd->name, ".opd") != 0
10797 || opd->reloc_count != 0)
10798 {
10799 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10800 stub_entry->h->elf.root.root.string);
10801 bfd_set_error (bfd_error_bad_value);
10802 return (bfd_vma) -1;
10803 }
10804 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10805 return (bfd_vma) -1;
10806 r2off = bfd_get_64 (opd->owner, buf);
10807 r2off -= elf_gp (info->output_bfd);
10808 }
10809 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
10810 return r2off;
10811 }
10812
10813 static bfd_boolean
10814 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10815 {
10816 struct ppc_stub_hash_entry *stub_entry;
10817 struct ppc_branch_hash_entry *br_entry;
10818 struct bfd_link_info *info;
10819 struct ppc_link_hash_table *htab;
10820 bfd_byte *loc;
10821 bfd_byte *p;
10822 bfd_vma dest, off;
10823 int size;
10824 Elf_Internal_Rela *r;
10825 asection *plt;
10826
10827 /* Massage our args to the form they really have. */
10828 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10829 info = in_arg;
10830
10831 htab = ppc_hash_table (info);
10832 if (htab == NULL)
10833 return FALSE;
10834
10835 /* Make a note of the offset within the stubs for this entry. */
10836 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10837 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
10838
10839 htab->stub_count[stub_entry->stub_type - 1] += 1;
10840 switch (stub_entry->stub_type)
10841 {
10842 case ppc_stub_long_branch:
10843 case ppc_stub_long_branch_r2off:
10844 /* Branches are relative. This is where we are going to. */
10845 dest = (stub_entry->target_value
10846 + stub_entry->target_section->output_offset
10847 + stub_entry->target_section->output_section->vma);
10848 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10849 off = dest;
10850
10851 /* And this is where we are coming from. */
10852 off -= (stub_entry->stub_offset
10853 + stub_entry->group->stub_sec->output_offset
10854 + stub_entry->group->stub_sec->output_section->vma);
10855
10856 size = 4;
10857 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10858 {
10859 bfd_vma r2off = get_r2off (info, stub_entry);
10860
10861 if (r2off == (bfd_vma) -1)
10862 {
10863 htab->stub_error = TRUE;
10864 return FALSE;
10865 }
10866 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10867 loc += 4;
10868 size = 8;
10869 if (PPC_HA (r2off) != 0)
10870 {
10871 bfd_put_32 (htab->params->stub_bfd,
10872 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10873 loc += 4;
10874 size += 4;
10875 }
10876 if (PPC_LO (r2off) != 0)
10877 {
10878 bfd_put_32 (htab->params->stub_bfd,
10879 ADDI_R2_R2 | PPC_LO (r2off), loc);
10880 loc += 4;
10881 size += 4;
10882 }
10883 off -= size - 4;
10884 }
10885 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10886
10887 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10888 {
10889 info->callbacks->einfo
10890 (_("%P: long branch stub `%s' offset overflow\n"),
10891 stub_entry->root.string);
10892 htab->stub_error = TRUE;
10893 return FALSE;
10894 }
10895
10896 if (info->emitrelocations)
10897 {
10898 r = get_relocs (stub_entry->group->stub_sec, 1);
10899 if (r == NULL)
10900 return FALSE;
10901 r->r_offset = loc - stub_entry->group->stub_sec->contents;
10902 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10903 r->r_addend = dest;
10904 if (stub_entry->h != NULL)
10905 {
10906 struct elf_link_hash_entry **hashes;
10907 unsigned long symndx;
10908 struct ppc_link_hash_entry *h;
10909
10910 hashes = elf_sym_hashes (htab->params->stub_bfd);
10911 if (hashes == NULL)
10912 {
10913 bfd_size_type hsize;
10914
10915 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10916 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10917 if (hashes == NULL)
10918 return FALSE;
10919 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10920 htab->stub_globals = 1;
10921 }
10922 symndx = htab->stub_globals++;
10923 h = stub_entry->h;
10924 hashes[symndx] = &h->elf;
10925 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10926 if (h->oh != NULL && h->oh->is_func)
10927 h = ppc_follow_link (h->oh);
10928 if (h->elf.root.u.def.section != stub_entry->target_section)
10929 /* H is an opd symbol. The addend must be zero. */
10930 r->r_addend = 0;
10931 else
10932 {
10933 off = (h->elf.root.u.def.value
10934 + h->elf.root.u.def.section->output_offset
10935 + h->elf.root.u.def.section->output_section->vma);
10936 r->r_addend -= off;
10937 }
10938 }
10939 }
10940 break;
10941
10942 case ppc_stub_plt_branch:
10943 case ppc_stub_plt_branch_r2off:
10944 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10945 stub_entry->root.string + 9,
10946 FALSE, FALSE);
10947 if (br_entry == NULL)
10948 {
10949 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10950 stub_entry->root.string);
10951 htab->stub_error = TRUE;
10952 return FALSE;
10953 }
10954
10955 dest = (stub_entry->target_value
10956 + stub_entry->target_section->output_offset
10957 + stub_entry->target_section->output_section->vma);
10958 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10959 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10960
10961 bfd_put_64 (htab->brlt->owner, dest,
10962 htab->brlt->contents + br_entry->offset);
10963
10964 if (br_entry->iter == htab->stub_iteration)
10965 {
10966 br_entry->iter = 0;
10967
10968 if (htab->relbrlt != NULL)
10969 {
10970 /* Create a reloc for the branch lookup table entry. */
10971 Elf_Internal_Rela rela;
10972 bfd_byte *rl;
10973
10974 rela.r_offset = (br_entry->offset
10975 + htab->brlt->output_offset
10976 + htab->brlt->output_section->vma);
10977 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10978 rela.r_addend = dest;
10979
10980 rl = htab->relbrlt->contents;
10981 rl += (htab->relbrlt->reloc_count++
10982 * sizeof (Elf64_External_Rela));
10983 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10984 }
10985 else if (info->emitrelocations)
10986 {
10987 r = get_relocs (htab->brlt, 1);
10988 if (r == NULL)
10989 return FALSE;
10990 /* brlt, being SEC_LINKER_CREATED does not go through the
10991 normal reloc processing. Symbols and offsets are not
10992 translated from input file to output file form, so
10993 set up the offset per the output file. */
10994 r->r_offset = (br_entry->offset
10995 + htab->brlt->output_offset
10996 + htab->brlt->output_section->vma);
10997 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10998 r->r_addend = dest;
10999 }
11000 }
11001
11002 dest = (br_entry->offset
11003 + htab->brlt->output_offset
11004 + htab->brlt->output_section->vma);
11005
11006 off = (dest
11007 - elf_gp (htab->brlt->output_section->owner)
11008 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11009
11010 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11011 {
11012 info->callbacks->einfo
11013 (_("%P: linkage table error against `%T'\n"),
11014 stub_entry->root.string);
11015 bfd_set_error (bfd_error_bad_value);
11016 htab->stub_error = TRUE;
11017 return FALSE;
11018 }
11019
11020 if (info->emitrelocations)
11021 {
11022 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
11023 if (r == NULL)
11024 return FALSE;
11025 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11026 if (bfd_big_endian (info->output_bfd))
11027 r[0].r_offset += 2;
11028 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
11029 r[0].r_offset += 4;
11030 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11031 r[0].r_addend = dest;
11032 if (PPC_HA (off) != 0)
11033 {
11034 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11035 r[1].r_offset = r[0].r_offset + 4;
11036 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11037 r[1].r_addend = r[0].r_addend;
11038 }
11039 }
11040
11041 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11042 {
11043 if (PPC_HA (off) != 0)
11044 {
11045 size = 16;
11046 bfd_put_32 (htab->params->stub_bfd,
11047 ADDIS_R12_R2 | PPC_HA (off), loc);
11048 loc += 4;
11049 bfd_put_32 (htab->params->stub_bfd,
11050 LD_R12_0R12 | PPC_LO (off), loc);
11051 }
11052 else
11053 {
11054 size = 12;
11055 bfd_put_32 (htab->params->stub_bfd,
11056 LD_R12_0R2 | PPC_LO (off), loc);
11057 }
11058 }
11059 else
11060 {
11061 bfd_vma r2off = get_r2off (info, stub_entry);
11062
11063 if (r2off == (bfd_vma) -1)
11064 {
11065 htab->stub_error = TRUE;
11066 return FALSE;
11067 }
11068
11069 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
11070 loc += 4;
11071 size = 16;
11072 if (PPC_HA (off) != 0)
11073 {
11074 size += 4;
11075 bfd_put_32 (htab->params->stub_bfd,
11076 ADDIS_R12_R2 | PPC_HA (off), loc);
11077 loc += 4;
11078 bfd_put_32 (htab->params->stub_bfd,
11079 LD_R12_0R12 | PPC_LO (off), loc);
11080 }
11081 else
11082 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
11083
11084 if (PPC_HA (r2off) != 0)
11085 {
11086 size += 4;
11087 loc += 4;
11088 bfd_put_32 (htab->params->stub_bfd,
11089 ADDIS_R2_R2 | PPC_HA (r2off), loc);
11090 }
11091 if (PPC_LO (r2off) != 0)
11092 {
11093 size += 4;
11094 loc += 4;
11095 bfd_put_32 (htab->params->stub_bfd,
11096 ADDI_R2_R2 | PPC_LO (r2off), loc);
11097 }
11098 }
11099 loc += 4;
11100 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
11101 loc += 4;
11102 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
11103 break;
11104
11105 case ppc_stub_plt_call:
11106 case ppc_stub_plt_call_r2save:
11107 if (stub_entry->h != NULL
11108 && stub_entry->h->is_func_descriptor
11109 && stub_entry->h->oh != NULL)
11110 {
11111 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11112
11113 /* If the old-ABI "dot-symbol" is undefined make it weak so
11114 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
11115 if (fh->elf.root.type == bfd_link_hash_undefined
11116 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11117 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
11118 fh->elf.root.type = bfd_link_hash_undefweak;
11119 }
11120
11121 /* Now build the stub. */
11122 dest = stub_entry->plt_ent->plt.offset & ~1;
11123 if (dest >= (bfd_vma) -2)
11124 abort ();
11125
11126 plt = htab->elf.splt;
11127 if (!htab->elf.dynamic_sections_created
11128 || stub_entry->h == NULL
11129 || stub_entry->h->elf.dynindx == -1)
11130 plt = htab->elf.iplt;
11131
11132 dest += plt->output_offset + plt->output_section->vma;
11133
11134 if (stub_entry->h == NULL
11135 && (stub_entry->plt_ent->plt.offset & 1) == 0)
11136 {
11137 Elf_Internal_Rela rela;
11138 bfd_byte *rl;
11139
11140 rela.r_offset = dest;
11141 if (htab->opd_abi)
11142 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
11143 else
11144 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
11145 rela.r_addend = (stub_entry->target_value
11146 + stub_entry->target_section->output_offset
11147 + stub_entry->target_section->output_section->vma);
11148
11149 rl = (htab->elf.irelplt->contents
11150 + (htab->elf.irelplt->reloc_count++
11151 * sizeof (Elf64_External_Rela)));
11152 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
11153 stub_entry->plt_ent->plt.offset |= 1;
11154 }
11155
11156 off = (dest
11157 - elf_gp (plt->output_section->owner)
11158 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11159
11160 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11161 {
11162 info->callbacks->einfo
11163 /* xgettext:c-format */
11164 (_("%P: linkage table error against `%T'\n"),
11165 stub_entry->h != NULL
11166 ? stub_entry->h->elf.root.root.string
11167 : "<local sym>");
11168 bfd_set_error (bfd_error_bad_value);
11169 htab->stub_error = TRUE;
11170 return FALSE;
11171 }
11172
11173 if (htab->params->plt_stub_align != 0)
11174 {
11175 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11176
11177 stub_entry->group->stub_sec->size += pad;
11178 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11179 loc += pad;
11180 }
11181
11182 r = NULL;
11183 if (info->emitrelocations)
11184 {
11185 r = get_relocs (stub_entry->group->stub_sec,
11186 ((PPC_HA (off) != 0)
11187 + (htab->opd_abi
11188 ? 2 + (htab->params->plt_static_chain
11189 && PPC_HA (off + 16) == PPC_HA (off))
11190 : 1)));
11191 if (r == NULL)
11192 return FALSE;
11193 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11194 if (bfd_big_endian (info->output_bfd))
11195 r[0].r_offset += 2;
11196 r[0].r_addend = dest;
11197 }
11198 if (stub_entry->h != NULL
11199 && (stub_entry->h == htab->tls_get_addr_fd
11200 || stub_entry->h == htab->tls_get_addr)
11201 && htab->params->tls_get_addr_opt)
11202 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
11203 else
11204 p = build_plt_stub (htab, stub_entry, loc, off, r);
11205 size = p - loc;
11206 break;
11207
11208 case ppc_stub_save_res:
11209 return TRUE;
11210
11211 default:
11212 BFD_FAIL ();
11213 return FALSE;
11214 }
11215
11216 stub_entry->group->stub_sec->size += size;
11217
11218 if (htab->params->emit_stub_syms)
11219 {
11220 struct elf_link_hash_entry *h;
11221 size_t len1, len2;
11222 char *name;
11223 const char *const stub_str[] = { "long_branch",
11224 "long_branch_r2off",
11225 "plt_branch",
11226 "plt_branch_r2off",
11227 "plt_call",
11228 "plt_call" };
11229
11230 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11231 len2 = strlen (stub_entry->root.string);
11232 name = bfd_malloc (len1 + len2 + 2);
11233 if (name == NULL)
11234 return FALSE;
11235 memcpy (name, stub_entry->root.string, 9);
11236 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11237 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11238 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
11239 if (h == NULL)
11240 return FALSE;
11241 if (h->root.type == bfd_link_hash_new)
11242 {
11243 h->root.type = bfd_link_hash_defined;
11244 h->root.u.def.section = stub_entry->group->stub_sec;
11245 h->root.u.def.value = stub_entry->stub_offset;
11246 h->ref_regular = 1;
11247 h->def_regular = 1;
11248 h->ref_regular_nonweak = 1;
11249 h->forced_local = 1;
11250 h->non_elf = 0;
11251 h->root.linker_def = 1;
11252 }
11253 }
11254
11255 return TRUE;
11256 }
11257
11258 /* As above, but don't actually build the stub. Just bump offset so
11259 we know stub section sizes, and select plt_branch stubs where
11260 long_branch stubs won't do. */
11261
11262 static bfd_boolean
11263 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
11264 {
11265 struct ppc_stub_hash_entry *stub_entry;
11266 struct bfd_link_info *info;
11267 struct ppc_link_hash_table *htab;
11268 bfd_vma off;
11269 int size;
11270
11271 /* Massage our args to the form they really have. */
11272 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
11273 info = in_arg;
11274
11275 htab = ppc_hash_table (info);
11276 if (htab == NULL)
11277 return FALSE;
11278
11279 if (stub_entry->h != NULL
11280 && stub_entry->h->save_res
11281 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11282 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11283 {
11284 /* Don't make stubs to out-of-line register save/restore
11285 functions. Instead, emit copies of the functions. */
11286 stub_entry->group->needs_save_res = 1;
11287 stub_entry->stub_type = ppc_stub_save_res;
11288 return TRUE;
11289 }
11290
11291 if (stub_entry->stub_type == ppc_stub_plt_call
11292 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11293 {
11294 asection *plt;
11295 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11296 if (off >= (bfd_vma) -2)
11297 abort ();
11298 plt = htab->elf.splt;
11299 if (!htab->elf.dynamic_sections_created
11300 || stub_entry->h == NULL
11301 || stub_entry->h->elf.dynindx == -1)
11302 plt = htab->elf.iplt;
11303 off += (plt->output_offset
11304 + plt->output_section->vma
11305 - elf_gp (plt->output_section->owner)
11306 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11307
11308 size = plt_stub_size (htab, stub_entry, off);
11309 if (htab->params->plt_stub_align)
11310 size += plt_stub_pad (htab, stub_entry, off);
11311 if (info->emitrelocations)
11312 {
11313 stub_entry->group->stub_sec->reloc_count
11314 += ((PPC_HA (off) != 0)
11315 + (htab->opd_abi
11316 ? 2 + (htab->params->plt_static_chain
11317 && PPC_HA (off + 16) == PPC_HA (off))
11318 : 1));
11319 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11320 }
11321 }
11322 else
11323 {
11324 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11325 variants. */
11326 bfd_vma r2off = 0;
11327 bfd_vma local_off = 0;
11328
11329 off = (stub_entry->target_value
11330 + stub_entry->target_section->output_offset
11331 + stub_entry->target_section->output_section->vma);
11332 off -= (stub_entry->group->stub_sec->size
11333 + stub_entry->group->stub_sec->output_offset
11334 + stub_entry->group->stub_sec->output_section->vma);
11335
11336 /* Reset the stub type from the plt variant in case we now
11337 can reach with a shorter stub. */
11338 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11339 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11340
11341 size = 4;
11342 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11343 {
11344 r2off = get_r2off (info, stub_entry);
11345 if (r2off == (bfd_vma) -1)
11346 {
11347 htab->stub_error = TRUE;
11348 return FALSE;
11349 }
11350 size = 8;
11351 if (PPC_HA (r2off) != 0)
11352 size += 4;
11353 if (PPC_LO (r2off) != 0)
11354 size += 4;
11355 off -= size - 4;
11356 }
11357
11358 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11359
11360 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11361 Do the same for -R objects without function descriptors. */
11362 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11363 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11364 && r2off == 0
11365 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
11366 {
11367 struct ppc_branch_hash_entry *br_entry;
11368
11369 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11370 stub_entry->root.string + 9,
11371 TRUE, FALSE);
11372 if (br_entry == NULL)
11373 {
11374 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
11375 stub_entry->root.string);
11376 htab->stub_error = TRUE;
11377 return FALSE;
11378 }
11379
11380 if (br_entry->iter != htab->stub_iteration)
11381 {
11382 br_entry->iter = htab->stub_iteration;
11383 br_entry->offset = htab->brlt->size;
11384 htab->brlt->size += 8;
11385
11386 if (htab->relbrlt != NULL)
11387 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11388 else if (info->emitrelocations)
11389 {
11390 htab->brlt->reloc_count += 1;
11391 htab->brlt->flags |= SEC_RELOC;
11392 }
11393 }
11394
11395 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11396 off = (br_entry->offset
11397 + htab->brlt->output_offset
11398 + htab->brlt->output_section->vma
11399 - elf_gp (htab->brlt->output_section->owner)
11400 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11401
11402 if (info->emitrelocations)
11403 {
11404 stub_entry->group->stub_sec->reloc_count
11405 += 1 + (PPC_HA (off) != 0);
11406 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11407 }
11408
11409 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11410 {
11411 size = 12;
11412 if (PPC_HA (off) != 0)
11413 size = 16;
11414 }
11415 else
11416 {
11417 size = 16;
11418 if (PPC_HA (off) != 0)
11419 size += 4;
11420
11421 if (PPC_HA (r2off) != 0)
11422 size += 4;
11423 if (PPC_LO (r2off) != 0)
11424 size += 4;
11425 }
11426 }
11427 else if (info->emitrelocations)
11428 {
11429 stub_entry->group->stub_sec->reloc_count += 1;
11430 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11431 }
11432 }
11433
11434 stub_entry->group->stub_sec->size += size;
11435 return TRUE;
11436 }
11437
11438 /* Set up various things so that we can make a list of input sections
11439 for each output section included in the link. Returns -1 on error,
11440 0 when no stubs will be needed, and 1 on success. */
11441
11442 int
11443 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11444 {
11445 unsigned int id;
11446 bfd_size_type amt;
11447 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11448
11449 if (htab == NULL)
11450 return -1;
11451
11452 htab->sec_info_arr_size = bfd_get_next_section_id ();
11453 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11454 htab->sec_info = bfd_zmalloc (amt);
11455 if (htab->sec_info == NULL)
11456 return -1;
11457
11458 /* Set toc_off for com, und, abs and ind sections. */
11459 for (id = 0; id < 3; id++)
11460 htab->sec_info[id].toc_off = TOC_BASE_OFF;
11461
11462 return 1;
11463 }
11464
11465 /* Set up for first pass at multitoc partitioning. */
11466
11467 void
11468 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11469 {
11470 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11471
11472 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11473 htab->toc_bfd = NULL;
11474 htab->toc_first_sec = NULL;
11475 }
11476
11477 /* The linker repeatedly calls this function for each TOC input section
11478 and linker generated GOT section. Group input bfds such that the toc
11479 within a group is less than 64k in size. */
11480
11481 bfd_boolean
11482 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11483 {
11484 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11485 bfd_vma addr, off, limit;
11486
11487 if (htab == NULL)
11488 return FALSE;
11489
11490 if (!htab->second_toc_pass)
11491 {
11492 /* Keep track of the first .toc or .got section for this input bfd. */
11493 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11494
11495 if (new_bfd)
11496 {
11497 htab->toc_bfd = isec->owner;
11498 htab->toc_first_sec = isec;
11499 }
11500
11501 addr = isec->output_offset + isec->output_section->vma;
11502 off = addr - htab->toc_curr;
11503 limit = 0x80008000;
11504 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11505 limit = 0x10000;
11506 if (off + isec->size > limit)
11507 {
11508 addr = (htab->toc_first_sec->output_offset
11509 + htab->toc_first_sec->output_section->vma);
11510 htab->toc_curr = addr;
11511 htab->toc_curr &= -TOC_BASE_ALIGN;
11512 }
11513
11514 /* toc_curr is the base address of this toc group. Set elf_gp
11515 for the input section to be the offset relative to the
11516 output toc base plus 0x8000. Making the input elf_gp an
11517 offset allows us to move the toc as a whole without
11518 recalculating input elf_gp. */
11519 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11520 off += TOC_BASE_OFF;
11521
11522 /* Die if someone uses a linker script that doesn't keep input
11523 file .toc and .got together. */
11524 if (new_bfd
11525 && elf_gp (isec->owner) != 0
11526 && elf_gp (isec->owner) != off)
11527 return FALSE;
11528
11529 elf_gp (isec->owner) = off;
11530 return TRUE;
11531 }
11532
11533 /* During the second pass toc_first_sec points to the start of
11534 a toc group, and toc_curr is used to track the old elf_gp.
11535 We use toc_bfd to ensure we only look at each bfd once. */
11536 if (htab->toc_bfd == isec->owner)
11537 return TRUE;
11538 htab->toc_bfd = isec->owner;
11539
11540 if (htab->toc_first_sec == NULL
11541 || htab->toc_curr != elf_gp (isec->owner))
11542 {
11543 htab->toc_curr = elf_gp (isec->owner);
11544 htab->toc_first_sec = isec;
11545 }
11546 addr = (htab->toc_first_sec->output_offset
11547 + htab->toc_first_sec->output_section->vma);
11548 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11549 elf_gp (isec->owner) = off;
11550
11551 return TRUE;
11552 }
11553
11554 /* Called via elf_link_hash_traverse to merge GOT entries for global
11555 symbol H. */
11556
11557 static bfd_boolean
11558 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11559 {
11560 if (h->root.type == bfd_link_hash_indirect)
11561 return TRUE;
11562
11563 merge_got_entries (&h->got.glist);
11564
11565 return TRUE;
11566 }
11567
11568 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11569 symbol H. */
11570
11571 static bfd_boolean
11572 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11573 {
11574 struct got_entry *gent;
11575
11576 if (h->root.type == bfd_link_hash_indirect)
11577 return TRUE;
11578
11579 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11580 if (!gent->is_indirect)
11581 allocate_got (h, (struct bfd_link_info *) inf, gent);
11582 return TRUE;
11583 }
11584
11585 /* Called on the first multitoc pass after the last call to
11586 ppc64_elf_next_toc_section. This function removes duplicate GOT
11587 entries. */
11588
11589 bfd_boolean
11590 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11591 {
11592 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11593 struct bfd *ibfd, *ibfd2;
11594 bfd_boolean done_something;
11595
11596 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11597
11598 if (!htab->do_multi_toc)
11599 return FALSE;
11600
11601 /* Merge global sym got entries within a toc group. */
11602 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11603
11604 /* And tlsld_got. */
11605 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11606 {
11607 struct got_entry *ent, *ent2;
11608
11609 if (!is_ppc64_elf (ibfd))
11610 continue;
11611
11612 ent = ppc64_tlsld_got (ibfd);
11613 if (!ent->is_indirect
11614 && ent->got.offset != (bfd_vma) -1)
11615 {
11616 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
11617 {
11618 if (!is_ppc64_elf (ibfd2))
11619 continue;
11620
11621 ent2 = ppc64_tlsld_got (ibfd2);
11622 if (!ent2->is_indirect
11623 && ent2->got.offset != (bfd_vma) -1
11624 && elf_gp (ibfd2) == elf_gp (ibfd))
11625 {
11626 ent2->is_indirect = TRUE;
11627 ent2->got.ent = ent;
11628 }
11629 }
11630 }
11631 }
11632
11633 /* Zap sizes of got sections. */
11634 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11635 htab->elf.irelplt->size -= htab->got_reli_size;
11636 htab->got_reli_size = 0;
11637
11638 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11639 {
11640 asection *got, *relgot;
11641
11642 if (!is_ppc64_elf (ibfd))
11643 continue;
11644
11645 got = ppc64_elf_tdata (ibfd)->got;
11646 if (got != NULL)
11647 {
11648 got->rawsize = got->size;
11649 got->size = 0;
11650 relgot = ppc64_elf_tdata (ibfd)->relgot;
11651 relgot->rawsize = relgot->size;
11652 relgot->size = 0;
11653 }
11654 }
11655
11656 /* Now reallocate the got, local syms first. We don't need to
11657 allocate section contents again since we never increase size. */
11658 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11659 {
11660 struct got_entry **lgot_ents;
11661 struct got_entry **end_lgot_ents;
11662 struct plt_entry **local_plt;
11663 struct plt_entry **end_local_plt;
11664 unsigned char *lgot_masks;
11665 bfd_size_type locsymcount;
11666 Elf_Internal_Shdr *symtab_hdr;
11667 asection *s;
11668
11669 if (!is_ppc64_elf (ibfd))
11670 continue;
11671
11672 lgot_ents = elf_local_got_ents (ibfd);
11673 if (!lgot_ents)
11674 continue;
11675
11676 symtab_hdr = &elf_symtab_hdr (ibfd);
11677 locsymcount = symtab_hdr->sh_info;
11678 end_lgot_ents = lgot_ents + locsymcount;
11679 local_plt = (struct plt_entry **) end_lgot_ents;
11680 end_local_plt = local_plt + locsymcount;
11681 lgot_masks = (unsigned char *) end_local_plt;
11682 s = ppc64_elf_tdata (ibfd)->got;
11683 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11684 {
11685 struct got_entry *ent;
11686
11687 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11688 {
11689 unsigned int ent_size = 8;
11690 unsigned int rel_size = sizeof (Elf64_External_Rela);
11691
11692 ent->got.offset = s->size;
11693 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11694 {
11695 ent_size *= 2;
11696 rel_size *= 2;
11697 }
11698 s->size += ent_size;
11699 if ((*lgot_masks & PLT_IFUNC) != 0)
11700 {
11701 htab->elf.irelplt->size += rel_size;
11702 htab->got_reli_size += rel_size;
11703 }
11704 else if (bfd_link_pic (info))
11705 {
11706 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11707 srel->size += rel_size;
11708 }
11709 }
11710 }
11711 }
11712
11713 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11714
11715 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11716 {
11717 struct got_entry *ent;
11718
11719 if (!is_ppc64_elf (ibfd))
11720 continue;
11721
11722 ent = ppc64_tlsld_got (ibfd);
11723 if (!ent->is_indirect
11724 && ent->got.offset != (bfd_vma) -1)
11725 {
11726 asection *s = ppc64_elf_tdata (ibfd)->got;
11727 ent->got.offset = s->size;
11728 s->size += 16;
11729 if (bfd_link_pic (info))
11730 {
11731 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11732 srel->size += sizeof (Elf64_External_Rela);
11733 }
11734 }
11735 }
11736
11737 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11738 if (!done_something)
11739 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11740 {
11741 asection *got;
11742
11743 if (!is_ppc64_elf (ibfd))
11744 continue;
11745
11746 got = ppc64_elf_tdata (ibfd)->got;
11747 if (got != NULL)
11748 {
11749 done_something = got->rawsize != got->size;
11750 if (done_something)
11751 break;
11752 }
11753 }
11754
11755 if (done_something)
11756 (*htab->params->layout_sections_again) ();
11757
11758 /* Set up for second pass over toc sections to recalculate elf_gp
11759 on input sections. */
11760 htab->toc_bfd = NULL;
11761 htab->toc_first_sec = NULL;
11762 htab->second_toc_pass = TRUE;
11763 return done_something;
11764 }
11765
11766 /* Called after second pass of multitoc partitioning. */
11767
11768 void
11769 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11770 {
11771 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11772
11773 /* After the second pass, toc_curr tracks the TOC offset used
11774 for code sections below in ppc64_elf_next_input_section. */
11775 htab->toc_curr = TOC_BASE_OFF;
11776 }
11777
11778 /* No toc references were found in ISEC. If the code in ISEC makes no
11779 calls, then there's no need to use toc adjusting stubs when branching
11780 into ISEC. Actually, indirect calls from ISEC are OK as they will
11781 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11782 needed, and 2 if a cyclical call-graph was found but no other reason
11783 for a stub was detected. If called from the top level, a return of
11784 2 means the same as a return of 0. */
11785
11786 static int
11787 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11788 {
11789 int ret;
11790
11791 /* Mark this section as checked. */
11792 isec->call_check_done = 1;
11793
11794 /* We know none of our code bearing sections will need toc stubs. */
11795 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11796 return 0;
11797
11798 if (isec->size == 0)
11799 return 0;
11800
11801 if (isec->output_section == NULL)
11802 return 0;
11803
11804 ret = 0;
11805 if (isec->reloc_count != 0)
11806 {
11807 Elf_Internal_Rela *relstart, *rel;
11808 Elf_Internal_Sym *local_syms;
11809 struct ppc_link_hash_table *htab;
11810
11811 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11812 info->keep_memory);
11813 if (relstart == NULL)
11814 return -1;
11815
11816 /* Look for branches to outside of this section. */
11817 local_syms = NULL;
11818 htab = ppc_hash_table (info);
11819 if (htab == NULL)
11820 return -1;
11821
11822 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11823 {
11824 enum elf_ppc64_reloc_type r_type;
11825 unsigned long r_symndx;
11826 struct elf_link_hash_entry *h;
11827 struct ppc_link_hash_entry *eh;
11828 Elf_Internal_Sym *sym;
11829 asection *sym_sec;
11830 struct _opd_sec_data *opd;
11831 bfd_vma sym_value;
11832 bfd_vma dest;
11833
11834 r_type = ELF64_R_TYPE (rel->r_info);
11835 if (r_type != R_PPC64_REL24
11836 && r_type != R_PPC64_REL14
11837 && r_type != R_PPC64_REL14_BRTAKEN
11838 && r_type != R_PPC64_REL14_BRNTAKEN)
11839 continue;
11840
11841 r_symndx = ELF64_R_SYM (rel->r_info);
11842 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11843 isec->owner))
11844 {
11845 ret = -1;
11846 break;
11847 }
11848
11849 /* Calls to dynamic lib functions go through a plt call stub
11850 that uses r2. */
11851 eh = (struct ppc_link_hash_entry *) h;
11852 if (eh != NULL
11853 && (eh->elf.plt.plist != NULL
11854 || (eh->oh != NULL
11855 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11856 {
11857 ret = 1;
11858 break;
11859 }
11860
11861 if (sym_sec == NULL)
11862 /* Ignore other undefined symbols. */
11863 continue;
11864
11865 /* Assume branches to other sections not included in the
11866 link need stubs too, to cover -R and absolute syms. */
11867 if (sym_sec->output_section == NULL)
11868 {
11869 ret = 1;
11870 break;
11871 }
11872
11873 if (h == NULL)
11874 sym_value = sym->st_value;
11875 else
11876 {
11877 if (h->root.type != bfd_link_hash_defined
11878 && h->root.type != bfd_link_hash_defweak)
11879 abort ();
11880 sym_value = h->root.u.def.value;
11881 }
11882 sym_value += rel->r_addend;
11883
11884 /* If this branch reloc uses an opd sym, find the code section. */
11885 opd = get_opd_info (sym_sec);
11886 if (opd != NULL)
11887 {
11888 if (h == NULL && opd->adjust != NULL)
11889 {
11890 long adjust;
11891
11892 adjust = opd->adjust[OPD_NDX (sym_value)];
11893 if (adjust == -1)
11894 /* Assume deleted functions won't ever be called. */
11895 continue;
11896 sym_value += adjust;
11897 }
11898
11899 dest = opd_entry_value (sym_sec, sym_value,
11900 &sym_sec, NULL, FALSE);
11901 if (dest == (bfd_vma) -1)
11902 continue;
11903 }
11904 else
11905 dest = (sym_value
11906 + sym_sec->output_offset
11907 + sym_sec->output_section->vma);
11908
11909 /* Ignore branch to self. */
11910 if (sym_sec == isec)
11911 continue;
11912
11913 /* If the called function uses the toc, we need a stub. */
11914 if (sym_sec->has_toc_reloc
11915 || sym_sec->makes_toc_func_call)
11916 {
11917 ret = 1;
11918 break;
11919 }
11920
11921 /* Assume any branch that needs a long branch stub might in fact
11922 need a plt_branch stub. A plt_branch stub uses r2. */
11923 else if (dest - (isec->output_offset
11924 + isec->output_section->vma
11925 + rel->r_offset) + (1 << 25)
11926 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11927 ? h->other
11928 : sym->st_other))
11929 {
11930 ret = 1;
11931 break;
11932 }
11933
11934 /* If calling back to a section in the process of being
11935 tested, we can't say for sure that no toc adjusting stubs
11936 are needed, so don't return zero. */
11937 else if (sym_sec->call_check_in_progress)
11938 ret = 2;
11939
11940 /* Branches to another section that itself doesn't have any TOC
11941 references are OK. Recursively call ourselves to check. */
11942 else if (!sym_sec->call_check_done)
11943 {
11944 int recur;
11945
11946 /* Mark current section as indeterminate, so that other
11947 sections that call back to current won't be marked as
11948 known. */
11949 isec->call_check_in_progress = 1;
11950 recur = toc_adjusting_stub_needed (info, sym_sec);
11951 isec->call_check_in_progress = 0;
11952
11953 if (recur != 0)
11954 {
11955 ret = recur;
11956 if (recur != 2)
11957 break;
11958 }
11959 }
11960 }
11961
11962 if (local_syms != NULL
11963 && (elf_symtab_hdr (isec->owner).contents
11964 != (unsigned char *) local_syms))
11965 free (local_syms);
11966 if (elf_section_data (isec)->relocs != relstart)
11967 free (relstart);
11968 }
11969
11970 if ((ret & 1) == 0
11971 && isec->map_head.s != NULL
11972 && (strcmp (isec->output_section->name, ".init") == 0
11973 || strcmp (isec->output_section->name, ".fini") == 0))
11974 {
11975 if (isec->map_head.s->has_toc_reloc
11976 || isec->map_head.s->makes_toc_func_call)
11977 ret = 1;
11978 else if (!isec->map_head.s->call_check_done)
11979 {
11980 int recur;
11981 isec->call_check_in_progress = 1;
11982 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11983 isec->call_check_in_progress = 0;
11984 if (recur != 0)
11985 ret = recur;
11986 }
11987 }
11988
11989 if (ret == 1)
11990 isec->makes_toc_func_call = 1;
11991
11992 return ret;
11993 }
11994
11995 /* The linker repeatedly calls this function for each input section,
11996 in the order that input sections are linked into output sections.
11997 Build lists of input sections to determine groupings between which
11998 we may insert linker stubs. */
11999
12000 bfd_boolean
12001 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
12002 {
12003 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12004
12005 if (htab == NULL)
12006 return FALSE;
12007
12008 if ((isec->output_section->flags & SEC_CODE) != 0
12009 && isec->output_section->id < htab->sec_info_arr_size)
12010 {
12011 /* This happens to make the list in reverse order,
12012 which is what we want. */
12013 htab->sec_info[isec->id].u.list
12014 = htab->sec_info[isec->output_section->id].u.list;
12015 htab->sec_info[isec->output_section->id].u.list = isec;
12016 }
12017
12018 if (htab->multi_toc_needed)
12019 {
12020 /* Analyse sections that aren't already flagged as needing a
12021 valid toc pointer. Exclude .fixup for the linux kernel.
12022 .fixup contains branches, but only back to the function that
12023 hit an exception. */
12024 if (!(isec->has_toc_reloc
12025 || (isec->flags & SEC_CODE) == 0
12026 || strcmp (isec->name, ".fixup") == 0
12027 || isec->call_check_done))
12028 {
12029 if (toc_adjusting_stub_needed (info, isec) < 0)
12030 return FALSE;
12031 }
12032 /* Make all sections use the TOC assigned for this object file.
12033 This will be wrong for pasted sections; We fix that in
12034 check_pasted_section(). */
12035 if (elf_gp (isec->owner) != 0)
12036 htab->toc_curr = elf_gp (isec->owner);
12037 }
12038
12039 htab->sec_info[isec->id].toc_off = htab->toc_curr;
12040 return TRUE;
12041 }
12042
12043 /* Check that all .init and .fini sections use the same toc, if they
12044 have toc relocs. */
12045
12046 static bfd_boolean
12047 check_pasted_section (struct bfd_link_info *info, const char *name)
12048 {
12049 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12050
12051 if (o != NULL)
12052 {
12053 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12054 bfd_vma toc_off = 0;
12055 asection *i;
12056
12057 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12058 if (i->has_toc_reloc)
12059 {
12060 if (toc_off == 0)
12061 toc_off = htab->sec_info[i->id].toc_off;
12062 else if (toc_off != htab->sec_info[i->id].toc_off)
12063 return FALSE;
12064 }
12065
12066 if (toc_off == 0)
12067 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12068 if (i->makes_toc_func_call)
12069 {
12070 toc_off = htab->sec_info[i->id].toc_off;
12071 break;
12072 }
12073
12074 /* Make sure the whole pasted function uses the same toc offset. */
12075 if (toc_off != 0)
12076 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12077 htab->sec_info[i->id].toc_off = toc_off;
12078 }
12079 return TRUE;
12080 }
12081
12082 bfd_boolean
12083 ppc64_elf_check_init_fini (struct bfd_link_info *info)
12084 {
12085 return (check_pasted_section (info, ".init")
12086 & check_pasted_section (info, ".fini"));
12087 }
12088
12089 /* See whether we can group stub sections together. Grouping stub
12090 sections may result in fewer stubs. More importantly, we need to
12091 put all .init* and .fini* stubs at the beginning of the .init or
12092 .fini output sections respectively, because glibc splits the
12093 _init and _fini functions into multiple parts. Putting a stub in
12094 the middle of a function is not a good idea. */
12095
12096 static bfd_boolean
12097 group_sections (struct bfd_link_info *info,
12098 bfd_size_type stub_group_size,
12099 bfd_boolean stubs_always_before_branch)
12100 {
12101 struct ppc_link_hash_table *htab;
12102 asection *osec;
12103 bfd_boolean suppress_size_errors;
12104
12105 htab = ppc_hash_table (info);
12106 if (htab == NULL)
12107 return FALSE;
12108
12109 suppress_size_errors = FALSE;
12110 if (stub_group_size == 1)
12111 {
12112 /* Default values. */
12113 if (stubs_always_before_branch)
12114 stub_group_size = 0x1e00000;
12115 else
12116 stub_group_size = 0x1c00000;
12117 suppress_size_errors = TRUE;
12118 }
12119
12120 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
12121 {
12122 asection *tail;
12123
12124 if (osec->id >= htab->sec_info_arr_size)
12125 continue;
12126
12127 tail = htab->sec_info[osec->id].u.list;
12128 while (tail != NULL)
12129 {
12130 asection *curr;
12131 asection *prev;
12132 bfd_size_type total;
12133 bfd_boolean big_sec;
12134 bfd_vma curr_toc;
12135 struct map_stub *group;
12136 bfd_size_type group_size;
12137
12138 curr = tail;
12139 total = tail->size;
12140 group_size = (ppc64_elf_section_data (tail) != NULL
12141 && ppc64_elf_section_data (tail)->has_14bit_branch
12142 ? stub_group_size >> 10 : stub_group_size);
12143
12144 big_sec = total > group_size;
12145 if (big_sec && !suppress_size_errors)
12146 /* xgettext:c-format */
12147 _bfd_error_handler (_("%B section %A exceeds stub group size"),
12148 tail->owner, tail);
12149 curr_toc = htab->sec_info[tail->id].toc_off;
12150
12151 while ((prev = htab->sec_info[curr->id].u.list) != NULL
12152 && ((total += curr->output_offset - prev->output_offset)
12153 < (ppc64_elf_section_data (prev) != NULL
12154 && ppc64_elf_section_data (prev)->has_14bit_branch
12155 ? (group_size = stub_group_size >> 10) : group_size))
12156 && htab->sec_info[prev->id].toc_off == curr_toc)
12157 curr = prev;
12158
12159 /* OK, the size from the start of CURR to the end is less
12160 than group_size and thus can be handled by one stub
12161 section. (or the tail section is itself larger than
12162 group_size, in which case we may be toast.) We should
12163 really be keeping track of the total size of stubs added
12164 here, as stubs contribute to the final output section
12165 size. That's a little tricky, and this way will only
12166 break if stubs added make the total size more than 2^25,
12167 ie. for the default stub_group_size, if stubs total more
12168 than 2097152 bytes, or nearly 75000 plt call stubs. */
12169 group = bfd_alloc (curr->owner, sizeof (*group));
12170 if (group == NULL)
12171 return FALSE;
12172 group->link_sec = curr;
12173 group->stub_sec = NULL;
12174 group->needs_save_res = 0;
12175 group->next = htab->group;
12176 htab->group = group;
12177 do
12178 {
12179 prev = htab->sec_info[tail->id].u.list;
12180 /* Set up this stub group. */
12181 htab->sec_info[tail->id].u.group = group;
12182 }
12183 while (tail != curr && (tail = prev) != NULL);
12184
12185 /* But wait, there's more! Input sections up to group_size
12186 bytes before the stub section can be handled by it too.
12187 Don't do this if we have a really large section after the
12188 stubs, as adding more stubs increases the chance that
12189 branches may not reach into the stub section. */
12190 if (!stubs_always_before_branch && !big_sec)
12191 {
12192 total = 0;
12193 while (prev != NULL
12194 && ((total += tail->output_offset - prev->output_offset)
12195 < (ppc64_elf_section_data (prev) != NULL
12196 && ppc64_elf_section_data (prev)->has_14bit_branch
12197 ? (group_size = stub_group_size >> 10) : group_size))
12198 && htab->sec_info[prev->id].toc_off == curr_toc)
12199 {
12200 tail = prev;
12201 prev = htab->sec_info[tail->id].u.list;
12202 htab->sec_info[tail->id].u.group = group;
12203 }
12204 }
12205 tail = prev;
12206 }
12207 }
12208 return TRUE;
12209 }
12210
12211 static const unsigned char glink_eh_frame_cie[] =
12212 {
12213 0, 0, 0, 16, /* length. */
12214 0, 0, 0, 0, /* id. */
12215 1, /* CIE version. */
12216 'z', 'R', 0, /* Augmentation string. */
12217 4, /* Code alignment. */
12218 0x78, /* Data alignment. */
12219 65, /* RA reg. */
12220 1, /* Augmentation size. */
12221 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
12222 DW_CFA_def_cfa, 1, 0, /* def_cfa: r1 offset 0. */
12223 0, 0, 0, 0
12224 };
12225
12226 /* Stripping output sections is normally done before dynamic section
12227 symbols have been allocated. This function is called later, and
12228 handles cases like htab->brlt which is mapped to its own output
12229 section. */
12230
12231 static void
12232 maybe_strip_output (struct bfd_link_info *info, asection *isec)
12233 {
12234 if (isec->size == 0
12235 && isec->output_section->size == 0
12236 && !(isec->output_section->flags & SEC_KEEP)
12237 && !bfd_section_removed_from_list (info->output_bfd,
12238 isec->output_section)
12239 && elf_section_data (isec->output_section)->dynindx == 0)
12240 {
12241 isec->output_section->flags |= SEC_EXCLUDE;
12242 bfd_section_list_remove (info->output_bfd, isec->output_section);
12243 info->output_bfd->section_count--;
12244 }
12245 }
12246
12247 /* Determine and set the size of the stub section for a final link.
12248
12249 The basic idea here is to examine all the relocations looking for
12250 PC-relative calls to a target that is unreachable with a "bl"
12251 instruction. */
12252
12253 bfd_boolean
12254 ppc64_elf_size_stubs (struct bfd_link_info *info)
12255 {
12256 bfd_size_type stub_group_size;
12257 bfd_boolean stubs_always_before_branch;
12258 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12259
12260 if (htab == NULL)
12261 return FALSE;
12262
12263 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
12264 htab->params->plt_thread_safe = 1;
12265 if (!htab->opd_abi)
12266 htab->params->plt_thread_safe = 0;
12267 else if (htab->params->plt_thread_safe == -1)
12268 {
12269 static const char *const thread_starter[] =
12270 {
12271 "pthread_create",
12272 /* libstdc++ */
12273 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12274 /* librt */
12275 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12276 "mq_notify", "create_timer",
12277 /* libanl */
12278 "getaddrinfo_a",
12279 /* libgomp */
12280 "GOMP_parallel",
12281 "GOMP_parallel_start",
12282 "GOMP_parallel_loop_static",
12283 "GOMP_parallel_loop_static_start",
12284 "GOMP_parallel_loop_dynamic",
12285 "GOMP_parallel_loop_dynamic_start",
12286 "GOMP_parallel_loop_guided",
12287 "GOMP_parallel_loop_guided_start",
12288 "GOMP_parallel_loop_runtime",
12289 "GOMP_parallel_loop_runtime_start",
12290 "GOMP_parallel_sections",
12291 "GOMP_parallel_sections_start",
12292 /* libgo */
12293 "__go_go",
12294 };
12295 unsigned i;
12296
12297 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
12298 {
12299 struct elf_link_hash_entry *h;
12300 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12301 FALSE, FALSE, TRUE);
12302 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12303 if (htab->params->plt_thread_safe)
12304 break;
12305 }
12306 }
12307 stubs_always_before_branch = htab->params->group_size < 0;
12308 if (htab->params->group_size < 0)
12309 stub_group_size = -htab->params->group_size;
12310 else
12311 stub_group_size = htab->params->group_size;
12312
12313 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12314 return FALSE;
12315
12316 #define STUB_SHRINK_ITER 20
12317 /* Loop until no stubs added. After iteration 20 of this loop we may
12318 exit on a stub section shrinking. This is to break out of a
12319 pathological case where adding stubs on one iteration decreases
12320 section gaps (perhaps due to alignment), which then requires
12321 fewer or smaller stubs on the next iteration. */
12322
12323 while (1)
12324 {
12325 bfd *input_bfd;
12326 unsigned int bfd_indx;
12327 struct map_stub *group;
12328 asection *stub_sec;
12329
12330 htab->stub_iteration += 1;
12331
12332 for (input_bfd = info->input_bfds, bfd_indx = 0;
12333 input_bfd != NULL;
12334 input_bfd = input_bfd->link.next, bfd_indx++)
12335 {
12336 Elf_Internal_Shdr *symtab_hdr;
12337 asection *section;
12338 Elf_Internal_Sym *local_syms = NULL;
12339
12340 if (!is_ppc64_elf (input_bfd))
12341 continue;
12342
12343 /* We'll need the symbol table in a second. */
12344 symtab_hdr = &elf_symtab_hdr (input_bfd);
12345 if (symtab_hdr->sh_info == 0)
12346 continue;
12347
12348 /* Walk over each section attached to the input bfd. */
12349 for (section = input_bfd->sections;
12350 section != NULL;
12351 section = section->next)
12352 {
12353 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
12354
12355 /* If there aren't any relocs, then there's nothing more
12356 to do. */
12357 if ((section->flags & SEC_RELOC) == 0
12358 || (section->flags & SEC_ALLOC) == 0
12359 || (section->flags & SEC_LOAD) == 0
12360 || (section->flags & SEC_CODE) == 0
12361 || section->reloc_count == 0)
12362 continue;
12363
12364 /* If this section is a link-once section that will be
12365 discarded, then don't create any stubs. */
12366 if (section->output_section == NULL
12367 || section->output_section->owner != info->output_bfd)
12368 continue;
12369
12370 /* Get the relocs. */
12371 internal_relocs
12372 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
12373 info->keep_memory);
12374 if (internal_relocs == NULL)
12375 goto error_ret_free_local;
12376
12377 /* Now examine each relocation. */
12378 irela = internal_relocs;
12379 irelaend = irela + section->reloc_count;
12380 for (; irela < irelaend; irela++)
12381 {
12382 enum elf_ppc64_reloc_type r_type;
12383 unsigned int r_indx;
12384 enum ppc_stub_type stub_type;
12385 struct ppc_stub_hash_entry *stub_entry;
12386 asection *sym_sec, *code_sec;
12387 bfd_vma sym_value, code_value;
12388 bfd_vma destination;
12389 unsigned long local_off;
12390 bfd_boolean ok_dest;
12391 struct ppc_link_hash_entry *hash;
12392 struct ppc_link_hash_entry *fdh;
12393 struct elf_link_hash_entry *h;
12394 Elf_Internal_Sym *sym;
12395 char *stub_name;
12396 const asection *id_sec;
12397 struct _opd_sec_data *opd;
12398 struct plt_entry *plt_ent;
12399
12400 r_type = ELF64_R_TYPE (irela->r_info);
12401 r_indx = ELF64_R_SYM (irela->r_info);
12402
12403 if (r_type >= R_PPC64_max)
12404 {
12405 bfd_set_error (bfd_error_bad_value);
12406 goto error_ret_free_internal;
12407 }
12408
12409 /* Only look for stubs on branch instructions. */
12410 if (r_type != R_PPC64_REL24
12411 && r_type != R_PPC64_REL14
12412 && r_type != R_PPC64_REL14_BRTAKEN
12413 && r_type != R_PPC64_REL14_BRNTAKEN)
12414 continue;
12415
12416 /* Now determine the call target, its name, value,
12417 section. */
12418 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12419 r_indx, input_bfd))
12420 goto error_ret_free_internal;
12421 hash = (struct ppc_link_hash_entry *) h;
12422
12423 ok_dest = FALSE;
12424 fdh = NULL;
12425 sym_value = 0;
12426 if (hash == NULL)
12427 {
12428 sym_value = sym->st_value;
12429 if (sym_sec != NULL
12430 && sym_sec->output_section != NULL)
12431 ok_dest = TRUE;
12432 }
12433 else if (hash->elf.root.type == bfd_link_hash_defined
12434 || hash->elf.root.type == bfd_link_hash_defweak)
12435 {
12436 sym_value = hash->elf.root.u.def.value;
12437 if (sym_sec->output_section != NULL)
12438 ok_dest = TRUE;
12439 }
12440 else if (hash->elf.root.type == bfd_link_hash_undefweak
12441 || hash->elf.root.type == bfd_link_hash_undefined)
12442 {
12443 /* Recognise an old ABI func code entry sym, and
12444 use the func descriptor sym instead if it is
12445 defined. */
12446 if (hash->elf.root.root.string[0] == '.'
12447 && hash->oh != NULL)
12448 {
12449 fdh = ppc_follow_link (hash->oh);
12450 if (fdh->elf.root.type == bfd_link_hash_defined
12451 || fdh->elf.root.type == bfd_link_hash_defweak)
12452 {
12453 sym_sec = fdh->elf.root.u.def.section;
12454 sym_value = fdh->elf.root.u.def.value;
12455 if (sym_sec->output_section != NULL)
12456 ok_dest = TRUE;
12457 }
12458 else
12459 fdh = NULL;
12460 }
12461 }
12462 else
12463 {
12464 bfd_set_error (bfd_error_bad_value);
12465 goto error_ret_free_internal;
12466 }
12467
12468 destination = 0;
12469 local_off = 0;
12470 if (ok_dest)
12471 {
12472 sym_value += irela->r_addend;
12473 destination = (sym_value
12474 + sym_sec->output_offset
12475 + sym_sec->output_section->vma);
12476 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12477 ? hash->elf.other
12478 : sym->st_other);
12479 }
12480
12481 code_sec = sym_sec;
12482 code_value = sym_value;
12483 opd = get_opd_info (sym_sec);
12484 if (opd != NULL)
12485 {
12486 bfd_vma dest;
12487
12488 if (hash == NULL && opd->adjust != NULL)
12489 {
12490 long adjust = opd->adjust[OPD_NDX (sym_value)];
12491 if (adjust == -1)
12492 continue;
12493 code_value += adjust;
12494 sym_value += adjust;
12495 }
12496 dest = opd_entry_value (sym_sec, sym_value,
12497 &code_sec, &code_value, FALSE);
12498 if (dest != (bfd_vma) -1)
12499 {
12500 destination = dest;
12501 if (fdh != NULL)
12502 {
12503 /* Fixup old ABI sym to point at code
12504 entry. */
12505 hash->elf.root.type = bfd_link_hash_defweak;
12506 hash->elf.root.u.def.section = code_sec;
12507 hash->elf.root.u.def.value = code_value;
12508 }
12509 }
12510 }
12511
12512 /* Determine what (if any) linker stub is needed. */
12513 plt_ent = NULL;
12514 stub_type = ppc_type_of_stub (section, irela, &hash,
12515 &plt_ent, destination,
12516 local_off);
12517
12518 if (stub_type != ppc_stub_plt_call)
12519 {
12520 /* Check whether we need a TOC adjusting stub.
12521 Since the linker pastes together pieces from
12522 different object files when creating the
12523 _init and _fini functions, it may be that a
12524 call to what looks like a local sym is in
12525 fact a call needing a TOC adjustment. */
12526 if (code_sec != NULL
12527 && code_sec->output_section != NULL
12528 && (htab->sec_info[code_sec->id].toc_off
12529 != htab->sec_info[section->id].toc_off)
12530 && (code_sec->has_toc_reloc
12531 || code_sec->makes_toc_func_call))
12532 stub_type = ppc_stub_long_branch_r2off;
12533 }
12534
12535 if (stub_type == ppc_stub_none)
12536 continue;
12537
12538 /* __tls_get_addr calls might be eliminated. */
12539 if (stub_type != ppc_stub_plt_call
12540 && hash != NULL
12541 && (hash == htab->tls_get_addr
12542 || hash == htab->tls_get_addr_fd)
12543 && section->has_tls_reloc
12544 && irela != internal_relocs)
12545 {
12546 /* Get tls info. */
12547 unsigned char *tls_mask;
12548
12549 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12550 irela - 1, input_bfd))
12551 goto error_ret_free_internal;
12552 if (*tls_mask != 0)
12553 continue;
12554 }
12555
12556 if (stub_type == ppc_stub_plt_call
12557 && irela + 1 < irelaend
12558 && irela[1].r_offset == irela->r_offset + 4
12559 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12560 {
12561 if (!tocsave_find (htab, INSERT,
12562 &local_syms, irela + 1, input_bfd))
12563 goto error_ret_free_internal;
12564 }
12565 else if (stub_type == ppc_stub_plt_call)
12566 stub_type = ppc_stub_plt_call_r2save;
12567
12568 /* Support for grouping stub sections. */
12569 id_sec = htab->sec_info[section->id].u.group->link_sec;
12570
12571 /* Get the name of this stub. */
12572 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12573 if (!stub_name)
12574 goto error_ret_free_internal;
12575
12576 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12577 stub_name, FALSE, FALSE);
12578 if (stub_entry != NULL)
12579 {
12580 /* The proper stub has already been created. */
12581 free (stub_name);
12582 if (stub_type == ppc_stub_plt_call_r2save)
12583 stub_entry->stub_type = stub_type;
12584 continue;
12585 }
12586
12587 stub_entry = ppc_add_stub (stub_name, section, info);
12588 if (stub_entry == NULL)
12589 {
12590 free (stub_name);
12591 error_ret_free_internal:
12592 if (elf_section_data (section)->relocs == NULL)
12593 free (internal_relocs);
12594 error_ret_free_local:
12595 if (local_syms != NULL
12596 && (symtab_hdr->contents
12597 != (unsigned char *) local_syms))
12598 free (local_syms);
12599 return FALSE;
12600 }
12601
12602 stub_entry->stub_type = stub_type;
12603 if (stub_type != ppc_stub_plt_call
12604 && stub_type != ppc_stub_plt_call_r2save)
12605 {
12606 stub_entry->target_value = code_value;
12607 stub_entry->target_section = code_sec;
12608 }
12609 else
12610 {
12611 stub_entry->target_value = sym_value;
12612 stub_entry->target_section = sym_sec;
12613 }
12614 stub_entry->h = hash;
12615 stub_entry->plt_ent = plt_ent;
12616 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12617
12618 if (stub_entry->h != NULL)
12619 htab->stub_globals += 1;
12620 }
12621
12622 /* We're done with the internal relocs, free them. */
12623 if (elf_section_data (section)->relocs != internal_relocs)
12624 free (internal_relocs);
12625 }
12626
12627 if (local_syms != NULL
12628 && symtab_hdr->contents != (unsigned char *) local_syms)
12629 {
12630 if (!info->keep_memory)
12631 free (local_syms);
12632 else
12633 symtab_hdr->contents = (unsigned char *) local_syms;
12634 }
12635 }
12636
12637 /* We may have added some stubs. Find out the new size of the
12638 stub sections. */
12639 for (stub_sec = htab->params->stub_bfd->sections;
12640 stub_sec != NULL;
12641 stub_sec = stub_sec->next)
12642 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12643 {
12644 if (htab->stub_iteration <= STUB_SHRINK_ITER
12645 || stub_sec->rawsize < stub_sec->size)
12646 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12647 stub_sec->rawsize = stub_sec->size;
12648 stub_sec->size = 0;
12649 stub_sec->reloc_count = 0;
12650 stub_sec->flags &= ~SEC_RELOC;
12651 }
12652
12653 htab->brlt->size = 0;
12654 htab->brlt->reloc_count = 0;
12655 htab->brlt->flags &= ~SEC_RELOC;
12656 if (htab->relbrlt != NULL)
12657 htab->relbrlt->size = 0;
12658
12659 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12660
12661 for (group = htab->group; group != NULL; group = group->next)
12662 if (group->needs_save_res)
12663 group->stub_sec->size += htab->sfpr->size;
12664
12665 if (info->emitrelocations
12666 && htab->glink != NULL && htab->glink->size != 0)
12667 {
12668 htab->glink->reloc_count = 1;
12669 htab->glink->flags |= SEC_RELOC;
12670 }
12671
12672 if (htab->glink_eh_frame != NULL
12673 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12674 && htab->glink_eh_frame->output_section->size != 0)
12675 {
12676 size_t size = 0, align;
12677
12678 for (stub_sec = htab->params->stub_bfd->sections;
12679 stub_sec != NULL;
12680 stub_sec = stub_sec->next)
12681 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12682 size += 24;
12683 if (htab->glink != NULL && htab->glink->size != 0)
12684 size += 24;
12685 if (size != 0)
12686 size += sizeof (glink_eh_frame_cie);
12687 align = 1;
12688 align <<= htab->glink_eh_frame->output_section->alignment_power;
12689 align -= 1;
12690 size = (size + align) & ~align;
12691 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12692 htab->glink_eh_frame->size = size;
12693 }
12694
12695 if (htab->params->plt_stub_align != 0)
12696 for (stub_sec = htab->params->stub_bfd->sections;
12697 stub_sec != NULL;
12698 stub_sec = stub_sec->next)
12699 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12700 stub_sec->size = ((stub_sec->size
12701 + (1 << htab->params->plt_stub_align) - 1)
12702 & -(1 << htab->params->plt_stub_align));
12703
12704 for (stub_sec = htab->params->stub_bfd->sections;
12705 stub_sec != NULL;
12706 stub_sec = stub_sec->next)
12707 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12708 && stub_sec->rawsize != stub_sec->size
12709 && (htab->stub_iteration <= STUB_SHRINK_ITER
12710 || stub_sec->rawsize < stub_sec->size))
12711 break;
12712
12713 if (stub_sec == NULL
12714 && (htab->glink_eh_frame == NULL
12715 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12716 break;
12717
12718 /* Ask the linker to do its stuff. */
12719 (*htab->params->layout_sections_again) ();
12720 }
12721
12722 if (htab->glink_eh_frame != NULL
12723 && htab->glink_eh_frame->size != 0)
12724 {
12725 bfd_vma val;
12726 bfd_byte *p, *last_fde;
12727 size_t last_fde_len, size, align, pad;
12728 asection *stub_sec;
12729
12730 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12731 if (p == NULL)
12732 return FALSE;
12733 htab->glink_eh_frame->contents = p;
12734 last_fde = p;
12735
12736 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12737 /* CIE length (rewrite in case little-endian). */
12738 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12739 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12740 p += sizeof (glink_eh_frame_cie);
12741
12742 for (stub_sec = htab->params->stub_bfd->sections;
12743 stub_sec != NULL;
12744 stub_sec = stub_sec->next)
12745 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12746 {
12747 last_fde = p;
12748 last_fde_len = 20;
12749 /* FDE length. */
12750 bfd_put_32 (htab->elf.dynobj, 20, p);
12751 p += 4;
12752 /* CIE pointer. */
12753 val = p - htab->glink_eh_frame->contents;
12754 bfd_put_32 (htab->elf.dynobj, val, p);
12755 p += 4;
12756 /* Offset to stub section, written later. */
12757 p += 4;
12758 /* stub section size. */
12759 bfd_put_32 (htab->elf.dynobj, stub_sec->size, p);
12760 p += 4;
12761 /* Augmentation. */
12762 p += 1;
12763 /* Pad. */
12764 p += 7;
12765 }
12766 if (htab->glink != NULL && htab->glink->size != 0)
12767 {
12768 last_fde = p;
12769 last_fde_len = 20;
12770 /* FDE length. */
12771 bfd_put_32 (htab->elf.dynobj, 20, p);
12772 p += 4;
12773 /* CIE pointer. */
12774 val = p - htab->glink_eh_frame->contents;
12775 bfd_put_32 (htab->elf.dynobj, val, p);
12776 p += 4;
12777 /* Offset to .glink, written later. */
12778 p += 4;
12779 /* .glink size. */
12780 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12781 p += 4;
12782 /* Augmentation. */
12783 p += 1;
12784
12785 *p++ = DW_CFA_advance_loc + 1;
12786 *p++ = DW_CFA_register;
12787 *p++ = 65;
12788 *p++ = htab->opd_abi ? 12 : 0;
12789 *p++ = DW_CFA_advance_loc + 4;
12790 *p++ = DW_CFA_restore_extended;
12791 *p++ = 65;
12792 }
12793 /* Subsume any padding into the last FDE if user .eh_frame
12794 sections are aligned more than glink_eh_frame. Otherwise any
12795 zero padding will be seen as a terminator. */
12796 size = p - htab->glink_eh_frame->contents;
12797 align = 1;
12798 align <<= htab->glink_eh_frame->output_section->alignment_power;
12799 align -= 1;
12800 pad = ((size + align) & ~align) - size;
12801 htab->glink_eh_frame->size = size + pad;
12802 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12803 }
12804
12805 maybe_strip_output (info, htab->brlt);
12806 if (htab->glink_eh_frame != NULL)
12807 maybe_strip_output (info, htab->glink_eh_frame);
12808
12809 return TRUE;
12810 }
12811
12812 /* Called after we have determined section placement. If sections
12813 move, we'll be called again. Provide a value for TOCstart. */
12814
12815 bfd_vma
12816 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12817 {
12818 asection *s;
12819 bfd_vma TOCstart, adjust;
12820
12821 if (info != NULL)
12822 {
12823 struct elf_link_hash_entry *h;
12824 struct elf_link_hash_table *htab = elf_hash_table (info);
12825
12826 if (is_elf_hash_table (htab)
12827 && htab->hgot != NULL)
12828 h = htab->hgot;
12829 else
12830 {
12831 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
12832 if (is_elf_hash_table (htab))
12833 htab->hgot = h;
12834 }
12835 if (h != NULL
12836 && h->root.type == bfd_link_hash_defined
12837 && !h->root.linker_def
12838 && (!is_elf_hash_table (htab)
12839 || h->def_regular))
12840 {
12841 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
12842 + h->root.u.def.section->output_offset
12843 + h->root.u.def.section->output_section->vma);
12844 _bfd_set_gp_value (obfd, TOCstart);
12845 return TOCstart;
12846 }
12847 }
12848
12849 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12850 order. The TOC starts where the first of these sections starts. */
12851 s = bfd_get_section_by_name (obfd, ".got");
12852 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12853 s = bfd_get_section_by_name (obfd, ".toc");
12854 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12855 s = bfd_get_section_by_name (obfd, ".tocbss");
12856 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12857 s = bfd_get_section_by_name (obfd, ".plt");
12858 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12859 {
12860 /* This may happen for
12861 o references to TOC base (SYM@toc / TOC[tc0]) without a
12862 .toc directive
12863 o bad linker script
12864 o --gc-sections and empty TOC sections
12865
12866 FIXME: Warn user? */
12867
12868 /* Look for a likely section. We probably won't even be
12869 using TOCstart. */
12870 for (s = obfd->sections; s != NULL; s = s->next)
12871 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12872 | SEC_EXCLUDE))
12873 == (SEC_ALLOC | SEC_SMALL_DATA))
12874 break;
12875 if (s == NULL)
12876 for (s = obfd->sections; s != NULL; s = s->next)
12877 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12878 == (SEC_ALLOC | SEC_SMALL_DATA))
12879 break;
12880 if (s == NULL)
12881 for (s = obfd->sections; s != NULL; s = s->next)
12882 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12883 == SEC_ALLOC)
12884 break;
12885 if (s == NULL)
12886 for (s = obfd->sections; s != NULL; s = s->next)
12887 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12888 break;
12889 }
12890
12891 TOCstart = 0;
12892 if (s != NULL)
12893 TOCstart = s->output_section->vma + s->output_offset;
12894
12895 /* Force alignment. */
12896 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
12897 TOCstart -= adjust;
12898 _bfd_set_gp_value (obfd, TOCstart);
12899
12900 if (info != NULL && s != NULL)
12901 {
12902 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12903
12904 if (htab != NULL)
12905 {
12906 if (htab->elf.hgot != NULL)
12907 {
12908 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
12909 htab->elf.hgot->root.u.def.section = s;
12910 }
12911 }
12912 else
12913 {
12914 struct bfd_link_hash_entry *bh = NULL;
12915 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
12916 s, TOC_BASE_OFF - adjust,
12917 NULL, FALSE, FALSE, &bh);
12918 }
12919 }
12920 return TOCstart;
12921 }
12922
12923 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12924 write out any global entry stubs. */
12925
12926 static bfd_boolean
12927 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12928 {
12929 struct bfd_link_info *info;
12930 struct ppc_link_hash_table *htab;
12931 struct plt_entry *pent;
12932 asection *s;
12933
12934 if (h->root.type == bfd_link_hash_indirect)
12935 return TRUE;
12936
12937 if (!h->pointer_equality_needed)
12938 return TRUE;
12939
12940 if (h->def_regular)
12941 return TRUE;
12942
12943 info = inf;
12944 htab = ppc_hash_table (info);
12945 if (htab == NULL)
12946 return FALSE;
12947
12948 s = htab->glink;
12949 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12950 if (pent->plt.offset != (bfd_vma) -1
12951 && pent->addend == 0)
12952 {
12953 bfd_byte *p;
12954 asection *plt;
12955 bfd_vma off;
12956
12957 p = s->contents + h->root.u.def.value;
12958 plt = htab->elf.splt;
12959 if (!htab->elf.dynamic_sections_created
12960 || h->dynindx == -1)
12961 plt = htab->elf.iplt;
12962 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12963 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12964
12965 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12966 {
12967 info->callbacks->einfo
12968 (_("%P: linkage table error against `%T'\n"),
12969 h->root.root.string);
12970 bfd_set_error (bfd_error_bad_value);
12971 htab->stub_error = TRUE;
12972 }
12973
12974 htab->stub_count[ppc_stub_global_entry - 1] += 1;
12975 if (htab->params->emit_stub_syms)
12976 {
12977 size_t len = strlen (h->root.root.string);
12978 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
12979
12980 if (name == NULL)
12981 return FALSE;
12982
12983 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
12984 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
12985 if (h == NULL)
12986 return FALSE;
12987 if (h->root.type == bfd_link_hash_new)
12988 {
12989 h->root.type = bfd_link_hash_defined;
12990 h->root.u.def.section = s;
12991 h->root.u.def.value = p - s->contents;
12992 h->ref_regular = 1;
12993 h->def_regular = 1;
12994 h->ref_regular_nonweak = 1;
12995 h->forced_local = 1;
12996 h->non_elf = 0;
12997 h->root.linker_def = 1;
12998 }
12999 }
13000
13001 if (PPC_HA (off) != 0)
13002 {
13003 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13004 p += 4;
13005 }
13006 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13007 p += 4;
13008 bfd_put_32 (s->owner, MTCTR_R12, p);
13009 p += 4;
13010 bfd_put_32 (s->owner, BCTR, p);
13011 break;
13012 }
13013 return TRUE;
13014 }
13015
13016 /* Build all the stubs associated with the current output file.
13017 The stubs are kept in a hash table attached to the main linker
13018 hash table. This function is called via gldelf64ppc_finish. */
13019
13020 bfd_boolean
13021 ppc64_elf_build_stubs (struct bfd_link_info *info,
13022 char **stats)
13023 {
13024 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13025 struct map_stub *group;
13026 asection *stub_sec;
13027 bfd_byte *p;
13028 int stub_sec_count = 0;
13029
13030 if (htab == NULL)
13031 return FALSE;
13032
13033 /* Allocate memory to hold the linker stubs. */
13034 for (stub_sec = htab->params->stub_bfd->sections;
13035 stub_sec != NULL;
13036 stub_sec = stub_sec->next)
13037 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
13038 && stub_sec->size != 0)
13039 {
13040 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
13041 if (stub_sec->contents == NULL)
13042 return FALSE;
13043 stub_sec->size = 0;
13044 }
13045
13046 if (htab->glink != NULL && htab->glink->size != 0)
13047 {
13048 unsigned int indx;
13049 bfd_vma plt0;
13050
13051 /* Build the .glink plt call stub. */
13052 if (htab->params->emit_stub_syms)
13053 {
13054 struct elf_link_hash_entry *h;
13055 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13056 TRUE, FALSE, FALSE);
13057 if (h == NULL)
13058 return FALSE;
13059 if (h->root.type == bfd_link_hash_new)
13060 {
13061 h->root.type = bfd_link_hash_defined;
13062 h->root.u.def.section = htab->glink;
13063 h->root.u.def.value = 8;
13064 h->ref_regular = 1;
13065 h->def_regular = 1;
13066 h->ref_regular_nonweak = 1;
13067 h->forced_local = 1;
13068 h->non_elf = 0;
13069 h->root.linker_def = 1;
13070 }
13071 }
13072 plt0 = (htab->elf.splt->output_section->vma
13073 + htab->elf.splt->output_offset
13074 - 16);
13075 if (info->emitrelocations)
13076 {
13077 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13078 if (r == NULL)
13079 return FALSE;
13080 r->r_offset = (htab->glink->output_offset
13081 + htab->glink->output_section->vma);
13082 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13083 r->r_addend = plt0;
13084 }
13085 p = htab->glink->contents;
13086 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
13087 bfd_put_64 (htab->glink->owner, plt0, p);
13088 p += 8;
13089 if (htab->opd_abi)
13090 {
13091 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13092 p += 4;
13093 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13094 p += 4;
13095 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13096 p += 4;
13097 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13098 p += 4;
13099 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13100 p += 4;
13101 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13102 p += 4;
13103 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13104 p += 4;
13105 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13106 p += 4;
13107 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13108 p += 4;
13109 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13110 p += 4;
13111 }
13112 else
13113 {
13114 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13115 p += 4;
13116 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13117 p += 4;
13118 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13119 p += 4;
13120 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13121 p += 4;
13122 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13123 p += 4;
13124 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13125 p += 4;
13126 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13127 p += 4;
13128 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13129 p += 4;
13130 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13131 p += 4;
13132 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13133 p += 4;
13134 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13135 p += 4;
13136 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13137 p += 4;
13138 }
13139 bfd_put_32 (htab->glink->owner, BCTR, p);
13140 p += 4;
13141 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
13142 {
13143 bfd_put_32 (htab->glink->owner, NOP, p);
13144 p += 4;
13145 }
13146
13147 /* Build the .glink lazy link call stubs. */
13148 indx = 0;
13149 while (p < htab->glink->contents + htab->glink->rawsize)
13150 {
13151 if (htab->opd_abi)
13152 {
13153 if (indx < 0x8000)
13154 {
13155 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13156 p += 4;
13157 }
13158 else
13159 {
13160 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13161 p += 4;
13162 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13163 p);
13164 p += 4;
13165 }
13166 }
13167 bfd_put_32 (htab->glink->owner,
13168 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
13169 indx++;
13170 p += 4;
13171 }
13172
13173 /* Build .glink global entry stubs. */
13174 if (htab->glink->size > htab->glink->rawsize)
13175 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
13176 }
13177
13178 if (htab->brlt != NULL && htab->brlt->size != 0)
13179 {
13180 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
13181 htab->brlt->size);
13182 if (htab->brlt->contents == NULL)
13183 return FALSE;
13184 }
13185 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
13186 {
13187 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
13188 htab->relbrlt->size);
13189 if (htab->relbrlt->contents == NULL)
13190 return FALSE;
13191 }
13192
13193 /* Build the stubs as directed by the stub hash table. */
13194 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
13195
13196 for (group = htab->group; group != NULL; group = group->next)
13197 if (group->needs_save_res)
13198 {
13199 stub_sec = group->stub_sec;
13200 memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
13201 htab->sfpr->size);
13202 if (htab->params->emit_stub_syms)
13203 {
13204 unsigned int i;
13205
13206 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13207 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13208 return FALSE;
13209 }
13210 stub_sec->size += htab->sfpr->size;
13211 }
13212
13213 if (htab->relbrlt != NULL)
13214 htab->relbrlt->reloc_count = 0;
13215
13216 if (htab->params->plt_stub_align != 0)
13217 for (stub_sec = htab->params->stub_bfd->sections;
13218 stub_sec != NULL;
13219 stub_sec = stub_sec->next)
13220 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13221 stub_sec->size = ((stub_sec->size
13222 + (1 << htab->params->plt_stub_align) - 1)
13223 & -(1 << htab->params->plt_stub_align));
13224
13225 for (stub_sec = htab->params->stub_bfd->sections;
13226 stub_sec != NULL;
13227 stub_sec = stub_sec->next)
13228 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13229 {
13230 stub_sec_count += 1;
13231 if (stub_sec->rawsize != stub_sec->size
13232 && (htab->stub_iteration <= STUB_SHRINK_ITER
13233 || stub_sec->rawsize < stub_sec->size))
13234 break;
13235 }
13236
13237 /* Note that the glink_eh_frame check here is not only testing that
13238 the generated size matched the calculated size but also that
13239 bfd_elf_discard_info didn't make any changes to the section. */
13240 if (stub_sec != NULL
13241 || (htab->glink_eh_frame != NULL
13242 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
13243 {
13244 htab->stub_error = TRUE;
13245 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
13246 }
13247
13248 if (htab->stub_error)
13249 return FALSE;
13250
13251 if (stats != NULL)
13252 {
13253 *stats = bfd_malloc (500);
13254 if (*stats == NULL)
13255 return FALSE;
13256
13257 sprintf (*stats, _("linker stubs in %u group%s\n"
13258 " branch %lu\n"
13259 " toc adjust %lu\n"
13260 " long branch %lu\n"
13261 " long toc adj %lu\n"
13262 " plt call %lu\n"
13263 " plt call toc %lu\n"
13264 " global entry %lu"),
13265 stub_sec_count,
13266 stub_sec_count == 1 ? "" : "s",
13267 htab->stub_count[ppc_stub_long_branch - 1],
13268 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13269 htab->stub_count[ppc_stub_plt_branch - 1],
13270 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
13271 htab->stub_count[ppc_stub_plt_call - 1],
13272 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13273 htab->stub_count[ppc_stub_global_entry - 1]);
13274 }
13275 return TRUE;
13276 }
13277
13278 /* What to do when ld finds relocations against symbols defined in
13279 discarded sections. */
13280
13281 static unsigned int
13282 ppc64_elf_action_discarded (asection *sec)
13283 {
13284 if (strcmp (".opd", sec->name) == 0)
13285 return 0;
13286
13287 if (strcmp (".toc", sec->name) == 0)
13288 return 0;
13289
13290 if (strcmp (".toc1", sec->name) == 0)
13291 return 0;
13292
13293 return _bfd_elf_default_action_discarded (sec);
13294 }
13295
13296 /* The RELOCATE_SECTION function is called by the ELF backend linker
13297 to handle the relocations for a section.
13298
13299 The relocs are always passed as Rela structures; if the section
13300 actually uses Rel structures, the r_addend field will always be
13301 zero.
13302
13303 This function is responsible for adjust the section contents as
13304 necessary, and (if using Rela relocs and generating a
13305 relocatable output file) adjusting the reloc addend as
13306 necessary.
13307
13308 This function does not have to worry about setting the reloc
13309 address or the reloc symbol index.
13310
13311 LOCAL_SYMS is a pointer to the swapped in local symbols.
13312
13313 LOCAL_SECTIONS is an array giving the section in the input file
13314 corresponding to the st_shndx field of each local symbol.
13315
13316 The global hash table entry for the global symbols can be found
13317 via elf_sym_hashes (input_bfd).
13318
13319 When generating relocatable output, this function must handle
13320 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13321 going to be the section symbol corresponding to the output
13322 section, which means that the addend must be adjusted
13323 accordingly. */
13324
13325 static bfd_boolean
13326 ppc64_elf_relocate_section (bfd *output_bfd,
13327 struct bfd_link_info *info,
13328 bfd *input_bfd,
13329 asection *input_section,
13330 bfd_byte *contents,
13331 Elf_Internal_Rela *relocs,
13332 Elf_Internal_Sym *local_syms,
13333 asection **local_sections)
13334 {
13335 struct ppc_link_hash_table *htab;
13336 Elf_Internal_Shdr *symtab_hdr;
13337 struct elf_link_hash_entry **sym_hashes;
13338 Elf_Internal_Rela *rel;
13339 Elf_Internal_Rela *wrel;
13340 Elf_Internal_Rela *relend;
13341 Elf_Internal_Rela outrel;
13342 bfd_byte *loc;
13343 struct got_entry **local_got_ents;
13344 bfd_vma TOCstart;
13345 bfd_boolean ret = TRUE;
13346 bfd_boolean is_opd;
13347 /* Assume 'at' branch hints. */
13348 bfd_boolean is_isa_v2 = TRUE;
13349 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
13350
13351 /* Initialize howto table if needed. */
13352 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
13353 ppc_howto_init ();
13354
13355 htab = ppc_hash_table (info);
13356 if (htab == NULL)
13357 return FALSE;
13358
13359 /* Don't relocate stub sections. */
13360 if (input_section->owner == htab->params->stub_bfd)
13361 return TRUE;
13362
13363 BFD_ASSERT (is_ppc64_elf (input_bfd));
13364
13365 local_got_ents = elf_local_got_ents (input_bfd);
13366 TOCstart = elf_gp (output_bfd);
13367 symtab_hdr = &elf_symtab_hdr (input_bfd);
13368 sym_hashes = elf_sym_hashes (input_bfd);
13369 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
13370
13371 rel = wrel = relocs;
13372 relend = relocs + input_section->reloc_count;
13373 for (; rel < relend; wrel++, rel++)
13374 {
13375 enum elf_ppc64_reloc_type r_type;
13376 bfd_vma addend;
13377 bfd_reloc_status_type r;
13378 Elf_Internal_Sym *sym;
13379 asection *sec;
13380 struct elf_link_hash_entry *h_elf;
13381 struct ppc_link_hash_entry *h;
13382 struct ppc_link_hash_entry *fdh;
13383 const char *sym_name;
13384 unsigned long r_symndx, toc_symndx;
13385 bfd_vma toc_addend;
13386 unsigned char tls_mask, tls_gd, tls_type;
13387 unsigned char sym_type;
13388 bfd_vma relocation;
13389 bfd_boolean unresolved_reloc;
13390 bfd_boolean warned;
13391 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
13392 unsigned int insn;
13393 unsigned int mask;
13394 struct ppc_stub_hash_entry *stub_entry;
13395 bfd_vma max_br_offset;
13396 bfd_vma from;
13397 Elf_Internal_Rela orig_rel;
13398 reloc_howto_type *howto;
13399 struct reloc_howto_struct alt_howto;
13400
13401 again:
13402 orig_rel = *rel;
13403
13404 r_type = ELF64_R_TYPE (rel->r_info);
13405 r_symndx = ELF64_R_SYM (rel->r_info);
13406
13407 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13408 symbol of the previous ADDR64 reloc. The symbol gives us the
13409 proper TOC base to use. */
13410 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13411 && wrel != relocs
13412 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
13413 && is_opd)
13414 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
13415
13416 sym = NULL;
13417 sec = NULL;
13418 h_elf = NULL;
13419 sym_name = NULL;
13420 unresolved_reloc = FALSE;
13421 warned = FALSE;
13422
13423 if (r_symndx < symtab_hdr->sh_info)
13424 {
13425 /* It's a local symbol. */
13426 struct _opd_sec_data *opd;
13427
13428 sym = local_syms + r_symndx;
13429 sec = local_sections[r_symndx];
13430 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
13431 sym_type = ELF64_ST_TYPE (sym->st_info);
13432 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13433 opd = get_opd_info (sec);
13434 if (opd != NULL && opd->adjust != NULL)
13435 {
13436 long adjust = opd->adjust[OPD_NDX (sym->st_value
13437 + rel->r_addend)];
13438 if (adjust == -1)
13439 relocation = 0;
13440 else
13441 {
13442 /* If this is a relocation against the opd section sym
13443 and we have edited .opd, adjust the reloc addend so
13444 that ld -r and ld --emit-relocs output is correct.
13445 If it is a reloc against some other .opd symbol,
13446 then the symbol value will be adjusted later. */
13447 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13448 rel->r_addend += adjust;
13449 else
13450 relocation += adjust;
13451 }
13452 }
13453 }
13454 else
13455 {
13456 bfd_boolean ignored;
13457
13458 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13459 r_symndx, symtab_hdr, sym_hashes,
13460 h_elf, sec, relocation,
13461 unresolved_reloc, warned, ignored);
13462 sym_name = h_elf->root.root.string;
13463 sym_type = h_elf->type;
13464 if (sec != NULL
13465 && sec->owner == output_bfd
13466 && strcmp (sec->name, ".opd") == 0)
13467 {
13468 /* This is a symbol defined in a linker script. All
13469 such are defined in output sections, even those
13470 defined by simple assignment from a symbol defined in
13471 an input section. Transfer the symbol to an
13472 appropriate input .opd section, so that a branch to
13473 this symbol will be mapped to the location specified
13474 by the opd entry. */
13475 struct bfd_link_order *lo;
13476 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13477 if (lo->type == bfd_indirect_link_order)
13478 {
13479 asection *isec = lo->u.indirect.section;
13480 if (h_elf->root.u.def.value >= isec->output_offset
13481 && h_elf->root.u.def.value < (isec->output_offset
13482 + isec->size))
13483 {
13484 h_elf->root.u.def.value -= isec->output_offset;
13485 h_elf->root.u.def.section = isec;
13486 sec = isec;
13487 break;
13488 }
13489 }
13490 }
13491 }
13492 h = (struct ppc_link_hash_entry *) h_elf;
13493
13494 if (sec != NULL && discarded_section (sec))
13495 {
13496 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
13497 input_bfd, input_section,
13498 contents + rel->r_offset);
13499 wrel->r_offset = rel->r_offset;
13500 wrel->r_info = 0;
13501 wrel->r_addend = 0;
13502
13503 /* For ld -r, remove relocations in debug sections against
13504 sections defined in discarded sections. Not done for
13505 non-debug to preserve relocs in .eh_frame which the
13506 eh_frame editing code expects to be present. */
13507 if (bfd_link_relocatable (info)
13508 && (input_section->flags & SEC_DEBUGGING))
13509 wrel--;
13510
13511 continue;
13512 }
13513
13514 if (bfd_link_relocatable (info))
13515 goto copy_reloc;
13516
13517 if (h != NULL && &h->elf == htab->elf.hgot)
13518 {
13519 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13520 sec = bfd_abs_section_ptr;
13521 unresolved_reloc = FALSE;
13522 }
13523
13524 /* TLS optimizations. Replace instruction sequences and relocs
13525 based on information we collected in tls_optimize. We edit
13526 RELOCS so that --emit-relocs will output something sensible
13527 for the final instruction stream. */
13528 tls_mask = 0;
13529 tls_gd = 0;
13530 toc_symndx = 0;
13531 if (h != NULL)
13532 tls_mask = h->tls_mask;
13533 else if (local_got_ents != NULL)
13534 {
13535 struct plt_entry **local_plt = (struct plt_entry **)
13536 (local_got_ents + symtab_hdr->sh_info);
13537 unsigned char *lgot_masks = (unsigned char *)
13538 (local_plt + symtab_hdr->sh_info);
13539 tls_mask = lgot_masks[r_symndx];
13540 }
13541 if (tls_mask == 0
13542 && (r_type == R_PPC64_TLS
13543 || r_type == R_PPC64_TLSGD
13544 || r_type == R_PPC64_TLSLD))
13545 {
13546 /* Check for toc tls entries. */
13547 unsigned char *toc_tls;
13548
13549 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13550 &local_syms, rel, input_bfd))
13551 return FALSE;
13552
13553 if (toc_tls)
13554 tls_mask = *toc_tls;
13555 }
13556
13557 /* Check that tls relocs are used with tls syms, and non-tls
13558 relocs are used with non-tls syms. */
13559 if (r_symndx != STN_UNDEF
13560 && r_type != R_PPC64_NONE
13561 && (h == NULL
13562 || h->elf.root.type == bfd_link_hash_defined
13563 || h->elf.root.type == bfd_link_hash_defweak)
13564 && (IS_PPC64_TLS_RELOC (r_type)
13565 != (sym_type == STT_TLS
13566 || (sym_type == STT_SECTION
13567 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13568 {
13569 if (tls_mask != 0
13570 && (r_type == R_PPC64_TLS
13571 || r_type == R_PPC64_TLSGD
13572 || r_type == R_PPC64_TLSLD))
13573 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13574 ;
13575 else
13576 info->callbacks->einfo
13577 (!IS_PPC64_TLS_RELOC (r_type)
13578 /* xgettext:c-format */
13579 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13580 /* xgettext:c-format */
13581 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13582 input_bfd, input_section, rel->r_offset,
13583 ppc64_elf_howto_table[r_type]->name,
13584 sym_name);
13585 }
13586
13587 /* Ensure reloc mapping code below stays sane. */
13588 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13589 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13590 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13591 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13592 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13593 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13594 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13595 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13596 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13597 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13598 abort ();
13599
13600 switch (r_type)
13601 {
13602 default:
13603 break;
13604
13605 case R_PPC64_LO_DS_OPT:
13606 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
13607 if ((insn & (0x3f << 26)) != 58u << 26)
13608 abort ();
13609 insn += (14u << 26) - (58u << 26);
13610 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
13611 r_type = R_PPC64_TOC16_LO;
13612 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13613 break;
13614
13615 case R_PPC64_TOC16:
13616 case R_PPC64_TOC16_LO:
13617 case R_PPC64_TOC16_DS:
13618 case R_PPC64_TOC16_LO_DS:
13619 {
13620 /* Check for toc tls entries. */
13621 unsigned char *toc_tls;
13622 int retval;
13623
13624 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13625 &local_syms, rel, input_bfd);
13626 if (retval == 0)
13627 return FALSE;
13628
13629 if (toc_tls)
13630 {
13631 tls_mask = *toc_tls;
13632 if (r_type == R_PPC64_TOC16_DS
13633 || r_type == R_PPC64_TOC16_LO_DS)
13634 {
13635 if (tls_mask != 0
13636 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13637 goto toctprel;
13638 }
13639 else
13640 {
13641 /* If we found a GD reloc pair, then we might be
13642 doing a GD->IE transition. */
13643 if (retval == 2)
13644 {
13645 tls_gd = TLS_TPRELGD;
13646 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13647 goto tls_ldgd_opt;
13648 }
13649 else if (retval == 3)
13650 {
13651 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13652 goto tls_ldgd_opt;
13653 }
13654 }
13655 }
13656 }
13657 break;
13658
13659 case R_PPC64_GOT_TPREL16_HI:
13660 case R_PPC64_GOT_TPREL16_HA:
13661 if (tls_mask != 0
13662 && (tls_mask & TLS_TPREL) == 0)
13663 {
13664 rel->r_offset -= d_offset;
13665 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13666 r_type = R_PPC64_NONE;
13667 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13668 }
13669 break;
13670
13671 case R_PPC64_GOT_TPREL16_DS:
13672 case R_PPC64_GOT_TPREL16_LO_DS:
13673 if (tls_mask != 0
13674 && (tls_mask & TLS_TPREL) == 0)
13675 {
13676 toctprel:
13677 insn = bfd_get_32 (input_bfd,
13678 contents + rel->r_offset - d_offset);
13679 insn &= 31 << 21;
13680 insn |= 0x3c0d0000; /* addis 0,13,0 */
13681 bfd_put_32 (input_bfd, insn,
13682 contents + rel->r_offset - d_offset);
13683 r_type = R_PPC64_TPREL16_HA;
13684 if (toc_symndx != 0)
13685 {
13686 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13687 rel->r_addend = toc_addend;
13688 /* We changed the symbol. Start over in order to
13689 get h, sym, sec etc. right. */
13690 goto again;
13691 }
13692 else
13693 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13694 }
13695 break;
13696
13697 case R_PPC64_TLS:
13698 if (tls_mask != 0
13699 && (tls_mask & TLS_TPREL) == 0)
13700 {
13701 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13702 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13703 if (insn == 0)
13704 abort ();
13705 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
13706 /* Was PPC64_TLS which sits on insn boundary, now
13707 PPC64_TPREL16_LO which is at low-order half-word. */
13708 rel->r_offset += d_offset;
13709 r_type = R_PPC64_TPREL16_LO;
13710 if (toc_symndx != 0)
13711 {
13712 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13713 rel->r_addend = toc_addend;
13714 /* We changed the symbol. Start over in order to
13715 get h, sym, sec etc. right. */
13716 goto again;
13717 }
13718 else
13719 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13720 }
13721 break;
13722
13723 case R_PPC64_GOT_TLSGD16_HI:
13724 case R_PPC64_GOT_TLSGD16_HA:
13725 tls_gd = TLS_TPRELGD;
13726 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13727 goto tls_gdld_hi;
13728 break;
13729
13730 case R_PPC64_GOT_TLSLD16_HI:
13731 case R_PPC64_GOT_TLSLD16_HA:
13732 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13733 {
13734 tls_gdld_hi:
13735 if ((tls_mask & tls_gd) != 0)
13736 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13737 + R_PPC64_GOT_TPREL16_DS);
13738 else
13739 {
13740 rel->r_offset -= d_offset;
13741 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13742 r_type = R_PPC64_NONE;
13743 }
13744 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13745 }
13746 break;
13747
13748 case R_PPC64_GOT_TLSGD16:
13749 case R_PPC64_GOT_TLSGD16_LO:
13750 tls_gd = TLS_TPRELGD;
13751 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13752 goto tls_ldgd_opt;
13753 break;
13754
13755 case R_PPC64_GOT_TLSLD16:
13756 case R_PPC64_GOT_TLSLD16_LO:
13757 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13758 {
13759 unsigned int insn1, insn2, insn3;
13760 bfd_vma offset;
13761
13762 tls_ldgd_opt:
13763 offset = (bfd_vma) -1;
13764 /* If not using the newer R_PPC64_TLSGD/LD to mark
13765 __tls_get_addr calls, we must trust that the call
13766 stays with its arg setup insns, ie. that the next
13767 reloc is the __tls_get_addr call associated with
13768 the current reloc. Edit both insns. */
13769 if (input_section->has_tls_get_addr_call
13770 && rel + 1 < relend
13771 && branch_reloc_hash_match (input_bfd, rel + 1,
13772 htab->tls_get_addr,
13773 htab->tls_get_addr_fd))
13774 offset = rel[1].r_offset;
13775 /* We read the low GOT_TLS (or TOC16) insn because we
13776 need to keep the destination reg. It may be
13777 something other than the usual r3, and moved to r3
13778 before the call by intervening code. */
13779 insn1 = bfd_get_32 (input_bfd,
13780 contents + rel->r_offset - d_offset);
13781 if ((tls_mask & tls_gd) != 0)
13782 {
13783 /* IE */
13784 insn1 &= (0x1f << 21) | (0x1f << 16);
13785 insn1 |= 58 << 26; /* ld */
13786 insn2 = 0x7c636a14; /* add 3,3,13 */
13787 if (offset != (bfd_vma) -1)
13788 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13789 if ((tls_mask & TLS_EXPLICIT) == 0)
13790 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13791 + R_PPC64_GOT_TPREL16_DS);
13792 else
13793 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13794 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13795 }
13796 else
13797 {
13798 /* LE */
13799 insn1 &= 0x1f << 21;
13800 insn1 |= 0x3c0d0000; /* addis r,13,0 */
13801 insn2 = 0x38630000; /* addi 3,3,0 */
13802 if (tls_gd == 0)
13803 {
13804 /* Was an LD reloc. */
13805 if (toc_symndx)
13806 sec = local_sections[toc_symndx];
13807 for (r_symndx = 0;
13808 r_symndx < symtab_hdr->sh_info;
13809 r_symndx++)
13810 if (local_sections[r_symndx] == sec)
13811 break;
13812 if (r_symndx >= symtab_hdr->sh_info)
13813 r_symndx = STN_UNDEF;
13814 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13815 if (r_symndx != STN_UNDEF)
13816 rel->r_addend -= (local_syms[r_symndx].st_value
13817 + sec->output_offset
13818 + sec->output_section->vma);
13819 }
13820 else if (toc_symndx != 0)
13821 {
13822 r_symndx = toc_symndx;
13823 rel->r_addend = toc_addend;
13824 }
13825 r_type = R_PPC64_TPREL16_HA;
13826 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13827 if (offset != (bfd_vma) -1)
13828 {
13829 rel[1].r_info = ELF64_R_INFO (r_symndx,
13830 R_PPC64_TPREL16_LO);
13831 rel[1].r_offset = offset + d_offset;
13832 rel[1].r_addend = rel->r_addend;
13833 }
13834 }
13835 bfd_put_32 (input_bfd, insn1,
13836 contents + rel->r_offset - d_offset);
13837 if (offset != (bfd_vma) -1)
13838 {
13839 insn3 = bfd_get_32 (input_bfd,
13840 contents + offset + 4);
13841 if (insn3 == NOP
13842 || insn3 == CROR_151515 || insn3 == CROR_313131)
13843 {
13844 rel[1].r_offset += 4;
13845 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13846 insn2 = NOP;
13847 }
13848 bfd_put_32 (input_bfd, insn2, contents + offset);
13849 }
13850 if ((tls_mask & tls_gd) == 0
13851 && (tls_gd == 0 || toc_symndx != 0))
13852 {
13853 /* We changed the symbol. Start over in order
13854 to get h, sym, sec etc. right. */
13855 goto again;
13856 }
13857 }
13858 break;
13859
13860 case R_PPC64_TLSGD:
13861 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13862 {
13863 unsigned int insn2, insn3;
13864 bfd_vma offset = rel->r_offset;
13865
13866 if ((tls_mask & TLS_TPRELGD) != 0)
13867 {
13868 /* IE */
13869 r_type = R_PPC64_NONE;
13870 insn2 = 0x7c636a14; /* add 3,3,13 */
13871 }
13872 else
13873 {
13874 /* LE */
13875 if (toc_symndx != 0)
13876 {
13877 r_symndx = toc_symndx;
13878 rel->r_addend = toc_addend;
13879 }
13880 r_type = R_PPC64_TPREL16_LO;
13881 rel->r_offset = offset + d_offset;
13882 insn2 = 0x38630000; /* addi 3,3,0 */
13883 }
13884 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13885 /* Zap the reloc on the _tls_get_addr call too. */
13886 BFD_ASSERT (offset == rel[1].r_offset);
13887 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13888 insn3 = bfd_get_32 (input_bfd,
13889 contents + offset + 4);
13890 if (insn3 == NOP
13891 || insn3 == CROR_151515 || insn3 == CROR_313131)
13892 {
13893 rel->r_offset += 4;
13894 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13895 insn2 = NOP;
13896 }
13897 bfd_put_32 (input_bfd, insn2, contents + offset);
13898 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13899 goto again;
13900 }
13901 break;
13902
13903 case R_PPC64_TLSLD:
13904 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13905 {
13906 unsigned int insn2, insn3;
13907 bfd_vma offset = rel->r_offset;
13908
13909 if (toc_symndx)
13910 sec = local_sections[toc_symndx];
13911 for (r_symndx = 0;
13912 r_symndx < symtab_hdr->sh_info;
13913 r_symndx++)
13914 if (local_sections[r_symndx] == sec)
13915 break;
13916 if (r_symndx >= symtab_hdr->sh_info)
13917 r_symndx = STN_UNDEF;
13918 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13919 if (r_symndx != STN_UNDEF)
13920 rel->r_addend -= (local_syms[r_symndx].st_value
13921 + sec->output_offset
13922 + sec->output_section->vma);
13923
13924 r_type = R_PPC64_TPREL16_LO;
13925 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13926 rel->r_offset = offset + d_offset;
13927 /* Zap the reloc on the _tls_get_addr call too. */
13928 BFD_ASSERT (offset == rel[1].r_offset);
13929 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13930 insn2 = 0x38630000; /* addi 3,3,0 */
13931 insn3 = bfd_get_32 (input_bfd,
13932 contents + offset + 4);
13933 if (insn3 == NOP
13934 || insn3 == CROR_151515 || insn3 == CROR_313131)
13935 {
13936 rel->r_offset += 4;
13937 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13938 insn2 = NOP;
13939 }
13940 bfd_put_32 (input_bfd, insn2, contents + offset);
13941 goto again;
13942 }
13943 break;
13944
13945 case R_PPC64_DTPMOD64:
13946 if (rel + 1 < relend
13947 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13948 && rel[1].r_offset == rel->r_offset + 8)
13949 {
13950 if ((tls_mask & TLS_GD) == 0)
13951 {
13952 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13953 if ((tls_mask & TLS_TPRELGD) != 0)
13954 r_type = R_PPC64_TPREL64;
13955 else
13956 {
13957 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13958 r_type = R_PPC64_NONE;
13959 }
13960 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13961 }
13962 }
13963 else
13964 {
13965 if ((tls_mask & TLS_LD) == 0)
13966 {
13967 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13968 r_type = R_PPC64_NONE;
13969 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13970 }
13971 }
13972 break;
13973
13974 case R_PPC64_TPREL64:
13975 if ((tls_mask & TLS_TPREL) == 0)
13976 {
13977 r_type = R_PPC64_NONE;
13978 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13979 }
13980 break;
13981
13982 case R_PPC64_ENTRY:
13983 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13984 if (!bfd_link_pic (info)
13985 && !info->traditional_format
13986 && relocation + 0x80008000 <= 0xffffffff)
13987 {
13988 unsigned int insn1, insn2;
13989
13990 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
13991 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
13992 if ((insn1 & ~0xfffc) == LD_R2_0R12
13993 && insn2 == ADD_R2_R2_R12)
13994 {
13995 bfd_put_32 (input_bfd,
13996 LIS_R2 + PPC_HA (relocation),
13997 contents + rel->r_offset);
13998 bfd_put_32 (input_bfd,
13999 ADDI_R2_R2 + PPC_LO (relocation),
14000 contents + rel->r_offset + 4);
14001 }
14002 }
14003 else
14004 {
14005 relocation -= (rel->r_offset
14006 + input_section->output_offset
14007 + input_section->output_section->vma);
14008 if (relocation + 0x80008000 <= 0xffffffff)
14009 {
14010 unsigned int insn1, insn2;
14011
14012 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14013 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14014 if ((insn1 & ~0xfffc) == LD_R2_0R12
14015 && insn2 == ADD_R2_R2_R12)
14016 {
14017 bfd_put_32 (input_bfd,
14018 ADDIS_R2_R12 + PPC_HA (relocation),
14019 contents + rel->r_offset);
14020 bfd_put_32 (input_bfd,
14021 ADDI_R2_R2 + PPC_LO (relocation),
14022 contents + rel->r_offset + 4);
14023 }
14024 }
14025 }
14026 break;
14027
14028 case R_PPC64_REL16_HA:
14029 /* If we are generating a non-PIC executable, edit
14030 . 0: addis 2,12,.TOC.-0b@ha
14031 . addi 2,2,.TOC.-0b@l
14032 used by ELFv2 global entry points to set up r2, to
14033 . lis 2,.TOC.@ha
14034 . addi 2,2,.TOC.@l
14035 if .TOC. is in range. */
14036 if (!bfd_link_pic (info)
14037 && !info->traditional_format
14038 && !htab->opd_abi
14039 && rel->r_addend == d_offset
14040 && h != NULL && &h->elf == htab->elf.hgot
14041 && rel + 1 < relend
14042 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14043 && rel[1].r_offset == rel->r_offset + 4
14044 && rel[1].r_addend == rel->r_addend + 4
14045 && relocation + 0x80008000 <= 0xffffffff)
14046 {
14047 unsigned int insn1, insn2;
14048 bfd_vma offset = rel->r_offset - d_offset;
14049 insn1 = bfd_get_32 (input_bfd, contents + offset);
14050 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14051 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14052 && (insn2 & 0xffff0000) == ADDI_R2_R2)
14053 {
14054 r_type = R_PPC64_ADDR16_HA;
14055 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14056 rel->r_addend -= d_offset;
14057 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14058 rel[1].r_addend -= d_offset + 4;
14059 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
14060 }
14061 }
14062 break;
14063 }
14064
14065 /* Handle other relocations that tweak non-addend part of insn. */
14066 insn = 0;
14067 max_br_offset = 1 << 25;
14068 addend = rel->r_addend;
14069 reloc_dest = DEST_NORMAL;
14070 switch (r_type)
14071 {
14072 default:
14073 break;
14074
14075 case R_PPC64_TOCSAVE:
14076 if (relocation + addend == (rel->r_offset
14077 + input_section->output_offset
14078 + input_section->output_section->vma)
14079 && tocsave_find (htab, NO_INSERT,
14080 &local_syms, rel, input_bfd))
14081 {
14082 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14083 if (insn == NOP
14084 || insn == CROR_151515 || insn == CROR_313131)
14085 bfd_put_32 (input_bfd,
14086 STD_R2_0R1 + STK_TOC (htab),
14087 contents + rel->r_offset);
14088 }
14089 break;
14090
14091 /* Branch taken prediction relocations. */
14092 case R_PPC64_ADDR14_BRTAKEN:
14093 case R_PPC64_REL14_BRTAKEN:
14094 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
14095 /* Fall through. */
14096
14097 /* Branch not taken prediction relocations. */
14098 case R_PPC64_ADDR14_BRNTAKEN:
14099 case R_PPC64_REL14_BRNTAKEN:
14100 insn |= bfd_get_32 (input_bfd,
14101 contents + rel->r_offset) & ~(0x01 << 21);
14102 /* Fall through. */
14103
14104 case R_PPC64_REL14:
14105 max_br_offset = 1 << 15;
14106 /* Fall through. */
14107
14108 case R_PPC64_REL24:
14109 /* Calls to functions with a different TOC, such as calls to
14110 shared objects, need to alter the TOC pointer. This is
14111 done using a linkage stub. A REL24 branching to these
14112 linkage stubs needs to be followed by a nop, as the nop
14113 will be replaced with an instruction to restore the TOC
14114 base pointer. */
14115 fdh = h;
14116 if (h != NULL
14117 && h->oh != NULL
14118 && h->oh->is_func_descriptor)
14119 fdh = ppc_follow_link (h->oh);
14120 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14121 htab);
14122 if (stub_entry != NULL
14123 && (stub_entry->stub_type == ppc_stub_plt_call
14124 || stub_entry->stub_type == ppc_stub_plt_call_r2save
14125 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14126 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
14127 {
14128 bfd_boolean can_plt_call = FALSE;
14129
14130 /* All of these stubs will modify r2, so there must be a
14131 branch and link followed by a nop. The nop is
14132 replaced by an insn to restore r2. */
14133 if (rel->r_offset + 8 <= input_section->size)
14134 {
14135 unsigned long br;
14136
14137 br = bfd_get_32 (input_bfd,
14138 contents + rel->r_offset);
14139 if ((br & 1) != 0)
14140 {
14141 unsigned long nop;
14142
14143 nop = bfd_get_32 (input_bfd,
14144 contents + rel->r_offset + 4);
14145 if (nop == NOP
14146 || nop == CROR_151515 || nop == CROR_313131)
14147 {
14148 if (h != NULL
14149 && (h == htab->tls_get_addr_fd
14150 || h == htab->tls_get_addr)
14151 && htab->params->tls_get_addr_opt)
14152 {
14153 /* Special stub used, leave nop alone. */
14154 }
14155 else
14156 bfd_put_32 (input_bfd,
14157 LD_R2_0R1 + STK_TOC (htab),
14158 contents + rel->r_offset + 4);
14159 can_plt_call = TRUE;
14160 }
14161 }
14162 }
14163
14164 if (!can_plt_call && h != NULL)
14165 {
14166 const char *name = h->elf.root.root.string;
14167
14168 if (*name == '.')
14169 ++name;
14170
14171 if (strncmp (name, "__libc_start_main", 17) == 0
14172 && (name[17] == 0 || name[17] == '@'))
14173 {
14174 /* Allow crt1 branch to go via a toc adjusting
14175 stub. Other calls that never return could do
14176 the same, if we could detect such. */
14177 can_plt_call = TRUE;
14178 }
14179 }
14180
14181 if (!can_plt_call)
14182 {
14183 /* g++ as of 20130507 emits self-calls without a
14184 following nop. This is arguably wrong since we
14185 have conflicting information. On the one hand a
14186 global symbol and on the other a local call
14187 sequence, but don't error for this special case.
14188 It isn't possible to cheaply verify we have
14189 exactly such a call. Allow all calls to the same
14190 section. */
14191 asection *code_sec = sec;
14192
14193 if (get_opd_info (sec) != NULL)
14194 {
14195 bfd_vma off = (relocation + addend
14196 - sec->output_section->vma
14197 - sec->output_offset);
14198
14199 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
14200 }
14201 if (code_sec == input_section)
14202 can_plt_call = TRUE;
14203 }
14204
14205 if (!can_plt_call)
14206 {
14207 if (stub_entry->stub_type == ppc_stub_plt_call
14208 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14209 info->callbacks->einfo
14210 /* xgettext:c-format */
14211 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14212 "recompile with -fPIC\n"),
14213 input_bfd, input_section, rel->r_offset, sym_name);
14214 else
14215 info->callbacks->einfo
14216 /* xgettext:c-format */
14217 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14218 "(-mcmodel=small toc adjust stub)\n"),
14219 input_bfd, input_section, rel->r_offset, sym_name);
14220
14221 bfd_set_error (bfd_error_bad_value);
14222 ret = FALSE;
14223 }
14224
14225 if (can_plt_call
14226 && (stub_entry->stub_type == ppc_stub_plt_call
14227 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14228 unresolved_reloc = FALSE;
14229 }
14230
14231 if ((stub_entry == NULL
14232 || stub_entry->stub_type == ppc_stub_long_branch
14233 || stub_entry->stub_type == ppc_stub_plt_branch)
14234 && get_opd_info (sec) != NULL)
14235 {
14236 /* The branch destination is the value of the opd entry. */
14237 bfd_vma off = (relocation + addend
14238 - sec->output_section->vma
14239 - sec->output_offset);
14240 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
14241 if (dest != (bfd_vma) -1)
14242 {
14243 relocation = dest;
14244 addend = 0;
14245 reloc_dest = DEST_OPD;
14246 }
14247 }
14248
14249 /* If the branch is out of reach we ought to have a long
14250 branch stub. */
14251 from = (rel->r_offset
14252 + input_section->output_offset
14253 + input_section->output_section->vma);
14254
14255 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14256 ? fdh->elf.other
14257 : sym->st_other);
14258
14259 if (stub_entry != NULL
14260 && (stub_entry->stub_type == ppc_stub_long_branch
14261 || stub_entry->stub_type == ppc_stub_plt_branch)
14262 && (r_type == R_PPC64_ADDR14_BRTAKEN
14263 || r_type == R_PPC64_ADDR14_BRNTAKEN
14264 || (relocation + addend - from + max_br_offset
14265 < 2 * max_br_offset)))
14266 /* Don't use the stub if this branch is in range. */
14267 stub_entry = NULL;
14268
14269 if (stub_entry != NULL)
14270 {
14271 /* Munge up the value and addend so that we call the stub
14272 rather than the procedure directly. */
14273 asection *stub_sec = stub_entry->group->stub_sec;
14274
14275 if (stub_entry->stub_type == ppc_stub_save_res)
14276 relocation += (stub_sec->output_offset
14277 + stub_sec->output_section->vma
14278 + stub_sec->size - htab->sfpr->size
14279 - htab->sfpr->output_offset
14280 - htab->sfpr->output_section->vma);
14281 else
14282 relocation = (stub_entry->stub_offset
14283 + stub_sec->output_offset
14284 + stub_sec->output_section->vma);
14285 addend = 0;
14286 reloc_dest = DEST_STUB;
14287
14288 if ((stub_entry->stub_type == ppc_stub_plt_call
14289 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14290 && (ALWAYS_EMIT_R2SAVE
14291 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14292 && rel + 1 < relend
14293 && rel[1].r_offset == rel->r_offset + 4
14294 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14295 relocation += 4;
14296 }
14297
14298 if (insn != 0)
14299 {
14300 if (is_isa_v2)
14301 {
14302 /* Set 'a' bit. This is 0b00010 in BO field for branch
14303 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14304 for branch on CTR insns (BO == 1a00t or 1a01t). */
14305 if ((insn & (0x14 << 21)) == (0x04 << 21))
14306 insn |= 0x02 << 21;
14307 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14308 insn |= 0x08 << 21;
14309 else
14310 break;
14311 }
14312 else
14313 {
14314 /* Invert 'y' bit if not the default. */
14315 if ((bfd_signed_vma) (relocation + addend - from) < 0)
14316 insn ^= 0x01 << 21;
14317 }
14318
14319 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14320 }
14321
14322 /* NOP out calls to undefined weak functions.
14323 We can thus call a weak function without first
14324 checking whether the function is defined. */
14325 else if (h != NULL
14326 && h->elf.root.type == bfd_link_hash_undefweak
14327 && h->elf.dynindx == -1
14328 && r_type == R_PPC64_REL24
14329 && relocation == 0
14330 && addend == 0)
14331 {
14332 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14333 goto copy_reloc;
14334 }
14335 break;
14336 }
14337
14338 /* Set `addend'. */
14339 tls_type = 0;
14340 switch (r_type)
14341 {
14342 default:
14343 info->callbacks->einfo
14344 /* xgettext:c-format */
14345 (_("%P: %B: unknown relocation type %d for `%T'\n"),
14346 input_bfd, (int) r_type, sym_name);
14347
14348 bfd_set_error (bfd_error_bad_value);
14349 ret = FALSE;
14350 goto copy_reloc;
14351
14352 case R_PPC64_NONE:
14353 case R_PPC64_TLS:
14354 case R_PPC64_TLSGD:
14355 case R_PPC64_TLSLD:
14356 case R_PPC64_TOCSAVE:
14357 case R_PPC64_GNU_VTINHERIT:
14358 case R_PPC64_GNU_VTENTRY:
14359 case R_PPC64_ENTRY:
14360 goto copy_reloc;
14361
14362 /* GOT16 relocations. Like an ADDR16 using the symbol's
14363 address in the GOT as relocation value instead of the
14364 symbol's value itself. Also, create a GOT entry for the
14365 symbol and put the symbol value there. */
14366 case R_PPC64_GOT_TLSGD16:
14367 case R_PPC64_GOT_TLSGD16_LO:
14368 case R_PPC64_GOT_TLSGD16_HI:
14369 case R_PPC64_GOT_TLSGD16_HA:
14370 tls_type = TLS_TLS | TLS_GD;
14371 goto dogot;
14372
14373 case R_PPC64_GOT_TLSLD16:
14374 case R_PPC64_GOT_TLSLD16_LO:
14375 case R_PPC64_GOT_TLSLD16_HI:
14376 case R_PPC64_GOT_TLSLD16_HA:
14377 tls_type = TLS_TLS | TLS_LD;
14378 goto dogot;
14379
14380 case R_PPC64_GOT_TPREL16_DS:
14381 case R_PPC64_GOT_TPREL16_LO_DS:
14382 case R_PPC64_GOT_TPREL16_HI:
14383 case R_PPC64_GOT_TPREL16_HA:
14384 tls_type = TLS_TLS | TLS_TPREL;
14385 goto dogot;
14386
14387 case R_PPC64_GOT_DTPREL16_DS:
14388 case R_PPC64_GOT_DTPREL16_LO_DS:
14389 case R_PPC64_GOT_DTPREL16_HI:
14390 case R_PPC64_GOT_DTPREL16_HA:
14391 tls_type = TLS_TLS | TLS_DTPREL;
14392 goto dogot;
14393
14394 case R_PPC64_GOT16:
14395 case R_PPC64_GOT16_LO:
14396 case R_PPC64_GOT16_HI:
14397 case R_PPC64_GOT16_HA:
14398 case R_PPC64_GOT16_DS:
14399 case R_PPC64_GOT16_LO_DS:
14400 dogot:
14401 {
14402 /* Relocation is to the entry for this symbol in the global
14403 offset table. */
14404 asection *got;
14405 bfd_vma *offp;
14406 bfd_vma off;
14407 unsigned long indx = 0;
14408 struct got_entry *ent;
14409
14410 if (tls_type == (TLS_TLS | TLS_LD)
14411 && (h == NULL
14412 || !h->elf.def_dynamic))
14413 ent = ppc64_tlsld_got (input_bfd);
14414 else
14415 {
14416
14417 if (h != NULL)
14418 {
14419 bfd_boolean dyn = htab->elf.dynamic_sections_created;
14420 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info),
14421 &h->elf)
14422 || (bfd_link_pic (info)
14423 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
14424 /* This is actually a static link, or it is a
14425 -Bsymbolic link and the symbol is defined
14426 locally, or the symbol was forced to be local
14427 because of a version file. */
14428 ;
14429 else
14430 {
14431 BFD_ASSERT (h->elf.dynindx != -1);
14432 indx = h->elf.dynindx;
14433 unresolved_reloc = FALSE;
14434 }
14435 ent = h->elf.got.glist;
14436 }
14437 else
14438 {
14439 if (local_got_ents == NULL)
14440 abort ();
14441 ent = local_got_ents[r_symndx];
14442 }
14443
14444 for (; ent != NULL; ent = ent->next)
14445 if (ent->addend == orig_rel.r_addend
14446 && ent->owner == input_bfd
14447 && ent->tls_type == tls_type)
14448 break;
14449 }
14450
14451 if (ent == NULL)
14452 abort ();
14453 if (ent->is_indirect)
14454 ent = ent->got.ent;
14455 offp = &ent->got.offset;
14456 got = ppc64_elf_tdata (ent->owner)->got;
14457 if (got == NULL)
14458 abort ();
14459
14460 /* The offset must always be a multiple of 8. We use the
14461 least significant bit to record whether we have already
14462 processed this entry. */
14463 off = *offp;
14464 if ((off & 1) != 0)
14465 off &= ~1;
14466 else
14467 {
14468 /* Generate relocs for the dynamic linker, except in
14469 the case of TLSLD where we'll use one entry per
14470 module. */
14471 asection *relgot;
14472 bfd_boolean ifunc;
14473
14474 *offp = off | 1;
14475 relgot = NULL;
14476 ifunc = (h != NULL
14477 ? h->elf.type == STT_GNU_IFUNC
14478 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
14479 if (ifunc)
14480 relgot = htab->elf.irelplt;
14481 else if ((bfd_link_pic (info) || indx != 0)
14482 && (h == NULL
14483 || (tls_type == (TLS_TLS | TLS_LD)
14484 && !h->elf.def_dynamic)
14485 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14486 || h->elf.root.type != bfd_link_hash_undefweak))
14487 relgot = ppc64_elf_tdata (ent->owner)->relgot;
14488 if (relgot != NULL)
14489 {
14490 outrel.r_offset = (got->output_section->vma
14491 + got->output_offset
14492 + off);
14493 outrel.r_addend = addend;
14494 if (tls_type & (TLS_LD | TLS_GD))
14495 {
14496 outrel.r_addend = 0;
14497 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
14498 if (tls_type == (TLS_TLS | TLS_GD))
14499 {
14500 loc = relgot->contents;
14501 loc += (relgot->reloc_count++
14502 * sizeof (Elf64_External_Rela));
14503 bfd_elf64_swap_reloca_out (output_bfd,
14504 &outrel, loc);
14505 outrel.r_offset += 8;
14506 outrel.r_addend = addend;
14507 outrel.r_info
14508 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14509 }
14510 }
14511 else if (tls_type == (TLS_TLS | TLS_DTPREL))
14512 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14513 else if (tls_type == (TLS_TLS | TLS_TPREL))
14514 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
14515 else if (indx != 0)
14516 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14517 else
14518 {
14519 if (ifunc)
14520 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14521 else
14522 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14523
14524 /* Write the .got section contents for the sake
14525 of prelink. */
14526 loc = got->contents + off;
14527 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14528 loc);
14529 }
14530
14531 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
14532 {
14533 outrel.r_addend += relocation;
14534 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
14535 {
14536 if (htab->elf.tls_sec == NULL)
14537 outrel.r_addend = 0;
14538 else
14539 outrel.r_addend -= htab->elf.tls_sec->vma;
14540 }
14541 }
14542 loc = relgot->contents;
14543 loc += (relgot->reloc_count++
14544 * sizeof (Elf64_External_Rela));
14545 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14546 }
14547
14548 /* Init the .got section contents here if we're not
14549 emitting a reloc. */
14550 else
14551 {
14552 relocation += addend;
14553 if (tls_type == (TLS_TLS | TLS_LD))
14554 relocation = 1;
14555 else if (tls_type != 0)
14556 {
14557 if (htab->elf.tls_sec == NULL)
14558 relocation = 0;
14559 else
14560 {
14561 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14562 if (tls_type == (TLS_TLS | TLS_TPREL))
14563 relocation += DTP_OFFSET - TP_OFFSET;
14564 }
14565
14566 if (tls_type == (TLS_TLS | TLS_GD))
14567 {
14568 bfd_put_64 (output_bfd, relocation,
14569 got->contents + off + 8);
14570 relocation = 1;
14571 }
14572 }
14573
14574 bfd_put_64 (output_bfd, relocation,
14575 got->contents + off);
14576 }
14577 }
14578
14579 if (off >= (bfd_vma) -2)
14580 abort ();
14581
14582 relocation = got->output_section->vma + got->output_offset + off;
14583 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
14584 }
14585 break;
14586
14587 case R_PPC64_PLT16_HA:
14588 case R_PPC64_PLT16_HI:
14589 case R_PPC64_PLT16_LO:
14590 case R_PPC64_PLT32:
14591 case R_PPC64_PLT64:
14592 /* Relocation is to the entry for this symbol in the
14593 procedure linkage table. */
14594 {
14595 struct plt_entry **plt_list = NULL;
14596 if (h != NULL)
14597 plt_list = &h->elf.plt.plist;
14598 else if (local_got_ents != NULL)
14599 {
14600 struct plt_entry **local_plt = (struct plt_entry **)
14601 (local_got_ents + symtab_hdr->sh_info);
14602 unsigned char *local_got_tls_masks = (unsigned char *)
14603 (local_plt + symtab_hdr->sh_info);
14604 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
14605 plt_list = local_plt + r_symndx;
14606 }
14607 if (plt_list)
14608 {
14609 struct plt_entry *ent;
14610
14611 for (ent = *plt_list; ent != NULL; ent = ent->next)
14612 if (ent->plt.offset != (bfd_vma) -1
14613 && ent->addend == orig_rel.r_addend)
14614 {
14615 asection *plt;
14616
14617 plt = htab->elf.splt;
14618 if (!htab->elf.dynamic_sections_created
14619 || h == NULL
14620 || h->elf.dynindx == -1)
14621 plt = htab->elf.iplt;
14622 relocation = (plt->output_section->vma
14623 + plt->output_offset
14624 + ent->plt.offset);
14625 addend = 0;
14626 unresolved_reloc = FALSE;
14627 break;
14628 }
14629 }
14630 }
14631 break;
14632
14633 case R_PPC64_TOC:
14634 /* Relocation value is TOC base. */
14635 relocation = TOCstart;
14636 if (r_symndx == STN_UNDEF)
14637 relocation += htab->sec_info[input_section->id].toc_off;
14638 else if (unresolved_reloc)
14639 ;
14640 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
14641 relocation += htab->sec_info[sec->id].toc_off;
14642 else
14643 unresolved_reloc = TRUE;
14644 goto dodyn;
14645
14646 /* TOC16 relocs. We want the offset relative to the TOC base,
14647 which is the address of the start of the TOC plus 0x8000.
14648 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14649 in this order. */
14650 case R_PPC64_TOC16:
14651 case R_PPC64_TOC16_LO:
14652 case R_PPC64_TOC16_HI:
14653 case R_PPC64_TOC16_DS:
14654 case R_PPC64_TOC16_LO_DS:
14655 case R_PPC64_TOC16_HA:
14656 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
14657 break;
14658
14659 /* Relocate against the beginning of the section. */
14660 case R_PPC64_SECTOFF:
14661 case R_PPC64_SECTOFF_LO:
14662 case R_PPC64_SECTOFF_HI:
14663 case R_PPC64_SECTOFF_DS:
14664 case R_PPC64_SECTOFF_LO_DS:
14665 case R_PPC64_SECTOFF_HA:
14666 if (sec != NULL)
14667 addend -= sec->output_section->vma;
14668 break;
14669
14670 case R_PPC64_REL16:
14671 case R_PPC64_REL16_LO:
14672 case R_PPC64_REL16_HI:
14673 case R_PPC64_REL16_HA:
14674 case R_PPC64_REL16DX_HA:
14675 break;
14676
14677 case R_PPC64_REL14:
14678 case R_PPC64_REL14_BRNTAKEN:
14679 case R_PPC64_REL14_BRTAKEN:
14680 case R_PPC64_REL24:
14681 break;
14682
14683 case R_PPC64_TPREL16:
14684 case R_PPC64_TPREL16_LO:
14685 case R_PPC64_TPREL16_HI:
14686 case R_PPC64_TPREL16_HA:
14687 case R_PPC64_TPREL16_DS:
14688 case R_PPC64_TPREL16_LO_DS:
14689 case R_PPC64_TPREL16_HIGH:
14690 case R_PPC64_TPREL16_HIGHA:
14691 case R_PPC64_TPREL16_HIGHER:
14692 case R_PPC64_TPREL16_HIGHERA:
14693 case R_PPC64_TPREL16_HIGHEST:
14694 case R_PPC64_TPREL16_HIGHESTA:
14695 if (h != NULL
14696 && h->elf.root.type == bfd_link_hash_undefweak
14697 && h->elf.dynindx == -1)
14698 {
14699 /* Make this relocation against an undefined weak symbol
14700 resolve to zero. This is really just a tweak, since
14701 code using weak externs ought to check that they are
14702 defined before using them. */
14703 bfd_byte *p = contents + rel->r_offset - d_offset;
14704
14705 insn = bfd_get_32 (input_bfd, p);
14706 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14707 if (insn != 0)
14708 bfd_put_32 (input_bfd, insn, p);
14709 break;
14710 }
14711 if (htab->elf.tls_sec != NULL)
14712 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14713 if (bfd_link_pic (info))
14714 /* The TPREL16 relocs shouldn't really be used in shared
14715 libs as they will result in DT_TEXTREL being set, but
14716 support them anyway. */
14717 goto dodyn;
14718 break;
14719
14720 case R_PPC64_DTPREL16:
14721 case R_PPC64_DTPREL16_LO:
14722 case R_PPC64_DTPREL16_HI:
14723 case R_PPC64_DTPREL16_HA:
14724 case R_PPC64_DTPREL16_DS:
14725 case R_PPC64_DTPREL16_LO_DS:
14726 case R_PPC64_DTPREL16_HIGH:
14727 case R_PPC64_DTPREL16_HIGHA:
14728 case R_PPC64_DTPREL16_HIGHER:
14729 case R_PPC64_DTPREL16_HIGHERA:
14730 case R_PPC64_DTPREL16_HIGHEST:
14731 case R_PPC64_DTPREL16_HIGHESTA:
14732 if (htab->elf.tls_sec != NULL)
14733 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14734 break;
14735
14736 case R_PPC64_ADDR64_LOCAL:
14737 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14738 ? h->elf.other
14739 : sym->st_other);
14740 break;
14741
14742 case R_PPC64_DTPMOD64:
14743 relocation = 1;
14744 addend = 0;
14745 goto dodyn;
14746
14747 case R_PPC64_TPREL64:
14748 if (htab->elf.tls_sec != NULL)
14749 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14750 goto dodyn;
14751
14752 case R_PPC64_DTPREL64:
14753 if (htab->elf.tls_sec != NULL)
14754 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14755 /* Fall through. */
14756
14757 /* Relocations that may need to be propagated if this is a
14758 dynamic object. */
14759 case R_PPC64_REL30:
14760 case R_PPC64_REL32:
14761 case R_PPC64_REL64:
14762 case R_PPC64_ADDR14:
14763 case R_PPC64_ADDR14_BRNTAKEN:
14764 case R_PPC64_ADDR14_BRTAKEN:
14765 case R_PPC64_ADDR16:
14766 case R_PPC64_ADDR16_DS:
14767 case R_PPC64_ADDR16_HA:
14768 case R_PPC64_ADDR16_HI:
14769 case R_PPC64_ADDR16_HIGH:
14770 case R_PPC64_ADDR16_HIGHA:
14771 case R_PPC64_ADDR16_HIGHER:
14772 case R_PPC64_ADDR16_HIGHERA:
14773 case R_PPC64_ADDR16_HIGHEST:
14774 case R_PPC64_ADDR16_HIGHESTA:
14775 case R_PPC64_ADDR16_LO:
14776 case R_PPC64_ADDR16_LO_DS:
14777 case R_PPC64_ADDR24:
14778 case R_PPC64_ADDR32:
14779 case R_PPC64_ADDR64:
14780 case R_PPC64_UADDR16:
14781 case R_PPC64_UADDR32:
14782 case R_PPC64_UADDR64:
14783 dodyn:
14784 if ((input_section->flags & SEC_ALLOC) == 0)
14785 break;
14786
14787 if (NO_OPD_RELOCS && is_opd)
14788 break;
14789
14790 if (bfd_link_pic (info)
14791 ? ((h != NULL && pc_dynrelocs (h))
14792 || must_be_dyn_reloc (info, r_type))
14793 : (h != NULL
14794 ? h->dyn_relocs != NULL
14795 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14796 {
14797 bfd_boolean skip, relocate;
14798 asection *sreloc;
14799 bfd_vma out_off;
14800
14801 /* When generating a dynamic object, these relocations
14802 are copied into the output file to be resolved at run
14803 time. */
14804
14805 skip = FALSE;
14806 relocate = FALSE;
14807
14808 out_off = _bfd_elf_section_offset (output_bfd, info,
14809 input_section, rel->r_offset);
14810 if (out_off == (bfd_vma) -1)
14811 skip = TRUE;
14812 else if (out_off == (bfd_vma) -2)
14813 skip = TRUE, relocate = TRUE;
14814 out_off += (input_section->output_section->vma
14815 + input_section->output_offset);
14816 outrel.r_offset = out_off;
14817 outrel.r_addend = rel->r_addend;
14818
14819 /* Optimize unaligned reloc use. */
14820 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14821 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14822 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14823 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14824 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14825 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14826 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14827 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14828 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14829
14830 if (skip)
14831 memset (&outrel, 0, sizeof outrel);
14832 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14833 && !is_opd
14834 && r_type != R_PPC64_TOC)
14835 {
14836 BFD_ASSERT (h->elf.dynindx != -1);
14837 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14838 }
14839 else
14840 {
14841 /* This symbol is local, or marked to become local,
14842 or this is an opd section reloc which must point
14843 at a local function. */
14844 outrel.r_addend += relocation;
14845 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14846 {
14847 if (is_opd && h != NULL)
14848 {
14849 /* Lie about opd entries. This case occurs
14850 when building shared libraries and we
14851 reference a function in another shared
14852 lib. The same thing happens for a weak
14853 definition in an application that's
14854 overridden by a strong definition in a
14855 shared lib. (I believe this is a generic
14856 bug in binutils handling of weak syms.)
14857 In these cases we won't use the opd
14858 entry in this lib. */
14859 unresolved_reloc = FALSE;
14860 }
14861 if (!is_opd
14862 && r_type == R_PPC64_ADDR64
14863 && (h != NULL
14864 ? h->elf.type == STT_GNU_IFUNC
14865 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14866 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14867 else
14868 {
14869 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14870
14871 /* We need to relocate .opd contents for ld.so.
14872 Prelink also wants simple and consistent rules
14873 for relocs. This make all RELATIVE relocs have
14874 *r_offset equal to r_addend. */
14875 relocate = TRUE;
14876 }
14877 }
14878 else
14879 {
14880 long indx = 0;
14881
14882 if (h != NULL
14883 ? h->elf.type == STT_GNU_IFUNC
14884 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14885 {
14886 info->callbacks->einfo
14887 /* xgettext:c-format */
14888 (_("%P: %H: %s for indirect "
14889 "function `%T' unsupported\n"),
14890 input_bfd, input_section, rel->r_offset,
14891 ppc64_elf_howto_table[r_type]->name,
14892 sym_name);
14893 ret = FALSE;
14894 }
14895 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14896 ;
14897 else if (sec == NULL || sec->owner == NULL)
14898 {
14899 bfd_set_error (bfd_error_bad_value);
14900 return FALSE;
14901 }
14902 else
14903 {
14904 asection *osec;
14905
14906 osec = sec->output_section;
14907 indx = elf_section_data (osec)->dynindx;
14908
14909 if (indx == 0)
14910 {
14911 if ((osec->flags & SEC_READONLY) == 0
14912 && htab->elf.data_index_section != NULL)
14913 osec = htab->elf.data_index_section;
14914 else
14915 osec = htab->elf.text_index_section;
14916 indx = elf_section_data (osec)->dynindx;
14917 }
14918 BFD_ASSERT (indx != 0);
14919
14920 /* We are turning this relocation into one
14921 against a section symbol, so subtract out
14922 the output section's address but not the
14923 offset of the input section in the output
14924 section. */
14925 outrel.r_addend -= osec->vma;
14926 }
14927
14928 outrel.r_info = ELF64_R_INFO (indx, r_type);
14929 }
14930 }
14931
14932 sreloc = elf_section_data (input_section)->sreloc;
14933 if (h != NULL
14934 ? h->elf.type == STT_GNU_IFUNC
14935 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14936 sreloc = htab->elf.irelplt;
14937 if (sreloc == NULL)
14938 abort ();
14939
14940 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14941 >= sreloc->size)
14942 abort ();
14943 loc = sreloc->contents;
14944 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14945 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14946
14947 /* If this reloc is against an external symbol, it will
14948 be computed at runtime, so there's no need to do
14949 anything now. However, for the sake of prelink ensure
14950 that the section contents are a known value. */
14951 if (! relocate)
14952 {
14953 unresolved_reloc = FALSE;
14954 /* The value chosen here is quite arbitrary as ld.so
14955 ignores section contents except for the special
14956 case of .opd where the contents might be accessed
14957 before relocation. Choose zero, as that won't
14958 cause reloc overflow. */
14959 relocation = 0;
14960 addend = 0;
14961 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14962 to improve backward compatibility with older
14963 versions of ld. */
14964 if (r_type == R_PPC64_ADDR64)
14965 addend = outrel.r_addend;
14966 /* Adjust pc_relative relocs to have zero in *r_offset. */
14967 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14968 addend = (input_section->output_section->vma
14969 + input_section->output_offset
14970 + rel->r_offset);
14971 }
14972 }
14973 break;
14974
14975 case R_PPC64_COPY:
14976 case R_PPC64_GLOB_DAT:
14977 case R_PPC64_JMP_SLOT:
14978 case R_PPC64_JMP_IREL:
14979 case R_PPC64_RELATIVE:
14980 /* We shouldn't ever see these dynamic relocs in relocatable
14981 files. */
14982 /* Fall through. */
14983
14984 case R_PPC64_PLTGOT16:
14985 case R_PPC64_PLTGOT16_DS:
14986 case R_PPC64_PLTGOT16_HA:
14987 case R_PPC64_PLTGOT16_HI:
14988 case R_PPC64_PLTGOT16_LO:
14989 case R_PPC64_PLTGOT16_LO_DS:
14990 case R_PPC64_PLTREL32:
14991 case R_PPC64_PLTREL64:
14992 /* These ones haven't been implemented yet. */
14993
14994 info->callbacks->einfo
14995 /* xgettext:c-format */
14996 (_("%P: %B: %s is not supported for `%T'\n"),
14997 input_bfd,
14998 ppc64_elf_howto_table[r_type]->name, sym_name);
14999
15000 bfd_set_error (bfd_error_invalid_operation);
15001 ret = FALSE;
15002 goto copy_reloc;
15003 }
15004
15005 /* Multi-instruction sequences that access the TOC can be
15006 optimized, eg. addis ra,r2,0; addi rb,ra,x;
15007 to nop; addi rb,r2,x; */
15008 switch (r_type)
15009 {
15010 default:
15011 break;
15012
15013 case R_PPC64_GOT_TLSLD16_HI:
15014 case R_PPC64_GOT_TLSGD16_HI:
15015 case R_PPC64_GOT_TPREL16_HI:
15016 case R_PPC64_GOT_DTPREL16_HI:
15017 case R_PPC64_GOT16_HI:
15018 case R_PPC64_TOC16_HI:
15019 /* These relocs would only be useful if building up an
15020 offset to later add to r2, perhaps in an indexed
15021 addressing mode instruction. Don't try to optimize.
15022 Unfortunately, the possibility of someone building up an
15023 offset like this or even with the HA relocs, means that
15024 we need to check the high insn when optimizing the low
15025 insn. */
15026 break;
15027
15028 case R_PPC64_GOT_TLSLD16_HA:
15029 case R_PPC64_GOT_TLSGD16_HA:
15030 case R_PPC64_GOT_TPREL16_HA:
15031 case R_PPC64_GOT_DTPREL16_HA:
15032 case R_PPC64_GOT16_HA:
15033 case R_PPC64_TOC16_HA:
15034 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15035 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15036 {
15037 bfd_byte *p = contents + (rel->r_offset & ~3);
15038 bfd_put_32 (input_bfd, NOP, p);
15039 }
15040 break;
15041
15042 case R_PPC64_GOT_TLSLD16_LO:
15043 case R_PPC64_GOT_TLSGD16_LO:
15044 case R_PPC64_GOT_TPREL16_LO_DS:
15045 case R_PPC64_GOT_DTPREL16_LO_DS:
15046 case R_PPC64_GOT16_LO:
15047 case R_PPC64_GOT16_LO_DS:
15048 case R_PPC64_TOC16_LO:
15049 case R_PPC64_TOC16_LO_DS:
15050 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15051 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15052 {
15053 bfd_byte *p = contents + (rel->r_offset & ~3);
15054 insn = bfd_get_32 (input_bfd, p);
15055 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15056 {
15057 /* Transform addic to addi when we change reg. */
15058 insn &= ~((0x3f << 26) | (0x1f << 16));
15059 insn |= (14u << 26) | (2 << 16);
15060 }
15061 else
15062 {
15063 insn &= ~(0x1f << 16);
15064 insn |= 2 << 16;
15065 }
15066 bfd_put_32 (input_bfd, insn, p);
15067 }
15068 break;
15069 }
15070
15071 /* Do any further special processing. */
15072 howto = ppc64_elf_howto_table[(int) r_type];
15073 switch (r_type)
15074 {
15075 default:
15076 break;
15077
15078 case R_PPC64_REL16_HA:
15079 case R_PPC64_REL16DX_HA:
15080 case R_PPC64_ADDR16_HA:
15081 case R_PPC64_ADDR16_HIGHA:
15082 case R_PPC64_ADDR16_HIGHERA:
15083 case R_PPC64_ADDR16_HIGHESTA:
15084 case R_PPC64_TOC16_HA:
15085 case R_PPC64_SECTOFF_HA:
15086 case R_PPC64_TPREL16_HA:
15087 case R_PPC64_TPREL16_HIGHA:
15088 case R_PPC64_TPREL16_HIGHERA:
15089 case R_PPC64_TPREL16_HIGHESTA:
15090 case R_PPC64_DTPREL16_HA:
15091 case R_PPC64_DTPREL16_HIGHA:
15092 case R_PPC64_DTPREL16_HIGHERA:
15093 case R_PPC64_DTPREL16_HIGHESTA:
15094 /* It's just possible that this symbol is a weak symbol
15095 that's not actually defined anywhere. In that case,
15096 'sec' would be NULL, and we should leave the symbol
15097 alone (it will be set to zero elsewhere in the link). */
15098 if (sec == NULL)
15099 break;
15100 /* Fall through. */
15101
15102 case R_PPC64_GOT16_HA:
15103 case R_PPC64_PLTGOT16_HA:
15104 case R_PPC64_PLT16_HA:
15105 case R_PPC64_GOT_TLSGD16_HA:
15106 case R_PPC64_GOT_TLSLD16_HA:
15107 case R_PPC64_GOT_TPREL16_HA:
15108 case R_PPC64_GOT_DTPREL16_HA:
15109 /* Add 0x10000 if sign bit in 0:15 is set.
15110 Bits 0:15 are not used. */
15111 addend += 0x8000;
15112 break;
15113
15114 case R_PPC64_ADDR16_DS:
15115 case R_PPC64_ADDR16_LO_DS:
15116 case R_PPC64_GOT16_DS:
15117 case R_PPC64_GOT16_LO_DS:
15118 case R_PPC64_PLT16_LO_DS:
15119 case R_PPC64_SECTOFF_DS:
15120 case R_PPC64_SECTOFF_LO_DS:
15121 case R_PPC64_TOC16_DS:
15122 case R_PPC64_TOC16_LO_DS:
15123 case R_PPC64_PLTGOT16_DS:
15124 case R_PPC64_PLTGOT16_LO_DS:
15125 case R_PPC64_GOT_TPREL16_DS:
15126 case R_PPC64_GOT_TPREL16_LO_DS:
15127 case R_PPC64_GOT_DTPREL16_DS:
15128 case R_PPC64_GOT_DTPREL16_LO_DS:
15129 case R_PPC64_TPREL16_DS:
15130 case R_PPC64_TPREL16_LO_DS:
15131 case R_PPC64_DTPREL16_DS:
15132 case R_PPC64_DTPREL16_LO_DS:
15133 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15134 mask = 3;
15135 /* If this reloc is against an lq, lxv, or stxv insn, then
15136 the value must be a multiple of 16. This is somewhat of
15137 a hack, but the "correct" way to do this by defining _DQ
15138 forms of all the _DS relocs bloats all reloc switches in
15139 this file. It doesn't make much sense to use these
15140 relocs in data, so testing the insn should be safe. */
15141 if ((insn & (0x3f << 26)) == (56u << 26)
15142 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
15143 mask = 15;
15144 relocation += addend;
15145 addend = insn & (mask ^ 3);
15146 if ((relocation & mask) != 0)
15147 {
15148 relocation ^= relocation & mask;
15149 info->callbacks->einfo
15150 /* xgettext:c-format */
15151 (_("%P: %H: error: %s not a multiple of %u\n"),
15152 input_bfd, input_section, rel->r_offset,
15153 howto->name,
15154 mask + 1);
15155 bfd_set_error (bfd_error_bad_value);
15156 ret = FALSE;
15157 goto copy_reloc;
15158 }
15159 break;
15160 }
15161
15162 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15163 because such sections are not SEC_ALLOC and thus ld.so will
15164 not process them. */
15165 if (unresolved_reloc
15166 && !((input_section->flags & SEC_DEBUGGING) != 0
15167 && h->elf.def_dynamic)
15168 && _bfd_elf_section_offset (output_bfd, info, input_section,
15169 rel->r_offset) != (bfd_vma) -1)
15170 {
15171 info->callbacks->einfo
15172 /* xgettext:c-format */
15173 (_("%P: %H: unresolvable %s against `%T'\n"),
15174 input_bfd, input_section, rel->r_offset,
15175 howto->name,
15176 h->elf.root.root.string);
15177 ret = FALSE;
15178 }
15179
15180 /* 16-bit fields in insns mostly have signed values, but a
15181 few insns have 16-bit unsigned values. Really, we should
15182 have different reloc types. */
15183 if (howto->complain_on_overflow != complain_overflow_dont
15184 && howto->dst_mask == 0xffff
15185 && (input_section->flags & SEC_CODE) != 0)
15186 {
15187 enum complain_overflow complain = complain_overflow_signed;
15188
15189 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15190 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15191 complain = complain_overflow_bitfield;
15192 else if (howto->rightshift == 0
15193 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15194 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15195 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15196 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15197 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15198 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
15199 complain = complain_overflow_unsigned;
15200 if (howto->complain_on_overflow != complain)
15201 {
15202 alt_howto = *howto;
15203 alt_howto.complain_on_overflow = complain;
15204 howto = &alt_howto;
15205 }
15206 }
15207
15208 if (r_type == R_PPC64_REL16DX_HA)
15209 {
15210 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15211 if (rel->r_offset + 4 > input_section->size)
15212 r = bfd_reloc_outofrange;
15213 else
15214 {
15215 relocation += addend;
15216 relocation -= (rel->r_offset
15217 + input_section->output_offset
15218 + input_section->output_section->vma);
15219 relocation = (bfd_signed_vma) relocation >> 16;
15220 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15221 insn &= ~0x1fffc1;
15222 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
15223 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15224 r = bfd_reloc_ok;
15225 if (relocation + 0x8000 > 0xffff)
15226 r = bfd_reloc_overflow;
15227 }
15228 }
15229 else
15230 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15231 rel->r_offset, relocation, addend);
15232
15233 if (r != bfd_reloc_ok)
15234 {
15235 char *more_info = NULL;
15236 const char *reloc_name = howto->name;
15237
15238 if (reloc_dest != DEST_NORMAL)
15239 {
15240 more_info = bfd_malloc (strlen (reloc_name) + 8);
15241 if (more_info != NULL)
15242 {
15243 strcpy (more_info, reloc_name);
15244 strcat (more_info, (reloc_dest == DEST_OPD
15245 ? " (OPD)" : " (stub)"));
15246 reloc_name = more_info;
15247 }
15248 }
15249
15250 if (r == bfd_reloc_overflow)
15251 {
15252 /* On code like "if (foo) foo();" don't report overflow
15253 on a branch to zero when foo is undefined. */
15254 if (!warned
15255 && (reloc_dest == DEST_STUB
15256 || !(h != NULL
15257 && (h->elf.root.type == bfd_link_hash_undefweak
15258 || h->elf.root.type == bfd_link_hash_undefined)
15259 && is_branch_reloc (r_type))))
15260 info->callbacks->reloc_overflow (info, &h->elf.root,
15261 sym_name, reloc_name,
15262 orig_rel.r_addend,
15263 input_bfd, input_section,
15264 rel->r_offset);
15265 }
15266 else
15267 {
15268 info->callbacks->einfo
15269 /* xgettext:c-format */
15270 (_("%P: %H: %s against `%T': error %d\n"),
15271 input_bfd, input_section, rel->r_offset,
15272 reloc_name, sym_name, (int) r);
15273 ret = FALSE;
15274 }
15275 if (more_info != NULL)
15276 free (more_info);
15277 }
15278 copy_reloc:
15279 if (wrel != rel)
15280 *wrel = *rel;
15281 }
15282
15283 if (wrel != rel)
15284 {
15285 Elf_Internal_Shdr *rel_hdr;
15286 size_t deleted = rel - wrel;
15287
15288 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15289 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15290 if (rel_hdr->sh_size == 0)
15291 {
15292 /* It is too late to remove an empty reloc section. Leave
15293 one NONE reloc.
15294 ??? What is wrong with an empty section??? */
15295 rel_hdr->sh_size = rel_hdr->sh_entsize;
15296 deleted -= 1;
15297 }
15298 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15299 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15300 input_section->reloc_count -= deleted;
15301 }
15302
15303 /* If we're emitting relocations, then shortly after this function
15304 returns, reloc offsets and addends for this section will be
15305 adjusted. Worse, reloc symbol indices will be for the output
15306 file rather than the input. Save a copy of the relocs for
15307 opd_entry_value. */
15308 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
15309 {
15310 bfd_size_type amt;
15311 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15312 rel = bfd_alloc (input_bfd, amt);
15313 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15314 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
15315 if (rel == NULL)
15316 return FALSE;
15317 memcpy (rel, relocs, amt);
15318 }
15319 return ret;
15320 }
15321
15322 /* Adjust the value of any local symbols in opd sections. */
15323
15324 static int
15325 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
15326 const char *name ATTRIBUTE_UNUSED,
15327 Elf_Internal_Sym *elfsym,
15328 asection *input_sec,
15329 struct elf_link_hash_entry *h)
15330 {
15331 struct _opd_sec_data *opd;
15332 long adjust;
15333 bfd_vma value;
15334
15335 if (h != NULL)
15336 return 1;
15337
15338 opd = get_opd_info (input_sec);
15339 if (opd == NULL || opd->adjust == NULL)
15340 return 1;
15341
15342 value = elfsym->st_value - input_sec->output_offset;
15343 if (!bfd_link_relocatable (info))
15344 value -= input_sec->output_section->vma;
15345
15346 adjust = opd->adjust[OPD_NDX (value)];
15347 if (adjust == -1)
15348 return 2;
15349
15350 elfsym->st_value += adjust;
15351 return 1;
15352 }
15353
15354 /* Finish up dynamic symbol handling. We set the contents of various
15355 dynamic sections here. */
15356
15357 static bfd_boolean
15358 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
15359 struct bfd_link_info *info,
15360 struct elf_link_hash_entry *h,
15361 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
15362 {
15363 struct ppc_link_hash_table *htab;
15364 struct plt_entry *ent;
15365 Elf_Internal_Rela rela;
15366 bfd_byte *loc;
15367
15368 htab = ppc_hash_table (info);
15369 if (htab == NULL)
15370 return FALSE;
15371
15372 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
15373 if (ent->plt.offset != (bfd_vma) -1)
15374 {
15375 /* This symbol has an entry in the procedure linkage
15376 table. Set it up. */
15377 if (!htab->elf.dynamic_sections_created
15378 || h->dynindx == -1)
15379 {
15380 BFD_ASSERT (h->type == STT_GNU_IFUNC
15381 && h->def_regular
15382 && (h->root.type == bfd_link_hash_defined
15383 || h->root.type == bfd_link_hash_defweak));
15384 rela.r_offset = (htab->elf.iplt->output_section->vma
15385 + htab->elf.iplt->output_offset
15386 + ent->plt.offset);
15387 if (htab->opd_abi)
15388 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
15389 else
15390 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15391 rela.r_addend = (h->root.u.def.value
15392 + h->root.u.def.section->output_offset
15393 + h->root.u.def.section->output_section->vma
15394 + ent->addend);
15395 loc = (htab->elf.irelplt->contents
15396 + (htab->elf.irelplt->reloc_count++
15397 * sizeof (Elf64_External_Rela)));
15398 }
15399 else
15400 {
15401 rela.r_offset = (htab->elf.splt->output_section->vma
15402 + htab->elf.splt->output_offset
15403 + ent->plt.offset);
15404 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
15405 rela.r_addend = ent->addend;
15406 loc = (htab->elf.srelplt->contents
15407 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
15408 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
15409 }
15410 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15411
15412 if (!htab->opd_abi)
15413 {
15414 if (!h->def_regular)
15415 {
15416 /* Mark the symbol as undefined, rather than as
15417 defined in glink. Leave the value if there were
15418 any relocations where pointer equality matters
15419 (this is a clue for the dynamic linker, to make
15420 function pointer comparisons work between an
15421 application and shared library), otherwise set it
15422 to zero. */
15423 sym->st_shndx = SHN_UNDEF;
15424 if (!h->pointer_equality_needed)
15425 sym->st_value = 0;
15426 else if (!h->ref_regular_nonweak)
15427 {
15428 /* This breaks function pointer comparisons, but
15429 that is better than breaking tests for a NULL
15430 function pointer. */
15431 sym->st_value = 0;
15432 }
15433 }
15434 }
15435 }
15436
15437 if (h->needs_copy)
15438 {
15439 /* This symbol needs a copy reloc. Set it up. */
15440
15441 if (h->dynindx == -1
15442 || (h->root.type != bfd_link_hash_defined
15443 && h->root.type != bfd_link_hash_defweak)
15444 || htab->relbss == NULL)
15445 abort ();
15446
15447 rela.r_offset = (h->root.u.def.value
15448 + h->root.u.def.section->output_section->vma
15449 + h->root.u.def.section->output_offset);
15450 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
15451 rela.r_addend = 0;
15452 loc = htab->relbss->contents;
15453 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
15454 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15455 }
15456
15457 return TRUE;
15458 }
15459
15460 /* Used to decide how to sort relocs in an optimal manner for the
15461 dynamic linker, before writing them out. */
15462
15463 static enum elf_reloc_type_class
15464 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
15465 const asection *rel_sec,
15466 const Elf_Internal_Rela *rela)
15467 {
15468 enum elf_ppc64_reloc_type r_type;
15469 struct ppc_link_hash_table *htab = ppc_hash_table (info);
15470
15471 if (rel_sec == htab->elf.irelplt)
15472 return reloc_class_ifunc;
15473
15474 r_type = ELF64_R_TYPE (rela->r_info);
15475 switch (r_type)
15476 {
15477 case R_PPC64_RELATIVE:
15478 return reloc_class_relative;
15479 case R_PPC64_JMP_SLOT:
15480 return reloc_class_plt;
15481 case R_PPC64_COPY:
15482 return reloc_class_copy;
15483 default:
15484 return reloc_class_normal;
15485 }
15486 }
15487
15488 /* Finish up the dynamic sections. */
15489
15490 static bfd_boolean
15491 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
15492 struct bfd_link_info *info)
15493 {
15494 struct ppc_link_hash_table *htab;
15495 bfd *dynobj;
15496 asection *sdyn;
15497
15498 htab = ppc_hash_table (info);
15499 if (htab == NULL)
15500 return FALSE;
15501
15502 dynobj = htab->elf.dynobj;
15503 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
15504
15505 if (htab->elf.dynamic_sections_created)
15506 {
15507 Elf64_External_Dyn *dyncon, *dynconend;
15508
15509 if (sdyn == NULL || htab->elf.sgot == NULL)
15510 abort ();
15511
15512 dyncon = (Elf64_External_Dyn *) sdyn->contents;
15513 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
15514 for (; dyncon < dynconend; dyncon++)
15515 {
15516 Elf_Internal_Dyn dyn;
15517 asection *s;
15518
15519 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
15520
15521 switch (dyn.d_tag)
15522 {
15523 default:
15524 continue;
15525
15526 case DT_PPC64_GLINK:
15527 s = htab->glink;
15528 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15529 /* We stupidly defined DT_PPC64_GLINK to be the start
15530 of glink rather than the first entry point, which is
15531 what ld.so needs, and now have a bigger stub to
15532 support automatic multiple TOCs. */
15533 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
15534 break;
15535
15536 case DT_PPC64_OPD:
15537 s = bfd_get_section_by_name (output_bfd, ".opd");
15538 if (s == NULL)
15539 continue;
15540 dyn.d_un.d_ptr = s->vma;
15541 break;
15542
15543 case DT_PPC64_OPT:
15544 if (htab->do_multi_toc && htab->multi_toc_needed)
15545 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
15546 break;
15547
15548 case DT_PPC64_OPDSZ:
15549 s = bfd_get_section_by_name (output_bfd, ".opd");
15550 if (s == NULL)
15551 continue;
15552 dyn.d_un.d_val = s->size;
15553 break;
15554
15555 case DT_PLTGOT:
15556 s = htab->elf.splt;
15557 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15558 break;
15559
15560 case DT_JMPREL:
15561 s = htab->elf.srelplt;
15562 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15563 break;
15564
15565 case DT_PLTRELSZ:
15566 dyn.d_un.d_val = htab->elf.srelplt->size;
15567 break;
15568 }
15569
15570 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
15571 }
15572 }
15573
15574 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
15575 {
15576 /* Fill in the first entry in the global offset table.
15577 We use it to hold the link-time TOCbase. */
15578 bfd_put_64 (output_bfd,
15579 elf_gp (output_bfd) + TOC_BASE_OFF,
15580 htab->elf.sgot->contents);
15581
15582 /* Set .got entry size. */
15583 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
15584 }
15585
15586 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
15587 {
15588 /* Set .plt entry size. */
15589 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
15590 = PLT_ENTRY_SIZE (htab);
15591 }
15592
15593 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15594 brlt ourselves if emitrelocations. */
15595 if (htab->brlt != NULL
15596 && htab->brlt->reloc_count != 0
15597 && !_bfd_elf_link_output_relocs (output_bfd,
15598 htab->brlt,
15599 elf_section_data (htab->brlt)->rela.hdr,
15600 elf_section_data (htab->brlt)->relocs,
15601 NULL))
15602 return FALSE;
15603
15604 if (htab->glink != NULL
15605 && htab->glink->reloc_count != 0
15606 && !_bfd_elf_link_output_relocs (output_bfd,
15607 htab->glink,
15608 elf_section_data (htab->glink)->rela.hdr,
15609 elf_section_data (htab->glink)->relocs,
15610 NULL))
15611 return FALSE;
15612
15613 if (htab->glink_eh_frame != NULL
15614 && htab->glink_eh_frame->size != 0)
15615 {
15616 bfd_vma val;
15617 bfd_byte *p;
15618 asection *stub_sec;
15619
15620 p = htab->glink_eh_frame->contents + sizeof (glink_eh_frame_cie);
15621 for (stub_sec = htab->params->stub_bfd->sections;
15622 stub_sec != NULL;
15623 stub_sec = stub_sec->next)
15624 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
15625 {
15626 /* FDE length. */
15627 p += 4;
15628 /* CIE pointer. */
15629 p += 4;
15630 /* Offset to stub section. */
15631 val = (stub_sec->output_section->vma
15632 + stub_sec->output_offset);
15633 val -= (htab->glink_eh_frame->output_section->vma
15634 + htab->glink_eh_frame->output_offset
15635 + (p - htab->glink_eh_frame->contents));
15636 if (val + 0x80000000 > 0xffffffff)
15637 {
15638 info->callbacks->einfo
15639 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15640 stub_sec->name);
15641 return FALSE;
15642 }
15643 bfd_put_32 (dynobj, val, p);
15644 p += 4;
15645 /* stub section size. */
15646 p += 4;
15647 /* Augmentation. */
15648 p += 1;
15649 /* Pad. */
15650 p += 7;
15651 }
15652 if (htab->glink != NULL && htab->glink->size != 0)
15653 {
15654 /* FDE length. */
15655 p += 4;
15656 /* CIE pointer. */
15657 p += 4;
15658 /* Offset to .glink. */
15659 val = (htab->glink->output_section->vma
15660 + htab->glink->output_offset
15661 + 8);
15662 val -= (htab->glink_eh_frame->output_section->vma
15663 + htab->glink_eh_frame->output_offset
15664 + (p - htab->glink_eh_frame->contents));
15665 if (val + 0x80000000 > 0xffffffff)
15666 {
15667 info->callbacks->einfo
15668 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15669 htab->glink->name);
15670 return FALSE;
15671 }
15672 bfd_put_32 (dynobj, val, p);
15673 p += 4;
15674 /* .glink size. */
15675 p += 4;
15676 /* Augmentation. */
15677 p += 1;
15678 /* Ops. */
15679 p += 7;
15680 }
15681
15682 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
15683 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15684 htab->glink_eh_frame,
15685 htab->glink_eh_frame->contents))
15686 return FALSE;
15687 }
15688
15689 /* We need to handle writing out multiple GOT sections ourselves,
15690 since we didn't add them to DYNOBJ. We know dynobj is the first
15691 bfd. */
15692 while ((dynobj = dynobj->link.next) != NULL)
15693 {
15694 asection *s;
15695
15696 if (!is_ppc64_elf (dynobj))
15697 continue;
15698
15699 s = ppc64_elf_tdata (dynobj)->got;
15700 if (s != NULL
15701 && s->size != 0
15702 && s->output_section != bfd_abs_section_ptr
15703 && !bfd_set_section_contents (output_bfd, s->output_section,
15704 s->contents, s->output_offset,
15705 s->size))
15706 return FALSE;
15707 s = ppc64_elf_tdata (dynobj)->relgot;
15708 if (s != NULL
15709 && s->size != 0
15710 && s->output_section != bfd_abs_section_ptr
15711 && !bfd_set_section_contents (output_bfd, s->output_section,
15712 s->contents, s->output_offset,
15713 s->size))
15714 return FALSE;
15715 }
15716
15717 return TRUE;
15718 }
15719
15720 #include "elf64-target.h"
15721
15722 /* FreeBSD support */
15723
15724 #undef TARGET_LITTLE_SYM
15725 #undef TARGET_LITTLE_NAME
15726
15727 #undef TARGET_BIG_SYM
15728 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
15729 #undef TARGET_BIG_NAME
15730 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15731
15732 #undef ELF_OSABI
15733 #define ELF_OSABI ELFOSABI_FREEBSD
15734
15735 #undef elf64_bed
15736 #define elf64_bed elf64_powerpc_fbsd_bed
15737
15738 #include "elf64-target.h"
15739
This page took 0.472733 seconds and 5 git commands to generate.