9472f7b2b4dabcb8dc4fb04587b6fc598136349b
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2018 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_want_dynrelro 1
76 #define elf_backend_can_gc_sections 1
77 #define elf_backend_can_refcount 1
78 #define elf_backend_rela_normal 1
79 #define elf_backend_dtrel_excludes_plt 1
80 #define elf_backend_default_execstack 0
81
82 #define bfd_elf64_mkobject ppc64_elf_mkobject
83 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
84 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
85 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
86 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
87 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
88 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
89 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
90 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
91 #define bfd_elf64_bfd_gc_sections ppc64_elf_gc_sections
92
93 #define elf_backend_object_p ppc64_elf_object_p
94 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
95 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
96 #define elf_backend_write_core_note ppc64_elf_write_core_note
97 #define elf_backend_create_dynamic_sections _bfd_elf_create_dynamic_sections
98 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
99 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
100 #define elf_backend_check_directives ppc64_elf_before_check_relocs
101 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
102 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
103 #define elf_backend_check_relocs ppc64_elf_check_relocs
104 #define elf_backend_relocs_compatible _bfd_elf_relocs_compatible
105 #define elf_backend_gc_keep ppc64_elf_gc_keep
106 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
107 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
108 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
109 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
110 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
111 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
112 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
113 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
114 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
115 #define elf_backend_action_discarded ppc64_elf_action_discarded
116 #define elf_backend_relocate_section ppc64_elf_relocate_section
117 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
118 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
119 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
120 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
121 #define elf_backend_special_sections ppc64_elf_special_sections
122 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
123 #define elf_backend_merge_symbol ppc64_elf_merge_symbol
124 #define elf_backend_get_reloc_section bfd_get_section_by_name
125
126 /* The name of the dynamic interpreter. This is put in the .interp
127 section. */
128 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
129
130 /* The size in bytes of an entry in the procedure linkage table. */
131 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
132 #define LOCAL_PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 16 : 8)
133
134 /* The initial size of the plt reserved for the dynamic linker. */
135 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
136
137 /* Offsets to some stack save slots. */
138 #define STK_LR 16
139 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
140 /* This one is dodgy. ELFv2 does not have a linker word, so use the
141 CR save slot. Used only by optimised __tls_get_addr call stub,
142 relying on __tls_get_addr_opt not saving CR.. */
143 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
144
145 /* TOC base pointers offset from start of TOC. */
146 #define TOC_BASE_OFF 0x8000
147 /* TOC base alignment. */
148 #define TOC_BASE_ALIGN 256
149
150 /* Offset of tp and dtp pointers from start of TLS block. */
151 #define TP_OFFSET 0x7000
152 #define DTP_OFFSET 0x8000
153
154 /* .plt call stub instructions. The normal stub is like this, but
155 sometimes the .plt entry crosses a 64k boundary and we need to
156 insert an addi to adjust r11. */
157 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
158 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
159 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
160 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
161 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
162 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
163 #define BCTR 0x4e800420 /* bctr */
164
165 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
166 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
167 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
168
169 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
170 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
171 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
172 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
173 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
174 #define BNECTR 0x4ca20420 /* bnectr+ */
175 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
176
177 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
178 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
179 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
180
181 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
182 #define LD_R2_0R12 0xe84c0000 /* ld %r2,0(%r12) */
183 #define ADD_R2_R2_R12 0x7c426214 /* add %r2,%r2,%r12 */
184
185 #define LIS_R2 0x3c400000 /* lis %r2,xxx@ha */
186 #define ADDIS_R2_R12 0x3c4c0000 /* addis %r2,%r12,xxx@ha */
187 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
188 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
189 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
190
191 /* __glink_PLTresolve stub instructions. We enter with the index in R0. */
192 #define GLINK_PLTRESOLVE_SIZE(htab) \
193 (8u + (htab->opd_abi ? 11 * 4 : 14 * 4))
194 /* 0: */
195 /* .quad plt0-1f */
196 /* __glink: */
197 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
198 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
199 /* 1: */
200 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
201 /* ld %2,(0b-1b)(%11) */
202 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
203 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
204 /* ld %12,0(%11) */
205 /* ld %2,8(%11) */
206 /* mtctr %12 */
207 /* ld %11,16(%11) */
208 /* bctr */
209 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
210 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
211 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
212 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
213 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
214
215 /* Pad with this. */
216 #define NOP 0x60000000
217
218 /* Some other nops. */
219 #define CROR_151515 0x4def7b82
220 #define CROR_313131 0x4ffffb82
221
222 /* .glink entries for the first 32k functions are two instructions. */
223 #define LI_R0_0 0x38000000 /* li %r0,0 */
224 #define B_DOT 0x48000000 /* b . */
225
226 /* After that, we need two instructions to load the index, followed by
227 a branch. */
228 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
229 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
230
231 /* Instructions used by the save and restore reg functions. */
232 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
233 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
234 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
235 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
236 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
237 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
238 #define LI_R12_0 0x39800000 /* li %r12,0 */
239 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
240 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
241 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
242 #define BLR 0x4e800020 /* blr */
243
244 /* Since .opd is an array of descriptors and each entry will end up
245 with identical R_PPC64_RELATIVE relocs, there is really no need to
246 propagate .opd relocs; The dynamic linker should be taught to
247 relocate .opd without reloc entries. */
248 #ifndef NO_OPD_RELOCS
249 #define NO_OPD_RELOCS 0
250 #endif
251
252 #ifndef ARRAY_SIZE
253 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
254 #endif
255
256 static inline int
257 abiversion (bfd *abfd)
258 {
259 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
260 }
261
262 static inline void
263 set_abiversion (bfd *abfd, int ver)
264 {
265 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
266 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
267 }
268 \f
269 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
270
271 /* Relocation HOWTO's. */
272 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
273
274 static reloc_howto_type ppc64_elf_howto_raw[] =
275 {
276 /* This reloc does nothing. */
277 HOWTO (R_PPC64_NONE, /* type */
278 0, /* rightshift */
279 3, /* size (0 = byte, 1 = short, 2 = long) */
280 0, /* bitsize */
281 FALSE, /* pc_relative */
282 0, /* bitpos */
283 complain_overflow_dont, /* complain_on_overflow */
284 bfd_elf_generic_reloc, /* special_function */
285 "R_PPC64_NONE", /* name */
286 FALSE, /* partial_inplace */
287 0, /* src_mask */
288 0, /* dst_mask */
289 FALSE), /* pcrel_offset */
290
291 /* A standard 32 bit relocation. */
292 HOWTO (R_PPC64_ADDR32, /* type */
293 0, /* rightshift */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
295 32, /* bitsize */
296 FALSE, /* pc_relative */
297 0, /* bitpos */
298 complain_overflow_bitfield, /* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_PPC64_ADDR32", /* name */
301 FALSE, /* partial_inplace */
302 0, /* src_mask */
303 0xffffffff, /* dst_mask */
304 FALSE), /* pcrel_offset */
305
306 /* An absolute 26 bit branch; the lower two bits must be zero.
307 FIXME: we don't check that, we just clear them. */
308 HOWTO (R_PPC64_ADDR24, /* type */
309 0, /* rightshift */
310 2, /* size (0 = byte, 1 = short, 2 = long) */
311 26, /* bitsize */
312 FALSE, /* pc_relative */
313 0, /* bitpos */
314 complain_overflow_bitfield, /* complain_on_overflow */
315 bfd_elf_generic_reloc, /* special_function */
316 "R_PPC64_ADDR24", /* name */
317 FALSE, /* partial_inplace */
318 0, /* src_mask */
319 0x03fffffc, /* dst_mask */
320 FALSE), /* pcrel_offset */
321
322 /* A standard 16 bit relocation. */
323 HOWTO (R_PPC64_ADDR16, /* type */
324 0, /* rightshift */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
326 16, /* bitsize */
327 FALSE, /* pc_relative */
328 0, /* bitpos */
329 complain_overflow_bitfield, /* complain_on_overflow */
330 bfd_elf_generic_reloc, /* special_function */
331 "R_PPC64_ADDR16", /* name */
332 FALSE, /* partial_inplace */
333 0, /* src_mask */
334 0xffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
336
337 /* A 16 bit relocation without overflow. */
338 HOWTO (R_PPC64_ADDR16_LO, /* type */
339 0, /* rightshift */
340 1, /* size (0 = byte, 1 = short, 2 = long) */
341 16, /* bitsize */
342 FALSE, /* pc_relative */
343 0, /* bitpos */
344 complain_overflow_dont,/* complain_on_overflow */
345 bfd_elf_generic_reloc, /* special_function */
346 "R_PPC64_ADDR16_LO", /* name */
347 FALSE, /* partial_inplace */
348 0, /* src_mask */
349 0xffff, /* dst_mask */
350 FALSE), /* pcrel_offset */
351
352 /* Bits 16-31 of an address. */
353 HOWTO (R_PPC64_ADDR16_HI, /* type */
354 16, /* rightshift */
355 1, /* size (0 = byte, 1 = short, 2 = long) */
356 16, /* bitsize */
357 FALSE, /* pc_relative */
358 0, /* bitpos */
359 complain_overflow_signed, /* complain_on_overflow */
360 bfd_elf_generic_reloc, /* special_function */
361 "R_PPC64_ADDR16_HI", /* name */
362 FALSE, /* partial_inplace */
363 0, /* src_mask */
364 0xffff, /* dst_mask */
365 FALSE), /* pcrel_offset */
366
367 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
368 bits, treated as a signed number, is negative. */
369 HOWTO (R_PPC64_ADDR16_HA, /* type */
370 16, /* rightshift */
371 1, /* size (0 = byte, 1 = short, 2 = long) */
372 16, /* bitsize */
373 FALSE, /* pc_relative */
374 0, /* bitpos */
375 complain_overflow_signed, /* complain_on_overflow */
376 ppc64_elf_ha_reloc, /* special_function */
377 "R_PPC64_ADDR16_HA", /* name */
378 FALSE, /* partial_inplace */
379 0, /* src_mask */
380 0xffff, /* dst_mask */
381 FALSE), /* pcrel_offset */
382
383 /* An absolute 16 bit branch; the lower two bits must be zero.
384 FIXME: we don't check that, we just clear them. */
385 HOWTO (R_PPC64_ADDR14, /* type */
386 0, /* rightshift */
387 2, /* size (0 = byte, 1 = short, 2 = long) */
388 16, /* bitsize */
389 FALSE, /* pc_relative */
390 0, /* bitpos */
391 complain_overflow_signed, /* complain_on_overflow */
392 ppc64_elf_branch_reloc, /* special_function */
393 "R_PPC64_ADDR14", /* name */
394 FALSE, /* partial_inplace */
395 0, /* src_mask */
396 0x0000fffc, /* dst_mask */
397 FALSE), /* pcrel_offset */
398
399 /* An absolute 16 bit branch, for which bit 10 should be set to
400 indicate that the branch is expected to be taken. The lower two
401 bits must be zero. */
402 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
403 0, /* rightshift */
404 2, /* size (0 = byte, 1 = short, 2 = long) */
405 16, /* bitsize */
406 FALSE, /* pc_relative */
407 0, /* bitpos */
408 complain_overflow_signed, /* complain_on_overflow */
409 ppc64_elf_brtaken_reloc, /* special_function */
410 "R_PPC64_ADDR14_BRTAKEN",/* name */
411 FALSE, /* partial_inplace */
412 0, /* src_mask */
413 0x0000fffc, /* dst_mask */
414 FALSE), /* pcrel_offset */
415
416 /* An absolute 16 bit branch, for which bit 10 should be set to
417 indicate that the branch is not expected to be taken. The lower
418 two bits must be zero. */
419 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
420 0, /* rightshift */
421 2, /* size (0 = byte, 1 = short, 2 = long) */
422 16, /* bitsize */
423 FALSE, /* pc_relative */
424 0, /* bitpos */
425 complain_overflow_signed, /* complain_on_overflow */
426 ppc64_elf_brtaken_reloc, /* special_function */
427 "R_PPC64_ADDR14_BRNTAKEN",/* name */
428 FALSE, /* partial_inplace */
429 0, /* src_mask */
430 0x0000fffc, /* dst_mask */
431 FALSE), /* pcrel_offset */
432
433 /* A relative 26 bit branch; the lower two bits must be zero. */
434 HOWTO (R_PPC64_REL24, /* type */
435 0, /* rightshift */
436 2, /* size (0 = byte, 1 = short, 2 = long) */
437 26, /* bitsize */
438 TRUE, /* pc_relative */
439 0, /* bitpos */
440 complain_overflow_signed, /* complain_on_overflow */
441 ppc64_elf_branch_reloc, /* special_function */
442 "R_PPC64_REL24", /* name */
443 FALSE, /* partial_inplace */
444 0, /* src_mask */
445 0x03fffffc, /* dst_mask */
446 TRUE), /* pcrel_offset */
447
448 /* A relative 16 bit branch; the lower two bits must be zero. */
449 HOWTO (R_PPC64_REL14, /* type */
450 0, /* rightshift */
451 2, /* size (0 = byte, 1 = short, 2 = long) */
452 16, /* bitsize */
453 TRUE, /* pc_relative */
454 0, /* bitpos */
455 complain_overflow_signed, /* complain_on_overflow */
456 ppc64_elf_branch_reloc, /* special_function */
457 "R_PPC64_REL14", /* name */
458 FALSE, /* partial_inplace */
459 0, /* src_mask */
460 0x0000fffc, /* dst_mask */
461 TRUE), /* pcrel_offset */
462
463 /* A relative 16 bit branch. Bit 10 should be set to indicate that
464 the branch is expected to be taken. The lower two bits must be
465 zero. */
466 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
467 0, /* rightshift */
468 2, /* size (0 = byte, 1 = short, 2 = long) */
469 16, /* bitsize */
470 TRUE, /* pc_relative */
471 0, /* bitpos */
472 complain_overflow_signed, /* complain_on_overflow */
473 ppc64_elf_brtaken_reloc, /* special_function */
474 "R_PPC64_REL14_BRTAKEN", /* name */
475 FALSE, /* partial_inplace */
476 0, /* src_mask */
477 0x0000fffc, /* dst_mask */
478 TRUE), /* pcrel_offset */
479
480 /* A relative 16 bit branch. Bit 10 should be set to indicate that
481 the branch is not expected to be taken. The lower two bits must
482 be zero. */
483 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
484 0, /* rightshift */
485 2, /* size (0 = byte, 1 = short, 2 = long) */
486 16, /* bitsize */
487 TRUE, /* pc_relative */
488 0, /* bitpos */
489 complain_overflow_signed, /* complain_on_overflow */
490 ppc64_elf_brtaken_reloc, /* special_function */
491 "R_PPC64_REL14_BRNTAKEN",/* name */
492 FALSE, /* partial_inplace */
493 0, /* src_mask */
494 0x0000fffc, /* dst_mask */
495 TRUE), /* pcrel_offset */
496
497 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
498 symbol. */
499 HOWTO (R_PPC64_GOT16, /* type */
500 0, /* rightshift */
501 1, /* size (0 = byte, 1 = short, 2 = long) */
502 16, /* bitsize */
503 FALSE, /* pc_relative */
504 0, /* bitpos */
505 complain_overflow_signed, /* complain_on_overflow */
506 ppc64_elf_unhandled_reloc, /* special_function */
507 "R_PPC64_GOT16", /* name */
508 FALSE, /* partial_inplace */
509 0, /* src_mask */
510 0xffff, /* dst_mask */
511 FALSE), /* pcrel_offset */
512
513 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
514 the symbol. */
515 HOWTO (R_PPC64_GOT16_LO, /* type */
516 0, /* rightshift */
517 1, /* size (0 = byte, 1 = short, 2 = long) */
518 16, /* bitsize */
519 FALSE, /* pc_relative */
520 0, /* bitpos */
521 complain_overflow_dont, /* complain_on_overflow */
522 ppc64_elf_unhandled_reloc, /* special_function */
523 "R_PPC64_GOT16_LO", /* name */
524 FALSE, /* partial_inplace */
525 0, /* src_mask */
526 0xffff, /* dst_mask */
527 FALSE), /* pcrel_offset */
528
529 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
530 the symbol. */
531 HOWTO (R_PPC64_GOT16_HI, /* type */
532 16, /* rightshift */
533 1, /* size (0 = byte, 1 = short, 2 = long) */
534 16, /* bitsize */
535 FALSE, /* pc_relative */
536 0, /* bitpos */
537 complain_overflow_signed,/* complain_on_overflow */
538 ppc64_elf_unhandled_reloc, /* special_function */
539 "R_PPC64_GOT16_HI", /* name */
540 FALSE, /* partial_inplace */
541 0, /* src_mask */
542 0xffff, /* dst_mask */
543 FALSE), /* pcrel_offset */
544
545 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
546 the symbol. */
547 HOWTO (R_PPC64_GOT16_HA, /* type */
548 16, /* rightshift */
549 1, /* size (0 = byte, 1 = short, 2 = long) */
550 16, /* bitsize */
551 FALSE, /* pc_relative */
552 0, /* bitpos */
553 complain_overflow_signed,/* complain_on_overflow */
554 ppc64_elf_unhandled_reloc, /* special_function */
555 "R_PPC64_GOT16_HA", /* name */
556 FALSE, /* partial_inplace */
557 0, /* src_mask */
558 0xffff, /* dst_mask */
559 FALSE), /* pcrel_offset */
560
561 /* This is used only by the dynamic linker. The symbol should exist
562 both in the object being run and in some shared library. The
563 dynamic linker copies the data addressed by the symbol from the
564 shared library into the object, because the object being
565 run has to have the data at some particular address. */
566 HOWTO (R_PPC64_COPY, /* type */
567 0, /* rightshift */
568 0, /* this one is variable size */
569 0, /* bitsize */
570 FALSE, /* pc_relative */
571 0, /* bitpos */
572 complain_overflow_dont, /* complain_on_overflow */
573 ppc64_elf_unhandled_reloc, /* special_function */
574 "R_PPC64_COPY", /* name */
575 FALSE, /* partial_inplace */
576 0, /* src_mask */
577 0, /* dst_mask */
578 FALSE), /* pcrel_offset */
579
580 /* Like R_PPC64_ADDR64, but used when setting global offset table
581 entries. */
582 HOWTO (R_PPC64_GLOB_DAT, /* type */
583 0, /* rightshift */
584 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
585 64, /* bitsize */
586 FALSE, /* pc_relative */
587 0, /* bitpos */
588 complain_overflow_dont, /* complain_on_overflow */
589 ppc64_elf_unhandled_reloc, /* special_function */
590 "R_PPC64_GLOB_DAT", /* name */
591 FALSE, /* partial_inplace */
592 0, /* src_mask */
593 ONES (64), /* dst_mask */
594 FALSE), /* pcrel_offset */
595
596 /* Created by the link editor. Marks a procedure linkage table
597 entry for a symbol. */
598 HOWTO (R_PPC64_JMP_SLOT, /* type */
599 0, /* rightshift */
600 0, /* size (0 = byte, 1 = short, 2 = long) */
601 0, /* bitsize */
602 FALSE, /* pc_relative */
603 0, /* bitpos */
604 complain_overflow_dont, /* complain_on_overflow */
605 ppc64_elf_unhandled_reloc, /* special_function */
606 "R_PPC64_JMP_SLOT", /* name */
607 FALSE, /* partial_inplace */
608 0, /* src_mask */
609 0, /* dst_mask */
610 FALSE), /* pcrel_offset */
611
612 /* Used only by the dynamic linker. When the object is run, this
613 doubleword64 is set to the load address of the object, plus the
614 addend. */
615 HOWTO (R_PPC64_RELATIVE, /* type */
616 0, /* rightshift */
617 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
618 64, /* bitsize */
619 FALSE, /* pc_relative */
620 0, /* bitpos */
621 complain_overflow_dont, /* complain_on_overflow */
622 bfd_elf_generic_reloc, /* special_function */
623 "R_PPC64_RELATIVE", /* name */
624 FALSE, /* partial_inplace */
625 0, /* src_mask */
626 ONES (64), /* dst_mask */
627 FALSE), /* pcrel_offset */
628
629 /* Like R_PPC64_ADDR32, but may be unaligned. */
630 HOWTO (R_PPC64_UADDR32, /* type */
631 0, /* rightshift */
632 2, /* size (0 = byte, 1 = short, 2 = long) */
633 32, /* bitsize */
634 FALSE, /* pc_relative */
635 0, /* bitpos */
636 complain_overflow_bitfield, /* complain_on_overflow */
637 bfd_elf_generic_reloc, /* special_function */
638 "R_PPC64_UADDR32", /* name */
639 FALSE, /* partial_inplace */
640 0, /* src_mask */
641 0xffffffff, /* dst_mask */
642 FALSE), /* pcrel_offset */
643
644 /* Like R_PPC64_ADDR16, but may be unaligned. */
645 HOWTO (R_PPC64_UADDR16, /* type */
646 0, /* rightshift */
647 1, /* size (0 = byte, 1 = short, 2 = long) */
648 16, /* bitsize */
649 FALSE, /* pc_relative */
650 0, /* bitpos */
651 complain_overflow_bitfield, /* complain_on_overflow */
652 bfd_elf_generic_reloc, /* special_function */
653 "R_PPC64_UADDR16", /* name */
654 FALSE, /* partial_inplace */
655 0, /* src_mask */
656 0xffff, /* dst_mask */
657 FALSE), /* pcrel_offset */
658
659 /* 32-bit PC relative. */
660 HOWTO (R_PPC64_REL32, /* type */
661 0, /* rightshift */
662 2, /* size (0 = byte, 1 = short, 2 = long) */
663 32, /* bitsize */
664 TRUE, /* pc_relative */
665 0, /* bitpos */
666 complain_overflow_signed, /* complain_on_overflow */
667 bfd_elf_generic_reloc, /* special_function */
668 "R_PPC64_REL32", /* name */
669 FALSE, /* partial_inplace */
670 0, /* src_mask */
671 0xffffffff, /* dst_mask */
672 TRUE), /* pcrel_offset */
673
674 /* 32-bit relocation to the symbol's procedure linkage table. */
675 HOWTO (R_PPC64_PLT32, /* type */
676 0, /* rightshift */
677 2, /* size (0 = byte, 1 = short, 2 = long) */
678 32, /* bitsize */
679 FALSE, /* pc_relative */
680 0, /* bitpos */
681 complain_overflow_bitfield, /* complain_on_overflow */
682 ppc64_elf_unhandled_reloc, /* special_function */
683 "R_PPC64_PLT32", /* name */
684 FALSE, /* partial_inplace */
685 0, /* src_mask */
686 0xffffffff, /* dst_mask */
687 FALSE), /* pcrel_offset */
688
689 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
690 FIXME: R_PPC64_PLTREL32 not supported. */
691 HOWTO (R_PPC64_PLTREL32, /* type */
692 0, /* rightshift */
693 2, /* size (0 = byte, 1 = short, 2 = long) */
694 32, /* bitsize */
695 TRUE, /* pc_relative */
696 0, /* bitpos */
697 complain_overflow_signed, /* complain_on_overflow */
698 ppc64_elf_unhandled_reloc, /* special_function */
699 "R_PPC64_PLTREL32", /* name */
700 FALSE, /* partial_inplace */
701 0, /* src_mask */
702 0xffffffff, /* dst_mask */
703 TRUE), /* pcrel_offset */
704
705 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
706 the symbol. */
707 HOWTO (R_PPC64_PLT16_LO, /* type */
708 0, /* rightshift */
709 1, /* size (0 = byte, 1 = short, 2 = long) */
710 16, /* bitsize */
711 FALSE, /* pc_relative */
712 0, /* bitpos */
713 complain_overflow_dont, /* complain_on_overflow */
714 ppc64_elf_unhandled_reloc, /* special_function */
715 "R_PPC64_PLT16_LO", /* name */
716 FALSE, /* partial_inplace */
717 0, /* src_mask */
718 0xffff, /* dst_mask */
719 FALSE), /* pcrel_offset */
720
721 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
722 the symbol. */
723 HOWTO (R_PPC64_PLT16_HI, /* type */
724 16, /* rightshift */
725 1, /* size (0 = byte, 1 = short, 2 = long) */
726 16, /* bitsize */
727 FALSE, /* pc_relative */
728 0, /* bitpos */
729 complain_overflow_signed, /* complain_on_overflow */
730 ppc64_elf_unhandled_reloc, /* special_function */
731 "R_PPC64_PLT16_HI", /* name */
732 FALSE, /* partial_inplace */
733 0, /* src_mask */
734 0xffff, /* dst_mask */
735 FALSE), /* pcrel_offset */
736
737 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
738 the symbol. */
739 HOWTO (R_PPC64_PLT16_HA, /* type */
740 16, /* rightshift */
741 1, /* size (0 = byte, 1 = short, 2 = long) */
742 16, /* bitsize */
743 FALSE, /* pc_relative */
744 0, /* bitpos */
745 complain_overflow_signed, /* complain_on_overflow */
746 ppc64_elf_unhandled_reloc, /* special_function */
747 "R_PPC64_PLT16_HA", /* name */
748 FALSE, /* partial_inplace */
749 0, /* src_mask */
750 0xffff, /* dst_mask */
751 FALSE), /* pcrel_offset */
752
753 /* 16-bit section relative relocation. */
754 HOWTO (R_PPC64_SECTOFF, /* type */
755 0, /* rightshift */
756 1, /* size (0 = byte, 1 = short, 2 = long) */
757 16, /* bitsize */
758 FALSE, /* pc_relative */
759 0, /* bitpos */
760 complain_overflow_signed, /* complain_on_overflow */
761 ppc64_elf_sectoff_reloc, /* special_function */
762 "R_PPC64_SECTOFF", /* name */
763 FALSE, /* partial_inplace */
764 0, /* src_mask */
765 0xffff, /* dst_mask */
766 FALSE), /* pcrel_offset */
767
768 /* Like R_PPC64_SECTOFF, but no overflow warning. */
769 HOWTO (R_PPC64_SECTOFF_LO, /* type */
770 0, /* rightshift */
771 1, /* size (0 = byte, 1 = short, 2 = long) */
772 16, /* bitsize */
773 FALSE, /* pc_relative */
774 0, /* bitpos */
775 complain_overflow_dont, /* complain_on_overflow */
776 ppc64_elf_sectoff_reloc, /* special_function */
777 "R_PPC64_SECTOFF_LO", /* name */
778 FALSE, /* partial_inplace */
779 0, /* src_mask */
780 0xffff, /* dst_mask */
781 FALSE), /* pcrel_offset */
782
783 /* 16-bit upper half section relative relocation. */
784 HOWTO (R_PPC64_SECTOFF_HI, /* type */
785 16, /* rightshift */
786 1, /* size (0 = byte, 1 = short, 2 = long) */
787 16, /* bitsize */
788 FALSE, /* pc_relative */
789 0, /* bitpos */
790 complain_overflow_signed, /* complain_on_overflow */
791 ppc64_elf_sectoff_reloc, /* special_function */
792 "R_PPC64_SECTOFF_HI", /* name */
793 FALSE, /* partial_inplace */
794 0, /* src_mask */
795 0xffff, /* dst_mask */
796 FALSE), /* pcrel_offset */
797
798 /* 16-bit upper half adjusted section relative relocation. */
799 HOWTO (R_PPC64_SECTOFF_HA, /* type */
800 16, /* rightshift */
801 1, /* size (0 = byte, 1 = short, 2 = long) */
802 16, /* bitsize */
803 FALSE, /* pc_relative */
804 0, /* bitpos */
805 complain_overflow_signed, /* complain_on_overflow */
806 ppc64_elf_sectoff_ha_reloc, /* special_function */
807 "R_PPC64_SECTOFF_HA", /* name */
808 FALSE, /* partial_inplace */
809 0, /* src_mask */
810 0xffff, /* dst_mask */
811 FALSE), /* pcrel_offset */
812
813 /* Like R_PPC64_REL24 without touching the two least significant bits. */
814 HOWTO (R_PPC64_REL30, /* type */
815 2, /* rightshift */
816 2, /* size (0 = byte, 1 = short, 2 = long) */
817 30, /* bitsize */
818 TRUE, /* pc_relative */
819 0, /* bitpos */
820 complain_overflow_dont, /* complain_on_overflow */
821 bfd_elf_generic_reloc, /* special_function */
822 "R_PPC64_REL30", /* name */
823 FALSE, /* partial_inplace */
824 0, /* src_mask */
825 0xfffffffc, /* dst_mask */
826 TRUE), /* pcrel_offset */
827
828 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
829
830 /* A standard 64-bit relocation. */
831 HOWTO (R_PPC64_ADDR64, /* type */
832 0, /* rightshift */
833 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
834 64, /* bitsize */
835 FALSE, /* pc_relative */
836 0, /* bitpos */
837 complain_overflow_dont, /* complain_on_overflow */
838 bfd_elf_generic_reloc, /* special_function */
839 "R_PPC64_ADDR64", /* name */
840 FALSE, /* partial_inplace */
841 0, /* src_mask */
842 ONES (64), /* dst_mask */
843 FALSE), /* pcrel_offset */
844
845 /* The bits 32-47 of an address. */
846 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
847 32, /* rightshift */
848 1, /* size (0 = byte, 1 = short, 2 = long) */
849 16, /* bitsize */
850 FALSE, /* pc_relative */
851 0, /* bitpos */
852 complain_overflow_dont, /* complain_on_overflow */
853 bfd_elf_generic_reloc, /* special_function */
854 "R_PPC64_ADDR16_HIGHER", /* name */
855 FALSE, /* partial_inplace */
856 0, /* src_mask */
857 0xffff, /* dst_mask */
858 FALSE), /* pcrel_offset */
859
860 /* The bits 32-47 of an address, plus 1 if the contents of the low
861 16 bits, treated as a signed number, is negative. */
862 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
863 32, /* rightshift */
864 1, /* size (0 = byte, 1 = short, 2 = long) */
865 16, /* bitsize */
866 FALSE, /* pc_relative */
867 0, /* bitpos */
868 complain_overflow_dont, /* complain_on_overflow */
869 ppc64_elf_ha_reloc, /* special_function */
870 "R_PPC64_ADDR16_HIGHERA", /* name */
871 FALSE, /* partial_inplace */
872 0, /* src_mask */
873 0xffff, /* dst_mask */
874 FALSE), /* pcrel_offset */
875
876 /* The bits 48-63 of an address. */
877 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
878 48, /* rightshift */
879 1, /* size (0 = byte, 1 = short, 2 = long) */
880 16, /* bitsize */
881 FALSE, /* pc_relative */
882 0, /* bitpos */
883 complain_overflow_dont, /* complain_on_overflow */
884 bfd_elf_generic_reloc, /* special_function */
885 "R_PPC64_ADDR16_HIGHEST", /* name */
886 FALSE, /* partial_inplace */
887 0, /* src_mask */
888 0xffff, /* dst_mask */
889 FALSE), /* pcrel_offset */
890
891 /* The bits 48-63 of an address, plus 1 if the contents of the low
892 16 bits, treated as a signed number, is negative. */
893 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
894 48, /* rightshift */
895 1, /* size (0 = byte, 1 = short, 2 = long) */
896 16, /* bitsize */
897 FALSE, /* pc_relative */
898 0, /* bitpos */
899 complain_overflow_dont, /* complain_on_overflow */
900 ppc64_elf_ha_reloc, /* special_function */
901 "R_PPC64_ADDR16_HIGHESTA", /* name */
902 FALSE, /* partial_inplace */
903 0, /* src_mask */
904 0xffff, /* dst_mask */
905 FALSE), /* pcrel_offset */
906
907 /* Like ADDR64, but may be unaligned. */
908 HOWTO (R_PPC64_UADDR64, /* type */
909 0, /* rightshift */
910 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
911 64, /* bitsize */
912 FALSE, /* pc_relative */
913 0, /* bitpos */
914 complain_overflow_dont, /* complain_on_overflow */
915 bfd_elf_generic_reloc, /* special_function */
916 "R_PPC64_UADDR64", /* name */
917 FALSE, /* partial_inplace */
918 0, /* src_mask */
919 ONES (64), /* dst_mask */
920 FALSE), /* pcrel_offset */
921
922 /* 64-bit relative relocation. */
923 HOWTO (R_PPC64_REL64, /* type */
924 0, /* rightshift */
925 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
926 64, /* bitsize */
927 TRUE, /* pc_relative */
928 0, /* bitpos */
929 complain_overflow_dont, /* complain_on_overflow */
930 bfd_elf_generic_reloc, /* special_function */
931 "R_PPC64_REL64", /* name */
932 FALSE, /* partial_inplace */
933 0, /* src_mask */
934 ONES (64), /* dst_mask */
935 TRUE), /* pcrel_offset */
936
937 /* 64-bit relocation to the symbol's procedure linkage table. */
938 HOWTO (R_PPC64_PLT64, /* type */
939 0, /* rightshift */
940 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
941 64, /* bitsize */
942 FALSE, /* pc_relative */
943 0, /* bitpos */
944 complain_overflow_dont, /* complain_on_overflow */
945 ppc64_elf_unhandled_reloc, /* special_function */
946 "R_PPC64_PLT64", /* name */
947 FALSE, /* partial_inplace */
948 0, /* src_mask */
949 ONES (64), /* dst_mask */
950 FALSE), /* pcrel_offset */
951
952 /* 64-bit PC relative relocation to the symbol's procedure linkage
953 table. */
954 /* FIXME: R_PPC64_PLTREL64 not supported. */
955 HOWTO (R_PPC64_PLTREL64, /* type */
956 0, /* rightshift */
957 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
958 64, /* bitsize */
959 TRUE, /* pc_relative */
960 0, /* bitpos */
961 complain_overflow_dont, /* complain_on_overflow */
962 ppc64_elf_unhandled_reloc, /* special_function */
963 "R_PPC64_PLTREL64", /* name */
964 FALSE, /* partial_inplace */
965 0, /* src_mask */
966 ONES (64), /* dst_mask */
967 TRUE), /* pcrel_offset */
968
969 /* 16 bit TOC-relative relocation. */
970
971 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
972 HOWTO (R_PPC64_TOC16, /* type */
973 0, /* rightshift */
974 1, /* size (0 = byte, 1 = short, 2 = long) */
975 16, /* bitsize */
976 FALSE, /* pc_relative */
977 0, /* bitpos */
978 complain_overflow_signed, /* complain_on_overflow */
979 ppc64_elf_toc_reloc, /* special_function */
980 "R_PPC64_TOC16", /* name */
981 FALSE, /* partial_inplace */
982 0, /* src_mask */
983 0xffff, /* dst_mask */
984 FALSE), /* pcrel_offset */
985
986 /* 16 bit TOC-relative relocation without overflow. */
987
988 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
989 HOWTO (R_PPC64_TOC16_LO, /* type */
990 0, /* rightshift */
991 1, /* size (0 = byte, 1 = short, 2 = long) */
992 16, /* bitsize */
993 FALSE, /* pc_relative */
994 0, /* bitpos */
995 complain_overflow_dont, /* complain_on_overflow */
996 ppc64_elf_toc_reloc, /* special_function */
997 "R_PPC64_TOC16_LO", /* name */
998 FALSE, /* partial_inplace */
999 0, /* src_mask */
1000 0xffff, /* dst_mask */
1001 FALSE), /* pcrel_offset */
1002
1003 /* 16 bit TOC-relative relocation, high 16 bits. */
1004
1005 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
1006 HOWTO (R_PPC64_TOC16_HI, /* type */
1007 16, /* rightshift */
1008 1, /* size (0 = byte, 1 = short, 2 = long) */
1009 16, /* bitsize */
1010 FALSE, /* pc_relative */
1011 0, /* bitpos */
1012 complain_overflow_signed, /* complain_on_overflow */
1013 ppc64_elf_toc_reloc, /* special_function */
1014 "R_PPC64_TOC16_HI", /* name */
1015 FALSE, /* partial_inplace */
1016 0, /* src_mask */
1017 0xffff, /* dst_mask */
1018 FALSE), /* pcrel_offset */
1019
1020 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1021 contents of the low 16 bits, treated as a signed number, is
1022 negative. */
1023
1024 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1025 HOWTO (R_PPC64_TOC16_HA, /* type */
1026 16, /* rightshift */
1027 1, /* size (0 = byte, 1 = short, 2 = long) */
1028 16, /* bitsize */
1029 FALSE, /* pc_relative */
1030 0, /* bitpos */
1031 complain_overflow_signed, /* complain_on_overflow */
1032 ppc64_elf_toc_ha_reloc, /* special_function */
1033 "R_PPC64_TOC16_HA", /* name */
1034 FALSE, /* partial_inplace */
1035 0, /* src_mask */
1036 0xffff, /* dst_mask */
1037 FALSE), /* pcrel_offset */
1038
1039 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1040
1041 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1042 HOWTO (R_PPC64_TOC, /* type */
1043 0, /* rightshift */
1044 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1045 64, /* bitsize */
1046 FALSE, /* pc_relative */
1047 0, /* bitpos */
1048 complain_overflow_dont, /* complain_on_overflow */
1049 ppc64_elf_toc64_reloc, /* special_function */
1050 "R_PPC64_TOC", /* name */
1051 FALSE, /* partial_inplace */
1052 0, /* src_mask */
1053 ONES (64), /* dst_mask */
1054 FALSE), /* pcrel_offset */
1055
1056 /* Like R_PPC64_GOT16, but also informs the link editor that the
1057 value to relocate may (!) refer to a PLT entry which the link
1058 editor (a) may replace with the symbol value. If the link editor
1059 is unable to fully resolve the symbol, it may (b) create a PLT
1060 entry and store the address to the new PLT entry in the GOT.
1061 This permits lazy resolution of function symbols at run time.
1062 The link editor may also skip all of this and just (c) emit a
1063 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1064 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1065 HOWTO (R_PPC64_PLTGOT16, /* type */
1066 0, /* rightshift */
1067 1, /* size (0 = byte, 1 = short, 2 = long) */
1068 16, /* bitsize */
1069 FALSE, /* pc_relative */
1070 0, /* bitpos */
1071 complain_overflow_signed, /* complain_on_overflow */
1072 ppc64_elf_unhandled_reloc, /* special_function */
1073 "R_PPC64_PLTGOT16", /* name */
1074 FALSE, /* partial_inplace */
1075 0, /* src_mask */
1076 0xffff, /* dst_mask */
1077 FALSE), /* pcrel_offset */
1078
1079 /* Like R_PPC64_PLTGOT16, but without overflow. */
1080 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1081 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1082 0, /* rightshift */
1083 1, /* size (0 = byte, 1 = short, 2 = long) */
1084 16, /* bitsize */
1085 FALSE, /* pc_relative */
1086 0, /* bitpos */
1087 complain_overflow_dont, /* complain_on_overflow */
1088 ppc64_elf_unhandled_reloc, /* special_function */
1089 "R_PPC64_PLTGOT16_LO", /* name */
1090 FALSE, /* partial_inplace */
1091 0, /* src_mask */
1092 0xffff, /* dst_mask */
1093 FALSE), /* pcrel_offset */
1094
1095 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1096 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1097 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1098 16, /* rightshift */
1099 1, /* size (0 = byte, 1 = short, 2 = long) */
1100 16, /* bitsize */
1101 FALSE, /* pc_relative */
1102 0, /* bitpos */
1103 complain_overflow_signed, /* complain_on_overflow */
1104 ppc64_elf_unhandled_reloc, /* special_function */
1105 "R_PPC64_PLTGOT16_HI", /* name */
1106 FALSE, /* partial_inplace */
1107 0, /* src_mask */
1108 0xffff, /* dst_mask */
1109 FALSE), /* pcrel_offset */
1110
1111 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1112 1 if the contents of the low 16 bits, treated as a signed number,
1113 is negative. */
1114 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1115 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1116 16, /* rightshift */
1117 1, /* size (0 = byte, 1 = short, 2 = long) */
1118 16, /* bitsize */
1119 FALSE, /* pc_relative */
1120 0, /* bitpos */
1121 complain_overflow_signed, /* complain_on_overflow */
1122 ppc64_elf_unhandled_reloc, /* special_function */
1123 "R_PPC64_PLTGOT16_HA", /* name */
1124 FALSE, /* partial_inplace */
1125 0, /* src_mask */
1126 0xffff, /* dst_mask */
1127 FALSE), /* pcrel_offset */
1128
1129 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1130 HOWTO (R_PPC64_ADDR16_DS, /* type */
1131 0, /* rightshift */
1132 1, /* size (0 = byte, 1 = short, 2 = long) */
1133 16, /* bitsize */
1134 FALSE, /* pc_relative */
1135 0, /* bitpos */
1136 complain_overflow_signed, /* complain_on_overflow */
1137 bfd_elf_generic_reloc, /* special_function */
1138 "R_PPC64_ADDR16_DS", /* name */
1139 FALSE, /* partial_inplace */
1140 0, /* src_mask */
1141 0xfffc, /* dst_mask */
1142 FALSE), /* pcrel_offset */
1143
1144 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1145 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1146 0, /* rightshift */
1147 1, /* size (0 = byte, 1 = short, 2 = long) */
1148 16, /* bitsize */
1149 FALSE, /* pc_relative */
1150 0, /* bitpos */
1151 complain_overflow_dont,/* complain_on_overflow */
1152 bfd_elf_generic_reloc, /* special_function */
1153 "R_PPC64_ADDR16_LO_DS",/* name */
1154 FALSE, /* partial_inplace */
1155 0, /* src_mask */
1156 0xfffc, /* dst_mask */
1157 FALSE), /* pcrel_offset */
1158
1159 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1160 HOWTO (R_PPC64_GOT16_DS, /* type */
1161 0, /* rightshift */
1162 1, /* size (0 = byte, 1 = short, 2 = long) */
1163 16, /* bitsize */
1164 FALSE, /* pc_relative */
1165 0, /* bitpos */
1166 complain_overflow_signed, /* complain_on_overflow */
1167 ppc64_elf_unhandled_reloc, /* special_function */
1168 "R_PPC64_GOT16_DS", /* name */
1169 FALSE, /* partial_inplace */
1170 0, /* src_mask */
1171 0xfffc, /* dst_mask */
1172 FALSE), /* pcrel_offset */
1173
1174 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1175 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1176 0, /* rightshift */
1177 1, /* size (0 = byte, 1 = short, 2 = long) */
1178 16, /* bitsize */
1179 FALSE, /* pc_relative */
1180 0, /* bitpos */
1181 complain_overflow_dont, /* complain_on_overflow */
1182 ppc64_elf_unhandled_reloc, /* special_function */
1183 "R_PPC64_GOT16_LO_DS", /* name */
1184 FALSE, /* partial_inplace */
1185 0, /* src_mask */
1186 0xfffc, /* dst_mask */
1187 FALSE), /* pcrel_offset */
1188
1189 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1190 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1191 0, /* rightshift */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1193 16, /* bitsize */
1194 FALSE, /* pc_relative */
1195 0, /* bitpos */
1196 complain_overflow_dont, /* complain_on_overflow */
1197 ppc64_elf_unhandled_reloc, /* special_function */
1198 "R_PPC64_PLT16_LO_DS", /* name */
1199 FALSE, /* partial_inplace */
1200 0, /* src_mask */
1201 0xfffc, /* dst_mask */
1202 FALSE), /* pcrel_offset */
1203
1204 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1205 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1206 0, /* rightshift */
1207 1, /* size (0 = byte, 1 = short, 2 = long) */
1208 16, /* bitsize */
1209 FALSE, /* pc_relative */
1210 0, /* bitpos */
1211 complain_overflow_signed, /* complain_on_overflow */
1212 ppc64_elf_sectoff_reloc, /* special_function */
1213 "R_PPC64_SECTOFF_DS", /* name */
1214 FALSE, /* partial_inplace */
1215 0, /* src_mask */
1216 0xfffc, /* dst_mask */
1217 FALSE), /* pcrel_offset */
1218
1219 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1220 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1221 0, /* rightshift */
1222 1, /* size (0 = byte, 1 = short, 2 = long) */
1223 16, /* bitsize */
1224 FALSE, /* pc_relative */
1225 0, /* bitpos */
1226 complain_overflow_dont, /* complain_on_overflow */
1227 ppc64_elf_sectoff_reloc, /* special_function */
1228 "R_PPC64_SECTOFF_LO_DS",/* name */
1229 FALSE, /* partial_inplace */
1230 0, /* src_mask */
1231 0xfffc, /* dst_mask */
1232 FALSE), /* pcrel_offset */
1233
1234 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1235 HOWTO (R_PPC64_TOC16_DS, /* type */
1236 0, /* rightshift */
1237 1, /* size (0 = byte, 1 = short, 2 = long) */
1238 16, /* bitsize */
1239 FALSE, /* pc_relative */
1240 0, /* bitpos */
1241 complain_overflow_signed, /* complain_on_overflow */
1242 ppc64_elf_toc_reloc, /* special_function */
1243 "R_PPC64_TOC16_DS", /* name */
1244 FALSE, /* partial_inplace */
1245 0, /* src_mask */
1246 0xfffc, /* dst_mask */
1247 FALSE), /* pcrel_offset */
1248
1249 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1250 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1251 0, /* rightshift */
1252 1, /* size (0 = byte, 1 = short, 2 = long) */
1253 16, /* bitsize */
1254 FALSE, /* pc_relative */
1255 0, /* bitpos */
1256 complain_overflow_dont, /* complain_on_overflow */
1257 ppc64_elf_toc_reloc, /* special_function */
1258 "R_PPC64_TOC16_LO_DS", /* name */
1259 FALSE, /* partial_inplace */
1260 0, /* src_mask */
1261 0xfffc, /* dst_mask */
1262 FALSE), /* pcrel_offset */
1263
1264 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1265 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1266 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1267 0, /* rightshift */
1268 1, /* size (0 = byte, 1 = short, 2 = long) */
1269 16, /* bitsize */
1270 FALSE, /* pc_relative */
1271 0, /* bitpos */
1272 complain_overflow_signed, /* complain_on_overflow */
1273 ppc64_elf_unhandled_reloc, /* special_function */
1274 "R_PPC64_PLTGOT16_DS", /* name */
1275 FALSE, /* partial_inplace */
1276 0, /* src_mask */
1277 0xfffc, /* dst_mask */
1278 FALSE), /* pcrel_offset */
1279
1280 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1281 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1282 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1283 0, /* rightshift */
1284 1, /* size (0 = byte, 1 = short, 2 = long) */
1285 16, /* bitsize */
1286 FALSE, /* pc_relative */
1287 0, /* bitpos */
1288 complain_overflow_dont, /* complain_on_overflow */
1289 ppc64_elf_unhandled_reloc, /* special_function */
1290 "R_PPC64_PLTGOT16_LO_DS",/* name */
1291 FALSE, /* partial_inplace */
1292 0, /* src_mask */
1293 0xfffc, /* dst_mask */
1294 FALSE), /* pcrel_offset */
1295
1296 /* Marker relocs for TLS. */
1297 HOWTO (R_PPC64_TLS,
1298 0, /* rightshift */
1299 2, /* size (0 = byte, 1 = short, 2 = long) */
1300 32, /* bitsize */
1301 FALSE, /* pc_relative */
1302 0, /* bitpos */
1303 complain_overflow_dont, /* complain_on_overflow */
1304 bfd_elf_generic_reloc, /* special_function */
1305 "R_PPC64_TLS", /* name */
1306 FALSE, /* partial_inplace */
1307 0, /* src_mask */
1308 0, /* dst_mask */
1309 FALSE), /* pcrel_offset */
1310
1311 HOWTO (R_PPC64_TLSGD,
1312 0, /* rightshift */
1313 2, /* size (0 = byte, 1 = short, 2 = long) */
1314 32, /* bitsize */
1315 FALSE, /* pc_relative */
1316 0, /* bitpos */
1317 complain_overflow_dont, /* complain_on_overflow */
1318 bfd_elf_generic_reloc, /* special_function */
1319 "R_PPC64_TLSGD", /* name */
1320 FALSE, /* partial_inplace */
1321 0, /* src_mask */
1322 0, /* dst_mask */
1323 FALSE), /* pcrel_offset */
1324
1325 HOWTO (R_PPC64_TLSLD,
1326 0, /* rightshift */
1327 2, /* size (0 = byte, 1 = short, 2 = long) */
1328 32, /* bitsize */
1329 FALSE, /* pc_relative */
1330 0, /* bitpos */
1331 complain_overflow_dont, /* complain_on_overflow */
1332 bfd_elf_generic_reloc, /* special_function */
1333 "R_PPC64_TLSLD", /* name */
1334 FALSE, /* partial_inplace */
1335 0, /* src_mask */
1336 0, /* dst_mask */
1337 FALSE), /* pcrel_offset */
1338
1339 /* Marker reloc for optimizing r2 save in prologue rather than on
1340 each plt call stub. */
1341 HOWTO (R_PPC64_TOCSAVE,
1342 0, /* rightshift */
1343 2, /* size (0 = byte, 1 = short, 2 = long) */
1344 32, /* bitsize */
1345 FALSE, /* pc_relative */
1346 0, /* bitpos */
1347 complain_overflow_dont, /* complain_on_overflow */
1348 bfd_elf_generic_reloc, /* special_function */
1349 "R_PPC64_TOCSAVE", /* name */
1350 FALSE, /* partial_inplace */
1351 0, /* src_mask */
1352 0, /* dst_mask */
1353 FALSE), /* pcrel_offset */
1354
1355 /* Marker relocs on inline plt call instructions. */
1356 HOWTO (R_PPC64_PLTSEQ,
1357 0, /* rightshift */
1358 2, /* size (0 = byte, 1 = short, 2 = long) */
1359 32, /* bitsize */
1360 FALSE, /* pc_relative */
1361 0, /* bitpos */
1362 complain_overflow_dont, /* complain_on_overflow */
1363 bfd_elf_generic_reloc, /* special_function */
1364 "R_PPC64_PLTSEQ", /* name */
1365 FALSE, /* partial_inplace */
1366 0, /* src_mask */
1367 0, /* dst_mask */
1368 FALSE), /* pcrel_offset */
1369
1370 HOWTO (R_PPC64_PLTCALL,
1371 0, /* rightshift */
1372 2, /* size (0 = byte, 1 = short, 2 = long) */
1373 32, /* bitsize */
1374 FALSE, /* pc_relative */
1375 0, /* bitpos */
1376 complain_overflow_dont, /* complain_on_overflow */
1377 bfd_elf_generic_reloc, /* special_function */
1378 "R_PPC64_PLTCALL", /* name */
1379 FALSE, /* partial_inplace */
1380 0, /* src_mask */
1381 0, /* dst_mask */
1382 FALSE), /* pcrel_offset */
1383
1384 /* Computes the load module index of the load module that contains the
1385 definition of its TLS sym. */
1386 HOWTO (R_PPC64_DTPMOD64,
1387 0, /* rightshift */
1388 4, /* size (0 = byte, 1 = short, 2 = long) */
1389 64, /* bitsize */
1390 FALSE, /* pc_relative */
1391 0, /* bitpos */
1392 complain_overflow_dont, /* complain_on_overflow */
1393 ppc64_elf_unhandled_reloc, /* special_function */
1394 "R_PPC64_DTPMOD64", /* name */
1395 FALSE, /* partial_inplace */
1396 0, /* src_mask */
1397 ONES (64), /* dst_mask */
1398 FALSE), /* pcrel_offset */
1399
1400 /* Computes a dtv-relative displacement, the difference between the value
1401 of sym+add and the base address of the thread-local storage block that
1402 contains the definition of sym, minus 0x8000. */
1403 HOWTO (R_PPC64_DTPREL64,
1404 0, /* rightshift */
1405 4, /* size (0 = byte, 1 = short, 2 = long) */
1406 64, /* bitsize */
1407 FALSE, /* pc_relative */
1408 0, /* bitpos */
1409 complain_overflow_dont, /* complain_on_overflow */
1410 ppc64_elf_unhandled_reloc, /* special_function */
1411 "R_PPC64_DTPREL64", /* name */
1412 FALSE, /* partial_inplace */
1413 0, /* src_mask */
1414 ONES (64), /* dst_mask */
1415 FALSE), /* pcrel_offset */
1416
1417 /* A 16 bit dtprel reloc. */
1418 HOWTO (R_PPC64_DTPREL16,
1419 0, /* rightshift */
1420 1, /* size (0 = byte, 1 = short, 2 = long) */
1421 16, /* bitsize */
1422 FALSE, /* pc_relative */
1423 0, /* bitpos */
1424 complain_overflow_signed, /* complain_on_overflow */
1425 ppc64_elf_unhandled_reloc, /* special_function */
1426 "R_PPC64_DTPREL16", /* name */
1427 FALSE, /* partial_inplace */
1428 0, /* src_mask */
1429 0xffff, /* dst_mask */
1430 FALSE), /* pcrel_offset */
1431
1432 /* Like DTPREL16, but no overflow. */
1433 HOWTO (R_PPC64_DTPREL16_LO,
1434 0, /* rightshift */
1435 1, /* size (0 = byte, 1 = short, 2 = long) */
1436 16, /* bitsize */
1437 FALSE, /* pc_relative */
1438 0, /* bitpos */
1439 complain_overflow_dont, /* complain_on_overflow */
1440 ppc64_elf_unhandled_reloc, /* special_function */
1441 "R_PPC64_DTPREL16_LO", /* name */
1442 FALSE, /* partial_inplace */
1443 0, /* src_mask */
1444 0xffff, /* dst_mask */
1445 FALSE), /* pcrel_offset */
1446
1447 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1448 HOWTO (R_PPC64_DTPREL16_HI,
1449 16, /* rightshift */
1450 1, /* size (0 = byte, 1 = short, 2 = long) */
1451 16, /* bitsize */
1452 FALSE, /* pc_relative */
1453 0, /* bitpos */
1454 complain_overflow_signed, /* complain_on_overflow */
1455 ppc64_elf_unhandled_reloc, /* special_function */
1456 "R_PPC64_DTPREL16_HI", /* name */
1457 FALSE, /* partial_inplace */
1458 0, /* src_mask */
1459 0xffff, /* dst_mask */
1460 FALSE), /* pcrel_offset */
1461
1462 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1463 HOWTO (R_PPC64_DTPREL16_HA,
1464 16, /* rightshift */
1465 1, /* size (0 = byte, 1 = short, 2 = long) */
1466 16, /* bitsize */
1467 FALSE, /* pc_relative */
1468 0, /* bitpos */
1469 complain_overflow_signed, /* complain_on_overflow */
1470 ppc64_elf_unhandled_reloc, /* special_function */
1471 "R_PPC64_DTPREL16_HA", /* name */
1472 FALSE, /* partial_inplace */
1473 0, /* src_mask */
1474 0xffff, /* dst_mask */
1475 FALSE), /* pcrel_offset */
1476
1477 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1478 HOWTO (R_PPC64_DTPREL16_HIGHER,
1479 32, /* rightshift */
1480 1, /* size (0 = byte, 1 = short, 2 = long) */
1481 16, /* bitsize */
1482 FALSE, /* pc_relative */
1483 0, /* bitpos */
1484 complain_overflow_dont, /* complain_on_overflow */
1485 ppc64_elf_unhandled_reloc, /* special_function */
1486 "R_PPC64_DTPREL16_HIGHER", /* name */
1487 FALSE, /* partial_inplace */
1488 0, /* src_mask */
1489 0xffff, /* dst_mask */
1490 FALSE), /* pcrel_offset */
1491
1492 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1493 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1494 32, /* rightshift */
1495 1, /* size (0 = byte, 1 = short, 2 = long) */
1496 16, /* bitsize */
1497 FALSE, /* pc_relative */
1498 0, /* bitpos */
1499 complain_overflow_dont, /* complain_on_overflow */
1500 ppc64_elf_unhandled_reloc, /* special_function */
1501 "R_PPC64_DTPREL16_HIGHERA", /* name */
1502 FALSE, /* partial_inplace */
1503 0, /* src_mask */
1504 0xffff, /* dst_mask */
1505 FALSE), /* pcrel_offset */
1506
1507 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1508 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1509 48, /* rightshift */
1510 1, /* size (0 = byte, 1 = short, 2 = long) */
1511 16, /* bitsize */
1512 FALSE, /* pc_relative */
1513 0, /* bitpos */
1514 complain_overflow_dont, /* complain_on_overflow */
1515 ppc64_elf_unhandled_reloc, /* special_function */
1516 "R_PPC64_DTPREL16_HIGHEST", /* name */
1517 FALSE, /* partial_inplace */
1518 0, /* src_mask */
1519 0xffff, /* dst_mask */
1520 FALSE), /* pcrel_offset */
1521
1522 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1523 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1524 48, /* rightshift */
1525 1, /* size (0 = byte, 1 = short, 2 = long) */
1526 16, /* bitsize */
1527 FALSE, /* pc_relative */
1528 0, /* bitpos */
1529 complain_overflow_dont, /* complain_on_overflow */
1530 ppc64_elf_unhandled_reloc, /* special_function */
1531 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1532 FALSE, /* partial_inplace */
1533 0, /* src_mask */
1534 0xffff, /* dst_mask */
1535 FALSE), /* pcrel_offset */
1536
1537 /* Like DTPREL16, but for insns with a DS field. */
1538 HOWTO (R_PPC64_DTPREL16_DS,
1539 0, /* rightshift */
1540 1, /* size (0 = byte, 1 = short, 2 = long) */
1541 16, /* bitsize */
1542 FALSE, /* pc_relative */
1543 0, /* bitpos */
1544 complain_overflow_signed, /* complain_on_overflow */
1545 ppc64_elf_unhandled_reloc, /* special_function */
1546 "R_PPC64_DTPREL16_DS", /* name */
1547 FALSE, /* partial_inplace */
1548 0, /* src_mask */
1549 0xfffc, /* dst_mask */
1550 FALSE), /* pcrel_offset */
1551
1552 /* Like DTPREL16_DS, but no overflow. */
1553 HOWTO (R_PPC64_DTPREL16_LO_DS,
1554 0, /* rightshift */
1555 1, /* size (0 = byte, 1 = short, 2 = long) */
1556 16, /* bitsize */
1557 FALSE, /* pc_relative */
1558 0, /* bitpos */
1559 complain_overflow_dont, /* complain_on_overflow */
1560 ppc64_elf_unhandled_reloc, /* special_function */
1561 "R_PPC64_DTPREL16_LO_DS", /* name */
1562 FALSE, /* partial_inplace */
1563 0, /* src_mask */
1564 0xfffc, /* dst_mask */
1565 FALSE), /* pcrel_offset */
1566
1567 /* Computes a tp-relative displacement, the difference between the value of
1568 sym+add and the value of the thread pointer (r13). */
1569 HOWTO (R_PPC64_TPREL64,
1570 0, /* rightshift */
1571 4, /* size (0 = byte, 1 = short, 2 = long) */
1572 64, /* bitsize */
1573 FALSE, /* pc_relative */
1574 0, /* bitpos */
1575 complain_overflow_dont, /* complain_on_overflow */
1576 ppc64_elf_unhandled_reloc, /* special_function */
1577 "R_PPC64_TPREL64", /* name */
1578 FALSE, /* partial_inplace */
1579 0, /* src_mask */
1580 ONES (64), /* dst_mask */
1581 FALSE), /* pcrel_offset */
1582
1583 /* A 16 bit tprel reloc. */
1584 HOWTO (R_PPC64_TPREL16,
1585 0, /* rightshift */
1586 1, /* size (0 = byte, 1 = short, 2 = long) */
1587 16, /* bitsize */
1588 FALSE, /* pc_relative */
1589 0, /* bitpos */
1590 complain_overflow_signed, /* complain_on_overflow */
1591 ppc64_elf_unhandled_reloc, /* special_function */
1592 "R_PPC64_TPREL16", /* name */
1593 FALSE, /* partial_inplace */
1594 0, /* src_mask */
1595 0xffff, /* dst_mask */
1596 FALSE), /* pcrel_offset */
1597
1598 /* Like TPREL16, but no overflow. */
1599 HOWTO (R_PPC64_TPREL16_LO,
1600 0, /* rightshift */
1601 1, /* size (0 = byte, 1 = short, 2 = long) */
1602 16, /* bitsize */
1603 FALSE, /* pc_relative */
1604 0, /* bitpos */
1605 complain_overflow_dont, /* complain_on_overflow */
1606 ppc64_elf_unhandled_reloc, /* special_function */
1607 "R_PPC64_TPREL16_LO", /* name */
1608 FALSE, /* partial_inplace */
1609 0, /* src_mask */
1610 0xffff, /* dst_mask */
1611 FALSE), /* pcrel_offset */
1612
1613 /* Like TPREL16_LO, but next higher group of 16 bits. */
1614 HOWTO (R_PPC64_TPREL16_HI,
1615 16, /* rightshift */
1616 1, /* size (0 = byte, 1 = short, 2 = long) */
1617 16, /* bitsize */
1618 FALSE, /* pc_relative */
1619 0, /* bitpos */
1620 complain_overflow_signed, /* complain_on_overflow */
1621 ppc64_elf_unhandled_reloc, /* special_function */
1622 "R_PPC64_TPREL16_HI", /* name */
1623 FALSE, /* partial_inplace */
1624 0, /* src_mask */
1625 0xffff, /* dst_mask */
1626 FALSE), /* pcrel_offset */
1627
1628 /* Like TPREL16_HI, but adjust for low 16 bits. */
1629 HOWTO (R_PPC64_TPREL16_HA,
1630 16, /* rightshift */
1631 1, /* size (0 = byte, 1 = short, 2 = long) */
1632 16, /* bitsize */
1633 FALSE, /* pc_relative */
1634 0, /* bitpos */
1635 complain_overflow_signed, /* complain_on_overflow */
1636 ppc64_elf_unhandled_reloc, /* special_function */
1637 "R_PPC64_TPREL16_HA", /* name */
1638 FALSE, /* partial_inplace */
1639 0, /* src_mask */
1640 0xffff, /* dst_mask */
1641 FALSE), /* pcrel_offset */
1642
1643 /* Like TPREL16_HI, but next higher group of 16 bits. */
1644 HOWTO (R_PPC64_TPREL16_HIGHER,
1645 32, /* rightshift */
1646 1, /* size (0 = byte, 1 = short, 2 = long) */
1647 16, /* bitsize */
1648 FALSE, /* pc_relative */
1649 0, /* bitpos */
1650 complain_overflow_dont, /* complain_on_overflow */
1651 ppc64_elf_unhandled_reloc, /* special_function */
1652 "R_PPC64_TPREL16_HIGHER", /* name */
1653 FALSE, /* partial_inplace */
1654 0, /* src_mask */
1655 0xffff, /* dst_mask */
1656 FALSE), /* pcrel_offset */
1657
1658 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1659 HOWTO (R_PPC64_TPREL16_HIGHERA,
1660 32, /* rightshift */
1661 1, /* size (0 = byte, 1 = short, 2 = long) */
1662 16, /* bitsize */
1663 FALSE, /* pc_relative */
1664 0, /* bitpos */
1665 complain_overflow_dont, /* complain_on_overflow */
1666 ppc64_elf_unhandled_reloc, /* special_function */
1667 "R_PPC64_TPREL16_HIGHERA", /* name */
1668 FALSE, /* partial_inplace */
1669 0, /* src_mask */
1670 0xffff, /* dst_mask */
1671 FALSE), /* pcrel_offset */
1672
1673 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1674 HOWTO (R_PPC64_TPREL16_HIGHEST,
1675 48, /* rightshift */
1676 1, /* size (0 = byte, 1 = short, 2 = long) */
1677 16, /* bitsize */
1678 FALSE, /* pc_relative */
1679 0, /* bitpos */
1680 complain_overflow_dont, /* complain_on_overflow */
1681 ppc64_elf_unhandled_reloc, /* special_function */
1682 "R_PPC64_TPREL16_HIGHEST", /* name */
1683 FALSE, /* partial_inplace */
1684 0, /* src_mask */
1685 0xffff, /* dst_mask */
1686 FALSE), /* pcrel_offset */
1687
1688 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1689 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1690 48, /* rightshift */
1691 1, /* size (0 = byte, 1 = short, 2 = long) */
1692 16, /* bitsize */
1693 FALSE, /* pc_relative */
1694 0, /* bitpos */
1695 complain_overflow_dont, /* complain_on_overflow */
1696 ppc64_elf_unhandled_reloc, /* special_function */
1697 "R_PPC64_TPREL16_HIGHESTA", /* name */
1698 FALSE, /* partial_inplace */
1699 0, /* src_mask */
1700 0xffff, /* dst_mask */
1701 FALSE), /* pcrel_offset */
1702
1703 /* Like TPREL16, but for insns with a DS field. */
1704 HOWTO (R_PPC64_TPREL16_DS,
1705 0, /* rightshift */
1706 1, /* size (0 = byte, 1 = short, 2 = long) */
1707 16, /* bitsize */
1708 FALSE, /* pc_relative */
1709 0, /* bitpos */
1710 complain_overflow_signed, /* complain_on_overflow */
1711 ppc64_elf_unhandled_reloc, /* special_function */
1712 "R_PPC64_TPREL16_DS", /* name */
1713 FALSE, /* partial_inplace */
1714 0, /* src_mask */
1715 0xfffc, /* dst_mask */
1716 FALSE), /* pcrel_offset */
1717
1718 /* Like TPREL16_DS, but no overflow. */
1719 HOWTO (R_PPC64_TPREL16_LO_DS,
1720 0, /* rightshift */
1721 1, /* size (0 = byte, 1 = short, 2 = long) */
1722 16, /* bitsize */
1723 FALSE, /* pc_relative */
1724 0, /* bitpos */
1725 complain_overflow_dont, /* complain_on_overflow */
1726 ppc64_elf_unhandled_reloc, /* special_function */
1727 "R_PPC64_TPREL16_LO_DS", /* name */
1728 FALSE, /* partial_inplace */
1729 0, /* src_mask */
1730 0xfffc, /* dst_mask */
1731 FALSE), /* pcrel_offset */
1732
1733 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1734 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1735 to the first entry relative to the TOC base (r2). */
1736 HOWTO (R_PPC64_GOT_TLSGD16,
1737 0, /* rightshift */
1738 1, /* size (0 = byte, 1 = short, 2 = long) */
1739 16, /* bitsize */
1740 FALSE, /* pc_relative */
1741 0, /* bitpos */
1742 complain_overflow_signed, /* complain_on_overflow */
1743 ppc64_elf_unhandled_reloc, /* special_function */
1744 "R_PPC64_GOT_TLSGD16", /* name */
1745 FALSE, /* partial_inplace */
1746 0, /* src_mask */
1747 0xffff, /* dst_mask */
1748 FALSE), /* pcrel_offset */
1749
1750 /* Like GOT_TLSGD16, but no overflow. */
1751 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1752 0, /* rightshift */
1753 1, /* size (0 = byte, 1 = short, 2 = long) */
1754 16, /* bitsize */
1755 FALSE, /* pc_relative */
1756 0, /* bitpos */
1757 complain_overflow_dont, /* complain_on_overflow */
1758 ppc64_elf_unhandled_reloc, /* special_function */
1759 "R_PPC64_GOT_TLSGD16_LO", /* name */
1760 FALSE, /* partial_inplace */
1761 0, /* src_mask */
1762 0xffff, /* dst_mask */
1763 FALSE), /* pcrel_offset */
1764
1765 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1766 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1767 16, /* rightshift */
1768 1, /* size (0 = byte, 1 = short, 2 = long) */
1769 16, /* bitsize */
1770 FALSE, /* pc_relative */
1771 0, /* bitpos */
1772 complain_overflow_signed, /* complain_on_overflow */
1773 ppc64_elf_unhandled_reloc, /* special_function */
1774 "R_PPC64_GOT_TLSGD16_HI", /* name */
1775 FALSE, /* partial_inplace */
1776 0, /* src_mask */
1777 0xffff, /* dst_mask */
1778 FALSE), /* pcrel_offset */
1779
1780 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1781 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1782 16, /* rightshift */
1783 1, /* size (0 = byte, 1 = short, 2 = long) */
1784 16, /* bitsize */
1785 FALSE, /* pc_relative */
1786 0, /* bitpos */
1787 complain_overflow_signed, /* complain_on_overflow */
1788 ppc64_elf_unhandled_reloc, /* special_function */
1789 "R_PPC64_GOT_TLSGD16_HA", /* name */
1790 FALSE, /* partial_inplace */
1791 0, /* src_mask */
1792 0xffff, /* dst_mask */
1793 FALSE), /* pcrel_offset */
1794
1795 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1796 with values (sym+add)@dtpmod and zero, and computes the offset to the
1797 first entry relative to the TOC base (r2). */
1798 HOWTO (R_PPC64_GOT_TLSLD16,
1799 0, /* rightshift */
1800 1, /* size (0 = byte, 1 = short, 2 = long) */
1801 16, /* bitsize */
1802 FALSE, /* pc_relative */
1803 0, /* bitpos */
1804 complain_overflow_signed, /* complain_on_overflow */
1805 ppc64_elf_unhandled_reloc, /* special_function */
1806 "R_PPC64_GOT_TLSLD16", /* name */
1807 FALSE, /* partial_inplace */
1808 0, /* src_mask */
1809 0xffff, /* dst_mask */
1810 FALSE), /* pcrel_offset */
1811
1812 /* Like GOT_TLSLD16, but no overflow. */
1813 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1814 0, /* rightshift */
1815 1, /* size (0 = byte, 1 = short, 2 = long) */
1816 16, /* bitsize */
1817 FALSE, /* pc_relative */
1818 0, /* bitpos */
1819 complain_overflow_dont, /* complain_on_overflow */
1820 ppc64_elf_unhandled_reloc, /* special_function */
1821 "R_PPC64_GOT_TLSLD16_LO", /* name */
1822 FALSE, /* partial_inplace */
1823 0, /* src_mask */
1824 0xffff, /* dst_mask */
1825 FALSE), /* pcrel_offset */
1826
1827 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1828 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1829 16, /* rightshift */
1830 1, /* size (0 = byte, 1 = short, 2 = long) */
1831 16, /* bitsize */
1832 FALSE, /* pc_relative */
1833 0, /* bitpos */
1834 complain_overflow_signed, /* complain_on_overflow */
1835 ppc64_elf_unhandled_reloc, /* special_function */
1836 "R_PPC64_GOT_TLSLD16_HI", /* name */
1837 FALSE, /* partial_inplace */
1838 0, /* src_mask */
1839 0xffff, /* dst_mask */
1840 FALSE), /* pcrel_offset */
1841
1842 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1843 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1844 16, /* rightshift */
1845 1, /* size (0 = byte, 1 = short, 2 = long) */
1846 16, /* bitsize */
1847 FALSE, /* pc_relative */
1848 0, /* bitpos */
1849 complain_overflow_signed, /* complain_on_overflow */
1850 ppc64_elf_unhandled_reloc, /* special_function */
1851 "R_PPC64_GOT_TLSLD16_HA", /* name */
1852 FALSE, /* partial_inplace */
1853 0, /* src_mask */
1854 0xffff, /* dst_mask */
1855 FALSE), /* pcrel_offset */
1856
1857 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1858 the offset to the entry relative to the TOC base (r2). */
1859 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1860 0, /* rightshift */
1861 1, /* size (0 = byte, 1 = short, 2 = long) */
1862 16, /* bitsize */
1863 FALSE, /* pc_relative */
1864 0, /* bitpos */
1865 complain_overflow_signed, /* complain_on_overflow */
1866 ppc64_elf_unhandled_reloc, /* special_function */
1867 "R_PPC64_GOT_DTPREL16_DS", /* name */
1868 FALSE, /* partial_inplace */
1869 0, /* src_mask */
1870 0xfffc, /* dst_mask */
1871 FALSE), /* pcrel_offset */
1872
1873 /* Like GOT_DTPREL16_DS, but no overflow. */
1874 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1875 0, /* rightshift */
1876 1, /* size (0 = byte, 1 = short, 2 = long) */
1877 16, /* bitsize */
1878 FALSE, /* pc_relative */
1879 0, /* bitpos */
1880 complain_overflow_dont, /* complain_on_overflow */
1881 ppc64_elf_unhandled_reloc, /* special_function */
1882 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1883 FALSE, /* partial_inplace */
1884 0, /* src_mask */
1885 0xfffc, /* dst_mask */
1886 FALSE), /* pcrel_offset */
1887
1888 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1889 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1890 16, /* rightshift */
1891 1, /* size (0 = byte, 1 = short, 2 = long) */
1892 16, /* bitsize */
1893 FALSE, /* pc_relative */
1894 0, /* bitpos */
1895 complain_overflow_signed, /* complain_on_overflow */
1896 ppc64_elf_unhandled_reloc, /* special_function */
1897 "R_PPC64_GOT_DTPREL16_HI", /* name */
1898 FALSE, /* partial_inplace */
1899 0, /* src_mask */
1900 0xffff, /* dst_mask */
1901 FALSE), /* pcrel_offset */
1902
1903 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1904 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1905 16, /* rightshift */
1906 1, /* size (0 = byte, 1 = short, 2 = long) */
1907 16, /* bitsize */
1908 FALSE, /* pc_relative */
1909 0, /* bitpos */
1910 complain_overflow_signed, /* complain_on_overflow */
1911 ppc64_elf_unhandled_reloc, /* special_function */
1912 "R_PPC64_GOT_DTPREL16_HA", /* name */
1913 FALSE, /* partial_inplace */
1914 0, /* src_mask */
1915 0xffff, /* dst_mask */
1916 FALSE), /* pcrel_offset */
1917
1918 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1919 offset to the entry relative to the TOC base (r2). */
1920 HOWTO (R_PPC64_GOT_TPREL16_DS,
1921 0, /* rightshift */
1922 1, /* size (0 = byte, 1 = short, 2 = long) */
1923 16, /* bitsize */
1924 FALSE, /* pc_relative */
1925 0, /* bitpos */
1926 complain_overflow_signed, /* complain_on_overflow */
1927 ppc64_elf_unhandled_reloc, /* special_function */
1928 "R_PPC64_GOT_TPREL16_DS", /* name */
1929 FALSE, /* partial_inplace */
1930 0, /* src_mask */
1931 0xfffc, /* dst_mask */
1932 FALSE), /* pcrel_offset */
1933
1934 /* Like GOT_TPREL16_DS, but no overflow. */
1935 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1936 0, /* rightshift */
1937 1, /* size (0 = byte, 1 = short, 2 = long) */
1938 16, /* bitsize */
1939 FALSE, /* pc_relative */
1940 0, /* bitpos */
1941 complain_overflow_dont, /* complain_on_overflow */
1942 ppc64_elf_unhandled_reloc, /* special_function */
1943 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1944 FALSE, /* partial_inplace */
1945 0, /* src_mask */
1946 0xfffc, /* dst_mask */
1947 FALSE), /* pcrel_offset */
1948
1949 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1950 HOWTO (R_PPC64_GOT_TPREL16_HI,
1951 16, /* rightshift */
1952 1, /* size (0 = byte, 1 = short, 2 = long) */
1953 16, /* bitsize */
1954 FALSE, /* pc_relative */
1955 0, /* bitpos */
1956 complain_overflow_signed, /* complain_on_overflow */
1957 ppc64_elf_unhandled_reloc, /* special_function */
1958 "R_PPC64_GOT_TPREL16_HI", /* name */
1959 FALSE, /* partial_inplace */
1960 0, /* src_mask */
1961 0xffff, /* dst_mask */
1962 FALSE), /* pcrel_offset */
1963
1964 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1965 HOWTO (R_PPC64_GOT_TPREL16_HA,
1966 16, /* rightshift */
1967 1, /* size (0 = byte, 1 = short, 2 = long) */
1968 16, /* bitsize */
1969 FALSE, /* pc_relative */
1970 0, /* bitpos */
1971 complain_overflow_signed, /* complain_on_overflow */
1972 ppc64_elf_unhandled_reloc, /* special_function */
1973 "R_PPC64_GOT_TPREL16_HA", /* name */
1974 FALSE, /* partial_inplace */
1975 0, /* src_mask */
1976 0xffff, /* dst_mask */
1977 FALSE), /* pcrel_offset */
1978
1979 HOWTO (R_PPC64_JMP_IREL, /* type */
1980 0, /* rightshift */
1981 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1982 0, /* bitsize */
1983 FALSE, /* pc_relative */
1984 0, /* bitpos */
1985 complain_overflow_dont, /* complain_on_overflow */
1986 ppc64_elf_unhandled_reloc, /* special_function */
1987 "R_PPC64_JMP_IREL", /* name */
1988 FALSE, /* partial_inplace */
1989 0, /* src_mask */
1990 0, /* dst_mask */
1991 FALSE), /* pcrel_offset */
1992
1993 HOWTO (R_PPC64_IRELATIVE, /* type */
1994 0, /* rightshift */
1995 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1996 64, /* bitsize */
1997 FALSE, /* pc_relative */
1998 0, /* bitpos */
1999 complain_overflow_dont, /* complain_on_overflow */
2000 bfd_elf_generic_reloc, /* special_function */
2001 "R_PPC64_IRELATIVE", /* name */
2002 FALSE, /* partial_inplace */
2003 0, /* src_mask */
2004 ONES (64), /* dst_mask */
2005 FALSE), /* pcrel_offset */
2006
2007 /* A 16 bit relative relocation. */
2008 HOWTO (R_PPC64_REL16, /* type */
2009 0, /* rightshift */
2010 1, /* size (0 = byte, 1 = short, 2 = long) */
2011 16, /* bitsize */
2012 TRUE, /* pc_relative */
2013 0, /* bitpos */
2014 complain_overflow_signed, /* complain_on_overflow */
2015 bfd_elf_generic_reloc, /* special_function */
2016 "R_PPC64_REL16", /* name */
2017 FALSE, /* partial_inplace */
2018 0, /* src_mask */
2019 0xffff, /* dst_mask */
2020 TRUE), /* pcrel_offset */
2021
2022 /* A 16 bit relative relocation without overflow. */
2023 HOWTO (R_PPC64_REL16_LO, /* type */
2024 0, /* rightshift */
2025 1, /* size (0 = byte, 1 = short, 2 = long) */
2026 16, /* bitsize */
2027 TRUE, /* pc_relative */
2028 0, /* bitpos */
2029 complain_overflow_dont,/* complain_on_overflow */
2030 bfd_elf_generic_reloc, /* special_function */
2031 "R_PPC64_REL16_LO", /* name */
2032 FALSE, /* partial_inplace */
2033 0, /* src_mask */
2034 0xffff, /* dst_mask */
2035 TRUE), /* pcrel_offset */
2036
2037 /* The high order 16 bits of a relative address. */
2038 HOWTO (R_PPC64_REL16_HI, /* type */
2039 16, /* rightshift */
2040 1, /* size (0 = byte, 1 = short, 2 = long) */
2041 16, /* bitsize */
2042 TRUE, /* pc_relative */
2043 0, /* bitpos */
2044 complain_overflow_signed, /* complain_on_overflow */
2045 bfd_elf_generic_reloc, /* special_function */
2046 "R_PPC64_REL16_HI", /* name */
2047 FALSE, /* partial_inplace */
2048 0, /* src_mask */
2049 0xffff, /* dst_mask */
2050 TRUE), /* pcrel_offset */
2051
2052 /* The high order 16 bits of a relative address, plus 1 if the contents of
2053 the low 16 bits, treated as a signed number, is negative. */
2054 HOWTO (R_PPC64_REL16_HA, /* type */
2055 16, /* rightshift */
2056 1, /* size (0 = byte, 1 = short, 2 = long) */
2057 16, /* bitsize */
2058 TRUE, /* pc_relative */
2059 0, /* bitpos */
2060 complain_overflow_signed, /* complain_on_overflow */
2061 ppc64_elf_ha_reloc, /* special_function */
2062 "R_PPC64_REL16_HA", /* name */
2063 FALSE, /* partial_inplace */
2064 0, /* src_mask */
2065 0xffff, /* dst_mask */
2066 TRUE), /* pcrel_offset */
2067
2068 /* Like R_PPC64_REL16_HA but for split field in addpcis. */
2069 HOWTO (R_PPC64_REL16DX_HA, /* type */
2070 16, /* rightshift */
2071 2, /* size (0 = byte, 1 = short, 2 = long) */
2072 16, /* bitsize */
2073 TRUE, /* pc_relative */
2074 0, /* bitpos */
2075 complain_overflow_signed, /* complain_on_overflow */
2076 ppc64_elf_ha_reloc, /* special_function */
2077 "R_PPC64_REL16DX_HA", /* name */
2078 FALSE, /* partial_inplace */
2079 0, /* src_mask */
2080 0x1fffc1, /* dst_mask */
2081 TRUE), /* pcrel_offset */
2082
2083 /* A split-field reloc for addpcis, non-relative (gas internal use only). */
2084 HOWTO (R_PPC64_16DX_HA, /* type */
2085 16, /* rightshift */
2086 2, /* size (0 = byte, 1 = short, 2 = long) */
2087 16, /* bitsize */
2088 FALSE, /* pc_relative */
2089 0, /* bitpos */
2090 complain_overflow_signed, /* complain_on_overflow */
2091 ppc64_elf_ha_reloc, /* special_function */
2092 "R_PPC64_16DX_HA", /* name */
2093 FALSE, /* partial_inplace */
2094 0, /* src_mask */
2095 0x1fffc1, /* dst_mask */
2096 FALSE), /* pcrel_offset */
2097
2098 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2099 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2100 16, /* rightshift */
2101 1, /* size (0 = byte, 1 = short, 2 = long) */
2102 16, /* bitsize */
2103 FALSE, /* pc_relative */
2104 0, /* bitpos */
2105 complain_overflow_dont, /* complain_on_overflow */
2106 bfd_elf_generic_reloc, /* special_function */
2107 "R_PPC64_ADDR16_HIGH", /* name */
2108 FALSE, /* partial_inplace */
2109 0, /* src_mask */
2110 0xffff, /* dst_mask */
2111 FALSE), /* pcrel_offset */
2112
2113 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2114 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2115 16, /* rightshift */
2116 1, /* size (0 = byte, 1 = short, 2 = long) */
2117 16, /* bitsize */
2118 FALSE, /* pc_relative */
2119 0, /* bitpos */
2120 complain_overflow_dont, /* complain_on_overflow */
2121 ppc64_elf_ha_reloc, /* special_function */
2122 "R_PPC64_ADDR16_HIGHA", /* name */
2123 FALSE, /* partial_inplace */
2124 0, /* src_mask */
2125 0xffff, /* dst_mask */
2126 FALSE), /* pcrel_offset */
2127
2128 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2129 HOWTO (R_PPC64_DTPREL16_HIGH,
2130 16, /* rightshift */
2131 1, /* size (0 = byte, 1 = short, 2 = long) */
2132 16, /* bitsize */
2133 FALSE, /* pc_relative */
2134 0, /* bitpos */
2135 complain_overflow_dont, /* complain_on_overflow */
2136 ppc64_elf_unhandled_reloc, /* special_function */
2137 "R_PPC64_DTPREL16_HIGH", /* name */
2138 FALSE, /* partial_inplace */
2139 0, /* src_mask */
2140 0xffff, /* dst_mask */
2141 FALSE), /* pcrel_offset */
2142
2143 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2144 HOWTO (R_PPC64_DTPREL16_HIGHA,
2145 16, /* rightshift */
2146 1, /* size (0 = byte, 1 = short, 2 = long) */
2147 16, /* bitsize */
2148 FALSE, /* pc_relative */
2149 0, /* bitpos */
2150 complain_overflow_dont, /* complain_on_overflow */
2151 ppc64_elf_unhandled_reloc, /* special_function */
2152 "R_PPC64_DTPREL16_HIGHA", /* name */
2153 FALSE, /* partial_inplace */
2154 0, /* src_mask */
2155 0xffff, /* dst_mask */
2156 FALSE), /* pcrel_offset */
2157
2158 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2159 HOWTO (R_PPC64_TPREL16_HIGH,
2160 16, /* rightshift */
2161 1, /* size (0 = byte, 1 = short, 2 = long) */
2162 16, /* bitsize */
2163 FALSE, /* pc_relative */
2164 0, /* bitpos */
2165 complain_overflow_dont, /* complain_on_overflow */
2166 ppc64_elf_unhandled_reloc, /* special_function */
2167 "R_PPC64_TPREL16_HIGH", /* name */
2168 FALSE, /* partial_inplace */
2169 0, /* src_mask */
2170 0xffff, /* dst_mask */
2171 FALSE), /* pcrel_offset */
2172
2173 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2174 HOWTO (R_PPC64_TPREL16_HIGHA,
2175 16, /* rightshift */
2176 1, /* size (0 = byte, 1 = short, 2 = long) */
2177 16, /* bitsize */
2178 FALSE, /* pc_relative */
2179 0, /* bitpos */
2180 complain_overflow_dont, /* complain_on_overflow */
2181 ppc64_elf_unhandled_reloc, /* special_function */
2182 "R_PPC64_TPREL16_HIGHA", /* name */
2183 FALSE, /* partial_inplace */
2184 0, /* src_mask */
2185 0xffff, /* dst_mask */
2186 FALSE), /* pcrel_offset */
2187
2188 /* Marker reloc on ELFv2 large-model function entry. */
2189 HOWTO (R_PPC64_ENTRY,
2190 0, /* rightshift */
2191 2, /* size (0 = byte, 1 = short, 2 = long) */
2192 32, /* bitsize */
2193 FALSE, /* pc_relative */
2194 0, /* bitpos */
2195 complain_overflow_dont, /* complain_on_overflow */
2196 bfd_elf_generic_reloc, /* special_function */
2197 "R_PPC64_ENTRY", /* name */
2198 FALSE, /* partial_inplace */
2199 0, /* src_mask */
2200 0, /* dst_mask */
2201 FALSE), /* pcrel_offset */
2202
2203 /* Like ADDR64, but use local entry point of function. */
2204 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2205 0, /* rightshift */
2206 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2207 64, /* bitsize */
2208 FALSE, /* pc_relative */
2209 0, /* bitpos */
2210 complain_overflow_dont, /* complain_on_overflow */
2211 bfd_elf_generic_reloc, /* special_function */
2212 "R_PPC64_ADDR64_LOCAL", /* name */
2213 FALSE, /* partial_inplace */
2214 0, /* src_mask */
2215 ONES (64), /* dst_mask */
2216 FALSE), /* pcrel_offset */
2217
2218 /* GNU extension to record C++ vtable hierarchy. */
2219 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2220 0, /* rightshift */
2221 0, /* size (0 = byte, 1 = short, 2 = long) */
2222 0, /* bitsize */
2223 FALSE, /* pc_relative */
2224 0, /* bitpos */
2225 complain_overflow_dont, /* complain_on_overflow */
2226 NULL, /* special_function */
2227 "R_PPC64_GNU_VTINHERIT", /* name */
2228 FALSE, /* partial_inplace */
2229 0, /* src_mask */
2230 0, /* dst_mask */
2231 FALSE), /* pcrel_offset */
2232
2233 /* GNU extension to record C++ vtable member usage. */
2234 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2235 0, /* rightshift */
2236 0, /* size (0 = byte, 1 = short, 2 = long) */
2237 0, /* bitsize */
2238 FALSE, /* pc_relative */
2239 0, /* bitpos */
2240 complain_overflow_dont, /* complain_on_overflow */
2241 NULL, /* special_function */
2242 "R_PPC64_GNU_VTENTRY", /* name */
2243 FALSE, /* partial_inplace */
2244 0, /* src_mask */
2245 0, /* dst_mask */
2246 FALSE), /* pcrel_offset */
2247 };
2248
2249 \f
2250 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2251 be done. */
2252
2253 static void
2254 ppc_howto_init (void)
2255 {
2256 unsigned int i, type;
2257
2258 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2259 {
2260 type = ppc64_elf_howto_raw[i].type;
2261 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
2262 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2263 }
2264 }
2265
2266 static reloc_howto_type *
2267 ppc64_elf_reloc_type_lookup (bfd *abfd,
2268 bfd_reloc_code_real_type code)
2269 {
2270 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2271
2272 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2273 /* Initialize howto table if needed. */
2274 ppc_howto_init ();
2275
2276 switch (code)
2277 {
2278 default:
2279 /* xgettext:c-format */
2280 _bfd_error_handler (_("%pB: unsupported relocation type %#x"), abfd, (int) code);
2281 bfd_set_error (bfd_error_bad_value);
2282 return NULL;
2283
2284 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2285 break;
2286 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2287 break;
2288 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2289 break;
2290 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2291 break;
2292 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2293 break;
2294 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2295 break;
2296 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2297 break;
2298 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2299 break;
2300 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2301 break;
2302 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2303 break;
2304 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2305 break;
2306 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2307 break;
2308 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2309 break;
2310 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2311 break;
2312 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2313 break;
2314 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2315 break;
2316 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2317 break;
2318 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2319 break;
2320 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2321 break;
2322 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2323 break;
2324 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2325 break;
2326 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2327 break;
2328 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2329 break;
2330 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2331 break;
2332 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2333 break;
2334 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2335 break;
2336 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2337 break;
2338 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2339 break;
2340 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2341 break;
2342 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2343 break;
2344 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2345 break;
2346 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2347 break;
2348 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2349 break;
2350 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2351 break;
2352 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2353 break;
2354 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2355 break;
2356 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2357 break;
2358 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2359 break;
2360 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2361 break;
2362 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2363 break;
2364 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2365 break;
2366 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2367 break;
2368 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2369 break;
2370 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2371 break;
2372 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2373 break;
2374 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2375 break;
2376 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2377 break;
2378 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2379 break;
2380 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2381 break;
2382 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2383 break;
2384 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2385 break;
2386 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2387 break;
2388 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2389 break;
2390 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2391 break;
2392 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2393 break;
2394 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2395 break;
2396 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2397 break;
2398 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2399 break;
2400 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2401 break;
2402 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2403 break;
2404 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2405 break;
2406 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2407 break;
2408 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2409 break;
2410 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2411 break;
2412 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2413 break;
2414 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2415 break;
2416 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2417 break;
2418 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2419 break;
2420 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2421 break;
2422 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2423 break;
2424 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2425 break;
2426 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2427 break;
2428 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2429 break;
2430 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2431 break;
2432 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2433 break;
2434 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2435 break;
2436 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2437 break;
2438 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2439 break;
2440 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2441 break;
2442 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2443 break;
2444 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2445 break;
2446 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2447 break;
2448 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2449 break;
2450 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2451 break;
2452 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2453 break;
2454 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2455 break;
2456 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2457 break;
2458 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2459 break;
2460 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2461 break;
2462 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2463 break;
2464 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2465 break;
2466 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2467 break;
2468 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2469 break;
2470 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2471 break;
2472 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2473 break;
2474 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2475 break;
2476 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2477 break;
2478 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2479 break;
2480 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2481 break;
2482 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2483 break;
2484 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2485 break;
2486 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2487 break;
2488 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2489 break;
2490 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2491 break;
2492 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2493 break;
2494 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2495 break;
2496 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2497 break;
2498 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2499 break;
2500 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2501 break;
2502 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2503 break;
2504 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2505 break;
2506 case BFD_RELOC_PPC_16DX_HA: r = R_PPC64_16DX_HA;
2507 break;
2508 case BFD_RELOC_PPC_REL16DX_HA: r = R_PPC64_REL16DX_HA;
2509 break;
2510 case BFD_RELOC_PPC64_ENTRY: r = R_PPC64_ENTRY;
2511 break;
2512 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2513 break;
2514 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2515 break;
2516 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2517 break;
2518 }
2519
2520 return ppc64_elf_howto_table[r];
2521 };
2522
2523 static reloc_howto_type *
2524 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2525 const char *r_name)
2526 {
2527 unsigned int i;
2528
2529 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2530 if (ppc64_elf_howto_raw[i].name != NULL
2531 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2532 return &ppc64_elf_howto_raw[i];
2533
2534
2535 return NULL;
2536 }
2537
2538 /* Set the howto pointer for a PowerPC ELF reloc. */
2539
2540 static bfd_boolean
2541 ppc64_elf_info_to_howto (bfd *abfd, arelent *cache_ptr,
2542 Elf_Internal_Rela *dst)
2543 {
2544 unsigned int type;
2545
2546 /* Initialize howto table if needed. */
2547 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2548 ppc_howto_init ();
2549
2550 type = ELF64_R_TYPE (dst->r_info);
2551 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
2552 {
2553 /* xgettext:c-format */
2554 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2555 abfd, type);
2556 bfd_set_error (bfd_error_bad_value);
2557 return FALSE;
2558 }
2559 cache_ptr->howto = ppc64_elf_howto_table[type];
2560 if (cache_ptr->howto == NULL || cache_ptr->howto->name == NULL)
2561 {
2562 /* xgettext:c-format */
2563 _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
2564 abfd, type);
2565 bfd_set_error (bfd_error_bad_value);
2566 return FALSE;
2567 }
2568
2569 return TRUE;
2570 }
2571
2572 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2573
2574 static bfd_reloc_status_type
2575 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2576 void *data, asection *input_section,
2577 bfd *output_bfd, char **error_message)
2578 {
2579 enum elf_ppc64_reloc_type r_type;
2580 long insn;
2581 bfd_size_type octets;
2582 bfd_vma value;
2583
2584 /* If this is a relocatable link (output_bfd test tells us), just
2585 call the generic function. Any adjustment will be done at final
2586 link time. */
2587 if (output_bfd != NULL)
2588 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2589 input_section, output_bfd, error_message);
2590
2591 /* Adjust the addend for sign extension of the low 16 bits.
2592 We won't actually be using the low 16 bits, so trashing them
2593 doesn't matter. */
2594 reloc_entry->addend += 0x8000;
2595 r_type = reloc_entry->howto->type;
2596 if (r_type != R_PPC64_REL16DX_HA)
2597 return bfd_reloc_continue;
2598
2599 value = 0;
2600 if (!bfd_is_com_section (symbol->section))
2601 value = symbol->value;
2602 value += (reloc_entry->addend
2603 + symbol->section->output_offset
2604 + symbol->section->output_section->vma);
2605 value -= (reloc_entry->address
2606 + input_section->output_offset
2607 + input_section->output_section->vma);
2608 value = (bfd_signed_vma) value >> 16;
2609
2610 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2611 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2612 insn &= ~0x1fffc1;
2613 insn |= (value & 0xffc1) | ((value & 0x3e) << 15);
2614 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2615 if (value + 0x8000 > 0xffff)
2616 return bfd_reloc_overflow;
2617 return bfd_reloc_ok;
2618 }
2619
2620 static bfd_reloc_status_type
2621 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2622 void *data, asection *input_section,
2623 bfd *output_bfd, char **error_message)
2624 {
2625 if (output_bfd != NULL)
2626 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2627 input_section, output_bfd, error_message);
2628
2629 if (strcmp (symbol->section->name, ".opd") == 0
2630 && (symbol->section->owner->flags & DYNAMIC) == 0)
2631 {
2632 bfd_vma dest = opd_entry_value (symbol->section,
2633 symbol->value + reloc_entry->addend,
2634 NULL, NULL, FALSE);
2635 if (dest != (bfd_vma) -1)
2636 reloc_entry->addend = dest - (symbol->value
2637 + symbol->section->output_section->vma
2638 + symbol->section->output_offset);
2639 }
2640 else
2641 {
2642 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2643
2644 if (symbol->section->owner != abfd
2645 && symbol->section->owner != NULL
2646 && abiversion (symbol->section->owner) >= 2)
2647 {
2648 unsigned int i;
2649
2650 for (i = 0; i < symbol->section->owner->symcount; ++i)
2651 {
2652 asymbol *symdef = symbol->section->owner->outsymbols[i];
2653
2654 if (strcmp (symdef->name, symbol->name) == 0)
2655 {
2656 elfsym = (elf_symbol_type *) symdef;
2657 break;
2658 }
2659 }
2660 }
2661 reloc_entry->addend
2662 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2663 }
2664 return bfd_reloc_continue;
2665 }
2666
2667 static bfd_reloc_status_type
2668 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2669 void *data, asection *input_section,
2670 bfd *output_bfd, char **error_message)
2671 {
2672 long insn;
2673 enum elf_ppc64_reloc_type r_type;
2674 bfd_size_type octets;
2675 /* Assume 'at' branch hints. */
2676 bfd_boolean is_isa_v2 = TRUE;
2677
2678 /* If this is a relocatable link (output_bfd test tells us), just
2679 call the generic function. Any adjustment will be done at final
2680 link time. */
2681 if (output_bfd != NULL)
2682 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2683 input_section, output_bfd, error_message);
2684
2685 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2686 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2687 insn &= ~(0x01 << 21);
2688 r_type = reloc_entry->howto->type;
2689 if (r_type == R_PPC64_ADDR14_BRTAKEN
2690 || r_type == R_PPC64_REL14_BRTAKEN)
2691 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2692
2693 if (is_isa_v2)
2694 {
2695 /* Set 'a' bit. This is 0b00010 in BO field for branch
2696 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2697 for branch on CTR insns (BO == 1a00t or 1a01t). */
2698 if ((insn & (0x14 << 21)) == (0x04 << 21))
2699 insn |= 0x02 << 21;
2700 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2701 insn |= 0x08 << 21;
2702 else
2703 goto out;
2704 }
2705 else
2706 {
2707 bfd_vma target = 0;
2708 bfd_vma from;
2709
2710 if (!bfd_is_com_section (symbol->section))
2711 target = symbol->value;
2712 target += symbol->section->output_section->vma;
2713 target += symbol->section->output_offset;
2714 target += reloc_entry->addend;
2715
2716 from = (reloc_entry->address
2717 + input_section->output_offset
2718 + input_section->output_section->vma);
2719
2720 /* Invert 'y' bit if not the default. */
2721 if ((bfd_signed_vma) (target - from) < 0)
2722 insn ^= 0x01 << 21;
2723 }
2724 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2725 out:
2726 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2727 input_section, output_bfd, error_message);
2728 }
2729
2730 static bfd_reloc_status_type
2731 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2732 void *data, asection *input_section,
2733 bfd *output_bfd, char **error_message)
2734 {
2735 /* If this is a relocatable link (output_bfd test tells us), just
2736 call the generic function. Any adjustment will be done at final
2737 link time. */
2738 if (output_bfd != NULL)
2739 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2740 input_section, output_bfd, error_message);
2741
2742 /* Subtract the symbol section base address. */
2743 reloc_entry->addend -= symbol->section->output_section->vma;
2744 return bfd_reloc_continue;
2745 }
2746
2747 static bfd_reloc_status_type
2748 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2749 void *data, asection *input_section,
2750 bfd *output_bfd, char **error_message)
2751 {
2752 /* If this is a relocatable link (output_bfd test tells us), just
2753 call the generic function. Any adjustment will be done at final
2754 link time. */
2755 if (output_bfd != NULL)
2756 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2757 input_section, output_bfd, error_message);
2758
2759 /* Subtract the symbol section base address. */
2760 reloc_entry->addend -= symbol->section->output_section->vma;
2761
2762 /* Adjust the addend for sign extension of the low 16 bits. */
2763 reloc_entry->addend += 0x8000;
2764 return bfd_reloc_continue;
2765 }
2766
2767 static bfd_reloc_status_type
2768 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2769 void *data, asection *input_section,
2770 bfd *output_bfd, char **error_message)
2771 {
2772 bfd_vma TOCstart;
2773
2774 /* If this is a relocatable link (output_bfd test tells us), just
2775 call the generic function. Any adjustment will be done at final
2776 link time. */
2777 if (output_bfd != NULL)
2778 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2779 input_section, output_bfd, error_message);
2780
2781 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2782 if (TOCstart == 0)
2783 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2784
2785 /* Subtract the TOC base address. */
2786 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2787 return bfd_reloc_continue;
2788 }
2789
2790 static bfd_reloc_status_type
2791 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2792 void *data, asection *input_section,
2793 bfd *output_bfd, char **error_message)
2794 {
2795 bfd_vma TOCstart;
2796
2797 /* If this is a relocatable link (output_bfd test tells us), just
2798 call the generic function. Any adjustment will be done at final
2799 link time. */
2800 if (output_bfd != NULL)
2801 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2802 input_section, output_bfd, error_message);
2803
2804 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2805 if (TOCstart == 0)
2806 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2807
2808 /* Subtract the TOC base address. */
2809 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2810
2811 /* Adjust the addend for sign extension of the low 16 bits. */
2812 reloc_entry->addend += 0x8000;
2813 return bfd_reloc_continue;
2814 }
2815
2816 static bfd_reloc_status_type
2817 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2818 void *data, asection *input_section,
2819 bfd *output_bfd, char **error_message)
2820 {
2821 bfd_vma TOCstart;
2822 bfd_size_type octets;
2823
2824 /* If this is a relocatable link (output_bfd test tells us), just
2825 call the generic function. Any adjustment will be done at final
2826 link time. */
2827 if (output_bfd != NULL)
2828 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2829 input_section, output_bfd, error_message);
2830
2831 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2832 if (TOCstart == 0)
2833 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2834
2835 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2836 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2837 return bfd_reloc_ok;
2838 }
2839
2840 static bfd_reloc_status_type
2841 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2842 void *data, asection *input_section,
2843 bfd *output_bfd, char **error_message)
2844 {
2845 /* If this is a relocatable link (output_bfd test tells us), just
2846 call the generic function. Any adjustment will be done at final
2847 link time. */
2848 if (output_bfd != NULL)
2849 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2850 input_section, output_bfd, error_message);
2851
2852 if (error_message != NULL)
2853 {
2854 static char buf[60];
2855 sprintf (buf, "generic linker can't handle %s",
2856 reloc_entry->howto->name);
2857 *error_message = buf;
2858 }
2859 return bfd_reloc_dangerous;
2860 }
2861
2862 /* Track GOT entries needed for a given symbol. We might need more
2863 than one got entry per symbol. */
2864 struct got_entry
2865 {
2866 struct got_entry *next;
2867
2868 /* The symbol addend that we'll be placing in the GOT. */
2869 bfd_vma addend;
2870
2871 /* Unlike other ELF targets, we use separate GOT entries for the same
2872 symbol referenced from different input files. This is to support
2873 automatic multiple TOC/GOT sections, where the TOC base can vary
2874 from one input file to another. After partitioning into TOC groups
2875 we merge entries within the group.
2876
2877 Point to the BFD owning this GOT entry. */
2878 bfd *owner;
2879
2880 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2881 TLS_TPREL or TLS_DTPREL for tls entries. */
2882 unsigned char tls_type;
2883
2884 /* Non-zero if got.ent points to real entry. */
2885 unsigned char is_indirect;
2886
2887 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2888 union
2889 {
2890 bfd_signed_vma refcount;
2891 bfd_vma offset;
2892 struct got_entry *ent;
2893 } got;
2894 };
2895
2896 /* The same for PLT. */
2897 struct plt_entry
2898 {
2899 struct plt_entry *next;
2900
2901 bfd_vma addend;
2902
2903 union
2904 {
2905 bfd_signed_vma refcount;
2906 bfd_vma offset;
2907 } plt;
2908 };
2909
2910 struct ppc64_elf_obj_tdata
2911 {
2912 struct elf_obj_tdata elf;
2913
2914 /* Shortcuts to dynamic linker sections. */
2915 asection *got;
2916 asection *relgot;
2917
2918 /* Used during garbage collection. We attach global symbols defined
2919 on removed .opd entries to this section so that the sym is removed. */
2920 asection *deleted_section;
2921
2922 /* TLS local dynamic got entry handling. Support for multiple GOT
2923 sections means we potentially need one of these for each input bfd. */
2924 struct got_entry tlsld_got;
2925
2926 union {
2927 /* A copy of relocs before they are modified for --emit-relocs. */
2928 Elf_Internal_Rela *relocs;
2929
2930 /* Section contents. */
2931 bfd_byte *contents;
2932 } opd;
2933
2934 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2935 the reloc to be in the range -32768 to 32767. */
2936 unsigned int has_small_toc_reloc : 1;
2937
2938 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2939 instruction not one we handle. */
2940 unsigned int unexpected_toc_insn : 1;
2941 };
2942
2943 #define ppc64_elf_tdata(bfd) \
2944 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2945
2946 #define ppc64_tlsld_got(bfd) \
2947 (&ppc64_elf_tdata (bfd)->tlsld_got)
2948
2949 #define is_ppc64_elf(bfd) \
2950 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2951 && elf_object_id (bfd) == PPC64_ELF_DATA)
2952
2953 /* Override the generic function because we store some extras. */
2954
2955 static bfd_boolean
2956 ppc64_elf_mkobject (bfd *abfd)
2957 {
2958 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2959 PPC64_ELF_DATA);
2960 }
2961
2962 /* Fix bad default arch selected for a 64 bit input bfd when the
2963 default is 32 bit. Also select arch based on apuinfo. */
2964
2965 static bfd_boolean
2966 ppc64_elf_object_p (bfd *abfd)
2967 {
2968 if (!abfd->arch_info->the_default)
2969 return TRUE;
2970
2971 if (abfd->arch_info->bits_per_word == 32)
2972 {
2973 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2974
2975 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2976 {
2977 /* Relies on arch after 32 bit default being 64 bit default. */
2978 abfd->arch_info = abfd->arch_info->next;
2979 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2980 }
2981 }
2982 return _bfd_elf_ppc_set_arch (abfd);
2983 }
2984
2985 /* Support for core dump NOTE sections. */
2986
2987 static bfd_boolean
2988 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2989 {
2990 size_t offset, size;
2991
2992 if (note->descsz != 504)
2993 return FALSE;
2994
2995 /* pr_cursig */
2996 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2997
2998 /* pr_pid */
2999 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
3000
3001 /* pr_reg */
3002 offset = 112;
3003 size = 384;
3004
3005 /* Make a ".reg/999" section. */
3006 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3007 size, note->descpos + offset);
3008 }
3009
3010 static bfd_boolean
3011 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3012 {
3013 if (note->descsz != 136)
3014 return FALSE;
3015
3016 elf_tdata (abfd)->core->pid
3017 = bfd_get_32 (abfd, note->descdata + 24);
3018 elf_tdata (abfd)->core->program
3019 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3020 elf_tdata (abfd)->core->command
3021 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
3022
3023 return TRUE;
3024 }
3025
3026 static char *
3027 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
3028 ...)
3029 {
3030 switch (note_type)
3031 {
3032 default:
3033 return NULL;
3034
3035 case NT_PRPSINFO:
3036 {
3037 char data[136];
3038 va_list ap;
3039
3040 va_start (ap, note_type);
3041 memset (data, 0, sizeof (data));
3042 strncpy (data + 40, va_arg (ap, const char *), 16);
3043 strncpy (data + 56, va_arg (ap, const char *), 80);
3044 va_end (ap);
3045 return elfcore_write_note (abfd, buf, bufsiz,
3046 "CORE", note_type, data, sizeof (data));
3047 }
3048
3049 case NT_PRSTATUS:
3050 {
3051 char data[504];
3052 va_list ap;
3053 long pid;
3054 int cursig;
3055 const void *greg;
3056
3057 va_start (ap, note_type);
3058 memset (data, 0, 112);
3059 pid = va_arg (ap, long);
3060 bfd_put_32 (abfd, pid, data + 32);
3061 cursig = va_arg (ap, int);
3062 bfd_put_16 (abfd, cursig, data + 12);
3063 greg = va_arg (ap, const void *);
3064 memcpy (data + 112, greg, 384);
3065 memset (data + 496, 0, 8);
3066 va_end (ap);
3067 return elfcore_write_note (abfd, buf, bufsiz,
3068 "CORE", note_type, data, sizeof (data));
3069 }
3070 }
3071 }
3072
3073 /* Add extra PPC sections. */
3074
3075 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
3076 {
3077 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
3078 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3079 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3080 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3081 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
3082 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
3083 { NULL, 0, 0, 0, 0 }
3084 };
3085
3086 enum _ppc64_sec_type {
3087 sec_normal = 0,
3088 sec_opd = 1,
3089 sec_toc = 2
3090 };
3091
3092 struct _ppc64_elf_section_data
3093 {
3094 struct bfd_elf_section_data elf;
3095
3096 union
3097 {
3098 /* An array with one entry for each opd function descriptor,
3099 and some spares since opd entries may be either 16 or 24 bytes. */
3100 #define OPD_NDX(OFF) ((OFF) >> 4)
3101 struct _opd_sec_data
3102 {
3103 /* Points to the function code section for local opd entries. */
3104 asection **func_sec;
3105
3106 /* After editing .opd, adjust references to opd local syms. */
3107 long *adjust;
3108 } opd;
3109
3110 /* An array for toc sections, indexed by offset/8. */
3111 struct _toc_sec_data
3112 {
3113 /* Specifies the relocation symbol index used at a given toc offset. */
3114 unsigned *symndx;
3115
3116 /* And the relocation addend. */
3117 bfd_vma *add;
3118 } toc;
3119 } u;
3120
3121 enum _ppc64_sec_type sec_type:2;
3122
3123 /* Flag set when small branches are detected. Used to
3124 select suitable defaults for the stub group size. */
3125 unsigned int has_14bit_branch:1;
3126 };
3127
3128 #define ppc64_elf_section_data(sec) \
3129 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
3130
3131 static bfd_boolean
3132 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
3133 {
3134 if (!sec->used_by_bfd)
3135 {
3136 struct _ppc64_elf_section_data *sdata;
3137 bfd_size_type amt = sizeof (*sdata);
3138
3139 sdata = bfd_zalloc (abfd, amt);
3140 if (sdata == NULL)
3141 return FALSE;
3142 sec->used_by_bfd = sdata;
3143 }
3144
3145 return _bfd_elf_new_section_hook (abfd, sec);
3146 }
3147
3148 static struct _opd_sec_data *
3149 get_opd_info (asection * sec)
3150 {
3151 if (sec != NULL
3152 && ppc64_elf_section_data (sec) != NULL
3153 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
3154 return &ppc64_elf_section_data (sec)->u.opd;
3155 return NULL;
3156 }
3157 \f
3158 /* Parameters for the qsort hook. */
3159 static bfd_boolean synthetic_relocatable;
3160 static asection *synthetic_opd;
3161
3162 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
3163
3164 static int
3165 compare_symbols (const void *ap, const void *bp)
3166 {
3167 const asymbol *a = * (const asymbol **) ap;
3168 const asymbol *b = * (const asymbol **) bp;
3169
3170 /* Section symbols first. */
3171 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
3172 return -1;
3173 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
3174 return 1;
3175
3176 /* then .opd symbols. */
3177 if (synthetic_opd != NULL)
3178 {
3179 if (strcmp (a->section->name, ".opd") == 0
3180 && strcmp (b->section->name, ".opd") != 0)
3181 return -1;
3182 if (strcmp (a->section->name, ".opd") != 0
3183 && strcmp (b->section->name, ".opd") == 0)
3184 return 1;
3185 }
3186
3187 /* then other code symbols. */
3188 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3189 == (SEC_CODE | SEC_ALLOC)
3190 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3191 != (SEC_CODE | SEC_ALLOC))
3192 return -1;
3193
3194 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3195 != (SEC_CODE | SEC_ALLOC)
3196 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3197 == (SEC_CODE | SEC_ALLOC))
3198 return 1;
3199
3200 if (synthetic_relocatable)
3201 {
3202 if (a->section->id < b->section->id)
3203 return -1;
3204
3205 if (a->section->id > b->section->id)
3206 return 1;
3207 }
3208
3209 if (a->value + a->section->vma < b->value + b->section->vma)
3210 return -1;
3211
3212 if (a->value + a->section->vma > b->value + b->section->vma)
3213 return 1;
3214
3215 /* For syms with the same value, prefer strong dynamic global function
3216 syms over other syms. */
3217 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3218 return -1;
3219
3220 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3221 return 1;
3222
3223 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3224 return -1;
3225
3226 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3227 return 1;
3228
3229 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3230 return -1;
3231
3232 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3233 return 1;
3234
3235 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3236 return -1;
3237
3238 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3239 return 1;
3240
3241 return a > b;
3242 }
3243
3244 /* Search SYMS for a symbol of the given VALUE. */
3245
3246 static asymbol *
3247 sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
3248 {
3249 long mid;
3250
3251 if (id == (unsigned) -1)
3252 {
3253 while (lo < hi)
3254 {
3255 mid = (lo + hi) >> 1;
3256 if (syms[mid]->value + syms[mid]->section->vma < value)
3257 lo = mid + 1;
3258 else if (syms[mid]->value + syms[mid]->section->vma > value)
3259 hi = mid;
3260 else
3261 return syms[mid];
3262 }
3263 }
3264 else
3265 {
3266 while (lo < hi)
3267 {
3268 mid = (lo + hi) >> 1;
3269 if (syms[mid]->section->id < id)
3270 lo = mid + 1;
3271 else if (syms[mid]->section->id > id)
3272 hi = mid;
3273 else if (syms[mid]->value < value)
3274 lo = mid + 1;
3275 else if (syms[mid]->value > value)
3276 hi = mid;
3277 else
3278 return syms[mid];
3279 }
3280 }
3281 return NULL;
3282 }
3283
3284 static bfd_boolean
3285 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3286 {
3287 bfd_vma vma = *(bfd_vma *) ptr;
3288 return ((section->flags & SEC_ALLOC) != 0
3289 && section->vma <= vma
3290 && vma < section->vma + section->size);
3291 }
3292
3293 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3294 entry syms. Also generate @plt symbols for the glink branch table.
3295 Returns count of synthetic symbols in RET or -1 on error. */
3296
3297 static long
3298 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3299 long static_count, asymbol **static_syms,
3300 long dyn_count, asymbol **dyn_syms,
3301 asymbol **ret)
3302 {
3303 asymbol *s;
3304 size_t i, j, count;
3305 char *names;
3306 size_t symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3307 asection *opd = NULL;
3308 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3309 asymbol **syms;
3310 int abi = abiversion (abfd);
3311
3312 *ret = NULL;
3313
3314 if (abi < 2)
3315 {
3316 opd = bfd_get_section_by_name (abfd, ".opd");
3317 if (opd == NULL && abi == 1)
3318 return 0;
3319 }
3320
3321 syms = NULL;
3322 codesecsym = 0;
3323 codesecsymend = 0;
3324 secsymend = 0;
3325 opdsymend = 0;
3326 symcount = 0;
3327 if (opd != NULL)
3328 {
3329 symcount = static_count;
3330 if (!relocatable)
3331 symcount += dyn_count;
3332 if (symcount == 0)
3333 return 0;
3334
3335 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3336 if (syms == NULL)
3337 return -1;
3338
3339 if (!relocatable && static_count != 0 && dyn_count != 0)
3340 {
3341 /* Use both symbol tables. */
3342 memcpy (syms, static_syms, static_count * sizeof (*syms));
3343 memcpy (syms + static_count, dyn_syms,
3344 (dyn_count + 1) * sizeof (*syms));
3345 }
3346 else if (!relocatable && static_count == 0)
3347 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3348 else
3349 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3350
3351 /* Trim uninteresting symbols. Interesting symbols are section,
3352 function, and notype symbols. */
3353 for (i = 0, j = 0; i < symcount; ++i)
3354 if ((syms[i]->flags & (BSF_FILE | BSF_OBJECT | BSF_THREAD_LOCAL
3355 | BSF_RELC | BSF_SRELC)) == 0)
3356 syms[j++] = syms[i];
3357 symcount = j;
3358
3359 synthetic_relocatable = relocatable;
3360 synthetic_opd = opd;
3361 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3362
3363 if (!relocatable && symcount > 1)
3364 {
3365 /* Trim duplicate syms, since we may have merged the normal and
3366 dynamic symbols. Actually, we only care about syms that have
3367 different values, so trim any with the same value. */
3368 for (i = 1, j = 1; i < symcount; ++i)
3369 if (syms[i - 1]->value + syms[i - 1]->section->vma
3370 != syms[i]->value + syms[i]->section->vma)
3371 syms[j++] = syms[i];
3372 symcount = j;
3373 }
3374
3375 i = 0;
3376 /* Note that here and in compare_symbols we can't compare opd and
3377 sym->section directly. With separate debug info files, the
3378 symbols will be extracted from the debug file while abfd passed
3379 to this function is the real binary. */
3380 if (strcmp (syms[i]->section->name, ".opd") == 0)
3381 ++i;
3382 codesecsym = i;
3383
3384 for (; i < symcount; ++i)
3385 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC
3386 | SEC_THREAD_LOCAL))
3387 != (SEC_CODE | SEC_ALLOC))
3388 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3389 break;
3390 codesecsymend = i;
3391
3392 for (; i < symcount; ++i)
3393 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3394 break;
3395 secsymend = i;
3396
3397 for (; i < symcount; ++i)
3398 if (strcmp (syms[i]->section->name, ".opd") != 0)
3399 break;
3400 opdsymend = i;
3401
3402 for (; i < symcount; ++i)
3403 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3404 != (SEC_CODE | SEC_ALLOC))
3405 break;
3406 symcount = i;
3407 }
3408 count = 0;
3409
3410 if (relocatable)
3411 {
3412 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3413 arelent *r;
3414 size_t size;
3415 size_t relcount;
3416
3417 if (opdsymend == secsymend)
3418 goto done;
3419
3420 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3421 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3422 if (relcount == 0)
3423 goto done;
3424
3425 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3426 {
3427 count = -1;
3428 goto done;
3429 }
3430
3431 size = 0;
3432 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3433 {
3434 asymbol *sym;
3435
3436 while (r < opd->relocation + relcount
3437 && r->address < syms[i]->value + opd->vma)
3438 ++r;
3439
3440 if (r == opd->relocation + relcount)
3441 break;
3442
3443 if (r->address != syms[i]->value + opd->vma)
3444 continue;
3445
3446 if (r->howto->type != R_PPC64_ADDR64)
3447 continue;
3448
3449 sym = *r->sym_ptr_ptr;
3450 if (!sym_exists_at (syms, opdsymend, symcount,
3451 sym->section->id, sym->value + r->addend))
3452 {
3453 ++count;
3454 size += sizeof (asymbol);
3455 size += strlen (syms[i]->name) + 2;
3456 }
3457 }
3458
3459 if (size == 0)
3460 goto done;
3461 s = *ret = bfd_malloc (size);
3462 if (s == NULL)
3463 {
3464 count = -1;
3465 goto done;
3466 }
3467
3468 names = (char *) (s + count);
3469
3470 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3471 {
3472 asymbol *sym;
3473
3474 while (r < opd->relocation + relcount
3475 && r->address < syms[i]->value + opd->vma)
3476 ++r;
3477
3478 if (r == opd->relocation + relcount)
3479 break;
3480
3481 if (r->address != syms[i]->value + opd->vma)
3482 continue;
3483
3484 if (r->howto->type != R_PPC64_ADDR64)
3485 continue;
3486
3487 sym = *r->sym_ptr_ptr;
3488 if (!sym_exists_at (syms, opdsymend, symcount,
3489 sym->section->id, sym->value + r->addend))
3490 {
3491 size_t len;
3492
3493 *s = *syms[i];
3494 s->flags |= BSF_SYNTHETIC;
3495 s->section = sym->section;
3496 s->value = sym->value + r->addend;
3497 s->name = names;
3498 *names++ = '.';
3499 len = strlen (syms[i]->name);
3500 memcpy (names, syms[i]->name, len + 1);
3501 names += len + 1;
3502 /* Have udata.p point back to the original symbol this
3503 synthetic symbol was derived from. */
3504 s->udata.p = syms[i];
3505 s++;
3506 }
3507 }
3508 }
3509 else
3510 {
3511 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3512 bfd_byte *contents = NULL;
3513 size_t size;
3514 size_t plt_count = 0;
3515 bfd_vma glink_vma = 0, resolv_vma = 0;
3516 asection *dynamic, *glink = NULL, *relplt = NULL;
3517 arelent *p;
3518
3519 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3520 {
3521 free_contents_and_exit_err:
3522 count = -1;
3523 free_contents_and_exit:
3524 if (contents)
3525 free (contents);
3526 goto done;
3527 }
3528
3529 size = 0;
3530 for (i = secsymend; i < opdsymend; ++i)
3531 {
3532 bfd_vma ent;
3533
3534 /* Ignore bogus symbols. */
3535 if (syms[i]->value > opd->size - 8)
3536 continue;
3537
3538 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3539 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3540 {
3541 ++count;
3542 size += sizeof (asymbol);
3543 size += strlen (syms[i]->name) + 2;
3544 }
3545 }
3546
3547 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3548 if (dyn_count != 0
3549 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3550 {
3551 bfd_byte *dynbuf, *extdyn, *extdynend;
3552 size_t extdynsize;
3553 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3554
3555 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3556 goto free_contents_and_exit_err;
3557
3558 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3559 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3560
3561 extdyn = dynbuf;
3562 extdynend = extdyn + dynamic->size;
3563 for (; extdyn < extdynend; extdyn += extdynsize)
3564 {
3565 Elf_Internal_Dyn dyn;
3566 (*swap_dyn_in) (abfd, extdyn, &dyn);
3567
3568 if (dyn.d_tag == DT_NULL)
3569 break;
3570
3571 if (dyn.d_tag == DT_PPC64_GLINK)
3572 {
3573 /* The first glink stub starts at DT_PPC64_GLINK plus 32.
3574 See comment in ppc64_elf_finish_dynamic_sections. */
3575 glink_vma = dyn.d_un.d_val + 8 * 4;
3576 /* The .glink section usually does not survive the final
3577 link; search for the section (usually .text) where the
3578 glink stubs now reside. */
3579 glink = bfd_sections_find_if (abfd, section_covers_vma,
3580 &glink_vma);
3581 break;
3582 }
3583 }
3584
3585 free (dynbuf);
3586 }
3587
3588 if (glink != NULL)
3589 {
3590 /* Determine __glink trampoline by reading the relative branch
3591 from the first glink stub. */
3592 bfd_byte buf[4];
3593 unsigned int off = 0;
3594
3595 while (bfd_get_section_contents (abfd, glink, buf,
3596 glink_vma + off - glink->vma, 4))
3597 {
3598 unsigned int insn = bfd_get_32 (abfd, buf);
3599 insn ^= B_DOT;
3600 if ((insn & ~0x3fffffc) == 0)
3601 {
3602 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3603 break;
3604 }
3605 off += 4;
3606 if (off > 4)
3607 break;
3608 }
3609
3610 if (resolv_vma)
3611 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3612
3613 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3614 if (relplt != NULL)
3615 {
3616 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3617 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3618 goto free_contents_and_exit_err;
3619
3620 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3621 size += plt_count * sizeof (asymbol);
3622
3623 p = relplt->relocation;
3624 for (i = 0; i < plt_count; i++, p++)
3625 {
3626 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3627 if (p->addend != 0)
3628 size += sizeof ("+0x") - 1 + 16;
3629 }
3630 }
3631 }
3632
3633 if (size == 0)
3634 goto free_contents_and_exit;
3635 s = *ret = bfd_malloc (size);
3636 if (s == NULL)
3637 goto free_contents_and_exit_err;
3638
3639 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3640
3641 for (i = secsymend; i < opdsymend; ++i)
3642 {
3643 bfd_vma ent;
3644
3645 if (syms[i]->value > opd->size - 8)
3646 continue;
3647
3648 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3649 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3650 {
3651 size_t lo, hi;
3652 size_t len;
3653 asection *sec = abfd->sections;
3654
3655 *s = *syms[i];
3656 lo = codesecsym;
3657 hi = codesecsymend;
3658 while (lo < hi)
3659 {
3660 size_t mid = (lo + hi) >> 1;
3661 if (syms[mid]->section->vma < ent)
3662 lo = mid + 1;
3663 else if (syms[mid]->section->vma > ent)
3664 hi = mid;
3665 else
3666 {
3667 sec = syms[mid]->section;
3668 break;
3669 }
3670 }
3671
3672 if (lo >= hi && lo > codesecsym)
3673 sec = syms[lo - 1]->section;
3674
3675 for (; sec != NULL; sec = sec->next)
3676 {
3677 if (sec->vma > ent)
3678 break;
3679 /* SEC_LOAD may not be set if SEC is from a separate debug
3680 info file. */
3681 if ((sec->flags & SEC_ALLOC) == 0)
3682 break;
3683 if ((sec->flags & SEC_CODE) != 0)
3684 s->section = sec;
3685 }
3686 s->flags |= BSF_SYNTHETIC;
3687 s->value = ent - s->section->vma;
3688 s->name = names;
3689 *names++ = '.';
3690 len = strlen (syms[i]->name);
3691 memcpy (names, syms[i]->name, len + 1);
3692 names += len + 1;
3693 /* Have udata.p point back to the original symbol this
3694 synthetic symbol was derived from. */
3695 s->udata.p = syms[i];
3696 s++;
3697 }
3698 }
3699 free (contents);
3700
3701 if (glink != NULL && relplt != NULL)
3702 {
3703 if (resolv_vma)
3704 {
3705 /* Add a symbol for the main glink trampoline. */
3706 memset (s, 0, sizeof *s);
3707 s->the_bfd = abfd;
3708 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3709 s->section = glink;
3710 s->value = resolv_vma - glink->vma;
3711 s->name = names;
3712 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3713 names += sizeof ("__glink_PLTresolve");
3714 s++;
3715 count++;
3716 }
3717
3718 /* FIXME: It would be very much nicer to put sym@plt on the
3719 stub rather than on the glink branch table entry. The
3720 objdump disassembler would then use a sensible symbol
3721 name on plt calls. The difficulty in doing so is
3722 a) finding the stubs, and,
3723 b) matching stubs against plt entries, and,
3724 c) there can be multiple stubs for a given plt entry.
3725
3726 Solving (a) could be done by code scanning, but older
3727 ppc64 binaries used different stubs to current code.
3728 (b) is the tricky one since you need to known the toc
3729 pointer for at least one function that uses a pic stub to
3730 be able to calculate the plt address referenced.
3731 (c) means gdb would need to set multiple breakpoints (or
3732 find the glink branch itself) when setting breakpoints
3733 for pending shared library loads. */
3734 p = relplt->relocation;
3735 for (i = 0; i < plt_count; i++, p++)
3736 {
3737 size_t len;
3738
3739 *s = **p->sym_ptr_ptr;
3740 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3741 we are defining a symbol, ensure one of them is set. */
3742 if ((s->flags & BSF_LOCAL) == 0)
3743 s->flags |= BSF_GLOBAL;
3744 s->flags |= BSF_SYNTHETIC;
3745 s->section = glink;
3746 s->value = glink_vma - glink->vma;
3747 s->name = names;
3748 s->udata.p = NULL;
3749 len = strlen ((*p->sym_ptr_ptr)->name);
3750 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3751 names += len;
3752 if (p->addend != 0)
3753 {
3754 memcpy (names, "+0x", sizeof ("+0x") - 1);
3755 names += sizeof ("+0x") - 1;
3756 bfd_sprintf_vma (abfd, names, p->addend);
3757 names += strlen (names);
3758 }
3759 memcpy (names, "@plt", sizeof ("@plt"));
3760 names += sizeof ("@plt");
3761 s++;
3762 if (abi < 2)
3763 {
3764 glink_vma += 8;
3765 if (i >= 0x8000)
3766 glink_vma += 4;
3767 }
3768 else
3769 glink_vma += 4;
3770 }
3771 count += plt_count;
3772 }
3773 }
3774
3775 done:
3776 free (syms);
3777 return count;
3778 }
3779 \f
3780 /* The following functions are specific to the ELF linker, while
3781 functions above are used generally. Those named ppc64_elf_* are
3782 called by the main ELF linker code. They appear in this file more
3783 or less in the order in which they are called. eg.
3784 ppc64_elf_check_relocs is called early in the link process,
3785 ppc64_elf_finish_dynamic_sections is one of the last functions
3786 called.
3787
3788 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3789 functions have both a function code symbol and a function descriptor
3790 symbol. A call to foo in a relocatable object file looks like:
3791
3792 . .text
3793 . x:
3794 . bl .foo
3795 . nop
3796
3797 The function definition in another object file might be:
3798
3799 . .section .opd
3800 . foo: .quad .foo
3801 . .quad .TOC.@tocbase
3802 . .quad 0
3803 .
3804 . .text
3805 . .foo: blr
3806
3807 When the linker resolves the call during a static link, the branch
3808 unsurprisingly just goes to .foo and the .opd information is unused.
3809 If the function definition is in a shared library, things are a little
3810 different: The call goes via a plt call stub, the opd information gets
3811 copied to the plt, and the linker patches the nop.
3812
3813 . x:
3814 . bl .foo_stub
3815 . ld 2,40(1)
3816 .
3817 .
3818 . .foo_stub:
3819 . std 2,40(1) # in practice, the call stub
3820 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3821 . addi 11,11,Lfoo@toc@l # this is the general idea
3822 . ld 12,0(11)
3823 . ld 2,8(11)
3824 . mtctr 12
3825 . ld 11,16(11)
3826 . bctr
3827 .
3828 . .section .plt
3829 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3830
3831 The "reloc ()" notation is supposed to indicate that the linker emits
3832 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3833 copying.
3834
3835 What are the difficulties here? Well, firstly, the relocations
3836 examined by the linker in check_relocs are against the function code
3837 sym .foo, while the dynamic relocation in the plt is emitted against
3838 the function descriptor symbol, foo. Somewhere along the line, we need
3839 to carefully copy dynamic link information from one symbol to the other.
3840 Secondly, the generic part of the elf linker will make .foo a dynamic
3841 symbol as is normal for most other backends. We need foo dynamic
3842 instead, at least for an application final link. However, when
3843 creating a shared library containing foo, we need to have both symbols
3844 dynamic so that references to .foo are satisfied during the early
3845 stages of linking. Otherwise the linker might decide to pull in a
3846 definition from some other object, eg. a static library.
3847
3848 Update: As of August 2004, we support a new convention. Function
3849 calls may use the function descriptor symbol, ie. "bl foo". This
3850 behaves exactly as "bl .foo". */
3851
3852 /* Of those relocs that might be copied as dynamic relocs, this
3853 function selects those that must be copied when linking a shared
3854 library or PIE, even when the symbol is local. */
3855
3856 static int
3857 must_be_dyn_reloc (struct bfd_link_info *info,
3858 enum elf_ppc64_reloc_type r_type)
3859 {
3860 switch (r_type)
3861 {
3862 default:
3863 /* Only relative relocs can be resolved when the object load
3864 address isn't fixed. DTPREL64 is excluded because the
3865 dynamic linker needs to differentiate global dynamic from
3866 local dynamic __tls_index pairs when PPC64_OPT_TLS is set. */
3867 return 1;
3868
3869 case R_PPC64_REL32:
3870 case R_PPC64_REL64:
3871 case R_PPC64_REL30:
3872 return 0;
3873
3874 case R_PPC64_TPREL16:
3875 case R_PPC64_TPREL16_LO:
3876 case R_PPC64_TPREL16_HI:
3877 case R_PPC64_TPREL16_HA:
3878 case R_PPC64_TPREL16_DS:
3879 case R_PPC64_TPREL16_LO_DS:
3880 case R_PPC64_TPREL16_HIGH:
3881 case R_PPC64_TPREL16_HIGHA:
3882 case R_PPC64_TPREL16_HIGHER:
3883 case R_PPC64_TPREL16_HIGHERA:
3884 case R_PPC64_TPREL16_HIGHEST:
3885 case R_PPC64_TPREL16_HIGHESTA:
3886 case R_PPC64_TPREL64:
3887 /* These relocations are relative but in a shared library the
3888 linker doesn't know the thread pointer base. */
3889 return bfd_link_dll (info);
3890 }
3891 }
3892
3893 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3894 copying dynamic variables from a shared lib into an app's dynbss
3895 section, and instead use a dynamic relocation to point into the
3896 shared lib. With code that gcc generates, it's vital that this be
3897 enabled; In the PowerPC64 ABI, the address of a function is actually
3898 the address of a function descriptor, which resides in the .opd
3899 section. gcc uses the descriptor directly rather than going via the
3900 GOT as some other ABI's do, which means that initialized function
3901 pointers must reference the descriptor. Thus, a function pointer
3902 initialized to the address of a function in a shared library will
3903 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3904 redefines the function descriptor symbol to point to the copy. This
3905 presents a problem as a plt entry for that function is also
3906 initialized from the function descriptor symbol and the copy reloc
3907 may not be initialized first. */
3908 #define ELIMINATE_COPY_RELOCS 1
3909
3910 /* Section name for stubs is the associated section name plus this
3911 string. */
3912 #define STUB_SUFFIX ".stub"
3913
3914 /* Linker stubs.
3915 ppc_stub_long_branch:
3916 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3917 destination, but a 24 bit branch in a stub section will reach.
3918 . b dest
3919
3920 ppc_stub_plt_branch:
3921 Similar to the above, but a 24 bit branch in the stub section won't
3922 reach its destination.
3923 . addis %r11,%r2,xxx@toc@ha
3924 . ld %r12,xxx@toc@l(%r11)
3925 . mtctr %r12
3926 . bctr
3927
3928 ppc_stub_plt_call:
3929 Used to call a function in a shared library. If it so happens that
3930 the plt entry referenced crosses a 64k boundary, then an extra
3931 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3932 . std %r2,40(%r1)
3933 . addis %r11,%r2,xxx@toc@ha
3934 . ld %r12,xxx+0@toc@l(%r11)
3935 . mtctr %r12
3936 . ld %r2,xxx+8@toc@l(%r11)
3937 . ld %r11,xxx+16@toc@l(%r11)
3938 . bctr
3939
3940 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3941 code to adjust the value and save r2 to support multiple toc sections.
3942 A ppc_stub_long_branch with an r2 offset looks like:
3943 . std %r2,40(%r1)
3944 . addis %r2,%r2,off@ha
3945 . addi %r2,%r2,off@l
3946 . b dest
3947
3948 A ppc_stub_plt_branch with an r2 offset looks like:
3949 . std %r2,40(%r1)
3950 . addis %r11,%r2,xxx@toc@ha
3951 . ld %r12,xxx@toc@l(%r11)
3952 . addis %r2,%r2,off@ha
3953 . addi %r2,%r2,off@l
3954 . mtctr %r12
3955 . bctr
3956
3957 In cases where the "addis" instruction would add zero, the "addis" is
3958 omitted and following instructions modified slightly in some cases.
3959 */
3960
3961 enum ppc_stub_type {
3962 ppc_stub_none,
3963 ppc_stub_long_branch,
3964 ppc_stub_long_branch_r2off,
3965 ppc_stub_plt_branch,
3966 ppc_stub_plt_branch_r2off,
3967 ppc_stub_plt_call,
3968 ppc_stub_plt_call_r2save,
3969 ppc_stub_global_entry,
3970 ppc_stub_save_res
3971 };
3972
3973 /* Information on stub grouping. */
3974 struct map_stub
3975 {
3976 /* The stub section. */
3977 asection *stub_sec;
3978 /* This is the section to which stubs in the group will be attached. */
3979 asection *link_sec;
3980 /* Next group. */
3981 struct map_stub *next;
3982 /* Whether to emit a copy of register save/restore functions in this
3983 group. */
3984 int needs_save_res;
3985 /* The offset of the __tls_get_addr_opt plt stub bctrl in this group,
3986 or -1u if no such stub with bctrl exists. */
3987 unsigned int tls_get_addr_opt_bctrl;
3988 };
3989
3990 struct ppc_stub_hash_entry {
3991
3992 /* Base hash table entry structure. */
3993 struct bfd_hash_entry root;
3994
3995 enum ppc_stub_type stub_type;
3996
3997 /* Group information. */
3998 struct map_stub *group;
3999
4000 /* Offset within stub_sec of the beginning of this stub. */
4001 bfd_vma stub_offset;
4002
4003 /* Given the symbol's value and its section we can determine its final
4004 value when building the stubs (so the stub knows where to jump. */
4005 bfd_vma target_value;
4006 asection *target_section;
4007
4008 /* The symbol table entry, if any, that this was derived from. */
4009 struct ppc_link_hash_entry *h;
4010 struct plt_entry *plt_ent;
4011
4012 /* Symbol type. */
4013 unsigned char symtype;
4014
4015 /* Symbol st_other. */
4016 unsigned char other;
4017 };
4018
4019 struct ppc_branch_hash_entry {
4020
4021 /* Base hash table entry structure. */
4022 struct bfd_hash_entry root;
4023
4024 /* Offset within branch lookup table. */
4025 unsigned int offset;
4026
4027 /* Generation marker. */
4028 unsigned int iter;
4029 };
4030
4031 /* Used to track dynamic relocations for local symbols. */
4032 struct ppc_dyn_relocs
4033 {
4034 struct ppc_dyn_relocs *next;
4035
4036 /* The input section of the reloc. */
4037 asection *sec;
4038
4039 /* Total number of relocs copied for the input section. */
4040 unsigned int count : 31;
4041
4042 /* Whether this entry is for STT_GNU_IFUNC symbols. */
4043 unsigned int ifunc : 1;
4044 };
4045
4046 struct ppc_link_hash_entry
4047 {
4048 struct elf_link_hash_entry elf;
4049
4050 union {
4051 /* A pointer to the most recently used stub hash entry against this
4052 symbol. */
4053 struct ppc_stub_hash_entry *stub_cache;
4054
4055 /* A pointer to the next symbol starting with a '.' */
4056 struct ppc_link_hash_entry *next_dot_sym;
4057 } u;
4058
4059 /* Track dynamic relocs copied for this symbol. */
4060 struct elf_dyn_relocs *dyn_relocs;
4061
4062 /* Link between function code and descriptor symbols. */
4063 struct ppc_link_hash_entry *oh;
4064
4065 /* Flag function code and descriptor symbols. */
4066 unsigned int is_func:1;
4067 unsigned int is_func_descriptor:1;
4068 unsigned int fake:1;
4069
4070 /* Whether global opd/toc sym has been adjusted or not.
4071 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
4072 should be set for all globals defined in any opd/toc section. */
4073 unsigned int adjust_done:1;
4074
4075 /* Set if this is an out-of-line register save/restore function,
4076 with non-standard calling convention. */
4077 unsigned int save_res:1;
4078
4079 /* Set if a duplicate symbol with non-zero localentry is detected,
4080 even when the duplicate symbol does not provide a definition. */
4081 unsigned int non_zero_localentry:1;
4082
4083 /* Contexts in which symbol is used in the GOT (or TOC).
4084 Bits are or'd into the mask as the corresponding relocs are
4085 encountered during check_relocs, with TLS_TLS being set when any
4086 of the other TLS bits are set. tls_optimize clears bits when
4087 optimizing to indicate the corresponding GOT entry type is not
4088 needed. If set, TLS_TLS is never cleared. tls_optimize may also
4089 set TLS_TPRELGD when a GD reloc turns into a TPREL one. We use a
4090 separate flag rather than setting TPREL just for convenience in
4091 distinguishing the two cases.
4092 These flags are also kept for local symbols. */
4093 #define TLS_TLS 1 /* Any TLS reloc. */
4094 #define TLS_GD 2 /* GD reloc. */
4095 #define TLS_LD 4 /* LD reloc. */
4096 #define TLS_TPREL 8 /* TPREL reloc, => IE. */
4097 #define TLS_DTPREL 16 /* DTPREL reloc, => LD. */
4098 #define TLS_MARK 32 /* __tls_get_addr call marked. */
4099 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
4100 #define TLS_EXPLICIT 128 /* Marks TOC section TLS relocs. */
4101 unsigned char tls_mask;
4102
4103 /* The above field is also used to mark function symbols. In which
4104 case TLS_TLS will be 0. */
4105 #define PLT_IFUNC 2 /* STT_GNU_IFUNC. */
4106 #define PLT_KEEP 4 /* inline plt call requires plt entry. */
4107 #define NON_GOT 256 /* local symbol plt, not stored. */
4108 };
4109
4110 /* ppc64 ELF linker hash table. */
4111
4112 struct ppc_link_hash_table
4113 {
4114 struct elf_link_hash_table elf;
4115
4116 /* The stub hash table. */
4117 struct bfd_hash_table stub_hash_table;
4118
4119 /* Another hash table for plt_branch stubs. */
4120 struct bfd_hash_table branch_hash_table;
4121
4122 /* Hash table for function prologue tocsave. */
4123 htab_t tocsave_htab;
4124
4125 /* Various options and other info passed from the linker. */
4126 struct ppc64_elf_params *params;
4127
4128 /* The size of sec_info below. */
4129 unsigned int sec_info_arr_size;
4130
4131 /* Per-section array of extra section info. Done this way rather
4132 than as part of ppc64_elf_section_data so we have the info for
4133 non-ppc64 sections. */
4134 struct
4135 {
4136 /* Along with elf_gp, specifies the TOC pointer used by this section. */
4137 bfd_vma toc_off;
4138
4139 union
4140 {
4141 /* The section group that this section belongs to. */
4142 struct map_stub *group;
4143 /* A temp section list pointer. */
4144 asection *list;
4145 } u;
4146 } *sec_info;
4147
4148 /* Linked list of groups. */
4149 struct map_stub *group;
4150
4151 /* Temp used when calculating TOC pointers. */
4152 bfd_vma toc_curr;
4153 bfd *toc_bfd;
4154 asection *toc_first_sec;
4155
4156 /* Used when adding symbols. */
4157 struct ppc_link_hash_entry *dot_syms;
4158
4159 /* Shortcuts to get to dynamic linker sections. */
4160 asection *glink;
4161 asection *global_entry;
4162 asection *sfpr;
4163 asection *pltlocal;
4164 asection *relpltlocal;
4165 asection *brlt;
4166 asection *relbrlt;
4167 asection *glink_eh_frame;
4168
4169 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
4170 struct ppc_link_hash_entry *tls_get_addr;
4171 struct ppc_link_hash_entry *tls_get_addr_fd;
4172
4173 /* The size of reliplt used by got entry relocs. */
4174 bfd_size_type got_reli_size;
4175
4176 /* Statistics. */
4177 unsigned long stub_count[ppc_stub_global_entry];
4178
4179 /* Number of stubs against global syms. */
4180 unsigned long stub_globals;
4181
4182 /* Set if we're linking code with function descriptors. */
4183 unsigned int opd_abi:1;
4184
4185 /* Support for multiple toc sections. */
4186 unsigned int do_multi_toc:1;
4187 unsigned int multi_toc_needed:1;
4188 unsigned int second_toc_pass:1;
4189 unsigned int do_toc_opt:1;
4190
4191 /* Set if tls optimization is enabled. */
4192 unsigned int do_tls_opt:1;
4193
4194 /* Set on error. */
4195 unsigned int stub_error:1;
4196
4197 /* Whether func_desc_adjust needs to be run over symbols. */
4198 unsigned int need_func_desc_adj:1;
4199
4200 /* Whether there exist local gnu indirect function resolvers,
4201 referenced by dynamic relocations. */
4202 unsigned int local_ifunc_resolver:1;
4203 unsigned int maybe_local_ifunc_resolver:1;
4204
4205 /* Whether plt calls for ELFv2 localentry:0 funcs have been optimized. */
4206 unsigned int has_plt_localentry0:1;
4207
4208 /* Incremented every time we size stubs. */
4209 unsigned int stub_iteration;
4210
4211 /* Small local sym cache. */
4212 struct sym_cache sym_cache;
4213 };
4214
4215 /* Rename some of the generic section flags to better document how they
4216 are used here. */
4217
4218 /* Nonzero if this section has TLS related relocations. */
4219 #define has_tls_reloc sec_flg0
4220
4221 /* Nonzero if this section has an old-style call to __tls_get_addr. */
4222 #define has_tls_get_addr_call sec_flg1
4223
4224 /* Nonzero if this section has any toc or got relocs. */
4225 #define has_toc_reloc sec_flg2
4226
4227 /* Nonzero if this section has a call to another section that uses
4228 the toc or got. */
4229 #define makes_toc_func_call sec_flg3
4230
4231 /* Recursion protection when determining above flag. */
4232 #define call_check_in_progress sec_flg4
4233 #define call_check_done sec_flg5
4234
4235 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4236
4237 #define ppc_hash_table(p) \
4238 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4239 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4240
4241 #define ppc_stub_hash_lookup(table, string, create, copy) \
4242 ((struct ppc_stub_hash_entry *) \
4243 bfd_hash_lookup ((table), (string), (create), (copy)))
4244
4245 #define ppc_branch_hash_lookup(table, string, create, copy) \
4246 ((struct ppc_branch_hash_entry *) \
4247 bfd_hash_lookup ((table), (string), (create), (copy)))
4248
4249 /* Create an entry in the stub hash table. */
4250
4251 static struct bfd_hash_entry *
4252 stub_hash_newfunc (struct bfd_hash_entry *entry,
4253 struct bfd_hash_table *table,
4254 const char *string)
4255 {
4256 /* Allocate the structure if it has not already been allocated by a
4257 subclass. */
4258 if (entry == NULL)
4259 {
4260 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4261 if (entry == NULL)
4262 return entry;
4263 }
4264
4265 /* Call the allocation method of the superclass. */
4266 entry = bfd_hash_newfunc (entry, table, string);
4267 if (entry != NULL)
4268 {
4269 struct ppc_stub_hash_entry *eh;
4270
4271 /* Initialize the local fields. */
4272 eh = (struct ppc_stub_hash_entry *) entry;
4273 eh->stub_type = ppc_stub_none;
4274 eh->group = NULL;
4275 eh->stub_offset = 0;
4276 eh->target_value = 0;
4277 eh->target_section = NULL;
4278 eh->h = NULL;
4279 eh->plt_ent = NULL;
4280 eh->other = 0;
4281 }
4282
4283 return entry;
4284 }
4285
4286 /* Create an entry in the branch hash table. */
4287
4288 static struct bfd_hash_entry *
4289 branch_hash_newfunc (struct bfd_hash_entry *entry,
4290 struct bfd_hash_table *table,
4291 const char *string)
4292 {
4293 /* Allocate the structure if it has not already been allocated by a
4294 subclass. */
4295 if (entry == NULL)
4296 {
4297 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4298 if (entry == NULL)
4299 return entry;
4300 }
4301
4302 /* Call the allocation method of the superclass. */
4303 entry = bfd_hash_newfunc (entry, table, string);
4304 if (entry != NULL)
4305 {
4306 struct ppc_branch_hash_entry *eh;
4307
4308 /* Initialize the local fields. */
4309 eh = (struct ppc_branch_hash_entry *) entry;
4310 eh->offset = 0;
4311 eh->iter = 0;
4312 }
4313
4314 return entry;
4315 }
4316
4317 /* Create an entry in a ppc64 ELF linker hash table. */
4318
4319 static struct bfd_hash_entry *
4320 link_hash_newfunc (struct bfd_hash_entry *entry,
4321 struct bfd_hash_table *table,
4322 const char *string)
4323 {
4324 /* Allocate the structure if it has not already been allocated by a
4325 subclass. */
4326 if (entry == NULL)
4327 {
4328 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4329 if (entry == NULL)
4330 return entry;
4331 }
4332
4333 /* Call the allocation method of the superclass. */
4334 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4335 if (entry != NULL)
4336 {
4337 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4338
4339 memset (&eh->u.stub_cache, 0,
4340 (sizeof (struct ppc_link_hash_entry)
4341 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4342
4343 /* When making function calls, old ABI code references function entry
4344 points (dot symbols), while new ABI code references the function
4345 descriptor symbol. We need to make any combination of reference and
4346 definition work together, without breaking archive linking.
4347
4348 For a defined function "foo" and an undefined call to "bar":
4349 An old object defines "foo" and ".foo", references ".bar" (possibly
4350 "bar" too).
4351 A new object defines "foo" and references "bar".
4352
4353 A new object thus has no problem with its undefined symbols being
4354 satisfied by definitions in an old object. On the other hand, the
4355 old object won't have ".bar" satisfied by a new object.
4356
4357 Keep a list of newly added dot-symbols. */
4358
4359 if (string[0] == '.')
4360 {
4361 struct ppc_link_hash_table *htab;
4362
4363 htab = (struct ppc_link_hash_table *) table;
4364 eh->u.next_dot_sym = htab->dot_syms;
4365 htab->dot_syms = eh;
4366 }
4367 }
4368
4369 return entry;
4370 }
4371
4372 struct tocsave_entry {
4373 asection *sec;
4374 bfd_vma offset;
4375 };
4376
4377 static hashval_t
4378 tocsave_htab_hash (const void *p)
4379 {
4380 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4381 return ((bfd_vma) (intptr_t) e->sec ^ e->offset) >> 3;
4382 }
4383
4384 static int
4385 tocsave_htab_eq (const void *p1, const void *p2)
4386 {
4387 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4388 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4389 return e1->sec == e2->sec && e1->offset == e2->offset;
4390 }
4391
4392 /* Destroy a ppc64 ELF linker hash table. */
4393
4394 static void
4395 ppc64_elf_link_hash_table_free (bfd *obfd)
4396 {
4397 struct ppc_link_hash_table *htab;
4398
4399 htab = (struct ppc_link_hash_table *) obfd->link.hash;
4400 if (htab->tocsave_htab)
4401 htab_delete (htab->tocsave_htab);
4402 bfd_hash_table_free (&htab->branch_hash_table);
4403 bfd_hash_table_free (&htab->stub_hash_table);
4404 _bfd_elf_link_hash_table_free (obfd);
4405 }
4406
4407 /* Create a ppc64 ELF linker hash table. */
4408
4409 static struct bfd_link_hash_table *
4410 ppc64_elf_link_hash_table_create (bfd *abfd)
4411 {
4412 struct ppc_link_hash_table *htab;
4413 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4414
4415 htab = bfd_zmalloc (amt);
4416 if (htab == NULL)
4417 return NULL;
4418
4419 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4420 sizeof (struct ppc_link_hash_entry),
4421 PPC64_ELF_DATA))
4422 {
4423 free (htab);
4424 return NULL;
4425 }
4426
4427 /* Init the stub hash table too. */
4428 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4429 sizeof (struct ppc_stub_hash_entry)))
4430 {
4431 _bfd_elf_link_hash_table_free (abfd);
4432 return NULL;
4433 }
4434
4435 /* And the branch hash table. */
4436 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4437 sizeof (struct ppc_branch_hash_entry)))
4438 {
4439 bfd_hash_table_free (&htab->stub_hash_table);
4440 _bfd_elf_link_hash_table_free (abfd);
4441 return NULL;
4442 }
4443
4444 htab->tocsave_htab = htab_try_create (1024,
4445 tocsave_htab_hash,
4446 tocsave_htab_eq,
4447 NULL);
4448 if (htab->tocsave_htab == NULL)
4449 {
4450 ppc64_elf_link_hash_table_free (abfd);
4451 return NULL;
4452 }
4453 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
4454
4455 /* Initializing two fields of the union is just cosmetic. We really
4456 only care about glist, but when compiled on a 32-bit host the
4457 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4458 debugger inspection of these fields look nicer. */
4459 htab->elf.init_got_refcount.refcount = 0;
4460 htab->elf.init_got_refcount.glist = NULL;
4461 htab->elf.init_plt_refcount.refcount = 0;
4462 htab->elf.init_plt_refcount.glist = NULL;
4463 htab->elf.init_got_offset.offset = 0;
4464 htab->elf.init_got_offset.glist = NULL;
4465 htab->elf.init_plt_offset.offset = 0;
4466 htab->elf.init_plt_offset.glist = NULL;
4467
4468 return &htab->elf.root;
4469 }
4470
4471 /* Create sections for linker generated code. */
4472
4473 static bfd_boolean
4474 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4475 {
4476 struct ppc_link_hash_table *htab;
4477 flagword flags;
4478
4479 htab = ppc_hash_table (info);
4480
4481 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4482 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4483 if (htab->params->save_restore_funcs)
4484 {
4485 /* Create .sfpr for code to save and restore fp regs. */
4486 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4487 flags);
4488 if (htab->sfpr == NULL
4489 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4490 return FALSE;
4491 }
4492
4493 if (bfd_link_relocatable (info))
4494 return TRUE;
4495
4496 /* Create .glink for lazy dynamic linking support. */
4497 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4498 flags);
4499 if (htab->glink == NULL
4500 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4501 return FALSE;
4502
4503 /* The part of .glink used by global entry stubs, separate so that
4504 it can be aligned appropriately without affecting htab->glink. */
4505 htab->global_entry = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4506 flags);
4507 if (htab->global_entry == NULL
4508 || ! bfd_set_section_alignment (dynobj, htab->global_entry, 2))
4509 return FALSE;
4510
4511 if (!info->no_ld_generated_unwind_info)
4512 {
4513 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4514 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4515 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4516 ".eh_frame",
4517 flags);
4518 if (htab->glink_eh_frame == NULL
4519 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4520 return FALSE;
4521 }
4522
4523 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4524 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4525 if (htab->elf.iplt == NULL
4526 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4527 return FALSE;
4528
4529 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4530 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4531 htab->elf.irelplt
4532 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4533 if (htab->elf.irelplt == NULL
4534 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4535 return FALSE;
4536
4537 /* Create branch lookup table for plt_branch stubs. */
4538 flags = (SEC_ALLOC | SEC_LOAD
4539 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4540 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4541 flags);
4542 if (htab->brlt == NULL
4543 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4544 return FALSE;
4545
4546 /* Local plt entries, put in .branch_lt but a separate section for
4547 convenience. */
4548 htab->pltlocal = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4549 flags);
4550 if (htab->pltlocal == NULL
4551 || ! bfd_set_section_alignment (dynobj, htab->pltlocal, 3))
4552 return FALSE;
4553
4554 if (!bfd_link_pic (info))
4555 return TRUE;
4556
4557 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4558 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4559 htab->relbrlt
4560 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
4561 if (htab->relbrlt == NULL
4562 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4563 return FALSE;
4564
4565 htab->relpltlocal
4566 = bfd_make_section_anyway_with_flags (dynobj, ".rela.branch_lt", flags);
4567 if (htab->relpltlocal == NULL
4568 || ! bfd_set_section_alignment (dynobj, htab->relpltlocal, 3))
4569 return FALSE;
4570
4571 return TRUE;
4572 }
4573
4574 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4575
4576 bfd_boolean
4577 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4578 struct ppc64_elf_params *params)
4579 {
4580 struct ppc_link_hash_table *htab;
4581
4582 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4583
4584 /* Always hook our dynamic sections into the first bfd, which is the
4585 linker created stub bfd. This ensures that the GOT header is at
4586 the start of the output TOC section. */
4587 htab = ppc_hash_table (info);
4588 htab->elf.dynobj = params->stub_bfd;
4589 htab->params = params;
4590
4591 return create_linkage_sections (htab->elf.dynobj, info);
4592 }
4593
4594 /* Build a name for an entry in the stub hash table. */
4595
4596 static char *
4597 ppc_stub_name (const asection *input_section,
4598 const asection *sym_sec,
4599 const struct ppc_link_hash_entry *h,
4600 const Elf_Internal_Rela *rel)
4601 {
4602 char *stub_name;
4603 ssize_t len;
4604
4605 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4606 offsets from a sym as a branch target? In fact, we could
4607 probably assume the addend is always zero. */
4608 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4609
4610 if (h)
4611 {
4612 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4613 stub_name = bfd_malloc (len);
4614 if (stub_name == NULL)
4615 return stub_name;
4616
4617 len = sprintf (stub_name, "%08x.%s+%x",
4618 input_section->id & 0xffffffff,
4619 h->elf.root.root.string,
4620 (int) rel->r_addend & 0xffffffff);
4621 }
4622 else
4623 {
4624 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4625 stub_name = bfd_malloc (len);
4626 if (stub_name == NULL)
4627 return stub_name;
4628
4629 len = sprintf (stub_name, "%08x.%x:%x+%x",
4630 input_section->id & 0xffffffff,
4631 sym_sec->id & 0xffffffff,
4632 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4633 (int) rel->r_addend & 0xffffffff);
4634 }
4635 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4636 stub_name[len - 2] = 0;
4637 return stub_name;
4638 }
4639
4640 /* Look up an entry in the stub hash. Stub entries are cached because
4641 creating the stub name takes a bit of time. */
4642
4643 static struct ppc_stub_hash_entry *
4644 ppc_get_stub_entry (const asection *input_section,
4645 const asection *sym_sec,
4646 struct ppc_link_hash_entry *h,
4647 const Elf_Internal_Rela *rel,
4648 struct ppc_link_hash_table *htab)
4649 {
4650 struct ppc_stub_hash_entry *stub_entry;
4651 struct map_stub *group;
4652
4653 /* If this input section is part of a group of sections sharing one
4654 stub section, then use the id of the first section in the group.
4655 Stub names need to include a section id, as there may well be
4656 more than one stub used to reach say, printf, and we need to
4657 distinguish between them. */
4658 group = htab->sec_info[input_section->id].u.group;
4659 if (group == NULL)
4660 return NULL;
4661
4662 if (h != NULL && h->u.stub_cache != NULL
4663 && h->u.stub_cache->h == h
4664 && h->u.stub_cache->group == group)
4665 {
4666 stub_entry = h->u.stub_cache;
4667 }
4668 else
4669 {
4670 char *stub_name;
4671
4672 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
4673 if (stub_name == NULL)
4674 return NULL;
4675
4676 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4677 stub_name, FALSE, FALSE);
4678 if (h != NULL)
4679 h->u.stub_cache = stub_entry;
4680
4681 free (stub_name);
4682 }
4683
4684 return stub_entry;
4685 }
4686
4687 /* Add a new stub entry to the stub hash. Not all fields of the new
4688 stub entry are initialised. */
4689
4690 static struct ppc_stub_hash_entry *
4691 ppc_add_stub (const char *stub_name,
4692 asection *section,
4693 struct bfd_link_info *info)
4694 {
4695 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4696 struct map_stub *group;
4697 asection *link_sec;
4698 asection *stub_sec;
4699 struct ppc_stub_hash_entry *stub_entry;
4700
4701 group = htab->sec_info[section->id].u.group;
4702 link_sec = group->link_sec;
4703 stub_sec = group->stub_sec;
4704 if (stub_sec == NULL)
4705 {
4706 size_t namelen;
4707 bfd_size_type len;
4708 char *s_name;
4709
4710 namelen = strlen (link_sec->name);
4711 len = namelen + sizeof (STUB_SUFFIX);
4712 s_name = bfd_alloc (htab->params->stub_bfd, len);
4713 if (s_name == NULL)
4714 return NULL;
4715
4716 memcpy (s_name, link_sec->name, namelen);
4717 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4718 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4719 if (stub_sec == NULL)
4720 return NULL;
4721 group->stub_sec = stub_sec;
4722 }
4723
4724 /* Enter this entry into the linker stub hash table. */
4725 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4726 TRUE, FALSE);
4727 if (stub_entry == NULL)
4728 {
4729 /* xgettext:c-format */
4730 _bfd_error_handler (_("%pB: cannot create stub entry %s"),
4731 section->owner, stub_name);
4732 return NULL;
4733 }
4734
4735 stub_entry->group = group;
4736 stub_entry->stub_offset = 0;
4737 return stub_entry;
4738 }
4739
4740 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4741 not already done. */
4742
4743 static bfd_boolean
4744 create_got_section (bfd *abfd, struct bfd_link_info *info)
4745 {
4746 asection *got, *relgot;
4747 flagword flags;
4748 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4749
4750 if (!is_ppc64_elf (abfd))
4751 return FALSE;
4752 if (htab == NULL)
4753 return FALSE;
4754
4755 if (!htab->elf.sgot
4756 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4757 return FALSE;
4758
4759 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4760 | SEC_LINKER_CREATED);
4761
4762 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4763 if (!got
4764 || !bfd_set_section_alignment (abfd, got, 3))
4765 return FALSE;
4766
4767 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4768 flags | SEC_READONLY);
4769 if (!relgot
4770 || ! bfd_set_section_alignment (abfd, relgot, 3))
4771 return FALSE;
4772
4773 ppc64_elf_tdata (abfd)->got = got;
4774 ppc64_elf_tdata (abfd)->relgot = relgot;
4775 return TRUE;
4776 }
4777
4778 /* Follow indirect and warning symbol links. */
4779
4780 static inline struct bfd_link_hash_entry *
4781 follow_link (struct bfd_link_hash_entry *h)
4782 {
4783 while (h->type == bfd_link_hash_indirect
4784 || h->type == bfd_link_hash_warning)
4785 h = h->u.i.link;
4786 return h;
4787 }
4788
4789 static inline struct elf_link_hash_entry *
4790 elf_follow_link (struct elf_link_hash_entry *h)
4791 {
4792 return (struct elf_link_hash_entry *) follow_link (&h->root);
4793 }
4794
4795 static inline struct ppc_link_hash_entry *
4796 ppc_follow_link (struct ppc_link_hash_entry *h)
4797 {
4798 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4799 }
4800
4801 /* Merge PLT info on FROM with that on TO. */
4802
4803 static void
4804 move_plt_plist (struct ppc_link_hash_entry *from,
4805 struct ppc_link_hash_entry *to)
4806 {
4807 if (from->elf.plt.plist != NULL)
4808 {
4809 if (to->elf.plt.plist != NULL)
4810 {
4811 struct plt_entry **entp;
4812 struct plt_entry *ent;
4813
4814 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4815 {
4816 struct plt_entry *dent;
4817
4818 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4819 if (dent->addend == ent->addend)
4820 {
4821 dent->plt.refcount += ent->plt.refcount;
4822 *entp = ent->next;
4823 break;
4824 }
4825 if (dent == NULL)
4826 entp = &ent->next;
4827 }
4828 *entp = to->elf.plt.plist;
4829 }
4830
4831 to->elf.plt.plist = from->elf.plt.plist;
4832 from->elf.plt.plist = NULL;
4833 }
4834 }
4835
4836 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4837
4838 static void
4839 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4840 struct elf_link_hash_entry *dir,
4841 struct elf_link_hash_entry *ind)
4842 {
4843 struct ppc_link_hash_entry *edir, *eind;
4844
4845 edir = (struct ppc_link_hash_entry *) dir;
4846 eind = (struct ppc_link_hash_entry *) ind;
4847
4848 edir->is_func |= eind->is_func;
4849 edir->is_func_descriptor |= eind->is_func_descriptor;
4850 edir->tls_mask |= eind->tls_mask;
4851 if (eind->oh != NULL)
4852 edir->oh = ppc_follow_link (eind->oh);
4853
4854 if (edir->elf.versioned != versioned_hidden)
4855 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4856 edir->elf.ref_regular |= eind->elf.ref_regular;
4857 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4858 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4859 edir->elf.needs_plt |= eind->elf.needs_plt;
4860 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4861
4862 /* If we were called to copy over info for a weak sym, don't copy
4863 dyn_relocs, plt/got info, or dynindx. We used to copy dyn_relocs
4864 in order to simplify readonly_dynrelocs and save a field in the
4865 symbol hash entry, but that means dyn_relocs can't be used in any
4866 tests about a specific symbol, or affect other symbol flags which
4867 are then tested. */
4868 if (eind->elf.root.type != bfd_link_hash_indirect)
4869 return;
4870
4871 /* Copy over any dynamic relocs we may have on the indirect sym. */
4872 if (eind->dyn_relocs != NULL)
4873 {
4874 if (edir->dyn_relocs != NULL)
4875 {
4876 struct elf_dyn_relocs **pp;
4877 struct elf_dyn_relocs *p;
4878
4879 /* Add reloc counts against the indirect sym to the direct sym
4880 list. Merge any entries against the same section. */
4881 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4882 {
4883 struct elf_dyn_relocs *q;
4884
4885 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4886 if (q->sec == p->sec)
4887 {
4888 q->pc_count += p->pc_count;
4889 q->count += p->count;
4890 *pp = p->next;
4891 break;
4892 }
4893 if (q == NULL)
4894 pp = &p->next;
4895 }
4896 *pp = edir->dyn_relocs;
4897 }
4898
4899 edir->dyn_relocs = eind->dyn_relocs;
4900 eind->dyn_relocs = NULL;
4901 }
4902
4903 /* Copy over got entries that we may have already seen to the
4904 symbol which just became indirect. */
4905 if (eind->elf.got.glist != NULL)
4906 {
4907 if (edir->elf.got.glist != NULL)
4908 {
4909 struct got_entry **entp;
4910 struct got_entry *ent;
4911
4912 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4913 {
4914 struct got_entry *dent;
4915
4916 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4917 if (dent->addend == ent->addend
4918 && dent->owner == ent->owner
4919 && dent->tls_type == ent->tls_type)
4920 {
4921 dent->got.refcount += ent->got.refcount;
4922 *entp = ent->next;
4923 break;
4924 }
4925 if (dent == NULL)
4926 entp = &ent->next;
4927 }
4928 *entp = edir->elf.got.glist;
4929 }
4930
4931 edir->elf.got.glist = eind->elf.got.glist;
4932 eind->elf.got.glist = NULL;
4933 }
4934
4935 /* And plt entries. */
4936 move_plt_plist (eind, edir);
4937
4938 if (eind->elf.dynindx != -1)
4939 {
4940 if (edir->elf.dynindx != -1)
4941 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4942 edir->elf.dynstr_index);
4943 edir->elf.dynindx = eind->elf.dynindx;
4944 edir->elf.dynstr_index = eind->elf.dynstr_index;
4945 eind->elf.dynindx = -1;
4946 eind->elf.dynstr_index = 0;
4947 }
4948 }
4949
4950 /* Find the function descriptor hash entry from the given function code
4951 hash entry FH. Link the entries via their OH fields. */
4952
4953 static struct ppc_link_hash_entry *
4954 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4955 {
4956 struct ppc_link_hash_entry *fdh = fh->oh;
4957
4958 if (fdh == NULL)
4959 {
4960 const char *fd_name = fh->elf.root.root.string + 1;
4961
4962 fdh = (struct ppc_link_hash_entry *)
4963 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4964 if (fdh == NULL)
4965 return fdh;
4966
4967 fdh->is_func_descriptor = 1;
4968 fdh->oh = fh;
4969 fh->is_func = 1;
4970 fh->oh = fdh;
4971 }
4972
4973 fdh = ppc_follow_link (fdh);
4974 fdh->is_func_descriptor = 1;
4975 fdh->oh = fh;
4976 return fdh;
4977 }
4978
4979 /* Make a fake function descriptor sym for the undefined code sym FH. */
4980
4981 static struct ppc_link_hash_entry *
4982 make_fdh (struct bfd_link_info *info,
4983 struct ppc_link_hash_entry *fh)
4984 {
4985 bfd *abfd = fh->elf.root.u.undef.abfd;
4986 struct bfd_link_hash_entry *bh = NULL;
4987 struct ppc_link_hash_entry *fdh;
4988 flagword flags = (fh->elf.root.type == bfd_link_hash_undefweak
4989 ? BSF_WEAK
4990 : BSF_GLOBAL);
4991
4992 if (!_bfd_generic_link_add_one_symbol (info, abfd,
4993 fh->elf.root.root.string + 1,
4994 flags, bfd_und_section_ptr, 0,
4995 NULL, FALSE, FALSE, &bh))
4996 return NULL;
4997
4998 fdh = (struct ppc_link_hash_entry *) bh;
4999 fdh->elf.non_elf = 0;
5000 fdh->fake = 1;
5001 fdh->is_func_descriptor = 1;
5002 fdh->oh = fh;
5003 fh->is_func = 1;
5004 fh->oh = fdh;
5005 return fdh;
5006 }
5007
5008 /* Fix function descriptor symbols defined in .opd sections to be
5009 function type. */
5010
5011 static bfd_boolean
5012 ppc64_elf_add_symbol_hook (bfd *ibfd,
5013 struct bfd_link_info *info,
5014 Elf_Internal_Sym *isym,
5015 const char **name,
5016 flagword *flags ATTRIBUTE_UNUSED,
5017 asection **sec,
5018 bfd_vma *value)
5019 {
5020 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
5021 && (ibfd->flags & DYNAMIC) == 0
5022 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
5023 elf_tdata (info->output_bfd)->has_gnu_symbols |= elf_gnu_symbol_ifunc;
5024
5025 if (*sec != NULL
5026 && strcmp ((*sec)->name, ".opd") == 0)
5027 {
5028 asection *code_sec;
5029
5030 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
5031 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
5032 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
5033
5034 /* If the symbol is a function defined in .opd, and the function
5035 code is in a discarded group, let it appear to be undefined. */
5036 if (!bfd_link_relocatable (info)
5037 && (*sec)->reloc_count != 0
5038 && opd_entry_value (*sec, *value, &code_sec, NULL,
5039 FALSE) != (bfd_vma) -1
5040 && discarded_section (code_sec))
5041 {
5042 *sec = bfd_und_section_ptr;
5043 isym->st_shndx = SHN_UNDEF;
5044 }
5045 }
5046 else if (*sec != NULL
5047 && strcmp ((*sec)->name, ".toc") == 0
5048 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
5049 {
5050 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5051 if (htab != NULL)
5052 htab->params->object_in_toc = 1;
5053 }
5054
5055 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5056 {
5057 if (abiversion (ibfd) == 0)
5058 set_abiversion (ibfd, 2);
5059 else if (abiversion (ibfd) == 1)
5060 {
5061 _bfd_error_handler (_("symbol '%s' has invalid st_other"
5062 " for ABI version 1"), *name);
5063 bfd_set_error (bfd_error_bad_value);
5064 return FALSE;
5065 }
5066 }
5067
5068 return TRUE;
5069 }
5070
5071 /* Merge non-visibility st_other attributes: local entry point. */
5072
5073 static void
5074 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
5075 const Elf_Internal_Sym *isym,
5076 bfd_boolean definition,
5077 bfd_boolean dynamic)
5078 {
5079 if (definition && (!dynamic || !h->def_regular))
5080 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
5081 | ELF_ST_VISIBILITY (h->other));
5082 }
5083
5084 /* Hook called on merging a symbol. We use this to clear "fake" since
5085 we now have a real symbol. */
5086
5087 static bfd_boolean
5088 ppc64_elf_merge_symbol (struct elf_link_hash_entry *h,
5089 const Elf_Internal_Sym *isym,
5090 asection **psec ATTRIBUTE_UNUSED,
5091 bfd_boolean newdef ATTRIBUTE_UNUSED,
5092 bfd_boolean olddef ATTRIBUTE_UNUSED,
5093 bfd *oldbfd ATTRIBUTE_UNUSED,
5094 const asection *oldsec ATTRIBUTE_UNUSED)
5095 {
5096 ((struct ppc_link_hash_entry *) h)->fake = 0;
5097 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
5098 ((struct ppc_link_hash_entry *) h)->non_zero_localentry = 1;
5099 return TRUE;
5100 }
5101
5102 /* This function makes an old ABI object reference to ".bar" cause the
5103 inclusion of a new ABI object archive that defines "bar".
5104 NAME is a symbol defined in an archive. Return a symbol in the hash
5105 table that might be satisfied by the archive symbols. */
5106
5107 static struct elf_link_hash_entry *
5108 ppc64_elf_archive_symbol_lookup (bfd *abfd,
5109 struct bfd_link_info *info,
5110 const char *name)
5111 {
5112 struct elf_link_hash_entry *h;
5113 char *dot_name;
5114 size_t len;
5115
5116 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
5117 if (h != NULL
5118 /* Don't return this sym if it is a fake function descriptor
5119 created by add_symbol_adjust. */
5120 && !((struct ppc_link_hash_entry *) h)->fake)
5121 return h;
5122
5123 if (name[0] == '.')
5124 return h;
5125
5126 len = strlen (name);
5127 dot_name = bfd_alloc (abfd, len + 2);
5128 if (dot_name == NULL)
5129 return (struct elf_link_hash_entry *) -1;
5130 dot_name[0] = '.';
5131 memcpy (dot_name + 1, name, len + 1);
5132 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
5133 bfd_release (abfd, dot_name);
5134 return h;
5135 }
5136
5137 /* This function satisfies all old ABI object references to ".bar" if a
5138 new ABI object defines "bar". Well, at least, undefined dot symbols
5139 are made weak. This stops later archive searches from including an
5140 object if we already have a function descriptor definition. It also
5141 prevents the linker complaining about undefined symbols.
5142 We also check and correct mismatched symbol visibility here. The
5143 most restrictive visibility of the function descriptor and the
5144 function entry symbol is used. */
5145
5146 static bfd_boolean
5147 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
5148 {
5149 struct ppc_link_hash_table *htab;
5150 struct ppc_link_hash_entry *fdh;
5151
5152 if (eh->elf.root.type == bfd_link_hash_warning)
5153 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
5154
5155 if (eh->elf.root.type == bfd_link_hash_indirect)
5156 return TRUE;
5157
5158 if (eh->elf.root.root.string[0] != '.')
5159 abort ();
5160
5161 htab = ppc_hash_table (info);
5162 if (htab == NULL)
5163 return FALSE;
5164
5165 fdh = lookup_fdh (eh, htab);
5166 if (fdh == NULL
5167 && !bfd_link_relocatable (info)
5168 && (eh->elf.root.type == bfd_link_hash_undefined
5169 || eh->elf.root.type == bfd_link_hash_undefweak)
5170 && eh->elf.ref_regular)
5171 {
5172 /* Make an undefined function descriptor sym, in order to
5173 pull in an --as-needed shared lib. Archives are handled
5174 elsewhere. */
5175 fdh = make_fdh (info, eh);
5176 if (fdh == NULL)
5177 return FALSE;
5178 }
5179
5180 if (fdh != NULL)
5181 {
5182 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
5183 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
5184
5185 /* Make both descriptor and entry symbol have the most
5186 constraining visibility of either symbol. */
5187 if (entry_vis < descr_vis)
5188 fdh->elf.other += entry_vis - descr_vis;
5189 else if (entry_vis > descr_vis)
5190 eh->elf.other += descr_vis - entry_vis;
5191
5192 /* Propagate reference flags from entry symbol to function
5193 descriptor symbol. */
5194 fdh->elf.root.non_ir_ref_regular |= eh->elf.root.non_ir_ref_regular;
5195 fdh->elf.root.non_ir_ref_dynamic |= eh->elf.root.non_ir_ref_dynamic;
5196 fdh->elf.ref_regular |= eh->elf.ref_regular;
5197 fdh->elf.ref_regular_nonweak |= eh->elf.ref_regular_nonweak;
5198
5199 if (!fdh->elf.forced_local
5200 && fdh->elf.dynindx == -1
5201 && fdh->elf.versioned != versioned_hidden
5202 && (bfd_link_dll (info)
5203 || fdh->elf.def_dynamic
5204 || fdh->elf.ref_dynamic)
5205 && (eh->elf.ref_regular
5206 || eh->elf.def_regular))
5207 {
5208 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
5209 return FALSE;
5210 }
5211 }
5212
5213 return TRUE;
5214 }
5215
5216 /* Set up opd section info and abiversion for IBFD, and process list
5217 of dot-symbols we made in link_hash_newfunc. */
5218
5219 static bfd_boolean
5220 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
5221 {
5222 struct ppc_link_hash_table *htab;
5223 struct ppc_link_hash_entry **p, *eh;
5224 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
5225
5226 if (opd != NULL && opd->size != 0)
5227 {
5228 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5229 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5230
5231 if (abiversion (ibfd) == 0)
5232 set_abiversion (ibfd, 1);
5233 else if (abiversion (ibfd) >= 2)
5234 {
5235 /* xgettext:c-format */
5236 _bfd_error_handler (_("%pB .opd not allowed in ABI version %d"),
5237 ibfd, abiversion (ibfd));
5238 bfd_set_error (bfd_error_bad_value);
5239 return FALSE;
5240 }
5241 }
5242
5243 if (is_ppc64_elf (info->output_bfd))
5244 {
5245 /* For input files without an explicit abiversion in e_flags
5246 we should have flagged any with symbol st_other bits set
5247 as ELFv1 and above flagged those with .opd as ELFv2.
5248 Set the output abiversion if not yet set, and for any input
5249 still ambiguous, take its abiversion from the output.
5250 Differences in ABI are reported later. */
5251 if (abiversion (info->output_bfd) == 0)
5252 set_abiversion (info->output_bfd, abiversion (ibfd));
5253 else if (abiversion (ibfd) == 0)
5254 set_abiversion (ibfd, abiversion (info->output_bfd));
5255 }
5256
5257 htab = ppc_hash_table (info);
5258 if (htab == NULL)
5259 return TRUE;
5260
5261 if (opd != NULL && opd->size != 0
5262 && (ibfd->flags & DYNAMIC) == 0
5263 && (opd->flags & SEC_RELOC) != 0
5264 && opd->reloc_count != 0
5265 && !bfd_is_abs_section (opd->output_section)
5266 && info->gc_sections)
5267 {
5268 /* Garbage collection needs some extra help with .opd sections.
5269 We don't want to necessarily keep everything referenced by
5270 relocs in .opd, as that would keep all functions. Instead,
5271 if we reference an .opd symbol (a function descriptor), we
5272 want to keep the function code symbol's section. This is
5273 easy for global symbols, but for local syms we need to keep
5274 information about the associated function section. */
5275 bfd_size_type amt;
5276 asection **opd_sym_map;
5277 Elf_Internal_Shdr *symtab_hdr;
5278 Elf_Internal_Rela *relocs, *rel_end, *rel;
5279
5280 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5281 opd_sym_map = bfd_zalloc (ibfd, amt);
5282 if (opd_sym_map == NULL)
5283 return FALSE;
5284 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5285 relocs = _bfd_elf_link_read_relocs (ibfd, opd, NULL, NULL,
5286 info->keep_memory);
5287 if (relocs == NULL)
5288 return FALSE;
5289 symtab_hdr = &elf_symtab_hdr (ibfd);
5290 rel_end = relocs + opd->reloc_count - 1;
5291 for (rel = relocs; rel < rel_end; rel++)
5292 {
5293 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
5294 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
5295
5296 if (r_type == R_PPC64_ADDR64
5297 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC
5298 && r_symndx < symtab_hdr->sh_info)
5299 {
5300 Elf_Internal_Sym *isym;
5301 asection *s;
5302
5303 isym = bfd_sym_from_r_symndx (&htab->sym_cache, ibfd, r_symndx);
5304 if (isym == NULL)
5305 {
5306 if (elf_section_data (opd)->relocs != relocs)
5307 free (relocs);
5308 return FALSE;
5309 }
5310
5311 s = bfd_section_from_elf_index (ibfd, isym->st_shndx);
5312 if (s != NULL && s != opd)
5313 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5314 }
5315 }
5316 if (elf_section_data (opd)->relocs != relocs)
5317 free (relocs);
5318 }
5319
5320 p = &htab->dot_syms;
5321 while ((eh = *p) != NULL)
5322 {
5323 *p = NULL;
5324 if (&eh->elf == htab->elf.hgot)
5325 ;
5326 else if (htab->elf.hgot == NULL
5327 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5328 htab->elf.hgot = &eh->elf;
5329 else if (abiversion (ibfd) <= 1)
5330 {
5331 htab->need_func_desc_adj = 1;
5332 if (!add_symbol_adjust (eh, info))
5333 return FALSE;
5334 }
5335 p = &eh->u.next_dot_sym;
5336 }
5337 return TRUE;
5338 }
5339
5340 /* Undo hash table changes when an --as-needed input file is determined
5341 not to be needed. */
5342
5343 static bfd_boolean
5344 ppc64_elf_notice_as_needed (bfd *ibfd,
5345 struct bfd_link_info *info,
5346 enum notice_asneeded_action act)
5347 {
5348 if (act == notice_not_needed)
5349 {
5350 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5351
5352 if (htab == NULL)
5353 return FALSE;
5354
5355 htab->dot_syms = NULL;
5356 }
5357 return _bfd_elf_notice_as_needed (ibfd, info, act);
5358 }
5359
5360 /* If --just-symbols against a final linked binary, then assume we need
5361 toc adjusting stubs when calling functions defined there. */
5362
5363 static void
5364 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5365 {
5366 if ((sec->flags & SEC_CODE) != 0
5367 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5368 && is_ppc64_elf (sec->owner))
5369 {
5370 if (abiversion (sec->owner) >= 2
5371 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5372 sec->has_toc_reloc = 1;
5373 }
5374 _bfd_elf_link_just_syms (sec, info);
5375 }
5376
5377 static struct plt_entry **
5378 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5379 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5380 {
5381 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5382 struct plt_entry **local_plt;
5383 unsigned char *local_got_tls_masks;
5384
5385 if (local_got_ents == NULL)
5386 {
5387 bfd_size_type size = symtab_hdr->sh_info;
5388
5389 size *= (sizeof (*local_got_ents)
5390 + sizeof (*local_plt)
5391 + sizeof (*local_got_tls_masks));
5392 local_got_ents = bfd_zalloc (abfd, size);
5393 if (local_got_ents == NULL)
5394 return NULL;
5395 elf_local_got_ents (abfd) = local_got_ents;
5396 }
5397
5398 if ((tls_type & (NON_GOT | TLS_EXPLICIT)) == 0)
5399 {
5400 struct got_entry *ent;
5401
5402 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5403 if (ent->addend == r_addend
5404 && ent->owner == abfd
5405 && ent->tls_type == tls_type)
5406 break;
5407 if (ent == NULL)
5408 {
5409 bfd_size_type amt = sizeof (*ent);
5410 ent = bfd_alloc (abfd, amt);
5411 if (ent == NULL)
5412 return FALSE;
5413 ent->next = local_got_ents[r_symndx];
5414 ent->addend = r_addend;
5415 ent->owner = abfd;
5416 ent->tls_type = tls_type;
5417 ent->is_indirect = FALSE;
5418 ent->got.refcount = 0;
5419 local_got_ents[r_symndx] = ent;
5420 }
5421 ent->got.refcount += 1;
5422 }
5423
5424 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5425 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5426 local_got_tls_masks[r_symndx] |= tls_type & 0xff;
5427
5428 return local_plt + r_symndx;
5429 }
5430
5431 static bfd_boolean
5432 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5433 {
5434 struct plt_entry *ent;
5435
5436 for (ent = *plist; ent != NULL; ent = ent->next)
5437 if (ent->addend == addend)
5438 break;
5439 if (ent == NULL)
5440 {
5441 bfd_size_type amt = sizeof (*ent);
5442 ent = bfd_alloc (abfd, amt);
5443 if (ent == NULL)
5444 return FALSE;
5445 ent->next = *plist;
5446 ent->addend = addend;
5447 ent->plt.refcount = 0;
5448 *plist = ent;
5449 }
5450 ent->plt.refcount += 1;
5451 return TRUE;
5452 }
5453
5454 static bfd_boolean
5455 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5456 {
5457 return (r_type == R_PPC64_REL24
5458 || r_type == R_PPC64_REL14
5459 || r_type == R_PPC64_REL14_BRTAKEN
5460 || r_type == R_PPC64_REL14_BRNTAKEN
5461 || r_type == R_PPC64_ADDR24
5462 || r_type == R_PPC64_ADDR14
5463 || r_type == R_PPC64_ADDR14_BRTAKEN
5464 || r_type == R_PPC64_ADDR14_BRNTAKEN
5465 || r_type == R_PPC64_PLTCALL);
5466 }
5467
5468 /* Relocs on inline plt call sequence insns prior to the call. */
5469
5470 static bfd_boolean
5471 is_plt_seq_reloc (enum elf_ppc64_reloc_type r_type)
5472 {
5473 return (r_type == R_PPC64_PLT16_HA
5474 || r_type == R_PPC64_PLT16_HI
5475 || r_type == R_PPC64_PLT16_LO
5476 || r_type == R_PPC64_PLT16_LO_DS
5477 || r_type == R_PPC64_PLTSEQ);
5478 }
5479
5480 /* Look through the relocs for a section during the first phase, and
5481 calculate needed space in the global offset table, procedure
5482 linkage table, and dynamic reloc sections. */
5483
5484 static bfd_boolean
5485 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5486 asection *sec, const Elf_Internal_Rela *relocs)
5487 {
5488 struct ppc_link_hash_table *htab;
5489 Elf_Internal_Shdr *symtab_hdr;
5490 struct elf_link_hash_entry **sym_hashes;
5491 const Elf_Internal_Rela *rel;
5492 const Elf_Internal_Rela *rel_end;
5493 asection *sreloc;
5494 struct elf_link_hash_entry *tga, *dottga;
5495 bfd_boolean is_opd;
5496
5497 if (bfd_link_relocatable (info))
5498 return TRUE;
5499
5500 /* Don't do anything special with non-loaded, non-alloced sections.
5501 In particular, any relocs in such sections should not affect GOT
5502 and PLT reference counting (ie. we don't allow them to create GOT
5503 or PLT entries), there's no possibility or desire to optimize TLS
5504 relocs, and there's not much point in propagating relocs to shared
5505 libs that the dynamic linker won't relocate. */
5506 if ((sec->flags & SEC_ALLOC) == 0)
5507 return TRUE;
5508
5509 BFD_ASSERT (is_ppc64_elf (abfd));
5510
5511 htab = ppc_hash_table (info);
5512 if (htab == NULL)
5513 return FALSE;
5514
5515 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5516 FALSE, FALSE, TRUE);
5517 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5518 FALSE, FALSE, TRUE);
5519 symtab_hdr = &elf_symtab_hdr (abfd);
5520 sym_hashes = elf_sym_hashes (abfd);
5521 sreloc = NULL;
5522 is_opd = ppc64_elf_section_data (sec)->sec_type == sec_opd;
5523 rel_end = relocs + sec->reloc_count;
5524 for (rel = relocs; rel < rel_end; rel++)
5525 {
5526 unsigned long r_symndx;
5527 struct elf_link_hash_entry *h;
5528 enum elf_ppc64_reloc_type r_type;
5529 int tls_type;
5530 struct _ppc64_elf_section_data *ppc64_sec;
5531 struct plt_entry **ifunc, **plt_list;
5532
5533 r_symndx = ELF64_R_SYM (rel->r_info);
5534 if (r_symndx < symtab_hdr->sh_info)
5535 h = NULL;
5536 else
5537 {
5538 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5539 h = elf_follow_link (h);
5540
5541 if (h == htab->elf.hgot)
5542 sec->has_toc_reloc = 1;
5543 }
5544
5545 tls_type = 0;
5546 ifunc = NULL;
5547 if (h != NULL)
5548 {
5549 if (h->type == STT_GNU_IFUNC)
5550 {
5551 h->needs_plt = 1;
5552 ifunc = &h->plt.plist;
5553 }
5554 }
5555 else
5556 {
5557 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5558 abfd, r_symndx);
5559 if (isym == NULL)
5560 return FALSE;
5561
5562 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5563 {
5564 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5565 rel->r_addend,
5566 NON_GOT | PLT_IFUNC);
5567 if (ifunc == NULL)
5568 return FALSE;
5569 }
5570 }
5571
5572 r_type = ELF64_R_TYPE (rel->r_info);
5573 switch (r_type)
5574 {
5575 case R_PPC64_TLSGD:
5576 case R_PPC64_TLSLD:
5577 /* These special tls relocs tie a call to __tls_get_addr with
5578 its parameter symbol. */
5579 if (h != NULL)
5580 ((struct ppc_link_hash_entry *) h)->tls_mask |= TLS_TLS | TLS_MARK;
5581 else
5582 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5583 rel->r_addend,
5584 NON_GOT | TLS_TLS | TLS_MARK))
5585 return FALSE;
5586 sec->has_tls_reloc = 1;
5587 break;
5588
5589 case R_PPC64_GOT_TLSLD16:
5590 case R_PPC64_GOT_TLSLD16_LO:
5591 case R_PPC64_GOT_TLSLD16_HI:
5592 case R_PPC64_GOT_TLSLD16_HA:
5593 tls_type = TLS_TLS | TLS_LD;
5594 goto dogottls;
5595
5596 case R_PPC64_GOT_TLSGD16:
5597 case R_PPC64_GOT_TLSGD16_LO:
5598 case R_PPC64_GOT_TLSGD16_HI:
5599 case R_PPC64_GOT_TLSGD16_HA:
5600 tls_type = TLS_TLS | TLS_GD;
5601 goto dogottls;
5602
5603 case R_PPC64_GOT_TPREL16_DS:
5604 case R_PPC64_GOT_TPREL16_LO_DS:
5605 case R_PPC64_GOT_TPREL16_HI:
5606 case R_PPC64_GOT_TPREL16_HA:
5607 if (bfd_link_dll (info))
5608 info->flags |= DF_STATIC_TLS;
5609 tls_type = TLS_TLS | TLS_TPREL;
5610 goto dogottls;
5611
5612 case R_PPC64_GOT_DTPREL16_DS:
5613 case R_PPC64_GOT_DTPREL16_LO_DS:
5614 case R_PPC64_GOT_DTPREL16_HI:
5615 case R_PPC64_GOT_DTPREL16_HA:
5616 tls_type = TLS_TLS | TLS_DTPREL;
5617 dogottls:
5618 sec->has_tls_reloc = 1;
5619 /* Fall through */
5620
5621 case R_PPC64_GOT16:
5622 case R_PPC64_GOT16_DS:
5623 case R_PPC64_GOT16_HA:
5624 case R_PPC64_GOT16_HI:
5625 case R_PPC64_GOT16_LO:
5626 case R_PPC64_GOT16_LO_DS:
5627 /* This symbol requires a global offset table entry. */
5628 sec->has_toc_reloc = 1;
5629 if (r_type == R_PPC64_GOT_TLSLD16
5630 || r_type == R_PPC64_GOT_TLSGD16
5631 || r_type == R_PPC64_GOT_TPREL16_DS
5632 || r_type == R_PPC64_GOT_DTPREL16_DS
5633 || r_type == R_PPC64_GOT16
5634 || r_type == R_PPC64_GOT16_DS)
5635 {
5636 htab->do_multi_toc = 1;
5637 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5638 }
5639
5640 if (ppc64_elf_tdata (abfd)->got == NULL
5641 && !create_got_section (abfd, info))
5642 return FALSE;
5643
5644 if (h != NULL)
5645 {
5646 struct ppc_link_hash_entry *eh;
5647 struct got_entry *ent;
5648
5649 eh = (struct ppc_link_hash_entry *) h;
5650 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5651 if (ent->addend == rel->r_addend
5652 && ent->owner == abfd
5653 && ent->tls_type == tls_type)
5654 break;
5655 if (ent == NULL)
5656 {
5657 bfd_size_type amt = sizeof (*ent);
5658 ent = bfd_alloc (abfd, amt);
5659 if (ent == NULL)
5660 return FALSE;
5661 ent->next = eh->elf.got.glist;
5662 ent->addend = rel->r_addend;
5663 ent->owner = abfd;
5664 ent->tls_type = tls_type;
5665 ent->is_indirect = FALSE;
5666 ent->got.refcount = 0;
5667 eh->elf.got.glist = ent;
5668 }
5669 ent->got.refcount += 1;
5670 eh->tls_mask |= tls_type;
5671 }
5672 else
5673 /* This is a global offset table entry for a local symbol. */
5674 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5675 rel->r_addend, tls_type))
5676 return FALSE;
5677
5678 /* We may also need a plt entry if the symbol turns out to be
5679 an ifunc. */
5680 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
5681 {
5682 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5683 return FALSE;
5684 }
5685 break;
5686
5687 case R_PPC64_PLT16_HA:
5688 case R_PPC64_PLT16_HI:
5689 case R_PPC64_PLT16_LO:
5690 case R_PPC64_PLT16_LO_DS:
5691 case R_PPC64_PLT32:
5692 case R_PPC64_PLT64:
5693 /* This symbol requires a procedure linkage table entry. */
5694 plt_list = ifunc;
5695 if (h != NULL)
5696 {
5697 h->needs_plt = 1;
5698 if (h->root.root.string[0] == '.'
5699 && h->root.root.string[1] != '\0')
5700 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5701 ((struct ppc_link_hash_entry *) h)->tls_mask |= PLT_KEEP;
5702 plt_list = &h->plt.plist;
5703 }
5704 if (plt_list == NULL)
5705 plt_list = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5706 rel->r_addend,
5707 NON_GOT | PLT_KEEP);
5708 if (!update_plt_info (abfd, plt_list, rel->r_addend))
5709 return FALSE;
5710 break;
5711
5712 /* The following relocations don't need to propagate the
5713 relocation if linking a shared object since they are
5714 section relative. */
5715 case R_PPC64_SECTOFF:
5716 case R_PPC64_SECTOFF_LO:
5717 case R_PPC64_SECTOFF_HI:
5718 case R_PPC64_SECTOFF_HA:
5719 case R_PPC64_SECTOFF_DS:
5720 case R_PPC64_SECTOFF_LO_DS:
5721 case R_PPC64_DTPREL16:
5722 case R_PPC64_DTPREL16_LO:
5723 case R_PPC64_DTPREL16_HI:
5724 case R_PPC64_DTPREL16_HA:
5725 case R_PPC64_DTPREL16_DS:
5726 case R_PPC64_DTPREL16_LO_DS:
5727 case R_PPC64_DTPREL16_HIGH:
5728 case R_PPC64_DTPREL16_HIGHA:
5729 case R_PPC64_DTPREL16_HIGHER:
5730 case R_PPC64_DTPREL16_HIGHERA:
5731 case R_PPC64_DTPREL16_HIGHEST:
5732 case R_PPC64_DTPREL16_HIGHESTA:
5733 break;
5734
5735 /* Nor do these. */
5736 case R_PPC64_REL16:
5737 case R_PPC64_REL16_LO:
5738 case R_PPC64_REL16_HI:
5739 case R_PPC64_REL16_HA:
5740 case R_PPC64_REL16DX_HA:
5741 break;
5742
5743 /* Not supported as a dynamic relocation. */
5744 case R_PPC64_ADDR64_LOCAL:
5745 if (bfd_link_pic (info))
5746 {
5747 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5748 ppc_howto_init ();
5749 /* xgettext:c-format */
5750 info->callbacks->einfo (_("%H: %s reloc unsupported "
5751 "in shared libraries and PIEs\n"),
5752 abfd, sec, rel->r_offset,
5753 ppc64_elf_howto_table[r_type]->name);
5754 bfd_set_error (bfd_error_bad_value);
5755 return FALSE;
5756 }
5757 break;
5758
5759 case R_PPC64_TOC16:
5760 case R_PPC64_TOC16_DS:
5761 htab->do_multi_toc = 1;
5762 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5763 /* Fall through. */
5764 case R_PPC64_TOC16_LO:
5765 case R_PPC64_TOC16_HI:
5766 case R_PPC64_TOC16_HA:
5767 case R_PPC64_TOC16_LO_DS:
5768 sec->has_toc_reloc = 1;
5769 break;
5770
5771 /* Marker reloc. */
5772 case R_PPC64_ENTRY:
5773 break;
5774
5775 /* This relocation describes the C++ object vtable hierarchy.
5776 Reconstruct it for later use during GC. */
5777 case R_PPC64_GNU_VTINHERIT:
5778 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5779 return FALSE;
5780 break;
5781
5782 /* This relocation describes which C++ vtable entries are actually
5783 used. Record for later use during GC. */
5784 case R_PPC64_GNU_VTENTRY:
5785 BFD_ASSERT (h != NULL);
5786 if (h != NULL
5787 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5788 return FALSE;
5789 break;
5790
5791 case R_PPC64_REL14:
5792 case R_PPC64_REL14_BRTAKEN:
5793 case R_PPC64_REL14_BRNTAKEN:
5794 {
5795 asection *dest = NULL;
5796
5797 /* Heuristic: If jumping outside our section, chances are
5798 we are going to need a stub. */
5799 if (h != NULL)
5800 {
5801 /* If the sym is weak it may be overridden later, so
5802 don't assume we know where a weak sym lives. */
5803 if (h->root.type == bfd_link_hash_defined)
5804 dest = h->root.u.def.section;
5805 }
5806 else
5807 {
5808 Elf_Internal_Sym *isym;
5809
5810 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5811 abfd, r_symndx);
5812 if (isym == NULL)
5813 return FALSE;
5814
5815 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5816 }
5817
5818 if (dest != sec)
5819 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5820 }
5821 /* Fall through. */
5822
5823 case R_PPC64_REL24:
5824 case R_PPC64_PLTCALL:
5825 plt_list = ifunc;
5826 if (h != NULL)
5827 {
5828 h->needs_plt = 1;
5829 if (h->root.root.string[0] == '.'
5830 && h->root.root.string[1] != '\0')
5831 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5832
5833 if (h == tga || h == dottga)
5834 {
5835 sec->has_tls_reloc = 1;
5836 if (rel != relocs
5837 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5838 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5839 /* We have a new-style __tls_get_addr call with
5840 a marker reloc. */
5841 ;
5842 else
5843 /* Mark this section as having an old-style call. */
5844 sec->has_tls_get_addr_call = 1;
5845 }
5846 plt_list = &h->plt.plist;
5847 }
5848
5849 /* We may need a .plt entry if the function this reloc
5850 refers to is in a shared lib. */
5851 if (plt_list
5852 && !update_plt_info (abfd, plt_list, rel->r_addend))
5853 return FALSE;
5854 break;
5855
5856 case R_PPC64_ADDR14:
5857 case R_PPC64_ADDR14_BRNTAKEN:
5858 case R_PPC64_ADDR14_BRTAKEN:
5859 case R_PPC64_ADDR24:
5860 goto dodyn;
5861
5862 case R_PPC64_TPREL64:
5863 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5864 if (bfd_link_dll (info))
5865 info->flags |= DF_STATIC_TLS;
5866 goto dotlstoc;
5867
5868 case R_PPC64_DTPMOD64:
5869 if (rel + 1 < rel_end
5870 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5871 && rel[1].r_offset == rel->r_offset + 8)
5872 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5873 else
5874 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5875 goto dotlstoc;
5876
5877 case R_PPC64_DTPREL64:
5878 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5879 if (rel != relocs
5880 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5881 && rel[-1].r_offset == rel->r_offset - 8)
5882 /* This is the second reloc of a dtpmod, dtprel pair.
5883 Don't mark with TLS_DTPREL. */
5884 goto dodyn;
5885
5886 dotlstoc:
5887 sec->has_tls_reloc = 1;
5888 if (h != NULL)
5889 {
5890 struct ppc_link_hash_entry *eh;
5891 eh = (struct ppc_link_hash_entry *) h;
5892 eh->tls_mask |= tls_type;
5893 }
5894 else
5895 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5896 rel->r_addend, tls_type))
5897 return FALSE;
5898
5899 ppc64_sec = ppc64_elf_section_data (sec);
5900 if (ppc64_sec->sec_type != sec_toc)
5901 {
5902 bfd_size_type amt;
5903
5904 /* One extra to simplify get_tls_mask. */
5905 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5906 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5907 if (ppc64_sec->u.toc.symndx == NULL)
5908 return FALSE;
5909 amt = sec->size * sizeof (bfd_vma) / 8;
5910 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5911 if (ppc64_sec->u.toc.add == NULL)
5912 return FALSE;
5913 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5914 ppc64_sec->sec_type = sec_toc;
5915 }
5916 BFD_ASSERT (rel->r_offset % 8 == 0);
5917 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5918 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5919
5920 /* Mark the second slot of a GD or LD entry.
5921 -1 to indicate GD and -2 to indicate LD. */
5922 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5923 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5924 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5925 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5926 goto dodyn;
5927
5928 case R_PPC64_TPREL16:
5929 case R_PPC64_TPREL16_LO:
5930 case R_PPC64_TPREL16_HI:
5931 case R_PPC64_TPREL16_HA:
5932 case R_PPC64_TPREL16_DS:
5933 case R_PPC64_TPREL16_LO_DS:
5934 case R_PPC64_TPREL16_HIGH:
5935 case R_PPC64_TPREL16_HIGHA:
5936 case R_PPC64_TPREL16_HIGHER:
5937 case R_PPC64_TPREL16_HIGHERA:
5938 case R_PPC64_TPREL16_HIGHEST:
5939 case R_PPC64_TPREL16_HIGHESTA:
5940 if (bfd_link_dll (info))
5941 info->flags |= DF_STATIC_TLS;
5942 goto dodyn;
5943
5944 case R_PPC64_ADDR64:
5945 if (is_opd
5946 && rel + 1 < rel_end
5947 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5948 {
5949 if (h != NULL)
5950 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5951 }
5952 /* Fall through. */
5953
5954 case R_PPC64_ADDR16:
5955 case R_PPC64_ADDR16_DS:
5956 case R_PPC64_ADDR16_HA:
5957 case R_PPC64_ADDR16_HI:
5958 case R_PPC64_ADDR16_HIGH:
5959 case R_PPC64_ADDR16_HIGHA:
5960 case R_PPC64_ADDR16_HIGHER:
5961 case R_PPC64_ADDR16_HIGHERA:
5962 case R_PPC64_ADDR16_HIGHEST:
5963 case R_PPC64_ADDR16_HIGHESTA:
5964 case R_PPC64_ADDR16_LO:
5965 case R_PPC64_ADDR16_LO_DS:
5966 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
5967 && rel->r_addend == 0)
5968 {
5969 /* We may need a .plt entry if this reloc refers to a
5970 function in a shared lib. */
5971 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5972 return FALSE;
5973 h->pointer_equality_needed = 1;
5974 }
5975 /* Fall through. */
5976
5977 case R_PPC64_REL30:
5978 case R_PPC64_REL32:
5979 case R_PPC64_REL64:
5980 case R_PPC64_ADDR32:
5981 case R_PPC64_UADDR16:
5982 case R_PPC64_UADDR32:
5983 case R_PPC64_UADDR64:
5984 case R_PPC64_TOC:
5985 if (h != NULL && !bfd_link_pic (info))
5986 /* We may need a copy reloc. */
5987 h->non_got_ref = 1;
5988
5989 /* Don't propagate .opd relocs. */
5990 if (NO_OPD_RELOCS && is_opd)
5991 break;
5992
5993 /* If we are creating a shared library, and this is a reloc
5994 against a global symbol, or a non PC relative reloc
5995 against a local symbol, then we need to copy the reloc
5996 into the shared library. However, if we are linking with
5997 -Bsymbolic, we do not need to copy a reloc against a
5998 global symbol which is defined in an object we are
5999 including in the link (i.e., DEF_REGULAR is set). At
6000 this point we have not seen all the input files, so it is
6001 possible that DEF_REGULAR is not set now but will be set
6002 later (it is never cleared). In case of a weak definition,
6003 DEF_REGULAR may be cleared later by a strong definition in
6004 a shared library. We account for that possibility below by
6005 storing information in the dyn_relocs field of the hash
6006 table entry. A similar situation occurs when creating
6007 shared libraries and symbol visibility changes render the
6008 symbol local.
6009
6010 If on the other hand, we are creating an executable, we
6011 may need to keep relocations for symbols satisfied by a
6012 dynamic library if we manage to avoid copy relocs for the
6013 symbol. */
6014 dodyn:
6015 if ((bfd_link_pic (info)
6016 && (must_be_dyn_reloc (info, r_type)
6017 || (h != NULL
6018 && (!SYMBOLIC_BIND (info, h)
6019 || h->root.type == bfd_link_hash_defweak
6020 || !h->def_regular))))
6021 || (ELIMINATE_COPY_RELOCS
6022 && !bfd_link_pic (info)
6023 && h != NULL
6024 && (h->root.type == bfd_link_hash_defweak
6025 || !h->def_regular))
6026 || (!bfd_link_pic (info)
6027 && ifunc != NULL))
6028 {
6029 /* We must copy these reloc types into the output file.
6030 Create a reloc section in dynobj and make room for
6031 this reloc. */
6032 if (sreloc == NULL)
6033 {
6034 sreloc = _bfd_elf_make_dynamic_reloc_section
6035 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
6036
6037 if (sreloc == NULL)
6038 return FALSE;
6039 }
6040
6041 /* If this is a global symbol, we count the number of
6042 relocations we need for this symbol. */
6043 if (h != NULL)
6044 {
6045 struct elf_dyn_relocs *p;
6046 struct elf_dyn_relocs **head;
6047
6048 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6049 p = *head;
6050 if (p == NULL || p->sec != sec)
6051 {
6052 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6053 if (p == NULL)
6054 return FALSE;
6055 p->next = *head;
6056 *head = p;
6057 p->sec = sec;
6058 p->count = 0;
6059 p->pc_count = 0;
6060 }
6061 p->count += 1;
6062 if (!must_be_dyn_reloc (info, r_type))
6063 p->pc_count += 1;
6064 }
6065 else
6066 {
6067 /* Track dynamic relocs needed for local syms too.
6068 We really need local syms available to do this
6069 easily. Oh well. */
6070 struct ppc_dyn_relocs *p;
6071 struct ppc_dyn_relocs **head;
6072 bfd_boolean is_ifunc;
6073 asection *s;
6074 void *vpp;
6075 Elf_Internal_Sym *isym;
6076
6077 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
6078 abfd, r_symndx);
6079 if (isym == NULL)
6080 return FALSE;
6081
6082 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
6083 if (s == NULL)
6084 s = sec;
6085
6086 vpp = &elf_section_data (s)->local_dynrel;
6087 head = (struct ppc_dyn_relocs **) vpp;
6088 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
6089 p = *head;
6090 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
6091 p = p->next;
6092 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
6093 {
6094 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
6095 if (p == NULL)
6096 return FALSE;
6097 p->next = *head;
6098 *head = p;
6099 p->sec = sec;
6100 p->ifunc = is_ifunc;
6101 p->count = 0;
6102 }
6103 p->count += 1;
6104 }
6105 }
6106 break;
6107
6108 default:
6109 break;
6110 }
6111 }
6112
6113 return TRUE;
6114 }
6115
6116 /* Merge backend specific data from an object file to the output
6117 object file when linking. */
6118
6119 static bfd_boolean
6120 ppc64_elf_merge_private_bfd_data (bfd *ibfd, struct bfd_link_info *info)
6121 {
6122 bfd *obfd = info->output_bfd;
6123 unsigned long iflags, oflags;
6124
6125 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
6126 return TRUE;
6127
6128 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
6129 return TRUE;
6130
6131 if (!_bfd_generic_verify_endian_match (ibfd, info))
6132 return FALSE;
6133
6134 iflags = elf_elfheader (ibfd)->e_flags;
6135 oflags = elf_elfheader (obfd)->e_flags;
6136
6137 if (iflags & ~EF_PPC64_ABI)
6138 {
6139 _bfd_error_handler
6140 /* xgettext:c-format */
6141 (_("%pB uses unknown e_flags 0x%lx"), ibfd, iflags);
6142 bfd_set_error (bfd_error_bad_value);
6143 return FALSE;
6144 }
6145 else if (iflags != oflags && iflags != 0)
6146 {
6147 _bfd_error_handler
6148 /* xgettext:c-format */
6149 (_("%pB: ABI version %ld is not compatible with ABI version %ld output"),
6150 ibfd, iflags, oflags);
6151 bfd_set_error (bfd_error_bad_value);
6152 return FALSE;
6153 }
6154
6155 _bfd_elf_ppc_merge_fp_attributes (ibfd, info);
6156
6157 /* Merge Tag_compatibility attributes and any common GNU ones. */
6158 _bfd_elf_merge_object_attributes (ibfd, info);
6159
6160 return TRUE;
6161 }
6162
6163 static bfd_boolean
6164 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
6165 {
6166 /* Print normal ELF private data. */
6167 _bfd_elf_print_private_bfd_data (abfd, ptr);
6168
6169 if (elf_elfheader (abfd)->e_flags != 0)
6170 {
6171 FILE *file = ptr;
6172
6173 fprintf (file, _("private flags = 0x%lx:"),
6174 elf_elfheader (abfd)->e_flags);
6175
6176 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
6177 fprintf (file, _(" [abiv%ld]"),
6178 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
6179 fputc ('\n', file);
6180 }
6181
6182 return TRUE;
6183 }
6184
6185 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
6186 of the code entry point, and its section, which must be in the same
6187 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
6188
6189 static bfd_vma
6190 opd_entry_value (asection *opd_sec,
6191 bfd_vma offset,
6192 asection **code_sec,
6193 bfd_vma *code_off,
6194 bfd_boolean in_code_sec)
6195 {
6196 bfd *opd_bfd = opd_sec->owner;
6197 Elf_Internal_Rela *relocs;
6198 Elf_Internal_Rela *lo, *hi, *look;
6199 bfd_vma val;
6200
6201 /* No relocs implies we are linking a --just-symbols object, or looking
6202 at a final linked executable with addr2line or somesuch. */
6203 if (opd_sec->reloc_count == 0)
6204 {
6205 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
6206
6207 if (contents == NULL)
6208 {
6209 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
6210 return (bfd_vma) -1;
6211 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
6212 }
6213
6214 /* PR 17512: file: 64b9dfbb. */
6215 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
6216 return (bfd_vma) -1;
6217
6218 val = bfd_get_64 (opd_bfd, contents + offset);
6219 if (code_sec != NULL)
6220 {
6221 asection *sec, *likely = NULL;
6222
6223 if (in_code_sec)
6224 {
6225 sec = *code_sec;
6226 if (sec->vma <= val
6227 && val < sec->vma + sec->size)
6228 likely = sec;
6229 else
6230 val = -1;
6231 }
6232 else
6233 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
6234 if (sec->vma <= val
6235 && (sec->flags & SEC_LOAD) != 0
6236 && (sec->flags & SEC_ALLOC) != 0)
6237 likely = sec;
6238 if (likely != NULL)
6239 {
6240 *code_sec = likely;
6241 if (code_off != NULL)
6242 *code_off = val - likely->vma;
6243 }
6244 }
6245 return val;
6246 }
6247
6248 BFD_ASSERT (is_ppc64_elf (opd_bfd));
6249
6250 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
6251 if (relocs == NULL)
6252 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
6253 /* PR 17512: file: df8e1fd6. */
6254 if (relocs == NULL)
6255 return (bfd_vma) -1;
6256
6257 /* Go find the opd reloc at the sym address. */
6258 lo = relocs;
6259 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
6260 val = (bfd_vma) -1;
6261 while (lo < hi)
6262 {
6263 look = lo + (hi - lo) / 2;
6264 if (look->r_offset < offset)
6265 lo = look + 1;
6266 else if (look->r_offset > offset)
6267 hi = look;
6268 else
6269 {
6270 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6271
6272 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6273 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6274 {
6275 unsigned long symndx = ELF64_R_SYM (look->r_info);
6276 asection *sec = NULL;
6277
6278 if (symndx >= symtab_hdr->sh_info
6279 && elf_sym_hashes (opd_bfd) != NULL)
6280 {
6281 struct elf_link_hash_entry **sym_hashes;
6282 struct elf_link_hash_entry *rh;
6283
6284 sym_hashes = elf_sym_hashes (opd_bfd);
6285 rh = sym_hashes[symndx - symtab_hdr->sh_info];
6286 if (rh != NULL)
6287 {
6288 rh = elf_follow_link (rh);
6289 if (rh->root.type != bfd_link_hash_defined
6290 && rh->root.type != bfd_link_hash_defweak)
6291 break;
6292 if (rh->root.u.def.section->owner == opd_bfd)
6293 {
6294 val = rh->root.u.def.value;
6295 sec = rh->root.u.def.section;
6296 }
6297 }
6298 }
6299
6300 if (sec == NULL)
6301 {
6302 Elf_Internal_Sym *sym;
6303
6304 if (symndx < symtab_hdr->sh_info)
6305 {
6306 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6307 if (sym == NULL)
6308 {
6309 size_t symcnt = symtab_hdr->sh_info;
6310 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6311 symcnt, 0,
6312 NULL, NULL, NULL);
6313 if (sym == NULL)
6314 break;
6315 symtab_hdr->contents = (bfd_byte *) sym;
6316 }
6317 sym += symndx;
6318 }
6319 else
6320 {
6321 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6322 1, symndx,
6323 NULL, NULL, NULL);
6324 if (sym == NULL)
6325 break;
6326 }
6327 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6328 if (sec == NULL)
6329 break;
6330 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6331 val = sym->st_value;
6332 }
6333
6334 val += look->r_addend;
6335 if (code_off != NULL)
6336 *code_off = val;
6337 if (code_sec != NULL)
6338 {
6339 if (in_code_sec && *code_sec != sec)
6340 return -1;
6341 else
6342 *code_sec = sec;
6343 }
6344 if (sec->output_section != NULL)
6345 val += sec->output_section->vma + sec->output_offset;
6346 }
6347 break;
6348 }
6349 }
6350
6351 return val;
6352 }
6353
6354 /* If the ELF symbol SYM might be a function in SEC, return the
6355 function size and set *CODE_OFF to the function's entry point,
6356 otherwise return zero. */
6357
6358 static bfd_size_type
6359 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6360 bfd_vma *code_off)
6361 {
6362 bfd_size_type size;
6363
6364 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6365 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6366 return 0;
6367
6368 size = 0;
6369 if (!(sym->flags & BSF_SYNTHETIC))
6370 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6371
6372 if (strcmp (sym->section->name, ".opd") == 0)
6373 {
6374 struct _opd_sec_data *opd = get_opd_info (sym->section);
6375 bfd_vma symval = sym->value;
6376
6377 if (opd != NULL
6378 && opd->adjust != NULL
6379 && elf_section_data (sym->section)->relocs != NULL)
6380 {
6381 /* opd_entry_value will use cached relocs that have been
6382 adjusted, but with raw symbols. That means both local
6383 and global symbols need adjusting. */
6384 long adjust = opd->adjust[OPD_NDX (symval)];
6385 if (adjust == -1)
6386 return 0;
6387 symval += adjust;
6388 }
6389
6390 if (opd_entry_value (sym->section, symval,
6391 &sec, code_off, TRUE) == (bfd_vma) -1)
6392 return 0;
6393 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6394 symbol. This size has nothing to do with the code size of the
6395 function, which is what we're supposed to return, but the
6396 code size isn't available without looking up the dot-sym.
6397 However, doing that would be a waste of time particularly
6398 since elf_find_function will look at the dot-sym anyway.
6399 Now, elf_find_function will keep the largest size of any
6400 function sym found at the code address of interest, so return
6401 1 here to avoid it incorrectly caching a larger function size
6402 for a small function. This does mean we return the wrong
6403 size for a new-ABI function of size 24, but all that does is
6404 disable caching for such functions. */
6405 if (size == 24)
6406 size = 1;
6407 }
6408 else
6409 {
6410 if (sym->section != sec)
6411 return 0;
6412 *code_off = sym->value;
6413 }
6414 if (size == 0)
6415 size = 1;
6416 return size;
6417 }
6418
6419 /* Return true if symbol is a strong function defined in an ELFv2
6420 object with st_other localentry bits of zero, ie. its local entry
6421 point coincides with its global entry point. */
6422
6423 static bfd_boolean
6424 is_elfv2_localentry0 (struct elf_link_hash_entry *h)
6425 {
6426 return (h != NULL
6427 && h->type == STT_FUNC
6428 && h->root.type == bfd_link_hash_defined
6429 && (STO_PPC64_LOCAL_MASK & h->other) == 0
6430 && !((struct ppc_link_hash_entry *) h)->non_zero_localentry
6431 && is_ppc64_elf (h->root.u.def.section->owner)
6432 && abiversion (h->root.u.def.section->owner) >= 2);
6433 }
6434
6435 /* Return true if symbol is defined in a regular object file. */
6436
6437 static bfd_boolean
6438 is_static_defined (struct elf_link_hash_entry *h)
6439 {
6440 return ((h->root.type == bfd_link_hash_defined
6441 || h->root.type == bfd_link_hash_defweak)
6442 && h->root.u.def.section != NULL
6443 && h->root.u.def.section->output_section != NULL);
6444 }
6445
6446 /* If FDH is a function descriptor symbol, return the associated code
6447 entry symbol if it is defined. Return NULL otherwise. */
6448
6449 static struct ppc_link_hash_entry *
6450 defined_code_entry (struct ppc_link_hash_entry *fdh)
6451 {
6452 if (fdh->is_func_descriptor)
6453 {
6454 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6455 if (fh->elf.root.type == bfd_link_hash_defined
6456 || fh->elf.root.type == bfd_link_hash_defweak)
6457 return fh;
6458 }
6459 return NULL;
6460 }
6461
6462 /* If FH is a function code entry symbol, return the associated
6463 function descriptor symbol if it is defined. Return NULL otherwise. */
6464
6465 static struct ppc_link_hash_entry *
6466 defined_func_desc (struct ppc_link_hash_entry *fh)
6467 {
6468 if (fh->oh != NULL
6469 && fh->oh->is_func_descriptor)
6470 {
6471 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6472 if (fdh->elf.root.type == bfd_link_hash_defined
6473 || fdh->elf.root.type == bfd_link_hash_defweak)
6474 return fdh;
6475 }
6476 return NULL;
6477 }
6478
6479 static bfd_boolean func_desc_adjust (struct elf_link_hash_entry *, void *);
6480
6481 /* Garbage collect sections, after first dealing with dot-symbols. */
6482
6483 static bfd_boolean
6484 ppc64_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
6485 {
6486 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6487
6488 if (htab != NULL && htab->need_func_desc_adj)
6489 {
6490 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6491 htab->need_func_desc_adj = 0;
6492 }
6493 return bfd_elf_gc_sections (abfd, info);
6494 }
6495
6496 /* Mark all our entry sym sections, both opd and code section. */
6497
6498 static void
6499 ppc64_elf_gc_keep (struct bfd_link_info *info)
6500 {
6501 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6502 struct bfd_sym_chain *sym;
6503
6504 if (htab == NULL)
6505 return;
6506
6507 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6508 {
6509 struct ppc_link_hash_entry *eh, *fh;
6510 asection *sec;
6511
6512 eh = (struct ppc_link_hash_entry *)
6513 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6514 if (eh == NULL)
6515 continue;
6516 if (eh->elf.root.type != bfd_link_hash_defined
6517 && eh->elf.root.type != bfd_link_hash_defweak)
6518 continue;
6519
6520 fh = defined_code_entry (eh);
6521 if (fh != NULL)
6522 {
6523 sec = fh->elf.root.u.def.section;
6524 sec->flags |= SEC_KEEP;
6525 }
6526 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6527 && opd_entry_value (eh->elf.root.u.def.section,
6528 eh->elf.root.u.def.value,
6529 &sec, NULL, FALSE) != (bfd_vma) -1)
6530 sec->flags |= SEC_KEEP;
6531
6532 sec = eh->elf.root.u.def.section;
6533 sec->flags |= SEC_KEEP;
6534 }
6535 }
6536
6537 /* Mark sections containing dynamically referenced symbols. When
6538 building shared libraries, we must assume that any visible symbol is
6539 referenced. */
6540
6541 static bfd_boolean
6542 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6543 {
6544 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6545 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6546 struct ppc_link_hash_entry *fdh;
6547 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6548
6549 /* Dynamic linking info is on the func descriptor sym. */
6550 fdh = defined_func_desc (eh);
6551 if (fdh != NULL)
6552 eh = fdh;
6553
6554 if ((eh->elf.root.type == bfd_link_hash_defined
6555 || eh->elf.root.type == bfd_link_hash_defweak)
6556 && ((eh->elf.ref_dynamic && !eh->elf.forced_local)
6557 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
6558 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6559 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6560 && (!bfd_link_executable (info)
6561 || info->gc_keep_exported
6562 || info->export_dynamic
6563 || (eh->elf.dynamic
6564 && d != NULL
6565 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6566 && (eh->elf.versioned >= versioned
6567 || !bfd_hide_sym_by_version (info->version_info,
6568 eh->elf.root.root.string)))))
6569 {
6570 asection *code_sec;
6571 struct ppc_link_hash_entry *fh;
6572
6573 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6574
6575 /* Function descriptor syms cause the associated
6576 function code sym section to be marked. */
6577 fh = defined_code_entry (eh);
6578 if (fh != NULL)
6579 {
6580 code_sec = fh->elf.root.u.def.section;
6581 code_sec->flags |= SEC_KEEP;
6582 }
6583 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6584 && opd_entry_value (eh->elf.root.u.def.section,
6585 eh->elf.root.u.def.value,
6586 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6587 code_sec->flags |= SEC_KEEP;
6588 }
6589
6590 return TRUE;
6591 }
6592
6593 /* Return the section that should be marked against GC for a given
6594 relocation. */
6595
6596 static asection *
6597 ppc64_elf_gc_mark_hook (asection *sec,
6598 struct bfd_link_info *info,
6599 Elf_Internal_Rela *rel,
6600 struct elf_link_hash_entry *h,
6601 Elf_Internal_Sym *sym)
6602 {
6603 asection *rsec;
6604
6605 /* Syms return NULL if we're marking .opd, so we avoid marking all
6606 function sections, as all functions are referenced in .opd. */
6607 rsec = NULL;
6608 if (get_opd_info (sec) != NULL)
6609 return rsec;
6610
6611 if (h != NULL)
6612 {
6613 enum elf_ppc64_reloc_type r_type;
6614 struct ppc_link_hash_entry *eh, *fh, *fdh;
6615
6616 r_type = ELF64_R_TYPE (rel->r_info);
6617 switch (r_type)
6618 {
6619 case R_PPC64_GNU_VTINHERIT:
6620 case R_PPC64_GNU_VTENTRY:
6621 break;
6622
6623 default:
6624 switch (h->root.type)
6625 {
6626 case bfd_link_hash_defined:
6627 case bfd_link_hash_defweak:
6628 eh = (struct ppc_link_hash_entry *) h;
6629 fdh = defined_func_desc (eh);
6630 if (fdh != NULL)
6631 {
6632 /* -mcall-aixdesc code references the dot-symbol on
6633 a call reloc. Mark the function descriptor too
6634 against garbage collection. */
6635 fdh->elf.mark = 1;
6636 if (fdh->elf.is_weakalias)
6637 weakdef (&fdh->elf)->mark = 1;
6638 eh = fdh;
6639 }
6640
6641 /* Function descriptor syms cause the associated
6642 function code sym section to be marked. */
6643 fh = defined_code_entry (eh);
6644 if (fh != NULL)
6645 {
6646 /* They also mark their opd section. */
6647 eh->elf.root.u.def.section->gc_mark = 1;
6648
6649 rsec = fh->elf.root.u.def.section;
6650 }
6651 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6652 && opd_entry_value (eh->elf.root.u.def.section,
6653 eh->elf.root.u.def.value,
6654 &rsec, NULL, FALSE) != (bfd_vma) -1)
6655 eh->elf.root.u.def.section->gc_mark = 1;
6656 else
6657 rsec = h->root.u.def.section;
6658 break;
6659
6660 case bfd_link_hash_common:
6661 rsec = h->root.u.c.p->section;
6662 break;
6663
6664 default:
6665 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6666 }
6667 }
6668 }
6669 else
6670 {
6671 struct _opd_sec_data *opd;
6672
6673 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6674 opd = get_opd_info (rsec);
6675 if (opd != NULL && opd->func_sec != NULL)
6676 {
6677 rsec->gc_mark = 1;
6678
6679 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
6680 }
6681 }
6682
6683 return rsec;
6684 }
6685
6686 /* The maximum size of .sfpr. */
6687 #define SFPR_MAX (218*4)
6688
6689 struct sfpr_def_parms
6690 {
6691 const char name[12];
6692 unsigned char lo, hi;
6693 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6694 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6695 };
6696
6697 /* Auto-generate _save*, _rest* functions in .sfpr.
6698 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6699 instead. */
6700
6701 static bfd_boolean
6702 sfpr_define (struct bfd_link_info *info,
6703 const struct sfpr_def_parms *parm,
6704 asection *stub_sec)
6705 {
6706 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6707 unsigned int i;
6708 size_t len = strlen (parm->name);
6709 bfd_boolean writing = FALSE;
6710 char sym[16];
6711
6712 if (htab == NULL)
6713 return FALSE;
6714
6715 memcpy (sym, parm->name, len);
6716 sym[len + 2] = 0;
6717
6718 for (i = parm->lo; i <= parm->hi; i++)
6719 {
6720 struct ppc_link_hash_entry *h;
6721
6722 sym[len + 0] = i / 10 + '0';
6723 sym[len + 1] = i % 10 + '0';
6724 h = (struct ppc_link_hash_entry *)
6725 elf_link_hash_lookup (&htab->elf, sym, writing, TRUE, TRUE);
6726 if (stub_sec != NULL)
6727 {
6728 if (h != NULL
6729 && h->elf.root.type == bfd_link_hash_defined
6730 && h->elf.root.u.def.section == htab->sfpr)
6731 {
6732 struct elf_link_hash_entry *s;
6733 char buf[32];
6734 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6735 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6736 if (s == NULL)
6737 return FALSE;
6738 if (s->root.type == bfd_link_hash_new
6739 || (s->root.type = bfd_link_hash_defined
6740 && s->root.u.def.section == stub_sec))
6741 {
6742 s->root.type = bfd_link_hash_defined;
6743 s->root.u.def.section = stub_sec;
6744 s->root.u.def.value = (stub_sec->size - htab->sfpr->size
6745 + h->elf.root.u.def.value);
6746 s->ref_regular = 1;
6747 s->def_regular = 1;
6748 s->ref_regular_nonweak = 1;
6749 s->forced_local = 1;
6750 s->non_elf = 0;
6751 s->root.linker_def = 1;
6752 }
6753 }
6754 continue;
6755 }
6756 if (h != NULL)
6757 {
6758 h->save_res = 1;
6759 if (!h->elf.def_regular)
6760 {
6761 h->elf.root.type = bfd_link_hash_defined;
6762 h->elf.root.u.def.section = htab->sfpr;
6763 h->elf.root.u.def.value = htab->sfpr->size;
6764 h->elf.type = STT_FUNC;
6765 h->elf.def_regular = 1;
6766 h->elf.non_elf = 0;
6767 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6768 writing = TRUE;
6769 if (htab->sfpr->contents == NULL)
6770 {
6771 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6772 if (htab->sfpr->contents == NULL)
6773 return FALSE;
6774 }
6775 }
6776 }
6777 if (writing)
6778 {
6779 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6780 if (i != parm->hi)
6781 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6782 else
6783 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6784 htab->sfpr->size = p - htab->sfpr->contents;
6785 }
6786 }
6787
6788 return TRUE;
6789 }
6790
6791 static bfd_byte *
6792 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6793 {
6794 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6795 return p + 4;
6796 }
6797
6798 static bfd_byte *
6799 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6800 {
6801 p = savegpr0 (abfd, p, r);
6802 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6803 p = p + 4;
6804 bfd_put_32 (abfd, BLR, p);
6805 return p + 4;
6806 }
6807
6808 static bfd_byte *
6809 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6810 {
6811 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6812 return p + 4;
6813 }
6814
6815 static bfd_byte *
6816 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6817 {
6818 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6819 p = p + 4;
6820 p = restgpr0 (abfd, p, r);
6821 bfd_put_32 (abfd, MTLR_R0, p);
6822 p = p + 4;
6823 if (r == 29)
6824 {
6825 p = restgpr0 (abfd, p, 30);
6826 p = restgpr0 (abfd, p, 31);
6827 }
6828 bfd_put_32 (abfd, BLR, p);
6829 return p + 4;
6830 }
6831
6832 static bfd_byte *
6833 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6834 {
6835 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6836 return p + 4;
6837 }
6838
6839 static bfd_byte *
6840 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6841 {
6842 p = savegpr1 (abfd, p, r);
6843 bfd_put_32 (abfd, BLR, p);
6844 return p + 4;
6845 }
6846
6847 static bfd_byte *
6848 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6849 {
6850 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6851 return p + 4;
6852 }
6853
6854 static bfd_byte *
6855 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6856 {
6857 p = restgpr1 (abfd, p, r);
6858 bfd_put_32 (abfd, BLR, p);
6859 return p + 4;
6860 }
6861
6862 static bfd_byte *
6863 savefpr (bfd *abfd, bfd_byte *p, int r)
6864 {
6865 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6866 return p + 4;
6867 }
6868
6869 static bfd_byte *
6870 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6871 {
6872 p = savefpr (abfd, p, r);
6873 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6874 p = p + 4;
6875 bfd_put_32 (abfd, BLR, p);
6876 return p + 4;
6877 }
6878
6879 static bfd_byte *
6880 restfpr (bfd *abfd, bfd_byte *p, int r)
6881 {
6882 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6883 return p + 4;
6884 }
6885
6886 static bfd_byte *
6887 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6888 {
6889 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6890 p = p + 4;
6891 p = restfpr (abfd, p, r);
6892 bfd_put_32 (abfd, MTLR_R0, p);
6893 p = p + 4;
6894 if (r == 29)
6895 {
6896 p = restfpr (abfd, p, 30);
6897 p = restfpr (abfd, p, 31);
6898 }
6899 bfd_put_32 (abfd, BLR, p);
6900 return p + 4;
6901 }
6902
6903 static bfd_byte *
6904 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6905 {
6906 p = savefpr (abfd, p, r);
6907 bfd_put_32 (abfd, BLR, p);
6908 return p + 4;
6909 }
6910
6911 static bfd_byte *
6912 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6913 {
6914 p = restfpr (abfd, p, r);
6915 bfd_put_32 (abfd, BLR, p);
6916 return p + 4;
6917 }
6918
6919 static bfd_byte *
6920 savevr (bfd *abfd, bfd_byte *p, int r)
6921 {
6922 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6923 p = p + 4;
6924 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6925 return p + 4;
6926 }
6927
6928 static bfd_byte *
6929 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6930 {
6931 p = savevr (abfd, p, r);
6932 bfd_put_32 (abfd, BLR, p);
6933 return p + 4;
6934 }
6935
6936 static bfd_byte *
6937 restvr (bfd *abfd, bfd_byte *p, int r)
6938 {
6939 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6940 p = p + 4;
6941 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6942 return p + 4;
6943 }
6944
6945 static bfd_byte *
6946 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6947 {
6948 p = restvr (abfd, p, r);
6949 bfd_put_32 (abfd, BLR, p);
6950 return p + 4;
6951 }
6952
6953 /* Called via elf_link_hash_traverse to transfer dynamic linking
6954 information on function code symbol entries to their corresponding
6955 function descriptor symbol entries. */
6956
6957 static bfd_boolean
6958 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6959 {
6960 struct bfd_link_info *info;
6961 struct ppc_link_hash_table *htab;
6962 struct ppc_link_hash_entry *fh;
6963 struct ppc_link_hash_entry *fdh;
6964 bfd_boolean force_local;
6965
6966 fh = (struct ppc_link_hash_entry *) h;
6967 if (fh->elf.root.type == bfd_link_hash_indirect)
6968 return TRUE;
6969
6970 if (!fh->is_func)
6971 return TRUE;
6972
6973 if (fh->elf.root.root.string[0] != '.'
6974 || fh->elf.root.root.string[1] == '\0')
6975 return TRUE;
6976
6977 info = inf;
6978 htab = ppc_hash_table (info);
6979 if (htab == NULL)
6980 return FALSE;
6981
6982 /* Find the corresponding function descriptor symbol. */
6983 fdh = lookup_fdh (fh, htab);
6984
6985 /* Resolve undefined references to dot-symbols as the value
6986 in the function descriptor, if we have one in a regular object.
6987 This is to satisfy cases like ".quad .foo". Calls to functions
6988 in dynamic objects are handled elsewhere. */
6989 if ((fh->elf.root.type == bfd_link_hash_undefined
6990 || fh->elf.root.type == bfd_link_hash_undefweak)
6991 && (fdh->elf.root.type == bfd_link_hash_defined
6992 || fdh->elf.root.type == bfd_link_hash_defweak)
6993 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6994 && opd_entry_value (fdh->elf.root.u.def.section,
6995 fdh->elf.root.u.def.value,
6996 &fh->elf.root.u.def.section,
6997 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6998 {
6999 fh->elf.root.type = fdh->elf.root.type;
7000 fh->elf.forced_local = 1;
7001 fh->elf.def_regular = fdh->elf.def_regular;
7002 fh->elf.def_dynamic = fdh->elf.def_dynamic;
7003 }
7004
7005 if (!fh->elf.dynamic)
7006 {
7007 struct plt_entry *ent;
7008
7009 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
7010 if (ent->plt.refcount > 0)
7011 break;
7012 if (ent == NULL)
7013 return TRUE;
7014 }
7015
7016 /* Create a descriptor as undefined if necessary. */
7017 if (fdh == NULL
7018 && !bfd_link_executable (info)
7019 && (fh->elf.root.type == bfd_link_hash_undefined
7020 || fh->elf.root.type == bfd_link_hash_undefweak))
7021 {
7022 fdh = make_fdh (info, fh);
7023 if (fdh == NULL)
7024 return FALSE;
7025 }
7026
7027 /* We can't support overriding of symbols on a fake descriptor. */
7028 if (fdh != NULL
7029 && fdh->fake
7030 && (fh->elf.root.type == bfd_link_hash_defined
7031 || fh->elf.root.type == bfd_link_hash_defweak))
7032 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
7033
7034 /* Transfer dynamic linking information to the function descriptor. */
7035 if (fdh != NULL)
7036 {
7037 fdh->elf.ref_regular |= fh->elf.ref_regular;
7038 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
7039 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
7040 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
7041 fdh->elf.dynamic |= fh->elf.dynamic;
7042 fdh->elf.needs_plt |= (fh->elf.needs_plt
7043 || fh->elf.type == STT_FUNC
7044 || fh->elf.type == STT_GNU_IFUNC);
7045 move_plt_plist (fh, fdh);
7046
7047 if (!fdh->elf.forced_local
7048 && fh->elf.dynindx != -1)
7049 if (!bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
7050 return FALSE;
7051 }
7052
7053 /* Now that the info is on the function descriptor, clear the
7054 function code sym info. Any function code syms for which we
7055 don't have a definition in a regular file, we force local.
7056 This prevents a shared library from exporting syms that have
7057 been imported from another library. Function code syms that
7058 are really in the library we must leave global to prevent the
7059 linker dragging in a definition from a static library. */
7060 force_local = (!fh->elf.def_regular
7061 || fdh == NULL
7062 || !fdh->elf.def_regular
7063 || fdh->elf.forced_local);
7064 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7065
7066 return TRUE;
7067 }
7068
7069 static const struct sfpr_def_parms save_res_funcs[] =
7070 {
7071 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
7072 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
7073 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
7074 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
7075 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
7076 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
7077 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
7078 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
7079 { "._savef", 14, 31, savefpr, savefpr1_tail },
7080 { "._restf", 14, 31, restfpr, restfpr1_tail },
7081 { "_savevr_", 20, 31, savevr, savevr_tail },
7082 { "_restvr_", 20, 31, restvr, restvr_tail }
7083 };
7084
7085 /* Called near the start of bfd_elf_size_dynamic_sections. We use
7086 this hook to a) provide some gcc support functions, and b) transfer
7087 dynamic linking information gathered so far on function code symbol
7088 entries, to their corresponding function descriptor symbol entries. */
7089
7090 static bfd_boolean
7091 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
7092 struct bfd_link_info *info)
7093 {
7094 struct ppc_link_hash_table *htab;
7095
7096 htab = ppc_hash_table (info);
7097 if (htab == NULL)
7098 return FALSE;
7099
7100 /* Provide any missing _save* and _rest* functions. */
7101 if (htab->sfpr != NULL)
7102 {
7103 unsigned int i;
7104
7105 htab->sfpr->size = 0;
7106 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7107 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7108 return FALSE;
7109 if (htab->sfpr->size == 0)
7110 htab->sfpr->flags |= SEC_EXCLUDE;
7111 }
7112
7113 if (bfd_link_relocatable (info))
7114 return TRUE;
7115
7116 if (htab->elf.hgot != NULL)
7117 {
7118 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7119 /* Make .TOC. defined so as to prevent it being made dynamic.
7120 The wrong value here is fixed later in ppc64_elf_set_toc. */
7121 if (!htab->elf.hgot->def_regular
7122 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7123 {
7124 htab->elf.hgot->root.type = bfd_link_hash_defined;
7125 htab->elf.hgot->root.u.def.value = 0;
7126 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7127 htab->elf.hgot->def_regular = 1;
7128 htab->elf.hgot->root.linker_def = 1;
7129 }
7130 htab->elf.hgot->type = STT_OBJECT;
7131 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7132 | STV_HIDDEN);
7133 }
7134
7135 if (htab->need_func_desc_adj)
7136 {
7137 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7138 htab->need_func_desc_adj = 0;
7139 }
7140
7141 return TRUE;
7142 }
7143
7144 /* Find dynamic relocs for H that apply to read-only sections. */
7145
7146 static asection *
7147 readonly_dynrelocs (struct elf_link_hash_entry *h)
7148 {
7149 struct ppc_link_hash_entry *eh;
7150 struct elf_dyn_relocs *p;
7151
7152 eh = (struct ppc_link_hash_entry *) h;
7153 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7154 {
7155 asection *s = p->sec->output_section;
7156
7157 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7158 return p->sec;
7159 }
7160 return NULL;
7161 }
7162
7163 /* Return true if we have dynamic relocs against H or any of its weak
7164 aliases, that apply to read-only sections. Cannot be used after
7165 size_dynamic_sections. */
7166
7167 static bfd_boolean
7168 alias_readonly_dynrelocs (struct elf_link_hash_entry *h)
7169 {
7170 struct ppc_link_hash_entry *eh;
7171
7172 eh = (struct ppc_link_hash_entry *) h;
7173 do
7174 {
7175 if (readonly_dynrelocs (&eh->elf))
7176 return TRUE;
7177 eh = (struct ppc_link_hash_entry *) eh->elf.u.alias;
7178 } while (eh != NULL && &eh->elf != h);
7179
7180 return FALSE;
7181 }
7182
7183 /* Return whether EH has pc-relative dynamic relocs. */
7184
7185 static bfd_boolean
7186 pc_dynrelocs (struct ppc_link_hash_entry *eh)
7187 {
7188 struct elf_dyn_relocs *p;
7189
7190 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7191 if (p->pc_count != 0)
7192 return TRUE;
7193 return FALSE;
7194 }
7195
7196 /* Return true if a global entry stub will be created for H. Valid
7197 for ELFv2 before plt entries have been allocated. */
7198
7199 static bfd_boolean
7200 global_entry_stub (struct elf_link_hash_entry *h)
7201 {
7202 struct plt_entry *pent;
7203
7204 if (!h->pointer_equality_needed
7205 || h->def_regular)
7206 return FALSE;
7207
7208 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7209 if (pent->plt.refcount > 0
7210 && pent->addend == 0)
7211 return TRUE;
7212
7213 return FALSE;
7214 }
7215
7216 /* Adjust a symbol defined by a dynamic object and referenced by a
7217 regular object. The current definition is in some section of the
7218 dynamic object, but we're not including those sections. We have to
7219 change the definition to something the rest of the link can
7220 understand. */
7221
7222 static bfd_boolean
7223 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7224 struct elf_link_hash_entry *h)
7225 {
7226 struct ppc_link_hash_table *htab;
7227 asection *s, *srel;
7228
7229 htab = ppc_hash_table (info);
7230 if (htab == NULL)
7231 return FALSE;
7232
7233 /* Deal with function syms. */
7234 if (h->type == STT_FUNC
7235 || h->type == STT_GNU_IFUNC
7236 || h->needs_plt)
7237 {
7238 bfd_boolean local = (((struct ppc_link_hash_entry *) h)->save_res
7239 || SYMBOL_CALLS_LOCAL (info, h)
7240 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h));
7241 /* Discard dyn_relocs when non-pic if we've decided that a
7242 function symbol is local and not an ifunc. We keep dynamic
7243 relocs for ifuncs when local rather than always emitting a
7244 plt call stub for them and defining the symbol on the call
7245 stub. We can't do that for ELFv1 anyway (a function symbol
7246 is defined on a descriptor, not code) and it can be faster at
7247 run-time due to not needing to bounce through a stub. The
7248 dyn_relocs for ifuncs will be applied even in a static
7249 executable. */
7250 if (!bfd_link_pic (info)
7251 && h->type != STT_GNU_IFUNC
7252 && local)
7253 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7254
7255 /* Clear procedure linkage table information for any symbol that
7256 won't need a .plt entry. */
7257 struct plt_entry *ent;
7258 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7259 if (ent->plt.refcount > 0)
7260 break;
7261 if (ent == NULL
7262 || (h->type != STT_GNU_IFUNC
7263 && local
7264 && (((struct ppc_link_hash_entry *) h)->tls_mask
7265 & (TLS_TLS | PLT_KEEP)) != PLT_KEEP))
7266 {
7267 h->plt.plist = NULL;
7268 h->needs_plt = 0;
7269 h->pointer_equality_needed = 0;
7270 }
7271 else if (abiversion (info->output_bfd) >= 2)
7272 {
7273 /* Taking a function's address in a read/write section
7274 doesn't require us to define the function symbol in the
7275 executable on a global entry stub. A dynamic reloc can
7276 be used instead. The reason we prefer a few more dynamic
7277 relocs is that calling via a global entry stub costs a
7278 few more instructions, and pointer_equality_needed causes
7279 extra work in ld.so when resolving these symbols. */
7280 if (global_entry_stub (h))
7281 {
7282 if (!readonly_dynrelocs (h))
7283 {
7284 h->pointer_equality_needed = 0;
7285 /* If we haven't seen a branch reloc then we don't need
7286 a plt entry. */
7287 if (!h->needs_plt)
7288 h->plt.plist = NULL;
7289 }
7290 else if (!bfd_link_pic (info))
7291 /* We are going to be defining the function symbol on the
7292 plt stub, so no dyn_relocs needed when non-pic. */
7293 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7294 }
7295
7296 /* ELFv2 function symbols can't have copy relocs. */
7297 return TRUE;
7298 }
7299 else if (!h->needs_plt
7300 && !readonly_dynrelocs (h))
7301 {
7302 /* If we haven't seen a branch reloc then we don't need a
7303 plt entry. */
7304 h->plt.plist = NULL;
7305 h->pointer_equality_needed = 0;
7306 return TRUE;
7307 }
7308 }
7309 else
7310 h->plt.plist = NULL;
7311
7312 /* If this is a weak symbol, and there is a real definition, the
7313 processor independent code will have arranged for us to see the
7314 real definition first, and we can just use the same value. */
7315 if (h->is_weakalias)
7316 {
7317 struct elf_link_hash_entry *def = weakdef (h);
7318 BFD_ASSERT (def->root.type == bfd_link_hash_defined);
7319 h->root.u.def.section = def->root.u.def.section;
7320 h->root.u.def.value = def->root.u.def.value;
7321 if (def->root.u.def.section == htab->elf.sdynbss
7322 || def->root.u.def.section == htab->elf.sdynrelro)
7323 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7324 return TRUE;
7325 }
7326
7327 /* If we are creating a shared library, we must presume that the
7328 only references to the symbol are via the global offset table.
7329 For such cases we need not do anything here; the relocations will
7330 be handled correctly by relocate_section. */
7331 if (bfd_link_pic (info))
7332 return TRUE;
7333
7334 /* If there are no references to this symbol that do not use the
7335 GOT, we don't need to generate a copy reloc. */
7336 if (!h->non_got_ref)
7337 return TRUE;
7338
7339 /* Don't generate a copy reloc for symbols defined in the executable. */
7340 if (!h->def_dynamic || !h->ref_regular || h->def_regular
7341
7342 /* If -z nocopyreloc was given, don't generate them either. */
7343 || info->nocopyreloc
7344
7345 /* If we don't find any dynamic relocs in read-only sections, then
7346 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7347 || (ELIMINATE_COPY_RELOCS && !alias_readonly_dynrelocs (h))
7348
7349 /* Protected variables do not work with .dynbss. The copy in
7350 .dynbss won't be used by the shared library with the protected
7351 definition for the variable. Text relocations are preferable
7352 to an incorrect program. */
7353 || h->protected_def)
7354 return TRUE;
7355
7356 if (h->plt.plist != NULL)
7357 {
7358 /* We should never get here, but unfortunately there are versions
7359 of gcc out there that improperly (for this ABI) put initialized
7360 function pointers, vtable refs and suchlike in read-only
7361 sections. Allow them to proceed, but warn that this might
7362 break at runtime. */
7363 info->callbacks->einfo
7364 (_("%P: copy reloc against `%pT' requires lazy plt linking; "
7365 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7366 h->root.root.string);
7367 }
7368
7369 /* This is a reference to a symbol defined by a dynamic object which
7370 is not a function. */
7371
7372 /* We must allocate the symbol in our .dynbss section, which will
7373 become part of the .bss section of the executable. There will be
7374 an entry for this symbol in the .dynsym section. The dynamic
7375 object will contain position independent code, so all references
7376 from the dynamic object to this symbol will go through the global
7377 offset table. The dynamic linker will use the .dynsym entry to
7378 determine the address it must put in the global offset table, so
7379 both the dynamic object and the regular object will refer to the
7380 same memory location for the variable. */
7381 if ((h->root.u.def.section->flags & SEC_READONLY) != 0)
7382 {
7383 s = htab->elf.sdynrelro;
7384 srel = htab->elf.sreldynrelro;
7385 }
7386 else
7387 {
7388 s = htab->elf.sdynbss;
7389 srel = htab->elf.srelbss;
7390 }
7391 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7392 {
7393 /* We must generate a R_PPC64_COPY reloc to tell the dynamic
7394 linker to copy the initial value out of the dynamic object
7395 and into the runtime process image. */
7396 srel->size += sizeof (Elf64_External_Rela);
7397 h->needs_copy = 1;
7398 }
7399
7400 /* We no longer want dyn_relocs. */
7401 ((struct ppc_link_hash_entry *) h)->dyn_relocs = NULL;
7402 return _bfd_elf_adjust_dynamic_copy (info, h, s);
7403 }
7404
7405 /* If given a function descriptor symbol, hide both the function code
7406 sym and the descriptor. */
7407 static void
7408 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7409 struct elf_link_hash_entry *h,
7410 bfd_boolean force_local)
7411 {
7412 struct ppc_link_hash_entry *eh;
7413 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7414
7415 eh = (struct ppc_link_hash_entry *) h;
7416 if (eh->is_func_descriptor)
7417 {
7418 struct ppc_link_hash_entry *fh = eh->oh;
7419
7420 if (fh == NULL)
7421 {
7422 const char *p, *q;
7423 struct elf_link_hash_table *htab = elf_hash_table (info);
7424 char save;
7425
7426 /* We aren't supposed to use alloca in BFD because on
7427 systems which do not have alloca the version in libiberty
7428 calls xmalloc, which might cause the program to crash
7429 when it runs out of memory. This function doesn't have a
7430 return status, so there's no way to gracefully return an
7431 error. So cheat. We know that string[-1] can be safely
7432 accessed; It's either a string in an ELF string table,
7433 or allocated in an objalloc structure. */
7434
7435 p = eh->elf.root.root.string - 1;
7436 save = *p;
7437 *(char *) p = '.';
7438 fh = (struct ppc_link_hash_entry *)
7439 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7440 *(char *) p = save;
7441
7442 /* Unfortunately, if it so happens that the string we were
7443 looking for was allocated immediately before this string,
7444 then we overwrote the string terminator. That's the only
7445 reason the lookup should fail. */
7446 if (fh == NULL)
7447 {
7448 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7449 while (q >= eh->elf.root.root.string && *q == *p)
7450 --q, --p;
7451 if (q < eh->elf.root.root.string && *p == '.')
7452 fh = (struct ppc_link_hash_entry *)
7453 elf_link_hash_lookup (htab, p, FALSE, FALSE, FALSE);
7454 }
7455 if (fh != NULL)
7456 {
7457 eh->oh = fh;
7458 fh->oh = eh;
7459 }
7460 }
7461 if (fh != NULL)
7462 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7463 }
7464 }
7465
7466 static bfd_boolean
7467 get_sym_h (struct elf_link_hash_entry **hp,
7468 Elf_Internal_Sym **symp,
7469 asection **symsecp,
7470 unsigned char **tls_maskp,
7471 Elf_Internal_Sym **locsymsp,
7472 unsigned long r_symndx,
7473 bfd *ibfd)
7474 {
7475 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7476
7477 if (r_symndx >= symtab_hdr->sh_info)
7478 {
7479 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7480 struct elf_link_hash_entry *h;
7481
7482 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7483 h = elf_follow_link (h);
7484
7485 if (hp != NULL)
7486 *hp = h;
7487
7488 if (symp != NULL)
7489 *symp = NULL;
7490
7491 if (symsecp != NULL)
7492 {
7493 asection *symsec = NULL;
7494 if (h->root.type == bfd_link_hash_defined
7495 || h->root.type == bfd_link_hash_defweak)
7496 symsec = h->root.u.def.section;
7497 *symsecp = symsec;
7498 }
7499
7500 if (tls_maskp != NULL)
7501 {
7502 struct ppc_link_hash_entry *eh;
7503
7504 eh = (struct ppc_link_hash_entry *) h;
7505 *tls_maskp = &eh->tls_mask;
7506 }
7507 }
7508 else
7509 {
7510 Elf_Internal_Sym *sym;
7511 Elf_Internal_Sym *locsyms = *locsymsp;
7512
7513 if (locsyms == NULL)
7514 {
7515 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7516 if (locsyms == NULL)
7517 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7518 symtab_hdr->sh_info,
7519 0, NULL, NULL, NULL);
7520 if (locsyms == NULL)
7521 return FALSE;
7522 *locsymsp = locsyms;
7523 }
7524 sym = locsyms + r_symndx;
7525
7526 if (hp != NULL)
7527 *hp = NULL;
7528
7529 if (symp != NULL)
7530 *symp = sym;
7531
7532 if (symsecp != NULL)
7533 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7534
7535 if (tls_maskp != NULL)
7536 {
7537 struct got_entry **lgot_ents;
7538 unsigned char *tls_mask;
7539
7540 tls_mask = NULL;
7541 lgot_ents = elf_local_got_ents (ibfd);
7542 if (lgot_ents != NULL)
7543 {
7544 struct plt_entry **local_plt = (struct plt_entry **)
7545 (lgot_ents + symtab_hdr->sh_info);
7546 unsigned char *lgot_masks = (unsigned char *)
7547 (local_plt + symtab_hdr->sh_info);
7548 tls_mask = &lgot_masks[r_symndx];
7549 }
7550 *tls_maskp = tls_mask;
7551 }
7552 }
7553 return TRUE;
7554 }
7555
7556 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7557 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7558 type suitable for optimization, and 1 otherwise. */
7559
7560 static int
7561 get_tls_mask (unsigned char **tls_maskp,
7562 unsigned long *toc_symndx,
7563 bfd_vma *toc_addend,
7564 Elf_Internal_Sym **locsymsp,
7565 const Elf_Internal_Rela *rel,
7566 bfd *ibfd)
7567 {
7568 unsigned long r_symndx;
7569 int next_r;
7570 struct elf_link_hash_entry *h;
7571 Elf_Internal_Sym *sym;
7572 asection *sec;
7573 bfd_vma off;
7574
7575 r_symndx = ELF64_R_SYM (rel->r_info);
7576 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7577 return 0;
7578
7579 if ((*tls_maskp != NULL
7580 && (**tls_maskp & TLS_TLS) != 0
7581 && **tls_maskp != (TLS_TLS | TLS_MARK))
7582 || sec == NULL
7583 || ppc64_elf_section_data (sec) == NULL
7584 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7585 return 1;
7586
7587 /* Look inside a TOC section too. */
7588 if (h != NULL)
7589 {
7590 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7591 off = h->root.u.def.value;
7592 }
7593 else
7594 off = sym->st_value;
7595 off += rel->r_addend;
7596 BFD_ASSERT (off % 8 == 0);
7597 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7598 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7599 if (toc_symndx != NULL)
7600 *toc_symndx = r_symndx;
7601 if (toc_addend != NULL)
7602 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7603 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7604 return 0;
7605 if ((h == NULL || is_static_defined (h))
7606 && (next_r == -1 || next_r == -2))
7607 return 1 - next_r;
7608 return 1;
7609 }
7610
7611 /* Find (or create) an entry in the tocsave hash table. */
7612
7613 static struct tocsave_entry *
7614 tocsave_find (struct ppc_link_hash_table *htab,
7615 enum insert_option insert,
7616 Elf_Internal_Sym **local_syms,
7617 const Elf_Internal_Rela *irela,
7618 bfd *ibfd)
7619 {
7620 unsigned long r_indx;
7621 struct elf_link_hash_entry *h;
7622 Elf_Internal_Sym *sym;
7623 struct tocsave_entry ent, *p;
7624 hashval_t hash;
7625 struct tocsave_entry **slot;
7626
7627 r_indx = ELF64_R_SYM (irela->r_info);
7628 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7629 return NULL;
7630 if (ent.sec == NULL || ent.sec->output_section == NULL)
7631 {
7632 _bfd_error_handler
7633 (_("%pB: undefined symbol on R_PPC64_TOCSAVE relocation"), ibfd);
7634 return NULL;
7635 }
7636
7637 if (h != NULL)
7638 ent.offset = h->root.u.def.value;
7639 else
7640 ent.offset = sym->st_value;
7641 ent.offset += irela->r_addend;
7642
7643 hash = tocsave_htab_hash (&ent);
7644 slot = ((struct tocsave_entry **)
7645 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7646 if (slot == NULL)
7647 return NULL;
7648
7649 if (*slot == NULL)
7650 {
7651 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7652 if (p == NULL)
7653 return NULL;
7654 *p = ent;
7655 *slot = p;
7656 }
7657 return *slot;
7658 }
7659
7660 /* Adjust all global syms defined in opd sections. In gcc generated
7661 code for the old ABI, these will already have been done. */
7662
7663 static bfd_boolean
7664 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7665 {
7666 struct ppc_link_hash_entry *eh;
7667 asection *sym_sec;
7668 struct _opd_sec_data *opd;
7669
7670 if (h->root.type == bfd_link_hash_indirect)
7671 return TRUE;
7672
7673 if (h->root.type != bfd_link_hash_defined
7674 && h->root.type != bfd_link_hash_defweak)
7675 return TRUE;
7676
7677 eh = (struct ppc_link_hash_entry *) h;
7678 if (eh->adjust_done)
7679 return TRUE;
7680
7681 sym_sec = eh->elf.root.u.def.section;
7682 opd = get_opd_info (sym_sec);
7683 if (opd != NULL && opd->adjust != NULL)
7684 {
7685 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
7686 if (adjust == -1)
7687 {
7688 /* This entry has been deleted. */
7689 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7690 if (dsec == NULL)
7691 {
7692 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7693 if (discarded_section (dsec))
7694 {
7695 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7696 break;
7697 }
7698 }
7699 eh->elf.root.u.def.value = 0;
7700 eh->elf.root.u.def.section = dsec;
7701 }
7702 else
7703 eh->elf.root.u.def.value += adjust;
7704 eh->adjust_done = 1;
7705 }
7706 return TRUE;
7707 }
7708
7709 /* Handles decrementing dynamic reloc counts for the reloc specified by
7710 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7711 have already been determined. */
7712
7713 static bfd_boolean
7714 dec_dynrel_count (bfd_vma r_info,
7715 asection *sec,
7716 struct bfd_link_info *info,
7717 Elf_Internal_Sym **local_syms,
7718 struct elf_link_hash_entry *h,
7719 Elf_Internal_Sym *sym)
7720 {
7721 enum elf_ppc64_reloc_type r_type;
7722 asection *sym_sec = NULL;
7723
7724 /* Can this reloc be dynamic? This switch, and later tests here
7725 should be kept in sync with the code in check_relocs. */
7726 r_type = ELF64_R_TYPE (r_info);
7727 switch (r_type)
7728 {
7729 default:
7730 return TRUE;
7731
7732 case R_PPC64_TPREL16:
7733 case R_PPC64_TPREL16_LO:
7734 case R_PPC64_TPREL16_HI:
7735 case R_PPC64_TPREL16_HA:
7736 case R_PPC64_TPREL16_DS:
7737 case R_PPC64_TPREL16_LO_DS:
7738 case R_PPC64_TPREL16_HIGH:
7739 case R_PPC64_TPREL16_HIGHA:
7740 case R_PPC64_TPREL16_HIGHER:
7741 case R_PPC64_TPREL16_HIGHERA:
7742 case R_PPC64_TPREL16_HIGHEST:
7743 case R_PPC64_TPREL16_HIGHESTA:
7744 case R_PPC64_TPREL64:
7745 case R_PPC64_DTPMOD64:
7746 case R_PPC64_DTPREL64:
7747 case R_PPC64_ADDR64:
7748 case R_PPC64_REL30:
7749 case R_PPC64_REL32:
7750 case R_PPC64_REL64:
7751 case R_PPC64_ADDR14:
7752 case R_PPC64_ADDR14_BRNTAKEN:
7753 case R_PPC64_ADDR14_BRTAKEN:
7754 case R_PPC64_ADDR16:
7755 case R_PPC64_ADDR16_DS:
7756 case R_PPC64_ADDR16_HA:
7757 case R_PPC64_ADDR16_HI:
7758 case R_PPC64_ADDR16_HIGH:
7759 case R_PPC64_ADDR16_HIGHA:
7760 case R_PPC64_ADDR16_HIGHER:
7761 case R_PPC64_ADDR16_HIGHERA:
7762 case R_PPC64_ADDR16_HIGHEST:
7763 case R_PPC64_ADDR16_HIGHESTA:
7764 case R_PPC64_ADDR16_LO:
7765 case R_PPC64_ADDR16_LO_DS:
7766 case R_PPC64_ADDR24:
7767 case R_PPC64_ADDR32:
7768 case R_PPC64_UADDR16:
7769 case R_PPC64_UADDR32:
7770 case R_PPC64_UADDR64:
7771 case R_PPC64_TOC:
7772 break;
7773 }
7774
7775 if (local_syms != NULL)
7776 {
7777 unsigned long r_symndx;
7778 bfd *ibfd = sec->owner;
7779
7780 r_symndx = ELF64_R_SYM (r_info);
7781 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7782 return FALSE;
7783 }
7784
7785 if ((bfd_link_pic (info)
7786 && (must_be_dyn_reloc (info, r_type)
7787 || (h != NULL
7788 && (!SYMBOLIC_BIND (info, h)
7789 || h->root.type == bfd_link_hash_defweak
7790 || !h->def_regular))))
7791 || (ELIMINATE_COPY_RELOCS
7792 && !bfd_link_pic (info)
7793 && h != NULL
7794 && (h->root.type == bfd_link_hash_defweak
7795 || !h->def_regular)))
7796 ;
7797 else
7798 return TRUE;
7799
7800 if (h != NULL)
7801 {
7802 struct elf_dyn_relocs *p;
7803 struct elf_dyn_relocs **pp;
7804 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7805
7806 /* elf_gc_sweep may have already removed all dyn relocs associated
7807 with local syms for a given section. Also, symbol flags are
7808 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7809 report a dynreloc miscount. */
7810 if (*pp == NULL && info->gc_sections)
7811 return TRUE;
7812
7813 while ((p = *pp) != NULL)
7814 {
7815 if (p->sec == sec)
7816 {
7817 if (!must_be_dyn_reloc (info, r_type))
7818 p->pc_count -= 1;
7819 p->count -= 1;
7820 if (p->count == 0)
7821 *pp = p->next;
7822 return TRUE;
7823 }
7824 pp = &p->next;
7825 }
7826 }
7827 else
7828 {
7829 struct ppc_dyn_relocs *p;
7830 struct ppc_dyn_relocs **pp;
7831 void *vpp;
7832 bfd_boolean is_ifunc;
7833
7834 if (local_syms == NULL)
7835 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7836 if (sym_sec == NULL)
7837 sym_sec = sec;
7838
7839 vpp = &elf_section_data (sym_sec)->local_dynrel;
7840 pp = (struct ppc_dyn_relocs **) vpp;
7841
7842 if (*pp == NULL && info->gc_sections)
7843 return TRUE;
7844
7845 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7846 while ((p = *pp) != NULL)
7847 {
7848 if (p->sec == sec && p->ifunc == is_ifunc)
7849 {
7850 p->count -= 1;
7851 if (p->count == 0)
7852 *pp = p->next;
7853 return TRUE;
7854 }
7855 pp = &p->next;
7856 }
7857 }
7858
7859 /* xgettext:c-format */
7860 _bfd_error_handler (_("dynreloc miscount for %pB, section %pA"),
7861 sec->owner, sec);
7862 bfd_set_error (bfd_error_bad_value);
7863 return FALSE;
7864 }
7865
7866 /* Remove unused Official Procedure Descriptor entries. Currently we
7867 only remove those associated with functions in discarded link-once
7868 sections, or weakly defined functions that have been overridden. It
7869 would be possible to remove many more entries for statically linked
7870 applications. */
7871
7872 bfd_boolean
7873 ppc64_elf_edit_opd (struct bfd_link_info *info)
7874 {
7875 bfd *ibfd;
7876 bfd_boolean some_edited = FALSE;
7877 asection *need_pad = NULL;
7878 struct ppc_link_hash_table *htab;
7879
7880 htab = ppc_hash_table (info);
7881 if (htab == NULL)
7882 return FALSE;
7883
7884 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7885 {
7886 asection *sec;
7887 Elf_Internal_Rela *relstart, *rel, *relend;
7888 Elf_Internal_Shdr *symtab_hdr;
7889 Elf_Internal_Sym *local_syms;
7890 struct _opd_sec_data *opd;
7891 bfd_boolean need_edit, add_aux_fields, broken;
7892 bfd_size_type cnt_16b = 0;
7893
7894 if (!is_ppc64_elf (ibfd))
7895 continue;
7896
7897 sec = bfd_get_section_by_name (ibfd, ".opd");
7898 if (sec == NULL || sec->size == 0)
7899 continue;
7900
7901 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7902 continue;
7903
7904 if (sec->output_section == bfd_abs_section_ptr)
7905 continue;
7906
7907 /* Look through the section relocs. */
7908 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7909 continue;
7910
7911 local_syms = NULL;
7912 symtab_hdr = &elf_symtab_hdr (ibfd);
7913
7914 /* Read the relocations. */
7915 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7916 info->keep_memory);
7917 if (relstart == NULL)
7918 return FALSE;
7919
7920 /* First run through the relocs to check they are sane, and to
7921 determine whether we need to edit this opd section. */
7922 need_edit = FALSE;
7923 broken = FALSE;
7924 need_pad = sec;
7925 relend = relstart + sec->reloc_count;
7926 for (rel = relstart; rel < relend; )
7927 {
7928 enum elf_ppc64_reloc_type r_type;
7929 unsigned long r_symndx;
7930 asection *sym_sec;
7931 struct elf_link_hash_entry *h;
7932 Elf_Internal_Sym *sym;
7933 bfd_vma offset;
7934
7935 /* .opd contains an array of 16 or 24 byte entries. We're
7936 only interested in the reloc pointing to a function entry
7937 point. */
7938 offset = rel->r_offset;
7939 if (rel + 1 == relend
7940 || rel[1].r_offset != offset + 8)
7941 {
7942 /* If someone messes with .opd alignment then after a
7943 "ld -r" we might have padding in the middle of .opd.
7944 Also, there's nothing to prevent someone putting
7945 something silly in .opd with the assembler. No .opd
7946 optimization for them! */
7947 broken_opd:
7948 _bfd_error_handler
7949 (_("%pB: .opd is not a regular array of opd entries"), ibfd);
7950 broken = TRUE;
7951 break;
7952 }
7953
7954 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7955 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7956 {
7957 _bfd_error_handler
7958 /* xgettext:c-format */
7959 (_("%pB: unexpected reloc type %u in .opd section"),
7960 ibfd, r_type);
7961 broken = TRUE;
7962 break;
7963 }
7964
7965 r_symndx = ELF64_R_SYM (rel->r_info);
7966 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7967 r_symndx, ibfd))
7968 goto error_ret;
7969
7970 if (sym_sec == NULL || sym_sec->owner == NULL)
7971 {
7972 const char *sym_name;
7973 if (h != NULL)
7974 sym_name = h->root.root.string;
7975 else
7976 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7977 sym_sec);
7978
7979 _bfd_error_handler
7980 /* xgettext:c-format */
7981 (_("%pB: undefined sym `%s' in .opd section"),
7982 ibfd, sym_name);
7983 broken = TRUE;
7984 break;
7985 }
7986
7987 /* opd entries are always for functions defined in the
7988 current input bfd. If the symbol isn't defined in the
7989 input bfd, then we won't be using the function in this
7990 bfd; It must be defined in a linkonce section in another
7991 bfd, or is weak. It's also possible that we are
7992 discarding the function due to a linker script /DISCARD/,
7993 which we test for via the output_section. */
7994 if (sym_sec->owner != ibfd
7995 || sym_sec->output_section == bfd_abs_section_ptr)
7996 need_edit = TRUE;
7997
7998 rel += 2;
7999 if (rel + 1 == relend
8000 || (rel + 2 < relend
8001 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
8002 ++rel;
8003
8004 if (rel == relend)
8005 {
8006 if (sec->size == offset + 24)
8007 {
8008 need_pad = NULL;
8009 break;
8010 }
8011 if (sec->size == offset + 16)
8012 {
8013 cnt_16b++;
8014 break;
8015 }
8016 goto broken_opd;
8017 }
8018 else if (rel + 1 < relend
8019 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
8020 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
8021 {
8022 if (rel[0].r_offset == offset + 16)
8023 cnt_16b++;
8024 else if (rel[0].r_offset != offset + 24)
8025 goto broken_opd;
8026 }
8027 else
8028 goto broken_opd;
8029 }
8030
8031 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
8032
8033 if (!broken && (need_edit || add_aux_fields))
8034 {
8035 Elf_Internal_Rela *write_rel;
8036 Elf_Internal_Shdr *rel_hdr;
8037 bfd_byte *rptr, *wptr;
8038 bfd_byte *new_contents;
8039 bfd_size_type amt;
8040
8041 new_contents = NULL;
8042 amt = OPD_NDX (sec->size) * sizeof (long);
8043 opd = &ppc64_elf_section_data (sec)->u.opd;
8044 opd->adjust = bfd_zalloc (sec->owner, amt);
8045 if (opd->adjust == NULL)
8046 return FALSE;
8047
8048 /* This seems a waste of time as input .opd sections are all
8049 zeros as generated by gcc, but I suppose there's no reason
8050 this will always be so. We might start putting something in
8051 the third word of .opd entries. */
8052 if ((sec->flags & SEC_IN_MEMORY) == 0)
8053 {
8054 bfd_byte *loc;
8055 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
8056 {
8057 if (loc != NULL)
8058 free (loc);
8059 error_ret:
8060 if (local_syms != NULL
8061 && symtab_hdr->contents != (unsigned char *) local_syms)
8062 free (local_syms);
8063 if (elf_section_data (sec)->relocs != relstart)
8064 free (relstart);
8065 return FALSE;
8066 }
8067 sec->contents = loc;
8068 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8069 }
8070
8071 elf_section_data (sec)->relocs = relstart;
8072
8073 new_contents = sec->contents;
8074 if (add_aux_fields)
8075 {
8076 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
8077 if (new_contents == NULL)
8078 return FALSE;
8079 need_pad = NULL;
8080 }
8081 wptr = new_contents;
8082 rptr = sec->contents;
8083 write_rel = relstart;
8084 for (rel = relstart; rel < relend; )
8085 {
8086 unsigned long r_symndx;
8087 asection *sym_sec;
8088 struct elf_link_hash_entry *h;
8089 struct ppc_link_hash_entry *fdh = NULL;
8090 Elf_Internal_Sym *sym;
8091 long opd_ent_size;
8092 Elf_Internal_Rela *next_rel;
8093 bfd_boolean skip;
8094
8095 r_symndx = ELF64_R_SYM (rel->r_info);
8096 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8097 r_symndx, ibfd))
8098 goto error_ret;
8099
8100 next_rel = rel + 2;
8101 if (next_rel + 1 == relend
8102 || (next_rel + 2 < relend
8103 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
8104 ++next_rel;
8105
8106 /* See if the .opd entry is full 24 byte or
8107 16 byte (with fd_aux entry overlapped with next
8108 fd_func). */
8109 opd_ent_size = 24;
8110 if (next_rel == relend)
8111 {
8112 if (sec->size == rel->r_offset + 16)
8113 opd_ent_size = 16;
8114 }
8115 else if (next_rel->r_offset == rel->r_offset + 16)
8116 opd_ent_size = 16;
8117
8118 if (h != NULL
8119 && h->root.root.string[0] == '.')
8120 {
8121 fdh = ((struct ppc_link_hash_entry *) h)->oh;
8122 if (fdh != NULL)
8123 {
8124 fdh = ppc_follow_link (fdh);
8125 if (fdh->elf.root.type != bfd_link_hash_defined
8126 && fdh->elf.root.type != bfd_link_hash_defweak)
8127 fdh = NULL;
8128 }
8129 }
8130
8131 skip = (sym_sec->owner != ibfd
8132 || sym_sec->output_section == bfd_abs_section_ptr);
8133 if (skip)
8134 {
8135 if (fdh != NULL && sym_sec->owner == ibfd)
8136 {
8137 /* Arrange for the function descriptor sym
8138 to be dropped. */
8139 fdh->elf.root.u.def.value = 0;
8140 fdh->elf.root.u.def.section = sym_sec;
8141 }
8142 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
8143
8144 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
8145 rel = next_rel;
8146 else
8147 while (1)
8148 {
8149 if (!dec_dynrel_count (rel->r_info, sec, info,
8150 NULL, h, sym))
8151 goto error_ret;
8152
8153 if (++rel == next_rel)
8154 break;
8155
8156 r_symndx = ELF64_R_SYM (rel->r_info);
8157 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8158 r_symndx, ibfd))
8159 goto error_ret;
8160 }
8161 }
8162 else
8163 {
8164 /* We'll be keeping this opd entry. */
8165 long adjust;
8166
8167 if (fdh != NULL)
8168 {
8169 /* Redefine the function descriptor symbol to
8170 this location in the opd section. It is
8171 necessary to update the value here rather
8172 than using an array of adjustments as we do
8173 for local symbols, because various places
8174 in the generic ELF code use the value
8175 stored in u.def.value. */
8176 fdh->elf.root.u.def.value = wptr - new_contents;
8177 fdh->adjust_done = 1;
8178 }
8179
8180 /* Local syms are a bit tricky. We could
8181 tweak them as they can be cached, but
8182 we'd need to look through the local syms
8183 for the function descriptor sym which we
8184 don't have at the moment. So keep an
8185 array of adjustments. */
8186 adjust = (wptr - new_contents) - (rptr - sec->contents);
8187 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8188
8189 if (wptr != rptr)
8190 memcpy (wptr, rptr, opd_ent_size);
8191 wptr += opd_ent_size;
8192 if (add_aux_fields && opd_ent_size == 16)
8193 {
8194 memset (wptr, '\0', 8);
8195 wptr += 8;
8196 }
8197
8198 /* We need to adjust any reloc offsets to point to the
8199 new opd entries. */
8200 for ( ; rel != next_rel; ++rel)
8201 {
8202 rel->r_offset += adjust;
8203 if (write_rel != rel)
8204 memcpy (write_rel, rel, sizeof (*rel));
8205 ++write_rel;
8206 }
8207 }
8208
8209 rptr += opd_ent_size;
8210 }
8211
8212 sec->size = wptr - new_contents;
8213 sec->reloc_count = write_rel - relstart;
8214 if (add_aux_fields)
8215 {
8216 free (sec->contents);
8217 sec->contents = new_contents;
8218 }
8219
8220 /* Fudge the header size too, as this is used later in
8221 elf_bfd_final_link if we are emitting relocs. */
8222 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8223 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
8224 some_edited = TRUE;
8225 }
8226 else if (elf_section_data (sec)->relocs != relstart)
8227 free (relstart);
8228
8229 if (local_syms != NULL
8230 && symtab_hdr->contents != (unsigned char *) local_syms)
8231 {
8232 if (!info->keep_memory)
8233 free (local_syms);
8234 else
8235 symtab_hdr->contents = (unsigned char *) local_syms;
8236 }
8237 }
8238
8239 if (some_edited)
8240 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8241
8242 /* If we are doing a final link and the last .opd entry is just 16 byte
8243 long, add a 8 byte padding after it. */
8244 if (need_pad != NULL && !bfd_link_relocatable (info))
8245 {
8246 bfd_byte *p;
8247
8248 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8249 {
8250 BFD_ASSERT (need_pad->size > 0);
8251
8252 p = bfd_malloc (need_pad->size + 8);
8253 if (p == NULL)
8254 return FALSE;
8255
8256 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8257 p, 0, need_pad->size))
8258 return FALSE;
8259
8260 need_pad->contents = p;
8261 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8262 }
8263 else
8264 {
8265 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8266 if (p == NULL)
8267 return FALSE;
8268
8269 need_pad->contents = p;
8270 }
8271
8272 memset (need_pad->contents + need_pad->size, 0, 8);
8273 need_pad->size += 8;
8274 }
8275
8276 return TRUE;
8277 }
8278
8279 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8280
8281 asection *
8282 ppc64_elf_tls_setup (struct bfd_link_info *info)
8283 {
8284 struct ppc_link_hash_table *htab;
8285
8286 htab = ppc_hash_table (info);
8287 if (htab == NULL)
8288 return NULL;
8289
8290 if (abiversion (info->output_bfd) == 1)
8291 htab->opd_abi = 1;
8292
8293 if (htab->params->no_multi_toc)
8294 htab->do_multi_toc = 0;
8295 else if (!htab->do_multi_toc)
8296 htab->params->no_multi_toc = 1;
8297
8298 /* Default to --no-plt-localentry, as this option can cause problems
8299 with symbol interposition. For example, glibc libpthread.so and
8300 libc.so duplicate many pthread symbols, with a fallback
8301 implementation in libc.so. In some cases the fallback does more
8302 work than the pthread implementation. __pthread_condattr_destroy
8303 is one such symbol: the libpthread.so implementation is
8304 localentry:0 while the libc.so implementation is localentry:8.
8305 An app that "cleverly" uses dlopen to only load necessary
8306 libraries at runtime may omit loading libpthread.so when not
8307 running multi-threaded, which then results in the libc.so
8308 fallback symbols being used and ld.so complaining. Now there
8309 are workarounds in ld (see non_zero_localentry) to detect the
8310 pthread situation, but that may not be the only case where
8311 --plt-localentry can cause trouble. */
8312 if (htab->params->plt_localentry0 < 0)
8313 htab->params->plt_localentry0 = 0;
8314 if (htab->params->plt_localentry0
8315 && elf_link_hash_lookup (&htab->elf, "GLIBC_2.26",
8316 FALSE, FALSE, FALSE) == NULL)
8317 _bfd_error_handler
8318 (_("warning: --plt-localentry is especially dangerous without "
8319 "ld.so support to detect ABI violations"));
8320
8321 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8322 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8323 FALSE, FALSE, TRUE));
8324 /* Move dynamic linking info to the function descriptor sym. */
8325 if (htab->tls_get_addr != NULL)
8326 func_desc_adjust (&htab->tls_get_addr->elf, info);
8327 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8328 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8329 FALSE, FALSE, TRUE));
8330 if (htab->params->tls_get_addr_opt)
8331 {
8332 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8333
8334 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8335 FALSE, FALSE, TRUE);
8336 if (opt != NULL)
8337 func_desc_adjust (opt, info);
8338 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8339 FALSE, FALSE, TRUE);
8340 if (opt_fd != NULL
8341 && (opt_fd->root.type == bfd_link_hash_defined
8342 || opt_fd->root.type == bfd_link_hash_defweak))
8343 {
8344 /* If glibc supports an optimized __tls_get_addr call stub,
8345 signalled by the presence of __tls_get_addr_opt, and we'll
8346 be calling __tls_get_addr via a plt call stub, then
8347 make __tls_get_addr point to __tls_get_addr_opt. */
8348 tga_fd = &htab->tls_get_addr_fd->elf;
8349 if (htab->elf.dynamic_sections_created
8350 && tga_fd != NULL
8351 && (tga_fd->type == STT_FUNC
8352 || tga_fd->needs_plt)
8353 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8354 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, tga_fd)))
8355 {
8356 struct plt_entry *ent;
8357
8358 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8359 if (ent->plt.refcount > 0)
8360 break;
8361 if (ent != NULL)
8362 {
8363 tga_fd->root.type = bfd_link_hash_indirect;
8364 tga_fd->root.u.i.link = &opt_fd->root;
8365 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8366 opt_fd->mark = 1;
8367 if (opt_fd->dynindx != -1)
8368 {
8369 /* Use __tls_get_addr_opt in dynamic relocations. */
8370 opt_fd->dynindx = -1;
8371 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8372 opt_fd->dynstr_index);
8373 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8374 return NULL;
8375 }
8376 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8377 tga = &htab->tls_get_addr->elf;
8378 if (opt != NULL && tga != NULL)
8379 {
8380 tga->root.type = bfd_link_hash_indirect;
8381 tga->root.u.i.link = &opt->root;
8382 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8383 opt->mark = 1;
8384 _bfd_elf_link_hash_hide_symbol (info, opt,
8385 tga->forced_local);
8386 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8387 }
8388 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8389 htab->tls_get_addr_fd->is_func_descriptor = 1;
8390 if (htab->tls_get_addr != NULL)
8391 {
8392 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8393 htab->tls_get_addr->is_func = 1;
8394 }
8395 }
8396 }
8397 }
8398 else if (htab->params->tls_get_addr_opt < 0)
8399 htab->params->tls_get_addr_opt = 0;
8400 }
8401 return _bfd_elf_tls_setup (info->output_bfd, info);
8402 }
8403
8404 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8405 HASH1 or HASH2. */
8406
8407 static bfd_boolean
8408 branch_reloc_hash_match (const bfd *ibfd,
8409 const Elf_Internal_Rela *rel,
8410 const struct ppc_link_hash_entry *hash1,
8411 const struct ppc_link_hash_entry *hash2)
8412 {
8413 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8414 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8415 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8416
8417 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8418 {
8419 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8420 struct elf_link_hash_entry *h;
8421
8422 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8423 h = elf_follow_link (h);
8424 if (h == &hash1->elf || h == &hash2->elf)
8425 return TRUE;
8426 }
8427 return FALSE;
8428 }
8429
8430 /* Run through all the TLS relocs looking for optimization
8431 opportunities. The linker has been hacked (see ppc64elf.em) to do
8432 a preliminary section layout so that we know the TLS segment
8433 offsets. We can't optimize earlier because some optimizations need
8434 to know the tp offset, and we need to optimize before allocating
8435 dynamic relocations. */
8436
8437 bfd_boolean
8438 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8439 {
8440 bfd *ibfd;
8441 asection *sec;
8442 struct ppc_link_hash_table *htab;
8443 unsigned char *toc_ref;
8444 int pass;
8445
8446 if (!bfd_link_executable (info))
8447 return TRUE;
8448
8449 htab = ppc_hash_table (info);
8450 if (htab == NULL)
8451 return FALSE;
8452
8453 /* Make two passes over the relocs. On the first pass, mark toc
8454 entries involved with tls relocs, and check that tls relocs
8455 involved in setting up a tls_get_addr call are indeed followed by
8456 such a call. If they are not, we can't do any tls optimization.
8457 On the second pass twiddle tls_mask flags to notify
8458 relocate_section that optimization can be done, and adjust got
8459 and plt refcounts. */
8460 toc_ref = NULL;
8461 for (pass = 0; pass < 2; ++pass)
8462 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8463 {
8464 Elf_Internal_Sym *locsyms = NULL;
8465 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8466
8467 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8468 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8469 {
8470 Elf_Internal_Rela *relstart, *rel, *relend;
8471 bfd_boolean found_tls_get_addr_arg = 0;
8472
8473 /* Read the relocations. */
8474 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8475 info->keep_memory);
8476 if (relstart == NULL)
8477 {
8478 free (toc_ref);
8479 return FALSE;
8480 }
8481
8482 relend = relstart + sec->reloc_count;
8483 for (rel = relstart; rel < relend; rel++)
8484 {
8485 enum elf_ppc64_reloc_type r_type;
8486 unsigned long r_symndx;
8487 struct elf_link_hash_entry *h;
8488 Elf_Internal_Sym *sym;
8489 asection *sym_sec;
8490 unsigned char *tls_mask;
8491 unsigned char tls_set, tls_clear, tls_type = 0;
8492 bfd_vma value;
8493 bfd_boolean ok_tprel, is_local;
8494 long toc_ref_index = 0;
8495 int expecting_tls_get_addr = 0;
8496 bfd_boolean ret = FALSE;
8497
8498 r_symndx = ELF64_R_SYM (rel->r_info);
8499 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8500 r_symndx, ibfd))
8501 {
8502 err_free_rel:
8503 if (elf_section_data (sec)->relocs != relstart)
8504 free (relstart);
8505 if (toc_ref != NULL)
8506 free (toc_ref);
8507 if (locsyms != NULL
8508 && (elf_symtab_hdr (ibfd).contents
8509 != (unsigned char *) locsyms))
8510 free (locsyms);
8511 return ret;
8512 }
8513
8514 if (h != NULL)
8515 {
8516 if (h->root.type == bfd_link_hash_defined
8517 || h->root.type == bfd_link_hash_defweak)
8518 value = h->root.u.def.value;
8519 else if (h->root.type == bfd_link_hash_undefweak)
8520 value = 0;
8521 else
8522 {
8523 found_tls_get_addr_arg = 0;
8524 continue;
8525 }
8526 }
8527 else
8528 /* Symbols referenced by TLS relocs must be of type
8529 STT_TLS. So no need for .opd local sym adjust. */
8530 value = sym->st_value;
8531
8532 ok_tprel = FALSE;
8533 is_local = FALSE;
8534 if (h == NULL
8535 || !h->def_dynamic)
8536 {
8537 is_local = TRUE;
8538 if (h != NULL
8539 && h->root.type == bfd_link_hash_undefweak)
8540 ok_tprel = TRUE;
8541 else if (sym_sec != NULL
8542 && sym_sec->output_section != NULL)
8543 {
8544 value += sym_sec->output_offset;
8545 value += sym_sec->output_section->vma;
8546 value -= htab->elf.tls_sec->vma;
8547 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8548 < (bfd_vma) 1 << 32);
8549 }
8550 }
8551
8552 r_type = ELF64_R_TYPE (rel->r_info);
8553 /* If this section has old-style __tls_get_addr calls
8554 without marker relocs, then check that each
8555 __tls_get_addr call reloc is preceded by a reloc
8556 that conceivably belongs to the __tls_get_addr arg
8557 setup insn. If we don't find matching arg setup
8558 relocs, don't do any tls optimization. */
8559 if (pass == 0
8560 && sec->has_tls_get_addr_call
8561 && h != NULL
8562 && (h == &htab->tls_get_addr->elf
8563 || h == &htab->tls_get_addr_fd->elf)
8564 && !found_tls_get_addr_arg
8565 && is_branch_reloc (r_type))
8566 {
8567 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8568 "TLS optimization disabled\n"),
8569 ibfd, sec, rel->r_offset);
8570 ret = TRUE;
8571 goto err_free_rel;
8572 }
8573
8574 found_tls_get_addr_arg = 0;
8575 switch (r_type)
8576 {
8577 case R_PPC64_GOT_TLSLD16:
8578 case R_PPC64_GOT_TLSLD16_LO:
8579 expecting_tls_get_addr = 1;
8580 found_tls_get_addr_arg = 1;
8581 /* Fall through. */
8582
8583 case R_PPC64_GOT_TLSLD16_HI:
8584 case R_PPC64_GOT_TLSLD16_HA:
8585 /* These relocs should never be against a symbol
8586 defined in a shared lib. Leave them alone if
8587 that turns out to be the case. */
8588 if (!is_local)
8589 continue;
8590
8591 /* LD -> LE */
8592 tls_set = 0;
8593 tls_clear = TLS_LD;
8594 tls_type = TLS_TLS | TLS_LD;
8595 break;
8596
8597 case R_PPC64_GOT_TLSGD16:
8598 case R_PPC64_GOT_TLSGD16_LO:
8599 expecting_tls_get_addr = 1;
8600 found_tls_get_addr_arg = 1;
8601 /* Fall through. */
8602
8603 case R_PPC64_GOT_TLSGD16_HI:
8604 case R_PPC64_GOT_TLSGD16_HA:
8605 if (ok_tprel)
8606 /* GD -> LE */
8607 tls_set = 0;
8608 else
8609 /* GD -> IE */
8610 tls_set = TLS_TLS | TLS_TPRELGD;
8611 tls_clear = TLS_GD;
8612 tls_type = TLS_TLS | TLS_GD;
8613 break;
8614
8615 case R_PPC64_GOT_TPREL16_DS:
8616 case R_PPC64_GOT_TPREL16_LO_DS:
8617 case R_PPC64_GOT_TPREL16_HI:
8618 case R_PPC64_GOT_TPREL16_HA:
8619 if (ok_tprel)
8620 {
8621 /* IE -> LE */
8622 tls_set = 0;
8623 tls_clear = TLS_TPREL;
8624 tls_type = TLS_TLS | TLS_TPREL;
8625 break;
8626 }
8627 continue;
8628
8629 case R_PPC64_TLSGD:
8630 case R_PPC64_TLSLD:
8631 if (rel + 1 < relend
8632 && is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
8633 {
8634 if (pass != 0
8635 && ELF64_R_TYPE (rel[1].r_info) != R_PPC64_PLTSEQ)
8636 {
8637 r_symndx = ELF64_R_SYM (rel[1].r_info);
8638 if (!get_sym_h (&h, NULL, NULL, NULL, &locsyms,
8639 r_symndx, ibfd))
8640 goto err_free_rel;
8641 if (h != NULL)
8642 {
8643 struct plt_entry *ent = NULL;
8644
8645 for (ent = h->plt.plist;
8646 ent != NULL;
8647 ent = ent->next)
8648 if (ent->addend == rel[1].r_addend)
8649 break;
8650
8651 if (ent != NULL
8652 && ent->plt.refcount > 0)
8653 ent->plt.refcount -= 1;
8654 }
8655 }
8656 continue;
8657 }
8658 found_tls_get_addr_arg = 1;
8659 /* Fall through. */
8660
8661 case R_PPC64_TLS:
8662 case R_PPC64_TOC16:
8663 case R_PPC64_TOC16_LO:
8664 if (sym_sec == NULL || sym_sec != toc)
8665 continue;
8666
8667 /* Mark this toc entry as referenced by a TLS
8668 code sequence. We can do that now in the
8669 case of R_PPC64_TLS, and after checking for
8670 tls_get_addr for the TOC16 relocs. */
8671 if (toc_ref == NULL)
8672 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8673 if (toc_ref == NULL)
8674 goto err_free_rel;
8675
8676 if (h != NULL)
8677 value = h->root.u.def.value;
8678 else
8679 value = sym->st_value;
8680 value += rel->r_addend;
8681 if (value % 8 != 0)
8682 continue;
8683 BFD_ASSERT (value < toc->size
8684 && toc->output_offset % 8 == 0);
8685 toc_ref_index = (value + toc->output_offset) / 8;
8686 if (r_type == R_PPC64_TLS
8687 || r_type == R_PPC64_TLSGD
8688 || r_type == R_PPC64_TLSLD)
8689 {
8690 toc_ref[toc_ref_index] = 1;
8691 continue;
8692 }
8693
8694 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8695 continue;
8696
8697 tls_set = 0;
8698 tls_clear = 0;
8699 expecting_tls_get_addr = 2;
8700 break;
8701
8702 case R_PPC64_TPREL64:
8703 if (pass == 0
8704 || sec != toc
8705 || toc_ref == NULL
8706 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8707 continue;
8708 if (ok_tprel)
8709 {
8710 /* IE -> LE */
8711 tls_set = TLS_EXPLICIT;
8712 tls_clear = TLS_TPREL;
8713 break;
8714 }
8715 continue;
8716
8717 case R_PPC64_DTPMOD64:
8718 if (pass == 0
8719 || sec != toc
8720 || toc_ref == NULL
8721 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8722 continue;
8723 if (rel + 1 < relend
8724 && (rel[1].r_info
8725 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8726 && rel[1].r_offset == rel->r_offset + 8)
8727 {
8728 if (ok_tprel)
8729 /* GD -> LE */
8730 tls_set = TLS_EXPLICIT | TLS_GD;
8731 else
8732 /* GD -> IE */
8733 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8734 tls_clear = TLS_GD;
8735 }
8736 else
8737 {
8738 if (!is_local)
8739 continue;
8740
8741 /* LD -> LE */
8742 tls_set = TLS_EXPLICIT;
8743 tls_clear = TLS_LD;
8744 }
8745 break;
8746
8747 default:
8748 continue;
8749 }
8750
8751 if (pass == 0)
8752 {
8753 if (!expecting_tls_get_addr
8754 || !sec->has_tls_get_addr_call)
8755 continue;
8756
8757 if (rel + 1 < relend
8758 && branch_reloc_hash_match (ibfd, rel + 1,
8759 htab->tls_get_addr,
8760 htab->tls_get_addr_fd))
8761 {
8762 if (expecting_tls_get_addr == 2)
8763 {
8764 /* Check for toc tls entries. */
8765 unsigned char *toc_tls;
8766 int retval;
8767
8768 retval = get_tls_mask (&toc_tls, NULL, NULL,
8769 &locsyms,
8770 rel, ibfd);
8771 if (retval == 0)
8772 goto err_free_rel;
8773 if (toc_tls != NULL)
8774 {
8775 if ((*toc_tls & TLS_TLS) != 0
8776 && ((*toc_tls & (TLS_GD | TLS_LD)) != 0))
8777 found_tls_get_addr_arg = 1;
8778 if (retval > 1)
8779 toc_ref[toc_ref_index] = 1;
8780 }
8781 }
8782 continue;
8783 }
8784
8785 /* Uh oh, we didn't find the expected call. We
8786 could just mark this symbol to exclude it
8787 from tls optimization but it's safer to skip
8788 the entire optimization. */
8789 /* xgettext:c-format */
8790 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8791 "TLS optimization disabled\n"),
8792 ibfd, sec, rel->r_offset);
8793 ret = TRUE;
8794 goto err_free_rel;
8795 }
8796
8797 /* If we don't have old-style __tls_get_addr calls
8798 without TLSGD/TLSLD marker relocs, and we haven't
8799 found a new-style __tls_get_addr call with a
8800 marker for this symbol, then we either have a
8801 broken object file or an -mlongcall style
8802 indirect call to __tls_get_addr without a marker.
8803 Disable optimization in this case. */
8804 if ((tls_clear & (TLS_GD | TLS_LD)) != 0
8805 && (tls_set & TLS_EXPLICIT) == 0
8806 && !sec->has_tls_get_addr_call
8807 && ((*tls_mask & (TLS_TLS | TLS_MARK))
8808 != (TLS_TLS | TLS_MARK)))
8809 continue;
8810
8811 if (expecting_tls_get_addr)
8812 {
8813 struct plt_entry *ent = NULL;
8814
8815 if (htab->tls_get_addr != NULL)
8816 for (ent = htab->tls_get_addr->elf.plt.plist;
8817 ent != NULL;
8818 ent = ent->next)
8819 if (ent->addend == 0)
8820 break;
8821
8822 if (ent == NULL && htab->tls_get_addr_fd != NULL)
8823 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8824 ent != NULL;
8825 ent = ent->next)
8826 if (ent->addend == 0)
8827 break;
8828
8829 if (ent != NULL
8830 && ent->plt.refcount > 0)
8831 ent->plt.refcount -= 1;
8832 }
8833
8834 if (tls_clear == 0)
8835 continue;
8836
8837 if ((tls_set & TLS_EXPLICIT) == 0)
8838 {
8839 struct got_entry *ent;
8840
8841 /* Adjust got entry for this reloc. */
8842 if (h != NULL)
8843 ent = h->got.glist;
8844 else
8845 ent = elf_local_got_ents (ibfd)[r_symndx];
8846
8847 for (; ent != NULL; ent = ent->next)
8848 if (ent->addend == rel->r_addend
8849 && ent->owner == ibfd
8850 && ent->tls_type == tls_type)
8851 break;
8852 if (ent == NULL)
8853 abort ();
8854
8855 if (tls_set == 0)
8856 {
8857 /* We managed to get rid of a got entry. */
8858 if (ent->got.refcount > 0)
8859 ent->got.refcount -= 1;
8860 }
8861 }
8862 else
8863 {
8864 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8865 we'll lose one or two dyn relocs. */
8866 if (!dec_dynrel_count (rel->r_info, sec, info,
8867 NULL, h, sym))
8868 return FALSE;
8869
8870 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8871 {
8872 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8873 NULL, h, sym))
8874 return FALSE;
8875 }
8876 }
8877
8878 *tls_mask |= tls_set;
8879 *tls_mask &= ~tls_clear;
8880 }
8881
8882 if (elf_section_data (sec)->relocs != relstart)
8883 free (relstart);
8884 }
8885
8886 if (locsyms != NULL
8887 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8888 {
8889 if (!info->keep_memory)
8890 free (locsyms);
8891 else
8892 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8893 }
8894 }
8895
8896 if (toc_ref != NULL)
8897 free (toc_ref);
8898 htab->do_tls_opt = 1;
8899 return TRUE;
8900 }
8901
8902 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8903 the values of any global symbols in a toc section that has been
8904 edited. Globals in toc sections should be a rarity, so this function
8905 sets a flag if any are found in toc sections other than the one just
8906 edited, so that further hash table traversals can be avoided. */
8907
8908 struct adjust_toc_info
8909 {
8910 asection *toc;
8911 unsigned long *skip;
8912 bfd_boolean global_toc_syms;
8913 };
8914
8915 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8916
8917 static bfd_boolean
8918 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8919 {
8920 struct ppc_link_hash_entry *eh;
8921 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8922 unsigned long i;
8923
8924 if (h->root.type != bfd_link_hash_defined
8925 && h->root.type != bfd_link_hash_defweak)
8926 return TRUE;
8927
8928 eh = (struct ppc_link_hash_entry *) h;
8929 if (eh->adjust_done)
8930 return TRUE;
8931
8932 if (eh->elf.root.u.def.section == toc_inf->toc)
8933 {
8934 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8935 i = toc_inf->toc->rawsize >> 3;
8936 else
8937 i = eh->elf.root.u.def.value >> 3;
8938
8939 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8940 {
8941 _bfd_error_handler
8942 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8943 do
8944 ++i;
8945 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8946 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8947 }
8948
8949 eh->elf.root.u.def.value -= toc_inf->skip[i];
8950 eh->adjust_done = 1;
8951 }
8952 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8953 toc_inf->global_toc_syms = TRUE;
8954
8955 return TRUE;
8956 }
8957
8958 /* Return TRUE iff INSN with a relocation of R_TYPE is one we expect
8959 on a _LO variety toc/got reloc. */
8960
8961 static bfd_boolean
8962 ok_lo_toc_insn (unsigned int insn, enum elf_ppc64_reloc_type r_type)
8963 {
8964 return ((insn & (0x3f << 26)) == 12u << 26 /* addic */
8965 || (insn & (0x3f << 26)) == 14u << 26 /* addi */
8966 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8967 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8968 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8969 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8970 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8971 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8972 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8973 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8974 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8975 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8976 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8977 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8978 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8979 || (insn & (0x3f << 26)) == 56u << 26 /* lq,lfq */
8980 || ((insn & (0x3f << 26)) == 57u << 26 /* lxsd,lxssp,lfdp */
8981 /* Exclude lfqu by testing reloc. If relocs are ever
8982 defined for the reduced D field in psq_lu then those
8983 will need testing too. */
8984 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8985 || ((insn & (0x3f << 26)) == 58u << 26 /* ld,lwa */
8986 && (insn & 1) == 0)
8987 || (insn & (0x3f << 26)) == 60u << 26 /* stfq */
8988 || ((insn & (0x3f << 26)) == 61u << 26 /* lxv,stx{v,sd,ssp},stfdp */
8989 /* Exclude stfqu. psq_stu as above for psq_lu. */
8990 && r_type != R_PPC64_TOC16_LO && r_type != R_PPC64_GOT16_LO)
8991 || ((insn & (0x3f << 26)) == 62u << 26 /* std,stq */
8992 && (insn & 1) == 0));
8993 }
8994
8995 /* Examine all relocs referencing .toc sections in order to remove
8996 unused .toc entries. */
8997
8998 bfd_boolean
8999 ppc64_elf_edit_toc (struct bfd_link_info *info)
9000 {
9001 bfd *ibfd;
9002 struct adjust_toc_info toc_inf;
9003 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9004
9005 htab->do_toc_opt = 1;
9006 toc_inf.global_toc_syms = TRUE;
9007 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9008 {
9009 asection *toc, *sec;
9010 Elf_Internal_Shdr *symtab_hdr;
9011 Elf_Internal_Sym *local_syms;
9012 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
9013 unsigned long *skip, *drop;
9014 unsigned char *used;
9015 unsigned char *keep, last, some_unused;
9016
9017 if (!is_ppc64_elf (ibfd))
9018 continue;
9019
9020 toc = bfd_get_section_by_name (ibfd, ".toc");
9021 if (toc == NULL
9022 || toc->size == 0
9023 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
9024 || discarded_section (toc))
9025 continue;
9026
9027 toc_relocs = NULL;
9028 local_syms = NULL;
9029 symtab_hdr = &elf_symtab_hdr (ibfd);
9030
9031 /* Look at sections dropped from the final link. */
9032 skip = NULL;
9033 relstart = NULL;
9034 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9035 {
9036 if (sec->reloc_count == 0
9037 || !discarded_section (sec)
9038 || get_opd_info (sec)
9039 || (sec->flags & SEC_ALLOC) == 0
9040 || (sec->flags & SEC_DEBUGGING) != 0)
9041 continue;
9042
9043 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
9044 if (relstart == NULL)
9045 goto error_ret;
9046
9047 /* Run through the relocs to see which toc entries might be
9048 unused. */
9049 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9050 {
9051 enum elf_ppc64_reloc_type r_type;
9052 unsigned long r_symndx;
9053 asection *sym_sec;
9054 struct elf_link_hash_entry *h;
9055 Elf_Internal_Sym *sym;
9056 bfd_vma val;
9057
9058 r_type = ELF64_R_TYPE (rel->r_info);
9059 switch (r_type)
9060 {
9061 default:
9062 continue;
9063
9064 case R_PPC64_TOC16:
9065 case R_PPC64_TOC16_LO:
9066 case R_PPC64_TOC16_HI:
9067 case R_PPC64_TOC16_HA:
9068 case R_PPC64_TOC16_DS:
9069 case R_PPC64_TOC16_LO_DS:
9070 break;
9071 }
9072
9073 r_symndx = ELF64_R_SYM (rel->r_info);
9074 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9075 r_symndx, ibfd))
9076 goto error_ret;
9077
9078 if (sym_sec != toc)
9079 continue;
9080
9081 if (h != NULL)
9082 val = h->root.u.def.value;
9083 else
9084 val = sym->st_value;
9085 val += rel->r_addend;
9086
9087 if (val >= toc->size)
9088 continue;
9089
9090 /* Anything in the toc ought to be aligned to 8 bytes.
9091 If not, don't mark as unused. */
9092 if (val & 7)
9093 continue;
9094
9095 if (skip == NULL)
9096 {
9097 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9098 if (skip == NULL)
9099 goto error_ret;
9100 }
9101
9102 skip[val >> 3] = ref_from_discarded;
9103 }
9104
9105 if (elf_section_data (sec)->relocs != relstart)
9106 free (relstart);
9107 }
9108
9109 /* For largetoc loads of address constants, we can convert
9110 . addis rx,2,addr@got@ha
9111 . ld ry,addr@got@l(rx)
9112 to
9113 . addis rx,2,addr@toc@ha
9114 . addi ry,rx,addr@toc@l
9115 when addr is within 2G of the toc pointer. This then means
9116 that the word storing "addr" in the toc is no longer needed. */
9117
9118 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
9119 && toc->output_section->rawsize < (bfd_vma) 1 << 31
9120 && toc->reloc_count != 0)
9121 {
9122 /* Read toc relocs. */
9123 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9124 info->keep_memory);
9125 if (toc_relocs == NULL)
9126 goto error_ret;
9127
9128 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9129 {
9130 enum elf_ppc64_reloc_type r_type;
9131 unsigned long r_symndx;
9132 asection *sym_sec;
9133 struct elf_link_hash_entry *h;
9134 Elf_Internal_Sym *sym;
9135 bfd_vma val, addr;
9136
9137 r_type = ELF64_R_TYPE (rel->r_info);
9138 if (r_type != R_PPC64_ADDR64)
9139 continue;
9140
9141 r_symndx = ELF64_R_SYM (rel->r_info);
9142 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9143 r_symndx, ibfd))
9144 goto error_ret;
9145
9146 if (sym_sec == NULL
9147 || sym_sec->output_section == NULL
9148 || discarded_section (sym_sec))
9149 continue;
9150
9151 if (!SYMBOL_REFERENCES_LOCAL (info, h))
9152 continue;
9153
9154 if (h != NULL)
9155 {
9156 if (h->type == STT_GNU_IFUNC)
9157 continue;
9158 val = h->root.u.def.value;
9159 }
9160 else
9161 {
9162 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
9163 continue;
9164 val = sym->st_value;
9165 }
9166 val += rel->r_addend;
9167 val += sym_sec->output_section->vma + sym_sec->output_offset;
9168
9169 /* We don't yet know the exact toc pointer value, but we
9170 know it will be somewhere in the toc section. Don't
9171 optimize if the difference from any possible toc
9172 pointer is outside [ff..f80008000, 7fff7fff]. */
9173 addr = toc->output_section->vma + TOC_BASE_OFF;
9174 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9175 continue;
9176
9177 addr = toc->output_section->vma + toc->output_section->rawsize;
9178 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
9179 continue;
9180
9181 if (skip == NULL)
9182 {
9183 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
9184 if (skip == NULL)
9185 goto error_ret;
9186 }
9187
9188 skip[rel->r_offset >> 3]
9189 |= can_optimize | ((rel - toc_relocs) << 2);
9190 }
9191 }
9192
9193 if (skip == NULL)
9194 continue;
9195
9196 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
9197 if (used == NULL)
9198 {
9199 error_ret:
9200 if (local_syms != NULL
9201 && symtab_hdr->contents != (unsigned char *) local_syms)
9202 free (local_syms);
9203 if (sec != NULL
9204 && relstart != NULL
9205 && elf_section_data (sec)->relocs != relstart)
9206 free (relstart);
9207 if (toc_relocs != NULL
9208 && elf_section_data (toc)->relocs != toc_relocs)
9209 free (toc_relocs);
9210 if (skip != NULL)
9211 free (skip);
9212 return FALSE;
9213 }
9214
9215 /* Now check all kept sections that might reference the toc.
9216 Check the toc itself last. */
9217 for (sec = (ibfd->sections == toc && toc->next ? toc->next
9218 : ibfd->sections);
9219 sec != NULL;
9220 sec = (sec == toc ? NULL
9221 : sec->next == NULL ? toc
9222 : sec->next == toc && toc->next ? toc->next
9223 : sec->next))
9224 {
9225 int repeat;
9226
9227 if (sec->reloc_count == 0
9228 || discarded_section (sec)
9229 || get_opd_info (sec)
9230 || (sec->flags & SEC_ALLOC) == 0
9231 || (sec->flags & SEC_DEBUGGING) != 0)
9232 continue;
9233
9234 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9235 info->keep_memory);
9236 if (relstart == NULL)
9237 {
9238 free (used);
9239 goto error_ret;
9240 }
9241
9242 /* Mark toc entries referenced as used. */
9243 do
9244 {
9245 repeat = 0;
9246 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9247 {
9248 enum elf_ppc64_reloc_type r_type;
9249 unsigned long r_symndx;
9250 asection *sym_sec;
9251 struct elf_link_hash_entry *h;
9252 Elf_Internal_Sym *sym;
9253 bfd_vma val;
9254 enum {no_check, check_lo, check_ha} insn_check;
9255
9256 r_type = ELF64_R_TYPE (rel->r_info);
9257 switch (r_type)
9258 {
9259 default:
9260 insn_check = no_check;
9261 break;
9262
9263 case R_PPC64_GOT_TLSLD16_HA:
9264 case R_PPC64_GOT_TLSGD16_HA:
9265 case R_PPC64_GOT_TPREL16_HA:
9266 case R_PPC64_GOT_DTPREL16_HA:
9267 case R_PPC64_GOT16_HA:
9268 case R_PPC64_TOC16_HA:
9269 insn_check = check_ha;
9270 break;
9271
9272 case R_PPC64_GOT_TLSLD16_LO:
9273 case R_PPC64_GOT_TLSGD16_LO:
9274 case R_PPC64_GOT_TPREL16_LO_DS:
9275 case R_PPC64_GOT_DTPREL16_LO_DS:
9276 case R_PPC64_GOT16_LO:
9277 case R_PPC64_GOT16_LO_DS:
9278 case R_PPC64_TOC16_LO:
9279 case R_PPC64_TOC16_LO_DS:
9280 insn_check = check_lo;
9281 break;
9282 }
9283
9284 if (insn_check != no_check)
9285 {
9286 bfd_vma off = rel->r_offset & ~3;
9287 unsigned char buf[4];
9288 unsigned int insn;
9289
9290 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9291 {
9292 free (used);
9293 goto error_ret;
9294 }
9295 insn = bfd_get_32 (ibfd, buf);
9296 if (insn_check == check_lo
9297 ? !ok_lo_toc_insn (insn, r_type)
9298 : ((insn & ((0x3f << 26) | 0x1f << 16))
9299 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9300 {
9301 char str[12];
9302
9303 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9304 sprintf (str, "%#08x", insn);
9305 info->callbacks->einfo
9306 /* xgettext:c-format */
9307 (_("%H: toc optimization is not supported for"
9308 " %s instruction\n"),
9309 ibfd, sec, rel->r_offset & ~3, str);
9310 }
9311 }
9312
9313 switch (r_type)
9314 {
9315 case R_PPC64_TOC16:
9316 case R_PPC64_TOC16_LO:
9317 case R_PPC64_TOC16_HI:
9318 case R_PPC64_TOC16_HA:
9319 case R_PPC64_TOC16_DS:
9320 case R_PPC64_TOC16_LO_DS:
9321 /* In case we're taking addresses of toc entries. */
9322 case R_PPC64_ADDR64:
9323 break;
9324
9325 default:
9326 continue;
9327 }
9328
9329 r_symndx = ELF64_R_SYM (rel->r_info);
9330 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9331 r_symndx, ibfd))
9332 {
9333 free (used);
9334 goto error_ret;
9335 }
9336
9337 if (sym_sec != toc)
9338 continue;
9339
9340 if (h != NULL)
9341 val = h->root.u.def.value;
9342 else
9343 val = sym->st_value;
9344 val += rel->r_addend;
9345
9346 if (val >= toc->size)
9347 continue;
9348
9349 if ((skip[val >> 3] & can_optimize) != 0)
9350 {
9351 bfd_vma off;
9352 unsigned char opc;
9353
9354 switch (r_type)
9355 {
9356 case R_PPC64_TOC16_HA:
9357 break;
9358
9359 case R_PPC64_TOC16_LO_DS:
9360 off = rel->r_offset;
9361 off += (bfd_big_endian (ibfd) ? -2 : 3);
9362 if (!bfd_get_section_contents (ibfd, sec, &opc,
9363 off, 1))
9364 {
9365 free (used);
9366 goto error_ret;
9367 }
9368 if ((opc & (0x3f << 2)) == (58u << 2))
9369 break;
9370 /* Fall through. */
9371
9372 default:
9373 /* Wrong sort of reloc, or not a ld. We may
9374 as well clear ref_from_discarded too. */
9375 skip[val >> 3] = 0;
9376 }
9377 }
9378
9379 if (sec != toc)
9380 used[val >> 3] = 1;
9381 /* For the toc section, we only mark as used if this
9382 entry itself isn't unused. */
9383 else if ((used[rel->r_offset >> 3]
9384 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9385 && !used[val >> 3])
9386 {
9387 /* Do all the relocs again, to catch reference
9388 chains. */
9389 repeat = 1;
9390 used[val >> 3] = 1;
9391 }
9392 }
9393 }
9394 while (repeat);
9395
9396 if (elf_section_data (sec)->relocs != relstart)
9397 free (relstart);
9398 }
9399
9400 /* Merge the used and skip arrays. Assume that TOC
9401 doublewords not appearing as either used or unused belong
9402 to an entry more than one doubleword in size. */
9403 for (drop = skip, keep = used, last = 0, some_unused = 0;
9404 drop < skip + (toc->size + 7) / 8;
9405 ++drop, ++keep)
9406 {
9407 if (*keep)
9408 {
9409 *drop &= ~ref_from_discarded;
9410 if ((*drop & can_optimize) != 0)
9411 some_unused = 1;
9412 last = 0;
9413 }
9414 else if ((*drop & ref_from_discarded) != 0)
9415 {
9416 some_unused = 1;
9417 last = ref_from_discarded;
9418 }
9419 else
9420 *drop = last;
9421 }
9422
9423 free (used);
9424
9425 if (some_unused)
9426 {
9427 bfd_byte *contents, *src;
9428 unsigned long off;
9429 Elf_Internal_Sym *sym;
9430 bfd_boolean local_toc_syms = FALSE;
9431
9432 /* Shuffle the toc contents, and at the same time convert the
9433 skip array from booleans into offsets. */
9434 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9435 goto error_ret;
9436
9437 elf_section_data (toc)->this_hdr.contents = contents;
9438
9439 for (src = contents, off = 0, drop = skip;
9440 src < contents + toc->size;
9441 src += 8, ++drop)
9442 {
9443 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9444 off += 8;
9445 else if (off != 0)
9446 {
9447 *drop = off;
9448 memcpy (src - off, src, 8);
9449 }
9450 }
9451 *drop = off;
9452 toc->rawsize = toc->size;
9453 toc->size = src - contents - off;
9454
9455 /* Adjust addends for relocs against the toc section sym,
9456 and optimize any accesses we can. */
9457 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9458 {
9459 if (sec->reloc_count == 0
9460 || discarded_section (sec))
9461 continue;
9462
9463 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9464 info->keep_memory);
9465 if (relstart == NULL)
9466 goto error_ret;
9467
9468 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9469 {
9470 enum elf_ppc64_reloc_type r_type;
9471 unsigned long r_symndx;
9472 asection *sym_sec;
9473 struct elf_link_hash_entry *h;
9474 bfd_vma val;
9475
9476 r_type = ELF64_R_TYPE (rel->r_info);
9477 switch (r_type)
9478 {
9479 default:
9480 continue;
9481
9482 case R_PPC64_TOC16:
9483 case R_PPC64_TOC16_LO:
9484 case R_PPC64_TOC16_HI:
9485 case R_PPC64_TOC16_HA:
9486 case R_PPC64_TOC16_DS:
9487 case R_PPC64_TOC16_LO_DS:
9488 case R_PPC64_ADDR64:
9489 break;
9490 }
9491
9492 r_symndx = ELF64_R_SYM (rel->r_info);
9493 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9494 r_symndx, ibfd))
9495 goto error_ret;
9496
9497 if (sym_sec != toc)
9498 continue;
9499
9500 if (h != NULL)
9501 val = h->root.u.def.value;
9502 else
9503 {
9504 val = sym->st_value;
9505 if (val != 0)
9506 local_toc_syms = TRUE;
9507 }
9508
9509 val += rel->r_addend;
9510
9511 if (val > toc->rawsize)
9512 val = toc->rawsize;
9513 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9514 continue;
9515 else if ((skip[val >> 3] & can_optimize) != 0)
9516 {
9517 Elf_Internal_Rela *tocrel
9518 = toc_relocs + (skip[val >> 3] >> 2);
9519 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9520
9521 switch (r_type)
9522 {
9523 case R_PPC64_TOC16_HA:
9524 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9525 break;
9526
9527 case R_PPC64_TOC16_LO_DS:
9528 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9529 break;
9530
9531 default:
9532 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9533 ppc_howto_init ();
9534 info->callbacks->einfo
9535 /* xgettext:c-format */
9536 (_("%H: %s references "
9537 "optimized away TOC entry\n"),
9538 ibfd, sec, rel->r_offset,
9539 ppc64_elf_howto_table[r_type]->name);
9540 bfd_set_error (bfd_error_bad_value);
9541 goto error_ret;
9542 }
9543 rel->r_addend = tocrel->r_addend;
9544 elf_section_data (sec)->relocs = relstart;
9545 continue;
9546 }
9547
9548 if (h != NULL || sym->st_value != 0)
9549 continue;
9550
9551 rel->r_addend -= skip[val >> 3];
9552 elf_section_data (sec)->relocs = relstart;
9553 }
9554
9555 if (elf_section_data (sec)->relocs != relstart)
9556 free (relstart);
9557 }
9558
9559 /* We shouldn't have local or global symbols defined in the TOC,
9560 but handle them anyway. */
9561 if (local_syms != NULL)
9562 for (sym = local_syms;
9563 sym < local_syms + symtab_hdr->sh_info;
9564 ++sym)
9565 if (sym->st_value != 0
9566 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9567 {
9568 unsigned long i;
9569
9570 if (sym->st_value > toc->rawsize)
9571 i = toc->rawsize >> 3;
9572 else
9573 i = sym->st_value >> 3;
9574
9575 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9576 {
9577 if (local_toc_syms)
9578 _bfd_error_handler
9579 (_("%s defined on removed toc entry"),
9580 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9581 do
9582 ++i;
9583 while ((skip[i] & (ref_from_discarded | can_optimize)));
9584 sym->st_value = (bfd_vma) i << 3;
9585 }
9586
9587 sym->st_value -= skip[i];
9588 symtab_hdr->contents = (unsigned char *) local_syms;
9589 }
9590
9591 /* Adjust any global syms defined in this toc input section. */
9592 if (toc_inf.global_toc_syms)
9593 {
9594 toc_inf.toc = toc;
9595 toc_inf.skip = skip;
9596 toc_inf.global_toc_syms = FALSE;
9597 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9598 &toc_inf);
9599 }
9600
9601 if (toc->reloc_count != 0)
9602 {
9603 Elf_Internal_Shdr *rel_hdr;
9604 Elf_Internal_Rela *wrel;
9605 bfd_size_type sz;
9606
9607 /* Remove unused toc relocs, and adjust those we keep. */
9608 if (toc_relocs == NULL)
9609 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9610 info->keep_memory);
9611 if (toc_relocs == NULL)
9612 goto error_ret;
9613
9614 wrel = toc_relocs;
9615 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9616 if ((skip[rel->r_offset >> 3]
9617 & (ref_from_discarded | can_optimize)) == 0)
9618 {
9619 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9620 wrel->r_info = rel->r_info;
9621 wrel->r_addend = rel->r_addend;
9622 ++wrel;
9623 }
9624 else if (!dec_dynrel_count (rel->r_info, toc, info,
9625 &local_syms, NULL, NULL))
9626 goto error_ret;
9627
9628 elf_section_data (toc)->relocs = toc_relocs;
9629 toc->reloc_count = wrel - toc_relocs;
9630 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9631 sz = rel_hdr->sh_entsize;
9632 rel_hdr->sh_size = toc->reloc_count * sz;
9633 }
9634 }
9635 else if (toc_relocs != NULL
9636 && elf_section_data (toc)->relocs != toc_relocs)
9637 free (toc_relocs);
9638
9639 if (local_syms != NULL
9640 && symtab_hdr->contents != (unsigned char *) local_syms)
9641 {
9642 if (!info->keep_memory)
9643 free (local_syms);
9644 else
9645 symtab_hdr->contents = (unsigned char *) local_syms;
9646 }
9647 free (skip);
9648 }
9649
9650 return TRUE;
9651 }
9652
9653 /* Return true iff input section I references the TOC using
9654 instructions limited to +/-32k offsets. */
9655
9656 bfd_boolean
9657 ppc64_elf_has_small_toc_reloc (asection *i)
9658 {
9659 return (is_ppc64_elf (i->owner)
9660 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9661 }
9662
9663 /* Allocate space for one GOT entry. */
9664
9665 static void
9666 allocate_got (struct elf_link_hash_entry *h,
9667 struct bfd_link_info *info,
9668 struct got_entry *gent)
9669 {
9670 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9671 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9672 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9673 ? 16 : 8);
9674 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9675 ? 2 : 1) * sizeof (Elf64_External_Rela);
9676 asection *got = ppc64_elf_tdata (gent->owner)->got;
9677
9678 gent->got.offset = got->size;
9679 got->size += entsize;
9680
9681 if (h->type == STT_GNU_IFUNC)
9682 {
9683 htab->elf.irelplt->size += rentsize;
9684 htab->got_reli_size += rentsize;
9685 }
9686 else if (((bfd_link_pic (info)
9687 && !((gent->tls_type & TLS_TPREL) != 0
9688 && bfd_link_executable (info)
9689 && SYMBOL_REFERENCES_LOCAL (info, h)))
9690 || (htab->elf.dynamic_sections_created
9691 && h->dynindx != -1
9692 && !SYMBOL_REFERENCES_LOCAL (info, h)))
9693 && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9694 {
9695 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9696 relgot->size += rentsize;
9697 }
9698 }
9699
9700 /* This function merges got entries in the same toc group. */
9701
9702 static void
9703 merge_got_entries (struct got_entry **pent)
9704 {
9705 struct got_entry *ent, *ent2;
9706
9707 for (ent = *pent; ent != NULL; ent = ent->next)
9708 if (!ent->is_indirect)
9709 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9710 if (!ent2->is_indirect
9711 && ent2->addend == ent->addend
9712 && ent2->tls_type == ent->tls_type
9713 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9714 {
9715 ent2->is_indirect = TRUE;
9716 ent2->got.ent = ent;
9717 }
9718 }
9719
9720 /* If H is undefined, make it dynamic if that makes sense. */
9721
9722 static bfd_boolean
9723 ensure_undef_dynamic (struct bfd_link_info *info,
9724 struct elf_link_hash_entry *h)
9725 {
9726 struct elf_link_hash_table *htab = elf_hash_table (info);
9727
9728 if (htab->dynamic_sections_created
9729 && ((info->dynamic_undefined_weak != 0
9730 && h->root.type == bfd_link_hash_undefweak)
9731 || h->root.type == bfd_link_hash_undefined)
9732 && h->dynindx == -1
9733 && !h->forced_local
9734 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
9735 return bfd_elf_link_record_dynamic_symbol (info, h);
9736 return TRUE;
9737 }
9738
9739 /* Allocate space in .plt, .got and associated reloc sections for
9740 dynamic relocs. */
9741
9742 static bfd_boolean
9743 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9744 {
9745 struct bfd_link_info *info;
9746 struct ppc_link_hash_table *htab;
9747 asection *s;
9748 struct ppc_link_hash_entry *eh;
9749 struct got_entry **pgent, *gent;
9750
9751 if (h->root.type == bfd_link_hash_indirect)
9752 return TRUE;
9753
9754 info = (struct bfd_link_info *) inf;
9755 htab = ppc_hash_table (info);
9756 if (htab == NULL)
9757 return FALSE;
9758
9759 eh = (struct ppc_link_hash_entry *) h;
9760 /* Run through the TLS GD got entries first if we're changing them
9761 to TPREL. */
9762 if ((eh->tls_mask & (TLS_TLS | TLS_TPRELGD)) == (TLS_TLS | TLS_TPRELGD))
9763 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9764 if (gent->got.refcount > 0
9765 && (gent->tls_type & TLS_GD) != 0)
9766 {
9767 /* This was a GD entry that has been converted to TPREL. If
9768 there happens to be a TPREL entry we can use that one. */
9769 struct got_entry *ent;
9770 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9771 if (ent->got.refcount > 0
9772 && (ent->tls_type & TLS_TPREL) != 0
9773 && ent->addend == gent->addend
9774 && ent->owner == gent->owner)
9775 {
9776 gent->got.refcount = 0;
9777 break;
9778 }
9779
9780 /* If not, then we'll be using our own TPREL entry. */
9781 if (gent->got.refcount != 0)
9782 gent->tls_type = TLS_TLS | TLS_TPREL;
9783 }
9784
9785 /* Remove any list entry that won't generate a word in the GOT before
9786 we call merge_got_entries. Otherwise we risk merging to empty
9787 entries. */
9788 pgent = &h->got.glist;
9789 while ((gent = *pgent) != NULL)
9790 if (gent->got.refcount > 0)
9791 {
9792 if ((gent->tls_type & TLS_LD) != 0
9793 && !h->def_dynamic)
9794 {
9795 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9796 *pgent = gent->next;
9797 }
9798 else
9799 pgent = &gent->next;
9800 }
9801 else
9802 *pgent = gent->next;
9803
9804 if (!htab->do_multi_toc)
9805 merge_got_entries (&h->got.glist);
9806
9807 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9808 if (!gent->is_indirect)
9809 {
9810 /* Make sure this symbol is output as a dynamic symbol. */
9811 if (!ensure_undef_dynamic (info, h))
9812 return FALSE;
9813
9814 if (!is_ppc64_elf (gent->owner))
9815 abort ();
9816
9817 allocate_got (h, info, gent);
9818 }
9819
9820 /* If no dynamic sections we can't have dynamic relocs, except for
9821 IFUNCs which are handled even in static executables. */
9822 if (!htab->elf.dynamic_sections_created
9823 && h->type != STT_GNU_IFUNC)
9824 eh->dyn_relocs = NULL;
9825
9826 /* Discard relocs on undefined symbols that must be local. */
9827 else if (h->root.type == bfd_link_hash_undefined
9828 && ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9829 eh->dyn_relocs = NULL;
9830
9831 /* Also discard relocs on undefined weak syms with non-default
9832 visibility, or when dynamic_undefined_weak says so. */
9833 else if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h))
9834 eh->dyn_relocs = NULL;
9835
9836 if (eh->dyn_relocs != NULL)
9837 {
9838 struct elf_dyn_relocs *p, **pp;
9839
9840 /* In the shared -Bsymbolic case, discard space allocated for
9841 dynamic pc-relative relocs against symbols which turn out to
9842 be defined in regular objects. For the normal shared case,
9843 discard space for relocs that have become local due to symbol
9844 visibility changes. */
9845
9846 if (bfd_link_pic (info))
9847 {
9848 /* Relocs that use pc_count are those that appear on a call
9849 insn, or certain REL relocs (see must_be_dyn_reloc) that
9850 can be generated via assembly. We want calls to
9851 protected symbols to resolve directly to the function
9852 rather than going via the plt. If people want function
9853 pointer comparisons to work as expected then they should
9854 avoid writing weird assembly. */
9855 if (SYMBOL_CALLS_LOCAL (info, h))
9856 {
9857 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9858 {
9859 p->count -= p->pc_count;
9860 p->pc_count = 0;
9861 if (p->count == 0)
9862 *pp = p->next;
9863 else
9864 pp = &p->next;
9865 }
9866 }
9867
9868 if (eh->dyn_relocs != NULL)
9869 {
9870 /* Make sure this symbol is output as a dynamic symbol. */
9871 if (!ensure_undef_dynamic (info, h))
9872 return FALSE;
9873 }
9874 }
9875 else if (ELIMINATE_COPY_RELOCS && h->type != STT_GNU_IFUNC)
9876 {
9877 /* For the non-pic case, discard space for relocs against
9878 symbols which turn out to need copy relocs or are not
9879 dynamic. */
9880 if (h->dynamic_adjusted
9881 && !h->def_regular
9882 && !ELF_COMMON_DEF_P (h))
9883 {
9884 /* Make sure this symbol is output as a dynamic symbol. */
9885 if (!ensure_undef_dynamic (info, h))
9886 return FALSE;
9887
9888 if (h->dynindx == -1)
9889 eh->dyn_relocs = NULL;
9890 }
9891 else
9892 eh->dyn_relocs = NULL;
9893 }
9894
9895 /* Finally, allocate space. */
9896 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9897 {
9898 asection *sreloc = elf_section_data (p->sec)->sreloc;
9899 if (eh->elf.type == STT_GNU_IFUNC)
9900 sreloc = htab->elf.irelplt;
9901 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9902 }
9903 }
9904
9905 /* We might need a PLT entry when the symbol
9906 a) is dynamic, or
9907 b) is an ifunc, or
9908 c) has plt16 relocs and has been processed by adjust_dynamic_symbol, or
9909 d) has plt16 relocs and we are linking statically. */
9910 if ((htab->elf.dynamic_sections_created && h->dynindx != -1)
9911 || h->type == STT_GNU_IFUNC
9912 || (h->needs_plt && h->dynamic_adjusted)
9913 || (h->needs_plt
9914 && h->def_regular
9915 && !htab->elf.dynamic_sections_created
9916 && (((struct ppc_link_hash_entry *) h)->tls_mask
9917 & (TLS_TLS | PLT_KEEP)) == PLT_KEEP))
9918 {
9919 struct plt_entry *pent;
9920 bfd_boolean doneone = FALSE;
9921 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9922 if (pent->plt.refcount > 0)
9923 {
9924 if (!htab->elf.dynamic_sections_created
9925 || h->dynindx == -1)
9926 {
9927 if (h->type == STT_GNU_IFUNC)
9928 {
9929 s = htab->elf.iplt;
9930 pent->plt.offset = s->size;
9931 s->size += PLT_ENTRY_SIZE (htab);
9932 s = htab->elf.irelplt;
9933 }
9934 else
9935 {
9936 s = htab->pltlocal;
9937 pent->plt.offset = s->size;
9938 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
9939 s = bfd_link_pic (info) ? htab->relpltlocal : NULL;
9940 }
9941 }
9942 else
9943 {
9944 /* If this is the first .plt entry, make room for the special
9945 first entry. */
9946 s = htab->elf.splt;
9947 if (s->size == 0)
9948 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9949
9950 pent->plt.offset = s->size;
9951
9952 /* Make room for this entry. */
9953 s->size += PLT_ENTRY_SIZE (htab);
9954
9955 /* Make room for the .glink code. */
9956 s = htab->glink;
9957 if (s->size == 0)
9958 s->size += GLINK_PLTRESOLVE_SIZE (htab);
9959 if (htab->opd_abi)
9960 {
9961 /* We need bigger stubs past index 32767. */
9962 if (s->size >= GLINK_PLTRESOLVE_SIZE (htab) + 32768*2*4)
9963 s->size += 4;
9964 s->size += 2*4;
9965 }
9966 else
9967 s->size += 4;
9968
9969 /* We also need to make an entry in the .rela.plt section. */
9970 s = htab->elf.srelplt;
9971 }
9972 if (s != NULL)
9973 s->size += sizeof (Elf64_External_Rela);
9974 doneone = TRUE;
9975 }
9976 else
9977 pent->plt.offset = (bfd_vma) -1;
9978 if (!doneone)
9979 {
9980 h->plt.plist = NULL;
9981 h->needs_plt = 0;
9982 }
9983 }
9984 else
9985 {
9986 h->plt.plist = NULL;
9987 h->needs_plt = 0;
9988 }
9989
9990 return TRUE;
9991 }
9992
9993 #define PPC_LO(v) ((v) & 0xffff)
9994 #define PPC_HI(v) (((v) >> 16) & 0xffff)
9995 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
9996
9997 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9998 to set up space for global entry stubs. These are put in glink,
9999 after the branch table. */
10000
10001 static bfd_boolean
10002 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
10003 {
10004 struct bfd_link_info *info;
10005 struct ppc_link_hash_table *htab;
10006 struct plt_entry *pent;
10007 asection *s, *plt;
10008
10009 if (h->root.type == bfd_link_hash_indirect)
10010 return TRUE;
10011
10012 if (!h->pointer_equality_needed)
10013 return TRUE;
10014
10015 if (h->def_regular)
10016 return TRUE;
10017
10018 info = inf;
10019 htab = ppc_hash_table (info);
10020 if (htab == NULL)
10021 return FALSE;
10022
10023 s = htab->global_entry;
10024 plt = htab->elf.splt;
10025 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
10026 if (pent->plt.offset != (bfd_vma) -1
10027 && pent->addend == 0)
10028 {
10029 /* For ELFv2, if this symbol is not defined in a regular file
10030 and we are not generating a shared library or pie, then we
10031 need to define the symbol in the executable on a call stub.
10032 This is to avoid text relocations. */
10033 bfd_vma off, stub_align, stub_off, stub_size;
10034 unsigned int align_power;
10035
10036 stub_size = 16;
10037 stub_off = s->size;
10038 if (htab->params->plt_stub_align >= 0)
10039 align_power = htab->params->plt_stub_align;
10040 else
10041 align_power = -htab->params->plt_stub_align;
10042 /* Setting section alignment is delayed until we know it is
10043 non-empty. Otherwise the .text output section will be
10044 aligned at least to plt_stub_align even when no global
10045 entry stubs are needed. */
10046 if (s->alignment_power < align_power)
10047 s->alignment_power = align_power;
10048 stub_align = (bfd_vma) 1 << align_power;
10049 if (htab->params->plt_stub_align >= 0
10050 || ((((stub_off + stub_size - 1) & -stub_align)
10051 - (stub_off & -stub_align))
10052 > ((stub_size - 1) & -stub_align)))
10053 stub_off = (stub_off + stub_align - 1) & -stub_align;
10054 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
10055 off -= stub_off + s->output_offset + s->output_section->vma;
10056 /* Note that for --plt-stub-align negative we have a possible
10057 dependency between stub offset and size. Break that
10058 dependency by assuming the max stub size when calculating
10059 the stub offset. */
10060 if (PPC_HA (off) == 0)
10061 stub_size -= 4;
10062 h->root.type = bfd_link_hash_defined;
10063 h->root.u.def.section = s;
10064 h->root.u.def.value = stub_off;
10065 s->size = stub_off + stub_size;
10066 break;
10067 }
10068 return TRUE;
10069 }
10070
10071 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
10072 read-only sections. */
10073
10074 static bfd_boolean
10075 maybe_set_textrel (struct elf_link_hash_entry *h, void *inf)
10076 {
10077 asection *sec;
10078
10079 if (h->root.type == bfd_link_hash_indirect)
10080 return TRUE;
10081
10082 sec = readonly_dynrelocs (h);
10083 if (sec != NULL)
10084 {
10085 struct bfd_link_info *info = (struct bfd_link_info *) inf;
10086
10087 info->flags |= DF_TEXTREL;
10088 info->callbacks->minfo
10089 (_("%pB: dynamic relocation against `%pT' in read-only section `%pA'\n"),
10090 sec->owner, h->root.root.string, sec);
10091
10092 /* Not an error, just cut short the traversal. */
10093 return FALSE;
10094 }
10095 return TRUE;
10096 }
10097
10098 /* Set the sizes of the dynamic sections. */
10099
10100 static bfd_boolean
10101 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
10102 struct bfd_link_info *info)
10103 {
10104 struct ppc_link_hash_table *htab;
10105 bfd *dynobj;
10106 asection *s;
10107 bfd_boolean relocs;
10108 bfd *ibfd;
10109 struct got_entry *first_tlsld;
10110
10111 htab = ppc_hash_table (info);
10112 if (htab == NULL)
10113 return FALSE;
10114
10115 dynobj = htab->elf.dynobj;
10116 if (dynobj == NULL)
10117 abort ();
10118
10119 if (htab->elf.dynamic_sections_created)
10120 {
10121 /* Set the contents of the .interp section to the interpreter. */
10122 if (bfd_link_executable (info) && !info->nointerp)
10123 {
10124 s = bfd_get_linker_section (dynobj, ".interp");
10125 if (s == NULL)
10126 abort ();
10127 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
10128 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
10129 }
10130 }
10131
10132 /* Set up .got offsets for local syms, and space for local dynamic
10133 relocs. */
10134 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10135 {
10136 struct got_entry **lgot_ents;
10137 struct got_entry **end_lgot_ents;
10138 struct plt_entry **local_plt;
10139 struct plt_entry **end_local_plt;
10140 unsigned char *lgot_masks;
10141 bfd_size_type locsymcount;
10142 Elf_Internal_Shdr *symtab_hdr;
10143
10144 if (!is_ppc64_elf (ibfd))
10145 continue;
10146
10147 for (s = ibfd->sections; s != NULL; s = s->next)
10148 {
10149 struct ppc_dyn_relocs *p;
10150
10151 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
10152 {
10153 if (!bfd_is_abs_section (p->sec)
10154 && bfd_is_abs_section (p->sec->output_section))
10155 {
10156 /* Input section has been discarded, either because
10157 it is a copy of a linkonce section or due to
10158 linker script /DISCARD/, so we'll be discarding
10159 the relocs too. */
10160 }
10161 else if (p->count != 0)
10162 {
10163 asection *srel = elf_section_data (p->sec)->sreloc;
10164 if (p->ifunc)
10165 srel = htab->elf.irelplt;
10166 srel->size += p->count * sizeof (Elf64_External_Rela);
10167 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
10168 info->flags |= DF_TEXTREL;
10169 }
10170 }
10171 }
10172
10173 lgot_ents = elf_local_got_ents (ibfd);
10174 if (!lgot_ents)
10175 continue;
10176
10177 symtab_hdr = &elf_symtab_hdr (ibfd);
10178 locsymcount = symtab_hdr->sh_info;
10179 end_lgot_ents = lgot_ents + locsymcount;
10180 local_plt = (struct plt_entry **) end_lgot_ents;
10181 end_local_plt = local_plt + locsymcount;
10182 lgot_masks = (unsigned char *) end_local_plt;
10183 s = ppc64_elf_tdata (ibfd)->got;
10184 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
10185 {
10186 struct got_entry **pent, *ent;
10187
10188 pent = lgot_ents;
10189 while ((ent = *pent) != NULL)
10190 if (ent->got.refcount > 0)
10191 {
10192 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
10193 {
10194 ppc64_tlsld_got (ibfd)->got.refcount += 1;
10195 *pent = ent->next;
10196 }
10197 else
10198 {
10199 unsigned int ent_size = 8;
10200 unsigned int rel_size = sizeof (Elf64_External_Rela);
10201
10202 ent->got.offset = s->size;
10203 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
10204 {
10205 ent_size *= 2;
10206 rel_size *= 2;
10207 }
10208 s->size += ent_size;
10209 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10210 {
10211 htab->elf.irelplt->size += rel_size;
10212 htab->got_reli_size += rel_size;
10213 }
10214 else if (bfd_link_pic (info)
10215 && !((ent->tls_type & TLS_TPREL) != 0
10216 && bfd_link_executable (info)))
10217 {
10218 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10219 srel->size += rel_size;
10220 }
10221 pent = &ent->next;
10222 }
10223 }
10224 else
10225 *pent = ent->next;
10226 }
10227
10228 /* Allocate space for plt calls to local syms. */
10229 lgot_masks = (unsigned char *) end_local_plt;
10230 for (; local_plt < end_local_plt; ++local_plt, ++lgot_masks)
10231 {
10232 struct plt_entry *ent;
10233
10234 for (ent = *local_plt; ent != NULL; ent = ent->next)
10235 if (ent->plt.refcount > 0)
10236 {
10237 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
10238 {
10239 s = htab->elf.iplt;
10240 ent->plt.offset = s->size;
10241 s->size += PLT_ENTRY_SIZE (htab);
10242 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
10243 }
10244 else if ((*lgot_masks & (TLS_TLS | PLT_KEEP)) != PLT_KEEP)
10245 ent->plt.offset = (bfd_vma) -1;
10246 else
10247 {
10248 s = htab->pltlocal;
10249 ent->plt.offset = s->size;
10250 s->size += LOCAL_PLT_ENTRY_SIZE (htab);
10251 if (bfd_link_pic (info))
10252 htab->relpltlocal->size += sizeof (Elf64_External_Rela);
10253 }
10254 }
10255 else
10256 ent->plt.offset = (bfd_vma) -1;
10257 }
10258 }
10259
10260 /* Allocate global sym .plt and .got entries, and space for global
10261 sym dynamic relocs. */
10262 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
10263
10264 if (!htab->opd_abi && !bfd_link_pic (info))
10265 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
10266
10267 first_tlsld = NULL;
10268 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10269 {
10270 struct got_entry *ent;
10271
10272 if (!is_ppc64_elf (ibfd))
10273 continue;
10274
10275 ent = ppc64_tlsld_got (ibfd);
10276 if (ent->got.refcount > 0)
10277 {
10278 if (!htab->do_multi_toc && first_tlsld != NULL)
10279 {
10280 ent->is_indirect = TRUE;
10281 ent->got.ent = first_tlsld;
10282 }
10283 else
10284 {
10285 if (first_tlsld == NULL)
10286 first_tlsld = ent;
10287 s = ppc64_elf_tdata (ibfd)->got;
10288 ent->got.offset = s->size;
10289 ent->owner = ibfd;
10290 s->size += 16;
10291 if (bfd_link_pic (info))
10292 {
10293 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
10294 srel->size += sizeof (Elf64_External_Rela);
10295 }
10296 }
10297 }
10298 else
10299 ent->got.offset = (bfd_vma) -1;
10300 }
10301
10302 /* We now have determined the sizes of the various dynamic sections.
10303 Allocate memory for them. */
10304 relocs = FALSE;
10305 for (s = dynobj->sections; s != NULL; s = s->next)
10306 {
10307 if ((s->flags & SEC_LINKER_CREATED) == 0)
10308 continue;
10309
10310 if (s == htab->brlt || s == htab->relbrlt)
10311 /* These haven't been allocated yet; don't strip. */
10312 continue;
10313 else if (s == htab->elf.sgot
10314 || s == htab->elf.splt
10315 || s == htab->elf.iplt
10316 || s == htab->pltlocal
10317 || s == htab->glink
10318 || s == htab->global_entry
10319 || s == htab->elf.sdynbss
10320 || s == htab->elf.sdynrelro)
10321 {
10322 /* Strip this section if we don't need it; see the
10323 comment below. */
10324 }
10325 else if (s == htab->glink_eh_frame)
10326 {
10327 if (!bfd_is_abs_section (s->output_section))
10328 /* Not sized yet. */
10329 continue;
10330 }
10331 else if (CONST_STRNEQ (s->name, ".rela"))
10332 {
10333 if (s->size != 0)
10334 {
10335 if (s != htab->elf.srelplt)
10336 relocs = TRUE;
10337
10338 /* We use the reloc_count field as a counter if we need
10339 to copy relocs into the output file. */
10340 s->reloc_count = 0;
10341 }
10342 }
10343 else
10344 {
10345 /* It's not one of our sections, so don't allocate space. */
10346 continue;
10347 }
10348
10349 if (s->size == 0)
10350 {
10351 /* If we don't need this section, strip it from the
10352 output file. This is mostly to handle .rela.bss and
10353 .rela.plt. We must create both sections in
10354 create_dynamic_sections, because they must be created
10355 before the linker maps input sections to output
10356 sections. The linker does that before
10357 adjust_dynamic_symbol is called, and it is that
10358 function which decides whether anything needs to go
10359 into these sections. */
10360 s->flags |= SEC_EXCLUDE;
10361 continue;
10362 }
10363
10364 if (bfd_is_abs_section (s->output_section))
10365 _bfd_error_handler (_("warning: discarding dynamic section %s"),
10366 s->name);
10367
10368 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10369 continue;
10370
10371 /* Allocate memory for the section contents. We use bfd_zalloc
10372 here in case unused entries are not reclaimed before the
10373 section's contents are written out. This should not happen,
10374 but this way if it does we get a R_PPC64_NONE reloc in .rela
10375 sections instead of garbage.
10376 We also rely on the section contents being zero when writing
10377 the GOT and .dynrelro. */
10378 s->contents = bfd_zalloc (dynobj, s->size);
10379 if (s->contents == NULL)
10380 return FALSE;
10381 }
10382
10383 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10384 {
10385 if (!is_ppc64_elf (ibfd))
10386 continue;
10387
10388 s = ppc64_elf_tdata (ibfd)->got;
10389 if (s != NULL && s != htab->elf.sgot)
10390 {
10391 if (s->size == 0)
10392 s->flags |= SEC_EXCLUDE;
10393 else
10394 {
10395 s->contents = bfd_zalloc (ibfd, s->size);
10396 if (s->contents == NULL)
10397 return FALSE;
10398 }
10399 }
10400 s = ppc64_elf_tdata (ibfd)->relgot;
10401 if (s != NULL)
10402 {
10403 if (s->size == 0)
10404 s->flags |= SEC_EXCLUDE;
10405 else
10406 {
10407 s->contents = bfd_zalloc (ibfd, s->size);
10408 if (s->contents == NULL)
10409 return FALSE;
10410 relocs = TRUE;
10411 s->reloc_count = 0;
10412 }
10413 }
10414 }
10415
10416 if (htab->elf.dynamic_sections_created)
10417 {
10418 bfd_boolean tls_opt;
10419
10420 /* Add some entries to the .dynamic section. We fill in the
10421 values later, in ppc64_elf_finish_dynamic_sections, but we
10422 must add the entries now so that we get the correct size for
10423 the .dynamic section. The DT_DEBUG entry is filled in by the
10424 dynamic linker and used by the debugger. */
10425 #define add_dynamic_entry(TAG, VAL) \
10426 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10427
10428 if (bfd_link_executable (info))
10429 {
10430 if (!add_dynamic_entry (DT_DEBUG, 0))
10431 return FALSE;
10432 }
10433
10434 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
10435 {
10436 if (!add_dynamic_entry (DT_PLTGOT, 0)
10437 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10438 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
10439 || !add_dynamic_entry (DT_JMPREL, 0)
10440 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
10441 return FALSE;
10442 }
10443
10444 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
10445 {
10446 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10447 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
10448 return FALSE;
10449 }
10450
10451 tls_opt = (htab->params->tls_get_addr_opt
10452 && htab->tls_get_addr_fd != NULL
10453 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10454 if (tls_opt || !htab->opd_abi)
10455 {
10456 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10457 return FALSE;
10458 }
10459
10460 if (relocs)
10461 {
10462 if (!add_dynamic_entry (DT_RELA, 0)
10463 || !add_dynamic_entry (DT_RELASZ, 0)
10464 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
10465 return FALSE;
10466
10467 /* If any dynamic relocs apply to a read-only section,
10468 then we need a DT_TEXTREL entry. */
10469 if ((info->flags & DF_TEXTREL) == 0)
10470 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
10471
10472 if ((info->flags & DF_TEXTREL) != 0)
10473 {
10474 if (!add_dynamic_entry (DT_TEXTREL, 0))
10475 return FALSE;
10476 }
10477 }
10478 }
10479 #undef add_dynamic_entry
10480
10481 return TRUE;
10482 }
10483
10484 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10485
10486 static bfd_boolean
10487 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10488 {
10489 if (h->plt.plist != NULL
10490 && !h->def_regular
10491 && !h->pointer_equality_needed)
10492 return FALSE;
10493
10494 return _bfd_elf_hash_symbol (h);
10495 }
10496
10497 /* Determine the type of stub needed, if any, for a call. */
10498
10499 static inline enum ppc_stub_type
10500 ppc_type_of_stub (asection *input_sec,
10501 const Elf_Internal_Rela *rel,
10502 struct ppc_link_hash_entry **hash,
10503 struct plt_entry **plt_ent,
10504 bfd_vma destination,
10505 unsigned long local_off)
10506 {
10507 struct ppc_link_hash_entry *h = *hash;
10508 bfd_vma location;
10509 bfd_vma branch_offset;
10510 bfd_vma max_branch_offset;
10511 enum elf_ppc64_reloc_type r_type;
10512
10513 if (h != NULL)
10514 {
10515 struct plt_entry *ent;
10516 struct ppc_link_hash_entry *fdh = h;
10517 if (h->oh != NULL
10518 && h->oh->is_func_descriptor)
10519 {
10520 fdh = ppc_follow_link (h->oh);
10521 *hash = fdh;
10522 }
10523
10524 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10525 if (ent->addend == rel->r_addend
10526 && ent->plt.offset != (bfd_vma) -1)
10527 {
10528 *plt_ent = ent;
10529 return ppc_stub_plt_call;
10530 }
10531
10532 /* Here, we know we don't have a plt entry. If we don't have a
10533 either a defined function descriptor or a defined entry symbol
10534 in a regular object file, then it is pointless trying to make
10535 any other type of stub. */
10536 if (!is_static_defined (&fdh->elf)
10537 && !is_static_defined (&h->elf))
10538 return ppc_stub_none;
10539 }
10540 else if (elf_local_got_ents (input_sec->owner) != NULL)
10541 {
10542 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10543 struct plt_entry **local_plt = (struct plt_entry **)
10544 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10545 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10546
10547 if (local_plt[r_symndx] != NULL)
10548 {
10549 struct plt_entry *ent;
10550
10551 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10552 if (ent->addend == rel->r_addend
10553 && ent->plt.offset != (bfd_vma) -1)
10554 {
10555 *plt_ent = ent;
10556 return ppc_stub_plt_call;
10557 }
10558 }
10559 }
10560
10561 /* Determine where the call point is. */
10562 location = (input_sec->output_offset
10563 + input_sec->output_section->vma
10564 + rel->r_offset);
10565
10566 branch_offset = destination - location;
10567 r_type = ELF64_R_TYPE (rel->r_info);
10568
10569 /* Determine if a long branch stub is needed. */
10570 max_branch_offset = 1 << 25;
10571 if (r_type == R_PPC64_REL14
10572 || r_type == R_PPC64_REL14_BRTAKEN
10573 || r_type == R_PPC64_REL14_BRNTAKEN)
10574 max_branch_offset = 1 << 15;
10575
10576 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10577 /* We need a stub. Figure out whether a long_branch or plt_branch
10578 is needed later. */
10579 return ppc_stub_long_branch;
10580
10581 return ppc_stub_none;
10582 }
10583
10584 /* With power7 weakly ordered memory model, it is possible for ld.so
10585 to update a plt entry in one thread and have another thread see a
10586 stale zero toc entry. To avoid this we need some sort of acquire
10587 barrier in the call stub. One solution is to make the load of the
10588 toc word seem to appear to depend on the load of the function entry
10589 word. Another solution is to test for r2 being zero, and branch to
10590 the appropriate glink entry if so.
10591
10592 . fake dep barrier compare
10593 . ld 12,xxx(2) ld 12,xxx(2)
10594 . mtctr 12 mtctr 12
10595 . xor 11,12,12 ld 2,xxx+8(2)
10596 . add 2,2,11 cmpldi 2,0
10597 . ld 2,xxx+8(2) bnectr+
10598 . bctr b <glink_entry>
10599
10600 The solution involving the compare turns out to be faster, so
10601 that's what we use unless the branch won't reach. */
10602
10603 #define ALWAYS_USE_FAKE_DEP 0
10604 #define ALWAYS_EMIT_R2SAVE 0
10605
10606 static inline unsigned int
10607 plt_stub_size (struct ppc_link_hash_table *htab,
10608 struct ppc_stub_hash_entry *stub_entry,
10609 bfd_vma off)
10610 {
10611 unsigned size = 12;
10612
10613 if (ALWAYS_EMIT_R2SAVE
10614 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10615 size += 4;
10616 if (PPC_HA (off) != 0)
10617 size += 4;
10618 if (htab->opd_abi)
10619 {
10620 size += 4;
10621 if (htab->params->plt_static_chain)
10622 size += 4;
10623 if (htab->params->plt_thread_safe
10624 && htab->elf.dynamic_sections_created
10625 && stub_entry->h != NULL
10626 && stub_entry->h->elf.dynindx != -1)
10627 size += 8;
10628 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10629 size += 4;
10630 }
10631 if (stub_entry->h != NULL
10632 && (stub_entry->h == htab->tls_get_addr_fd
10633 || stub_entry->h == htab->tls_get_addr)
10634 && htab->params->tls_get_addr_opt)
10635 {
10636 size += 7 * 4;
10637 if (ALWAYS_EMIT_R2SAVE
10638 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10639 size += 6 * 4;
10640 }
10641 return size;
10642 }
10643
10644 /* Depending on the sign of plt_stub_align:
10645 If positive, return the padding to align to a 2**plt_stub_align
10646 boundary.
10647 If negative, if this stub would cross fewer 2**plt_stub_align
10648 boundaries if we align, then return the padding needed to do so. */
10649
10650 static inline unsigned int
10651 plt_stub_pad (struct ppc_link_hash_table *htab,
10652 struct ppc_stub_hash_entry *stub_entry,
10653 bfd_vma plt_off)
10654 {
10655 int stub_align;
10656 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10657 bfd_vma stub_off = stub_entry->group->stub_sec->size;
10658
10659 if (htab->params->plt_stub_align >= 0)
10660 {
10661 stub_align = 1 << htab->params->plt_stub_align;
10662 if ((stub_off & (stub_align - 1)) != 0)
10663 return stub_align - (stub_off & (stub_align - 1));
10664 return 0;
10665 }
10666
10667 stub_align = 1 << -htab->params->plt_stub_align;
10668 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10669 > ((stub_size - 1) & -stub_align))
10670 return stub_align - (stub_off & (stub_align - 1));
10671 return 0;
10672 }
10673
10674 /* Build a .plt call stub. */
10675
10676 static inline bfd_byte *
10677 build_plt_stub (struct ppc_link_hash_table *htab,
10678 struct ppc_stub_hash_entry *stub_entry,
10679 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10680 {
10681 bfd *obfd = htab->params->stub_bfd;
10682 bfd_boolean plt_load_toc = htab->opd_abi;
10683 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10684 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10685 && htab->elf.dynamic_sections_created
10686 && stub_entry->h != NULL
10687 && stub_entry->h->elf.dynindx != -1);
10688 bfd_boolean use_fake_dep = plt_thread_safe;
10689 bfd_vma cmp_branch_off = 0;
10690
10691 if (!ALWAYS_USE_FAKE_DEP
10692 && plt_load_toc
10693 && plt_thread_safe
10694 && !((stub_entry->h == htab->tls_get_addr_fd
10695 || stub_entry->h == htab->tls_get_addr)
10696 && htab->params->tls_get_addr_opt))
10697 {
10698 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10699 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10700 / PLT_ENTRY_SIZE (htab));
10701 bfd_vma glinkoff = GLINK_PLTRESOLVE_SIZE (htab) + pltindex * 8;
10702 bfd_vma to, from;
10703
10704 if (pltindex > 32768)
10705 glinkoff += (pltindex - 32768) * 4;
10706 to = (glinkoff
10707 + htab->glink->output_offset
10708 + htab->glink->output_section->vma);
10709 from = (p - stub_entry->group->stub_sec->contents
10710 + 4 * (ALWAYS_EMIT_R2SAVE
10711 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10712 + 4 * (PPC_HA (offset) != 0)
10713 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10714 != PPC_HA (offset))
10715 + 4 * (plt_static_chain != 0)
10716 + 20
10717 + stub_entry->group->stub_sec->output_offset
10718 + stub_entry->group->stub_sec->output_section->vma);
10719 cmp_branch_off = to - from;
10720 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10721 }
10722
10723 if (PPC_HA (offset) != 0)
10724 {
10725 if (r != NULL)
10726 {
10727 if (ALWAYS_EMIT_R2SAVE
10728 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10729 r[0].r_offset += 4;
10730 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10731 r[1].r_offset = r[0].r_offset + 4;
10732 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10733 r[1].r_addend = r[0].r_addend;
10734 if (plt_load_toc)
10735 {
10736 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10737 {
10738 r[2].r_offset = r[1].r_offset + 4;
10739 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10740 r[2].r_addend = r[0].r_addend;
10741 }
10742 else
10743 {
10744 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10745 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10746 r[2].r_addend = r[0].r_addend + 8;
10747 if (plt_static_chain)
10748 {
10749 r[3].r_offset = r[2].r_offset + 4;
10750 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10751 r[3].r_addend = r[0].r_addend + 16;
10752 }
10753 }
10754 }
10755 }
10756 if (ALWAYS_EMIT_R2SAVE
10757 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10758 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10759 if (plt_load_toc)
10760 {
10761 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10762 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10763 }
10764 else
10765 {
10766 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10767 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10768 }
10769 if (plt_load_toc
10770 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10771 {
10772 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10773 offset = 0;
10774 }
10775 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10776 if (plt_load_toc)
10777 {
10778 if (use_fake_dep)
10779 {
10780 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10781 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10782 }
10783 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10784 if (plt_static_chain)
10785 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10786 }
10787 }
10788 else
10789 {
10790 if (r != NULL)
10791 {
10792 if (ALWAYS_EMIT_R2SAVE
10793 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10794 r[0].r_offset += 4;
10795 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10796 if (plt_load_toc)
10797 {
10798 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10799 {
10800 r[1].r_offset = r[0].r_offset + 4;
10801 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10802 r[1].r_addend = r[0].r_addend;
10803 }
10804 else
10805 {
10806 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10807 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10808 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10809 if (plt_static_chain)
10810 {
10811 r[2].r_offset = r[1].r_offset + 4;
10812 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10813 r[2].r_addend = r[0].r_addend + 8;
10814 }
10815 }
10816 }
10817 }
10818 if (ALWAYS_EMIT_R2SAVE
10819 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10820 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10821 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10822 if (plt_load_toc
10823 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10824 {
10825 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10826 offset = 0;
10827 }
10828 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10829 if (plt_load_toc)
10830 {
10831 if (use_fake_dep)
10832 {
10833 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10834 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10835 }
10836 if (plt_static_chain)
10837 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10838 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10839 }
10840 }
10841 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10842 {
10843 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10844 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10845 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10846 }
10847 else
10848 bfd_put_32 (obfd, BCTR, p), p += 4;
10849 return p;
10850 }
10851
10852 /* Build a special .plt call stub for __tls_get_addr. */
10853
10854 #define LD_R11_0R3 0xe9630000
10855 #define LD_R12_0R3 0xe9830000
10856 #define MR_R0_R3 0x7c601b78
10857 #define CMPDI_R11_0 0x2c2b0000
10858 #define ADD_R3_R12_R13 0x7c6c6a14
10859 #define BEQLR 0x4d820020
10860 #define MR_R3_R0 0x7c030378
10861 #define STD_R11_0R1 0xf9610000
10862 #define BCTRL 0x4e800421
10863 #define LD_R11_0R1 0xe9610000
10864 #define MTLR_R11 0x7d6803a6
10865
10866 static inline bfd_byte *
10867 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10868 struct ppc_stub_hash_entry *stub_entry,
10869 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10870 {
10871 bfd *obfd = htab->params->stub_bfd;
10872
10873 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10874 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10875 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10876 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10877 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10878 bfd_put_32 (obfd, BEQLR, p), p += 4;
10879 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10880 if (r != NULL)
10881 r[0].r_offset += 7 * 4;
10882 if (!ALWAYS_EMIT_R2SAVE
10883 && stub_entry->stub_type != ppc_stub_plt_call_r2save)
10884 return build_plt_stub (htab, stub_entry, p, offset, r);
10885
10886 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10887 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10888
10889 if (r != NULL)
10890 r[0].r_offset += 2 * 4;
10891 p = build_plt_stub (htab, stub_entry, p, offset, r);
10892 bfd_put_32 (obfd, BCTRL, p - 4);
10893
10894 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10895 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10896 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10897 bfd_put_32 (obfd, BLR, p), p += 4;
10898
10899 return p;
10900 }
10901
10902 static Elf_Internal_Rela *
10903 get_relocs (asection *sec, int count)
10904 {
10905 Elf_Internal_Rela *relocs;
10906 struct bfd_elf_section_data *elfsec_data;
10907
10908 elfsec_data = elf_section_data (sec);
10909 relocs = elfsec_data->relocs;
10910 if (relocs == NULL)
10911 {
10912 bfd_size_type relsize;
10913 relsize = sec->reloc_count * sizeof (*relocs);
10914 relocs = bfd_alloc (sec->owner, relsize);
10915 if (relocs == NULL)
10916 return NULL;
10917 elfsec_data->relocs = relocs;
10918 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10919 sizeof (Elf_Internal_Shdr));
10920 if (elfsec_data->rela.hdr == NULL)
10921 return NULL;
10922 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10923 * sizeof (Elf64_External_Rela));
10924 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10925 sec->reloc_count = 0;
10926 }
10927 relocs += sec->reloc_count;
10928 sec->reloc_count += count;
10929 return relocs;
10930 }
10931
10932 static bfd_vma
10933 get_r2off (struct bfd_link_info *info,
10934 struct ppc_stub_hash_entry *stub_entry)
10935 {
10936 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10937 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
10938
10939 if (r2off == 0)
10940 {
10941 /* Support linking -R objects. Get the toc pointer from the
10942 opd entry. */
10943 char buf[8];
10944 if (!htab->opd_abi)
10945 return r2off;
10946 asection *opd = stub_entry->h->elf.root.u.def.section;
10947 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10948
10949 if (strcmp (opd->name, ".opd") != 0
10950 || opd->reloc_count != 0)
10951 {
10952 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%pT'\n"),
10953 stub_entry->h->elf.root.root.string);
10954 bfd_set_error (bfd_error_bad_value);
10955 return (bfd_vma) -1;
10956 }
10957 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10958 return (bfd_vma) -1;
10959 r2off = bfd_get_64 (opd->owner, buf);
10960 r2off -= elf_gp (info->output_bfd);
10961 }
10962 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
10963 return r2off;
10964 }
10965
10966 static bfd_boolean
10967 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10968 {
10969 struct ppc_stub_hash_entry *stub_entry;
10970 struct ppc_branch_hash_entry *br_entry;
10971 struct bfd_link_info *info;
10972 struct ppc_link_hash_table *htab;
10973 bfd_byte *loc;
10974 bfd_byte *p;
10975 bfd_vma dest, off;
10976 Elf_Internal_Rela *r;
10977 asection *plt;
10978
10979 /* Massage our args to the form they really have. */
10980 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10981 info = in_arg;
10982
10983 htab = ppc_hash_table (info);
10984 if (htab == NULL)
10985 return FALSE;
10986
10987 /* Make a note of the offset within the stubs for this entry. */
10988 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10989 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
10990
10991 htab->stub_count[stub_entry->stub_type - 1] += 1;
10992 switch (stub_entry->stub_type)
10993 {
10994 case ppc_stub_long_branch:
10995 case ppc_stub_long_branch_r2off:
10996 /* Branches are relative. This is where we are going to. */
10997 dest = (stub_entry->target_value
10998 + stub_entry->target_section->output_offset
10999 + stub_entry->target_section->output_section->vma);
11000 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11001 off = dest;
11002
11003 /* And this is where we are coming from. */
11004 off -= (stub_entry->stub_offset
11005 + stub_entry->group->stub_sec->output_offset
11006 + stub_entry->group->stub_sec->output_section->vma);
11007
11008 p = loc;
11009 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11010 {
11011 bfd_vma r2off = get_r2off (info, stub_entry);
11012
11013 if (r2off == (bfd_vma) -1)
11014 {
11015 htab->stub_error = TRUE;
11016 return FALSE;
11017 }
11018 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11019 p += 4;
11020 if (PPC_HA (r2off) != 0)
11021 {
11022 bfd_put_32 (htab->params->stub_bfd,
11023 ADDIS_R2_R2 | PPC_HA (r2off), p);
11024 p += 4;
11025 }
11026 if (PPC_LO (r2off) != 0)
11027 {
11028 bfd_put_32 (htab->params->stub_bfd,
11029 ADDI_R2_R2 | PPC_LO (r2off), p);
11030 p += 4;
11031 }
11032 off -= p - loc;
11033 }
11034 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), p);
11035 p += 4;
11036
11037 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
11038 {
11039 _bfd_error_handler
11040 (_("long branch stub `%s' offset overflow"),
11041 stub_entry->root.string);
11042 htab->stub_error = TRUE;
11043 return FALSE;
11044 }
11045
11046 if (info->emitrelocations)
11047 {
11048 r = get_relocs (stub_entry->group->stub_sec, 1);
11049 if (r == NULL)
11050 return FALSE;
11051 r->r_offset = p - 4 - stub_entry->group->stub_sec->contents;
11052 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
11053 r->r_addend = dest;
11054 if (stub_entry->h != NULL)
11055 {
11056 struct elf_link_hash_entry **hashes;
11057 unsigned long symndx;
11058 struct ppc_link_hash_entry *h;
11059
11060 hashes = elf_sym_hashes (htab->params->stub_bfd);
11061 if (hashes == NULL)
11062 {
11063 bfd_size_type hsize;
11064
11065 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
11066 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
11067 if (hashes == NULL)
11068 return FALSE;
11069 elf_sym_hashes (htab->params->stub_bfd) = hashes;
11070 htab->stub_globals = 1;
11071 }
11072 symndx = htab->stub_globals++;
11073 h = stub_entry->h;
11074 hashes[symndx] = &h->elf;
11075 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
11076 if (h->oh != NULL && h->oh->is_func)
11077 h = ppc_follow_link (h->oh);
11078 if (h->elf.root.u.def.section != stub_entry->target_section)
11079 /* H is an opd symbol. The addend must be zero. */
11080 r->r_addend = 0;
11081 else
11082 {
11083 off = (h->elf.root.u.def.value
11084 + h->elf.root.u.def.section->output_offset
11085 + h->elf.root.u.def.section->output_section->vma);
11086 r->r_addend -= off;
11087 }
11088 }
11089 }
11090 break;
11091
11092 case ppc_stub_plt_branch:
11093 case ppc_stub_plt_branch_r2off:
11094 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11095 stub_entry->root.string + 9,
11096 FALSE, FALSE);
11097 if (br_entry == NULL)
11098 {
11099 _bfd_error_handler (_("can't find branch stub `%s'"),
11100 stub_entry->root.string);
11101 htab->stub_error = TRUE;
11102 return FALSE;
11103 }
11104
11105 dest = (stub_entry->target_value
11106 + stub_entry->target_section->output_offset
11107 + stub_entry->target_section->output_section->vma);
11108 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11109 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11110
11111 bfd_put_64 (htab->brlt->owner, dest,
11112 htab->brlt->contents + br_entry->offset);
11113
11114 if (br_entry->iter == htab->stub_iteration)
11115 {
11116 br_entry->iter = 0;
11117
11118 if (htab->relbrlt != NULL)
11119 {
11120 /* Create a reloc for the branch lookup table entry. */
11121 Elf_Internal_Rela rela;
11122 bfd_byte *rl;
11123
11124 rela.r_offset = (br_entry->offset
11125 + htab->brlt->output_offset
11126 + htab->brlt->output_section->vma);
11127 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
11128 rela.r_addend = dest;
11129
11130 rl = htab->relbrlt->contents;
11131 rl += (htab->relbrlt->reloc_count++
11132 * sizeof (Elf64_External_Rela));
11133 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
11134 }
11135 else if (info->emitrelocations)
11136 {
11137 r = get_relocs (htab->brlt, 1);
11138 if (r == NULL)
11139 return FALSE;
11140 /* brlt, being SEC_LINKER_CREATED does not go through the
11141 normal reloc processing. Symbols and offsets are not
11142 translated from input file to output file form, so
11143 set up the offset per the output file. */
11144 r->r_offset = (br_entry->offset
11145 + htab->brlt->output_offset
11146 + htab->brlt->output_section->vma);
11147 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
11148 r->r_addend = dest;
11149 }
11150 }
11151
11152 dest = (br_entry->offset
11153 + htab->brlt->output_offset
11154 + htab->brlt->output_section->vma);
11155
11156 off = (dest
11157 - elf_gp (info->output_bfd)
11158 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11159
11160 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11161 {
11162 info->callbacks->einfo
11163 (_("%P: linkage table error against `%pT'\n"),
11164 stub_entry->root.string);
11165 bfd_set_error (bfd_error_bad_value);
11166 htab->stub_error = TRUE;
11167 return FALSE;
11168 }
11169
11170 if (info->emitrelocations)
11171 {
11172 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
11173 if (r == NULL)
11174 return FALSE;
11175 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11176 if (bfd_big_endian (info->output_bfd))
11177 r[0].r_offset += 2;
11178 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
11179 r[0].r_offset += 4;
11180 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
11181 r[0].r_addend = dest;
11182 if (PPC_HA (off) != 0)
11183 {
11184 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
11185 r[1].r_offset = r[0].r_offset + 4;
11186 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
11187 r[1].r_addend = r[0].r_addend;
11188 }
11189 }
11190
11191 p = loc;
11192 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11193 {
11194 if (PPC_HA (off) != 0)
11195 {
11196 bfd_put_32 (htab->params->stub_bfd,
11197 ADDIS_R12_R2 | PPC_HA (off), p);
11198 p += 4;
11199 bfd_put_32 (htab->params->stub_bfd,
11200 LD_R12_0R12 | PPC_LO (off), p);
11201 }
11202 else
11203 bfd_put_32 (htab->params->stub_bfd,
11204 LD_R12_0R2 | PPC_LO (off), p);
11205 }
11206 else
11207 {
11208 bfd_vma r2off = get_r2off (info, stub_entry);
11209
11210 if (r2off == (bfd_vma) -1)
11211 {
11212 htab->stub_error = TRUE;
11213 return FALSE;
11214 }
11215
11216 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), p);
11217 p += 4;
11218 if (PPC_HA (off) != 0)
11219 {
11220 bfd_put_32 (htab->params->stub_bfd,
11221 ADDIS_R12_R2 | PPC_HA (off), p);
11222 p += 4;
11223 bfd_put_32 (htab->params->stub_bfd,
11224 LD_R12_0R12 | PPC_LO (off), p);
11225 }
11226 else
11227 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), p);
11228
11229 if (PPC_HA (r2off) != 0)
11230 {
11231 p += 4;
11232 bfd_put_32 (htab->params->stub_bfd,
11233 ADDIS_R2_R2 | PPC_HA (r2off), p);
11234 }
11235 if (PPC_LO (r2off) != 0)
11236 {
11237 p += 4;
11238 bfd_put_32 (htab->params->stub_bfd,
11239 ADDI_R2_R2 | PPC_LO (r2off), p);
11240 }
11241 }
11242 p += 4;
11243 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, p);
11244 p += 4;
11245 bfd_put_32 (htab->params->stub_bfd, BCTR, p);
11246 p += 4;
11247 break;
11248
11249 case ppc_stub_plt_call:
11250 case ppc_stub_plt_call_r2save:
11251 if (stub_entry->h != NULL
11252 && stub_entry->h->is_func_descriptor
11253 && stub_entry->h->oh != NULL)
11254 {
11255 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
11256
11257 /* If the old-ABI "dot-symbol" is undefined make it weak so
11258 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
11259 if (fh->elf.root.type == bfd_link_hash_undefined
11260 && (stub_entry->h->elf.root.type == bfd_link_hash_defined
11261 || stub_entry->h->elf.root.type == bfd_link_hash_defweak))
11262 fh->elf.root.type = bfd_link_hash_undefweak;
11263 }
11264
11265 /* Now build the stub. */
11266 dest = stub_entry->plt_ent->plt.offset & ~1;
11267 if (dest >= (bfd_vma) -2)
11268 abort ();
11269
11270 plt = htab->elf.splt;
11271 if (!htab->elf.dynamic_sections_created
11272 || stub_entry->h == NULL
11273 || stub_entry->h->elf.dynindx == -1)
11274 {
11275 if (stub_entry->symtype == STT_GNU_IFUNC)
11276 plt = htab->elf.iplt;
11277 else
11278 plt = htab->pltlocal;
11279 }
11280
11281 dest += plt->output_offset + plt->output_section->vma;
11282
11283 off = (dest
11284 - elf_gp (info->output_bfd)
11285 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11286
11287 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
11288 {
11289 info->callbacks->einfo
11290 /* xgettext:c-format */
11291 (_("%P: linkage table error against `%pT'\n"),
11292 stub_entry->h != NULL
11293 ? stub_entry->h->elf.root.root.string
11294 : "<local sym>");
11295 bfd_set_error (bfd_error_bad_value);
11296 htab->stub_error = TRUE;
11297 return FALSE;
11298 }
11299
11300 if (htab->params->plt_stub_align != 0)
11301 {
11302 unsigned pad = plt_stub_pad (htab, stub_entry, off);
11303
11304 stub_entry->group->stub_sec->size += pad;
11305 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
11306 loc += pad;
11307 }
11308
11309 r = NULL;
11310 if (info->emitrelocations)
11311 {
11312 r = get_relocs (stub_entry->group->stub_sec,
11313 ((PPC_HA (off) != 0)
11314 + (htab->opd_abi
11315 ? 2 + (htab->params->plt_static_chain
11316 && PPC_HA (off + 16) == PPC_HA (off))
11317 : 1)));
11318 if (r == NULL)
11319 return FALSE;
11320 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11321 if (bfd_big_endian (info->output_bfd))
11322 r[0].r_offset += 2;
11323 r[0].r_addend = dest;
11324 }
11325 if (stub_entry->h != NULL
11326 && (stub_entry->h == htab->tls_get_addr_fd
11327 || stub_entry->h == htab->tls_get_addr)
11328 && htab->params->tls_get_addr_opt)
11329 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
11330 else
11331 p = build_plt_stub (htab, stub_entry, loc, off, r);
11332 break;
11333
11334 case ppc_stub_save_res:
11335 return TRUE;
11336
11337 default:
11338 BFD_FAIL ();
11339 return FALSE;
11340 }
11341
11342 stub_entry->group->stub_sec->size += p - loc;
11343
11344 if (htab->params->emit_stub_syms)
11345 {
11346 struct elf_link_hash_entry *h;
11347 size_t len1, len2;
11348 char *name;
11349 const char *const stub_str[] = { "long_branch",
11350 "long_branch_r2off",
11351 "plt_branch",
11352 "plt_branch_r2off",
11353 "plt_call",
11354 "plt_call" };
11355
11356 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11357 len2 = strlen (stub_entry->root.string);
11358 name = bfd_malloc (len1 + len2 + 2);
11359 if (name == NULL)
11360 return FALSE;
11361 memcpy (name, stub_entry->root.string, 9);
11362 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11363 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11364 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
11365 if (h == NULL)
11366 return FALSE;
11367 if (h->root.type == bfd_link_hash_new)
11368 {
11369 h->root.type = bfd_link_hash_defined;
11370 h->root.u.def.section = stub_entry->group->stub_sec;
11371 h->root.u.def.value = stub_entry->stub_offset;
11372 h->ref_regular = 1;
11373 h->def_regular = 1;
11374 h->ref_regular_nonweak = 1;
11375 h->forced_local = 1;
11376 h->non_elf = 0;
11377 h->root.linker_def = 1;
11378 }
11379 }
11380
11381 return TRUE;
11382 }
11383
11384 /* As above, but don't actually build the stub. Just bump offset so
11385 we know stub section sizes, and select plt_branch stubs where
11386 long_branch stubs won't do. */
11387
11388 static bfd_boolean
11389 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
11390 {
11391 struct ppc_stub_hash_entry *stub_entry;
11392 struct bfd_link_info *info;
11393 struct ppc_link_hash_table *htab;
11394 bfd_vma off;
11395 int size;
11396
11397 /* Massage our args to the form they really have. */
11398 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
11399 info = in_arg;
11400
11401 htab = ppc_hash_table (info);
11402 if (htab == NULL)
11403 return FALSE;
11404
11405 if (stub_entry->h != NULL
11406 && stub_entry->h->save_res
11407 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11408 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11409 {
11410 /* Don't make stubs to out-of-line register save/restore
11411 functions. Instead, emit copies of the functions. */
11412 stub_entry->group->needs_save_res = 1;
11413 stub_entry->stub_type = ppc_stub_save_res;
11414 return TRUE;
11415 }
11416
11417 if (stub_entry->stub_type == ppc_stub_plt_call
11418 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11419 {
11420 asection *plt;
11421 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11422 if (off >= (bfd_vma) -2)
11423 abort ();
11424 plt = htab->elf.splt;
11425 if (!htab->elf.dynamic_sections_created
11426 || stub_entry->h == NULL
11427 || stub_entry->h->elf.dynindx == -1)
11428 {
11429 if (stub_entry->symtype == STT_GNU_IFUNC)
11430 plt = htab->elf.iplt;
11431 else
11432 plt = htab->pltlocal;
11433 }
11434 off += (plt->output_offset
11435 + plt->output_section->vma
11436 - elf_gp (info->output_bfd)
11437 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11438
11439 size = plt_stub_size (htab, stub_entry, off);
11440 if (stub_entry->h != NULL
11441 && (stub_entry->h == htab->tls_get_addr_fd
11442 || stub_entry->h == htab->tls_get_addr)
11443 && htab->params->tls_get_addr_opt
11444 && (ALWAYS_EMIT_R2SAVE
11445 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
11446 stub_entry->group->tls_get_addr_opt_bctrl
11447 = stub_entry->group->stub_sec->size + size - 5 * 4;
11448
11449 if (htab->params->plt_stub_align)
11450 size += plt_stub_pad (htab, stub_entry, off);
11451 if (info->emitrelocations)
11452 {
11453 stub_entry->group->stub_sec->reloc_count
11454 += ((PPC_HA (off) != 0)
11455 + (htab->opd_abi
11456 ? 2 + (htab->params->plt_static_chain
11457 && PPC_HA (off + 16) == PPC_HA (off))
11458 : 1));
11459 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11460 }
11461 }
11462 else
11463 {
11464 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11465 variants. */
11466 bfd_vma r2off = 0;
11467 bfd_vma local_off = 0;
11468
11469 off = (stub_entry->target_value
11470 + stub_entry->target_section->output_offset
11471 + stub_entry->target_section->output_section->vma);
11472 off -= (stub_entry->group->stub_sec->size
11473 + stub_entry->group->stub_sec->output_offset
11474 + stub_entry->group->stub_sec->output_section->vma);
11475
11476 /* Reset the stub type from the plt variant in case we now
11477 can reach with a shorter stub. */
11478 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11479 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11480
11481 size = 4;
11482 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11483 {
11484 r2off = get_r2off (info, stub_entry);
11485 if (r2off == (bfd_vma) -1)
11486 {
11487 htab->stub_error = TRUE;
11488 return FALSE;
11489 }
11490 size = 8;
11491 if (PPC_HA (r2off) != 0)
11492 size += 4;
11493 if (PPC_LO (r2off) != 0)
11494 size += 4;
11495 off -= size - 4;
11496 }
11497
11498 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11499
11500 /* If the branch offset is too big, use a ppc_stub_plt_branch.
11501 Do the same for -R objects without function descriptors. */
11502 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11503 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11504 && r2off == 0
11505 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
11506 {
11507 struct ppc_branch_hash_entry *br_entry;
11508
11509 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11510 stub_entry->root.string + 9,
11511 TRUE, FALSE);
11512 if (br_entry == NULL)
11513 {
11514 _bfd_error_handler (_("can't build branch stub `%s'"),
11515 stub_entry->root.string);
11516 htab->stub_error = TRUE;
11517 return FALSE;
11518 }
11519
11520 if (br_entry->iter != htab->stub_iteration)
11521 {
11522 br_entry->iter = htab->stub_iteration;
11523 br_entry->offset = htab->brlt->size;
11524 htab->brlt->size += 8;
11525
11526 if (htab->relbrlt != NULL)
11527 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11528 else if (info->emitrelocations)
11529 {
11530 htab->brlt->reloc_count += 1;
11531 htab->brlt->flags |= SEC_RELOC;
11532 }
11533 }
11534
11535 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11536 off = (br_entry->offset
11537 + htab->brlt->output_offset
11538 + htab->brlt->output_section->vma
11539 - elf_gp (info->output_bfd)
11540 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11541
11542 if (info->emitrelocations)
11543 {
11544 stub_entry->group->stub_sec->reloc_count
11545 += 1 + (PPC_HA (off) != 0);
11546 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11547 }
11548
11549 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11550 {
11551 size = 12;
11552 if (PPC_HA (off) != 0)
11553 size = 16;
11554 }
11555 else
11556 {
11557 size = 16;
11558 if (PPC_HA (off) != 0)
11559 size += 4;
11560
11561 if (PPC_HA (r2off) != 0)
11562 size += 4;
11563 if (PPC_LO (r2off) != 0)
11564 size += 4;
11565 }
11566 }
11567 else if (info->emitrelocations)
11568 {
11569 stub_entry->group->stub_sec->reloc_count += 1;
11570 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11571 }
11572 }
11573
11574 stub_entry->group->stub_sec->size += size;
11575 return TRUE;
11576 }
11577
11578 /* Set up various things so that we can make a list of input sections
11579 for each output section included in the link. Returns -1 on error,
11580 0 when no stubs will be needed, and 1 on success. */
11581
11582 int
11583 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11584 {
11585 unsigned int id;
11586 bfd_size_type amt;
11587 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11588
11589 if (htab == NULL)
11590 return -1;
11591
11592 htab->sec_info_arr_size = bfd_get_next_section_id ();
11593 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11594 htab->sec_info = bfd_zmalloc (amt);
11595 if (htab->sec_info == NULL)
11596 return -1;
11597
11598 /* Set toc_off for com, und, abs and ind sections. */
11599 for (id = 0; id < 3; id++)
11600 htab->sec_info[id].toc_off = TOC_BASE_OFF;
11601
11602 return 1;
11603 }
11604
11605 /* Set up for first pass at multitoc partitioning. */
11606
11607 void
11608 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11609 {
11610 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11611
11612 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11613 htab->toc_bfd = NULL;
11614 htab->toc_first_sec = NULL;
11615 }
11616
11617 /* The linker repeatedly calls this function for each TOC input section
11618 and linker generated GOT section. Group input bfds such that the toc
11619 within a group is less than 64k in size. */
11620
11621 bfd_boolean
11622 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11623 {
11624 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11625 bfd_vma addr, off, limit;
11626
11627 if (htab == NULL)
11628 return FALSE;
11629
11630 if (!htab->second_toc_pass)
11631 {
11632 /* Keep track of the first .toc or .got section for this input bfd. */
11633 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11634
11635 if (new_bfd)
11636 {
11637 htab->toc_bfd = isec->owner;
11638 htab->toc_first_sec = isec;
11639 }
11640
11641 addr = isec->output_offset + isec->output_section->vma;
11642 off = addr - htab->toc_curr;
11643 limit = 0x80008000;
11644 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11645 limit = 0x10000;
11646 if (off + isec->size > limit)
11647 {
11648 addr = (htab->toc_first_sec->output_offset
11649 + htab->toc_first_sec->output_section->vma);
11650 htab->toc_curr = addr;
11651 htab->toc_curr &= -TOC_BASE_ALIGN;
11652 }
11653
11654 /* toc_curr is the base address of this toc group. Set elf_gp
11655 for the input section to be the offset relative to the
11656 output toc base plus 0x8000. Making the input elf_gp an
11657 offset allows us to move the toc as a whole without
11658 recalculating input elf_gp. */
11659 off = htab->toc_curr - elf_gp (info->output_bfd);
11660 off += TOC_BASE_OFF;
11661
11662 /* Die if someone uses a linker script that doesn't keep input
11663 file .toc and .got together. */
11664 if (new_bfd
11665 && elf_gp (isec->owner) != 0
11666 && elf_gp (isec->owner) != off)
11667 return FALSE;
11668
11669 elf_gp (isec->owner) = off;
11670 return TRUE;
11671 }
11672
11673 /* During the second pass toc_first_sec points to the start of
11674 a toc group, and toc_curr is used to track the old elf_gp.
11675 We use toc_bfd to ensure we only look at each bfd once. */
11676 if (htab->toc_bfd == isec->owner)
11677 return TRUE;
11678 htab->toc_bfd = isec->owner;
11679
11680 if (htab->toc_first_sec == NULL
11681 || htab->toc_curr != elf_gp (isec->owner))
11682 {
11683 htab->toc_curr = elf_gp (isec->owner);
11684 htab->toc_first_sec = isec;
11685 }
11686 addr = (htab->toc_first_sec->output_offset
11687 + htab->toc_first_sec->output_section->vma);
11688 off = addr - elf_gp (info->output_bfd) + TOC_BASE_OFF;
11689 elf_gp (isec->owner) = off;
11690
11691 return TRUE;
11692 }
11693
11694 /* Called via elf_link_hash_traverse to merge GOT entries for global
11695 symbol H. */
11696
11697 static bfd_boolean
11698 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11699 {
11700 if (h->root.type == bfd_link_hash_indirect)
11701 return TRUE;
11702
11703 merge_got_entries (&h->got.glist);
11704
11705 return TRUE;
11706 }
11707
11708 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11709 symbol H. */
11710
11711 static bfd_boolean
11712 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11713 {
11714 struct got_entry *gent;
11715
11716 if (h->root.type == bfd_link_hash_indirect)
11717 return TRUE;
11718
11719 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11720 if (!gent->is_indirect)
11721 allocate_got (h, (struct bfd_link_info *) inf, gent);
11722 return TRUE;
11723 }
11724
11725 /* Called on the first multitoc pass after the last call to
11726 ppc64_elf_next_toc_section. This function removes duplicate GOT
11727 entries. */
11728
11729 bfd_boolean
11730 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11731 {
11732 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11733 struct bfd *ibfd, *ibfd2;
11734 bfd_boolean done_something;
11735
11736 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11737
11738 if (!htab->do_multi_toc)
11739 return FALSE;
11740
11741 /* Merge global sym got entries within a toc group. */
11742 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11743
11744 /* And tlsld_got. */
11745 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11746 {
11747 struct got_entry *ent, *ent2;
11748
11749 if (!is_ppc64_elf (ibfd))
11750 continue;
11751
11752 ent = ppc64_tlsld_got (ibfd);
11753 if (!ent->is_indirect
11754 && ent->got.offset != (bfd_vma) -1)
11755 {
11756 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
11757 {
11758 if (!is_ppc64_elf (ibfd2))
11759 continue;
11760
11761 ent2 = ppc64_tlsld_got (ibfd2);
11762 if (!ent2->is_indirect
11763 && ent2->got.offset != (bfd_vma) -1
11764 && elf_gp (ibfd2) == elf_gp (ibfd))
11765 {
11766 ent2->is_indirect = TRUE;
11767 ent2->got.ent = ent;
11768 }
11769 }
11770 }
11771 }
11772
11773 /* Zap sizes of got sections. */
11774 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11775 htab->elf.irelplt->size -= htab->got_reli_size;
11776 htab->got_reli_size = 0;
11777
11778 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11779 {
11780 asection *got, *relgot;
11781
11782 if (!is_ppc64_elf (ibfd))
11783 continue;
11784
11785 got = ppc64_elf_tdata (ibfd)->got;
11786 if (got != NULL)
11787 {
11788 got->rawsize = got->size;
11789 got->size = 0;
11790 relgot = ppc64_elf_tdata (ibfd)->relgot;
11791 relgot->rawsize = relgot->size;
11792 relgot->size = 0;
11793 }
11794 }
11795
11796 /* Now reallocate the got, local syms first. We don't need to
11797 allocate section contents again since we never increase size. */
11798 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11799 {
11800 struct got_entry **lgot_ents;
11801 struct got_entry **end_lgot_ents;
11802 struct plt_entry **local_plt;
11803 struct plt_entry **end_local_plt;
11804 unsigned char *lgot_masks;
11805 bfd_size_type locsymcount;
11806 Elf_Internal_Shdr *symtab_hdr;
11807 asection *s;
11808
11809 if (!is_ppc64_elf (ibfd))
11810 continue;
11811
11812 lgot_ents = elf_local_got_ents (ibfd);
11813 if (!lgot_ents)
11814 continue;
11815
11816 symtab_hdr = &elf_symtab_hdr (ibfd);
11817 locsymcount = symtab_hdr->sh_info;
11818 end_lgot_ents = lgot_ents + locsymcount;
11819 local_plt = (struct plt_entry **) end_lgot_ents;
11820 end_local_plt = local_plt + locsymcount;
11821 lgot_masks = (unsigned char *) end_local_plt;
11822 s = ppc64_elf_tdata (ibfd)->got;
11823 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11824 {
11825 struct got_entry *ent;
11826
11827 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11828 {
11829 unsigned int ent_size = 8;
11830 unsigned int rel_size = sizeof (Elf64_External_Rela);
11831
11832 ent->got.offset = s->size;
11833 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11834 {
11835 ent_size *= 2;
11836 rel_size *= 2;
11837 }
11838 s->size += ent_size;
11839 if ((*lgot_masks & (TLS_TLS | PLT_IFUNC)) == PLT_IFUNC)
11840 {
11841 htab->elf.irelplt->size += rel_size;
11842 htab->got_reli_size += rel_size;
11843 }
11844 else if (bfd_link_pic (info)
11845 && !((ent->tls_type & TLS_TPREL) != 0
11846 && bfd_link_executable (info)))
11847 {
11848 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11849 srel->size += rel_size;
11850 }
11851 }
11852 }
11853 }
11854
11855 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11856
11857 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11858 {
11859 struct got_entry *ent;
11860
11861 if (!is_ppc64_elf (ibfd))
11862 continue;
11863
11864 ent = ppc64_tlsld_got (ibfd);
11865 if (!ent->is_indirect
11866 && ent->got.offset != (bfd_vma) -1)
11867 {
11868 asection *s = ppc64_elf_tdata (ibfd)->got;
11869 ent->got.offset = s->size;
11870 s->size += 16;
11871 if (bfd_link_pic (info))
11872 {
11873 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11874 srel->size += sizeof (Elf64_External_Rela);
11875 }
11876 }
11877 }
11878
11879 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11880 if (!done_something)
11881 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11882 {
11883 asection *got;
11884
11885 if (!is_ppc64_elf (ibfd))
11886 continue;
11887
11888 got = ppc64_elf_tdata (ibfd)->got;
11889 if (got != NULL)
11890 {
11891 done_something = got->rawsize != got->size;
11892 if (done_something)
11893 break;
11894 }
11895 }
11896
11897 if (done_something)
11898 (*htab->params->layout_sections_again) ();
11899
11900 /* Set up for second pass over toc sections to recalculate elf_gp
11901 on input sections. */
11902 htab->toc_bfd = NULL;
11903 htab->toc_first_sec = NULL;
11904 htab->second_toc_pass = TRUE;
11905 return done_something;
11906 }
11907
11908 /* Called after second pass of multitoc partitioning. */
11909
11910 void
11911 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11912 {
11913 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11914
11915 /* After the second pass, toc_curr tracks the TOC offset used
11916 for code sections below in ppc64_elf_next_input_section. */
11917 htab->toc_curr = TOC_BASE_OFF;
11918 }
11919
11920 /* No toc references were found in ISEC. If the code in ISEC makes no
11921 calls, then there's no need to use toc adjusting stubs when branching
11922 into ISEC. Actually, indirect calls from ISEC are OK as they will
11923 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11924 needed, and 2 if a cyclical call-graph was found but no other reason
11925 for a stub was detected. If called from the top level, a return of
11926 2 means the same as a return of 0. */
11927
11928 static int
11929 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11930 {
11931 int ret;
11932
11933 /* Mark this section as checked. */
11934 isec->call_check_done = 1;
11935
11936 /* We know none of our code bearing sections will need toc stubs. */
11937 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11938 return 0;
11939
11940 if (isec->size == 0)
11941 return 0;
11942
11943 if (isec->output_section == NULL)
11944 return 0;
11945
11946 ret = 0;
11947 if (isec->reloc_count != 0)
11948 {
11949 Elf_Internal_Rela *relstart, *rel;
11950 Elf_Internal_Sym *local_syms;
11951 struct ppc_link_hash_table *htab;
11952
11953 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11954 info->keep_memory);
11955 if (relstart == NULL)
11956 return -1;
11957
11958 /* Look for branches to outside of this section. */
11959 local_syms = NULL;
11960 htab = ppc_hash_table (info);
11961 if (htab == NULL)
11962 return -1;
11963
11964 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11965 {
11966 enum elf_ppc64_reloc_type r_type;
11967 unsigned long r_symndx;
11968 struct elf_link_hash_entry *h;
11969 struct ppc_link_hash_entry *eh;
11970 Elf_Internal_Sym *sym;
11971 asection *sym_sec;
11972 struct _opd_sec_data *opd;
11973 bfd_vma sym_value;
11974 bfd_vma dest;
11975
11976 r_type = ELF64_R_TYPE (rel->r_info);
11977 if (r_type != R_PPC64_REL24
11978 && r_type != R_PPC64_REL14
11979 && r_type != R_PPC64_REL14_BRTAKEN
11980 && r_type != R_PPC64_REL14_BRNTAKEN
11981 && r_type != R_PPC64_PLTCALL)
11982 continue;
11983
11984 r_symndx = ELF64_R_SYM (rel->r_info);
11985 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11986 isec->owner))
11987 {
11988 ret = -1;
11989 break;
11990 }
11991
11992 /* Calls to dynamic lib functions go through a plt call stub
11993 that uses r2. */
11994 eh = (struct ppc_link_hash_entry *) h;
11995 if (eh != NULL
11996 && (eh->elf.plt.plist != NULL
11997 || (eh->oh != NULL
11998 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11999 {
12000 ret = 1;
12001 break;
12002 }
12003
12004 if (sym_sec == NULL)
12005 /* Ignore other undefined symbols. */
12006 continue;
12007
12008 /* Assume branches to other sections not included in the
12009 link need stubs too, to cover -R and absolute syms. */
12010 if (sym_sec->output_section == NULL)
12011 {
12012 ret = 1;
12013 break;
12014 }
12015
12016 if (h == NULL)
12017 sym_value = sym->st_value;
12018 else
12019 {
12020 if (h->root.type != bfd_link_hash_defined
12021 && h->root.type != bfd_link_hash_defweak)
12022 abort ();
12023 sym_value = h->root.u.def.value;
12024 }
12025 sym_value += rel->r_addend;
12026
12027 /* If this branch reloc uses an opd sym, find the code section. */
12028 opd = get_opd_info (sym_sec);
12029 if (opd != NULL)
12030 {
12031 if (h == NULL && opd->adjust != NULL)
12032 {
12033 long adjust;
12034
12035 adjust = opd->adjust[OPD_NDX (sym_value)];
12036 if (adjust == -1)
12037 /* Assume deleted functions won't ever be called. */
12038 continue;
12039 sym_value += adjust;
12040 }
12041
12042 dest = opd_entry_value (sym_sec, sym_value,
12043 &sym_sec, NULL, FALSE);
12044 if (dest == (bfd_vma) -1)
12045 continue;
12046 }
12047 else
12048 dest = (sym_value
12049 + sym_sec->output_offset
12050 + sym_sec->output_section->vma);
12051
12052 /* Ignore branch to self. */
12053 if (sym_sec == isec)
12054 continue;
12055
12056 /* If the called function uses the toc, we need a stub. */
12057 if (sym_sec->has_toc_reloc
12058 || sym_sec->makes_toc_func_call)
12059 {
12060 ret = 1;
12061 break;
12062 }
12063
12064 /* Assume any branch that needs a long branch stub might in fact
12065 need a plt_branch stub. A plt_branch stub uses r2. */
12066 else if (dest - (isec->output_offset
12067 + isec->output_section->vma
12068 + rel->r_offset) + (1 << 25)
12069 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
12070 ? h->other
12071 : sym->st_other))
12072 {
12073 ret = 1;
12074 break;
12075 }
12076
12077 /* If calling back to a section in the process of being
12078 tested, we can't say for sure that no toc adjusting stubs
12079 are needed, so don't return zero. */
12080 else if (sym_sec->call_check_in_progress)
12081 ret = 2;
12082
12083 /* Branches to another section that itself doesn't have any TOC
12084 references are OK. Recursively call ourselves to check. */
12085 else if (!sym_sec->call_check_done)
12086 {
12087 int recur;
12088
12089 /* Mark current section as indeterminate, so that other
12090 sections that call back to current won't be marked as
12091 known. */
12092 isec->call_check_in_progress = 1;
12093 recur = toc_adjusting_stub_needed (info, sym_sec);
12094 isec->call_check_in_progress = 0;
12095
12096 if (recur != 0)
12097 {
12098 ret = recur;
12099 if (recur != 2)
12100 break;
12101 }
12102 }
12103 }
12104
12105 if (local_syms != NULL
12106 && (elf_symtab_hdr (isec->owner).contents
12107 != (unsigned char *) local_syms))
12108 free (local_syms);
12109 if (elf_section_data (isec)->relocs != relstart)
12110 free (relstart);
12111 }
12112
12113 if ((ret & 1) == 0
12114 && isec->map_head.s != NULL
12115 && (strcmp (isec->output_section->name, ".init") == 0
12116 || strcmp (isec->output_section->name, ".fini") == 0))
12117 {
12118 if (isec->map_head.s->has_toc_reloc
12119 || isec->map_head.s->makes_toc_func_call)
12120 ret = 1;
12121 else if (!isec->map_head.s->call_check_done)
12122 {
12123 int recur;
12124 isec->call_check_in_progress = 1;
12125 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
12126 isec->call_check_in_progress = 0;
12127 if (recur != 0)
12128 ret = recur;
12129 }
12130 }
12131
12132 if (ret == 1)
12133 isec->makes_toc_func_call = 1;
12134
12135 return ret;
12136 }
12137
12138 /* The linker repeatedly calls this function for each input section,
12139 in the order that input sections are linked into output sections.
12140 Build lists of input sections to determine groupings between which
12141 we may insert linker stubs. */
12142
12143 bfd_boolean
12144 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
12145 {
12146 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12147
12148 if (htab == NULL)
12149 return FALSE;
12150
12151 if ((isec->output_section->flags & SEC_CODE) != 0
12152 && isec->output_section->id < htab->sec_info_arr_size)
12153 {
12154 /* This happens to make the list in reverse order,
12155 which is what we want. */
12156 htab->sec_info[isec->id].u.list
12157 = htab->sec_info[isec->output_section->id].u.list;
12158 htab->sec_info[isec->output_section->id].u.list = isec;
12159 }
12160
12161 if (htab->multi_toc_needed)
12162 {
12163 /* Analyse sections that aren't already flagged as needing a
12164 valid toc pointer. Exclude .fixup for the linux kernel.
12165 .fixup contains branches, but only back to the function that
12166 hit an exception. */
12167 if (!(isec->has_toc_reloc
12168 || (isec->flags & SEC_CODE) == 0
12169 || strcmp (isec->name, ".fixup") == 0
12170 || isec->call_check_done))
12171 {
12172 if (toc_adjusting_stub_needed (info, isec) < 0)
12173 return FALSE;
12174 }
12175 /* Make all sections use the TOC assigned for this object file.
12176 This will be wrong for pasted sections; We fix that in
12177 check_pasted_section(). */
12178 if (elf_gp (isec->owner) != 0)
12179 htab->toc_curr = elf_gp (isec->owner);
12180 }
12181
12182 htab->sec_info[isec->id].toc_off = htab->toc_curr;
12183 return TRUE;
12184 }
12185
12186 /* Check that all .init and .fini sections use the same toc, if they
12187 have toc relocs. */
12188
12189 static bfd_boolean
12190 check_pasted_section (struct bfd_link_info *info, const char *name)
12191 {
12192 asection *o = bfd_get_section_by_name (info->output_bfd, name);
12193
12194 if (o != NULL)
12195 {
12196 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12197 bfd_vma toc_off = 0;
12198 asection *i;
12199
12200 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12201 if (i->has_toc_reloc)
12202 {
12203 if (toc_off == 0)
12204 toc_off = htab->sec_info[i->id].toc_off;
12205 else if (toc_off != htab->sec_info[i->id].toc_off)
12206 return FALSE;
12207 }
12208
12209 if (toc_off == 0)
12210 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12211 if (i->makes_toc_func_call)
12212 {
12213 toc_off = htab->sec_info[i->id].toc_off;
12214 break;
12215 }
12216
12217 /* Make sure the whole pasted function uses the same toc offset. */
12218 if (toc_off != 0)
12219 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
12220 htab->sec_info[i->id].toc_off = toc_off;
12221 }
12222 return TRUE;
12223 }
12224
12225 bfd_boolean
12226 ppc64_elf_check_init_fini (struct bfd_link_info *info)
12227 {
12228 return (check_pasted_section (info, ".init")
12229 & check_pasted_section (info, ".fini"));
12230 }
12231
12232 /* See whether we can group stub sections together. Grouping stub
12233 sections may result in fewer stubs. More importantly, we need to
12234 put all .init* and .fini* stubs at the beginning of the .init or
12235 .fini output sections respectively, because glibc splits the
12236 _init and _fini functions into multiple parts. Putting a stub in
12237 the middle of a function is not a good idea. */
12238
12239 static bfd_boolean
12240 group_sections (struct bfd_link_info *info,
12241 bfd_size_type stub_group_size,
12242 bfd_boolean stubs_always_before_branch)
12243 {
12244 struct ppc_link_hash_table *htab;
12245 asection *osec;
12246 bfd_boolean suppress_size_errors;
12247
12248 htab = ppc_hash_table (info);
12249 if (htab == NULL)
12250 return FALSE;
12251
12252 suppress_size_errors = FALSE;
12253 if (stub_group_size == 1)
12254 {
12255 /* Default values. */
12256 if (stubs_always_before_branch)
12257 stub_group_size = 0x1e00000;
12258 else
12259 stub_group_size = 0x1c00000;
12260 suppress_size_errors = TRUE;
12261 }
12262
12263 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
12264 {
12265 asection *tail;
12266
12267 if (osec->id >= htab->sec_info_arr_size)
12268 continue;
12269
12270 tail = htab->sec_info[osec->id].u.list;
12271 while (tail != NULL)
12272 {
12273 asection *curr;
12274 asection *prev;
12275 bfd_size_type total;
12276 bfd_boolean big_sec;
12277 bfd_vma curr_toc;
12278 struct map_stub *group;
12279 bfd_size_type group_size;
12280
12281 curr = tail;
12282 total = tail->size;
12283 group_size = (ppc64_elf_section_data (tail) != NULL
12284 && ppc64_elf_section_data (tail)->has_14bit_branch
12285 ? stub_group_size >> 10 : stub_group_size);
12286
12287 big_sec = total > group_size;
12288 if (big_sec && !suppress_size_errors)
12289 /* xgettext:c-format */
12290 _bfd_error_handler (_("%pB section %pA exceeds stub group size"),
12291 tail->owner, tail);
12292 curr_toc = htab->sec_info[tail->id].toc_off;
12293
12294 while ((prev = htab->sec_info[curr->id].u.list) != NULL
12295 && ((total += curr->output_offset - prev->output_offset)
12296 < (ppc64_elf_section_data (prev) != NULL
12297 && ppc64_elf_section_data (prev)->has_14bit_branch
12298 ? (group_size = stub_group_size >> 10) : group_size))
12299 && htab->sec_info[prev->id].toc_off == curr_toc)
12300 curr = prev;
12301
12302 /* OK, the size from the start of CURR to the end is less
12303 than group_size and thus can be handled by one stub
12304 section. (or the tail section is itself larger than
12305 group_size, in which case we may be toast.) We should
12306 really be keeping track of the total size of stubs added
12307 here, as stubs contribute to the final output section
12308 size. That's a little tricky, and this way will only
12309 break if stubs added make the total size more than 2^25,
12310 ie. for the default stub_group_size, if stubs total more
12311 than 2097152 bytes, or nearly 75000 plt call stubs. */
12312 group = bfd_alloc (curr->owner, sizeof (*group));
12313 if (group == NULL)
12314 return FALSE;
12315 group->link_sec = curr;
12316 group->stub_sec = NULL;
12317 group->needs_save_res = 0;
12318 group->tls_get_addr_opt_bctrl = -1u;
12319 group->next = htab->group;
12320 htab->group = group;
12321 do
12322 {
12323 prev = htab->sec_info[tail->id].u.list;
12324 /* Set up this stub group. */
12325 htab->sec_info[tail->id].u.group = group;
12326 }
12327 while (tail != curr && (tail = prev) != NULL);
12328
12329 /* But wait, there's more! Input sections up to group_size
12330 bytes before the stub section can be handled by it too.
12331 Don't do this if we have a really large section after the
12332 stubs, as adding more stubs increases the chance that
12333 branches may not reach into the stub section. */
12334 if (!stubs_always_before_branch && !big_sec)
12335 {
12336 total = 0;
12337 while (prev != NULL
12338 && ((total += tail->output_offset - prev->output_offset)
12339 < (ppc64_elf_section_data (prev) != NULL
12340 && ppc64_elf_section_data (prev)->has_14bit_branch
12341 ? (group_size = stub_group_size >> 10) : group_size))
12342 && htab->sec_info[prev->id].toc_off == curr_toc)
12343 {
12344 tail = prev;
12345 prev = htab->sec_info[tail->id].u.list;
12346 htab->sec_info[tail->id].u.group = group;
12347 }
12348 }
12349 tail = prev;
12350 }
12351 }
12352 return TRUE;
12353 }
12354
12355 static const unsigned char glink_eh_frame_cie[] =
12356 {
12357 0, 0, 0, 16, /* length. */
12358 0, 0, 0, 0, /* id. */
12359 1, /* CIE version. */
12360 'z', 'R', 0, /* Augmentation string. */
12361 4, /* Code alignment. */
12362 0x78, /* Data alignment. */
12363 65, /* RA reg. */
12364 1, /* Augmentation size. */
12365 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
12366 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
12367 };
12368
12369 static size_t
12370 stub_eh_frame_size (struct map_stub *group, size_t align)
12371 {
12372 size_t this_size = 17;
12373 if (group->tls_get_addr_opt_bctrl != -1u)
12374 {
12375 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12376 if (to_bctrl < 64)
12377 this_size += 1;
12378 else if (to_bctrl < 256)
12379 this_size += 2;
12380 else if (to_bctrl < 65536)
12381 this_size += 3;
12382 else
12383 this_size += 5;
12384 this_size += 6;
12385 }
12386 this_size = (this_size + align - 1) & -align;
12387 return this_size;
12388 }
12389
12390 /* Stripping output sections is normally done before dynamic section
12391 symbols have been allocated. This function is called later, and
12392 handles cases like htab->brlt which is mapped to its own output
12393 section. */
12394
12395 static void
12396 maybe_strip_output (struct bfd_link_info *info, asection *isec)
12397 {
12398 if (isec->size == 0
12399 && isec->output_section->size == 0
12400 && !(isec->output_section->flags & SEC_KEEP)
12401 && !bfd_section_removed_from_list (info->output_bfd,
12402 isec->output_section)
12403 && elf_section_data (isec->output_section)->dynindx == 0)
12404 {
12405 isec->output_section->flags |= SEC_EXCLUDE;
12406 bfd_section_list_remove (info->output_bfd, isec->output_section);
12407 info->output_bfd->section_count--;
12408 }
12409 }
12410
12411 /* Determine and set the size of the stub section for a final link.
12412
12413 The basic idea here is to examine all the relocations looking for
12414 PC-relative calls to a target that is unreachable with a "bl"
12415 instruction. */
12416
12417 bfd_boolean
12418 ppc64_elf_size_stubs (struct bfd_link_info *info)
12419 {
12420 bfd_size_type stub_group_size;
12421 bfd_boolean stubs_always_before_branch;
12422 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12423
12424 if (htab == NULL)
12425 return FALSE;
12426
12427 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
12428 htab->params->plt_thread_safe = 1;
12429 if (!htab->opd_abi)
12430 htab->params->plt_thread_safe = 0;
12431 else if (htab->params->plt_thread_safe == -1)
12432 {
12433 static const char *const thread_starter[] =
12434 {
12435 "pthread_create",
12436 /* libstdc++ */
12437 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12438 /* librt */
12439 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12440 "mq_notify", "create_timer",
12441 /* libanl */
12442 "getaddrinfo_a",
12443 /* libgomp */
12444 "GOMP_parallel",
12445 "GOMP_parallel_start",
12446 "GOMP_parallel_loop_static",
12447 "GOMP_parallel_loop_static_start",
12448 "GOMP_parallel_loop_dynamic",
12449 "GOMP_parallel_loop_dynamic_start",
12450 "GOMP_parallel_loop_guided",
12451 "GOMP_parallel_loop_guided_start",
12452 "GOMP_parallel_loop_runtime",
12453 "GOMP_parallel_loop_runtime_start",
12454 "GOMP_parallel_sections",
12455 "GOMP_parallel_sections_start",
12456 /* libgo */
12457 "__go_go",
12458 };
12459 unsigned i;
12460
12461 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
12462 {
12463 struct elf_link_hash_entry *h;
12464 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12465 FALSE, FALSE, TRUE);
12466 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12467 if (htab->params->plt_thread_safe)
12468 break;
12469 }
12470 }
12471 stubs_always_before_branch = htab->params->group_size < 0;
12472 if (htab->params->group_size < 0)
12473 stub_group_size = -htab->params->group_size;
12474 else
12475 stub_group_size = htab->params->group_size;
12476
12477 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12478 return FALSE;
12479
12480 #define STUB_SHRINK_ITER 20
12481 /* Loop until no stubs added. After iteration 20 of this loop we may
12482 exit on a stub section shrinking. This is to break out of a
12483 pathological case where adding stubs on one iteration decreases
12484 section gaps (perhaps due to alignment), which then requires
12485 fewer or smaller stubs on the next iteration. */
12486
12487 while (1)
12488 {
12489 bfd *input_bfd;
12490 unsigned int bfd_indx;
12491 struct map_stub *group;
12492
12493 htab->stub_iteration += 1;
12494
12495 for (input_bfd = info->input_bfds, bfd_indx = 0;
12496 input_bfd != NULL;
12497 input_bfd = input_bfd->link.next, bfd_indx++)
12498 {
12499 Elf_Internal_Shdr *symtab_hdr;
12500 asection *section;
12501 Elf_Internal_Sym *local_syms = NULL;
12502
12503 if (!is_ppc64_elf (input_bfd))
12504 continue;
12505
12506 /* We'll need the symbol table in a second. */
12507 symtab_hdr = &elf_symtab_hdr (input_bfd);
12508 if (symtab_hdr->sh_info == 0)
12509 continue;
12510
12511 /* Walk over each section attached to the input bfd. */
12512 for (section = input_bfd->sections;
12513 section != NULL;
12514 section = section->next)
12515 {
12516 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
12517
12518 /* If there aren't any relocs, then there's nothing more
12519 to do. */
12520 if ((section->flags & SEC_RELOC) == 0
12521 || (section->flags & SEC_ALLOC) == 0
12522 || (section->flags & SEC_LOAD) == 0
12523 || (section->flags & SEC_CODE) == 0
12524 || section->reloc_count == 0)
12525 continue;
12526
12527 /* If this section is a link-once section that will be
12528 discarded, then don't create any stubs. */
12529 if (section->output_section == NULL
12530 || section->output_section->owner != info->output_bfd)
12531 continue;
12532
12533 /* Get the relocs. */
12534 internal_relocs
12535 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
12536 info->keep_memory);
12537 if (internal_relocs == NULL)
12538 goto error_ret_free_local;
12539
12540 /* Now examine each relocation. */
12541 irela = internal_relocs;
12542 irelaend = irela + section->reloc_count;
12543 for (; irela < irelaend; irela++)
12544 {
12545 enum elf_ppc64_reloc_type r_type;
12546 unsigned int r_indx;
12547 enum ppc_stub_type stub_type;
12548 struct ppc_stub_hash_entry *stub_entry;
12549 asection *sym_sec, *code_sec;
12550 bfd_vma sym_value, code_value;
12551 bfd_vma destination;
12552 unsigned long local_off;
12553 bfd_boolean ok_dest;
12554 struct ppc_link_hash_entry *hash;
12555 struct ppc_link_hash_entry *fdh;
12556 struct elf_link_hash_entry *h;
12557 Elf_Internal_Sym *sym;
12558 char *stub_name;
12559 const asection *id_sec;
12560 struct _opd_sec_data *opd;
12561 struct plt_entry *plt_ent;
12562
12563 r_type = ELF64_R_TYPE (irela->r_info);
12564 r_indx = ELF64_R_SYM (irela->r_info);
12565
12566 if (r_type >= R_PPC64_max)
12567 {
12568 bfd_set_error (bfd_error_bad_value);
12569 goto error_ret_free_internal;
12570 }
12571
12572 /* Only look for stubs on branch instructions. */
12573 if (r_type != R_PPC64_REL24
12574 && r_type != R_PPC64_REL14
12575 && r_type != R_PPC64_REL14_BRTAKEN
12576 && r_type != R_PPC64_REL14_BRNTAKEN)
12577 continue;
12578
12579 /* Now determine the call target, its name, value,
12580 section. */
12581 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12582 r_indx, input_bfd))
12583 goto error_ret_free_internal;
12584 hash = (struct ppc_link_hash_entry *) h;
12585
12586 ok_dest = FALSE;
12587 fdh = NULL;
12588 sym_value = 0;
12589 if (hash == NULL)
12590 {
12591 sym_value = sym->st_value;
12592 if (sym_sec != NULL
12593 && sym_sec->output_section != NULL)
12594 ok_dest = TRUE;
12595 }
12596 else if (hash->elf.root.type == bfd_link_hash_defined
12597 || hash->elf.root.type == bfd_link_hash_defweak)
12598 {
12599 sym_value = hash->elf.root.u.def.value;
12600 if (sym_sec->output_section != NULL)
12601 ok_dest = TRUE;
12602 }
12603 else if (hash->elf.root.type == bfd_link_hash_undefweak
12604 || hash->elf.root.type == bfd_link_hash_undefined)
12605 {
12606 /* Recognise an old ABI func code entry sym, and
12607 use the func descriptor sym instead if it is
12608 defined. */
12609 if (hash->elf.root.root.string[0] == '.'
12610 && hash->oh != NULL)
12611 {
12612 fdh = ppc_follow_link (hash->oh);
12613 if (fdh->elf.root.type == bfd_link_hash_defined
12614 || fdh->elf.root.type == bfd_link_hash_defweak)
12615 {
12616 sym_sec = fdh->elf.root.u.def.section;
12617 sym_value = fdh->elf.root.u.def.value;
12618 if (sym_sec->output_section != NULL)
12619 ok_dest = TRUE;
12620 }
12621 else
12622 fdh = NULL;
12623 }
12624 }
12625 else
12626 {
12627 bfd_set_error (bfd_error_bad_value);
12628 goto error_ret_free_internal;
12629 }
12630
12631 destination = 0;
12632 local_off = 0;
12633 if (ok_dest)
12634 {
12635 sym_value += irela->r_addend;
12636 destination = (sym_value
12637 + sym_sec->output_offset
12638 + sym_sec->output_section->vma);
12639 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12640 ? hash->elf.other
12641 : sym->st_other);
12642 }
12643
12644 code_sec = sym_sec;
12645 code_value = sym_value;
12646 opd = get_opd_info (sym_sec);
12647 if (opd != NULL)
12648 {
12649 bfd_vma dest;
12650
12651 if (hash == NULL && opd->adjust != NULL)
12652 {
12653 long adjust = opd->adjust[OPD_NDX (sym_value)];
12654 if (adjust == -1)
12655 continue;
12656 code_value += adjust;
12657 sym_value += adjust;
12658 }
12659 dest = opd_entry_value (sym_sec, sym_value,
12660 &code_sec, &code_value, FALSE);
12661 if (dest != (bfd_vma) -1)
12662 {
12663 destination = dest;
12664 if (fdh != NULL)
12665 {
12666 /* Fixup old ABI sym to point at code
12667 entry. */
12668 hash->elf.root.type = bfd_link_hash_defweak;
12669 hash->elf.root.u.def.section = code_sec;
12670 hash->elf.root.u.def.value = code_value;
12671 }
12672 }
12673 }
12674
12675 /* Determine what (if any) linker stub is needed. */
12676 plt_ent = NULL;
12677 stub_type = ppc_type_of_stub (section, irela, &hash,
12678 &plt_ent, destination,
12679 local_off);
12680
12681 if (stub_type != ppc_stub_plt_call)
12682 {
12683 /* Check whether we need a TOC adjusting stub.
12684 Since the linker pastes together pieces from
12685 different object files when creating the
12686 _init and _fini functions, it may be that a
12687 call to what looks like a local sym is in
12688 fact a call needing a TOC adjustment. */
12689 if (code_sec != NULL
12690 && code_sec->output_section != NULL
12691 && (htab->sec_info[code_sec->id].toc_off
12692 != htab->sec_info[section->id].toc_off)
12693 && (code_sec->has_toc_reloc
12694 || code_sec->makes_toc_func_call))
12695 stub_type = ppc_stub_long_branch_r2off;
12696 }
12697
12698 if (stub_type == ppc_stub_none)
12699 continue;
12700
12701 /* __tls_get_addr calls might be eliminated. */
12702 if (stub_type != ppc_stub_plt_call
12703 && hash != NULL
12704 && (hash == htab->tls_get_addr
12705 || hash == htab->tls_get_addr_fd)
12706 && section->has_tls_reloc
12707 && irela != internal_relocs)
12708 {
12709 /* Get tls info. */
12710 unsigned char *tls_mask;
12711
12712 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12713 irela - 1, input_bfd))
12714 goto error_ret_free_internal;
12715 if ((*tls_mask & TLS_TLS) != 0)
12716 continue;
12717 }
12718
12719 if (stub_type == ppc_stub_plt_call)
12720 {
12721 if (!htab->opd_abi
12722 && htab->params->plt_localentry0 != 0
12723 && is_elfv2_localentry0 (&hash->elf))
12724 htab->has_plt_localentry0 = 1;
12725 else if (irela + 1 < irelaend
12726 && irela[1].r_offset == irela->r_offset + 4
12727 && (ELF64_R_TYPE (irela[1].r_info)
12728 == R_PPC64_TOCSAVE))
12729 {
12730 if (!tocsave_find (htab, INSERT,
12731 &local_syms, irela + 1, input_bfd))
12732 goto error_ret_free_internal;
12733 }
12734 else
12735 stub_type = ppc_stub_plt_call_r2save;
12736 }
12737
12738 /* Support for grouping stub sections. */
12739 id_sec = htab->sec_info[section->id].u.group->link_sec;
12740
12741 /* Get the name of this stub. */
12742 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12743 if (!stub_name)
12744 goto error_ret_free_internal;
12745
12746 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12747 stub_name, FALSE, FALSE);
12748 if (stub_entry != NULL)
12749 {
12750 /* The proper stub has already been created. */
12751 free (stub_name);
12752 if (stub_type == ppc_stub_plt_call_r2save)
12753 stub_entry->stub_type = stub_type;
12754 continue;
12755 }
12756
12757 stub_entry = ppc_add_stub (stub_name, section, info);
12758 if (stub_entry == NULL)
12759 {
12760 free (stub_name);
12761 error_ret_free_internal:
12762 if (elf_section_data (section)->relocs == NULL)
12763 free (internal_relocs);
12764 error_ret_free_local:
12765 if (local_syms != NULL
12766 && (symtab_hdr->contents
12767 != (unsigned char *) local_syms))
12768 free (local_syms);
12769 return FALSE;
12770 }
12771
12772 stub_entry->stub_type = stub_type;
12773 if (stub_type != ppc_stub_plt_call
12774 && stub_type != ppc_stub_plt_call_r2save)
12775 {
12776 stub_entry->target_value = code_value;
12777 stub_entry->target_section = code_sec;
12778 }
12779 else
12780 {
12781 stub_entry->target_value = sym_value;
12782 stub_entry->target_section = sym_sec;
12783 }
12784 stub_entry->h = hash;
12785 stub_entry->plt_ent = plt_ent;
12786 stub_entry->symtype
12787 = hash ? hash->elf.type : ELF_ST_TYPE (sym->st_info);
12788 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12789
12790 if (stub_entry->h != NULL)
12791 htab->stub_globals += 1;
12792 }
12793
12794 /* We're done with the internal relocs, free them. */
12795 if (elf_section_data (section)->relocs != internal_relocs)
12796 free (internal_relocs);
12797 }
12798
12799 if (local_syms != NULL
12800 && symtab_hdr->contents != (unsigned char *) local_syms)
12801 {
12802 if (!info->keep_memory)
12803 free (local_syms);
12804 else
12805 symtab_hdr->contents = (unsigned char *) local_syms;
12806 }
12807 }
12808
12809 /* We may have added some stubs. Find out the new size of the
12810 stub sections. */
12811 for (group = htab->group; group != NULL; group = group->next)
12812 if (group->stub_sec != NULL)
12813 {
12814 asection *stub_sec = group->stub_sec;
12815
12816 if (htab->stub_iteration <= STUB_SHRINK_ITER
12817 || stub_sec->rawsize < stub_sec->size)
12818 /* Past STUB_SHRINK_ITER, rawsize is the max size seen. */
12819 stub_sec->rawsize = stub_sec->size;
12820 stub_sec->size = 0;
12821 stub_sec->reloc_count = 0;
12822 stub_sec->flags &= ~SEC_RELOC;
12823 }
12824
12825 if (htab->stub_iteration <= STUB_SHRINK_ITER
12826 || htab->brlt->rawsize < htab->brlt->size)
12827 htab->brlt->rawsize = htab->brlt->size;
12828 htab->brlt->size = 0;
12829 htab->brlt->reloc_count = 0;
12830 htab->brlt->flags &= ~SEC_RELOC;
12831 if (htab->relbrlt != NULL)
12832 htab->relbrlt->size = 0;
12833
12834 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12835
12836 for (group = htab->group; group != NULL; group = group->next)
12837 if (group->needs_save_res)
12838 group->stub_sec->size += htab->sfpr->size;
12839
12840 if (info->emitrelocations
12841 && htab->glink != NULL && htab->glink->size != 0)
12842 {
12843 htab->glink->reloc_count = 1;
12844 htab->glink->flags |= SEC_RELOC;
12845 }
12846
12847 if (htab->glink_eh_frame != NULL
12848 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12849 && htab->glink_eh_frame->output_section->size > 8)
12850 {
12851 size_t size = 0, align = 4;
12852
12853 for (group = htab->group; group != NULL; group = group->next)
12854 if (group->stub_sec != NULL)
12855 size += stub_eh_frame_size (group, align);
12856 if (htab->glink != NULL && htab->glink->size != 0)
12857 size += (24 + align - 1) & -align;
12858 if (size != 0)
12859 size += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
12860 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
12861 size = (size + align - 1) & -align;
12862 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12863 htab->glink_eh_frame->size = size;
12864 }
12865
12866 if (htab->params->plt_stub_align != 0)
12867 for (group = htab->group; group != NULL; group = group->next)
12868 if (group->stub_sec != NULL)
12869 {
12870 int align = abs (htab->params->plt_stub_align);
12871 group->stub_sec->size
12872 = (group->stub_sec->size + (1 << align) - 1) & -(1 << align);
12873 }
12874
12875 for (group = htab->group; group != NULL; group = group->next)
12876 if (group->stub_sec != NULL
12877 && group->stub_sec->rawsize != group->stub_sec->size
12878 && (htab->stub_iteration <= STUB_SHRINK_ITER
12879 || group->stub_sec->rawsize < group->stub_sec->size))
12880 break;
12881
12882 if (group == NULL
12883 && (htab->brlt->rawsize == htab->brlt->size
12884 || (htab->stub_iteration > STUB_SHRINK_ITER
12885 && htab->brlt->rawsize > htab->brlt->size))
12886 && (htab->glink_eh_frame == NULL
12887 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12888 break;
12889
12890 /* Ask the linker to do its stuff. */
12891 (*htab->params->layout_sections_again) ();
12892 }
12893
12894 if (htab->glink_eh_frame != NULL
12895 && htab->glink_eh_frame->size != 0)
12896 {
12897 bfd_vma val;
12898 bfd_byte *p, *last_fde;
12899 size_t last_fde_len, size, align, pad;
12900 struct map_stub *group;
12901
12902 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12903 if (p == NULL)
12904 return FALSE;
12905 htab->glink_eh_frame->contents = p;
12906 last_fde = p;
12907 align = 4;
12908
12909 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12910 /* CIE length (rewrite in case little-endian). */
12911 last_fde_len = ((sizeof (glink_eh_frame_cie) + align - 1) & -align) - 4;
12912 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12913 p += last_fde_len + 4;
12914
12915 for (group = htab->group; group != NULL; group = group->next)
12916 if (group->stub_sec != NULL)
12917 {
12918 last_fde = p;
12919 last_fde_len = stub_eh_frame_size (group, align) - 4;
12920 /* FDE length. */
12921 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12922 p += 4;
12923 /* CIE pointer. */
12924 val = p - htab->glink_eh_frame->contents;
12925 bfd_put_32 (htab->elf.dynobj, val, p);
12926 p += 4;
12927 /* Offset to stub section, written later. */
12928 p += 4;
12929 /* stub section size. */
12930 bfd_put_32 (htab->elf.dynobj, group->stub_sec->size, p);
12931 p += 4;
12932 /* Augmentation. */
12933 p += 1;
12934 if (group->tls_get_addr_opt_bctrl != -1u)
12935 {
12936 unsigned int to_bctrl = group->tls_get_addr_opt_bctrl / 4;
12937
12938 /* This FDE needs more than just the default.
12939 Describe __tls_get_addr_opt stub LR. */
12940 if (to_bctrl < 64)
12941 *p++ = DW_CFA_advance_loc + to_bctrl;
12942 else if (to_bctrl < 256)
12943 {
12944 *p++ = DW_CFA_advance_loc1;
12945 *p++ = to_bctrl;
12946 }
12947 else if (to_bctrl < 65536)
12948 {
12949 *p++ = DW_CFA_advance_loc2;
12950 bfd_put_16 (htab->elf.dynobj, to_bctrl, p);
12951 p += 2;
12952 }
12953 else
12954 {
12955 *p++ = DW_CFA_advance_loc4;
12956 bfd_put_32 (htab->elf.dynobj, to_bctrl, p);
12957 p += 4;
12958 }
12959 *p++ = DW_CFA_offset_extended_sf;
12960 *p++ = 65;
12961 *p++ = -(STK_LINKER (htab) / 8) & 0x7f;
12962 *p++ = DW_CFA_advance_loc + 4;
12963 *p++ = DW_CFA_restore_extended;
12964 *p++ = 65;
12965 }
12966 /* Pad. */
12967 p = last_fde + last_fde_len + 4;
12968 }
12969 if (htab->glink != NULL && htab->glink->size != 0)
12970 {
12971 last_fde = p;
12972 last_fde_len = ((24 + align - 1) & -align) - 4;
12973 /* FDE length. */
12974 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12975 p += 4;
12976 /* CIE pointer. */
12977 val = p - htab->glink_eh_frame->contents;
12978 bfd_put_32 (htab->elf.dynobj, val, p);
12979 p += 4;
12980 /* Offset to .glink, written later. */
12981 p += 4;
12982 /* .glink size. */
12983 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12984 p += 4;
12985 /* Augmentation. */
12986 p += 1;
12987
12988 *p++ = DW_CFA_advance_loc + 1;
12989 *p++ = DW_CFA_register;
12990 *p++ = 65;
12991 *p++ = htab->opd_abi ? 12 : 0;
12992 *p++ = DW_CFA_advance_loc + (htab->opd_abi ? 5 : 7);
12993 *p++ = DW_CFA_restore_extended;
12994 *p++ = 65;
12995 p += ((24 + align - 1) & -align) - 24;
12996 }
12997 /* Subsume any padding into the last FDE if user .eh_frame
12998 sections are aligned more than glink_eh_frame. Otherwise any
12999 zero padding will be seen as a terminator. */
13000 align = 1ul << htab->glink_eh_frame->output_section->alignment_power;
13001 size = p - htab->glink_eh_frame->contents;
13002 pad = ((size + align - 1) & -align) - size;
13003 htab->glink_eh_frame->size = size + pad;
13004 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
13005 }
13006
13007 maybe_strip_output (info, htab->brlt);
13008 if (htab->glink_eh_frame != NULL)
13009 maybe_strip_output (info, htab->glink_eh_frame);
13010
13011 return TRUE;
13012 }
13013
13014 /* Called after we have determined section placement. If sections
13015 move, we'll be called again. Provide a value for TOCstart. */
13016
13017 bfd_vma
13018 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
13019 {
13020 asection *s;
13021 bfd_vma TOCstart, adjust;
13022
13023 if (info != NULL)
13024 {
13025 struct elf_link_hash_entry *h;
13026 struct elf_link_hash_table *htab = elf_hash_table (info);
13027
13028 if (is_elf_hash_table (htab)
13029 && htab->hgot != NULL)
13030 h = htab->hgot;
13031 else
13032 {
13033 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
13034 if (is_elf_hash_table (htab))
13035 htab->hgot = h;
13036 }
13037 if (h != NULL
13038 && h->root.type == bfd_link_hash_defined
13039 && !h->root.linker_def
13040 && (!is_elf_hash_table (htab)
13041 || h->def_regular))
13042 {
13043 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
13044 + h->root.u.def.section->output_offset
13045 + h->root.u.def.section->output_section->vma);
13046 _bfd_set_gp_value (obfd, TOCstart);
13047 return TOCstart;
13048 }
13049 }
13050
13051 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
13052 order. The TOC starts where the first of these sections starts. */
13053 s = bfd_get_section_by_name (obfd, ".got");
13054 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
13055 s = bfd_get_section_by_name (obfd, ".toc");
13056 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
13057 s = bfd_get_section_by_name (obfd, ".tocbss");
13058 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
13059 s = bfd_get_section_by_name (obfd, ".plt");
13060 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
13061 {
13062 /* This may happen for
13063 o references to TOC base (SYM@toc / TOC[tc0]) without a
13064 .toc directive
13065 o bad linker script
13066 o --gc-sections and empty TOC sections
13067
13068 FIXME: Warn user? */
13069
13070 /* Look for a likely section. We probably won't even be
13071 using TOCstart. */
13072 for (s = obfd->sections; s != NULL; s = s->next)
13073 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
13074 | SEC_EXCLUDE))
13075 == (SEC_ALLOC | SEC_SMALL_DATA))
13076 break;
13077 if (s == NULL)
13078 for (s = obfd->sections; s != NULL; s = s->next)
13079 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
13080 == (SEC_ALLOC | SEC_SMALL_DATA))
13081 break;
13082 if (s == NULL)
13083 for (s = obfd->sections; s != NULL; s = s->next)
13084 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
13085 == SEC_ALLOC)
13086 break;
13087 if (s == NULL)
13088 for (s = obfd->sections; s != NULL; s = s->next)
13089 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
13090 break;
13091 }
13092
13093 TOCstart = 0;
13094 if (s != NULL)
13095 TOCstart = s->output_section->vma + s->output_offset;
13096
13097 /* Force alignment. */
13098 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
13099 TOCstart -= adjust;
13100 _bfd_set_gp_value (obfd, TOCstart);
13101
13102 if (info != NULL && s != NULL)
13103 {
13104 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13105
13106 if (htab != NULL)
13107 {
13108 if (htab->elf.hgot != NULL)
13109 {
13110 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
13111 htab->elf.hgot->root.u.def.section = s;
13112 }
13113 }
13114 else
13115 {
13116 struct bfd_link_hash_entry *bh = NULL;
13117 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
13118 s, TOC_BASE_OFF - adjust,
13119 NULL, FALSE, FALSE, &bh);
13120 }
13121 }
13122 return TOCstart;
13123 }
13124
13125 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
13126 write out any global entry stubs, and PLT relocations. */
13127
13128 static bfd_boolean
13129 build_global_entry_stubs_and_plt (struct elf_link_hash_entry *h, void *inf)
13130 {
13131 struct bfd_link_info *info;
13132 struct ppc_link_hash_table *htab;
13133 struct plt_entry *ent;
13134 asection *s;
13135
13136 if (h->root.type == bfd_link_hash_indirect)
13137 return TRUE;
13138
13139 info = inf;
13140 htab = ppc_hash_table (info);
13141 if (htab == NULL)
13142 return FALSE;
13143
13144 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13145 if (ent->plt.offset != (bfd_vma) -1)
13146 {
13147 /* This symbol has an entry in the procedure linkage
13148 table. Set it up. */
13149 Elf_Internal_Rela rela;
13150 asection *plt, *relplt;
13151 bfd_byte *loc;
13152
13153 if (!htab->elf.dynamic_sections_created
13154 || h->dynindx == -1)
13155 {
13156 if (!(h->def_regular
13157 && (h->root.type == bfd_link_hash_defined
13158 || h->root.type == bfd_link_hash_defweak)))
13159 continue;
13160 if (h->type == STT_GNU_IFUNC)
13161 {
13162 plt = htab->elf.iplt;
13163 relplt = htab->elf.irelplt;
13164 htab->local_ifunc_resolver = 1;
13165 if (htab->opd_abi)
13166 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13167 else
13168 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13169 }
13170 else
13171 {
13172 plt = htab->pltlocal;
13173 if (bfd_link_pic (info))
13174 {
13175 relplt = htab->relpltlocal;
13176 if (htab->opd_abi)
13177 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13178 else
13179 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13180 }
13181 else
13182 relplt = NULL;
13183 }
13184 rela.r_addend = (h->root.u.def.value
13185 + h->root.u.def.section->output_offset
13186 + h->root.u.def.section->output_section->vma
13187 + ent->addend);
13188
13189 if (relplt == NULL)
13190 {
13191 loc = plt->contents + ent->plt.offset;
13192 bfd_put_64 (info->output_bfd, rela.r_addend, loc);
13193 if (htab->opd_abi)
13194 {
13195 bfd_vma toc = elf_gp (info->output_bfd);
13196 toc += htab->sec_info[h->root.u.def.section->id].toc_off;
13197 bfd_put_64 (info->output_bfd, toc, loc + 8);
13198 }
13199 }
13200 else
13201 {
13202 rela.r_offset = (plt->output_section->vma
13203 + plt->output_offset
13204 + ent->plt.offset);
13205 loc = relplt->contents + (relplt->reloc_count++
13206 * sizeof (Elf64_External_Rela));
13207 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13208 }
13209 }
13210 else
13211 {
13212 rela.r_offset = (htab->elf.splt->output_section->vma
13213 + htab->elf.splt->output_offset
13214 + ent->plt.offset);
13215 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
13216 rela.r_addend = ent->addend;
13217 loc = (htab->elf.srelplt->contents
13218 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
13219 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
13220 if (h->type == STT_GNU_IFUNC && is_static_defined (h))
13221 htab->maybe_local_ifunc_resolver = 1;
13222 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13223 }
13224 }
13225
13226 if (!h->pointer_equality_needed)
13227 return TRUE;
13228
13229 if (h->def_regular)
13230 return TRUE;
13231
13232 s = htab->global_entry;
13233 if (s == NULL || s->size == 0)
13234 return TRUE;
13235
13236 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
13237 if (ent->plt.offset != (bfd_vma) -1
13238 && ent->addend == 0)
13239 {
13240 bfd_byte *p;
13241 asection *plt;
13242 bfd_vma off;
13243
13244 p = s->contents + h->root.u.def.value;
13245 plt = htab->elf.splt;
13246 if (!htab->elf.dynamic_sections_created
13247 || h->dynindx == -1)
13248 {
13249 if (h->type == STT_GNU_IFUNC)
13250 plt = htab->elf.iplt;
13251 else
13252 plt = htab->pltlocal;
13253 }
13254 off = ent->plt.offset + plt->output_offset + plt->output_section->vma;
13255 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
13256
13257 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
13258 {
13259 info->callbacks->einfo
13260 (_("%P: linkage table error against `%pT'\n"),
13261 h->root.root.string);
13262 bfd_set_error (bfd_error_bad_value);
13263 htab->stub_error = TRUE;
13264 }
13265
13266 htab->stub_count[ppc_stub_global_entry - 1] += 1;
13267 if (htab->params->emit_stub_syms)
13268 {
13269 size_t len = strlen (h->root.root.string);
13270 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
13271
13272 if (name == NULL)
13273 return FALSE;
13274
13275 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
13276 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
13277 if (h == NULL)
13278 return FALSE;
13279 if (h->root.type == bfd_link_hash_new)
13280 {
13281 h->root.type = bfd_link_hash_defined;
13282 h->root.u.def.section = s;
13283 h->root.u.def.value = p - s->contents;
13284 h->ref_regular = 1;
13285 h->def_regular = 1;
13286 h->ref_regular_nonweak = 1;
13287 h->forced_local = 1;
13288 h->non_elf = 0;
13289 h->root.linker_def = 1;
13290 }
13291 }
13292
13293 if (PPC_HA (off) != 0)
13294 {
13295 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
13296 p += 4;
13297 }
13298 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
13299 p += 4;
13300 bfd_put_32 (s->owner, MTCTR_R12, p);
13301 p += 4;
13302 bfd_put_32 (s->owner, BCTR, p);
13303 break;
13304 }
13305 return TRUE;
13306 }
13307
13308 /* Write PLT relocs for locals. */
13309
13310 static bfd_boolean
13311 write_plt_relocs_for_local_syms (struct bfd_link_info *info)
13312 {
13313 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13314 bfd *ibfd;
13315
13316 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
13317 {
13318 struct got_entry **lgot_ents, **end_lgot_ents;
13319 struct plt_entry **local_plt, **lplt, **end_local_plt;
13320 Elf_Internal_Shdr *symtab_hdr;
13321 bfd_size_type locsymcount;
13322 Elf_Internal_Sym *local_syms = NULL;
13323 struct plt_entry *ent;
13324
13325 if (!is_ppc64_elf (ibfd))
13326 continue;
13327
13328 lgot_ents = elf_local_got_ents (ibfd);
13329 if (!lgot_ents)
13330 continue;
13331
13332 symtab_hdr = &elf_symtab_hdr (ibfd);
13333 locsymcount = symtab_hdr->sh_info;
13334 end_lgot_ents = lgot_ents + locsymcount;
13335 local_plt = (struct plt_entry **) end_lgot_ents;
13336 end_local_plt = local_plt + locsymcount;
13337 for (lplt = local_plt; lplt < end_local_plt; ++lplt)
13338 for (ent = *lplt; ent != NULL; ent = ent->next)
13339 if (ent->plt.offset != (bfd_vma) -1)
13340 {
13341 Elf_Internal_Sym *sym;
13342 asection *sym_sec;
13343 asection *plt, *relplt;
13344 bfd_byte *loc;
13345 bfd_vma val;
13346
13347 if (!get_sym_h (NULL, &sym, &sym_sec, NULL, &local_syms,
13348 lplt - local_plt, ibfd))
13349 {
13350 if (local_syms != NULL
13351 && symtab_hdr->contents != (unsigned char *) local_syms)
13352 free (local_syms);
13353 return FALSE;
13354 }
13355
13356 val = sym->st_value + ent->addend;
13357 val += PPC64_LOCAL_ENTRY_OFFSET (sym->st_other);
13358 if (sym_sec != NULL && sym_sec->output_section != NULL)
13359 val += sym_sec->output_offset + sym_sec->output_section->vma;
13360
13361 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13362 {
13363 htab->local_ifunc_resolver = 1;
13364 plt = htab->elf.iplt;
13365 relplt = htab->elf.irelplt;
13366 }
13367 else
13368 {
13369 plt = htab->pltlocal;
13370 relplt = bfd_link_pic (info) ? htab->relpltlocal : NULL;
13371 }
13372
13373 if (relplt == NULL)
13374 {
13375 loc = plt->contents + ent->plt.offset;
13376 bfd_put_64 (info->output_bfd, val, loc);
13377 if (htab->opd_abi)
13378 {
13379 bfd_vma toc = elf_gp (ibfd);
13380 bfd_put_64 (info->output_bfd, toc, loc + 8);
13381 }
13382 }
13383 else
13384 {
13385 Elf_Internal_Rela rela;
13386 rela.r_offset = (ent->plt.offset
13387 + plt->output_offset
13388 + plt->output_section->vma);
13389 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
13390 {
13391 if (htab->opd_abi)
13392 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
13393 else
13394 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13395 }
13396 else
13397 {
13398 if (htab->opd_abi)
13399 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_SLOT);
13400 else
13401 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13402 }
13403 rela.r_addend = val;
13404 loc = relplt->contents + (relplt->reloc_count++
13405 * sizeof (Elf64_External_Rela));
13406 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, loc);
13407 }
13408 }
13409
13410 if (local_syms != NULL
13411 && symtab_hdr->contents != (unsigned char *) local_syms)
13412 {
13413 if (!info->keep_memory)
13414 free (local_syms);
13415 else
13416 symtab_hdr->contents = (unsigned char *) local_syms;
13417 }
13418 }
13419 return TRUE;
13420 }
13421
13422 /* Build all the stubs associated with the current output file.
13423 The stubs are kept in a hash table attached to the main linker
13424 hash table. This function is called via gldelf64ppc_finish. */
13425
13426 bfd_boolean
13427 ppc64_elf_build_stubs (struct bfd_link_info *info,
13428 char **stats)
13429 {
13430 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13431 struct map_stub *group;
13432 asection *stub_sec;
13433 bfd_byte *p;
13434 int stub_sec_count = 0;
13435
13436 if (htab == NULL)
13437 return FALSE;
13438
13439 /* Allocate memory to hold the linker stubs. */
13440 for (group = htab->group; group != NULL; group = group->next)
13441 if ((stub_sec = group->stub_sec) != NULL
13442 && stub_sec->size != 0)
13443 {
13444 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
13445 if (stub_sec->contents == NULL)
13446 return FALSE;
13447 stub_sec->size = 0;
13448 }
13449
13450 if (htab->glink != NULL && htab->glink->size != 0)
13451 {
13452 unsigned int indx;
13453 bfd_vma plt0;
13454
13455 /* Build the .glink plt call stub. */
13456 if (htab->params->emit_stub_syms)
13457 {
13458 struct elf_link_hash_entry *h;
13459 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
13460 TRUE, FALSE, FALSE);
13461 if (h == NULL)
13462 return FALSE;
13463 if (h->root.type == bfd_link_hash_new)
13464 {
13465 h->root.type = bfd_link_hash_defined;
13466 h->root.u.def.section = htab->glink;
13467 h->root.u.def.value = 8;
13468 h->ref_regular = 1;
13469 h->def_regular = 1;
13470 h->ref_regular_nonweak = 1;
13471 h->forced_local = 1;
13472 h->non_elf = 0;
13473 h->root.linker_def = 1;
13474 }
13475 }
13476 plt0 = (htab->elf.splt->output_section->vma
13477 + htab->elf.splt->output_offset
13478 - 16);
13479 if (info->emitrelocations)
13480 {
13481 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
13482 if (r == NULL)
13483 return FALSE;
13484 r->r_offset = (htab->glink->output_offset
13485 + htab->glink->output_section->vma);
13486 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
13487 r->r_addend = plt0;
13488 }
13489 p = htab->glink->contents;
13490 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
13491 bfd_put_64 (htab->glink->owner, plt0, p);
13492 p += 8;
13493 if (htab->opd_abi)
13494 {
13495 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
13496 p += 4;
13497 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13498 p += 4;
13499 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13500 p += 4;
13501 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13502 p += 4;
13503 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
13504 p += 4;
13505 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13506 p += 4;
13507 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13508 p += 4;
13509 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
13510 p += 4;
13511 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13512 p += 4;
13513 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
13514 p += 4;
13515 }
13516 else
13517 {
13518 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
13519 p += 4;
13520 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
13521 p += 4;
13522 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
13523 p += 4;
13524 bfd_put_32 (htab->glink->owner, STD_R2_0R1 + 24, p);
13525 p += 4;
13526 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
13527 p += 4;
13528 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
13529 p += 4;
13530 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
13531 p += 4;
13532 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
13533 p += 4;
13534 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
13535 p += 4;
13536 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
13537 p += 4;
13538 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
13539 p += 4;
13540 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
13541 p += 4;
13542 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
13543 p += 4;
13544 }
13545 bfd_put_32 (htab->glink->owner, BCTR, p);
13546 p += 4;
13547 BFD_ASSERT (p == htab->glink->contents + GLINK_PLTRESOLVE_SIZE (htab));
13548
13549 /* Build the .glink lazy link call stubs. */
13550 indx = 0;
13551 while (p < htab->glink->contents + htab->glink->size)
13552 {
13553 if (htab->opd_abi)
13554 {
13555 if (indx < 0x8000)
13556 {
13557 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
13558 p += 4;
13559 }
13560 else
13561 {
13562 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
13563 p += 4;
13564 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
13565 p);
13566 p += 4;
13567 }
13568 }
13569 bfd_put_32 (htab->glink->owner,
13570 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
13571 indx++;
13572 p += 4;
13573 }
13574 }
13575
13576 /* Build .glink global entry stubs, and PLT relocs for globals. */
13577 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs_and_plt, info);
13578
13579 if (!write_plt_relocs_for_local_syms (info))
13580 return FALSE;
13581
13582 if (htab->brlt != NULL && htab->brlt->size != 0)
13583 {
13584 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
13585 htab->brlt->size);
13586 if (htab->brlt->contents == NULL)
13587 return FALSE;
13588 }
13589 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
13590 {
13591 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
13592 htab->relbrlt->size);
13593 if (htab->relbrlt->contents == NULL)
13594 return FALSE;
13595 }
13596
13597 /* Build the stubs as directed by the stub hash table. */
13598 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
13599
13600 for (group = htab->group; group != NULL; group = group->next)
13601 if (group->needs_save_res)
13602 group->stub_sec->size += htab->sfpr->size;
13603
13604 if (htab->relbrlt != NULL)
13605 htab->relbrlt->reloc_count = 0;
13606
13607 if (htab->params->plt_stub_align != 0)
13608 for (group = htab->group; group != NULL; group = group->next)
13609 if ((stub_sec = group->stub_sec) != NULL)
13610 {
13611 int align = abs (htab->params->plt_stub_align);
13612 stub_sec->size = (stub_sec->size + (1 << align) - 1) & -(1 << align);
13613 }
13614
13615 for (group = htab->group; group != NULL; group = group->next)
13616 if (group->needs_save_res)
13617 {
13618 stub_sec = group->stub_sec;
13619 memcpy (stub_sec->contents + stub_sec->size - htab->sfpr->size,
13620 htab->sfpr->contents, htab->sfpr->size);
13621 if (htab->params->emit_stub_syms)
13622 {
13623 unsigned int i;
13624
13625 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13626 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13627 return FALSE;
13628 }
13629 }
13630
13631 for (group = htab->group; group != NULL; group = group->next)
13632 if ((stub_sec = group->stub_sec) != NULL)
13633 {
13634 stub_sec_count += 1;
13635 if (stub_sec->rawsize != stub_sec->size
13636 && (htab->stub_iteration <= STUB_SHRINK_ITER
13637 || stub_sec->rawsize < stub_sec->size))
13638 break;
13639 }
13640
13641 if (group != NULL)
13642 {
13643 htab->stub_error = TRUE;
13644 _bfd_error_handler (_("stubs don't match calculated size"));
13645 }
13646
13647 if (htab->stub_error)
13648 return FALSE;
13649
13650 if (stats != NULL)
13651 {
13652 size_t len;
13653 *stats = bfd_malloc (500);
13654 if (*stats == NULL)
13655 return FALSE;
13656
13657 len = sprintf (*stats,
13658 ngettext ("linker stubs in %u group\n",
13659 "linker stubs in %u groups\n",
13660 stub_sec_count),
13661 stub_sec_count);
13662 sprintf (*stats + len, _(" branch %lu\n"
13663 " toc adjust %lu\n"
13664 " long branch %lu\n"
13665 " long toc adj %lu\n"
13666 " plt call %lu\n"
13667 " plt call toc %lu\n"
13668 " global entry %lu"),
13669 htab->stub_count[ppc_stub_long_branch - 1],
13670 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13671 htab->stub_count[ppc_stub_plt_branch - 1],
13672 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
13673 htab->stub_count[ppc_stub_plt_call - 1],
13674 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13675 htab->stub_count[ppc_stub_global_entry - 1]);
13676 }
13677 return TRUE;
13678 }
13679
13680 /* What to do when ld finds relocations against symbols defined in
13681 discarded sections. */
13682
13683 static unsigned int
13684 ppc64_elf_action_discarded (asection *sec)
13685 {
13686 if (strcmp (".opd", sec->name) == 0)
13687 return 0;
13688
13689 if (strcmp (".toc", sec->name) == 0)
13690 return 0;
13691
13692 if (strcmp (".toc1", sec->name) == 0)
13693 return 0;
13694
13695 return _bfd_elf_default_action_discarded (sec);
13696 }
13697
13698 /* The RELOCATE_SECTION function is called by the ELF backend linker
13699 to handle the relocations for a section.
13700
13701 The relocs are always passed as Rela structures; if the section
13702 actually uses Rel structures, the r_addend field will always be
13703 zero.
13704
13705 This function is responsible for adjust the section contents as
13706 necessary, and (if using Rela relocs and generating a
13707 relocatable output file) adjusting the reloc addend as
13708 necessary.
13709
13710 This function does not have to worry about setting the reloc
13711 address or the reloc symbol index.
13712
13713 LOCAL_SYMS is a pointer to the swapped in local symbols.
13714
13715 LOCAL_SECTIONS is an array giving the section in the input file
13716 corresponding to the st_shndx field of each local symbol.
13717
13718 The global hash table entry for the global symbols can be found
13719 via elf_sym_hashes (input_bfd).
13720
13721 When generating relocatable output, this function must handle
13722 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13723 going to be the section symbol corresponding to the output
13724 section, which means that the addend must be adjusted
13725 accordingly. */
13726
13727 static bfd_boolean
13728 ppc64_elf_relocate_section (bfd *output_bfd,
13729 struct bfd_link_info *info,
13730 bfd *input_bfd,
13731 asection *input_section,
13732 bfd_byte *contents,
13733 Elf_Internal_Rela *relocs,
13734 Elf_Internal_Sym *local_syms,
13735 asection **local_sections)
13736 {
13737 struct ppc_link_hash_table *htab;
13738 Elf_Internal_Shdr *symtab_hdr;
13739 struct elf_link_hash_entry **sym_hashes;
13740 Elf_Internal_Rela *rel;
13741 Elf_Internal_Rela *wrel;
13742 Elf_Internal_Rela *relend;
13743 Elf_Internal_Rela outrel;
13744 bfd_byte *loc;
13745 struct got_entry **local_got_ents;
13746 bfd_vma TOCstart;
13747 bfd_boolean ret = TRUE;
13748 bfd_boolean is_opd;
13749 /* Assume 'at' branch hints. */
13750 bfd_boolean is_isa_v2 = TRUE;
13751 bfd_vma d_offset = (bfd_big_endian (input_bfd) ? 2 : 0);
13752
13753 /* Initialize howto table if needed. */
13754 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
13755 ppc_howto_init ();
13756
13757 htab = ppc_hash_table (info);
13758 if (htab == NULL)
13759 return FALSE;
13760
13761 /* Don't relocate stub sections. */
13762 if (input_section->owner == htab->params->stub_bfd)
13763 return TRUE;
13764
13765 BFD_ASSERT (is_ppc64_elf (input_bfd));
13766
13767 local_got_ents = elf_local_got_ents (input_bfd);
13768 TOCstart = elf_gp (output_bfd);
13769 symtab_hdr = &elf_symtab_hdr (input_bfd);
13770 sym_hashes = elf_sym_hashes (input_bfd);
13771 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
13772
13773 rel = wrel = relocs;
13774 relend = relocs + input_section->reloc_count;
13775 for (; rel < relend; wrel++, rel++)
13776 {
13777 enum elf_ppc64_reloc_type r_type;
13778 bfd_vma addend;
13779 bfd_reloc_status_type r;
13780 Elf_Internal_Sym *sym;
13781 asection *sec;
13782 struct elf_link_hash_entry *h_elf;
13783 struct ppc_link_hash_entry *h;
13784 struct ppc_link_hash_entry *fdh;
13785 const char *sym_name;
13786 unsigned long r_symndx, toc_symndx;
13787 bfd_vma toc_addend;
13788 unsigned char tls_mask, tls_gd, tls_type;
13789 unsigned char sym_type;
13790 bfd_vma relocation;
13791 bfd_boolean unresolved_reloc, save_unresolved_reloc;
13792 bfd_boolean warned;
13793 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
13794 unsigned int insn;
13795 unsigned int mask;
13796 struct ppc_stub_hash_entry *stub_entry;
13797 bfd_vma max_br_offset;
13798 bfd_vma from;
13799 Elf_Internal_Rela orig_rel;
13800 reloc_howto_type *howto;
13801 struct reloc_howto_struct alt_howto;
13802
13803 again:
13804 orig_rel = *rel;
13805
13806 r_type = ELF64_R_TYPE (rel->r_info);
13807 r_symndx = ELF64_R_SYM (rel->r_info);
13808
13809 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13810 symbol of the previous ADDR64 reloc. The symbol gives us the
13811 proper TOC base to use. */
13812 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13813 && wrel != relocs
13814 && ELF64_R_TYPE (wrel[-1].r_info) == R_PPC64_ADDR64
13815 && is_opd)
13816 r_symndx = ELF64_R_SYM (wrel[-1].r_info);
13817
13818 sym = NULL;
13819 sec = NULL;
13820 h_elf = NULL;
13821 sym_name = NULL;
13822 unresolved_reloc = FALSE;
13823 warned = FALSE;
13824
13825 if (r_symndx < symtab_hdr->sh_info)
13826 {
13827 /* It's a local symbol. */
13828 struct _opd_sec_data *opd;
13829
13830 sym = local_syms + r_symndx;
13831 sec = local_sections[r_symndx];
13832 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
13833 sym_type = ELF64_ST_TYPE (sym->st_info);
13834 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13835 opd = get_opd_info (sec);
13836 if (opd != NULL && opd->adjust != NULL)
13837 {
13838 long adjust = opd->adjust[OPD_NDX (sym->st_value
13839 + rel->r_addend)];
13840 if (adjust == -1)
13841 relocation = 0;
13842 else
13843 {
13844 /* If this is a relocation against the opd section sym
13845 and we have edited .opd, adjust the reloc addend so
13846 that ld -r and ld --emit-relocs output is correct.
13847 If it is a reloc against some other .opd symbol,
13848 then the symbol value will be adjusted later. */
13849 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13850 rel->r_addend += adjust;
13851 else
13852 relocation += adjust;
13853 }
13854 }
13855 }
13856 else
13857 {
13858 bfd_boolean ignored;
13859
13860 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13861 r_symndx, symtab_hdr, sym_hashes,
13862 h_elf, sec, relocation,
13863 unresolved_reloc, warned, ignored);
13864 sym_name = h_elf->root.root.string;
13865 sym_type = h_elf->type;
13866 if (sec != NULL
13867 && sec->owner == output_bfd
13868 && strcmp (sec->name, ".opd") == 0)
13869 {
13870 /* This is a symbol defined in a linker script. All
13871 such are defined in output sections, even those
13872 defined by simple assignment from a symbol defined in
13873 an input section. Transfer the symbol to an
13874 appropriate input .opd section, so that a branch to
13875 this symbol will be mapped to the location specified
13876 by the opd entry. */
13877 struct bfd_link_order *lo;
13878 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13879 if (lo->type == bfd_indirect_link_order)
13880 {
13881 asection *isec = lo->u.indirect.section;
13882 if (h_elf->root.u.def.value >= isec->output_offset
13883 && h_elf->root.u.def.value < (isec->output_offset
13884 + isec->size))
13885 {
13886 h_elf->root.u.def.value -= isec->output_offset;
13887 h_elf->root.u.def.section = isec;
13888 sec = isec;
13889 break;
13890 }
13891 }
13892 }
13893 }
13894 h = (struct ppc_link_hash_entry *) h_elf;
13895
13896 if (sec != NULL && discarded_section (sec))
13897 {
13898 _bfd_clear_contents (ppc64_elf_howto_table[r_type],
13899 input_bfd, input_section,
13900 contents + rel->r_offset);
13901 wrel->r_offset = rel->r_offset;
13902 wrel->r_info = 0;
13903 wrel->r_addend = 0;
13904
13905 /* For ld -r, remove relocations in debug sections against
13906 symbols defined in discarded sections. Not done for
13907 non-debug to preserve relocs in .eh_frame which the
13908 eh_frame editing code expects to be present. */
13909 if (bfd_link_relocatable (info)
13910 && (input_section->flags & SEC_DEBUGGING))
13911 wrel--;
13912
13913 continue;
13914 }
13915
13916 if (bfd_link_relocatable (info))
13917 goto copy_reloc;
13918
13919 if (h != NULL && &h->elf == htab->elf.hgot)
13920 {
13921 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13922 sec = bfd_abs_section_ptr;
13923 unresolved_reloc = FALSE;
13924 }
13925
13926 /* TLS optimizations. Replace instruction sequences and relocs
13927 based on information we collected in tls_optimize. We edit
13928 RELOCS so that --emit-relocs will output something sensible
13929 for the final instruction stream. */
13930 tls_mask = 0;
13931 tls_gd = 0;
13932 toc_symndx = 0;
13933 if (h != NULL)
13934 tls_mask = h->tls_mask;
13935 else if (local_got_ents != NULL)
13936 {
13937 struct plt_entry **local_plt = (struct plt_entry **)
13938 (local_got_ents + symtab_hdr->sh_info);
13939 unsigned char *lgot_masks = (unsigned char *)
13940 (local_plt + symtab_hdr->sh_info);
13941 tls_mask = lgot_masks[r_symndx];
13942 }
13943 if (((tls_mask & TLS_TLS) == 0 || tls_mask == (TLS_TLS | TLS_MARK))
13944 && (r_type == R_PPC64_TLS
13945 || r_type == R_PPC64_TLSGD
13946 || r_type == R_PPC64_TLSLD))
13947 {
13948 /* Check for toc tls entries. */
13949 unsigned char *toc_tls;
13950
13951 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13952 &local_syms, rel, input_bfd))
13953 return FALSE;
13954
13955 if (toc_tls)
13956 tls_mask = *toc_tls;
13957 }
13958
13959 /* Check that tls relocs are used with tls syms, and non-tls
13960 relocs are used with non-tls syms. */
13961 if (r_symndx != STN_UNDEF
13962 && r_type != R_PPC64_NONE
13963 && (h == NULL
13964 || h->elf.root.type == bfd_link_hash_defined
13965 || h->elf.root.type == bfd_link_hash_defweak)
13966 && (IS_PPC64_TLS_RELOC (r_type)
13967 != (sym_type == STT_TLS
13968 || (sym_type == STT_SECTION
13969 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13970 {
13971 if ((tls_mask & TLS_TLS) != 0
13972 && (r_type == R_PPC64_TLS
13973 || r_type == R_PPC64_TLSGD
13974 || r_type == R_PPC64_TLSLD))
13975 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13976 ;
13977 else
13978 info->callbacks->einfo
13979 (!IS_PPC64_TLS_RELOC (r_type)
13980 /* xgettext:c-format */
13981 ? _("%H: %s used with TLS symbol `%pT'\n")
13982 /* xgettext:c-format */
13983 : _("%H: %s used with non-TLS symbol `%pT'\n"),
13984 input_bfd, input_section, rel->r_offset,
13985 ppc64_elf_howto_table[r_type]->name,
13986 sym_name);
13987 }
13988
13989 /* Ensure reloc mapping code below stays sane. */
13990 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13991 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13992 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13993 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13994 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13995 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13996 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13997 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13998 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13999 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
14000 abort ();
14001
14002 switch (r_type)
14003 {
14004 default:
14005 break;
14006
14007 case R_PPC64_LO_DS_OPT:
14008 insn = bfd_get_32 (input_bfd, contents + rel->r_offset - d_offset);
14009 if ((insn & (0x3f << 26)) != 58u << 26)
14010 abort ();
14011 insn += (14u << 26) - (58u << 26);
14012 bfd_put_32 (input_bfd, insn, contents + rel->r_offset - d_offset);
14013 r_type = R_PPC64_TOC16_LO;
14014 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14015 break;
14016
14017 case R_PPC64_TOC16:
14018 case R_PPC64_TOC16_LO:
14019 case R_PPC64_TOC16_DS:
14020 case R_PPC64_TOC16_LO_DS:
14021 {
14022 /* Check for toc tls entries. */
14023 unsigned char *toc_tls;
14024 int retval;
14025
14026 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
14027 &local_syms, rel, input_bfd);
14028 if (retval == 0)
14029 return FALSE;
14030
14031 if (toc_tls)
14032 {
14033 tls_mask = *toc_tls;
14034 if (r_type == R_PPC64_TOC16_DS
14035 || r_type == R_PPC64_TOC16_LO_DS)
14036 {
14037 if ((tls_mask & TLS_TLS) != 0
14038 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
14039 goto toctprel;
14040 }
14041 else
14042 {
14043 /* If we found a GD reloc pair, then we might be
14044 doing a GD->IE transition. */
14045 if (retval == 2)
14046 {
14047 tls_gd = TLS_TPRELGD;
14048 if ((tls_mask & TLS_TLS) != 0
14049 && (tls_mask & TLS_GD) == 0)
14050 goto tls_ldgd_opt;
14051 }
14052 else if (retval == 3)
14053 {
14054 if ((tls_mask & TLS_TLS) != 0
14055 && (tls_mask & TLS_LD) == 0)
14056 goto tls_ldgd_opt;
14057 }
14058 }
14059 }
14060 }
14061 break;
14062
14063 case R_PPC64_GOT_TPREL16_HI:
14064 case R_PPC64_GOT_TPREL16_HA:
14065 if ((tls_mask & TLS_TLS) != 0
14066 && (tls_mask & TLS_TPREL) == 0)
14067 {
14068 rel->r_offset -= d_offset;
14069 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14070 r_type = R_PPC64_NONE;
14071 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14072 }
14073 break;
14074
14075 case R_PPC64_GOT_TPREL16_DS:
14076 case R_PPC64_GOT_TPREL16_LO_DS:
14077 if ((tls_mask & TLS_TLS) != 0
14078 && (tls_mask & TLS_TPREL) == 0)
14079 {
14080 toctprel:
14081 insn = bfd_get_32 (input_bfd,
14082 contents + rel->r_offset - d_offset);
14083 insn &= 31 << 21;
14084 insn |= 0x3c0d0000; /* addis 0,13,0 */
14085 bfd_put_32 (input_bfd, insn,
14086 contents + rel->r_offset - d_offset);
14087 r_type = R_PPC64_TPREL16_HA;
14088 if (toc_symndx != 0)
14089 {
14090 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14091 rel->r_addend = toc_addend;
14092 /* We changed the symbol. Start over in order to
14093 get h, sym, sec etc. right. */
14094 goto again;
14095 }
14096 else
14097 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14098 }
14099 break;
14100
14101 case R_PPC64_TLS:
14102 if ((tls_mask & TLS_TLS) != 0
14103 && (tls_mask & TLS_TPREL) == 0)
14104 {
14105 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14106 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
14107 if (insn == 0)
14108 abort ();
14109 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14110 /* Was PPC64_TLS which sits on insn boundary, now
14111 PPC64_TPREL16_LO which is at low-order half-word. */
14112 rel->r_offset += d_offset;
14113 r_type = R_PPC64_TPREL16_LO;
14114 if (toc_symndx != 0)
14115 {
14116 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
14117 rel->r_addend = toc_addend;
14118 /* We changed the symbol. Start over in order to
14119 get h, sym, sec etc. right. */
14120 goto again;
14121 }
14122 else
14123 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14124 }
14125 break;
14126
14127 case R_PPC64_GOT_TLSGD16_HI:
14128 case R_PPC64_GOT_TLSGD16_HA:
14129 tls_gd = TLS_TPRELGD;
14130 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14131 goto tls_gdld_hi;
14132 break;
14133
14134 case R_PPC64_GOT_TLSLD16_HI:
14135 case R_PPC64_GOT_TLSLD16_HA:
14136 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14137 {
14138 tls_gdld_hi:
14139 if ((tls_mask & tls_gd) != 0)
14140 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14141 + R_PPC64_GOT_TPREL16_DS);
14142 else
14143 {
14144 rel->r_offset -= d_offset;
14145 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14146 r_type = R_PPC64_NONE;
14147 }
14148 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14149 }
14150 break;
14151
14152 case R_PPC64_GOT_TLSGD16:
14153 case R_PPC64_GOT_TLSGD16_LO:
14154 tls_gd = TLS_TPRELGD;
14155 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0)
14156 goto tls_ldgd_opt;
14157 break;
14158
14159 case R_PPC64_GOT_TLSLD16:
14160 case R_PPC64_GOT_TLSLD16_LO:
14161 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0)
14162 {
14163 unsigned int insn1, insn2;
14164 bfd_vma offset;
14165
14166 tls_ldgd_opt:
14167 offset = (bfd_vma) -1;
14168 /* If not using the newer R_PPC64_TLSGD/LD to mark
14169 __tls_get_addr calls, we must trust that the call
14170 stays with its arg setup insns, ie. that the next
14171 reloc is the __tls_get_addr call associated with
14172 the current reloc. Edit both insns. */
14173 if (input_section->has_tls_get_addr_call
14174 && rel + 1 < relend
14175 && branch_reloc_hash_match (input_bfd, rel + 1,
14176 htab->tls_get_addr,
14177 htab->tls_get_addr_fd))
14178 offset = rel[1].r_offset;
14179 /* We read the low GOT_TLS (or TOC16) insn because we
14180 need to keep the destination reg. It may be
14181 something other than the usual r3, and moved to r3
14182 before the call by intervening code. */
14183 insn1 = bfd_get_32 (input_bfd,
14184 contents + rel->r_offset - d_offset);
14185 if ((tls_mask & tls_gd) != 0)
14186 {
14187 /* IE */
14188 insn1 &= (0x1f << 21) | (0x1f << 16);
14189 insn1 |= 58 << 26; /* ld */
14190 insn2 = 0x7c636a14; /* add 3,3,13 */
14191 if (offset != (bfd_vma) -1)
14192 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14193 if ((tls_mask & TLS_EXPLICIT) == 0)
14194 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
14195 + R_PPC64_GOT_TPREL16_DS);
14196 else
14197 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
14198 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14199 }
14200 else
14201 {
14202 /* LE */
14203 insn1 &= 0x1f << 21;
14204 insn1 |= 0x3c0d0000; /* addis r,13,0 */
14205 insn2 = 0x38630000; /* addi 3,3,0 */
14206 if (tls_gd == 0)
14207 {
14208 /* Was an LD reloc. */
14209 if (toc_symndx)
14210 sec = local_sections[toc_symndx];
14211 for (r_symndx = 0;
14212 r_symndx < symtab_hdr->sh_info;
14213 r_symndx++)
14214 if (local_sections[r_symndx] == sec)
14215 break;
14216 if (r_symndx >= symtab_hdr->sh_info)
14217 r_symndx = STN_UNDEF;
14218 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14219 if (r_symndx != STN_UNDEF)
14220 rel->r_addend -= (local_syms[r_symndx].st_value
14221 + sec->output_offset
14222 + sec->output_section->vma);
14223 }
14224 else if (toc_symndx != 0)
14225 {
14226 r_symndx = toc_symndx;
14227 rel->r_addend = toc_addend;
14228 }
14229 r_type = R_PPC64_TPREL16_HA;
14230 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14231 if (offset != (bfd_vma) -1)
14232 {
14233 rel[1].r_info = ELF64_R_INFO (r_symndx,
14234 R_PPC64_TPREL16_LO);
14235 rel[1].r_offset = offset + d_offset;
14236 rel[1].r_addend = rel->r_addend;
14237 }
14238 }
14239 bfd_put_32 (input_bfd, insn1,
14240 contents + rel->r_offset - d_offset);
14241 if (offset != (bfd_vma) -1)
14242 bfd_put_32 (input_bfd, insn2, contents + offset);
14243 if ((tls_mask & tls_gd) == 0
14244 && (tls_gd == 0 || toc_symndx != 0))
14245 {
14246 /* We changed the symbol. Start over in order
14247 to get h, sym, sec etc. right. */
14248 goto again;
14249 }
14250 }
14251 break;
14252
14253 case R_PPC64_TLSGD:
14254 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_GD) == 0
14255 && rel + 1 < relend)
14256 {
14257 unsigned int insn2;
14258 bfd_vma offset = rel->r_offset;
14259
14260 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14261 {
14262 bfd_put_32 (output_bfd, NOP, contents + offset);
14263 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14264 break;
14265 }
14266
14267 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14268 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14269
14270 if ((tls_mask & TLS_TPRELGD) != 0)
14271 {
14272 /* IE */
14273 r_type = R_PPC64_NONE;
14274 insn2 = 0x7c636a14; /* add 3,3,13 */
14275 }
14276 else
14277 {
14278 /* LE */
14279 if (toc_symndx != 0)
14280 {
14281 r_symndx = toc_symndx;
14282 rel->r_addend = toc_addend;
14283 }
14284 r_type = R_PPC64_TPREL16_LO;
14285 rel->r_offset = offset + d_offset;
14286 insn2 = 0x38630000; /* addi 3,3,0 */
14287 }
14288 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14289 /* Zap the reloc on the _tls_get_addr call too. */
14290 BFD_ASSERT (offset == rel[1].r_offset);
14291 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14292 bfd_put_32 (input_bfd, insn2, contents + offset);
14293 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
14294 goto again;
14295 }
14296 break;
14297
14298 case R_PPC64_TLSLD:
14299 if ((tls_mask & TLS_TLS) != 0 && (tls_mask & TLS_LD) == 0
14300 && rel + 1 < relend)
14301 {
14302 unsigned int insn2;
14303 bfd_vma offset = rel->r_offset;
14304
14305 if (is_plt_seq_reloc (ELF64_R_TYPE (rel[1].r_info)))
14306 {
14307 bfd_put_32 (output_bfd, NOP, contents + offset);
14308 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14309 break;
14310 }
14311
14312 if (ELF64_R_TYPE (rel[1].r_info) == R_PPC64_PLTCALL)
14313 bfd_put_32 (output_bfd, NOP, contents + offset + 4);
14314
14315 if (toc_symndx)
14316 sec = local_sections[toc_symndx];
14317 for (r_symndx = 0;
14318 r_symndx < symtab_hdr->sh_info;
14319 r_symndx++)
14320 if (local_sections[r_symndx] == sec)
14321 break;
14322 if (r_symndx >= symtab_hdr->sh_info)
14323 r_symndx = STN_UNDEF;
14324 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
14325 if (r_symndx != STN_UNDEF)
14326 rel->r_addend -= (local_syms[r_symndx].st_value
14327 + sec->output_offset
14328 + sec->output_section->vma);
14329
14330 r_type = R_PPC64_TPREL16_LO;
14331 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14332 rel->r_offset = offset + d_offset;
14333 /* Zap the reloc on the _tls_get_addr call too. */
14334 BFD_ASSERT (offset == rel[1].r_offset);
14335 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
14336 insn2 = 0x38630000; /* addi 3,3,0 */
14337 bfd_put_32 (input_bfd, insn2, contents + offset);
14338 goto again;
14339 }
14340 break;
14341
14342 case R_PPC64_DTPMOD64:
14343 if (rel + 1 < relend
14344 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
14345 && rel[1].r_offset == rel->r_offset + 8)
14346 {
14347 if ((tls_mask & TLS_GD) == 0)
14348 {
14349 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
14350 if ((tls_mask & TLS_TPRELGD) != 0)
14351 r_type = R_PPC64_TPREL64;
14352 else
14353 {
14354 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
14355 r_type = R_PPC64_NONE;
14356 }
14357 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14358 }
14359 }
14360 else
14361 {
14362 if ((tls_mask & TLS_LD) == 0)
14363 {
14364 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
14365 r_type = R_PPC64_NONE;
14366 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14367 }
14368 }
14369 break;
14370
14371 case R_PPC64_TPREL64:
14372 if ((tls_mask & TLS_TPREL) == 0)
14373 {
14374 r_type = R_PPC64_NONE;
14375 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14376 }
14377 break;
14378
14379 case R_PPC64_ENTRY:
14380 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
14381 if (!bfd_link_pic (info)
14382 && !info->traditional_format
14383 && relocation + 0x80008000 <= 0xffffffff)
14384 {
14385 unsigned int insn1, insn2;
14386
14387 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14388 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14389 if ((insn1 & ~0xfffc) == LD_R2_0R12
14390 && insn2 == ADD_R2_R2_R12)
14391 {
14392 bfd_put_32 (input_bfd,
14393 LIS_R2 + PPC_HA (relocation),
14394 contents + rel->r_offset);
14395 bfd_put_32 (input_bfd,
14396 ADDI_R2_R2 + PPC_LO (relocation),
14397 contents + rel->r_offset + 4);
14398 }
14399 }
14400 else
14401 {
14402 relocation -= (rel->r_offset
14403 + input_section->output_offset
14404 + input_section->output_section->vma);
14405 if (relocation + 0x80008000 <= 0xffffffff)
14406 {
14407 unsigned int insn1, insn2;
14408
14409 insn1 = bfd_get_32 (input_bfd, contents + rel->r_offset);
14410 insn2 = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
14411 if ((insn1 & ~0xfffc) == LD_R2_0R12
14412 && insn2 == ADD_R2_R2_R12)
14413 {
14414 bfd_put_32 (input_bfd,
14415 ADDIS_R2_R12 + PPC_HA (relocation),
14416 contents + rel->r_offset);
14417 bfd_put_32 (input_bfd,
14418 ADDI_R2_R2 + PPC_LO (relocation),
14419 contents + rel->r_offset + 4);
14420 }
14421 }
14422 }
14423 break;
14424
14425 case R_PPC64_REL16_HA:
14426 /* If we are generating a non-PIC executable, edit
14427 . 0: addis 2,12,.TOC.-0b@ha
14428 . addi 2,2,.TOC.-0b@l
14429 used by ELFv2 global entry points to set up r2, to
14430 . lis 2,.TOC.@ha
14431 . addi 2,2,.TOC.@l
14432 if .TOC. is in range. */
14433 if (!bfd_link_pic (info)
14434 && !info->traditional_format
14435 && !htab->opd_abi
14436 && rel->r_addend == d_offset
14437 && h != NULL && &h->elf == htab->elf.hgot
14438 && rel + 1 < relend
14439 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
14440 && rel[1].r_offset == rel->r_offset + 4
14441 && rel[1].r_addend == rel->r_addend + 4
14442 && relocation + 0x80008000 <= 0xffffffff)
14443 {
14444 unsigned int insn1, insn2;
14445 bfd_vma offset = rel->r_offset - d_offset;
14446 insn1 = bfd_get_32 (input_bfd, contents + offset);
14447 insn2 = bfd_get_32 (input_bfd, contents + offset + 4);
14448 if ((insn1 & 0xffff0000) == ADDIS_R2_R12
14449 && (insn2 & 0xffff0000) == ADDI_R2_R2)
14450 {
14451 r_type = R_PPC64_ADDR16_HA;
14452 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
14453 rel->r_addend -= d_offset;
14454 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
14455 rel[1].r_addend -= d_offset + 4;
14456 bfd_put_32 (input_bfd, LIS_R2, contents + offset);
14457 }
14458 }
14459 break;
14460 }
14461
14462 /* Handle other relocations that tweak non-addend part of insn. */
14463 insn = 0;
14464 max_br_offset = 1 << 25;
14465 addend = rel->r_addend;
14466 reloc_dest = DEST_NORMAL;
14467 switch (r_type)
14468 {
14469 default:
14470 break;
14471
14472 case R_PPC64_TOCSAVE:
14473 if (relocation + addend == (rel->r_offset
14474 + input_section->output_offset
14475 + input_section->output_section->vma)
14476 && tocsave_find (htab, NO_INSERT,
14477 &local_syms, rel, input_bfd))
14478 {
14479 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
14480 if (insn == NOP
14481 || insn == CROR_151515 || insn == CROR_313131)
14482 bfd_put_32 (input_bfd,
14483 STD_R2_0R1 + STK_TOC (htab),
14484 contents + rel->r_offset);
14485 }
14486 break;
14487
14488 /* Branch taken prediction relocations. */
14489 case R_PPC64_ADDR14_BRTAKEN:
14490 case R_PPC64_REL14_BRTAKEN:
14491 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
14492 /* Fall through. */
14493
14494 /* Branch not taken prediction relocations. */
14495 case R_PPC64_ADDR14_BRNTAKEN:
14496 case R_PPC64_REL14_BRNTAKEN:
14497 insn |= bfd_get_32 (input_bfd,
14498 contents + rel->r_offset) & ~(0x01 << 21);
14499 /* Fall through. */
14500
14501 case R_PPC64_REL14:
14502 max_br_offset = 1 << 15;
14503 /* Fall through. */
14504
14505 case R_PPC64_REL24:
14506 case R_PPC64_PLTCALL:
14507 /* Calls to functions with a different TOC, such as calls to
14508 shared objects, need to alter the TOC pointer. This is
14509 done using a linkage stub. A REL24 branching to these
14510 linkage stubs needs to be followed by a nop, as the nop
14511 will be replaced with an instruction to restore the TOC
14512 base pointer. */
14513 fdh = h;
14514 if (h != NULL
14515 && h->oh != NULL
14516 && h->oh->is_func_descriptor)
14517 fdh = ppc_follow_link (h->oh);
14518 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
14519 htab);
14520 if (r_type == R_PPC64_PLTCALL
14521 && stub_entry != NULL
14522 && (stub_entry->stub_type == ppc_stub_plt_call
14523 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14524 stub_entry = NULL;
14525
14526 if (stub_entry != NULL
14527 && (stub_entry->stub_type == ppc_stub_plt_call
14528 || stub_entry->stub_type == ppc_stub_plt_call_r2save
14529 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
14530 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
14531 {
14532 bfd_boolean can_plt_call = FALSE;
14533
14534 if (stub_entry->stub_type == ppc_stub_plt_call
14535 && !htab->opd_abi
14536 && htab->params->plt_localentry0 != 0
14537 && is_elfv2_localentry0 (&h->elf))
14538 {
14539 /* The function doesn't use or change r2. */
14540 can_plt_call = TRUE;
14541 }
14542
14543 /* All of these stubs may modify r2, so there must be a
14544 branch and link followed by a nop. The nop is
14545 replaced by an insn to restore r2. */
14546 else if (rel->r_offset + 8 <= input_section->size)
14547 {
14548 unsigned long br;
14549
14550 br = bfd_get_32 (input_bfd,
14551 contents + rel->r_offset);
14552 if ((br & 1) != 0)
14553 {
14554 unsigned long nop;
14555
14556 nop = bfd_get_32 (input_bfd,
14557 contents + rel->r_offset + 4);
14558 if (nop == LD_R2_0R1 + STK_TOC (htab))
14559 can_plt_call = TRUE;
14560 else if (nop == NOP
14561 || nop == CROR_151515
14562 || nop == CROR_313131)
14563 {
14564 if (h != NULL
14565 && (h == htab->tls_get_addr_fd
14566 || h == htab->tls_get_addr)
14567 && htab->params->tls_get_addr_opt)
14568 {
14569 /* Special stub used, leave nop alone. */
14570 }
14571 else
14572 bfd_put_32 (input_bfd,
14573 LD_R2_0R1 + STK_TOC (htab),
14574 contents + rel->r_offset + 4);
14575 can_plt_call = TRUE;
14576 }
14577 }
14578 }
14579
14580 if (!can_plt_call && h != NULL)
14581 {
14582 const char *name = h->elf.root.root.string;
14583
14584 if (*name == '.')
14585 ++name;
14586
14587 if (strncmp (name, "__libc_start_main", 17) == 0
14588 && (name[17] == 0 || name[17] == '@'))
14589 {
14590 /* Allow crt1 branch to go via a toc adjusting
14591 stub. Other calls that never return could do
14592 the same, if we could detect such. */
14593 can_plt_call = TRUE;
14594 }
14595 }
14596
14597 if (!can_plt_call)
14598 {
14599 /* g++ as of 20130507 emits self-calls without a
14600 following nop. This is arguably wrong since we
14601 have conflicting information. On the one hand a
14602 global symbol and on the other a local call
14603 sequence, but don't error for this special case.
14604 It isn't possible to cheaply verify we have
14605 exactly such a call. Allow all calls to the same
14606 section. */
14607 asection *code_sec = sec;
14608
14609 if (get_opd_info (sec) != NULL)
14610 {
14611 bfd_vma off = (relocation + addend
14612 - sec->output_section->vma
14613 - sec->output_offset);
14614
14615 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
14616 }
14617 if (code_sec == input_section)
14618 can_plt_call = TRUE;
14619 }
14620
14621 if (!can_plt_call)
14622 {
14623 if (stub_entry->stub_type == ppc_stub_plt_call
14624 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14625 info->callbacks->einfo
14626 /* xgettext:c-format */
14627 (_("%H: call to `%pT' lacks nop, can't restore toc; "
14628 "recompile with -fPIC\n"),
14629 input_bfd, input_section, rel->r_offset, sym_name);
14630 else
14631 info->callbacks->einfo
14632 /* xgettext:c-format */
14633 (_("%H: call to `%pT' lacks nop, can't restore toc; "
14634 "(-mcmodel=small toc adjust stub)\n"),
14635 input_bfd, input_section, rel->r_offset, sym_name);
14636
14637 bfd_set_error (bfd_error_bad_value);
14638 ret = FALSE;
14639 }
14640
14641 if (can_plt_call
14642 && (stub_entry->stub_type == ppc_stub_plt_call
14643 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
14644 unresolved_reloc = FALSE;
14645 }
14646
14647 if ((stub_entry == NULL
14648 || stub_entry->stub_type == ppc_stub_long_branch
14649 || stub_entry->stub_type == ppc_stub_plt_branch)
14650 && get_opd_info (sec) != NULL)
14651 {
14652 /* The branch destination is the value of the opd entry. */
14653 bfd_vma off = (relocation + addend
14654 - sec->output_section->vma
14655 - sec->output_offset);
14656 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
14657 if (dest != (bfd_vma) -1)
14658 {
14659 relocation = dest;
14660 addend = 0;
14661 reloc_dest = DEST_OPD;
14662 }
14663 }
14664
14665 /* If the branch is out of reach we ought to have a long
14666 branch stub. */
14667 from = (rel->r_offset
14668 + input_section->output_offset
14669 + input_section->output_section->vma);
14670
14671 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14672 ? fdh->elf.other
14673 : sym->st_other);
14674
14675 if (stub_entry != NULL
14676 && (stub_entry->stub_type == ppc_stub_long_branch
14677 || stub_entry->stub_type == ppc_stub_plt_branch)
14678 && (r_type == R_PPC64_ADDR14_BRTAKEN
14679 || r_type == R_PPC64_ADDR14_BRNTAKEN
14680 || (relocation + addend - from + max_br_offset
14681 < 2 * max_br_offset)))
14682 /* Don't use the stub if this branch is in range. */
14683 stub_entry = NULL;
14684
14685 if (stub_entry != NULL)
14686 {
14687 /* Munge up the value and addend so that we call the stub
14688 rather than the procedure directly. */
14689 asection *stub_sec = stub_entry->group->stub_sec;
14690
14691 if (stub_entry->stub_type == ppc_stub_save_res)
14692 relocation += (stub_sec->output_offset
14693 + stub_sec->output_section->vma
14694 + stub_sec->size - htab->sfpr->size
14695 - htab->sfpr->output_offset
14696 - htab->sfpr->output_section->vma);
14697 else
14698 relocation = (stub_entry->stub_offset
14699 + stub_sec->output_offset
14700 + stub_sec->output_section->vma);
14701 addend = 0;
14702 reloc_dest = DEST_STUB;
14703
14704 if ((stub_entry->stub_type == ppc_stub_plt_call
14705 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14706 && (ALWAYS_EMIT_R2SAVE
14707 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14708 && rel + 1 < relend
14709 && rel[1].r_offset == rel->r_offset + 4
14710 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14711 relocation += 4;
14712 }
14713
14714 if (insn != 0)
14715 {
14716 if (is_isa_v2)
14717 {
14718 /* Set 'a' bit. This is 0b00010 in BO field for branch
14719 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14720 for branch on CTR insns (BO == 1a00t or 1a01t). */
14721 if ((insn & (0x14 << 21)) == (0x04 << 21))
14722 insn |= 0x02 << 21;
14723 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14724 insn |= 0x08 << 21;
14725 else
14726 break;
14727 }
14728 else
14729 {
14730 /* Invert 'y' bit if not the default. */
14731 if ((bfd_signed_vma) (relocation + addend - from) < 0)
14732 insn ^= 0x01 << 21;
14733 }
14734
14735 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
14736 }
14737
14738 /* NOP out calls to undefined weak functions.
14739 We can thus call a weak function without first
14740 checking whether the function is defined. */
14741 else if (h != NULL
14742 && h->elf.root.type == bfd_link_hash_undefweak
14743 && h->elf.dynindx == -1
14744 && r_type == R_PPC64_REL24
14745 && relocation == 0
14746 && addend == 0)
14747 {
14748 bfd_put_32 (input_bfd, NOP, contents + rel->r_offset);
14749 goto copy_reloc;
14750 }
14751 break;
14752 }
14753
14754 /* Set `addend'. */
14755 tls_type = 0;
14756 save_unresolved_reloc = unresolved_reloc;
14757 switch (r_type)
14758 {
14759 default:
14760 /* xgettext:c-format */
14761 _bfd_error_handler (_("%pB: %s unsupported"),
14762 input_bfd, ppc64_elf_howto_table[r_type]->name);
14763
14764 bfd_set_error (bfd_error_bad_value);
14765 ret = FALSE;
14766 goto copy_reloc;
14767
14768 case R_PPC64_NONE:
14769 case R_PPC64_TLS:
14770 case R_PPC64_TLSGD:
14771 case R_PPC64_TLSLD:
14772 case R_PPC64_TOCSAVE:
14773 case R_PPC64_GNU_VTINHERIT:
14774 case R_PPC64_GNU_VTENTRY:
14775 case R_PPC64_ENTRY:
14776 goto copy_reloc;
14777
14778 /* GOT16 relocations. Like an ADDR16 using the symbol's
14779 address in the GOT as relocation value instead of the
14780 symbol's value itself. Also, create a GOT entry for the
14781 symbol and put the symbol value there. */
14782 case R_PPC64_GOT_TLSGD16:
14783 case R_PPC64_GOT_TLSGD16_LO:
14784 case R_PPC64_GOT_TLSGD16_HI:
14785 case R_PPC64_GOT_TLSGD16_HA:
14786 tls_type = TLS_TLS | TLS_GD;
14787 goto dogot;
14788
14789 case R_PPC64_GOT_TLSLD16:
14790 case R_PPC64_GOT_TLSLD16_LO:
14791 case R_PPC64_GOT_TLSLD16_HI:
14792 case R_PPC64_GOT_TLSLD16_HA:
14793 tls_type = TLS_TLS | TLS_LD;
14794 goto dogot;
14795
14796 case R_PPC64_GOT_TPREL16_DS:
14797 case R_PPC64_GOT_TPREL16_LO_DS:
14798 case R_PPC64_GOT_TPREL16_HI:
14799 case R_PPC64_GOT_TPREL16_HA:
14800 tls_type = TLS_TLS | TLS_TPREL;
14801 goto dogot;
14802
14803 case R_PPC64_GOT_DTPREL16_DS:
14804 case R_PPC64_GOT_DTPREL16_LO_DS:
14805 case R_PPC64_GOT_DTPREL16_HI:
14806 case R_PPC64_GOT_DTPREL16_HA:
14807 tls_type = TLS_TLS | TLS_DTPREL;
14808 goto dogot;
14809
14810 case R_PPC64_GOT16:
14811 case R_PPC64_GOT16_LO:
14812 case R_PPC64_GOT16_HI:
14813 case R_PPC64_GOT16_HA:
14814 case R_PPC64_GOT16_DS:
14815 case R_PPC64_GOT16_LO_DS:
14816 dogot:
14817 {
14818 /* Relocation is to the entry for this symbol in the global
14819 offset table. */
14820 asection *got;
14821 bfd_vma *offp;
14822 bfd_vma off;
14823 unsigned long indx = 0;
14824 struct got_entry *ent;
14825
14826 if (tls_type == (TLS_TLS | TLS_LD)
14827 && (h == NULL
14828 || !h->elf.def_dynamic))
14829 ent = ppc64_tlsld_got (input_bfd);
14830 else
14831 {
14832 if (h != NULL)
14833 {
14834 if (!htab->elf.dynamic_sections_created
14835 || h->elf.dynindx == -1
14836 || SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14837 || UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf))
14838 /* This is actually a static link, or it is a
14839 -Bsymbolic link and the symbol is defined
14840 locally, or the symbol was forced to be local
14841 because of a version file. */
14842 ;
14843 else
14844 {
14845 indx = h->elf.dynindx;
14846 unresolved_reloc = FALSE;
14847 }
14848 ent = h->elf.got.glist;
14849 }
14850 else
14851 {
14852 if (local_got_ents == NULL)
14853 abort ();
14854 ent = local_got_ents[r_symndx];
14855 }
14856
14857 for (; ent != NULL; ent = ent->next)
14858 if (ent->addend == orig_rel.r_addend
14859 && ent->owner == input_bfd
14860 && ent->tls_type == tls_type)
14861 break;
14862 }
14863
14864 if (ent == NULL)
14865 abort ();
14866 if (ent->is_indirect)
14867 ent = ent->got.ent;
14868 offp = &ent->got.offset;
14869 got = ppc64_elf_tdata (ent->owner)->got;
14870 if (got == NULL)
14871 abort ();
14872
14873 /* The offset must always be a multiple of 8. We use the
14874 least significant bit to record whether we have already
14875 processed this entry. */
14876 off = *offp;
14877 if ((off & 1) != 0)
14878 off &= ~1;
14879 else
14880 {
14881 /* Generate relocs for the dynamic linker, except in
14882 the case of TLSLD where we'll use one entry per
14883 module. */
14884 asection *relgot;
14885 bfd_boolean ifunc;
14886
14887 *offp = off | 1;
14888 relgot = NULL;
14889 ifunc = (h != NULL
14890 ? h->elf.type == STT_GNU_IFUNC
14891 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
14892 if (ifunc)
14893 {
14894 relgot = htab->elf.irelplt;
14895 if (indx == 0)
14896 htab->local_ifunc_resolver = 1;
14897 else if (is_static_defined (&h->elf))
14898 htab->maybe_local_ifunc_resolver = 1;
14899 }
14900 else if (indx != 0
14901 || (bfd_link_pic (info)
14902 && (h == NULL
14903 || !UNDEFWEAK_NO_DYNAMIC_RELOC (info, &h->elf)
14904 || (tls_type == (TLS_TLS | TLS_LD)
14905 && !h->elf.def_dynamic))
14906 && !(tls_type == (TLS_TLS | TLS_TPREL)
14907 && bfd_link_executable (info)
14908 && SYMBOL_REFERENCES_LOCAL (info, &h->elf))))
14909 relgot = ppc64_elf_tdata (ent->owner)->relgot;
14910 if (relgot != NULL)
14911 {
14912 outrel.r_offset = (got->output_section->vma
14913 + got->output_offset
14914 + off);
14915 outrel.r_addend = addend;
14916 if (tls_type & (TLS_LD | TLS_GD))
14917 {
14918 outrel.r_addend = 0;
14919 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
14920 if (tls_type == (TLS_TLS | TLS_GD))
14921 {
14922 loc = relgot->contents;
14923 loc += (relgot->reloc_count++
14924 * sizeof (Elf64_External_Rela));
14925 bfd_elf64_swap_reloca_out (output_bfd,
14926 &outrel, loc);
14927 outrel.r_offset += 8;
14928 outrel.r_addend = addend;
14929 outrel.r_info
14930 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14931 }
14932 }
14933 else if (tls_type == (TLS_TLS | TLS_DTPREL))
14934 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14935 else if (tls_type == (TLS_TLS | TLS_TPREL))
14936 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
14937 else if (indx != 0)
14938 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14939 else
14940 {
14941 if (ifunc)
14942 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14943 else
14944 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14945
14946 /* Write the .got section contents for the sake
14947 of prelink. */
14948 loc = got->contents + off;
14949 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14950 loc);
14951 }
14952
14953 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
14954 {
14955 outrel.r_addend += relocation;
14956 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
14957 {
14958 if (htab->elf.tls_sec == NULL)
14959 outrel.r_addend = 0;
14960 else
14961 outrel.r_addend -= htab->elf.tls_sec->vma;
14962 }
14963 }
14964 loc = relgot->contents;
14965 loc += (relgot->reloc_count++
14966 * sizeof (Elf64_External_Rela));
14967 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14968 }
14969
14970 /* Init the .got section contents here if we're not
14971 emitting a reloc. */
14972 else
14973 {
14974 relocation += addend;
14975 if (tls_type != 0)
14976 {
14977 if (htab->elf.tls_sec == NULL)
14978 relocation = 0;
14979 else
14980 {
14981 if (tls_type & TLS_LD)
14982 relocation = 0;
14983 else
14984 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14985 if (tls_type & TLS_TPREL)
14986 relocation += DTP_OFFSET - TP_OFFSET;
14987 }
14988
14989 if (tls_type & (TLS_GD | TLS_LD))
14990 {
14991 bfd_put_64 (output_bfd, relocation,
14992 got->contents + off + 8);
14993 relocation = 1;
14994 }
14995 }
14996 bfd_put_64 (output_bfd, relocation,
14997 got->contents + off);
14998 }
14999 }
15000
15001 if (off >= (bfd_vma) -2)
15002 abort ();
15003
15004 relocation = got->output_section->vma + got->output_offset + off;
15005 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
15006 }
15007 break;
15008
15009 case R_PPC64_PLT16_HA:
15010 case R_PPC64_PLT16_HI:
15011 case R_PPC64_PLT16_LO:
15012 case R_PPC64_PLT16_LO_DS:
15013 case R_PPC64_PLT32:
15014 case R_PPC64_PLT64:
15015 case R_PPC64_PLTSEQ:
15016 case R_PPC64_PLTCALL:
15017 /* Relocation is to the entry for this symbol in the
15018 procedure linkage table. */
15019 unresolved_reloc = TRUE;
15020 {
15021 struct plt_entry **plt_list = NULL;
15022 if (h != NULL)
15023 plt_list = &h->elf.plt.plist;
15024 else if (local_got_ents != NULL)
15025 {
15026 struct plt_entry **local_plt = (struct plt_entry **)
15027 (local_got_ents + symtab_hdr->sh_info);
15028 plt_list = local_plt + r_symndx;
15029 }
15030 if (plt_list)
15031 {
15032 struct plt_entry *ent;
15033
15034 for (ent = *plt_list; ent != NULL; ent = ent->next)
15035 if (ent->plt.offset != (bfd_vma) -1
15036 && ent->addend == orig_rel.r_addend)
15037 {
15038 asection *plt;
15039 bfd_vma got;
15040
15041 plt = htab->elf.splt;
15042 if (!htab->elf.dynamic_sections_created
15043 || h == NULL
15044 || h->elf.dynindx == -1)
15045 {
15046 if (h != NULL
15047 ? h->elf.type == STT_GNU_IFUNC
15048 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15049 plt = htab->elf.iplt;
15050 else
15051 plt = htab->pltlocal;
15052 }
15053 relocation = (plt->output_section->vma
15054 + plt->output_offset
15055 + ent->plt.offset);
15056 if (r_type == R_PPC64_PLT16_HA
15057 || r_type ==R_PPC64_PLT16_HI
15058 || r_type ==R_PPC64_PLT16_LO
15059 || r_type ==R_PPC64_PLT16_LO_DS)
15060 {
15061 got = (elf_gp (output_bfd)
15062 + htab->sec_info[input_section->id].toc_off);
15063 relocation -= got;
15064 }
15065 addend = 0;
15066 unresolved_reloc = FALSE;
15067 break;
15068 }
15069 }
15070 }
15071 break;
15072
15073 case R_PPC64_TOC:
15074 /* Relocation value is TOC base. */
15075 relocation = TOCstart;
15076 if (r_symndx == STN_UNDEF)
15077 relocation += htab->sec_info[input_section->id].toc_off;
15078 else if (unresolved_reloc)
15079 ;
15080 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
15081 relocation += htab->sec_info[sec->id].toc_off;
15082 else
15083 unresolved_reloc = TRUE;
15084 goto dodyn;
15085
15086 /* TOC16 relocs. We want the offset relative to the TOC base,
15087 which is the address of the start of the TOC plus 0x8000.
15088 The TOC consists of sections .got, .toc, .tocbss, and .plt,
15089 in this order. */
15090 case R_PPC64_TOC16:
15091 case R_PPC64_TOC16_LO:
15092 case R_PPC64_TOC16_HI:
15093 case R_PPC64_TOC16_DS:
15094 case R_PPC64_TOC16_LO_DS:
15095 case R_PPC64_TOC16_HA:
15096 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
15097 break;
15098
15099 /* Relocate against the beginning of the section. */
15100 case R_PPC64_SECTOFF:
15101 case R_PPC64_SECTOFF_LO:
15102 case R_PPC64_SECTOFF_HI:
15103 case R_PPC64_SECTOFF_DS:
15104 case R_PPC64_SECTOFF_LO_DS:
15105 case R_PPC64_SECTOFF_HA:
15106 if (sec != NULL)
15107 addend -= sec->output_section->vma;
15108 break;
15109
15110 case R_PPC64_REL16:
15111 case R_PPC64_REL16_LO:
15112 case R_PPC64_REL16_HI:
15113 case R_PPC64_REL16_HA:
15114 case R_PPC64_REL16DX_HA:
15115 break;
15116
15117 case R_PPC64_REL14:
15118 case R_PPC64_REL14_BRNTAKEN:
15119 case R_PPC64_REL14_BRTAKEN:
15120 case R_PPC64_REL24:
15121 break;
15122
15123 case R_PPC64_TPREL16:
15124 case R_PPC64_TPREL16_LO:
15125 case R_PPC64_TPREL16_HI:
15126 case R_PPC64_TPREL16_HA:
15127 case R_PPC64_TPREL16_DS:
15128 case R_PPC64_TPREL16_LO_DS:
15129 case R_PPC64_TPREL16_HIGH:
15130 case R_PPC64_TPREL16_HIGHA:
15131 case R_PPC64_TPREL16_HIGHER:
15132 case R_PPC64_TPREL16_HIGHERA:
15133 case R_PPC64_TPREL16_HIGHEST:
15134 case R_PPC64_TPREL16_HIGHESTA:
15135 if (h != NULL
15136 && h->elf.root.type == bfd_link_hash_undefweak
15137 && h->elf.dynindx == -1)
15138 {
15139 /* Make this relocation against an undefined weak symbol
15140 resolve to zero. This is really just a tweak, since
15141 code using weak externs ought to check that they are
15142 defined before using them. */
15143 bfd_byte *p = contents + rel->r_offset - d_offset;
15144
15145 insn = bfd_get_32 (input_bfd, p);
15146 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
15147 if (insn != 0)
15148 bfd_put_32 (input_bfd, insn, p);
15149 break;
15150 }
15151 if (htab->elf.tls_sec != NULL)
15152 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
15153 /* The TPREL16 relocs shouldn't really be used in shared
15154 libs or with non-local symbols as that will result in
15155 DT_TEXTREL being set, but support them anyway. */
15156 goto dodyn;
15157
15158 case R_PPC64_DTPREL16:
15159 case R_PPC64_DTPREL16_LO:
15160 case R_PPC64_DTPREL16_HI:
15161 case R_PPC64_DTPREL16_HA:
15162 case R_PPC64_DTPREL16_DS:
15163 case R_PPC64_DTPREL16_LO_DS:
15164 case R_PPC64_DTPREL16_HIGH:
15165 case R_PPC64_DTPREL16_HIGHA:
15166 case R_PPC64_DTPREL16_HIGHER:
15167 case R_PPC64_DTPREL16_HIGHERA:
15168 case R_PPC64_DTPREL16_HIGHEST:
15169 case R_PPC64_DTPREL16_HIGHESTA:
15170 if (htab->elf.tls_sec != NULL)
15171 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
15172 break;
15173
15174 case R_PPC64_ADDR64_LOCAL:
15175 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
15176 ? h->elf.other
15177 : sym->st_other);
15178 break;
15179
15180 case R_PPC64_DTPMOD64:
15181 relocation = 1;
15182 addend = 0;
15183 goto dodyn;
15184
15185 case R_PPC64_TPREL64:
15186 if (htab->elf.tls_sec != NULL)
15187 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
15188 goto dodyn;
15189
15190 case R_PPC64_DTPREL64:
15191 if (htab->elf.tls_sec != NULL)
15192 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
15193 /* Fall through. */
15194
15195 /* Relocations that may need to be propagated if this is a
15196 dynamic object. */
15197 case R_PPC64_REL30:
15198 case R_PPC64_REL32:
15199 case R_PPC64_REL64:
15200 case R_PPC64_ADDR14:
15201 case R_PPC64_ADDR14_BRNTAKEN:
15202 case R_PPC64_ADDR14_BRTAKEN:
15203 case R_PPC64_ADDR16:
15204 case R_PPC64_ADDR16_DS:
15205 case R_PPC64_ADDR16_HA:
15206 case R_PPC64_ADDR16_HI:
15207 case R_PPC64_ADDR16_HIGH:
15208 case R_PPC64_ADDR16_HIGHA:
15209 case R_PPC64_ADDR16_HIGHER:
15210 case R_PPC64_ADDR16_HIGHERA:
15211 case R_PPC64_ADDR16_HIGHEST:
15212 case R_PPC64_ADDR16_HIGHESTA:
15213 case R_PPC64_ADDR16_LO:
15214 case R_PPC64_ADDR16_LO_DS:
15215 case R_PPC64_ADDR24:
15216 case R_PPC64_ADDR32:
15217 case R_PPC64_ADDR64:
15218 case R_PPC64_UADDR16:
15219 case R_PPC64_UADDR32:
15220 case R_PPC64_UADDR64:
15221 dodyn:
15222 if ((input_section->flags & SEC_ALLOC) == 0)
15223 break;
15224
15225 if (NO_OPD_RELOCS && is_opd)
15226 break;
15227
15228 if (bfd_link_pic (info)
15229 ? ((h == NULL
15230 || h->dyn_relocs != NULL)
15231 && ((h != NULL && pc_dynrelocs (h))
15232 || must_be_dyn_reloc (info, r_type)))
15233 : (h != NULL
15234 ? h->dyn_relocs != NULL
15235 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
15236 {
15237 bfd_boolean skip, relocate;
15238 asection *sreloc;
15239 bfd_vma out_off;
15240 long indx = 0;
15241
15242 /* When generating a dynamic object, these relocations
15243 are copied into the output file to be resolved at run
15244 time. */
15245
15246 skip = FALSE;
15247 relocate = FALSE;
15248
15249 out_off = _bfd_elf_section_offset (output_bfd, info,
15250 input_section, rel->r_offset);
15251 if (out_off == (bfd_vma) -1)
15252 skip = TRUE;
15253 else if (out_off == (bfd_vma) -2)
15254 skip = TRUE, relocate = TRUE;
15255 out_off += (input_section->output_section->vma
15256 + input_section->output_offset);
15257 outrel.r_offset = out_off;
15258 outrel.r_addend = rel->r_addend;
15259
15260 /* Optimize unaligned reloc use. */
15261 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
15262 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
15263 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
15264 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
15265 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
15266 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
15267 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
15268 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
15269 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
15270
15271 if (skip)
15272 memset (&outrel, 0, sizeof outrel);
15273 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
15274 && !is_opd
15275 && r_type != R_PPC64_TOC)
15276 {
15277 indx = h->elf.dynindx;
15278 BFD_ASSERT (indx != -1);
15279 outrel.r_info = ELF64_R_INFO (indx, r_type);
15280 }
15281 else
15282 {
15283 /* This symbol is local, or marked to become local,
15284 or this is an opd section reloc which must point
15285 at a local function. */
15286 outrel.r_addend += relocation;
15287 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
15288 {
15289 if (is_opd && h != NULL)
15290 {
15291 /* Lie about opd entries. This case occurs
15292 when building shared libraries and we
15293 reference a function in another shared
15294 lib. The same thing happens for a weak
15295 definition in an application that's
15296 overridden by a strong definition in a
15297 shared lib. (I believe this is a generic
15298 bug in binutils handling of weak syms.)
15299 In these cases we won't use the opd
15300 entry in this lib. */
15301 unresolved_reloc = FALSE;
15302 }
15303 if (!is_opd
15304 && r_type == R_PPC64_ADDR64
15305 && (h != NULL
15306 ? h->elf.type == STT_GNU_IFUNC
15307 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
15308 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15309 else
15310 {
15311 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
15312
15313 /* We need to relocate .opd contents for ld.so.
15314 Prelink also wants simple and consistent rules
15315 for relocs. This make all RELATIVE relocs have
15316 *r_offset equal to r_addend. */
15317 relocate = TRUE;
15318 }
15319 }
15320 else
15321 {
15322 if (h != NULL
15323 ? h->elf.type == STT_GNU_IFUNC
15324 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15325 {
15326 info->callbacks->einfo
15327 /* xgettext:c-format */
15328 (_("%H: %s for indirect "
15329 "function `%pT' unsupported\n"),
15330 input_bfd, input_section, rel->r_offset,
15331 ppc64_elf_howto_table[r_type]->name,
15332 sym_name);
15333 ret = FALSE;
15334 }
15335 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
15336 ;
15337 else if (sec == NULL || sec->owner == NULL)
15338 {
15339 bfd_set_error (bfd_error_bad_value);
15340 return FALSE;
15341 }
15342 else
15343 {
15344 asection *osec;
15345
15346 osec = sec->output_section;
15347 indx = elf_section_data (osec)->dynindx;
15348
15349 if (indx == 0)
15350 {
15351 if ((osec->flags & SEC_READONLY) == 0
15352 && htab->elf.data_index_section != NULL)
15353 osec = htab->elf.data_index_section;
15354 else
15355 osec = htab->elf.text_index_section;
15356 indx = elf_section_data (osec)->dynindx;
15357 }
15358 BFD_ASSERT (indx != 0);
15359
15360 /* We are turning this relocation into one
15361 against a section symbol, so subtract out
15362 the output section's address but not the
15363 offset of the input section in the output
15364 section. */
15365 outrel.r_addend -= osec->vma;
15366 }
15367
15368 outrel.r_info = ELF64_R_INFO (indx, r_type);
15369 }
15370 }
15371
15372 sreloc = elf_section_data (input_section)->sreloc;
15373 if (h != NULL
15374 ? h->elf.type == STT_GNU_IFUNC
15375 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
15376 {
15377 sreloc = htab->elf.irelplt;
15378 if (indx == 0)
15379 htab->local_ifunc_resolver = 1;
15380 else if (is_static_defined (&h->elf))
15381 htab->maybe_local_ifunc_resolver = 1;
15382 }
15383 if (sreloc == NULL)
15384 abort ();
15385
15386 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
15387 >= sreloc->size)
15388 abort ();
15389 loc = sreloc->contents;
15390 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
15391 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
15392
15393 /* If this reloc is against an external symbol, it will
15394 be computed at runtime, so there's no need to do
15395 anything now. However, for the sake of prelink ensure
15396 that the section contents are a known value. */
15397 if (! relocate)
15398 {
15399 unresolved_reloc = FALSE;
15400 /* The value chosen here is quite arbitrary as ld.so
15401 ignores section contents except for the special
15402 case of .opd where the contents might be accessed
15403 before relocation. Choose zero, as that won't
15404 cause reloc overflow. */
15405 relocation = 0;
15406 addend = 0;
15407 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
15408 to improve backward compatibility with older
15409 versions of ld. */
15410 if (r_type == R_PPC64_ADDR64)
15411 addend = outrel.r_addend;
15412 /* Adjust pc_relative relocs to have zero in *r_offset. */
15413 else if (ppc64_elf_howto_table[r_type]->pc_relative)
15414 addend = outrel.r_offset;
15415 }
15416 }
15417 break;
15418
15419 case R_PPC64_COPY:
15420 case R_PPC64_GLOB_DAT:
15421 case R_PPC64_JMP_SLOT:
15422 case R_PPC64_JMP_IREL:
15423 case R_PPC64_RELATIVE:
15424 /* We shouldn't ever see these dynamic relocs in relocatable
15425 files. */
15426 /* Fall through. */
15427
15428 case R_PPC64_PLTGOT16:
15429 case R_PPC64_PLTGOT16_DS:
15430 case R_PPC64_PLTGOT16_HA:
15431 case R_PPC64_PLTGOT16_HI:
15432 case R_PPC64_PLTGOT16_LO:
15433 case R_PPC64_PLTGOT16_LO_DS:
15434 case R_PPC64_PLTREL32:
15435 case R_PPC64_PLTREL64:
15436 /* These ones haven't been implemented yet. */
15437
15438 info->callbacks->einfo
15439 /* xgettext:c-format */
15440 (_("%P: %pB: %s is not supported for `%pT'\n"),
15441 input_bfd,
15442 ppc64_elf_howto_table[r_type]->name, sym_name);
15443
15444 bfd_set_error (bfd_error_invalid_operation);
15445 ret = FALSE;
15446 goto copy_reloc;
15447 }
15448
15449 /* Multi-instruction sequences that access the TOC can be
15450 optimized, eg. addis ra,r2,0; addi rb,ra,x;
15451 to nop; addi rb,r2,x; */
15452 switch (r_type)
15453 {
15454 default:
15455 break;
15456
15457 case R_PPC64_GOT_TLSLD16_HI:
15458 case R_PPC64_GOT_TLSGD16_HI:
15459 case R_PPC64_GOT_TPREL16_HI:
15460 case R_PPC64_GOT_DTPREL16_HI:
15461 case R_PPC64_GOT16_HI:
15462 case R_PPC64_TOC16_HI:
15463 /* These relocs would only be useful if building up an
15464 offset to later add to r2, perhaps in an indexed
15465 addressing mode instruction. Don't try to optimize.
15466 Unfortunately, the possibility of someone building up an
15467 offset like this or even with the HA relocs, means that
15468 we need to check the high insn when optimizing the low
15469 insn. */
15470 break;
15471
15472 case R_PPC64_PLTCALL:
15473 if (unresolved_reloc)
15474 {
15475 /* No plt entry. Make this into a direct call. */
15476 bfd_byte *p = contents + rel->r_offset;
15477 insn = bfd_get_32 (input_bfd, p);
15478 insn &= 1;
15479 bfd_put_32 (input_bfd, B_DOT | insn, p);
15480 bfd_put_32 (input_bfd, NOP, p + 4);
15481 unresolved_reloc = save_unresolved_reloc;
15482 r_type = R_PPC64_REL24;
15483 }
15484 break;
15485
15486 case R_PPC64_PLTSEQ:
15487 if (unresolved_reloc)
15488 {
15489 unresolved_reloc = FALSE;
15490 goto nop_it;
15491 }
15492 break;
15493
15494 case R_PPC64_PLT16_HA:
15495 if (unresolved_reloc)
15496 {
15497 unresolved_reloc = FALSE;
15498 goto nop_it;
15499 }
15500 /* Fall through. */
15501 case R_PPC64_GOT_TLSLD16_HA:
15502 case R_PPC64_GOT_TLSGD16_HA:
15503 case R_PPC64_GOT_TPREL16_HA:
15504 case R_PPC64_GOT_DTPREL16_HA:
15505 case R_PPC64_GOT16_HA:
15506 case R_PPC64_TOC16_HA:
15507 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15508 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15509 {
15510 bfd_byte *p;
15511 nop_it:
15512 p = contents + (rel->r_offset & ~3);
15513 bfd_put_32 (input_bfd, NOP, p);
15514 goto copy_reloc;
15515 }
15516 break;
15517
15518 case R_PPC64_PLT16_LO:
15519 case R_PPC64_PLT16_LO_DS:
15520 if (unresolved_reloc)
15521 {
15522 unresolved_reloc = FALSE;
15523 goto nop_it;
15524 }
15525 /* Fall through. */
15526 case R_PPC64_GOT_TLSLD16_LO:
15527 case R_PPC64_GOT_TLSGD16_LO:
15528 case R_PPC64_GOT_TPREL16_LO_DS:
15529 case R_PPC64_GOT_DTPREL16_LO_DS:
15530 case R_PPC64_GOT16_LO:
15531 case R_PPC64_GOT16_LO_DS:
15532 case R_PPC64_TOC16_LO:
15533 case R_PPC64_TOC16_LO_DS:
15534 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
15535 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
15536 {
15537 bfd_byte *p = contents + (rel->r_offset & ~3);
15538 insn = bfd_get_32 (input_bfd, p);
15539 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
15540 {
15541 /* Transform addic to addi when we change reg. */
15542 insn &= ~((0x3f << 26) | (0x1f << 16));
15543 insn |= (14u << 26) | (2 << 16);
15544 }
15545 else
15546 {
15547 insn &= ~(0x1f << 16);
15548 insn |= 2 << 16;
15549 }
15550 bfd_put_32 (input_bfd, insn, p);
15551 }
15552 break;
15553
15554 case R_PPC64_TPREL16_HA:
15555 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15556 {
15557 bfd_byte *p = contents + (rel->r_offset & ~3);
15558 insn = bfd_get_32 (input_bfd, p);
15559 if ((insn & ((0x3f << 26) | 0x1f << 16))
15560 != ((15u << 26) | (13 << 16)) /* addis rt,13,imm */)
15561 /* xgettext:c-format */
15562 info->callbacks->minfo
15563 (_("%H: warning: %s unexpected insn %#x.\n"),
15564 input_bfd, input_section, rel->r_offset,
15565 ppc64_elf_howto_table[r_type]->name, insn);
15566 else
15567 {
15568 bfd_put_32 (input_bfd, NOP, p);
15569 goto copy_reloc;
15570 }
15571 }
15572 break;
15573
15574 case R_PPC64_TPREL16_LO:
15575 case R_PPC64_TPREL16_LO_DS:
15576 if (htab->do_tls_opt && relocation + addend + 0x8000 < 0x10000)
15577 {
15578 bfd_byte *p = contents + (rel->r_offset & ~3);
15579 insn = bfd_get_32 (input_bfd, p);
15580 insn &= ~(0x1f << 16);
15581 insn |= 13 << 16;
15582 bfd_put_32 (input_bfd, insn, p);
15583 }
15584 break;
15585 }
15586
15587 /* Do any further special processing. */
15588 switch (r_type)
15589 {
15590 default:
15591 break;
15592
15593 case R_PPC64_REL16_HA:
15594 case R_PPC64_REL16DX_HA:
15595 case R_PPC64_ADDR16_HA:
15596 case R_PPC64_ADDR16_HIGHA:
15597 case R_PPC64_ADDR16_HIGHERA:
15598 case R_PPC64_ADDR16_HIGHESTA:
15599 case R_PPC64_TOC16_HA:
15600 case R_PPC64_SECTOFF_HA:
15601 case R_PPC64_TPREL16_HA:
15602 case R_PPC64_TPREL16_HIGHA:
15603 case R_PPC64_TPREL16_HIGHERA:
15604 case R_PPC64_TPREL16_HIGHESTA:
15605 case R_PPC64_DTPREL16_HA:
15606 case R_PPC64_DTPREL16_HIGHA:
15607 case R_PPC64_DTPREL16_HIGHERA:
15608 case R_PPC64_DTPREL16_HIGHESTA:
15609 /* It's just possible that this symbol is a weak symbol
15610 that's not actually defined anywhere. In that case,
15611 'sec' would be NULL, and we should leave the symbol
15612 alone (it will be set to zero elsewhere in the link). */
15613 if (sec == NULL)
15614 break;
15615 /* Fall through. */
15616
15617 case R_PPC64_GOT16_HA:
15618 case R_PPC64_PLTGOT16_HA:
15619 case R_PPC64_PLT16_HA:
15620 case R_PPC64_GOT_TLSGD16_HA:
15621 case R_PPC64_GOT_TLSLD16_HA:
15622 case R_PPC64_GOT_TPREL16_HA:
15623 case R_PPC64_GOT_DTPREL16_HA:
15624 /* Add 0x10000 if sign bit in 0:15 is set.
15625 Bits 0:15 are not used. */
15626 addend += 0x8000;
15627 break;
15628
15629 case R_PPC64_ADDR16_DS:
15630 case R_PPC64_ADDR16_LO_DS:
15631 case R_PPC64_GOT16_DS:
15632 case R_PPC64_GOT16_LO_DS:
15633 case R_PPC64_PLT16_LO_DS:
15634 case R_PPC64_SECTOFF_DS:
15635 case R_PPC64_SECTOFF_LO_DS:
15636 case R_PPC64_TOC16_DS:
15637 case R_PPC64_TOC16_LO_DS:
15638 case R_PPC64_PLTGOT16_DS:
15639 case R_PPC64_PLTGOT16_LO_DS:
15640 case R_PPC64_GOT_TPREL16_DS:
15641 case R_PPC64_GOT_TPREL16_LO_DS:
15642 case R_PPC64_GOT_DTPREL16_DS:
15643 case R_PPC64_GOT_DTPREL16_LO_DS:
15644 case R_PPC64_TPREL16_DS:
15645 case R_PPC64_TPREL16_LO_DS:
15646 case R_PPC64_DTPREL16_DS:
15647 case R_PPC64_DTPREL16_LO_DS:
15648 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15649 mask = 3;
15650 /* If this reloc is against an lq, lxv, or stxv insn, then
15651 the value must be a multiple of 16. This is somewhat of
15652 a hack, but the "correct" way to do this by defining _DQ
15653 forms of all the _DS relocs bloats all reloc switches in
15654 this file. It doesn't make much sense to use these
15655 relocs in data, so testing the insn should be safe. */
15656 if ((insn & (0x3f << 26)) == (56u << 26)
15657 || ((insn & (0x3f << 26)) == (61u << 26) && (insn & 3) == 1))
15658 mask = 15;
15659 relocation += addend;
15660 addend = insn & (mask ^ 3);
15661 if ((relocation & mask) != 0)
15662 {
15663 relocation ^= relocation & mask;
15664 info->callbacks->einfo
15665 /* xgettext:c-format */
15666 (_("%H: error: %s not a multiple of %u\n"),
15667 input_bfd, input_section, rel->r_offset,
15668 ppc64_elf_howto_table[r_type]->name,
15669 mask + 1);
15670 bfd_set_error (bfd_error_bad_value);
15671 ret = FALSE;
15672 goto copy_reloc;
15673 }
15674 break;
15675 }
15676
15677 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
15678 because such sections are not SEC_ALLOC and thus ld.so will
15679 not process them. */
15680 howto = ppc64_elf_howto_table[(int) r_type];
15681 if (unresolved_reloc
15682 && !((input_section->flags & SEC_DEBUGGING) != 0
15683 && h->elf.def_dynamic)
15684 && _bfd_elf_section_offset (output_bfd, info, input_section,
15685 rel->r_offset) != (bfd_vma) -1)
15686 {
15687 info->callbacks->einfo
15688 /* xgettext:c-format */
15689 (_("%H: unresolvable %s against `%pT'\n"),
15690 input_bfd, input_section, rel->r_offset,
15691 howto->name,
15692 h->elf.root.root.string);
15693 ret = FALSE;
15694 }
15695
15696 /* 16-bit fields in insns mostly have signed values, but a
15697 few insns have 16-bit unsigned values. Really, we should
15698 have different reloc types. */
15699 if (howto->complain_on_overflow != complain_overflow_dont
15700 && howto->dst_mask == 0xffff
15701 && (input_section->flags & SEC_CODE) != 0)
15702 {
15703 enum complain_overflow complain = complain_overflow_signed;
15704
15705 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
15706 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
15707 complain = complain_overflow_bitfield;
15708 else if (howto->rightshift == 0
15709 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
15710 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
15711 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
15712 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
15713 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
15714 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
15715 complain = complain_overflow_unsigned;
15716 if (howto->complain_on_overflow != complain)
15717 {
15718 alt_howto = *howto;
15719 alt_howto.complain_on_overflow = complain;
15720 howto = &alt_howto;
15721 }
15722 }
15723
15724 if (r_type == R_PPC64_REL16DX_HA)
15725 {
15726 /* Split field reloc isn't handled by _bfd_final_link_relocate. */
15727 if (rel->r_offset + 4 > input_section->size)
15728 r = bfd_reloc_outofrange;
15729 else
15730 {
15731 relocation += addend;
15732 relocation -= (rel->r_offset
15733 + input_section->output_offset
15734 + input_section->output_section->vma);
15735 relocation = (bfd_signed_vma) relocation >> 16;
15736 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
15737 insn &= ~0x1fffc1;
15738 insn |= (relocation & 0xffc1) | ((relocation & 0x3e) << 15);
15739 bfd_put_32 (input_bfd, insn, contents + rel->r_offset);
15740 r = bfd_reloc_ok;
15741 if (relocation + 0x8000 > 0xffff)
15742 r = bfd_reloc_overflow;
15743 }
15744 }
15745 else
15746 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
15747 rel->r_offset, relocation, addend);
15748
15749 if (r != bfd_reloc_ok)
15750 {
15751 char *more_info = NULL;
15752 const char *reloc_name = howto->name;
15753
15754 if (reloc_dest != DEST_NORMAL)
15755 {
15756 more_info = bfd_malloc (strlen (reloc_name) + 8);
15757 if (more_info != NULL)
15758 {
15759 strcpy (more_info, reloc_name);
15760 strcat (more_info, (reloc_dest == DEST_OPD
15761 ? " (OPD)" : " (stub)"));
15762 reloc_name = more_info;
15763 }
15764 }
15765
15766 if (r == bfd_reloc_overflow)
15767 {
15768 /* On code like "if (foo) foo();" don't report overflow
15769 on a branch to zero when foo is undefined. */
15770 if (!warned
15771 && (reloc_dest == DEST_STUB
15772 || !(h != NULL
15773 && (h->elf.root.type == bfd_link_hash_undefweak
15774 || h->elf.root.type == bfd_link_hash_undefined)
15775 && is_branch_reloc (r_type))))
15776 info->callbacks->reloc_overflow (info, &h->elf.root,
15777 sym_name, reloc_name,
15778 orig_rel.r_addend,
15779 input_bfd, input_section,
15780 rel->r_offset);
15781 }
15782 else
15783 {
15784 info->callbacks->einfo
15785 /* xgettext:c-format */
15786 (_("%H: %s against `%pT': error %d\n"),
15787 input_bfd, input_section, rel->r_offset,
15788 reloc_name, sym_name, (int) r);
15789 ret = FALSE;
15790 }
15791 if (more_info != NULL)
15792 free (more_info);
15793 }
15794 copy_reloc:
15795 if (wrel != rel)
15796 *wrel = *rel;
15797 }
15798
15799 if (wrel != rel)
15800 {
15801 Elf_Internal_Shdr *rel_hdr;
15802 size_t deleted = rel - wrel;
15803
15804 rel_hdr = _bfd_elf_single_rel_hdr (input_section->output_section);
15805 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15806 if (rel_hdr->sh_size == 0)
15807 {
15808 /* It is too late to remove an empty reloc section. Leave
15809 one NONE reloc.
15810 ??? What is wrong with an empty section??? */
15811 rel_hdr->sh_size = rel_hdr->sh_entsize;
15812 deleted -= 1;
15813 }
15814 rel_hdr = _bfd_elf_single_rel_hdr (input_section);
15815 rel_hdr->sh_size -= rel_hdr->sh_entsize * deleted;
15816 input_section->reloc_count -= deleted;
15817 }
15818
15819 /* If we're emitting relocations, then shortly after this function
15820 returns, reloc offsets and addends for this section will be
15821 adjusted. Worse, reloc symbol indices will be for the output
15822 file rather than the input. Save a copy of the relocs for
15823 opd_entry_value. */
15824 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
15825 {
15826 bfd_size_type amt;
15827 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15828 rel = bfd_alloc (input_bfd, amt);
15829 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15830 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
15831 if (rel == NULL)
15832 return FALSE;
15833 memcpy (rel, relocs, amt);
15834 }
15835 return ret;
15836 }
15837
15838 /* Adjust the value of any local symbols in opd sections. */
15839
15840 static int
15841 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
15842 const char *name ATTRIBUTE_UNUSED,
15843 Elf_Internal_Sym *elfsym,
15844 asection *input_sec,
15845 struct elf_link_hash_entry *h)
15846 {
15847 struct _opd_sec_data *opd;
15848 long adjust;
15849 bfd_vma value;
15850
15851 if (h != NULL)
15852 return 1;
15853
15854 opd = get_opd_info (input_sec);
15855 if (opd == NULL || opd->adjust == NULL)
15856 return 1;
15857
15858 value = elfsym->st_value - input_sec->output_offset;
15859 if (!bfd_link_relocatable (info))
15860 value -= input_sec->output_section->vma;
15861
15862 adjust = opd->adjust[OPD_NDX (value)];
15863 if (adjust == -1)
15864 return 2;
15865
15866 elfsym->st_value += adjust;
15867 return 1;
15868 }
15869
15870 /* Finish up dynamic symbol handling. We set the contents of various
15871 dynamic sections here. */
15872
15873 static bfd_boolean
15874 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
15875 struct bfd_link_info *info,
15876 struct elf_link_hash_entry *h,
15877 Elf_Internal_Sym *sym)
15878 {
15879 struct ppc_link_hash_table *htab;
15880 struct plt_entry *ent;
15881
15882 htab = ppc_hash_table (info);
15883 if (htab == NULL)
15884 return FALSE;
15885
15886 if (!htab->opd_abi && !h->def_regular)
15887 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
15888 if (ent->plt.offset != (bfd_vma) -1)
15889 {
15890 /* Mark the symbol as undefined, rather than as
15891 defined in glink. Leave the value if there were
15892 any relocations where pointer equality matters
15893 (this is a clue for the dynamic linker, to make
15894 function pointer comparisons work between an
15895 application and shared library), otherwise set it
15896 to zero. */
15897 sym->st_shndx = SHN_UNDEF;
15898 if (!h->pointer_equality_needed)
15899 sym->st_value = 0;
15900 else if (!h->ref_regular_nonweak)
15901 {
15902 /* This breaks function pointer comparisons, but
15903 that is better than breaking tests for a NULL
15904 function pointer. */
15905 sym->st_value = 0;
15906 }
15907 break;
15908 }
15909
15910 if (h->needs_copy)
15911 {
15912 /* This symbol needs a copy reloc. Set it up. */
15913 Elf_Internal_Rela rela;
15914 asection *srel;
15915 bfd_byte *loc;
15916
15917 if (h->dynindx == -1
15918 || (h->root.type != bfd_link_hash_defined
15919 && h->root.type != bfd_link_hash_defweak)
15920 || htab->elf.srelbss == NULL
15921 || htab->elf.sreldynrelro == NULL)
15922 abort ();
15923
15924 rela.r_offset = (h->root.u.def.value
15925 + h->root.u.def.section->output_section->vma
15926 + h->root.u.def.section->output_offset);
15927 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
15928 rela.r_addend = 0;
15929 if (h->root.u.def.section == htab->elf.sdynrelro)
15930 srel = htab->elf.sreldynrelro;
15931 else
15932 srel = htab->elf.srelbss;
15933 loc = srel->contents;
15934 loc += srel->reloc_count++ * sizeof (Elf64_External_Rela);
15935 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15936 }
15937
15938 return TRUE;
15939 }
15940
15941 /* Used to decide how to sort relocs in an optimal manner for the
15942 dynamic linker, before writing them out. */
15943
15944 static enum elf_reloc_type_class
15945 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
15946 const asection *rel_sec,
15947 const Elf_Internal_Rela *rela)
15948 {
15949 enum elf_ppc64_reloc_type r_type;
15950 struct ppc_link_hash_table *htab = ppc_hash_table (info);
15951
15952 if (rel_sec == htab->elf.irelplt)
15953 return reloc_class_ifunc;
15954
15955 r_type = ELF64_R_TYPE (rela->r_info);
15956 switch (r_type)
15957 {
15958 case R_PPC64_RELATIVE:
15959 return reloc_class_relative;
15960 case R_PPC64_JMP_SLOT:
15961 return reloc_class_plt;
15962 case R_PPC64_COPY:
15963 return reloc_class_copy;
15964 default:
15965 return reloc_class_normal;
15966 }
15967 }
15968
15969 /* Finish up the dynamic sections. */
15970
15971 static bfd_boolean
15972 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
15973 struct bfd_link_info *info)
15974 {
15975 struct ppc_link_hash_table *htab;
15976 bfd *dynobj;
15977 asection *sdyn;
15978
15979 htab = ppc_hash_table (info);
15980 if (htab == NULL)
15981 return FALSE;
15982
15983 dynobj = htab->elf.dynobj;
15984 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
15985
15986 if (htab->elf.dynamic_sections_created)
15987 {
15988 Elf64_External_Dyn *dyncon, *dynconend;
15989
15990 if (sdyn == NULL || htab->elf.sgot == NULL)
15991 abort ();
15992
15993 dyncon = (Elf64_External_Dyn *) sdyn->contents;
15994 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
15995 for (; dyncon < dynconend; dyncon++)
15996 {
15997 Elf_Internal_Dyn dyn;
15998 asection *s;
15999
16000 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
16001
16002 switch (dyn.d_tag)
16003 {
16004 default:
16005 continue;
16006
16007 case DT_PPC64_GLINK:
16008 s = htab->glink;
16009 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
16010 /* We stupidly defined DT_PPC64_GLINK to be the start
16011 of glink rather than the first entry point, which is
16012 what ld.so needs, and now have a bigger stub to
16013 support automatic multiple TOCs. */
16014 dyn.d_un.d_ptr += GLINK_PLTRESOLVE_SIZE (htab) - 8 * 4;
16015 break;
16016
16017 case DT_PPC64_OPD:
16018 s = bfd_get_section_by_name (output_bfd, ".opd");
16019 if (s == NULL)
16020 continue;
16021 dyn.d_un.d_ptr = s->vma;
16022 break;
16023
16024 case DT_PPC64_OPT:
16025 if (htab->do_multi_toc && htab->multi_toc_needed)
16026 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
16027 if (htab->has_plt_localentry0)
16028 dyn.d_un.d_val |= PPC64_OPT_LOCALENTRY;
16029 break;
16030
16031 case DT_PPC64_OPDSZ:
16032 s = bfd_get_section_by_name (output_bfd, ".opd");
16033 if (s == NULL)
16034 continue;
16035 dyn.d_un.d_val = s->size;
16036 break;
16037
16038 case DT_PLTGOT:
16039 s = htab->elf.splt;
16040 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
16041 break;
16042
16043 case DT_JMPREL:
16044 s = htab->elf.srelplt;
16045 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
16046 break;
16047
16048 case DT_PLTRELSZ:
16049 dyn.d_un.d_val = htab->elf.srelplt->size;
16050 break;
16051
16052 case DT_TEXTREL:
16053 if (htab->local_ifunc_resolver)
16054 info->callbacks->einfo
16055 (_("%X%P: text relocations and GNU indirect "
16056 "functions will result in a segfault at runtime\n"));
16057 else if (htab->maybe_local_ifunc_resolver)
16058 info->callbacks->einfo
16059 (_("%P: warning: text relocations and GNU indirect "
16060 "functions may result in a segfault at runtime\n"));
16061 continue;
16062 }
16063
16064 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
16065 }
16066 }
16067
16068 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0
16069 && htab->elf.sgot->output_section != bfd_abs_section_ptr)
16070 {
16071 /* Fill in the first entry in the global offset table.
16072 We use it to hold the link-time TOCbase. */
16073 bfd_put_64 (output_bfd,
16074 elf_gp (output_bfd) + TOC_BASE_OFF,
16075 htab->elf.sgot->contents);
16076
16077 /* Set .got entry size. */
16078 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
16079 }
16080
16081 if (htab->elf.splt != NULL && htab->elf.splt->size != 0
16082 && htab->elf.splt->output_section != bfd_abs_section_ptr)
16083 {
16084 /* Set .plt entry size. */
16085 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
16086 = PLT_ENTRY_SIZE (htab);
16087 }
16088
16089 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
16090 brlt ourselves if emitrelocations. */
16091 if (htab->brlt != NULL
16092 && htab->brlt->reloc_count != 0
16093 && !_bfd_elf_link_output_relocs (output_bfd,
16094 htab->brlt,
16095 elf_section_data (htab->brlt)->rela.hdr,
16096 elf_section_data (htab->brlt)->relocs,
16097 NULL))
16098 return FALSE;
16099
16100 if (htab->glink != NULL
16101 && htab->glink->reloc_count != 0
16102 && !_bfd_elf_link_output_relocs (output_bfd,
16103 htab->glink,
16104 elf_section_data (htab->glink)->rela.hdr,
16105 elf_section_data (htab->glink)->relocs,
16106 NULL))
16107 return FALSE;
16108
16109 if (htab->glink_eh_frame != NULL
16110 && htab->glink_eh_frame->size != 0)
16111 {
16112 bfd_vma val;
16113 bfd_byte *p;
16114 struct map_stub *group;
16115 size_t align = 4;
16116
16117 p = htab->glink_eh_frame->contents;
16118 p += (sizeof (glink_eh_frame_cie) + align - 1) & -align;
16119
16120 for (group = htab->group; group != NULL; group = group->next)
16121 if (group->stub_sec != NULL)
16122 {
16123 /* Offset to stub section. */
16124 val = (group->stub_sec->output_section->vma
16125 + group->stub_sec->output_offset);
16126 val -= (htab->glink_eh_frame->output_section->vma
16127 + htab->glink_eh_frame->output_offset
16128 + (p + 8 - htab->glink_eh_frame->contents));
16129 if (val + 0x80000000 > 0xffffffff)
16130 {
16131 _bfd_error_handler
16132 (_("%s offset too large for .eh_frame sdata4 encoding"),
16133 group->stub_sec->name);
16134 return FALSE;
16135 }
16136 bfd_put_32 (dynobj, val, p + 8);
16137 p += stub_eh_frame_size (group, align);
16138 }
16139 if (htab->glink != NULL && htab->glink->size != 0)
16140 {
16141 /* Offset to .glink. */
16142 val = (htab->glink->output_section->vma
16143 + htab->glink->output_offset
16144 + 8);
16145 val -= (htab->glink_eh_frame->output_section->vma
16146 + htab->glink_eh_frame->output_offset
16147 + (p + 8 - htab->glink_eh_frame->contents));
16148 if (val + 0x80000000 > 0xffffffff)
16149 {
16150 _bfd_error_handler
16151 (_("%s offset too large for .eh_frame sdata4 encoding"),
16152 htab->glink->name);
16153 return FALSE;
16154 }
16155 bfd_put_32 (dynobj, val, p + 8);
16156 p += (24 + align - 1) & -align;
16157 }
16158
16159 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
16160 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
16161 htab->glink_eh_frame,
16162 htab->glink_eh_frame->contents))
16163 return FALSE;
16164 }
16165
16166 /* We need to handle writing out multiple GOT sections ourselves,
16167 since we didn't add them to DYNOBJ. We know dynobj is the first
16168 bfd. */
16169 while ((dynobj = dynobj->link.next) != NULL)
16170 {
16171 asection *s;
16172
16173 if (!is_ppc64_elf (dynobj))
16174 continue;
16175
16176 s = ppc64_elf_tdata (dynobj)->got;
16177 if (s != NULL
16178 && s->size != 0
16179 && s->output_section != bfd_abs_section_ptr
16180 && !bfd_set_section_contents (output_bfd, s->output_section,
16181 s->contents, s->output_offset,
16182 s->size))
16183 return FALSE;
16184 s = ppc64_elf_tdata (dynobj)->relgot;
16185 if (s != NULL
16186 && s->size != 0
16187 && s->output_section != bfd_abs_section_ptr
16188 && !bfd_set_section_contents (output_bfd, s->output_section,
16189 s->contents, s->output_offset,
16190 s->size))
16191 return FALSE;
16192 }
16193
16194 return TRUE;
16195 }
16196
16197 #include "elf64-target.h"
16198
16199 /* FreeBSD support */
16200
16201 #undef TARGET_LITTLE_SYM
16202 #undef TARGET_LITTLE_NAME
16203
16204 #undef TARGET_BIG_SYM
16205 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
16206 #undef TARGET_BIG_NAME
16207 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
16208
16209 #undef ELF_OSABI
16210 #define ELF_OSABI ELFOSABI_FREEBSD
16211
16212 #undef elf64_bed
16213 #define elf64_bed elf64_powerpc_fbsd_bed
16214
16215 #include "elf64-target.h"
This page took 0.438121 seconds and 4 git commands to generate.