Put .dynbss and .rel.bss shortcuts in main elf hash table
[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 _bfd_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 *glink;
4057 asection *sfpr;
4058 asection *brlt;
4059 asection *relbrlt;
4060 asection *glink_eh_frame;
4061
4062 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4063 struct ppc_link_hash_entry *tls_get_addr;
4064 struct ppc_link_hash_entry *tls_get_addr_fd;
4065
4066 /* The size of reliplt used by got entry relocs. */
4067 bfd_size_type got_reli_size;
4068
4069 /* Statistics. */
4070 unsigned long stub_count[ppc_stub_global_entry];
4071
4072 /* Number of stubs against global syms. */
4073 unsigned long stub_globals;
4074
4075 /* Set if we're linking code with function descriptors. */
4076 unsigned int opd_abi:1;
4077
4078 /* Support for multiple toc sections. */
4079 unsigned int do_multi_toc:1;
4080 unsigned int multi_toc_needed:1;
4081 unsigned int second_toc_pass:1;
4082 unsigned int do_toc_opt:1;
4083
4084 /* Set on error. */
4085 unsigned int stub_error:1;
4086
4087 /* Whether func_desc_adjust needs to be run over symbols. */
4088 unsigned int need_func_desc_adj:1;
4089
4090 /* Incremented every time we size stubs. */
4091 unsigned int stub_iteration;
4092
4093 /* Small local sym cache. */
4094 struct sym_cache sym_cache;
4095 };
4096
4097 /* Rename some of the generic section flags to better document how they
4098 are used here. */
4099
4100 /* Nonzero if this section has TLS related relocations. */
4101 #define has_tls_reloc sec_flg0
4102
4103 /* Nonzero if this section has a call to __tls_get_addr. */
4104 #define has_tls_get_addr_call sec_flg1
4105
4106 /* Nonzero if this section has any toc or got relocs. */
4107 #define has_toc_reloc sec_flg2
4108
4109 /* Nonzero if this section has a call to another section that uses
4110 the toc or got. */
4111 #define makes_toc_func_call sec_flg3
4112
4113 /* Recursion protection when determining above flag. */
4114 #define call_check_in_progress sec_flg4
4115 #define call_check_done sec_flg5
4116
4117 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4118
4119 #define ppc_hash_table(p) \
4120 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4121 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4122
4123 #define ppc_stub_hash_lookup(table, string, create, copy) \
4124 ((struct ppc_stub_hash_entry *) \
4125 bfd_hash_lookup ((table), (string), (create), (copy)))
4126
4127 #define ppc_branch_hash_lookup(table, string, create, copy) \
4128 ((struct ppc_branch_hash_entry *) \
4129 bfd_hash_lookup ((table), (string), (create), (copy)))
4130
4131 /* Create an entry in the stub hash table. */
4132
4133 static struct bfd_hash_entry *
4134 stub_hash_newfunc (struct bfd_hash_entry *entry,
4135 struct bfd_hash_table *table,
4136 const char *string)
4137 {
4138 /* Allocate the structure if it has not already been allocated by a
4139 subclass. */
4140 if (entry == NULL)
4141 {
4142 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4143 if (entry == NULL)
4144 return entry;
4145 }
4146
4147 /* Call the allocation method of the superclass. */
4148 entry = bfd_hash_newfunc (entry, table, string);
4149 if (entry != NULL)
4150 {
4151 struct ppc_stub_hash_entry *eh;
4152
4153 /* Initialize the local fields. */
4154 eh = (struct ppc_stub_hash_entry *) entry;
4155 eh->stub_type = ppc_stub_none;
4156 eh->group = NULL;
4157 eh->stub_offset = 0;
4158 eh->target_value = 0;
4159 eh->target_section = NULL;
4160 eh->h = NULL;
4161 eh->plt_ent = NULL;
4162 eh->other = 0;
4163 }
4164
4165 return entry;
4166 }
4167
4168 /* Create an entry in the branch hash table. */
4169
4170 static struct bfd_hash_entry *
4171 branch_hash_newfunc (struct bfd_hash_entry *entry,
4172 struct bfd_hash_table *table,
4173 const char *string)
4174 {
4175 /* Allocate the structure if it has not already been allocated by a
4176 subclass. */
4177 if (entry == NULL)
4178 {
4179 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4180 if (entry == NULL)
4181 return entry;
4182 }
4183
4184 /* Call the allocation method of the superclass. */
4185 entry = bfd_hash_newfunc (entry, table, string);
4186 if (entry != NULL)
4187 {
4188 struct ppc_branch_hash_entry *eh;
4189
4190 /* Initialize the local fields. */
4191 eh = (struct ppc_branch_hash_entry *) entry;
4192 eh->offset = 0;
4193 eh->iter = 0;
4194 }
4195
4196 return entry;
4197 }
4198
4199 /* Create an entry in a ppc64 ELF linker hash table. */
4200
4201 static struct bfd_hash_entry *
4202 link_hash_newfunc (struct bfd_hash_entry *entry,
4203 struct bfd_hash_table *table,
4204 const char *string)
4205 {
4206 /* Allocate the structure if it has not already been allocated by a
4207 subclass. */
4208 if (entry == NULL)
4209 {
4210 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4211 if (entry == NULL)
4212 return entry;
4213 }
4214
4215 /* Call the allocation method of the superclass. */
4216 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4217 if (entry != NULL)
4218 {
4219 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4220
4221 memset (&eh->u.stub_cache, 0,
4222 (sizeof (struct ppc_link_hash_entry)
4223 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4224
4225 /* When making function calls, old ABI code references function entry
4226 points (dot symbols), while new ABI code references the function
4227 descriptor symbol. We need to make any combination of reference and
4228 definition work together, without breaking archive linking.
4229
4230 For a defined function "foo" and an undefined call to "bar":
4231 An old object defines "foo" and ".foo", references ".bar" (possibly
4232 "bar" too).
4233 A new object defines "foo" and references "bar".
4234
4235 A new object thus has no problem with its undefined symbols being
4236 satisfied by definitions in an old object. On the other hand, the
4237 old object won't have ".bar" satisfied by a new object.
4238
4239 Keep a list of newly added dot-symbols. */
4240
4241 if (string[0] == '.')
4242 {
4243 struct ppc_link_hash_table *htab;
4244
4245 htab = (struct ppc_link_hash_table *) table;
4246 eh->u.next_dot_sym = htab->dot_syms;
4247 htab->dot_syms = eh;
4248 }
4249 }
4250
4251 return entry;
4252 }
4253
4254 struct tocsave_entry {
4255 asection *sec;
4256 bfd_vma offset;
4257 };
4258
4259 static hashval_t
4260 tocsave_htab_hash (const void *p)
4261 {
4262 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4263 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4264 }
4265
4266 static int
4267 tocsave_htab_eq (const void *p1, const void *p2)
4268 {
4269 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4270 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4271 return e1->sec == e2->sec && e1->offset == e2->offset;
4272 }
4273
4274 /* Destroy a ppc64 ELF linker hash table. */
4275
4276 static void
4277 ppc64_elf_link_hash_table_free (bfd *obfd)
4278 {
4279 struct ppc_link_hash_table *htab;
4280
4281 htab = (struct ppc_link_hash_table *) obfd->link.hash;
4282 if (htab->tocsave_htab)
4283 htab_delete (htab->tocsave_htab);
4284 bfd_hash_table_free (&htab->branch_hash_table);
4285 bfd_hash_table_free (&htab->stub_hash_table);
4286 _bfd_elf_link_hash_table_free (obfd);
4287 }
4288
4289 /* Create a ppc64 ELF linker hash table. */
4290
4291 static struct bfd_link_hash_table *
4292 ppc64_elf_link_hash_table_create (bfd *abfd)
4293 {
4294 struct ppc_link_hash_table *htab;
4295 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4296
4297 htab = bfd_zmalloc (amt);
4298 if (htab == NULL)
4299 return NULL;
4300
4301 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4302 sizeof (struct ppc_link_hash_entry),
4303 PPC64_ELF_DATA))
4304 {
4305 free (htab);
4306 return NULL;
4307 }
4308
4309 /* Init the stub hash table too. */
4310 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4311 sizeof (struct ppc_stub_hash_entry)))
4312 {
4313 _bfd_elf_link_hash_table_free (abfd);
4314 return NULL;
4315 }
4316
4317 /* And the branch hash table. */
4318 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4319 sizeof (struct ppc_branch_hash_entry)))
4320 {
4321 bfd_hash_table_free (&htab->stub_hash_table);
4322 _bfd_elf_link_hash_table_free (abfd);
4323 return NULL;
4324 }
4325
4326 htab->tocsave_htab = htab_try_create (1024,
4327 tocsave_htab_hash,
4328 tocsave_htab_eq,
4329 NULL);
4330 if (htab->tocsave_htab == NULL)
4331 {
4332 ppc64_elf_link_hash_table_free (abfd);
4333 return NULL;
4334 }
4335 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
4336
4337 /* Initializing two fields of the union is just cosmetic. We really
4338 only care about glist, but when compiled on a 32-bit host the
4339 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4340 debugger inspection of these fields look nicer. */
4341 htab->elf.init_got_refcount.refcount = 0;
4342 htab->elf.init_got_refcount.glist = NULL;
4343 htab->elf.init_plt_refcount.refcount = 0;
4344 htab->elf.init_plt_refcount.glist = NULL;
4345 htab->elf.init_got_offset.offset = 0;
4346 htab->elf.init_got_offset.glist = NULL;
4347 htab->elf.init_plt_offset.offset = 0;
4348 htab->elf.init_plt_offset.glist = NULL;
4349
4350 return &htab->elf.root;
4351 }
4352
4353 /* Create sections for linker generated code. */
4354
4355 static bfd_boolean
4356 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4357 {
4358 struct ppc_link_hash_table *htab;
4359 flagword flags;
4360
4361 htab = ppc_hash_table (info);
4362
4363 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4364 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4365 if (htab->params->save_restore_funcs)
4366 {
4367 /* Create .sfpr for code to save and restore fp regs. */
4368 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4369 flags);
4370 if (htab->sfpr == NULL
4371 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4372 return FALSE;
4373 }
4374
4375 if (bfd_link_relocatable (info))
4376 return TRUE;
4377
4378 /* Create .glink for lazy dynamic linking support. */
4379 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4380 flags);
4381 if (htab->glink == NULL
4382 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4383 return FALSE;
4384
4385 if (!info->no_ld_generated_unwind_info)
4386 {
4387 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4388 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4389 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4390 ".eh_frame",
4391 flags);
4392 if (htab->glink_eh_frame == NULL
4393 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4394 return FALSE;
4395 }
4396
4397 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4398 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4399 if (htab->elf.iplt == NULL
4400 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4401 return FALSE;
4402
4403 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4404 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4405 htab->elf.irelplt
4406 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4407 if (htab->elf.irelplt == NULL
4408 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4409 return FALSE;
4410
4411 /* Create branch lookup table for plt_branch stubs. */
4412 flags = (SEC_ALLOC | SEC_LOAD
4413 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4414 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4415 flags);
4416 if (htab->brlt == NULL
4417 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4418 return FALSE;
4419
4420 if (!bfd_link_pic (info))
4421 return TRUE;
4422
4423 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4424 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4425 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4426 ".rela.branch_lt",
4427 flags);
4428 if (htab->relbrlt == NULL
4429 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4430 return FALSE;
4431
4432 return TRUE;
4433 }
4434
4435 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4436
4437 bfd_boolean
4438 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4439 struct ppc64_elf_params *params)
4440 {
4441 struct ppc_link_hash_table *htab;
4442
4443 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4444
4445 /* Always hook our dynamic sections into the first bfd, which is the
4446 linker created stub bfd. This ensures that the GOT header is at
4447 the start of the output TOC section. */
4448 htab = ppc_hash_table (info);
4449 htab->elf.dynobj = params->stub_bfd;
4450 htab->params = params;
4451
4452 return create_linkage_sections (htab->elf.dynobj, info);
4453 }
4454
4455 /* Build a name for an entry in the stub hash table. */
4456
4457 static char *
4458 ppc_stub_name (const asection *input_section,
4459 const asection *sym_sec,
4460 const struct ppc_link_hash_entry *h,
4461 const Elf_Internal_Rela *rel)
4462 {
4463 char *stub_name;
4464 ssize_t len;
4465
4466 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4467 offsets from a sym as a branch target? In fact, we could
4468 probably assume the addend is always zero. */
4469 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4470
4471 if (h)
4472 {
4473 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4474 stub_name = bfd_malloc (len);
4475 if (stub_name == NULL)
4476 return stub_name;
4477
4478 len = sprintf (stub_name, "%08x.%s+%x",
4479 input_section->id & 0xffffffff,
4480 h->elf.root.root.string,
4481 (int) rel->r_addend & 0xffffffff);
4482 }
4483 else
4484 {
4485 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4486 stub_name = bfd_malloc (len);
4487 if (stub_name == NULL)
4488 return stub_name;
4489
4490 len = sprintf (stub_name, "%08x.%x:%x+%x",
4491 input_section->id & 0xffffffff,
4492 sym_sec->id & 0xffffffff,
4493 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4494 (int) rel->r_addend & 0xffffffff);
4495 }
4496 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4497 stub_name[len - 2] = 0;
4498 return stub_name;
4499 }
4500
4501 /* Look up an entry in the stub hash. Stub entries are cached because
4502 creating the stub name takes a bit of time. */
4503
4504 static struct ppc_stub_hash_entry *
4505 ppc_get_stub_entry (const asection *input_section,
4506 const asection *sym_sec,
4507 struct ppc_link_hash_entry *h,
4508 const Elf_Internal_Rela *rel,
4509 struct ppc_link_hash_table *htab)
4510 {
4511 struct ppc_stub_hash_entry *stub_entry;
4512 struct map_stub *group;
4513
4514 /* If this input section is part of a group of sections sharing one
4515 stub section, then use the id of the first section in the group.
4516 Stub names need to include a section id, as there may well be
4517 more than one stub used to reach say, printf, and we need to
4518 distinguish between them. */
4519 group = htab->sec_info[input_section->id].u.group;
4520 if (group == NULL)
4521 return NULL;
4522
4523 if (h != NULL && h->u.stub_cache != NULL
4524 && h->u.stub_cache->h == h
4525 && h->u.stub_cache->group == group)
4526 {
4527 stub_entry = h->u.stub_cache;
4528 }
4529 else
4530 {
4531 char *stub_name;
4532
4533 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
4534 if (stub_name == NULL)
4535 return NULL;
4536
4537 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4538 stub_name, FALSE, FALSE);
4539 if (h != NULL)
4540 h->u.stub_cache = stub_entry;
4541
4542 free (stub_name);
4543 }
4544
4545 return stub_entry;
4546 }
4547
4548 /* Add a new stub entry to the stub hash. Not all fields of the new
4549 stub entry are initialised. */
4550
4551 static struct ppc_stub_hash_entry *
4552 ppc_add_stub (const char *stub_name,
4553 asection *section,
4554 struct bfd_link_info *info)
4555 {
4556 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4557 struct map_stub *group;
4558 asection *link_sec;
4559 asection *stub_sec;
4560 struct ppc_stub_hash_entry *stub_entry;
4561
4562 group = htab->sec_info[section->id].u.group;
4563 link_sec = group->link_sec;
4564 stub_sec = group->stub_sec;
4565 if (stub_sec == NULL)
4566 {
4567 size_t namelen;
4568 bfd_size_type len;
4569 char *s_name;
4570
4571 namelen = strlen (link_sec->name);
4572 len = namelen + sizeof (STUB_SUFFIX);
4573 s_name = bfd_alloc (htab->params->stub_bfd, len);
4574 if (s_name == NULL)
4575 return NULL;
4576
4577 memcpy (s_name, link_sec->name, namelen);
4578 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4579 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4580 if (stub_sec == NULL)
4581 return NULL;
4582 group->stub_sec = stub_sec;
4583 }
4584
4585 /* Enter this entry into the linker stub hash table. */
4586 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4587 TRUE, FALSE);
4588 if (stub_entry == NULL)
4589 {
4590 /* xgettext:c-format */
4591 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4592 section->owner, stub_name);
4593 return NULL;
4594 }
4595
4596 stub_entry->group = group;
4597 stub_entry->stub_offset = 0;
4598 return stub_entry;
4599 }
4600
4601 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4602 not already done. */
4603
4604 static bfd_boolean
4605 create_got_section (bfd *abfd, struct bfd_link_info *info)
4606 {
4607 asection *got, *relgot;
4608 flagword flags;
4609 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4610
4611 if (!is_ppc64_elf (abfd))
4612 return FALSE;
4613 if (htab == NULL)
4614 return FALSE;
4615
4616 if (!htab->elf.sgot
4617 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4618 return FALSE;
4619
4620 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4621 | SEC_LINKER_CREATED);
4622
4623 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4624 if (!got
4625 || !bfd_set_section_alignment (abfd, got, 3))
4626 return FALSE;
4627
4628 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4629 flags | SEC_READONLY);
4630 if (!relgot
4631 || ! bfd_set_section_alignment (abfd, relgot, 3))
4632 return FALSE;
4633
4634 ppc64_elf_tdata (abfd)->got = got;
4635 ppc64_elf_tdata (abfd)->relgot = relgot;
4636 return TRUE;
4637 }
4638
4639 /* Follow indirect and warning symbol links. */
4640
4641 static inline struct bfd_link_hash_entry *
4642 follow_link (struct bfd_link_hash_entry *h)
4643 {
4644 while (h->type == bfd_link_hash_indirect
4645 || h->type == bfd_link_hash_warning)
4646 h = h->u.i.link;
4647 return h;
4648 }
4649
4650 static inline struct elf_link_hash_entry *
4651 elf_follow_link (struct elf_link_hash_entry *h)
4652 {
4653 return (struct elf_link_hash_entry *) follow_link (&h->root);
4654 }
4655
4656 static inline struct ppc_link_hash_entry *
4657 ppc_follow_link (struct ppc_link_hash_entry *h)
4658 {
4659 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4660 }
4661
4662 /* Merge PLT info on FROM with that on TO. */
4663
4664 static void
4665 move_plt_plist (struct ppc_link_hash_entry *from,
4666 struct ppc_link_hash_entry *to)
4667 {
4668 if (from->elf.plt.plist != NULL)
4669 {
4670 if (to->elf.plt.plist != NULL)
4671 {
4672 struct plt_entry **entp;
4673 struct plt_entry *ent;
4674
4675 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4676 {
4677 struct plt_entry *dent;
4678
4679 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4680 if (dent->addend == ent->addend)
4681 {
4682 dent->plt.refcount += ent->plt.refcount;
4683 *entp = ent->next;
4684 break;
4685 }
4686 if (dent == NULL)
4687 entp = &ent->next;
4688 }
4689 *entp = to->elf.plt.plist;
4690 }
4691
4692 to->elf.plt.plist = from->elf.plt.plist;
4693 from->elf.plt.plist = NULL;
4694 }
4695 }
4696
4697 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4698
4699 static void
4700 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4701 struct elf_link_hash_entry *dir,
4702 struct elf_link_hash_entry *ind)
4703 {
4704 struct ppc_link_hash_entry *edir, *eind;
4705
4706 edir = (struct ppc_link_hash_entry *) dir;
4707 eind = (struct ppc_link_hash_entry *) ind;
4708
4709 edir->is_func |= eind->is_func;
4710 edir->is_func_descriptor |= eind->is_func_descriptor;
4711 edir->tls_mask |= eind->tls_mask;
4712 if (eind->oh != NULL)
4713 edir->oh = ppc_follow_link (eind->oh);
4714
4715 if (edir->elf.versioned != versioned_hidden)
4716 {
4717 /* If called to transfer flags for a weakdef during processing
4718 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4719 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4720 if (!(ELIMINATE_COPY_RELOCS
4721 && eind->elf.root.type != bfd_link_hash_indirect
4722 && edir->elf.dynamic_adjusted))
4723 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4724
4725 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4726 edir->elf.ref_regular |= eind->elf.ref_regular;
4727 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4728 edir->elf.needs_plt |= eind->elf.needs_plt;
4729 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4730 }
4731
4732 /* If we were called to copy over info for a weak sym, don't copy
4733 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4734 in order to simplify readonly_dynrelocs and save a field in the
4735 symbol hash entry, but that means dyn_relocs can't be used in any
4736 tests about a specific symbol, or affect other symbol flags which
4737 are then tested.
4738 Chain weakdefs so we can get from the weakdef back to an alias.
4739 The list is circular so that we don't need to use u.weakdef as
4740 well as this list to look at all aliases. */
4741 if (eind->elf.root.type != bfd_link_hash_indirect)
4742 {
4743 struct ppc_link_hash_entry *cur, *add, *next;
4744
4745 add = eind;
4746 do
4747 {
4748 cur = edir->weakref;
4749 if (cur != NULL)
4750 {
4751 do
4752 {
4753 /* We can be called twice for the same symbols.
4754 Don't make multiple loops. */
4755 if (cur == add)
4756 return;
4757 cur = cur->weakref;
4758 } while (cur != edir);
4759 }
4760 next = add->weakref;
4761 if (cur != add)
4762 {
4763 add->weakref = edir->weakref != NULL ? edir->weakref : edir;
4764 edir->weakref = add;
4765 }
4766 add = next;
4767 } while (add != NULL && add != eind);
4768 return;
4769 }
4770
4771 /* Copy over any dynamic relocs we may have on the indirect sym. */
4772 if (eind->dyn_relocs != NULL)
4773 {
4774 if (edir->dyn_relocs != NULL)
4775 {
4776 struct elf_dyn_relocs **pp;
4777 struct elf_dyn_relocs *p;
4778
4779 /* Add reloc counts against the indirect sym to the direct sym
4780 list. Merge any entries against the same section. */
4781 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4782 {
4783 struct elf_dyn_relocs *q;
4784
4785 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4786 if (q->sec == p->sec)
4787 {
4788 q->pc_count += p->pc_count;
4789 q->count += p->count;
4790 *pp = p->next;
4791 break;
4792 }
4793 if (q == NULL)
4794 pp = &p->next;
4795 }
4796 *pp = edir->dyn_relocs;
4797 }
4798
4799 edir->dyn_relocs = eind->dyn_relocs;
4800 eind->dyn_relocs = NULL;
4801 }
4802
4803 /* Copy over got entries that we may have already seen to the
4804 symbol which just became indirect. */
4805 if (eind->elf.got.glist != NULL)
4806 {
4807 if (edir->elf.got.glist != NULL)
4808 {
4809 struct got_entry **entp;
4810 struct got_entry *ent;
4811
4812 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4813 {
4814 struct got_entry *dent;
4815
4816 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4817 if (dent->addend == ent->addend
4818 && dent->owner == ent->owner
4819 && dent->tls_type == ent->tls_type)
4820 {
4821 dent->got.refcount += ent->got.refcount;
4822 *entp = ent->next;
4823 break;
4824 }
4825 if (dent == NULL)
4826 entp = &ent->next;
4827 }
4828 *entp = edir->elf.got.glist;
4829 }
4830
4831 edir->elf.got.glist = eind->elf.got.glist;
4832 eind->elf.got.glist = NULL;
4833 }
4834
4835 /* And plt entries. */
4836 move_plt_plist (eind, edir);
4837
4838 if (eind->elf.dynindx != -1)
4839 {
4840 if (edir->elf.dynindx != -1)
4841 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4842 edir->elf.dynstr_index);
4843 edir->elf.dynindx = eind->elf.dynindx;
4844 edir->elf.dynstr_index = eind->elf.dynstr_index;
4845 eind->elf.dynindx = -1;
4846 eind->elf.dynstr_index = 0;
4847 }
4848 }
4849
4850 /* Find the function descriptor hash entry from the given function code
4851 hash entry FH. Link the entries via their OH fields. */
4852
4853 static struct ppc_link_hash_entry *
4854 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4855 {
4856 struct ppc_link_hash_entry *fdh = fh->oh;
4857
4858 if (fdh == NULL)
4859 {
4860 const char *fd_name = fh->elf.root.root.string + 1;
4861
4862 fdh = (struct ppc_link_hash_entry *)
4863 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4864 if (fdh == NULL)
4865 return fdh;
4866
4867 fdh->is_func_descriptor = 1;
4868 fdh->oh = fh;
4869 fh->is_func = 1;
4870 fh->oh = fdh;
4871 }
4872
4873 fdh = ppc_follow_link (fdh);
4874 fdh->is_func_descriptor = 1;
4875 fdh->oh = fh;
4876 return fdh;
4877 }
4878
4879 /* Make a fake function descriptor sym for the undefined code sym FH. */
4880
4881 static struct ppc_link_hash_entry *
4882 make_fdh (struct bfd_link_info *info,
4883 struct ppc_link_hash_entry *fh)
4884 {
4885 bfd *abfd = fh->elf.root.u.undef.abfd;
4886 struct bfd_link_hash_entry *bh = NULL;
4887 struct ppc_link_hash_entry *fdh;
4888 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4889 ? BSF_WEAK
4890 : BSF_GLOBAL);
4891
4892 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4893 fh->elf.root.root.string + 1,
4894 flags, bfd_und_section_ptr, 0,
4895 NULL, FALSE, FALSE, &bh))
4896 return NULL;
4897
4898 fdh = (struct ppc_link_hash_entry *) bh;
4899 fdh->elf.non_elf = 0;
4900 fdh->fake = 1;
4901 fdh->is_func_descriptor = 1;
4902 fdh->oh = fh;
4903 fh->is_func = 1;
4904 fh->oh = fdh;
4905 return fdh;
4906 }
4907
4908 /* Fix function descriptor symbols defined in .opd sections to be
4909 function type. */
4910
4911 static bfd_boolean
4912 ppc64_elf_add_symbol_hook (bfd *ibfd,
4913 struct bfd_link_info *info,
4914 Elf_Internal_Sym *isym,
4915 const char **name,
4916 flagword *flags ATTRIBUTE_UNUSED,
4917 asection **sec,
4918 bfd_vma *value)
4919 {
4920 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4921 && (ibfd->flags & DYNAMIC) == 0
4922 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
4923 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
4924
4925 if (*sec != NULL
4926 && strcmp ((*sec)->name, ".opd") == 0)
4927 {
4928 asection *code_sec;
4929
4930 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4931 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4932 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4933
4934 /* If the symbol is a function defined in .opd, and the function
4935 code is in a discarded group, let it appear to be undefined. */
4936 if (!bfd_link_relocatable (info)
4937 && (*sec)->reloc_count != 0
4938 && opd_entry_value (*sec, *value, &code_sec, NULL,
4939 FALSE) != (bfd_vma) -1
4940 && discarded_section (code_sec))
4941 {
4942 *sec = bfd_und_section_ptr;
4943 isym->st_shndx = SHN_UNDEF;
4944 }
4945 }
4946 else if (*sec != NULL
4947 && strcmp ((*sec)->name, ".toc") == 0
4948 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4949 {
4950 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4951 if (htab != NULL)
4952 htab->params->object_in_toc = 1;
4953 }
4954
4955 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4956 {
4957 if (abiversion (ibfd) == 0)
4958 set_abiversion (ibfd, 2);
4959 else if (abiversion (ibfd) == 1)
4960 {
4961 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4962 " for ABI version 1\n"), name);
4963 bfd_set_error (bfd_error_bad_value);
4964 return FALSE;
4965 }
4966 }
4967
4968 return TRUE;
4969 }
4970
4971 /* Merge non-visibility st_other attributes: local entry point. */
4972
4973 static void
4974 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4975 const Elf_Internal_Sym *isym,
4976 bfd_boolean definition,
4977 bfd_boolean dynamic)
4978 {
4979 if (definition && !dynamic)
4980 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4981 | ELF_ST_VISIBILITY (h->other));
4982 }
4983
4984 /* Hook called on merging a symbol. We use this to clear "fake" since
4985 we now have a real symbol. */
4986
4987 static bfd_boolean
4988 ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
4989 const Elf_Internal_Sym *isym ATTRIBUTE_UNUSED,
4990 asection **psec ATTRIBUTE_UNUSED,
4991 bfd_boolean newdef ATTRIBUTE_UNUSED,
4992 bfd_boolean olddef ATTRIBUTE_UNUSED,
4993 bfd *oldbfd ATTRIBUTE_UNUSED,
4994 const asection *oldsec ATTRIBUTE_UNUSED)
4995 {
4996 ((struct ppc_link_hash_entry *) h)->fake = 0;
4997 return TRUE;
4998 }
4999
5000 /* This function makes an old ABI object reference to ".bar" cause the
5001 inclusion of a new ABI object archive that defines "bar".
5002 NAME is a symbol defined in an archive. Return a symbol in the hash
5003 table that might be satisfied by the archive symbols. */
5004
5005 static struct elf_link_hash_entry *
5006 ppc64_elf_archive_symbol_lookup (bfd *abfd,
5007 struct bfd_link_info *info,
5008 const char *name)
5009 {
5010 struct elf_link_hash_entry *h;
5011 char *dot_name;
5012 size_t len;
5013
5014 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
5015 if (h != NULL
5016 /* Don't return this sym if it is a fake function descriptor
5017 created by add_symbol_adjust. */
5018 && !((struct ppc_link_hash_entry *) h)->fake)
5019 return h;
5020
5021 if (name[0] == '.')
5022 return h;
5023
5024 len = strlen (name);
5025 dot_name = bfd_alloc (abfd, len + 2);
5026 if (dot_name == NULL)
5027 return (struct elf_link_hash_entry *) 0 - 1;
5028 dot_name[0] = '.';
5029 memcpy (dot_name + 1, name, len + 1);
5030 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5031 bfd_release (abfd, dot_name);
5032 return h;
5033 }
5034
5035 /* This function satisfies all old ABI object references to ".bar" if a
5036 new ABI object defines "bar". Well, at least, undefined dot symbols
5037 are made weak. This stops later archive searches from including an
5038 object if we already have a function descriptor definition. It also
5039 prevents the linker complaining about undefined symbols.
5040 We also check and correct mismatched symbol visibility here. The
5041 most restrictive visibility of the function descriptor and the
5042 function entry symbol is used. */
5043
5044 static bfd_boolean
5045 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
5046 {
5047 struct ppc_link_hash_table *htab;
5048 struct ppc_link_hash_entry *fdh;
5049
5050 if (eh->elf.root.type == bfd_link_hash_warning)
5051 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5052
5053 if (eh->elf.root.type == bfd_link_hash_indirect)
5054 return TRUE;
5055
5056 if (eh->elf.root.root.string[0] != '.')
5057 abort ();
5058
5059 htab = ppc_hash_table (info);
5060 if (htab == NULL)
5061 return FALSE;
5062
5063 fdh = lookup_fdh (eh, htab);
5064 if (fdh == NULL
5065 && !bfd_link_relocatable (info)
5066 && (eh->elf.root.type == bfd_link_hash_undefined
5067 || eh->elf.root.type == bfd_link_hash_undefweak)
5068 && eh->elf.ref_regular)
5069 {
5070 /* Make an undefined function descriptor sym, in order to
5071 pull in an --as-needed shared lib. Archives are handled
5072 elsewhere. */
5073 fdh = make_fdh (info, eh);
5074 if (fdh == NULL)
5075 return FALSE;
5076 }
5077
5078 if (fdh != NULL)
5079 {
5080 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5081 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
5082
5083 /* Make both descriptor and entry symbol have the most
5084 constraining visibility of either symbol. */
5085 if (entry_vis < descr_vis)
5086 fdh->elf.other += entry_vis - descr_vis;
5087 else if (entry_vis > descr_vis)
5088 eh->elf.other += descr_vis - entry_vis;
5089
5090 /* Propagate reference flags from entry symbol to function
5091 descriptor symbol. */
5092 fdh->elf.root.non_ir_ref |= eh->elf.root.non_ir_ref;
5093 fdh->elf.ref_regular |= eh->elf.ref_regular;
5094 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5095
5096 if (!fdh->elf.forced_local
5097 && fdh->elf.dynindx == -1
5098 && fdh->elf.versioned != versioned_hidden
5099 && (bfd_link_dll (info)
5100 || fdh->elf.def_dynamic
5101 || fdh->elf.ref_dynamic)
5102 && (eh->elf.ref_regular
5103 || eh->elf.def_regular))
5104 {
5105 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5106 return FALSE;
5107 }
5108 }
5109
5110 return TRUE;
5111 }
5112
5113 /* Set up opd section info and abiversion for IBFD, and process list
5114 of dot-symbols we made in link_hash_newfunc. */
5115
5116 static bfd_boolean
5117 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
5118 {
5119 struct ppc_link_hash_table *htab;
5120 struct ppc_link_hash_entry **p, *eh;
5121 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
5122
5123 if (opd != NULL && opd->size != 0)
5124 {
5125 if (abiversion (ibfd) == 0)
5126 set_abiversion (ibfd, 1);
5127 else if (abiversion (ibfd) >= 2)
5128 {
5129 /* xgettext:c-format */
5130 info->callbacks->einfo (_("%P: %B .opd not allowed in ABI"
5131 " version %d\n"),
5132 ibfd, abiversion (ibfd));
5133 bfd_set_error (bfd_error_bad_value);
5134 return FALSE;
5135 }
5136
5137 if ((ibfd->flags & DYNAMIC) == 0
5138 && (opd->flags & SEC_RELOC) != 0
5139 && opd->reloc_count != 0
5140 && !bfd_is_abs_section (opd->output_section))
5141 {
5142 /* Garbage collection needs some extra help with .opd sections.
5143 We don't want to necessarily keep everything referenced by
5144 relocs in .opd, as that would keep all functions. Instead,
5145 if we reference an .opd symbol (a function descriptor), we
5146 want to keep the function code symbol's section. This is
5147 easy for global symbols, but for local syms we need to keep
5148 information about the associated function section. */
5149 bfd_size_type amt;
5150 asection **opd_sym_map;
5151
5152 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5153 opd_sym_map = bfd_zalloc (ibfd, amt);
5154 if (opd_sym_map == NULL)
5155 return FALSE;
5156 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5157 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5158 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5159 }
5160 }
5161
5162 if (!is_ppc64_elf (info->output_bfd))
5163 return TRUE;
5164 htab = ppc_hash_table (info);
5165 if (htab == NULL)
5166 return FALSE;
5167
5168 /* For input files without an explicit abiversion in e_flags
5169 we should have flagged any with symbol st_other bits set
5170 as ELFv1 and above flagged those with .opd as ELFv2.
5171 Set the output abiversion if not yet set, and for any input
5172 still ambiguous, take its abiversion from the output.
5173 Differences in ABI are reported later. */
5174 if (abiversion (info->output_bfd) == 0)
5175 set_abiversion (info->output_bfd, abiversion (ibfd));
5176 else if (abiversion (ibfd) == 0)
5177 set_abiversion (ibfd, abiversion (info->output_bfd));
5178
5179 p = &htab->dot_syms;
5180 while ((eh = *p) != NULL)
5181 {
5182 *p = NULL;
5183 if (&eh->elf == htab->elf.hgot)
5184 ;
5185 else if (htab->elf.hgot == NULL
5186 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5187 htab->elf.hgot = &eh->elf;
5188 else if (abiversion (ibfd) <= 1)
5189 {
5190 htab->need_func_desc_adj = 1;
5191 if (!add_symbol_adjust (eh, info))
5192 return FALSE;
5193 }
5194 p = &eh->u.next_dot_sym;
5195 }
5196 return TRUE;
5197 }
5198
5199 /* Undo hash table changes when an --as-needed input file is determined
5200 not to be needed. */
5201
5202 static bfd_boolean
5203 ppc64_elf_notice_as_needed (bfd *ibfd,
5204 struct bfd_link_info *info,
5205 enum notice_asneeded_action act)
5206 {
5207 if (act == notice_not_needed)
5208 {
5209 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5210
5211 if (htab == NULL)
5212 return FALSE;
5213
5214 htab->dot_syms = NULL;
5215 }
5216 return _bfd_elf_notice_as_needed (ibfd, info, act);
5217 }
5218
5219 /* If --just-symbols against a final linked binary, then assume we need
5220 toc adjusting stubs when calling functions defined there. */
5221
5222 static void
5223 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5224 {
5225 if ((sec->flags & SEC_CODE) != 0
5226 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5227 && is_ppc64_elf (sec->owner))
5228 {
5229 if (abiversion (sec->owner) >= 2
5230 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5231 sec->has_toc_reloc = 1;
5232 }
5233 _bfd_elf_link_just_syms (sec, info);
5234 }
5235
5236 static struct plt_entry **
5237 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5238 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5239 {
5240 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5241 struct plt_entry **local_plt;
5242 unsigned char *local_got_tls_masks;
5243
5244 if (local_got_ents == NULL)
5245 {
5246 bfd_size_type size = symtab_hdr->sh_info;
5247
5248 size *= (sizeof (*local_got_ents)
5249 + sizeof (*local_plt)
5250 + sizeof (*local_got_tls_masks));
5251 local_got_ents = bfd_zalloc (abfd, size);
5252 if (local_got_ents == NULL)
5253 return NULL;
5254 elf_local_got_ents (abfd) = local_got_ents;
5255 }
5256
5257 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5258 {
5259 struct got_entry *ent;
5260
5261 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5262 if (ent->addend == r_addend
5263 && ent->owner == abfd
5264 && ent->tls_type == tls_type)
5265 break;
5266 if (ent == NULL)
5267 {
5268 bfd_size_type amt = sizeof (*ent);
5269 ent = bfd_alloc (abfd, amt);
5270 if (ent == NULL)
5271 return FALSE;
5272 ent->next = local_got_ents[r_symndx];
5273 ent->addend = r_addend;
5274 ent->owner = abfd;
5275 ent->tls_type = tls_type;
5276 ent->is_indirect = FALSE;
5277 ent->got.refcount = 0;
5278 local_got_ents[r_symndx] = ent;
5279 }
5280 ent->got.refcount += 1;
5281 }
5282
5283 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5284 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5285 local_got_tls_masks[r_symndx] |= tls_type;
5286
5287 return local_plt + r_symndx;
5288 }
5289
5290 static bfd_boolean
5291 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5292 {
5293 struct plt_entry *ent;
5294
5295 for (ent = *plist; ent != NULL; ent = ent->next)
5296 if (ent->addend == addend)
5297 break;
5298 if (ent == NULL)
5299 {
5300 bfd_size_type amt = sizeof (*ent);
5301 ent = bfd_alloc (abfd, amt);
5302 if (ent == NULL)
5303 return FALSE;
5304 ent->next = *plist;
5305 ent->addend = addend;
5306 ent->plt.refcount = 0;
5307 *plist = ent;
5308 }
5309 ent->plt.refcount += 1;
5310 return TRUE;
5311 }
5312
5313 static bfd_boolean
5314 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5315 {
5316 return (r_type == R_PPC64_REL24
5317 || r_type == R_PPC64_REL14
5318 || r_type == R_PPC64_REL14_BRTAKEN
5319 || r_type == R_PPC64_REL14_BRNTAKEN
5320 || r_type == R_PPC64_ADDR24
5321 || r_type == R_PPC64_ADDR14
5322 || r_type == R_PPC64_ADDR14_BRTAKEN
5323 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5324 }
5325
5326 /* Look through the relocs for a section during the first phase, and
5327 calculate needed space in the global offset table, procedure
5328 linkage table, and dynamic reloc sections. */
5329
5330 static bfd_boolean
5331 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5332 asection *sec, const Elf_Internal_Rela *relocs)
5333 {
5334 struct ppc_link_hash_table *htab;
5335 Elf_Internal_Shdr *symtab_hdr;
5336 struct elf_link_hash_entry **sym_hashes;
5337 const Elf_Internal_Rela *rel;
5338 const Elf_Internal_Rela *rel_end;
5339 asection *sreloc;
5340 asection **opd_sym_map;
5341 struct elf_link_hash_entry *tga, *dottga;
5342
5343 if (bfd_link_relocatable (info))
5344 return TRUE;
5345
5346 /* Don't do anything special with non-loaded, non-alloced sections.
5347 In particular, any relocs in such sections should not affect GOT
5348 and PLT reference counting (ie. we don't allow them to create GOT
5349 or PLT entries), there's no possibility or desire to optimize TLS
5350 relocs, and there's not much point in propagating relocs to shared
5351 libs that the dynamic linker won't relocate. */
5352 if ((sec->flags & SEC_ALLOC) == 0)
5353 return TRUE;
5354
5355 BFD_ASSERT (is_ppc64_elf (abfd));
5356
5357 htab = ppc_hash_table (info);
5358 if (htab == NULL)
5359 return FALSE;
5360
5361 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5362 FALSE, FALSE, TRUE);
5363 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5364 FALSE, FALSE, TRUE);
5365 symtab_hdr = &elf_symtab_hdr (abfd);
5366 sym_hashes = elf_sym_hashes (abfd);
5367 sreloc = NULL;
5368 opd_sym_map = NULL;
5369 if (ppc64_elf_section_data (sec) != NULL
5370 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
5371 opd_sym_map = ppc64_elf_section_data (sec)->u.opd.func_sec;
5372
5373 rel_end = relocs + sec->reloc_count;
5374 for (rel = relocs; rel < rel_end; rel++)
5375 {
5376 unsigned long r_symndx;
5377 struct elf_link_hash_entry *h;
5378 enum elf_ppc64_reloc_type r_type;
5379 int tls_type;
5380 struct _ppc64_elf_section_data *ppc64_sec;
5381 struct plt_entry **ifunc, **plt_list;
5382
5383 r_symndx = ELF64_R_SYM (rel->r_info);
5384 if (r_symndx < symtab_hdr->sh_info)
5385 h = NULL;
5386 else
5387 {
5388 struct ppc_link_hash_entry *eh;
5389
5390 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5391 h = elf_follow_link (h);
5392 eh = (struct ppc_link_hash_entry *) h;
5393
5394 /* PR15323, ref flags aren't set for references in the same
5395 object. */
5396 h->root.non_ir_ref = 1;
5397 if (eh->is_func && eh->oh != NULL)
5398 eh->oh->elf.root.non_ir_ref = 1;
5399
5400 if (h == htab->elf.hgot)
5401 sec->has_toc_reloc = 1;
5402 }
5403
5404 tls_type = 0;
5405 ifunc = NULL;
5406 if (h != NULL)
5407 {
5408 if (h->type == STT_GNU_IFUNC)
5409 {
5410 h->needs_plt = 1;
5411 ifunc = &h->plt.plist;
5412 }
5413 }
5414 else
5415 {
5416 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5417 abfd, r_symndx);
5418 if (isym == NULL)
5419 return FALSE;
5420
5421 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5422 {
5423 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5424 rel->r_addend, PLT_IFUNC);
5425 if (ifunc == NULL)
5426 return FALSE;
5427 }
5428 }
5429
5430 r_type = ELF64_R_TYPE (rel->r_info);
5431 switch (r_type)
5432 {
5433 case R_PPC64_TLSGD:
5434 case R_PPC64_TLSLD:
5435 /* These special tls relocs tie a call to __tls_get_addr with
5436 its parameter symbol. */
5437 break;
5438
5439 case R_PPC64_GOT_TLSLD16:
5440 case R_PPC64_GOT_TLSLD16_LO:
5441 case R_PPC64_GOT_TLSLD16_HI:
5442 case R_PPC64_GOT_TLSLD16_HA:
5443 tls_type = TLS_TLS | TLS_LD;
5444 goto dogottls;
5445
5446 case R_PPC64_GOT_TLSGD16:
5447 case R_PPC64_GOT_TLSGD16_LO:
5448 case R_PPC64_GOT_TLSGD16_HI:
5449 case R_PPC64_GOT_TLSGD16_HA:
5450 tls_type = TLS_TLS | TLS_GD;
5451 goto dogottls;
5452
5453 case R_PPC64_GOT_TPREL16_DS:
5454 case R_PPC64_GOT_TPREL16_LO_DS:
5455 case R_PPC64_GOT_TPREL16_HI:
5456 case R_PPC64_GOT_TPREL16_HA:
5457 if (bfd_link_pic (info))
5458 info->flags |= DF_STATIC_TLS;
5459 tls_type = TLS_TLS | TLS_TPREL;
5460 goto dogottls;
5461
5462 case R_PPC64_GOT_DTPREL16_DS:
5463 case R_PPC64_GOT_DTPREL16_LO_DS:
5464 case R_PPC64_GOT_DTPREL16_HI:
5465 case R_PPC64_GOT_DTPREL16_HA:
5466 tls_type = TLS_TLS | TLS_DTPREL;
5467 dogottls:
5468 sec->has_tls_reloc = 1;
5469 /* Fall through */
5470
5471 case R_PPC64_GOT16:
5472 case R_PPC64_GOT16_DS:
5473 case R_PPC64_GOT16_HA:
5474 case R_PPC64_GOT16_HI:
5475 case R_PPC64_GOT16_LO:
5476 case R_PPC64_GOT16_LO_DS:
5477 /* This symbol requires a global offset table entry. */
5478 sec->has_toc_reloc = 1;
5479 if (r_type == R_PPC64_GOT_TLSLD16
5480 || r_type == R_PPC64_GOT_TLSGD16
5481 || r_type == R_PPC64_GOT_TPREL16_DS
5482 || r_type == R_PPC64_GOT_DTPREL16_DS
5483 || r_type == R_PPC64_GOT16
5484 || r_type == R_PPC64_GOT16_DS)
5485 {
5486 htab->do_multi_toc = 1;
5487 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5488 }
5489
5490 if (ppc64_elf_tdata (abfd)->got == NULL
5491 && !create_got_section (abfd, info))
5492 return FALSE;
5493
5494 if (h != NULL)
5495 {
5496 struct ppc_link_hash_entry *eh;
5497 struct got_entry *ent;
5498
5499 eh = (struct ppc_link_hash_entry *) h;
5500 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5501 if (ent->addend == rel->r_addend
5502 && ent->owner == abfd
5503 && ent->tls_type == tls_type)
5504 break;
5505 if (ent == NULL)
5506 {
5507 bfd_size_type amt = sizeof (*ent);
5508 ent = bfd_alloc (abfd, amt);
5509 if (ent == NULL)
5510 return FALSE;
5511 ent->next = eh->elf.got.glist;
5512 ent->addend = rel->r_addend;
5513 ent->owner = abfd;
5514 ent->tls_type = tls_type;
5515 ent->is_indirect = FALSE;
5516 ent->got.refcount = 0;
5517 eh->elf.got.glist = ent;
5518 }
5519 ent->got.refcount += 1;
5520 eh->tls_mask |= tls_type;
5521 }
5522 else
5523 /* This is a global offset table entry for a local symbol. */
5524 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5525 rel->r_addend, tls_type))
5526 return FALSE;
5527
5528 /* We may also need a plt entry if the symbol turns out to be
5529 an ifunc. */
5530 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
5531 {
5532 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5533 return FALSE;
5534 }
5535 break;
5536
5537 case R_PPC64_PLT16_HA:
5538 case R_PPC64_PLT16_HI:
5539 case R_PPC64_PLT16_LO:
5540 case R_PPC64_PLT32:
5541 case R_PPC64_PLT64:
5542 /* This symbol requires a procedure linkage table entry. */
5543 plt_list = ifunc;
5544 if (h != NULL)
5545 {
5546 h->needs_plt = 1;
5547 if (h->root.root.string[0] == '.'
5548 && h->root.root.string[1] != '\0')
5549 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5550 plt_list = &h->plt.plist;
5551 }
5552 if (plt_list == NULL)
5553 {
5554 /* It does not make sense to have a procedure linkage
5555 table entry for a non-ifunc local symbol. */
5556 info->callbacks->einfo
5557 /* xgettext:c-format */
5558 (_("%P: %H: %s reloc against local symbol\n"),
5559 abfd, sec, rel->r_offset,
5560 ppc64_elf_howto_table[r_type]->name);
5561 bfd_set_error (bfd_error_bad_value);
5562 return FALSE;
5563 }
5564 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5565 return FALSE;
5566 break;
5567
5568 /* The following relocations don't need to propagate the
5569 relocation if linking a shared object since they are
5570 section relative. */
5571 case R_PPC64_SECTOFF:
5572 case R_PPC64_SECTOFF_LO:
5573 case R_PPC64_SECTOFF_HI:
5574 case R_PPC64_SECTOFF_HA:
5575 case R_PPC64_SECTOFF_DS:
5576 case R_PPC64_SECTOFF_LO_DS:
5577 case R_PPC64_DTPREL16:
5578 case R_PPC64_DTPREL16_LO:
5579 case R_PPC64_DTPREL16_HI:
5580 case R_PPC64_DTPREL16_HA:
5581 case R_PPC64_DTPREL16_DS:
5582 case R_PPC64_DTPREL16_LO_DS:
5583 case R_PPC64_DTPREL16_HIGH:
5584 case R_PPC64_DTPREL16_HIGHA:
5585 case R_PPC64_DTPREL16_HIGHER:
5586 case R_PPC64_DTPREL16_HIGHERA:
5587 case R_PPC64_DTPREL16_HIGHEST:
5588 case R_PPC64_DTPREL16_HIGHESTA:
5589 break;
5590
5591 /* Nor do these. */
5592 case R_PPC64_REL16:
5593 case R_PPC64_REL16_LO:
5594 case R_PPC64_REL16_HI:
5595 case R_PPC64_REL16_HA:
5596 case R_PPC64_REL16DX_HA:
5597 break;
5598
5599 /* Not supported as a dynamic relocation. */
5600 case R_PPC64_ADDR64_LOCAL:
5601 if (bfd_link_pic (info))
5602 {
5603 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5604 ppc_howto_init ();
5605 /* xgettext:c-format */
5606 info->callbacks->einfo (_("%P: %H: %s reloc unsupported "
5607 "in shared libraries and PIEs.\n"),
5608 abfd, sec, rel->r_offset,
5609 ppc64_elf_howto_table[r_type]->name);
5610 bfd_set_error (bfd_error_bad_value);
5611 return FALSE;
5612 }
5613 break;
5614
5615 case R_PPC64_TOC16:
5616 case R_PPC64_TOC16_DS:
5617 htab->do_multi_toc = 1;
5618 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5619 /* Fall through. */
5620 case R_PPC64_TOC16_LO:
5621 case R_PPC64_TOC16_HI:
5622 case R_PPC64_TOC16_HA:
5623 case R_PPC64_TOC16_LO_DS:
5624 sec->has_toc_reloc = 1;
5625 break;
5626
5627 /* Marker reloc. */
5628 case R_PPC64_ENTRY:
5629 break;
5630
5631 /* This relocation describes the C++ object vtable hierarchy.
5632 Reconstruct it for later use during GC. */
5633 case R_PPC64_GNU_VTINHERIT:
5634 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5635 return FALSE;
5636 break;
5637
5638 /* This relocation describes which C++ vtable entries are actually
5639 used. Record for later use during GC. */
5640 case R_PPC64_GNU_VTENTRY:
5641 BFD_ASSERT (h != NULL);
5642 if (h != NULL
5643 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5644 return FALSE;
5645 break;
5646
5647 case R_PPC64_REL14:
5648 case R_PPC64_REL14_BRTAKEN:
5649 case R_PPC64_REL14_BRNTAKEN:
5650 {
5651 asection *dest = NULL;
5652
5653 /* Heuristic: If jumping outside our section, chances are
5654 we are going to need a stub. */
5655 if (h != NULL)
5656 {
5657 /* If the sym is weak it may be overridden later, so
5658 don't assume we know where a weak sym lives. */
5659 if (h->root.type == bfd_link_hash_defined)
5660 dest = h->root.u.def.section;
5661 }
5662 else
5663 {
5664 Elf_Internal_Sym *isym;
5665
5666 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5667 abfd, r_symndx);
5668 if (isym == NULL)
5669 return FALSE;
5670
5671 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5672 }
5673
5674 if (dest != sec)
5675 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5676 }
5677 /* Fall through. */
5678
5679 case R_PPC64_REL24:
5680 plt_list = ifunc;
5681 if (h != NULL)
5682 {
5683 h->needs_plt = 1;
5684 if (h->root.root.string[0] == '.'
5685 && h->root.root.string[1] != '\0')
5686 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5687
5688 if (h == tga || h == dottga)
5689 {
5690 sec->has_tls_reloc = 1;
5691 if (rel != relocs
5692 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5693 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5694 /* We have a new-style __tls_get_addr call with
5695 a marker reloc. */
5696 ;
5697 else
5698 /* Mark this section as having an old-style call. */
5699 sec->has_tls_get_addr_call = 1;
5700 }
5701 plt_list = &h->plt.plist;
5702 }
5703
5704 /* We may need a .plt entry if the function this reloc
5705 refers to is in a shared lib. */
5706 if (plt_list
5707 && !update_plt_info (abfd, plt_list, rel->r_addend))
5708 return FALSE;
5709 break;
5710
5711 case R_PPC64_ADDR14:
5712 case R_PPC64_ADDR14_BRNTAKEN:
5713 case R_PPC64_ADDR14_BRTAKEN:
5714 case R_PPC64_ADDR24:
5715 goto dodyn;
5716
5717 case R_PPC64_TPREL64:
5718 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5719 if (bfd_link_pic (info))
5720 info->flags |= DF_STATIC_TLS;
5721 goto dotlstoc;
5722
5723 case R_PPC64_DTPMOD64:
5724 if (rel + 1 < rel_end
5725 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5726 && rel[1].r_offset == rel->r_offset + 8)
5727 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5728 else
5729 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5730 goto dotlstoc;
5731
5732 case R_PPC64_DTPREL64:
5733 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5734 if (rel != relocs
5735 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5736 && rel[-1].r_offset == rel->r_offset - 8)
5737 /* This is the second reloc of a dtpmod, dtprel pair.
5738 Don't mark with TLS_DTPREL. */
5739 goto dodyn;
5740
5741 dotlstoc:
5742 sec->has_tls_reloc = 1;
5743 if (h != NULL)
5744 {
5745 struct ppc_link_hash_entry *eh;
5746 eh = (struct ppc_link_hash_entry *) h;
5747 eh->tls_mask |= tls_type;
5748 }
5749 else
5750 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5751 rel->r_addend, tls_type))
5752 return FALSE;
5753
5754 ppc64_sec = ppc64_elf_section_data (sec);
5755 if (ppc64_sec->sec_type != sec_toc)
5756 {
5757 bfd_size_type amt;
5758
5759 /* One extra to simplify get_tls_mask. */
5760 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5761 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5762 if (ppc64_sec->u.toc.symndx == NULL)
5763 return FALSE;
5764 amt = sec->size * sizeof (bfd_vma) / 8;
5765 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5766 if (ppc64_sec->u.toc.add == NULL)
5767 return FALSE;
5768 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5769 ppc64_sec->sec_type = sec_toc;
5770 }
5771 BFD_ASSERT (rel->r_offset % 8 == 0);
5772 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5773 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5774
5775 /* Mark the second slot of a GD or LD entry.
5776 -1 to indicate GD and -2 to indicate LD. */
5777 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5778 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5779 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5780 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5781 goto dodyn;
5782
5783 case R_PPC64_TPREL16:
5784 case R_PPC64_TPREL16_LO:
5785 case R_PPC64_TPREL16_HI:
5786 case R_PPC64_TPREL16_HA:
5787 case R_PPC64_TPREL16_DS:
5788 case R_PPC64_TPREL16_LO_DS:
5789 case R_PPC64_TPREL16_HIGH:
5790 case R_PPC64_TPREL16_HIGHA:
5791 case R_PPC64_TPREL16_HIGHER:
5792 case R_PPC64_TPREL16_HIGHERA:
5793 case R_PPC64_TPREL16_HIGHEST:
5794 case R_PPC64_TPREL16_HIGHESTA:
5795 if (bfd_link_pic (info))
5796 {
5797 info->flags |= DF_STATIC_TLS;
5798 goto dodyn;
5799 }
5800 break;
5801
5802 case R_PPC64_ADDR64:
5803 if (opd_sym_map != NULL
5804 && rel + 1 < rel_end
5805 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5806 {
5807 if (h != NULL)
5808 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5809 else
5810 {
5811 asection *s;
5812 Elf_Internal_Sym *isym;
5813
5814 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5815 abfd, r_symndx);
5816 if (isym == NULL)
5817 return FALSE;
5818
5819 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5820 if (s != NULL && s != sec)
5821 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5822 }
5823 }
5824 /* Fall through. */
5825
5826 case R_PPC64_ADDR16:
5827 case R_PPC64_ADDR16_DS:
5828 case R_PPC64_ADDR16_HA:
5829 case R_PPC64_ADDR16_HI:
5830 case R_PPC64_ADDR16_HIGH:
5831 case R_PPC64_ADDR16_HIGHA:
5832 case R_PPC64_ADDR16_HIGHER:
5833 case R_PPC64_ADDR16_HIGHERA:
5834 case R_PPC64_ADDR16_HIGHEST:
5835 case R_PPC64_ADDR16_HIGHESTA:
5836 case R_PPC64_ADDR16_LO:
5837 case R_PPC64_ADDR16_LO_DS:
5838 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
5839 && rel->r_addend == 0)
5840 {
5841 /* We may need a .plt entry if this reloc refers to a
5842 function in a shared lib. */
5843 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5844 return FALSE;
5845 h->pointer_equality_needed = 1;
5846 }
5847 /* Fall through. */
5848
5849 case R_PPC64_REL30:
5850 case R_PPC64_REL32:
5851 case R_PPC64_REL64:
5852 case R_PPC64_ADDR32:
5853 case R_PPC64_UADDR16:
5854 case R_PPC64_UADDR32:
5855 case R_PPC64_UADDR64:
5856 case R_PPC64_TOC:
5857 if (h != NULL && !bfd_link_pic (info))
5858 /* We may need a copy reloc. */
5859 h->non_got_ref = 1;
5860
5861 /* Don't propagate .opd relocs. */
5862 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5863 break;
5864
5865 /* If we are creating a shared library, and this is a reloc
5866 against a global symbol, or a non PC relative reloc
5867 against a local symbol, then we need to copy the reloc
5868 into the shared library. However, if we are linking with
5869 -Bsymbolic, we do not need to copy a reloc against a
5870 global symbol which is defined in an object we are
5871 including in the link (i.e., DEF_REGULAR is set). At
5872 this point we have not seen all the input files, so it is
5873 possible that DEF_REGULAR is not set now but will be set
5874 later (it is never cleared). In case of a weak definition,
5875 DEF_REGULAR may be cleared later by a strong definition in
5876 a shared library. We account for that possibility below by
5877 storing information in the dyn_relocs field of the hash
5878 table entry. A similar situation occurs when creating
5879 shared libraries and symbol visibility changes render the
5880 symbol local.
5881
5882 If on the other hand, we are creating an executable, we
5883 may need to keep relocations for symbols satisfied by a
5884 dynamic library if we manage to avoid copy relocs for the
5885 symbol. */
5886 dodyn:
5887 if ((bfd_link_pic (info)
5888 && (must_be_dyn_reloc (info, r_type)
5889 || (h != NULL
5890 && (!SYMBOLIC_BIND (info, h)
5891 || h->root.type == bfd_link_hash_defweak
5892 || !h->def_regular))))
5893 || (ELIMINATE_COPY_RELOCS
5894 && !bfd_link_pic (info)
5895 && h != NULL
5896 && (h->root.type == bfd_link_hash_defweak
5897 || !h->def_regular))
5898 || (!bfd_link_pic (info)
5899 && ifunc != NULL))
5900 {
5901 /* We must copy these reloc types into the output file.
5902 Create a reloc section in dynobj and make room for
5903 this reloc. */
5904 if (sreloc == NULL)
5905 {
5906 sreloc = _bfd_elf_make_dynamic_reloc_section
5907 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5908
5909 if (sreloc == NULL)
5910 return FALSE;
5911 }
5912
5913 /* If this is a global symbol, we count the number of
5914 relocations we need for this symbol. */
5915 if (h != NULL)
5916 {
5917 struct elf_dyn_relocs *p;
5918 struct elf_dyn_relocs **head;
5919
5920 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5921 p = *head;
5922 if (p == NULL || p->sec != sec)
5923 {
5924 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5925 if (p == NULL)
5926 return FALSE;
5927 p->next = *head;
5928 *head = p;
5929 p->sec = sec;
5930 p->count = 0;
5931 p->pc_count = 0;
5932 }
5933 p->count += 1;
5934 if (!must_be_dyn_reloc (info, r_type))
5935 p->pc_count += 1;
5936 }
5937 else
5938 {
5939 /* Track dynamic relocs needed for local syms too.
5940 We really need local syms available to do this
5941 easily. Oh well. */
5942 struct ppc_dyn_relocs *p;
5943 struct ppc_dyn_relocs **head;
5944 bfd_boolean is_ifunc;
5945 asection *s;
5946 void *vpp;
5947 Elf_Internal_Sym *isym;
5948
5949 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5950 abfd, r_symndx);
5951 if (isym == NULL)
5952 return FALSE;
5953
5954 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5955 if (s == NULL)
5956 s = sec;
5957
5958 vpp = &elf_section_data (s)->local_dynrel;
5959 head = (struct ppc_dyn_relocs **) vpp;
5960 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5961 p = *head;
5962 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5963 p = p->next;
5964 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5965 {
5966 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5967 if (p == NULL)
5968 return FALSE;
5969 p->next = *head;
5970 *head = p;
5971 p->sec = sec;
5972 p->ifunc = is_ifunc;
5973 p->count = 0;
5974 }
5975 p->count += 1;
5976 }
5977 }
5978 break;
5979
5980 default:
5981 break;
5982 }
5983 }
5984
5985 return TRUE;
5986 }
5987
5988 /* Merge backend specific data from an object file to the output
5989 object file when linking. */
5990
5991 static bfd_boolean
5992 ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
5993 {
5994 bfd *obfd = info->output_bfd;
5995 unsigned long iflags, oflags;
5996
5997 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5998 return TRUE;
5999
6000 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6001 return TRUE;
6002
6003 if (!_bfd_generic_verify_endian_match (ibfd, info))
6004 return FALSE;
6005
6006 iflags = elf_elfheader (ibfd)->e_flags;
6007 oflags = elf_elfheader (obfd)->e_flags;
6008
6009 if (iflags & ~EF_PPC64_ABI)
6010 {
6011 _bfd_error_handler
6012 /* xgettext:c-format */
6013 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
6014 bfd_set_error (bfd_error_bad_value);
6015 return FALSE;
6016 }
6017 else if (iflags != oflags && iflags != 0)
6018 {
6019 _bfd_error_handler
6020 /* xgettext:c-format */
6021 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
6022 ibfd, iflags, oflags);
6023 bfd_set_error (bfd_error_bad_value);
6024 return FALSE;
6025 }
6026
6027 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
6028
6029 /* Merge Tag_compatibility attributes and any common GNU ones. */
6030 _bfd_elf_merge_object_attributes (ibfd, info);
6031
6032 return TRUE;
6033 }
6034
6035 static bfd_boolean
6036 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6037 {
6038 /* Print normal ELF private data. */
6039 _bfd_elf_print_private_bfd_data (abfd, ptr);
6040
6041 if (elf_elfheader (abfd)->e_flags != 0)
6042 {
6043 FILE *file = ptr;
6044
6045 fprintf (file, _("private flags = 0x%lx:"),
6046 elf_elfheader (abfd)->e_flags);
6047
6048 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6049 fprintf (file, _(" [abiv%ld]"),
6050 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6051 fputc ('\n', file);
6052 }
6053
6054 return TRUE;
6055 }
6056
6057 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
6058 of the code entry point, and its section, which must be in the same
6059 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
6060
6061 static bfd_vma
6062 opd_entry_value (asection *opd_sec,
6063 bfd_vma offset,
6064 asection **code_sec,
6065 bfd_vma *code_off,
6066 bfd_boolean in_code_sec)
6067 {
6068 bfd *opd_bfd = opd_sec->owner;
6069 Elf_Internal_Rela *relocs;
6070 Elf_Internal_Rela *lo, *hi, *look;
6071 bfd_vma val;
6072
6073 /* No relocs implies we are linking a --just-symbols object, or looking
6074 at a final linked executable with addr2line or somesuch. */
6075 if (opd_sec->reloc_count == 0)
6076 {
6077 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
6078
6079 if (contents == NULL)
6080 {
6081 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6082 return (bfd_vma) -1;
6083 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6084 }
6085
6086 /* PR 17512: file: 64b9dfbb. */
6087 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
6088 return (bfd_vma) -1;
6089
6090 val = bfd_get_64 (opd_bfd, contents + offset);
6091 if (code_sec != NULL)
6092 {
6093 asection *sec, *likely = NULL;
6094
6095 if (in_code_sec)
6096 {
6097 sec = *code_sec;
6098 if (sec->vma <= val
6099 && val < sec->vma + sec->size)
6100 likely = sec;
6101 else
6102 val = -1;
6103 }
6104 else
6105 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6106 if (sec->vma <= val
6107 && (sec->flags & SEC_LOAD) != 0
6108 && (sec->flags & SEC_ALLOC) != 0)
6109 likely = sec;
6110 if (likely != NULL)
6111 {
6112 *code_sec = likely;
6113 if (code_off != NULL)
6114 *code_off = val - likely->vma;
6115 }
6116 }
6117 return val;
6118 }
6119
6120 BFD_ASSERT (is_ppc64_elf (opd_bfd));
6121
6122 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
6123 if (relocs == NULL)
6124 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
6125 /* PR 17512: file: df8e1fd6. */
6126 if (relocs == NULL)
6127 return (bfd_vma) -1;
6128
6129 /* Go find the opd reloc at the sym address. */
6130 lo = relocs;
6131 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
6132 val = (bfd_vma) -1;
6133 while (lo < hi)
6134 {
6135 look = lo + (hi - lo) / 2;
6136 if (look->r_offset < offset)
6137 lo = look + 1;
6138 else if (look->r_offset > offset)
6139 hi = look;
6140 else
6141 {
6142 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6143
6144 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6145 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6146 {
6147 unsigned long symndx = ELF64_R_SYM (look->r_info);
6148 asection *sec = NULL;
6149
6150 if (symndx >= symtab_hdr->sh_info
6151 && elf_sym_hashes (opd_bfd) != NULL)
6152 {
6153 struct elf_link_hash_entry **sym_hashes;
6154 struct elf_link_hash_entry *rh;
6155
6156 sym_hashes = elf_sym_hashes (opd_bfd);
6157 rh = sym_hashes[symndx - symtab_hdr->sh_info];
6158 if (rh != NULL)
6159 {
6160 rh = elf_follow_link (rh);
6161 if (rh->root.type != bfd_link_hash_defined
6162 && rh->root.type != bfd_link_hash_defweak)
6163 break;
6164 if (rh->root.u.def.section->owner == opd_bfd)
6165 {
6166 val = rh->root.u.def.value;
6167 sec = rh->root.u.def.section;
6168 }
6169 }
6170 }
6171
6172 if (sec == NULL)
6173 {
6174 Elf_Internal_Sym *sym;
6175
6176 if (symndx < symtab_hdr->sh_info)
6177 {
6178 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6179 if (sym == NULL)
6180 {
6181 size_t symcnt = symtab_hdr->sh_info;
6182 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6183 symcnt, 0,
6184 NULL, NULL, NULL);
6185 if (sym == NULL)
6186 break;
6187 symtab_hdr->contents = (bfd_byte *) sym;
6188 }
6189 sym += symndx;
6190 }
6191 else
6192 {
6193 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6194 1, symndx,
6195 NULL, NULL, NULL);
6196 if (sym == NULL)
6197 break;
6198 }
6199 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6200 if (sec == NULL)
6201 break;
6202 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6203 val = sym->st_value;
6204 }
6205
6206 val += look->r_addend;
6207 if (code_off != NULL)
6208 *code_off = val;
6209 if (code_sec != NULL)
6210 {
6211 if (in_code_sec && *code_sec != sec)
6212 return -1;
6213 else
6214 *code_sec = sec;
6215 }
6216 if (sec->output_section != NULL)
6217 val += sec->output_section->vma + sec->output_offset;
6218 }
6219 break;
6220 }
6221 }
6222
6223 return val;
6224 }
6225
6226 /* If the ELF symbol SYM might be a function in SEC, return the
6227 function size and set *CODE_OFF to the function's entry point,
6228 otherwise return zero. */
6229
6230 static bfd_size_type
6231 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6232 bfd_vma *code_off)
6233 {
6234 bfd_size_type size;
6235
6236 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6237 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6238 return 0;
6239
6240 size = 0;
6241 if (!(sym->flags & BSF_SYNTHETIC))
6242 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6243
6244 if (strcmp (sym->section->name, ".opd") == 0)
6245 {
6246 struct _opd_sec_data *opd = get_opd_info (sym->section);
6247 bfd_vma symval = sym->value;
6248
6249 if (opd != NULL
6250 && opd->adjust != NULL
6251 && elf_section_data (sym->section)->relocs != NULL)
6252 {
6253 /* opd_entry_value will use cached relocs that have been
6254 adjusted, but with raw symbols. That means both local
6255 and global symbols need adjusting. */
6256 long adjust = opd->adjust[OPD_NDX (symval)];
6257 if (adjust == -1)
6258 return 0;
6259 symval += adjust;
6260 }
6261
6262 if (opd_entry_value (sym->section, symval,
6263 &sec, code_off, TRUE) == (bfd_vma) -1)
6264 return 0;
6265 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6266 symbol. This size has nothing to do with the code size of the
6267 function, which is what we're supposed to return, but the
6268 code size isn't available without looking up the dot-sym.
6269 However, doing that would be a waste of time particularly
6270 since elf_find_function will look at the dot-sym anyway.
6271 Now, elf_find_function will keep the largest size of any
6272 function sym found at the code address of interest, so return
6273 1 here to avoid it incorrectly caching a larger function size
6274 for a small function. This does mean we return the wrong
6275 size for a new-ABI function of size 24, but all that does is
6276 disable caching for such functions. */
6277 if (size == 24)
6278 size = 1;
6279 }
6280 else
6281 {
6282 if (sym->section != sec)
6283 return 0;
6284 *code_off = sym->value;
6285 }
6286 if (size == 0)
6287 size = 1;
6288 return size;
6289 }
6290
6291 /* Return true if symbol is defined in a regular object file. */
6292
6293 static bfd_boolean
6294 is_static_defined (struct elf_link_hash_entry *h)
6295 {
6296 return ((h->root.type == bfd_link_hash_defined
6297 || h->root.type == bfd_link_hash_defweak)
6298 && h->root.u.def.section != NULL
6299 && h->root.u.def.section->output_section != NULL);
6300 }
6301
6302 /* If FDH is a function descriptor symbol, return the associated code
6303 entry symbol if it is defined. Return NULL otherwise. */
6304
6305 static struct ppc_link_hash_entry *
6306 defined_code_entry (struct ppc_link_hash_entry *fdh)
6307 {
6308 if (fdh->is_func_descriptor)
6309 {
6310 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6311 if (fh->elf.root.type == bfd_link_hash_defined
6312 || fh->elf.root.type == bfd_link_hash_defweak)
6313 return fh;
6314 }
6315 return NULL;
6316 }
6317
6318 /* If FH is a function code entry symbol, return the associated
6319 function descriptor symbol if it is defined. Return NULL otherwise. */
6320
6321 static struct ppc_link_hash_entry *
6322 defined_func_desc (struct ppc_link_hash_entry *fh)
6323 {
6324 if (fh->oh != NULL
6325 && fh->oh->is_func_descriptor)
6326 {
6327 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6328 if (fdh->elf.root.type == bfd_link_hash_defined
6329 || fdh->elf.root.type == bfd_link_hash_defweak)
6330 return fdh;
6331 }
6332 return NULL;
6333 }
6334
6335 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6336
6337 /* Garbage collect sections, after first dealing with dot-symbols. */
6338
6339 static bfd_boolean
6340 ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6341 {
6342 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6343
6344 if (htab != NULL && htab->need_func_desc_adj)
6345 {
6346 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6347 htab->need_func_desc_adj = 0;
6348 }
6349 return bfd_elf_gc_sections (abfd, info);
6350 }
6351
6352 /* Mark all our entry sym sections, both opd and code section. */
6353
6354 static void
6355 ppc64_elf_gc_keep (struct bfd_link_info *info)
6356 {
6357 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6358 struct bfd_sym_chain *sym;
6359
6360 if (htab == NULL)
6361 return;
6362
6363 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6364 {
6365 struct ppc_link_hash_entry *eh, *fh;
6366 asection *sec;
6367
6368 eh = (struct ppc_link_hash_entry *)
6369 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6370 if (eh == NULL)
6371 continue;
6372 if (eh->elf.root.type != bfd_link_hash_defined
6373 && eh->elf.root.type != bfd_link_hash_defweak)
6374 continue;
6375
6376 fh = defined_code_entry (eh);
6377 if (fh != NULL)
6378 {
6379 sec = fh->elf.root.u.def.section;
6380 sec->flags |= SEC_KEEP;
6381 }
6382 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6383 && opd_entry_value (eh->elf.root.u.def.section,
6384 eh->elf.root.u.def.value,
6385 &sec, NULL, FALSE) != (bfd_vma) -1)
6386 sec->flags |= SEC_KEEP;
6387
6388 sec = eh->elf.root.u.def.section;
6389 sec->flags |= SEC_KEEP;
6390 }
6391 }
6392
6393 /* Mark sections containing dynamically referenced symbols. When
6394 building shared libraries, we must assume that any visible symbol is
6395 referenced. */
6396
6397 static bfd_boolean
6398 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6399 {
6400 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6401 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6402 struct ppc_link_hash_entry *fdh;
6403 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6404
6405 /* Dynamic linking info is on the func descriptor sym. */
6406 fdh = defined_func_desc (eh);
6407 if (fdh != NULL)
6408 eh = fdh;
6409
6410 if ((eh->elf.root.type == bfd_link_hash_defined
6411 || eh->elf.root.type == bfd_link_hash_defweak)
6412 && (eh->elf.ref_dynamic
6413 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
6414 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6415 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6416 && (!bfd_link_executable (info)
6417 || info->export_dynamic
6418 || (eh->elf.dynamic
6419 && d != NULL
6420 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6421 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6422 || !bfd_hide_sym_by_version (info->version_info,
6423 eh->elf.root.root.string)))))
6424 {
6425 asection *code_sec;
6426 struct ppc_link_hash_entry *fh;
6427
6428 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6429
6430 /* Function descriptor syms cause the associated
6431 function code sym section to be marked. */
6432 fh = defined_code_entry (eh);
6433 if (fh != NULL)
6434 {
6435 code_sec = fh->elf.root.u.def.section;
6436 code_sec->flags |= SEC_KEEP;
6437 }
6438 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6439 && opd_entry_value (eh->elf.root.u.def.section,
6440 eh->elf.root.u.def.value,
6441 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6442 code_sec->flags |= SEC_KEEP;
6443 }
6444
6445 return TRUE;
6446 }
6447
6448 /* Return the section that should be marked against GC for a given
6449 relocation. */
6450
6451 static asection *
6452 ppc64_elf_gc_mark_hook (asection *sec,
6453 struct bfd_link_info *info,
6454 Elf_Internal_Rela *rel,
6455 struct elf_link_hash_entry *h,
6456 Elf_Internal_Sym *sym)
6457 {
6458 asection *rsec;
6459
6460 /* Syms return NULL if we're marking .opd, so we avoid marking all
6461 function sections, as all functions are referenced in .opd. */
6462 rsec = NULL;
6463 if (get_opd_info (sec) != NULL)
6464 return rsec;
6465
6466 if (h != NULL)
6467 {
6468 enum elf_ppc64_reloc_type r_type;
6469 struct ppc_link_hash_entry *eh, *fh, *fdh;
6470
6471 r_type = ELF64_R_TYPE (rel->r_info);
6472 switch (r_type)
6473 {
6474 case R_PPC64_GNU_VTINHERIT:
6475 case R_PPC64_GNU_VTENTRY:
6476 break;
6477
6478 default:
6479 switch (h->root.type)
6480 {
6481 case bfd_link_hash_defined:
6482 case bfd_link_hash_defweak:
6483 eh = (struct ppc_link_hash_entry *) h;
6484 fdh = defined_func_desc (eh);
6485 if (fdh != NULL)
6486 {
6487 /* -mcall-aixdesc code references the dot-symbol on
6488 a call reloc. Mark the function descriptor too
6489 against garbage collection. */
6490 fdh->elf.mark = 1;
6491 if (fdh->elf.u.weakdef != NULL)
6492 fdh->elf.u.weakdef->mark = 1;
6493 eh = fdh;
6494 }
6495
6496 /* Function descriptor syms cause the associated
6497 function code sym section to be marked. */
6498 fh = defined_code_entry (eh);
6499 if (fh != NULL)
6500 {
6501 /* They also mark their opd section. */
6502 eh->elf.root.u.def.section->gc_mark = 1;
6503
6504 rsec = fh->elf.root.u.def.section;
6505 }
6506 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6507 && opd_entry_value (eh->elf.root.u.def.section,
6508 eh->elf.root.u.def.value,
6509 &rsec, NULL, FALSE) != (bfd_vma) -1)
6510 eh->elf.root.u.def.section->gc_mark = 1;
6511 else
6512 rsec = h->root.u.def.section;
6513 break;
6514
6515 case bfd_link_hash_common:
6516 rsec = h->root.u.c.p->section;
6517 break;
6518
6519 default:
6520 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6521 }
6522 }
6523 }
6524 else
6525 {
6526 struct _opd_sec_data *opd;
6527
6528 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6529 opd = get_opd_info (rsec);
6530 if (opd != NULL && opd->func_sec != NULL)
6531 {
6532 rsec->gc_mark = 1;
6533
6534 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
6535 }
6536 }
6537
6538 return rsec;
6539 }
6540
6541 /* Update the .got, .plt. and dynamic reloc reference counts for the
6542 section being removed. */
6543
6544 static bfd_boolean
6545 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6546 asection *sec, const Elf_Internal_Rela *relocs)
6547 {
6548 struct ppc_link_hash_table *htab;
6549 Elf_Internal_Shdr *symtab_hdr;
6550 struct elf_link_hash_entry **sym_hashes;
6551 struct got_entry **local_got_ents;
6552 const Elf_Internal_Rela *rel, *relend;
6553
6554 if (bfd_link_relocatable (info))
6555 return TRUE;
6556
6557 if ((sec->flags & SEC_ALLOC) == 0)
6558 return TRUE;
6559
6560 elf_section_data (sec)->local_dynrel = NULL;
6561
6562 htab = ppc_hash_table (info);
6563 if (htab == NULL)
6564 return FALSE;
6565
6566 symtab_hdr = &elf_symtab_hdr (abfd);
6567 sym_hashes = elf_sym_hashes (abfd);
6568 local_got_ents = elf_local_got_ents (abfd);
6569
6570 relend = relocs + sec->reloc_count;
6571 for (rel = relocs; rel < relend; rel++)
6572 {
6573 unsigned long r_symndx;
6574 enum elf_ppc64_reloc_type r_type;
6575 struct elf_link_hash_entry *h = NULL;
6576 struct plt_entry **plt_list;
6577 unsigned char tls_type = 0;
6578
6579 r_symndx = ELF64_R_SYM (rel->r_info);
6580 r_type = ELF64_R_TYPE (rel->r_info);
6581 if (r_symndx >= symtab_hdr->sh_info)
6582 {
6583 struct ppc_link_hash_entry *eh;
6584 struct elf_dyn_relocs **pp;
6585 struct elf_dyn_relocs *p;
6586
6587 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6588 h = elf_follow_link (h);
6589 eh = (struct ppc_link_hash_entry *) h;
6590
6591 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6592 if (p->sec == sec)
6593 {
6594 /* Everything must go for SEC. */
6595 *pp = p->next;
6596 break;
6597 }
6598 }
6599
6600 switch (r_type)
6601 {
6602 case R_PPC64_GOT_TLSLD16:
6603 case R_PPC64_GOT_TLSLD16_LO:
6604 case R_PPC64_GOT_TLSLD16_HI:
6605 case R_PPC64_GOT_TLSLD16_HA:
6606 tls_type = TLS_TLS | TLS_LD;
6607 goto dogot;
6608
6609 case R_PPC64_GOT_TLSGD16:
6610 case R_PPC64_GOT_TLSGD16_LO:
6611 case R_PPC64_GOT_TLSGD16_HI:
6612 case R_PPC64_GOT_TLSGD16_HA:
6613 tls_type = TLS_TLS | TLS_GD;
6614 goto dogot;
6615
6616 case R_PPC64_GOT_TPREL16_DS:
6617 case R_PPC64_GOT_TPREL16_LO_DS:
6618 case R_PPC64_GOT_TPREL16_HI:
6619 case R_PPC64_GOT_TPREL16_HA:
6620 tls_type = TLS_TLS | TLS_TPREL;
6621 goto dogot;
6622
6623 case R_PPC64_GOT_DTPREL16_DS:
6624 case R_PPC64_GOT_DTPREL16_LO_DS:
6625 case R_PPC64_GOT_DTPREL16_HI:
6626 case R_PPC64_GOT_DTPREL16_HA:
6627 tls_type = TLS_TLS | TLS_DTPREL;
6628 goto dogot;
6629
6630 case R_PPC64_GOT16:
6631 case R_PPC64_GOT16_DS:
6632 case R_PPC64_GOT16_HA:
6633 case R_PPC64_GOT16_HI:
6634 case R_PPC64_GOT16_LO:
6635 case R_PPC64_GOT16_LO_DS:
6636 dogot:
6637 {
6638 struct got_entry *ent;
6639
6640 if (h != NULL)
6641 ent = h->got.glist;
6642 else
6643 ent = local_got_ents[r_symndx];
6644
6645 for (; ent != NULL; ent = ent->next)
6646 if (ent->addend == rel->r_addend
6647 && ent->owner == abfd
6648 && ent->tls_type == tls_type)
6649 break;
6650 if (ent == NULL)
6651 abort ();
6652 if (ent->got.refcount > 0)
6653 ent->got.refcount -= 1;
6654 }
6655 break;
6656
6657 case R_PPC64_PLT16_HA:
6658 case R_PPC64_PLT16_HI:
6659 case R_PPC64_PLT16_LO:
6660 case R_PPC64_PLT32:
6661 case R_PPC64_PLT64:
6662 case R_PPC64_REL14:
6663 case R_PPC64_REL14_BRNTAKEN:
6664 case R_PPC64_REL14_BRTAKEN:
6665 case R_PPC64_REL24:
6666 plt_list = NULL;
6667 if (h != NULL)
6668 plt_list = &h->plt.plist;
6669 else if (local_got_ents != NULL)
6670 {
6671 struct plt_entry **local_plt = (struct plt_entry **)
6672 (local_got_ents + symtab_hdr->sh_info);
6673 unsigned char *local_got_tls_masks = (unsigned char *)
6674 (local_plt + symtab_hdr->sh_info);
6675 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6676 plt_list = local_plt + r_symndx;
6677 }
6678 if (plt_list)
6679 {
6680 struct plt_entry *ent;
6681
6682 for (ent = *plt_list; ent != NULL; ent = ent->next)
6683 if (ent->addend == rel->r_addend)
6684 break;
6685 if (ent != NULL && ent->plt.refcount > 0)
6686 ent->plt.refcount -= 1;
6687 }
6688 break;
6689
6690 default:
6691 break;
6692 }
6693 }
6694 return TRUE;
6695 }
6696
6697 /* The maximum size of .sfpr. */
6698 #define SFPR_MAX (218*4)
6699
6700 struct sfpr_def_parms
6701 {
6702 const char name[12];
6703 unsigned char lo, hi;
6704 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6705 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6706 };
6707
6708 /* Auto-generate _save*, _rest* functions in .sfpr.
6709 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6710 instead. */
6711
6712 static bfd_boolean
6713 sfpr_define (struct bfd_link_info *info,
6714 const struct sfpr_def_parms *parm,
6715 asection *stub_sec)
6716 {
6717 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6718 unsigned int i;
6719 size_t len = strlen (parm->name);
6720 bfd_boolean writing = FALSE;
6721 char sym[16];
6722
6723 if (htab == NULL)
6724 return FALSE;
6725
6726 memcpy (sym, parm->name, len);
6727 sym[len + 2] = 0;
6728
6729 for (i = parm->lo; i <= parm->hi; i++)
6730 {
6731 struct ppc_link_hash_entry *h;
6732
6733 sym[len + 0] = i / 10 + '0';
6734 sym[len + 1] = i % 10 + '0';
6735 h = (struct ppc_link_hash_entry *)
6736 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
6737 if (stub_sec != NULL)
6738 {
6739 if (h != NULL
6740 && h->elf.root.type == bfd_link_hash_defined
6741 && h->elf.root.u.def.section == htab->sfpr)
6742 {
6743 struct elf_link_hash_entry *s;
6744 char buf[32];
6745 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6746 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6747 if (s == NULL)
6748 return FALSE;
6749 if (s->root.type == bfd_link_hash_new
6750 || (s->root.type = bfd_link_hash_defined
6751 && s->root.u.def.section == stub_sec))
6752 {
6753 s->root.type = bfd_link_hash_defined;
6754 s->root.u.def.section = stub_sec;
6755 s->root.u.def.value = (stub_sec->size
6756 + h->elf.root.u.def.value);
6757 s->ref_regular = 1;
6758 s->def_regular = 1;
6759 s->ref_regular_nonweak = 1;
6760 s->forced_local = 1;
6761 s->non_elf = 0;
6762 s->root.linker_def = 1;
6763 }
6764 }
6765 continue;
6766 }
6767 if (h != NULL)
6768 {
6769 h->save_res = 1;
6770 if (!h->elf.def_regular)
6771 {
6772 h->elf.root.type = bfd_link_hash_defined;
6773 h->elf.root.u.def.section = htab->sfpr;
6774 h->elf.root.u.def.value = htab->sfpr->size;
6775 h->elf.type = STT_FUNC;
6776 h->elf.def_regular = 1;
6777 h->elf.non_elf = 0;
6778 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6779 writing = TRUE;
6780 if (htab->sfpr->contents == NULL)
6781 {
6782 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6783 if (htab->sfpr->contents == NULL)
6784 return FALSE;
6785 }
6786 }
6787 }
6788 if (writing)
6789 {
6790 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6791 if (i != parm->hi)
6792 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6793 else
6794 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6795 htab->sfpr->size = p - htab->sfpr->contents;
6796 }
6797 }
6798
6799 return TRUE;
6800 }
6801
6802 static bfd_byte *
6803 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6804 {
6805 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6806 return p + 4;
6807 }
6808
6809 static bfd_byte *
6810 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6811 {
6812 p = savegpr0 (abfd, p, r);
6813 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6814 p = p + 4;
6815 bfd_put_32 (abfd, BLR, p);
6816 return p + 4;
6817 }
6818
6819 static bfd_byte *
6820 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6821 {
6822 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6823 return p + 4;
6824 }
6825
6826 static bfd_byte *
6827 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6828 {
6829 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6830 p = p + 4;
6831 p = restgpr0 (abfd, p, r);
6832 bfd_put_32 (abfd, MTLR_R0, p);
6833 p = p + 4;
6834 if (r == 29)
6835 {
6836 p = restgpr0 (abfd, p, 30);
6837 p = restgpr0 (abfd, p, 31);
6838 }
6839 bfd_put_32 (abfd, BLR, p);
6840 return p + 4;
6841 }
6842
6843 static bfd_byte *
6844 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6845 {
6846 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6847 return p + 4;
6848 }
6849
6850 static bfd_byte *
6851 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6852 {
6853 p = savegpr1 (abfd, p, r);
6854 bfd_put_32 (abfd, BLR, p);
6855 return p + 4;
6856 }
6857
6858 static bfd_byte *
6859 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6860 {
6861 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6862 return p + 4;
6863 }
6864
6865 static bfd_byte *
6866 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6867 {
6868 p = restgpr1 (abfd, p, r);
6869 bfd_put_32 (abfd, BLR, p);
6870 return p + 4;
6871 }
6872
6873 static bfd_byte *
6874 savefpr (bfd *abfd, bfd_byte *p, int r)
6875 {
6876 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6877 return p + 4;
6878 }
6879
6880 static bfd_byte *
6881 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6882 {
6883 p = savefpr (abfd, p, r);
6884 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6885 p = p + 4;
6886 bfd_put_32 (abfd, BLR, p);
6887 return p + 4;
6888 }
6889
6890 static bfd_byte *
6891 restfpr (bfd *abfd, bfd_byte *p, int r)
6892 {
6893 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6894 return p + 4;
6895 }
6896
6897 static bfd_byte *
6898 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6899 {
6900 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6901 p = p + 4;
6902 p = restfpr (abfd, p, r);
6903 bfd_put_32 (abfd, MTLR_R0, p);
6904 p = p + 4;
6905 if (r == 29)
6906 {
6907 p = restfpr (abfd, p, 30);
6908 p = restfpr (abfd, p, 31);
6909 }
6910 bfd_put_32 (abfd, BLR, p);
6911 return p + 4;
6912 }
6913
6914 static bfd_byte *
6915 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6916 {
6917 p = savefpr (abfd, p, r);
6918 bfd_put_32 (abfd, BLR, p);
6919 return p + 4;
6920 }
6921
6922 static bfd_byte *
6923 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6924 {
6925 p = restfpr (abfd, p, r);
6926 bfd_put_32 (abfd, BLR, p);
6927 return p + 4;
6928 }
6929
6930 static bfd_byte *
6931 savevr (bfd *abfd, bfd_byte *p, int r)
6932 {
6933 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6934 p = p + 4;
6935 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6936 return p + 4;
6937 }
6938
6939 static bfd_byte *
6940 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6941 {
6942 p = savevr (abfd, p, r);
6943 bfd_put_32 (abfd, BLR, p);
6944 return p + 4;
6945 }
6946
6947 static bfd_byte *
6948 restvr (bfd *abfd, bfd_byte *p, int r)
6949 {
6950 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6951 p = p + 4;
6952 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6953 return p + 4;
6954 }
6955
6956 static bfd_byte *
6957 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6958 {
6959 p = restvr (abfd, p, r);
6960 bfd_put_32 (abfd, BLR, p);
6961 return p + 4;
6962 }
6963
6964 /* Called via elf_link_hash_traverse to transfer dynamic linking
6965 information on function code symbol entries to their corresponding
6966 function descriptor symbol entries. */
6967
6968 static bfd_boolean
6969 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6970 {
6971 struct bfd_link_info *info;
6972 struct ppc_link_hash_table *htab;
6973 struct ppc_link_hash_entry *fh;
6974 struct ppc_link_hash_entry *fdh;
6975 bfd_boolean force_local;
6976
6977 fh = (struct ppc_link_hash_entry *) h;
6978 if (fh->elf.root.type == bfd_link_hash_indirect)
6979 return TRUE;
6980
6981 if (!fh->is_func)
6982 return TRUE;
6983
6984 if (fh->elf.root.root.string[0] != '.'
6985 || fh->elf.root.root.string[1] == '\0')
6986 return TRUE;
6987
6988 info = inf;
6989 htab = ppc_hash_table (info);
6990 if (htab == NULL)
6991 return FALSE;
6992
6993 /* Find the corresponding function descriptor symbol. */
6994 fdh = lookup_fdh (fh, htab);
6995
6996 /* Resolve undefined references to dot-symbols as the value
6997 in the function descriptor, if we have one in a regular object.
6998 This is to satisfy cases like ".quad .foo". Calls to functions
6999 in dynamic objects are handled elsewhere. */
7000 if ((fh->elf.root.type == bfd_link_hash_undefined
7001 || fh->elf.root.type == bfd_link_hash_undefweak)
7002 && (fdh->elf.root.type == bfd_link_hash_defined
7003 || fdh->elf.root.type == bfd_link_hash_defweak)
7004 && get_opd_info (fdh->elf.root.u.def.section) != NULL
7005 && opd_entry_value (fdh->elf.root.u.def.section,
7006 fdh->elf.root.u.def.value,
7007 &fh->elf.root.u.def.section,
7008 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
7009 {
7010 fh->elf.root.type = fdh->elf.root.type;
7011 fh->elf.forced_local = 1;
7012 fh->elf.def_regular = fdh->elf.def_regular;
7013 fh->elf.def_dynamic = fdh->elf.def_dynamic;
7014 }
7015
7016 if (!fh->elf.dynamic)
7017 {
7018 struct plt_entry *ent;
7019
7020 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
7021 if (ent->plt.refcount > 0)
7022 break;
7023 if (ent == NULL)
7024 return TRUE;
7025 }
7026
7027 /* Create a descriptor as undefined if necessary. */
7028 if (fdh == NULL
7029 && !bfd_link_executable (info)
7030 && (fh->elf.root.type == bfd_link_hash_undefined
7031 || fh->elf.root.type == bfd_link_hash_undefweak))
7032 {
7033 fdh = make_fdh (info, fh);
7034 if (fdh == NULL)
7035 return FALSE;
7036 }
7037
7038 /* We can't support overriding of symbols on a fake descriptor. */
7039 if (fdh != NULL
7040 && fdh->fake
7041 && (fh->elf.root.type == bfd_link_hash_defined
7042 || fh->elf.root.type == bfd_link_hash_defweak))
7043 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
7044
7045 /* Transfer dynamic linking information to the function descriptor. */
7046 if (fdh != NULL)
7047 {
7048 fdh->elf.ref_regular |= fh->elf.ref_regular;
7049 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
7050 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
7051 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
7052 fdh->elf.dynamic |= fh->elf.dynamic;
7053 fdh->elf.needs_plt |= (fh->elf.needs_plt
7054 || fh->elf.type == STT_FUNC
7055 || fh->elf.type == STT_GNU_IFUNC);
7056 move_plt_plist (fh, fdh);
7057
7058 if (!fdh->elf.forced_local
7059 && fh->elf.dynindx != -1)
7060 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
7061 return FALSE;
7062 }
7063
7064 /* Now that the info is on the function descriptor, clear the
7065 function code sym info. Any function code syms for which we
7066 don't have a definition in a regular file, we force local.
7067 This prevents a shared library from exporting syms that have
7068 been imported from another library. Function code syms that
7069 are really in the library we must leave global to prevent the
7070 linker dragging in a definition from a static library. */
7071 force_local = (!fh->elf.def_regular
7072 || fdh == NULL
7073 || !fdh->elf.def_regular
7074 || fdh->elf.forced_local);
7075 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7076
7077 return TRUE;
7078 }
7079
7080 static const struct sfpr_def_parms save_res_funcs[] =
7081 {
7082 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7083 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7084 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7085 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7086 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7087 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7088 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7089 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7090 { "._savef", 14, 31, savefpr, savefpr1_tail },
7091 { "._restf", 14, 31, restfpr, restfpr1_tail },
7092 { "_savevr_", 20, 31, savevr, savevr_tail },
7093 { "_restvr_", 20, 31, restvr, restvr_tail }
7094 };
7095
7096 /* Called near the start of bfd_elf_size_dynamic_sections. We use
7097 this hook to a) provide some gcc support functions, and b) transfer
7098 dynamic linking information gathered so far on function code symbol
7099 entries, to their corresponding function descriptor symbol entries. */
7100
7101 static bfd_boolean
7102 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7103 struct bfd_link_info *info)
7104 {
7105 struct ppc_link_hash_table *htab;
7106
7107 htab = ppc_hash_table (info);
7108 if (htab == NULL)
7109 return FALSE;
7110
7111 /* Provide any missing _save* and _rest* functions. */
7112 if (htab->sfpr != NULL)
7113 {
7114 unsigned int i;
7115
7116 htab->sfpr->size = 0;
7117 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7118 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7119 return FALSE;
7120 if (htab->sfpr->size == 0)
7121 htab->sfpr->flags |= SEC_EXCLUDE;
7122 }
7123
7124 if (bfd_link_relocatable (info))
7125 return TRUE;
7126
7127 if (htab->elf.hgot != NULL)
7128 {
7129 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7130 /* Make .TOC. defined so as to prevent it being made dynamic.
7131 The wrong value here is fixed later in ppc64_elf_set_toc. */
7132 if (!htab->elf.hgot->def_regular
7133 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7134 {
7135 htab->elf.hgot->root.type = bfd_link_hash_defined;
7136 htab->elf.hgot->root.u.def.value = 0;
7137 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7138 htab->elf.hgot->def_regular = 1;
7139 htab->elf.hgot->root.linker_def = 1;
7140 }
7141 htab->elf.hgot->type = STT_OBJECT;
7142 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7143 | STV_HIDDEN);
7144 }
7145
7146 if (htab->need_func_desc_adj)
7147 {
7148 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7149 htab->need_func_desc_adj = 0;
7150 }
7151
7152 return TRUE;
7153 }
7154
7155 /* Return true if we have dynamic relocs against H that apply to
7156 read-only sections. */
7157
7158 static bfd_boolean
7159 readonly_dynrelocs (struct elf_link_hash_entry *h)
7160 {
7161 struct ppc_link_hash_entry *eh;
7162 struct elf_dyn_relocs *p;
7163
7164 eh = (struct ppc_link_hash_entry *) h;
7165 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7166 {
7167 asection *s = p->sec->output_section;
7168
7169 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7170 return TRUE;
7171 }
7172 return FALSE;
7173 }
7174
7175 /* Return true if we have dynamic relocs against H or any of its weak
7176 aliases, that apply to read-only sections. */
7177
7178 static bfd_boolean
7179 alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7180 {
7181 struct ppc_link_hash_entry *eh;
7182
7183 eh = (struct ppc_link_hash_entry *) h;
7184 do
7185 {
7186 if (readonly_dynrelocs (&eh->elf))
7187 return TRUE;
7188 eh = eh->weakref;
7189 } while (eh != NULL && &eh->elf != h);
7190
7191 return FALSE;
7192 }
7193
7194 /* Return whether EH has pc-relative dynamic relocs. */
7195
7196 static bfd_boolean
7197 pc_dynrelocs (struct ppc_link_hash_entry *eh)
7198 {
7199 struct elf_dyn_relocs *p;
7200
7201 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7202 if (p->pc_count != 0)
7203 return TRUE;
7204 return FALSE;
7205 }
7206
7207 /* Return true if a global entry stub will be created for H. Valid
7208 for ELFv2 before plt entries have been allocated. */
7209
7210 static bfd_boolean
7211 global_entry_stub (struct elf_link_hash_entry *h)
7212 {
7213 struct plt_entry *pent;
7214
7215 if (!h->pointer_equality_needed
7216 || h->def_regular)
7217 return FALSE;
7218
7219 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7220 if (pent->plt.refcount > 0
7221 && pent->addend == 0)
7222 return TRUE;
7223
7224 return FALSE;
7225 }
7226
7227 /* Adjust a symbol defined by a dynamic object and referenced by a
7228 regular object. The current definition is in some section of the
7229 dynamic object, but we're not including those sections. We have to
7230 change the definition to something the rest of the link can
7231 understand. */
7232
7233 static bfd_boolean
7234 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7235 struct elf_link_hash_entry *h)
7236 {
7237 struct ppc_link_hash_table *htab;
7238 asection *s;
7239
7240 htab = ppc_hash_table (info);
7241 if (htab == NULL)
7242 return FALSE;
7243
7244 /* Deal with function syms. */
7245 if (h->type == STT_FUNC
7246 || h->type == STT_GNU_IFUNC
7247 || h->needs_plt)
7248 {
7249 /* Clear procedure linkage table information for any symbol that
7250 won't need a .plt entry. */
7251 struct plt_entry *ent;
7252 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7253 if (ent->plt.refcount > 0)
7254 break;
7255 if (ent == NULL
7256 || (h->type != STT_GNU_IFUNC
7257 && (SYMBOL_CALLS_LOCAL (info, h)
7258 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7259 && h->root.type == bfd_link_hash_undefweak)))
7260 || ((struct ppc_link_hash_entry *) h)->save_res)
7261 {
7262 h->plt.plist = NULL;
7263 h->needs_plt = 0;
7264 h->pointer_equality_needed = 0;
7265 }
7266 else if (abiversion (info->output_bfd) >= 2)
7267 {
7268 /* Taking a function's address in a read/write section
7269 doesn't require us to define the function symbol in the
7270 executable on a global entry stub. A dynamic reloc can
7271 be used instead. The reason we prefer a few more dynamic
7272 relocs is that calling via a global entry stub costs a
7273 few more instructions, and pointer_equality_needed causes
7274 extra work in ld.so when resolving these symbols. */
7275 if (global_entry_stub (h)
7276 && !alias_readonly_dynrelocs (h))
7277 {
7278 h->pointer_equality_needed = 0;
7279 /* After adjust_dynamic_symbol, non_got_ref set in
7280 the non-pic case means that dyn_relocs for this
7281 symbol should be discarded. */
7282 h->non_got_ref = 0;
7283 }
7284
7285 /* If making a plt entry, then we don't need copy relocs. */
7286 return TRUE;
7287 }
7288 }
7289 else
7290 h->plt.plist = NULL;
7291
7292 /* If this is a weak symbol, and there is a real definition, the
7293 processor independent code will have arranged for us to see the
7294 real definition first, and we can just use the same value. */
7295 if (h->u.weakdef != NULL)
7296 {
7297 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7298 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7299 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7300 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7301 if (ELIMINATE_COPY_RELOCS)
7302 h->non_got_ref = h->u.weakdef->non_got_ref;
7303 return TRUE;
7304 }
7305
7306 /* If we are creating a shared library, we must presume that the
7307 only references to the symbol are via the global offset table.
7308 For such cases we need not do anything here; the relocations will
7309 be handled correctly by relocate_section. */
7310 if (bfd_link_pic (info))
7311 return TRUE;
7312
7313 /* If there are no references to this symbol that do not use the
7314 GOT, we don't need to generate a copy reloc. */
7315 if (!h->non_got_ref)
7316 return TRUE;
7317
7318 /* Don't generate a copy reloc for symbols defined in the executable. */
7319 if (!h->def_dynamic || !h->ref_regular || h->def_regular
7320
7321 /* If -z nocopyreloc was given, don't generate them either. */
7322 || info->nocopyreloc
7323
7324 /* If we didn't find any dynamic relocs in read-only sections, then
7325 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7326 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
7327
7328 /* Protected variables do not work with .dynbss. The copy in
7329 .dynbss won't be used by the shared library with the protected
7330 definition for the variable. Text relocations are preferable
7331 to an incorrect program. */
7332 || h->protected_def)
7333 {
7334 h->non_got_ref = 0;
7335 return TRUE;
7336 }
7337
7338 if (h->plt.plist != NULL)
7339 {
7340 /* We should never get here, but unfortunately there are versions
7341 of gcc out there that improperly (for this ABI) put initialized
7342 function pointers, vtable refs and suchlike in read-only
7343 sections. Allow them to proceed, but warn that this might
7344 break at runtime. */
7345 info->callbacks->einfo
7346 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7347 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7348 h->root.root.string);
7349 }
7350
7351 /* This is a reference to a symbol defined by a dynamic object which
7352 is not a function. */
7353
7354 /* We must allocate the symbol in our .dynbss section, which will
7355 become part of the .bss section of the executable. There will be
7356 an entry for this symbol in the .dynsym section. The dynamic
7357 object will contain position independent code, so all references
7358 from the dynamic object to this symbol will go through the global
7359 offset table. The dynamic linker will use the .dynsym entry to
7360 determine the address it must put in the global offset table, so
7361 both the dynamic object and the regular object will refer to the
7362 same memory location for the variable. */
7363
7364 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7365 to copy the initial value out of the dynamic object and into the
7366 runtime process image. We need to remember the offset into the
7367 .rela.bss section we are going to use. */
7368 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7369 {
7370 htab->elf.srelbss->size += sizeof (Elf64_External_Rela);
7371 h->needs_copy = 1;
7372 }
7373
7374 s = htab->elf.sdynbss;
7375
7376 return _bfd_elf_adjust_dynamic_copy (info, h, s);
7377 }
7378
7379 /* If given a function descriptor symbol, hide both the function code
7380 sym and the descriptor. */
7381 static void
7382 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7383 struct elf_link_hash_entry *h,
7384 bfd_boolean force_local)
7385 {
7386 struct ppc_link_hash_entry *eh;
7387 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7388
7389 eh = (struct ppc_link_hash_entry *) h;
7390 if (eh->is_func_descriptor)
7391 {
7392 struct ppc_link_hash_entry *fh = eh->oh;
7393
7394 if (fh == NULL)
7395 {
7396 const char *p, *q;
7397 struct elf_link_hash_table *htab = elf_hash_table (info);
7398 char save;
7399
7400 /* We aren't supposed to use alloca in BFD because on
7401 systems which do not have alloca the version in libiberty
7402 calls xmalloc, which might cause the program to crash
7403 when it runs out of memory. This function doesn't have a
7404 return status, so there's no way to gracefully return an
7405 error. So cheat. We know that string[-1] can be safely
7406 accessed; It's either a string in an ELF string table,
7407 or allocated in an objalloc structure. */
7408
7409 p = eh->elf.root.root.string - 1;
7410 save = *p;
7411 *(char *) p = '.';
7412 fh = (struct ppc_link_hash_entry *)
7413 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7414 *(char *) p = save;
7415
7416 /* Unfortunately, if it so happens that the string we were
7417 looking for was allocated immediately before this string,
7418 then we overwrote the string terminator. That's the only
7419 reason the lookup should fail. */
7420 if (fh == NULL)
7421 {
7422 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7423 while (q >= eh->elf.root.root.string && *q == *p)
7424 --q, --p;
7425 if (q < eh->elf.root.root.string && *p == '.')
7426 fh = (struct ppc_link_hash_entry *)
7427 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7428 }
7429 if (fh != NULL)
7430 {
7431 eh->oh = fh;
7432 fh->oh = eh;
7433 }
7434 }
7435 if (fh != NULL)
7436 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7437 }
7438 }
7439
7440 static bfd_boolean
7441 get_sym_h (struct elf_link_hash_entry **hp,
7442 Elf_Internal_Sym **symp,
7443 asection **symsecp,
7444 unsigned char **tls_maskp,
7445 Elf_Internal_Sym **locsymsp,
7446 unsigned long r_symndx,
7447 bfd *ibfd)
7448 {
7449 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7450
7451 if (r_symndx >= symtab_hdr->sh_info)
7452 {
7453 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7454 struct elf_link_hash_entry *h;
7455
7456 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7457 h = elf_follow_link (h);
7458
7459 if (hp != NULL)
7460 *hp = h;
7461
7462 if (symp != NULL)
7463 *symp = NULL;
7464
7465 if (symsecp != NULL)
7466 {
7467 asection *symsec = NULL;
7468 if (h->root.type == bfd_link_hash_defined
7469 || h->root.type == bfd_link_hash_defweak)
7470 symsec = h->root.u.def.section;
7471 *symsecp = symsec;
7472 }
7473
7474 if (tls_maskp != NULL)
7475 {
7476 struct ppc_link_hash_entry *eh;
7477
7478 eh = (struct ppc_link_hash_entry *) h;
7479 *tls_maskp = &eh->tls_mask;
7480 }
7481 }
7482 else
7483 {
7484 Elf_Internal_Sym *sym;
7485 Elf_Internal_Sym *locsyms = *locsymsp;
7486
7487 if (locsyms == NULL)
7488 {
7489 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7490 if (locsyms == NULL)
7491 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7492 symtab_hdr->sh_info,
7493 0, NULL, NULL, NULL);
7494 if (locsyms == NULL)
7495 return FALSE;
7496 *locsymsp = locsyms;
7497 }
7498 sym = locsyms + r_symndx;
7499
7500 if (hp != NULL)
7501 *hp = NULL;
7502
7503 if (symp != NULL)
7504 *symp = sym;
7505
7506 if (symsecp != NULL)
7507 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7508
7509 if (tls_maskp != NULL)
7510 {
7511 struct got_entry **lgot_ents;
7512 unsigned char *tls_mask;
7513
7514 tls_mask = NULL;
7515 lgot_ents = elf_local_got_ents (ibfd);
7516 if (lgot_ents != NULL)
7517 {
7518 struct plt_entry **local_plt = (struct plt_entry **)
7519 (lgot_ents + symtab_hdr->sh_info);
7520 unsigned char *lgot_masks = (unsigned char *)
7521 (local_plt + symtab_hdr->sh_info);
7522 tls_mask = &lgot_masks[r_symndx];
7523 }
7524 *tls_maskp = tls_mask;
7525 }
7526 }
7527 return TRUE;
7528 }
7529
7530 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7531 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7532 type suitable for optimization, and 1 otherwise. */
7533
7534 static int
7535 get_tls_mask (unsigned char **tls_maskp,
7536 unsigned long *toc_symndx,
7537 bfd_vma *toc_addend,
7538 Elf_Internal_Sym **locsymsp,
7539 const Elf_Internal_Rela *rel,
7540 bfd *ibfd)
7541 {
7542 unsigned long r_symndx;
7543 int next_r;
7544 struct elf_link_hash_entry *h;
7545 Elf_Internal_Sym *sym;
7546 asection *sec;
7547 bfd_vma off;
7548
7549 r_symndx = ELF64_R_SYM (rel->r_info);
7550 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7551 return 0;
7552
7553 if ((*tls_maskp != NULL && **tls_maskp != 0)
7554 || sec == NULL
7555 || ppc64_elf_section_data (sec) == NULL
7556 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7557 return 1;
7558
7559 /* Look inside a TOC section too. */
7560 if (h != NULL)
7561 {
7562 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7563 off = h->root.u.def.value;
7564 }
7565 else
7566 off = sym->st_value;
7567 off += rel->r_addend;
7568 BFD_ASSERT (off % 8 == 0);
7569 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7570 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7571 if (toc_symndx != NULL)
7572 *toc_symndx = r_symndx;
7573 if (toc_addend != NULL)
7574 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7575 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7576 return 0;
7577 if ((h == NULL || is_static_defined (h))
7578 && (next_r == -1 || next_r == -2))
7579 return 1 - next_r;
7580 return 1;
7581 }
7582
7583 /* Find (or create) an entry in the tocsave hash table. */
7584
7585 static struct tocsave_entry *
7586 tocsave_find (struct ppc_link_hash_table *htab,
7587 enum insert_option insert,
7588 Elf_Internal_Sym **local_syms,
7589 const Elf_Internal_Rela *irela,
7590 bfd *ibfd)
7591 {
7592 unsigned long r_indx;
7593 struct elf_link_hash_entry *h;
7594 Elf_Internal_Sym *sym;
7595 struct tocsave_entry ent, *p;
7596 hashval_t hash;
7597 struct tocsave_entry **slot;
7598
7599 r_indx = ELF64_R_SYM (irela->r_info);
7600 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7601 return NULL;
7602 if (ent.sec == NULL || ent.sec->output_section == NULL)
7603 {
7604 _bfd_error_handler
7605 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7606 return NULL;
7607 }
7608
7609 if (h != NULL)
7610 ent.offset = h->root.u.def.value;
7611 else
7612 ent.offset = sym->st_value;
7613 ent.offset += irela->r_addend;
7614
7615 hash = tocsave_htab_hash (&ent);
7616 slot = ((struct tocsave_entry **)
7617 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7618 if (slot == NULL)
7619 return NULL;
7620
7621 if (*slot == NULL)
7622 {
7623 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7624 if (p == NULL)
7625 return NULL;
7626 *p = ent;
7627 *slot = p;
7628 }
7629 return *slot;
7630 }
7631
7632 /* Adjust all global syms defined in opd sections. In gcc generated
7633 code for the old ABI, these will already have been done. */
7634
7635 static bfd_boolean
7636 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7637 {
7638 struct ppc_link_hash_entry *eh;
7639 asection *sym_sec;
7640 struct _opd_sec_data *opd;
7641
7642 if (h->root.type == bfd_link_hash_indirect)
7643 return TRUE;
7644
7645 if (h->root.type != bfd_link_hash_defined
7646 && h->root.type != bfd_link_hash_defweak)
7647 return TRUE;
7648
7649 eh = (struct ppc_link_hash_entry *) h;
7650 if (eh->adjust_done)
7651 return TRUE;
7652
7653 sym_sec = eh->elf.root.u.def.section;
7654 opd = get_opd_info (sym_sec);
7655 if (opd != NULL && opd->adjust != NULL)
7656 {
7657 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
7658 if (adjust == -1)
7659 {
7660 /* This entry has been deleted. */
7661 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7662 if (dsec == NULL)
7663 {
7664 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7665 if (discarded_section (dsec))
7666 {
7667 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7668 break;
7669 }
7670 }
7671 eh->elf.root.u.def.value = 0;
7672 eh->elf.root.u.def.section = dsec;
7673 }
7674 else
7675 eh->elf.root.u.def.value += adjust;
7676 eh->adjust_done = 1;
7677 }
7678 return TRUE;
7679 }
7680
7681 /* Handles decrementing dynamic reloc counts for the reloc specified by
7682 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7683 have already been determined. */
7684
7685 static bfd_boolean
7686 dec_dynrel_count (bfd_vma r_info,
7687 asection *sec,
7688 struct bfd_link_info *info,
7689 Elf_Internal_Sym **local_syms,
7690 struct elf_link_hash_entry *h,
7691 Elf_Internal_Sym *sym)
7692 {
7693 enum elf_ppc64_reloc_type r_type;
7694 asection *sym_sec = NULL;
7695
7696 /* Can this reloc be dynamic? This switch, and later tests here
7697 should be kept in sync with the code in check_relocs. */
7698 r_type = ELF64_R_TYPE (r_info);
7699 switch (r_type)
7700 {
7701 default:
7702 return TRUE;
7703
7704 case R_PPC64_TPREL16:
7705 case R_PPC64_TPREL16_LO:
7706 case R_PPC64_TPREL16_HI:
7707 case R_PPC64_TPREL16_HA:
7708 case R_PPC64_TPREL16_DS:
7709 case R_PPC64_TPREL16_LO_DS:
7710 case R_PPC64_TPREL16_HIGH:
7711 case R_PPC64_TPREL16_HIGHA:
7712 case R_PPC64_TPREL16_HIGHER:
7713 case R_PPC64_TPREL16_HIGHERA:
7714 case R_PPC64_TPREL16_HIGHEST:
7715 case R_PPC64_TPREL16_HIGHESTA:
7716 if (!bfd_link_pic (info))
7717 return TRUE;
7718
7719 case R_PPC64_TPREL64:
7720 case R_PPC64_DTPMOD64:
7721 case R_PPC64_DTPREL64:
7722 case R_PPC64_ADDR64:
7723 case R_PPC64_REL30:
7724 case R_PPC64_REL32:
7725 case R_PPC64_REL64:
7726 case R_PPC64_ADDR14:
7727 case R_PPC64_ADDR14_BRNTAKEN:
7728 case R_PPC64_ADDR14_BRTAKEN:
7729 case R_PPC64_ADDR16:
7730 case R_PPC64_ADDR16_DS:
7731 case R_PPC64_ADDR16_HA:
7732 case R_PPC64_ADDR16_HI:
7733 case R_PPC64_ADDR16_HIGH:
7734 case R_PPC64_ADDR16_HIGHA:
7735 case R_PPC64_ADDR16_HIGHER:
7736 case R_PPC64_ADDR16_HIGHERA:
7737 case R_PPC64_ADDR16_HIGHEST:
7738 case R_PPC64_ADDR16_HIGHESTA:
7739 case R_PPC64_ADDR16_LO:
7740 case R_PPC64_ADDR16_LO_DS:
7741 case R_PPC64_ADDR24:
7742 case R_PPC64_ADDR32:
7743 case R_PPC64_UADDR16:
7744 case R_PPC64_UADDR32:
7745 case R_PPC64_UADDR64:
7746 case R_PPC64_TOC:
7747 break;
7748 }
7749
7750 if (local_syms != NULL)
7751 {
7752 unsigned long r_symndx;
7753 bfd *ibfd = sec->owner;
7754
7755 r_symndx = ELF64_R_SYM (r_info);
7756 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7757 return FALSE;
7758 }
7759
7760 if ((bfd_link_pic (info)
7761 && (must_be_dyn_reloc (info, r_type)
7762 || (h != NULL
7763 && (!SYMBOLIC_BIND (info, h)
7764 || h->root.type == bfd_link_hash_defweak
7765 || !h->def_regular))))
7766 || (ELIMINATE_COPY_RELOCS
7767 && !bfd_link_pic (info)
7768 && h != NULL
7769 && (h->root.type == bfd_link_hash_defweak
7770 || !h->def_regular)))
7771 ;
7772 else
7773 return TRUE;
7774
7775 if (h != NULL)
7776 {
7777 struct elf_dyn_relocs *p;
7778 struct elf_dyn_relocs **pp;
7779 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7780
7781 /* elf_gc_sweep may have already removed all dyn relocs associated
7782 with local syms for a given section. Also, symbol flags are
7783 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7784 report a dynreloc miscount. */
7785 if (*pp == NULL && info->gc_sections)
7786 return TRUE;
7787
7788 while ((p = *pp) != NULL)
7789 {
7790 if (p->sec == sec)
7791 {
7792 if (!must_be_dyn_reloc (info, r_type))
7793 p->pc_count -= 1;
7794 p->count -= 1;
7795 if (p->count == 0)
7796 *pp = p->next;
7797 return TRUE;
7798 }
7799 pp = &p->next;
7800 }
7801 }
7802 else
7803 {
7804 struct ppc_dyn_relocs *p;
7805 struct ppc_dyn_relocs **pp;
7806 void *vpp;
7807 bfd_boolean is_ifunc;
7808
7809 if (local_syms == NULL)
7810 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7811 if (sym_sec == NULL)
7812 sym_sec = sec;
7813
7814 vpp = &elf_section_data (sym_sec)->local_dynrel;
7815 pp = (struct ppc_dyn_relocs **) vpp;
7816
7817 if (*pp == NULL && info->gc_sections)
7818 return TRUE;
7819
7820 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7821 while ((p = *pp) != NULL)
7822 {
7823 if (p->sec == sec && p->ifunc == is_ifunc)
7824 {
7825 p->count -= 1;
7826 if (p->count == 0)
7827 *pp = p->next;
7828 return TRUE;
7829 }
7830 pp = &p->next;
7831 }
7832 }
7833
7834 /* xgettext:c-format */
7835 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7836 sec->owner, sec);
7837 bfd_set_error (bfd_error_bad_value);
7838 return FALSE;
7839 }
7840
7841 /* Remove unused Official Procedure Descriptor entries. Currently we
7842 only remove those associated with functions in discarded link-once
7843 sections, or weakly defined functions that have been overridden. It
7844 would be possible to remove many more entries for statically linked
7845 applications. */
7846
7847 bfd_boolean
7848 ppc64_elf_edit_opd (struct bfd_link_info *info)
7849 {
7850 bfd *ibfd;
7851 bfd_boolean some_edited = FALSE;
7852 asection *need_pad = NULL;
7853 struct ppc_link_hash_table *htab;
7854
7855 htab = ppc_hash_table (info);
7856 if (htab == NULL)
7857 return FALSE;
7858
7859 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7860 {
7861 asection *sec;
7862 Elf_Internal_Rela *relstart, *rel, *relend;
7863 Elf_Internal_Shdr *symtab_hdr;
7864 Elf_Internal_Sym *local_syms;
7865 struct _opd_sec_data *opd;
7866 bfd_boolean need_edit, add_aux_fields, broken;
7867 bfd_size_type cnt_16b = 0;
7868
7869 if (!is_ppc64_elf (ibfd))
7870 continue;
7871
7872 sec = bfd_get_section_by_name (ibfd, ".opd");
7873 if (sec == NULL || sec->size == 0)
7874 continue;
7875
7876 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7877 continue;
7878
7879 if (sec->output_section == bfd_abs_section_ptr)
7880 continue;
7881
7882 /* Look through the section relocs. */
7883 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7884 continue;
7885
7886 local_syms = NULL;
7887 symtab_hdr = &elf_symtab_hdr (ibfd);
7888
7889 /* Read the relocations. */
7890 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7891 info->keep_memory);
7892 if (relstart == NULL)
7893 return FALSE;
7894
7895 /* First run through the relocs to check they are sane, and to
7896 determine whether we need to edit this opd section. */
7897 need_edit = FALSE;
7898 broken = FALSE;
7899 need_pad = sec;
7900 relend = relstart + sec->reloc_count;
7901 for (rel = relstart; rel < relend; )
7902 {
7903 enum elf_ppc64_reloc_type r_type;
7904 unsigned long r_symndx;
7905 asection *sym_sec;
7906 struct elf_link_hash_entry *h;
7907 Elf_Internal_Sym *sym;
7908 bfd_vma offset;
7909
7910 /* .opd contains an array of 16 or 24 byte entries. We're
7911 only interested in the reloc pointing to a function entry
7912 point. */
7913 offset = rel->r_offset;
7914 if (rel + 1 == relend
7915 || rel[1].r_offset != offset + 8)
7916 {
7917 /* If someone messes with .opd alignment then after a
7918 "ld -r" we might have padding in the middle of .opd.
7919 Also, there's nothing to prevent someone putting
7920 something silly in .opd with the assembler. No .opd
7921 optimization for them! */
7922 broken_opd:
7923 _bfd_error_handler
7924 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7925 broken = TRUE;
7926 break;
7927 }
7928
7929 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7930 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7931 {
7932 _bfd_error_handler
7933 /* xgettext:c-format */
7934 (_("%B: unexpected reloc type %u in .opd section"),
7935 ibfd, r_type);
7936 broken = TRUE;
7937 break;
7938 }
7939
7940 r_symndx = ELF64_R_SYM (rel->r_info);
7941 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7942 r_symndx, ibfd))
7943 goto error_ret;
7944
7945 if (sym_sec == NULL || sym_sec->owner == NULL)
7946 {
7947 const char *sym_name;
7948 if (h != NULL)
7949 sym_name = h->root.root.string;
7950 else
7951 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7952 sym_sec);
7953
7954 _bfd_error_handler
7955 /* xgettext:c-format */
7956 (_("%B: undefined sym `%s' in .opd section"),
7957 ibfd, sym_name);
7958 broken = TRUE;
7959 break;
7960 }
7961
7962 /* opd entries are always for functions defined in the
7963 current input bfd. If the symbol isn't defined in the
7964 input bfd, then we won't be using the function in this
7965 bfd; It must be defined in a linkonce section in another
7966 bfd, or is weak. It's also possible that we are
7967 discarding the function due to a linker script /DISCARD/,
7968 which we test for via the output_section. */
7969 if (sym_sec->owner != ibfd
7970 || sym_sec->output_section == bfd_abs_section_ptr)
7971 need_edit = TRUE;
7972
7973 rel += 2;
7974 if (rel + 1 == relend
7975 || (rel + 2 < relend
7976 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7977 ++rel;
7978
7979 if (rel == relend)
7980 {
7981 if (sec->size == offset + 24)
7982 {
7983 need_pad = NULL;
7984 break;
7985 }
7986 if (sec->size == offset + 16)
7987 {
7988 cnt_16b++;
7989 break;
7990 }
7991 goto broken_opd;
7992 }
7993 else if (rel + 1 < relend
7994 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7995 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7996 {
7997 if (rel[0].r_offset == offset + 16)
7998 cnt_16b++;
7999 else if (rel[0].r_offset != offset + 24)
8000 goto broken_opd;
8001 }
8002 else
8003 goto broken_opd;
8004 }
8005
8006 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
8007
8008 if (!broken && (need_edit || add_aux_fields))
8009 {
8010 Elf_Internal_Rela *write_rel;
8011 Elf_Internal_Shdr *rel_hdr;
8012 bfd_byte *rptr, *wptr;
8013 bfd_byte *new_contents;
8014 bfd_size_type amt;
8015
8016 new_contents = NULL;
8017 amt = OPD_NDX (sec->size) * sizeof (long);
8018 opd = &ppc64_elf_section_data (sec)->u.opd;
8019 opd->adjust = bfd_zalloc (sec->owner, amt);
8020 if (opd->adjust == NULL)
8021 return FALSE;
8022 ppc64_elf_section_data (sec)->sec_type = sec_opd;
8023
8024 /* This seems a waste of time as input .opd sections are all
8025 zeros as generated by gcc, but I suppose there's no reason
8026 this will always be so. We might start putting something in
8027 the third word of .opd entries. */
8028 if ((sec->flags & SEC_IN_MEMORY) == 0)
8029 {
8030 bfd_byte *loc;
8031 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
8032 {
8033 if (loc != NULL)
8034 free (loc);
8035 error_ret:
8036 if (local_syms != NULL
8037 && symtab_hdr->contents != (unsigned char *) local_syms)
8038 free (local_syms);
8039 if (elf_section_data (sec)->relocs != relstart)
8040 free (relstart);
8041 return FALSE;
8042 }
8043 sec->contents = loc;
8044 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8045 }
8046
8047 elf_section_data (sec)->relocs = relstart;
8048
8049 new_contents = sec->contents;
8050 if (add_aux_fields)
8051 {
8052 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
8053 if (new_contents == NULL)
8054 return FALSE;
8055 need_pad = NULL;
8056 }
8057 wptr = new_contents;
8058 rptr = sec->contents;
8059 write_rel = relstart;
8060 for (rel = relstart; rel < relend; )
8061 {
8062 unsigned long r_symndx;
8063 asection *sym_sec;
8064 struct elf_link_hash_entry *h;
8065 struct ppc_link_hash_entry *fdh = NULL;
8066 Elf_Internal_Sym *sym;
8067 long opd_ent_size;
8068 Elf_Internal_Rela *next_rel;
8069 bfd_boolean skip;
8070
8071 r_symndx = ELF64_R_SYM (rel->r_info);
8072 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8073 r_symndx, ibfd))
8074 goto error_ret;
8075
8076 next_rel = rel + 2;
8077 if (next_rel + 1 == relend
8078 || (next_rel + 2 < relend
8079 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8080 ++next_rel;
8081
8082 /* See if the .opd entry is full 24 byte or
8083 16 byte (with fd_aux entry overlapped with next
8084 fd_func). */
8085 opd_ent_size = 24;
8086 if (next_rel == relend)
8087 {
8088 if (sec->size == rel->r_offset + 16)
8089 opd_ent_size = 16;
8090 }
8091 else if (next_rel->r_offset == rel->r_offset + 16)
8092 opd_ent_size = 16;
8093
8094 if (h != NULL
8095 && h->root.root.string[0] == '.')
8096 {
8097 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8098 if (fdh != NULL)
8099 {
8100 fdh = ppc_follow_link (fdh);
8101 if (fdh->elf.root.type != bfd_link_hash_defined
8102 && fdh->elf.root.type != bfd_link_hash_defweak)
8103 fdh = NULL;
8104 }
8105 }
8106
8107 skip = (sym_sec->owner != ibfd
8108 || sym_sec->output_section == bfd_abs_section_ptr);
8109 if (skip)
8110 {
8111 if (fdh != NULL && sym_sec->owner == ibfd)
8112 {
8113 /* Arrange for the function descriptor sym
8114 to be dropped. */
8115 fdh->elf.root.u.def.value = 0;
8116 fdh->elf.root.u.def.section = sym_sec;
8117 }
8118 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
8119
8120 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
8121 rel = next_rel;
8122 else
8123 while (1)
8124 {
8125 if (!dec_dynrel_count (rel->r_info, sec, info,
8126 NULL, h, sym))
8127 goto error_ret;
8128
8129 if (++rel == next_rel)
8130 break;
8131
8132 r_symndx = ELF64_R_SYM (rel->r_info);
8133 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8134 r_symndx, ibfd))
8135 goto error_ret;
8136 }
8137 }
8138 else
8139 {
8140 /* We'll be keeping this opd entry. */
8141 long adjust;
8142
8143 if (fdh != NULL)
8144 {
8145 /* Redefine the function descriptor symbol to
8146 this location in the opd section. It is
8147 necessary to update the value here rather
8148 than using an array of adjustments as we do
8149 for local symbols, because various places
8150 in the generic ELF code use the value
8151 stored in u.def.value. */
8152 fdh->elf.root.u.def.value = wptr - new_contents;
8153 fdh->adjust_done = 1;
8154 }
8155
8156 /* Local syms are a bit tricky. We could
8157 tweak them as they can be cached, but
8158 we'd need to look through the local syms
8159 for the function descriptor sym which we
8160 don't have at the moment. So keep an
8161 array of adjustments. */
8162 adjust = (wptr - new_contents) - (rptr - sec->contents);
8163 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8164
8165 if (wptr != rptr)
8166 memcpy (wptr, rptr, opd_ent_size);
8167 wptr += opd_ent_size;
8168 if (add_aux_fields && opd_ent_size == 16)
8169 {
8170 memset (wptr, '\0', 8);
8171 wptr += 8;
8172 }
8173
8174 /* We need to adjust any reloc offsets to point to the
8175 new opd entries. */
8176 for ( ; rel != next_rel; ++rel)
8177 {
8178 rel->r_offset += adjust;
8179 if (write_rel != rel)
8180 memcpy (write_rel, rel, sizeof (*rel));
8181 ++write_rel;
8182 }
8183 }
8184
8185 rptr += opd_ent_size;
8186 }
8187
8188 sec->size = wptr - new_contents;
8189 sec->reloc_count = write_rel - relstart;
8190 if (add_aux_fields)
8191 {
8192 free (sec->contents);
8193 sec->contents = new_contents;
8194 }
8195
8196 /* Fudge the header size too, as this is used later in
8197 elf_bfd_final_link if we are emitting relocs. */
8198 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8199 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
8200 some_edited = TRUE;
8201 }
8202 else if (elf_section_data (sec)->relocs != relstart)
8203 free (relstart);
8204
8205 if (local_syms != NULL
8206 && symtab_hdr->contents != (unsigned char *) local_syms)
8207 {
8208 if (!info->keep_memory)
8209 free (local_syms);
8210 else
8211 symtab_hdr->contents = (unsigned char *) local_syms;
8212 }
8213 }
8214
8215 if (some_edited)
8216 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8217
8218 /* If we are doing a final link and the last .opd entry is just 16 byte
8219 long, add a 8 byte padding after it. */
8220 if (need_pad != NULL && !bfd_link_relocatable (info))
8221 {
8222 bfd_byte *p;
8223
8224 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8225 {
8226 BFD_ASSERT (need_pad->size > 0);
8227
8228 p = bfd_malloc (need_pad->size + 8);
8229 if (p == NULL)
8230 return FALSE;
8231
8232 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8233 p, 0, need_pad->size))
8234 return FALSE;
8235
8236 need_pad->contents = p;
8237 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8238 }
8239 else
8240 {
8241 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8242 if (p == NULL)
8243 return FALSE;
8244
8245 need_pad->contents = p;
8246 }
8247
8248 memset (need_pad->contents + need_pad->size, 0, 8);
8249 need_pad->size += 8;
8250 }
8251
8252 return TRUE;
8253 }
8254
8255 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8256
8257 asection *
8258 ppc64_elf_tls_setup (struct bfd_link_info *info)
8259 {
8260 struct ppc_link_hash_table *htab;
8261
8262 htab = ppc_hash_table (info);
8263 if (htab == NULL)
8264 return NULL;
8265
8266 if (abiversion (info->output_bfd) == 1)
8267 htab->opd_abi = 1;
8268
8269 if (htab->params->no_multi_toc)
8270 htab->do_multi_toc = 0;
8271 else if (!htab->do_multi_toc)
8272 htab->params->no_multi_toc = 1;
8273
8274 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8275 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8276 FALSE, FALSE, TRUE));
8277 /* Move dynamic linking info to the function descriptor sym. */
8278 if (htab->tls_get_addr != NULL)
8279 func_desc_adjust (&htab->tls_get_addr->elf, info);
8280 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8281 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8282 FALSE, FALSE, TRUE));
8283 if (htab->params->tls_get_addr_opt)
8284 {
8285 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8286
8287 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8288 FALSE, FALSE, TRUE);
8289 if (opt != NULL)
8290 func_desc_adjust (opt, info);
8291 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8292 FALSE, FALSE, TRUE);
8293 if (opt_fd != NULL
8294 && (opt_fd->root.type == bfd_link_hash_defined
8295 || opt_fd->root.type == bfd_link_hash_defweak))
8296 {
8297 /* If glibc supports an optimized __tls_get_addr call stub,
8298 signalled by the presence of __tls_get_addr_opt, and we'll
8299 be calling __tls_get_addr via a plt call stub, then
8300 make __tls_get_addr point to __tls_get_addr_opt. */
8301 tga_fd = &htab->tls_get_addr_fd->elf;
8302 if (htab->elf.dynamic_sections_created
8303 && tga_fd != NULL
8304 && (tga_fd->type == STT_FUNC
8305 || tga_fd->needs_plt)
8306 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8307 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
8308 && tga_fd->root.type == bfd_link_hash_undefweak)))
8309 {
8310 struct plt_entry *ent;
8311
8312 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8313 if (ent->plt.refcount > 0)
8314 break;
8315 if (ent != NULL)
8316 {
8317 tga_fd->root.type = bfd_link_hash_indirect;
8318 tga_fd->root.u.i.link = &opt_fd->root;
8319 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8320 opt_fd->forced_local = 0;
8321 if (opt_fd->dynindx != -1)
8322 {
8323 /* Use __tls_get_addr_opt in dynamic relocations. */
8324 opt_fd->dynindx = -1;
8325 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8326 opt_fd->dynstr_index);
8327 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8328 return NULL;
8329 }
8330 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8331 tga = &htab->tls_get_addr->elf;
8332 if (opt != NULL && tga != NULL)
8333 {
8334 tga->root.type = bfd_link_hash_indirect;
8335 tga->root.u.i.link = &opt->root;
8336 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8337 opt->forced_local = 0;
8338 _bfd_elf_link_hash_hide_symbol (info, opt,
8339 tga->forced_local);
8340 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8341 }
8342 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8343 htab->tls_get_addr_fd->is_func_descriptor = 1;
8344 if (htab->tls_get_addr != NULL)
8345 {
8346 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8347 htab->tls_get_addr->is_func = 1;
8348 }
8349 }
8350 }
8351 }
8352 else if (htab->params->tls_get_addr_opt < 0)
8353 htab->params->tls_get_addr_opt = 0;
8354 }
8355 return _bfd_elf_tls_setup (info->output_bfd, info);
8356 }
8357
8358 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8359 HASH1 or HASH2. */
8360
8361 static bfd_boolean
8362 branch_reloc_hash_match (const bfd *ibfd,
8363 const Elf_Internal_Rela *rel,
8364 const struct ppc_link_hash_entry *hash1,
8365 const struct ppc_link_hash_entry *hash2)
8366 {
8367 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8368 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8369 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8370
8371 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8372 {
8373 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8374 struct elf_link_hash_entry *h;
8375
8376 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8377 h = elf_follow_link (h);
8378 if (h == &hash1->elf || h == &hash2->elf)
8379 return TRUE;
8380 }
8381 return FALSE;
8382 }
8383
8384 /* Run through all the TLS relocs looking for optimization
8385 opportunities. The linker has been hacked (see ppc64elf.em) to do
8386 a preliminary section layout so that we know the TLS segment
8387 offsets. We can't optimize earlier because some optimizations need
8388 to know the tp offset, and we need to optimize before allocating
8389 dynamic relocations. */
8390
8391 bfd_boolean
8392 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8393 {
8394 bfd *ibfd;
8395 asection *sec;
8396 struct ppc_link_hash_table *htab;
8397 unsigned char *toc_ref;
8398 int pass;
8399
8400 if (!bfd_link_executable (info))
8401 return TRUE;
8402
8403 htab = ppc_hash_table (info);
8404 if (htab == NULL)
8405 return FALSE;
8406
8407 /* Make two passes over the relocs. On the first pass, mark toc
8408 entries involved with tls relocs, and check that tls relocs
8409 involved in setting up a tls_get_addr call are indeed followed by
8410 such a call. If they are not, we can't do any tls optimization.
8411 On the second pass twiddle tls_mask flags to notify
8412 relocate_section that optimization can be done, and adjust got
8413 and plt refcounts. */
8414 toc_ref = NULL;
8415 for (pass = 0; pass < 2; ++pass)
8416 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8417 {
8418 Elf_Internal_Sym *locsyms = NULL;
8419 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8420
8421 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8422 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8423 {
8424 Elf_Internal_Rela *relstart, *rel, *relend;
8425 bfd_boolean found_tls_get_addr_arg = 0;
8426
8427 /* Read the relocations. */
8428 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8429 info->keep_memory);
8430 if (relstart == NULL)
8431 {
8432 free (toc_ref);
8433 return FALSE;
8434 }
8435
8436 relend = relstart + sec->reloc_count;
8437 for (rel = relstart; rel < relend; rel++)
8438 {
8439 enum elf_ppc64_reloc_type r_type;
8440 unsigned long r_symndx;
8441 struct elf_link_hash_entry *h;
8442 Elf_Internal_Sym *sym;
8443 asection *sym_sec;
8444 unsigned char *tls_mask;
8445 unsigned char tls_set, tls_clear, tls_type = 0;
8446 bfd_vma value;
8447 bfd_boolean ok_tprel, is_local;
8448 long toc_ref_index = 0;
8449 int expecting_tls_get_addr = 0;
8450 bfd_boolean ret = FALSE;
8451
8452 r_symndx = ELF64_R_SYM (rel->r_info);
8453 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8454 r_symndx, ibfd))
8455 {
8456 err_free_rel:
8457 if (elf_section_data (sec)->relocs != relstart)
8458 free (relstart);
8459 if (toc_ref != NULL)
8460 free (toc_ref);
8461 if (locsyms != NULL
8462 && (elf_symtab_hdr (ibfd).contents
8463 != (unsigned char *) locsyms))
8464 free (locsyms);
8465 return ret;
8466 }
8467
8468 if (h != NULL)
8469 {
8470 if (h->root.type == bfd_link_hash_defined
8471 || h->root.type == bfd_link_hash_defweak)
8472 value = h->root.u.def.value;
8473 else if (h->root.type == bfd_link_hash_undefweak)
8474 value = 0;
8475 else
8476 {
8477 found_tls_get_addr_arg = 0;
8478 continue;
8479 }
8480 }
8481 else
8482 /* Symbols referenced by TLS relocs must be of type
8483 STT_TLS. So no need for .opd local sym adjust. */
8484 value = sym->st_value;
8485
8486 ok_tprel = FALSE;
8487 is_local = FALSE;
8488 if (h == NULL
8489 || !h->def_dynamic)
8490 {
8491 is_local = TRUE;
8492 if (h != NULL
8493 && h->root.type == bfd_link_hash_undefweak)
8494 ok_tprel = TRUE;
8495 else if (sym_sec != NULL
8496 && sym_sec->output_section != NULL)
8497 {
8498 value += sym_sec->output_offset;
8499 value += sym_sec->output_section->vma;
8500 value -= htab->elf.tls_sec->vma;
8501 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8502 < (bfd_vma) 1 << 32);
8503 }
8504 }
8505
8506 r_type = ELF64_R_TYPE (rel->r_info);
8507 /* If this section has old-style __tls_get_addr calls
8508 without marker relocs, then check that each
8509 __tls_get_addr call reloc is preceded by a reloc
8510 that conceivably belongs to the __tls_get_addr arg
8511 setup insn. If we don't find matching arg setup
8512 relocs, don't do any tls optimization. */
8513 if (pass == 0
8514 && sec->has_tls_get_addr_call
8515 && h != NULL
8516 && (h == &htab->tls_get_addr->elf
8517 || h == &htab->tls_get_addr_fd->elf)
8518 && !found_tls_get_addr_arg
8519 && is_branch_reloc (r_type))
8520 {
8521 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8522 "TLS optimization disabled\n"),
8523 ibfd, sec, rel->r_offset);
8524 ret = TRUE;
8525 goto err_free_rel;
8526 }
8527
8528 found_tls_get_addr_arg = 0;
8529 switch (r_type)
8530 {
8531 case R_PPC64_GOT_TLSLD16:
8532 case R_PPC64_GOT_TLSLD16_LO:
8533 expecting_tls_get_addr = 1;
8534 found_tls_get_addr_arg = 1;
8535 /* Fall through. */
8536
8537 case R_PPC64_GOT_TLSLD16_HI:
8538 case R_PPC64_GOT_TLSLD16_HA:
8539 /* These relocs should never be against a symbol
8540 defined in a shared lib. Leave them alone if
8541 that turns out to be the case. */
8542 if (!is_local)
8543 continue;
8544
8545 /* LD -> LE */
8546 tls_set = 0;
8547 tls_clear = TLS_LD;
8548 tls_type = TLS_TLS | TLS_LD;
8549 break;
8550
8551 case R_PPC64_GOT_TLSGD16:
8552 case R_PPC64_GOT_TLSGD16_LO:
8553 expecting_tls_get_addr = 1;
8554 found_tls_get_addr_arg = 1;
8555 /* Fall through. */
8556
8557 case R_PPC64_GOT_TLSGD16_HI:
8558 case R_PPC64_GOT_TLSGD16_HA:
8559 if (ok_tprel)
8560 /* GD -> LE */
8561 tls_set = 0;
8562 else
8563 /* GD -> IE */
8564 tls_set = TLS_TLS | TLS_TPRELGD;
8565 tls_clear = TLS_GD;
8566 tls_type = TLS_TLS | TLS_GD;
8567 break;
8568
8569 case R_PPC64_GOT_TPREL16_DS:
8570 case R_PPC64_GOT_TPREL16_LO_DS:
8571 case R_PPC64_GOT_TPREL16_HI:
8572 case R_PPC64_GOT_TPREL16_HA:
8573 if (ok_tprel)
8574 {
8575 /* IE -> LE */
8576 tls_set = 0;
8577 tls_clear = TLS_TPREL;
8578 tls_type = TLS_TLS | TLS_TPREL;
8579 break;
8580 }
8581 continue;
8582
8583 case R_PPC64_TLSGD:
8584 case R_PPC64_TLSLD:
8585 found_tls_get_addr_arg = 1;
8586 /* Fall through. */
8587
8588 case R_PPC64_TLS:
8589 case R_PPC64_TOC16:
8590 case R_PPC64_TOC16_LO:
8591 if (sym_sec == NULL || sym_sec != toc)
8592 continue;
8593
8594 /* Mark this toc entry as referenced by a TLS
8595 code sequence. We can do that now in the
8596 case of R_PPC64_TLS, and after checking for
8597 tls_get_addr for the TOC16 relocs. */
8598 if (toc_ref == NULL)
8599 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8600 if (toc_ref == NULL)
8601 goto err_free_rel;
8602
8603 if (h != NULL)
8604 value = h->root.u.def.value;
8605 else
8606 value = sym->st_value;
8607 value += rel->r_addend;
8608 if (value % 8 != 0)
8609 continue;
8610 BFD_ASSERT (value < toc->size
8611 && toc->output_offset % 8 == 0);
8612 toc_ref_index = (value + toc->output_offset) / 8;
8613 if (r_type == R_PPC64_TLS
8614 || r_type == R_PPC64_TLSGD
8615 || r_type == R_PPC64_TLSLD)
8616 {
8617 toc_ref[toc_ref_index] = 1;
8618 continue;
8619 }
8620
8621 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8622 continue;
8623
8624 tls_set = 0;
8625 tls_clear = 0;
8626 expecting_tls_get_addr = 2;
8627 break;
8628
8629 case R_PPC64_TPREL64:
8630 if (pass == 0
8631 || sec != toc
8632 || toc_ref == NULL
8633 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8634 continue;
8635 if (ok_tprel)
8636 {
8637 /* IE -> LE */
8638 tls_set = TLS_EXPLICIT;
8639 tls_clear = TLS_TPREL;
8640 break;
8641 }
8642 continue;
8643
8644 case R_PPC64_DTPMOD64:
8645 if (pass == 0
8646 || sec != toc
8647 || toc_ref == NULL
8648 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8649 continue;
8650 if (rel + 1 < relend
8651 && (rel[1].r_info
8652 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8653 && rel[1].r_offset == rel->r_offset + 8)
8654 {
8655 if (ok_tprel)
8656 /* GD -> LE */
8657 tls_set = TLS_EXPLICIT | TLS_GD;
8658 else
8659 /* GD -> IE */
8660 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8661 tls_clear = TLS_GD;
8662 }
8663 else
8664 {
8665 if (!is_local)
8666 continue;
8667
8668 /* LD -> LE */
8669 tls_set = TLS_EXPLICIT;
8670 tls_clear = TLS_LD;
8671 }
8672 break;
8673
8674 default:
8675 continue;
8676 }
8677
8678 if (pass == 0)
8679 {
8680 if (!expecting_tls_get_addr
8681 || !sec->has_tls_get_addr_call)
8682 continue;
8683
8684 if (rel + 1 < relend
8685 && branch_reloc_hash_match (ibfd, rel + 1,
8686 htab->tls_get_addr,
8687 htab->tls_get_addr_fd))
8688 {
8689 if (expecting_tls_get_addr == 2)
8690 {
8691 /* Check for toc tls entries. */
8692 unsigned char *toc_tls;
8693 int retval;
8694
8695 retval = get_tls_mask (&toc_tls, NULL, NULL,
8696 &locsyms,
8697 rel, ibfd);
8698 if (retval == 0)
8699 goto err_free_rel;
8700 if (toc_tls != NULL)
8701 {
8702 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8703 found_tls_get_addr_arg = 1;
8704 if (retval > 1)
8705 toc_ref[toc_ref_index] = 1;
8706 }
8707 }
8708 continue;
8709 }
8710
8711 if (expecting_tls_get_addr != 1)
8712 continue;
8713
8714 /* Uh oh, we didn't find the expected call. We
8715 could just mark this symbol to exclude it
8716 from tls optimization but it's safer to skip
8717 the entire optimization. */
8718 /* xgettext:c-format */
8719 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8720 "TLS optimization disabled\n"),
8721 ibfd, sec, rel->r_offset);
8722 ret = TRUE;
8723 goto err_free_rel;
8724 }
8725
8726 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8727 {
8728 struct plt_entry *ent;
8729 for (ent = htab->tls_get_addr->elf.plt.plist;
8730 ent != NULL;
8731 ent = ent->next)
8732 if (ent->addend == 0)
8733 {
8734 if (ent->plt.refcount > 0)
8735 {
8736 ent->plt.refcount -= 1;
8737 expecting_tls_get_addr = 0;
8738 }
8739 break;
8740 }
8741 }
8742
8743 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8744 {
8745 struct plt_entry *ent;
8746 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8747 ent != NULL;
8748 ent = ent->next)
8749 if (ent->addend == 0)
8750 {
8751 if (ent->plt.refcount > 0)
8752 ent->plt.refcount -= 1;
8753 break;
8754 }
8755 }
8756
8757 if (tls_clear == 0)
8758 continue;
8759
8760 if ((tls_set & TLS_EXPLICIT) == 0)
8761 {
8762 struct got_entry *ent;
8763
8764 /* Adjust got entry for this reloc. */
8765 if (h != NULL)
8766 ent = h->got.glist;
8767 else
8768 ent = elf_local_got_ents (ibfd)[r_symndx];
8769
8770 for (; ent != NULL; ent = ent->next)
8771 if (ent->addend == rel->r_addend
8772 && ent->owner == ibfd
8773 && ent->tls_type == tls_type)
8774 break;
8775 if (ent == NULL)
8776 abort ();
8777
8778 if (tls_set == 0)
8779 {
8780 /* We managed to get rid of a got entry. */
8781 if (ent->got.refcount > 0)
8782 ent->got.refcount -= 1;
8783 }
8784 }
8785 else
8786 {
8787 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8788 we'll lose one or two dyn relocs. */
8789 if (!dec_dynrel_count (rel->r_info, sec, info,
8790 NULL, h, sym))
8791 return FALSE;
8792
8793 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8794 {
8795 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8796 NULL, h, sym))
8797 return FALSE;
8798 }
8799 }
8800
8801 *tls_mask |= tls_set;
8802 *tls_mask &= ~tls_clear;
8803 }
8804
8805 if (elf_section_data (sec)->relocs != relstart)
8806 free (relstart);
8807 }
8808
8809 if (locsyms != NULL
8810 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8811 {
8812 if (!info->keep_memory)
8813 free (locsyms);
8814 else
8815 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8816 }
8817 }
8818
8819 if (toc_ref != NULL)
8820 free (toc_ref);
8821 return TRUE;
8822 }
8823
8824 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8825 the values of any global symbols in a toc section that has been
8826 edited. Globals in toc sections should be a rarity, so this function
8827 sets a flag if any are found in toc sections other than the one just
8828 edited, so that futher hash table traversals can be avoided. */
8829
8830 struct adjust_toc_info
8831 {
8832 asection *toc;
8833 unsigned long *skip;
8834 bfd_boolean global_toc_syms;
8835 };
8836
8837 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8838
8839 static bfd_boolean
8840 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8841 {
8842 struct ppc_link_hash_entry *eh;
8843 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8844 unsigned long i;
8845
8846 if (h->root.type != bfd_link_hash_defined
8847 && h->root.type != bfd_link_hash_defweak)
8848 return TRUE;
8849
8850 eh = (struct ppc_link_hash_entry *) h;
8851 if (eh->adjust_done)
8852 return TRUE;
8853
8854 if (eh->elf.root.u.def.section == toc_inf->toc)
8855 {
8856 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8857 i = toc_inf->toc->rawsize >> 3;
8858 else
8859 i = eh->elf.root.u.def.value >> 3;
8860
8861 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8862 {
8863 _bfd_error_handler
8864 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8865 do
8866 ++i;
8867 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8868 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8869 }
8870
8871 eh->elf.root.u.def.value -= toc_inf->skip[i];
8872 eh->adjust_done = 1;
8873 }
8874 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8875 toc_inf->global_toc_syms = TRUE;
8876
8877 return TRUE;
8878 }
8879
8880 /* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8881 on a _LO variety toc/got reloc. */
8882
8883 static bfd_boolean
8884 ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
8885 {
8886 return ((insn & (0x3f << 26)) == 12u << 26 /* addic */
8887 || (insn & (0x3f << 26)) == 14u << 26 /* addi */
8888 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8889 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8890 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8891 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8892 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8893 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8894 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8895 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8896 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8897 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8898 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8899 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8900 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8901 || (insn & (0x3f << 26)) == 56u << 26 /* lq,lfq */
8902 || ((insn & (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
8903 /* Exclude lfqu by testing reloc. If relocs are ever
8904 defined for the reduced D field in psq_lu then those
8905 will need testing too. */
8906 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8907 || ((insn & (0x3f << 26)) == 58u << 26 /* ld,lwa */
8908 && (insn & 1) == 0)
8909 || (insn & (0x3f << 26)) == 60u << 26 /* stfq */
8910 || ((insn & (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
8911 /* Exclude stfqu. psq_stu as above for psq_lu. */
8912 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8913 || ((insn & (0x3f << 26)) == 62u << 26 /* std,stq */
8914 && (insn & 1) == 0));
8915 }
8916
8917 /* Examine all relocs referencing .toc sections in order to remove
8918 unused .toc entries. */
8919
8920 bfd_boolean
8921 ppc64_elf_edit_toc (struct bfd_link_info *info)
8922 {
8923 bfd *ibfd;
8924 struct adjust_toc_info toc_inf;
8925 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8926
8927 htab->do_toc_opt = 1;
8928 toc_inf.global_toc_syms = TRUE;
8929 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8930 {
8931 asection *toc, *sec;
8932 Elf_Internal_Shdr *symtab_hdr;
8933 Elf_Internal_Sym *local_syms;
8934 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8935 unsigned long *skip, *drop;
8936 unsigned char *used;
8937 unsigned char *keep, last, some_unused;
8938
8939 if (!is_ppc64_elf (ibfd))
8940 continue;
8941
8942 toc = bfd_get_section_by_name (ibfd, ".toc");
8943 if (toc == NULL
8944 || toc->size == 0
8945 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8946 || discarded_section (toc))
8947 continue;
8948
8949 toc_relocs = NULL;
8950 local_syms = NULL;
8951 symtab_hdr = &elf_symtab_hdr (ibfd);
8952
8953 /* Look at sections dropped from the final link. */
8954 skip = NULL;
8955 relstart = NULL;
8956 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8957 {
8958 if (sec->reloc_count == 0
8959 || !discarded_section (sec)
8960 || get_opd_info (sec)
8961 || (sec->flags & SEC_ALLOC) == 0
8962 || (sec->flags & SEC_DEBUGGING) != 0)
8963 continue;
8964
8965 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8966 if (relstart == NULL)
8967 goto error_ret;
8968
8969 /* Run through the relocs to see which toc entries might be
8970 unused. */
8971 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8972 {
8973 enum elf_ppc64_reloc_type r_type;
8974 unsigned long r_symndx;
8975 asection *sym_sec;
8976 struct elf_link_hash_entry *h;
8977 Elf_Internal_Sym *sym;
8978 bfd_vma val;
8979
8980 r_type = ELF64_R_TYPE (rel->r_info);
8981 switch (r_type)
8982 {
8983 default:
8984 continue;
8985
8986 case R_PPC64_TOC16:
8987 case R_PPC64_TOC16_LO:
8988 case R_PPC64_TOC16_HI:
8989 case R_PPC64_TOC16_HA:
8990 case R_PPC64_TOC16_DS:
8991 case R_PPC64_TOC16_LO_DS:
8992 break;
8993 }
8994
8995 r_symndx = ELF64_R_SYM (rel->r_info);
8996 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8997 r_symndx, ibfd))
8998 goto error_ret;
8999
9000 if (sym_sec != toc)
9001 continue;
9002
9003 if (h != NULL)
9004 val = h->root.u.def.value;
9005 else
9006 val = sym->st_value;
9007 val += rel->r_addend;
9008
9009 if (val >= toc->size)
9010 continue;
9011
9012 /* Anything in the toc ought to be aligned to 8 bytes.
9013 If not, don't mark as unused. */
9014 if (val & 7)
9015 continue;
9016
9017 if (skip == NULL)
9018 {
9019 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9020 if (skip == NULL)
9021 goto error_ret;
9022 }
9023
9024 skip[val >> 3] = ref_from_discarded;
9025 }
9026
9027 if (elf_section_data (sec)->relocs != relstart)
9028 free (relstart);
9029 }
9030
9031 /* For largetoc loads of address constants, we can convert
9032 . addis rx,2,addr@got@ha
9033 . ld ry,addr@got@l(rx)
9034 to
9035 . addis rx,2,addr@toc@ha
9036 . addi ry,rx,addr@toc@l
9037 when addr is within 2G of the toc pointer. This then means
9038 that the word storing "addr" in the toc is no longer needed. */
9039
9040 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9041 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9042 && toc->reloc_count != 0)
9043 {
9044 /* Read toc relocs. */
9045 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9046 info->keep_memory);
9047 if (toc_relocs == NULL)
9048 goto error_ret;
9049
9050 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9051 {
9052 enum elf_ppc64_reloc_type r_type;
9053 unsigned long r_symndx;
9054 asection *sym_sec;
9055 struct elf_link_hash_entry *h;
9056 Elf_Internal_Sym *sym;
9057 bfd_vma val, addr;
9058
9059 r_type = ELF64_R_TYPE (rel->r_info);
9060 if (r_type != R_PPC64_ADDR64)
9061 continue;
9062
9063 r_symndx = ELF64_R_SYM (rel->r_info);
9064 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9065 r_symndx, ibfd))
9066 goto error_ret;
9067
9068 if (sym_sec == NULL
9069 || sym_sec->output_section == NULL
9070 || discarded_section (sym_sec))
9071 continue;
9072
9073 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9074 continue;
9075
9076 if (h != NULL)
9077 {
9078 if (h->type == STT_GNU_IFUNC)
9079 continue;
9080 val = h->root.u.def.value;
9081 }
9082 else
9083 {
9084 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9085 continue;
9086 val = sym->st_value;
9087 }
9088 val += rel->r_addend;
9089 val += sym_sec->output_section->vma + sym_sec->output_offset;
9090
9091 /* We don't yet know the exact toc pointer value, but we
9092 know it will be somewhere in the toc section. Don't
9093 optimize if the difference from any possible toc
9094 pointer is outside [ff..f80008000, 7fff7fff]. */
9095 addr = toc->output_section->vma + TOC_BASE_OFF;
9096 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9097 continue;
9098
9099 addr = toc->output_section->vma + toc->output_section->rawsize;
9100 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9101 continue;
9102
9103 if (skip == NULL)
9104 {
9105 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9106 if (skip == NULL)
9107 goto error_ret;
9108 }
9109
9110 skip[rel->r_offset >> 3]
9111 |= can_optimize | ((rel - toc_relocs) << 2);
9112 }
9113 }
9114
9115 if (skip == NULL)
9116 continue;
9117
9118 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9119 if (used == NULL)
9120 {
9121 error_ret:
9122 if (local_syms != NULL
9123 && symtab_hdr->contents != (unsigned char *) local_syms)
9124 free (local_syms);
9125 if (sec != NULL
9126 && relstart != NULL
9127 && elf_section_data (sec)->relocs != relstart)
9128 free (relstart);
9129 if (toc_relocs != NULL
9130 && elf_section_data (toc)->relocs != toc_relocs)
9131 free (toc_relocs);
9132 if (skip != NULL)
9133 free (skip);
9134 return FALSE;
9135 }
9136
9137 /* Now check all kept sections that might reference the toc.
9138 Check the toc itself last. */
9139 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9140 : ibfd->sections);
9141 sec != NULL;
9142 sec = (sec == toc ? NULL
9143 : sec->next == NULL ? toc
9144 : sec->next == toc && toc->next ? toc->next
9145 : sec->next))
9146 {
9147 int repeat;
9148
9149 if (sec->reloc_count == 0
9150 || discarded_section (sec)
9151 || get_opd_info (sec)
9152 || (sec->flags & SEC_ALLOC) == 0
9153 || (sec->flags & SEC_DEBUGGING) != 0)
9154 continue;
9155
9156 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9157 info->keep_memory);
9158 if (relstart == NULL)
9159 {
9160 free (used);
9161 goto error_ret;
9162 }
9163
9164 /* Mark toc entries referenced as used. */
9165 do
9166 {
9167 repeat = 0;
9168 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9169 {
9170 enum elf_ppc64_reloc_type r_type;
9171 unsigned long r_symndx;
9172 asection *sym_sec;
9173 struct elf_link_hash_entry *h;
9174 Elf_Internal_Sym *sym;
9175 bfd_vma val;
9176 enum {no_check, check_lo, check_ha} insn_check;
9177
9178 r_type = ELF64_R_TYPE (rel->r_info);
9179 switch (r_type)
9180 {
9181 default:
9182 insn_check = no_check;
9183 break;
9184
9185 case R_PPC64_GOT_TLSLD16_HA:
9186 case R_PPC64_GOT_TLSGD16_HA:
9187 case R_PPC64_GOT_TPREL16_HA:
9188 case R_PPC64_GOT_DTPREL16_HA:
9189 case R_PPC64_GOT16_HA:
9190 case R_PPC64_TOC16_HA:
9191 insn_check = check_ha;
9192 break;
9193
9194 case R_PPC64_GOT_TLSLD16_LO:
9195 case R_PPC64_GOT_TLSGD16_LO:
9196 case R_PPC64_GOT_TPREL16_LO_DS:
9197 case R_PPC64_GOT_DTPREL16_LO_DS:
9198 case R_PPC64_GOT16_LO:
9199 case R_PPC64_GOT16_LO_DS:
9200 case R_PPC64_TOC16_LO:
9201 case R_PPC64_TOC16_LO_DS:
9202 insn_check = check_lo;
9203 break;
9204 }
9205
9206 if (insn_check != no_check)
9207 {
9208 bfd_vma off = rel->r_offset & ~3;
9209 unsigned char buf[4];
9210 unsigned int insn;
9211
9212 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9213 {
9214 free (used);
9215 goto error_ret;
9216 }
9217 insn = bfd_get_32 (ibfd, buf);
9218 if (insn_check == check_lo
9219 ? !ok_lo_toc_insn (insn, r_type)
9220 : ((insn & ((0x3f << 26) | 0x1f << 16))
9221 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9222 {
9223 char str[12];
9224
9225 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9226 sprintf (str, "%#08x", insn);
9227 info->callbacks->einfo
9228 /* xgettext:c-format */
9229 (_("%P: %H: toc optimization is not supported for"
9230 " %s instruction.\n"),
9231 ibfd, sec, rel->r_offset & ~3, str);
9232 }
9233 }
9234
9235 switch (r_type)
9236 {
9237 case R_PPC64_TOC16:
9238 case R_PPC64_TOC16_LO:
9239 case R_PPC64_TOC16_HI:
9240 case R_PPC64_TOC16_HA:
9241 case R_PPC64_TOC16_DS:
9242 case R_PPC64_TOC16_LO_DS:
9243 /* In case we're taking addresses of toc entries. */
9244 case R_PPC64_ADDR64:
9245 break;
9246
9247 default:
9248 continue;
9249 }
9250
9251 r_symndx = ELF64_R_SYM (rel->r_info);
9252 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9253 r_symndx, ibfd))
9254 {
9255 free (used);
9256 goto error_ret;
9257 }
9258
9259 if (sym_sec != toc)
9260 continue;
9261
9262 if (h != NULL)
9263 val = h->root.u.def.value;
9264 else
9265 val = sym->st_value;
9266 val += rel->r_addend;
9267
9268 if (val >= toc->size)
9269 continue;
9270
9271 if ((skip[val >> 3] & can_optimize) != 0)
9272 {
9273 bfd_vma off;
9274 unsigned char opc;
9275
9276 switch (r_type)
9277 {
9278 case R_PPC64_TOC16_HA:
9279 break;
9280
9281 case R_PPC64_TOC16_LO_DS:
9282 off = rel->r_offset;
9283 off += (bfd_big_endian (ibfd) ? -2 : 3);
9284 if (!bfd_get_section_contents (ibfd, sec, &opc,
9285 off, 1))
9286 {
9287 free (used);
9288 goto error_ret;
9289 }
9290 if ((opc & (0x3f << 2)) == (58u << 2))
9291 break;
9292 /* Fall through. */
9293
9294 default:
9295 /* Wrong sort of reloc, or not a ld. We may
9296 as well clear ref_from_discarded too. */
9297 skip[val >> 3] = 0;
9298 }
9299 }
9300
9301 if (sec != toc)
9302 used[val >> 3] = 1;
9303 /* For the toc section, we only mark as used if this
9304 entry itself isn't unused. */
9305 else if ((used[rel->r_offset >> 3]
9306 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9307 && !used[val >> 3])
9308 {
9309 /* Do all the relocs again, to catch reference
9310 chains. */
9311 repeat = 1;
9312 used[val >> 3] = 1;
9313 }
9314 }
9315 }
9316 while (repeat);
9317
9318 if (elf_section_data (sec)->relocs != relstart)
9319 free (relstart);
9320 }
9321
9322 /* Merge the used and skip arrays. Assume that TOC
9323 doublewords not appearing as either used or unused belong
9324 to to an entry more than one doubleword in size. */
9325 for (drop = skip, keep = used, last = 0, some_unused = 0;
9326 drop < skip + (toc->size + 7) / 8;
9327 ++drop, ++keep)
9328 {
9329 if (*keep)
9330 {
9331 *drop &= ~ref_from_discarded;
9332 if ((*drop & can_optimize) != 0)
9333 some_unused = 1;
9334 last = 0;
9335 }
9336 else if ((*drop & ref_from_discarded) != 0)
9337 {
9338 some_unused = 1;
9339 last = ref_from_discarded;
9340 }
9341 else
9342 *drop = last;
9343 }
9344
9345 free (used);
9346
9347 if (some_unused)
9348 {
9349 bfd_byte *contents, *src;
9350 unsigned long off;
9351 Elf_Internal_Sym *sym;
9352 bfd_boolean local_toc_syms = FALSE;
9353
9354 /* Shuffle the toc contents, and at the same time convert the
9355 skip array from booleans into offsets. */
9356 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9357 goto error_ret;
9358
9359 elf_section_data (toc)->this_hdr.contents = contents;
9360
9361 for (src = contents, off = 0, drop = skip;
9362 src < contents + toc->size;
9363 src += 8, ++drop)
9364 {
9365 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9366 off += 8;
9367 else if (off != 0)
9368 {
9369 *drop = off;
9370 memcpy (src - off, src, 8);
9371 }
9372 }
9373 *drop = off;
9374 toc->rawsize = toc->size;
9375 toc->size = src - contents - off;
9376
9377 /* Adjust addends for relocs against the toc section sym,
9378 and optimize any accesses we can. */
9379 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9380 {
9381 if (sec->reloc_count == 0
9382 || discarded_section (sec))
9383 continue;
9384
9385 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9386 info->keep_memory);
9387 if (relstart == NULL)
9388 goto error_ret;
9389
9390 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9391 {
9392 enum elf_ppc64_reloc_type r_type;
9393 unsigned long r_symndx;
9394 asection *sym_sec;
9395 struct elf_link_hash_entry *h;
9396 bfd_vma val;
9397
9398 r_type = ELF64_R_TYPE (rel->r_info);
9399 switch (r_type)
9400 {
9401 default:
9402 continue;
9403
9404 case R_PPC64_TOC16:
9405 case R_PPC64_TOC16_LO:
9406 case R_PPC64_TOC16_HI:
9407 case R_PPC64_TOC16_HA:
9408 case R_PPC64_TOC16_DS:
9409 case R_PPC64_TOC16_LO_DS:
9410 case R_PPC64_ADDR64:
9411 break;
9412 }
9413
9414 r_symndx = ELF64_R_SYM (rel->r_info);
9415 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9416 r_symndx, ibfd))
9417 goto error_ret;
9418
9419 if (sym_sec != toc)
9420 continue;
9421
9422 if (h != NULL)
9423 val = h->root.u.def.value;
9424 else
9425 {
9426 val = sym->st_value;
9427 if (val != 0)
9428 local_toc_syms = TRUE;
9429 }
9430
9431 val += rel->r_addend;
9432
9433 if (val > toc->rawsize)
9434 val = toc->rawsize;
9435 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9436 continue;
9437 else if ((skip[val >> 3] & can_optimize) != 0)
9438 {
9439 Elf_Internal_Rela *tocrel
9440 = toc_relocs + (skip[val >> 3] >> 2);
9441 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9442
9443 switch (r_type)
9444 {
9445 case R_PPC64_TOC16_HA:
9446 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9447 break;
9448
9449 case R_PPC64_TOC16_LO_DS:
9450 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9451 break;
9452
9453 default:
9454 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9455 ppc_howto_init ();
9456 info->callbacks->einfo
9457 /* xgettext:c-format */
9458 (_("%P: %H: %s references "
9459 "optimized away TOC entry\n"),
9460 ibfd, sec, rel->r_offset,
9461 ppc64_elf_howto_table[r_type]->name);
9462 bfd_set_error (bfd_error_bad_value);
9463 goto error_ret;
9464 }
9465 rel->r_addend = tocrel->r_addend;
9466 elf_section_data (sec)->relocs = relstart;
9467 continue;
9468 }
9469
9470 if (h != NULL || sym->st_value != 0)
9471 continue;
9472
9473 rel->r_addend -= skip[val >> 3];
9474 elf_section_data (sec)->relocs = relstart;
9475 }
9476
9477 if (elf_section_data (sec)->relocs != relstart)
9478 free (relstart);
9479 }
9480
9481 /* We shouldn't have local or global symbols defined in the TOC,
9482 but handle them anyway. */
9483 if (local_syms != NULL)
9484 for (sym = local_syms;
9485 sym < local_syms + symtab_hdr->sh_info;
9486 ++sym)
9487 if (sym->st_value != 0
9488 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9489 {
9490 unsigned long i;
9491
9492 if (sym->st_value > toc->rawsize)
9493 i = toc->rawsize >> 3;
9494 else
9495 i = sym->st_value >> 3;
9496
9497 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9498 {
9499 if (local_toc_syms)
9500 _bfd_error_handler
9501 (_("%s defined on removed toc entry"),
9502 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9503 do
9504 ++i;
9505 while ((skip[i] & (ref_from_discarded | can_optimize)));
9506 sym->st_value = (bfd_vma) i << 3;
9507 }
9508
9509 sym->st_value -= skip[i];
9510 symtab_hdr->contents = (unsigned char *) local_syms;
9511 }
9512
9513 /* Adjust any global syms defined in this toc input section. */
9514 if (toc_inf.global_toc_syms)
9515 {
9516 toc_inf.toc = toc;
9517 toc_inf.skip = skip;
9518 toc_inf.global_toc_syms = FALSE;
9519 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9520 &toc_inf);
9521 }
9522
9523 if (toc->reloc_count != 0)
9524 {
9525 Elf_Internal_Shdr *rel_hdr;
9526 Elf_Internal_Rela *wrel;
9527 bfd_size_type sz;
9528
9529 /* Remove unused toc relocs, and adjust those we keep. */
9530 if (toc_relocs == NULL)
9531 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9532 info->keep_memory);
9533 if (toc_relocs == NULL)
9534 goto error_ret;
9535
9536 wrel = toc_relocs;
9537 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9538 if ((skip[rel->r_offset >> 3]
9539 & (ref_from_discarded | can_optimize)) == 0)
9540 {
9541 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9542 wrel->r_info = rel->r_info;
9543 wrel->r_addend = rel->r_addend;
9544 ++wrel;
9545 }
9546 else if (!dec_dynrel_count (rel->r_info, toc, info,
9547 &local_syms, NULL, NULL))
9548 goto error_ret;
9549
9550 elf_section_data (toc)->relocs = toc_relocs;
9551 toc->reloc_count = wrel - toc_relocs;
9552 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9553 sz = rel_hdr->sh_entsize;
9554 rel_hdr->sh_size = toc->reloc_count * sz;
9555 }
9556 }
9557 else if (toc_relocs != NULL
9558 && elf_section_data (toc)->relocs != toc_relocs)
9559 free (toc_relocs);
9560
9561 if (local_syms != NULL
9562 && symtab_hdr->contents != (unsigned char *) local_syms)
9563 {
9564 if (!info->keep_memory)
9565 free (local_syms);
9566 else
9567 symtab_hdr->contents = (unsigned char *) local_syms;
9568 }
9569 free (skip);
9570 }
9571
9572 return TRUE;
9573 }
9574
9575 /* Return true iff input section I references the TOC using
9576 instructions limited to +/-32k offsets. */
9577
9578 bfd_boolean
9579 ppc64_elf_has_small_toc_reloc (asection *i)
9580 {
9581 return (is_ppc64_elf (i->owner)
9582 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9583 }
9584
9585 /* Allocate space for one GOT entry. */
9586
9587 static void
9588 allocate_got (struct elf_link_hash_entry *h,
9589 struct bfd_link_info *info,
9590 struct got_entry *gent)
9591 {
9592 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9593 bfd_boolean dyn;
9594 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9595 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9596 ? 16 : 8);
9597 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9598 ? 2 : 1) * sizeof (Elf64_External_Rela);
9599 asection *got = ppc64_elf_tdata (gent->owner)->got;
9600
9601 gent->got.offset = got->size;
9602 got->size += entsize;
9603
9604 dyn = htab->elf.dynamic_sections_created;
9605 if (h->type == STT_GNU_IFUNC)
9606 {
9607 htab->elf.irelplt->size += rentsize;
9608 htab->got_reli_size += rentsize;
9609 }
9610 else if ((bfd_link_pic (info)
9611 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9612 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9613 || h->root.type != bfd_link_hash_undefweak))
9614 {
9615 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9616 relgot->size += rentsize;
9617 }
9618 }
9619
9620 /* This function merges got entries in the same toc group. */
9621
9622 static void
9623 merge_got_entries (struct got_entry **pent)
9624 {
9625 struct got_entry *ent, *ent2;
9626
9627 for (ent = *pent; ent != NULL; ent = ent->next)
9628 if (!ent->is_indirect)
9629 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9630 if (!ent2->is_indirect
9631 && ent2->addend == ent->addend
9632 && ent2->tls_type == ent->tls_type
9633 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9634 {
9635 ent2->is_indirect = TRUE;
9636 ent2->got.ent = ent;
9637 }
9638 }
9639
9640 /* Allocate space in .plt, .got and associated reloc sections for
9641 dynamic relocs. */
9642
9643 static bfd_boolean
9644 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9645 {
9646 struct bfd_link_info *info;
9647 struct ppc_link_hash_table *htab;
9648 asection *s;
9649 struct ppc_link_hash_entry *eh;
9650 struct got_entry **pgent, *gent;
9651
9652 if (h->root.type == bfd_link_hash_indirect)
9653 return TRUE;
9654
9655 info = (struct bfd_link_info *) inf;
9656 htab = ppc_hash_table (info);
9657 if (htab == NULL)
9658 return FALSE;
9659
9660 eh = (struct ppc_link_hash_entry *) h;
9661 /* Run through the TLS GD got entries first if we're changing them
9662 to TPREL. */
9663 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9664 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9665 if (gent->got.refcount > 0
9666 && (gent->tls_type & TLS_GD) != 0)
9667 {
9668 /* This was a GD entry that has been converted to TPREL. If
9669 there happens to be a TPREL entry we can use that one. */
9670 struct got_entry *ent;
9671 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9672 if (ent->got.refcount > 0
9673 && (ent->tls_type & TLS_TPREL) != 0
9674 && ent->addend == gent->addend
9675 && ent->owner == gent->owner)
9676 {
9677 gent->got.refcount = 0;
9678 break;
9679 }
9680
9681 /* If not, then we'll be using our own TPREL entry. */
9682 if (gent->got.refcount != 0)
9683 gent->tls_type = TLS_TLS | TLS_TPREL;
9684 }
9685
9686 /* Remove any list entry that won't generate a word in the GOT before
9687 we call merge_got_entries. Otherwise we risk merging to empty
9688 entries. */
9689 pgent = &h->got.glist;
9690 while ((gent = *pgent) != NULL)
9691 if (gent->got.refcount > 0)
9692 {
9693 if ((gent->tls_type & TLS_LD) != 0
9694 && !h->def_dynamic)
9695 {
9696 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9697 *pgent = gent->next;
9698 }
9699 else
9700 pgent = &gent->next;
9701 }
9702 else
9703 *pgent = gent->next;
9704
9705 if (!htab->do_multi_toc)
9706 merge_got_entries (&h->got.glist);
9707
9708 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9709 if (!gent->is_indirect)
9710 {
9711 /* Make sure this symbol is output as a dynamic symbol.
9712 Undefined weak syms won't yet be marked as dynamic,
9713 nor will all TLS symbols. */
9714 if (h->dynindx == -1
9715 && !h->forced_local
9716 && h->type != STT_GNU_IFUNC
9717 && htab->elf.dynamic_sections_created)
9718 {
9719 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9720 return FALSE;
9721 }
9722
9723 if (!is_ppc64_elf (gent->owner))
9724 abort ();
9725
9726 allocate_got (h, info, gent);
9727 }
9728
9729 if (!htab->elf.dynamic_sections_created
9730 && h->type != STT_GNU_IFUNC)
9731 eh->dyn_relocs = NULL;
9732
9733 if (eh->dyn_relocs != NULL)
9734 {
9735 struct elf_dyn_relocs *p, **pp;
9736
9737 /* In the shared -Bsymbolic case, discard space allocated for
9738 dynamic pc-relative relocs against symbols which turn out to
9739 be defined in regular objects. For the normal shared case,
9740 discard space for relocs that have become local due to symbol
9741 visibility changes. */
9742
9743 if (bfd_link_pic (info))
9744 {
9745 /* Relocs that use pc_count are those that appear on a call
9746 insn, or certain REL relocs (see must_be_dyn_reloc) that
9747 can be generated via assembly. We want calls to
9748 protected symbols to resolve directly to the function
9749 rather than going via the plt. If people want function
9750 pointer comparisons to work as expected then they should
9751 avoid writing weird assembly. */
9752 if (SYMBOL_CALLS_LOCAL (info, h))
9753 {
9754 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9755 {
9756 p->count -= p->pc_count;
9757 p->pc_count = 0;
9758 if (p->count == 0)
9759 *pp = p->next;
9760 else
9761 pp = &p->next;
9762 }
9763 }
9764
9765 /* Also discard relocs on undefined weak syms with
9766 non-default visibility. */
9767 if (eh->dyn_relocs != NULL
9768 && h->root.type == bfd_link_hash_undefweak)
9769 {
9770 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9771 eh->dyn_relocs = NULL;
9772
9773 /* Make sure this symbol is output as a dynamic symbol.
9774 Undefined weak syms won't yet be marked as dynamic. */
9775 else if (h->dynindx == -1
9776 && !h->forced_local)
9777 {
9778 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9779 return FALSE;
9780 }
9781 }
9782 }
9783 else if (h->type == STT_GNU_IFUNC)
9784 {
9785 /* A plt entry is always created when making direct calls to
9786 an ifunc, even when building a static executable, but
9787 that doesn't cover all cases. We may have only an ifunc
9788 initialised function pointer for a given ifunc symbol.
9789
9790 For ELFv2, dynamic relocations are not required when
9791 generating a global entry PLT stub. */
9792 if (abiversion (info->output_bfd) >= 2)
9793 {
9794 if (global_entry_stub (h))
9795 eh->dyn_relocs = NULL;
9796 }
9797
9798 /* For ELFv1 we have function descriptors. Descriptors need
9799 to be treated like PLT entries and thus have dynamic
9800 relocations. One exception is when the function
9801 descriptor is copied into .dynbss (which should only
9802 happen with ancient versions of gcc). */
9803 else if (h->needs_copy)
9804 eh->dyn_relocs = NULL;
9805 }
9806 else if (ELIMINATE_COPY_RELOCS)
9807 {
9808 /* For the non-pic case, discard space for relocs against
9809 symbols which turn out to need copy relocs or are not
9810 dynamic. */
9811
9812 /* First make sure this symbol is output as a dynamic symbol.
9813 Undefined weak syms won't yet be marked as dynamic. */
9814 if (h->root.type == bfd_link_hash_undefweak
9815 && !h->non_got_ref
9816 && !h->def_regular
9817 && h->dynindx == -1
9818 && !h->forced_local
9819 && !bfd_elf_link_record_dynamic_symbol (info, h))
9820 return FALSE;
9821
9822 if (h->non_got_ref
9823 || h->def_regular
9824 || h->dynindx == -1)
9825 eh->dyn_relocs = NULL;
9826 }
9827
9828 /* Finally, allocate space. */
9829 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9830 {
9831 asection *sreloc = elf_section_data (p->sec)->sreloc;
9832 if (eh->elf.type == STT_GNU_IFUNC)
9833 sreloc = htab->elf.irelplt;
9834 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9835 }
9836 }
9837
9838 if ((htab->elf.dynamic_sections_created
9839 && h->dynindx != -1
9840 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
9841 || h->type == STT_GNU_IFUNC)
9842 {
9843 struct plt_entry *pent;
9844 bfd_boolean doneone = FALSE;
9845 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9846 if (pent->plt.refcount > 0)
9847 {
9848 if (!htab->elf.dynamic_sections_created
9849 || h->dynindx == -1)
9850 {
9851 s = htab->elf.iplt;
9852 pent->plt.offset = s->size;
9853 s->size += PLT_ENTRY_SIZE (htab);
9854 s = htab->elf.irelplt;
9855 }
9856 else
9857 {
9858 /* If this is the first .plt entry, make room for the special
9859 first entry. */
9860 s = htab->elf.splt;
9861 if (s->size == 0)
9862 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9863
9864 pent->plt.offset = s->size;
9865
9866 /* Make room for this entry. */
9867 s->size += PLT_ENTRY_SIZE (htab);
9868
9869 /* Make room for the .glink code. */
9870 s = htab->glink;
9871 if (s->size == 0)
9872 s->size += GLINK_CALL_STUB_SIZE;
9873 if (htab->opd_abi)
9874 {
9875 /* We need bigger stubs past index 32767. */
9876 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9877 s->size += 4;
9878 s->size += 2*4;
9879 }
9880 else
9881 s->size += 4;
9882
9883 /* We also need to make an entry in the .rela.plt section. */
9884 s = htab->elf.srelplt;
9885 }
9886 s->size += sizeof (Elf64_External_Rela);
9887 doneone = TRUE;
9888 }
9889 else
9890 pent->plt.offset = (bfd_vma) -1;
9891 if (!doneone)
9892 {
9893 h->plt.plist = NULL;
9894 h->needs_plt = 0;
9895 }
9896 }
9897 else
9898 {
9899 h->plt.plist = NULL;
9900 h->needs_plt = 0;
9901 }
9902
9903 return TRUE;
9904 }
9905
9906 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9907 to set up space for global entry stubs. These are put in glink,
9908 after the branch table. */
9909
9910 static bfd_boolean
9911 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9912 {
9913 struct bfd_link_info *info;
9914 struct ppc_link_hash_table *htab;
9915 struct plt_entry *pent;
9916 asection *s;
9917
9918 if (h->root.type == bfd_link_hash_indirect)
9919 return TRUE;
9920
9921 if (!h->pointer_equality_needed)
9922 return TRUE;
9923
9924 if (h->def_regular)
9925 return TRUE;
9926
9927 info = inf;
9928 htab = ppc_hash_table (info);
9929 if (htab == NULL)
9930 return FALSE;
9931
9932 s = htab->glink;
9933 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9934 if (pent->plt.offset != (bfd_vma) -1
9935 && pent->addend == 0)
9936 {
9937 /* For ELFv2, if this symbol is not defined in a regular file
9938 and we are not generating a shared library or pie, then we
9939 need to define the symbol in the executable on a call stub.
9940 This is to avoid text relocations. */
9941 s->size = (s->size + 15) & -16;
9942 h->root.type = bfd_link_hash_defined;
9943 h->root.u.def.section = s;
9944 h->root.u.def.value = s->size;
9945 s->size += 16;
9946 break;
9947 }
9948 return TRUE;
9949 }
9950
9951 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9952 read-only sections. */
9953
9954 static bfd_boolean
9955 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9956 {
9957 if (h->root.type == bfd_link_hash_indirect)
9958 return TRUE;
9959
9960 if (readonly_dynrelocs (h))
9961 {
9962 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9963
9964 /* Not an error, just cut short the traversal. */
9965 return FALSE;
9966 }
9967 return TRUE;
9968 }
9969
9970 /* Set the sizes of the dynamic sections. */
9971
9972 static bfd_boolean
9973 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9974 struct bfd_link_info *info)
9975 {
9976 struct ppc_link_hash_table *htab;
9977 bfd *dynobj;
9978 asection *s;
9979 bfd_boolean relocs;
9980 bfd *ibfd;
9981 struct got_entry *first_tlsld;
9982
9983 htab = ppc_hash_table (info);
9984 if (htab == NULL)
9985 return FALSE;
9986
9987 dynobj = htab->elf.dynobj;
9988 if (dynobj == NULL)
9989 abort ();
9990
9991 if (htab->elf.dynamic_sections_created)
9992 {
9993 /* Set the contents of the .interp section to the interpreter. */
9994 if (bfd_link_executable (info) && !info->nointerp)
9995 {
9996 s = bfd_get_linker_section (dynobj, ".interp");
9997 if (s == NULL)
9998 abort ();
9999 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10000 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10001 }
10002 }
10003
10004 /* Set up .got offsets for local syms, and space for local dynamic
10005 relocs. */
10006 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10007 {
10008 struct got_entry **lgot_ents;
10009 struct got_entry **end_lgot_ents;
10010 struct plt_entry **local_plt;
10011 struct plt_entry **end_local_plt;
10012 unsigned char *lgot_masks;
10013 bfd_size_type locsymcount;
10014 Elf_Internal_Shdr *symtab_hdr;
10015
10016 if (!is_ppc64_elf (ibfd))
10017 continue;
10018
10019 for (s = ibfd->sections; s != NULL; s = s->next)
10020 {
10021 struct ppc_dyn_relocs *p;
10022
10023 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10024 {
10025 if (!bfd_is_abs_section (p->sec)
10026 && bfd_is_abs_section (p->sec->output_section))
10027 {
10028 /* Input section has been discarded, either because
10029 it is a copy of a linkonce section or due to
10030 linker script /DISCARD/, so we'll be discarding
10031 the relocs too. */
10032 }
10033 else if (p->count != 0)
10034 {
10035 asection *srel = elf_section_data (p->sec)->sreloc;
10036 if (p->ifunc)
10037 srel = htab->elf.irelplt;
10038 srel->size += p->count * sizeof (Elf64_External_Rela);
10039 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10040 info->flags |= DF_TEXTREL;
10041 }
10042 }
10043 }
10044
10045 lgot_ents = elf_local_got_ents (ibfd);
10046 if (!lgot_ents)
10047 continue;
10048
10049 symtab_hdr = &elf_symtab_hdr (ibfd);
10050 locsymcount = symtab_hdr->sh_info;
10051 end_lgot_ents = lgot_ents + locsymcount;
10052 local_plt = (struct plt_entry **) end_lgot_ents;
10053 end_local_plt = local_plt + locsymcount;
10054 lgot_masks = (unsigned char *) end_local_plt;
10055 s = ppc64_elf_tdata (ibfd)->got;
10056 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10057 {
10058 struct got_entry **pent, *ent;
10059
10060 pent = lgot_ents;
10061 while ((ent = *pent) != NULL)
10062 if (ent->got.refcount > 0)
10063 {
10064 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
10065 {
10066 ppc64_tlsld_got (ibfd)->got.refcount += 1;
10067 *pent = ent->next;
10068 }
10069 else
10070 {
10071 unsigned int ent_size = 8;
10072 unsigned int rel_size = sizeof (Elf64_External_Rela);
10073
10074 ent->got.offset = s->size;
10075 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10076 {
10077 ent_size *= 2;
10078 rel_size *= 2;
10079 }
10080 s->size += ent_size;
10081 if ((*lgot_masks & PLT_IFUNC) != 0)
10082 {
10083 htab->elf.irelplt->size += rel_size;
10084 htab->got_reli_size += rel_size;
10085 }
10086 else if (bfd_link_pic (info))
10087 {
10088 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10089 srel->size += rel_size;
10090 }
10091 pent = &ent->next;
10092 }
10093 }
10094 else
10095 *pent = ent->next;
10096 }
10097
10098 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
10099 for (; local_plt < end_local_plt; ++local_plt)
10100 {
10101 struct plt_entry *ent;
10102
10103 for (ent = *local_plt; ent != NULL; ent = ent->next)
10104 if (ent->plt.refcount > 0)
10105 {
10106 s = htab->elf.iplt;
10107 ent->plt.offset = s->size;
10108 s->size += PLT_ENTRY_SIZE (htab);
10109
10110 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10111 }
10112 else
10113 ent->plt.offset = (bfd_vma) -1;
10114 }
10115 }
10116
10117 /* Allocate global sym .plt and .got entries, and space for global
10118 sym dynamic relocs. */
10119 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
10120 /* Stash the end of glink branch table. */
10121 if (htab->glink != NULL)
10122 htab->glink->rawsize = htab->glink->size;
10123
10124 if (!htab->opd_abi && !bfd_link_pic (info))
10125 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
10126
10127 first_tlsld = NULL;
10128 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10129 {
10130 struct got_entry *ent;
10131
10132 if (!is_ppc64_elf (ibfd))
10133 continue;
10134
10135 ent = ppc64_tlsld_got (ibfd);
10136 if (ent->got.refcount > 0)
10137 {
10138 if (!htab->do_multi_toc && first_tlsld != NULL)
10139 {
10140 ent->is_indirect = TRUE;
10141 ent->got.ent = first_tlsld;
10142 }
10143 else
10144 {
10145 if (first_tlsld == NULL)
10146 first_tlsld = ent;
10147 s = ppc64_elf_tdata (ibfd)->got;
10148 ent->got.offset = s->size;
10149 ent->owner = ibfd;
10150 s->size += 16;
10151 if (bfd_link_pic (info))
10152 {
10153 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10154 srel->size += sizeof (Elf64_External_Rela);
10155 }
10156 }
10157 }
10158 else
10159 ent->got.offset = (bfd_vma) -1;
10160 }
10161
10162 /* We now have determined the sizes of the various dynamic sections.
10163 Allocate memory for them. */
10164 relocs = FALSE;
10165 for (s = dynobj->sections; s != NULL; s = s->next)
10166 {
10167 if ((s->flags & SEC_LINKER_CREATED) == 0)
10168 continue;
10169
10170 if (s == htab->brlt || s == htab->relbrlt)
10171 /* These haven't been allocated yet; don't strip. */
10172 continue;
10173 else if (s == htab->elf.sgot
10174 || s == htab->elf.splt
10175 || s == htab->elf.iplt
10176 || s == htab->glink
10177 || s == htab->elf.sdynbss)
10178 {
10179 /* Strip this section if we don't need it; see the
10180 comment below. */
10181 }
10182 else if (s == htab->glink_eh_frame)
10183 {
10184 if (!bfd_is_abs_section (s->output_section))
10185 /* Not sized yet. */
10186 continue;
10187 }
10188 else if (CONST_STRNEQ (s->name, ".rela"))
10189 {
10190 if (s->size != 0)
10191 {
10192 if (s != htab->elf.srelplt)
10193 relocs = TRUE;
10194
10195 /* We use the reloc_count field as a counter if we need
10196 to copy relocs into the output file. */
10197 s->reloc_count = 0;
10198 }
10199 }
10200 else
10201 {
10202 /* It's not one of our sections, so don't allocate space. */
10203 continue;
10204 }
10205
10206 if (s->size == 0)
10207 {
10208 /* If we don't need this section, strip it from the
10209 output file. This is mostly to handle .rela.bss and
10210 .rela.plt. We must create both sections in
10211 create_dynamic_sections, because they must be created
10212 before the linker maps input sections to output
10213 sections. The linker does that before
10214 adjust_dynamic_symbol is called, and it is that
10215 function which decides whether anything needs to go
10216 into these sections. */
10217 s->flags |= SEC_EXCLUDE;
10218 continue;
10219 }
10220
10221 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10222 continue;
10223
10224 /* Allocate memory for the section contents. We use bfd_zalloc
10225 here in case unused entries are not reclaimed before the
10226 section's contents are written out. This should not happen,
10227 but this way if it does we get a R_PPC64_NONE reloc in .rela
10228 sections instead of garbage.
10229 We also rely on the section contents being zero when writing
10230 the GOT. */
10231 s->contents = bfd_zalloc (dynobj, s->size);
10232 if (s->contents == NULL)
10233 return FALSE;
10234 }
10235
10236 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10237 {
10238 if (!is_ppc64_elf (ibfd))
10239 continue;
10240
10241 s = ppc64_elf_tdata (ibfd)->got;
10242 if (s != NULL && s != htab->elf.sgot)
10243 {
10244 if (s->size == 0)
10245 s->flags |= SEC_EXCLUDE;
10246 else
10247 {
10248 s->contents = bfd_zalloc (ibfd, s->size);
10249 if (s->contents == NULL)
10250 return FALSE;
10251 }
10252 }
10253 s = ppc64_elf_tdata (ibfd)->relgot;
10254 if (s != NULL)
10255 {
10256 if (s->size == 0)
10257 s->flags |= SEC_EXCLUDE;
10258 else
10259 {
10260 s->contents = bfd_zalloc (ibfd, s->size);
10261 if (s->contents == NULL)
10262 return FALSE;
10263 relocs = TRUE;
10264 s->reloc_count = 0;
10265 }
10266 }
10267 }
10268
10269 if (htab->elf.dynamic_sections_created)
10270 {
10271 bfd_boolean tls_opt;
10272
10273 /* Add some entries to the .dynamic section. We fill in the
10274 values later, in ppc64_elf_finish_dynamic_sections, but we
10275 must add the entries now so that we get the correct size for
10276 the .dynamic section. The DT_DEBUG entry is filled in by the
10277 dynamic linker and used by the debugger. */
10278 #define add_dynamic_entry(TAG, VAL) \
10279 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10280
10281 if (bfd_link_executable (info))
10282 {
10283 if (!add_dynamic_entry (DT_DEBUG, 0))
10284 return FALSE;
10285 }
10286
10287 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
10288 {
10289 if (!add_dynamic_entry (DT_PLTGOT, 0)
10290 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10291 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
10292 || !add_dynamic_entry (DT_JMPREL, 0)
10293 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
10294 return FALSE;
10295 }
10296
10297 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
10298 {
10299 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10300 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
10301 return FALSE;
10302 }
10303
10304 tls_opt = (htab->params->tls_get_addr_opt
10305 && htab->tls_get_addr_fd != NULL
10306 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10307 if (tls_opt || !htab->opd_abi)
10308 {
10309 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10310 return FALSE;
10311 }
10312
10313 if (relocs)
10314 {
10315 if (!add_dynamic_entry (DT_RELA, 0)
10316 || !add_dynamic_entry (DT_RELASZ, 0)
10317 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
10318 return FALSE;
10319
10320 /* If any dynamic relocs apply to a read-only section,
10321 then we need a DT_TEXTREL entry. */
10322 if ((info->flags & DF_TEXTREL) == 0)
10323 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
10324
10325 if ((info->flags & DF_TEXTREL) != 0)
10326 {
10327 if (!add_dynamic_entry (DT_TEXTREL, 0))
10328 return FALSE;
10329 }
10330 }
10331 }
10332 #undef add_dynamic_entry
10333
10334 return TRUE;
10335 }
10336
10337 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10338
10339 static bfd_boolean
10340 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10341 {
10342 if (h->plt.plist != NULL
10343 && !h->def_regular
10344 && !h->pointer_equality_needed)
10345 return FALSE;
10346
10347 return _bfd_elf_hash_symbol (h);
10348 }
10349
10350 /* Determine the type of stub needed, if any, for a call. */
10351
10352 static inline enum ppc_stub_type
10353 ppc_type_of_stub (asection *input_sec,
10354 const Elf_Internal_Rela *rel,
10355 struct ppc_link_hash_entry **hash,
10356 struct plt_entry **plt_ent,
10357 bfd_vma destination,
10358 unsigned long local_off)
10359 {
10360 struct ppc_link_hash_entry *h = *hash;
10361 bfd_vma location;
10362 bfd_vma branch_offset;
10363 bfd_vma max_branch_offset;
10364 enum elf_ppc64_reloc_type r_type;
10365
10366 if (h != NULL)
10367 {
10368 struct plt_entry *ent;
10369 struct ppc_link_hash_entry *fdh = h;
10370 if (h->oh != NULL
10371 && h->oh->is_func_descriptor)
10372 {
10373 fdh = ppc_follow_link (h->oh);
10374 *hash = fdh;
10375 }
10376
10377 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10378 if (ent->addend == rel->r_addend
10379 && ent->plt.offset != (bfd_vma) -1)
10380 {
10381 *plt_ent = ent;
10382 return ppc_stub_plt_call;
10383 }
10384
10385 /* Here, we know we don't have a plt entry. If we don't have a
10386 either a defined function descriptor or a defined entry symbol
10387 in a regular object file, then it is pointless trying to make
10388 any other type of stub. */
10389 if (!is_static_defined (&fdh->elf)
10390 && !is_static_defined (&h->elf))
10391 return ppc_stub_none;
10392 }
10393 else if (elf_local_got_ents (input_sec->owner) != NULL)
10394 {
10395 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10396 struct plt_entry **local_plt = (struct plt_entry **)
10397 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10398 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10399
10400 if (local_plt[r_symndx] != NULL)
10401 {
10402 struct plt_entry *ent;
10403
10404 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10405 if (ent->addend == rel->r_addend
10406 && ent->plt.offset != (bfd_vma) -1)
10407 {
10408 *plt_ent = ent;
10409 return ppc_stub_plt_call;
10410 }
10411 }
10412 }
10413
10414 /* Determine where the call point is. */
10415 location = (input_sec->output_offset
10416 + input_sec->output_section->vma
10417 + rel->r_offset);
10418
10419 branch_offset = destination - location;
10420 r_type = ELF64_R_TYPE (rel->r_info);
10421
10422 /* Determine if a long branch stub is needed. */
10423 max_branch_offset = 1 << 25;
10424 if (r_type != R_PPC64_REL24)
10425 max_branch_offset = 1 << 15;
10426
10427 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10428 /* We need a stub. Figure out whether a long_branch or plt_branch
10429 is needed later. */
10430 return ppc_stub_long_branch;
10431
10432 return ppc_stub_none;
10433 }
10434
10435 /* With power7 weakly ordered memory model, it is possible for ld.so
10436 to update a plt entry in one thread and have another thread see a
10437 stale zero toc entry. To avoid this we need some sort of acquire
10438 barrier in the call stub. One solution is to make the load of the
10439 toc word seem to appear to depend on the load of the function entry
10440 word. Another solution is to test for r2 being zero, and branch to
10441 the appropriate glink entry if so.
10442
10443 . fake dep barrier compare
10444 . ld 12,xxx(2) ld 12,xxx(2)
10445 . mtctr 12 mtctr 12
10446 . xor 11,12,12 ld 2,xxx+8(2)
10447 . add 2,2,11 cmpldi 2,0
10448 . ld 2,xxx+8(2) bnectr+
10449 . bctr b <glink_entry>
10450
10451 The solution involving the compare turns out to be faster, so
10452 that's what we use unless the branch won't reach. */
10453
10454 #define ALWAYS_USE_FAKE_DEP 0
10455 #define ALWAYS_EMIT_R2SAVE 0
10456
10457 #define PPC_LO(v) ((v) & 0xffff)
10458 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10459 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10460
10461 static inline unsigned int
10462 plt_stub_size (struct ppc_link_hash_table *htab,
10463 struct ppc_stub_hash_entry *stub_entry,
10464 bfd_vma off)
10465 {
10466 unsigned size = 12;
10467
10468 if (ALWAYS_EMIT_R2SAVE
10469 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10470 size += 4;
10471 if (PPC_HA (off) != 0)
10472 size += 4;
10473 if (htab->opd_abi)
10474 {
10475 size += 4;
10476 if (htab->params->plt_static_chain)
10477 size += 4;
10478 if (htab->params->plt_thread_safe
10479 && htab->elf.dynamic_sections_created
10480 && stub_entry->h != NULL
10481 && stub_entry->h->elf.dynindx != -1)
10482 size += 8;
10483 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10484 size += 4;
10485 }
10486 if (stub_entry->h != NULL
10487 && (stub_entry->h == htab->tls_get_addr_fd
10488 || stub_entry->h == htab->tls_get_addr)
10489 && htab->params->tls_get_addr_opt)
10490 size += 13 * 4;
10491 return size;
10492 }
10493
10494 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10495 then return the padding needed to do so. */
10496 static inline unsigned int
10497 plt_stub_pad (struct ppc_link_hash_table *htab,
10498 struct ppc_stub_hash_entry *stub_entry,
10499 bfd_vma plt_off)
10500 {
10501 int stub_align = 1 << htab->params->plt_stub_align;
10502 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10503 bfd_vma stub_off = stub_entry->group->stub_sec->size;
10504
10505 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10506 > ((stub_size - 1) & -stub_align))
10507 return stub_align - (stub_off & (stub_align - 1));
10508 return 0;
10509 }
10510
10511 /* Build a .plt call stub. */
10512
10513 static inline bfd_byte *
10514 build_plt_stub (struct ppc_link_hash_table *htab,
10515 struct ppc_stub_hash_entry *stub_entry,
10516 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10517 {
10518 bfd *obfd = htab->params->stub_bfd;
10519 bfd_boolean plt_load_toc = htab->opd_abi;
10520 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10521 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10522 && htab->elf.dynamic_sections_created
10523 && stub_entry->h != NULL
10524 && stub_entry->h->elf.dynindx != -1);
10525 bfd_boolean use_fake_dep = plt_thread_safe;
10526 bfd_vma cmp_branch_off = 0;
10527
10528 if (!ALWAYS_USE_FAKE_DEP
10529 && plt_load_toc
10530 && plt_thread_safe
10531 && !((stub_entry->h == htab->tls_get_addr_fd
10532 || stub_entry->h == htab->tls_get_addr)
10533 && htab->params->tls_get_addr_opt))
10534 {
10535 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10536 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10537 / PLT_ENTRY_SIZE (htab));
10538 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10539 bfd_vma to, from;
10540
10541 if (pltindex > 32768)
10542 glinkoff += (pltindex - 32768) * 4;
10543 to = (glinkoff
10544 + htab->glink->output_offset
10545 + htab->glink->output_section->vma);
10546 from = (p - stub_entry->group->stub_sec->contents
10547 + 4 * (ALWAYS_EMIT_R2SAVE
10548 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10549 + 4 * (PPC_HA (offset) != 0)
10550 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10551 != PPC_HA (offset))
10552 + 4 * (plt_static_chain != 0)
10553 + 20
10554 + stub_entry->group->stub_sec->output_offset
10555 + stub_entry->group->stub_sec->output_section->vma);
10556 cmp_branch_off = to - from;
10557 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10558 }
10559
10560 if (PPC_HA (offset) != 0)
10561 {
10562 if (r != NULL)
10563 {
10564 if (ALWAYS_EMIT_R2SAVE
10565 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10566 r[0].r_offset += 4;
10567 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10568 r[1].r_offset = r[0].r_offset + 4;
10569 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10570 r[1].r_addend = r[0].r_addend;
10571 if (plt_load_toc)
10572 {
10573 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10574 {
10575 r[2].r_offset = r[1].r_offset + 4;
10576 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10577 r[2].r_addend = r[0].r_addend;
10578 }
10579 else
10580 {
10581 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10582 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10583 r[2].r_addend = r[0].r_addend + 8;
10584 if (plt_static_chain)
10585 {
10586 r[3].r_offset = r[2].r_offset + 4;
10587 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10588 r[3].r_addend = r[0].r_addend + 16;
10589 }
10590 }
10591 }
10592 }
10593 if (ALWAYS_EMIT_R2SAVE
10594 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10595 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10596 if (plt_load_toc)
10597 {
10598 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10599 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10600 }
10601 else
10602 {
10603 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10604 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10605 }
10606 if (plt_load_toc
10607 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10608 {
10609 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10610 offset = 0;
10611 }
10612 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10613 if (plt_load_toc)
10614 {
10615 if (use_fake_dep)
10616 {
10617 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10618 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10619 }
10620 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10621 if (plt_static_chain)
10622 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10623 }
10624 }
10625 else
10626 {
10627 if (r != NULL)
10628 {
10629 if (ALWAYS_EMIT_R2SAVE
10630 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10631 r[0].r_offset += 4;
10632 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10633 if (plt_load_toc)
10634 {
10635 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10636 {
10637 r[1].r_offset = r[0].r_offset + 4;
10638 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10639 r[1].r_addend = r[0].r_addend;
10640 }
10641 else
10642 {
10643 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10644 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10645 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10646 if (plt_static_chain)
10647 {
10648 r[2].r_offset = r[1].r_offset + 4;
10649 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10650 r[2].r_addend = r[0].r_addend + 8;
10651 }
10652 }
10653 }
10654 }
10655 if (ALWAYS_EMIT_R2SAVE
10656 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10657 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10658 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10659 if (plt_load_toc
10660 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10661 {
10662 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10663 offset = 0;
10664 }
10665 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10666 if (plt_load_toc)
10667 {
10668 if (use_fake_dep)
10669 {
10670 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10671 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10672 }
10673 if (plt_static_chain)
10674 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10675 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10676 }
10677 }
10678 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10679 {
10680 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10681 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10682 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10683 }
10684 else
10685 bfd_put_32 (obfd, BCTR, p), p += 4;
10686 return p;
10687 }
10688
10689 /* Build a special .plt call stub for __tls_get_addr. */
10690
10691 #define LD_R11_0R3 0xe9630000
10692 #define LD_R12_0R3 0xe9830000
10693 #define MR_R0_R3 0x7c601b78
10694 #define CMPDI_R11_0 0x2c2b0000
10695 #define ADD_R3_R12_R13 0x7c6c6a14
10696 #define BEQLR 0x4d820020
10697 #define MR_R3_R0 0x7c030378
10698 #define STD_R11_0R1 0xf9610000
10699 #define BCTRL 0x4e800421
10700 #define LD_R11_0R1 0xe9610000
10701 #define MTLR_R11 0x7d6803a6
10702
10703 static inline bfd_byte *
10704 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10705 struct ppc_stub_hash_entry *stub_entry,
10706 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10707 {
10708 bfd *obfd = htab->params->stub_bfd;
10709
10710 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10711 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10712 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10713 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10714 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10715 bfd_put_32 (obfd, BEQLR, p), p += 4;
10716 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10717 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10718 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10719
10720 if (r != NULL)
10721 r[0].r_offset += 9 * 4;
10722 p = build_plt_stub (htab, stub_entry, p, offset, r);
10723 bfd_put_32 (obfd, BCTRL, p - 4);
10724
10725 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10726 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10727 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10728 bfd_put_32 (obfd, BLR, p), p += 4;
10729
10730 return p;
10731 }
10732
10733 static Elf_Internal_Rela *
10734 get_relocs (asection *sec, int count)
10735 {
10736 Elf_Internal_Rela *relocs;
10737 struct bfd_elf_section_data *elfsec_data;
10738
10739 elfsec_data = elf_section_data (sec);
10740 relocs = elfsec_data->relocs;
10741 if (relocs == NULL)
10742 {
10743 bfd_size_type relsize;
10744 relsize = sec->reloc_count * sizeof (*relocs);
10745 relocs = bfd_alloc (sec->owner, relsize);
10746 if (relocs == NULL)
10747 return NULL;
10748 elfsec_data->relocs = relocs;
10749 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10750 sizeof (Elf_Internal_Shdr));
10751 if (elfsec_data->rela.hdr == NULL)
10752 return NULL;
10753 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10754 * sizeof (Elf64_External_Rela));
10755 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10756 sec->reloc_count = 0;
10757 }
10758 relocs += sec->reloc_count;
10759 sec->reloc_count += count;
10760 return relocs;
10761 }
10762
10763 static bfd_vma
10764 get_r2off (struct bfd_link_info *info,
10765 struct ppc_stub_hash_entry *stub_entry)
10766 {
10767 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10768 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
10769
10770 if (r2off == 0)
10771 {
10772 /* Support linking -R objects. Get the toc pointer from the
10773 opd entry. */
10774 char buf[8];
10775 if (!htab->opd_abi)
10776 return r2off;
10777 asection *opd = stub_entry->h->elf.root.u.def.section;
10778 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10779
10780 if (strcmp (opd->name, ".opd") != 0
10781 || opd->reloc_count != 0)
10782 {
10783 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10784 stub_entry->h->elf.root.root.string);
10785 bfd_set_error (bfd_error_bad_value);
10786 return (bfd_vma) -1;
10787 }
10788 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10789 return (bfd_vma) -1;
10790 r2off = bfd_get_64 (opd->owner, buf);
10791 r2off -= elf_gp (info->output_bfd);
10792 }
10793 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
10794 return r2off;
10795 }
10796
10797 static bfd_boolean
10798 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10799 {
10800 struct ppc_stub_hash_entry *stub_entry;
10801 struct ppc_branch_hash_entry *br_entry;
10802 struct bfd_link_info *info;
10803 struct ppc_link_hash_table *htab;
10804 bfd_byte *loc;
10805 bfd_byte *p;
10806 bfd_vma dest, off;
10807 int size;
10808 Elf_Internal_Rela *r;
10809 asection *plt;
10810
10811 /* Massage our args to the form they really have. */
10812 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10813 info = in_arg;
10814
10815 htab = ppc_hash_table (info);
10816 if (htab == NULL)
10817 return FALSE;
10818
10819 /* Make a note of the offset within the stubs for this entry. */
10820 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10821 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
10822
10823 htab->stub_count[stub_entry->stub_type - 1] += 1;
10824 switch (stub_entry->stub_type)
10825 {
10826 case ppc_stub_long_branch:
10827 case ppc_stub_long_branch_r2off:
10828 /* Branches are relative. This is where we are going to. */
10829 dest = (stub_entry->target_value
10830 + stub_entry->target_section->output_offset
10831 + stub_entry->target_section->output_section->vma);
10832 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10833 off = dest;
10834
10835 /* And this is where we are coming from. */
10836 off -= (stub_entry->stub_offset
10837 + stub_entry->group->stub_sec->output_offset
10838 + stub_entry->group->stub_sec->output_section->vma);
10839
10840 size = 4;
10841 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10842 {
10843 bfd_vma r2off = get_r2off (info, stub_entry);
10844
10845 if (r2off == (bfd_vma) -1)
10846 {
10847 htab->stub_error = TRUE;
10848 return FALSE;
10849 }
10850 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10851 loc += 4;
10852 size = 8;
10853 if (PPC_HA (r2off) != 0)
10854 {
10855 bfd_put_32 (htab->params->stub_bfd,
10856 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10857 loc += 4;
10858 size += 4;
10859 }
10860 if (PPC_LO (r2off) != 0)
10861 {
10862 bfd_put_32 (htab->params->stub_bfd,
10863 ADDI_R2_R2 | PPC_LO (r2off), loc);
10864 loc += 4;
10865 size += 4;
10866 }
10867 off -= size - 4;
10868 }
10869 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10870
10871 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10872 {
10873 info->callbacks->einfo
10874 (_("%P: long branch stub `%s' offset overflow\n"),
10875 stub_entry->root.string);
10876 htab->stub_error = TRUE;
10877 return FALSE;
10878 }
10879
10880 if (info->emitrelocations)
10881 {
10882 r = get_relocs (stub_entry->group->stub_sec, 1);
10883 if (r == NULL)
10884 return FALSE;
10885 r->r_offset = loc - stub_entry->group->stub_sec->contents;
10886 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10887 r->r_addend = dest;
10888 if (stub_entry->h != NULL)
10889 {
10890 struct elf_link_hash_entry **hashes;
10891 unsigned long symndx;
10892 struct ppc_link_hash_entry *h;
10893
10894 hashes = elf_sym_hashes (htab->params->stub_bfd);
10895 if (hashes == NULL)
10896 {
10897 bfd_size_type hsize;
10898
10899 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10900 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10901 if (hashes == NULL)
10902 return FALSE;
10903 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10904 htab->stub_globals = 1;
10905 }
10906 symndx = htab->stub_globals++;
10907 h = stub_entry->h;
10908 hashes[symndx] = &h->elf;
10909 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10910 if (h->oh != NULL && h->oh->is_func)
10911 h = ppc_follow_link (h->oh);
10912 if (h->elf.root.u.def.section != stub_entry->target_section)
10913 /* H is an opd symbol. The addend must be zero. */
10914 r->r_addend = 0;
10915 else
10916 {
10917 off = (h->elf.root.u.def.value
10918 + h->elf.root.u.def.section->output_offset
10919 + h->elf.root.u.def.section->output_section->vma);
10920 r->r_addend -= off;
10921 }
10922 }
10923 }
10924 break;
10925
10926 case ppc_stub_plt_branch:
10927 case ppc_stub_plt_branch_r2off:
10928 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10929 stub_entry->root.string + 9,
10930 FALSE, FALSE);
10931 if (br_entry == NULL)
10932 {
10933 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10934 stub_entry->root.string);
10935 htab->stub_error = TRUE;
10936 return FALSE;
10937 }
10938
10939 dest = (stub_entry->target_value
10940 + stub_entry->target_section->output_offset
10941 + stub_entry->target_section->output_section->vma);
10942 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10943 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10944
10945 bfd_put_64 (htab->brlt->owner, dest,
10946 htab->brlt->contents + br_entry->offset);
10947
10948 if (br_entry->iter == htab->stub_iteration)
10949 {
10950 br_entry->iter = 0;
10951
10952 if (htab->relbrlt != NULL)
10953 {
10954 /* Create a reloc for the branch lookup table entry. */
10955 Elf_Internal_Rela rela;
10956 bfd_byte *rl;
10957
10958 rela.r_offset = (br_entry->offset
10959 + htab->brlt->output_offset
10960 + htab->brlt->output_section->vma);
10961 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10962 rela.r_addend = dest;
10963
10964 rl = htab->relbrlt->contents;
10965 rl += (htab->relbrlt->reloc_count++
10966 * sizeof (Elf64_External_Rela));
10967 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10968 }
10969 else if (info->emitrelocations)
10970 {
10971 r = get_relocs (htab->brlt, 1);
10972 if (r == NULL)
10973 return FALSE;
10974 /* brlt, being SEC_LINKER_CREATED does not go through the
10975 normal reloc processing. Symbols and offsets are not
10976 translated from input file to output file form, so
10977 set up the offset per the output file. */
10978 r->r_offset = (br_entry->offset
10979 + htab->brlt->output_offset
10980 + htab->brlt->output_section->vma);
10981 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10982 r->r_addend = dest;
10983 }
10984 }
10985
10986 dest = (br_entry->offset
10987 + htab->brlt->output_offset
10988 + htab->brlt->output_section->vma);
10989
10990 off = (dest
10991 - elf_gp (htab->brlt->output_section->owner)
10992 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
10993
10994 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10995 {
10996 info->callbacks->einfo
10997 (_("%P: linkage table error against `%T'\n"),
10998 stub_entry->root.string);
10999 bfd_set_error (bfd_error_bad_value);
11000 htab->stub_error = TRUE;
11001 return FALSE;
11002 }
11003
11004 if (info->emitrelocations)
11005 {
11006 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
11007 if (r == NULL)
11008 return FALSE;
11009 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11010 if (bfd_big_endian (info->output_bfd))
11011 r[0].r_offset += 2;
11012 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
11013 r[0].r_offset += 4;
11014 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11015 r[0].r_addend = dest;
11016 if (PPC_HA (off) != 0)
11017 {
11018 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11019 r[1].r_offset = r[0].r_offset + 4;
11020 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11021 r[1].r_addend = r[0].r_addend;
11022 }
11023 }
11024
11025 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11026 {
11027 if (PPC_HA (off) != 0)
11028 {
11029 size = 16;
11030 bfd_put_32 (htab->params->stub_bfd,
11031 ADDIS_R12_R2 | PPC_HA (off), loc);
11032 loc += 4;
11033 bfd_put_32 (htab->params->stub_bfd,
11034 LD_R12_0R12 | PPC_LO (off), loc);
11035 }
11036 else
11037 {
11038 size = 12;
11039 bfd_put_32 (htab->params->stub_bfd,
11040 LD_R12_0R2 | PPC_LO (off), loc);
11041 }
11042 }
11043 else
11044 {
11045 bfd_vma r2off = get_r2off (info, stub_entry);
11046
11047 if (r2off == (bfd_vma) -1)
11048 {
11049 htab->stub_error = TRUE;
11050 return FALSE;
11051 }
11052
11053 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
11054 loc += 4;
11055 size = 16;
11056 if (PPC_HA (off) != 0)
11057 {
11058 size += 4;
11059 bfd_put_32 (htab->params->stub_bfd,
11060 ADDIS_R12_R2 | PPC_HA (off), loc);
11061 loc += 4;
11062 bfd_put_32 (htab->params->stub_bfd,
11063 LD_R12_0R12 | PPC_LO (off), loc);
11064 }
11065 else
11066 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
11067
11068 if (PPC_HA (r2off) != 0)
11069 {
11070 size += 4;
11071 loc += 4;
11072 bfd_put_32 (htab->params->stub_bfd,
11073 ADDIS_R2_R2 | PPC_HA (r2off), loc);
11074 }
11075 if (PPC_LO (r2off) != 0)
11076 {
11077 size += 4;
11078 loc += 4;
11079 bfd_put_32 (htab->params->stub_bfd,
11080 ADDI_R2_R2 | PPC_LO (r2off), loc);
11081 }
11082 }
11083 loc += 4;
11084 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
11085 loc += 4;
11086 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
11087 break;
11088
11089 case ppc_stub_plt_call:
11090 case ppc_stub_plt_call_r2save:
11091 if (stub_entry->h != NULL
11092 && stub_entry->h->is_func_descriptor
11093 && stub_entry->h->oh != NULL)
11094 {
11095 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11096
11097 /* If the old-ABI "dot-symbol" is undefined make it weak so
11098 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
11099 if (fh->elf.root.type == bfd_link_hash_undefined
11100 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11101 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
11102 fh->elf.root.type = bfd_link_hash_undefweak;
11103 }
11104
11105 /* Now build the stub. */
11106 dest = stub_entry->plt_ent->plt.offset & ~1;
11107 if (dest >= (bfd_vma) -2)
11108 abort ();
11109
11110 plt = htab->elf.splt;
11111 if (!htab->elf.dynamic_sections_created
11112 || stub_entry->h == NULL
11113 || stub_entry->h->elf.dynindx == -1)
11114 plt = htab->elf.iplt;
11115
11116 dest += plt->output_offset + plt->output_section->vma;
11117
11118 if (stub_entry->h == NULL
11119 && (stub_entry->plt_ent->plt.offset & 1) == 0)
11120 {
11121 Elf_Internal_Rela rela;
11122 bfd_byte *rl;
11123
11124 rela.r_offset = dest;
11125 if (htab->opd_abi)
11126 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
11127 else
11128 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
11129 rela.r_addend = (stub_entry->target_value
11130 + stub_entry->target_section->output_offset
11131 + stub_entry->target_section->output_section->vma);
11132
11133 rl = (htab->elf.irelplt->contents
11134 + (htab->elf.irelplt->reloc_count++
11135 * sizeof (Elf64_External_Rela)));
11136 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
11137 stub_entry->plt_ent->plt.offset |= 1;
11138 }
11139
11140 off = (dest
11141 - elf_gp (plt->output_section->owner)
11142 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11143
11144 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11145 {
11146 info->callbacks->einfo
11147 /* xgettext:c-format */
11148 (_("%P: linkage table error against `%T'\n"),
11149 stub_entry->h != NULL
11150 ? stub_entry->h->elf.root.root.string
11151 : "<local sym>");
11152 bfd_set_error (bfd_error_bad_value);
11153 htab->stub_error = TRUE;
11154 return FALSE;
11155 }
11156
11157 if (htab->params->plt_stub_align != 0)
11158 {
11159 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11160
11161 stub_entry->group->stub_sec->size += pad;
11162 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11163 loc += pad;
11164 }
11165
11166 r = NULL;
11167 if (info->emitrelocations)
11168 {
11169 r = get_relocs (stub_entry->group->stub_sec,
11170 ((PPC_HA (off) != 0)
11171 + (htab->opd_abi
11172 ? 2 + (htab->params->plt_static_chain
11173 && PPC_HA (off + 16) == PPC_HA (off))
11174 : 1)));
11175 if (r == NULL)
11176 return FALSE;
11177 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11178 if (bfd_big_endian (info->output_bfd))
11179 r[0].r_offset += 2;
11180 r[0].r_addend = dest;
11181 }
11182 if (stub_entry->h != NULL
11183 && (stub_entry->h == htab->tls_get_addr_fd
11184 || stub_entry->h == htab->tls_get_addr)
11185 && htab->params->tls_get_addr_opt)
11186 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
11187 else
11188 p = build_plt_stub (htab, stub_entry, loc, off, r);
11189 size = p - loc;
11190 break;
11191
11192 case ppc_stub_save_res:
11193 return TRUE;
11194
11195 default:
11196 BFD_FAIL ();
11197 return FALSE;
11198 }
11199
11200 stub_entry->group->stub_sec->size += size;
11201
11202 if (htab->params->emit_stub_syms)
11203 {
11204 struct elf_link_hash_entry *h;
11205 size_t len1, len2;
11206 char *name;
11207 const char *const stub_str[] = { "long_branch",
11208 "long_branch_r2off",
11209 "plt_branch",
11210 "plt_branch_r2off",
11211 "plt_call",
11212 "plt_call" };
11213
11214 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11215 len2 = strlen (stub_entry->root.string);
11216 name = bfd_malloc (len1 + len2 + 2);
11217 if (name == NULL)
11218 return FALSE;
11219 memcpy (name, stub_entry->root.string, 9);
11220 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11221 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11222 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
11223 if (h == NULL)
11224 return FALSE;
11225 if (h->root.type == bfd_link_hash_new)
11226 {
11227 h->root.type = bfd_link_hash_defined;
11228 h->root.u.def.section = stub_entry->group->stub_sec;
11229 h->root.u.def.value = stub_entry->stub_offset;
11230 h->ref_regular = 1;
11231 h->def_regular = 1;
11232 h->ref_regular_nonweak = 1;
11233 h->forced_local = 1;
11234 h->non_elf = 0;
11235 h->root.linker_def = 1;
11236 }
11237 }
11238
11239 return TRUE;
11240 }
11241
11242 /* As above, but don't actually build the stub. Just bump offset so
11243 we know stub section sizes, and select plt_branch stubs where
11244 long_branch stubs won't do. */
11245
11246 static bfd_boolean
11247 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
11248 {
11249 struct ppc_stub_hash_entry *stub_entry;
11250 struct bfd_link_info *info;
11251 struct ppc_link_hash_table *htab;
11252 bfd_vma off;
11253 int size;
11254
11255 /* Massage our args to the form they really have. */
11256 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
11257 info = in_arg;
11258
11259 htab = ppc_hash_table (info);
11260 if (htab == NULL)
11261 return FALSE;
11262
11263 if (stub_entry->h != NULL
11264 && stub_entry->h->save_res
11265 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11266 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11267 {
11268 /* Don't make stubs to out-of-line register save/restore
11269 functions. Instead, emit copies of the functions. */
11270 stub_entry->group->needs_save_res = 1;
11271 stub_entry->stub_type = ppc_stub_save_res;
11272 return TRUE;
11273 }
11274
11275 if (stub_entry->stub_type == ppc_stub_plt_call
11276 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11277 {
11278 asection *plt;
11279 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11280 if (off >= (bfd_vma) -2)
11281 abort ();
11282 plt = htab->elf.splt;
11283 if (!htab->elf.dynamic_sections_created
11284 || stub_entry->h == NULL
11285 || stub_entry->h->elf.dynindx == -1)
11286 plt = htab->elf.iplt;
11287 off += (plt->output_offset
11288 + plt->output_section->vma
11289 - elf_gp (plt->output_section->owner)
11290 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11291
11292 size = plt_stub_size (htab, stub_entry, off);
11293 if (htab->params->plt_stub_align)
11294 size += plt_stub_pad (htab, stub_entry, off);
11295 if (info->emitrelocations)
11296 {
11297 stub_entry->group->stub_sec->reloc_count
11298 += ((PPC_HA (off) != 0)
11299 + (htab->opd_abi
11300 ? 2 + (htab->params->plt_static_chain
11301 && PPC_HA (off + 16) == PPC_HA (off))
11302 : 1));
11303 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11304 }
11305 }
11306 else
11307 {
11308 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11309 variants. */
11310 bfd_vma r2off = 0;
11311 bfd_vma local_off = 0;
11312
11313 off = (stub_entry->target_value
11314 + stub_entry->target_section->output_offset
11315 + stub_entry->target_section->output_section->vma);
11316 off -= (stub_entry->group->stub_sec->size
11317 + stub_entry->group->stub_sec->output_offset
11318 + stub_entry->group->stub_sec->output_section->vma);
11319
11320 /* Reset the stub type from the plt variant in case we now
11321 can reach with a shorter stub. */
11322 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11323 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11324
11325 size = 4;
11326 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11327 {
11328 r2off = get_r2off (info, stub_entry);
11329 if (r2off == (bfd_vma) -1)
11330 {
11331 htab->stub_error = TRUE;
11332 return FALSE;
11333 }
11334 size = 8;
11335 if (PPC_HA (r2off) != 0)
11336 size += 4;
11337 if (PPC_LO (r2off) != 0)
11338 size += 4;
11339 off -= size - 4;
11340 }
11341
11342 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11343
11344 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11345 Do the same for -R objects without function descriptors. */
11346 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11347 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11348 && r2off == 0
11349 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
11350 {
11351 struct ppc_branch_hash_entry *br_entry;
11352
11353 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11354 stub_entry->root.string + 9,
11355 TRUE, FALSE);
11356 if (br_entry == NULL)
11357 {
11358 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
11359 stub_entry->root.string);
11360 htab->stub_error = TRUE;
11361 return FALSE;
11362 }
11363
11364 if (br_entry->iter != htab->stub_iteration)
11365 {
11366 br_entry->iter = htab->stub_iteration;
11367 br_entry->offset = htab->brlt->size;
11368 htab->brlt->size += 8;
11369
11370 if (htab->relbrlt != NULL)
11371 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11372 else if (info->emitrelocations)
11373 {
11374 htab->brlt->reloc_count += 1;
11375 htab->brlt->flags |= SEC_RELOC;
11376 }
11377 }
11378
11379 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11380 off = (br_entry->offset
11381 + htab->brlt->output_offset
11382 + htab->brlt->output_section->vma
11383 - elf_gp (htab->brlt->output_section->owner)
11384 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11385
11386 if (info->emitrelocations)
11387 {
11388 stub_entry->group->stub_sec->reloc_count
11389 += 1 + (PPC_HA (off) != 0);
11390 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11391 }
11392
11393 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11394 {
11395 size = 12;
11396 if (PPC_HA (off) != 0)
11397 size = 16;
11398 }
11399 else
11400 {
11401 size = 16;
11402 if (PPC_HA (off) != 0)
11403 size += 4;
11404
11405 if (PPC_HA (r2off) != 0)
11406 size += 4;
11407 if (PPC_LO (r2off) != 0)
11408 size += 4;
11409 }
11410 }
11411 else if (info->emitrelocations)
11412 {
11413 stub_entry->group->stub_sec->reloc_count += 1;
11414 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11415 }
11416 }
11417
11418 stub_entry->group->stub_sec->size += size;
11419 return TRUE;
11420 }
11421
11422 /* Set up various things so that we can make a list of input sections
11423 for each output section included in the link. Returns -1 on error,
11424 0 when no stubs will be needed, and 1 on success. */
11425
11426 int
11427 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11428 {
11429 unsigned int id;
11430 bfd_size_type amt;
11431 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11432
11433 if (htab == NULL)
11434 return -1;
11435
11436 htab->sec_info_arr_size = bfd_get_next_section_id ();
11437 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11438 htab->sec_info = bfd_zmalloc (amt);
11439 if (htab->sec_info == NULL)
11440 return -1;
11441
11442 /* Set toc_off for com, und, abs and ind sections. */
11443 for (id = 0; id < 3; id++)
11444 htab->sec_info[id].toc_off = TOC_BASE_OFF;
11445
11446 return 1;
11447 }
11448
11449 /* Set up for first pass at multitoc partitioning. */
11450
11451 void
11452 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11453 {
11454 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11455
11456 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11457 htab->toc_bfd = NULL;
11458 htab->toc_first_sec = NULL;
11459 }
11460
11461 /* The linker repeatedly calls this function for each TOC input section
11462 and linker generated GOT section. Group input bfds such that the toc
11463 within a group is less than 64k in size. */
11464
11465 bfd_boolean
11466 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11467 {
11468 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11469 bfd_vma addr, off, limit;
11470
11471 if (htab == NULL)
11472 return FALSE;
11473
11474 if (!htab->second_toc_pass)
11475 {
11476 /* Keep track of the first .toc or .got section for this input bfd. */
11477 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11478
11479 if (new_bfd)
11480 {
11481 htab->toc_bfd = isec->owner;
11482 htab->toc_first_sec = isec;
11483 }
11484
11485 addr = isec->output_offset + isec->output_section->vma;
11486 off = addr - htab->toc_curr;
11487 limit = 0x80008000;
11488 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11489 limit = 0x10000;
11490 if (off + isec->size > limit)
11491 {
11492 addr = (htab->toc_first_sec->output_offset
11493 + htab->toc_first_sec->output_section->vma);
11494 htab->toc_curr = addr;
11495 htab->toc_curr &= -TOC_BASE_ALIGN;
11496 }
11497
11498 /* toc_curr is the base address of this toc group. Set elf_gp
11499 for the input section to be the offset relative to the
11500 output toc base plus 0x8000. Making the input elf_gp an
11501 offset allows us to move the toc as a whole without
11502 recalculating input elf_gp. */
11503 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11504 off += TOC_BASE_OFF;
11505
11506 /* Die if someone uses a linker script that doesn't keep input
11507 file .toc and .got together. */
11508 if (new_bfd
11509 && elf_gp (isec->owner) != 0
11510 && elf_gp (isec->owner) != off)
11511 return FALSE;
11512
11513 elf_gp (isec->owner) = off;
11514 return TRUE;
11515 }
11516
11517 /* During the second pass toc_first_sec points to the start of
11518 a toc group, and toc_curr is used to track the old elf_gp.
11519 We use toc_bfd to ensure we only look at each bfd once. */
11520 if (htab->toc_bfd == isec->owner)
11521 return TRUE;
11522 htab->toc_bfd = isec->owner;
11523
11524 if (htab->toc_first_sec == NULL
11525 || htab->toc_curr != elf_gp (isec->owner))
11526 {
11527 htab->toc_curr = elf_gp (isec->owner);
11528 htab->toc_first_sec = isec;
11529 }
11530 addr = (htab->toc_first_sec->output_offset
11531 + htab->toc_first_sec->output_section->vma);
11532 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11533 elf_gp (isec->owner) = off;
11534
11535 return TRUE;
11536 }
11537
11538 /* Called via elf_link_hash_traverse to merge GOT entries for global
11539 symbol H. */
11540
11541 static bfd_boolean
11542 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11543 {
11544 if (h->root.type == bfd_link_hash_indirect)
11545 return TRUE;
11546
11547 merge_got_entries (&h->got.glist);
11548
11549 return TRUE;
11550 }
11551
11552 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11553 symbol H. */
11554
11555 static bfd_boolean
11556 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11557 {
11558 struct got_entry *gent;
11559
11560 if (h->root.type == bfd_link_hash_indirect)
11561 return TRUE;
11562
11563 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11564 if (!gent->is_indirect)
11565 allocate_got (h, (struct bfd_link_info *) inf, gent);
11566 return TRUE;
11567 }
11568
11569 /* Called on the first multitoc pass after the last call to
11570 ppc64_elf_next_toc_section. This function removes duplicate GOT
11571 entries. */
11572
11573 bfd_boolean
11574 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11575 {
11576 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11577 struct bfd *ibfd, *ibfd2;
11578 bfd_boolean done_something;
11579
11580 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11581
11582 if (!htab->do_multi_toc)
11583 return FALSE;
11584
11585 /* Merge global sym got entries within a toc group. */
11586 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11587
11588 /* And tlsld_got. */
11589 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11590 {
11591 struct got_entry *ent, *ent2;
11592
11593 if (!is_ppc64_elf (ibfd))
11594 continue;
11595
11596 ent = ppc64_tlsld_got (ibfd);
11597 if (!ent->is_indirect
11598 && ent->got.offset != (bfd_vma) -1)
11599 {
11600 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
11601 {
11602 if (!is_ppc64_elf (ibfd2))
11603 continue;
11604
11605 ent2 = ppc64_tlsld_got (ibfd2);
11606 if (!ent2->is_indirect
11607 && ent2->got.offset != (bfd_vma) -1
11608 && elf_gp (ibfd2) == elf_gp (ibfd))
11609 {
11610 ent2->is_indirect = TRUE;
11611 ent2->got.ent = ent;
11612 }
11613 }
11614 }
11615 }
11616
11617 /* Zap sizes of got sections. */
11618 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11619 htab->elf.irelplt->size -= htab->got_reli_size;
11620 htab->got_reli_size = 0;
11621
11622 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11623 {
11624 asection *got, *relgot;
11625
11626 if (!is_ppc64_elf (ibfd))
11627 continue;
11628
11629 got = ppc64_elf_tdata (ibfd)->got;
11630 if (got != NULL)
11631 {
11632 got->rawsize = got->size;
11633 got->size = 0;
11634 relgot = ppc64_elf_tdata (ibfd)->relgot;
11635 relgot->rawsize = relgot->size;
11636 relgot->size = 0;
11637 }
11638 }
11639
11640 /* Now reallocate the got, local syms first. We don't need to
11641 allocate section contents again since we never increase size. */
11642 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11643 {
11644 struct got_entry **lgot_ents;
11645 struct got_entry **end_lgot_ents;
11646 struct plt_entry **local_plt;
11647 struct plt_entry **end_local_plt;
11648 unsigned char *lgot_masks;
11649 bfd_size_type locsymcount;
11650 Elf_Internal_Shdr *symtab_hdr;
11651 asection *s;
11652
11653 if (!is_ppc64_elf (ibfd))
11654 continue;
11655
11656 lgot_ents = elf_local_got_ents (ibfd);
11657 if (!lgot_ents)
11658 continue;
11659
11660 symtab_hdr = &elf_symtab_hdr (ibfd);
11661 locsymcount = symtab_hdr->sh_info;
11662 end_lgot_ents = lgot_ents + locsymcount;
11663 local_plt = (struct plt_entry **) end_lgot_ents;
11664 end_local_plt = local_plt + locsymcount;
11665 lgot_masks = (unsigned char *) end_local_plt;
11666 s = ppc64_elf_tdata (ibfd)->got;
11667 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11668 {
11669 struct got_entry *ent;
11670
11671 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11672 {
11673 unsigned int ent_size = 8;
11674 unsigned int rel_size = sizeof (Elf64_External_Rela);
11675
11676 ent->got.offset = s->size;
11677 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11678 {
11679 ent_size *= 2;
11680 rel_size *= 2;
11681 }
11682 s->size += ent_size;
11683 if ((*lgot_masks & PLT_IFUNC) != 0)
11684 {
11685 htab->elf.irelplt->size += rel_size;
11686 htab->got_reli_size += rel_size;
11687 }
11688 else if (bfd_link_pic (info))
11689 {
11690 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11691 srel->size += rel_size;
11692 }
11693 }
11694 }
11695 }
11696
11697 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11698
11699 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11700 {
11701 struct got_entry *ent;
11702
11703 if (!is_ppc64_elf (ibfd))
11704 continue;
11705
11706 ent = ppc64_tlsld_got (ibfd);
11707 if (!ent->is_indirect
11708 && ent->got.offset != (bfd_vma) -1)
11709 {
11710 asection *s = ppc64_elf_tdata (ibfd)->got;
11711 ent->got.offset = s->size;
11712 s->size += 16;
11713 if (bfd_link_pic (info))
11714 {
11715 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11716 srel->size += sizeof (Elf64_External_Rela);
11717 }
11718 }
11719 }
11720
11721 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11722 if (!done_something)
11723 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11724 {
11725 asection *got;
11726
11727 if (!is_ppc64_elf (ibfd))
11728 continue;
11729
11730 got = ppc64_elf_tdata (ibfd)->got;
11731 if (got != NULL)
11732 {
11733 done_something = got->rawsize != got->size;
11734 if (done_something)
11735 break;
11736 }
11737 }
11738
11739 if (done_something)
11740 (*htab->params->layout_sections_again) ();
11741
11742 /* Set up for second pass over toc sections to recalculate elf_gp
11743 on input sections. */
11744 htab->toc_bfd = NULL;
11745 htab->toc_first_sec = NULL;
11746 htab->second_toc_pass = TRUE;
11747 return done_something;
11748 }
11749
11750 /* Called after second pass of multitoc partitioning. */
11751
11752 void
11753 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11754 {
11755 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11756
11757 /* After the second pass, toc_curr tracks the TOC offset used
11758 for code sections below in ppc64_elf_next_input_section. */
11759 htab->toc_curr = TOC_BASE_OFF;
11760 }
11761
11762 /* No toc references were found in ISEC. If the code in ISEC makes no
11763 calls, then there's no need to use toc adjusting stubs when branching
11764 into ISEC. Actually, indirect calls from ISEC are OK as they will
11765 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11766 needed, and 2 if a cyclical call-graph was found but no other reason
11767 for a stub was detected. If called from the top level, a return of
11768 2 means the same as a return of 0. */
11769
11770 static int
11771 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11772 {
11773 int ret;
11774
11775 /* Mark this section as checked. */
11776 isec->call_check_done = 1;
11777
11778 /* We know none of our code bearing sections will need toc stubs. */
11779 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11780 return 0;
11781
11782 if (isec->size == 0)
11783 return 0;
11784
11785 if (isec->output_section == NULL)
11786 return 0;
11787
11788 ret = 0;
11789 if (isec->reloc_count != 0)
11790 {
11791 Elf_Internal_Rela *relstart, *rel;
11792 Elf_Internal_Sym *local_syms;
11793 struct ppc_link_hash_table *htab;
11794
11795 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11796 info->keep_memory);
11797 if (relstart == NULL)
11798 return -1;
11799
11800 /* Look for branches to outside of this section. */
11801 local_syms = NULL;
11802 htab = ppc_hash_table (info);
11803 if (htab == NULL)
11804 return -1;
11805
11806 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11807 {
11808 enum elf_ppc64_reloc_type r_type;
11809 unsigned long r_symndx;
11810 struct elf_link_hash_entry *h;
11811 struct ppc_link_hash_entry *eh;
11812 Elf_Internal_Sym *sym;
11813 asection *sym_sec;
11814 struct _opd_sec_data *opd;
11815 bfd_vma sym_value;
11816 bfd_vma dest;
11817
11818 r_type = ELF64_R_TYPE (rel->r_info);
11819 if (r_type != R_PPC64_REL24
11820 && r_type != R_PPC64_REL14
11821 && r_type != R_PPC64_REL14_BRTAKEN
11822 && r_type != R_PPC64_REL14_BRNTAKEN)
11823 continue;
11824
11825 r_symndx = ELF64_R_SYM (rel->r_info);
11826 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11827 isec->owner))
11828 {
11829 ret = -1;
11830 break;
11831 }
11832
11833 /* Calls to dynamic lib functions go through a plt call stub
11834 that uses r2. */
11835 eh = (struct ppc_link_hash_entry *) h;
11836 if (eh != NULL
11837 && (eh->elf.plt.plist != NULL
11838 || (eh->oh != NULL
11839 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11840 {
11841 ret = 1;
11842 break;
11843 }
11844
11845 if (sym_sec == NULL)
11846 /* Ignore other undefined symbols. */
11847 continue;
11848
11849 /* Assume branches to other sections not included in the
11850 link need stubs too, to cover -R and absolute syms. */
11851 if (sym_sec->output_section == NULL)
11852 {
11853 ret = 1;
11854 break;
11855 }
11856
11857 if (h == NULL)
11858 sym_value = sym->st_value;
11859 else
11860 {
11861 if (h->root.type != bfd_link_hash_defined
11862 && h->root.type != bfd_link_hash_defweak)
11863 abort ();
11864 sym_value = h->root.u.def.value;
11865 }
11866 sym_value += rel->r_addend;
11867
11868 /* If this branch reloc uses an opd sym, find the code section. */
11869 opd = get_opd_info (sym_sec);
11870 if (opd != NULL)
11871 {
11872 if (h == NULL && opd->adjust != NULL)
11873 {
11874 long adjust;
11875
11876 adjust = opd->adjust[OPD_NDX (sym_value)];
11877 if (adjust == -1)
11878 /* Assume deleted functions won't ever be called. */
11879 continue;
11880 sym_value += adjust;
11881 }
11882
11883 dest = opd_entry_value (sym_sec, sym_value,
11884 &sym_sec, NULL, FALSE);
11885 if (dest == (bfd_vma) -1)
11886 continue;
11887 }
11888 else
11889 dest = (sym_value
11890 + sym_sec->output_offset
11891 + sym_sec->output_section->vma);
11892
11893 /* Ignore branch to self. */
11894 if (sym_sec == isec)
11895 continue;
11896
11897 /* If the called function uses the toc, we need a stub. */
11898 if (sym_sec->has_toc_reloc
11899 || sym_sec->makes_toc_func_call)
11900 {
11901 ret = 1;
11902 break;
11903 }
11904
11905 /* Assume any branch that needs a long branch stub might in fact
11906 need a plt_branch stub. A plt_branch stub uses r2. */
11907 else if (dest - (isec->output_offset
11908 + isec->output_section->vma
11909 + rel->r_offset) + (1 << 25)
11910 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11911 ? h->other
11912 : sym->st_other))
11913 {
11914 ret = 1;
11915 break;
11916 }
11917
11918 /* If calling back to a section in the process of being
11919 tested, we can't say for sure that no toc adjusting stubs
11920 are needed, so don't return zero. */
11921 else if (sym_sec->call_check_in_progress)
11922 ret = 2;
11923
11924 /* Branches to another section that itself doesn't have any TOC
11925 references are OK. Recursively call ourselves to check. */
11926 else if (!sym_sec->call_check_done)
11927 {
11928 int recur;
11929
11930 /* Mark current section as indeterminate, so that other
11931 sections that call back to current won't be marked as
11932 known. */
11933 isec->call_check_in_progress = 1;
11934 recur = toc_adjusting_stub_needed (info, sym_sec);
11935 isec->call_check_in_progress = 0;
11936
11937 if (recur != 0)
11938 {
11939 ret = recur;
11940 if (recur != 2)
11941 break;
11942 }
11943 }
11944 }
11945
11946 if (local_syms != NULL
11947 && (elf_symtab_hdr (isec->owner).contents
11948 != (unsigned char *) local_syms))
11949 free (local_syms);
11950 if (elf_section_data (isec)->relocs != relstart)
11951 free (relstart);
11952 }
11953
11954 if ((ret & 1) == 0
11955 && isec->map_head.s != NULL
11956 && (strcmp (isec->output_section->name, ".init") == 0
11957 || strcmp (isec->output_section->name, ".fini") == 0))
11958 {
11959 if (isec->map_head.s->has_toc_reloc
11960 || isec->map_head.s->makes_toc_func_call)
11961 ret = 1;
11962 else if (!isec->map_head.s->call_check_done)
11963 {
11964 int recur;
11965 isec->call_check_in_progress = 1;
11966 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11967 isec->call_check_in_progress = 0;
11968 if (recur != 0)
11969 ret = recur;
11970 }
11971 }
11972
11973 if (ret == 1)
11974 isec->makes_toc_func_call = 1;
11975
11976 return ret;
11977 }
11978
11979 /* The linker repeatedly calls this function for each input section,
11980 in the order that input sections are linked into output sections.
11981 Build lists of input sections to determine groupings between which
11982 we may insert linker stubs. */
11983
11984 bfd_boolean
11985 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11986 {
11987 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11988
11989 if (htab == NULL)
11990 return FALSE;
11991
11992 if ((isec->output_section->flags & SEC_CODE) != 0
11993 && isec->output_section->id < htab->sec_info_arr_size)
11994 {
11995 /* This happens to make the list in reverse order,
11996 which is what we want. */
11997 htab->sec_info[isec->id].u.list
11998 = htab->sec_info[isec->output_section->id].u.list;
11999 htab->sec_info[isec->output_section->id].u.list = isec;
12000 }
12001
12002 if (htab->multi_toc_needed)
12003 {
12004 /* Analyse sections that aren't already flagged as needing a
12005 valid toc pointer. Exclude .fixup for the linux kernel.
12006 .fixup contains branches, but only back to the function that
12007 hit an exception. */
12008 if (!(isec->has_toc_reloc
12009 || (isec->flags & SEC_CODE) == 0
12010 || strcmp (isec->name, ".fixup") == 0
12011 || isec->call_check_done))
12012 {
12013 if (toc_adjusting_stub_needed (info, isec) < 0)
12014 return FALSE;
12015 }
12016 /* Make all sections use the TOC assigned for this object file.
12017 This will be wrong for pasted sections; We fix that in
12018 check_pasted_section(). */
12019 if (elf_gp (isec->owner) != 0)
12020 htab->toc_curr = elf_gp (isec->owner);
12021 }
12022
12023 htab->sec_info[isec->id].toc_off = htab->toc_curr;
12024 return TRUE;
12025 }
12026
12027 /* Check that all .init and .fini sections use the same toc, if they
12028 have toc relocs. */
12029
12030 static bfd_boolean
12031 check_pasted_section (struct bfd_link_info *info, const char *name)
12032 {
12033 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12034
12035 if (o != NULL)
12036 {
12037 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12038 bfd_vma toc_off = 0;
12039 asection *i;
12040
12041 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12042 if (i->has_toc_reloc)
12043 {
12044 if (toc_off == 0)
12045 toc_off = htab->sec_info[i->id].toc_off;
12046 else if (toc_off != htab->sec_info[i->id].toc_off)
12047 return FALSE;
12048 }
12049
12050 if (toc_off == 0)
12051 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12052 if (i->makes_toc_func_call)
12053 {
12054 toc_off = htab->sec_info[i->id].toc_off;
12055 break;
12056 }
12057
12058 /* Make sure the whole pasted function uses the same toc offset. */
12059 if (toc_off != 0)
12060 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12061 htab->sec_info[i->id].toc_off = toc_off;
12062 }
12063 return TRUE;
12064 }
12065
12066 bfd_boolean
12067 ppc64_elf_check_init_fini (struct bfd_link_info *info)
12068 {
12069 return (check_pasted_section (info, ".init")
12070 & check_pasted_section (info, ".fini"));
12071 }
12072
12073 /* See whether we can group stub sections together. Grouping stub
12074 sections may result in fewer stubs. More importantly, we need to
12075 put all .init* and .fini* stubs at the beginning of the .init or
12076 .fini output sections respectively, because glibc splits the
12077 _init and _fini functions into multiple parts. Putting a stub in
12078 the middle of a function is not a good idea. */
12079
12080 static bfd_boolean
12081 group_sections (struct bfd_link_info *info,
12082 bfd_size_type stub_group_size,
12083 bfd_boolean stubs_always_before_branch)
12084 {
12085 struct ppc_link_hash_table *htab;
12086 asection *osec;
12087 bfd_boolean suppress_size_errors;
12088
12089 htab = ppc_hash_table (info);
12090 if (htab == NULL)
12091 return FALSE;
12092
12093 suppress_size_errors = FALSE;
12094 if (stub_group_size == 1)
12095 {
12096 /* Default values. */
12097 if (stubs_always_before_branch)
12098 stub_group_size = 0x1e00000;
12099 else
12100 stub_group_size = 0x1c00000;
12101 suppress_size_errors = TRUE;
12102 }
12103
12104 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
12105 {
12106 asection *tail;
12107
12108 if (osec->id >= htab->sec_info_arr_size)
12109 continue;
12110
12111 tail = htab->sec_info[osec->id].u.list;
12112 while (tail != NULL)
12113 {
12114 asection *curr;
12115 asection *prev;
12116 bfd_size_type total;
12117 bfd_boolean big_sec;
12118 bfd_vma curr_toc;
12119 struct map_stub *group;
12120 bfd_size_type group_size;
12121
12122 curr = tail;
12123 total = tail->size;
12124 group_size = (ppc64_elf_section_data (tail) != NULL
12125 && ppc64_elf_section_data (tail)->has_14bit_branch
12126 ? stub_group_size >> 10 : stub_group_size);
12127
12128 big_sec = total > group_size;
12129 if (big_sec && !suppress_size_errors)
12130 /* xgettext:c-format */
12131 _bfd_error_handler (_("%B section %A exceeds stub group size"),
12132 tail->owner, tail);
12133 curr_toc = htab->sec_info[tail->id].toc_off;
12134
12135 while ((prev = htab->sec_info[curr->id].u.list) != NULL
12136 && ((total += curr->output_offset - prev->output_offset)
12137 < (ppc64_elf_section_data (prev) != NULL
12138 && ppc64_elf_section_data (prev)->has_14bit_branch
12139 ? (group_size = stub_group_size >> 10) : group_size))
12140 && htab->sec_info[prev->id].toc_off == curr_toc)
12141 curr = prev;
12142
12143 /* OK, the size from the start of CURR to the end is less
12144 than group_size and thus can be handled by one stub
12145 section. (or the tail section is itself larger than
12146 group_size, in which case we may be toast.) We should
12147 really be keeping track of the total size of stubs added
12148 here, as stubs contribute to the final output section
12149 size. That's a little tricky, and this way will only
12150 break if stubs added make the total size more than 2^25,
12151 ie. for the default stub_group_size, if stubs total more
12152 than 2097152 bytes, or nearly 75000 plt call stubs. */
12153 group = bfd_alloc (curr->owner, sizeof (*group));
12154 if (group == NULL)
12155 return FALSE;
12156 group->link_sec = curr;
12157 group->stub_sec = NULL;
12158 group->needs_save_res = 0;
12159 group->next = htab->group;
12160 htab->group = group;
12161 do
12162 {
12163 prev = htab->sec_info[tail->id].u.list;
12164 /* Set up this stub group. */
12165 htab->sec_info[tail->id].u.group = group;
12166 }
12167 while (tail != curr && (tail = prev) != NULL);
12168
12169 /* But wait, there's more! Input sections up to group_size
12170 bytes before the stub section can be handled by it too.
12171 Don't do this if we have a really large section after the
12172 stubs, as adding more stubs increases the chance that
12173 branches may not reach into the stub section. */
12174 if (!stubs_always_before_branch && !big_sec)
12175 {
12176 total = 0;
12177 while (prev != NULL
12178 && ((total += tail->output_offset - prev->output_offset)
12179 < (ppc64_elf_section_data (prev) != NULL
12180 && ppc64_elf_section_data (prev)->has_14bit_branch
12181 ? (group_size = stub_group_size >> 10) : group_size))
12182 && htab->sec_info[prev->id].toc_off == curr_toc)
12183 {
12184 tail = prev;
12185 prev = htab->sec_info[tail->id].u.list;
12186 htab->sec_info[tail->id].u.group = group;
12187 }
12188 }
12189 tail = prev;
12190 }
12191 }
12192 return TRUE;
12193 }
12194
12195 static const unsigned char glink_eh_frame_cie[] =
12196 {
12197 0, 0, 0, 16, /* length. */
12198 0, 0, 0, 0, /* id. */
12199 1, /* CIE version. */
12200 'z', 'R', 0, /* Augmentation string. */
12201 4, /* Code alignment. */
12202 0x78, /* Data alignment. */
12203 65, /* RA reg. */
12204 1, /* Augmentation size. */
12205 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
12206 DW_CFA_def_cfa, 1, 0, /* def_cfa: r1 offset 0. */
12207 0, 0, 0, 0
12208 };
12209
12210 /* Stripping output sections is normally done before dynamic section
12211 symbols have been allocated. This function is called later, and
12212 handles cases like htab->brlt which is mapped to its own output
12213 section. */
12214
12215 static void
12216 maybe_strip_output (struct bfd_link_info *info, asection *isec)
12217 {
12218 if (isec->size == 0
12219 && isec->output_section->size == 0
12220 && !(isec->output_section->flags & SEC_KEEP)
12221 && !bfd_section_removed_from_list (info->output_bfd,
12222 isec->output_section)
12223 && elf_section_data (isec->output_section)->dynindx == 0)
12224 {
12225 isec->output_section->flags |= SEC_EXCLUDE;
12226 bfd_section_list_remove (info->output_bfd, isec->output_section);
12227 info->output_bfd->section_count--;
12228 }
12229 }
12230
12231 /* Determine and set the size of the stub section for a final link.
12232
12233 The basic idea here is to examine all the relocations looking for
12234 PC-relative calls to a target that is unreachable with a "bl"
12235 instruction. */
12236
12237 bfd_boolean
12238 ppc64_elf_size_stubs (struct bfd_link_info *info)
12239 {
12240 bfd_size_type stub_group_size;
12241 bfd_boolean stubs_always_before_branch;
12242 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12243
12244 if (htab == NULL)
12245 return FALSE;
12246
12247 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
12248 htab->params->plt_thread_safe = 1;
12249 if (!htab->opd_abi)
12250 htab->params->plt_thread_safe = 0;
12251 else if (htab->params->plt_thread_safe == -1)
12252 {
12253 static const char *const thread_starter[] =
12254 {
12255 "pthread_create",
12256 /* libstdc++ */
12257 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12258 /* librt */
12259 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12260 "mq_notify", "create_timer",
12261 /* libanl */
12262 "getaddrinfo_a",
12263 /* libgomp */
12264 "GOMP_parallel",
12265 "GOMP_parallel_start",
12266 "GOMP_parallel_loop_static",
12267 "GOMP_parallel_loop_static_start",
12268 "GOMP_parallel_loop_dynamic",
12269 "GOMP_parallel_loop_dynamic_start",
12270 "GOMP_parallel_loop_guided",
12271 "GOMP_parallel_loop_guided_start",
12272 "GOMP_parallel_loop_runtime",
12273 "GOMP_parallel_loop_runtime_start",
12274 "GOMP_parallel_sections",
12275 "GOMP_parallel_sections_start",
12276 /* libgo */
12277 "__go_go",
12278 };
12279 unsigned i;
12280
12281 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
12282 {
12283 struct elf_link_hash_entry *h;
12284 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12285 FALSE, FALSE, TRUE);
12286 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12287 if (htab->params->plt_thread_safe)
12288 break;
12289 }
12290 }
12291 stubs_always_before_branch = htab->params->group_size < 0;
12292 if (htab->params->group_size < 0)
12293 stub_group_size = -htab->params->group_size;
12294 else
12295 stub_group_size = htab->params->group_size;
12296
12297 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12298 return FALSE;
12299
12300 #define STUB_SHRINK_ITER 20
12301 /* Loop until no stubs added. After iteration 20 of this loop we may
12302 exit on a stub section shrinking. This is to break out of a
12303 pathological case where adding stubs on one iteration decreases
12304 section gaps (perhaps due to alignment), which then requires
12305 fewer or smaller stubs on the next iteration. */
12306
12307 while (1)
12308 {
12309 bfd *input_bfd;
12310 unsigned int bfd_indx;
12311 struct map_stub *group;
12312 asection *stub_sec;
12313
12314 htab->stub_iteration += 1;
12315
12316 for (input_bfd = info->input_bfds, bfd_indx = 0;
12317 input_bfd != NULL;
12318 input_bfd = input_bfd->link.next, bfd_indx++)
12319 {
12320 Elf_Internal_Shdr *symtab_hdr;
12321 asection *section;
12322 Elf_Internal_Sym *local_syms = NULL;
12323
12324 if (!is_ppc64_elf (input_bfd))
12325 continue;
12326
12327 /* We'll need the symbol table in a second. */
12328 symtab_hdr = &elf_symtab_hdr (input_bfd);
12329 if (symtab_hdr->sh_info == 0)
12330 continue;
12331
12332 /* Walk over each section attached to the input bfd. */
12333 for (section = input_bfd->sections;
12334 section != NULL;
12335 section = section->next)
12336 {
12337 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
12338
12339 /* If there aren't any relocs, then there's nothing more
12340 to do. */
12341 if ((section->flags & SEC_RELOC) == 0
12342 || (section->flags & SEC_ALLOC) == 0
12343 || (section->flags & SEC_LOAD) == 0
12344 || (section->flags & SEC_CODE) == 0
12345 || section->reloc_count == 0)
12346 continue;
12347
12348 /* If this section is a link-once section that will be
12349 discarded, then don't create any stubs. */
12350 if (section->output_section == NULL
12351 || section->output_section->owner != info->output_bfd)
12352 continue;
12353
12354 /* Get the relocs. */
12355 internal_relocs
12356 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
12357 info->keep_memory);
12358 if (internal_relocs == NULL)
12359 goto error_ret_free_local;
12360
12361 /* Now examine each relocation. */
12362 irela = internal_relocs;
12363 irelaend = irela + section->reloc_count;
12364 for (; irela < irelaend; irela++)
12365 {
12366 enum elf_ppc64_reloc_type r_type;
12367 unsigned int r_indx;
12368 enum ppc_stub_type stub_type;
12369 struct ppc_stub_hash_entry *stub_entry;
12370 asection *sym_sec, *code_sec;
12371 bfd_vma sym_value, code_value;
12372 bfd_vma destination;
12373 unsigned long local_off;
12374 bfd_boolean ok_dest;
12375 struct ppc_link_hash_entry *hash;
12376 struct ppc_link_hash_entry *fdh;
12377 struct elf_link_hash_entry *h;
12378 Elf_Internal_Sym *sym;
12379 char *stub_name;
12380 const asection *id_sec;
12381 struct _opd_sec_data *opd;
12382 struct plt_entry *plt_ent;
12383
12384 r_type = ELF64_R_TYPE (irela->r_info);
12385 r_indx = ELF64_R_SYM (irela->r_info);
12386
12387 if (r_type >= R_PPC64_max)
12388 {
12389 bfd_set_error (bfd_error_bad_value);
12390 goto error_ret_free_internal;
12391 }
12392
12393 /* Only look for stubs on branch instructions. */
12394 if (r_type != R_PPC64_REL24
12395 && r_type != R_PPC64_REL14
12396 && r_type != R_PPC64_REL14_BRTAKEN
12397 && r_type != R_PPC64_REL14_BRNTAKEN)
12398 continue;
12399
12400 /* Now determine the call target, its name, value,
12401 section. */
12402 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12403 r_indx, input_bfd))
12404 goto error_ret_free_internal;
12405 hash = (struct ppc_link_hash_entry *) h;
12406
12407 ok_dest = FALSE;
12408 fdh = NULL;
12409 sym_value = 0;
12410 if (hash == NULL)
12411 {
12412 sym_value = sym->st_value;
12413 if (sym_sec != NULL
12414 && sym_sec->output_section != NULL)
12415 ok_dest = TRUE;
12416 }
12417 else if (hash->elf.root.type == bfd_link_hash_defined
12418 || hash->elf.root.type == bfd_link_hash_defweak)
12419 {
12420 sym_value = hash->elf.root.u.def.value;
12421 if (sym_sec->output_section != NULL)
12422 ok_dest = TRUE;
12423 }
12424 else if (hash->elf.root.type == bfd_link_hash_undefweak
12425 || hash->elf.root.type == bfd_link_hash_undefined)
12426 {
12427 /* Recognise an old ABI func code entry sym, and
12428 use the func descriptor sym instead if it is
12429 defined. */
12430 if (hash->elf.root.root.string[0] == '.'
12431 && hash->oh != NULL)
12432 {
12433 fdh = ppc_follow_link (hash->oh);
12434 if (fdh->elf.root.type == bfd_link_hash_defined
12435 || fdh->elf.root.type == bfd_link_hash_defweak)
12436 {
12437 sym_sec = fdh->elf.root.u.def.section;
12438 sym_value = fdh->elf.root.u.def.value;
12439 if (sym_sec->output_section != NULL)
12440 ok_dest = TRUE;
12441 }
12442 else
12443 fdh = NULL;
12444 }
12445 }
12446 else
12447 {
12448 bfd_set_error (bfd_error_bad_value);
12449 goto error_ret_free_internal;
12450 }
12451
12452 destination = 0;
12453 local_off = 0;
12454 if (ok_dest)
12455 {
12456 sym_value += irela->r_addend;
12457 destination = (sym_value
12458 + sym_sec->output_offset
12459 + sym_sec->output_section->vma);
12460 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12461 ? hash->elf.other
12462 : sym->st_other);
12463 }
12464
12465 code_sec = sym_sec;
12466 code_value = sym_value;
12467 opd = get_opd_info (sym_sec);
12468 if (opd != NULL)
12469 {
12470 bfd_vma dest;
12471
12472 if (hash == NULL && opd->adjust != NULL)
12473 {
12474 long adjust = opd->adjust[OPD_NDX (sym_value)];
12475 if (adjust == -1)
12476 continue;
12477 code_value += adjust;
12478 sym_value += adjust;
12479 }
12480 dest = opd_entry_value (sym_sec, sym_value,
12481 &code_sec, &code_value, FALSE);
12482 if (dest != (bfd_vma) -1)
12483 {
12484 destination = dest;
12485 if (fdh != NULL)
12486 {
12487 /* Fixup old ABI sym to point at code
12488 entry. */
12489 hash->elf.root.type = bfd_link_hash_defweak;
12490 hash->elf.root.u.def.section = code_sec;
12491 hash->elf.root.u.def.value = code_value;
12492 }
12493 }
12494 }
12495
12496 /* Determine what (if any) linker stub is needed. */
12497 plt_ent = NULL;
12498 stub_type = ppc_type_of_stub (section, irela, &hash,
12499 &plt_ent, destination,
12500 local_off);
12501
12502 if (stub_type != ppc_stub_plt_call)
12503 {
12504 /* Check whether we need a TOC adjusting stub.
12505 Since the linker pastes together pieces from
12506 different object files when creating the
12507 _init and _fini functions, it may be that a
12508 call to what looks like a local sym is in
12509 fact a call needing a TOC adjustment. */
12510 if (code_sec != NULL
12511 && code_sec->output_section != NULL
12512 && (htab->sec_info[code_sec->id].toc_off
12513 != htab->sec_info[section->id].toc_off)
12514 && (code_sec->has_toc_reloc
12515 || code_sec->makes_toc_func_call))
12516 stub_type = ppc_stub_long_branch_r2off;
12517 }
12518
12519 if (stub_type == ppc_stub_none)
12520 continue;
12521
12522 /* __tls_get_addr calls might be eliminated. */
12523 if (stub_type != ppc_stub_plt_call
12524 && hash != NULL
12525 && (hash == htab->tls_get_addr
12526 || hash == htab->tls_get_addr_fd)
12527 && section->has_tls_reloc
12528 && irela != internal_relocs)
12529 {
12530 /* Get tls info. */
12531 unsigned char *tls_mask;
12532
12533 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12534 irela - 1, input_bfd))
12535 goto error_ret_free_internal;
12536 if (*tls_mask != 0)
12537 continue;
12538 }
12539
12540 if (stub_type == ppc_stub_plt_call
12541 && irela + 1 < irelaend
12542 && irela[1].r_offset == irela->r_offset + 4
12543 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12544 {
12545 if (!tocsave_find (htab, INSERT,
12546 &local_syms, irela + 1, input_bfd))
12547 goto error_ret_free_internal;
12548 }
12549 else if (stub_type == ppc_stub_plt_call)
12550 stub_type = ppc_stub_plt_call_r2save;
12551
12552 /* Support for grouping stub sections. */
12553 id_sec = htab->sec_info[section->id].u.group->link_sec;
12554
12555 /* Get the name of this stub. */
12556 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12557 if (!stub_name)
12558 goto error_ret_free_internal;
12559
12560 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12561 stub_name, FALSE, FALSE);
12562 if (stub_entry != NULL)
12563 {
12564 /* The proper stub has already been created. */
12565 free (stub_name);
12566 if (stub_type == ppc_stub_plt_call_r2save)
12567 stub_entry->stub_type = stub_type;
12568 continue;
12569 }
12570
12571 stub_entry = ppc_add_stub (stub_name, section, info);
12572 if (stub_entry == NULL)
12573 {
12574 free (stub_name);
12575 error_ret_free_internal:
12576 if (elf_section_data (section)->relocs == NULL)
12577 free (internal_relocs);
12578 error_ret_free_local:
12579 if (local_syms != NULL
12580 && (symtab_hdr->contents
12581 != (unsigned char *) local_syms))
12582 free (local_syms);
12583 return FALSE;
12584 }
12585
12586 stub_entry->stub_type = stub_type;
12587 if (stub_type != ppc_stub_plt_call
12588 && stub_type != ppc_stub_plt_call_r2save)
12589 {
12590 stub_entry->target_value = code_value;
12591 stub_entry->target_section = code_sec;
12592 }
12593 else
12594 {
12595 stub_entry->target_value = sym_value;
12596 stub_entry->target_section = sym_sec;
12597 }
12598 stub_entry->h = hash;
12599 stub_entry->plt_ent = plt_ent;
12600 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12601
12602 if (stub_entry->h != NULL)
12603 htab->stub_globals += 1;
12604 }
12605
12606 /* We're done with the internal relocs, free them. */
12607 if (elf_section_data (section)->relocs != internal_relocs)
12608 free (internal_relocs);
12609 }
12610
12611 if (local_syms != NULL
12612 && symtab_hdr->contents != (unsigned char *) local_syms)
12613 {
12614 if (!info->keep_memory)
12615 free (local_syms);
12616 else
12617 symtab_hdr->contents = (unsigned char *) local_syms;
12618 }
12619 }
12620
12621 /* We may have added some stubs. Find out the new size of the
12622 stub sections. */
12623 for (stub_sec = htab->params->stub_bfd->sections;
12624 stub_sec != NULL;
12625 stub_sec = stub_sec->next)
12626 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12627 {
12628 if (htab->stub_iteration <= STUB_SHRINK_ITER
12629 || stub_sec->rawsize < stub_sec->size)
12630 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12631 stub_sec->rawsize = stub_sec->size;
12632 stub_sec->size = 0;
12633 stub_sec->reloc_count = 0;
12634 stub_sec->flags &= ~SEC_RELOC;
12635 }
12636
12637 htab->brlt->size = 0;
12638 htab->brlt->reloc_count = 0;
12639 htab->brlt->flags &= ~SEC_RELOC;
12640 if (htab->relbrlt != NULL)
12641 htab->relbrlt->size = 0;
12642
12643 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12644
12645 for (group = htab->group; group != NULL; group = group->next)
12646 if (group->needs_save_res)
12647 group->stub_sec->size += htab->sfpr->size;
12648
12649 if (info->emitrelocations
12650 && htab->glink != NULL && htab->glink->size != 0)
12651 {
12652 htab->glink->reloc_count = 1;
12653 htab->glink->flags |= SEC_RELOC;
12654 }
12655
12656 if (htab->glink_eh_frame != NULL
12657 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12658 && htab->glink_eh_frame->output_section->size != 0)
12659 {
12660 size_t size = 0, align;
12661
12662 for (stub_sec = htab->params->stub_bfd->sections;
12663 stub_sec != NULL;
12664 stub_sec = stub_sec->next)
12665 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12666 size += 24;
12667 if (htab->glink != NULL && htab->glink->size != 0)
12668 size += 24;
12669 if (size != 0)
12670 size += sizeof (glink_eh_frame_cie);
12671 align = 1;
12672 align <<= htab->glink_eh_frame->output_section->alignment_power;
12673 align -= 1;
12674 size = (size + align) & ~align;
12675 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12676 htab->glink_eh_frame->size = size;
12677 }
12678
12679 if (htab->params->plt_stub_align != 0)
12680 for (stub_sec = htab->params->stub_bfd->sections;
12681 stub_sec != NULL;
12682 stub_sec = stub_sec->next)
12683 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12684 stub_sec->size = ((stub_sec->size
12685 + (1 << htab->params->plt_stub_align) - 1)
12686 & -(1 << htab->params->plt_stub_align));
12687
12688 for (stub_sec = htab->params->stub_bfd->sections;
12689 stub_sec != NULL;
12690 stub_sec = stub_sec->next)
12691 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12692 && stub_sec->rawsize != stub_sec->size
12693 && (htab->stub_iteration <= STUB_SHRINK_ITER
12694 || stub_sec->rawsize < stub_sec->size))
12695 break;
12696
12697 if (stub_sec == NULL
12698 && (htab->glink_eh_frame == NULL
12699 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12700 break;
12701
12702 /* Ask the linker to do its stuff. */
12703 (*htab->params->layout_sections_again) ();
12704 }
12705
12706 if (htab->glink_eh_frame != NULL
12707 && htab->glink_eh_frame->size != 0)
12708 {
12709 bfd_vma val;
12710 bfd_byte *p, *last_fde;
12711 size_t last_fde_len, size, align, pad;
12712 asection *stub_sec;
12713
12714 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12715 if (p == NULL)
12716 return FALSE;
12717 htab->glink_eh_frame->contents = p;
12718 last_fde = p;
12719
12720 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12721 /* CIE length (rewrite in case little-endian). */
12722 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12723 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12724 p += sizeof (glink_eh_frame_cie);
12725
12726 for (stub_sec = htab->params->stub_bfd->sections;
12727 stub_sec != NULL;
12728 stub_sec = stub_sec->next)
12729 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12730 {
12731 last_fde = p;
12732 last_fde_len = 20;
12733 /* FDE length. */
12734 bfd_put_32 (htab->elf.dynobj, 20, p);
12735 p += 4;
12736 /* CIE pointer. */
12737 val = p - htab->glink_eh_frame->contents;
12738 bfd_put_32 (htab->elf.dynobj, val, p);
12739 p += 4;
12740 /* Offset to stub section, written later. */
12741 p += 4;
12742 /* stub section size. */
12743 bfd_put_32 (htab->elf.dynobj, stub_sec->size, p);
12744 p += 4;
12745 /* Augmentation. */
12746 p += 1;
12747 /* Pad. */
12748 p += 7;
12749 }
12750 if (htab->glink != NULL && htab->glink->size != 0)
12751 {
12752 last_fde = p;
12753 last_fde_len = 20;
12754 /* FDE length. */
12755 bfd_put_32 (htab->elf.dynobj, 20, p);
12756 p += 4;
12757 /* CIE pointer. */
12758 val = p - htab->glink_eh_frame->contents;
12759 bfd_put_32 (htab->elf.dynobj, val, p);
12760 p += 4;
12761 /* Offset to .glink, written later. */
12762 p += 4;
12763 /* .glink size. */
12764 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12765 p += 4;
12766 /* Augmentation. */
12767 p += 1;
12768
12769 *p++ = DW_CFA_advance_loc + 1;
12770 *p++ = DW_CFA_register;
12771 *p++ = 65;
12772 *p++ = htab->opd_abi ? 12 : 0;
12773 *p++ = DW_CFA_advance_loc + 4;
12774 *p++ = DW_CFA_restore_extended;
12775 *p++ = 65;
12776 }
12777 /* Subsume any padding into the last FDE if user .eh_frame
12778 sections are aligned more than glink_eh_frame. Otherwise any
12779 zero padding will be seen as a terminator. */
12780 size = p - htab->glink_eh_frame->contents;
12781 align = 1;
12782 align <<= htab->glink_eh_frame->output_section->alignment_power;
12783 align -= 1;
12784 pad = ((size + align) & ~align) - size;
12785 htab->glink_eh_frame->size = size + pad;
12786 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12787 }
12788
12789 maybe_strip_output (info, htab->brlt);
12790 if (htab->glink_eh_frame != NULL)
12791 maybe_strip_output (info, htab->glink_eh_frame);
12792
12793 return TRUE;
12794 }
12795
12796 /* Called after we have determined section placement. If sections
12797 move, we'll be called again. Provide a value for TOCstart. */
12798
12799 bfd_vma
12800 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12801 {
12802 asection *s;
12803 bfd_vma TOCstart, adjust;
12804
12805 if (info != NULL)
12806 {
12807 struct elf_link_hash_entry *h;
12808 struct elf_link_hash_table *htab = elf_hash_table (info);
12809
12810 if (is_elf_hash_table (htab)
12811 && htab->hgot != NULL)
12812 h = htab->hgot;
12813 else
12814 {
12815 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
12816 if (is_elf_hash_table (htab))
12817 htab->hgot = h;
12818 }
12819 if (h != NULL
12820 && h->root.type == bfd_link_hash_defined
12821 && !h->root.linker_def
12822 && (!is_elf_hash_table (htab)
12823 || h->def_regular))
12824 {
12825 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
12826 + h->root.u.def.section->output_offset
12827 + h->root.u.def.section->output_section->vma);
12828 _bfd_set_gp_value (obfd, TOCstart);
12829 return TOCstart;
12830 }
12831 }
12832
12833 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12834 order. The TOC starts where the first of these sections starts. */
12835 s = bfd_get_section_by_name (obfd, ".got");
12836 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12837 s = bfd_get_section_by_name (obfd, ".toc");
12838 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12839 s = bfd_get_section_by_name (obfd, ".tocbss");
12840 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12841 s = bfd_get_section_by_name (obfd, ".plt");
12842 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12843 {
12844 /* This may happen for
12845 o references to TOC base (SYM@toc / TOC[tc0]) without a
12846 .toc directive
12847 o bad linker script
12848 o --gc-sections and empty TOC sections
12849
12850 FIXME: Warn user? */
12851
12852 /* Look for a likely section. We probably won't even be
12853 using TOCstart. */
12854 for (s = obfd->sections; s != NULL; s = s->next)
12855 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12856 | SEC_EXCLUDE))
12857 == (SEC_ALLOC | SEC_SMALL_DATA))
12858 break;
12859 if (s == NULL)
12860 for (s = obfd->sections; s != NULL; s = s->next)
12861 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12862 == (SEC_ALLOC | SEC_SMALL_DATA))
12863 break;
12864 if (s == NULL)
12865 for (s = obfd->sections; s != NULL; s = s->next)
12866 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12867 == SEC_ALLOC)
12868 break;
12869 if (s == NULL)
12870 for (s = obfd->sections; s != NULL; s = s->next)
12871 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12872 break;
12873 }
12874
12875 TOCstart = 0;
12876 if (s != NULL)
12877 TOCstart = s->output_section->vma + s->output_offset;
12878
12879 /* Force alignment. */
12880 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
12881 TOCstart -= adjust;
12882 _bfd_set_gp_value (obfd, TOCstart);
12883
12884 if (info != NULL && s != NULL)
12885 {
12886 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12887
12888 if (htab != NULL)
12889 {
12890 if (htab->elf.hgot != NULL)
12891 {
12892 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
12893 htab->elf.hgot->root.u.def.section = s;
12894 }
12895 }
12896 else
12897 {
12898 struct bfd_link_hash_entry *bh = NULL;
12899 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
12900 s, TOC_BASE_OFF - adjust,
12901 NULL, FALSE, FALSE, &bh);
12902 }
12903 }
12904 return TOCstart;
12905 }
12906
12907 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12908 write out any global entry stubs. */
12909
12910 static bfd_boolean
12911 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12912 {
12913 struct bfd_link_info *info;
12914 struct ppc_link_hash_table *htab;
12915 struct plt_entry *pent;
12916 asection *s;
12917
12918 if (h->root.type == bfd_link_hash_indirect)
12919 return TRUE;
12920
12921 if (!h->pointer_equality_needed)
12922 return TRUE;
12923
12924 if (h->def_regular)
12925 return TRUE;
12926
12927 info = inf;
12928 htab = ppc_hash_table (info);
12929 if (htab == NULL)
12930 return FALSE;
12931
12932 s = htab->glink;
12933 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12934 if (pent->plt.offset != (bfd_vma) -1
12935 && pent->addend == 0)
12936 {
12937 bfd_byte *p;
12938 asection *plt;
12939 bfd_vma off;
12940
12941 p = s->contents + h->root.u.def.value;
12942 plt = htab->elf.splt;
12943 if (!htab->elf.dynamic_sections_created
12944 || h->dynindx == -1)
12945 plt = htab->elf.iplt;
12946 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12947 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12948
12949 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12950 {
12951 info->callbacks->einfo
12952 (_("%P: linkage table error against `%T'\n"),
12953 h->root.root.string);
12954 bfd_set_error (bfd_error_bad_value);
12955 htab->stub_error = TRUE;
12956 }
12957
12958 htab->stub_count[ppc_stub_global_entry - 1] += 1;
12959 if (htab->params->emit_stub_syms)
12960 {
12961 size_t len = strlen (h->root.root.string);
12962 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
12963
12964 if (name == NULL)
12965 return FALSE;
12966
12967 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
12968 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
12969 if (h == NULL)
12970 return FALSE;
12971 if (h->root.type == bfd_link_hash_new)
12972 {
12973 h->root.type = bfd_link_hash_defined;
12974 h->root.u.def.section = s;
12975 h->root.u.def.value = p - s->contents;
12976 h->ref_regular = 1;
12977 h->def_regular = 1;
12978 h->ref_regular_nonweak = 1;
12979 h->forced_local = 1;
12980 h->non_elf = 0;
12981 h->root.linker_def = 1;
12982 }
12983 }
12984
12985 if (PPC_HA (off) != 0)
12986 {
12987 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
12988 p += 4;
12989 }
12990 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
12991 p += 4;
12992 bfd_put_32 (s->owner, MTCTR_R12, p);
12993 p += 4;
12994 bfd_put_32 (s->owner, BCTR, p);
12995 break;
12996 }
12997 return TRUE;
12998 }
12999
13000 /* Build all the stubs associated with the current output file.
13001 The stubs are kept in a hash table attached to the main linker
13002 hash table. This function is called via gldelf64ppc_finish. */
13003
13004 bfd_boolean
13005 ppc64_elf_build_stubs (struct bfd_link_info *info,
13006 char **stats)
13007 {
13008 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13009 struct map_stub *group;
13010 asection *stub_sec;
13011 bfd_byte *p;
13012 int stub_sec_count = 0;
13013
13014 if (htab == NULL)
13015 return FALSE;
13016
13017 /* Allocate memory to hold the linker stubs. */
13018 for (stub_sec = htab->params->stub_bfd->sections;
13019 stub_sec != NULL;
13020 stub_sec = stub_sec->next)
13021 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
13022 && stub_sec->size != 0)
13023 {
13024 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
13025 if (stub_sec->contents == NULL)
13026 return FALSE;
13027 stub_sec->size = 0;
13028 }
13029
13030 if (htab->glink != NULL && htab->glink->size != 0)
13031 {
13032 unsigned int indx;
13033 bfd_vma plt0;
13034
13035 /* Build the .glink plt call stub. */
13036 if (htab->params->emit_stub_syms)
13037 {
13038 struct elf_link_hash_entry *h;
13039 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13040 TRUE, FALSE, FALSE);
13041 if (h == NULL)
13042 return FALSE;
13043 if (h->root.type == bfd_link_hash_new)
13044 {
13045 h->root.type = bfd_link_hash_defined;
13046 h->root.u.def.section = htab->glink;
13047 h->root.u.def.value = 8;
13048 h->ref_regular = 1;
13049 h->def_regular = 1;
13050 h->ref_regular_nonweak = 1;
13051 h->forced_local = 1;
13052 h->non_elf = 0;
13053 h->root.linker_def = 1;
13054 }
13055 }
13056 plt0 = (htab->elf.splt->output_section->vma
13057 + htab->elf.splt->output_offset
13058 - 16);
13059 if (info->emitrelocations)
13060 {
13061 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13062 if (r == NULL)
13063 return FALSE;
13064 r->r_offset = (htab->glink->output_offset
13065 + htab->glink->output_section->vma);
13066 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13067 r->r_addend = plt0;
13068 }
13069 p = htab->glink->contents;
13070 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
13071 bfd_put_64 (htab->glink->owner, plt0, p);
13072 p += 8;
13073 if (htab->opd_abi)
13074 {
13075 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13076 p += 4;
13077 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13078 p += 4;
13079 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13080 p += 4;
13081 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13082 p += 4;
13083 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13084 p += 4;
13085 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13086 p += 4;
13087 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13088 p += 4;
13089 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13090 p += 4;
13091 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13092 p += 4;
13093 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13094 p += 4;
13095 }
13096 else
13097 {
13098 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13099 p += 4;
13100 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13101 p += 4;
13102 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13103 p += 4;
13104 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13105 p += 4;
13106 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13107 p += 4;
13108 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13109 p += 4;
13110 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13111 p += 4;
13112 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13113 p += 4;
13114 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13115 p += 4;
13116 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13117 p += 4;
13118 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13119 p += 4;
13120 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13121 p += 4;
13122 }
13123 bfd_put_32 (htab->glink->owner, BCTR, p);
13124 p += 4;
13125 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
13126 {
13127 bfd_put_32 (htab->glink->owner, NOP, p);
13128 p += 4;
13129 }
13130
13131 /* Build the .glink lazy link call stubs. */
13132 indx = 0;
13133 while (p < htab->glink->contents + htab->glink->rawsize)
13134 {
13135 if (htab->opd_abi)
13136 {
13137 if (indx < 0x8000)
13138 {
13139 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13140 p += 4;
13141 }
13142 else
13143 {
13144 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13145 p += 4;
13146 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13147 p);
13148 p += 4;
13149 }
13150 }
13151 bfd_put_32 (htab->glink->owner,
13152 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
13153 indx++;
13154 p += 4;
13155 }
13156
13157 /* Build .glink global entry stubs. */
13158 if (htab->glink->size > htab->glink->rawsize)
13159 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
13160 }
13161
13162 if (htab->brlt != NULL && htab->brlt->size != 0)
13163 {
13164 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
13165 htab->brlt->size);
13166 if (htab->brlt->contents == NULL)
13167 return FALSE;
13168 }
13169 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
13170 {
13171 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
13172 htab->relbrlt->size);
13173 if (htab->relbrlt->contents == NULL)
13174 return FALSE;
13175 }
13176
13177 /* Build the stubs as directed by the stub hash table. */
13178 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
13179
13180 for (group = htab->group; group != NULL; group = group->next)
13181 if (group->needs_save_res)
13182 {
13183 stub_sec = group->stub_sec;
13184 memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
13185 htab->sfpr->size);
13186 if (htab->params->emit_stub_syms)
13187 {
13188 unsigned int i;
13189
13190 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13191 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13192 return FALSE;
13193 }
13194 stub_sec->size += htab->sfpr->size;
13195 }
13196
13197 if (htab->relbrlt != NULL)
13198 htab->relbrlt->reloc_count = 0;
13199
13200 if (htab->params->plt_stub_align != 0)
13201 for (stub_sec = htab->params->stub_bfd->sections;
13202 stub_sec != NULL;
13203 stub_sec = stub_sec->next)
13204 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13205 stub_sec->size = ((stub_sec->size
13206 + (1 << htab->params->plt_stub_align) - 1)
13207 & -(1 << htab->params->plt_stub_align));
13208
13209 for (stub_sec = htab->params->stub_bfd->sections;
13210 stub_sec != NULL;
13211 stub_sec = stub_sec->next)
13212 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13213 {
13214 stub_sec_count += 1;
13215 if (stub_sec->rawsize != stub_sec->size
13216 && (htab->stub_iteration <= STUB_SHRINK_ITER
13217 || stub_sec->rawsize < stub_sec->size))
13218 break;
13219 }
13220
13221 /* Note that the glink_eh_frame check here is not only testing that
13222 the generated size matched the calculated size but also that
13223 bfd_elf_discard_info didn't make any changes to the section. */
13224 if (stub_sec != NULL
13225 || (htab->glink_eh_frame != NULL
13226 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
13227 {
13228 htab->stub_error = TRUE;
13229 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
13230 }
13231
13232 if (htab->stub_error)
13233 return FALSE;
13234
13235 if (stats != NULL)
13236 {
13237 *stats = bfd_malloc (500);
13238 if (*stats == NULL)
13239 return FALSE;
13240
13241 sprintf (*stats, _("linker stubs in %u group%s\n"
13242 " branch %lu\n"
13243 " toc adjust %lu\n"
13244 " long branch %lu\n"
13245 " long toc adj %lu\n"
13246 " plt call %lu\n"
13247 " plt call toc %lu\n"
13248 " global entry %lu"),
13249 stub_sec_count,
13250 stub_sec_count == 1 ? "" : "s",
13251 htab->stub_count[ppc_stub_long_branch - 1],
13252 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13253 htab->stub_count[ppc_stub_plt_branch - 1],
13254 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
13255 htab->stub_count[ppc_stub_plt_call - 1],
13256 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13257 htab->stub_count[ppc_stub_global_entry - 1]);
13258 }
13259 return TRUE;
13260 }
13261
13262 /* What to do when ld finds relocations against symbols defined in
13263 discarded sections. */
13264
13265 static unsigned int
13266 ppc64_elf_action_discarded (asection *sec)
13267 {
13268 if (strcmp (".opd", sec->name) == 0)
13269 return 0;
13270
13271 if (strcmp (".toc", sec->name) == 0)
13272 return 0;
13273
13274 if (strcmp (".toc1", sec->name) == 0)
13275 return 0;
13276
13277 return _bfd_elf_default_action_discarded (sec);
13278 }
13279
13280 /* The RELOCATE_SECTION function is called by the ELF backend linker
13281 to handle the relocations for a section.
13282
13283 The relocs are always passed as Rela structures; if the section
13284 actually uses Rel structures, the r_addend field will always be
13285 zero.
13286
13287 This function is responsible for adjust the section contents as
13288 necessary, and (if using Rela relocs and generating a
13289 relocatable output file) adjusting the reloc addend as
13290 necessary.
13291
13292 This function does not have to worry about setting the reloc
13293 address or the reloc symbol index.
13294
13295 LOCAL_SYMS is a pointer to the swapped in local symbols.
13296
13297 LOCAL_SECTIONS is an array giving the section in the input file
13298 corresponding to the st_shndx field of each local symbol.
13299
13300 The global hash table entry for the global symbols can be found
13301 via elf_sym_hashes (input_bfd).
13302
13303 When generating relocatable output, this function must handle
13304 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13305 going to be the section symbol corresponding to the output
13306 section, which means that the addend must be adjusted
13307 accordingly. */
13308
13309 static bfd_boolean
13310 ppc64_elf_relocate_section (bfd *output_bfd,
13311 struct bfd_link_info *info,
13312 bfd *input_bfd,
13313 asection *input_section,
13314 bfd_byte *contents,
13315 Elf_Internal_Rela *relocs,
13316 Elf_Internal_Sym *local_syms,
13317 asection **local_sections)
13318 {
13319 struct ppc_link_hash_table *htab;
13320 Elf_Internal_Shdr *symtab_hdr;
13321 struct elf_link_hash_entry **sym_hashes;
13322 Elf_Internal_Rela *rel;
13323 Elf_Internal_Rela *wrel;
13324 Elf_Internal_Rela *relend;
13325 Elf_Internal_Rela outrel;
13326 bfd_byte *loc;
13327 struct got_entry **local_got_ents;
13328 bfd_vma TOCstart;
13329 bfd_boolean ret = TRUE;
13330 bfd_boolean is_opd;
13331 /* Assume 'at' branch hints. */
13332 bfd_boolean is_isa_v2 = TRUE;
13333 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
13334
13335 /* Initialize howto table if needed. */
13336 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
13337 ppc_howto_init ();
13338
13339 htab = ppc_hash_table (info);
13340 if (htab == NULL)
13341 return FALSE;
13342
13343 /* Don't relocate stub sections. */
13344 if (input_section->owner == htab->params->stub_bfd)
13345 return TRUE;
13346
13347 BFD_ASSERT (is_ppc64_elf (input_bfd));
13348
13349 local_got_ents = elf_local_got_ents (input_bfd);
13350 TOCstart = elf_gp (output_bfd);
13351 symtab_hdr = &elf_symtab_hdr (input_bfd);
13352 sym_hashes = elf_sym_hashes (input_bfd);
13353 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
13354
13355 rel = wrel = relocs;
13356 relend = relocs + input_section->reloc_count;
13357 for (; rel < relend; wrel++, rel++)
13358 {
13359 enum elf_ppc64_reloc_type r_type;
13360 bfd_vma addend;
13361 bfd_reloc_status_type r;
13362 Elf_Internal_Sym *sym;
13363 asection *sec;
13364 struct elf_link_hash_entry *h_elf;
13365 struct ppc_link_hash_entry *h;
13366 struct ppc_link_hash_entry *fdh;
13367 const char *sym_name;
13368 unsigned long r_symndx, toc_symndx;
13369 bfd_vma toc_addend;
13370 unsigned char tls_mask, tls_gd, tls_type;
13371 unsigned char sym_type;
13372 bfd_vma relocation;
13373 bfd_boolean unresolved_reloc;
13374 bfd_boolean warned;
13375 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
13376 unsigned int insn;
13377 unsigned int mask;
13378 struct ppc_stub_hash_entry *stub_entry;
13379 bfd_vma max_br_offset;
13380 bfd_vma from;
13381 Elf_Internal_Rela orig_rel;
13382 reloc_howto_type *howto;
13383 struct reloc_howto_struct alt_howto;
13384
13385 again:
13386 orig_rel = *rel;
13387
13388 r_type = ELF64_R_TYPE (rel->r_info);
13389 r_symndx = ELF64_R_SYM (rel->r_info);
13390
13391 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13392 symbol of the previous ADDR64 reloc. The symbol gives us the
13393 proper TOC base to use. */
13394 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13395 && wrel != relocs
13396 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
13397 && is_opd)
13398 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
13399
13400 sym = NULL;
13401 sec = NULL;
13402 h_elf = NULL;
13403 sym_name = NULL;
13404 unresolved_reloc = FALSE;
13405 warned = FALSE;
13406
13407 if (r_symndx < symtab_hdr->sh_info)
13408 {
13409 /* It's a local symbol. */
13410 struct _opd_sec_data *opd;
13411
13412 sym = local_syms + r_symndx;
13413 sec = local_sections[r_symndx];
13414 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
13415 sym_type = ELF64_ST_TYPE (sym->st_info);
13416 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13417 opd = get_opd_info (sec);
13418 if (opd != NULL && opd->adjust != NULL)
13419 {
13420 long adjust = opd->adjust[OPD_NDX (sym->st_value
13421 + rel->r_addend)];
13422 if (adjust == -1)
13423 relocation = 0;
13424 else
13425 {
13426 /* If this is a relocation against the opd section sym
13427 and we have edited .opd, adjust the reloc addend so
13428 that ld -r and ld --emit-relocs output is correct.
13429 If it is a reloc against some other .opd symbol,
13430 then the symbol value will be adjusted later. */
13431 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13432 rel->r_addend += adjust;
13433 else
13434 relocation += adjust;
13435 }
13436 }
13437 }
13438 else
13439 {
13440 bfd_boolean ignored;
13441
13442 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13443 r_symndx, symtab_hdr, sym_hashes,
13444 h_elf, sec, relocation,
13445 unresolved_reloc, warned, ignored);
13446 sym_name = h_elf->root.root.string;
13447 sym_type = h_elf->type;
13448 if (sec != NULL
13449 && sec->owner == output_bfd
13450 && strcmp (sec->name, ".opd") == 0)
13451 {
13452 /* This is a symbol defined in a linker script. All
13453 such are defined in output sections, even those
13454 defined by simple assignment from a symbol defined in
13455 an input section. Transfer the symbol to an
13456 appropriate input .opd section, so that a branch to
13457 this symbol will be mapped to the location specified
13458 by the opd entry. */
13459 struct bfd_link_order *lo;
13460 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13461 if (lo->type == bfd_indirect_link_order)
13462 {
13463 asection *isec = lo->u.indirect.section;
13464 if (h_elf->root.u.def.value >= isec->output_offset
13465 && h_elf->root.u.def.value < (isec->output_offset
13466 + isec->size))
13467 {
13468 h_elf->root.u.def.value -= isec->output_offset;
13469 h_elf->root.u.def.section = isec;
13470 sec = isec;
13471 break;
13472 }
13473 }
13474 }
13475 }
13476 h = (struct ppc_link_hash_entry *) h_elf;
13477
13478 if (sec != NULL && discarded_section (sec))
13479 {
13480 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
13481 input_bfd, input_section,
13482 contents + rel->r_offset);
13483 wrel->r_offset = rel->r_offset;
13484 wrel->r_info = 0;
13485 wrel->r_addend = 0;
13486
13487 /* For ld -r, remove relocations in debug sections against
13488 sections defined in discarded sections. Not done for
13489 non-debug to preserve relocs in .eh_frame which the
13490 eh_frame editing code expects to be present. */
13491 if (bfd_link_relocatable (info)
13492 && (input_section->flags & SEC_DEBUGGING))
13493 wrel--;
13494
13495 continue;
13496 }
13497
13498 if (bfd_link_relocatable (info))
13499 goto copy_reloc;
13500
13501 if (h != NULL && &h->elf == htab->elf.hgot)
13502 {
13503 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13504 sec = bfd_abs_section_ptr;
13505 unresolved_reloc = FALSE;
13506 }
13507
13508 /* TLS optimizations. Replace instruction sequences and relocs
13509 based on information we collected in tls_optimize. We edit
13510 RELOCS so that --emit-relocs will output something sensible
13511 for the final instruction stream. */
13512 tls_mask = 0;
13513 tls_gd = 0;
13514 toc_symndx = 0;
13515 if (h != NULL)
13516 tls_mask = h->tls_mask;
13517 else if (local_got_ents != NULL)
13518 {
13519 struct plt_entry **local_plt = (struct plt_entry **)
13520 (local_got_ents + symtab_hdr->sh_info);
13521 unsigned char *lgot_masks = (unsigned char *)
13522 (local_plt + symtab_hdr->sh_info);
13523 tls_mask = lgot_masks[r_symndx];
13524 }
13525 if (tls_mask == 0
13526 && (r_type == R_PPC64_TLS
13527 || r_type == R_PPC64_TLSGD
13528 || r_type == R_PPC64_TLSLD))
13529 {
13530 /* Check for toc tls entries. */
13531 unsigned char *toc_tls;
13532
13533 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13534 &local_syms, rel, input_bfd))
13535 return FALSE;
13536
13537 if (toc_tls)
13538 tls_mask = *toc_tls;
13539 }
13540
13541 /* Check that tls relocs are used with tls syms, and non-tls
13542 relocs are used with non-tls syms. */
13543 if (r_symndx != STN_UNDEF
13544 && r_type != R_PPC64_NONE
13545 && (h == NULL
13546 || h->elf.root.type == bfd_link_hash_defined
13547 || h->elf.root.type == bfd_link_hash_defweak)
13548 && (IS_PPC64_TLS_RELOC (r_type)
13549 != (sym_type == STT_TLS
13550 || (sym_type == STT_SECTION
13551 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13552 {
13553 if (tls_mask != 0
13554 && (r_type == R_PPC64_TLS
13555 || r_type == R_PPC64_TLSGD
13556 || r_type == R_PPC64_TLSLD))
13557 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13558 ;
13559 else
13560 info->callbacks->einfo
13561 (!IS_PPC64_TLS_RELOC (r_type)
13562 /* xgettext:c-format */
13563 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13564 /* xgettext:c-format */
13565 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13566 input_bfd, input_section, rel->r_offset,
13567 ppc64_elf_howto_table[r_type]->name,
13568 sym_name);
13569 }
13570
13571 /* Ensure reloc mapping code below stays sane. */
13572 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13573 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13574 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13575 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13576 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13577 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13578 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13579 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13580 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13581 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13582 abort ();
13583
13584 switch (r_type)
13585 {
13586 default:
13587 break;
13588
13589 case R_PPC64_LO_DS_OPT:
13590 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
13591 if ((insn & (0x3f << 26)) != 58u << 26)
13592 abort ();
13593 insn += (14u << 26) - (58u << 26);
13594 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
13595 r_type = R_PPC64_TOC16_LO;
13596 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13597 break;
13598
13599 case R_PPC64_TOC16:
13600 case R_PPC64_TOC16_LO:
13601 case R_PPC64_TOC16_DS:
13602 case R_PPC64_TOC16_LO_DS:
13603 {
13604 /* Check for toc tls entries. */
13605 unsigned char *toc_tls;
13606 int retval;
13607
13608 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13609 &local_syms, rel, input_bfd);
13610 if (retval == 0)
13611 return FALSE;
13612
13613 if (toc_tls)
13614 {
13615 tls_mask = *toc_tls;
13616 if (r_type == R_PPC64_TOC16_DS
13617 || r_type == R_PPC64_TOC16_LO_DS)
13618 {
13619 if (tls_mask != 0
13620 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13621 goto toctprel;
13622 }
13623 else
13624 {
13625 /* If we found a GD reloc pair, then we might be
13626 doing a GD->IE transition. */
13627 if (retval == 2)
13628 {
13629 tls_gd = TLS_TPRELGD;
13630 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13631 goto tls_ldgd_opt;
13632 }
13633 else if (retval == 3)
13634 {
13635 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13636 goto tls_ldgd_opt;
13637 }
13638 }
13639 }
13640 }
13641 break;
13642
13643 case R_PPC64_GOT_TPREL16_HI:
13644 case R_PPC64_GOT_TPREL16_HA:
13645 if (tls_mask != 0
13646 && (tls_mask & TLS_TPREL) == 0)
13647 {
13648 rel->r_offset -= d_offset;
13649 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13650 r_type = R_PPC64_NONE;
13651 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13652 }
13653 break;
13654
13655 case R_PPC64_GOT_TPREL16_DS:
13656 case R_PPC64_GOT_TPREL16_LO_DS:
13657 if (tls_mask != 0
13658 && (tls_mask & TLS_TPREL) == 0)
13659 {
13660 toctprel:
13661 insn = bfd_get_32 (input_bfd,
13662 contents + rel->r_offset - d_offset);
13663 insn &= 31 << 21;
13664 insn |= 0x3c0d0000; /* addis 0,13,0 */
13665 bfd_put_32 (input_bfd, insn,
13666 contents + rel->r_offset - d_offset);
13667 r_type = R_PPC64_TPREL16_HA;
13668 if (toc_symndx != 0)
13669 {
13670 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13671 rel->r_addend = toc_addend;
13672 /* We changed the symbol. Start over in order to
13673 get h, sym, sec etc. right. */
13674 goto again;
13675 }
13676 else
13677 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13678 }
13679 break;
13680
13681 case R_PPC64_TLS:
13682 if (tls_mask != 0
13683 && (tls_mask & TLS_TPREL) == 0)
13684 {
13685 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13686 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13687 if (insn == 0)
13688 abort ();
13689 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
13690 /* Was PPC64_TLS which sits on insn boundary, now
13691 PPC64_TPREL16_LO which is at low-order half-word. */
13692 rel->r_offset += d_offset;
13693 r_type = R_PPC64_TPREL16_LO;
13694 if (toc_symndx != 0)
13695 {
13696 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13697 rel->r_addend = toc_addend;
13698 /* We changed the symbol. Start over in order to
13699 get h, sym, sec etc. right. */
13700 goto again;
13701 }
13702 else
13703 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13704 }
13705 break;
13706
13707 case R_PPC64_GOT_TLSGD16_HI:
13708 case R_PPC64_GOT_TLSGD16_HA:
13709 tls_gd = TLS_TPRELGD;
13710 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13711 goto tls_gdld_hi;
13712 break;
13713
13714 case R_PPC64_GOT_TLSLD16_HI:
13715 case R_PPC64_GOT_TLSLD16_HA:
13716 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13717 {
13718 tls_gdld_hi:
13719 if ((tls_mask & tls_gd) != 0)
13720 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13721 + R_PPC64_GOT_TPREL16_DS);
13722 else
13723 {
13724 rel->r_offset -= d_offset;
13725 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
13726 r_type = R_PPC64_NONE;
13727 }
13728 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13729 }
13730 break;
13731
13732 case R_PPC64_GOT_TLSGD16:
13733 case R_PPC64_GOT_TLSGD16_LO:
13734 tls_gd = TLS_TPRELGD;
13735 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13736 goto tls_ldgd_opt;
13737 break;
13738
13739 case R_PPC64_GOT_TLSLD16:
13740 case R_PPC64_GOT_TLSLD16_LO:
13741 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13742 {
13743 unsigned int insn1, insn2, insn3;
13744 bfd_vma offset;
13745
13746 tls_ldgd_opt:
13747 offset = (bfd_vma) -1;
13748 /* If not using the newer R_PPC64_TLSGD/LD to mark
13749 __tls_get_addr calls, we must trust that the call
13750 stays with its arg setup insns, ie. that the next
13751 reloc is the __tls_get_addr call associated with
13752 the current reloc. Edit both insns. */
13753 if (input_section->has_tls_get_addr_call
13754 && rel + 1 < relend
13755 && branch_reloc_hash_match (input_bfd, rel + 1,
13756 htab->tls_get_addr,
13757 htab->tls_get_addr_fd))
13758 offset = rel[1].r_offset;
13759 /* We read the low GOT_TLS (or TOC16) insn because we
13760 need to keep the destination reg. It may be
13761 something other than the usual r3, and moved to r3
13762 before the call by intervening code. */
13763 insn1 = bfd_get_32 (input_bfd,
13764 contents + rel->r_offset - d_offset);
13765 if ((tls_mask & tls_gd) != 0)
13766 {
13767 /* IE */
13768 insn1 &= (0x1f << 21) | (0x1f << 16);
13769 insn1 |= 58 << 26; /* ld */
13770 insn2 = 0x7c636a14; /* add 3,3,13 */
13771 if (offset != (bfd_vma) -1)
13772 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13773 if ((tls_mask & TLS_EXPLICIT) == 0)
13774 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13775 + R_PPC64_GOT_TPREL16_DS);
13776 else
13777 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13778 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13779 }
13780 else
13781 {
13782 /* LE */
13783 insn1 &= 0x1f << 21;
13784 insn1 |= 0x3c0d0000; /* addis r,13,0 */
13785 insn2 = 0x38630000; /* addi 3,3,0 */
13786 if (tls_gd == 0)
13787 {
13788 /* Was an LD reloc. */
13789 if (toc_symndx)
13790 sec = local_sections[toc_symndx];
13791 for (r_symndx = 0;
13792 r_symndx < symtab_hdr->sh_info;
13793 r_symndx++)
13794 if (local_sections[r_symndx] == sec)
13795 break;
13796 if (r_symndx >= symtab_hdr->sh_info)
13797 r_symndx = STN_UNDEF;
13798 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13799 if (r_symndx != STN_UNDEF)
13800 rel->r_addend -= (local_syms[r_symndx].st_value
13801 + sec->output_offset
13802 + sec->output_section->vma);
13803 }
13804 else if (toc_symndx != 0)
13805 {
13806 r_symndx = toc_symndx;
13807 rel->r_addend = toc_addend;
13808 }
13809 r_type = R_PPC64_TPREL16_HA;
13810 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13811 if (offset != (bfd_vma) -1)
13812 {
13813 rel[1].r_info = ELF64_R_INFO (r_symndx,
13814 R_PPC64_TPREL16_LO);
13815 rel[1].r_offset = offset + d_offset;
13816 rel[1].r_addend = rel->r_addend;
13817 }
13818 }
13819 bfd_put_32 (input_bfd, insn1,
13820 contents + rel->r_offset - d_offset);
13821 if (offset != (bfd_vma) -1)
13822 {
13823 insn3 = bfd_get_32 (input_bfd,
13824 contents + offset + 4);
13825 if (insn3 == NOP
13826 || insn3 == CROR_151515 || insn3 == CROR_313131)
13827 {
13828 rel[1].r_offset += 4;
13829 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13830 insn2 = NOP;
13831 }
13832 bfd_put_32 (input_bfd, insn2, contents + offset);
13833 }
13834 if ((tls_mask & tls_gd) == 0
13835 && (tls_gd == 0 || toc_symndx != 0))
13836 {
13837 /* We changed the symbol. Start over in order
13838 to get h, sym, sec etc. right. */
13839 goto again;
13840 }
13841 }
13842 break;
13843
13844 case R_PPC64_TLSGD:
13845 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13846 {
13847 unsigned int insn2, insn3;
13848 bfd_vma offset = rel->r_offset;
13849
13850 if ((tls_mask & TLS_TPRELGD) != 0)
13851 {
13852 /* IE */
13853 r_type = R_PPC64_NONE;
13854 insn2 = 0x7c636a14; /* add 3,3,13 */
13855 }
13856 else
13857 {
13858 /* LE */
13859 if (toc_symndx != 0)
13860 {
13861 r_symndx = toc_symndx;
13862 rel->r_addend = toc_addend;
13863 }
13864 r_type = R_PPC64_TPREL16_LO;
13865 rel->r_offset = offset + d_offset;
13866 insn2 = 0x38630000; /* addi 3,3,0 */
13867 }
13868 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13869 /* Zap the reloc on the _tls_get_addr call too. */
13870 BFD_ASSERT (offset == rel[1].r_offset);
13871 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13872 insn3 = bfd_get_32 (input_bfd,
13873 contents + offset + 4);
13874 if (insn3 == NOP
13875 || insn3 == CROR_151515 || insn3 == CROR_313131)
13876 {
13877 rel->r_offset += 4;
13878 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13879 insn2 = NOP;
13880 }
13881 bfd_put_32 (input_bfd, insn2, contents + offset);
13882 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13883 goto again;
13884 }
13885 break;
13886
13887 case R_PPC64_TLSLD:
13888 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13889 {
13890 unsigned int insn2, insn3;
13891 bfd_vma offset = rel->r_offset;
13892
13893 if (toc_symndx)
13894 sec = local_sections[toc_symndx];
13895 for (r_symndx = 0;
13896 r_symndx < symtab_hdr->sh_info;
13897 r_symndx++)
13898 if (local_sections[r_symndx] == sec)
13899 break;
13900 if (r_symndx >= symtab_hdr->sh_info)
13901 r_symndx = STN_UNDEF;
13902 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13903 if (r_symndx != STN_UNDEF)
13904 rel->r_addend -= (local_syms[r_symndx].st_value
13905 + sec->output_offset
13906 + sec->output_section->vma);
13907
13908 r_type = R_PPC64_TPREL16_LO;
13909 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13910 rel->r_offset = offset + d_offset;
13911 /* Zap the reloc on the _tls_get_addr call too. */
13912 BFD_ASSERT (offset == rel[1].r_offset);
13913 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13914 insn2 = 0x38630000; /* addi 3,3,0 */
13915 insn3 = bfd_get_32 (input_bfd,
13916 contents + offset + 4);
13917 if (insn3 == NOP
13918 || insn3 == CROR_151515 || insn3 == CROR_313131)
13919 {
13920 rel->r_offset += 4;
13921 bfd_put_32 (input_bfd, insn2, contents + offset + 4);
13922 insn2 = NOP;
13923 }
13924 bfd_put_32 (input_bfd, insn2, contents + offset);
13925 goto again;
13926 }
13927 break;
13928
13929 case R_PPC64_DTPMOD64:
13930 if (rel + 1 < relend
13931 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13932 && rel[1].r_offset == rel->r_offset + 8)
13933 {
13934 if ((tls_mask & TLS_GD) == 0)
13935 {
13936 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13937 if ((tls_mask & TLS_TPRELGD) != 0)
13938 r_type = R_PPC64_TPREL64;
13939 else
13940 {
13941 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13942 r_type = R_PPC64_NONE;
13943 }
13944 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13945 }
13946 }
13947 else
13948 {
13949 if ((tls_mask & TLS_LD) == 0)
13950 {
13951 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13952 r_type = R_PPC64_NONE;
13953 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13954 }
13955 }
13956 break;
13957
13958 case R_PPC64_TPREL64:
13959 if ((tls_mask & TLS_TPREL) == 0)
13960 {
13961 r_type = R_PPC64_NONE;
13962 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13963 }
13964 break;
13965
13966 case R_PPC64_ENTRY:
13967 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13968 if (!bfd_link_pic (info)
13969 && !info->traditional_format
13970 && relocation + 0x80008000 <= 0xffffffff)
13971 {
13972 unsigned int insn1, insn2;
13973
13974 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
13975 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
13976 if ((insn1 & ~0xfffc) == LD_R2_0R12
13977 && insn2 == ADD_R2_R2_R12)
13978 {
13979 bfd_put_32 (input_bfd,
13980 LIS_R2 + PPC_HA (relocation),
13981 contents + rel->r_offset);
13982 bfd_put_32 (input_bfd,
13983 ADDI_R2_R2 + PPC_LO (relocation),
13984 contents + rel->r_offset + 4);
13985 }
13986 }
13987 else
13988 {
13989 relocation -= (rel->r_offset
13990 + input_section->output_offset
13991 + input_section->output_section->vma);
13992 if (relocation + 0x80008000 <= 0xffffffff)
13993 {
13994 unsigned int insn1, insn2;
13995
13996 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
13997 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
13998 if ((insn1 & ~0xfffc) == LD_R2_0R12
13999 && insn2 == ADD_R2_R2_R12)
14000 {
14001 bfd_put_32 (input_bfd,
14002 ADDIS_R2_R12 + PPC_HA (relocation),
14003 contents + rel->r_offset);
14004 bfd_put_32 (input_bfd,
14005 ADDI_R2_R2 + PPC_LO (relocation),
14006 contents + rel->r_offset + 4);
14007 }
14008 }
14009 }
14010 break;
14011
14012 case R_PPC64_REL16_HA:
14013 /* If we are generating a non-PIC executable, edit
14014 . 0: addis 2,12,.TOC.-0b@ha
14015 . addi 2,2,.TOC.-0b@l
14016 used by ELFv2 global entry points to set up r2, to
14017 . lis 2,.TOC.@ha
14018 . addi 2,2,.TOC.@l
14019 if .TOC. is in range. */
14020 if (!bfd_link_pic (info)
14021 && !info->traditional_format
14022 && !htab->opd_abi
14023 && rel->r_addend == d_offset
14024 && h != NULL && &h->elf == htab->elf.hgot
14025 && rel + 1 < relend
14026 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14027 && rel[1].r_offset == rel->r_offset + 4
14028 && rel[1].r_addend == rel->r_addend + 4
14029 && relocation + 0x80008000 <= 0xffffffff)
14030 {
14031 unsigned int insn1, insn2;
14032 bfd_vma offset = rel->r_offset - d_offset;
14033 insn1 = bfd_get_32 (input_bfd, contents + offset);
14034 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14035 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14036 && (insn2 & 0xffff0000) == ADDI_R2_R2)
14037 {
14038 r_type = R_PPC64_ADDR16_HA;
14039 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14040 rel->r_addend -= d_offset;
14041 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14042 rel[1].r_addend -= d_offset + 4;
14043 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
14044 }
14045 }
14046 break;
14047 }
14048
14049 /* Handle other relocations that tweak non-addend part of insn. */
14050 insn = 0;
14051 max_br_offset = 1 << 25;
14052 addend = rel->r_addend;
14053 reloc_dest = DEST_NORMAL;
14054 switch (r_type)
14055 {
14056 default:
14057 break;
14058
14059 case R_PPC64_TOCSAVE:
14060 if (relocation + addend == (rel->r_offset
14061 + input_section->output_offset
14062 + input_section->output_section->vma)
14063 && tocsave_find (htab, NO_INSERT,
14064 &local_syms, rel, input_bfd))
14065 {
14066 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14067 if (insn == NOP
14068 || insn == CROR_151515 || insn == CROR_313131)
14069 bfd_put_32 (input_bfd,
14070 STD_R2_0R1 + STK_TOC (htab),
14071 contents + rel->r_offset);
14072 }
14073 break;
14074
14075 /* Branch taken prediction relocations. */
14076 case R_PPC64_ADDR14_BRTAKEN:
14077 case R_PPC64_REL14_BRTAKEN:
14078 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
14079 /* Fall through. */
14080
14081 /* Branch not taken prediction relocations. */
14082 case R_PPC64_ADDR14_BRNTAKEN:
14083 case R_PPC64_REL14_BRNTAKEN:
14084 insn |= bfd_get_32 (input_bfd,
14085 contents + rel->r_offset) & ~(0x01 << 21);
14086 /* Fall through. */
14087
14088 case R_PPC64_REL14:
14089 max_br_offset = 1 << 15;
14090 /* Fall through. */
14091
14092 case R_PPC64_REL24:
14093 /* Calls to functions with a different TOC, such as calls to
14094 shared objects, need to alter the TOC pointer. This is
14095 done using a linkage stub. A REL24 branching to these
14096 linkage stubs needs to be followed by a nop, as the nop
14097 will be replaced with an instruction to restore the TOC
14098 base pointer. */
14099 fdh = h;
14100 if (h != NULL
14101 && h->oh != NULL
14102 && h->oh->is_func_descriptor)
14103 fdh = ppc_follow_link (h->oh);
14104 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14105 htab);
14106 if (stub_entry != NULL
14107 && (stub_entry->stub_type == ppc_stub_plt_call
14108 || stub_entry->stub_type == ppc_stub_plt_call_r2save
14109 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14110 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
14111 {
14112 bfd_boolean can_plt_call = FALSE;
14113
14114 /* All of these stubs will modify r2, so there must be a
14115 branch and link followed by a nop. The nop is
14116 replaced by an insn to restore r2. */
14117 if (rel->r_offset + 8 <= input_section->size)
14118 {
14119 unsigned long br;
14120
14121 br = bfd_get_32 (input_bfd,
14122 contents + rel->r_offset);
14123 if ((br & 1) != 0)
14124 {
14125 unsigned long nop;
14126
14127 nop = bfd_get_32 (input_bfd,
14128 contents + rel->r_offset + 4);
14129 if (nop == NOP
14130 || nop == CROR_151515 || nop == CROR_313131)
14131 {
14132 if (h != NULL
14133 && (h == htab->tls_get_addr_fd
14134 || h == htab->tls_get_addr)
14135 && htab->params->tls_get_addr_opt)
14136 {
14137 /* Special stub used, leave nop alone. */
14138 }
14139 else
14140 bfd_put_32 (input_bfd,
14141 LD_R2_0R1 + STK_TOC (htab),
14142 contents + rel->r_offset + 4);
14143 can_plt_call = TRUE;
14144 }
14145 }
14146 }
14147
14148 if (!can_plt_call && h != NULL)
14149 {
14150 const char *name = h->elf.root.root.string;
14151
14152 if (*name == '.')
14153 ++name;
14154
14155 if (strncmp (name, "__libc_start_main", 17) == 0
14156 && (name[17] == 0 || name[17] == '@'))
14157 {
14158 /* Allow crt1 branch to go via a toc adjusting
14159 stub. Other calls that never return could do
14160 the same, if we could detect such. */
14161 can_plt_call = TRUE;
14162 }
14163 }
14164
14165 if (!can_plt_call)
14166 {
14167 /* g++ as of 20130507 emits self-calls without a
14168 following nop. This is arguably wrong since we
14169 have conflicting information. On the one hand a
14170 global symbol and on the other a local call
14171 sequence, but don't error for this special case.
14172 It isn't possible to cheaply verify we have
14173 exactly such a call. Allow all calls to the same
14174 section. */
14175 asection *code_sec = sec;
14176
14177 if (get_opd_info (sec) != NULL)
14178 {
14179 bfd_vma off = (relocation + addend
14180 - sec->output_section->vma
14181 - sec->output_offset);
14182
14183 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
14184 }
14185 if (code_sec == input_section)
14186 can_plt_call = TRUE;
14187 }
14188
14189 if (!can_plt_call)
14190 {
14191 if (stub_entry->stub_type == ppc_stub_plt_call
14192 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14193 info->callbacks->einfo
14194 /* xgettext:c-format */
14195 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14196 "recompile with -fPIC\n"),
14197 input_bfd, input_section, rel->r_offset, sym_name);
14198 else
14199 info->callbacks->einfo
14200 /* xgettext:c-format */
14201 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
14202 "(-mcmodel=small toc adjust stub)\n"),
14203 input_bfd, input_section, rel->r_offset, sym_name);
14204
14205 bfd_set_error (bfd_error_bad_value);
14206 ret = FALSE;
14207 }
14208
14209 if (can_plt_call
14210 && (stub_entry->stub_type == ppc_stub_plt_call
14211 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14212 unresolved_reloc = FALSE;
14213 }
14214
14215 if ((stub_entry == NULL
14216 || stub_entry->stub_type == ppc_stub_long_branch
14217 || stub_entry->stub_type == ppc_stub_plt_branch)
14218 && get_opd_info (sec) != NULL)
14219 {
14220 /* The branch destination is the value of the opd entry. */
14221 bfd_vma off = (relocation + addend
14222 - sec->output_section->vma
14223 - sec->output_offset);
14224 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
14225 if (dest != (bfd_vma) -1)
14226 {
14227 relocation = dest;
14228 addend = 0;
14229 reloc_dest = DEST_OPD;
14230 }
14231 }
14232
14233 /* If the branch is out of reach we ought to have a long
14234 branch stub. */
14235 from = (rel->r_offset
14236 + input_section->output_offset
14237 + input_section->output_section->vma);
14238
14239 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14240 ? fdh->elf.other
14241 : sym->st_other);
14242
14243 if (stub_entry != NULL
14244 && (stub_entry->stub_type == ppc_stub_long_branch
14245 || stub_entry->stub_type == ppc_stub_plt_branch)
14246 && (r_type == R_PPC64_ADDR14_BRTAKEN
14247 || r_type == R_PPC64_ADDR14_BRNTAKEN
14248 || (relocation + addend - from + max_br_offset
14249 < 2 * max_br_offset)))
14250 /* Don't use the stub if this branch is in range. */
14251 stub_entry = NULL;
14252
14253 if (stub_entry != NULL)
14254 {
14255 /* Munge up the value and addend so that we call the stub
14256 rather than the procedure directly. */
14257 asection *stub_sec = stub_entry->group->stub_sec;
14258
14259 if (stub_entry->stub_type == ppc_stub_save_res)
14260 relocation += (stub_sec->output_offset
14261 + stub_sec->output_section->vma
14262 + stub_sec->size - htab->sfpr->size
14263 - htab->sfpr->output_offset
14264 - htab->sfpr->output_section->vma);
14265 else
14266 relocation = (stub_entry->stub_offset
14267 + stub_sec->output_offset
14268 + stub_sec->output_section->vma);
14269 addend = 0;
14270 reloc_dest = DEST_STUB;
14271
14272 if ((stub_entry->stub_type == ppc_stub_plt_call
14273 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14274 && (ALWAYS_EMIT_R2SAVE
14275 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14276 && rel + 1 < relend
14277 && rel[1].r_offset == rel->r_offset + 4
14278 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14279 relocation += 4;
14280 }
14281
14282 if (insn != 0)
14283 {
14284 if (is_isa_v2)
14285 {
14286 /* Set 'a' bit. This is 0b00010 in BO field for branch
14287 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14288 for branch on CTR insns (BO == 1a00t or 1a01t). */
14289 if ((insn & (0x14 << 21)) == (0x04 << 21))
14290 insn |= 0x02 << 21;
14291 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14292 insn |= 0x08 << 21;
14293 else
14294 break;
14295 }
14296 else
14297 {
14298 /* Invert 'y' bit if not the default. */
14299 if ((bfd_signed_vma) (relocation + addend - from) < 0)
14300 insn ^= 0x01 << 21;
14301 }
14302
14303 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14304 }
14305
14306 /* NOP out calls to undefined weak functions.
14307 We can thus call a weak function without first
14308 checking whether the function is defined. */
14309 else if (h != NULL
14310 && h->elf.root.type == bfd_link_hash_undefweak
14311 && h->elf.dynindx == -1
14312 && r_type == R_PPC64_REL24
14313 && relocation == 0
14314 && addend == 0)
14315 {
14316 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14317 goto copy_reloc;
14318 }
14319 break;
14320 }
14321
14322 /* Set `addend'. */
14323 tls_type = 0;
14324 switch (r_type)
14325 {
14326 default:
14327 info->callbacks->einfo
14328 /* xgettext:c-format */
14329 (_("%P: %B: unknown relocation type %d for `%T'\n"),
14330 input_bfd, (int) r_type, sym_name);
14331
14332 bfd_set_error (bfd_error_bad_value);
14333 ret = FALSE;
14334 goto copy_reloc;
14335
14336 case R_PPC64_NONE:
14337 case R_PPC64_TLS:
14338 case R_PPC64_TLSGD:
14339 case R_PPC64_TLSLD:
14340 case R_PPC64_TOCSAVE:
14341 case R_PPC64_GNU_VTINHERIT:
14342 case R_PPC64_GNU_VTENTRY:
14343 case R_PPC64_ENTRY:
14344 goto copy_reloc;
14345
14346 /* GOT16 relocations. Like an ADDR16 using the symbol's
14347 address in the GOT as relocation value instead of the
14348 symbol's value itself. Also, create a GOT entry for the
14349 symbol and put the symbol value there. */
14350 case R_PPC64_GOT_TLSGD16:
14351 case R_PPC64_GOT_TLSGD16_LO:
14352 case R_PPC64_GOT_TLSGD16_HI:
14353 case R_PPC64_GOT_TLSGD16_HA:
14354 tls_type = TLS_TLS | TLS_GD;
14355 goto dogot;
14356
14357 case R_PPC64_GOT_TLSLD16:
14358 case R_PPC64_GOT_TLSLD16_LO:
14359 case R_PPC64_GOT_TLSLD16_HI:
14360 case R_PPC64_GOT_TLSLD16_HA:
14361 tls_type = TLS_TLS | TLS_LD;
14362 goto dogot;
14363
14364 case R_PPC64_GOT_TPREL16_DS:
14365 case R_PPC64_GOT_TPREL16_LO_DS:
14366 case R_PPC64_GOT_TPREL16_HI:
14367 case R_PPC64_GOT_TPREL16_HA:
14368 tls_type = TLS_TLS | TLS_TPREL;
14369 goto dogot;
14370
14371 case R_PPC64_GOT_DTPREL16_DS:
14372 case R_PPC64_GOT_DTPREL16_LO_DS:
14373 case R_PPC64_GOT_DTPREL16_HI:
14374 case R_PPC64_GOT_DTPREL16_HA:
14375 tls_type = TLS_TLS | TLS_DTPREL;
14376 goto dogot;
14377
14378 case R_PPC64_GOT16:
14379 case R_PPC64_GOT16_LO:
14380 case R_PPC64_GOT16_HI:
14381 case R_PPC64_GOT16_HA:
14382 case R_PPC64_GOT16_DS:
14383 case R_PPC64_GOT16_LO_DS:
14384 dogot:
14385 {
14386 /* Relocation is to the entry for this symbol in the global
14387 offset table. */
14388 asection *got;
14389 bfd_vma *offp;
14390 bfd_vma off;
14391 unsigned long indx = 0;
14392 struct got_entry *ent;
14393
14394 if (tls_type == (TLS_TLS | TLS_LD)
14395 && (h == NULL
14396 || !h->elf.def_dynamic))
14397 ent = ppc64_tlsld_got (input_bfd);
14398 else
14399 {
14400
14401 if (h != NULL)
14402 {
14403 bfd_boolean dyn = htab->elf.dynamic_sections_created;
14404 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info),
14405 &h->elf)
14406 || (bfd_link_pic (info)
14407 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
14408 /* This is actually a static link, or it is a
14409 -Bsymbolic link and the symbol is defined
14410 locally, or the symbol was forced to be local
14411 because of a version file. */
14412 ;
14413 else
14414 {
14415 BFD_ASSERT (h->elf.dynindx != -1);
14416 indx = h->elf.dynindx;
14417 unresolved_reloc = FALSE;
14418 }
14419 ent = h->elf.got.glist;
14420 }
14421 else
14422 {
14423 if (local_got_ents == NULL)
14424 abort ();
14425 ent = local_got_ents[r_symndx];
14426 }
14427
14428 for (; ent != NULL; ent = ent->next)
14429 if (ent->addend == orig_rel.r_addend
14430 && ent->owner == input_bfd
14431 && ent->tls_type == tls_type)
14432 break;
14433 }
14434
14435 if (ent == NULL)
14436 abort ();
14437 if (ent->is_indirect)
14438 ent = ent->got.ent;
14439 offp = &ent->got.offset;
14440 got = ppc64_elf_tdata (ent->owner)->got;
14441 if (got == NULL)
14442 abort ();
14443
14444 /* The offset must always be a multiple of 8. We use the
14445 least significant bit to record whether we have already
14446 processed this entry. */
14447 off = *offp;
14448 if ((off & 1) != 0)
14449 off &= ~1;
14450 else
14451 {
14452 /* Generate relocs for the dynamic linker, except in
14453 the case of TLSLD where we'll use one entry per
14454 module. */
14455 asection *relgot;
14456 bfd_boolean ifunc;
14457
14458 *offp = off | 1;
14459 relgot = NULL;
14460 ifunc = (h != NULL
14461 ? h->elf.type == STT_GNU_IFUNC
14462 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
14463 if (ifunc)
14464 relgot = htab->elf.irelplt;
14465 else if ((bfd_link_pic (info) || indx != 0)
14466 && (h == NULL
14467 || (tls_type == (TLS_TLS | TLS_LD)
14468 && !h->elf.def_dynamic)
14469 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14470 || h->elf.root.type != bfd_link_hash_undefweak))
14471 relgot = ppc64_elf_tdata (ent->owner)->relgot;
14472 if (relgot != NULL)
14473 {
14474 outrel.r_offset = (got->output_section->vma
14475 + got->output_offset
14476 + off);
14477 outrel.r_addend = addend;
14478 if (tls_type & (TLS_LD | TLS_GD))
14479 {
14480 outrel.r_addend = 0;
14481 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
14482 if (tls_type == (TLS_TLS | TLS_GD))
14483 {
14484 loc = relgot->contents;
14485 loc += (relgot->reloc_count++
14486 * sizeof (Elf64_External_Rela));
14487 bfd_elf64_swap_reloca_out (output_bfd,
14488 &outrel, loc);
14489 outrel.r_offset += 8;
14490 outrel.r_addend = addend;
14491 outrel.r_info
14492 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14493 }
14494 }
14495 else if (tls_type == (TLS_TLS | TLS_DTPREL))
14496 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14497 else if (tls_type == (TLS_TLS | TLS_TPREL))
14498 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
14499 else if (indx != 0)
14500 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14501 else
14502 {
14503 if (ifunc)
14504 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14505 else
14506 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14507
14508 /* Write the .got section contents for the sake
14509 of prelink. */
14510 loc = got->contents + off;
14511 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14512 loc);
14513 }
14514
14515 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
14516 {
14517 outrel.r_addend += relocation;
14518 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
14519 {
14520 if (htab->elf.tls_sec == NULL)
14521 outrel.r_addend = 0;
14522 else
14523 outrel.r_addend -= htab->elf.tls_sec->vma;
14524 }
14525 }
14526 loc = relgot->contents;
14527 loc += (relgot->reloc_count++
14528 * sizeof (Elf64_External_Rela));
14529 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14530 }
14531
14532 /* Init the .got section contents here if we're not
14533 emitting a reloc. */
14534 else
14535 {
14536 relocation += addend;
14537 if (tls_type == (TLS_TLS | TLS_LD))
14538 relocation = 1;
14539 else if (tls_type != 0)
14540 {
14541 if (htab->elf.tls_sec == NULL)
14542 relocation = 0;
14543 else
14544 {
14545 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14546 if (tls_type == (TLS_TLS | TLS_TPREL))
14547 relocation += DTP_OFFSET - TP_OFFSET;
14548 }
14549
14550 if (tls_type == (TLS_TLS | TLS_GD))
14551 {
14552 bfd_put_64 (output_bfd, relocation,
14553 got->contents + off + 8);
14554 relocation = 1;
14555 }
14556 }
14557
14558 bfd_put_64 (output_bfd, relocation,
14559 got->contents + off);
14560 }
14561 }
14562
14563 if (off >= (bfd_vma) -2)
14564 abort ();
14565
14566 relocation = got->output_section->vma + got->output_offset + off;
14567 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
14568 }
14569 break;
14570
14571 case R_PPC64_PLT16_HA:
14572 case R_PPC64_PLT16_HI:
14573 case R_PPC64_PLT16_LO:
14574 case R_PPC64_PLT32:
14575 case R_PPC64_PLT64:
14576 /* Relocation is to the entry for this symbol in the
14577 procedure linkage table. */
14578 {
14579 struct plt_entry **plt_list = NULL;
14580 if (h != NULL)
14581 plt_list = &h->elf.plt.plist;
14582 else if (local_got_ents != NULL)
14583 {
14584 struct plt_entry **local_plt = (struct plt_entry **)
14585 (local_got_ents + symtab_hdr->sh_info);
14586 unsigned char *local_got_tls_masks = (unsigned char *)
14587 (local_plt + symtab_hdr->sh_info);
14588 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
14589 plt_list = local_plt + r_symndx;
14590 }
14591 if (plt_list)
14592 {
14593 struct plt_entry *ent;
14594
14595 for (ent = *plt_list; ent != NULL; ent = ent->next)
14596 if (ent->plt.offset != (bfd_vma) -1
14597 && ent->addend == orig_rel.r_addend)
14598 {
14599 asection *plt;
14600
14601 plt = htab->elf.splt;
14602 if (!htab->elf.dynamic_sections_created
14603 || h == NULL
14604 || h->elf.dynindx == -1)
14605 plt = htab->elf.iplt;
14606 relocation = (plt->output_section->vma
14607 + plt->output_offset
14608 + ent->plt.offset);
14609 addend = 0;
14610 unresolved_reloc = FALSE;
14611 break;
14612 }
14613 }
14614 }
14615 break;
14616
14617 case R_PPC64_TOC:
14618 /* Relocation value is TOC base. */
14619 relocation = TOCstart;
14620 if (r_symndx == STN_UNDEF)
14621 relocation += htab->sec_info[input_section->id].toc_off;
14622 else if (unresolved_reloc)
14623 ;
14624 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
14625 relocation += htab->sec_info[sec->id].toc_off;
14626 else
14627 unresolved_reloc = TRUE;
14628 goto dodyn;
14629
14630 /* TOC16 relocs. We want the offset relative to the TOC base,
14631 which is the address of the start of the TOC plus 0x8000.
14632 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14633 in this order. */
14634 case R_PPC64_TOC16:
14635 case R_PPC64_TOC16_LO:
14636 case R_PPC64_TOC16_HI:
14637 case R_PPC64_TOC16_DS:
14638 case R_PPC64_TOC16_LO_DS:
14639 case R_PPC64_TOC16_HA:
14640 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
14641 break;
14642
14643 /* Relocate against the beginning of the section. */
14644 case R_PPC64_SECTOFF:
14645 case R_PPC64_SECTOFF_LO:
14646 case R_PPC64_SECTOFF_HI:
14647 case R_PPC64_SECTOFF_DS:
14648 case R_PPC64_SECTOFF_LO_DS:
14649 case R_PPC64_SECTOFF_HA:
14650 if (sec != NULL)
14651 addend -= sec->output_section->vma;
14652 break;
14653
14654 case R_PPC64_REL16:
14655 case R_PPC64_REL16_LO:
14656 case R_PPC64_REL16_HI:
14657 case R_PPC64_REL16_HA:
14658 case R_PPC64_REL16DX_HA:
14659 break;
14660
14661 case R_PPC64_REL14:
14662 case R_PPC64_REL14_BRNTAKEN:
14663 case R_PPC64_REL14_BRTAKEN:
14664 case R_PPC64_REL24:
14665 break;
14666
14667 case R_PPC64_TPREL16:
14668 case R_PPC64_TPREL16_LO:
14669 case R_PPC64_TPREL16_HI:
14670 case R_PPC64_TPREL16_HA:
14671 case R_PPC64_TPREL16_DS:
14672 case R_PPC64_TPREL16_LO_DS:
14673 case R_PPC64_TPREL16_HIGH:
14674 case R_PPC64_TPREL16_HIGHA:
14675 case R_PPC64_TPREL16_HIGHER:
14676 case R_PPC64_TPREL16_HIGHERA:
14677 case R_PPC64_TPREL16_HIGHEST:
14678 case R_PPC64_TPREL16_HIGHESTA:
14679 if (h != NULL
14680 && h->elf.root.type == bfd_link_hash_undefweak
14681 && h->elf.dynindx == -1)
14682 {
14683 /* Make this relocation against an undefined weak symbol
14684 resolve to zero. This is really just a tweak, since
14685 code using weak externs ought to check that they are
14686 defined before using them. */
14687 bfd_byte *p = contents + rel->r_offset - d_offset;
14688
14689 insn = bfd_get_32 (input_bfd, p);
14690 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14691 if (insn != 0)
14692 bfd_put_32 (input_bfd, insn, p);
14693 break;
14694 }
14695 if (htab->elf.tls_sec != NULL)
14696 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14697 if (bfd_link_pic (info))
14698 /* The TPREL16 relocs shouldn't really be used in shared
14699 libs as they will result in DT_TEXTREL being set, but
14700 support them anyway. */
14701 goto dodyn;
14702 break;
14703
14704 case R_PPC64_DTPREL16:
14705 case R_PPC64_DTPREL16_LO:
14706 case R_PPC64_DTPREL16_HI:
14707 case R_PPC64_DTPREL16_HA:
14708 case R_PPC64_DTPREL16_DS:
14709 case R_PPC64_DTPREL16_LO_DS:
14710 case R_PPC64_DTPREL16_HIGH:
14711 case R_PPC64_DTPREL16_HIGHA:
14712 case R_PPC64_DTPREL16_HIGHER:
14713 case R_PPC64_DTPREL16_HIGHERA:
14714 case R_PPC64_DTPREL16_HIGHEST:
14715 case R_PPC64_DTPREL16_HIGHESTA:
14716 if (htab->elf.tls_sec != NULL)
14717 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14718 break;
14719
14720 case R_PPC64_ADDR64_LOCAL:
14721 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14722 ? h->elf.other
14723 : sym->st_other);
14724 break;
14725
14726 case R_PPC64_DTPMOD64:
14727 relocation = 1;
14728 addend = 0;
14729 goto dodyn;
14730
14731 case R_PPC64_TPREL64:
14732 if (htab->elf.tls_sec != NULL)
14733 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14734 goto dodyn;
14735
14736 case R_PPC64_DTPREL64:
14737 if (htab->elf.tls_sec != NULL)
14738 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14739 /* Fall through. */
14740
14741 /* Relocations that may need to be propagated if this is a
14742 dynamic object. */
14743 case R_PPC64_REL30:
14744 case R_PPC64_REL32:
14745 case R_PPC64_REL64:
14746 case R_PPC64_ADDR14:
14747 case R_PPC64_ADDR14_BRNTAKEN:
14748 case R_PPC64_ADDR14_BRTAKEN:
14749 case R_PPC64_ADDR16:
14750 case R_PPC64_ADDR16_DS:
14751 case R_PPC64_ADDR16_HA:
14752 case R_PPC64_ADDR16_HI:
14753 case R_PPC64_ADDR16_HIGH:
14754 case R_PPC64_ADDR16_HIGHA:
14755 case R_PPC64_ADDR16_HIGHER:
14756 case R_PPC64_ADDR16_HIGHERA:
14757 case R_PPC64_ADDR16_HIGHEST:
14758 case R_PPC64_ADDR16_HIGHESTA:
14759 case R_PPC64_ADDR16_LO:
14760 case R_PPC64_ADDR16_LO_DS:
14761 case R_PPC64_ADDR24:
14762 case R_PPC64_ADDR32:
14763 case R_PPC64_ADDR64:
14764 case R_PPC64_UADDR16:
14765 case R_PPC64_UADDR32:
14766 case R_PPC64_UADDR64:
14767 dodyn:
14768 if ((input_section->flags & SEC_ALLOC) == 0)
14769 break;
14770
14771 if (NO_OPD_RELOCS && is_opd)
14772 break;
14773
14774 if (bfd_link_pic (info)
14775 ? ((h != NULL && pc_dynrelocs (h))
14776 || must_be_dyn_reloc (info, r_type))
14777 : (h != NULL
14778 ? h->dyn_relocs != NULL
14779 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14780 {
14781 bfd_boolean skip, relocate;
14782 asection *sreloc;
14783 bfd_vma out_off;
14784
14785 /* When generating a dynamic object, these relocations
14786 are copied into the output file to be resolved at run
14787 time. */
14788
14789 skip = FALSE;
14790 relocate = FALSE;
14791
14792 out_off = _bfd_elf_section_offset (output_bfd, info,
14793 input_section, rel->r_offset);
14794 if (out_off == (bfd_vma) -1)
14795 skip = TRUE;
14796 else if (out_off == (bfd_vma) -2)
14797 skip = TRUE, relocate = TRUE;
14798 out_off += (input_section->output_section->vma
14799 + input_section->output_offset);
14800 outrel.r_offset = out_off;
14801 outrel.r_addend = rel->r_addend;
14802
14803 /* Optimize unaligned reloc use. */
14804 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14805 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14806 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14807 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14808 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14809 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14810 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14811 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14812 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14813
14814 if (skip)
14815 memset (&outrel, 0, sizeof outrel);
14816 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14817 && !is_opd
14818 && r_type != R_PPC64_TOC)
14819 {
14820 BFD_ASSERT (h->elf.dynindx != -1);
14821 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14822 }
14823 else
14824 {
14825 /* This symbol is local, or marked to become local,
14826 or this is an opd section reloc which must point
14827 at a local function. */
14828 outrel.r_addend += relocation;
14829 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14830 {
14831 if (is_opd && h != NULL)
14832 {
14833 /* Lie about opd entries. This case occurs
14834 when building shared libraries and we
14835 reference a function in another shared
14836 lib. The same thing happens for a weak
14837 definition in an application that's
14838 overridden by a strong definition in a
14839 shared lib. (I believe this is a generic
14840 bug in binutils handling of weak syms.)
14841 In these cases we won't use the opd
14842 entry in this lib. */
14843 unresolved_reloc = FALSE;
14844 }
14845 if (!is_opd
14846 && r_type == R_PPC64_ADDR64
14847 && (h != NULL
14848 ? h->elf.type == STT_GNU_IFUNC
14849 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14850 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14851 else
14852 {
14853 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14854
14855 /* We need to relocate .opd contents for ld.so.
14856 Prelink also wants simple and consistent rules
14857 for relocs. This make all RELATIVE relocs have
14858 *r_offset equal to r_addend. */
14859 relocate = TRUE;
14860 }
14861 }
14862 else
14863 {
14864 long indx = 0;
14865
14866 if (h != NULL
14867 ? h->elf.type == STT_GNU_IFUNC
14868 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14869 {
14870 info->callbacks->einfo
14871 /* xgettext:c-format */
14872 (_("%P: %H: %s for indirect "
14873 "function `%T' unsupported\n"),
14874 input_bfd, input_section, rel->r_offset,
14875 ppc64_elf_howto_table[r_type]->name,
14876 sym_name);
14877 ret = FALSE;
14878 }
14879 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14880 ;
14881 else if (sec == NULL || sec->owner == NULL)
14882 {
14883 bfd_set_error (bfd_error_bad_value);
14884 return FALSE;
14885 }
14886 else
14887 {
14888 asection *osec;
14889
14890 osec = sec->output_section;
14891 indx = elf_section_data (osec)->dynindx;
14892
14893 if (indx == 0)
14894 {
14895 if ((osec->flags & SEC_READONLY) == 0
14896 && htab->elf.data_index_section != NULL)
14897 osec = htab->elf.data_index_section;
14898 else
14899 osec = htab->elf.text_index_section;
14900 indx = elf_section_data (osec)->dynindx;
14901 }
14902 BFD_ASSERT (indx != 0);
14903
14904 /* We are turning this relocation into one
14905 against a section symbol, so subtract out
14906 the output section's address but not the
14907 offset of the input section in the output
14908 section. */
14909 outrel.r_addend -= osec->vma;
14910 }
14911
14912 outrel.r_info = ELF64_R_INFO (indx, r_type);
14913 }
14914 }
14915
14916 sreloc = elf_section_data (input_section)->sreloc;
14917 if (h != NULL
14918 ? h->elf.type == STT_GNU_IFUNC
14919 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14920 sreloc = htab->elf.irelplt;
14921 if (sreloc == NULL)
14922 abort ();
14923
14924 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14925 >= sreloc->size)
14926 abort ();
14927 loc = sreloc->contents;
14928 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14929 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14930
14931 /* If this reloc is against an external symbol, it will
14932 be computed at runtime, so there's no need to do
14933 anything now. However, for the sake of prelink ensure
14934 that the section contents are a known value. */
14935 if (! relocate)
14936 {
14937 unresolved_reloc = FALSE;
14938 /* The value chosen here is quite arbitrary as ld.so
14939 ignores section contents except for the special
14940 case of .opd where the contents might be accessed
14941 before relocation. Choose zero, as that won't
14942 cause reloc overflow. */
14943 relocation = 0;
14944 addend = 0;
14945 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14946 to improve backward compatibility with older
14947 versions of ld. */
14948 if (r_type == R_PPC64_ADDR64)
14949 addend = outrel.r_addend;
14950 /* Adjust pc_relative relocs to have zero in *r_offset. */
14951 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14952 addend = (input_section->output_section->vma
14953 + input_section->output_offset
14954 + rel->r_offset);
14955 }
14956 }
14957 break;
14958
14959 case R_PPC64_COPY:
14960 case R_PPC64_GLOB_DAT:
14961 case R_PPC64_JMP_SLOT:
14962 case R_PPC64_JMP_IREL:
14963 case R_PPC64_RELATIVE:
14964 /* We shouldn't ever see these dynamic relocs in relocatable
14965 files. */
14966 /* Fall through. */
14967
14968 case R_PPC64_PLTGOT16:
14969 case R_PPC64_PLTGOT16_DS:
14970 case R_PPC64_PLTGOT16_HA:
14971 case R_PPC64_PLTGOT16_HI:
14972 case R_PPC64_PLTGOT16_LO:
14973 case R_PPC64_PLTGOT16_LO_DS:
14974 case R_PPC64_PLTREL32:
14975 case R_PPC64_PLTREL64:
14976 /* These ones haven't been implemented yet. */
14977
14978 info->callbacks->einfo
14979 /* xgettext:c-format */
14980 (_("%P: %B: %s is not supported for `%T'\n"),
14981 input_bfd,
14982 ppc64_elf_howto_table[r_type]->name, sym_name);
14983
14984 bfd_set_error (bfd_error_invalid_operation);
14985 ret = FALSE;
14986 goto copy_reloc;
14987 }
14988
14989 /* Multi-instruction sequences that access the TOC can be
14990 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14991 to nop; addi rb,r2,x; */
14992 switch (r_type)
14993 {
14994 default:
14995 break;
14996
14997 case R_PPC64_GOT_TLSLD16_HI:
14998 case R_PPC64_GOT_TLSGD16_HI:
14999 case R_PPC64_GOT_TPREL16_HI:
15000 case R_PPC64_GOT_DTPREL16_HI:
15001 case R_PPC64_GOT16_HI:
15002 case R_PPC64_TOC16_HI:
15003 /* These relocs would only be useful if building up an
15004 offset to later add to r2, perhaps in an indexed
15005 addressing mode instruction. Don't try to optimize.
15006 Unfortunately, the possibility of someone building up an
15007 offset like this or even with the HA relocs, means that
15008 we need to check the high insn when optimizing the low
15009 insn. */
15010 break;
15011
15012 case R_PPC64_GOT_TLSLD16_HA:
15013 case R_PPC64_GOT_TLSGD16_HA:
15014 case R_PPC64_GOT_TPREL16_HA:
15015 case R_PPC64_GOT_DTPREL16_HA:
15016 case R_PPC64_GOT16_HA:
15017 case R_PPC64_TOC16_HA:
15018 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15019 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15020 {
15021 bfd_byte *p = contents + (rel->r_offset & ~3);
15022 bfd_put_32 (input_bfd, NOP, p);
15023 }
15024 break;
15025
15026 case R_PPC64_GOT_TLSLD16_LO:
15027 case R_PPC64_GOT_TLSGD16_LO:
15028 case R_PPC64_GOT_TPREL16_LO_DS:
15029 case R_PPC64_GOT_DTPREL16_LO_DS:
15030 case R_PPC64_GOT16_LO:
15031 case R_PPC64_GOT16_LO_DS:
15032 case R_PPC64_TOC16_LO:
15033 case R_PPC64_TOC16_LO_DS:
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 insn = bfd_get_32 (input_bfd, p);
15039 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15040 {
15041 /* Transform addic to addi when we change reg. */
15042 insn &= ~((0x3f << 26) | (0x1f << 16));
15043 insn |= (14u << 26) | (2 << 16);
15044 }
15045 else
15046 {
15047 insn &= ~(0x1f << 16);
15048 insn |= 2 << 16;
15049 }
15050 bfd_put_32 (input_bfd, insn, p);
15051 }
15052 break;
15053 }
15054
15055 /* Do any further special processing. */
15056 howto = ppc64_elf_howto_table[(int) r_type];
15057 switch (r_type)
15058 {
15059 default:
15060 break;
15061
15062 case R_PPC64_REL16_HA:
15063 case R_PPC64_REL16DX_HA:
15064 case R_PPC64_ADDR16_HA:
15065 case R_PPC64_ADDR16_HIGHA:
15066 case R_PPC64_ADDR16_HIGHERA:
15067 case R_PPC64_ADDR16_HIGHESTA:
15068 case R_PPC64_TOC16_HA:
15069 case R_PPC64_SECTOFF_HA:
15070 case R_PPC64_TPREL16_HA:
15071 case R_PPC64_TPREL16_HIGHA:
15072 case R_PPC64_TPREL16_HIGHERA:
15073 case R_PPC64_TPREL16_HIGHESTA:
15074 case R_PPC64_DTPREL16_HA:
15075 case R_PPC64_DTPREL16_HIGHA:
15076 case R_PPC64_DTPREL16_HIGHERA:
15077 case R_PPC64_DTPREL16_HIGHESTA:
15078 /* It's just possible that this symbol is a weak symbol
15079 that's not actually defined anywhere. In that case,
15080 'sec' would be NULL, and we should leave the symbol
15081 alone (it will be set to zero elsewhere in the link). */
15082 if (sec == NULL)
15083 break;
15084 /* Fall through. */
15085
15086 case R_PPC64_GOT16_HA:
15087 case R_PPC64_PLTGOT16_HA:
15088 case R_PPC64_PLT16_HA:
15089 case R_PPC64_GOT_TLSGD16_HA:
15090 case R_PPC64_GOT_TLSLD16_HA:
15091 case R_PPC64_GOT_TPREL16_HA:
15092 case R_PPC64_GOT_DTPREL16_HA:
15093 /* Add 0x10000 if sign bit in 0:15 is set.
15094 Bits 0:15 are not used. */
15095 addend += 0x8000;
15096 break;
15097
15098 case R_PPC64_ADDR16_DS:
15099 case R_PPC64_ADDR16_LO_DS:
15100 case R_PPC64_GOT16_DS:
15101 case R_PPC64_GOT16_LO_DS:
15102 case R_PPC64_PLT16_LO_DS:
15103 case R_PPC64_SECTOFF_DS:
15104 case R_PPC64_SECTOFF_LO_DS:
15105 case R_PPC64_TOC16_DS:
15106 case R_PPC64_TOC16_LO_DS:
15107 case R_PPC64_PLTGOT16_DS:
15108 case R_PPC64_PLTGOT16_LO_DS:
15109 case R_PPC64_GOT_TPREL16_DS:
15110 case R_PPC64_GOT_TPREL16_LO_DS:
15111 case R_PPC64_GOT_DTPREL16_DS:
15112 case R_PPC64_GOT_DTPREL16_LO_DS:
15113 case R_PPC64_TPREL16_DS:
15114 case R_PPC64_TPREL16_LO_DS:
15115 case R_PPC64_DTPREL16_DS:
15116 case R_PPC64_DTPREL16_LO_DS:
15117 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15118 mask = 3;
15119 /* If this reloc is against an lq, lxv, or stxv insn, then
15120 the value must be a multiple of 16. This is somewhat of
15121 a hack, but the "correct" way to do this by defining _DQ
15122 forms of all the _DS relocs bloats all reloc switches in
15123 this file. It doesn't make much sense to use these
15124 relocs in data, so testing the insn should be safe. */
15125 if ((insn & (0x3f << 26)) == (56u << 26)
15126 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
15127 mask = 15;
15128 relocation += addend;
15129 addend = insn & (mask ^ 3);
15130 if ((relocation & mask) != 0)
15131 {
15132 relocation ^= relocation & mask;
15133 info->callbacks->einfo
15134 /* xgettext:c-format */
15135 (_("%P: %H: error: %s not a multiple of %u\n"),
15136 input_bfd, input_section, rel->r_offset,
15137 howto->name,
15138 mask + 1);
15139 bfd_set_error (bfd_error_bad_value);
15140 ret = FALSE;
15141 goto copy_reloc;
15142 }
15143 break;
15144 }
15145
15146 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15147 because such sections are not SEC_ALLOC and thus ld.so will
15148 not process them. */
15149 if (unresolved_reloc
15150 && !((input_section->flags & SEC_DEBUGGING) != 0
15151 && h->elf.def_dynamic)
15152 && _bfd_elf_section_offset (output_bfd, info, input_section,
15153 rel->r_offset) != (bfd_vma) -1)
15154 {
15155 info->callbacks->einfo
15156 /* xgettext:c-format */
15157 (_("%P: %H: unresolvable %s against `%T'\n"),
15158 input_bfd, input_section, rel->r_offset,
15159 howto->name,
15160 h->elf.root.root.string);
15161 ret = FALSE;
15162 }
15163
15164 /* 16-bit fields in insns mostly have signed values, but a
15165 few insns have 16-bit unsigned values. Really, we should
15166 have different reloc types. */
15167 if (howto->complain_on_overflow != complain_overflow_dont
15168 && howto->dst_mask == 0xffff
15169 && (input_section->flags & SEC_CODE) != 0)
15170 {
15171 enum complain_overflow complain = complain_overflow_signed;
15172
15173 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15174 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15175 complain = complain_overflow_bitfield;
15176 else if (howto->rightshift == 0
15177 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15178 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15179 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15180 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15181 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15182 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
15183 complain = complain_overflow_unsigned;
15184 if (howto->complain_on_overflow != complain)
15185 {
15186 alt_howto = *howto;
15187 alt_howto.complain_on_overflow = complain;
15188 howto = &alt_howto;
15189 }
15190 }
15191
15192 if (r_type == R_PPC64_REL16DX_HA)
15193 {
15194 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15195 if (rel->r_offset + 4 > input_section->size)
15196 r = bfd_reloc_outofrange;
15197 else
15198 {
15199 relocation += addend;
15200 relocation -= (rel->r_offset
15201 + input_section->output_offset
15202 + input_section->output_section->vma);
15203 relocation = (bfd_signed_vma) relocation >> 16;
15204 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15205 insn &= ~0x1fffc1;
15206 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
15207 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15208 r = bfd_reloc_ok;
15209 if (relocation + 0x8000 > 0xffff)
15210 r = bfd_reloc_overflow;
15211 }
15212 }
15213 else
15214 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15215 rel->r_offset, relocation, addend);
15216
15217 if (r != bfd_reloc_ok)
15218 {
15219 char *more_info = NULL;
15220 const char *reloc_name = howto->name;
15221
15222 if (reloc_dest != DEST_NORMAL)
15223 {
15224 more_info = bfd_malloc (strlen (reloc_name) + 8);
15225 if (more_info != NULL)
15226 {
15227 strcpy (more_info, reloc_name);
15228 strcat (more_info, (reloc_dest == DEST_OPD
15229 ? " (OPD)" : " (stub)"));
15230 reloc_name = more_info;
15231 }
15232 }
15233
15234 if (r == bfd_reloc_overflow)
15235 {
15236 /* On code like "if (foo) foo();" don't report overflow
15237 on a branch to zero when foo is undefined. */
15238 if (!warned
15239 && (reloc_dest == DEST_STUB
15240 || !(h != NULL
15241 && (h->elf.root.type == bfd_link_hash_undefweak
15242 || h->elf.root.type == bfd_link_hash_undefined)
15243 && is_branch_reloc (r_type))))
15244 info->callbacks->reloc_overflow (info, &h->elf.root,
15245 sym_name, reloc_name,
15246 orig_rel.r_addend,
15247 input_bfd, input_section,
15248 rel->r_offset);
15249 }
15250 else
15251 {
15252 info->callbacks->einfo
15253 /* xgettext:c-format */
15254 (_("%P: %H: %s against `%T': error %d\n"),
15255 input_bfd, input_section, rel->r_offset,
15256 reloc_name, sym_name, (int) r);
15257 ret = FALSE;
15258 }
15259 if (more_info != NULL)
15260 free (more_info);
15261 }
15262 copy_reloc:
15263 if (wrel != rel)
15264 *wrel = *rel;
15265 }
15266
15267 if (wrel != rel)
15268 {
15269 Elf_Internal_Shdr *rel_hdr;
15270 size_t deleted = rel - wrel;
15271
15272 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15273 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15274 if (rel_hdr->sh_size == 0)
15275 {
15276 /* It is too late to remove an empty reloc section. Leave
15277 one NONE reloc.
15278 ??? What is wrong with an empty section??? */
15279 rel_hdr->sh_size = rel_hdr->sh_entsize;
15280 deleted -= 1;
15281 }
15282 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15283 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15284 input_section->reloc_count -= deleted;
15285 }
15286
15287 /* If we're emitting relocations, then shortly after this function
15288 returns, reloc offsets and addends for this section will be
15289 adjusted. Worse, reloc symbol indices will be for the output
15290 file rather than the input. Save a copy of the relocs for
15291 opd_entry_value. */
15292 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
15293 {
15294 bfd_size_type amt;
15295 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15296 rel = bfd_alloc (input_bfd, amt);
15297 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15298 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
15299 if (rel == NULL)
15300 return FALSE;
15301 memcpy (rel, relocs, amt);
15302 }
15303 return ret;
15304 }
15305
15306 /* Adjust the value of any local symbols in opd sections. */
15307
15308 static int
15309 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
15310 const char *name ATTRIBUTE_UNUSED,
15311 Elf_Internal_Sym *elfsym,
15312 asection *input_sec,
15313 struct elf_link_hash_entry *h)
15314 {
15315 struct _opd_sec_data *opd;
15316 long adjust;
15317 bfd_vma value;
15318
15319 if (h != NULL)
15320 return 1;
15321
15322 opd = get_opd_info (input_sec);
15323 if (opd == NULL || opd->adjust == NULL)
15324 return 1;
15325
15326 value = elfsym->st_value - input_sec->output_offset;
15327 if (!bfd_link_relocatable (info))
15328 value -= input_sec->output_section->vma;
15329
15330 adjust = opd->adjust[OPD_NDX (value)];
15331 if (adjust == -1)
15332 return 2;
15333
15334 elfsym->st_value += adjust;
15335 return 1;
15336 }
15337
15338 /* Finish up dynamic symbol handling. We set the contents of various
15339 dynamic sections here. */
15340
15341 static bfd_boolean
15342 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
15343 struct bfd_link_info *info,
15344 struct elf_link_hash_entry *h,
15345 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
15346 {
15347 struct ppc_link_hash_table *htab;
15348 struct plt_entry *ent;
15349 Elf_Internal_Rela rela;
15350 bfd_byte *loc;
15351
15352 htab = ppc_hash_table (info);
15353 if (htab == NULL)
15354 return FALSE;
15355
15356 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
15357 if (ent->plt.offset != (bfd_vma) -1)
15358 {
15359 /* This symbol has an entry in the procedure linkage
15360 table. Set it up. */
15361 if (!htab->elf.dynamic_sections_created
15362 || h->dynindx == -1)
15363 {
15364 BFD_ASSERT (h->type == STT_GNU_IFUNC
15365 && h->def_regular
15366 && (h->root.type == bfd_link_hash_defined
15367 || h->root.type == bfd_link_hash_defweak));
15368 rela.r_offset = (htab->elf.iplt->output_section->vma
15369 + htab->elf.iplt->output_offset
15370 + ent->plt.offset);
15371 if (htab->opd_abi)
15372 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
15373 else
15374 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15375 rela.r_addend = (h->root.u.def.value
15376 + h->root.u.def.section->output_offset
15377 + h->root.u.def.section->output_section->vma
15378 + ent->addend);
15379 loc = (htab->elf.irelplt->contents
15380 + (htab->elf.irelplt->reloc_count++
15381 * sizeof (Elf64_External_Rela)));
15382 }
15383 else
15384 {
15385 rela.r_offset = (htab->elf.splt->output_section->vma
15386 + htab->elf.splt->output_offset
15387 + ent->plt.offset);
15388 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
15389 rela.r_addend = ent->addend;
15390 loc = (htab->elf.srelplt->contents
15391 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
15392 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
15393 }
15394 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15395
15396 if (!htab->opd_abi)
15397 {
15398 if (!h->def_regular)
15399 {
15400 /* Mark the symbol as undefined, rather than as
15401 defined in glink. Leave the value if there were
15402 any relocations where pointer equality matters
15403 (this is a clue for the dynamic linker, to make
15404 function pointer comparisons work between an
15405 application and shared library), otherwise set it
15406 to zero. */
15407 sym->st_shndx = SHN_UNDEF;
15408 if (!h->pointer_equality_needed)
15409 sym->st_value = 0;
15410 else if (!h->ref_regular_nonweak)
15411 {
15412 /* This breaks function pointer comparisons, but
15413 that is better than breaking tests for a NULL
15414 function pointer. */
15415 sym->st_value = 0;
15416 }
15417 }
15418 }
15419 }
15420
15421 if (h->needs_copy)
15422 {
15423 /* This symbol needs a copy reloc. Set it up. */
15424
15425 if (h->dynindx == -1
15426 || (h->root.type != bfd_link_hash_defined
15427 && h->root.type != bfd_link_hash_defweak)
15428 || htab->elf.srelbss == NULL)
15429 abort ();
15430
15431 rela.r_offset = (h->root.u.def.value
15432 + h->root.u.def.section->output_section->vma
15433 + h->root.u.def.section->output_offset);
15434 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
15435 rela.r_addend = 0;
15436 loc = htab->elf.srelbss->contents;
15437 loc += htab->elf.srelbss->reloc_count++ * sizeof (Elf64_External_Rela);
15438 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15439 }
15440
15441 return TRUE;
15442 }
15443
15444 /* Used to decide how to sort relocs in an optimal manner for the
15445 dynamic linker, before writing them out. */
15446
15447 static enum elf_reloc_type_class
15448 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
15449 const asection *rel_sec,
15450 const Elf_Internal_Rela *rela)
15451 {
15452 enum elf_ppc64_reloc_type r_type;
15453 struct ppc_link_hash_table *htab = ppc_hash_table (info);
15454
15455 if (rel_sec == htab->elf.irelplt)
15456 return reloc_class_ifunc;
15457
15458 r_type = ELF64_R_TYPE (rela->r_info);
15459 switch (r_type)
15460 {
15461 case R_PPC64_RELATIVE:
15462 return reloc_class_relative;
15463 case R_PPC64_JMP_SLOT:
15464 return reloc_class_plt;
15465 case R_PPC64_COPY:
15466 return reloc_class_copy;
15467 default:
15468 return reloc_class_normal;
15469 }
15470 }
15471
15472 /* Finish up the dynamic sections. */
15473
15474 static bfd_boolean
15475 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
15476 struct bfd_link_info *info)
15477 {
15478 struct ppc_link_hash_table *htab;
15479 bfd *dynobj;
15480 asection *sdyn;
15481
15482 htab = ppc_hash_table (info);
15483 if (htab == NULL)
15484 return FALSE;
15485
15486 dynobj = htab->elf.dynobj;
15487 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
15488
15489 if (htab->elf.dynamic_sections_created)
15490 {
15491 Elf64_External_Dyn *dyncon, *dynconend;
15492
15493 if (sdyn == NULL || htab->elf.sgot == NULL)
15494 abort ();
15495
15496 dyncon = (Elf64_External_Dyn *) sdyn->contents;
15497 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
15498 for (; dyncon < dynconend; dyncon++)
15499 {
15500 Elf_Internal_Dyn dyn;
15501 asection *s;
15502
15503 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
15504
15505 switch (dyn.d_tag)
15506 {
15507 default:
15508 continue;
15509
15510 case DT_PPC64_GLINK:
15511 s = htab->glink;
15512 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15513 /* We stupidly defined DT_PPC64_GLINK to be the start
15514 of glink rather than the first entry point, which is
15515 what ld.so needs, and now have a bigger stub to
15516 support automatic multiple TOCs. */
15517 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
15518 break;
15519
15520 case DT_PPC64_OPD:
15521 s = bfd_get_section_by_name (output_bfd, ".opd");
15522 if (s == NULL)
15523 continue;
15524 dyn.d_un.d_ptr = s->vma;
15525 break;
15526
15527 case DT_PPC64_OPT:
15528 if (htab->do_multi_toc && htab->multi_toc_needed)
15529 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
15530 break;
15531
15532 case DT_PPC64_OPDSZ:
15533 s = bfd_get_section_by_name (output_bfd, ".opd");
15534 if (s == NULL)
15535 continue;
15536 dyn.d_un.d_val = s->size;
15537 break;
15538
15539 case DT_PLTGOT:
15540 s = htab->elf.splt;
15541 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15542 break;
15543
15544 case DT_JMPREL:
15545 s = htab->elf.srelplt;
15546 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15547 break;
15548
15549 case DT_PLTRELSZ:
15550 dyn.d_un.d_val = htab->elf.srelplt->size;
15551 break;
15552 }
15553
15554 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
15555 }
15556 }
15557
15558 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
15559 {
15560 /* Fill in the first entry in the global offset table.
15561 We use it to hold the link-time TOCbase. */
15562 bfd_put_64 (output_bfd,
15563 elf_gp (output_bfd) + TOC_BASE_OFF,
15564 htab->elf.sgot->contents);
15565
15566 /* Set .got entry size. */
15567 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
15568 }
15569
15570 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
15571 {
15572 /* Set .plt entry size. */
15573 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
15574 = PLT_ENTRY_SIZE (htab);
15575 }
15576
15577 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15578 brlt ourselves if emitrelocations. */
15579 if (htab->brlt != NULL
15580 && htab->brlt->reloc_count != 0
15581 && !_bfd_elf_link_output_relocs (output_bfd,
15582 htab->brlt,
15583 elf_section_data (htab->brlt)->rela.hdr,
15584 elf_section_data (htab->brlt)->relocs,
15585 NULL))
15586 return FALSE;
15587
15588 if (htab->glink != NULL
15589 && htab->glink->reloc_count != 0
15590 && !_bfd_elf_link_output_relocs (output_bfd,
15591 htab->glink,
15592 elf_section_data (htab->glink)->rela.hdr,
15593 elf_section_data (htab->glink)->relocs,
15594 NULL))
15595 return FALSE;
15596
15597 if (htab->glink_eh_frame != NULL
15598 && htab->glink_eh_frame->size != 0)
15599 {
15600 bfd_vma val;
15601 bfd_byte *p;
15602 asection *stub_sec;
15603
15604 p = htab->glink_eh_frame->contents + sizeof (glink_eh_frame_cie);
15605 for (stub_sec = htab->params->stub_bfd->sections;
15606 stub_sec != NULL;
15607 stub_sec = stub_sec->next)
15608 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
15609 {
15610 /* FDE length. */
15611 p += 4;
15612 /* CIE pointer. */
15613 p += 4;
15614 /* Offset to stub section. */
15615 val = (stub_sec->output_section->vma
15616 + stub_sec->output_offset);
15617 val -= (htab->glink_eh_frame->output_section->vma
15618 + htab->glink_eh_frame->output_offset
15619 + (p - htab->glink_eh_frame->contents));
15620 if (val + 0x80000000 > 0xffffffff)
15621 {
15622 info->callbacks->einfo
15623 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15624 stub_sec->name);
15625 return FALSE;
15626 }
15627 bfd_put_32 (dynobj, val, p);
15628 p += 4;
15629 /* stub section size. */
15630 p += 4;
15631 /* Augmentation. */
15632 p += 1;
15633 /* Pad. */
15634 p += 7;
15635 }
15636 if (htab->glink != NULL && htab->glink->size != 0)
15637 {
15638 /* FDE length. */
15639 p += 4;
15640 /* CIE pointer. */
15641 p += 4;
15642 /* Offset to .glink. */
15643 val = (htab->glink->output_section->vma
15644 + htab->glink->output_offset
15645 + 8);
15646 val -= (htab->glink_eh_frame->output_section->vma
15647 + htab->glink_eh_frame->output_offset
15648 + (p - htab->glink_eh_frame->contents));
15649 if (val + 0x80000000 > 0xffffffff)
15650 {
15651 info->callbacks->einfo
15652 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15653 htab->glink->name);
15654 return FALSE;
15655 }
15656 bfd_put_32 (dynobj, val, p);
15657 p += 4;
15658 /* .glink size. */
15659 p += 4;
15660 /* Augmentation. */
15661 p += 1;
15662 /* Ops. */
15663 p += 7;
15664 }
15665
15666 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
15667 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15668 htab->glink_eh_frame,
15669 htab->glink_eh_frame->contents))
15670 return FALSE;
15671 }
15672
15673 /* We need to handle writing out multiple GOT sections ourselves,
15674 since we didn't add them to DYNOBJ. We know dynobj is the first
15675 bfd. */
15676 while ((dynobj = dynobj->link.next) != NULL)
15677 {
15678 asection *s;
15679
15680 if (!is_ppc64_elf (dynobj))
15681 continue;
15682
15683 s = ppc64_elf_tdata (dynobj)->got;
15684 if (s != NULL
15685 && s->size != 0
15686 && s->output_section != bfd_abs_section_ptr
15687 && !bfd_set_section_contents (output_bfd, s->output_section,
15688 s->contents, s->output_offset,
15689 s->size))
15690 return FALSE;
15691 s = ppc64_elf_tdata (dynobj)->relgot;
15692 if (s != NULL
15693 && s->size != 0
15694 && s->output_section != bfd_abs_section_ptr
15695 && !bfd_set_section_contents (output_bfd, s->output_section,
15696 s->contents, s->output_offset,
15697 s->size))
15698 return FALSE;
15699 }
15700
15701 return TRUE;
15702 }
15703
15704 #include "elf64-target.h"
15705
15706 /* FreeBSD support */
15707
15708 #undef TARGET_LITTLE_SYM
15709 #undef TARGET_LITTLE_NAME
15710
15711 #undef TARGET_BIG_SYM
15712 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
15713 #undef TARGET_BIG_NAME
15714 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15715
15716 #undef ELF_OSABI
15717 #define ELF_OSABI ELFOSABI_FREEBSD
15718
15719 #undef elf64_bed
15720 #define elf64_bed elf64_powerpc_fbsd_bed
15721
15722 #include "elf64-target.h"
15723
This page took 0.548758 seconds and 4 git commands to generate.