]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blob - bfd/elf64-ppc.c
Add --no-dynamic-linker option to ld, for static PIE use
[thirdparty/binutils-gdb.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright (C) 1999-2015 Free Software Foundation, Inc.
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
5 Largely rewritten by Alan Modra.
6
7 This file is part of BFD, the Binary File Descriptor library.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License along
20 with this program; if not, write to the Free Software Foundation, Inc.,
21 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
22
23
24 /* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
27
28 #include "sysdep.h"
29 #include <stdarg.h>
30 #include "bfd.h"
31 #include "bfdlink.h"
32 #include "libbfd.h"
33 #include "elf-bfd.h"
34 #include "elf/ppc64.h"
35 #include "elf64-ppc.h"
36 #include "dwarf2.h"
37
38 static bfd_reloc_status_type ppc64_elf_ha_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
40 static bfd_reloc_status_type ppc64_elf_branch_reloc
41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
42 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
44 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
46 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
48 static bfd_reloc_status_type ppc64_elf_toc_reloc
49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
50 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
52 static bfd_reloc_status_type ppc64_elf_toc64_reloc
53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
54 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
55 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
56 static bfd_vma opd_entry_value
57 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
58
59 #define TARGET_LITTLE_SYM powerpc_elf64_le_vec
60 #define TARGET_LITTLE_NAME "elf64-powerpcle"
61 #define TARGET_BIG_SYM powerpc_elf64_vec
62 #define TARGET_BIG_NAME "elf64-powerpc"
63 #define ELF_ARCH bfd_arch_powerpc
64 #define ELF_TARGET_ID PPC64_ELF_DATA
65 #define ELF_MACHINE_CODE EM_PPC64
66 #define ELF_MAXPAGESIZE 0x10000
67 #define ELF_COMMONPAGESIZE 0x10000
68 #define elf_info_to_howto ppc64_elf_info_to_howto
69
70 #define elf_backend_want_got_sym 0
71 #define elf_backend_want_plt_sym 0
72 #define elf_backend_plt_alignment 3
73 #define elf_backend_plt_not_loaded 1
74 #define elf_backend_got_header_size 8
75 #define elf_backend_can_gc_sections 1
76 #define elf_backend_can_refcount 1
77 #define elf_backend_rela_normal 1
78 #define elf_backend_default_execstack 0
79
80 #define bfd_elf64_mkobject ppc64_elf_mkobject
81 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
82 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
83 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
84 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
85 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
86 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
87 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
88 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
89
90 #define elf_backend_object_p ppc64_elf_object_p
91 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
92 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
93 #define elf_backend_write_core_note ppc64_elf_write_core_note
94 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
95 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
96 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
97 #define elf_backend_check_directives ppc64_elf_before_check_relocs
98 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
99 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
100 #define elf_backend_check_relocs ppc64_elf_check_relocs
101 #define elf_backend_gc_keep ppc64_elf_gc_keep
102 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
103 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
104 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
105 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
106 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
107 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
108 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
109 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
110 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
111 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
112 #define elf_backend_action_discarded ppc64_elf_action_discarded
113 #define elf_backend_relocate_section ppc64_elf_relocate_section
114 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
115 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
116 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
117 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
118 #define elf_backend_special_sections ppc64_elf_special_sections
119 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
120
121 /* The name of the dynamic interpreter. This is put in the .interp
122 section. */
123 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
124
125 /* The size in bytes of an entry in the procedure linkage table. */
126 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
127
128 /* The initial size of the plt reserved for the dynamic linker. */
129 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
130
131 /* Offsets to some stack save slots. */
132 #define STK_LR 16
133 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
134 /* This one is dodgy. ELFv2 does not have a linker word, so use the
135 CR save slot. Used only by optimised __tls_get_addr call stub,
136 relying on __tls_get_addr_opt not saving CR.. */
137 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
138
139 /* TOC base pointers offset from start of TOC. */
140 #define TOC_BASE_OFF 0x8000
141 /* TOC base alignment. */
142 #define TOC_BASE_ALIGN 256
143
144 /* Offset of tp and dtp pointers from start of TLS block. */
145 #define TP_OFFSET 0x7000
146 #define DTP_OFFSET 0x8000
147
148 /* .plt call stub instructions. The normal stub is like this, but
149 sometimes the .plt entry crosses a 64k boundary and we need to
150 insert an addi to adjust r11. */
151 #define STD_R2_0R1 0xf8410000 /* std %r2,0+40(%r1) */
152 #define ADDIS_R11_R2 0x3d620000 /* addis %r11,%r2,xxx@ha */
153 #define LD_R12_0R11 0xe98b0000 /* ld %r12,xxx+0@l(%r11) */
154 #define MTCTR_R12 0x7d8903a6 /* mtctr %r12 */
155 #define LD_R2_0R11 0xe84b0000 /* ld %r2,xxx+8@l(%r11) */
156 #define LD_R11_0R11 0xe96b0000 /* ld %r11,xxx+16@l(%r11) */
157 #define BCTR 0x4e800420 /* bctr */
158
159 #define ADDI_R11_R11 0x396b0000 /* addi %r11,%r11,off@l */
160 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
161 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
162
163 #define XOR_R2_R12_R12 0x7d826278 /* xor %r2,%r12,%r12 */
164 #define ADD_R11_R11_R2 0x7d6b1214 /* add %r11,%r11,%r2 */
165 #define XOR_R11_R12_R12 0x7d8b6278 /* xor %r11,%r12,%r12 */
166 #define ADD_R2_R2_R11 0x7c425a14 /* add %r2,%r2,%r11 */
167 #define CMPLDI_R2_0 0x28220000 /* cmpldi %r2,0 */
168 #define BNECTR 0x4ca20420 /* bnectr+ */
169 #define BNECTR_P4 0x4ce20420 /* bnectr+ */
170
171 #define LD_R12_0R2 0xe9820000 /* ld %r12,xxx+0(%r2) */
172 #define LD_R11_0R2 0xe9620000 /* ld %r11,xxx+0(%r2) */
173 #define LD_R2_0R2 0xe8420000 /* ld %r2,xxx+0(%r2) */
174
175 #define LD_R2_0R1 0xe8410000 /* ld %r2,0(%r1) */
176
177 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
178 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
179 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
180
181 /* glink call stub instructions. We enter with the index in R0. */
182 #define GLINK_CALL_STUB_SIZE (16*4)
183 /* 0: */
184 /* .quad plt0-1f */
185 /* __glink: */
186 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
187 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
188 /* 1: */
189 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
190 /* ld %2,(0b-1b)(%11) */
191 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
192 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
193 /* ld %12,0(%11) */
194 /* ld %2,8(%11) */
195 /* mtctr %12 */
196 /* ld %11,16(%11) */
197 /* bctr */
198 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
199 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
200 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
201 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
202 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
203
204 /* Pad with this. */
205 #define NOP 0x60000000
206
207 /* Some other nops. */
208 #define CROR_151515 0x4def7b82
209 #define CROR_313131 0x4ffffb82
210
211 /* .glink entries for the first 32k functions are two instructions. */
212 #define LI_R0_0 0x38000000 /* li %r0,0 */
213 #define B_DOT 0x48000000 /* b . */
214
215 /* After that, we need two instructions to load the index, followed by
216 a branch. */
217 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
218 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
219
220 /* Instructions used by the save and restore reg functions. */
221 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
222 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
223 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
224 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
225 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
226 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
227 #define LI_R12_0 0x39800000 /* li %r12,0 */
228 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
229 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
230 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
231 #define BLR 0x4e800020 /* blr */
232
233 /* Since .opd is an array of descriptors and each entry will end up
234 with identical R_PPC64_RELATIVE relocs, there is really no need to
235 propagate .opd relocs; The dynamic linker should be taught to
236 relocate .opd without reloc entries. */
237 #ifndef NO_OPD_RELOCS
238 #define NO_OPD_RELOCS 0
239 #endif
240
241 #ifndef ARRAY_SIZE
242 #define ARRAY_SIZE(a) (sizeof (a) / sizeof ((a)[0]))
243 #endif
244
245 static inline int
246 abiversion (bfd *abfd)
247 {
248 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
249 }
250
251 static inline void
252 set_abiversion (bfd *abfd, int ver)
253 {
254 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
255 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
256 }
257 \f
258 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
259
260 /* Relocation HOWTO's. */
261 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
262
263 static reloc_howto_type ppc64_elf_howto_raw[] = {
264 /* This reloc does nothing. */
265 HOWTO (R_PPC64_NONE, /* type */
266 0, /* rightshift */
267 3, /* size (0 = byte, 1 = short, 2 = long) */
268 0, /* bitsize */
269 FALSE, /* pc_relative */
270 0, /* bitpos */
271 complain_overflow_dont, /* complain_on_overflow */
272 bfd_elf_generic_reloc, /* special_function */
273 "R_PPC64_NONE", /* name */
274 FALSE, /* partial_inplace */
275 0, /* src_mask */
276 0, /* dst_mask */
277 FALSE), /* pcrel_offset */
278
279 /* A standard 32 bit relocation. */
280 HOWTO (R_PPC64_ADDR32, /* type */
281 0, /* rightshift */
282 2, /* size (0 = byte, 1 = short, 2 = long) */
283 32, /* bitsize */
284 FALSE, /* pc_relative */
285 0, /* bitpos */
286 complain_overflow_bitfield, /* complain_on_overflow */
287 bfd_elf_generic_reloc, /* special_function */
288 "R_PPC64_ADDR32", /* name */
289 FALSE, /* partial_inplace */
290 0, /* src_mask */
291 0xffffffff, /* dst_mask */
292 FALSE), /* pcrel_offset */
293
294 /* An absolute 26 bit branch; the lower two bits must be zero.
295 FIXME: we don't check that, we just clear them. */
296 HOWTO (R_PPC64_ADDR24, /* type */
297 0, /* rightshift */
298 2, /* size (0 = byte, 1 = short, 2 = long) */
299 26, /* bitsize */
300 FALSE, /* pc_relative */
301 0, /* bitpos */
302 complain_overflow_bitfield, /* complain_on_overflow */
303 bfd_elf_generic_reloc, /* special_function */
304 "R_PPC64_ADDR24", /* name */
305 FALSE, /* partial_inplace */
306 0, /* src_mask */
307 0x03fffffc, /* dst_mask */
308 FALSE), /* pcrel_offset */
309
310 /* A standard 16 bit relocation. */
311 HOWTO (R_PPC64_ADDR16, /* type */
312 0, /* rightshift */
313 1, /* size (0 = byte, 1 = short, 2 = long) */
314 16, /* bitsize */
315 FALSE, /* pc_relative */
316 0, /* bitpos */
317 complain_overflow_bitfield, /* complain_on_overflow */
318 bfd_elf_generic_reloc, /* special_function */
319 "R_PPC64_ADDR16", /* name */
320 FALSE, /* partial_inplace */
321 0, /* src_mask */
322 0xffff, /* dst_mask */
323 FALSE), /* pcrel_offset */
324
325 /* A 16 bit relocation without overflow. */
326 HOWTO (R_PPC64_ADDR16_LO, /* type */
327 0, /* rightshift */
328 1, /* size (0 = byte, 1 = short, 2 = long) */
329 16, /* bitsize */
330 FALSE, /* pc_relative */
331 0, /* bitpos */
332 complain_overflow_dont,/* complain_on_overflow */
333 bfd_elf_generic_reloc, /* special_function */
334 "R_PPC64_ADDR16_LO", /* name */
335 FALSE, /* partial_inplace */
336 0, /* src_mask */
337 0xffff, /* dst_mask */
338 FALSE), /* pcrel_offset */
339
340 /* Bits 16-31 of an address. */
341 HOWTO (R_PPC64_ADDR16_HI, /* type */
342 16, /* rightshift */
343 1, /* size (0 = byte, 1 = short, 2 = long) */
344 16, /* bitsize */
345 FALSE, /* pc_relative */
346 0, /* bitpos */
347 complain_overflow_signed, /* complain_on_overflow */
348 bfd_elf_generic_reloc, /* special_function */
349 "R_PPC64_ADDR16_HI", /* name */
350 FALSE, /* partial_inplace */
351 0, /* src_mask */
352 0xffff, /* dst_mask */
353 FALSE), /* pcrel_offset */
354
355 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
356 bits, treated as a signed number, is negative. */
357 HOWTO (R_PPC64_ADDR16_HA, /* type */
358 16, /* rightshift */
359 1, /* size (0 = byte, 1 = short, 2 = long) */
360 16, /* bitsize */
361 FALSE, /* pc_relative */
362 0, /* bitpos */
363 complain_overflow_signed, /* complain_on_overflow */
364 ppc64_elf_ha_reloc, /* special_function */
365 "R_PPC64_ADDR16_HA", /* name */
366 FALSE, /* partial_inplace */
367 0, /* src_mask */
368 0xffff, /* dst_mask */
369 FALSE), /* pcrel_offset */
370
371 /* An absolute 16 bit branch; the lower two bits must be zero.
372 FIXME: we don't check that, we just clear them. */
373 HOWTO (R_PPC64_ADDR14, /* type */
374 0, /* rightshift */
375 2, /* size (0 = byte, 1 = short, 2 = long) */
376 16, /* bitsize */
377 FALSE, /* pc_relative */
378 0, /* bitpos */
379 complain_overflow_signed, /* complain_on_overflow */
380 ppc64_elf_branch_reloc, /* special_function */
381 "R_PPC64_ADDR14", /* name */
382 FALSE, /* partial_inplace */
383 0, /* src_mask */
384 0x0000fffc, /* dst_mask */
385 FALSE), /* pcrel_offset */
386
387 /* An absolute 16 bit branch, for which bit 10 should be set to
388 indicate that the branch is expected to be taken. The lower two
389 bits must be zero. */
390 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
391 0, /* rightshift */
392 2, /* size (0 = byte, 1 = short, 2 = long) */
393 16, /* bitsize */
394 FALSE, /* pc_relative */
395 0, /* bitpos */
396 complain_overflow_signed, /* complain_on_overflow */
397 ppc64_elf_brtaken_reloc, /* special_function */
398 "R_PPC64_ADDR14_BRTAKEN",/* name */
399 FALSE, /* partial_inplace */
400 0, /* src_mask */
401 0x0000fffc, /* dst_mask */
402 FALSE), /* pcrel_offset */
403
404 /* An absolute 16 bit branch, for which bit 10 should be set to
405 indicate that the branch is not expected to be taken. The lower
406 two bits must be zero. */
407 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
408 0, /* rightshift */
409 2, /* size (0 = byte, 1 = short, 2 = long) */
410 16, /* bitsize */
411 FALSE, /* pc_relative */
412 0, /* bitpos */
413 complain_overflow_signed, /* complain_on_overflow */
414 ppc64_elf_brtaken_reloc, /* special_function */
415 "R_PPC64_ADDR14_BRNTAKEN",/* name */
416 FALSE, /* partial_inplace */
417 0, /* src_mask */
418 0x0000fffc, /* dst_mask */
419 FALSE), /* pcrel_offset */
420
421 /* A relative 26 bit branch; the lower two bits must be zero. */
422 HOWTO (R_PPC64_REL24, /* type */
423 0, /* rightshift */
424 2, /* size (0 = byte, 1 = short, 2 = long) */
425 26, /* bitsize */
426 TRUE, /* pc_relative */
427 0, /* bitpos */
428 complain_overflow_signed, /* complain_on_overflow */
429 ppc64_elf_branch_reloc, /* special_function */
430 "R_PPC64_REL24", /* name */
431 FALSE, /* partial_inplace */
432 0, /* src_mask */
433 0x03fffffc, /* dst_mask */
434 TRUE), /* pcrel_offset */
435
436 /* A relative 16 bit branch; the lower two bits must be zero. */
437 HOWTO (R_PPC64_REL14, /* type */
438 0, /* rightshift */
439 2, /* size (0 = byte, 1 = short, 2 = long) */
440 16, /* bitsize */
441 TRUE, /* pc_relative */
442 0, /* bitpos */
443 complain_overflow_signed, /* complain_on_overflow */
444 ppc64_elf_branch_reloc, /* special_function */
445 "R_PPC64_REL14", /* name */
446 FALSE, /* partial_inplace */
447 0, /* src_mask */
448 0x0000fffc, /* dst_mask */
449 TRUE), /* pcrel_offset */
450
451 /* A relative 16 bit branch. Bit 10 should be set to indicate that
452 the branch is expected to be taken. The lower two bits must be
453 zero. */
454 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
455 0, /* rightshift */
456 2, /* size (0 = byte, 1 = short, 2 = long) */
457 16, /* bitsize */
458 TRUE, /* pc_relative */
459 0, /* bitpos */
460 complain_overflow_signed, /* complain_on_overflow */
461 ppc64_elf_brtaken_reloc, /* special_function */
462 "R_PPC64_REL14_BRTAKEN", /* name */
463 FALSE, /* partial_inplace */
464 0, /* src_mask */
465 0x0000fffc, /* dst_mask */
466 TRUE), /* pcrel_offset */
467
468 /* A relative 16 bit branch. Bit 10 should be set to indicate that
469 the branch is not expected to be taken. The lower two bits must
470 be zero. */
471 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
472 0, /* rightshift */
473 2, /* size (0 = byte, 1 = short, 2 = long) */
474 16, /* bitsize */
475 TRUE, /* pc_relative */
476 0, /* bitpos */
477 complain_overflow_signed, /* complain_on_overflow */
478 ppc64_elf_brtaken_reloc, /* special_function */
479 "R_PPC64_REL14_BRNTAKEN",/* name */
480 FALSE, /* partial_inplace */
481 0, /* src_mask */
482 0x0000fffc, /* dst_mask */
483 TRUE), /* pcrel_offset */
484
485 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
486 symbol. */
487 HOWTO (R_PPC64_GOT16, /* type */
488 0, /* rightshift */
489 1, /* size (0 = byte, 1 = short, 2 = long) */
490 16, /* bitsize */
491 FALSE, /* pc_relative */
492 0, /* bitpos */
493 complain_overflow_signed, /* complain_on_overflow */
494 ppc64_elf_unhandled_reloc, /* special_function */
495 "R_PPC64_GOT16", /* name */
496 FALSE, /* partial_inplace */
497 0, /* src_mask */
498 0xffff, /* dst_mask */
499 FALSE), /* pcrel_offset */
500
501 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
502 the symbol. */
503 HOWTO (R_PPC64_GOT16_LO, /* type */
504 0, /* rightshift */
505 1, /* size (0 = byte, 1 = short, 2 = long) */
506 16, /* bitsize */
507 FALSE, /* pc_relative */
508 0, /* bitpos */
509 complain_overflow_dont, /* complain_on_overflow */
510 ppc64_elf_unhandled_reloc, /* special_function */
511 "R_PPC64_GOT16_LO", /* name */
512 FALSE, /* partial_inplace */
513 0, /* src_mask */
514 0xffff, /* dst_mask */
515 FALSE), /* pcrel_offset */
516
517 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
518 the symbol. */
519 HOWTO (R_PPC64_GOT16_HI, /* type */
520 16, /* rightshift */
521 1, /* size (0 = byte, 1 = short, 2 = long) */
522 16, /* bitsize */
523 FALSE, /* pc_relative */
524 0, /* bitpos */
525 complain_overflow_signed,/* complain_on_overflow */
526 ppc64_elf_unhandled_reloc, /* special_function */
527 "R_PPC64_GOT16_HI", /* name */
528 FALSE, /* partial_inplace */
529 0, /* src_mask */
530 0xffff, /* dst_mask */
531 FALSE), /* pcrel_offset */
532
533 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
534 the symbol. */
535 HOWTO (R_PPC64_GOT16_HA, /* type */
536 16, /* rightshift */
537 1, /* size (0 = byte, 1 = short, 2 = long) */
538 16, /* bitsize */
539 FALSE, /* pc_relative */
540 0, /* bitpos */
541 complain_overflow_signed,/* complain_on_overflow */
542 ppc64_elf_unhandled_reloc, /* special_function */
543 "R_PPC64_GOT16_HA", /* name */
544 FALSE, /* partial_inplace */
545 0, /* src_mask */
546 0xffff, /* dst_mask */
547 FALSE), /* pcrel_offset */
548
549 /* This is used only by the dynamic linker. The symbol should exist
550 both in the object being run and in some shared library. The
551 dynamic linker copies the data addressed by the symbol from the
552 shared library into the object, because the object being
553 run has to have the data at some particular address. */
554 HOWTO (R_PPC64_COPY, /* type */
555 0, /* rightshift */
556 0, /* this one is variable size */
557 0, /* bitsize */
558 FALSE, /* pc_relative */
559 0, /* bitpos */
560 complain_overflow_dont, /* complain_on_overflow */
561 ppc64_elf_unhandled_reloc, /* special_function */
562 "R_PPC64_COPY", /* name */
563 FALSE, /* partial_inplace */
564 0, /* src_mask */
565 0, /* dst_mask */
566 FALSE), /* pcrel_offset */
567
568 /* Like R_PPC64_ADDR64, but used when setting global offset table
569 entries. */
570 HOWTO (R_PPC64_GLOB_DAT, /* type */
571 0, /* rightshift */
572 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
573 64, /* bitsize */
574 FALSE, /* pc_relative */
575 0, /* bitpos */
576 complain_overflow_dont, /* complain_on_overflow */
577 ppc64_elf_unhandled_reloc, /* special_function */
578 "R_PPC64_GLOB_DAT", /* name */
579 FALSE, /* partial_inplace */
580 0, /* src_mask */
581 ONES (64), /* dst_mask */
582 FALSE), /* pcrel_offset */
583
584 /* Created by the link editor. Marks a procedure linkage table
585 entry for a symbol. */
586 HOWTO (R_PPC64_JMP_SLOT, /* type */
587 0, /* rightshift */
588 0, /* size (0 = byte, 1 = short, 2 = long) */
589 0, /* bitsize */
590 FALSE, /* pc_relative */
591 0, /* bitpos */
592 complain_overflow_dont, /* complain_on_overflow */
593 ppc64_elf_unhandled_reloc, /* special_function */
594 "R_PPC64_JMP_SLOT", /* name */
595 FALSE, /* partial_inplace */
596 0, /* src_mask */
597 0, /* dst_mask */
598 FALSE), /* pcrel_offset */
599
600 /* Used only by the dynamic linker. When the object is run, this
601 doubleword64 is set to the load address of the object, plus the
602 addend. */
603 HOWTO (R_PPC64_RELATIVE, /* type */
604 0, /* rightshift */
605 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
606 64, /* bitsize */
607 FALSE, /* pc_relative */
608 0, /* bitpos */
609 complain_overflow_dont, /* complain_on_overflow */
610 bfd_elf_generic_reloc, /* special_function */
611 "R_PPC64_RELATIVE", /* name */
612 FALSE, /* partial_inplace */
613 0, /* src_mask */
614 ONES (64), /* dst_mask */
615 FALSE), /* pcrel_offset */
616
617 /* Like R_PPC64_ADDR32, but may be unaligned. */
618 HOWTO (R_PPC64_UADDR32, /* type */
619 0, /* rightshift */
620 2, /* size (0 = byte, 1 = short, 2 = long) */
621 32, /* bitsize */
622 FALSE, /* pc_relative */
623 0, /* bitpos */
624 complain_overflow_bitfield, /* complain_on_overflow */
625 bfd_elf_generic_reloc, /* special_function */
626 "R_PPC64_UADDR32", /* name */
627 FALSE, /* partial_inplace */
628 0, /* src_mask */
629 0xffffffff, /* dst_mask */
630 FALSE), /* pcrel_offset */
631
632 /* Like R_PPC64_ADDR16, but may be unaligned. */
633 HOWTO (R_PPC64_UADDR16, /* type */
634 0, /* rightshift */
635 1, /* size (0 = byte, 1 = short, 2 = long) */
636 16, /* bitsize */
637 FALSE, /* pc_relative */
638 0, /* bitpos */
639 complain_overflow_bitfield, /* complain_on_overflow */
640 bfd_elf_generic_reloc, /* special_function */
641 "R_PPC64_UADDR16", /* name */
642 FALSE, /* partial_inplace */
643 0, /* src_mask */
644 0xffff, /* dst_mask */
645 FALSE), /* pcrel_offset */
646
647 /* 32-bit PC relative. */
648 HOWTO (R_PPC64_REL32, /* type */
649 0, /* rightshift */
650 2, /* size (0 = byte, 1 = short, 2 = long) */
651 32, /* bitsize */
652 TRUE, /* pc_relative */
653 0, /* bitpos */
654 complain_overflow_signed, /* complain_on_overflow */
655 bfd_elf_generic_reloc, /* special_function */
656 "R_PPC64_REL32", /* name */
657 FALSE, /* partial_inplace */
658 0, /* src_mask */
659 0xffffffff, /* dst_mask */
660 TRUE), /* pcrel_offset */
661
662 /* 32-bit relocation to the symbol's procedure linkage table. */
663 HOWTO (R_PPC64_PLT32, /* type */
664 0, /* rightshift */
665 2, /* size (0 = byte, 1 = short, 2 = long) */
666 32, /* bitsize */
667 FALSE, /* pc_relative */
668 0, /* bitpos */
669 complain_overflow_bitfield, /* complain_on_overflow */
670 ppc64_elf_unhandled_reloc, /* special_function */
671 "R_PPC64_PLT32", /* name */
672 FALSE, /* partial_inplace */
673 0, /* src_mask */
674 0xffffffff, /* dst_mask */
675 FALSE), /* pcrel_offset */
676
677 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
678 FIXME: R_PPC64_PLTREL32 not supported. */
679 HOWTO (R_PPC64_PLTREL32, /* type */
680 0, /* rightshift */
681 2, /* size (0 = byte, 1 = short, 2 = long) */
682 32, /* bitsize */
683 TRUE, /* pc_relative */
684 0, /* bitpos */
685 complain_overflow_signed, /* complain_on_overflow */
686 bfd_elf_generic_reloc, /* special_function */
687 "R_PPC64_PLTREL32", /* name */
688 FALSE, /* partial_inplace */
689 0, /* src_mask */
690 0xffffffff, /* dst_mask */
691 TRUE), /* pcrel_offset */
692
693 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
694 the symbol. */
695 HOWTO (R_PPC64_PLT16_LO, /* type */
696 0, /* rightshift */
697 1, /* size (0 = byte, 1 = short, 2 = long) */
698 16, /* bitsize */
699 FALSE, /* pc_relative */
700 0, /* bitpos */
701 complain_overflow_dont, /* complain_on_overflow */
702 ppc64_elf_unhandled_reloc, /* special_function */
703 "R_PPC64_PLT16_LO", /* name */
704 FALSE, /* partial_inplace */
705 0, /* src_mask */
706 0xffff, /* dst_mask */
707 FALSE), /* pcrel_offset */
708
709 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
710 the symbol. */
711 HOWTO (R_PPC64_PLT16_HI, /* type */
712 16, /* rightshift */
713 1, /* size (0 = byte, 1 = short, 2 = long) */
714 16, /* bitsize */
715 FALSE, /* pc_relative */
716 0, /* bitpos */
717 complain_overflow_signed, /* complain_on_overflow */
718 ppc64_elf_unhandled_reloc, /* special_function */
719 "R_PPC64_PLT16_HI", /* name */
720 FALSE, /* partial_inplace */
721 0, /* src_mask */
722 0xffff, /* dst_mask */
723 FALSE), /* pcrel_offset */
724
725 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
726 the symbol. */
727 HOWTO (R_PPC64_PLT16_HA, /* type */
728 16, /* rightshift */
729 1, /* size (0 = byte, 1 = short, 2 = long) */
730 16, /* bitsize */
731 FALSE, /* pc_relative */
732 0, /* bitpos */
733 complain_overflow_signed, /* complain_on_overflow */
734 ppc64_elf_unhandled_reloc, /* special_function */
735 "R_PPC64_PLT16_HA", /* name */
736 FALSE, /* partial_inplace */
737 0, /* src_mask */
738 0xffff, /* dst_mask */
739 FALSE), /* pcrel_offset */
740
741 /* 16-bit section relative relocation. */
742 HOWTO (R_PPC64_SECTOFF, /* type */
743 0, /* rightshift */
744 1, /* size (0 = byte, 1 = short, 2 = long) */
745 16, /* bitsize */
746 FALSE, /* pc_relative */
747 0, /* bitpos */
748 complain_overflow_signed, /* complain_on_overflow */
749 ppc64_elf_sectoff_reloc, /* special_function */
750 "R_PPC64_SECTOFF", /* name */
751 FALSE, /* partial_inplace */
752 0, /* src_mask */
753 0xffff, /* dst_mask */
754 FALSE), /* pcrel_offset */
755
756 /* Like R_PPC64_SECTOFF, but no overflow warning. */
757 HOWTO (R_PPC64_SECTOFF_LO, /* type */
758 0, /* rightshift */
759 1, /* size (0 = byte, 1 = short, 2 = long) */
760 16, /* bitsize */
761 FALSE, /* pc_relative */
762 0, /* bitpos */
763 complain_overflow_dont, /* complain_on_overflow */
764 ppc64_elf_sectoff_reloc, /* special_function */
765 "R_PPC64_SECTOFF_LO", /* name */
766 FALSE, /* partial_inplace */
767 0, /* src_mask */
768 0xffff, /* dst_mask */
769 FALSE), /* pcrel_offset */
770
771 /* 16-bit upper half section relative relocation. */
772 HOWTO (R_PPC64_SECTOFF_HI, /* type */
773 16, /* rightshift */
774 1, /* size (0 = byte, 1 = short, 2 = long) */
775 16, /* bitsize */
776 FALSE, /* pc_relative */
777 0, /* bitpos */
778 complain_overflow_signed, /* complain_on_overflow */
779 ppc64_elf_sectoff_reloc, /* special_function */
780 "R_PPC64_SECTOFF_HI", /* name */
781 FALSE, /* partial_inplace */
782 0, /* src_mask */
783 0xffff, /* dst_mask */
784 FALSE), /* pcrel_offset */
785
786 /* 16-bit upper half adjusted section relative relocation. */
787 HOWTO (R_PPC64_SECTOFF_HA, /* type */
788 16, /* rightshift */
789 1, /* size (0 = byte, 1 = short, 2 = long) */
790 16, /* bitsize */
791 FALSE, /* pc_relative */
792 0, /* bitpos */
793 complain_overflow_signed, /* complain_on_overflow */
794 ppc64_elf_sectoff_ha_reloc, /* special_function */
795 "R_PPC64_SECTOFF_HA", /* name */
796 FALSE, /* partial_inplace */
797 0, /* src_mask */
798 0xffff, /* dst_mask */
799 FALSE), /* pcrel_offset */
800
801 /* Like R_PPC64_REL24 without touching the two least significant bits. */
802 HOWTO (R_PPC64_REL30, /* type */
803 2, /* rightshift */
804 2, /* size (0 = byte, 1 = short, 2 = long) */
805 30, /* bitsize */
806 TRUE, /* pc_relative */
807 0, /* bitpos */
808 complain_overflow_dont, /* complain_on_overflow */
809 bfd_elf_generic_reloc, /* special_function */
810 "R_PPC64_REL30", /* name */
811 FALSE, /* partial_inplace */
812 0, /* src_mask */
813 0xfffffffc, /* dst_mask */
814 TRUE), /* pcrel_offset */
815
816 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
817
818 /* A standard 64-bit relocation. */
819 HOWTO (R_PPC64_ADDR64, /* type */
820 0, /* rightshift */
821 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
822 64, /* bitsize */
823 FALSE, /* pc_relative */
824 0, /* bitpos */
825 complain_overflow_dont, /* complain_on_overflow */
826 bfd_elf_generic_reloc, /* special_function */
827 "R_PPC64_ADDR64", /* name */
828 FALSE, /* partial_inplace */
829 0, /* src_mask */
830 ONES (64), /* dst_mask */
831 FALSE), /* pcrel_offset */
832
833 /* The bits 32-47 of an address. */
834 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
835 32, /* rightshift */
836 1, /* size (0 = byte, 1 = short, 2 = long) */
837 16, /* bitsize */
838 FALSE, /* pc_relative */
839 0, /* bitpos */
840 complain_overflow_dont, /* complain_on_overflow */
841 bfd_elf_generic_reloc, /* special_function */
842 "R_PPC64_ADDR16_HIGHER", /* name */
843 FALSE, /* partial_inplace */
844 0, /* src_mask */
845 0xffff, /* dst_mask */
846 FALSE), /* pcrel_offset */
847
848 /* The bits 32-47 of an address, plus 1 if the contents of the low
849 16 bits, treated as a signed number, is negative. */
850 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
851 32, /* rightshift */
852 1, /* size (0 = byte, 1 = short, 2 = long) */
853 16, /* bitsize */
854 FALSE, /* pc_relative */
855 0, /* bitpos */
856 complain_overflow_dont, /* complain_on_overflow */
857 ppc64_elf_ha_reloc, /* special_function */
858 "R_PPC64_ADDR16_HIGHERA", /* name */
859 FALSE, /* partial_inplace */
860 0, /* src_mask */
861 0xffff, /* dst_mask */
862 FALSE), /* pcrel_offset */
863
864 /* The bits 48-63 of an address. */
865 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
866 48, /* rightshift */
867 1, /* size (0 = byte, 1 = short, 2 = long) */
868 16, /* bitsize */
869 FALSE, /* pc_relative */
870 0, /* bitpos */
871 complain_overflow_dont, /* complain_on_overflow */
872 bfd_elf_generic_reloc, /* special_function */
873 "R_PPC64_ADDR16_HIGHEST", /* name */
874 FALSE, /* partial_inplace */
875 0, /* src_mask */
876 0xffff, /* dst_mask */
877 FALSE), /* pcrel_offset */
878
879 /* The bits 48-63 of an address, plus 1 if the contents of the low
880 16 bits, treated as a signed number, is negative. */
881 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
882 48, /* rightshift */
883 1, /* size (0 = byte, 1 = short, 2 = long) */
884 16, /* bitsize */
885 FALSE, /* pc_relative */
886 0, /* bitpos */
887 complain_overflow_dont, /* complain_on_overflow */
888 ppc64_elf_ha_reloc, /* special_function */
889 "R_PPC64_ADDR16_HIGHESTA", /* name */
890 FALSE, /* partial_inplace */
891 0, /* src_mask */
892 0xffff, /* dst_mask */
893 FALSE), /* pcrel_offset */
894
895 /* Like ADDR64, but may be unaligned. */
896 HOWTO (R_PPC64_UADDR64, /* type */
897 0, /* rightshift */
898 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
899 64, /* bitsize */
900 FALSE, /* pc_relative */
901 0, /* bitpos */
902 complain_overflow_dont, /* complain_on_overflow */
903 bfd_elf_generic_reloc, /* special_function */
904 "R_PPC64_UADDR64", /* name */
905 FALSE, /* partial_inplace */
906 0, /* src_mask */
907 ONES (64), /* dst_mask */
908 FALSE), /* pcrel_offset */
909
910 /* 64-bit relative relocation. */
911 HOWTO (R_PPC64_REL64, /* type */
912 0, /* rightshift */
913 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
914 64, /* bitsize */
915 TRUE, /* pc_relative */
916 0, /* bitpos */
917 complain_overflow_dont, /* complain_on_overflow */
918 bfd_elf_generic_reloc, /* special_function */
919 "R_PPC64_REL64", /* name */
920 FALSE, /* partial_inplace */
921 0, /* src_mask */
922 ONES (64), /* dst_mask */
923 TRUE), /* pcrel_offset */
924
925 /* 64-bit relocation to the symbol's procedure linkage table. */
926 HOWTO (R_PPC64_PLT64, /* type */
927 0, /* rightshift */
928 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
929 64, /* bitsize */
930 FALSE, /* pc_relative */
931 0, /* bitpos */
932 complain_overflow_dont, /* complain_on_overflow */
933 ppc64_elf_unhandled_reloc, /* special_function */
934 "R_PPC64_PLT64", /* name */
935 FALSE, /* partial_inplace */
936 0, /* src_mask */
937 ONES (64), /* dst_mask */
938 FALSE), /* pcrel_offset */
939
940 /* 64-bit PC relative relocation to the symbol's procedure linkage
941 table. */
942 /* FIXME: R_PPC64_PLTREL64 not supported. */
943 HOWTO (R_PPC64_PLTREL64, /* type */
944 0, /* rightshift */
945 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
946 64, /* bitsize */
947 TRUE, /* pc_relative */
948 0, /* bitpos */
949 complain_overflow_dont, /* complain_on_overflow */
950 ppc64_elf_unhandled_reloc, /* special_function */
951 "R_PPC64_PLTREL64", /* name */
952 FALSE, /* partial_inplace */
953 0, /* src_mask */
954 ONES (64), /* dst_mask */
955 TRUE), /* pcrel_offset */
956
957 /* 16 bit TOC-relative relocation. */
958
959 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
960 HOWTO (R_PPC64_TOC16, /* type */
961 0, /* rightshift */
962 1, /* size (0 = byte, 1 = short, 2 = long) */
963 16, /* bitsize */
964 FALSE, /* pc_relative */
965 0, /* bitpos */
966 complain_overflow_signed, /* complain_on_overflow */
967 ppc64_elf_toc_reloc, /* special_function */
968 "R_PPC64_TOC16", /* name */
969 FALSE, /* partial_inplace */
970 0, /* src_mask */
971 0xffff, /* dst_mask */
972 FALSE), /* pcrel_offset */
973
974 /* 16 bit TOC-relative relocation without overflow. */
975
976 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
977 HOWTO (R_PPC64_TOC16_LO, /* type */
978 0, /* rightshift */
979 1, /* size (0 = byte, 1 = short, 2 = long) */
980 16, /* bitsize */
981 FALSE, /* pc_relative */
982 0, /* bitpos */
983 complain_overflow_dont, /* complain_on_overflow */
984 ppc64_elf_toc_reloc, /* special_function */
985 "R_PPC64_TOC16_LO", /* name */
986 FALSE, /* partial_inplace */
987 0, /* src_mask */
988 0xffff, /* dst_mask */
989 FALSE), /* pcrel_offset */
990
991 /* 16 bit TOC-relative relocation, high 16 bits. */
992
993 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
994 HOWTO (R_PPC64_TOC16_HI, /* type */
995 16, /* rightshift */
996 1, /* size (0 = byte, 1 = short, 2 = long) */
997 16, /* bitsize */
998 FALSE, /* pc_relative */
999 0, /* bitpos */
1000 complain_overflow_signed, /* complain_on_overflow */
1001 ppc64_elf_toc_reloc, /* special_function */
1002 "R_PPC64_TOC16_HI", /* name */
1003 FALSE, /* partial_inplace */
1004 0, /* src_mask */
1005 0xffff, /* dst_mask */
1006 FALSE), /* pcrel_offset */
1007
1008 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
1009 contents of the low 16 bits, treated as a signed number, is
1010 negative. */
1011
1012 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
1013 HOWTO (R_PPC64_TOC16_HA, /* type */
1014 16, /* rightshift */
1015 1, /* size (0 = byte, 1 = short, 2 = long) */
1016 16, /* bitsize */
1017 FALSE, /* pc_relative */
1018 0, /* bitpos */
1019 complain_overflow_signed, /* complain_on_overflow */
1020 ppc64_elf_toc_ha_reloc, /* special_function */
1021 "R_PPC64_TOC16_HA", /* name */
1022 FALSE, /* partial_inplace */
1023 0, /* src_mask */
1024 0xffff, /* dst_mask */
1025 FALSE), /* pcrel_offset */
1026
1027 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1028
1029 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1030 HOWTO (R_PPC64_TOC, /* type */
1031 0, /* rightshift */
1032 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1033 64, /* bitsize */
1034 FALSE, /* pc_relative */
1035 0, /* bitpos */
1036 complain_overflow_dont, /* complain_on_overflow */
1037 ppc64_elf_toc64_reloc, /* special_function */
1038 "R_PPC64_TOC", /* name */
1039 FALSE, /* partial_inplace */
1040 0, /* src_mask */
1041 ONES (64), /* dst_mask */
1042 FALSE), /* pcrel_offset */
1043
1044 /* Like R_PPC64_GOT16, but also informs the link editor that the
1045 value to relocate may (!) refer to a PLT entry which the link
1046 editor (a) may replace with the symbol value. If the link editor
1047 is unable to fully resolve the symbol, it may (b) create a PLT
1048 entry and store the address to the new PLT entry in the GOT.
1049 This permits lazy resolution of function symbols at run time.
1050 The link editor may also skip all of this and just (c) emit a
1051 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1052 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1053 HOWTO (R_PPC64_PLTGOT16, /* type */
1054 0, /* rightshift */
1055 1, /* size (0 = byte, 1 = short, 2 = long) */
1056 16, /* bitsize */
1057 FALSE, /* pc_relative */
1058 0, /* bitpos */
1059 complain_overflow_signed, /* complain_on_overflow */
1060 ppc64_elf_unhandled_reloc, /* special_function */
1061 "R_PPC64_PLTGOT16", /* name */
1062 FALSE, /* partial_inplace */
1063 0, /* src_mask */
1064 0xffff, /* dst_mask */
1065 FALSE), /* pcrel_offset */
1066
1067 /* Like R_PPC64_PLTGOT16, but without overflow. */
1068 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1069 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1070 0, /* rightshift */
1071 1, /* size (0 = byte, 1 = short, 2 = long) */
1072 16, /* bitsize */
1073 FALSE, /* pc_relative */
1074 0, /* bitpos */
1075 complain_overflow_dont, /* complain_on_overflow */
1076 ppc64_elf_unhandled_reloc, /* special_function */
1077 "R_PPC64_PLTGOT16_LO", /* name */
1078 FALSE, /* partial_inplace */
1079 0, /* src_mask */
1080 0xffff, /* dst_mask */
1081 FALSE), /* pcrel_offset */
1082
1083 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1084 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1085 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1086 16, /* rightshift */
1087 1, /* size (0 = byte, 1 = short, 2 = long) */
1088 16, /* bitsize */
1089 FALSE, /* pc_relative */
1090 0, /* bitpos */
1091 complain_overflow_signed, /* complain_on_overflow */
1092 ppc64_elf_unhandled_reloc, /* special_function */
1093 "R_PPC64_PLTGOT16_HI", /* name */
1094 FALSE, /* partial_inplace */
1095 0, /* src_mask */
1096 0xffff, /* dst_mask */
1097 FALSE), /* pcrel_offset */
1098
1099 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1100 1 if the contents of the low 16 bits, treated as a signed number,
1101 is negative. */
1102 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1103 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1104 16, /* rightshift */
1105 1, /* size (0 = byte, 1 = short, 2 = long) */
1106 16, /* bitsize */
1107 FALSE, /* pc_relative */
1108 0, /* bitpos */
1109 complain_overflow_signed, /* complain_on_overflow */
1110 ppc64_elf_unhandled_reloc, /* special_function */
1111 "R_PPC64_PLTGOT16_HA", /* name */
1112 FALSE, /* partial_inplace */
1113 0, /* src_mask */
1114 0xffff, /* dst_mask */
1115 FALSE), /* pcrel_offset */
1116
1117 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1118 HOWTO (R_PPC64_ADDR16_DS, /* type */
1119 0, /* rightshift */
1120 1, /* size (0 = byte, 1 = short, 2 = long) */
1121 16, /* bitsize */
1122 FALSE, /* pc_relative */
1123 0, /* bitpos */
1124 complain_overflow_signed, /* complain_on_overflow */
1125 bfd_elf_generic_reloc, /* special_function */
1126 "R_PPC64_ADDR16_DS", /* name */
1127 FALSE, /* partial_inplace */
1128 0, /* src_mask */
1129 0xfffc, /* dst_mask */
1130 FALSE), /* pcrel_offset */
1131
1132 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1133 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1134 0, /* rightshift */
1135 1, /* size (0 = byte, 1 = short, 2 = long) */
1136 16, /* bitsize */
1137 FALSE, /* pc_relative */
1138 0, /* bitpos */
1139 complain_overflow_dont,/* complain_on_overflow */
1140 bfd_elf_generic_reloc, /* special_function */
1141 "R_PPC64_ADDR16_LO_DS",/* name */
1142 FALSE, /* partial_inplace */
1143 0, /* src_mask */
1144 0xfffc, /* dst_mask */
1145 FALSE), /* pcrel_offset */
1146
1147 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1148 HOWTO (R_PPC64_GOT16_DS, /* type */
1149 0, /* rightshift */
1150 1, /* size (0 = byte, 1 = short, 2 = long) */
1151 16, /* bitsize */
1152 FALSE, /* pc_relative */
1153 0, /* bitpos */
1154 complain_overflow_signed, /* complain_on_overflow */
1155 ppc64_elf_unhandled_reloc, /* special_function */
1156 "R_PPC64_GOT16_DS", /* name */
1157 FALSE, /* partial_inplace */
1158 0, /* src_mask */
1159 0xfffc, /* dst_mask */
1160 FALSE), /* pcrel_offset */
1161
1162 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1163 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1164 0, /* rightshift */
1165 1, /* size (0 = byte, 1 = short, 2 = long) */
1166 16, /* bitsize */
1167 FALSE, /* pc_relative */
1168 0, /* bitpos */
1169 complain_overflow_dont, /* complain_on_overflow */
1170 ppc64_elf_unhandled_reloc, /* special_function */
1171 "R_PPC64_GOT16_LO_DS", /* name */
1172 FALSE, /* partial_inplace */
1173 0, /* src_mask */
1174 0xfffc, /* dst_mask */
1175 FALSE), /* pcrel_offset */
1176
1177 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1178 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1179 0, /* rightshift */
1180 1, /* size (0 = byte, 1 = short, 2 = long) */
1181 16, /* bitsize */
1182 FALSE, /* pc_relative */
1183 0, /* bitpos */
1184 complain_overflow_dont, /* complain_on_overflow */
1185 ppc64_elf_unhandled_reloc, /* special_function */
1186 "R_PPC64_PLT16_LO_DS", /* name */
1187 FALSE, /* partial_inplace */
1188 0, /* src_mask */
1189 0xfffc, /* dst_mask */
1190 FALSE), /* pcrel_offset */
1191
1192 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1193 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1194 0, /* rightshift */
1195 1, /* size (0 = byte, 1 = short, 2 = long) */
1196 16, /* bitsize */
1197 FALSE, /* pc_relative */
1198 0, /* bitpos */
1199 complain_overflow_signed, /* complain_on_overflow */
1200 ppc64_elf_sectoff_reloc, /* special_function */
1201 "R_PPC64_SECTOFF_DS", /* name */
1202 FALSE, /* partial_inplace */
1203 0, /* src_mask */
1204 0xfffc, /* dst_mask */
1205 FALSE), /* pcrel_offset */
1206
1207 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1208 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1209 0, /* rightshift */
1210 1, /* size (0 = byte, 1 = short, 2 = long) */
1211 16, /* bitsize */
1212 FALSE, /* pc_relative */
1213 0, /* bitpos */
1214 complain_overflow_dont, /* complain_on_overflow */
1215 ppc64_elf_sectoff_reloc, /* special_function */
1216 "R_PPC64_SECTOFF_LO_DS",/* name */
1217 FALSE, /* partial_inplace */
1218 0, /* src_mask */
1219 0xfffc, /* dst_mask */
1220 FALSE), /* pcrel_offset */
1221
1222 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1223 HOWTO (R_PPC64_TOC16_DS, /* type */
1224 0, /* rightshift */
1225 1, /* size (0 = byte, 1 = short, 2 = long) */
1226 16, /* bitsize */
1227 FALSE, /* pc_relative */
1228 0, /* bitpos */
1229 complain_overflow_signed, /* complain_on_overflow */
1230 ppc64_elf_toc_reloc, /* special_function */
1231 "R_PPC64_TOC16_DS", /* name */
1232 FALSE, /* partial_inplace */
1233 0, /* src_mask */
1234 0xfffc, /* dst_mask */
1235 FALSE), /* pcrel_offset */
1236
1237 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1238 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1239 0, /* rightshift */
1240 1, /* size (0 = byte, 1 = short, 2 = long) */
1241 16, /* bitsize */
1242 FALSE, /* pc_relative */
1243 0, /* bitpos */
1244 complain_overflow_dont, /* complain_on_overflow */
1245 ppc64_elf_toc_reloc, /* special_function */
1246 "R_PPC64_TOC16_LO_DS", /* name */
1247 FALSE, /* partial_inplace */
1248 0, /* src_mask */
1249 0xfffc, /* dst_mask */
1250 FALSE), /* pcrel_offset */
1251
1252 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1253 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1254 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1255 0, /* rightshift */
1256 1, /* size (0 = byte, 1 = short, 2 = long) */
1257 16, /* bitsize */
1258 FALSE, /* pc_relative */
1259 0, /* bitpos */
1260 complain_overflow_signed, /* complain_on_overflow */
1261 ppc64_elf_unhandled_reloc, /* special_function */
1262 "R_PPC64_PLTGOT16_DS", /* name */
1263 FALSE, /* partial_inplace */
1264 0, /* src_mask */
1265 0xfffc, /* dst_mask */
1266 FALSE), /* pcrel_offset */
1267
1268 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1269 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1270 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1271 0, /* rightshift */
1272 1, /* size (0 = byte, 1 = short, 2 = long) */
1273 16, /* bitsize */
1274 FALSE, /* pc_relative */
1275 0, /* bitpos */
1276 complain_overflow_dont, /* complain_on_overflow */
1277 ppc64_elf_unhandled_reloc, /* special_function */
1278 "R_PPC64_PLTGOT16_LO_DS",/* name */
1279 FALSE, /* partial_inplace */
1280 0, /* src_mask */
1281 0xfffc, /* dst_mask */
1282 FALSE), /* pcrel_offset */
1283
1284 /* Marker relocs for TLS. */
1285 HOWTO (R_PPC64_TLS,
1286 0, /* rightshift */
1287 2, /* size (0 = byte, 1 = short, 2 = long) */
1288 32, /* bitsize */
1289 FALSE, /* pc_relative */
1290 0, /* bitpos */
1291 complain_overflow_dont, /* complain_on_overflow */
1292 bfd_elf_generic_reloc, /* special_function */
1293 "R_PPC64_TLS", /* name */
1294 FALSE, /* partial_inplace */
1295 0, /* src_mask */
1296 0, /* dst_mask */
1297 FALSE), /* pcrel_offset */
1298
1299 HOWTO (R_PPC64_TLSGD,
1300 0, /* rightshift */
1301 2, /* size (0 = byte, 1 = short, 2 = long) */
1302 32, /* bitsize */
1303 FALSE, /* pc_relative */
1304 0, /* bitpos */
1305 complain_overflow_dont, /* complain_on_overflow */
1306 bfd_elf_generic_reloc, /* special_function */
1307 "R_PPC64_TLSGD", /* name */
1308 FALSE, /* partial_inplace */
1309 0, /* src_mask */
1310 0, /* dst_mask */
1311 FALSE), /* pcrel_offset */
1312
1313 HOWTO (R_PPC64_TLSLD,
1314 0, /* rightshift */
1315 2, /* size (0 = byte, 1 = short, 2 = long) */
1316 32, /* bitsize */
1317 FALSE, /* pc_relative */
1318 0, /* bitpos */
1319 complain_overflow_dont, /* complain_on_overflow */
1320 bfd_elf_generic_reloc, /* special_function */
1321 "R_PPC64_TLSLD", /* name */
1322 FALSE, /* partial_inplace */
1323 0, /* src_mask */
1324 0, /* dst_mask */
1325 FALSE), /* pcrel_offset */
1326
1327 HOWTO (R_PPC64_TOCSAVE,
1328 0, /* rightshift */
1329 2, /* size (0 = byte, 1 = short, 2 = long) */
1330 32, /* bitsize */
1331 FALSE, /* pc_relative */
1332 0, /* bitpos */
1333 complain_overflow_dont, /* complain_on_overflow */
1334 bfd_elf_generic_reloc, /* special_function */
1335 "R_PPC64_TOCSAVE", /* name */
1336 FALSE, /* partial_inplace */
1337 0, /* src_mask */
1338 0, /* dst_mask */
1339 FALSE), /* pcrel_offset */
1340
1341 /* Computes the load module index of the load module that contains the
1342 definition of its TLS sym. */
1343 HOWTO (R_PPC64_DTPMOD64,
1344 0, /* rightshift */
1345 4, /* size (0 = byte, 1 = short, 2 = long) */
1346 64, /* bitsize */
1347 FALSE, /* pc_relative */
1348 0, /* bitpos */
1349 complain_overflow_dont, /* complain_on_overflow */
1350 ppc64_elf_unhandled_reloc, /* special_function */
1351 "R_PPC64_DTPMOD64", /* name */
1352 FALSE, /* partial_inplace */
1353 0, /* src_mask */
1354 ONES (64), /* dst_mask */
1355 FALSE), /* pcrel_offset */
1356
1357 /* Computes a dtv-relative displacement, the difference between the value
1358 of sym+add and the base address of the thread-local storage block that
1359 contains the definition of sym, minus 0x8000. */
1360 HOWTO (R_PPC64_DTPREL64,
1361 0, /* rightshift */
1362 4, /* size (0 = byte, 1 = short, 2 = long) */
1363 64, /* bitsize */
1364 FALSE, /* pc_relative */
1365 0, /* bitpos */
1366 complain_overflow_dont, /* complain_on_overflow */
1367 ppc64_elf_unhandled_reloc, /* special_function */
1368 "R_PPC64_DTPREL64", /* name */
1369 FALSE, /* partial_inplace */
1370 0, /* src_mask */
1371 ONES (64), /* dst_mask */
1372 FALSE), /* pcrel_offset */
1373
1374 /* A 16 bit dtprel reloc. */
1375 HOWTO (R_PPC64_DTPREL16,
1376 0, /* rightshift */
1377 1, /* size (0 = byte, 1 = short, 2 = long) */
1378 16, /* bitsize */
1379 FALSE, /* pc_relative */
1380 0, /* bitpos */
1381 complain_overflow_signed, /* complain_on_overflow */
1382 ppc64_elf_unhandled_reloc, /* special_function */
1383 "R_PPC64_DTPREL16", /* name */
1384 FALSE, /* partial_inplace */
1385 0, /* src_mask */
1386 0xffff, /* dst_mask */
1387 FALSE), /* pcrel_offset */
1388
1389 /* Like DTPREL16, but no overflow. */
1390 HOWTO (R_PPC64_DTPREL16_LO,
1391 0, /* rightshift */
1392 1, /* size (0 = byte, 1 = short, 2 = long) */
1393 16, /* bitsize */
1394 FALSE, /* pc_relative */
1395 0, /* bitpos */
1396 complain_overflow_dont, /* complain_on_overflow */
1397 ppc64_elf_unhandled_reloc, /* special_function */
1398 "R_PPC64_DTPREL16_LO", /* name */
1399 FALSE, /* partial_inplace */
1400 0, /* src_mask */
1401 0xffff, /* dst_mask */
1402 FALSE), /* pcrel_offset */
1403
1404 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1405 HOWTO (R_PPC64_DTPREL16_HI,
1406 16, /* rightshift */
1407 1, /* size (0 = byte, 1 = short, 2 = long) */
1408 16, /* bitsize */
1409 FALSE, /* pc_relative */
1410 0, /* bitpos */
1411 complain_overflow_signed, /* complain_on_overflow */
1412 ppc64_elf_unhandled_reloc, /* special_function */
1413 "R_PPC64_DTPREL16_HI", /* name */
1414 FALSE, /* partial_inplace */
1415 0, /* src_mask */
1416 0xffff, /* dst_mask */
1417 FALSE), /* pcrel_offset */
1418
1419 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1420 HOWTO (R_PPC64_DTPREL16_HA,
1421 16, /* rightshift */
1422 1, /* size (0 = byte, 1 = short, 2 = long) */
1423 16, /* bitsize */
1424 FALSE, /* pc_relative */
1425 0, /* bitpos */
1426 complain_overflow_signed, /* complain_on_overflow */
1427 ppc64_elf_unhandled_reloc, /* special_function */
1428 "R_PPC64_DTPREL16_HA", /* name */
1429 FALSE, /* partial_inplace */
1430 0, /* src_mask */
1431 0xffff, /* dst_mask */
1432 FALSE), /* pcrel_offset */
1433
1434 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1435 HOWTO (R_PPC64_DTPREL16_HIGHER,
1436 32, /* rightshift */
1437 1, /* size (0 = byte, 1 = short, 2 = long) */
1438 16, /* bitsize */
1439 FALSE, /* pc_relative */
1440 0, /* bitpos */
1441 complain_overflow_dont, /* complain_on_overflow */
1442 ppc64_elf_unhandled_reloc, /* special_function */
1443 "R_PPC64_DTPREL16_HIGHER", /* name */
1444 FALSE, /* partial_inplace */
1445 0, /* src_mask */
1446 0xffff, /* dst_mask */
1447 FALSE), /* pcrel_offset */
1448
1449 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1450 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1451 32, /* rightshift */
1452 1, /* size (0 = byte, 1 = short, 2 = long) */
1453 16, /* bitsize */
1454 FALSE, /* pc_relative */
1455 0, /* bitpos */
1456 complain_overflow_dont, /* complain_on_overflow */
1457 ppc64_elf_unhandled_reloc, /* special_function */
1458 "R_PPC64_DTPREL16_HIGHERA", /* name */
1459 FALSE, /* partial_inplace */
1460 0, /* src_mask */
1461 0xffff, /* dst_mask */
1462 FALSE), /* pcrel_offset */
1463
1464 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1465 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1466 48, /* rightshift */
1467 1, /* size (0 = byte, 1 = short, 2 = long) */
1468 16, /* bitsize */
1469 FALSE, /* pc_relative */
1470 0, /* bitpos */
1471 complain_overflow_dont, /* complain_on_overflow */
1472 ppc64_elf_unhandled_reloc, /* special_function */
1473 "R_PPC64_DTPREL16_HIGHEST", /* name */
1474 FALSE, /* partial_inplace */
1475 0, /* src_mask */
1476 0xffff, /* dst_mask */
1477 FALSE), /* pcrel_offset */
1478
1479 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1480 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1481 48, /* rightshift */
1482 1, /* size (0 = byte, 1 = short, 2 = long) */
1483 16, /* bitsize */
1484 FALSE, /* pc_relative */
1485 0, /* bitpos */
1486 complain_overflow_dont, /* complain_on_overflow */
1487 ppc64_elf_unhandled_reloc, /* special_function */
1488 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1489 FALSE, /* partial_inplace */
1490 0, /* src_mask */
1491 0xffff, /* dst_mask */
1492 FALSE), /* pcrel_offset */
1493
1494 /* Like DTPREL16, but for insns with a DS field. */
1495 HOWTO (R_PPC64_DTPREL16_DS,
1496 0, /* rightshift */
1497 1, /* size (0 = byte, 1 = short, 2 = long) */
1498 16, /* bitsize */
1499 FALSE, /* pc_relative */
1500 0, /* bitpos */
1501 complain_overflow_signed, /* complain_on_overflow */
1502 ppc64_elf_unhandled_reloc, /* special_function */
1503 "R_PPC64_DTPREL16_DS", /* name */
1504 FALSE, /* partial_inplace */
1505 0, /* src_mask */
1506 0xfffc, /* dst_mask */
1507 FALSE), /* pcrel_offset */
1508
1509 /* Like DTPREL16_DS, but no overflow. */
1510 HOWTO (R_PPC64_DTPREL16_LO_DS,
1511 0, /* rightshift */
1512 1, /* size (0 = byte, 1 = short, 2 = long) */
1513 16, /* bitsize */
1514 FALSE, /* pc_relative */
1515 0, /* bitpos */
1516 complain_overflow_dont, /* complain_on_overflow */
1517 ppc64_elf_unhandled_reloc, /* special_function */
1518 "R_PPC64_DTPREL16_LO_DS", /* name */
1519 FALSE, /* partial_inplace */
1520 0, /* src_mask */
1521 0xfffc, /* dst_mask */
1522 FALSE), /* pcrel_offset */
1523
1524 /* Computes a tp-relative displacement, the difference between the value of
1525 sym+add and the value of the thread pointer (r13). */
1526 HOWTO (R_PPC64_TPREL64,
1527 0, /* rightshift */
1528 4, /* size (0 = byte, 1 = short, 2 = long) */
1529 64, /* bitsize */
1530 FALSE, /* pc_relative */
1531 0, /* bitpos */
1532 complain_overflow_dont, /* complain_on_overflow */
1533 ppc64_elf_unhandled_reloc, /* special_function */
1534 "R_PPC64_TPREL64", /* name */
1535 FALSE, /* partial_inplace */
1536 0, /* src_mask */
1537 ONES (64), /* dst_mask */
1538 FALSE), /* pcrel_offset */
1539
1540 /* A 16 bit tprel reloc. */
1541 HOWTO (R_PPC64_TPREL16,
1542 0, /* rightshift */
1543 1, /* size (0 = byte, 1 = short, 2 = long) */
1544 16, /* bitsize */
1545 FALSE, /* pc_relative */
1546 0, /* bitpos */
1547 complain_overflow_signed, /* complain_on_overflow */
1548 ppc64_elf_unhandled_reloc, /* special_function */
1549 "R_PPC64_TPREL16", /* name */
1550 FALSE, /* partial_inplace */
1551 0, /* src_mask */
1552 0xffff, /* dst_mask */
1553 FALSE), /* pcrel_offset */
1554
1555 /* Like TPREL16, but no overflow. */
1556 HOWTO (R_PPC64_TPREL16_LO,
1557 0, /* rightshift */
1558 1, /* size (0 = byte, 1 = short, 2 = long) */
1559 16, /* bitsize */
1560 FALSE, /* pc_relative */
1561 0, /* bitpos */
1562 complain_overflow_dont, /* complain_on_overflow */
1563 ppc64_elf_unhandled_reloc, /* special_function */
1564 "R_PPC64_TPREL16_LO", /* name */
1565 FALSE, /* partial_inplace */
1566 0, /* src_mask */
1567 0xffff, /* dst_mask */
1568 FALSE), /* pcrel_offset */
1569
1570 /* Like TPREL16_LO, but next higher group of 16 bits. */
1571 HOWTO (R_PPC64_TPREL16_HI,
1572 16, /* rightshift */
1573 1, /* size (0 = byte, 1 = short, 2 = long) */
1574 16, /* bitsize */
1575 FALSE, /* pc_relative */
1576 0, /* bitpos */
1577 complain_overflow_signed, /* complain_on_overflow */
1578 ppc64_elf_unhandled_reloc, /* special_function */
1579 "R_PPC64_TPREL16_HI", /* name */
1580 FALSE, /* partial_inplace */
1581 0, /* src_mask */
1582 0xffff, /* dst_mask */
1583 FALSE), /* pcrel_offset */
1584
1585 /* Like TPREL16_HI, but adjust for low 16 bits. */
1586 HOWTO (R_PPC64_TPREL16_HA,
1587 16, /* rightshift */
1588 1, /* size (0 = byte, 1 = short, 2 = long) */
1589 16, /* bitsize */
1590 FALSE, /* pc_relative */
1591 0, /* bitpos */
1592 complain_overflow_signed, /* complain_on_overflow */
1593 ppc64_elf_unhandled_reloc, /* special_function */
1594 "R_PPC64_TPREL16_HA", /* name */
1595 FALSE, /* partial_inplace */
1596 0, /* src_mask */
1597 0xffff, /* dst_mask */
1598 FALSE), /* pcrel_offset */
1599
1600 /* Like TPREL16_HI, but next higher group of 16 bits. */
1601 HOWTO (R_PPC64_TPREL16_HIGHER,
1602 32, /* rightshift */
1603 1, /* size (0 = byte, 1 = short, 2 = long) */
1604 16, /* bitsize */
1605 FALSE, /* pc_relative */
1606 0, /* bitpos */
1607 complain_overflow_dont, /* complain_on_overflow */
1608 ppc64_elf_unhandled_reloc, /* special_function */
1609 "R_PPC64_TPREL16_HIGHER", /* name */
1610 FALSE, /* partial_inplace */
1611 0, /* src_mask */
1612 0xffff, /* dst_mask */
1613 FALSE), /* pcrel_offset */
1614
1615 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1616 HOWTO (R_PPC64_TPREL16_HIGHERA,
1617 32, /* rightshift */
1618 1, /* size (0 = byte, 1 = short, 2 = long) */
1619 16, /* bitsize */
1620 FALSE, /* pc_relative */
1621 0, /* bitpos */
1622 complain_overflow_dont, /* complain_on_overflow */
1623 ppc64_elf_unhandled_reloc, /* special_function */
1624 "R_PPC64_TPREL16_HIGHERA", /* name */
1625 FALSE, /* partial_inplace */
1626 0, /* src_mask */
1627 0xffff, /* dst_mask */
1628 FALSE), /* pcrel_offset */
1629
1630 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1631 HOWTO (R_PPC64_TPREL16_HIGHEST,
1632 48, /* rightshift */
1633 1, /* size (0 = byte, 1 = short, 2 = long) */
1634 16, /* bitsize */
1635 FALSE, /* pc_relative */
1636 0, /* bitpos */
1637 complain_overflow_dont, /* complain_on_overflow */
1638 ppc64_elf_unhandled_reloc, /* special_function */
1639 "R_PPC64_TPREL16_HIGHEST", /* name */
1640 FALSE, /* partial_inplace */
1641 0, /* src_mask */
1642 0xffff, /* dst_mask */
1643 FALSE), /* pcrel_offset */
1644
1645 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1646 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1647 48, /* rightshift */
1648 1, /* size (0 = byte, 1 = short, 2 = long) */
1649 16, /* bitsize */
1650 FALSE, /* pc_relative */
1651 0, /* bitpos */
1652 complain_overflow_dont, /* complain_on_overflow */
1653 ppc64_elf_unhandled_reloc, /* special_function */
1654 "R_PPC64_TPREL16_HIGHESTA", /* name */
1655 FALSE, /* partial_inplace */
1656 0, /* src_mask */
1657 0xffff, /* dst_mask */
1658 FALSE), /* pcrel_offset */
1659
1660 /* Like TPREL16, but for insns with a DS field. */
1661 HOWTO (R_PPC64_TPREL16_DS,
1662 0, /* rightshift */
1663 1, /* size (0 = byte, 1 = short, 2 = long) */
1664 16, /* bitsize */
1665 FALSE, /* pc_relative */
1666 0, /* bitpos */
1667 complain_overflow_signed, /* complain_on_overflow */
1668 ppc64_elf_unhandled_reloc, /* special_function */
1669 "R_PPC64_TPREL16_DS", /* name */
1670 FALSE, /* partial_inplace */
1671 0, /* src_mask */
1672 0xfffc, /* dst_mask */
1673 FALSE), /* pcrel_offset */
1674
1675 /* Like TPREL16_DS, but no overflow. */
1676 HOWTO (R_PPC64_TPREL16_LO_DS,
1677 0, /* rightshift */
1678 1, /* size (0 = byte, 1 = short, 2 = long) */
1679 16, /* bitsize */
1680 FALSE, /* pc_relative */
1681 0, /* bitpos */
1682 complain_overflow_dont, /* complain_on_overflow */
1683 ppc64_elf_unhandled_reloc, /* special_function */
1684 "R_PPC64_TPREL16_LO_DS", /* name */
1685 FALSE, /* partial_inplace */
1686 0, /* src_mask */
1687 0xfffc, /* dst_mask */
1688 FALSE), /* pcrel_offset */
1689
1690 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1691 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1692 to the first entry relative to the TOC base (r2). */
1693 HOWTO (R_PPC64_GOT_TLSGD16,
1694 0, /* rightshift */
1695 1, /* size (0 = byte, 1 = short, 2 = long) */
1696 16, /* bitsize */
1697 FALSE, /* pc_relative */
1698 0, /* bitpos */
1699 complain_overflow_signed, /* complain_on_overflow */
1700 ppc64_elf_unhandled_reloc, /* special_function */
1701 "R_PPC64_GOT_TLSGD16", /* name */
1702 FALSE, /* partial_inplace */
1703 0, /* src_mask */
1704 0xffff, /* dst_mask */
1705 FALSE), /* pcrel_offset */
1706
1707 /* Like GOT_TLSGD16, but no overflow. */
1708 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1709 0, /* rightshift */
1710 1, /* size (0 = byte, 1 = short, 2 = long) */
1711 16, /* bitsize */
1712 FALSE, /* pc_relative */
1713 0, /* bitpos */
1714 complain_overflow_dont, /* complain_on_overflow */
1715 ppc64_elf_unhandled_reloc, /* special_function */
1716 "R_PPC64_GOT_TLSGD16_LO", /* name */
1717 FALSE, /* partial_inplace */
1718 0, /* src_mask */
1719 0xffff, /* dst_mask */
1720 FALSE), /* pcrel_offset */
1721
1722 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1723 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1724 16, /* rightshift */
1725 1, /* size (0 = byte, 1 = short, 2 = long) */
1726 16, /* bitsize */
1727 FALSE, /* pc_relative */
1728 0, /* bitpos */
1729 complain_overflow_signed, /* complain_on_overflow */
1730 ppc64_elf_unhandled_reloc, /* special_function */
1731 "R_PPC64_GOT_TLSGD16_HI", /* name */
1732 FALSE, /* partial_inplace */
1733 0, /* src_mask */
1734 0xffff, /* dst_mask */
1735 FALSE), /* pcrel_offset */
1736
1737 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1738 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1739 16, /* rightshift */
1740 1, /* size (0 = byte, 1 = short, 2 = long) */
1741 16, /* bitsize */
1742 FALSE, /* pc_relative */
1743 0, /* bitpos */
1744 complain_overflow_signed, /* complain_on_overflow */
1745 ppc64_elf_unhandled_reloc, /* special_function */
1746 "R_PPC64_GOT_TLSGD16_HA", /* name */
1747 FALSE, /* partial_inplace */
1748 0, /* src_mask */
1749 0xffff, /* dst_mask */
1750 FALSE), /* pcrel_offset */
1751
1752 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1753 with values (sym+add)@dtpmod and zero, and computes the offset to the
1754 first entry relative to the TOC base (r2). */
1755 HOWTO (R_PPC64_GOT_TLSLD16,
1756 0, /* rightshift */
1757 1, /* size (0 = byte, 1 = short, 2 = long) */
1758 16, /* bitsize */
1759 FALSE, /* pc_relative */
1760 0, /* bitpos */
1761 complain_overflow_signed, /* complain_on_overflow */
1762 ppc64_elf_unhandled_reloc, /* special_function */
1763 "R_PPC64_GOT_TLSLD16", /* name */
1764 FALSE, /* partial_inplace */
1765 0, /* src_mask */
1766 0xffff, /* dst_mask */
1767 FALSE), /* pcrel_offset */
1768
1769 /* Like GOT_TLSLD16, but no overflow. */
1770 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1771 0, /* rightshift */
1772 1, /* size (0 = byte, 1 = short, 2 = long) */
1773 16, /* bitsize */
1774 FALSE, /* pc_relative */
1775 0, /* bitpos */
1776 complain_overflow_dont, /* complain_on_overflow */
1777 ppc64_elf_unhandled_reloc, /* special_function */
1778 "R_PPC64_GOT_TLSLD16_LO", /* name */
1779 FALSE, /* partial_inplace */
1780 0, /* src_mask */
1781 0xffff, /* dst_mask */
1782 FALSE), /* pcrel_offset */
1783
1784 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1785 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1786 16, /* rightshift */
1787 1, /* size (0 = byte, 1 = short, 2 = long) */
1788 16, /* bitsize */
1789 FALSE, /* pc_relative */
1790 0, /* bitpos */
1791 complain_overflow_signed, /* complain_on_overflow */
1792 ppc64_elf_unhandled_reloc, /* special_function */
1793 "R_PPC64_GOT_TLSLD16_HI", /* name */
1794 FALSE, /* partial_inplace */
1795 0, /* src_mask */
1796 0xffff, /* dst_mask */
1797 FALSE), /* pcrel_offset */
1798
1799 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1800 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1801 16, /* rightshift */
1802 1, /* size (0 = byte, 1 = short, 2 = long) */
1803 16, /* bitsize */
1804 FALSE, /* pc_relative */
1805 0, /* bitpos */
1806 complain_overflow_signed, /* complain_on_overflow */
1807 ppc64_elf_unhandled_reloc, /* special_function */
1808 "R_PPC64_GOT_TLSLD16_HA", /* name */
1809 FALSE, /* partial_inplace */
1810 0, /* src_mask */
1811 0xffff, /* dst_mask */
1812 FALSE), /* pcrel_offset */
1813
1814 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1815 the offset to the entry relative to the TOC base (r2). */
1816 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1817 0, /* rightshift */
1818 1, /* size (0 = byte, 1 = short, 2 = long) */
1819 16, /* bitsize */
1820 FALSE, /* pc_relative */
1821 0, /* bitpos */
1822 complain_overflow_signed, /* complain_on_overflow */
1823 ppc64_elf_unhandled_reloc, /* special_function */
1824 "R_PPC64_GOT_DTPREL16_DS", /* name */
1825 FALSE, /* partial_inplace */
1826 0, /* src_mask */
1827 0xfffc, /* dst_mask */
1828 FALSE), /* pcrel_offset */
1829
1830 /* Like GOT_DTPREL16_DS, but no overflow. */
1831 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1832 0, /* rightshift */
1833 1, /* size (0 = byte, 1 = short, 2 = long) */
1834 16, /* bitsize */
1835 FALSE, /* pc_relative */
1836 0, /* bitpos */
1837 complain_overflow_dont, /* complain_on_overflow */
1838 ppc64_elf_unhandled_reloc, /* special_function */
1839 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1840 FALSE, /* partial_inplace */
1841 0, /* src_mask */
1842 0xfffc, /* dst_mask */
1843 FALSE), /* pcrel_offset */
1844
1845 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1846 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1847 16, /* rightshift */
1848 1, /* size (0 = byte, 1 = short, 2 = long) */
1849 16, /* bitsize */
1850 FALSE, /* pc_relative */
1851 0, /* bitpos */
1852 complain_overflow_signed, /* complain_on_overflow */
1853 ppc64_elf_unhandled_reloc, /* special_function */
1854 "R_PPC64_GOT_DTPREL16_HI", /* name */
1855 FALSE, /* partial_inplace */
1856 0, /* src_mask */
1857 0xffff, /* dst_mask */
1858 FALSE), /* pcrel_offset */
1859
1860 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1861 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1862 16, /* rightshift */
1863 1, /* size (0 = byte, 1 = short, 2 = long) */
1864 16, /* bitsize */
1865 FALSE, /* pc_relative */
1866 0, /* bitpos */
1867 complain_overflow_signed, /* complain_on_overflow */
1868 ppc64_elf_unhandled_reloc, /* special_function */
1869 "R_PPC64_GOT_DTPREL16_HA", /* name */
1870 FALSE, /* partial_inplace */
1871 0, /* src_mask */
1872 0xffff, /* dst_mask */
1873 FALSE), /* pcrel_offset */
1874
1875 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1876 offset to the entry relative to the TOC base (r2). */
1877 HOWTO (R_PPC64_GOT_TPREL16_DS,
1878 0, /* rightshift */
1879 1, /* size (0 = byte, 1 = short, 2 = long) */
1880 16, /* bitsize */
1881 FALSE, /* pc_relative */
1882 0, /* bitpos */
1883 complain_overflow_signed, /* complain_on_overflow */
1884 ppc64_elf_unhandled_reloc, /* special_function */
1885 "R_PPC64_GOT_TPREL16_DS", /* name */
1886 FALSE, /* partial_inplace */
1887 0, /* src_mask */
1888 0xfffc, /* dst_mask */
1889 FALSE), /* pcrel_offset */
1890
1891 /* Like GOT_TPREL16_DS, but no overflow. */
1892 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1893 0, /* rightshift */
1894 1, /* size (0 = byte, 1 = short, 2 = long) */
1895 16, /* bitsize */
1896 FALSE, /* pc_relative */
1897 0, /* bitpos */
1898 complain_overflow_dont, /* complain_on_overflow */
1899 ppc64_elf_unhandled_reloc, /* special_function */
1900 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1901 FALSE, /* partial_inplace */
1902 0, /* src_mask */
1903 0xfffc, /* dst_mask */
1904 FALSE), /* pcrel_offset */
1905
1906 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1907 HOWTO (R_PPC64_GOT_TPREL16_HI,
1908 16, /* rightshift */
1909 1, /* size (0 = byte, 1 = short, 2 = long) */
1910 16, /* bitsize */
1911 FALSE, /* pc_relative */
1912 0, /* bitpos */
1913 complain_overflow_signed, /* complain_on_overflow */
1914 ppc64_elf_unhandled_reloc, /* special_function */
1915 "R_PPC64_GOT_TPREL16_HI", /* name */
1916 FALSE, /* partial_inplace */
1917 0, /* src_mask */
1918 0xffff, /* dst_mask */
1919 FALSE), /* pcrel_offset */
1920
1921 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1922 HOWTO (R_PPC64_GOT_TPREL16_HA,
1923 16, /* rightshift */
1924 1, /* size (0 = byte, 1 = short, 2 = long) */
1925 16, /* bitsize */
1926 FALSE, /* pc_relative */
1927 0, /* bitpos */
1928 complain_overflow_signed, /* complain_on_overflow */
1929 ppc64_elf_unhandled_reloc, /* special_function */
1930 "R_PPC64_GOT_TPREL16_HA", /* name */
1931 FALSE, /* partial_inplace */
1932 0, /* src_mask */
1933 0xffff, /* dst_mask */
1934 FALSE), /* pcrel_offset */
1935
1936 HOWTO (R_PPC64_JMP_IREL, /* type */
1937 0, /* rightshift */
1938 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1939 0, /* bitsize */
1940 FALSE, /* pc_relative */
1941 0, /* bitpos */
1942 complain_overflow_dont, /* complain_on_overflow */
1943 ppc64_elf_unhandled_reloc, /* special_function */
1944 "R_PPC64_JMP_IREL", /* name */
1945 FALSE, /* partial_inplace */
1946 0, /* src_mask */
1947 0, /* dst_mask */
1948 FALSE), /* pcrel_offset */
1949
1950 HOWTO (R_PPC64_IRELATIVE, /* type */
1951 0, /* rightshift */
1952 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1953 64, /* bitsize */
1954 FALSE, /* pc_relative */
1955 0, /* bitpos */
1956 complain_overflow_dont, /* complain_on_overflow */
1957 bfd_elf_generic_reloc, /* special_function */
1958 "R_PPC64_IRELATIVE", /* name */
1959 FALSE, /* partial_inplace */
1960 0, /* src_mask */
1961 ONES (64), /* dst_mask */
1962 FALSE), /* pcrel_offset */
1963
1964 /* A 16 bit relative relocation. */
1965 HOWTO (R_PPC64_REL16, /* type */
1966 0, /* rightshift */
1967 1, /* size (0 = byte, 1 = short, 2 = long) */
1968 16, /* bitsize */
1969 TRUE, /* pc_relative */
1970 0, /* bitpos */
1971 complain_overflow_signed, /* complain_on_overflow */
1972 bfd_elf_generic_reloc, /* special_function */
1973 "R_PPC64_REL16", /* name */
1974 FALSE, /* partial_inplace */
1975 0, /* src_mask */
1976 0xffff, /* dst_mask */
1977 TRUE), /* pcrel_offset */
1978
1979 /* A 16 bit relative relocation without overflow. */
1980 HOWTO (R_PPC64_REL16_LO, /* type */
1981 0, /* rightshift */
1982 1, /* size (0 = byte, 1 = short, 2 = long) */
1983 16, /* bitsize */
1984 TRUE, /* pc_relative */
1985 0, /* bitpos */
1986 complain_overflow_dont,/* complain_on_overflow */
1987 bfd_elf_generic_reloc, /* special_function */
1988 "R_PPC64_REL16_LO", /* name */
1989 FALSE, /* partial_inplace */
1990 0, /* src_mask */
1991 0xffff, /* dst_mask */
1992 TRUE), /* pcrel_offset */
1993
1994 /* The high order 16 bits of a relative address. */
1995 HOWTO (R_PPC64_REL16_HI, /* type */
1996 16, /* rightshift */
1997 1, /* size (0 = byte, 1 = short, 2 = long) */
1998 16, /* bitsize */
1999 TRUE, /* pc_relative */
2000 0, /* bitpos */
2001 complain_overflow_signed, /* complain_on_overflow */
2002 bfd_elf_generic_reloc, /* special_function */
2003 "R_PPC64_REL16_HI", /* name */
2004 FALSE, /* partial_inplace */
2005 0, /* src_mask */
2006 0xffff, /* dst_mask */
2007 TRUE), /* pcrel_offset */
2008
2009 /* The high order 16 bits of a relative address, plus 1 if the contents of
2010 the low 16 bits, treated as a signed number, is negative. */
2011 HOWTO (R_PPC64_REL16_HA, /* type */
2012 16, /* rightshift */
2013 1, /* size (0 = byte, 1 = short, 2 = long) */
2014 16, /* bitsize */
2015 TRUE, /* pc_relative */
2016 0, /* bitpos */
2017 complain_overflow_signed, /* complain_on_overflow */
2018 ppc64_elf_ha_reloc, /* special_function */
2019 "R_PPC64_REL16_HA", /* name */
2020 FALSE, /* partial_inplace */
2021 0, /* src_mask */
2022 0xffff, /* dst_mask */
2023 TRUE), /* pcrel_offset */
2024
2025 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2026 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2027 16, /* rightshift */
2028 1, /* size (0 = byte, 1 = short, 2 = long) */
2029 16, /* bitsize */
2030 FALSE, /* pc_relative */
2031 0, /* bitpos */
2032 complain_overflow_dont, /* complain_on_overflow */
2033 bfd_elf_generic_reloc, /* special_function */
2034 "R_PPC64_ADDR16_HIGH", /* name */
2035 FALSE, /* partial_inplace */
2036 0, /* src_mask */
2037 0xffff, /* dst_mask */
2038 FALSE), /* pcrel_offset */
2039
2040 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2041 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2042 16, /* rightshift */
2043 1, /* size (0 = byte, 1 = short, 2 = long) */
2044 16, /* bitsize */
2045 FALSE, /* pc_relative */
2046 0, /* bitpos */
2047 complain_overflow_dont, /* complain_on_overflow */
2048 ppc64_elf_ha_reloc, /* special_function */
2049 "R_PPC64_ADDR16_HIGHA", /* name */
2050 FALSE, /* partial_inplace */
2051 0, /* src_mask */
2052 0xffff, /* dst_mask */
2053 FALSE), /* pcrel_offset */
2054
2055 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2056 HOWTO (R_PPC64_DTPREL16_HIGH,
2057 16, /* rightshift */
2058 1, /* size (0 = byte, 1 = short, 2 = long) */
2059 16, /* bitsize */
2060 FALSE, /* pc_relative */
2061 0, /* bitpos */
2062 complain_overflow_dont, /* complain_on_overflow */
2063 ppc64_elf_unhandled_reloc, /* special_function */
2064 "R_PPC64_DTPREL16_HIGH", /* name */
2065 FALSE, /* partial_inplace */
2066 0, /* src_mask */
2067 0xffff, /* dst_mask */
2068 FALSE), /* pcrel_offset */
2069
2070 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2071 HOWTO (R_PPC64_DTPREL16_HIGHA,
2072 16, /* rightshift */
2073 1, /* size (0 = byte, 1 = short, 2 = long) */
2074 16, /* bitsize */
2075 FALSE, /* pc_relative */
2076 0, /* bitpos */
2077 complain_overflow_dont, /* complain_on_overflow */
2078 ppc64_elf_unhandled_reloc, /* special_function */
2079 "R_PPC64_DTPREL16_HIGHA", /* name */
2080 FALSE, /* partial_inplace */
2081 0, /* src_mask */
2082 0xffff, /* dst_mask */
2083 FALSE), /* pcrel_offset */
2084
2085 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2086 HOWTO (R_PPC64_TPREL16_HIGH,
2087 16, /* rightshift */
2088 1, /* size (0 = byte, 1 = short, 2 = long) */
2089 16, /* bitsize */
2090 FALSE, /* pc_relative */
2091 0, /* bitpos */
2092 complain_overflow_dont, /* complain_on_overflow */
2093 ppc64_elf_unhandled_reloc, /* special_function */
2094 "R_PPC64_TPREL16_HIGH", /* name */
2095 FALSE, /* partial_inplace */
2096 0, /* src_mask */
2097 0xffff, /* dst_mask */
2098 FALSE), /* pcrel_offset */
2099
2100 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2101 HOWTO (R_PPC64_TPREL16_HIGHA,
2102 16, /* rightshift */
2103 1, /* size (0 = byte, 1 = short, 2 = long) */
2104 16, /* bitsize */
2105 FALSE, /* pc_relative */
2106 0, /* bitpos */
2107 complain_overflow_dont, /* complain_on_overflow */
2108 ppc64_elf_unhandled_reloc, /* special_function */
2109 "R_PPC64_TPREL16_HIGHA", /* name */
2110 FALSE, /* partial_inplace */
2111 0, /* src_mask */
2112 0xffff, /* dst_mask */
2113 FALSE), /* pcrel_offset */
2114
2115 /* Like ADDR64, but use local entry point of function. */
2116 HOWTO (R_PPC64_ADDR64_LOCAL, /* type */
2117 0, /* rightshift */
2118 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
2119 64, /* bitsize */
2120 FALSE, /* pc_relative */
2121 0, /* bitpos */
2122 complain_overflow_dont, /* complain_on_overflow */
2123 bfd_elf_generic_reloc, /* special_function */
2124 "R_PPC64_ADDR64_LOCAL", /* name */
2125 FALSE, /* partial_inplace */
2126 0, /* src_mask */
2127 ONES (64), /* dst_mask */
2128 FALSE), /* pcrel_offset */
2129
2130 /* GNU extension to record C++ vtable hierarchy. */
2131 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2132 0, /* rightshift */
2133 0, /* size (0 = byte, 1 = short, 2 = long) */
2134 0, /* bitsize */
2135 FALSE, /* pc_relative */
2136 0, /* bitpos */
2137 complain_overflow_dont, /* complain_on_overflow */
2138 NULL, /* special_function */
2139 "R_PPC64_GNU_VTINHERIT", /* name */
2140 FALSE, /* partial_inplace */
2141 0, /* src_mask */
2142 0, /* dst_mask */
2143 FALSE), /* pcrel_offset */
2144
2145 /* GNU extension to record C++ vtable member usage. */
2146 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2147 0, /* rightshift */
2148 0, /* size (0 = byte, 1 = short, 2 = long) */
2149 0, /* bitsize */
2150 FALSE, /* pc_relative */
2151 0, /* bitpos */
2152 complain_overflow_dont, /* complain_on_overflow */
2153 NULL, /* special_function */
2154 "R_PPC64_GNU_VTENTRY", /* name */
2155 FALSE, /* partial_inplace */
2156 0, /* src_mask */
2157 0, /* dst_mask */
2158 FALSE), /* pcrel_offset */
2159 };
2160
2161 \f
2162 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2163 be done. */
2164
2165 static void
2166 ppc_howto_init (void)
2167 {
2168 unsigned int i, type;
2169
2170 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2171 {
2172 type = ppc64_elf_howto_raw[i].type;
2173 BFD_ASSERT (type < ARRAY_SIZE (ppc64_elf_howto_table));
2174 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2175 }
2176 }
2177
2178 static reloc_howto_type *
2179 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2180 bfd_reloc_code_real_type code)
2181 {
2182 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2183
2184 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2185 /* Initialize howto table if needed. */
2186 ppc_howto_init ();
2187
2188 switch (code)
2189 {
2190 default:
2191 return NULL;
2192
2193 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2194 break;
2195 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2196 break;
2197 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2198 break;
2199 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2200 break;
2201 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2202 break;
2203 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2204 break;
2205 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2206 break;
2207 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2208 break;
2209 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2210 break;
2211 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2212 break;
2213 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2214 break;
2215 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2216 break;
2217 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2218 break;
2219 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2220 break;
2221 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2222 break;
2223 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2224 break;
2225 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2226 break;
2227 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2228 break;
2229 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2230 break;
2231 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2232 break;
2233 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2234 break;
2235 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2236 break;
2237 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2238 break;
2239 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2240 break;
2241 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2242 break;
2243 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2244 break;
2245 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2246 break;
2247 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2248 break;
2249 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2250 break;
2251 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2252 break;
2253 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2254 break;
2255 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2256 break;
2257 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2258 break;
2259 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2260 break;
2261 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2262 break;
2263 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2264 break;
2265 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2266 break;
2267 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2268 break;
2269 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2270 break;
2271 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2272 break;
2273 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2274 break;
2275 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2276 break;
2277 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2278 break;
2279 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2280 break;
2281 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2282 break;
2283 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2284 break;
2285 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2286 break;
2287 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2288 break;
2289 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2290 break;
2291 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2292 break;
2293 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2294 break;
2295 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2296 break;
2297 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2298 break;
2299 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2300 break;
2301 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2302 break;
2303 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2304 break;
2305 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2306 break;
2307 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2308 break;
2309 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2310 break;
2311 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2312 break;
2313 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2314 break;
2315 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2316 break;
2317 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2318 break;
2319 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2320 break;
2321 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2322 break;
2323 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2324 break;
2325 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2326 break;
2327 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2328 break;
2329 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2330 break;
2331 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2332 break;
2333 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2334 break;
2335 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2336 break;
2337 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2338 break;
2339 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2340 break;
2341 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2342 break;
2343 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2344 break;
2345 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2346 break;
2347 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2348 break;
2349 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2350 break;
2351 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2352 break;
2353 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2354 break;
2355 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2356 break;
2357 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2358 break;
2359 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2360 break;
2361 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2362 break;
2363 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2364 break;
2365 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2366 break;
2367 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2368 break;
2369 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2370 break;
2371 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2372 break;
2373 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2374 break;
2375 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2376 break;
2377 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2378 break;
2379 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2380 break;
2381 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2382 break;
2383 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2384 break;
2385 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2386 break;
2387 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2388 break;
2389 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2390 break;
2391 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2392 break;
2393 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2394 break;
2395 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2396 break;
2397 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2398 break;
2399 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2400 break;
2401 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2402 break;
2403 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2404 break;
2405 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2406 break;
2407 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2408 break;
2409 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2410 break;
2411 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2412 break;
2413 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2414 break;
2415 case BFD_RELOC_PPC64_ADDR64_LOCAL: r = R_PPC64_ADDR64_LOCAL;
2416 break;
2417 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2418 break;
2419 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2420 break;
2421 }
2422
2423 return ppc64_elf_howto_table[r];
2424 };
2425
2426 static reloc_howto_type *
2427 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2428 const char *r_name)
2429 {
2430 unsigned int i;
2431
2432 for (i = 0; i < ARRAY_SIZE (ppc64_elf_howto_raw); i++)
2433 if (ppc64_elf_howto_raw[i].name != NULL
2434 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2435 return &ppc64_elf_howto_raw[i];
2436
2437 return NULL;
2438 }
2439
2440 /* Set the howto pointer for a PowerPC ELF reloc. */
2441
2442 static void
2443 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2444 Elf_Internal_Rela *dst)
2445 {
2446 unsigned int type;
2447
2448 /* Initialize howto table if needed. */
2449 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2450 ppc_howto_init ();
2451
2452 type = ELF64_R_TYPE (dst->r_info);
2453 if (type >= ARRAY_SIZE (ppc64_elf_howto_table))
2454 {
2455 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2456 abfd, (int) type);
2457 type = R_PPC64_NONE;
2458 }
2459 cache_ptr->howto = ppc64_elf_howto_table[type];
2460 }
2461
2462 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2463
2464 static bfd_reloc_status_type
2465 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2466 void *data, asection *input_section,
2467 bfd *output_bfd, char **error_message)
2468 {
2469 /* If this is a relocatable link (output_bfd test tells us), just
2470 call the generic function. Any adjustment will be done at final
2471 link time. */
2472 if (output_bfd != NULL)
2473 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2474 input_section, output_bfd, error_message);
2475
2476 /* Adjust the addend for sign extension of the low 16 bits.
2477 We won't actually be using the low 16 bits, so trashing them
2478 doesn't matter. */
2479 reloc_entry->addend += 0x8000;
2480 return bfd_reloc_continue;
2481 }
2482
2483 static bfd_reloc_status_type
2484 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2485 void *data, asection *input_section,
2486 bfd *output_bfd, char **error_message)
2487 {
2488 if (output_bfd != NULL)
2489 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2490 input_section, output_bfd, error_message);
2491
2492 if (strcmp (symbol->section->name, ".opd") == 0
2493 && (symbol->section->owner->flags & DYNAMIC) == 0)
2494 {
2495 bfd_vma dest = opd_entry_value (symbol->section,
2496 symbol->value + reloc_entry->addend,
2497 NULL, NULL, FALSE);
2498 if (dest != (bfd_vma) -1)
2499 reloc_entry->addend = dest - (symbol->value
2500 + symbol->section->output_section->vma
2501 + symbol->section->output_offset);
2502 }
2503 else
2504 {
2505 elf_symbol_type *elfsym = (elf_symbol_type *) symbol;
2506
2507 if (symbol->section->owner != abfd
2508 && abiversion (symbol->section->owner) >= 2)
2509 {
2510 unsigned int i;
2511
2512 for (i = 0; i < symbol->section->owner->symcount; ++i)
2513 {
2514 asymbol *symdef = symbol->section->owner->outsymbols[i];
2515
2516 if (strcmp (symdef->name, symbol->name) == 0)
2517 {
2518 elfsym = (elf_symbol_type *) symdef;
2519 break;
2520 }
2521 }
2522 }
2523 reloc_entry->addend
2524 += PPC64_LOCAL_ENTRY_OFFSET (elfsym->internal_elf_sym.st_other);
2525 }
2526 return bfd_reloc_continue;
2527 }
2528
2529 static bfd_reloc_status_type
2530 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2531 void *data, asection *input_section,
2532 bfd *output_bfd, char **error_message)
2533 {
2534 long insn;
2535 enum elf_ppc64_reloc_type r_type;
2536 bfd_size_type octets;
2537 /* Assume 'at' branch hints. */
2538 bfd_boolean is_isa_v2 = TRUE;
2539
2540 /* If this is a relocatable link (output_bfd test tells us), just
2541 call the generic function. Any adjustment will be done at final
2542 link time. */
2543 if (output_bfd != NULL)
2544 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2545 input_section, output_bfd, error_message);
2546
2547 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2548 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2549 insn &= ~(0x01 << 21);
2550 r_type = reloc_entry->howto->type;
2551 if (r_type == R_PPC64_ADDR14_BRTAKEN
2552 || r_type == R_PPC64_REL14_BRTAKEN)
2553 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2554
2555 if (is_isa_v2)
2556 {
2557 /* Set 'a' bit. This is 0b00010 in BO field for branch
2558 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2559 for branch on CTR insns (BO == 1a00t or 1a01t). */
2560 if ((insn & (0x14 << 21)) == (0x04 << 21))
2561 insn |= 0x02 << 21;
2562 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2563 insn |= 0x08 << 21;
2564 else
2565 goto out;
2566 }
2567 else
2568 {
2569 bfd_vma target = 0;
2570 bfd_vma from;
2571
2572 if (!bfd_is_com_section (symbol->section))
2573 target = symbol->value;
2574 target += symbol->section->output_section->vma;
2575 target += symbol->section->output_offset;
2576 target += reloc_entry->addend;
2577
2578 from = (reloc_entry->address
2579 + input_section->output_offset
2580 + input_section->output_section->vma);
2581
2582 /* Invert 'y' bit if not the default. */
2583 if ((bfd_signed_vma) (target - from) < 0)
2584 insn ^= 0x01 << 21;
2585 }
2586 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2587 out:
2588 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2589 input_section, output_bfd, error_message);
2590 }
2591
2592 static bfd_reloc_status_type
2593 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2594 void *data, asection *input_section,
2595 bfd *output_bfd, char **error_message)
2596 {
2597 /* If this is a relocatable link (output_bfd test tells us), just
2598 call the generic function. Any adjustment will be done at final
2599 link time. */
2600 if (output_bfd != NULL)
2601 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2602 input_section, output_bfd, error_message);
2603
2604 /* Subtract the symbol section base address. */
2605 reloc_entry->addend -= symbol->section->output_section->vma;
2606 return bfd_reloc_continue;
2607 }
2608
2609 static bfd_reloc_status_type
2610 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2611 void *data, asection *input_section,
2612 bfd *output_bfd, char **error_message)
2613 {
2614 /* If this is a relocatable link (output_bfd test tells us), just
2615 call the generic function. Any adjustment will be done at final
2616 link time. */
2617 if (output_bfd != NULL)
2618 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2619 input_section, output_bfd, error_message);
2620
2621 /* Subtract the symbol section base address. */
2622 reloc_entry->addend -= symbol->section->output_section->vma;
2623
2624 /* Adjust the addend for sign extension of the low 16 bits. */
2625 reloc_entry->addend += 0x8000;
2626 return bfd_reloc_continue;
2627 }
2628
2629 static bfd_reloc_status_type
2630 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2631 void *data, asection *input_section,
2632 bfd *output_bfd, char **error_message)
2633 {
2634 bfd_vma TOCstart;
2635
2636 /* If this is a relocatable link (output_bfd test tells us), just
2637 call the generic function. Any adjustment will be done at final
2638 link time. */
2639 if (output_bfd != NULL)
2640 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2641 input_section, output_bfd, error_message);
2642
2643 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2644 if (TOCstart == 0)
2645 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2646
2647 /* Subtract the TOC base address. */
2648 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2649 return bfd_reloc_continue;
2650 }
2651
2652 static bfd_reloc_status_type
2653 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2654 void *data, asection *input_section,
2655 bfd *output_bfd, char **error_message)
2656 {
2657 bfd_vma TOCstart;
2658
2659 /* If this is a relocatable link (output_bfd test tells us), just
2660 call the generic function. Any adjustment will be done at final
2661 link time. */
2662 if (output_bfd != NULL)
2663 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2664 input_section, output_bfd, error_message);
2665
2666 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2667 if (TOCstart == 0)
2668 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2669
2670 /* Subtract the TOC base address. */
2671 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2672
2673 /* Adjust the addend for sign extension of the low 16 bits. */
2674 reloc_entry->addend += 0x8000;
2675 return bfd_reloc_continue;
2676 }
2677
2678 static bfd_reloc_status_type
2679 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2680 void *data, asection *input_section,
2681 bfd *output_bfd, char **error_message)
2682 {
2683 bfd_vma TOCstart;
2684 bfd_size_type octets;
2685
2686 /* If this is a relocatable link (output_bfd test tells us), just
2687 call the generic function. Any adjustment will be done at final
2688 link time. */
2689 if (output_bfd != NULL)
2690 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2691 input_section, output_bfd, error_message);
2692
2693 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2694 if (TOCstart == 0)
2695 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2696
2697 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2698 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2699 return bfd_reloc_ok;
2700 }
2701
2702 static bfd_reloc_status_type
2703 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2704 void *data, asection *input_section,
2705 bfd *output_bfd, char **error_message)
2706 {
2707 /* If this is a relocatable link (output_bfd test tells us), just
2708 call the generic function. Any adjustment will be done at final
2709 link time. */
2710 if (output_bfd != NULL)
2711 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2712 input_section, output_bfd, error_message);
2713
2714 if (error_message != NULL)
2715 {
2716 static char buf[60];
2717 sprintf (buf, "generic linker can't handle %s",
2718 reloc_entry->howto->name);
2719 *error_message = buf;
2720 }
2721 return bfd_reloc_dangerous;
2722 }
2723
2724 /* Track GOT entries needed for a given symbol. We might need more
2725 than one got entry per symbol. */
2726 struct got_entry
2727 {
2728 struct got_entry *next;
2729
2730 /* The symbol addend that we'll be placing in the GOT. */
2731 bfd_vma addend;
2732
2733 /* Unlike other ELF targets, we use separate GOT entries for the same
2734 symbol referenced from different input files. This is to support
2735 automatic multiple TOC/GOT sections, where the TOC base can vary
2736 from one input file to another. After partitioning into TOC groups
2737 we merge entries within the group.
2738
2739 Point to the BFD owning this GOT entry. */
2740 bfd *owner;
2741
2742 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2743 TLS_TPREL or TLS_DTPREL for tls entries. */
2744 unsigned char tls_type;
2745
2746 /* Non-zero if got.ent points to real entry. */
2747 unsigned char is_indirect;
2748
2749 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2750 union
2751 {
2752 bfd_signed_vma refcount;
2753 bfd_vma offset;
2754 struct got_entry *ent;
2755 } got;
2756 };
2757
2758 /* The same for PLT. */
2759 struct plt_entry
2760 {
2761 struct plt_entry *next;
2762
2763 bfd_vma addend;
2764
2765 union
2766 {
2767 bfd_signed_vma refcount;
2768 bfd_vma offset;
2769 } plt;
2770 };
2771
2772 struct ppc64_elf_obj_tdata
2773 {
2774 struct elf_obj_tdata elf;
2775
2776 /* Shortcuts to dynamic linker sections. */
2777 asection *got;
2778 asection *relgot;
2779
2780 /* Used during garbage collection. We attach global symbols defined
2781 on removed .opd entries to this section so that the sym is removed. */
2782 asection *deleted_section;
2783
2784 /* TLS local dynamic got entry handling. Support for multiple GOT
2785 sections means we potentially need one of these for each input bfd. */
2786 struct got_entry tlsld_got;
2787
2788 union {
2789 /* A copy of relocs before they are modified for --emit-relocs. */
2790 Elf_Internal_Rela *relocs;
2791
2792 /* Section contents. */
2793 bfd_byte *contents;
2794 } opd;
2795
2796 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2797 the reloc to be in the range -32768 to 32767. */
2798 unsigned int has_small_toc_reloc : 1;
2799
2800 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2801 instruction not one we handle. */
2802 unsigned int unexpected_toc_insn : 1;
2803 };
2804
2805 #define ppc64_elf_tdata(bfd) \
2806 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2807
2808 #define ppc64_tlsld_got(bfd) \
2809 (&ppc64_elf_tdata (bfd)->tlsld_got)
2810
2811 #define is_ppc64_elf(bfd) \
2812 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2813 && elf_object_id (bfd) == PPC64_ELF_DATA)
2814
2815 /* Override the generic function because we store some extras. */
2816
2817 static bfd_boolean
2818 ppc64_elf_mkobject (bfd *abfd)
2819 {
2820 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2821 PPC64_ELF_DATA);
2822 }
2823
2824 /* Fix bad default arch selected for a 64 bit input bfd when the
2825 default is 32 bit. */
2826
2827 static bfd_boolean
2828 ppc64_elf_object_p (bfd *abfd)
2829 {
2830 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2831 {
2832 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2833
2834 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2835 {
2836 /* Relies on arch after 32 bit default being 64 bit default. */
2837 abfd->arch_info = abfd->arch_info->next;
2838 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2839 }
2840 }
2841 return TRUE;
2842 }
2843
2844 /* Support for core dump NOTE sections. */
2845
2846 static bfd_boolean
2847 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2848 {
2849 size_t offset, size;
2850
2851 if (note->descsz != 504)
2852 return FALSE;
2853
2854 /* pr_cursig */
2855 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2856
2857 /* pr_pid */
2858 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2859
2860 /* pr_reg */
2861 offset = 112;
2862 size = 384;
2863
2864 /* Make a ".reg/999" section. */
2865 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2866 size, note->descpos + offset);
2867 }
2868
2869 static bfd_boolean
2870 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2871 {
2872 if (note->descsz != 136)
2873 return FALSE;
2874
2875 elf_tdata (abfd)->core->pid
2876 = bfd_get_32 (abfd, note->descdata + 24);
2877 elf_tdata (abfd)->core->program
2878 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2879 elf_tdata (abfd)->core->command
2880 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2881
2882 return TRUE;
2883 }
2884
2885 static char *
2886 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2887 ...)
2888 {
2889 switch (note_type)
2890 {
2891 default:
2892 return NULL;
2893
2894 case NT_PRPSINFO:
2895 {
2896 char data[136];
2897 va_list ap;
2898
2899 va_start (ap, note_type);
2900 memset (data, 0, sizeof (data));
2901 strncpy (data + 40, va_arg (ap, const char *), 16);
2902 strncpy (data + 56, va_arg (ap, const char *), 80);
2903 va_end (ap);
2904 return elfcore_write_note (abfd, buf, bufsiz,
2905 "CORE", note_type, data, sizeof (data));
2906 }
2907
2908 case NT_PRSTATUS:
2909 {
2910 char data[504];
2911 va_list ap;
2912 long pid;
2913 int cursig;
2914 const void *greg;
2915
2916 va_start (ap, note_type);
2917 memset (data, 0, 112);
2918 pid = va_arg (ap, long);
2919 bfd_put_32 (abfd, pid, data + 32);
2920 cursig = va_arg (ap, int);
2921 bfd_put_16 (abfd, cursig, data + 12);
2922 greg = va_arg (ap, const void *);
2923 memcpy (data + 112, greg, 384);
2924 memset (data + 496, 0, 8);
2925 va_end (ap);
2926 return elfcore_write_note (abfd, buf, bufsiz,
2927 "CORE", note_type, data, sizeof (data));
2928 }
2929 }
2930 }
2931
2932 /* Add extra PPC sections. */
2933
2934 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2935 {
2936 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2937 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2938 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2939 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2940 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2941 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2942 { NULL, 0, 0, 0, 0 }
2943 };
2944
2945 enum _ppc64_sec_type {
2946 sec_normal = 0,
2947 sec_opd = 1,
2948 sec_toc = 2
2949 };
2950
2951 struct _ppc64_elf_section_data
2952 {
2953 struct bfd_elf_section_data elf;
2954
2955 union
2956 {
2957 /* An array with one entry for each opd function descriptor,
2958 and some spares since opd entries may be either 16 or 24 bytes. */
2959 #define OPD_NDX(OFF) ((OFF) >> 4)
2960 struct _opd_sec_data
2961 {
2962 /* Points to the function code section for local opd entries. */
2963 asection **func_sec;
2964
2965 /* After editing .opd, adjust references to opd local syms. */
2966 long *adjust;
2967 } opd;
2968
2969 /* An array for toc sections, indexed by offset/8. */
2970 struct _toc_sec_data
2971 {
2972 /* Specifies the relocation symbol index used at a given toc offset. */
2973 unsigned *symndx;
2974
2975 /* And the relocation addend. */
2976 bfd_vma *add;
2977 } toc;
2978 } u;
2979
2980 enum _ppc64_sec_type sec_type:2;
2981
2982 /* Flag set when small branches are detected. Used to
2983 select suitable defaults for the stub group size. */
2984 unsigned int has_14bit_branch:1;
2985 };
2986
2987 #define ppc64_elf_section_data(sec) \
2988 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2989
2990 static bfd_boolean
2991 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2992 {
2993 if (!sec->used_by_bfd)
2994 {
2995 struct _ppc64_elf_section_data *sdata;
2996 bfd_size_type amt = sizeof (*sdata);
2997
2998 sdata = bfd_zalloc (abfd, amt);
2999 if (sdata == NULL)
3000 return FALSE;
3001 sec->used_by_bfd = sdata;
3002 }
3003
3004 return _bfd_elf_new_section_hook (abfd, sec);
3005 }
3006
3007 static struct _opd_sec_data *
3008 get_opd_info (asection * sec)
3009 {
3010 if (sec != NULL
3011 && ppc64_elf_section_data (sec) != NULL
3012 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
3013 return &ppc64_elf_section_data (sec)->u.opd;
3014 return NULL;
3015 }
3016 \f
3017 /* Parameters for the qsort hook. */
3018 static bfd_boolean synthetic_relocatable;
3019
3020 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
3021
3022 static int
3023 compare_symbols (const void *ap, const void *bp)
3024 {
3025 const asymbol *a = * (const asymbol **) ap;
3026 const asymbol *b = * (const asymbol **) bp;
3027
3028 /* Section symbols first. */
3029 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
3030 return -1;
3031 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
3032 return 1;
3033
3034 /* then .opd symbols. */
3035 if (strcmp (a->section->name, ".opd") == 0
3036 && strcmp (b->section->name, ".opd") != 0)
3037 return -1;
3038 if (strcmp (a->section->name, ".opd") != 0
3039 && strcmp (b->section->name, ".opd") == 0)
3040 return 1;
3041
3042 /* then other code symbols. */
3043 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3044 == (SEC_CODE | SEC_ALLOC)
3045 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3046 != (SEC_CODE | SEC_ALLOC))
3047 return -1;
3048
3049 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3050 != (SEC_CODE | SEC_ALLOC)
3051 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3052 == (SEC_CODE | SEC_ALLOC))
3053 return 1;
3054
3055 if (synthetic_relocatable)
3056 {
3057 if (a->section->id < b->section->id)
3058 return -1;
3059
3060 if (a->section->id > b->section->id)
3061 return 1;
3062 }
3063
3064 if (a->value + a->section->vma < b->value + b->section->vma)
3065 return -1;
3066
3067 if (a->value + a->section->vma > b->value + b->section->vma)
3068 return 1;
3069
3070 /* For syms with the same value, prefer strong dynamic global function
3071 syms over other syms. */
3072 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3073 return -1;
3074
3075 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3076 return 1;
3077
3078 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3079 return -1;
3080
3081 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3082 return 1;
3083
3084 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3085 return -1;
3086
3087 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3088 return 1;
3089
3090 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3091 return -1;
3092
3093 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3094 return 1;
3095
3096 return 0;
3097 }
3098
3099 /* Search SYMS for a symbol of the given VALUE. */
3100
3101 static asymbol *
3102 sym_exists_at (asymbol **syms, long lo, long hi, unsigned int id, bfd_vma value)
3103 {
3104 long mid;
3105
3106 if (id == (unsigned) -1)
3107 {
3108 while (lo < hi)
3109 {
3110 mid = (lo + hi) >> 1;
3111 if (syms[mid]->value + syms[mid]->section->vma < value)
3112 lo = mid + 1;
3113 else if (syms[mid]->value + syms[mid]->section->vma > value)
3114 hi = mid;
3115 else
3116 return syms[mid];
3117 }
3118 }
3119 else
3120 {
3121 while (lo < hi)
3122 {
3123 mid = (lo + hi) >> 1;
3124 if (syms[mid]->section->id < id)
3125 lo = mid + 1;
3126 else if (syms[mid]->section->id > id)
3127 hi = mid;
3128 else if (syms[mid]->value < value)
3129 lo = mid + 1;
3130 else if (syms[mid]->value > value)
3131 hi = mid;
3132 else
3133 return syms[mid];
3134 }
3135 }
3136 return NULL;
3137 }
3138
3139 static bfd_boolean
3140 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3141 {
3142 bfd_vma vma = *(bfd_vma *) ptr;
3143 return ((section->flags & SEC_ALLOC) != 0
3144 && section->vma <= vma
3145 && vma < section->vma + section->size);
3146 }
3147
3148 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3149 entry syms. Also generate @plt symbols for the glink branch table.
3150 Returns count of synthetic symbols in RET or -1 on error. */
3151
3152 static long
3153 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3154 long static_count, asymbol **static_syms,
3155 long dyn_count, asymbol **dyn_syms,
3156 asymbol **ret)
3157 {
3158 asymbol *s;
3159 long i;
3160 long count;
3161 char *names;
3162 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3163 asection *opd = NULL;
3164 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3165 asymbol **syms;
3166 int abi = abiversion (abfd);
3167
3168 *ret = NULL;
3169
3170 if (abi < 2)
3171 {
3172 opd = bfd_get_section_by_name (abfd, ".opd");
3173 if (opd == NULL && abi == 1)
3174 return 0;
3175 }
3176
3177 symcount = static_count;
3178 if (!relocatable)
3179 symcount += dyn_count;
3180 if (symcount == 0)
3181 return 0;
3182
3183 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3184 if (syms == NULL)
3185 return -1;
3186
3187 if (!relocatable && static_count != 0 && dyn_count != 0)
3188 {
3189 /* Use both symbol tables. */
3190 memcpy (syms, static_syms, static_count * sizeof (*syms));
3191 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3192 }
3193 else if (!relocatable && static_count == 0)
3194 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3195 else
3196 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3197
3198 synthetic_relocatable = relocatable;
3199 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3200
3201 if (!relocatable && symcount > 1)
3202 {
3203 long j;
3204 /* Trim duplicate syms, since we may have merged the normal and
3205 dynamic symbols. Actually, we only care about syms that have
3206 different values, so trim any with the same value. */
3207 for (i = 1, j = 1; i < symcount; ++i)
3208 if (syms[i - 1]->value + syms[i - 1]->section->vma
3209 != syms[i]->value + syms[i]->section->vma)
3210 syms[j++] = syms[i];
3211 symcount = j;
3212 }
3213
3214 i = 0;
3215 if (strcmp (syms[i]->section->name, ".opd") == 0)
3216 ++i;
3217 codesecsym = i;
3218
3219 for (; i < symcount; ++i)
3220 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3221 != (SEC_CODE | SEC_ALLOC))
3222 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3223 break;
3224 codesecsymend = i;
3225
3226 for (; i < symcount; ++i)
3227 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3228 break;
3229 secsymend = i;
3230
3231 for (; i < symcount; ++i)
3232 if (strcmp (syms[i]->section->name, ".opd") != 0)
3233 break;
3234 opdsymend = i;
3235
3236 for (; i < symcount; ++i)
3237 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3238 != (SEC_CODE | SEC_ALLOC))
3239 break;
3240 symcount = i;
3241
3242 count = 0;
3243
3244 if (relocatable)
3245 {
3246 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3247 arelent *r;
3248 size_t size;
3249 long relcount;
3250
3251 if (opdsymend == secsymend)
3252 goto done;
3253
3254 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3255 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3256 if (relcount == 0)
3257 goto done;
3258
3259 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3260 {
3261 count = -1;
3262 goto done;
3263 }
3264
3265 size = 0;
3266 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3267 {
3268 asymbol *sym;
3269
3270 while (r < opd->relocation + relcount
3271 && r->address < syms[i]->value + opd->vma)
3272 ++r;
3273
3274 if (r == opd->relocation + relcount)
3275 break;
3276
3277 if (r->address != syms[i]->value + opd->vma)
3278 continue;
3279
3280 if (r->howto->type != R_PPC64_ADDR64)
3281 continue;
3282
3283 sym = *r->sym_ptr_ptr;
3284 if (!sym_exists_at (syms, opdsymend, symcount,
3285 sym->section->id, sym->value + r->addend))
3286 {
3287 ++count;
3288 size += sizeof (asymbol);
3289 size += strlen (syms[i]->name) + 2;
3290 }
3291 }
3292
3293 if (size == 0)
3294 goto done;
3295 s = *ret = bfd_malloc (size);
3296 if (s == NULL)
3297 {
3298 count = -1;
3299 goto done;
3300 }
3301
3302 names = (char *) (s + count);
3303
3304 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3305 {
3306 asymbol *sym;
3307
3308 while (r < opd->relocation + relcount
3309 && r->address < syms[i]->value + opd->vma)
3310 ++r;
3311
3312 if (r == opd->relocation + relcount)
3313 break;
3314
3315 if (r->address != syms[i]->value + opd->vma)
3316 continue;
3317
3318 if (r->howto->type != R_PPC64_ADDR64)
3319 continue;
3320
3321 sym = *r->sym_ptr_ptr;
3322 if (!sym_exists_at (syms, opdsymend, symcount,
3323 sym->section->id, sym->value + r->addend))
3324 {
3325 size_t len;
3326
3327 *s = *syms[i];
3328 s->flags |= BSF_SYNTHETIC;
3329 s->section = sym->section;
3330 s->value = sym->value + r->addend;
3331 s->name = names;
3332 *names++ = '.';
3333 len = strlen (syms[i]->name);
3334 memcpy (names, syms[i]->name, len + 1);
3335 names += len + 1;
3336 /* Have udata.p point back to the original symbol this
3337 synthetic symbol was derived from. */
3338 s->udata.p = syms[i];
3339 s++;
3340 }
3341 }
3342 }
3343 else
3344 {
3345 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3346 bfd_byte *contents = NULL;
3347 size_t size;
3348 long plt_count = 0;
3349 bfd_vma glink_vma = 0, resolv_vma = 0;
3350 asection *dynamic, *glink = NULL, *relplt = NULL;
3351 arelent *p;
3352
3353 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3354 {
3355 free_contents_and_exit_err:
3356 count = -1;
3357 free_contents_and_exit:
3358 if (contents)
3359 free (contents);
3360 goto done;
3361 }
3362
3363 size = 0;
3364 for (i = secsymend; i < opdsymend; ++i)
3365 {
3366 bfd_vma ent;
3367
3368 /* Ignore bogus symbols. */
3369 if (syms[i]->value > opd->size - 8)
3370 continue;
3371
3372 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3373 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3374 {
3375 ++count;
3376 size += sizeof (asymbol);
3377 size += strlen (syms[i]->name) + 2;
3378 }
3379 }
3380
3381 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3382 if (dyn_count != 0
3383 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3384 {
3385 bfd_byte *dynbuf, *extdyn, *extdynend;
3386 size_t extdynsize;
3387 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3388
3389 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3390 goto free_contents_and_exit_err;
3391
3392 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3393 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3394
3395 extdyn = dynbuf;
3396 extdynend = extdyn + dynamic->size;
3397 for (; extdyn < extdynend; extdyn += extdynsize)
3398 {
3399 Elf_Internal_Dyn dyn;
3400 (*swap_dyn_in) (abfd, extdyn, &dyn);
3401
3402 if (dyn.d_tag == DT_NULL)
3403 break;
3404
3405 if (dyn.d_tag == DT_PPC64_GLINK)
3406 {
3407 /* The first glink stub starts at offset 32; see
3408 comment in ppc64_elf_finish_dynamic_sections. */
3409 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
3410 /* The .glink section usually does not survive the final
3411 link; search for the section (usually .text) where the
3412 glink stubs now reside. */
3413 glink = bfd_sections_find_if (abfd, section_covers_vma,
3414 &glink_vma);
3415 break;
3416 }
3417 }
3418
3419 free (dynbuf);
3420 }
3421
3422 if (glink != NULL)
3423 {
3424 /* Determine __glink trampoline by reading the relative branch
3425 from the first glink stub. */
3426 bfd_byte buf[4];
3427 unsigned int off = 0;
3428
3429 while (bfd_get_section_contents (abfd, glink, buf,
3430 glink_vma + off - glink->vma, 4))
3431 {
3432 unsigned int insn = bfd_get_32 (abfd, buf);
3433 insn ^= B_DOT;
3434 if ((insn & ~0x3fffffc) == 0)
3435 {
3436 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3437 break;
3438 }
3439 off += 4;
3440 if (off > 4)
3441 break;
3442 }
3443
3444 if (resolv_vma)
3445 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3446
3447 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3448 if (relplt != NULL)
3449 {
3450 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3451 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3452 goto free_contents_and_exit_err;
3453
3454 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3455 size += plt_count * sizeof (asymbol);
3456
3457 p = relplt->relocation;
3458 for (i = 0; i < plt_count; i++, p++)
3459 {
3460 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3461 if (p->addend != 0)
3462 size += sizeof ("+0x") - 1 + 16;
3463 }
3464 }
3465 }
3466
3467 if (size == 0)
3468 goto free_contents_and_exit;
3469 s = *ret = bfd_malloc (size);
3470 if (s == NULL)
3471 goto free_contents_and_exit_err;
3472
3473 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3474
3475 for (i = secsymend; i < opdsymend; ++i)
3476 {
3477 bfd_vma ent;
3478
3479 if (syms[i]->value > opd->size - 8)
3480 continue;
3481
3482 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3483 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3484 {
3485 long lo, hi;
3486 size_t len;
3487 asection *sec = abfd->sections;
3488
3489 *s = *syms[i];
3490 lo = codesecsym;
3491 hi = codesecsymend;
3492 while (lo < hi)
3493 {
3494 long mid = (lo + hi) >> 1;
3495 if (syms[mid]->section->vma < ent)
3496 lo = mid + 1;
3497 else if (syms[mid]->section->vma > ent)
3498 hi = mid;
3499 else
3500 {
3501 sec = syms[mid]->section;
3502 break;
3503 }
3504 }
3505
3506 if (lo >= hi && lo > codesecsym)
3507 sec = syms[lo - 1]->section;
3508
3509 for (; sec != NULL; sec = sec->next)
3510 {
3511 if (sec->vma > ent)
3512 break;
3513 /* SEC_LOAD may not be set if SEC is from a separate debug
3514 info file. */
3515 if ((sec->flags & SEC_ALLOC) == 0)
3516 break;
3517 if ((sec->flags & SEC_CODE) != 0)
3518 s->section = sec;
3519 }
3520 s->flags |= BSF_SYNTHETIC;
3521 s->value = ent - s->section->vma;
3522 s->name = names;
3523 *names++ = '.';
3524 len = strlen (syms[i]->name);
3525 memcpy (names, syms[i]->name, len + 1);
3526 names += len + 1;
3527 /* Have udata.p point back to the original symbol this
3528 synthetic symbol was derived from. */
3529 s->udata.p = syms[i];
3530 s++;
3531 }
3532 }
3533 free (contents);
3534
3535 if (glink != NULL && relplt != NULL)
3536 {
3537 if (resolv_vma)
3538 {
3539 /* Add a symbol for the main glink trampoline. */
3540 memset (s, 0, sizeof *s);
3541 s->the_bfd = abfd;
3542 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3543 s->section = glink;
3544 s->value = resolv_vma - glink->vma;
3545 s->name = names;
3546 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3547 names += sizeof ("__glink_PLTresolve");
3548 s++;
3549 count++;
3550 }
3551
3552 /* FIXME: It would be very much nicer to put sym@plt on the
3553 stub rather than on the glink branch table entry. The
3554 objdump disassembler would then use a sensible symbol
3555 name on plt calls. The difficulty in doing so is
3556 a) finding the stubs, and,
3557 b) matching stubs against plt entries, and,
3558 c) there can be multiple stubs for a given plt entry.
3559
3560 Solving (a) could be done by code scanning, but older
3561 ppc64 binaries used different stubs to current code.
3562 (b) is the tricky one since you need to known the toc
3563 pointer for at least one function that uses a pic stub to
3564 be able to calculate the plt address referenced.
3565 (c) means gdb would need to set multiple breakpoints (or
3566 find the glink branch itself) when setting breakpoints
3567 for pending shared library loads. */
3568 p = relplt->relocation;
3569 for (i = 0; i < plt_count; i++, p++)
3570 {
3571 size_t len;
3572
3573 *s = **p->sym_ptr_ptr;
3574 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3575 we are defining a symbol, ensure one of them is set. */
3576 if ((s->flags & BSF_LOCAL) == 0)
3577 s->flags |= BSF_GLOBAL;
3578 s->flags |= BSF_SYNTHETIC;
3579 s->section = glink;
3580 s->value = glink_vma - glink->vma;
3581 s->name = names;
3582 s->udata.p = NULL;
3583 len = strlen ((*p->sym_ptr_ptr)->name);
3584 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3585 names += len;
3586 if (p->addend != 0)
3587 {
3588 memcpy (names, "+0x", sizeof ("+0x") - 1);
3589 names += sizeof ("+0x") - 1;
3590 bfd_sprintf_vma (abfd, names, p->addend);
3591 names += strlen (names);
3592 }
3593 memcpy (names, "@plt", sizeof ("@plt"));
3594 names += sizeof ("@plt");
3595 s++;
3596 if (abi < 2)
3597 {
3598 glink_vma += 8;
3599 if (i >= 0x8000)
3600 glink_vma += 4;
3601 }
3602 else
3603 glink_vma += 4;
3604 }
3605 count += plt_count;
3606 }
3607 }
3608
3609 done:
3610 free (syms);
3611 return count;
3612 }
3613 \f
3614 /* The following functions are specific to the ELF linker, while
3615 functions above are used generally. Those named ppc64_elf_* are
3616 called by the main ELF linker code. They appear in this file more
3617 or less in the order in which they are called. eg.
3618 ppc64_elf_check_relocs is called early in the link process,
3619 ppc64_elf_finish_dynamic_sections is one of the last functions
3620 called.
3621
3622 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3623 functions have both a function code symbol and a function descriptor
3624 symbol. A call to foo in a relocatable object file looks like:
3625
3626 . .text
3627 . x:
3628 . bl .foo
3629 . nop
3630
3631 The function definition in another object file might be:
3632
3633 . .section .opd
3634 . foo: .quad .foo
3635 . .quad .TOC.@tocbase
3636 . .quad 0
3637 .
3638 . .text
3639 . .foo: blr
3640
3641 When the linker resolves the call during a static link, the branch
3642 unsurprisingly just goes to .foo and the .opd information is unused.
3643 If the function definition is in a shared library, things are a little
3644 different: The call goes via a plt call stub, the opd information gets
3645 copied to the plt, and the linker patches the nop.
3646
3647 . x:
3648 . bl .foo_stub
3649 . ld 2,40(1)
3650 .
3651 .
3652 . .foo_stub:
3653 . std 2,40(1) # in practice, the call stub
3654 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3655 . addi 11,11,Lfoo@toc@l # this is the general idea
3656 . ld 12,0(11)
3657 . ld 2,8(11)
3658 . mtctr 12
3659 . ld 11,16(11)
3660 . bctr
3661 .
3662 . .section .plt
3663 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3664
3665 The "reloc ()" notation is supposed to indicate that the linker emits
3666 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3667 copying.
3668
3669 What are the difficulties here? Well, firstly, the relocations
3670 examined by the linker in check_relocs are against the function code
3671 sym .foo, while the dynamic relocation in the plt is emitted against
3672 the function descriptor symbol, foo. Somewhere along the line, we need
3673 to carefully copy dynamic link information from one symbol to the other.
3674 Secondly, the generic part of the elf linker will make .foo a dynamic
3675 symbol as is normal for most other backends. We need foo dynamic
3676 instead, at least for an application final link. However, when
3677 creating a shared library containing foo, we need to have both symbols
3678 dynamic so that references to .foo are satisfied during the early
3679 stages of linking. Otherwise the linker might decide to pull in a
3680 definition from some other object, eg. a static library.
3681
3682 Update: As of August 2004, we support a new convention. Function
3683 calls may use the function descriptor symbol, ie. "bl foo". This
3684 behaves exactly as "bl .foo". */
3685
3686 /* Of those relocs that might be copied as dynamic relocs, this function
3687 selects those that must be copied when linking a shared library,
3688 even when the symbol is local. */
3689
3690 static int
3691 must_be_dyn_reloc (struct bfd_link_info *info,
3692 enum elf_ppc64_reloc_type r_type)
3693 {
3694 switch (r_type)
3695 {
3696 default:
3697 return 1;
3698
3699 case R_PPC64_REL32:
3700 case R_PPC64_REL64:
3701 case R_PPC64_REL30:
3702 return 0;
3703
3704 case R_PPC64_TPREL16:
3705 case R_PPC64_TPREL16_LO:
3706 case R_PPC64_TPREL16_HI:
3707 case R_PPC64_TPREL16_HA:
3708 case R_PPC64_TPREL16_DS:
3709 case R_PPC64_TPREL16_LO_DS:
3710 case R_PPC64_TPREL16_HIGH:
3711 case R_PPC64_TPREL16_HIGHA:
3712 case R_PPC64_TPREL16_HIGHER:
3713 case R_PPC64_TPREL16_HIGHERA:
3714 case R_PPC64_TPREL16_HIGHEST:
3715 case R_PPC64_TPREL16_HIGHESTA:
3716 case R_PPC64_TPREL64:
3717 return !bfd_link_executable (info);
3718 }
3719 }
3720
3721 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3722 copying dynamic variables from a shared lib into an app's dynbss
3723 section, and instead use a dynamic relocation to point into the
3724 shared lib. With code that gcc generates, it's vital that this be
3725 enabled; In the PowerPC64 ABI, the address of a function is actually
3726 the address of a function descriptor, which resides in the .opd
3727 section. gcc uses the descriptor directly rather than going via the
3728 GOT as some other ABI's do, which means that initialized function
3729 pointers must reference the descriptor. Thus, a function pointer
3730 initialized to the address of a function in a shared library will
3731 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3732 redefines the function descriptor symbol to point to the copy. This
3733 presents a problem as a plt entry for that function is also
3734 initialized from the function descriptor symbol and the copy reloc
3735 may not be initialized first. */
3736 #define ELIMINATE_COPY_RELOCS 1
3737
3738 /* Section name for stubs is the associated section name plus this
3739 string. */
3740 #define STUB_SUFFIX ".stub"
3741
3742 /* Linker stubs.
3743 ppc_stub_long_branch:
3744 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3745 destination, but a 24 bit branch in a stub section will reach.
3746 . b dest
3747
3748 ppc_stub_plt_branch:
3749 Similar to the above, but a 24 bit branch in the stub section won't
3750 reach its destination.
3751 . addis %r11,%r2,xxx@toc@ha
3752 . ld %r12,xxx@toc@l(%r11)
3753 . mtctr %r12
3754 . bctr
3755
3756 ppc_stub_plt_call:
3757 Used to call a function in a shared library. If it so happens that
3758 the plt entry referenced crosses a 64k boundary, then an extra
3759 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3760 . std %r2,40(%r1)
3761 . addis %r11,%r2,xxx@toc@ha
3762 . ld %r12,xxx+0@toc@l(%r11)
3763 . mtctr %r12
3764 . ld %r2,xxx+8@toc@l(%r11)
3765 . ld %r11,xxx+16@toc@l(%r11)
3766 . bctr
3767
3768 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3769 code to adjust the value and save r2 to support multiple toc sections.
3770 A ppc_stub_long_branch with an r2 offset looks like:
3771 . std %r2,40(%r1)
3772 . addis %r2,%r2,off@ha
3773 . addi %r2,%r2,off@l
3774 . b dest
3775
3776 A ppc_stub_plt_branch with an r2 offset looks like:
3777 . std %r2,40(%r1)
3778 . addis %r11,%r2,xxx@toc@ha
3779 . ld %r12,xxx@toc@l(%r11)
3780 . addis %r2,%r2,off@ha
3781 . addi %r2,%r2,off@l
3782 . mtctr %r12
3783 . bctr
3784
3785 In cases where the "addis" instruction would add zero, the "addis" is
3786 omitted and following instructions modified slightly in some cases.
3787 */
3788
3789 enum ppc_stub_type {
3790 ppc_stub_none,
3791 ppc_stub_long_branch,
3792 ppc_stub_long_branch_r2off,
3793 ppc_stub_plt_branch,
3794 ppc_stub_plt_branch_r2off,
3795 ppc_stub_plt_call,
3796 ppc_stub_plt_call_r2save,
3797 ppc_stub_global_entry,
3798 ppc_stub_save_res
3799 };
3800
3801 /* Information on stub grouping. */
3802 struct map_stub
3803 {
3804 /* The stub section. */
3805 asection *stub_sec;
3806 /* This is the section to which stubs in the group will be attached. */
3807 asection *link_sec;
3808 /* Next group. */
3809 struct map_stub *next;
3810 /* Whether to emit a copy of register save/restore functions in this
3811 group. */
3812 int needs_save_res;
3813 };
3814
3815 struct ppc_stub_hash_entry {
3816
3817 /* Base hash table entry structure. */
3818 struct bfd_hash_entry root;
3819
3820 enum ppc_stub_type stub_type;
3821
3822 /* Group information. */
3823 struct map_stub *group;
3824
3825 /* Offset within stub_sec of the beginning of this stub. */
3826 bfd_vma stub_offset;
3827
3828 /* Given the symbol's value and its section we can determine its final
3829 value when building the stubs (so the stub knows where to jump. */
3830 bfd_vma target_value;
3831 asection *target_section;
3832
3833 /* The symbol table entry, if any, that this was derived from. */
3834 struct ppc_link_hash_entry *h;
3835 struct plt_entry *plt_ent;
3836
3837 /* Symbol st_other. */
3838 unsigned char other;
3839 };
3840
3841 struct ppc_branch_hash_entry {
3842
3843 /* Base hash table entry structure. */
3844 struct bfd_hash_entry root;
3845
3846 /* Offset within branch lookup table. */
3847 unsigned int offset;
3848
3849 /* Generation marker. */
3850 unsigned int iter;
3851 };
3852
3853 /* Used to track dynamic relocations for local symbols. */
3854 struct ppc_dyn_relocs
3855 {
3856 struct ppc_dyn_relocs *next;
3857
3858 /* The input section of the reloc. */
3859 asection *sec;
3860
3861 /* Total number of relocs copied for the input section. */
3862 unsigned int count : 31;
3863
3864 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3865 unsigned int ifunc : 1;
3866 };
3867
3868 struct ppc_link_hash_entry
3869 {
3870 struct elf_link_hash_entry elf;
3871
3872 union {
3873 /* A pointer to the most recently used stub hash entry against this
3874 symbol. */
3875 struct ppc_stub_hash_entry *stub_cache;
3876
3877 /* A pointer to the next symbol starting with a '.' */
3878 struct ppc_link_hash_entry *next_dot_sym;
3879 } u;
3880
3881 /* Track dynamic relocs copied for this symbol. */
3882 struct elf_dyn_relocs *dyn_relocs;
3883
3884 /* Link between function code and descriptor symbols. */
3885 struct ppc_link_hash_entry *oh;
3886
3887 /* Flag function code and descriptor symbols. */
3888 unsigned int is_func:1;
3889 unsigned int is_func_descriptor:1;
3890 unsigned int fake:1;
3891
3892 /* Whether global opd/toc sym has been adjusted or not.
3893 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3894 should be set for all globals defined in any opd/toc section. */
3895 unsigned int adjust_done:1;
3896
3897 /* Set if we twiddled this symbol to weak at some stage. */
3898 unsigned int was_undefined:1;
3899
3900 /* Set if this is an out-of-line register save/restore function,
3901 with non-standard calling convention. */
3902 unsigned int save_res:1;
3903
3904 /* Contexts in which symbol is used in the GOT (or TOC).
3905 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3906 corresponding relocs are encountered during check_relocs.
3907 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3908 indicate the corresponding GOT entry type is not needed.
3909 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3910 a TPREL one. We use a separate flag rather than setting TPREL
3911 just for convenience in distinguishing the two cases. */
3912 #define TLS_GD 1 /* GD reloc. */
3913 #define TLS_LD 2 /* LD reloc. */
3914 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3915 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3916 #define TLS_TLS 16 /* Any TLS reloc. */
3917 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3918 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3919 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
3920 unsigned char tls_mask;
3921 };
3922
3923 /* ppc64 ELF linker hash table. */
3924
3925 struct ppc_link_hash_table
3926 {
3927 struct elf_link_hash_table elf;
3928
3929 /* The stub hash table. */
3930 struct bfd_hash_table stub_hash_table;
3931
3932 /* Another hash table for plt_branch stubs. */
3933 struct bfd_hash_table branch_hash_table;
3934
3935 /* Hash table for function prologue tocsave. */
3936 htab_t tocsave_htab;
3937
3938 /* Various options and other info passed from the linker. */
3939 struct ppc64_elf_params *params;
3940
3941 /* The size of sec_info below. */
3942 unsigned int sec_info_arr_size;
3943
3944 /* Per-section array of extra section info. Done this way rather
3945 than as part of ppc64_elf_section_data so we have the info for
3946 non-ppc64 sections. */
3947 struct
3948 {
3949 /* Along with elf_gp, specifies the TOC pointer used by this section. */
3950 bfd_vma toc_off;
3951
3952 union
3953 {
3954 /* The section group that this section belongs to. */
3955 struct map_stub *group;
3956 /* A temp section list pointer. */
3957 asection *list;
3958 } u;
3959 } *sec_info;
3960
3961 /* Linked list of groups. */
3962 struct map_stub *group;
3963
3964 /* Temp used when calculating TOC pointers. */
3965 bfd_vma toc_curr;
3966 bfd *toc_bfd;
3967 asection *toc_first_sec;
3968
3969 /* Used when adding symbols. */
3970 struct ppc_link_hash_entry *dot_syms;
3971
3972 /* Shortcuts to get to dynamic linker sections. */
3973 asection *dynbss;
3974 asection *relbss;
3975 asection *glink;
3976 asection *sfpr;
3977 asection *brlt;
3978 asection *relbrlt;
3979 asection *glink_eh_frame;
3980
3981 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3982 struct ppc_link_hash_entry *tls_get_addr;
3983 struct ppc_link_hash_entry *tls_get_addr_fd;
3984
3985 /* The size of reliplt used by got entry relocs. */
3986 bfd_size_type got_reli_size;
3987
3988 /* Statistics. */
3989 unsigned long stub_count[ppc_stub_global_entry];
3990
3991 /* Number of stubs against global syms. */
3992 unsigned long stub_globals;
3993
3994 /* Set if we're linking code with function descriptors. */
3995 unsigned int opd_abi:1;
3996
3997 /* Support for multiple toc sections. */
3998 unsigned int do_multi_toc:1;
3999 unsigned int multi_toc_needed:1;
4000 unsigned int second_toc_pass:1;
4001 unsigned int do_toc_opt:1;
4002
4003 /* Set on error. */
4004 unsigned int stub_error:1;
4005
4006 /* Temp used by ppc64_elf_before_check_relocs. */
4007 unsigned int twiddled_syms:1;
4008
4009 /* Incremented every time we size stubs. */
4010 unsigned int stub_iteration;
4011
4012 /* Small local sym cache. */
4013 struct sym_cache sym_cache;
4014 };
4015
4016 /* Rename some of the generic section flags to better document how they
4017 are used here. */
4018
4019 /* Nonzero if this section has TLS related relocations. */
4020 #define has_tls_reloc sec_flg0
4021
4022 /* Nonzero if this section has a call to __tls_get_addr. */
4023 #define has_tls_get_addr_call sec_flg1
4024
4025 /* Nonzero if this section has any toc or got relocs. */
4026 #define has_toc_reloc sec_flg2
4027
4028 /* Nonzero if this section has a call to another section that uses
4029 the toc or got. */
4030 #define makes_toc_func_call sec_flg3
4031
4032 /* Recursion protection when determining above flag. */
4033 #define call_check_in_progress sec_flg4
4034 #define call_check_done sec_flg5
4035
4036 /* Get the ppc64 ELF linker hash table from a link_info structure. */
4037
4038 #define ppc_hash_table(p) \
4039 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
4040 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
4041
4042 #define ppc_stub_hash_lookup(table, string, create, copy) \
4043 ((struct ppc_stub_hash_entry *) \
4044 bfd_hash_lookup ((table), (string), (create), (copy)))
4045
4046 #define ppc_branch_hash_lookup(table, string, create, copy) \
4047 ((struct ppc_branch_hash_entry *) \
4048 bfd_hash_lookup ((table), (string), (create), (copy)))
4049
4050 /* Create an entry in the stub hash table. */
4051
4052 static struct bfd_hash_entry *
4053 stub_hash_newfunc (struct bfd_hash_entry *entry,
4054 struct bfd_hash_table *table,
4055 const char *string)
4056 {
4057 /* Allocate the structure if it has not already been allocated by a
4058 subclass. */
4059 if (entry == NULL)
4060 {
4061 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4062 if (entry == NULL)
4063 return entry;
4064 }
4065
4066 /* Call the allocation method of the superclass. */
4067 entry = bfd_hash_newfunc (entry, table, string);
4068 if (entry != NULL)
4069 {
4070 struct ppc_stub_hash_entry *eh;
4071
4072 /* Initialize the local fields. */
4073 eh = (struct ppc_stub_hash_entry *) entry;
4074 eh->stub_type = ppc_stub_none;
4075 eh->group = NULL;
4076 eh->stub_offset = 0;
4077 eh->target_value = 0;
4078 eh->target_section = NULL;
4079 eh->h = NULL;
4080 eh->plt_ent = NULL;
4081 eh->other = 0;
4082 }
4083
4084 return entry;
4085 }
4086
4087 /* Create an entry in the branch hash table. */
4088
4089 static struct bfd_hash_entry *
4090 branch_hash_newfunc (struct bfd_hash_entry *entry,
4091 struct bfd_hash_table *table,
4092 const char *string)
4093 {
4094 /* Allocate the structure if it has not already been allocated by a
4095 subclass. */
4096 if (entry == NULL)
4097 {
4098 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4099 if (entry == NULL)
4100 return entry;
4101 }
4102
4103 /* Call the allocation method of the superclass. */
4104 entry = bfd_hash_newfunc (entry, table, string);
4105 if (entry != NULL)
4106 {
4107 struct ppc_branch_hash_entry *eh;
4108
4109 /* Initialize the local fields. */
4110 eh = (struct ppc_branch_hash_entry *) entry;
4111 eh->offset = 0;
4112 eh->iter = 0;
4113 }
4114
4115 return entry;
4116 }
4117
4118 /* Create an entry in a ppc64 ELF linker hash table. */
4119
4120 static struct bfd_hash_entry *
4121 link_hash_newfunc (struct bfd_hash_entry *entry,
4122 struct bfd_hash_table *table,
4123 const char *string)
4124 {
4125 /* Allocate the structure if it has not already been allocated by a
4126 subclass. */
4127 if (entry == NULL)
4128 {
4129 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4130 if (entry == NULL)
4131 return entry;
4132 }
4133
4134 /* Call the allocation method of the superclass. */
4135 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4136 if (entry != NULL)
4137 {
4138 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4139
4140 memset (&eh->u.stub_cache, 0,
4141 (sizeof (struct ppc_link_hash_entry)
4142 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4143
4144 /* When making function calls, old ABI code references function entry
4145 points (dot symbols), while new ABI code references the function
4146 descriptor symbol. We need to make any combination of reference and
4147 definition work together, without breaking archive linking.
4148
4149 For a defined function "foo" and an undefined call to "bar":
4150 An old object defines "foo" and ".foo", references ".bar" (possibly
4151 "bar" too).
4152 A new object defines "foo" and references "bar".
4153
4154 A new object thus has no problem with its undefined symbols being
4155 satisfied by definitions in an old object. On the other hand, the
4156 old object won't have ".bar" satisfied by a new object.
4157
4158 Keep a list of newly added dot-symbols. */
4159
4160 if (string[0] == '.')
4161 {
4162 struct ppc_link_hash_table *htab;
4163
4164 htab = (struct ppc_link_hash_table *) table;
4165 eh->u.next_dot_sym = htab->dot_syms;
4166 htab->dot_syms = eh;
4167 }
4168 }
4169
4170 return entry;
4171 }
4172
4173 struct tocsave_entry {
4174 asection *sec;
4175 bfd_vma offset;
4176 };
4177
4178 static hashval_t
4179 tocsave_htab_hash (const void *p)
4180 {
4181 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4182 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4183 }
4184
4185 static int
4186 tocsave_htab_eq (const void *p1, const void *p2)
4187 {
4188 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4189 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4190 return e1->sec == e2->sec && e1->offset == e2->offset;
4191 }
4192
4193 /* Destroy a ppc64 ELF linker hash table. */
4194
4195 static void
4196 ppc64_elf_link_hash_table_free (bfd *obfd)
4197 {
4198 struct ppc_link_hash_table *htab;
4199
4200 htab = (struct ppc_link_hash_table *) obfd->link.hash;
4201 if (htab->tocsave_htab)
4202 htab_delete (htab->tocsave_htab);
4203 bfd_hash_table_free (&htab->branch_hash_table);
4204 bfd_hash_table_free (&htab->stub_hash_table);
4205 _bfd_elf_link_hash_table_free (obfd);
4206 }
4207
4208 /* Create a ppc64 ELF linker hash table. */
4209
4210 static struct bfd_link_hash_table *
4211 ppc64_elf_link_hash_table_create (bfd *abfd)
4212 {
4213 struct ppc_link_hash_table *htab;
4214 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4215
4216 htab = bfd_zmalloc (amt);
4217 if (htab == NULL)
4218 return NULL;
4219
4220 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4221 sizeof (struct ppc_link_hash_entry),
4222 PPC64_ELF_DATA))
4223 {
4224 free (htab);
4225 return NULL;
4226 }
4227
4228 /* Init the stub hash table too. */
4229 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4230 sizeof (struct ppc_stub_hash_entry)))
4231 {
4232 _bfd_elf_link_hash_table_free (abfd);
4233 return NULL;
4234 }
4235
4236 /* And the branch hash table. */
4237 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4238 sizeof (struct ppc_branch_hash_entry)))
4239 {
4240 bfd_hash_table_free (&htab->stub_hash_table);
4241 _bfd_elf_link_hash_table_free (abfd);
4242 return NULL;
4243 }
4244
4245 htab->tocsave_htab = htab_try_create (1024,
4246 tocsave_htab_hash,
4247 tocsave_htab_eq,
4248 NULL);
4249 if (htab->tocsave_htab == NULL)
4250 {
4251 ppc64_elf_link_hash_table_free (abfd);
4252 return NULL;
4253 }
4254 htab->elf.root.hash_table_free = ppc64_elf_link_hash_table_free;
4255
4256 /* Initializing two fields of the union is just cosmetic. We really
4257 only care about glist, but when compiled on a 32-bit host the
4258 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4259 debugger inspection of these fields look nicer. */
4260 htab->elf.init_got_refcount.refcount = 0;
4261 htab->elf.init_got_refcount.glist = NULL;
4262 htab->elf.init_plt_refcount.refcount = 0;
4263 htab->elf.init_plt_refcount.glist = NULL;
4264 htab->elf.init_got_offset.offset = 0;
4265 htab->elf.init_got_offset.glist = NULL;
4266 htab->elf.init_plt_offset.offset = 0;
4267 htab->elf.init_plt_offset.glist = NULL;
4268
4269 return &htab->elf.root;
4270 }
4271
4272 /* Create sections for linker generated code. */
4273
4274 static bfd_boolean
4275 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4276 {
4277 struct ppc_link_hash_table *htab;
4278 flagword flags;
4279
4280 htab = ppc_hash_table (info);
4281
4282 /* Create .sfpr for code to save and restore fp regs. */
4283 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4284 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4285 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4286 flags);
4287 if (htab->sfpr == NULL
4288 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4289 return FALSE;
4290
4291 /* Create .glink for lazy dynamic linking support. */
4292 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4293 flags);
4294 if (htab->glink == NULL
4295 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4296 return FALSE;
4297
4298 if (!info->no_ld_generated_unwind_info)
4299 {
4300 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4301 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4302 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4303 ".eh_frame",
4304 flags);
4305 if (htab->glink_eh_frame == NULL
4306 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4307 return FALSE;
4308 }
4309
4310 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4311 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4312 if (htab->elf.iplt == NULL
4313 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4314 return FALSE;
4315
4316 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4317 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4318 htab->elf.irelplt
4319 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4320 if (htab->elf.irelplt == NULL
4321 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4322 return FALSE;
4323
4324 /* Create branch lookup table for plt_branch stubs. */
4325 flags = (SEC_ALLOC | SEC_LOAD
4326 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4327 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4328 flags);
4329 if (htab->brlt == NULL
4330 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4331 return FALSE;
4332
4333 if (!bfd_link_pic (info))
4334 return TRUE;
4335
4336 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4337 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4338 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4339 ".rela.branch_lt",
4340 flags);
4341 if (htab->relbrlt == NULL
4342 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4343 return FALSE;
4344
4345 return TRUE;
4346 }
4347
4348 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4349
4350 bfd_boolean
4351 ppc64_elf_init_stub_bfd (struct bfd_link_info *info,
4352 struct ppc64_elf_params *params)
4353 {
4354 struct ppc_link_hash_table *htab;
4355
4356 elf_elfheader (params->stub_bfd)->e_ident[EI_CLASS] = ELFCLASS64;
4357
4358 /* Always hook our dynamic sections into the first bfd, which is the
4359 linker created stub bfd. This ensures that the GOT header is at
4360 the start of the output TOC section. */
4361 htab = ppc_hash_table (info);
4362 if (htab == NULL)
4363 return FALSE;
4364 htab->elf.dynobj = params->stub_bfd;
4365 htab->params = params;
4366
4367 if (bfd_link_relocatable (info))
4368 return TRUE;
4369
4370 return create_linkage_sections (htab->elf.dynobj, info);
4371 }
4372
4373 /* Build a name for an entry in the stub hash table. */
4374
4375 static char *
4376 ppc_stub_name (const asection *input_section,
4377 const asection *sym_sec,
4378 const struct ppc_link_hash_entry *h,
4379 const Elf_Internal_Rela *rel)
4380 {
4381 char *stub_name;
4382 ssize_t len;
4383
4384 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4385 offsets from a sym as a branch target? In fact, we could
4386 probably assume the addend is always zero. */
4387 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4388
4389 if (h)
4390 {
4391 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4392 stub_name = bfd_malloc (len);
4393 if (stub_name == NULL)
4394 return stub_name;
4395
4396 len = sprintf (stub_name, "%08x.%s+%x",
4397 input_section->id & 0xffffffff,
4398 h->elf.root.root.string,
4399 (int) rel->r_addend & 0xffffffff);
4400 }
4401 else
4402 {
4403 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4404 stub_name = bfd_malloc (len);
4405 if (stub_name == NULL)
4406 return stub_name;
4407
4408 len = sprintf (stub_name, "%08x.%x:%x+%x",
4409 input_section->id & 0xffffffff,
4410 sym_sec->id & 0xffffffff,
4411 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4412 (int) rel->r_addend & 0xffffffff);
4413 }
4414 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4415 stub_name[len - 2] = 0;
4416 return stub_name;
4417 }
4418
4419 /* Look up an entry in the stub hash. Stub entries are cached because
4420 creating the stub name takes a bit of time. */
4421
4422 static struct ppc_stub_hash_entry *
4423 ppc_get_stub_entry (const asection *input_section,
4424 const asection *sym_sec,
4425 struct ppc_link_hash_entry *h,
4426 const Elf_Internal_Rela *rel,
4427 struct ppc_link_hash_table *htab)
4428 {
4429 struct ppc_stub_hash_entry *stub_entry;
4430 struct map_stub *group;
4431
4432 /* If this input section is part of a group of sections sharing one
4433 stub section, then use the id of the first section in the group.
4434 Stub names need to include a section id, as there may well be
4435 more than one stub used to reach say, printf, and we need to
4436 distinguish between them. */
4437 group = htab->sec_info[input_section->id].u.group;
4438
4439 if (h != NULL && h->u.stub_cache != NULL
4440 && h->u.stub_cache->h == h
4441 && h->u.stub_cache->group == group)
4442 {
4443 stub_entry = h->u.stub_cache;
4444 }
4445 else
4446 {
4447 char *stub_name;
4448
4449 stub_name = ppc_stub_name (group->link_sec, sym_sec, h, rel);
4450 if (stub_name == NULL)
4451 return NULL;
4452
4453 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4454 stub_name, FALSE, FALSE);
4455 if (h != NULL)
4456 h->u.stub_cache = stub_entry;
4457
4458 free (stub_name);
4459 }
4460
4461 return stub_entry;
4462 }
4463
4464 /* Add a new stub entry to the stub hash. Not all fields of the new
4465 stub entry are initialised. */
4466
4467 static struct ppc_stub_hash_entry *
4468 ppc_add_stub (const char *stub_name,
4469 asection *section,
4470 struct bfd_link_info *info)
4471 {
4472 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4473 struct map_stub *group;
4474 asection *link_sec;
4475 asection *stub_sec;
4476 struct ppc_stub_hash_entry *stub_entry;
4477
4478 group = htab->sec_info[section->id].u.group;
4479 link_sec = group->link_sec;
4480 stub_sec = group->stub_sec;
4481 if (stub_sec == NULL)
4482 {
4483 size_t namelen;
4484 bfd_size_type len;
4485 char *s_name;
4486
4487 namelen = strlen (link_sec->name);
4488 len = namelen + sizeof (STUB_SUFFIX);
4489 s_name = bfd_alloc (htab->params->stub_bfd, len);
4490 if (s_name == NULL)
4491 return NULL;
4492
4493 memcpy (s_name, link_sec->name, namelen);
4494 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4495 stub_sec = (*htab->params->add_stub_section) (s_name, link_sec);
4496 if (stub_sec == NULL)
4497 return NULL;
4498 group->stub_sec = stub_sec;
4499 }
4500
4501 /* Enter this entry into the linker stub hash table. */
4502 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4503 TRUE, FALSE);
4504 if (stub_entry == NULL)
4505 {
4506 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4507 section->owner, stub_name);
4508 return NULL;
4509 }
4510
4511 stub_entry->group = group;
4512 stub_entry->stub_offset = 0;
4513 return stub_entry;
4514 }
4515
4516 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4517 not already done. */
4518
4519 static bfd_boolean
4520 create_got_section (bfd *abfd, struct bfd_link_info *info)
4521 {
4522 asection *got, *relgot;
4523 flagword flags;
4524 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4525
4526 if (!is_ppc64_elf (abfd))
4527 return FALSE;
4528 if (htab == NULL)
4529 return FALSE;
4530
4531 if (!htab->elf.sgot
4532 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4533 return FALSE;
4534
4535 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4536 | SEC_LINKER_CREATED);
4537
4538 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4539 if (!got
4540 || !bfd_set_section_alignment (abfd, got, 3))
4541 return FALSE;
4542
4543 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4544 flags | SEC_READONLY);
4545 if (!relgot
4546 || ! bfd_set_section_alignment (abfd, relgot, 3))
4547 return FALSE;
4548
4549 ppc64_elf_tdata (abfd)->got = got;
4550 ppc64_elf_tdata (abfd)->relgot = relgot;
4551 return TRUE;
4552 }
4553
4554 /* Create the dynamic sections, and set up shortcuts. */
4555
4556 static bfd_boolean
4557 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4558 {
4559 struct ppc_link_hash_table *htab;
4560
4561 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4562 return FALSE;
4563
4564 htab = ppc_hash_table (info);
4565 if (htab == NULL)
4566 return FALSE;
4567
4568 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
4569 if (!bfd_link_pic (info))
4570 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
4571
4572 if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss
4573 || (!bfd_link_pic (info) && !htab->relbss))
4574 abort ();
4575
4576 return TRUE;
4577 }
4578
4579 /* Follow indirect and warning symbol links. */
4580
4581 static inline struct bfd_link_hash_entry *
4582 follow_link (struct bfd_link_hash_entry *h)
4583 {
4584 while (h->type == bfd_link_hash_indirect
4585 || h->type == bfd_link_hash_warning)
4586 h = h->u.i.link;
4587 return h;
4588 }
4589
4590 static inline struct elf_link_hash_entry *
4591 elf_follow_link (struct elf_link_hash_entry *h)
4592 {
4593 return (struct elf_link_hash_entry *) follow_link (&h->root);
4594 }
4595
4596 static inline struct ppc_link_hash_entry *
4597 ppc_follow_link (struct ppc_link_hash_entry *h)
4598 {
4599 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4600 }
4601
4602 /* Merge PLT info on FROM with that on TO. */
4603
4604 static void
4605 move_plt_plist (struct ppc_link_hash_entry *from,
4606 struct ppc_link_hash_entry *to)
4607 {
4608 if (from->elf.plt.plist != NULL)
4609 {
4610 if (to->elf.plt.plist != NULL)
4611 {
4612 struct plt_entry **entp;
4613 struct plt_entry *ent;
4614
4615 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4616 {
4617 struct plt_entry *dent;
4618
4619 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4620 if (dent->addend == ent->addend)
4621 {
4622 dent->plt.refcount += ent->plt.refcount;
4623 *entp = ent->next;
4624 break;
4625 }
4626 if (dent == NULL)
4627 entp = &ent->next;
4628 }
4629 *entp = to->elf.plt.plist;
4630 }
4631
4632 to->elf.plt.plist = from->elf.plt.plist;
4633 from->elf.plt.plist = NULL;
4634 }
4635 }
4636
4637 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4638
4639 static void
4640 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4641 struct elf_link_hash_entry *dir,
4642 struct elf_link_hash_entry *ind)
4643 {
4644 struct ppc_link_hash_entry *edir, *eind;
4645
4646 edir = (struct ppc_link_hash_entry *) dir;
4647 eind = (struct ppc_link_hash_entry *) ind;
4648
4649 edir->is_func |= eind->is_func;
4650 edir->is_func_descriptor |= eind->is_func_descriptor;
4651 edir->tls_mask |= eind->tls_mask;
4652 if (eind->oh != NULL)
4653 edir->oh = ppc_follow_link (eind->oh);
4654
4655 /* If called to transfer flags for a weakdef during processing
4656 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4657 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4658 if (!(ELIMINATE_COPY_RELOCS
4659 && eind->elf.root.type != bfd_link_hash_indirect
4660 && edir->elf.dynamic_adjusted))
4661 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4662
4663 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4664 edir->elf.ref_regular |= eind->elf.ref_regular;
4665 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4666 edir->elf.needs_plt |= eind->elf.needs_plt;
4667 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4668
4669 /* Copy over any dynamic relocs we may have on the indirect sym. */
4670 if (eind->dyn_relocs != NULL)
4671 {
4672 if (edir->dyn_relocs != NULL)
4673 {
4674 struct elf_dyn_relocs **pp;
4675 struct elf_dyn_relocs *p;
4676
4677 /* Add reloc counts against the indirect sym to the direct sym
4678 list. Merge any entries against the same section. */
4679 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4680 {
4681 struct elf_dyn_relocs *q;
4682
4683 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4684 if (q->sec == p->sec)
4685 {
4686 q->pc_count += p->pc_count;
4687 q->count += p->count;
4688 *pp = p->next;
4689 break;
4690 }
4691 if (q == NULL)
4692 pp = &p->next;
4693 }
4694 *pp = edir->dyn_relocs;
4695 }
4696
4697 edir->dyn_relocs = eind->dyn_relocs;
4698 eind->dyn_relocs = NULL;
4699 }
4700
4701 /* If we were called to copy over info for a weak sym, that's all.
4702 You might think dyn_relocs need not be copied over; After all,
4703 both syms will be dynamic or both non-dynamic so we're just
4704 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
4705 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4706 dyn_relocs in read-only sections, and it does so on what is the
4707 DIR sym here. */
4708 if (eind->elf.root.type != bfd_link_hash_indirect)
4709 return;
4710
4711 /* Copy over got entries that we may have already seen to the
4712 symbol which just became indirect. */
4713 if (eind->elf.got.glist != NULL)
4714 {
4715 if (edir->elf.got.glist != NULL)
4716 {
4717 struct got_entry **entp;
4718 struct got_entry *ent;
4719
4720 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4721 {
4722 struct got_entry *dent;
4723
4724 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4725 if (dent->addend == ent->addend
4726 && dent->owner == ent->owner
4727 && dent->tls_type == ent->tls_type)
4728 {
4729 dent->got.refcount += ent->got.refcount;
4730 *entp = ent->next;
4731 break;
4732 }
4733 if (dent == NULL)
4734 entp = &ent->next;
4735 }
4736 *entp = edir->elf.got.glist;
4737 }
4738
4739 edir->elf.got.glist = eind->elf.got.glist;
4740 eind->elf.got.glist = NULL;
4741 }
4742
4743 /* And plt entries. */
4744 move_plt_plist (eind, edir);
4745
4746 if (eind->elf.dynindx != -1)
4747 {
4748 if (edir->elf.dynindx != -1)
4749 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4750 edir->elf.dynstr_index);
4751 edir->elf.dynindx = eind->elf.dynindx;
4752 edir->elf.dynstr_index = eind->elf.dynstr_index;
4753 eind->elf.dynindx = -1;
4754 eind->elf.dynstr_index = 0;
4755 }
4756 }
4757
4758 /* Find the function descriptor hash entry from the given function code
4759 hash entry FH. Link the entries via their OH fields. */
4760
4761 static struct ppc_link_hash_entry *
4762 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4763 {
4764 struct ppc_link_hash_entry *fdh = fh->oh;
4765
4766 if (fdh == NULL)
4767 {
4768 const char *fd_name = fh->elf.root.root.string + 1;
4769
4770 fdh = (struct ppc_link_hash_entry *)
4771 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4772 if (fdh == NULL)
4773 return fdh;
4774
4775 fdh->is_func_descriptor = 1;
4776 fdh->oh = fh;
4777 fh->is_func = 1;
4778 fh->oh = fdh;
4779 }
4780
4781 return ppc_follow_link (fdh);
4782 }
4783
4784 /* Make a fake function descriptor sym for the code sym FH. */
4785
4786 static struct ppc_link_hash_entry *
4787 make_fdh (struct bfd_link_info *info,
4788 struct ppc_link_hash_entry *fh)
4789 {
4790 bfd *abfd;
4791 asymbol *newsym;
4792 struct bfd_link_hash_entry *bh;
4793 struct ppc_link_hash_entry *fdh;
4794
4795 abfd = fh->elf.root.u.undef.abfd;
4796 newsym = bfd_make_empty_symbol (abfd);
4797 newsym->name = fh->elf.root.root.string + 1;
4798 newsym->section = bfd_und_section_ptr;
4799 newsym->value = 0;
4800 newsym->flags = BSF_WEAK;
4801
4802 bh = NULL;
4803 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4804 newsym->flags, newsym->section,
4805 newsym->value, NULL, FALSE, FALSE,
4806 &bh))
4807 return NULL;
4808
4809 fdh = (struct ppc_link_hash_entry *) bh;
4810 fdh->elf.non_elf = 0;
4811 fdh->fake = 1;
4812 fdh->is_func_descriptor = 1;
4813 fdh->oh = fh;
4814 fh->is_func = 1;
4815 fh->oh = fdh;
4816 return fdh;
4817 }
4818
4819 /* Fix function descriptor symbols defined in .opd sections to be
4820 function type. */
4821
4822 static bfd_boolean
4823 ppc64_elf_add_symbol_hook (bfd *ibfd,
4824 struct bfd_link_info *info,
4825 Elf_Internal_Sym *isym,
4826 const char **name,
4827 flagword *flags ATTRIBUTE_UNUSED,
4828 asection **sec,
4829 bfd_vma *value)
4830 {
4831 if ((ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4832 || ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4833 && (ibfd->flags & DYNAMIC) == 0
4834 && bfd_get_flavour (info->output_bfd) == bfd_target_elf_flavour)
4835 elf_tdata (info->output_bfd)->has_gnu_symbols = elf_gnu_symbol_any;
4836
4837 if (*sec != NULL
4838 && strcmp ((*sec)->name, ".opd") == 0)
4839 {
4840 asection *code_sec;
4841
4842 if (!(ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC
4843 || ELF_ST_TYPE (isym->st_info) == STT_FUNC))
4844 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4845
4846 /* If the symbol is a function defined in .opd, and the function
4847 code is in a discarded group, let it appear to be undefined. */
4848 if (!bfd_link_relocatable (info)
4849 && (*sec)->reloc_count != 0
4850 && opd_entry_value (*sec, *value, &code_sec, NULL,
4851 FALSE) != (bfd_vma) -1
4852 && discarded_section (code_sec))
4853 {
4854 *sec = bfd_und_section_ptr;
4855 isym->st_shndx = SHN_UNDEF;
4856 }
4857 }
4858 else if (*sec != NULL
4859 && strcmp ((*sec)->name, ".toc") == 0
4860 && ELF_ST_TYPE (isym->st_info) == STT_OBJECT)
4861 {
4862 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4863 if (htab != NULL)
4864 htab->params->object_in_toc = 1;
4865 }
4866
4867 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4868 {
4869 if (abiversion (ibfd) == 0)
4870 set_abiversion (ibfd, 2);
4871 else if (abiversion (ibfd) == 1)
4872 {
4873 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4874 " for ABI version 1\n"), name);
4875 bfd_set_error (bfd_error_bad_value);
4876 return FALSE;
4877 }
4878 }
4879
4880 return TRUE;
4881 }
4882
4883 /* Merge non-visibility st_other attributes: local entry point. */
4884
4885 static void
4886 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4887 const Elf_Internal_Sym *isym,
4888 bfd_boolean definition,
4889 bfd_boolean dynamic)
4890 {
4891 if (definition && !dynamic)
4892 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4893 | ELF_ST_VISIBILITY (h->other));
4894 }
4895
4896 /* This function makes an old ABI object reference to ".bar" cause the
4897 inclusion of a new ABI object archive that defines "bar".
4898 NAME is a symbol defined in an archive. Return a symbol in the hash
4899 table that might be satisfied by the archive symbols. */
4900
4901 static struct elf_link_hash_entry *
4902 ppc64_elf_archive_symbol_lookup (bfd *abfd,
4903 struct bfd_link_info *info,
4904 const char *name)
4905 {
4906 struct elf_link_hash_entry *h;
4907 char *dot_name;
4908 size_t len;
4909
4910 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4911 if (h != NULL
4912 /* Don't return this sym if it is a fake function descriptor
4913 created by add_symbol_adjust. */
4914 && !(h->root.type == bfd_link_hash_undefweak
4915 && ((struct ppc_link_hash_entry *) h)->fake))
4916 return h;
4917
4918 if (name[0] == '.')
4919 return h;
4920
4921 len = strlen (name);
4922 dot_name = bfd_alloc (abfd, len + 2);
4923 if (dot_name == NULL)
4924 return (struct elf_link_hash_entry *) 0 - 1;
4925 dot_name[0] = '.';
4926 memcpy (dot_name + 1, name, len + 1);
4927 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4928 bfd_release (abfd, dot_name);
4929 return h;
4930 }
4931
4932 /* This function satisfies all old ABI object references to ".bar" if a
4933 new ABI object defines "bar". Well, at least, undefined dot symbols
4934 are made weak. This stops later archive searches from including an
4935 object if we already have a function descriptor definition. It also
4936 prevents the linker complaining about undefined symbols.
4937 We also check and correct mismatched symbol visibility here. The
4938 most restrictive visibility of the function descriptor and the
4939 function entry symbol is used. */
4940
4941 static bfd_boolean
4942 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4943 {
4944 struct ppc_link_hash_table *htab;
4945 struct ppc_link_hash_entry *fdh;
4946
4947 if (eh->elf.root.type == bfd_link_hash_indirect)
4948 return TRUE;
4949
4950 if (eh->elf.root.type == bfd_link_hash_warning)
4951 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4952
4953 if (eh->elf.root.root.string[0] != '.')
4954 abort ();
4955
4956 htab = ppc_hash_table (info);
4957 if (htab == NULL)
4958 return FALSE;
4959
4960 fdh = lookup_fdh (eh, htab);
4961 if (fdh == NULL)
4962 {
4963 if (!bfd_link_relocatable (info)
4964 && (eh->elf.root.type == bfd_link_hash_undefined
4965 || eh->elf.root.type == bfd_link_hash_undefweak)
4966 && eh->elf.ref_regular)
4967 {
4968 /* Make an undefweak function descriptor sym, which is enough to
4969 pull in an --as-needed shared lib, but won't cause link
4970 errors. Archives are handled elsewhere. */
4971 fdh = make_fdh (info, eh);
4972 if (fdh == NULL)
4973 return FALSE;
4974 fdh->elf.ref_regular = 1;
4975 }
4976 }
4977 else
4978 {
4979 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4980 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4981 if (entry_vis < descr_vis)
4982 fdh->elf.other += entry_vis - descr_vis;
4983 else if (entry_vis > descr_vis)
4984 eh->elf.other += descr_vis - entry_vis;
4985
4986 if ((fdh->elf.root.type == bfd_link_hash_defined
4987 || fdh->elf.root.type == bfd_link_hash_defweak)
4988 && eh->elf.root.type == bfd_link_hash_undefined)
4989 {
4990 eh->elf.root.type = bfd_link_hash_undefweak;
4991 eh->was_undefined = 1;
4992 htab->twiddled_syms = 1;
4993 }
4994 }
4995
4996 return TRUE;
4997 }
4998
4999 /* Set up opd section info and abiversion for IBFD, and process list
5000 of dot-symbols we made in link_hash_newfunc. */
5001
5002 static bfd_boolean
5003 ppc64_elf_before_check_relocs (bfd *ibfd, struct bfd_link_info *info)
5004 {
5005 struct ppc_link_hash_table *htab;
5006 struct ppc_link_hash_entry **p, *eh;
5007 asection *opd = bfd_get_section_by_name (ibfd, ".opd");
5008
5009 if (opd != NULL && opd->size != 0)
5010 {
5011 if (abiversion (ibfd) == 0)
5012 set_abiversion (ibfd, 1);
5013 else if (abiversion (ibfd) == 2)
5014 {
5015 info->callbacks->einfo (_("%P: %B .opd not allowed in ABI"
5016 " version %d\n"),
5017 ibfd, abiversion (ibfd));
5018 bfd_set_error (bfd_error_bad_value);
5019 return FALSE;
5020 }
5021
5022 if ((ibfd->flags & DYNAMIC) == 0
5023 && (opd->flags & SEC_RELOC) != 0
5024 && opd->reloc_count != 0
5025 && !bfd_is_abs_section (opd->output_section))
5026 {
5027 /* Garbage collection needs some extra help with .opd sections.
5028 We don't want to necessarily keep everything referenced by
5029 relocs in .opd, as that would keep all functions. Instead,
5030 if we reference an .opd symbol (a function descriptor), we
5031 want to keep the function code symbol's section. This is
5032 easy for global symbols, but for local syms we need to keep
5033 information about the associated function section. */
5034 bfd_size_type amt;
5035 asection **opd_sym_map;
5036
5037 amt = OPD_NDX (opd->size) * sizeof (*opd_sym_map);
5038 opd_sym_map = bfd_zalloc (ibfd, amt);
5039 if (opd_sym_map == NULL)
5040 return FALSE;
5041 ppc64_elf_section_data (opd)->u.opd.func_sec = opd_sym_map;
5042 BFD_ASSERT (ppc64_elf_section_data (opd)->sec_type == sec_normal);
5043 ppc64_elf_section_data (opd)->sec_type = sec_opd;
5044 }
5045 }
5046
5047 if (!is_ppc64_elf (info->output_bfd))
5048 return TRUE;
5049 htab = ppc_hash_table (info);
5050 if (htab == NULL)
5051 return FALSE;
5052
5053 /* For input files without an explicit abiversion in e_flags
5054 we should have flagged any with symbol st_other bits set
5055 as ELFv1 and above flagged those with .opd as ELFv2.
5056 Set the output abiversion if not yet set, and for any input
5057 still ambiguous, take its abiversion from the output.
5058 Differences in ABI are reported later. */
5059 if (abiversion (info->output_bfd) == 0)
5060 set_abiversion (info->output_bfd, abiversion (ibfd));
5061 else if (abiversion (ibfd) == 0)
5062 set_abiversion (ibfd, abiversion (info->output_bfd));
5063
5064 p = &htab->dot_syms;
5065 while ((eh = *p) != NULL)
5066 {
5067 *p = NULL;
5068 if (&eh->elf == htab->elf.hgot)
5069 ;
5070 else if (htab->elf.hgot == NULL
5071 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
5072 htab->elf.hgot = &eh->elf;
5073 else if (!add_symbol_adjust (eh, info))
5074 return FALSE;
5075 p = &eh->u.next_dot_sym;
5076 }
5077
5078 /* Clear the list for non-ppc64 input files. */
5079 p = &htab->dot_syms;
5080 while ((eh = *p) != NULL)
5081 {
5082 *p = NULL;
5083 p = &eh->u.next_dot_sym;
5084 }
5085
5086 /* We need to fix the undefs list for any syms we have twiddled to
5087 undef_weak. */
5088 if (htab->twiddled_syms)
5089 {
5090 bfd_link_repair_undef_list (&htab->elf.root);
5091 htab->twiddled_syms = 0;
5092 }
5093 return TRUE;
5094 }
5095
5096 /* Undo hash table changes when an --as-needed input file is determined
5097 not to be needed. */
5098
5099 static bfd_boolean
5100 ppc64_elf_notice_as_needed (bfd *ibfd,
5101 struct bfd_link_info *info,
5102 enum notice_asneeded_action act)
5103 {
5104 if (act == notice_not_needed)
5105 {
5106 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5107
5108 if (htab == NULL)
5109 return FALSE;
5110
5111 htab->dot_syms = NULL;
5112 }
5113 return _bfd_elf_notice_as_needed (ibfd, info, act);
5114 }
5115
5116 /* If --just-symbols against a final linked binary, then assume we need
5117 toc adjusting stubs when calling functions defined there. */
5118
5119 static void
5120 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5121 {
5122 if ((sec->flags & SEC_CODE) != 0
5123 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5124 && is_ppc64_elf (sec->owner))
5125 {
5126 if (abiversion (sec->owner) >= 2
5127 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5128 sec->has_toc_reloc = 1;
5129 }
5130 _bfd_elf_link_just_syms (sec, info);
5131 }
5132
5133 static struct plt_entry **
5134 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5135 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5136 {
5137 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5138 struct plt_entry **local_plt;
5139 unsigned char *local_got_tls_masks;
5140
5141 if (local_got_ents == NULL)
5142 {
5143 bfd_size_type size = symtab_hdr->sh_info;
5144
5145 size *= (sizeof (*local_got_ents)
5146 + sizeof (*local_plt)
5147 + sizeof (*local_got_tls_masks));
5148 local_got_ents = bfd_zalloc (abfd, size);
5149 if (local_got_ents == NULL)
5150 return NULL;
5151 elf_local_got_ents (abfd) = local_got_ents;
5152 }
5153
5154 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5155 {
5156 struct got_entry *ent;
5157
5158 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5159 if (ent->addend == r_addend
5160 && ent->owner == abfd
5161 && ent->tls_type == tls_type)
5162 break;
5163 if (ent == NULL)
5164 {
5165 bfd_size_type amt = sizeof (*ent);
5166 ent = bfd_alloc (abfd, amt);
5167 if (ent == NULL)
5168 return FALSE;
5169 ent->next = local_got_ents[r_symndx];
5170 ent->addend = r_addend;
5171 ent->owner = abfd;
5172 ent->tls_type = tls_type;
5173 ent->is_indirect = FALSE;
5174 ent->got.refcount = 0;
5175 local_got_ents[r_symndx] = ent;
5176 }
5177 ent->got.refcount += 1;
5178 }
5179
5180 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5181 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5182 local_got_tls_masks[r_symndx] |= tls_type;
5183
5184 return local_plt + r_symndx;
5185 }
5186
5187 static bfd_boolean
5188 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5189 {
5190 struct plt_entry *ent;
5191
5192 for (ent = *plist; ent != NULL; ent = ent->next)
5193 if (ent->addend == addend)
5194 break;
5195 if (ent == NULL)
5196 {
5197 bfd_size_type amt = sizeof (*ent);
5198 ent = bfd_alloc (abfd, amt);
5199 if (ent == NULL)
5200 return FALSE;
5201 ent->next = *plist;
5202 ent->addend = addend;
5203 ent->plt.refcount = 0;
5204 *plist = ent;
5205 }
5206 ent->plt.refcount += 1;
5207 return TRUE;
5208 }
5209
5210 static bfd_boolean
5211 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5212 {
5213 return (r_type == R_PPC64_REL24
5214 || r_type == R_PPC64_REL14
5215 || r_type == R_PPC64_REL14_BRTAKEN
5216 || r_type == R_PPC64_REL14_BRNTAKEN
5217 || r_type == R_PPC64_ADDR24
5218 || r_type == R_PPC64_ADDR14
5219 || r_type == R_PPC64_ADDR14_BRTAKEN
5220 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5221 }
5222
5223 /* Look through the relocs for a section during the first phase, and
5224 calculate needed space in the global offset table, procedure
5225 linkage table, and dynamic reloc sections. */
5226
5227 static bfd_boolean
5228 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5229 asection *sec, const Elf_Internal_Rela *relocs)
5230 {
5231 struct ppc_link_hash_table *htab;
5232 Elf_Internal_Shdr *symtab_hdr;
5233 struct elf_link_hash_entry **sym_hashes;
5234 const Elf_Internal_Rela *rel;
5235 const Elf_Internal_Rela *rel_end;
5236 asection *sreloc;
5237 asection **opd_sym_map;
5238 struct elf_link_hash_entry *tga, *dottga;
5239
5240 if (bfd_link_relocatable (info))
5241 return TRUE;
5242
5243 /* Don't do anything special with non-loaded, non-alloced sections.
5244 In particular, any relocs in such sections should not affect GOT
5245 and PLT reference counting (ie. we don't allow them to create GOT
5246 or PLT entries), there's no possibility or desire to optimize TLS
5247 relocs, and there's not much point in propagating relocs to shared
5248 libs that the dynamic linker won't relocate. */
5249 if ((sec->flags & SEC_ALLOC) == 0)
5250 return TRUE;
5251
5252 BFD_ASSERT (is_ppc64_elf (abfd));
5253
5254 htab = ppc_hash_table (info);
5255 if (htab == NULL)
5256 return FALSE;
5257
5258 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5259 FALSE, FALSE, TRUE);
5260 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5261 FALSE, FALSE, TRUE);
5262 symtab_hdr = &elf_symtab_hdr (abfd);
5263 sym_hashes = elf_sym_hashes (abfd);
5264 sreloc = NULL;
5265 opd_sym_map = NULL;
5266 if (ppc64_elf_section_data (sec) != NULL
5267 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
5268 opd_sym_map = ppc64_elf_section_data (sec)->u.opd.func_sec;
5269
5270 rel_end = relocs + sec->reloc_count;
5271 for (rel = relocs; rel < rel_end; rel++)
5272 {
5273 unsigned long r_symndx;
5274 struct elf_link_hash_entry *h;
5275 enum elf_ppc64_reloc_type r_type;
5276 int tls_type;
5277 struct _ppc64_elf_section_data *ppc64_sec;
5278 struct plt_entry **ifunc;
5279
5280 r_symndx = ELF64_R_SYM (rel->r_info);
5281 if (r_symndx < symtab_hdr->sh_info)
5282 h = NULL;
5283 else
5284 {
5285 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5286 h = elf_follow_link (h);
5287
5288 /* PR15323, ref flags aren't set for references in the same
5289 object. */
5290 h->root.non_ir_ref = 1;
5291
5292 if (h == htab->elf.hgot)
5293 sec->has_toc_reloc = 1;
5294 }
5295
5296 tls_type = 0;
5297 ifunc = NULL;
5298 if (h != NULL)
5299 {
5300 if (h->type == STT_GNU_IFUNC)
5301 {
5302 h->needs_plt = 1;
5303 ifunc = &h->plt.plist;
5304 }
5305 }
5306 else
5307 {
5308 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5309 abfd, r_symndx);
5310 if (isym == NULL)
5311 return FALSE;
5312
5313 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5314 {
5315 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5316 rel->r_addend, PLT_IFUNC);
5317 if (ifunc == NULL)
5318 return FALSE;
5319 }
5320 }
5321 r_type = ELF64_R_TYPE (rel->r_info);
5322 if (is_branch_reloc (r_type))
5323 {
5324 if (h != NULL && (h == tga || h == dottga))
5325 {
5326 if (rel != relocs
5327 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5328 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5329 /* We have a new-style __tls_get_addr call with a marker
5330 reloc. */
5331 ;
5332 else
5333 /* Mark this section as having an old-style call. */
5334 sec->has_tls_get_addr_call = 1;
5335 }
5336
5337 /* STT_GNU_IFUNC symbols must have a PLT entry. */
5338 if (ifunc != NULL
5339 && !update_plt_info (abfd, ifunc, rel->r_addend))
5340 return FALSE;
5341 }
5342
5343 switch (r_type)
5344 {
5345 case R_PPC64_TLSGD:
5346 case R_PPC64_TLSLD:
5347 /* These special tls relocs tie a call to __tls_get_addr with
5348 its parameter symbol. */
5349 break;
5350
5351 case R_PPC64_GOT_TLSLD16:
5352 case R_PPC64_GOT_TLSLD16_LO:
5353 case R_PPC64_GOT_TLSLD16_HI:
5354 case R_PPC64_GOT_TLSLD16_HA:
5355 tls_type = TLS_TLS | TLS_LD;
5356 goto dogottls;
5357
5358 case R_PPC64_GOT_TLSGD16:
5359 case R_PPC64_GOT_TLSGD16_LO:
5360 case R_PPC64_GOT_TLSGD16_HI:
5361 case R_PPC64_GOT_TLSGD16_HA:
5362 tls_type = TLS_TLS | TLS_GD;
5363 goto dogottls;
5364
5365 case R_PPC64_GOT_TPREL16_DS:
5366 case R_PPC64_GOT_TPREL16_LO_DS:
5367 case R_PPC64_GOT_TPREL16_HI:
5368 case R_PPC64_GOT_TPREL16_HA:
5369 if (bfd_link_pic (info))
5370 info->flags |= DF_STATIC_TLS;
5371 tls_type = TLS_TLS | TLS_TPREL;
5372 goto dogottls;
5373
5374 case R_PPC64_GOT_DTPREL16_DS:
5375 case R_PPC64_GOT_DTPREL16_LO_DS:
5376 case R_PPC64_GOT_DTPREL16_HI:
5377 case R_PPC64_GOT_DTPREL16_HA:
5378 tls_type = TLS_TLS | TLS_DTPREL;
5379 dogottls:
5380 sec->has_tls_reloc = 1;
5381 /* Fall thru */
5382
5383 case R_PPC64_GOT16:
5384 case R_PPC64_GOT16_DS:
5385 case R_PPC64_GOT16_HA:
5386 case R_PPC64_GOT16_HI:
5387 case R_PPC64_GOT16_LO:
5388 case R_PPC64_GOT16_LO_DS:
5389 /* This symbol requires a global offset table entry. */
5390 sec->has_toc_reloc = 1;
5391 if (r_type == R_PPC64_GOT_TLSLD16
5392 || r_type == R_PPC64_GOT_TLSGD16
5393 || r_type == R_PPC64_GOT_TPREL16_DS
5394 || r_type == R_PPC64_GOT_DTPREL16_DS
5395 || r_type == R_PPC64_GOT16
5396 || r_type == R_PPC64_GOT16_DS)
5397 {
5398 htab->do_multi_toc = 1;
5399 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5400 }
5401
5402 if (ppc64_elf_tdata (abfd)->got == NULL
5403 && !create_got_section (abfd, info))
5404 return FALSE;
5405
5406 if (h != NULL)
5407 {
5408 struct ppc_link_hash_entry *eh;
5409 struct got_entry *ent;
5410
5411 eh = (struct ppc_link_hash_entry *) h;
5412 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5413 if (ent->addend == rel->r_addend
5414 && ent->owner == abfd
5415 && ent->tls_type == tls_type)
5416 break;
5417 if (ent == NULL)
5418 {
5419 bfd_size_type amt = sizeof (*ent);
5420 ent = bfd_alloc (abfd, amt);
5421 if (ent == NULL)
5422 return FALSE;
5423 ent->next = eh->elf.got.glist;
5424 ent->addend = rel->r_addend;
5425 ent->owner = abfd;
5426 ent->tls_type = tls_type;
5427 ent->is_indirect = FALSE;
5428 ent->got.refcount = 0;
5429 eh->elf.got.glist = ent;
5430 }
5431 ent->got.refcount += 1;
5432 eh->tls_mask |= tls_type;
5433 }
5434 else
5435 /* This is a global offset table entry for a local symbol. */
5436 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5437 rel->r_addend, tls_type))
5438 return FALSE;
5439
5440 /* We may also need a plt entry if the symbol turns out to be
5441 an ifunc. */
5442 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1)
5443 {
5444 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5445 return FALSE;
5446 }
5447 break;
5448
5449 case R_PPC64_PLT16_HA:
5450 case R_PPC64_PLT16_HI:
5451 case R_PPC64_PLT16_LO:
5452 case R_PPC64_PLT32:
5453 case R_PPC64_PLT64:
5454 /* This symbol requires a procedure linkage table entry. We
5455 actually build the entry in adjust_dynamic_symbol,
5456 because this might be a case of linking PIC code without
5457 linking in any dynamic objects, in which case we don't
5458 need to generate a procedure linkage table after all. */
5459 if (h == NULL)
5460 {
5461 /* It does not make sense to have a procedure linkage
5462 table entry for a local symbol. */
5463 bfd_set_error (bfd_error_bad_value);
5464 return FALSE;
5465 }
5466 else
5467 {
5468 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5469 return FALSE;
5470 h->needs_plt = 1;
5471 if (h->root.root.string[0] == '.'
5472 && h->root.root.string[1] != '\0')
5473 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5474 }
5475 break;
5476
5477 /* The following relocations don't need to propagate the
5478 relocation if linking a shared object since they are
5479 section relative. */
5480 case R_PPC64_SECTOFF:
5481 case R_PPC64_SECTOFF_LO:
5482 case R_PPC64_SECTOFF_HI:
5483 case R_PPC64_SECTOFF_HA:
5484 case R_PPC64_SECTOFF_DS:
5485 case R_PPC64_SECTOFF_LO_DS:
5486 case R_PPC64_DTPREL16:
5487 case R_PPC64_DTPREL16_LO:
5488 case R_PPC64_DTPREL16_HI:
5489 case R_PPC64_DTPREL16_HA:
5490 case R_PPC64_DTPREL16_DS:
5491 case R_PPC64_DTPREL16_LO_DS:
5492 case R_PPC64_DTPREL16_HIGH:
5493 case R_PPC64_DTPREL16_HIGHA:
5494 case R_PPC64_DTPREL16_HIGHER:
5495 case R_PPC64_DTPREL16_HIGHERA:
5496 case R_PPC64_DTPREL16_HIGHEST:
5497 case R_PPC64_DTPREL16_HIGHESTA:
5498 break;
5499
5500 /* Nor do these. */
5501 case R_PPC64_REL16:
5502 case R_PPC64_REL16_LO:
5503 case R_PPC64_REL16_HI:
5504 case R_PPC64_REL16_HA:
5505 break;
5506
5507 /* Not supported as a dynamic relocation. */
5508 case R_PPC64_ADDR64_LOCAL:
5509 if (bfd_link_pic (info))
5510 {
5511 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5512 ppc_howto_init ();
5513 info->callbacks->einfo (_("%P: %H: %s reloc unsupported "
5514 "in shared libraries and PIEs.\n"),
5515 abfd, sec, rel->r_offset,
5516 ppc64_elf_howto_table[r_type]->name);
5517 bfd_set_error (bfd_error_bad_value);
5518 return FALSE;
5519 }
5520 break;
5521
5522 case R_PPC64_TOC16:
5523 case R_PPC64_TOC16_DS:
5524 htab->do_multi_toc = 1;
5525 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5526 case R_PPC64_TOC16_LO:
5527 case R_PPC64_TOC16_HI:
5528 case R_PPC64_TOC16_HA:
5529 case R_PPC64_TOC16_LO_DS:
5530 sec->has_toc_reloc = 1;
5531 break;
5532
5533 /* This relocation describes the C++ object vtable hierarchy.
5534 Reconstruct it for later use during GC. */
5535 case R_PPC64_GNU_VTINHERIT:
5536 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5537 return FALSE;
5538 break;
5539
5540 /* This relocation describes which C++ vtable entries are actually
5541 used. Record for later use during GC. */
5542 case R_PPC64_GNU_VTENTRY:
5543 BFD_ASSERT (h != NULL);
5544 if (h != NULL
5545 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5546 return FALSE;
5547 break;
5548
5549 case R_PPC64_REL14:
5550 case R_PPC64_REL14_BRTAKEN:
5551 case R_PPC64_REL14_BRNTAKEN:
5552 {
5553 asection *dest = NULL;
5554
5555 /* Heuristic: If jumping outside our section, chances are
5556 we are going to need a stub. */
5557 if (h != NULL)
5558 {
5559 /* If the sym is weak it may be overridden later, so
5560 don't assume we know where a weak sym lives. */
5561 if (h->root.type == bfd_link_hash_defined)
5562 dest = h->root.u.def.section;
5563 }
5564 else
5565 {
5566 Elf_Internal_Sym *isym;
5567
5568 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5569 abfd, r_symndx);
5570 if (isym == NULL)
5571 return FALSE;
5572
5573 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5574 }
5575
5576 if (dest != sec)
5577 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5578 }
5579 /* Fall through. */
5580
5581 case R_PPC64_REL24:
5582 if (h != NULL && ifunc == NULL)
5583 {
5584 /* We may need a .plt entry if the function this reloc
5585 refers to is in a shared lib. */
5586 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5587 return FALSE;
5588 h->needs_plt = 1;
5589 if (h->root.root.string[0] == '.'
5590 && h->root.root.string[1] != '\0')
5591 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5592 if (h == tga || h == dottga)
5593 sec->has_tls_reloc = 1;
5594 }
5595 break;
5596
5597 case R_PPC64_TPREL64:
5598 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5599 if (bfd_link_pic (info))
5600 info->flags |= DF_STATIC_TLS;
5601 goto dotlstoc;
5602
5603 case R_PPC64_DTPMOD64:
5604 if (rel + 1 < rel_end
5605 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5606 && rel[1].r_offset == rel->r_offset + 8)
5607 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5608 else
5609 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5610 goto dotlstoc;
5611
5612 case R_PPC64_DTPREL64:
5613 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5614 if (rel != relocs
5615 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5616 && rel[-1].r_offset == rel->r_offset - 8)
5617 /* This is the second reloc of a dtpmod, dtprel pair.
5618 Don't mark with TLS_DTPREL. */
5619 goto dodyn;
5620
5621 dotlstoc:
5622 sec->has_tls_reloc = 1;
5623 if (h != NULL)
5624 {
5625 struct ppc_link_hash_entry *eh;
5626 eh = (struct ppc_link_hash_entry *) h;
5627 eh->tls_mask |= tls_type;
5628 }
5629 else
5630 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5631 rel->r_addend, tls_type))
5632 return FALSE;
5633
5634 ppc64_sec = ppc64_elf_section_data (sec);
5635 if (ppc64_sec->sec_type != sec_toc)
5636 {
5637 bfd_size_type amt;
5638
5639 /* One extra to simplify get_tls_mask. */
5640 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5641 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5642 if (ppc64_sec->u.toc.symndx == NULL)
5643 return FALSE;
5644 amt = sec->size * sizeof (bfd_vma) / 8;
5645 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5646 if (ppc64_sec->u.toc.add == NULL)
5647 return FALSE;
5648 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5649 ppc64_sec->sec_type = sec_toc;
5650 }
5651 BFD_ASSERT (rel->r_offset % 8 == 0);
5652 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5653 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5654
5655 /* Mark the second slot of a GD or LD entry.
5656 -1 to indicate GD and -2 to indicate LD. */
5657 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5658 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5659 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5660 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5661 goto dodyn;
5662
5663 case R_PPC64_TPREL16:
5664 case R_PPC64_TPREL16_LO:
5665 case R_PPC64_TPREL16_HI:
5666 case R_PPC64_TPREL16_HA:
5667 case R_PPC64_TPREL16_DS:
5668 case R_PPC64_TPREL16_LO_DS:
5669 case R_PPC64_TPREL16_HIGH:
5670 case R_PPC64_TPREL16_HIGHA:
5671 case R_PPC64_TPREL16_HIGHER:
5672 case R_PPC64_TPREL16_HIGHERA:
5673 case R_PPC64_TPREL16_HIGHEST:
5674 case R_PPC64_TPREL16_HIGHESTA:
5675 if (bfd_link_pic (info))
5676 {
5677 info->flags |= DF_STATIC_TLS;
5678 goto dodyn;
5679 }
5680 break;
5681
5682 case R_PPC64_ADDR64:
5683 if (opd_sym_map != NULL
5684 && rel + 1 < rel_end
5685 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5686 {
5687 if (h != NULL)
5688 {
5689 if (h->root.root.string[0] == '.'
5690 && h->root.root.string[1] != 0
5691 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5692 ;
5693 else
5694 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5695 }
5696 else
5697 {
5698 asection *s;
5699 Elf_Internal_Sym *isym;
5700
5701 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5702 abfd, r_symndx);
5703 if (isym == NULL)
5704 return FALSE;
5705
5706 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5707 if (s != NULL && s != sec)
5708 opd_sym_map[OPD_NDX (rel->r_offset)] = s;
5709 }
5710 }
5711 /* Fall through. */
5712
5713 case R_PPC64_ADDR16:
5714 case R_PPC64_ADDR16_DS:
5715 case R_PPC64_ADDR16_HA:
5716 case R_PPC64_ADDR16_HI:
5717 case R_PPC64_ADDR16_HIGH:
5718 case R_PPC64_ADDR16_HIGHA:
5719 case R_PPC64_ADDR16_HIGHER:
5720 case R_PPC64_ADDR16_HIGHERA:
5721 case R_PPC64_ADDR16_HIGHEST:
5722 case R_PPC64_ADDR16_HIGHESTA:
5723 case R_PPC64_ADDR16_LO:
5724 case R_PPC64_ADDR16_LO_DS:
5725 if (h != NULL && !bfd_link_pic (info) && abiversion (abfd) != 1
5726 && rel->r_addend == 0)
5727 {
5728 /* We may need a .plt entry if this reloc refers to a
5729 function in a shared lib. */
5730 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5731 return FALSE;
5732 h->pointer_equality_needed = 1;
5733 }
5734 /* Fall through. */
5735
5736 case R_PPC64_REL30:
5737 case R_PPC64_REL32:
5738 case R_PPC64_REL64:
5739 case R_PPC64_ADDR14:
5740 case R_PPC64_ADDR14_BRNTAKEN:
5741 case R_PPC64_ADDR14_BRTAKEN:
5742 case R_PPC64_ADDR24:
5743 case R_PPC64_ADDR32:
5744 case R_PPC64_UADDR16:
5745 case R_PPC64_UADDR32:
5746 case R_PPC64_UADDR64:
5747 case R_PPC64_TOC:
5748 if (h != NULL && !bfd_link_pic (info))
5749 /* We may need a copy reloc. */
5750 h->non_got_ref = 1;
5751
5752 /* Don't propagate .opd relocs. */
5753 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5754 break;
5755
5756 /* If we are creating a shared library, and this is a reloc
5757 against a global symbol, or a non PC relative reloc
5758 against a local symbol, then we need to copy the reloc
5759 into the shared library. However, if we are linking with
5760 -Bsymbolic, we do not need to copy a reloc against a
5761 global symbol which is defined in an object we are
5762 including in the link (i.e., DEF_REGULAR is set). At
5763 this point we have not seen all the input files, so it is
5764 possible that DEF_REGULAR is not set now but will be set
5765 later (it is never cleared). In case of a weak definition,
5766 DEF_REGULAR may be cleared later by a strong definition in
5767 a shared library. We account for that possibility below by
5768 storing information in the dyn_relocs field of the hash
5769 table entry. A similar situation occurs when creating
5770 shared libraries and symbol visibility changes render the
5771 symbol local.
5772
5773 If on the other hand, we are creating an executable, we
5774 may need to keep relocations for symbols satisfied by a
5775 dynamic library if we manage to avoid copy relocs for the
5776 symbol. */
5777 dodyn:
5778 if ((bfd_link_pic (info)
5779 && (must_be_dyn_reloc (info, r_type)
5780 || (h != NULL
5781 && (!SYMBOLIC_BIND (info, h)
5782 || h->root.type == bfd_link_hash_defweak
5783 || !h->def_regular))))
5784 || (ELIMINATE_COPY_RELOCS
5785 && !bfd_link_pic (info)
5786 && h != NULL
5787 && (h->root.type == bfd_link_hash_defweak
5788 || !h->def_regular))
5789 || (!bfd_link_pic (info)
5790 && ifunc != NULL))
5791 {
5792 /* We must copy these reloc types into the output file.
5793 Create a reloc section in dynobj and make room for
5794 this reloc. */
5795 if (sreloc == NULL)
5796 {
5797 sreloc = _bfd_elf_make_dynamic_reloc_section
5798 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5799
5800 if (sreloc == NULL)
5801 return FALSE;
5802 }
5803
5804 /* If this is a global symbol, we count the number of
5805 relocations we need for this symbol. */
5806 if (h != NULL)
5807 {
5808 struct elf_dyn_relocs *p;
5809 struct elf_dyn_relocs **head;
5810
5811 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5812 p = *head;
5813 if (p == NULL || p->sec != sec)
5814 {
5815 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5816 if (p == NULL)
5817 return FALSE;
5818 p->next = *head;
5819 *head = p;
5820 p->sec = sec;
5821 p->count = 0;
5822 p->pc_count = 0;
5823 }
5824 p->count += 1;
5825 if (!must_be_dyn_reloc (info, r_type))
5826 p->pc_count += 1;
5827 }
5828 else
5829 {
5830 /* Track dynamic relocs needed for local syms too.
5831 We really need local syms available to do this
5832 easily. Oh well. */
5833 struct ppc_dyn_relocs *p;
5834 struct ppc_dyn_relocs **head;
5835 bfd_boolean is_ifunc;
5836 asection *s;
5837 void *vpp;
5838 Elf_Internal_Sym *isym;
5839
5840 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5841 abfd, r_symndx);
5842 if (isym == NULL)
5843 return FALSE;
5844
5845 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5846 if (s == NULL)
5847 s = sec;
5848
5849 vpp = &elf_section_data (s)->local_dynrel;
5850 head = (struct ppc_dyn_relocs **) vpp;
5851 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5852 p = *head;
5853 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5854 p = p->next;
5855 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5856 {
5857 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5858 if (p == NULL)
5859 return FALSE;
5860 p->next = *head;
5861 *head = p;
5862 p->sec = sec;
5863 p->ifunc = is_ifunc;
5864 p->count = 0;
5865 }
5866 p->count += 1;
5867 }
5868 }
5869 break;
5870
5871 default:
5872 break;
5873 }
5874 }
5875
5876 return TRUE;
5877 }
5878
5879 /* Merge backend specific data from an object file to the output
5880 object file when linking. */
5881
5882 static bfd_boolean
5883 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5884 {
5885 unsigned long iflags, oflags;
5886
5887 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5888 return TRUE;
5889
5890 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5891 return TRUE;
5892
5893 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5894 return FALSE;
5895
5896 iflags = elf_elfheader (ibfd)->e_flags;
5897 oflags = elf_elfheader (obfd)->e_flags;
5898
5899 if (iflags & ~EF_PPC64_ABI)
5900 {
5901 (*_bfd_error_handler)
5902 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5903 bfd_set_error (bfd_error_bad_value);
5904 return FALSE;
5905 }
5906 else if (iflags != oflags && iflags != 0)
5907 {
5908 (*_bfd_error_handler)
5909 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5910 ibfd, iflags, oflags);
5911 bfd_set_error (bfd_error_bad_value);
5912 return FALSE;
5913 }
5914
5915 /* Merge Tag_compatibility attributes and any common GNU ones. */
5916 _bfd_elf_merge_object_attributes (ibfd, obfd);
5917
5918 return TRUE;
5919 }
5920
5921 static bfd_boolean
5922 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5923 {
5924 /* Print normal ELF private data. */
5925 _bfd_elf_print_private_bfd_data (abfd, ptr);
5926
5927 if (elf_elfheader (abfd)->e_flags != 0)
5928 {
5929 FILE *file = ptr;
5930
5931 /* xgettext:c-format */
5932 fprintf (file, _("private flags = 0x%lx:"),
5933 elf_elfheader (abfd)->e_flags);
5934
5935 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5936 fprintf (file, _(" [abiv%ld]"),
5937 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5938 fputc ('\n', file);
5939 }
5940
5941 return TRUE;
5942 }
5943
5944 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5945 of the code entry point, and its section, which must be in the same
5946 object as OPD_SEC. Returns (bfd_vma) -1 on error. */
5947
5948 static bfd_vma
5949 opd_entry_value (asection *opd_sec,
5950 bfd_vma offset,
5951 asection **code_sec,
5952 bfd_vma *code_off,
5953 bfd_boolean in_code_sec)
5954 {
5955 bfd *opd_bfd = opd_sec->owner;
5956 Elf_Internal_Rela *relocs;
5957 Elf_Internal_Rela *lo, *hi, *look;
5958 bfd_vma val;
5959
5960 /* No relocs implies we are linking a --just-symbols object, or looking
5961 at a final linked executable with addr2line or somesuch. */
5962 if (opd_sec->reloc_count == 0)
5963 {
5964 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
5965
5966 if (contents == NULL)
5967 {
5968 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5969 return (bfd_vma) -1;
5970 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5971 }
5972
5973 /* PR 17512: file: 64b9dfbb. */
5974 if (offset + 7 >= opd_sec->size || offset + 7 < offset)
5975 return (bfd_vma) -1;
5976
5977 val = bfd_get_64 (opd_bfd, contents + offset);
5978 if (code_sec != NULL)
5979 {
5980 asection *sec, *likely = NULL;
5981
5982 if (in_code_sec)
5983 {
5984 sec = *code_sec;
5985 if (sec->vma <= val
5986 && val < sec->vma + sec->size)
5987 likely = sec;
5988 else
5989 val = -1;
5990 }
5991 else
5992 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5993 if (sec->vma <= val
5994 && (sec->flags & SEC_LOAD) != 0
5995 && (sec->flags & SEC_ALLOC) != 0)
5996 likely = sec;
5997 if (likely != NULL)
5998 {
5999 *code_sec = likely;
6000 if (code_off != NULL)
6001 *code_off = val - likely->vma;
6002 }
6003 }
6004 return val;
6005 }
6006
6007 BFD_ASSERT (is_ppc64_elf (opd_bfd));
6008
6009 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
6010 if (relocs == NULL)
6011 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
6012 /* PR 17512: file: df8e1fd6. */
6013 if (relocs == NULL)
6014 return (bfd_vma) -1;
6015
6016 /* Go find the opd reloc at the sym address. */
6017 lo = relocs;
6018 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
6019 val = (bfd_vma) -1;
6020 while (lo < hi)
6021 {
6022 look = lo + (hi - lo) / 2;
6023 if (look->r_offset < offset)
6024 lo = look + 1;
6025 else if (look->r_offset > offset)
6026 hi = look;
6027 else
6028 {
6029 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
6030
6031 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
6032 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
6033 {
6034 unsigned long symndx = ELF64_R_SYM (look->r_info);
6035 asection *sec = NULL;
6036
6037 if (symndx >= symtab_hdr->sh_info
6038 && elf_sym_hashes (opd_bfd) != NULL)
6039 {
6040 struct elf_link_hash_entry **sym_hashes;
6041 struct elf_link_hash_entry *rh;
6042
6043 sym_hashes = elf_sym_hashes (opd_bfd);
6044 rh = sym_hashes[symndx - symtab_hdr->sh_info];
6045 if (rh != NULL)
6046 {
6047 rh = elf_follow_link (rh);
6048 if (rh->root.type != bfd_link_hash_defined
6049 && rh->root.type != bfd_link_hash_defweak)
6050 break;
6051 if (rh->root.u.def.section->owner == opd_bfd)
6052 {
6053 val = rh->root.u.def.value;
6054 sec = rh->root.u.def.section;
6055 }
6056 }
6057 }
6058
6059 if (sec == NULL)
6060 {
6061 Elf_Internal_Sym *sym;
6062
6063 if (symndx < symtab_hdr->sh_info)
6064 {
6065 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
6066 if (sym == NULL)
6067 {
6068 size_t symcnt = symtab_hdr->sh_info;
6069 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6070 symcnt, 0,
6071 NULL, NULL, NULL);
6072 if (sym == NULL)
6073 break;
6074 symtab_hdr->contents = (bfd_byte *) sym;
6075 }
6076 sym += symndx;
6077 }
6078 else
6079 {
6080 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
6081 1, symndx,
6082 NULL, NULL, NULL);
6083 if (sym == NULL)
6084 break;
6085 }
6086 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
6087 if (sec == NULL)
6088 break;
6089 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
6090 val = sym->st_value;
6091 }
6092
6093 val += look->r_addend;
6094 if (code_off != NULL)
6095 *code_off = val;
6096 if (code_sec != NULL)
6097 {
6098 if (in_code_sec && *code_sec != sec)
6099 return -1;
6100 else
6101 *code_sec = sec;
6102 }
6103 if (sec->output_section != NULL)
6104 val += sec->output_section->vma + sec->output_offset;
6105 }
6106 break;
6107 }
6108 }
6109
6110 return val;
6111 }
6112
6113 /* If the ELF symbol SYM might be a function in SEC, return the
6114 function size and set *CODE_OFF to the function's entry point,
6115 otherwise return zero. */
6116
6117 static bfd_size_type
6118 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6119 bfd_vma *code_off)
6120 {
6121 bfd_size_type size;
6122
6123 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6124 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6125 return 0;
6126
6127 size = 0;
6128 if (!(sym->flags & BSF_SYNTHETIC))
6129 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6130
6131 if (strcmp (sym->section->name, ".opd") == 0)
6132 {
6133 struct _opd_sec_data *opd = get_opd_info (sym->section);
6134 bfd_vma symval = sym->value;
6135
6136 if (opd != NULL
6137 && opd->adjust != NULL
6138 && elf_section_data (sym->section)->relocs != NULL)
6139 {
6140 /* opd_entry_value will use cached relocs that have been
6141 adjusted, but with raw symbols. That means both local
6142 and global symbols need adjusting. */
6143 long adjust = opd->adjust[OPD_NDX (symval)];
6144 if (adjust == -1)
6145 return 0;
6146 symval += adjust;
6147 }
6148
6149 if (opd_entry_value (sym->section, symval,
6150 &sec, code_off, TRUE) == (bfd_vma) -1)
6151 return 0;
6152 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6153 symbol. This size has nothing to do with the code size of the
6154 function, which is what we're supposed to return, but the
6155 code size isn't available without looking up the dot-sym.
6156 However, doing that would be a waste of time particularly
6157 since elf_find_function will look at the dot-sym anyway.
6158 Now, elf_find_function will keep the largest size of any
6159 function sym found at the code address of interest, so return
6160 1 here to avoid it incorrectly caching a larger function size
6161 for a small function. This does mean we return the wrong
6162 size for a new-ABI function of size 24, but all that does is
6163 disable caching for such functions. */
6164 if (size == 24)
6165 size = 1;
6166 }
6167 else
6168 {
6169 if (sym->section != sec)
6170 return 0;
6171 *code_off = sym->value;
6172 }
6173 if (size == 0)
6174 size = 1;
6175 return size;
6176 }
6177
6178 /* Return true if symbol is defined in a regular object file. */
6179
6180 static bfd_boolean
6181 is_static_defined (struct elf_link_hash_entry *h)
6182 {
6183 return ((h->root.type == bfd_link_hash_defined
6184 || h->root.type == bfd_link_hash_defweak)
6185 && h->root.u.def.section != NULL
6186 && h->root.u.def.section->output_section != NULL);
6187 }
6188
6189 /* If FDH is a function descriptor symbol, return the associated code
6190 entry symbol if it is defined. Return NULL otherwise. */
6191
6192 static struct ppc_link_hash_entry *
6193 defined_code_entry (struct ppc_link_hash_entry *fdh)
6194 {
6195 if (fdh->is_func_descriptor)
6196 {
6197 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6198 if (fh->elf.root.type == bfd_link_hash_defined
6199 || fh->elf.root.type == bfd_link_hash_defweak)
6200 return fh;
6201 }
6202 return NULL;
6203 }
6204
6205 /* If FH is a function code entry symbol, return the associated
6206 function descriptor symbol if it is defined. Return NULL otherwise. */
6207
6208 static struct ppc_link_hash_entry *
6209 defined_func_desc (struct ppc_link_hash_entry *fh)
6210 {
6211 if (fh->oh != NULL
6212 && fh->oh->is_func_descriptor)
6213 {
6214 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6215 if (fdh->elf.root.type == bfd_link_hash_defined
6216 || fdh->elf.root.type == bfd_link_hash_defweak)
6217 return fdh;
6218 }
6219 return NULL;
6220 }
6221
6222 /* Mark all our entry sym sections, both opd and code section. */
6223
6224 static void
6225 ppc64_elf_gc_keep (struct bfd_link_info *info)
6226 {
6227 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6228 struct bfd_sym_chain *sym;
6229
6230 if (htab == NULL)
6231 return;
6232
6233 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6234 {
6235 struct ppc_link_hash_entry *eh, *fh;
6236 asection *sec;
6237
6238 eh = (struct ppc_link_hash_entry *)
6239 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6240 if (eh == NULL)
6241 continue;
6242 if (eh->elf.root.type != bfd_link_hash_defined
6243 && eh->elf.root.type != bfd_link_hash_defweak)
6244 continue;
6245
6246 fh = defined_code_entry (eh);
6247 if (fh != NULL)
6248 {
6249 sec = fh->elf.root.u.def.section;
6250 sec->flags |= SEC_KEEP;
6251 }
6252 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6253 && opd_entry_value (eh->elf.root.u.def.section,
6254 eh->elf.root.u.def.value,
6255 &sec, NULL, FALSE) != (bfd_vma) -1)
6256 sec->flags |= SEC_KEEP;
6257
6258 sec = eh->elf.root.u.def.section;
6259 sec->flags |= SEC_KEEP;
6260 }
6261 }
6262
6263 /* Mark sections containing dynamically referenced symbols. When
6264 building shared libraries, we must assume that any visible symbol is
6265 referenced. */
6266
6267 static bfd_boolean
6268 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6269 {
6270 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6271 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6272 struct ppc_link_hash_entry *fdh;
6273 struct bfd_elf_dynamic_list *d = info->dynamic_list;
6274
6275 /* Dynamic linking info is on the func descriptor sym. */
6276 fdh = defined_func_desc (eh);
6277 if (fdh != NULL)
6278 eh = fdh;
6279
6280 if ((eh->elf.root.type == bfd_link_hash_defined
6281 || eh->elf.root.type == bfd_link_hash_defweak)
6282 && (eh->elf.ref_dynamic
6283 || ((eh->elf.def_regular || ELF_COMMON_DEF_P (&eh->elf))
6284 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6285 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6286 && (!bfd_link_executable (info)
6287 || info->export_dynamic
6288 || (eh->elf.dynamic
6289 && d != NULL
6290 && (*d->match) (&d->head, NULL, eh->elf.root.root.string)))
6291 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6292 || !bfd_hide_sym_by_version (info->version_info,
6293 eh->elf.root.root.string)))))
6294 {
6295 asection *code_sec;
6296 struct ppc_link_hash_entry *fh;
6297
6298 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6299
6300 /* Function descriptor syms cause the associated
6301 function code sym section to be marked. */
6302 fh = defined_code_entry (eh);
6303 if (fh != NULL)
6304 {
6305 code_sec = fh->elf.root.u.def.section;
6306 code_sec->flags |= SEC_KEEP;
6307 }
6308 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6309 && opd_entry_value (eh->elf.root.u.def.section,
6310 eh->elf.root.u.def.value,
6311 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6312 code_sec->flags |= SEC_KEEP;
6313 }
6314
6315 return TRUE;
6316 }
6317
6318 /* Return the section that should be marked against GC for a given
6319 relocation. */
6320
6321 static asection *
6322 ppc64_elf_gc_mark_hook (asection *sec,
6323 struct bfd_link_info *info,
6324 Elf_Internal_Rela *rel,
6325 struct elf_link_hash_entry *h,
6326 Elf_Internal_Sym *sym)
6327 {
6328 asection *rsec;
6329
6330 /* Syms return NULL if we're marking .opd, so we avoid marking all
6331 function sections, as all functions are referenced in .opd. */
6332 rsec = NULL;
6333 if (get_opd_info (sec) != NULL)
6334 return rsec;
6335
6336 if (h != NULL)
6337 {
6338 enum elf_ppc64_reloc_type r_type;
6339 struct ppc_link_hash_entry *eh, *fh, *fdh;
6340
6341 r_type = ELF64_R_TYPE (rel->r_info);
6342 switch (r_type)
6343 {
6344 case R_PPC64_GNU_VTINHERIT:
6345 case R_PPC64_GNU_VTENTRY:
6346 break;
6347
6348 default:
6349 switch (h->root.type)
6350 {
6351 case bfd_link_hash_defined:
6352 case bfd_link_hash_defweak:
6353 eh = (struct ppc_link_hash_entry *) h;
6354 fdh = defined_func_desc (eh);
6355 if (fdh != NULL)
6356 eh = fdh;
6357
6358 /* Function descriptor syms cause the associated
6359 function code sym section to be marked. */
6360 fh = defined_code_entry (eh);
6361 if (fh != NULL)
6362 {
6363 /* They also mark their opd section. */
6364 eh->elf.root.u.def.section->gc_mark = 1;
6365
6366 rsec = fh->elf.root.u.def.section;
6367 }
6368 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6369 && opd_entry_value (eh->elf.root.u.def.section,
6370 eh->elf.root.u.def.value,
6371 &rsec, NULL, FALSE) != (bfd_vma) -1)
6372 eh->elf.root.u.def.section->gc_mark = 1;
6373 else
6374 rsec = h->root.u.def.section;
6375 break;
6376
6377 case bfd_link_hash_common:
6378 rsec = h->root.u.c.p->section;
6379 break;
6380
6381 default:
6382 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6383 }
6384 }
6385 }
6386 else
6387 {
6388 struct _opd_sec_data *opd;
6389
6390 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6391 opd = get_opd_info (rsec);
6392 if (opd != NULL && opd->func_sec != NULL)
6393 {
6394 rsec->gc_mark = 1;
6395
6396 rsec = opd->func_sec[OPD_NDX (sym->st_value + rel->r_addend)];
6397 }
6398 }
6399
6400 return rsec;
6401 }
6402
6403 /* Update the .got, .plt. and dynamic reloc reference counts for the
6404 section being removed. */
6405
6406 static bfd_boolean
6407 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6408 asection *sec, const Elf_Internal_Rela *relocs)
6409 {
6410 struct ppc_link_hash_table *htab;
6411 Elf_Internal_Shdr *symtab_hdr;
6412 struct elf_link_hash_entry **sym_hashes;
6413 struct got_entry **local_got_ents;
6414 const Elf_Internal_Rela *rel, *relend;
6415
6416 if (bfd_link_relocatable (info))
6417 return TRUE;
6418
6419 if ((sec->flags & SEC_ALLOC) == 0)
6420 return TRUE;
6421
6422 elf_section_data (sec)->local_dynrel = NULL;
6423
6424 htab = ppc_hash_table (info);
6425 if (htab == NULL)
6426 return FALSE;
6427
6428 symtab_hdr = &elf_symtab_hdr (abfd);
6429 sym_hashes = elf_sym_hashes (abfd);
6430 local_got_ents = elf_local_got_ents (abfd);
6431
6432 relend = relocs + sec->reloc_count;
6433 for (rel = relocs; rel < relend; rel++)
6434 {
6435 unsigned long r_symndx;
6436 enum elf_ppc64_reloc_type r_type;
6437 struct elf_link_hash_entry *h = NULL;
6438 unsigned char tls_type = 0;
6439
6440 r_symndx = ELF64_R_SYM (rel->r_info);
6441 r_type = ELF64_R_TYPE (rel->r_info);
6442 if (r_symndx >= symtab_hdr->sh_info)
6443 {
6444 struct ppc_link_hash_entry *eh;
6445 struct elf_dyn_relocs **pp;
6446 struct elf_dyn_relocs *p;
6447
6448 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6449 h = elf_follow_link (h);
6450 eh = (struct ppc_link_hash_entry *) h;
6451
6452 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6453 if (p->sec == sec)
6454 {
6455 /* Everything must go for SEC. */
6456 *pp = p->next;
6457 break;
6458 }
6459 }
6460
6461 if (is_branch_reloc (r_type))
6462 {
6463 struct plt_entry **ifunc = NULL;
6464 if (h != NULL)
6465 {
6466 if (h->type == STT_GNU_IFUNC)
6467 ifunc = &h->plt.plist;
6468 }
6469 else if (local_got_ents != NULL)
6470 {
6471 struct plt_entry **local_plt = (struct plt_entry **)
6472 (local_got_ents + symtab_hdr->sh_info);
6473 unsigned char *local_got_tls_masks = (unsigned char *)
6474 (local_plt + symtab_hdr->sh_info);
6475 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6476 ifunc = local_plt + r_symndx;
6477 }
6478 if (ifunc != NULL)
6479 {
6480 struct plt_entry *ent;
6481
6482 for (ent = *ifunc; ent != NULL; ent = ent->next)
6483 if (ent->addend == rel->r_addend)
6484 break;
6485 if (ent == NULL)
6486 abort ();
6487 if (ent->plt.refcount > 0)
6488 ent->plt.refcount -= 1;
6489 continue;
6490 }
6491 }
6492
6493 switch (r_type)
6494 {
6495 case R_PPC64_GOT_TLSLD16:
6496 case R_PPC64_GOT_TLSLD16_LO:
6497 case R_PPC64_GOT_TLSLD16_HI:
6498 case R_PPC64_GOT_TLSLD16_HA:
6499 tls_type = TLS_TLS | TLS_LD;
6500 goto dogot;
6501
6502 case R_PPC64_GOT_TLSGD16:
6503 case R_PPC64_GOT_TLSGD16_LO:
6504 case R_PPC64_GOT_TLSGD16_HI:
6505 case R_PPC64_GOT_TLSGD16_HA:
6506 tls_type = TLS_TLS | TLS_GD;
6507 goto dogot;
6508
6509 case R_PPC64_GOT_TPREL16_DS:
6510 case R_PPC64_GOT_TPREL16_LO_DS:
6511 case R_PPC64_GOT_TPREL16_HI:
6512 case R_PPC64_GOT_TPREL16_HA:
6513 tls_type = TLS_TLS | TLS_TPREL;
6514 goto dogot;
6515
6516 case R_PPC64_GOT_DTPREL16_DS:
6517 case R_PPC64_GOT_DTPREL16_LO_DS:
6518 case R_PPC64_GOT_DTPREL16_HI:
6519 case R_PPC64_GOT_DTPREL16_HA:
6520 tls_type = TLS_TLS | TLS_DTPREL;
6521 goto dogot;
6522
6523 case R_PPC64_GOT16:
6524 case R_PPC64_GOT16_DS:
6525 case R_PPC64_GOT16_HA:
6526 case R_PPC64_GOT16_HI:
6527 case R_PPC64_GOT16_LO:
6528 case R_PPC64_GOT16_LO_DS:
6529 dogot:
6530 {
6531 struct got_entry *ent;
6532
6533 if (h != NULL)
6534 ent = h->got.glist;
6535 else
6536 ent = local_got_ents[r_symndx];
6537
6538 for (; ent != NULL; ent = ent->next)
6539 if (ent->addend == rel->r_addend
6540 && ent->owner == abfd
6541 && ent->tls_type == tls_type)
6542 break;
6543 if (ent == NULL)
6544 abort ();
6545 if (ent->got.refcount > 0)
6546 ent->got.refcount -= 1;
6547 }
6548 break;
6549
6550 case R_PPC64_PLT16_HA:
6551 case R_PPC64_PLT16_HI:
6552 case R_PPC64_PLT16_LO:
6553 case R_PPC64_PLT32:
6554 case R_PPC64_PLT64:
6555 case R_PPC64_REL14:
6556 case R_PPC64_REL14_BRNTAKEN:
6557 case R_PPC64_REL14_BRTAKEN:
6558 case R_PPC64_REL24:
6559 if (h != NULL)
6560 {
6561 struct plt_entry *ent;
6562
6563 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6564 if (ent->addend == rel->r_addend)
6565 break;
6566 if (ent != NULL && ent->plt.refcount > 0)
6567 ent->plt.refcount -= 1;
6568 }
6569 break;
6570
6571 default:
6572 break;
6573 }
6574 }
6575 return TRUE;
6576 }
6577
6578 /* The maximum size of .sfpr. */
6579 #define SFPR_MAX (218*4)
6580
6581 struct sfpr_def_parms
6582 {
6583 const char name[12];
6584 unsigned char lo, hi;
6585 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6586 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6587 };
6588
6589 /* Auto-generate _save*, _rest* functions in .sfpr.
6590 If STUB_SEC is non-null, define alias symbols in STUB_SEC
6591 instead. */
6592
6593 static bfd_boolean
6594 sfpr_define (struct bfd_link_info *info,
6595 const struct sfpr_def_parms *parm,
6596 asection *stub_sec)
6597 {
6598 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6599 unsigned int i;
6600 size_t len = strlen (parm->name);
6601 bfd_boolean writing = FALSE;
6602 char sym[16];
6603
6604 if (htab == NULL)
6605 return FALSE;
6606
6607 memcpy (sym, parm->name, len);
6608 sym[len + 2] = 0;
6609
6610 for (i = parm->lo; i <= parm->hi; i++)
6611 {
6612 struct ppc_link_hash_entry *h;
6613
6614 sym[len + 0] = i / 10 + '0';
6615 sym[len + 1] = i % 10 + '0';
6616 h = (struct ppc_link_hash_entry *)
6617 elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6618 if (stub_sec != NULL)
6619 {
6620 if (h != NULL
6621 && h->elf.root.type == bfd_link_hash_defined
6622 && h->elf.root.u.def.section == htab->sfpr)
6623 {
6624 struct elf_link_hash_entry *s;
6625 char buf[32];
6626 sprintf (buf, "%08x.%s", stub_sec->id & 0xffffffff, sym);
6627 s = elf_link_hash_lookup (&htab->elf, buf, TRUE, TRUE, FALSE);
6628 if (s == NULL)
6629 return FALSE;
6630 if (s->root.type == bfd_link_hash_new
6631 || (s->root.type = bfd_link_hash_defined
6632 && s->root.u.def.section == stub_sec))
6633 {
6634 s->root.type = bfd_link_hash_defined;
6635 s->root.u.def.section = stub_sec;
6636 s->root.u.def.value = (stub_sec->size
6637 + h->elf.root.u.def.value);
6638 s->ref_regular = 1;
6639 s->def_regular = 1;
6640 s->ref_regular_nonweak = 1;
6641 s->forced_local = 1;
6642 s->non_elf = 0;
6643 s->root.linker_def = 1;
6644 }
6645 }
6646 continue;
6647 }
6648 if (h != NULL)
6649 {
6650 h->save_res = 1;
6651 if (!h->elf.def_regular)
6652 {
6653 h->elf.root.type = bfd_link_hash_defined;
6654 h->elf.root.u.def.section = htab->sfpr;
6655 h->elf.root.u.def.value = htab->sfpr->size;
6656 h->elf.type = STT_FUNC;
6657 h->elf.def_regular = 1;
6658 _bfd_elf_link_hash_hide_symbol (info, &h->elf, TRUE);
6659 writing = TRUE;
6660 if (htab->sfpr->contents == NULL)
6661 {
6662 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6663 if (htab->sfpr->contents == NULL)
6664 return FALSE;
6665 }
6666 }
6667 }
6668 if (writing)
6669 {
6670 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6671 if (i != parm->hi)
6672 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6673 else
6674 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6675 htab->sfpr->size = p - htab->sfpr->contents;
6676 }
6677 }
6678
6679 return TRUE;
6680 }
6681
6682 static bfd_byte *
6683 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6684 {
6685 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6686 return p + 4;
6687 }
6688
6689 static bfd_byte *
6690 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6691 {
6692 p = savegpr0 (abfd, p, r);
6693 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6694 p = p + 4;
6695 bfd_put_32 (abfd, BLR, p);
6696 return p + 4;
6697 }
6698
6699 static bfd_byte *
6700 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6701 {
6702 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6703 return p + 4;
6704 }
6705
6706 static bfd_byte *
6707 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6708 {
6709 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6710 p = p + 4;
6711 p = restgpr0 (abfd, p, r);
6712 bfd_put_32 (abfd, MTLR_R0, p);
6713 p = p + 4;
6714 if (r == 29)
6715 {
6716 p = restgpr0 (abfd, p, 30);
6717 p = restgpr0 (abfd, p, 31);
6718 }
6719 bfd_put_32 (abfd, BLR, p);
6720 return p + 4;
6721 }
6722
6723 static bfd_byte *
6724 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6725 {
6726 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6727 return p + 4;
6728 }
6729
6730 static bfd_byte *
6731 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6732 {
6733 p = savegpr1 (abfd, p, r);
6734 bfd_put_32 (abfd, BLR, p);
6735 return p + 4;
6736 }
6737
6738 static bfd_byte *
6739 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6740 {
6741 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6742 return p + 4;
6743 }
6744
6745 static bfd_byte *
6746 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6747 {
6748 p = restgpr1 (abfd, p, r);
6749 bfd_put_32 (abfd, BLR, p);
6750 return p + 4;
6751 }
6752
6753 static bfd_byte *
6754 savefpr (bfd *abfd, bfd_byte *p, int r)
6755 {
6756 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6757 return p + 4;
6758 }
6759
6760 static bfd_byte *
6761 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6762 {
6763 p = savefpr (abfd, p, r);
6764 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6765 p = p + 4;
6766 bfd_put_32 (abfd, BLR, p);
6767 return p + 4;
6768 }
6769
6770 static bfd_byte *
6771 restfpr (bfd *abfd, bfd_byte *p, int r)
6772 {
6773 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6774 return p + 4;
6775 }
6776
6777 static bfd_byte *
6778 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6779 {
6780 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6781 p = p + 4;
6782 p = restfpr (abfd, p, r);
6783 bfd_put_32 (abfd, MTLR_R0, p);
6784 p = p + 4;
6785 if (r == 29)
6786 {
6787 p = restfpr (abfd, p, 30);
6788 p = restfpr (abfd, p, 31);
6789 }
6790 bfd_put_32 (abfd, BLR, p);
6791 return p + 4;
6792 }
6793
6794 static bfd_byte *
6795 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6796 {
6797 p = savefpr (abfd, p, r);
6798 bfd_put_32 (abfd, BLR, p);
6799 return p + 4;
6800 }
6801
6802 static bfd_byte *
6803 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6804 {
6805 p = restfpr (abfd, p, r);
6806 bfd_put_32 (abfd, BLR, p);
6807 return p + 4;
6808 }
6809
6810 static bfd_byte *
6811 savevr (bfd *abfd, bfd_byte *p, int r)
6812 {
6813 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6814 p = p + 4;
6815 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6816 return p + 4;
6817 }
6818
6819 static bfd_byte *
6820 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6821 {
6822 p = savevr (abfd, p, r);
6823 bfd_put_32 (abfd, BLR, p);
6824 return p + 4;
6825 }
6826
6827 static bfd_byte *
6828 restvr (bfd *abfd, bfd_byte *p, int r)
6829 {
6830 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6831 p = p + 4;
6832 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6833 return p + 4;
6834 }
6835
6836 static bfd_byte *
6837 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6838 {
6839 p = restvr (abfd, p, r);
6840 bfd_put_32 (abfd, BLR, p);
6841 return p + 4;
6842 }
6843
6844 /* Called via elf_link_hash_traverse to transfer dynamic linking
6845 information on function code symbol entries to their corresponding
6846 function descriptor symbol entries. */
6847
6848 static bfd_boolean
6849 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6850 {
6851 struct bfd_link_info *info;
6852 struct ppc_link_hash_table *htab;
6853 struct plt_entry *ent;
6854 struct ppc_link_hash_entry *fh;
6855 struct ppc_link_hash_entry *fdh;
6856 bfd_boolean force_local;
6857
6858 fh = (struct ppc_link_hash_entry *) h;
6859 if (fh->elf.root.type == bfd_link_hash_indirect)
6860 return TRUE;
6861
6862 info = inf;
6863 htab = ppc_hash_table (info);
6864 if (htab == NULL)
6865 return FALSE;
6866
6867 /* Resolve undefined references to dot-symbols as the value
6868 in the function descriptor, if we have one in a regular object.
6869 This is to satisfy cases like ".quad .foo". Calls to functions
6870 in dynamic objects are handled elsewhere. */
6871 if (fh->elf.root.type == bfd_link_hash_undefweak
6872 && fh->was_undefined
6873 && (fdh = defined_func_desc (fh)) != NULL
6874 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6875 && opd_entry_value (fdh->elf.root.u.def.section,
6876 fdh->elf.root.u.def.value,
6877 &fh->elf.root.u.def.section,
6878 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6879 {
6880 fh->elf.root.type = fdh->elf.root.type;
6881 fh->elf.forced_local = 1;
6882 fh->elf.def_regular = fdh->elf.def_regular;
6883 fh->elf.def_dynamic = fdh->elf.def_dynamic;
6884 }
6885
6886 /* If this is a function code symbol, transfer dynamic linking
6887 information to the function descriptor symbol. */
6888 if (!fh->is_func)
6889 return TRUE;
6890
6891 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6892 if (ent->plt.refcount > 0)
6893 break;
6894 if (ent == NULL
6895 || fh->elf.root.root.string[0] != '.'
6896 || fh->elf.root.root.string[1] == '\0')
6897 return TRUE;
6898
6899 /* Find the corresponding function descriptor symbol. Create it
6900 as undefined if necessary. */
6901
6902 fdh = lookup_fdh (fh, htab);
6903 if (fdh == NULL
6904 && !bfd_link_executable (info)
6905 && (fh->elf.root.type == bfd_link_hash_undefined
6906 || fh->elf.root.type == bfd_link_hash_undefweak))
6907 {
6908 fdh = make_fdh (info, fh);
6909 if (fdh == NULL)
6910 return FALSE;
6911 }
6912
6913 /* Fake function descriptors are made undefweak. If the function
6914 code symbol is strong undefined, make the fake sym the same.
6915 If the function code symbol is defined, then force the fake
6916 descriptor local; We can't support overriding of symbols in a
6917 shared library on a fake descriptor. */
6918
6919 if (fdh != NULL
6920 && fdh->fake
6921 && fdh->elf.root.type == bfd_link_hash_undefweak)
6922 {
6923 if (fh->elf.root.type == bfd_link_hash_undefined)
6924 {
6925 fdh->elf.root.type = bfd_link_hash_undefined;
6926 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6927 }
6928 else if (fh->elf.root.type == bfd_link_hash_defined
6929 || fh->elf.root.type == bfd_link_hash_defweak)
6930 {
6931 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6932 }
6933 }
6934
6935 if (fdh != NULL
6936 && !fdh->elf.forced_local
6937 && (!bfd_link_executable (info)
6938 || fdh->elf.def_dynamic
6939 || fdh->elf.ref_dynamic
6940 || (fdh->elf.root.type == bfd_link_hash_undefweak
6941 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6942 {
6943 if (fdh->elf.dynindx == -1)
6944 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6945 return FALSE;
6946 fdh->elf.ref_regular |= fh->elf.ref_regular;
6947 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6948 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6949 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6950 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6951 {
6952 move_plt_plist (fh, fdh);
6953 fdh->elf.needs_plt = 1;
6954 }
6955 fdh->is_func_descriptor = 1;
6956 fdh->oh = fh;
6957 fh->oh = fdh;
6958 }
6959
6960 /* Now that the info is on the function descriptor, clear the
6961 function code sym info. Any function code syms for which we
6962 don't have a definition in a regular file, we force local.
6963 This prevents a shared library from exporting syms that have
6964 been imported from another library. Function code syms that
6965 are really in the library we must leave global to prevent the
6966 linker dragging in a definition from a static library. */
6967 force_local = (!fh->elf.def_regular
6968 || fdh == NULL
6969 || !fdh->elf.def_regular
6970 || fdh->elf.forced_local);
6971 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6972
6973 return TRUE;
6974 }
6975
6976 static const struct sfpr_def_parms save_res_funcs[] =
6977 {
6978 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6979 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6980 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6981 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6982 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6983 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6984 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6985 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6986 { "._savef", 14, 31, savefpr, savefpr1_tail },
6987 { "._restf", 14, 31, restfpr, restfpr1_tail },
6988 { "_savevr_", 20, 31, savevr, savevr_tail },
6989 { "_restvr_", 20, 31, restvr, restvr_tail }
6990 };
6991
6992 /* Called near the start of bfd_elf_size_dynamic_sections. We use
6993 this hook to a) provide some gcc support functions, and b) transfer
6994 dynamic linking information gathered so far on function code symbol
6995 entries, to their corresponding function descriptor symbol entries. */
6996
6997 static bfd_boolean
6998 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6999 struct bfd_link_info *info)
7000 {
7001 struct ppc_link_hash_table *htab;
7002 unsigned int i;
7003
7004 htab = ppc_hash_table (info);
7005 if (htab == NULL)
7006 return FALSE;
7007
7008 if (!bfd_link_relocatable (info)
7009 && htab->elf.hgot != NULL)
7010 {
7011 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
7012 /* Make .TOC. defined so as to prevent it being made dynamic.
7013 The wrong value here is fixed later in ppc64_elf_set_toc. */
7014 if (!htab->elf.hgot->def_regular
7015 || htab->elf.hgot->root.type != bfd_link_hash_defined)
7016 {
7017 htab->elf.hgot->root.type = bfd_link_hash_defined;
7018 htab->elf.hgot->root.u.def.value = 0;
7019 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
7020 htab->elf.hgot->def_regular = 1;
7021 htab->elf.hgot->root.linker_def = 1;
7022 }
7023 htab->elf.hgot->type = STT_OBJECT;
7024 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
7025 | STV_HIDDEN);
7026 }
7027
7028 if (htab->sfpr == NULL)
7029 /* We don't have any relocs. */
7030 return TRUE;
7031
7032 /* Provide any missing _save* and _rest* functions. */
7033 htab->sfpr->size = 0;
7034 if (htab->params->save_restore_funcs)
7035 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
7036 if (!sfpr_define (info, &save_res_funcs[i], NULL))
7037 return FALSE;
7038
7039 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
7040
7041 if (htab->sfpr->size == 0)
7042 htab->sfpr->flags |= SEC_EXCLUDE;
7043
7044 return TRUE;
7045 }
7046
7047 /* Return true if we have dynamic relocs that apply to read-only sections. */
7048
7049 static bfd_boolean
7050 readonly_dynrelocs (struct elf_link_hash_entry *h)
7051 {
7052 struct ppc_link_hash_entry *eh;
7053 struct elf_dyn_relocs *p;
7054
7055 eh = (struct ppc_link_hash_entry *) h;
7056 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7057 {
7058 asection *s = p->sec->output_section;
7059
7060 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7061 return TRUE;
7062 }
7063 return FALSE;
7064 }
7065
7066 /* Adjust a symbol defined by a dynamic object and referenced by a
7067 regular object. The current definition is in some section of the
7068 dynamic object, but we're not including those sections. We have to
7069 change the definition to something the rest of the link can
7070 understand. */
7071
7072 static bfd_boolean
7073 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
7074 struct elf_link_hash_entry *h)
7075 {
7076 struct ppc_link_hash_table *htab;
7077 asection *s;
7078
7079 htab = ppc_hash_table (info);
7080 if (htab == NULL)
7081 return FALSE;
7082
7083 /* Deal with function syms. */
7084 if (h->type == STT_FUNC
7085 || h->type == STT_GNU_IFUNC
7086 || h->needs_plt)
7087 {
7088 /* Clear procedure linkage table information for any symbol that
7089 won't need a .plt entry. */
7090 struct plt_entry *ent;
7091 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
7092 if (ent->plt.refcount > 0)
7093 break;
7094 if (ent == NULL
7095 || (h->type != STT_GNU_IFUNC
7096 && (SYMBOL_CALLS_LOCAL (info, h)
7097 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7098 && h->root.type == bfd_link_hash_undefweak)))
7099 || ((struct ppc_link_hash_entry *) h)->save_res)
7100 {
7101 h->plt.plist = NULL;
7102 h->needs_plt = 0;
7103 h->pointer_equality_needed = 0;
7104 }
7105 else if (abiversion (info->output_bfd) == 2)
7106 {
7107 /* Taking a function's address in a read/write section
7108 doesn't require us to define the function symbol in the
7109 executable on a global entry stub. A dynamic reloc can
7110 be used instead. */
7111 if (h->pointer_equality_needed
7112 && h->type != STT_GNU_IFUNC
7113 && !readonly_dynrelocs (h))
7114 {
7115 h->pointer_equality_needed = 0;
7116 h->non_got_ref = 0;
7117 }
7118
7119 /* After adjust_dynamic_symbol, non_got_ref set in the
7120 non-shared case means that we have allocated space in
7121 .dynbss for the symbol and thus dyn_relocs for this
7122 symbol should be discarded.
7123 If we get here we know we are making a PLT entry for this
7124 symbol, and in an executable we'd normally resolve
7125 relocations against this symbol to the PLT entry. Allow
7126 dynamic relocs if the reference is weak, and the dynamic
7127 relocs will not cause text relocation. */
7128 else if (!h->ref_regular_nonweak
7129 && h->non_got_ref
7130 && h->type != STT_GNU_IFUNC
7131 && !readonly_dynrelocs (h))
7132 h->non_got_ref = 0;
7133
7134 /* If making a plt entry, then we don't need copy relocs. */
7135 return TRUE;
7136 }
7137 }
7138 else
7139 h->plt.plist = NULL;
7140
7141 /* If this is a weak symbol, and there is a real definition, the
7142 processor independent code will have arranged for us to see the
7143 real definition first, and we can just use the same value. */
7144 if (h->u.weakdef != NULL)
7145 {
7146 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
7147 || h->u.weakdef->root.type == bfd_link_hash_defweak);
7148 h->root.u.def.section = h->u.weakdef->root.u.def.section;
7149 h->root.u.def.value = h->u.weakdef->root.u.def.value;
7150 if (ELIMINATE_COPY_RELOCS)
7151 h->non_got_ref = h->u.weakdef->non_got_ref;
7152 return TRUE;
7153 }
7154
7155 /* If we are creating a shared library, we must presume that the
7156 only references to the symbol are via the global offset table.
7157 For such cases we need not do anything here; the relocations will
7158 be handled correctly by relocate_section. */
7159 if (bfd_link_pic (info))
7160 return TRUE;
7161
7162 /* If there are no references to this symbol that do not use the
7163 GOT, we don't need to generate a copy reloc. */
7164 if (!h->non_got_ref)
7165 return TRUE;
7166
7167 /* Don't generate a copy reloc for symbols defined in the executable. */
7168 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
7169 return TRUE;
7170
7171 /* If -z nocopyreloc was given, don't generate them either. */
7172 if (info->nocopyreloc)
7173 {
7174 h->non_got_ref = 0;
7175 return TRUE;
7176 }
7177
7178 /* If we didn't find any dynamic relocs in read-only sections, then
7179 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
7180 if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
7181 {
7182 h->non_got_ref = 0;
7183 return TRUE;
7184 }
7185
7186 /* Protected variables do not work with .dynbss. The copy in
7187 .dynbss won't be used by the shared library with the protected
7188 definition for the variable. Text relocations are preferable
7189 to an incorrect program. */
7190 if (h->protected_def)
7191 {
7192 h->non_got_ref = 0;
7193 return TRUE;
7194 }
7195
7196 if (h->plt.plist != NULL)
7197 {
7198 /* We should never get here, but unfortunately there are versions
7199 of gcc out there that improperly (for this ABI) put initialized
7200 function pointers, vtable refs and suchlike in read-only
7201 sections. Allow them to proceed, but warn that this might
7202 break at runtime. */
7203 info->callbacks->einfo
7204 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7205 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7206 h->root.root.string);
7207 }
7208
7209 /* This is a reference to a symbol defined by a dynamic object which
7210 is not a function. */
7211
7212 /* We must allocate the symbol in our .dynbss section, which will
7213 become part of the .bss section of the executable. There will be
7214 an entry for this symbol in the .dynsym section. The dynamic
7215 object will contain position independent code, so all references
7216 from the dynamic object to this symbol will go through the global
7217 offset table. The dynamic linker will use the .dynsym entry to
7218 determine the address it must put in the global offset table, so
7219 both the dynamic object and the regular object will refer to the
7220 same memory location for the variable. */
7221
7222 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7223 to copy the initial value out of the dynamic object and into the
7224 runtime process image. We need to remember the offset into the
7225 .rela.bss section we are going to use. */
7226 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7227 {
7228 htab->relbss->size += sizeof (Elf64_External_Rela);
7229 h->needs_copy = 1;
7230 }
7231
7232 s = htab->dynbss;
7233
7234 return _bfd_elf_adjust_dynamic_copy (info, h, s);
7235 }
7236
7237 /* If given a function descriptor symbol, hide both the function code
7238 sym and the descriptor. */
7239 static void
7240 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7241 struct elf_link_hash_entry *h,
7242 bfd_boolean force_local)
7243 {
7244 struct ppc_link_hash_entry *eh;
7245 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7246
7247 eh = (struct ppc_link_hash_entry *) h;
7248 if (eh->is_func_descriptor)
7249 {
7250 struct ppc_link_hash_entry *fh = eh->oh;
7251
7252 if (fh == NULL)
7253 {
7254 const char *p, *q;
7255 struct ppc_link_hash_table *htab;
7256 char save;
7257
7258 /* We aren't supposed to use alloca in BFD because on
7259 systems which do not have alloca the version in libiberty
7260 calls xmalloc, which might cause the program to crash
7261 when it runs out of memory. This function doesn't have a
7262 return status, so there's no way to gracefully return an
7263 error. So cheat. We know that string[-1] can be safely
7264 accessed; It's either a string in an ELF string table,
7265 or allocated in an objalloc structure. */
7266
7267 p = eh->elf.root.root.string - 1;
7268 save = *p;
7269 *(char *) p = '.';
7270 htab = ppc_hash_table (info);
7271 if (htab == NULL)
7272 return;
7273
7274 fh = (struct ppc_link_hash_entry *)
7275 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7276 *(char *) p = save;
7277
7278 /* Unfortunately, if it so happens that the string we were
7279 looking for was allocated immediately before this string,
7280 then we overwrote the string terminator. That's the only
7281 reason the lookup should fail. */
7282 if (fh == NULL)
7283 {
7284 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7285 while (q >= eh->elf.root.root.string && *q == *p)
7286 --q, --p;
7287 if (q < eh->elf.root.root.string && *p == '.')
7288 fh = (struct ppc_link_hash_entry *)
7289 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7290 }
7291 if (fh != NULL)
7292 {
7293 eh->oh = fh;
7294 fh->oh = eh;
7295 }
7296 }
7297 if (fh != NULL)
7298 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7299 }
7300 }
7301
7302 static bfd_boolean
7303 get_sym_h (struct elf_link_hash_entry **hp,
7304 Elf_Internal_Sym **symp,
7305 asection **symsecp,
7306 unsigned char **tls_maskp,
7307 Elf_Internal_Sym **locsymsp,
7308 unsigned long r_symndx,
7309 bfd *ibfd)
7310 {
7311 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7312
7313 if (r_symndx >= symtab_hdr->sh_info)
7314 {
7315 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7316 struct elf_link_hash_entry *h;
7317
7318 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7319 h = elf_follow_link (h);
7320
7321 if (hp != NULL)
7322 *hp = h;
7323
7324 if (symp != NULL)
7325 *symp = NULL;
7326
7327 if (symsecp != NULL)
7328 {
7329 asection *symsec = NULL;
7330 if (h->root.type == bfd_link_hash_defined
7331 || h->root.type == bfd_link_hash_defweak)
7332 symsec = h->root.u.def.section;
7333 *symsecp = symsec;
7334 }
7335
7336 if (tls_maskp != NULL)
7337 {
7338 struct ppc_link_hash_entry *eh;
7339
7340 eh = (struct ppc_link_hash_entry *) h;
7341 *tls_maskp = &eh->tls_mask;
7342 }
7343 }
7344 else
7345 {
7346 Elf_Internal_Sym *sym;
7347 Elf_Internal_Sym *locsyms = *locsymsp;
7348
7349 if (locsyms == NULL)
7350 {
7351 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7352 if (locsyms == NULL)
7353 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7354 symtab_hdr->sh_info,
7355 0, NULL, NULL, NULL);
7356 if (locsyms == NULL)
7357 return FALSE;
7358 *locsymsp = locsyms;
7359 }
7360 sym = locsyms + r_symndx;
7361
7362 if (hp != NULL)
7363 *hp = NULL;
7364
7365 if (symp != NULL)
7366 *symp = sym;
7367
7368 if (symsecp != NULL)
7369 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7370
7371 if (tls_maskp != NULL)
7372 {
7373 struct got_entry **lgot_ents;
7374 unsigned char *tls_mask;
7375
7376 tls_mask = NULL;
7377 lgot_ents = elf_local_got_ents (ibfd);
7378 if (lgot_ents != NULL)
7379 {
7380 struct plt_entry **local_plt = (struct plt_entry **)
7381 (lgot_ents + symtab_hdr->sh_info);
7382 unsigned char *lgot_masks = (unsigned char *)
7383 (local_plt + symtab_hdr->sh_info);
7384 tls_mask = &lgot_masks[r_symndx];
7385 }
7386 *tls_maskp = tls_mask;
7387 }
7388 }
7389 return TRUE;
7390 }
7391
7392 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7393 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7394 type suitable for optimization, and 1 otherwise. */
7395
7396 static int
7397 get_tls_mask (unsigned char **tls_maskp,
7398 unsigned long *toc_symndx,
7399 bfd_vma *toc_addend,
7400 Elf_Internal_Sym **locsymsp,
7401 const Elf_Internal_Rela *rel,
7402 bfd *ibfd)
7403 {
7404 unsigned long r_symndx;
7405 int next_r;
7406 struct elf_link_hash_entry *h;
7407 Elf_Internal_Sym *sym;
7408 asection *sec;
7409 bfd_vma off;
7410
7411 r_symndx = ELF64_R_SYM (rel->r_info);
7412 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7413 return 0;
7414
7415 if ((*tls_maskp != NULL && **tls_maskp != 0)
7416 || sec == NULL
7417 || ppc64_elf_section_data (sec) == NULL
7418 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7419 return 1;
7420
7421 /* Look inside a TOC section too. */
7422 if (h != NULL)
7423 {
7424 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7425 off = h->root.u.def.value;
7426 }
7427 else
7428 off = sym->st_value;
7429 off += rel->r_addend;
7430 BFD_ASSERT (off % 8 == 0);
7431 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7432 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7433 if (toc_symndx != NULL)
7434 *toc_symndx = r_symndx;
7435 if (toc_addend != NULL)
7436 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7437 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7438 return 0;
7439 if ((h == NULL || is_static_defined (h))
7440 && (next_r == -1 || next_r == -2))
7441 return 1 - next_r;
7442 return 1;
7443 }
7444
7445 /* Find (or create) an entry in the tocsave hash table. */
7446
7447 static struct tocsave_entry *
7448 tocsave_find (struct ppc_link_hash_table *htab,
7449 enum insert_option insert,
7450 Elf_Internal_Sym **local_syms,
7451 const Elf_Internal_Rela *irela,
7452 bfd *ibfd)
7453 {
7454 unsigned long r_indx;
7455 struct elf_link_hash_entry *h;
7456 Elf_Internal_Sym *sym;
7457 struct tocsave_entry ent, *p;
7458 hashval_t hash;
7459 struct tocsave_entry **slot;
7460
7461 r_indx = ELF64_R_SYM (irela->r_info);
7462 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7463 return NULL;
7464 if (ent.sec == NULL || ent.sec->output_section == NULL)
7465 {
7466 (*_bfd_error_handler)
7467 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7468 return NULL;
7469 }
7470
7471 if (h != NULL)
7472 ent.offset = h->root.u.def.value;
7473 else
7474 ent.offset = sym->st_value;
7475 ent.offset += irela->r_addend;
7476
7477 hash = tocsave_htab_hash (&ent);
7478 slot = ((struct tocsave_entry **)
7479 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7480 if (slot == NULL)
7481 return NULL;
7482
7483 if (*slot == NULL)
7484 {
7485 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7486 if (p == NULL)
7487 return NULL;
7488 *p = ent;
7489 *slot = p;
7490 }
7491 return *slot;
7492 }
7493
7494 /* Adjust all global syms defined in opd sections. In gcc generated
7495 code for the old ABI, these will already have been done. */
7496
7497 static bfd_boolean
7498 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7499 {
7500 struct ppc_link_hash_entry *eh;
7501 asection *sym_sec;
7502 struct _opd_sec_data *opd;
7503
7504 if (h->root.type == bfd_link_hash_indirect)
7505 return TRUE;
7506
7507 if (h->root.type != bfd_link_hash_defined
7508 && h->root.type != bfd_link_hash_defweak)
7509 return TRUE;
7510
7511 eh = (struct ppc_link_hash_entry *) h;
7512 if (eh->adjust_done)
7513 return TRUE;
7514
7515 sym_sec = eh->elf.root.u.def.section;
7516 opd = get_opd_info (sym_sec);
7517 if (opd != NULL && opd->adjust != NULL)
7518 {
7519 long adjust = opd->adjust[OPD_NDX (eh->elf.root.u.def.value)];
7520 if (adjust == -1)
7521 {
7522 /* This entry has been deleted. */
7523 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7524 if (dsec == NULL)
7525 {
7526 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7527 if (discarded_section (dsec))
7528 {
7529 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7530 break;
7531 }
7532 }
7533 eh->elf.root.u.def.value = 0;
7534 eh->elf.root.u.def.section = dsec;
7535 }
7536 else
7537 eh->elf.root.u.def.value += adjust;
7538 eh->adjust_done = 1;
7539 }
7540 return TRUE;
7541 }
7542
7543 /* Handles decrementing dynamic reloc counts for the reloc specified by
7544 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7545 have already been determined. */
7546
7547 static bfd_boolean
7548 dec_dynrel_count (bfd_vma r_info,
7549 asection *sec,
7550 struct bfd_link_info *info,
7551 Elf_Internal_Sym **local_syms,
7552 struct elf_link_hash_entry *h,
7553 Elf_Internal_Sym *sym)
7554 {
7555 enum elf_ppc64_reloc_type r_type;
7556 asection *sym_sec = NULL;
7557
7558 /* Can this reloc be dynamic? This switch, and later tests here
7559 should be kept in sync with the code in check_relocs. */
7560 r_type = ELF64_R_TYPE (r_info);
7561 switch (r_type)
7562 {
7563 default:
7564 return TRUE;
7565
7566 case R_PPC64_TPREL16:
7567 case R_PPC64_TPREL16_LO:
7568 case R_PPC64_TPREL16_HI:
7569 case R_PPC64_TPREL16_HA:
7570 case R_PPC64_TPREL16_DS:
7571 case R_PPC64_TPREL16_LO_DS:
7572 case R_PPC64_TPREL16_HIGH:
7573 case R_PPC64_TPREL16_HIGHA:
7574 case R_PPC64_TPREL16_HIGHER:
7575 case R_PPC64_TPREL16_HIGHERA:
7576 case R_PPC64_TPREL16_HIGHEST:
7577 case R_PPC64_TPREL16_HIGHESTA:
7578 if (!bfd_link_pic (info))
7579 return TRUE;
7580
7581 case R_PPC64_TPREL64:
7582 case R_PPC64_DTPMOD64:
7583 case R_PPC64_DTPREL64:
7584 case R_PPC64_ADDR64:
7585 case R_PPC64_REL30:
7586 case R_PPC64_REL32:
7587 case R_PPC64_REL64:
7588 case R_PPC64_ADDR14:
7589 case R_PPC64_ADDR14_BRNTAKEN:
7590 case R_PPC64_ADDR14_BRTAKEN:
7591 case R_PPC64_ADDR16:
7592 case R_PPC64_ADDR16_DS:
7593 case R_PPC64_ADDR16_HA:
7594 case R_PPC64_ADDR16_HI:
7595 case R_PPC64_ADDR16_HIGH:
7596 case R_PPC64_ADDR16_HIGHA:
7597 case R_PPC64_ADDR16_HIGHER:
7598 case R_PPC64_ADDR16_HIGHERA:
7599 case R_PPC64_ADDR16_HIGHEST:
7600 case R_PPC64_ADDR16_HIGHESTA:
7601 case R_PPC64_ADDR16_LO:
7602 case R_PPC64_ADDR16_LO_DS:
7603 case R_PPC64_ADDR24:
7604 case R_PPC64_ADDR32:
7605 case R_PPC64_UADDR16:
7606 case R_PPC64_UADDR32:
7607 case R_PPC64_UADDR64:
7608 case R_PPC64_TOC:
7609 break;
7610 }
7611
7612 if (local_syms != NULL)
7613 {
7614 unsigned long r_symndx;
7615 bfd *ibfd = sec->owner;
7616
7617 r_symndx = ELF64_R_SYM (r_info);
7618 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7619 return FALSE;
7620 }
7621
7622 if ((bfd_link_pic (info)
7623 && (must_be_dyn_reloc (info, r_type)
7624 || (h != NULL
7625 && (!SYMBOLIC_BIND (info, h)
7626 || h->root.type == bfd_link_hash_defweak
7627 || !h->def_regular))))
7628 || (ELIMINATE_COPY_RELOCS
7629 && !bfd_link_pic (info)
7630 && h != NULL
7631 && (h->root.type == bfd_link_hash_defweak
7632 || !h->def_regular)))
7633 ;
7634 else
7635 return TRUE;
7636
7637 if (h != NULL)
7638 {
7639 struct elf_dyn_relocs *p;
7640 struct elf_dyn_relocs **pp;
7641 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7642
7643 /* elf_gc_sweep may have already removed all dyn relocs associated
7644 with local syms for a given section. Also, symbol flags are
7645 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7646 report a dynreloc miscount. */
7647 if (*pp == NULL && info->gc_sections)
7648 return TRUE;
7649
7650 while ((p = *pp) != NULL)
7651 {
7652 if (p->sec == sec)
7653 {
7654 if (!must_be_dyn_reloc (info, r_type))
7655 p->pc_count -= 1;
7656 p->count -= 1;
7657 if (p->count == 0)
7658 *pp = p->next;
7659 return TRUE;
7660 }
7661 pp = &p->next;
7662 }
7663 }
7664 else
7665 {
7666 struct ppc_dyn_relocs *p;
7667 struct ppc_dyn_relocs **pp;
7668 void *vpp;
7669 bfd_boolean is_ifunc;
7670
7671 if (local_syms == NULL)
7672 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7673 if (sym_sec == NULL)
7674 sym_sec = sec;
7675
7676 vpp = &elf_section_data (sym_sec)->local_dynrel;
7677 pp = (struct ppc_dyn_relocs **) vpp;
7678
7679 if (*pp == NULL && info->gc_sections)
7680 return TRUE;
7681
7682 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7683 while ((p = *pp) != NULL)
7684 {
7685 if (p->sec == sec && p->ifunc == is_ifunc)
7686 {
7687 p->count -= 1;
7688 if (p->count == 0)
7689 *pp = p->next;
7690 return TRUE;
7691 }
7692 pp = &p->next;
7693 }
7694 }
7695
7696 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7697 sec->owner, sec);
7698 bfd_set_error (bfd_error_bad_value);
7699 return FALSE;
7700 }
7701
7702 /* Remove unused Official Procedure Descriptor entries. Currently we
7703 only remove those associated with functions in discarded link-once
7704 sections, or weakly defined functions that have been overridden. It
7705 would be possible to remove many more entries for statically linked
7706 applications. */
7707
7708 bfd_boolean
7709 ppc64_elf_edit_opd (struct bfd_link_info *info)
7710 {
7711 bfd *ibfd;
7712 bfd_boolean some_edited = FALSE;
7713 asection *need_pad = NULL;
7714 struct ppc_link_hash_table *htab;
7715
7716 htab = ppc_hash_table (info);
7717 if (htab == NULL)
7718 return FALSE;
7719
7720 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
7721 {
7722 asection *sec;
7723 Elf_Internal_Rela *relstart, *rel, *relend;
7724 Elf_Internal_Shdr *symtab_hdr;
7725 Elf_Internal_Sym *local_syms;
7726 struct _opd_sec_data *opd;
7727 bfd_boolean need_edit, add_aux_fields, broken;
7728 bfd_size_type cnt_16b = 0;
7729
7730 if (!is_ppc64_elf (ibfd))
7731 continue;
7732
7733 sec = bfd_get_section_by_name (ibfd, ".opd");
7734 if (sec == NULL || sec->size == 0)
7735 continue;
7736
7737 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7738 continue;
7739
7740 if (sec->output_section == bfd_abs_section_ptr)
7741 continue;
7742
7743 /* Look through the section relocs. */
7744 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7745 continue;
7746
7747 local_syms = NULL;
7748 symtab_hdr = &elf_symtab_hdr (ibfd);
7749
7750 /* Read the relocations. */
7751 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7752 info->keep_memory);
7753 if (relstart == NULL)
7754 return FALSE;
7755
7756 /* First run through the relocs to check they are sane, and to
7757 determine whether we need to edit this opd section. */
7758 need_edit = FALSE;
7759 broken = FALSE;
7760 need_pad = sec;
7761 relend = relstart + sec->reloc_count;
7762 for (rel = relstart; rel < relend; )
7763 {
7764 enum elf_ppc64_reloc_type r_type;
7765 unsigned long r_symndx;
7766 asection *sym_sec;
7767 struct elf_link_hash_entry *h;
7768 Elf_Internal_Sym *sym;
7769 bfd_vma offset;
7770
7771 /* .opd contains an array of 16 or 24 byte entries. We're
7772 only interested in the reloc pointing to a function entry
7773 point. */
7774 offset = rel->r_offset;
7775 if (rel + 1 == relend
7776 || rel[1].r_offset != offset + 8)
7777 {
7778 /* If someone messes with .opd alignment then after a
7779 "ld -r" we might have padding in the middle of .opd.
7780 Also, there's nothing to prevent someone putting
7781 something silly in .opd with the assembler. No .opd
7782 optimization for them! */
7783 broken_opd:
7784 (*_bfd_error_handler)
7785 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7786 broken = TRUE;
7787 break;
7788 }
7789
7790 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7791 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7792 {
7793 (*_bfd_error_handler)
7794 (_("%B: unexpected reloc type %u in .opd section"),
7795 ibfd, r_type);
7796 broken = TRUE;
7797 break;
7798 }
7799
7800 r_symndx = ELF64_R_SYM (rel->r_info);
7801 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7802 r_symndx, ibfd))
7803 goto error_ret;
7804
7805 if (sym_sec == NULL || sym_sec->owner == NULL)
7806 {
7807 const char *sym_name;
7808 if (h != NULL)
7809 sym_name = h->root.root.string;
7810 else
7811 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7812 sym_sec);
7813
7814 (*_bfd_error_handler)
7815 (_("%B: undefined sym `%s' in .opd section"),
7816 ibfd, sym_name);
7817 broken = TRUE;
7818 break;
7819 }
7820
7821 /* opd entries are always for functions defined in the
7822 current input bfd. If the symbol isn't defined in the
7823 input bfd, then we won't be using the function in this
7824 bfd; It must be defined in a linkonce section in another
7825 bfd, or is weak. It's also possible that we are
7826 discarding the function due to a linker script /DISCARD/,
7827 which we test for via the output_section. */
7828 if (sym_sec->owner != ibfd
7829 || sym_sec->output_section == bfd_abs_section_ptr)
7830 need_edit = TRUE;
7831
7832 rel += 2;
7833 if (rel + 1 == relend
7834 || (rel + 2 < relend
7835 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC))
7836 ++rel;
7837
7838 if (rel == relend)
7839 {
7840 if (sec->size == offset + 24)
7841 {
7842 need_pad = NULL;
7843 break;
7844 }
7845 if (sec->size == offset + 16)
7846 {
7847 cnt_16b++;
7848 break;
7849 }
7850 goto broken_opd;
7851 }
7852 else if (rel + 1 < relend
7853 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7854 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7855 {
7856 if (rel[0].r_offset == offset + 16)
7857 cnt_16b++;
7858 else if (rel[0].r_offset != offset + 24)
7859 goto broken_opd;
7860 }
7861 else
7862 goto broken_opd;
7863 }
7864
7865 add_aux_fields = htab->params->non_overlapping_opd && cnt_16b > 0;
7866
7867 if (!broken && (need_edit || add_aux_fields))
7868 {
7869 Elf_Internal_Rela *write_rel;
7870 Elf_Internal_Shdr *rel_hdr;
7871 bfd_byte *rptr, *wptr;
7872 bfd_byte *new_contents;
7873 bfd_size_type amt;
7874
7875 new_contents = NULL;
7876 amt = OPD_NDX (sec->size) * sizeof (long);
7877 opd = &ppc64_elf_section_data (sec)->u.opd;
7878 opd->adjust = bfd_zalloc (sec->owner, amt);
7879 if (opd->adjust == NULL)
7880 return FALSE;
7881 ppc64_elf_section_data (sec)->sec_type = sec_opd;
7882
7883 /* This seems a waste of time as input .opd sections are all
7884 zeros as generated by gcc, but I suppose there's no reason
7885 this will always be so. We might start putting something in
7886 the third word of .opd entries. */
7887 if ((sec->flags & SEC_IN_MEMORY) == 0)
7888 {
7889 bfd_byte *loc;
7890 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7891 {
7892 if (loc != NULL)
7893 free (loc);
7894 error_ret:
7895 if (local_syms != NULL
7896 && symtab_hdr->contents != (unsigned char *) local_syms)
7897 free (local_syms);
7898 if (elf_section_data (sec)->relocs != relstart)
7899 free (relstart);
7900 return FALSE;
7901 }
7902 sec->contents = loc;
7903 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7904 }
7905
7906 elf_section_data (sec)->relocs = relstart;
7907
7908 new_contents = sec->contents;
7909 if (add_aux_fields)
7910 {
7911 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7912 if (new_contents == NULL)
7913 return FALSE;
7914 need_pad = NULL;
7915 }
7916 wptr = new_contents;
7917 rptr = sec->contents;
7918 write_rel = relstart;
7919 for (rel = relstart; rel < relend; )
7920 {
7921 unsigned long r_symndx;
7922 asection *sym_sec;
7923 struct elf_link_hash_entry *h;
7924 struct ppc_link_hash_entry *fdh = NULL;
7925 Elf_Internal_Sym *sym;
7926 long opd_ent_size;
7927 Elf_Internal_Rela *next_rel;
7928 bfd_boolean skip;
7929
7930 r_symndx = ELF64_R_SYM (rel->r_info);
7931 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7932 r_symndx, ibfd))
7933 goto error_ret;
7934
7935 next_rel = rel + 2;
7936 if (next_rel + 1 == relend
7937 || (next_rel + 2 < relend
7938 && ELF64_R_TYPE (next_rel[2].r_info) == R_PPC64_TOC))
7939 ++next_rel;
7940
7941 /* See if the .opd entry is full 24 byte or
7942 16 byte (with fd_aux entry overlapped with next
7943 fd_func). */
7944 opd_ent_size = 24;
7945 if (next_rel == relend)
7946 {
7947 if (sec->size == rel->r_offset + 16)
7948 opd_ent_size = 16;
7949 }
7950 else if (next_rel->r_offset == rel->r_offset + 16)
7951 opd_ent_size = 16;
7952
7953 if (h != NULL
7954 && h->root.root.string[0] == '.')
7955 {
7956 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h, htab);
7957 if (fdh != NULL
7958 && fdh->elf.root.type != bfd_link_hash_defined
7959 && fdh->elf.root.type != bfd_link_hash_defweak)
7960 fdh = NULL;
7961 }
7962
7963 skip = (sym_sec->owner != ibfd
7964 || sym_sec->output_section == bfd_abs_section_ptr);
7965 if (skip)
7966 {
7967 if (fdh != NULL && sym_sec->owner == ibfd)
7968 {
7969 /* Arrange for the function descriptor sym
7970 to be dropped. */
7971 fdh->elf.root.u.def.value = 0;
7972 fdh->elf.root.u.def.section = sym_sec;
7973 }
7974 opd->adjust[OPD_NDX (rel->r_offset)] = -1;
7975
7976 if (NO_OPD_RELOCS || bfd_link_relocatable (info))
7977 rel = next_rel;
7978 else
7979 while (1)
7980 {
7981 if (!dec_dynrel_count (rel->r_info, sec, info,
7982 NULL, h, sym))
7983 goto error_ret;
7984
7985 if (++rel == next_rel)
7986 break;
7987
7988 r_symndx = ELF64_R_SYM (rel->r_info);
7989 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7990 r_symndx, ibfd))
7991 goto error_ret;
7992 }
7993 }
7994 else
7995 {
7996 /* We'll be keeping this opd entry. */
7997 long adjust;
7998
7999 if (fdh != NULL)
8000 {
8001 /* Redefine the function descriptor symbol to
8002 this location in the opd section. It is
8003 necessary to update the value here rather
8004 than using an array of adjustments as we do
8005 for local symbols, because various places
8006 in the generic ELF code use the value
8007 stored in u.def.value. */
8008 fdh->elf.root.u.def.value = wptr - new_contents;
8009 fdh->adjust_done = 1;
8010 }
8011
8012 /* Local syms are a bit tricky. We could
8013 tweak them as they can be cached, but
8014 we'd need to look through the local syms
8015 for the function descriptor sym which we
8016 don't have at the moment. So keep an
8017 array of adjustments. */
8018 adjust = (wptr - new_contents) - (rptr - sec->contents);
8019 opd->adjust[OPD_NDX (rel->r_offset)] = adjust;
8020
8021 if (wptr != rptr)
8022 memcpy (wptr, rptr, opd_ent_size);
8023 wptr += opd_ent_size;
8024 if (add_aux_fields && opd_ent_size == 16)
8025 {
8026 memset (wptr, '\0', 8);
8027 wptr += 8;
8028 }
8029
8030 /* We need to adjust any reloc offsets to point to the
8031 new opd entries. */
8032 for ( ; rel != next_rel; ++rel)
8033 {
8034 rel->r_offset += adjust;
8035 if (write_rel != rel)
8036 memcpy (write_rel, rel, sizeof (*rel));
8037 ++write_rel;
8038 }
8039 }
8040
8041 rptr += opd_ent_size;
8042 }
8043
8044 sec->size = wptr - new_contents;
8045 sec->reloc_count = write_rel - relstart;
8046 if (add_aux_fields)
8047 {
8048 free (sec->contents);
8049 sec->contents = new_contents;
8050 }
8051
8052 /* Fudge the header size too, as this is used later in
8053 elf_bfd_final_link if we are emitting relocs. */
8054 rel_hdr = _bfd_elf_single_rel_hdr (sec);
8055 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
8056 some_edited = TRUE;
8057 }
8058 else if (elf_section_data (sec)->relocs != relstart)
8059 free (relstart);
8060
8061 if (local_syms != NULL
8062 && symtab_hdr->contents != (unsigned char *) local_syms)
8063 {
8064 if (!info->keep_memory)
8065 free (local_syms);
8066 else
8067 symtab_hdr->contents = (unsigned char *) local_syms;
8068 }
8069 }
8070
8071 if (some_edited)
8072 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
8073
8074 /* If we are doing a final link and the last .opd entry is just 16 byte
8075 long, add a 8 byte padding after it. */
8076 if (need_pad != NULL && !bfd_link_relocatable (info))
8077 {
8078 bfd_byte *p;
8079
8080 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
8081 {
8082 BFD_ASSERT (need_pad->size > 0);
8083
8084 p = bfd_malloc (need_pad->size + 8);
8085 if (p == NULL)
8086 return FALSE;
8087
8088 if (! bfd_get_section_contents (need_pad->owner, need_pad,
8089 p, 0, need_pad->size))
8090 return FALSE;
8091
8092 need_pad->contents = p;
8093 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
8094 }
8095 else
8096 {
8097 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
8098 if (p == NULL)
8099 return FALSE;
8100
8101 need_pad->contents = p;
8102 }
8103
8104 memset (need_pad->contents + need_pad->size, 0, 8);
8105 need_pad->size += 8;
8106 }
8107
8108 return TRUE;
8109 }
8110
8111 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
8112
8113 asection *
8114 ppc64_elf_tls_setup (struct bfd_link_info *info)
8115 {
8116 struct ppc_link_hash_table *htab;
8117
8118 htab = ppc_hash_table (info);
8119 if (htab == NULL)
8120 return NULL;
8121
8122 if (abiversion (info->output_bfd) == 1)
8123 htab->opd_abi = 1;
8124
8125 if (htab->params->no_multi_toc)
8126 htab->do_multi_toc = 0;
8127 else if (!htab->do_multi_toc)
8128 htab->params->no_multi_toc = 1;
8129
8130 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
8131 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
8132 FALSE, FALSE, TRUE));
8133 /* Move dynamic linking info to the function descriptor sym. */
8134 if (htab->tls_get_addr != NULL)
8135 func_desc_adjust (&htab->tls_get_addr->elf, info);
8136 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
8137 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
8138 FALSE, FALSE, TRUE));
8139 if (htab->params->tls_get_addr_opt)
8140 {
8141 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
8142
8143 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
8144 FALSE, FALSE, TRUE);
8145 if (opt != NULL)
8146 func_desc_adjust (opt, info);
8147 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
8148 FALSE, FALSE, TRUE);
8149 if (opt_fd != NULL
8150 && (opt_fd->root.type == bfd_link_hash_defined
8151 || opt_fd->root.type == bfd_link_hash_defweak))
8152 {
8153 /* If glibc supports an optimized __tls_get_addr call stub,
8154 signalled by the presence of __tls_get_addr_opt, and we'll
8155 be calling __tls_get_addr via a plt call stub, then
8156 make __tls_get_addr point to __tls_get_addr_opt. */
8157 tga_fd = &htab->tls_get_addr_fd->elf;
8158 if (htab->elf.dynamic_sections_created
8159 && tga_fd != NULL
8160 && (tga_fd->type == STT_FUNC
8161 || tga_fd->needs_plt)
8162 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
8163 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
8164 && tga_fd->root.type == bfd_link_hash_undefweak)))
8165 {
8166 struct plt_entry *ent;
8167
8168 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
8169 if (ent->plt.refcount > 0)
8170 break;
8171 if (ent != NULL)
8172 {
8173 tga_fd->root.type = bfd_link_hash_indirect;
8174 tga_fd->root.u.i.link = &opt_fd->root;
8175 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
8176 if (opt_fd->dynindx != -1)
8177 {
8178 /* Use __tls_get_addr_opt in dynamic relocations. */
8179 opt_fd->dynindx = -1;
8180 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
8181 opt_fd->dynstr_index);
8182 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
8183 return NULL;
8184 }
8185 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
8186 tga = &htab->tls_get_addr->elf;
8187 if (opt != NULL && tga != NULL)
8188 {
8189 tga->root.type = bfd_link_hash_indirect;
8190 tga->root.u.i.link = &opt->root;
8191 ppc64_elf_copy_indirect_symbol (info, opt, tga);
8192 _bfd_elf_link_hash_hide_symbol (info, opt,
8193 tga->forced_local);
8194 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
8195 }
8196 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
8197 htab->tls_get_addr_fd->is_func_descriptor = 1;
8198 if (htab->tls_get_addr != NULL)
8199 {
8200 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8201 htab->tls_get_addr->is_func = 1;
8202 }
8203 }
8204 }
8205 }
8206 else if (htab->params->tls_get_addr_opt < 0)
8207 htab->params->tls_get_addr_opt = 0;
8208 }
8209 return _bfd_elf_tls_setup (info->output_bfd, info);
8210 }
8211
8212 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8213 HASH1 or HASH2. */
8214
8215 static bfd_boolean
8216 branch_reloc_hash_match (const bfd *ibfd,
8217 const Elf_Internal_Rela *rel,
8218 const struct ppc_link_hash_entry *hash1,
8219 const struct ppc_link_hash_entry *hash2)
8220 {
8221 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8222 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8223 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8224
8225 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8226 {
8227 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8228 struct elf_link_hash_entry *h;
8229
8230 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8231 h = elf_follow_link (h);
8232 if (h == &hash1->elf || h == &hash2->elf)
8233 return TRUE;
8234 }
8235 return FALSE;
8236 }
8237
8238 /* Run through all the TLS relocs looking for optimization
8239 opportunities. The linker has been hacked (see ppc64elf.em) to do
8240 a preliminary section layout so that we know the TLS segment
8241 offsets. We can't optimize earlier because some optimizations need
8242 to know the tp offset, and we need to optimize before allocating
8243 dynamic relocations. */
8244
8245 bfd_boolean
8246 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8247 {
8248 bfd *ibfd;
8249 asection *sec;
8250 struct ppc_link_hash_table *htab;
8251 unsigned char *toc_ref;
8252 int pass;
8253
8254 if (!bfd_link_executable (info))
8255 return TRUE;
8256
8257 htab = ppc_hash_table (info);
8258 if (htab == NULL)
8259 return FALSE;
8260
8261 /* Make two passes over the relocs. On the first pass, mark toc
8262 entries involved with tls relocs, and check that tls relocs
8263 involved in setting up a tls_get_addr call are indeed followed by
8264 such a call. If they are not, we can't do any tls optimization.
8265 On the second pass twiddle tls_mask flags to notify
8266 relocate_section that optimization can be done, and adjust got
8267 and plt refcounts. */
8268 toc_ref = NULL;
8269 for (pass = 0; pass < 2; ++pass)
8270 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8271 {
8272 Elf_Internal_Sym *locsyms = NULL;
8273 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8274
8275 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8276 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8277 {
8278 Elf_Internal_Rela *relstart, *rel, *relend;
8279 bfd_boolean found_tls_get_addr_arg = 0;
8280
8281 /* Read the relocations. */
8282 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8283 info->keep_memory);
8284 if (relstart == NULL)
8285 {
8286 free (toc_ref);
8287 return FALSE;
8288 }
8289
8290 relend = relstart + sec->reloc_count;
8291 for (rel = relstart; rel < relend; rel++)
8292 {
8293 enum elf_ppc64_reloc_type r_type;
8294 unsigned long r_symndx;
8295 struct elf_link_hash_entry *h;
8296 Elf_Internal_Sym *sym;
8297 asection *sym_sec;
8298 unsigned char *tls_mask;
8299 unsigned char tls_set, tls_clear, tls_type = 0;
8300 bfd_vma value;
8301 bfd_boolean ok_tprel, is_local;
8302 long toc_ref_index = 0;
8303 int expecting_tls_get_addr = 0;
8304 bfd_boolean ret = FALSE;
8305
8306 r_symndx = ELF64_R_SYM (rel->r_info);
8307 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8308 r_symndx, ibfd))
8309 {
8310 err_free_rel:
8311 if (elf_section_data (sec)->relocs != relstart)
8312 free (relstart);
8313 if (toc_ref != NULL)
8314 free (toc_ref);
8315 if (locsyms != NULL
8316 && (elf_symtab_hdr (ibfd).contents
8317 != (unsigned char *) locsyms))
8318 free (locsyms);
8319 return ret;
8320 }
8321
8322 if (h != NULL)
8323 {
8324 if (h->root.type == bfd_link_hash_defined
8325 || h->root.type == bfd_link_hash_defweak)
8326 value = h->root.u.def.value;
8327 else if (h->root.type == bfd_link_hash_undefweak)
8328 value = 0;
8329 else
8330 {
8331 found_tls_get_addr_arg = 0;
8332 continue;
8333 }
8334 }
8335 else
8336 /* Symbols referenced by TLS relocs must be of type
8337 STT_TLS. So no need for .opd local sym adjust. */
8338 value = sym->st_value;
8339
8340 ok_tprel = FALSE;
8341 is_local = FALSE;
8342 if (h == NULL
8343 || !h->def_dynamic)
8344 {
8345 is_local = TRUE;
8346 if (h != NULL
8347 && h->root.type == bfd_link_hash_undefweak)
8348 ok_tprel = TRUE;
8349 else
8350 {
8351 value += sym_sec->output_offset;
8352 value += sym_sec->output_section->vma;
8353 value -= htab->elf.tls_sec->vma;
8354 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8355 < (bfd_vma) 1 << 32);
8356 }
8357 }
8358
8359 r_type = ELF64_R_TYPE (rel->r_info);
8360 /* If this section has old-style __tls_get_addr calls
8361 without marker relocs, then check that each
8362 __tls_get_addr call reloc is preceded by a reloc
8363 that conceivably belongs to the __tls_get_addr arg
8364 setup insn. If we don't find matching arg setup
8365 relocs, don't do any tls optimization. */
8366 if (pass == 0
8367 && sec->has_tls_get_addr_call
8368 && h != NULL
8369 && (h == &htab->tls_get_addr->elf
8370 || h == &htab->tls_get_addr_fd->elf)
8371 && !found_tls_get_addr_arg
8372 && is_branch_reloc (r_type))
8373 {
8374 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8375 "TLS optimization disabled\n"),
8376 ibfd, sec, rel->r_offset);
8377 ret = TRUE;
8378 goto err_free_rel;
8379 }
8380
8381 found_tls_get_addr_arg = 0;
8382 switch (r_type)
8383 {
8384 case R_PPC64_GOT_TLSLD16:
8385 case R_PPC64_GOT_TLSLD16_LO:
8386 expecting_tls_get_addr = 1;
8387 found_tls_get_addr_arg = 1;
8388 /* Fall thru */
8389
8390 case R_PPC64_GOT_TLSLD16_HI:
8391 case R_PPC64_GOT_TLSLD16_HA:
8392 /* These relocs should never be against a symbol
8393 defined in a shared lib. Leave them alone if
8394 that turns out to be the case. */
8395 if (!is_local)
8396 continue;
8397
8398 /* LD -> LE */
8399 tls_set = 0;
8400 tls_clear = TLS_LD;
8401 tls_type = TLS_TLS | TLS_LD;
8402 break;
8403
8404 case R_PPC64_GOT_TLSGD16:
8405 case R_PPC64_GOT_TLSGD16_LO:
8406 expecting_tls_get_addr = 1;
8407 found_tls_get_addr_arg = 1;
8408 /* Fall thru */
8409
8410 case R_PPC64_GOT_TLSGD16_HI:
8411 case R_PPC64_GOT_TLSGD16_HA:
8412 if (ok_tprel)
8413 /* GD -> LE */
8414 tls_set = 0;
8415 else
8416 /* GD -> IE */
8417 tls_set = TLS_TLS | TLS_TPRELGD;
8418 tls_clear = TLS_GD;
8419 tls_type = TLS_TLS | TLS_GD;
8420 break;
8421
8422 case R_PPC64_GOT_TPREL16_DS:
8423 case R_PPC64_GOT_TPREL16_LO_DS:
8424 case R_PPC64_GOT_TPREL16_HI:
8425 case R_PPC64_GOT_TPREL16_HA:
8426 if (ok_tprel)
8427 {
8428 /* IE -> LE */
8429 tls_set = 0;
8430 tls_clear = TLS_TPREL;
8431 tls_type = TLS_TLS | TLS_TPREL;
8432 break;
8433 }
8434 continue;
8435
8436 case R_PPC64_TLSGD:
8437 case R_PPC64_TLSLD:
8438 found_tls_get_addr_arg = 1;
8439 /* Fall thru */
8440
8441 case R_PPC64_TLS:
8442 case R_PPC64_TOC16:
8443 case R_PPC64_TOC16_LO:
8444 if (sym_sec == NULL || sym_sec != toc)
8445 continue;
8446
8447 /* Mark this toc entry as referenced by a TLS
8448 code sequence. We can do that now in the
8449 case of R_PPC64_TLS, and after checking for
8450 tls_get_addr for the TOC16 relocs. */
8451 if (toc_ref == NULL)
8452 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8453 if (toc_ref == NULL)
8454 goto err_free_rel;
8455
8456 if (h != NULL)
8457 value = h->root.u.def.value;
8458 else
8459 value = sym->st_value;
8460 value += rel->r_addend;
8461 if (value % 8 != 0)
8462 continue;
8463 BFD_ASSERT (value < toc->size
8464 && toc->output_offset % 8 == 0);
8465 toc_ref_index = (value + toc->output_offset) / 8;
8466 if (r_type == R_PPC64_TLS
8467 || r_type == R_PPC64_TLSGD
8468 || r_type == R_PPC64_TLSLD)
8469 {
8470 toc_ref[toc_ref_index] = 1;
8471 continue;
8472 }
8473
8474 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8475 continue;
8476
8477 tls_set = 0;
8478 tls_clear = 0;
8479 expecting_tls_get_addr = 2;
8480 break;
8481
8482 case R_PPC64_TPREL64:
8483 if (pass == 0
8484 || sec != toc
8485 || toc_ref == NULL
8486 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8487 continue;
8488 if (ok_tprel)
8489 {
8490 /* IE -> LE */
8491 tls_set = TLS_EXPLICIT;
8492 tls_clear = TLS_TPREL;
8493 break;
8494 }
8495 continue;
8496
8497 case R_PPC64_DTPMOD64:
8498 if (pass == 0
8499 || sec != toc
8500 || toc_ref == NULL
8501 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8502 continue;
8503 if (rel + 1 < relend
8504 && (rel[1].r_info
8505 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8506 && rel[1].r_offset == rel->r_offset + 8)
8507 {
8508 if (ok_tprel)
8509 /* GD -> LE */
8510 tls_set = TLS_EXPLICIT | TLS_GD;
8511 else
8512 /* GD -> IE */
8513 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8514 tls_clear = TLS_GD;
8515 }
8516 else
8517 {
8518 if (!is_local)
8519 continue;
8520
8521 /* LD -> LE */
8522 tls_set = TLS_EXPLICIT;
8523 tls_clear = TLS_LD;
8524 }
8525 break;
8526
8527 default:
8528 continue;
8529 }
8530
8531 if (pass == 0)
8532 {
8533 if (!expecting_tls_get_addr
8534 || !sec->has_tls_get_addr_call)
8535 continue;
8536
8537 if (rel + 1 < relend
8538 && branch_reloc_hash_match (ibfd, rel + 1,
8539 htab->tls_get_addr,
8540 htab->tls_get_addr_fd))
8541 {
8542 if (expecting_tls_get_addr == 2)
8543 {
8544 /* Check for toc tls entries. */
8545 unsigned char *toc_tls;
8546 int retval;
8547
8548 retval = get_tls_mask (&toc_tls, NULL, NULL,
8549 &locsyms,
8550 rel, ibfd);
8551 if (retval == 0)
8552 goto err_free_rel;
8553 if (toc_tls != NULL)
8554 {
8555 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8556 found_tls_get_addr_arg = 1;
8557 if (retval > 1)
8558 toc_ref[toc_ref_index] = 1;
8559 }
8560 }
8561 continue;
8562 }
8563
8564 if (expecting_tls_get_addr != 1)
8565 continue;
8566
8567 /* Uh oh, we didn't find the expected call. We
8568 could just mark this symbol to exclude it
8569 from tls optimization but it's safer to skip
8570 the entire optimization. */
8571 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8572 "TLS optimization disabled\n"),
8573 ibfd, sec, rel->r_offset);
8574 ret = TRUE;
8575 goto err_free_rel;
8576 }
8577
8578 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8579 {
8580 struct plt_entry *ent;
8581 for (ent = htab->tls_get_addr->elf.plt.plist;
8582 ent != NULL;
8583 ent = ent->next)
8584 if (ent->addend == 0)
8585 {
8586 if (ent->plt.refcount > 0)
8587 {
8588 ent->plt.refcount -= 1;
8589 expecting_tls_get_addr = 0;
8590 }
8591 break;
8592 }
8593 }
8594
8595 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8596 {
8597 struct plt_entry *ent;
8598 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8599 ent != NULL;
8600 ent = ent->next)
8601 if (ent->addend == 0)
8602 {
8603 if (ent->plt.refcount > 0)
8604 ent->plt.refcount -= 1;
8605 break;
8606 }
8607 }
8608
8609 if (tls_clear == 0)
8610 continue;
8611
8612 if ((tls_set & TLS_EXPLICIT) == 0)
8613 {
8614 struct got_entry *ent;
8615
8616 /* Adjust got entry for this reloc. */
8617 if (h != NULL)
8618 ent = h->got.glist;
8619 else
8620 ent = elf_local_got_ents (ibfd)[r_symndx];
8621
8622 for (; ent != NULL; ent = ent->next)
8623 if (ent->addend == rel->r_addend
8624 && ent->owner == ibfd
8625 && ent->tls_type == tls_type)
8626 break;
8627 if (ent == NULL)
8628 abort ();
8629
8630 if (tls_set == 0)
8631 {
8632 /* We managed to get rid of a got entry. */
8633 if (ent->got.refcount > 0)
8634 ent->got.refcount -= 1;
8635 }
8636 }
8637 else
8638 {
8639 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8640 we'll lose one or two dyn relocs. */
8641 if (!dec_dynrel_count (rel->r_info, sec, info,
8642 NULL, h, sym))
8643 return FALSE;
8644
8645 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8646 {
8647 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8648 NULL, h, sym))
8649 return FALSE;
8650 }
8651 }
8652
8653 *tls_mask |= tls_set;
8654 *tls_mask &= ~tls_clear;
8655 }
8656
8657 if (elf_section_data (sec)->relocs != relstart)
8658 free (relstart);
8659 }
8660
8661 if (locsyms != NULL
8662 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8663 {
8664 if (!info->keep_memory)
8665 free (locsyms);
8666 else
8667 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8668 }
8669 }
8670
8671 if (toc_ref != NULL)
8672 free (toc_ref);
8673 return TRUE;
8674 }
8675
8676 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8677 the values of any global symbols in a toc section that has been
8678 edited. Globals in toc sections should be a rarity, so this function
8679 sets a flag if any are found in toc sections other than the one just
8680 edited, so that futher hash table traversals can be avoided. */
8681
8682 struct adjust_toc_info
8683 {
8684 asection *toc;
8685 unsigned long *skip;
8686 bfd_boolean global_toc_syms;
8687 };
8688
8689 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8690
8691 static bfd_boolean
8692 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8693 {
8694 struct ppc_link_hash_entry *eh;
8695 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8696 unsigned long i;
8697
8698 if (h->root.type != bfd_link_hash_defined
8699 && h->root.type != bfd_link_hash_defweak)
8700 return TRUE;
8701
8702 eh = (struct ppc_link_hash_entry *) h;
8703 if (eh->adjust_done)
8704 return TRUE;
8705
8706 if (eh->elf.root.u.def.section == toc_inf->toc)
8707 {
8708 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8709 i = toc_inf->toc->rawsize >> 3;
8710 else
8711 i = eh->elf.root.u.def.value >> 3;
8712
8713 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8714 {
8715 (*_bfd_error_handler)
8716 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8717 do
8718 ++i;
8719 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8720 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8721 }
8722
8723 eh->elf.root.u.def.value -= toc_inf->skip[i];
8724 eh->adjust_done = 1;
8725 }
8726 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8727 toc_inf->global_toc_syms = TRUE;
8728
8729 return TRUE;
8730 }
8731
8732 /* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8733
8734 static bfd_boolean
8735 ok_lo_toc_insn (unsigned int insn)
8736 {
8737 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8738 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8739 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8740 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8741 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8742 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8743 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8744 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8745 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8746 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8747 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8748 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8749 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8750 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8751 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8752 && (insn & 3) != 1)
8753 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8754 && ((insn & 3) == 0 || (insn & 3) == 3))
8755 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8756 }
8757
8758 /* Examine all relocs referencing .toc sections in order to remove
8759 unused .toc entries. */
8760
8761 bfd_boolean
8762 ppc64_elf_edit_toc (struct bfd_link_info *info)
8763 {
8764 bfd *ibfd;
8765 struct adjust_toc_info toc_inf;
8766 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8767
8768 htab->do_toc_opt = 1;
8769 toc_inf.global_toc_syms = TRUE;
8770 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
8771 {
8772 asection *toc, *sec;
8773 Elf_Internal_Shdr *symtab_hdr;
8774 Elf_Internal_Sym *local_syms;
8775 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8776 unsigned long *skip, *drop;
8777 unsigned char *used;
8778 unsigned char *keep, last, some_unused;
8779
8780 if (!is_ppc64_elf (ibfd))
8781 continue;
8782
8783 toc = bfd_get_section_by_name (ibfd, ".toc");
8784 if (toc == NULL
8785 || toc->size == 0
8786 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8787 || discarded_section (toc))
8788 continue;
8789
8790 toc_relocs = NULL;
8791 local_syms = NULL;
8792 symtab_hdr = &elf_symtab_hdr (ibfd);
8793
8794 /* Look at sections dropped from the final link. */
8795 skip = NULL;
8796 relstart = NULL;
8797 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8798 {
8799 if (sec->reloc_count == 0
8800 || !discarded_section (sec)
8801 || get_opd_info (sec)
8802 || (sec->flags & SEC_ALLOC) == 0
8803 || (sec->flags & SEC_DEBUGGING) != 0)
8804 continue;
8805
8806 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8807 if (relstart == NULL)
8808 goto error_ret;
8809
8810 /* Run through the relocs to see which toc entries might be
8811 unused. */
8812 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8813 {
8814 enum elf_ppc64_reloc_type r_type;
8815 unsigned long r_symndx;
8816 asection *sym_sec;
8817 struct elf_link_hash_entry *h;
8818 Elf_Internal_Sym *sym;
8819 bfd_vma val;
8820
8821 r_type = ELF64_R_TYPE (rel->r_info);
8822 switch (r_type)
8823 {
8824 default:
8825 continue;
8826
8827 case R_PPC64_TOC16:
8828 case R_PPC64_TOC16_LO:
8829 case R_PPC64_TOC16_HI:
8830 case R_PPC64_TOC16_HA:
8831 case R_PPC64_TOC16_DS:
8832 case R_PPC64_TOC16_LO_DS:
8833 break;
8834 }
8835
8836 r_symndx = ELF64_R_SYM (rel->r_info);
8837 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8838 r_symndx, ibfd))
8839 goto error_ret;
8840
8841 if (sym_sec != toc)
8842 continue;
8843
8844 if (h != NULL)
8845 val = h->root.u.def.value;
8846 else
8847 val = sym->st_value;
8848 val += rel->r_addend;
8849
8850 if (val >= toc->size)
8851 continue;
8852
8853 /* Anything in the toc ought to be aligned to 8 bytes.
8854 If not, don't mark as unused. */
8855 if (val & 7)
8856 continue;
8857
8858 if (skip == NULL)
8859 {
8860 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8861 if (skip == NULL)
8862 goto error_ret;
8863 }
8864
8865 skip[val >> 3] = ref_from_discarded;
8866 }
8867
8868 if (elf_section_data (sec)->relocs != relstart)
8869 free (relstart);
8870 }
8871
8872 /* For largetoc loads of address constants, we can convert
8873 . addis rx,2,addr@got@ha
8874 . ld ry,addr@got@l(rx)
8875 to
8876 . addis rx,2,addr@toc@ha
8877 . addi ry,rx,addr@toc@l
8878 when addr is within 2G of the toc pointer. This then means
8879 that the word storing "addr" in the toc is no longer needed. */
8880
8881 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8882 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8883 && toc->reloc_count != 0)
8884 {
8885 /* Read toc relocs. */
8886 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8887 info->keep_memory);
8888 if (toc_relocs == NULL)
8889 goto error_ret;
8890
8891 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8892 {
8893 enum elf_ppc64_reloc_type r_type;
8894 unsigned long r_symndx;
8895 asection *sym_sec;
8896 struct elf_link_hash_entry *h;
8897 Elf_Internal_Sym *sym;
8898 bfd_vma val, addr;
8899
8900 r_type = ELF64_R_TYPE (rel->r_info);
8901 if (r_type != R_PPC64_ADDR64)
8902 continue;
8903
8904 r_symndx = ELF64_R_SYM (rel->r_info);
8905 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8906 r_symndx, ibfd))
8907 goto error_ret;
8908
8909 if (sym_sec == NULL
8910 || discarded_section (sym_sec))
8911 continue;
8912
8913 if (!SYMBOL_REFERENCES_LOCAL (info, h))
8914 continue;
8915
8916 if (h != NULL)
8917 {
8918 if (h->type == STT_GNU_IFUNC)
8919 continue;
8920 val = h->root.u.def.value;
8921 }
8922 else
8923 {
8924 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8925 continue;
8926 val = sym->st_value;
8927 }
8928 val += rel->r_addend;
8929 val += sym_sec->output_section->vma + sym_sec->output_offset;
8930
8931 /* We don't yet know the exact toc pointer value, but we
8932 know it will be somewhere in the toc section. Don't
8933 optimize if the difference from any possible toc
8934 pointer is outside [ff..f80008000, 7fff7fff]. */
8935 addr = toc->output_section->vma + TOC_BASE_OFF;
8936 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8937 continue;
8938
8939 addr = toc->output_section->vma + toc->output_section->rawsize;
8940 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8941 continue;
8942
8943 if (skip == NULL)
8944 {
8945 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8946 if (skip == NULL)
8947 goto error_ret;
8948 }
8949
8950 skip[rel->r_offset >> 3]
8951 |= can_optimize | ((rel - toc_relocs) << 2);
8952 }
8953 }
8954
8955 if (skip == NULL)
8956 continue;
8957
8958 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8959 if (used == NULL)
8960 {
8961 error_ret:
8962 if (local_syms != NULL
8963 && symtab_hdr->contents != (unsigned char *) local_syms)
8964 free (local_syms);
8965 if (sec != NULL
8966 && relstart != NULL
8967 && elf_section_data (sec)->relocs != relstart)
8968 free (relstart);
8969 if (toc_relocs != NULL
8970 && elf_section_data (toc)->relocs != toc_relocs)
8971 free (toc_relocs);
8972 if (skip != NULL)
8973 free (skip);
8974 return FALSE;
8975 }
8976
8977 /* Now check all kept sections that might reference the toc.
8978 Check the toc itself last. */
8979 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8980 : ibfd->sections);
8981 sec != NULL;
8982 sec = (sec == toc ? NULL
8983 : sec->next == NULL ? toc
8984 : sec->next == toc && toc->next ? toc->next
8985 : sec->next))
8986 {
8987 int repeat;
8988
8989 if (sec->reloc_count == 0
8990 || discarded_section (sec)
8991 || get_opd_info (sec)
8992 || (sec->flags & SEC_ALLOC) == 0
8993 || (sec->flags & SEC_DEBUGGING) != 0)
8994 continue;
8995
8996 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8997 info->keep_memory);
8998 if (relstart == NULL)
8999 {
9000 free (used);
9001 goto error_ret;
9002 }
9003
9004 /* Mark toc entries referenced as used. */
9005 do
9006 {
9007 repeat = 0;
9008 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9009 {
9010 enum elf_ppc64_reloc_type r_type;
9011 unsigned long r_symndx;
9012 asection *sym_sec;
9013 struct elf_link_hash_entry *h;
9014 Elf_Internal_Sym *sym;
9015 bfd_vma val;
9016 enum {no_check, check_lo, check_ha} insn_check;
9017
9018 r_type = ELF64_R_TYPE (rel->r_info);
9019 switch (r_type)
9020 {
9021 default:
9022 insn_check = no_check;
9023 break;
9024
9025 case R_PPC64_GOT_TLSLD16_HA:
9026 case R_PPC64_GOT_TLSGD16_HA:
9027 case R_PPC64_GOT_TPREL16_HA:
9028 case R_PPC64_GOT_DTPREL16_HA:
9029 case R_PPC64_GOT16_HA:
9030 case R_PPC64_TOC16_HA:
9031 insn_check = check_ha;
9032 break;
9033
9034 case R_PPC64_GOT_TLSLD16_LO:
9035 case R_PPC64_GOT_TLSGD16_LO:
9036 case R_PPC64_GOT_TPREL16_LO_DS:
9037 case R_PPC64_GOT_DTPREL16_LO_DS:
9038 case R_PPC64_GOT16_LO:
9039 case R_PPC64_GOT16_LO_DS:
9040 case R_PPC64_TOC16_LO:
9041 case R_PPC64_TOC16_LO_DS:
9042 insn_check = check_lo;
9043 break;
9044 }
9045
9046 if (insn_check != no_check)
9047 {
9048 bfd_vma off = rel->r_offset & ~3;
9049 unsigned char buf[4];
9050 unsigned int insn;
9051
9052 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
9053 {
9054 free (used);
9055 goto error_ret;
9056 }
9057 insn = bfd_get_32 (ibfd, buf);
9058 if (insn_check == check_lo
9059 ? !ok_lo_toc_insn (insn)
9060 : ((insn & ((0x3f << 26) | 0x1f << 16))
9061 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
9062 {
9063 char str[12];
9064
9065 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
9066 sprintf (str, "%#08x", insn);
9067 info->callbacks->einfo
9068 (_("%P: %H: toc optimization is not supported for"
9069 " %s instruction.\n"),
9070 ibfd, sec, rel->r_offset & ~3, str);
9071 }
9072 }
9073
9074 switch (r_type)
9075 {
9076 case R_PPC64_TOC16:
9077 case R_PPC64_TOC16_LO:
9078 case R_PPC64_TOC16_HI:
9079 case R_PPC64_TOC16_HA:
9080 case R_PPC64_TOC16_DS:
9081 case R_PPC64_TOC16_LO_DS:
9082 /* In case we're taking addresses of toc entries. */
9083 case R_PPC64_ADDR64:
9084 break;
9085
9086 default:
9087 continue;
9088 }
9089
9090 r_symndx = ELF64_R_SYM (rel->r_info);
9091 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9092 r_symndx, ibfd))
9093 {
9094 free (used);
9095 goto error_ret;
9096 }
9097
9098 if (sym_sec != toc)
9099 continue;
9100
9101 if (h != NULL)
9102 val = h->root.u.def.value;
9103 else
9104 val = sym->st_value;
9105 val += rel->r_addend;
9106
9107 if (val >= toc->size)
9108 continue;
9109
9110 if ((skip[val >> 3] & can_optimize) != 0)
9111 {
9112 bfd_vma off;
9113 unsigned char opc;
9114
9115 switch (r_type)
9116 {
9117 case R_PPC64_TOC16_HA:
9118 break;
9119
9120 case R_PPC64_TOC16_LO_DS:
9121 off = rel->r_offset;
9122 off += (bfd_big_endian (ibfd) ? -2 : 3);
9123 if (!bfd_get_section_contents (ibfd, sec, &opc,
9124 off, 1))
9125 {
9126 free (used);
9127 goto error_ret;
9128 }
9129 if ((opc & (0x3f << 2)) == (58u << 2))
9130 break;
9131 /* Fall thru */
9132
9133 default:
9134 /* Wrong sort of reloc, or not a ld. We may
9135 as well clear ref_from_discarded too. */
9136 skip[val >> 3] = 0;
9137 }
9138 }
9139
9140 if (sec != toc)
9141 used[val >> 3] = 1;
9142 /* For the toc section, we only mark as used if this
9143 entry itself isn't unused. */
9144 else if ((used[rel->r_offset >> 3]
9145 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
9146 && !used[val >> 3])
9147 {
9148 /* Do all the relocs again, to catch reference
9149 chains. */
9150 repeat = 1;
9151 used[val >> 3] = 1;
9152 }
9153 }
9154 }
9155 while (repeat);
9156
9157 if (elf_section_data (sec)->relocs != relstart)
9158 free (relstart);
9159 }
9160
9161 /* Merge the used and skip arrays. Assume that TOC
9162 doublewords not appearing as either used or unused belong
9163 to to an entry more than one doubleword in size. */
9164 for (drop = skip, keep = used, last = 0, some_unused = 0;
9165 drop < skip + (toc->size + 7) / 8;
9166 ++drop, ++keep)
9167 {
9168 if (*keep)
9169 {
9170 *drop &= ~ref_from_discarded;
9171 if ((*drop & can_optimize) != 0)
9172 some_unused = 1;
9173 last = 0;
9174 }
9175 else if ((*drop & ref_from_discarded) != 0)
9176 {
9177 some_unused = 1;
9178 last = ref_from_discarded;
9179 }
9180 else
9181 *drop = last;
9182 }
9183
9184 free (used);
9185
9186 if (some_unused)
9187 {
9188 bfd_byte *contents, *src;
9189 unsigned long off;
9190 Elf_Internal_Sym *sym;
9191 bfd_boolean local_toc_syms = FALSE;
9192
9193 /* Shuffle the toc contents, and at the same time convert the
9194 skip array from booleans into offsets. */
9195 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
9196 goto error_ret;
9197
9198 elf_section_data (toc)->this_hdr.contents = contents;
9199
9200 for (src = contents, off = 0, drop = skip;
9201 src < contents + toc->size;
9202 src += 8, ++drop)
9203 {
9204 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9205 off += 8;
9206 else if (off != 0)
9207 {
9208 *drop = off;
9209 memcpy (src - off, src, 8);
9210 }
9211 }
9212 *drop = off;
9213 toc->rawsize = toc->size;
9214 toc->size = src - contents - off;
9215
9216 /* Adjust addends for relocs against the toc section sym,
9217 and optimize any accesses we can. */
9218 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9219 {
9220 if (sec->reloc_count == 0
9221 || discarded_section (sec))
9222 continue;
9223
9224 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9225 info->keep_memory);
9226 if (relstart == NULL)
9227 goto error_ret;
9228
9229 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9230 {
9231 enum elf_ppc64_reloc_type r_type;
9232 unsigned long r_symndx;
9233 asection *sym_sec;
9234 struct elf_link_hash_entry *h;
9235 bfd_vma val;
9236
9237 r_type = ELF64_R_TYPE (rel->r_info);
9238 switch (r_type)
9239 {
9240 default:
9241 continue;
9242
9243 case R_PPC64_TOC16:
9244 case R_PPC64_TOC16_LO:
9245 case R_PPC64_TOC16_HI:
9246 case R_PPC64_TOC16_HA:
9247 case R_PPC64_TOC16_DS:
9248 case R_PPC64_TOC16_LO_DS:
9249 case R_PPC64_ADDR64:
9250 break;
9251 }
9252
9253 r_symndx = ELF64_R_SYM (rel->r_info);
9254 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9255 r_symndx, ibfd))
9256 goto error_ret;
9257
9258 if (sym_sec != toc)
9259 continue;
9260
9261 if (h != NULL)
9262 val = h->root.u.def.value;
9263 else
9264 {
9265 val = sym->st_value;
9266 if (val != 0)
9267 local_toc_syms = TRUE;
9268 }
9269
9270 val += rel->r_addend;
9271
9272 if (val > toc->rawsize)
9273 val = toc->rawsize;
9274 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9275 continue;
9276 else if ((skip[val >> 3] & can_optimize) != 0)
9277 {
9278 Elf_Internal_Rela *tocrel
9279 = toc_relocs + (skip[val >> 3] >> 2);
9280 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9281
9282 switch (r_type)
9283 {
9284 case R_PPC64_TOC16_HA:
9285 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9286 break;
9287
9288 case R_PPC64_TOC16_LO_DS:
9289 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9290 break;
9291
9292 default:
9293 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9294 ppc_howto_init ();
9295 info->callbacks->einfo
9296 (_("%P: %H: %s references "
9297 "optimized away TOC entry\n"),
9298 ibfd, sec, rel->r_offset,
9299 ppc64_elf_howto_table[r_type]->name);
9300 bfd_set_error (bfd_error_bad_value);
9301 goto error_ret;
9302 }
9303 rel->r_addend = tocrel->r_addend;
9304 elf_section_data (sec)->relocs = relstart;
9305 continue;
9306 }
9307
9308 if (h != NULL || sym->st_value != 0)
9309 continue;
9310
9311 rel->r_addend -= skip[val >> 3];
9312 elf_section_data (sec)->relocs = relstart;
9313 }
9314
9315 if (elf_section_data (sec)->relocs != relstart)
9316 free (relstart);
9317 }
9318
9319 /* We shouldn't have local or global symbols defined in the TOC,
9320 but handle them anyway. */
9321 if (local_syms != NULL)
9322 for (sym = local_syms;
9323 sym < local_syms + symtab_hdr->sh_info;
9324 ++sym)
9325 if (sym->st_value != 0
9326 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9327 {
9328 unsigned long i;
9329
9330 if (sym->st_value > toc->rawsize)
9331 i = toc->rawsize >> 3;
9332 else
9333 i = sym->st_value >> 3;
9334
9335 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9336 {
9337 if (local_toc_syms)
9338 (*_bfd_error_handler)
9339 (_("%s defined on removed toc entry"),
9340 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9341 do
9342 ++i;
9343 while ((skip[i] & (ref_from_discarded | can_optimize)));
9344 sym->st_value = (bfd_vma) i << 3;
9345 }
9346
9347 sym->st_value -= skip[i];
9348 symtab_hdr->contents = (unsigned char *) local_syms;
9349 }
9350
9351 /* Adjust any global syms defined in this toc input section. */
9352 if (toc_inf.global_toc_syms)
9353 {
9354 toc_inf.toc = toc;
9355 toc_inf.skip = skip;
9356 toc_inf.global_toc_syms = FALSE;
9357 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9358 &toc_inf);
9359 }
9360
9361 if (toc->reloc_count != 0)
9362 {
9363 Elf_Internal_Shdr *rel_hdr;
9364 Elf_Internal_Rela *wrel;
9365 bfd_size_type sz;
9366
9367 /* Remove unused toc relocs, and adjust those we keep. */
9368 if (toc_relocs == NULL)
9369 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9370 info->keep_memory);
9371 if (toc_relocs == NULL)
9372 goto error_ret;
9373
9374 wrel = toc_relocs;
9375 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9376 if ((skip[rel->r_offset >> 3]
9377 & (ref_from_discarded | can_optimize)) == 0)
9378 {
9379 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9380 wrel->r_info = rel->r_info;
9381 wrel->r_addend = rel->r_addend;
9382 ++wrel;
9383 }
9384 else if (!dec_dynrel_count (rel->r_info, toc, info,
9385 &local_syms, NULL, NULL))
9386 goto error_ret;
9387
9388 elf_section_data (toc)->relocs = toc_relocs;
9389 toc->reloc_count = wrel - toc_relocs;
9390 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9391 sz = rel_hdr->sh_entsize;
9392 rel_hdr->sh_size = toc->reloc_count * sz;
9393 }
9394 }
9395 else if (toc_relocs != NULL
9396 && elf_section_data (toc)->relocs != toc_relocs)
9397 free (toc_relocs);
9398
9399 if (local_syms != NULL
9400 && symtab_hdr->contents != (unsigned char *) local_syms)
9401 {
9402 if (!info->keep_memory)
9403 free (local_syms);
9404 else
9405 symtab_hdr->contents = (unsigned char *) local_syms;
9406 }
9407 free (skip);
9408 }
9409
9410 return TRUE;
9411 }
9412
9413 /* Return true iff input section I references the TOC using
9414 instructions limited to +/-32k offsets. */
9415
9416 bfd_boolean
9417 ppc64_elf_has_small_toc_reloc (asection *i)
9418 {
9419 return (is_ppc64_elf (i->owner)
9420 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9421 }
9422
9423 /* Allocate space for one GOT entry. */
9424
9425 static void
9426 allocate_got (struct elf_link_hash_entry *h,
9427 struct bfd_link_info *info,
9428 struct got_entry *gent)
9429 {
9430 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9431 bfd_boolean dyn;
9432 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9433 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9434 ? 16 : 8);
9435 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9436 ? 2 : 1) * sizeof (Elf64_External_Rela);
9437 asection *got = ppc64_elf_tdata (gent->owner)->got;
9438
9439 gent->got.offset = got->size;
9440 got->size += entsize;
9441
9442 dyn = htab->elf.dynamic_sections_created;
9443 if (h->type == STT_GNU_IFUNC)
9444 {
9445 htab->elf.irelplt->size += rentsize;
9446 htab->got_reli_size += rentsize;
9447 }
9448 else if ((bfd_link_pic (info)
9449 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9450 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9451 || h->root.type != bfd_link_hash_undefweak))
9452 {
9453 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9454 relgot->size += rentsize;
9455 }
9456 }
9457
9458 /* This function merges got entries in the same toc group. */
9459
9460 static void
9461 merge_got_entries (struct got_entry **pent)
9462 {
9463 struct got_entry *ent, *ent2;
9464
9465 for (ent = *pent; ent != NULL; ent = ent->next)
9466 if (!ent->is_indirect)
9467 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9468 if (!ent2->is_indirect
9469 && ent2->addend == ent->addend
9470 && ent2->tls_type == ent->tls_type
9471 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9472 {
9473 ent2->is_indirect = TRUE;
9474 ent2->got.ent = ent;
9475 }
9476 }
9477
9478 /* Allocate space in .plt, .got and associated reloc sections for
9479 dynamic relocs. */
9480
9481 static bfd_boolean
9482 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9483 {
9484 struct bfd_link_info *info;
9485 struct ppc_link_hash_table *htab;
9486 asection *s;
9487 struct ppc_link_hash_entry *eh;
9488 struct elf_dyn_relocs *p;
9489 struct got_entry **pgent, *gent;
9490
9491 if (h->root.type == bfd_link_hash_indirect)
9492 return TRUE;
9493
9494 info = (struct bfd_link_info *) inf;
9495 htab = ppc_hash_table (info);
9496 if (htab == NULL)
9497 return FALSE;
9498
9499 if ((htab->elf.dynamic_sections_created
9500 && h->dynindx != -1
9501 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, bfd_link_pic (info), h))
9502 || h->type == STT_GNU_IFUNC)
9503 {
9504 struct plt_entry *pent;
9505 bfd_boolean doneone = FALSE;
9506 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9507 if (pent->plt.refcount > 0)
9508 {
9509 if (!htab->elf.dynamic_sections_created
9510 || h->dynindx == -1)
9511 {
9512 s = htab->elf.iplt;
9513 pent->plt.offset = s->size;
9514 s->size += PLT_ENTRY_SIZE (htab);
9515 s = htab->elf.irelplt;
9516 }
9517 else
9518 {
9519 /* If this is the first .plt entry, make room for the special
9520 first entry. */
9521 s = htab->elf.splt;
9522 if (s->size == 0)
9523 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9524
9525 pent->plt.offset = s->size;
9526
9527 /* Make room for this entry. */
9528 s->size += PLT_ENTRY_SIZE (htab);
9529
9530 /* Make room for the .glink code. */
9531 s = htab->glink;
9532 if (s->size == 0)
9533 s->size += GLINK_CALL_STUB_SIZE;
9534 if (htab->opd_abi)
9535 {
9536 /* We need bigger stubs past index 32767. */
9537 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9538 s->size += 4;
9539 s->size += 2*4;
9540 }
9541 else
9542 s->size += 4;
9543
9544 /* We also need to make an entry in the .rela.plt section. */
9545 s = htab->elf.srelplt;
9546 }
9547 s->size += sizeof (Elf64_External_Rela);
9548 doneone = TRUE;
9549 }
9550 else
9551 pent->plt.offset = (bfd_vma) -1;
9552 if (!doneone)
9553 {
9554 h->plt.plist = NULL;
9555 h->needs_plt = 0;
9556 }
9557 }
9558 else
9559 {
9560 h->plt.plist = NULL;
9561 h->needs_plt = 0;
9562 }
9563
9564 eh = (struct ppc_link_hash_entry *) h;
9565 /* Run through the TLS GD got entries first if we're changing them
9566 to TPREL. */
9567 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9568 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9569 if (gent->got.refcount > 0
9570 && (gent->tls_type & TLS_GD) != 0)
9571 {
9572 /* This was a GD entry that has been converted to TPREL. If
9573 there happens to be a TPREL entry we can use that one. */
9574 struct got_entry *ent;
9575 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9576 if (ent->got.refcount > 0
9577 && (ent->tls_type & TLS_TPREL) != 0
9578 && ent->addend == gent->addend
9579 && ent->owner == gent->owner)
9580 {
9581 gent->got.refcount = 0;
9582 break;
9583 }
9584
9585 /* If not, then we'll be using our own TPREL entry. */
9586 if (gent->got.refcount != 0)
9587 gent->tls_type = TLS_TLS | TLS_TPREL;
9588 }
9589
9590 /* Remove any list entry that won't generate a word in the GOT before
9591 we call merge_got_entries. Otherwise we risk merging to empty
9592 entries. */
9593 pgent = &h->got.glist;
9594 while ((gent = *pgent) != NULL)
9595 if (gent->got.refcount > 0)
9596 {
9597 if ((gent->tls_type & TLS_LD) != 0
9598 && !h->def_dynamic)
9599 {
9600 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9601 *pgent = gent->next;
9602 }
9603 else
9604 pgent = &gent->next;
9605 }
9606 else
9607 *pgent = gent->next;
9608
9609 if (!htab->do_multi_toc)
9610 merge_got_entries (&h->got.glist);
9611
9612 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9613 if (!gent->is_indirect)
9614 {
9615 /* Make sure this symbol is output as a dynamic symbol.
9616 Undefined weak syms won't yet be marked as dynamic,
9617 nor will all TLS symbols. */
9618 if (h->dynindx == -1
9619 && !h->forced_local
9620 && h->type != STT_GNU_IFUNC
9621 && htab->elf.dynamic_sections_created)
9622 {
9623 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9624 return FALSE;
9625 }
9626
9627 if (!is_ppc64_elf (gent->owner))
9628 abort ();
9629
9630 allocate_got (h, info, gent);
9631 }
9632
9633 if (eh->dyn_relocs == NULL
9634 || (!htab->elf.dynamic_sections_created
9635 && h->type != STT_GNU_IFUNC))
9636 return TRUE;
9637
9638 /* In the shared -Bsymbolic case, discard space allocated for
9639 dynamic pc-relative relocs against symbols which turn out to be
9640 defined in regular objects. For the normal shared case, discard
9641 space for relocs that have become local due to symbol visibility
9642 changes. */
9643
9644 if (bfd_link_pic (info))
9645 {
9646 /* Relocs that use pc_count are those that appear on a call insn,
9647 or certain REL relocs (see must_be_dyn_reloc) that can be
9648 generated via assembly. We want calls to protected symbols to
9649 resolve directly to the function rather than going via the plt.
9650 If people want function pointer comparisons to work as expected
9651 then they should avoid writing weird assembly. */
9652 if (SYMBOL_CALLS_LOCAL (info, h))
9653 {
9654 struct elf_dyn_relocs **pp;
9655
9656 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9657 {
9658 p->count -= p->pc_count;
9659 p->pc_count = 0;
9660 if (p->count == 0)
9661 *pp = p->next;
9662 else
9663 pp = &p->next;
9664 }
9665 }
9666
9667 /* Also discard relocs on undefined weak syms with non-default
9668 visibility. */
9669 if (eh->dyn_relocs != NULL
9670 && h->root.type == bfd_link_hash_undefweak)
9671 {
9672 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9673 eh->dyn_relocs = NULL;
9674
9675 /* Make sure this symbol is output as a dynamic symbol.
9676 Undefined weak syms won't yet be marked as dynamic. */
9677 else if (h->dynindx == -1
9678 && !h->forced_local)
9679 {
9680 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9681 return FALSE;
9682 }
9683 }
9684 }
9685 else if (h->type == STT_GNU_IFUNC)
9686 {
9687 if (!h->non_got_ref)
9688 eh->dyn_relocs = NULL;
9689 }
9690 else if (ELIMINATE_COPY_RELOCS)
9691 {
9692 /* For the non-shared case, discard space for relocs against
9693 symbols which turn out to need copy relocs or are not
9694 dynamic. */
9695
9696 if (!h->non_got_ref
9697 && !h->def_regular)
9698 {
9699 /* Make sure this symbol is output as a dynamic symbol.
9700 Undefined weak syms won't yet be marked as dynamic. */
9701 if (h->dynindx == -1
9702 && !h->forced_local)
9703 {
9704 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9705 return FALSE;
9706 }
9707
9708 /* If that succeeded, we know we'll be keeping all the
9709 relocs. */
9710 if (h->dynindx != -1)
9711 goto keep;
9712 }
9713
9714 eh->dyn_relocs = NULL;
9715
9716 keep: ;
9717 }
9718
9719 /* Finally, allocate space. */
9720 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9721 {
9722 asection *sreloc = elf_section_data (p->sec)->sreloc;
9723 if (eh->elf.type == STT_GNU_IFUNC)
9724 sreloc = htab->elf.irelplt;
9725 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9726 }
9727
9728 return TRUE;
9729 }
9730
9731 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9732 to set up space for global entry stubs. These are put in glink,
9733 after the branch table. */
9734
9735 static bfd_boolean
9736 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9737 {
9738 struct bfd_link_info *info;
9739 struct ppc_link_hash_table *htab;
9740 struct plt_entry *pent;
9741 asection *s;
9742
9743 if (h->root.type == bfd_link_hash_indirect)
9744 return TRUE;
9745
9746 if (!h->pointer_equality_needed)
9747 return TRUE;
9748
9749 if (h->def_regular)
9750 return TRUE;
9751
9752 info = inf;
9753 htab = ppc_hash_table (info);
9754 if (htab == NULL)
9755 return FALSE;
9756
9757 s = htab->glink;
9758 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9759 if (pent->plt.offset != (bfd_vma) -1
9760 && pent->addend == 0)
9761 {
9762 /* For ELFv2, if this symbol is not defined in a regular file
9763 and we are not generating a shared library or pie, then we
9764 need to define the symbol in the executable on a call stub.
9765 This is to avoid text relocations. */
9766 s->size = (s->size + 15) & -16;
9767 h->root.u.def.section = s;
9768 h->root.u.def.value = s->size;
9769 s->size += 16;
9770 break;
9771 }
9772 return TRUE;
9773 }
9774
9775 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9776 read-only sections. */
9777
9778 static bfd_boolean
9779 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9780 {
9781 if (h->root.type == bfd_link_hash_indirect)
9782 return TRUE;
9783
9784 if (readonly_dynrelocs (h))
9785 {
9786 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9787
9788 /* Not an error, just cut short the traversal. */
9789 return FALSE;
9790 }
9791 return TRUE;
9792 }
9793
9794 /* Set the sizes of the dynamic sections. */
9795
9796 static bfd_boolean
9797 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9798 struct bfd_link_info *info)
9799 {
9800 struct ppc_link_hash_table *htab;
9801 bfd *dynobj;
9802 asection *s;
9803 bfd_boolean relocs;
9804 bfd *ibfd;
9805 struct got_entry *first_tlsld;
9806
9807 htab = ppc_hash_table (info);
9808 if (htab == NULL)
9809 return FALSE;
9810
9811 dynobj = htab->elf.dynobj;
9812 if (dynobj == NULL)
9813 abort ();
9814
9815 if (htab->elf.dynamic_sections_created)
9816 {
9817 /* Set the contents of the .interp section to the interpreter. */
9818 if (bfd_link_executable (info) && !info->nointerp)
9819 {
9820 s = bfd_get_linker_section (dynobj, ".interp");
9821 if (s == NULL)
9822 abort ();
9823 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9824 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9825 }
9826 }
9827
9828 /* Set up .got offsets for local syms, and space for local dynamic
9829 relocs. */
9830 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9831 {
9832 struct got_entry **lgot_ents;
9833 struct got_entry **end_lgot_ents;
9834 struct plt_entry **local_plt;
9835 struct plt_entry **end_local_plt;
9836 unsigned char *lgot_masks;
9837 bfd_size_type locsymcount;
9838 Elf_Internal_Shdr *symtab_hdr;
9839
9840 if (!is_ppc64_elf (ibfd))
9841 continue;
9842
9843 for (s = ibfd->sections; s != NULL; s = s->next)
9844 {
9845 struct ppc_dyn_relocs *p;
9846
9847 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9848 {
9849 if (!bfd_is_abs_section (p->sec)
9850 && bfd_is_abs_section (p->sec->output_section))
9851 {
9852 /* Input section has been discarded, either because
9853 it is a copy of a linkonce section or due to
9854 linker script /DISCARD/, so we'll be discarding
9855 the relocs too. */
9856 }
9857 else if (p->count != 0)
9858 {
9859 asection *srel = elf_section_data (p->sec)->sreloc;
9860 if (p->ifunc)
9861 srel = htab->elf.irelplt;
9862 srel->size += p->count * sizeof (Elf64_External_Rela);
9863 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9864 info->flags |= DF_TEXTREL;
9865 }
9866 }
9867 }
9868
9869 lgot_ents = elf_local_got_ents (ibfd);
9870 if (!lgot_ents)
9871 continue;
9872
9873 symtab_hdr = &elf_symtab_hdr (ibfd);
9874 locsymcount = symtab_hdr->sh_info;
9875 end_lgot_ents = lgot_ents + locsymcount;
9876 local_plt = (struct plt_entry **) end_lgot_ents;
9877 end_local_plt = local_plt + locsymcount;
9878 lgot_masks = (unsigned char *) end_local_plt;
9879 s = ppc64_elf_tdata (ibfd)->got;
9880 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9881 {
9882 struct got_entry **pent, *ent;
9883
9884 pent = lgot_ents;
9885 while ((ent = *pent) != NULL)
9886 if (ent->got.refcount > 0)
9887 {
9888 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9889 {
9890 ppc64_tlsld_got (ibfd)->got.refcount += 1;
9891 *pent = ent->next;
9892 }
9893 else
9894 {
9895 unsigned int ent_size = 8;
9896 unsigned int rel_size = sizeof (Elf64_External_Rela);
9897
9898 ent->got.offset = s->size;
9899 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9900 {
9901 ent_size *= 2;
9902 rel_size *= 2;
9903 }
9904 s->size += ent_size;
9905 if ((*lgot_masks & PLT_IFUNC) != 0)
9906 {
9907 htab->elf.irelplt->size += rel_size;
9908 htab->got_reli_size += rel_size;
9909 }
9910 else if (bfd_link_pic (info))
9911 {
9912 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9913 srel->size += rel_size;
9914 }
9915 pent = &ent->next;
9916 }
9917 }
9918 else
9919 *pent = ent->next;
9920 }
9921
9922 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9923 for (; local_plt < end_local_plt; ++local_plt)
9924 {
9925 struct plt_entry *ent;
9926
9927 for (ent = *local_plt; ent != NULL; ent = ent->next)
9928 if (ent->plt.refcount > 0)
9929 {
9930 s = htab->elf.iplt;
9931 ent->plt.offset = s->size;
9932 s->size += PLT_ENTRY_SIZE (htab);
9933
9934 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9935 }
9936 else
9937 ent->plt.offset = (bfd_vma) -1;
9938 }
9939 }
9940
9941 /* Allocate global sym .plt and .got entries, and space for global
9942 sym dynamic relocs. */
9943 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9944 /* Stash the end of glink branch table. */
9945 if (htab->glink != NULL)
9946 htab->glink->rawsize = htab->glink->size;
9947
9948 if (!htab->opd_abi && !bfd_link_pic (info))
9949 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
9950
9951 first_tlsld = NULL;
9952 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
9953 {
9954 struct got_entry *ent;
9955
9956 if (!is_ppc64_elf (ibfd))
9957 continue;
9958
9959 ent = ppc64_tlsld_got (ibfd);
9960 if (ent->got.refcount > 0)
9961 {
9962 if (!htab->do_multi_toc && first_tlsld != NULL)
9963 {
9964 ent->is_indirect = TRUE;
9965 ent->got.ent = first_tlsld;
9966 }
9967 else
9968 {
9969 if (first_tlsld == NULL)
9970 first_tlsld = ent;
9971 s = ppc64_elf_tdata (ibfd)->got;
9972 ent->got.offset = s->size;
9973 ent->owner = ibfd;
9974 s->size += 16;
9975 if (bfd_link_pic (info))
9976 {
9977 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9978 srel->size += sizeof (Elf64_External_Rela);
9979 }
9980 }
9981 }
9982 else
9983 ent->got.offset = (bfd_vma) -1;
9984 }
9985
9986 /* We now have determined the sizes of the various dynamic sections.
9987 Allocate memory for them. */
9988 relocs = FALSE;
9989 for (s = dynobj->sections; s != NULL; s = s->next)
9990 {
9991 if ((s->flags & SEC_LINKER_CREATED) == 0)
9992 continue;
9993
9994 if (s == htab->brlt || s == htab->relbrlt)
9995 /* These haven't been allocated yet; don't strip. */
9996 continue;
9997 else if (s == htab->elf.sgot
9998 || s == htab->elf.splt
9999 || s == htab->elf.iplt
10000 || s == htab->glink
10001 || s == htab->dynbss)
10002 {
10003 /* Strip this section if we don't need it; see the
10004 comment below. */
10005 }
10006 else if (s == htab->glink_eh_frame)
10007 {
10008 if (!bfd_is_abs_section (s->output_section))
10009 /* Not sized yet. */
10010 continue;
10011 }
10012 else if (CONST_STRNEQ (s->name, ".rela"))
10013 {
10014 if (s->size != 0)
10015 {
10016 if (s != htab->elf.srelplt)
10017 relocs = TRUE;
10018
10019 /* We use the reloc_count field as a counter if we need
10020 to copy relocs into the output file. */
10021 s->reloc_count = 0;
10022 }
10023 }
10024 else
10025 {
10026 /* It's not one of our sections, so don't allocate space. */
10027 continue;
10028 }
10029
10030 if (s->size == 0)
10031 {
10032 /* If we don't need this section, strip it from the
10033 output file. This is mostly to handle .rela.bss and
10034 .rela.plt. We must create both sections in
10035 create_dynamic_sections, because they must be created
10036 before the linker maps input sections to output
10037 sections. The linker does that before
10038 adjust_dynamic_symbol is called, and it is that
10039 function which decides whether anything needs to go
10040 into these sections. */
10041 s->flags |= SEC_EXCLUDE;
10042 continue;
10043 }
10044
10045 if ((s->flags & SEC_HAS_CONTENTS) == 0)
10046 continue;
10047
10048 /* Allocate memory for the section contents. We use bfd_zalloc
10049 here in case unused entries are not reclaimed before the
10050 section's contents are written out. This should not happen,
10051 but this way if it does we get a R_PPC64_NONE reloc in .rela
10052 sections instead of garbage.
10053 We also rely on the section contents being zero when writing
10054 the GOT. */
10055 s->contents = bfd_zalloc (dynobj, s->size);
10056 if (s->contents == NULL)
10057 return FALSE;
10058 }
10059
10060 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
10061 {
10062 if (!is_ppc64_elf (ibfd))
10063 continue;
10064
10065 s = ppc64_elf_tdata (ibfd)->got;
10066 if (s != NULL && s != htab->elf.sgot)
10067 {
10068 if (s->size == 0)
10069 s->flags |= SEC_EXCLUDE;
10070 else
10071 {
10072 s->contents = bfd_zalloc (ibfd, s->size);
10073 if (s->contents == NULL)
10074 return FALSE;
10075 }
10076 }
10077 s = ppc64_elf_tdata (ibfd)->relgot;
10078 if (s != NULL)
10079 {
10080 if (s->size == 0)
10081 s->flags |= SEC_EXCLUDE;
10082 else
10083 {
10084 s->contents = bfd_zalloc (ibfd, s->size);
10085 if (s->contents == NULL)
10086 return FALSE;
10087 relocs = TRUE;
10088 s->reloc_count = 0;
10089 }
10090 }
10091 }
10092
10093 if (htab->elf.dynamic_sections_created)
10094 {
10095 bfd_boolean tls_opt;
10096
10097 /* Add some entries to the .dynamic section. We fill in the
10098 values later, in ppc64_elf_finish_dynamic_sections, but we
10099 must add the entries now so that we get the correct size for
10100 the .dynamic section. The DT_DEBUG entry is filled in by the
10101 dynamic linker and used by the debugger. */
10102 #define add_dynamic_entry(TAG, VAL) \
10103 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
10104
10105 if (bfd_link_executable (info))
10106 {
10107 if (!add_dynamic_entry (DT_DEBUG, 0))
10108 return FALSE;
10109 }
10110
10111 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
10112 {
10113 if (!add_dynamic_entry (DT_PLTGOT, 0)
10114 || !add_dynamic_entry (DT_PLTRELSZ, 0)
10115 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
10116 || !add_dynamic_entry (DT_JMPREL, 0)
10117 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
10118 return FALSE;
10119 }
10120
10121 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
10122 {
10123 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
10124 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
10125 return FALSE;
10126 }
10127
10128 tls_opt = (htab->params->tls_get_addr_opt
10129 && htab->tls_get_addr_fd != NULL
10130 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
10131 if (tls_opt || !htab->opd_abi)
10132 {
10133 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
10134 return FALSE;
10135 }
10136
10137 if (relocs)
10138 {
10139 if (!add_dynamic_entry (DT_RELA, 0)
10140 || !add_dynamic_entry (DT_RELASZ, 0)
10141 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
10142 return FALSE;
10143
10144 /* If any dynamic relocs apply to a read-only section,
10145 then we need a DT_TEXTREL entry. */
10146 if ((info->flags & DF_TEXTREL) == 0)
10147 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
10148
10149 if ((info->flags & DF_TEXTREL) != 0)
10150 {
10151 if (!add_dynamic_entry (DT_TEXTREL, 0))
10152 return FALSE;
10153 }
10154 }
10155 }
10156 #undef add_dynamic_entry
10157
10158 return TRUE;
10159 }
10160
10161 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
10162
10163 static bfd_boolean
10164 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
10165 {
10166 if (h->plt.plist != NULL
10167 && !h->def_regular
10168 && !h->pointer_equality_needed)
10169 return FALSE;
10170
10171 return _bfd_elf_hash_symbol (h);
10172 }
10173
10174 /* Determine the type of stub needed, if any, for a call. */
10175
10176 static inline enum ppc_stub_type
10177 ppc_type_of_stub (asection *input_sec,
10178 const Elf_Internal_Rela *rel,
10179 struct ppc_link_hash_entry **hash,
10180 struct plt_entry **plt_ent,
10181 bfd_vma destination,
10182 unsigned long local_off)
10183 {
10184 struct ppc_link_hash_entry *h = *hash;
10185 bfd_vma location;
10186 bfd_vma branch_offset;
10187 bfd_vma max_branch_offset;
10188 enum elf_ppc64_reloc_type r_type;
10189
10190 if (h != NULL)
10191 {
10192 struct plt_entry *ent;
10193 struct ppc_link_hash_entry *fdh = h;
10194 if (h->oh != NULL
10195 && h->oh->is_func_descriptor)
10196 {
10197 fdh = ppc_follow_link (h->oh);
10198 *hash = fdh;
10199 }
10200
10201 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10202 if (ent->addend == rel->r_addend
10203 && ent->plt.offset != (bfd_vma) -1)
10204 {
10205 *plt_ent = ent;
10206 return ppc_stub_plt_call;
10207 }
10208
10209 /* Here, we know we don't have a plt entry. If we don't have a
10210 either a defined function descriptor or a defined entry symbol
10211 in a regular object file, then it is pointless trying to make
10212 any other type of stub. */
10213 if (!is_static_defined (&fdh->elf)
10214 && !is_static_defined (&h->elf))
10215 return ppc_stub_none;
10216 }
10217 else if (elf_local_got_ents (input_sec->owner) != NULL)
10218 {
10219 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10220 struct plt_entry **local_plt = (struct plt_entry **)
10221 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10222 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10223
10224 if (local_plt[r_symndx] != NULL)
10225 {
10226 struct plt_entry *ent;
10227
10228 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10229 if (ent->addend == rel->r_addend
10230 && ent->plt.offset != (bfd_vma) -1)
10231 {
10232 *plt_ent = ent;
10233 return ppc_stub_plt_call;
10234 }
10235 }
10236 }
10237
10238 /* Determine where the call point is. */
10239 location = (input_sec->output_offset
10240 + input_sec->output_section->vma
10241 + rel->r_offset);
10242
10243 branch_offset = destination - location;
10244 r_type = ELF64_R_TYPE (rel->r_info);
10245
10246 /* Determine if a long branch stub is needed. */
10247 max_branch_offset = 1 << 25;
10248 if (r_type != R_PPC64_REL24)
10249 max_branch_offset = 1 << 15;
10250
10251 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10252 /* We need a stub. Figure out whether a long_branch or plt_branch
10253 is needed later. */
10254 return ppc_stub_long_branch;
10255
10256 return ppc_stub_none;
10257 }
10258
10259 /* With power7 weakly ordered memory model, it is possible for ld.so
10260 to update a plt entry in one thread and have another thread see a
10261 stale zero toc entry. To avoid this we need some sort of acquire
10262 barrier in the call stub. One solution is to make the load of the
10263 toc word seem to appear to depend on the load of the function entry
10264 word. Another solution is to test for r2 being zero, and branch to
10265 the appropriate glink entry if so.
10266
10267 . fake dep barrier compare
10268 . ld 12,xxx(2) ld 12,xxx(2)
10269 . mtctr 12 mtctr 12
10270 . xor 11,12,12 ld 2,xxx+8(2)
10271 . add 2,2,11 cmpldi 2,0
10272 . ld 2,xxx+8(2) bnectr+
10273 . bctr b <glink_entry>
10274
10275 The solution involving the compare turns out to be faster, so
10276 that's what we use unless the branch won't reach. */
10277
10278 #define ALWAYS_USE_FAKE_DEP 0
10279 #define ALWAYS_EMIT_R2SAVE 0
10280
10281 #define PPC_LO(v) ((v) & 0xffff)
10282 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10283 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10284
10285 static inline unsigned int
10286 plt_stub_size (struct ppc_link_hash_table *htab,
10287 struct ppc_stub_hash_entry *stub_entry,
10288 bfd_vma off)
10289 {
10290 unsigned size = 12;
10291
10292 if (ALWAYS_EMIT_R2SAVE
10293 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10294 size += 4;
10295 if (PPC_HA (off) != 0)
10296 size += 4;
10297 if (htab->opd_abi)
10298 {
10299 size += 4;
10300 if (htab->params->plt_static_chain)
10301 size += 4;
10302 if (htab->params->plt_thread_safe
10303 && htab->elf.dynamic_sections_created
10304 && stub_entry->h != NULL
10305 && stub_entry->h->elf.dynindx != -1)
10306 size += 8;
10307 if (PPC_HA (off + 8 + 8 * htab->params->plt_static_chain) != PPC_HA (off))
10308 size += 4;
10309 }
10310 if (stub_entry->h != NULL
10311 && (stub_entry->h == htab->tls_get_addr_fd
10312 || stub_entry->h == htab->tls_get_addr)
10313 && htab->params->tls_get_addr_opt)
10314 size += 13 * 4;
10315 return size;
10316 }
10317
10318 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10319 then return the padding needed to do so. */
10320 static inline unsigned int
10321 plt_stub_pad (struct ppc_link_hash_table *htab,
10322 struct ppc_stub_hash_entry *stub_entry,
10323 bfd_vma plt_off)
10324 {
10325 int stub_align = 1 << htab->params->plt_stub_align;
10326 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10327 bfd_vma stub_off = stub_entry->group->stub_sec->size;
10328
10329 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10330 > ((stub_size - 1) & -stub_align))
10331 return stub_align - (stub_off & (stub_align - 1));
10332 return 0;
10333 }
10334
10335 /* Build a .plt call stub. */
10336
10337 static inline bfd_byte *
10338 build_plt_stub (struct ppc_link_hash_table *htab,
10339 struct ppc_stub_hash_entry *stub_entry,
10340 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10341 {
10342 bfd *obfd = htab->params->stub_bfd;
10343 bfd_boolean plt_load_toc = htab->opd_abi;
10344 bfd_boolean plt_static_chain = htab->params->plt_static_chain;
10345 bfd_boolean plt_thread_safe = (htab->params->plt_thread_safe
10346 && htab->elf.dynamic_sections_created
10347 && stub_entry->h != NULL
10348 && stub_entry->h->elf.dynindx != -1);
10349 bfd_boolean use_fake_dep = plt_thread_safe;
10350 bfd_vma cmp_branch_off = 0;
10351
10352 if (!ALWAYS_USE_FAKE_DEP
10353 && plt_load_toc
10354 && plt_thread_safe
10355 && !((stub_entry->h == htab->tls_get_addr_fd
10356 || stub_entry->h == htab->tls_get_addr)
10357 && htab->params->tls_get_addr_opt))
10358 {
10359 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10360 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10361 / PLT_ENTRY_SIZE (htab));
10362 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10363 bfd_vma to, from;
10364
10365 if (pltindex > 32768)
10366 glinkoff += (pltindex - 32768) * 4;
10367 to = (glinkoff
10368 + htab->glink->output_offset
10369 + htab->glink->output_section->vma);
10370 from = (p - stub_entry->group->stub_sec->contents
10371 + 4 * (ALWAYS_EMIT_R2SAVE
10372 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10373 + 4 * (PPC_HA (offset) != 0)
10374 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10375 != PPC_HA (offset))
10376 + 4 * (plt_static_chain != 0)
10377 + 20
10378 + stub_entry->group->stub_sec->output_offset
10379 + stub_entry->group->stub_sec->output_section->vma);
10380 cmp_branch_off = to - from;
10381 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10382 }
10383
10384 if (PPC_HA (offset) != 0)
10385 {
10386 if (r != NULL)
10387 {
10388 if (ALWAYS_EMIT_R2SAVE
10389 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10390 r[0].r_offset += 4;
10391 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10392 r[1].r_offset = r[0].r_offset + 4;
10393 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10394 r[1].r_addend = r[0].r_addend;
10395 if (plt_load_toc)
10396 {
10397 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10398 {
10399 r[2].r_offset = r[1].r_offset + 4;
10400 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10401 r[2].r_addend = r[0].r_addend;
10402 }
10403 else
10404 {
10405 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10406 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10407 r[2].r_addend = r[0].r_addend + 8;
10408 if (plt_static_chain)
10409 {
10410 r[3].r_offset = r[2].r_offset + 4;
10411 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10412 r[3].r_addend = r[0].r_addend + 16;
10413 }
10414 }
10415 }
10416 }
10417 if (ALWAYS_EMIT_R2SAVE
10418 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10419 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10420 if (plt_load_toc)
10421 {
10422 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10423 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10424 }
10425 else
10426 {
10427 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
10428 bfd_put_32 (obfd, LD_R12_0R12 | PPC_LO (offset), p), p += 4;
10429 }
10430 if (plt_load_toc
10431 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10432 {
10433 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10434 offset = 0;
10435 }
10436 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10437 if (plt_load_toc)
10438 {
10439 if (use_fake_dep)
10440 {
10441 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10442 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10443 }
10444 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10445 if (plt_static_chain)
10446 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10447 }
10448 }
10449 else
10450 {
10451 if (r != NULL)
10452 {
10453 if (ALWAYS_EMIT_R2SAVE
10454 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10455 r[0].r_offset += 4;
10456 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10457 if (plt_load_toc)
10458 {
10459 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10460 {
10461 r[1].r_offset = r[0].r_offset + 4;
10462 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10463 r[1].r_addend = r[0].r_addend;
10464 }
10465 else
10466 {
10467 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10468 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10469 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10470 if (plt_static_chain)
10471 {
10472 r[2].r_offset = r[1].r_offset + 4;
10473 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10474 r[2].r_addend = r[0].r_addend + 8;
10475 }
10476 }
10477 }
10478 }
10479 if (ALWAYS_EMIT_R2SAVE
10480 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10481 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10482 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10483 if (plt_load_toc
10484 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10485 {
10486 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10487 offset = 0;
10488 }
10489 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10490 if (plt_load_toc)
10491 {
10492 if (use_fake_dep)
10493 {
10494 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10495 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10496 }
10497 if (plt_static_chain)
10498 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10499 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10500 }
10501 }
10502 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10503 {
10504 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10505 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10506 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10507 }
10508 else
10509 bfd_put_32 (obfd, BCTR, p), p += 4;
10510 return p;
10511 }
10512
10513 /* Build a special .plt call stub for __tls_get_addr. */
10514
10515 #define LD_R11_0R3 0xe9630000
10516 #define LD_R12_0R3 0xe9830000
10517 #define MR_R0_R3 0x7c601b78
10518 #define CMPDI_R11_0 0x2c2b0000
10519 #define ADD_R3_R12_R13 0x7c6c6a14
10520 #define BEQLR 0x4d820020
10521 #define MR_R3_R0 0x7c030378
10522 #define STD_R11_0R1 0xf9610000
10523 #define BCTRL 0x4e800421
10524 #define LD_R11_0R1 0xe9610000
10525 #define MTLR_R11 0x7d6803a6
10526
10527 static inline bfd_byte *
10528 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10529 struct ppc_stub_hash_entry *stub_entry,
10530 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10531 {
10532 bfd *obfd = htab->params->stub_bfd;
10533
10534 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10535 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10536 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10537 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10538 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10539 bfd_put_32 (obfd, BEQLR, p), p += 4;
10540 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10541 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10542 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10543
10544 if (r != NULL)
10545 r[0].r_offset += 9 * 4;
10546 p = build_plt_stub (htab, stub_entry, p, offset, r);
10547 bfd_put_32 (obfd, BCTRL, p - 4);
10548
10549 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10550 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10551 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10552 bfd_put_32 (obfd, BLR, p), p += 4;
10553
10554 return p;
10555 }
10556
10557 static Elf_Internal_Rela *
10558 get_relocs (asection *sec, int count)
10559 {
10560 Elf_Internal_Rela *relocs;
10561 struct bfd_elf_section_data *elfsec_data;
10562
10563 elfsec_data = elf_section_data (sec);
10564 relocs = elfsec_data->relocs;
10565 if (relocs == NULL)
10566 {
10567 bfd_size_type relsize;
10568 relsize = sec->reloc_count * sizeof (*relocs);
10569 relocs = bfd_alloc (sec->owner, relsize);
10570 if (relocs == NULL)
10571 return NULL;
10572 elfsec_data->relocs = relocs;
10573 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10574 sizeof (Elf_Internal_Shdr));
10575 if (elfsec_data->rela.hdr == NULL)
10576 return NULL;
10577 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10578 * sizeof (Elf64_External_Rela));
10579 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10580 sec->reloc_count = 0;
10581 }
10582 relocs += sec->reloc_count;
10583 sec->reloc_count += count;
10584 return relocs;
10585 }
10586
10587 static bfd_vma
10588 get_r2off (struct bfd_link_info *info,
10589 struct ppc_stub_hash_entry *stub_entry)
10590 {
10591 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10592 bfd_vma r2off = htab->sec_info[stub_entry->target_section->id].toc_off;
10593
10594 if (r2off == 0)
10595 {
10596 /* Support linking -R objects. Get the toc pointer from the
10597 opd entry. */
10598 char buf[8];
10599 if (!htab->opd_abi)
10600 return r2off;
10601 asection *opd = stub_entry->h->elf.root.u.def.section;
10602 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10603
10604 if (strcmp (opd->name, ".opd") != 0
10605 || opd->reloc_count != 0)
10606 {
10607 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10608 stub_entry->h->elf.root.root.string);
10609 bfd_set_error (bfd_error_bad_value);
10610 return (bfd_vma) -1;
10611 }
10612 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10613 return (bfd_vma) -1;
10614 r2off = bfd_get_64 (opd->owner, buf);
10615 r2off -= elf_gp (info->output_bfd);
10616 }
10617 r2off -= htab->sec_info[stub_entry->group->link_sec->id].toc_off;
10618 return r2off;
10619 }
10620
10621 static bfd_boolean
10622 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10623 {
10624 struct ppc_stub_hash_entry *stub_entry;
10625 struct ppc_branch_hash_entry *br_entry;
10626 struct bfd_link_info *info;
10627 struct ppc_link_hash_table *htab;
10628 bfd_byte *loc;
10629 bfd_byte *p;
10630 bfd_vma dest, off;
10631 int size;
10632 Elf_Internal_Rela *r;
10633 asection *plt;
10634
10635 /* Massage our args to the form they really have. */
10636 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10637 info = in_arg;
10638
10639 htab = ppc_hash_table (info);
10640 if (htab == NULL)
10641 return FALSE;
10642
10643 /* Make a note of the offset within the stubs for this entry. */
10644 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10645 loc = stub_entry->group->stub_sec->contents + stub_entry->stub_offset;
10646
10647 htab->stub_count[stub_entry->stub_type - 1] += 1;
10648 switch (stub_entry->stub_type)
10649 {
10650 case ppc_stub_long_branch:
10651 case ppc_stub_long_branch_r2off:
10652 /* Branches are relative. This is where we are going to. */
10653 dest = (stub_entry->target_value
10654 + stub_entry->target_section->output_offset
10655 + stub_entry->target_section->output_section->vma);
10656 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10657 off = dest;
10658
10659 /* And this is where we are coming from. */
10660 off -= (stub_entry->stub_offset
10661 + stub_entry->group->stub_sec->output_offset
10662 + stub_entry->group->stub_sec->output_section->vma);
10663
10664 size = 4;
10665 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10666 {
10667 bfd_vma r2off = get_r2off (info, stub_entry);
10668
10669 if (r2off == (bfd_vma) -1)
10670 {
10671 htab->stub_error = TRUE;
10672 return FALSE;
10673 }
10674 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10675 loc += 4;
10676 size = 8;
10677 if (PPC_HA (r2off) != 0)
10678 {
10679 bfd_put_32 (htab->params->stub_bfd,
10680 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10681 loc += 4;
10682 size += 4;
10683 }
10684 if (PPC_LO (r2off) != 0)
10685 {
10686 bfd_put_32 (htab->params->stub_bfd,
10687 ADDI_R2_R2 | PPC_LO (r2off), loc);
10688 loc += 4;
10689 size += 4;
10690 }
10691 off -= size - 4;
10692 }
10693 bfd_put_32 (htab->params->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10694
10695 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10696 {
10697 info->callbacks->einfo
10698 (_("%P: long branch stub `%s' offset overflow\n"),
10699 stub_entry->root.string);
10700 htab->stub_error = TRUE;
10701 return FALSE;
10702 }
10703
10704 if (info->emitrelocations)
10705 {
10706 r = get_relocs (stub_entry->group->stub_sec, 1);
10707 if (r == NULL)
10708 return FALSE;
10709 r->r_offset = loc - stub_entry->group->stub_sec->contents;
10710 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10711 r->r_addend = dest;
10712 if (stub_entry->h != NULL)
10713 {
10714 struct elf_link_hash_entry **hashes;
10715 unsigned long symndx;
10716 struct ppc_link_hash_entry *h;
10717
10718 hashes = elf_sym_hashes (htab->params->stub_bfd);
10719 if (hashes == NULL)
10720 {
10721 bfd_size_type hsize;
10722
10723 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10724 hashes = bfd_zalloc (htab->params->stub_bfd, hsize);
10725 if (hashes == NULL)
10726 return FALSE;
10727 elf_sym_hashes (htab->params->stub_bfd) = hashes;
10728 htab->stub_globals = 1;
10729 }
10730 symndx = htab->stub_globals++;
10731 h = stub_entry->h;
10732 hashes[symndx] = &h->elf;
10733 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10734 if (h->oh != NULL && h->oh->is_func)
10735 h = ppc_follow_link (h->oh);
10736 if (h->elf.root.u.def.section != stub_entry->target_section)
10737 /* H is an opd symbol. The addend must be zero. */
10738 r->r_addend = 0;
10739 else
10740 {
10741 off = (h->elf.root.u.def.value
10742 + h->elf.root.u.def.section->output_offset
10743 + h->elf.root.u.def.section->output_section->vma);
10744 r->r_addend -= off;
10745 }
10746 }
10747 }
10748 break;
10749
10750 case ppc_stub_plt_branch:
10751 case ppc_stub_plt_branch_r2off:
10752 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10753 stub_entry->root.string + 9,
10754 FALSE, FALSE);
10755 if (br_entry == NULL)
10756 {
10757 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10758 stub_entry->root.string);
10759 htab->stub_error = TRUE;
10760 return FALSE;
10761 }
10762
10763 dest = (stub_entry->target_value
10764 + stub_entry->target_section->output_offset
10765 + stub_entry->target_section->output_section->vma);
10766 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10767 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10768
10769 bfd_put_64 (htab->brlt->owner, dest,
10770 htab->brlt->contents + br_entry->offset);
10771
10772 if (br_entry->iter == htab->stub_iteration)
10773 {
10774 br_entry->iter = 0;
10775
10776 if (htab->relbrlt != NULL)
10777 {
10778 /* Create a reloc for the branch lookup table entry. */
10779 Elf_Internal_Rela rela;
10780 bfd_byte *rl;
10781
10782 rela.r_offset = (br_entry->offset
10783 + htab->brlt->output_offset
10784 + htab->brlt->output_section->vma);
10785 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10786 rela.r_addend = dest;
10787
10788 rl = htab->relbrlt->contents;
10789 rl += (htab->relbrlt->reloc_count++
10790 * sizeof (Elf64_External_Rela));
10791 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10792 }
10793 else if (info->emitrelocations)
10794 {
10795 r = get_relocs (htab->brlt, 1);
10796 if (r == NULL)
10797 return FALSE;
10798 /* brlt, being SEC_LINKER_CREATED does not go through the
10799 normal reloc processing. Symbols and offsets are not
10800 translated from input file to output file form, so
10801 set up the offset per the output file. */
10802 r->r_offset = (br_entry->offset
10803 + htab->brlt->output_offset
10804 + htab->brlt->output_section->vma);
10805 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10806 r->r_addend = dest;
10807 }
10808 }
10809
10810 dest = (br_entry->offset
10811 + htab->brlt->output_offset
10812 + htab->brlt->output_section->vma);
10813
10814 off = (dest
10815 - elf_gp (htab->brlt->output_section->owner)
10816 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
10817
10818 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10819 {
10820 info->callbacks->einfo
10821 (_("%P: linkage table error against `%T'\n"),
10822 stub_entry->root.string);
10823 bfd_set_error (bfd_error_bad_value);
10824 htab->stub_error = TRUE;
10825 return FALSE;
10826 }
10827
10828 if (info->emitrelocations)
10829 {
10830 r = get_relocs (stub_entry->group->stub_sec, 1 + (PPC_HA (off) != 0));
10831 if (r == NULL)
10832 return FALSE;
10833 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
10834 if (bfd_big_endian (info->output_bfd))
10835 r[0].r_offset += 2;
10836 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10837 r[0].r_offset += 4;
10838 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10839 r[0].r_addend = dest;
10840 if (PPC_HA (off) != 0)
10841 {
10842 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10843 r[1].r_offset = r[0].r_offset + 4;
10844 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10845 r[1].r_addend = r[0].r_addend;
10846 }
10847 }
10848
10849 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10850 {
10851 if (PPC_HA (off) != 0)
10852 {
10853 size = 16;
10854 bfd_put_32 (htab->params->stub_bfd,
10855 ADDIS_R12_R2 | PPC_HA (off), loc);
10856 loc += 4;
10857 bfd_put_32 (htab->params->stub_bfd,
10858 LD_R12_0R12 | PPC_LO (off), loc);
10859 }
10860 else
10861 {
10862 size = 12;
10863 bfd_put_32 (htab->params->stub_bfd,
10864 LD_R12_0R2 | PPC_LO (off), loc);
10865 }
10866 }
10867 else
10868 {
10869 bfd_vma r2off = get_r2off (info, stub_entry);
10870
10871 if (r2off == (bfd_vma) -1)
10872 {
10873 htab->stub_error = TRUE;
10874 return FALSE;
10875 }
10876
10877 bfd_put_32 (htab->params->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10878 loc += 4;
10879 size = 16;
10880 if (PPC_HA (off) != 0)
10881 {
10882 size += 4;
10883 bfd_put_32 (htab->params->stub_bfd,
10884 ADDIS_R12_R2 | PPC_HA (off), loc);
10885 loc += 4;
10886 bfd_put_32 (htab->params->stub_bfd,
10887 LD_R12_0R12 | PPC_LO (off), loc);
10888 }
10889 else
10890 bfd_put_32 (htab->params->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10891
10892 if (PPC_HA (r2off) != 0)
10893 {
10894 size += 4;
10895 loc += 4;
10896 bfd_put_32 (htab->params->stub_bfd,
10897 ADDIS_R2_R2 | PPC_HA (r2off), loc);
10898 }
10899 if (PPC_LO (r2off) != 0)
10900 {
10901 size += 4;
10902 loc += 4;
10903 bfd_put_32 (htab->params->stub_bfd,
10904 ADDI_R2_R2 | PPC_LO (r2off), loc);
10905 }
10906 }
10907 loc += 4;
10908 bfd_put_32 (htab->params->stub_bfd, MTCTR_R12, loc);
10909 loc += 4;
10910 bfd_put_32 (htab->params->stub_bfd, BCTR, loc);
10911 break;
10912
10913 case ppc_stub_plt_call:
10914 case ppc_stub_plt_call_r2save:
10915 if (stub_entry->h != NULL
10916 && stub_entry->h->is_func_descriptor
10917 && stub_entry->h->oh != NULL)
10918 {
10919 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10920
10921 /* If the old-ABI "dot-symbol" is undefined make it weak so
10922 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL. */
10923 if (fh->elf.root.type == bfd_link_hash_undefined)
10924 fh->elf.root.type = bfd_link_hash_undefweak;
10925 /* Stop undo_symbol_twiddle changing it back to undefined. */
10926 fh->was_undefined = 0;
10927 }
10928
10929 /* Now build the stub. */
10930 dest = stub_entry->plt_ent->plt.offset & ~1;
10931 if (dest >= (bfd_vma) -2)
10932 abort ();
10933
10934 plt = htab->elf.splt;
10935 if (!htab->elf.dynamic_sections_created
10936 || stub_entry->h == NULL
10937 || stub_entry->h->elf.dynindx == -1)
10938 plt = htab->elf.iplt;
10939
10940 dest += plt->output_offset + plt->output_section->vma;
10941
10942 if (stub_entry->h == NULL
10943 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10944 {
10945 Elf_Internal_Rela rela;
10946 bfd_byte *rl;
10947
10948 rela.r_offset = dest;
10949 if (htab->opd_abi)
10950 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10951 else
10952 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
10953 rela.r_addend = (stub_entry->target_value
10954 + stub_entry->target_section->output_offset
10955 + stub_entry->target_section->output_section->vma);
10956
10957 rl = (htab->elf.irelplt->contents
10958 + (htab->elf.irelplt->reloc_count++
10959 * sizeof (Elf64_External_Rela)));
10960 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
10961 stub_entry->plt_ent->plt.offset |= 1;
10962 }
10963
10964 off = (dest
10965 - elf_gp (plt->output_section->owner)
10966 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
10967
10968 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10969 {
10970 info->callbacks->einfo
10971 (_("%P: linkage table error against `%T'\n"),
10972 stub_entry->h != NULL
10973 ? stub_entry->h->elf.root.root.string
10974 : "<local sym>");
10975 bfd_set_error (bfd_error_bad_value);
10976 htab->stub_error = TRUE;
10977 return FALSE;
10978 }
10979
10980 if (htab->params->plt_stub_align != 0)
10981 {
10982 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10983
10984 stub_entry->group->stub_sec->size += pad;
10985 stub_entry->stub_offset = stub_entry->group->stub_sec->size;
10986 loc += pad;
10987 }
10988
10989 r = NULL;
10990 if (info->emitrelocations)
10991 {
10992 r = get_relocs (stub_entry->group->stub_sec,
10993 ((PPC_HA (off) != 0)
10994 + (htab->opd_abi
10995 ? 2 + (htab->params->plt_static_chain
10996 && PPC_HA (off + 16) == PPC_HA (off))
10997 : 1)));
10998 if (r == NULL)
10999 return FALSE;
11000 r[0].r_offset = loc - stub_entry->group->stub_sec->contents;
11001 if (bfd_big_endian (info->output_bfd))
11002 r[0].r_offset += 2;
11003 r[0].r_addend = dest;
11004 }
11005 if (stub_entry->h != NULL
11006 && (stub_entry->h == htab->tls_get_addr_fd
11007 || stub_entry->h == htab->tls_get_addr)
11008 && htab->params->tls_get_addr_opt)
11009 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
11010 else
11011 p = build_plt_stub (htab, stub_entry, loc, off, r);
11012 size = p - loc;
11013 break;
11014
11015 case ppc_stub_save_res:
11016 return TRUE;
11017
11018 default:
11019 BFD_FAIL ();
11020 return FALSE;
11021 }
11022
11023 stub_entry->group->stub_sec->size += size;
11024
11025 if (htab->params->emit_stub_syms)
11026 {
11027 struct elf_link_hash_entry *h;
11028 size_t len1, len2;
11029 char *name;
11030 const char *const stub_str[] = { "long_branch",
11031 "long_branch_r2off",
11032 "plt_branch",
11033 "plt_branch_r2off",
11034 "plt_call",
11035 "plt_call" };
11036
11037 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
11038 len2 = strlen (stub_entry->root.string);
11039 name = bfd_malloc (len1 + len2 + 2);
11040 if (name == NULL)
11041 return FALSE;
11042 memcpy (name, stub_entry->root.string, 9);
11043 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
11044 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
11045 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
11046 if (h == NULL)
11047 return FALSE;
11048 if (h->root.type == bfd_link_hash_new)
11049 {
11050 h->root.type = bfd_link_hash_defined;
11051 h->root.u.def.section = stub_entry->group->stub_sec;
11052 h->root.u.def.value = stub_entry->stub_offset;
11053 h->ref_regular = 1;
11054 h->def_regular = 1;
11055 h->ref_regular_nonweak = 1;
11056 h->forced_local = 1;
11057 h->non_elf = 0;
11058 h->root.linker_def = 1;
11059 }
11060 }
11061
11062 return TRUE;
11063 }
11064
11065 /* As above, but don't actually build the stub. Just bump offset so
11066 we know stub section sizes, and select plt_branch stubs where
11067 long_branch stubs won't do. */
11068
11069 static bfd_boolean
11070 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
11071 {
11072 struct ppc_stub_hash_entry *stub_entry;
11073 struct bfd_link_info *info;
11074 struct ppc_link_hash_table *htab;
11075 bfd_vma off;
11076 int size;
11077
11078 /* Massage our args to the form they really have. */
11079 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
11080 info = in_arg;
11081
11082 htab = ppc_hash_table (info);
11083 if (htab == NULL)
11084 return FALSE;
11085
11086 if (stub_entry->h != NULL
11087 && stub_entry->h->save_res
11088 && stub_entry->h->elf.root.type == bfd_link_hash_defined
11089 && stub_entry->h->elf.root.u.def.section == htab->sfpr)
11090 {
11091 /* Don't make stubs to out-of-line register save/restore
11092 functions. Instead, emit copies of the functions. */
11093 stub_entry->group->needs_save_res = 1;
11094 stub_entry->stub_type = ppc_stub_save_res;
11095 return TRUE;
11096 }
11097
11098 if (stub_entry->stub_type == ppc_stub_plt_call
11099 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
11100 {
11101 asection *plt;
11102 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
11103 if (off >= (bfd_vma) -2)
11104 abort ();
11105 plt = htab->elf.splt;
11106 if (!htab->elf.dynamic_sections_created
11107 || stub_entry->h == NULL
11108 || stub_entry->h->elf.dynindx == -1)
11109 plt = htab->elf.iplt;
11110 off += (plt->output_offset
11111 + plt->output_section->vma
11112 - elf_gp (plt->output_section->owner)
11113 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11114
11115 size = plt_stub_size (htab, stub_entry, off);
11116 if (htab->params->plt_stub_align)
11117 size += plt_stub_pad (htab, stub_entry, off);
11118 if (info->emitrelocations)
11119 {
11120 stub_entry->group->stub_sec->reloc_count
11121 += ((PPC_HA (off) != 0)
11122 + (htab->opd_abi
11123 ? 2 + (htab->params->plt_static_chain
11124 && PPC_HA (off + 16) == PPC_HA (off))
11125 : 1));
11126 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11127 }
11128 }
11129 else
11130 {
11131 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
11132 variants. */
11133 bfd_vma r2off = 0;
11134 bfd_vma local_off = 0;
11135
11136 off = (stub_entry->target_value
11137 + stub_entry->target_section->output_offset
11138 + stub_entry->target_section->output_section->vma);
11139 off -= (stub_entry->group->stub_sec->size
11140 + stub_entry->group->stub_sec->output_offset
11141 + stub_entry->group->stub_sec->output_section->vma);
11142
11143 /* Reset the stub type from the plt variant in case we now
11144 can reach with a shorter stub. */
11145 if (stub_entry->stub_type >= ppc_stub_plt_branch)
11146 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
11147
11148 size = 4;
11149 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
11150 {
11151 r2off = get_r2off (info, stub_entry);
11152 if (r2off == (bfd_vma) -1)
11153 {
11154 htab->stub_error = TRUE;
11155 return FALSE;
11156 }
11157 size = 8;
11158 if (PPC_HA (r2off) != 0)
11159 size += 4;
11160 if (PPC_LO (r2off) != 0)
11161 size += 4;
11162 off -= size - 4;
11163 }
11164
11165 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
11166
11167 /* If the branch offset if too big, use a ppc_stub_plt_branch.
11168 Do the same for -R objects without function descriptors. */
11169 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
11170 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
11171 && r2off == 0
11172 && htab->sec_info[stub_entry->target_section->id].toc_off == 0))
11173 {
11174 struct ppc_branch_hash_entry *br_entry;
11175
11176 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
11177 stub_entry->root.string + 9,
11178 TRUE, FALSE);
11179 if (br_entry == NULL)
11180 {
11181 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
11182 stub_entry->root.string);
11183 htab->stub_error = TRUE;
11184 return FALSE;
11185 }
11186
11187 if (br_entry->iter != htab->stub_iteration)
11188 {
11189 br_entry->iter = htab->stub_iteration;
11190 br_entry->offset = htab->brlt->size;
11191 htab->brlt->size += 8;
11192
11193 if (htab->relbrlt != NULL)
11194 htab->relbrlt->size += sizeof (Elf64_External_Rela);
11195 else if (info->emitrelocations)
11196 {
11197 htab->brlt->reloc_count += 1;
11198 htab->brlt->flags |= SEC_RELOC;
11199 }
11200 }
11201
11202 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
11203 off = (br_entry->offset
11204 + htab->brlt->output_offset
11205 + htab->brlt->output_section->vma
11206 - elf_gp (htab->brlt->output_section->owner)
11207 - htab->sec_info[stub_entry->group->link_sec->id].toc_off);
11208
11209 if (info->emitrelocations)
11210 {
11211 stub_entry->group->stub_sec->reloc_count
11212 += 1 + (PPC_HA (off) != 0);
11213 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11214 }
11215
11216 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
11217 {
11218 size = 12;
11219 if (PPC_HA (off) != 0)
11220 size = 16;
11221 }
11222 else
11223 {
11224 size = 16;
11225 if (PPC_HA (off) != 0)
11226 size += 4;
11227
11228 if (PPC_HA (r2off) != 0)
11229 size += 4;
11230 if (PPC_LO (r2off) != 0)
11231 size += 4;
11232 }
11233 }
11234 else if (info->emitrelocations)
11235 {
11236 stub_entry->group->stub_sec->reloc_count += 1;
11237 stub_entry->group->stub_sec->flags |= SEC_RELOC;
11238 }
11239 }
11240
11241 stub_entry->group->stub_sec->size += size;
11242 return TRUE;
11243 }
11244
11245 /* Set up various things so that we can make a list of input sections
11246 for each output section included in the link. Returns -1 on error,
11247 0 when no stubs will be needed, and 1 on success. */
11248
11249 int
11250 ppc64_elf_setup_section_lists (struct bfd_link_info *info)
11251 {
11252 unsigned int id;
11253 bfd_size_type amt;
11254 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11255
11256 if (htab == NULL)
11257 return -1;
11258
11259 htab->sec_info_arr_size = bfd_get_next_section_id ();
11260 amt = sizeof (*htab->sec_info) * (htab->sec_info_arr_size);
11261 htab->sec_info = bfd_zmalloc (amt);
11262 if (htab->sec_info == NULL)
11263 return -1;
11264
11265 /* Set toc_off for com, und, abs and ind sections. */
11266 for (id = 0; id < 3; id++)
11267 htab->sec_info[id].toc_off = TOC_BASE_OFF;
11268
11269 return 1;
11270 }
11271
11272 /* Set up for first pass at multitoc partitioning. */
11273
11274 void
11275 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11276 {
11277 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11278
11279 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11280 htab->toc_bfd = NULL;
11281 htab->toc_first_sec = NULL;
11282 }
11283
11284 /* The linker repeatedly calls this function for each TOC input section
11285 and linker generated GOT section. Group input bfds such that the toc
11286 within a group is less than 64k in size. */
11287
11288 bfd_boolean
11289 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11290 {
11291 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11292 bfd_vma addr, off, limit;
11293
11294 if (htab == NULL)
11295 return FALSE;
11296
11297 if (!htab->second_toc_pass)
11298 {
11299 /* Keep track of the first .toc or .got section for this input bfd. */
11300 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11301
11302 if (new_bfd)
11303 {
11304 htab->toc_bfd = isec->owner;
11305 htab->toc_first_sec = isec;
11306 }
11307
11308 addr = isec->output_offset + isec->output_section->vma;
11309 off = addr - htab->toc_curr;
11310 limit = 0x80008000;
11311 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11312 limit = 0x10000;
11313 if (off + isec->size > limit)
11314 {
11315 addr = (htab->toc_first_sec->output_offset
11316 + htab->toc_first_sec->output_section->vma);
11317 htab->toc_curr = addr;
11318 htab->toc_curr &= -TOC_BASE_ALIGN;
11319 }
11320
11321 /* toc_curr is the base address of this toc group. Set elf_gp
11322 for the input section to be the offset relative to the
11323 output toc base plus 0x8000. Making the input elf_gp an
11324 offset allows us to move the toc as a whole without
11325 recalculating input elf_gp. */
11326 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11327 off += TOC_BASE_OFF;
11328
11329 /* Die if someone uses a linker script that doesn't keep input
11330 file .toc and .got together. */
11331 if (new_bfd
11332 && elf_gp (isec->owner) != 0
11333 && elf_gp (isec->owner) != off)
11334 return FALSE;
11335
11336 elf_gp (isec->owner) = off;
11337 return TRUE;
11338 }
11339
11340 /* During the second pass toc_first_sec points to the start of
11341 a toc group, and toc_curr is used to track the old elf_gp.
11342 We use toc_bfd to ensure we only look at each bfd once. */
11343 if (htab->toc_bfd == isec->owner)
11344 return TRUE;
11345 htab->toc_bfd = isec->owner;
11346
11347 if (htab->toc_first_sec == NULL
11348 || htab->toc_curr != elf_gp (isec->owner))
11349 {
11350 htab->toc_curr = elf_gp (isec->owner);
11351 htab->toc_first_sec = isec;
11352 }
11353 addr = (htab->toc_first_sec->output_offset
11354 + htab->toc_first_sec->output_section->vma);
11355 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11356 elf_gp (isec->owner) = off;
11357
11358 return TRUE;
11359 }
11360
11361 /* Called via elf_link_hash_traverse to merge GOT entries for global
11362 symbol H. */
11363
11364 static bfd_boolean
11365 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11366 {
11367 if (h->root.type == bfd_link_hash_indirect)
11368 return TRUE;
11369
11370 merge_got_entries (&h->got.glist);
11371
11372 return TRUE;
11373 }
11374
11375 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11376 symbol H. */
11377
11378 static bfd_boolean
11379 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11380 {
11381 struct got_entry *gent;
11382
11383 if (h->root.type == bfd_link_hash_indirect)
11384 return TRUE;
11385
11386 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11387 if (!gent->is_indirect)
11388 allocate_got (h, (struct bfd_link_info *) inf, gent);
11389 return TRUE;
11390 }
11391
11392 /* Called on the first multitoc pass after the last call to
11393 ppc64_elf_next_toc_section. This function removes duplicate GOT
11394 entries. */
11395
11396 bfd_boolean
11397 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11398 {
11399 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11400 struct bfd *ibfd, *ibfd2;
11401 bfd_boolean done_something;
11402
11403 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11404
11405 if (!htab->do_multi_toc)
11406 return FALSE;
11407
11408 /* Merge global sym got entries within a toc group. */
11409 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11410
11411 /* And tlsld_got. */
11412 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11413 {
11414 struct got_entry *ent, *ent2;
11415
11416 if (!is_ppc64_elf (ibfd))
11417 continue;
11418
11419 ent = ppc64_tlsld_got (ibfd);
11420 if (!ent->is_indirect
11421 && ent->got.offset != (bfd_vma) -1)
11422 {
11423 for (ibfd2 = ibfd->link.next; ibfd2 != NULL; ibfd2 = ibfd2->link.next)
11424 {
11425 if (!is_ppc64_elf (ibfd2))
11426 continue;
11427
11428 ent2 = ppc64_tlsld_got (ibfd2);
11429 if (!ent2->is_indirect
11430 && ent2->got.offset != (bfd_vma) -1
11431 && elf_gp (ibfd2) == elf_gp (ibfd))
11432 {
11433 ent2->is_indirect = TRUE;
11434 ent2->got.ent = ent;
11435 }
11436 }
11437 }
11438 }
11439
11440 /* Zap sizes of got sections. */
11441 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11442 htab->elf.irelplt->size -= htab->got_reli_size;
11443 htab->got_reli_size = 0;
11444
11445 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11446 {
11447 asection *got, *relgot;
11448
11449 if (!is_ppc64_elf (ibfd))
11450 continue;
11451
11452 got = ppc64_elf_tdata (ibfd)->got;
11453 if (got != NULL)
11454 {
11455 got->rawsize = got->size;
11456 got->size = 0;
11457 relgot = ppc64_elf_tdata (ibfd)->relgot;
11458 relgot->rawsize = relgot->size;
11459 relgot->size = 0;
11460 }
11461 }
11462
11463 /* Now reallocate the got, local syms first. We don't need to
11464 allocate section contents again since we never increase size. */
11465 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11466 {
11467 struct got_entry **lgot_ents;
11468 struct got_entry **end_lgot_ents;
11469 struct plt_entry **local_plt;
11470 struct plt_entry **end_local_plt;
11471 unsigned char *lgot_masks;
11472 bfd_size_type locsymcount;
11473 Elf_Internal_Shdr *symtab_hdr;
11474 asection *s;
11475
11476 if (!is_ppc64_elf (ibfd))
11477 continue;
11478
11479 lgot_ents = elf_local_got_ents (ibfd);
11480 if (!lgot_ents)
11481 continue;
11482
11483 symtab_hdr = &elf_symtab_hdr (ibfd);
11484 locsymcount = symtab_hdr->sh_info;
11485 end_lgot_ents = lgot_ents + locsymcount;
11486 local_plt = (struct plt_entry **) end_lgot_ents;
11487 end_local_plt = local_plt + locsymcount;
11488 lgot_masks = (unsigned char *) end_local_plt;
11489 s = ppc64_elf_tdata (ibfd)->got;
11490 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11491 {
11492 struct got_entry *ent;
11493
11494 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11495 {
11496 unsigned int ent_size = 8;
11497 unsigned int rel_size = sizeof (Elf64_External_Rela);
11498
11499 ent->got.offset = s->size;
11500 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11501 {
11502 ent_size *= 2;
11503 rel_size *= 2;
11504 }
11505 s->size += ent_size;
11506 if ((*lgot_masks & PLT_IFUNC) != 0)
11507 {
11508 htab->elf.irelplt->size += rel_size;
11509 htab->got_reli_size += rel_size;
11510 }
11511 else if (bfd_link_pic (info))
11512 {
11513 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11514 srel->size += rel_size;
11515 }
11516 }
11517 }
11518 }
11519
11520 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11521
11522 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11523 {
11524 struct got_entry *ent;
11525
11526 if (!is_ppc64_elf (ibfd))
11527 continue;
11528
11529 ent = ppc64_tlsld_got (ibfd);
11530 if (!ent->is_indirect
11531 && ent->got.offset != (bfd_vma) -1)
11532 {
11533 asection *s = ppc64_elf_tdata (ibfd)->got;
11534 ent->got.offset = s->size;
11535 s->size += 16;
11536 if (bfd_link_pic (info))
11537 {
11538 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11539 srel->size += sizeof (Elf64_External_Rela);
11540 }
11541 }
11542 }
11543
11544 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11545 if (!done_something)
11546 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
11547 {
11548 asection *got;
11549
11550 if (!is_ppc64_elf (ibfd))
11551 continue;
11552
11553 got = ppc64_elf_tdata (ibfd)->got;
11554 if (got != NULL)
11555 {
11556 done_something = got->rawsize != got->size;
11557 if (done_something)
11558 break;
11559 }
11560 }
11561
11562 if (done_something)
11563 (*htab->params->layout_sections_again) ();
11564
11565 /* Set up for second pass over toc sections to recalculate elf_gp
11566 on input sections. */
11567 htab->toc_bfd = NULL;
11568 htab->toc_first_sec = NULL;
11569 htab->second_toc_pass = TRUE;
11570 return done_something;
11571 }
11572
11573 /* Called after second pass of multitoc partitioning. */
11574
11575 void
11576 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11577 {
11578 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11579
11580 /* After the second pass, toc_curr tracks the TOC offset used
11581 for code sections below in ppc64_elf_next_input_section. */
11582 htab->toc_curr = TOC_BASE_OFF;
11583 }
11584
11585 /* No toc references were found in ISEC. If the code in ISEC makes no
11586 calls, then there's no need to use toc adjusting stubs when branching
11587 into ISEC. Actually, indirect calls from ISEC are OK as they will
11588 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11589 needed, and 2 if a cyclical call-graph was found but no other reason
11590 for a stub was detected. If called from the top level, a return of
11591 2 means the same as a return of 0. */
11592
11593 static int
11594 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11595 {
11596 int ret;
11597
11598 /* Mark this section as checked. */
11599 isec->call_check_done = 1;
11600
11601 /* We know none of our code bearing sections will need toc stubs. */
11602 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11603 return 0;
11604
11605 if (isec->size == 0)
11606 return 0;
11607
11608 if (isec->output_section == NULL)
11609 return 0;
11610
11611 ret = 0;
11612 if (isec->reloc_count != 0)
11613 {
11614 Elf_Internal_Rela *relstart, *rel;
11615 Elf_Internal_Sym *local_syms;
11616 struct ppc_link_hash_table *htab;
11617
11618 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11619 info->keep_memory);
11620 if (relstart == NULL)
11621 return -1;
11622
11623 /* Look for branches to outside of this section. */
11624 local_syms = NULL;
11625 htab = ppc_hash_table (info);
11626 if (htab == NULL)
11627 return -1;
11628
11629 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11630 {
11631 enum elf_ppc64_reloc_type r_type;
11632 unsigned long r_symndx;
11633 struct elf_link_hash_entry *h;
11634 struct ppc_link_hash_entry *eh;
11635 Elf_Internal_Sym *sym;
11636 asection *sym_sec;
11637 struct _opd_sec_data *opd;
11638 bfd_vma sym_value;
11639 bfd_vma dest;
11640
11641 r_type = ELF64_R_TYPE (rel->r_info);
11642 if (r_type != R_PPC64_REL24
11643 && r_type != R_PPC64_REL14
11644 && r_type != R_PPC64_REL14_BRTAKEN
11645 && r_type != R_PPC64_REL14_BRNTAKEN)
11646 continue;
11647
11648 r_symndx = ELF64_R_SYM (rel->r_info);
11649 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11650 isec->owner))
11651 {
11652 ret = -1;
11653 break;
11654 }
11655
11656 /* Calls to dynamic lib functions go through a plt call stub
11657 that uses r2. */
11658 eh = (struct ppc_link_hash_entry *) h;
11659 if (eh != NULL
11660 && (eh->elf.plt.plist != NULL
11661 || (eh->oh != NULL
11662 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11663 {
11664 ret = 1;
11665 break;
11666 }
11667
11668 if (sym_sec == NULL)
11669 /* Ignore other undefined symbols. */
11670 continue;
11671
11672 /* Assume branches to other sections not included in the
11673 link need stubs too, to cover -R and absolute syms. */
11674 if (sym_sec->output_section == NULL)
11675 {
11676 ret = 1;
11677 break;
11678 }
11679
11680 if (h == NULL)
11681 sym_value = sym->st_value;
11682 else
11683 {
11684 if (h->root.type != bfd_link_hash_defined
11685 && h->root.type != bfd_link_hash_defweak)
11686 abort ();
11687 sym_value = h->root.u.def.value;
11688 }
11689 sym_value += rel->r_addend;
11690
11691 /* If this branch reloc uses an opd sym, find the code section. */
11692 opd = get_opd_info (sym_sec);
11693 if (opd != NULL)
11694 {
11695 if (h == NULL && opd->adjust != NULL)
11696 {
11697 long adjust;
11698
11699 adjust = opd->adjust[OPD_NDX (sym_value)];
11700 if (adjust == -1)
11701 /* Assume deleted functions won't ever be called. */
11702 continue;
11703 sym_value += adjust;
11704 }
11705
11706 dest = opd_entry_value (sym_sec, sym_value,
11707 &sym_sec, NULL, FALSE);
11708 if (dest == (bfd_vma) -1)
11709 continue;
11710 }
11711 else
11712 dest = (sym_value
11713 + sym_sec->output_offset
11714 + sym_sec->output_section->vma);
11715
11716 /* Ignore branch to self. */
11717 if (sym_sec == isec)
11718 continue;
11719
11720 /* If the called function uses the toc, we need a stub. */
11721 if (sym_sec->has_toc_reloc
11722 || sym_sec->makes_toc_func_call)
11723 {
11724 ret = 1;
11725 break;
11726 }
11727
11728 /* Assume any branch that needs a long branch stub might in fact
11729 need a plt_branch stub. A plt_branch stub uses r2. */
11730 else if (dest - (isec->output_offset
11731 + isec->output_section->vma
11732 + rel->r_offset) + (1 << 25)
11733 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11734 ? h->other
11735 : sym->st_other))
11736 {
11737 ret = 1;
11738 break;
11739 }
11740
11741 /* If calling back to a section in the process of being
11742 tested, we can't say for sure that no toc adjusting stubs
11743 are needed, so don't return zero. */
11744 else if (sym_sec->call_check_in_progress)
11745 ret = 2;
11746
11747 /* Branches to another section that itself doesn't have any TOC
11748 references are OK. Recursively call ourselves to check. */
11749 else if (!sym_sec->call_check_done)
11750 {
11751 int recur;
11752
11753 /* Mark current section as indeterminate, so that other
11754 sections that call back to current won't be marked as
11755 known. */
11756 isec->call_check_in_progress = 1;
11757 recur = toc_adjusting_stub_needed (info, sym_sec);
11758 isec->call_check_in_progress = 0;
11759
11760 if (recur != 0)
11761 {
11762 ret = recur;
11763 if (recur != 2)
11764 break;
11765 }
11766 }
11767 }
11768
11769 if (local_syms != NULL
11770 && (elf_symtab_hdr (isec->owner).contents
11771 != (unsigned char *) local_syms))
11772 free (local_syms);
11773 if (elf_section_data (isec)->relocs != relstart)
11774 free (relstart);
11775 }
11776
11777 if ((ret & 1) == 0
11778 && isec->map_head.s != NULL
11779 && (strcmp (isec->output_section->name, ".init") == 0
11780 || strcmp (isec->output_section->name, ".fini") == 0))
11781 {
11782 if (isec->map_head.s->has_toc_reloc
11783 || isec->map_head.s->makes_toc_func_call)
11784 ret = 1;
11785 else if (!isec->map_head.s->call_check_done)
11786 {
11787 int recur;
11788 isec->call_check_in_progress = 1;
11789 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11790 isec->call_check_in_progress = 0;
11791 if (recur != 0)
11792 ret = recur;
11793 }
11794 }
11795
11796 if (ret == 1)
11797 isec->makes_toc_func_call = 1;
11798
11799 return ret;
11800 }
11801
11802 /* The linker repeatedly calls this function for each input section,
11803 in the order that input sections are linked into output sections.
11804 Build lists of input sections to determine groupings between which
11805 we may insert linker stubs. */
11806
11807 bfd_boolean
11808 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11809 {
11810 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11811
11812 if (htab == NULL)
11813 return FALSE;
11814
11815 if ((isec->output_section->flags & SEC_CODE) != 0
11816 && isec->output_section->id < htab->sec_info_arr_size)
11817 {
11818 /* This happens to make the list in reverse order,
11819 which is what we want. */
11820 htab->sec_info[isec->id].u.list
11821 = htab->sec_info[isec->output_section->id].u.list;
11822 htab->sec_info[isec->output_section->id].u.list = isec;
11823 }
11824
11825 if (htab->multi_toc_needed)
11826 {
11827 /* Analyse sections that aren't already flagged as needing a
11828 valid toc pointer. Exclude .fixup for the linux kernel.
11829 .fixup contains branches, but only back to the function that
11830 hit an exception. */
11831 if (!(isec->has_toc_reloc
11832 || (isec->flags & SEC_CODE) == 0
11833 || strcmp (isec->name, ".fixup") == 0
11834 || isec->call_check_done))
11835 {
11836 if (toc_adjusting_stub_needed (info, isec) < 0)
11837 return FALSE;
11838 }
11839 /* Make all sections use the TOC assigned for this object file.
11840 This will be wrong for pasted sections; We fix that in
11841 check_pasted_section(). */
11842 if (elf_gp (isec->owner) != 0)
11843 htab->toc_curr = elf_gp (isec->owner);
11844 }
11845
11846 htab->sec_info[isec->id].toc_off = htab->toc_curr;
11847 return TRUE;
11848 }
11849
11850 /* Check that all .init and .fini sections use the same toc, if they
11851 have toc relocs. */
11852
11853 static bfd_boolean
11854 check_pasted_section (struct bfd_link_info *info, const char *name)
11855 {
11856 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11857
11858 if (o != NULL)
11859 {
11860 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11861 bfd_vma toc_off = 0;
11862 asection *i;
11863
11864 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11865 if (i->has_toc_reloc)
11866 {
11867 if (toc_off == 0)
11868 toc_off = htab->sec_info[i->id].toc_off;
11869 else if (toc_off != htab->sec_info[i->id].toc_off)
11870 return FALSE;
11871 }
11872
11873 if (toc_off == 0)
11874 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11875 if (i->makes_toc_func_call)
11876 {
11877 toc_off = htab->sec_info[i->id].toc_off;
11878 break;
11879 }
11880
11881 /* Make sure the whole pasted function uses the same toc offset. */
11882 if (toc_off != 0)
11883 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11884 htab->sec_info[i->id].toc_off = toc_off;
11885 }
11886 return TRUE;
11887 }
11888
11889 bfd_boolean
11890 ppc64_elf_check_init_fini (struct bfd_link_info *info)
11891 {
11892 return (check_pasted_section (info, ".init")
11893 & check_pasted_section (info, ".fini"));
11894 }
11895
11896 /* See whether we can group stub sections together. Grouping stub
11897 sections may result in fewer stubs. More importantly, we need to
11898 put all .init* and .fini* stubs at the beginning of the .init or
11899 .fini output sections respectively, because glibc splits the
11900 _init and _fini functions into multiple parts. Putting a stub in
11901 the middle of a function is not a good idea. */
11902
11903 static bfd_boolean
11904 group_sections (struct bfd_link_info *info,
11905 bfd_size_type stub_group_size,
11906 bfd_boolean stubs_always_before_branch)
11907 {
11908 struct ppc_link_hash_table *htab;
11909 asection *osec;
11910 bfd_size_type stub14_group_size;
11911 bfd_boolean suppress_size_errors;
11912
11913 htab = ppc_hash_table (info);
11914 if (htab == NULL)
11915 return FALSE;
11916
11917 suppress_size_errors = FALSE;
11918 stub14_group_size = stub_group_size >> 10;
11919 if (stub_group_size == 1)
11920 {
11921 /* Default values. */
11922 if (stubs_always_before_branch)
11923 {
11924 stub_group_size = 0x1e00000;
11925 stub14_group_size = 0x7800;
11926 }
11927 else
11928 {
11929 stub_group_size = 0x1c00000;
11930 stub14_group_size = 0x7000;
11931 }
11932 suppress_size_errors = TRUE;
11933 }
11934
11935 for (osec = info->output_bfd->sections; osec != NULL; osec = osec->next)
11936 {
11937 asection *tail;
11938
11939 if (osec->id >= htab->sec_info_arr_size)
11940 continue;
11941
11942 tail = htab->sec_info[osec->id].u.list;
11943 while (tail != NULL)
11944 {
11945 asection *curr;
11946 asection *prev;
11947 bfd_size_type total;
11948 bfd_boolean big_sec;
11949 bfd_vma curr_toc;
11950 struct map_stub *group;
11951
11952 curr = tail;
11953 total = tail->size;
11954 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11955 && ppc64_elf_section_data (tail)->has_14bit_branch
11956 ? stub14_group_size : stub_group_size);
11957 if (big_sec && !suppress_size_errors)
11958 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11959 tail->owner, tail);
11960 curr_toc = htab->sec_info[tail->id].toc_off;
11961
11962 while ((prev = htab->sec_info[curr->id].u.list) != NULL
11963 && ((total += curr->output_offset - prev->output_offset)
11964 < (ppc64_elf_section_data (prev) != NULL
11965 && ppc64_elf_section_data (prev)->has_14bit_branch
11966 ? stub14_group_size : stub_group_size))
11967 && htab->sec_info[prev->id].toc_off == curr_toc)
11968 curr = prev;
11969
11970 /* OK, the size from the start of CURR to the end is less
11971 than stub_group_size and thus can be handled by one stub
11972 section. (or the tail section is itself larger than
11973 stub_group_size, in which case we may be toast.) We
11974 should really be keeping track of the total size of stubs
11975 added here, as stubs contribute to the final output
11976 section size. That's a little tricky, and this way will
11977 only break if stubs added make the total size more than
11978 2^25, ie. for the default stub_group_size, if stubs total
11979 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11980 group = bfd_alloc (curr->owner, sizeof (*group));
11981 if (group == NULL)
11982 return FALSE;
11983 group->link_sec = curr;
11984 group->stub_sec = NULL;
11985 group->needs_save_res = 0;
11986 group->next = htab->group;
11987 htab->group = group;
11988 do
11989 {
11990 prev = htab->sec_info[tail->id].u.list;
11991 /* Set up this stub group. */
11992 htab->sec_info[tail->id].u.group = group;
11993 }
11994 while (tail != curr && (tail = prev) != NULL);
11995
11996 /* But wait, there's more! Input sections up to stub_group_size
11997 bytes before the stub section can be handled by it too.
11998 Don't do this if we have a really large section after the
11999 stubs, as adding more stubs increases the chance that
12000 branches may not reach into the stub section. */
12001 if (!stubs_always_before_branch && !big_sec)
12002 {
12003 total = 0;
12004 while (prev != NULL
12005 && ((total += tail->output_offset - prev->output_offset)
12006 < (ppc64_elf_section_data (prev) != NULL
12007 && ppc64_elf_section_data (prev)->has_14bit_branch
12008 ? stub14_group_size : stub_group_size))
12009 && htab->sec_info[prev->id].toc_off == curr_toc)
12010 {
12011 tail = prev;
12012 prev = htab->sec_info[tail->id].u.list;
12013 htab->sec_info[tail->id].u.group = group;
12014 }
12015 }
12016 tail = prev;
12017 }
12018 }
12019 return TRUE;
12020 }
12021
12022 static const unsigned char glink_eh_frame_cie[] =
12023 {
12024 0, 0, 0, 16, /* length. */
12025 0, 0, 0, 0, /* id. */
12026 1, /* CIE version. */
12027 'z', 'R', 0, /* Augmentation string. */
12028 4, /* Code alignment. */
12029 0x78, /* Data alignment. */
12030 65, /* RA reg. */
12031 1, /* Augmentation size. */
12032 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
12033 DW_CFA_def_cfa, 1, 0, /* def_cfa: r1 offset 0. */
12034 0, 0, 0, 0
12035 };
12036
12037 /* Stripping output sections is normally done before dynamic section
12038 symbols have been allocated. This function is called later, and
12039 handles cases like htab->brlt which is mapped to its own output
12040 section. */
12041
12042 static void
12043 maybe_strip_output (struct bfd_link_info *info, asection *isec)
12044 {
12045 if (isec->size == 0
12046 && isec->output_section->size == 0
12047 && !(isec->output_section->flags & SEC_KEEP)
12048 && !bfd_section_removed_from_list (info->output_bfd,
12049 isec->output_section)
12050 && elf_section_data (isec->output_section)->dynindx == 0)
12051 {
12052 isec->output_section->flags |= SEC_EXCLUDE;
12053 bfd_section_list_remove (info->output_bfd, isec->output_section);
12054 info->output_bfd->section_count--;
12055 }
12056 }
12057
12058 /* Determine and set the size of the stub section for a final link.
12059
12060 The basic idea here is to examine all the relocations looking for
12061 PC-relative calls to a target that is unreachable with a "bl"
12062 instruction. */
12063
12064 bfd_boolean
12065 ppc64_elf_size_stubs (struct bfd_link_info *info)
12066 {
12067 bfd_size_type stub_group_size;
12068 bfd_boolean stubs_always_before_branch;
12069 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12070
12071 if (htab == NULL)
12072 return FALSE;
12073
12074 if (htab->params->plt_thread_safe == -1 && !bfd_link_executable (info))
12075 htab->params->plt_thread_safe = 1;
12076 if (!htab->opd_abi)
12077 htab->params->plt_thread_safe = 0;
12078 else if (htab->params->plt_thread_safe == -1)
12079 {
12080 static const char *const thread_starter[] =
12081 {
12082 "pthread_create",
12083 /* libstdc++ */
12084 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
12085 /* librt */
12086 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
12087 "mq_notify", "create_timer",
12088 /* libanl */
12089 "getaddrinfo_a",
12090 /* libgomp */
12091 "GOMP_parallel",
12092 "GOMP_parallel_start",
12093 "GOMP_parallel_loop_static",
12094 "GOMP_parallel_loop_static_start",
12095 "GOMP_parallel_loop_dynamic",
12096 "GOMP_parallel_loop_dynamic_start",
12097 "GOMP_parallel_loop_guided",
12098 "GOMP_parallel_loop_guided_start",
12099 "GOMP_parallel_loop_runtime",
12100 "GOMP_parallel_loop_runtime_start",
12101 "GOMP_parallel_sections",
12102 "GOMP_parallel_sections_start",
12103 /* libgo */
12104 "__go_go",
12105 };
12106 unsigned i;
12107
12108 for (i = 0; i < ARRAY_SIZE (thread_starter); i++)
12109 {
12110 struct elf_link_hash_entry *h;
12111 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
12112 FALSE, FALSE, TRUE);
12113 htab->params->plt_thread_safe = h != NULL && h->ref_regular;
12114 if (htab->params->plt_thread_safe)
12115 break;
12116 }
12117 }
12118 stubs_always_before_branch = htab->params->group_size < 0;
12119 if (htab->params->group_size < 0)
12120 stub_group_size = -htab->params->group_size;
12121 else
12122 stub_group_size = htab->params->group_size;
12123
12124 if (!group_sections (info, stub_group_size, stubs_always_before_branch))
12125 return FALSE;
12126
12127 while (1)
12128 {
12129 bfd *input_bfd;
12130 unsigned int bfd_indx;
12131 struct map_stub *group;
12132 asection *stub_sec;
12133
12134 htab->stub_iteration += 1;
12135
12136 for (input_bfd = info->input_bfds, bfd_indx = 0;
12137 input_bfd != NULL;
12138 input_bfd = input_bfd->link.next, bfd_indx++)
12139 {
12140 Elf_Internal_Shdr *symtab_hdr;
12141 asection *section;
12142 Elf_Internal_Sym *local_syms = NULL;
12143
12144 if (!is_ppc64_elf (input_bfd))
12145 continue;
12146
12147 /* We'll need the symbol table in a second. */
12148 symtab_hdr = &elf_symtab_hdr (input_bfd);
12149 if (symtab_hdr->sh_info == 0)
12150 continue;
12151
12152 /* Walk over each section attached to the input bfd. */
12153 for (section = input_bfd->sections;
12154 section != NULL;
12155 section = section->next)
12156 {
12157 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
12158
12159 /* If there aren't any relocs, then there's nothing more
12160 to do. */
12161 if ((section->flags & SEC_RELOC) == 0
12162 || (section->flags & SEC_ALLOC) == 0
12163 || (section->flags & SEC_LOAD) == 0
12164 || (section->flags & SEC_CODE) == 0
12165 || section->reloc_count == 0)
12166 continue;
12167
12168 /* If this section is a link-once section that will be
12169 discarded, then don't create any stubs. */
12170 if (section->output_section == NULL
12171 || section->output_section->owner != info->output_bfd)
12172 continue;
12173
12174 /* Get the relocs. */
12175 internal_relocs
12176 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
12177 info->keep_memory);
12178 if (internal_relocs == NULL)
12179 goto error_ret_free_local;
12180
12181 /* Now examine each relocation. */
12182 irela = internal_relocs;
12183 irelaend = irela + section->reloc_count;
12184 for (; irela < irelaend; irela++)
12185 {
12186 enum elf_ppc64_reloc_type r_type;
12187 unsigned int r_indx;
12188 enum ppc_stub_type stub_type;
12189 struct ppc_stub_hash_entry *stub_entry;
12190 asection *sym_sec, *code_sec;
12191 bfd_vma sym_value, code_value;
12192 bfd_vma destination;
12193 unsigned long local_off;
12194 bfd_boolean ok_dest;
12195 struct ppc_link_hash_entry *hash;
12196 struct ppc_link_hash_entry *fdh;
12197 struct elf_link_hash_entry *h;
12198 Elf_Internal_Sym *sym;
12199 char *stub_name;
12200 const asection *id_sec;
12201 struct _opd_sec_data *opd;
12202 struct plt_entry *plt_ent;
12203
12204 r_type = ELF64_R_TYPE (irela->r_info);
12205 r_indx = ELF64_R_SYM (irela->r_info);
12206
12207 if (r_type >= R_PPC64_max)
12208 {
12209 bfd_set_error (bfd_error_bad_value);
12210 goto error_ret_free_internal;
12211 }
12212
12213 /* Only look for stubs on branch instructions. */
12214 if (r_type != R_PPC64_REL24
12215 && r_type != R_PPC64_REL14
12216 && r_type != R_PPC64_REL14_BRTAKEN
12217 && r_type != R_PPC64_REL14_BRNTAKEN)
12218 continue;
12219
12220 /* Now determine the call target, its name, value,
12221 section. */
12222 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12223 r_indx, input_bfd))
12224 goto error_ret_free_internal;
12225 hash = (struct ppc_link_hash_entry *) h;
12226
12227 ok_dest = FALSE;
12228 fdh = NULL;
12229 sym_value = 0;
12230 if (hash == NULL)
12231 {
12232 sym_value = sym->st_value;
12233 ok_dest = TRUE;
12234 }
12235 else if (hash->elf.root.type == bfd_link_hash_defined
12236 || hash->elf.root.type == bfd_link_hash_defweak)
12237 {
12238 sym_value = hash->elf.root.u.def.value;
12239 if (sym_sec->output_section != NULL)
12240 ok_dest = TRUE;
12241 }
12242 else if (hash->elf.root.type == bfd_link_hash_undefweak
12243 || hash->elf.root.type == bfd_link_hash_undefined)
12244 {
12245 /* Recognise an old ABI func code entry sym, and
12246 use the func descriptor sym instead if it is
12247 defined. */
12248 if (hash->elf.root.root.string[0] == '.'
12249 && (fdh = lookup_fdh (hash, htab)) != NULL)
12250 {
12251 if (fdh->elf.root.type == bfd_link_hash_defined
12252 || fdh->elf.root.type == bfd_link_hash_defweak)
12253 {
12254 sym_sec = fdh->elf.root.u.def.section;
12255 sym_value = fdh->elf.root.u.def.value;
12256 if (sym_sec->output_section != NULL)
12257 ok_dest = TRUE;
12258 }
12259 else
12260 fdh = NULL;
12261 }
12262 }
12263 else
12264 {
12265 bfd_set_error (bfd_error_bad_value);
12266 goto error_ret_free_internal;
12267 }
12268
12269 destination = 0;
12270 local_off = 0;
12271 if (ok_dest)
12272 {
12273 sym_value += irela->r_addend;
12274 destination = (sym_value
12275 + sym_sec->output_offset
12276 + sym_sec->output_section->vma);
12277 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12278 ? hash->elf.other
12279 : sym->st_other);
12280 }
12281
12282 code_sec = sym_sec;
12283 code_value = sym_value;
12284 opd = get_opd_info (sym_sec);
12285 if (opd != NULL)
12286 {
12287 bfd_vma dest;
12288
12289 if (hash == NULL && opd->adjust != NULL)
12290 {
12291 long adjust = opd->adjust[OPD_NDX (sym_value)];
12292 if (adjust == -1)
12293 continue;
12294 code_value += adjust;
12295 sym_value += adjust;
12296 }
12297 dest = opd_entry_value (sym_sec, sym_value,
12298 &code_sec, &code_value, FALSE);
12299 if (dest != (bfd_vma) -1)
12300 {
12301 destination = dest;
12302 if (fdh != NULL)
12303 {
12304 /* Fixup old ABI sym to point at code
12305 entry. */
12306 hash->elf.root.type = bfd_link_hash_defweak;
12307 hash->elf.root.u.def.section = code_sec;
12308 hash->elf.root.u.def.value = code_value;
12309 }
12310 }
12311 }
12312
12313 /* Determine what (if any) linker stub is needed. */
12314 plt_ent = NULL;
12315 stub_type = ppc_type_of_stub (section, irela, &hash,
12316 &plt_ent, destination,
12317 local_off);
12318
12319 if (stub_type != ppc_stub_plt_call)
12320 {
12321 /* Check whether we need a TOC adjusting stub.
12322 Since the linker pastes together pieces from
12323 different object files when creating the
12324 _init and _fini functions, it may be that a
12325 call to what looks like a local sym is in
12326 fact a call needing a TOC adjustment. */
12327 if (code_sec != NULL
12328 && code_sec->output_section != NULL
12329 && (htab->sec_info[code_sec->id].toc_off
12330 != htab->sec_info[section->id].toc_off)
12331 && (code_sec->has_toc_reloc
12332 || code_sec->makes_toc_func_call))
12333 stub_type = ppc_stub_long_branch_r2off;
12334 }
12335
12336 if (stub_type == ppc_stub_none)
12337 continue;
12338
12339 /* __tls_get_addr calls might be eliminated. */
12340 if (stub_type != ppc_stub_plt_call
12341 && hash != NULL
12342 && (hash == htab->tls_get_addr
12343 || hash == htab->tls_get_addr_fd)
12344 && section->has_tls_reloc
12345 && irela != internal_relocs)
12346 {
12347 /* Get tls info. */
12348 unsigned char *tls_mask;
12349
12350 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12351 irela - 1, input_bfd))
12352 goto error_ret_free_internal;
12353 if (*tls_mask != 0)
12354 continue;
12355 }
12356
12357 if (stub_type == ppc_stub_plt_call
12358 && irela + 1 < irelaend
12359 && irela[1].r_offset == irela->r_offset + 4
12360 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12361 {
12362 if (!tocsave_find (htab, INSERT,
12363 &local_syms, irela + 1, input_bfd))
12364 goto error_ret_free_internal;
12365 }
12366 else if (stub_type == ppc_stub_plt_call)
12367 stub_type = ppc_stub_plt_call_r2save;
12368
12369 /* Support for grouping stub sections. */
12370 id_sec = htab->sec_info[section->id].u.group->link_sec;
12371
12372 /* Get the name of this stub. */
12373 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12374 if (!stub_name)
12375 goto error_ret_free_internal;
12376
12377 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12378 stub_name, FALSE, FALSE);
12379 if (stub_entry != NULL)
12380 {
12381 /* The proper stub has already been created. */
12382 free (stub_name);
12383 if (stub_type == ppc_stub_plt_call_r2save)
12384 stub_entry->stub_type = stub_type;
12385 continue;
12386 }
12387
12388 stub_entry = ppc_add_stub (stub_name, section, info);
12389 if (stub_entry == NULL)
12390 {
12391 free (stub_name);
12392 error_ret_free_internal:
12393 if (elf_section_data (section)->relocs == NULL)
12394 free (internal_relocs);
12395 error_ret_free_local:
12396 if (local_syms != NULL
12397 && (symtab_hdr->contents
12398 != (unsigned char *) local_syms))
12399 free (local_syms);
12400 return FALSE;
12401 }
12402
12403 stub_entry->stub_type = stub_type;
12404 if (stub_type != ppc_stub_plt_call
12405 && stub_type != ppc_stub_plt_call_r2save)
12406 {
12407 stub_entry->target_value = code_value;
12408 stub_entry->target_section = code_sec;
12409 }
12410 else
12411 {
12412 stub_entry->target_value = sym_value;
12413 stub_entry->target_section = sym_sec;
12414 }
12415 stub_entry->h = hash;
12416 stub_entry->plt_ent = plt_ent;
12417 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12418
12419 if (stub_entry->h != NULL)
12420 htab->stub_globals += 1;
12421 }
12422
12423 /* We're done with the internal relocs, free them. */
12424 if (elf_section_data (section)->relocs != internal_relocs)
12425 free (internal_relocs);
12426 }
12427
12428 if (local_syms != NULL
12429 && symtab_hdr->contents != (unsigned char *) local_syms)
12430 {
12431 if (!info->keep_memory)
12432 free (local_syms);
12433 else
12434 symtab_hdr->contents = (unsigned char *) local_syms;
12435 }
12436 }
12437
12438 /* We may have added some stubs. Find out the new size of the
12439 stub sections. */
12440 for (stub_sec = htab->params->stub_bfd->sections;
12441 stub_sec != NULL;
12442 stub_sec = stub_sec->next)
12443 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12444 {
12445 stub_sec->rawsize = stub_sec->size;
12446 stub_sec->size = 0;
12447 stub_sec->reloc_count = 0;
12448 stub_sec->flags &= ~SEC_RELOC;
12449 }
12450
12451 htab->brlt->size = 0;
12452 htab->brlt->reloc_count = 0;
12453 htab->brlt->flags &= ~SEC_RELOC;
12454 if (htab->relbrlt != NULL)
12455 htab->relbrlt->size = 0;
12456
12457 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12458
12459 for (group = htab->group; group != NULL; group = group->next)
12460 if (group->needs_save_res)
12461 group->stub_sec->size += htab->sfpr->size;
12462
12463 if (info->emitrelocations
12464 && htab->glink != NULL && htab->glink->size != 0)
12465 {
12466 htab->glink->reloc_count = 1;
12467 htab->glink->flags |= SEC_RELOC;
12468 }
12469
12470 if (htab->glink_eh_frame != NULL
12471 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12472 && htab->glink_eh_frame->output_section->size != 0)
12473 {
12474 size_t size = 0, align;
12475
12476 for (stub_sec = htab->params->stub_bfd->sections;
12477 stub_sec != NULL;
12478 stub_sec = stub_sec->next)
12479 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12480 size += 24;
12481 if (htab->glink != NULL && htab->glink->size != 0)
12482 size += 24;
12483 if (size != 0)
12484 size += sizeof (glink_eh_frame_cie);
12485 align = 1;
12486 align <<= htab->glink_eh_frame->output_section->alignment_power;
12487 align -= 1;
12488 size = (size + align) & ~align;
12489 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12490 htab->glink_eh_frame->size = size;
12491 }
12492
12493 if (htab->params->plt_stub_align != 0)
12494 for (stub_sec = htab->params->stub_bfd->sections;
12495 stub_sec != NULL;
12496 stub_sec = stub_sec->next)
12497 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12498 stub_sec->size = ((stub_sec->size
12499 + (1 << htab->params->plt_stub_align) - 1)
12500 & (-1 << htab->params->plt_stub_align));
12501
12502 for (stub_sec = htab->params->stub_bfd->sections;
12503 stub_sec != NULL;
12504 stub_sec = stub_sec->next)
12505 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12506 && stub_sec->rawsize != stub_sec->size)
12507 break;
12508
12509 /* Exit from this loop when no stubs have been added, and no stubs
12510 have changed size. */
12511 if (stub_sec == NULL
12512 && (htab->glink_eh_frame == NULL
12513 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12514 break;
12515
12516 /* Ask the linker to do its stuff. */
12517 (*htab->params->layout_sections_again) ();
12518 }
12519
12520 if (htab->glink_eh_frame != NULL
12521 && htab->glink_eh_frame->size != 0)
12522 {
12523 bfd_vma val;
12524 bfd_byte *p, *last_fde;
12525 size_t last_fde_len, size, align, pad;
12526 asection *stub_sec;
12527
12528 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12529 if (p == NULL)
12530 return FALSE;
12531 htab->glink_eh_frame->contents = p;
12532 last_fde = p;
12533
12534 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12535 /* CIE length (rewrite in case little-endian). */
12536 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12537 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12538 p += sizeof (glink_eh_frame_cie);
12539
12540 for (stub_sec = htab->params->stub_bfd->sections;
12541 stub_sec != NULL;
12542 stub_sec = stub_sec->next)
12543 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12544 {
12545 last_fde = p;
12546 last_fde_len = 20;
12547 /* FDE length. */
12548 bfd_put_32 (htab->elf.dynobj, 20, p);
12549 p += 4;
12550 /* CIE pointer. */
12551 val = p - htab->glink_eh_frame->contents;
12552 bfd_put_32 (htab->elf.dynobj, val, p);
12553 p += 4;
12554 /* Offset to stub section, written later. */
12555 p += 4;
12556 /* stub section size. */
12557 bfd_put_32 (htab->elf.dynobj, stub_sec->size, p);
12558 p += 4;
12559 /* Augmentation. */
12560 p += 1;
12561 /* Pad. */
12562 p += 7;
12563 }
12564 if (htab->glink != NULL && htab->glink->size != 0)
12565 {
12566 last_fde = p;
12567 last_fde_len = 20;
12568 /* FDE length. */
12569 bfd_put_32 (htab->elf.dynobj, 20, p);
12570 p += 4;
12571 /* CIE pointer. */
12572 val = p - htab->glink_eh_frame->contents;
12573 bfd_put_32 (htab->elf.dynobj, val, p);
12574 p += 4;
12575 /* Offset to .glink, written later. */
12576 p += 4;
12577 /* .glink size. */
12578 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12579 p += 4;
12580 /* Augmentation. */
12581 p += 1;
12582
12583 *p++ = DW_CFA_advance_loc + 1;
12584 *p++ = DW_CFA_register;
12585 *p++ = 65;
12586 *p++ = 12;
12587 *p++ = DW_CFA_advance_loc + 4;
12588 *p++ = DW_CFA_restore_extended;
12589 *p++ = 65;
12590 }
12591 /* Subsume any padding into the last FDE if user .eh_frame
12592 sections are aligned more than glink_eh_frame. Otherwise any
12593 zero padding will be seen as a terminator. */
12594 size = p - htab->glink_eh_frame->contents;
12595 align = 1;
12596 align <<= htab->glink_eh_frame->output_section->alignment_power;
12597 align -= 1;
12598 pad = ((size + align) & ~align) - size;
12599 htab->glink_eh_frame->size = size + pad;
12600 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12601 }
12602
12603 maybe_strip_output (info, htab->brlt);
12604 if (htab->glink_eh_frame != NULL)
12605 maybe_strip_output (info, htab->glink_eh_frame);
12606
12607 return TRUE;
12608 }
12609
12610 /* Called after we have determined section placement. If sections
12611 move, we'll be called again. Provide a value for TOCstart. */
12612
12613 bfd_vma
12614 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12615 {
12616 asection *s;
12617 bfd_vma TOCstart, adjust;
12618
12619 if (info != NULL)
12620 {
12621 struct elf_link_hash_entry *h;
12622 struct elf_link_hash_table *htab = elf_hash_table (info);
12623
12624 if (is_elf_hash_table (htab)
12625 && htab->hgot != NULL)
12626 h = htab->hgot;
12627 else
12628 {
12629 h = elf_link_hash_lookup (htab, ".TOC.", FALSE, FALSE, TRUE);
12630 if (is_elf_hash_table (htab))
12631 htab->hgot = h;
12632 }
12633 if (h != NULL
12634 && h->root.type == bfd_link_hash_defined
12635 && !h->root.linker_def
12636 && (!is_elf_hash_table (htab)
12637 || h->def_regular))
12638 {
12639 TOCstart = (h->root.u.def.value - TOC_BASE_OFF
12640 + h->root.u.def.section->output_offset
12641 + h->root.u.def.section->output_section->vma);
12642 _bfd_set_gp_value (obfd, TOCstart);
12643 return TOCstart;
12644 }
12645 }
12646
12647 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12648 order. The TOC starts where the first of these sections starts. */
12649 s = bfd_get_section_by_name (obfd, ".got");
12650 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12651 s = bfd_get_section_by_name (obfd, ".toc");
12652 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12653 s = bfd_get_section_by_name (obfd, ".tocbss");
12654 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12655 s = bfd_get_section_by_name (obfd, ".plt");
12656 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12657 {
12658 /* This may happen for
12659 o references to TOC base (SYM@toc / TOC[tc0]) without a
12660 .toc directive
12661 o bad linker script
12662 o --gc-sections and empty TOC sections
12663
12664 FIXME: Warn user? */
12665
12666 /* Look for a likely section. We probably won't even be
12667 using TOCstart. */
12668 for (s = obfd->sections; s != NULL; s = s->next)
12669 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12670 | SEC_EXCLUDE))
12671 == (SEC_ALLOC | SEC_SMALL_DATA))
12672 break;
12673 if (s == NULL)
12674 for (s = obfd->sections; s != NULL; s = s->next)
12675 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12676 == (SEC_ALLOC | SEC_SMALL_DATA))
12677 break;
12678 if (s == NULL)
12679 for (s = obfd->sections; s != NULL; s = s->next)
12680 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12681 == SEC_ALLOC)
12682 break;
12683 if (s == NULL)
12684 for (s = obfd->sections; s != NULL; s = s->next)
12685 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12686 break;
12687 }
12688
12689 TOCstart = 0;
12690 if (s != NULL)
12691 TOCstart = s->output_section->vma + s->output_offset;
12692
12693 /* Force alignment. */
12694 adjust = TOCstart & (TOC_BASE_ALIGN - 1);
12695 TOCstart -= adjust;
12696 _bfd_set_gp_value (obfd, TOCstart);
12697
12698 if (info != NULL && s != NULL)
12699 {
12700 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12701
12702 if (htab != NULL)
12703 {
12704 if (htab->elf.hgot != NULL)
12705 {
12706 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF - adjust;
12707 htab->elf.hgot->root.u.def.section = s;
12708 }
12709 }
12710 else
12711 {
12712 struct bfd_link_hash_entry *bh = NULL;
12713 _bfd_generic_link_add_one_symbol (info, obfd, ".TOC.", BSF_GLOBAL,
12714 s, TOC_BASE_OFF - adjust,
12715 NULL, FALSE, FALSE, &bh);
12716 }
12717 }
12718 return TOCstart;
12719 }
12720
12721 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12722 write out any global entry stubs. */
12723
12724 static bfd_boolean
12725 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12726 {
12727 struct bfd_link_info *info;
12728 struct ppc_link_hash_table *htab;
12729 struct plt_entry *pent;
12730 asection *s;
12731
12732 if (h->root.type == bfd_link_hash_indirect)
12733 return TRUE;
12734
12735 if (!h->pointer_equality_needed)
12736 return TRUE;
12737
12738 if (h->def_regular)
12739 return TRUE;
12740
12741 info = inf;
12742 htab = ppc_hash_table (info);
12743 if (htab == NULL)
12744 return FALSE;
12745
12746 s = htab->glink;
12747 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12748 if (pent->plt.offset != (bfd_vma) -1
12749 && pent->addend == 0)
12750 {
12751 bfd_byte *p;
12752 asection *plt;
12753 bfd_vma off;
12754
12755 p = s->contents + h->root.u.def.value;
12756 plt = htab->elf.splt;
12757 if (!htab->elf.dynamic_sections_created
12758 || h->dynindx == -1)
12759 plt = htab->elf.iplt;
12760 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12761 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12762
12763 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12764 {
12765 info->callbacks->einfo
12766 (_("%P: linkage table error against `%T'\n"),
12767 h->root.root.string);
12768 bfd_set_error (bfd_error_bad_value);
12769 htab->stub_error = TRUE;
12770 }
12771
12772 htab->stub_count[ppc_stub_global_entry - 1] += 1;
12773 if (htab->params->emit_stub_syms)
12774 {
12775 size_t len = strlen (h->root.root.string);
12776 char *name = bfd_malloc (sizeof "12345678.global_entry." + len);
12777
12778 if (name == NULL)
12779 return FALSE;
12780
12781 sprintf (name, "%08x.global_entry.%s", s->id, h->root.root.string);
12782 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
12783 if (h == NULL)
12784 return FALSE;
12785 if (h->root.type == bfd_link_hash_new)
12786 {
12787 h->root.type = bfd_link_hash_defined;
12788 h->root.u.def.section = s;
12789 h->root.u.def.value = p - s->contents;
12790 h->ref_regular = 1;
12791 h->def_regular = 1;
12792 h->ref_regular_nonweak = 1;
12793 h->forced_local = 1;
12794 h->non_elf = 0;
12795 h->root.linker_def = 1;
12796 }
12797 }
12798
12799 if (PPC_HA (off) != 0)
12800 {
12801 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
12802 p += 4;
12803 }
12804 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
12805 p += 4;
12806 bfd_put_32 (s->owner, MTCTR_R12, p);
12807 p += 4;
12808 bfd_put_32 (s->owner, BCTR, p);
12809 break;
12810 }
12811 return TRUE;
12812 }
12813
12814 /* Build all the stubs associated with the current output file.
12815 The stubs are kept in a hash table attached to the main linker
12816 hash table. This function is called via gldelf64ppc_finish. */
12817
12818 bfd_boolean
12819 ppc64_elf_build_stubs (struct bfd_link_info *info,
12820 char **stats)
12821 {
12822 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12823 struct map_stub *group;
12824 asection *stub_sec;
12825 bfd_byte *p;
12826 int stub_sec_count = 0;
12827
12828 if (htab == NULL)
12829 return FALSE;
12830
12831 /* Allocate memory to hold the linker stubs. */
12832 for (stub_sec = htab->params->stub_bfd->sections;
12833 stub_sec != NULL;
12834 stub_sec = stub_sec->next)
12835 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12836 && stub_sec->size != 0)
12837 {
12838 stub_sec->contents = bfd_zalloc (htab->params->stub_bfd, stub_sec->size);
12839 if (stub_sec->contents == NULL)
12840 return FALSE;
12841 /* We want to check that built size is the same as calculated
12842 size. rawsize is a convenient location to use. */
12843 stub_sec->rawsize = stub_sec->size;
12844 stub_sec->size = 0;
12845 }
12846
12847 if (htab->glink != NULL && htab->glink->size != 0)
12848 {
12849 unsigned int indx;
12850 bfd_vma plt0;
12851
12852 /* Build the .glink plt call stub. */
12853 if (htab->params->emit_stub_syms)
12854 {
12855 struct elf_link_hash_entry *h;
12856 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12857 TRUE, FALSE, FALSE);
12858 if (h == NULL)
12859 return FALSE;
12860 if (h->root.type == bfd_link_hash_new)
12861 {
12862 h->root.type = bfd_link_hash_defined;
12863 h->root.u.def.section = htab->glink;
12864 h->root.u.def.value = 8;
12865 h->ref_regular = 1;
12866 h->def_regular = 1;
12867 h->ref_regular_nonweak = 1;
12868 h->forced_local = 1;
12869 h->non_elf = 0;
12870 h->root.linker_def = 1;
12871 }
12872 }
12873 plt0 = (htab->elf.splt->output_section->vma
12874 + htab->elf.splt->output_offset
12875 - 16);
12876 if (info->emitrelocations)
12877 {
12878 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12879 if (r == NULL)
12880 return FALSE;
12881 r->r_offset = (htab->glink->output_offset
12882 + htab->glink->output_section->vma);
12883 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12884 r->r_addend = plt0;
12885 }
12886 p = htab->glink->contents;
12887 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
12888 bfd_put_64 (htab->glink->owner, plt0, p);
12889 p += 8;
12890 if (htab->opd_abi)
12891 {
12892 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
12893 p += 4;
12894 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12895 p += 4;
12896 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12897 p += 4;
12898 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12899 p += 4;
12900 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
12901 p += 4;
12902 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12903 p += 4;
12904 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12905 p += 4;
12906 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
12907 p += 4;
12908 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12909 p += 4;
12910 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
12911 p += 4;
12912 }
12913 else
12914 {
12915 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
12916 p += 4;
12917 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12918 p += 4;
12919 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12920 p += 4;
12921 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12922 p += 4;
12923 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
12924 p += 4;
12925 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
12926 p += 4;
12927 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12928 p += 4;
12929 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
12930 p += 4;
12931 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12932 p += 4;
12933 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
12934 p += 4;
12935 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12936 p += 4;
12937 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
12938 p += 4;
12939 }
12940 bfd_put_32 (htab->glink->owner, BCTR, p);
12941 p += 4;
12942 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12943 {
12944 bfd_put_32 (htab->glink->owner, NOP, p);
12945 p += 4;
12946 }
12947
12948 /* Build the .glink lazy link call stubs. */
12949 indx = 0;
12950 while (p < htab->glink->contents + htab->glink->rawsize)
12951 {
12952 if (htab->opd_abi)
12953 {
12954 if (indx < 0x8000)
12955 {
12956 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
12957 p += 4;
12958 }
12959 else
12960 {
12961 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
12962 p += 4;
12963 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
12964 p);
12965 p += 4;
12966 }
12967 }
12968 bfd_put_32 (htab->glink->owner,
12969 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
12970 indx++;
12971 p += 4;
12972 }
12973
12974 /* Build .glink global entry stubs. */
12975 if (htab->glink->size > htab->glink->rawsize)
12976 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
12977 }
12978
12979 if (htab->brlt != NULL && htab->brlt->size != 0)
12980 {
12981 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
12982 htab->brlt->size);
12983 if (htab->brlt->contents == NULL)
12984 return FALSE;
12985 }
12986 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
12987 {
12988 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
12989 htab->relbrlt->size);
12990 if (htab->relbrlt->contents == NULL)
12991 return FALSE;
12992 }
12993
12994 /* Build the stubs as directed by the stub hash table. */
12995 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
12996
12997 for (group = htab->group; group != NULL; group = group->next)
12998 if (group->needs_save_res)
12999 {
13000 stub_sec = group->stub_sec;
13001 memcpy (stub_sec->contents + stub_sec->size, htab->sfpr->contents,
13002 htab->sfpr->size);
13003 if (htab->params->emit_stub_syms)
13004 {
13005 unsigned int i;
13006
13007 for (i = 0; i < ARRAY_SIZE (save_res_funcs); i++)
13008 if (!sfpr_define (info, &save_res_funcs[i], stub_sec))
13009 return FALSE;
13010 }
13011 stub_sec->size += htab->sfpr->size;
13012 }
13013
13014 if (htab->relbrlt != NULL)
13015 htab->relbrlt->reloc_count = 0;
13016
13017 if (htab->params->plt_stub_align != 0)
13018 for (stub_sec = htab->params->stub_bfd->sections;
13019 stub_sec != NULL;
13020 stub_sec = stub_sec->next)
13021 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13022 stub_sec->size = ((stub_sec->size
13023 + (1 << htab->params->plt_stub_align) - 1)
13024 & (-1 << htab->params->plt_stub_align));
13025
13026 for (stub_sec = htab->params->stub_bfd->sections;
13027 stub_sec != NULL;
13028 stub_sec = stub_sec->next)
13029 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
13030 {
13031 stub_sec_count += 1;
13032 if (stub_sec->rawsize != stub_sec->size)
13033 break;
13034 }
13035
13036 /* Note that the glink_eh_frame check here is not only testing that
13037 the generated size matched the calculated size but also that
13038 bfd_elf_discard_info didn't make any changes to the section. */
13039 if (stub_sec != NULL
13040 || (htab->glink_eh_frame != NULL
13041 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
13042 {
13043 htab->stub_error = TRUE;
13044 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
13045 }
13046
13047 if (htab->stub_error)
13048 return FALSE;
13049
13050 if (stats != NULL)
13051 {
13052 *stats = bfd_malloc (500);
13053 if (*stats == NULL)
13054 return FALSE;
13055
13056 sprintf (*stats, _("linker stubs in %u group%s\n"
13057 " branch %lu\n"
13058 " toc adjust %lu\n"
13059 " long branch %lu\n"
13060 " long toc adj %lu\n"
13061 " plt call %lu\n"
13062 " plt call toc %lu\n"
13063 " global entry %lu"),
13064 stub_sec_count,
13065 stub_sec_count == 1 ? "" : "s",
13066 htab->stub_count[ppc_stub_long_branch - 1],
13067 htab->stub_count[ppc_stub_long_branch_r2off - 1],
13068 htab->stub_count[ppc_stub_plt_branch - 1],
13069 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
13070 htab->stub_count[ppc_stub_plt_call - 1],
13071 htab->stub_count[ppc_stub_plt_call_r2save - 1],
13072 htab->stub_count[ppc_stub_global_entry - 1]);
13073 }
13074 return TRUE;
13075 }
13076
13077 /* This function undoes the changes made by add_symbol_adjust. */
13078
13079 static bfd_boolean
13080 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
13081 {
13082 struct ppc_link_hash_entry *eh;
13083
13084 if (h->root.type == bfd_link_hash_indirect)
13085 return TRUE;
13086
13087 eh = (struct ppc_link_hash_entry *) h;
13088 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
13089 return TRUE;
13090
13091 eh->elf.root.type = bfd_link_hash_undefined;
13092 return TRUE;
13093 }
13094
13095 void
13096 ppc64_elf_restore_symbols (struct bfd_link_info *info)
13097 {
13098 struct ppc_link_hash_table *htab = ppc_hash_table (info);
13099
13100 if (htab != NULL)
13101 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
13102 }
13103
13104 /* What to do when ld finds relocations against symbols defined in
13105 discarded sections. */
13106
13107 static unsigned int
13108 ppc64_elf_action_discarded (asection *sec)
13109 {
13110 if (strcmp (".opd", sec->name) == 0)
13111 return 0;
13112
13113 if (strcmp (".toc", sec->name) == 0)
13114 return 0;
13115
13116 if (strcmp (".toc1", sec->name) == 0)
13117 return 0;
13118
13119 return _bfd_elf_default_action_discarded (sec);
13120 }
13121
13122 /* The RELOCATE_SECTION function is called by the ELF backend linker
13123 to handle the relocations for a section.
13124
13125 The relocs are always passed as Rela structures; if the section
13126 actually uses Rel structures, the r_addend field will always be
13127 zero.
13128
13129 This function is responsible for adjust the section contents as
13130 necessary, and (if using Rela relocs and generating a
13131 relocatable output file) adjusting the reloc addend as
13132 necessary.
13133
13134 This function does not have to worry about setting the reloc
13135 address or the reloc symbol index.
13136
13137 LOCAL_SYMS is a pointer to the swapped in local symbols.
13138
13139 LOCAL_SECTIONS is an array giving the section in the input file
13140 corresponding to the st_shndx field of each local symbol.
13141
13142 The global hash table entry for the global symbols can be found
13143 via elf_sym_hashes (input_bfd).
13144
13145 When generating relocatable output, this function must handle
13146 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
13147 going to be the section symbol corresponding to the output
13148 section, which means that the addend must be adjusted
13149 accordingly. */
13150
13151 static bfd_boolean
13152 ppc64_elf_relocate_section (bfd *output_bfd,
13153 struct bfd_link_info *info,
13154 bfd *input_bfd,
13155 asection *input_section,
13156 bfd_byte *contents,
13157 Elf_Internal_Rela *relocs,
13158 Elf_Internal_Sym *local_syms,
13159 asection **local_sections)
13160 {
13161 struct ppc_link_hash_table *htab;
13162 Elf_Internal_Shdr *symtab_hdr;
13163 struct elf_link_hash_entry **sym_hashes;
13164 Elf_Internal_Rela *rel;
13165 Elf_Internal_Rela *relend;
13166 Elf_Internal_Rela outrel;
13167 bfd_byte *loc;
13168 struct got_entry **local_got_ents;
13169 bfd_vma TOCstart;
13170 bfd_boolean ret = TRUE;
13171 bfd_boolean is_opd;
13172 /* Assume 'at' branch hints. */
13173 bfd_boolean is_isa_v2 = TRUE;
13174 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
13175
13176 /* Initialize howto table if needed. */
13177 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
13178 ppc_howto_init ();
13179
13180 htab = ppc_hash_table (info);
13181 if (htab == NULL)
13182 return FALSE;
13183
13184 /* Don't relocate stub sections. */
13185 if (input_section->owner == htab->params->stub_bfd)
13186 return TRUE;
13187
13188 BFD_ASSERT (is_ppc64_elf (input_bfd));
13189
13190 local_got_ents = elf_local_got_ents (input_bfd);
13191 TOCstart = elf_gp (output_bfd);
13192 symtab_hdr = &elf_symtab_hdr (input_bfd);
13193 sym_hashes = elf_sym_hashes (input_bfd);
13194 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
13195
13196 rel = relocs;
13197 relend = relocs + input_section->reloc_count;
13198 for (; rel < relend; rel++)
13199 {
13200 enum elf_ppc64_reloc_type r_type;
13201 bfd_vma addend;
13202 bfd_reloc_status_type r;
13203 Elf_Internal_Sym *sym;
13204 asection *sec;
13205 struct elf_link_hash_entry *h_elf;
13206 struct ppc_link_hash_entry *h;
13207 struct ppc_link_hash_entry *fdh;
13208 const char *sym_name;
13209 unsigned long r_symndx, toc_symndx;
13210 bfd_vma toc_addend;
13211 unsigned char tls_mask, tls_gd, tls_type;
13212 unsigned char sym_type;
13213 bfd_vma relocation;
13214 bfd_boolean unresolved_reloc;
13215 bfd_boolean warned;
13216 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
13217 unsigned int insn;
13218 unsigned int mask;
13219 struct ppc_stub_hash_entry *stub_entry;
13220 bfd_vma max_br_offset;
13221 bfd_vma from;
13222 const Elf_Internal_Rela orig_rel = *rel;
13223 reloc_howto_type *howto;
13224 struct reloc_howto_struct alt_howto;
13225
13226 r_type = ELF64_R_TYPE (rel->r_info);
13227 r_symndx = ELF64_R_SYM (rel->r_info);
13228
13229 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
13230 symbol of the previous ADDR64 reloc. The symbol gives us the
13231 proper TOC base to use. */
13232 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
13233 && rel != relocs
13234 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
13235 && is_opd)
13236 r_symndx = ELF64_R_SYM (rel[-1].r_info);
13237
13238 sym = NULL;
13239 sec = NULL;
13240 h_elf = NULL;
13241 sym_name = NULL;
13242 unresolved_reloc = FALSE;
13243 warned = FALSE;
13244
13245 if (r_symndx < symtab_hdr->sh_info)
13246 {
13247 /* It's a local symbol. */
13248 struct _opd_sec_data *opd;
13249
13250 sym = local_syms + r_symndx;
13251 sec = local_sections[r_symndx];
13252 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
13253 sym_type = ELF64_ST_TYPE (sym->st_info);
13254 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
13255 opd = get_opd_info (sec);
13256 if (opd != NULL && opd->adjust != NULL)
13257 {
13258 long adjust = opd->adjust[OPD_NDX (sym->st_value
13259 + rel->r_addend)];
13260 if (adjust == -1)
13261 relocation = 0;
13262 else
13263 {
13264 /* If this is a relocation against the opd section sym
13265 and we have edited .opd, adjust the reloc addend so
13266 that ld -r and ld --emit-relocs output is correct.
13267 If it is a reloc against some other .opd symbol,
13268 then the symbol value will be adjusted later. */
13269 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
13270 rel->r_addend += adjust;
13271 else
13272 relocation += adjust;
13273 }
13274 }
13275 }
13276 else
13277 {
13278 bfd_boolean ignored;
13279
13280 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
13281 r_symndx, symtab_hdr, sym_hashes,
13282 h_elf, sec, relocation,
13283 unresolved_reloc, warned, ignored);
13284 sym_name = h_elf->root.root.string;
13285 sym_type = h_elf->type;
13286 if (sec != NULL
13287 && sec->owner == output_bfd
13288 && strcmp (sec->name, ".opd") == 0)
13289 {
13290 /* This is a symbol defined in a linker script. All
13291 such are defined in output sections, even those
13292 defined by simple assignment from a symbol defined in
13293 an input section. Transfer the symbol to an
13294 appropriate input .opd section, so that a branch to
13295 this symbol will be mapped to the location specified
13296 by the opd entry. */
13297 struct bfd_link_order *lo;
13298 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13299 if (lo->type == bfd_indirect_link_order)
13300 {
13301 asection *isec = lo->u.indirect.section;
13302 if (h_elf->root.u.def.value >= isec->output_offset
13303 && h_elf->root.u.def.value < (isec->output_offset
13304 + isec->size))
13305 {
13306 h_elf->root.u.def.value -= isec->output_offset;
13307 h_elf->root.u.def.section = isec;
13308 sec = isec;
13309 break;
13310 }
13311 }
13312 }
13313 }
13314 h = (struct ppc_link_hash_entry *) h_elf;
13315
13316 if (sec != NULL && discarded_section (sec))
13317 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
13318 rel, 1, relend,
13319 ppc64_elf_howto_table[r_type], 0,
13320 contents);
13321
13322 if (bfd_link_relocatable (info))
13323 continue;
13324
13325 if (h != NULL && &h->elf == htab->elf.hgot)
13326 {
13327 relocation = TOCstart + htab->sec_info[input_section->id].toc_off;
13328 sec = bfd_abs_section_ptr;
13329 unresolved_reloc = FALSE;
13330 }
13331
13332 /* TLS optimizations. Replace instruction sequences and relocs
13333 based on information we collected in tls_optimize. We edit
13334 RELOCS so that --emit-relocs will output something sensible
13335 for the final instruction stream. */
13336 tls_mask = 0;
13337 tls_gd = 0;
13338 toc_symndx = 0;
13339 if (h != NULL)
13340 tls_mask = h->tls_mask;
13341 else if (local_got_ents != NULL)
13342 {
13343 struct plt_entry **local_plt = (struct plt_entry **)
13344 (local_got_ents + symtab_hdr->sh_info);
13345 unsigned char *lgot_masks = (unsigned char *)
13346 (local_plt + symtab_hdr->sh_info);
13347 tls_mask = lgot_masks[r_symndx];
13348 }
13349 if (tls_mask == 0
13350 && (r_type == R_PPC64_TLS
13351 || r_type == R_PPC64_TLSGD
13352 || r_type == R_PPC64_TLSLD))
13353 {
13354 /* Check for toc tls entries. */
13355 unsigned char *toc_tls;
13356
13357 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13358 &local_syms, rel, input_bfd))
13359 return FALSE;
13360
13361 if (toc_tls)
13362 tls_mask = *toc_tls;
13363 }
13364
13365 /* Check that tls relocs are used with tls syms, and non-tls
13366 relocs are used with non-tls syms. */
13367 if (r_symndx != STN_UNDEF
13368 && r_type != R_PPC64_NONE
13369 && (h == NULL
13370 || h->elf.root.type == bfd_link_hash_defined
13371 || h->elf.root.type == bfd_link_hash_defweak)
13372 && (IS_PPC64_TLS_RELOC (r_type)
13373 != (sym_type == STT_TLS
13374 || (sym_type == STT_SECTION
13375 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13376 {
13377 if (tls_mask != 0
13378 && (r_type == R_PPC64_TLS
13379 || r_type == R_PPC64_TLSGD
13380 || r_type == R_PPC64_TLSLD))
13381 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13382 ;
13383 else
13384 info->callbacks->einfo
13385 (!IS_PPC64_TLS_RELOC (r_type)
13386 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13387 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13388 input_bfd, input_section, rel->r_offset,
13389 ppc64_elf_howto_table[r_type]->name,
13390 sym_name);
13391 }
13392
13393 /* Ensure reloc mapping code below stays sane. */
13394 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13395 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13396 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13397 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13398 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13399 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13400 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13401 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13402 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13403 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13404 abort ();
13405
13406 switch (r_type)
13407 {
13408 default:
13409 break;
13410
13411 case R_PPC64_LO_DS_OPT:
13412 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13413 if ((insn & (0x3f << 26)) != 58u << 26)
13414 abort ();
13415 insn += (14u << 26) - (58u << 26);
13416 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13417 r_type = R_PPC64_TOC16_LO;
13418 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13419 break;
13420
13421 case R_PPC64_TOC16:
13422 case R_PPC64_TOC16_LO:
13423 case R_PPC64_TOC16_DS:
13424 case R_PPC64_TOC16_LO_DS:
13425 {
13426 /* Check for toc tls entries. */
13427 unsigned char *toc_tls;
13428 int retval;
13429
13430 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13431 &local_syms, rel, input_bfd);
13432 if (retval == 0)
13433 return FALSE;
13434
13435 if (toc_tls)
13436 {
13437 tls_mask = *toc_tls;
13438 if (r_type == R_PPC64_TOC16_DS
13439 || r_type == R_PPC64_TOC16_LO_DS)
13440 {
13441 if (tls_mask != 0
13442 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13443 goto toctprel;
13444 }
13445 else
13446 {
13447 /* If we found a GD reloc pair, then we might be
13448 doing a GD->IE transition. */
13449 if (retval == 2)
13450 {
13451 tls_gd = TLS_TPRELGD;
13452 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13453 goto tls_ldgd_opt;
13454 }
13455 else if (retval == 3)
13456 {
13457 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13458 goto tls_ldgd_opt;
13459 }
13460 }
13461 }
13462 }
13463 break;
13464
13465 case R_PPC64_GOT_TPREL16_HI:
13466 case R_PPC64_GOT_TPREL16_HA:
13467 if (tls_mask != 0
13468 && (tls_mask & TLS_TPREL) == 0)
13469 {
13470 rel->r_offset -= d_offset;
13471 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13472 r_type = R_PPC64_NONE;
13473 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13474 }
13475 break;
13476
13477 case R_PPC64_GOT_TPREL16_DS:
13478 case R_PPC64_GOT_TPREL16_LO_DS:
13479 if (tls_mask != 0
13480 && (tls_mask & TLS_TPREL) == 0)
13481 {
13482 toctprel:
13483 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13484 insn &= 31 << 21;
13485 insn |= 0x3c0d0000; /* addis 0,13,0 */
13486 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13487 r_type = R_PPC64_TPREL16_HA;
13488 if (toc_symndx != 0)
13489 {
13490 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13491 rel->r_addend = toc_addend;
13492 /* We changed the symbol. Start over in order to
13493 get h, sym, sec etc. right. */
13494 rel--;
13495 continue;
13496 }
13497 else
13498 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13499 }
13500 break;
13501
13502 case R_PPC64_TLS:
13503 if (tls_mask != 0
13504 && (tls_mask & TLS_TPREL) == 0)
13505 {
13506 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
13507 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13508 if (insn == 0)
13509 abort ();
13510 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13511 /* Was PPC64_TLS which sits on insn boundary, now
13512 PPC64_TPREL16_LO which is at low-order half-word. */
13513 rel->r_offset += d_offset;
13514 r_type = R_PPC64_TPREL16_LO;
13515 if (toc_symndx != 0)
13516 {
13517 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13518 rel->r_addend = toc_addend;
13519 /* We changed the symbol. Start over in order to
13520 get h, sym, sec etc. right. */
13521 rel--;
13522 continue;
13523 }
13524 else
13525 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13526 }
13527 break;
13528
13529 case R_PPC64_GOT_TLSGD16_HI:
13530 case R_PPC64_GOT_TLSGD16_HA:
13531 tls_gd = TLS_TPRELGD;
13532 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13533 goto tls_gdld_hi;
13534 break;
13535
13536 case R_PPC64_GOT_TLSLD16_HI:
13537 case R_PPC64_GOT_TLSLD16_HA:
13538 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13539 {
13540 tls_gdld_hi:
13541 if ((tls_mask & tls_gd) != 0)
13542 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13543 + R_PPC64_GOT_TPREL16_DS);
13544 else
13545 {
13546 rel->r_offset -= d_offset;
13547 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13548 r_type = R_PPC64_NONE;
13549 }
13550 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13551 }
13552 break;
13553
13554 case R_PPC64_GOT_TLSGD16:
13555 case R_PPC64_GOT_TLSGD16_LO:
13556 tls_gd = TLS_TPRELGD;
13557 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13558 goto tls_ldgd_opt;
13559 break;
13560
13561 case R_PPC64_GOT_TLSLD16:
13562 case R_PPC64_GOT_TLSLD16_LO:
13563 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13564 {
13565 unsigned int insn1, insn2, insn3;
13566 bfd_vma offset;
13567
13568 tls_ldgd_opt:
13569 offset = (bfd_vma) -1;
13570 /* If not using the newer R_PPC64_TLSGD/LD to mark
13571 __tls_get_addr calls, we must trust that the call
13572 stays with its arg setup insns, ie. that the next
13573 reloc is the __tls_get_addr call associated with
13574 the current reloc. Edit both insns. */
13575 if (input_section->has_tls_get_addr_call
13576 && rel + 1 < relend
13577 && branch_reloc_hash_match (input_bfd, rel + 1,
13578 htab->tls_get_addr,
13579 htab->tls_get_addr_fd))
13580 offset = rel[1].r_offset;
13581 /* We read the low GOT_TLS (or TOC16) insn because we
13582 need to keep the destination reg. It may be
13583 something other than the usual r3, and moved to r3
13584 before the call by intervening code. */
13585 insn1 = bfd_get_32 (output_bfd,
13586 contents + rel->r_offset - d_offset);
13587 if ((tls_mask & tls_gd) != 0)
13588 {
13589 /* IE */
13590 insn1 &= (0x1f << 21) | (0x1f << 16);
13591 insn1 |= 58 << 26; /* ld */
13592 insn2 = 0x7c636a14; /* add 3,3,13 */
13593 if (offset != (bfd_vma) -1)
13594 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13595 if ((tls_mask & TLS_EXPLICIT) == 0)
13596 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13597 + R_PPC64_GOT_TPREL16_DS);
13598 else
13599 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13600 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13601 }
13602 else
13603 {
13604 /* LE */
13605 insn1 &= 0x1f << 21;
13606 insn1 |= 0x3c0d0000; /* addis r,13,0 */
13607 insn2 = 0x38630000; /* addi 3,3,0 */
13608 if (tls_gd == 0)
13609 {
13610 /* Was an LD reloc. */
13611 if (toc_symndx)
13612 sec = local_sections[toc_symndx];
13613 for (r_symndx = 0;
13614 r_symndx < symtab_hdr->sh_info;
13615 r_symndx++)
13616 if (local_sections[r_symndx] == sec)
13617 break;
13618 if (r_symndx >= symtab_hdr->sh_info)
13619 r_symndx = STN_UNDEF;
13620 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13621 if (r_symndx != STN_UNDEF)
13622 rel->r_addend -= (local_syms[r_symndx].st_value
13623 + sec->output_offset
13624 + sec->output_section->vma);
13625 }
13626 else if (toc_symndx != 0)
13627 {
13628 r_symndx = toc_symndx;
13629 rel->r_addend = toc_addend;
13630 }
13631 r_type = R_PPC64_TPREL16_HA;
13632 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13633 if (offset != (bfd_vma) -1)
13634 {
13635 rel[1].r_info = ELF64_R_INFO (r_symndx,
13636 R_PPC64_TPREL16_LO);
13637 rel[1].r_offset = offset + d_offset;
13638 rel[1].r_addend = rel->r_addend;
13639 }
13640 }
13641 bfd_put_32 (output_bfd, insn1,
13642 contents + rel->r_offset - d_offset);
13643 if (offset != (bfd_vma) -1)
13644 {
13645 insn3 = bfd_get_32 (output_bfd,
13646 contents + offset + 4);
13647 if (insn3 == NOP
13648 || insn3 == CROR_151515 || insn3 == CROR_313131)
13649 {
13650 rel[1].r_offset += 4;
13651 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13652 insn2 = NOP;
13653 }
13654 bfd_put_32 (output_bfd, insn2, contents + offset);
13655 }
13656 if ((tls_mask & tls_gd) == 0
13657 && (tls_gd == 0 || toc_symndx != 0))
13658 {
13659 /* We changed the symbol. Start over in order
13660 to get h, sym, sec etc. right. */
13661 rel--;
13662 continue;
13663 }
13664 }
13665 break;
13666
13667 case R_PPC64_TLSGD:
13668 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13669 {
13670 unsigned int insn2, insn3;
13671 bfd_vma offset = rel->r_offset;
13672
13673 if ((tls_mask & TLS_TPRELGD) != 0)
13674 {
13675 /* IE */
13676 r_type = R_PPC64_NONE;
13677 insn2 = 0x7c636a14; /* add 3,3,13 */
13678 }
13679 else
13680 {
13681 /* LE */
13682 if (toc_symndx != 0)
13683 {
13684 r_symndx = toc_symndx;
13685 rel->r_addend = toc_addend;
13686 }
13687 r_type = R_PPC64_TPREL16_LO;
13688 rel->r_offset = offset + d_offset;
13689 insn2 = 0x38630000; /* addi 3,3,0 */
13690 }
13691 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13692 /* Zap the reloc on the _tls_get_addr call too. */
13693 BFD_ASSERT (offset == rel[1].r_offset);
13694 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13695 insn3 = bfd_get_32 (output_bfd,
13696 contents + offset + 4);
13697 if (insn3 == NOP
13698 || insn3 == CROR_151515 || insn3 == CROR_313131)
13699 {
13700 rel->r_offset += 4;
13701 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13702 insn2 = NOP;
13703 }
13704 bfd_put_32 (output_bfd, insn2, contents + offset);
13705 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13706 {
13707 rel--;
13708 continue;
13709 }
13710 }
13711 break;
13712
13713 case R_PPC64_TLSLD:
13714 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13715 {
13716 unsigned int insn2, insn3;
13717 bfd_vma offset = rel->r_offset;
13718
13719 if (toc_symndx)
13720 sec = local_sections[toc_symndx];
13721 for (r_symndx = 0;
13722 r_symndx < symtab_hdr->sh_info;
13723 r_symndx++)
13724 if (local_sections[r_symndx] == sec)
13725 break;
13726 if (r_symndx >= symtab_hdr->sh_info)
13727 r_symndx = STN_UNDEF;
13728 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13729 if (r_symndx != STN_UNDEF)
13730 rel->r_addend -= (local_syms[r_symndx].st_value
13731 + sec->output_offset
13732 + sec->output_section->vma);
13733
13734 r_type = R_PPC64_TPREL16_LO;
13735 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13736 rel->r_offset = offset + d_offset;
13737 /* Zap the reloc on the _tls_get_addr call too. */
13738 BFD_ASSERT (offset == rel[1].r_offset);
13739 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13740 insn2 = 0x38630000; /* addi 3,3,0 */
13741 insn3 = bfd_get_32 (output_bfd,
13742 contents + offset + 4);
13743 if (insn3 == NOP
13744 || insn3 == CROR_151515 || insn3 == CROR_313131)
13745 {
13746 rel->r_offset += 4;
13747 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13748 insn2 = NOP;
13749 }
13750 bfd_put_32 (output_bfd, insn2, contents + offset);
13751 rel--;
13752 continue;
13753 }
13754 break;
13755
13756 case R_PPC64_DTPMOD64:
13757 if (rel + 1 < relend
13758 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13759 && rel[1].r_offset == rel->r_offset + 8)
13760 {
13761 if ((tls_mask & TLS_GD) == 0)
13762 {
13763 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13764 if ((tls_mask & TLS_TPRELGD) != 0)
13765 r_type = R_PPC64_TPREL64;
13766 else
13767 {
13768 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13769 r_type = R_PPC64_NONE;
13770 }
13771 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13772 }
13773 }
13774 else
13775 {
13776 if ((tls_mask & TLS_LD) == 0)
13777 {
13778 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13779 r_type = R_PPC64_NONE;
13780 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13781 }
13782 }
13783 break;
13784
13785 case R_PPC64_TPREL64:
13786 if ((tls_mask & TLS_TPREL) == 0)
13787 {
13788 r_type = R_PPC64_NONE;
13789 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13790 }
13791 break;
13792
13793 case R_PPC64_REL16_HA:
13794 /* If we are generating a non-PIC executable, edit
13795 . 0: addis 2,12,.TOC.-0b@ha
13796 . addi 2,2,.TOC.-0b@l
13797 used by ELFv2 global entry points to set up r2, to
13798 . lis 2,.TOC.@ha
13799 . addi 2,2,.TOC.@l
13800 if .TOC. is in range. */
13801 if (!bfd_link_pic (info)
13802 && !info->traditional_format
13803 && h != NULL && &h->elf == htab->elf.hgot
13804 && rel + 1 < relend
13805 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
13806 && rel[1].r_offset == rel->r_offset + 4
13807 && rel[1].r_addend == rel->r_addend + 4
13808 && relocation + 0x80008000 <= 0xffffffff)
13809 {
13810 unsigned int insn1, insn2;
13811 bfd_vma offset = rel->r_offset - d_offset;
13812 insn1 = bfd_get_32 (output_bfd, contents + offset);
13813 insn2 = bfd_get_32 (output_bfd, contents + offset + 4);
13814 if ((insn1 & 0xffff0000) == 0x3c4c0000 /* addis 2,12 */
13815 && (insn2 & 0xffff0000) == 0x38420000 /* addi 2,2 */)
13816 {
13817 r_type = R_PPC64_ADDR16_HA;
13818 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13819 rel->r_addend -= d_offset;
13820 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
13821 rel[1].r_addend -= d_offset + 4;
13822 bfd_put_32 (output_bfd, 0x3c400000, contents + offset);
13823 }
13824 }
13825 break;
13826 }
13827
13828 /* Handle other relocations that tweak non-addend part of insn. */
13829 insn = 0;
13830 max_br_offset = 1 << 25;
13831 addend = rel->r_addend;
13832 reloc_dest = DEST_NORMAL;
13833 switch (r_type)
13834 {
13835 default:
13836 break;
13837
13838 case R_PPC64_TOCSAVE:
13839 if (relocation + addend == (rel->r_offset
13840 + input_section->output_offset
13841 + input_section->output_section->vma)
13842 && tocsave_find (htab, NO_INSERT,
13843 &local_syms, rel, input_bfd))
13844 {
13845 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13846 if (insn == NOP
13847 || insn == CROR_151515 || insn == CROR_313131)
13848 bfd_put_32 (input_bfd,
13849 STD_R2_0R1 + STK_TOC (htab),
13850 contents + rel->r_offset);
13851 }
13852 break;
13853
13854 /* Branch taken prediction relocations. */
13855 case R_PPC64_ADDR14_BRTAKEN:
13856 case R_PPC64_REL14_BRTAKEN:
13857 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13858 /* Fall thru. */
13859
13860 /* Branch not taken prediction relocations. */
13861 case R_PPC64_ADDR14_BRNTAKEN:
13862 case R_PPC64_REL14_BRNTAKEN:
13863 insn |= bfd_get_32 (output_bfd,
13864 contents + rel->r_offset) & ~(0x01 << 21);
13865 /* Fall thru. */
13866
13867 case R_PPC64_REL14:
13868 max_br_offset = 1 << 15;
13869 /* Fall thru. */
13870
13871 case R_PPC64_REL24:
13872 /* Calls to functions with a different TOC, such as calls to
13873 shared objects, need to alter the TOC pointer. This is
13874 done using a linkage stub. A REL24 branching to these
13875 linkage stubs needs to be followed by a nop, as the nop
13876 will be replaced with an instruction to restore the TOC
13877 base pointer. */
13878 fdh = h;
13879 if (h != NULL
13880 && h->oh != NULL
13881 && h->oh->is_func_descriptor)
13882 fdh = ppc_follow_link (h->oh);
13883 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13884 htab);
13885 if (stub_entry != NULL
13886 && (stub_entry->stub_type == ppc_stub_plt_call
13887 || stub_entry->stub_type == ppc_stub_plt_call_r2save
13888 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13889 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
13890 {
13891 bfd_boolean can_plt_call = FALSE;
13892
13893 /* All of these stubs will modify r2, so there must be a
13894 branch and link followed by a nop. The nop is
13895 replaced by an insn to restore r2. */
13896 if (rel->r_offset + 8 <= input_section->size)
13897 {
13898 unsigned long br;
13899
13900 br = bfd_get_32 (input_bfd,
13901 contents + rel->r_offset);
13902 if ((br & 1) != 0)
13903 {
13904 unsigned long nop;
13905
13906 nop = bfd_get_32 (input_bfd,
13907 contents + rel->r_offset + 4);
13908 if (nop == NOP
13909 || nop == CROR_151515 || nop == CROR_313131)
13910 {
13911 if (h != NULL
13912 && (h == htab->tls_get_addr_fd
13913 || h == htab->tls_get_addr)
13914 && htab->params->tls_get_addr_opt)
13915 {
13916 /* Special stub used, leave nop alone. */
13917 }
13918 else
13919 bfd_put_32 (input_bfd,
13920 LD_R2_0R1 + STK_TOC (htab),
13921 contents + rel->r_offset + 4);
13922 can_plt_call = TRUE;
13923 }
13924 }
13925 }
13926
13927 if (!can_plt_call && h != NULL)
13928 {
13929 const char *name = h->elf.root.root.string;
13930
13931 if (*name == '.')
13932 ++name;
13933
13934 if (strncmp (name, "__libc_start_main", 17) == 0
13935 && (name[17] == 0 || name[17] == '@'))
13936 {
13937 /* Allow crt1 branch to go via a toc adjusting
13938 stub. Other calls that never return could do
13939 the same, if we could detect such. */
13940 can_plt_call = TRUE;
13941 }
13942 }
13943
13944 if (!can_plt_call)
13945 {
13946 /* g++ as of 20130507 emits self-calls without a
13947 following nop. This is arguably wrong since we
13948 have conflicting information. On the one hand a
13949 global symbol and on the other a local call
13950 sequence, but don't error for this special case.
13951 It isn't possible to cheaply verify we have
13952 exactly such a call. Allow all calls to the same
13953 section. */
13954 asection *code_sec = sec;
13955
13956 if (get_opd_info (sec) != NULL)
13957 {
13958 bfd_vma off = (relocation + addend
13959 - sec->output_section->vma
13960 - sec->output_offset);
13961
13962 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
13963 }
13964 if (code_sec == input_section)
13965 can_plt_call = TRUE;
13966 }
13967
13968 if (!can_plt_call)
13969 {
13970 if (stub_entry->stub_type == ppc_stub_plt_call
13971 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13972 info->callbacks->einfo
13973 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13974 "recompile with -fPIC\n"),
13975 input_bfd, input_section, rel->r_offset, sym_name);
13976 else
13977 info->callbacks->einfo
13978 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13979 "(-mcmodel=small toc adjust stub)\n"),
13980 input_bfd, input_section, rel->r_offset, sym_name);
13981
13982 bfd_set_error (bfd_error_bad_value);
13983 ret = FALSE;
13984 }
13985
13986 if (can_plt_call
13987 && (stub_entry->stub_type == ppc_stub_plt_call
13988 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
13989 unresolved_reloc = FALSE;
13990 }
13991
13992 if ((stub_entry == NULL
13993 || stub_entry->stub_type == ppc_stub_long_branch
13994 || stub_entry->stub_type == ppc_stub_plt_branch)
13995 && get_opd_info (sec) != NULL)
13996 {
13997 /* The branch destination is the value of the opd entry. */
13998 bfd_vma off = (relocation + addend
13999 - sec->output_section->vma
14000 - sec->output_offset);
14001 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
14002 if (dest != (bfd_vma) -1)
14003 {
14004 relocation = dest;
14005 addend = 0;
14006 reloc_dest = DEST_OPD;
14007 }
14008 }
14009
14010 /* If the branch is out of reach we ought to have a long
14011 branch stub. */
14012 from = (rel->r_offset
14013 + input_section->output_offset
14014 + input_section->output_section->vma);
14015
14016 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
14017 ? fdh->elf.other
14018 : sym->st_other);
14019
14020 if (stub_entry != NULL
14021 && (stub_entry->stub_type == ppc_stub_long_branch
14022 || stub_entry->stub_type == ppc_stub_plt_branch)
14023 && (r_type == R_PPC64_ADDR14_BRTAKEN
14024 || r_type == R_PPC64_ADDR14_BRNTAKEN
14025 || (relocation + addend - from + max_br_offset
14026 < 2 * max_br_offset)))
14027 /* Don't use the stub if this branch is in range. */
14028 stub_entry = NULL;
14029
14030 if (stub_entry != NULL)
14031 {
14032 /* Munge up the value and addend so that we call the stub
14033 rather than the procedure directly. */
14034 asection *stub_sec = stub_entry->group->stub_sec;
14035
14036 if (stub_entry->stub_type == ppc_stub_save_res)
14037 relocation += (stub_sec->output_offset
14038 + stub_sec->output_section->vma
14039 + stub_sec->size - htab->sfpr->size
14040 - htab->sfpr->output_offset
14041 - htab->sfpr->output_section->vma);
14042 else
14043 relocation = (stub_entry->stub_offset
14044 + stub_sec->output_offset
14045 + stub_sec->output_section->vma);
14046 addend = 0;
14047 reloc_dest = DEST_STUB;
14048
14049 if ((stub_entry->stub_type == ppc_stub_plt_call
14050 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14051 && (ALWAYS_EMIT_R2SAVE
14052 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
14053 && rel + 1 < relend
14054 && rel[1].r_offset == rel->r_offset + 4
14055 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
14056 relocation += 4;
14057 }
14058
14059 if (insn != 0)
14060 {
14061 if (is_isa_v2)
14062 {
14063 /* Set 'a' bit. This is 0b00010 in BO field for branch
14064 on CR(BI) insns (BO == 001at or 011at), and 0b01000
14065 for branch on CTR insns (BO == 1a00t or 1a01t). */
14066 if ((insn & (0x14 << 21)) == (0x04 << 21))
14067 insn |= 0x02 << 21;
14068 else if ((insn & (0x14 << 21)) == (0x10 << 21))
14069 insn |= 0x08 << 21;
14070 else
14071 break;
14072 }
14073 else
14074 {
14075 /* Invert 'y' bit if not the default. */
14076 if ((bfd_signed_vma) (relocation + addend - from) < 0)
14077 insn ^= 0x01 << 21;
14078 }
14079
14080 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
14081 }
14082
14083 /* NOP out calls to undefined weak functions.
14084 We can thus call a weak function without first
14085 checking whether the function is defined. */
14086 else if (h != NULL
14087 && h->elf.root.type == bfd_link_hash_undefweak
14088 && h->elf.dynindx == -1
14089 && r_type == R_PPC64_REL24
14090 && relocation == 0
14091 && addend == 0)
14092 {
14093 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
14094 continue;
14095 }
14096 break;
14097 }
14098
14099 /* Set `addend'. */
14100 tls_type = 0;
14101 switch (r_type)
14102 {
14103 default:
14104 info->callbacks->einfo
14105 (_("%P: %B: unknown relocation type %d for `%T'\n"),
14106 input_bfd, (int) r_type, sym_name);
14107
14108 bfd_set_error (bfd_error_bad_value);
14109 ret = FALSE;
14110 continue;
14111
14112 case R_PPC64_NONE:
14113 case R_PPC64_TLS:
14114 case R_PPC64_TLSGD:
14115 case R_PPC64_TLSLD:
14116 case R_PPC64_TOCSAVE:
14117 case R_PPC64_GNU_VTINHERIT:
14118 case R_PPC64_GNU_VTENTRY:
14119 continue;
14120
14121 /* GOT16 relocations. Like an ADDR16 using the symbol's
14122 address in the GOT as relocation value instead of the
14123 symbol's value itself. Also, create a GOT entry for the
14124 symbol and put the symbol value there. */
14125 case R_PPC64_GOT_TLSGD16:
14126 case R_PPC64_GOT_TLSGD16_LO:
14127 case R_PPC64_GOT_TLSGD16_HI:
14128 case R_PPC64_GOT_TLSGD16_HA:
14129 tls_type = TLS_TLS | TLS_GD;
14130 goto dogot;
14131
14132 case R_PPC64_GOT_TLSLD16:
14133 case R_PPC64_GOT_TLSLD16_LO:
14134 case R_PPC64_GOT_TLSLD16_HI:
14135 case R_PPC64_GOT_TLSLD16_HA:
14136 tls_type = TLS_TLS | TLS_LD;
14137 goto dogot;
14138
14139 case R_PPC64_GOT_TPREL16_DS:
14140 case R_PPC64_GOT_TPREL16_LO_DS:
14141 case R_PPC64_GOT_TPREL16_HI:
14142 case R_PPC64_GOT_TPREL16_HA:
14143 tls_type = TLS_TLS | TLS_TPREL;
14144 goto dogot;
14145
14146 case R_PPC64_GOT_DTPREL16_DS:
14147 case R_PPC64_GOT_DTPREL16_LO_DS:
14148 case R_PPC64_GOT_DTPREL16_HI:
14149 case R_PPC64_GOT_DTPREL16_HA:
14150 tls_type = TLS_TLS | TLS_DTPREL;
14151 goto dogot;
14152
14153 case R_PPC64_GOT16:
14154 case R_PPC64_GOT16_LO:
14155 case R_PPC64_GOT16_HI:
14156 case R_PPC64_GOT16_HA:
14157 case R_PPC64_GOT16_DS:
14158 case R_PPC64_GOT16_LO_DS:
14159 dogot:
14160 {
14161 /* Relocation is to the entry for this symbol in the global
14162 offset table. */
14163 asection *got;
14164 bfd_vma *offp;
14165 bfd_vma off;
14166 unsigned long indx = 0;
14167 struct got_entry *ent;
14168
14169 if (tls_type == (TLS_TLS | TLS_LD)
14170 && (h == NULL
14171 || !h->elf.def_dynamic))
14172 ent = ppc64_tlsld_got (input_bfd);
14173 else
14174 {
14175
14176 if (h != NULL)
14177 {
14178 bfd_boolean dyn = htab->elf.dynamic_sections_created;
14179 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, bfd_link_pic (info),
14180 &h->elf)
14181 || (bfd_link_pic (info)
14182 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
14183 /* This is actually a static link, or it is a
14184 -Bsymbolic link and the symbol is defined
14185 locally, or the symbol was forced to be local
14186 because of a version file. */
14187 ;
14188 else
14189 {
14190 BFD_ASSERT (h->elf.dynindx != -1);
14191 indx = h->elf.dynindx;
14192 unresolved_reloc = FALSE;
14193 }
14194 ent = h->elf.got.glist;
14195 }
14196 else
14197 {
14198 if (local_got_ents == NULL)
14199 abort ();
14200 ent = local_got_ents[r_symndx];
14201 }
14202
14203 for (; ent != NULL; ent = ent->next)
14204 if (ent->addend == orig_rel.r_addend
14205 && ent->owner == input_bfd
14206 && ent->tls_type == tls_type)
14207 break;
14208 }
14209
14210 if (ent == NULL)
14211 abort ();
14212 if (ent->is_indirect)
14213 ent = ent->got.ent;
14214 offp = &ent->got.offset;
14215 got = ppc64_elf_tdata (ent->owner)->got;
14216 if (got == NULL)
14217 abort ();
14218
14219 /* The offset must always be a multiple of 8. We use the
14220 least significant bit to record whether we have already
14221 processed this entry. */
14222 off = *offp;
14223 if ((off & 1) != 0)
14224 off &= ~1;
14225 else
14226 {
14227 /* Generate relocs for the dynamic linker, except in
14228 the case of TLSLD where we'll use one entry per
14229 module. */
14230 asection *relgot;
14231 bfd_boolean ifunc;
14232
14233 *offp = off | 1;
14234 relgot = NULL;
14235 ifunc = (h != NULL
14236 ? h->elf.type == STT_GNU_IFUNC
14237 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
14238 if (ifunc)
14239 relgot = htab->elf.irelplt;
14240 else if ((bfd_link_pic (info) || indx != 0)
14241 && (h == NULL
14242 || (tls_type == (TLS_TLS | TLS_LD)
14243 && !h->elf.def_dynamic)
14244 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14245 || h->elf.root.type != bfd_link_hash_undefweak))
14246 relgot = ppc64_elf_tdata (ent->owner)->relgot;
14247 if (relgot != NULL)
14248 {
14249 outrel.r_offset = (got->output_section->vma
14250 + got->output_offset
14251 + off);
14252 outrel.r_addend = addend;
14253 if (tls_type & (TLS_LD | TLS_GD))
14254 {
14255 outrel.r_addend = 0;
14256 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
14257 if (tls_type == (TLS_TLS | TLS_GD))
14258 {
14259 loc = relgot->contents;
14260 loc += (relgot->reloc_count++
14261 * sizeof (Elf64_External_Rela));
14262 bfd_elf64_swap_reloca_out (output_bfd,
14263 &outrel, loc);
14264 outrel.r_offset += 8;
14265 outrel.r_addend = addend;
14266 outrel.r_info
14267 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14268 }
14269 }
14270 else if (tls_type == (TLS_TLS | TLS_DTPREL))
14271 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
14272 else if (tls_type == (TLS_TLS | TLS_TPREL))
14273 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
14274 else if (indx != 0)
14275 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
14276 else
14277 {
14278 if (ifunc)
14279 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14280 else
14281 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14282
14283 /* Write the .got section contents for the sake
14284 of prelink. */
14285 loc = got->contents + off;
14286 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
14287 loc);
14288 }
14289
14290 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
14291 {
14292 outrel.r_addend += relocation;
14293 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
14294 {
14295 if (htab->elf.tls_sec == NULL)
14296 outrel.r_addend = 0;
14297 else
14298 outrel.r_addend -= htab->elf.tls_sec->vma;
14299 }
14300 }
14301 loc = relgot->contents;
14302 loc += (relgot->reloc_count++
14303 * sizeof (Elf64_External_Rela));
14304 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14305 }
14306
14307 /* Init the .got section contents here if we're not
14308 emitting a reloc. */
14309 else
14310 {
14311 relocation += addend;
14312 if (tls_type == (TLS_TLS | TLS_LD))
14313 relocation = 1;
14314 else if (tls_type != 0)
14315 {
14316 if (htab->elf.tls_sec == NULL)
14317 relocation = 0;
14318 else
14319 {
14320 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14321 if (tls_type == (TLS_TLS | TLS_TPREL))
14322 relocation += DTP_OFFSET - TP_OFFSET;
14323 }
14324
14325 if (tls_type == (TLS_TLS | TLS_GD))
14326 {
14327 bfd_put_64 (output_bfd, relocation,
14328 got->contents + off + 8);
14329 relocation = 1;
14330 }
14331 }
14332
14333 bfd_put_64 (output_bfd, relocation,
14334 got->contents + off);
14335 }
14336 }
14337
14338 if (off >= (bfd_vma) -2)
14339 abort ();
14340
14341 relocation = got->output_section->vma + got->output_offset + off;
14342 addend = -(TOCstart + htab->sec_info[input_section->id].toc_off);
14343 }
14344 break;
14345
14346 case R_PPC64_PLT16_HA:
14347 case R_PPC64_PLT16_HI:
14348 case R_PPC64_PLT16_LO:
14349 case R_PPC64_PLT32:
14350 case R_PPC64_PLT64:
14351 /* Relocation is to the entry for this symbol in the
14352 procedure linkage table. */
14353
14354 /* Resolve a PLT reloc against a local symbol directly,
14355 without using the procedure linkage table. */
14356 if (h == NULL)
14357 break;
14358
14359 /* It's possible that we didn't make a PLT entry for this
14360 symbol. This happens when statically linking PIC code,
14361 or when using -Bsymbolic. Go find a match if there is a
14362 PLT entry. */
14363 if (htab->elf.splt != NULL)
14364 {
14365 struct plt_entry *ent;
14366 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
14367 if (ent->plt.offset != (bfd_vma) -1
14368 && ent->addend == orig_rel.r_addend)
14369 {
14370 relocation = (htab->elf.splt->output_section->vma
14371 + htab->elf.splt->output_offset
14372 + ent->plt.offset);
14373 unresolved_reloc = FALSE;
14374 break;
14375 }
14376 }
14377 break;
14378
14379 case R_PPC64_TOC:
14380 /* Relocation value is TOC base. */
14381 relocation = TOCstart;
14382 if (r_symndx == STN_UNDEF)
14383 relocation += htab->sec_info[input_section->id].toc_off;
14384 else if (unresolved_reloc)
14385 ;
14386 else if (sec != NULL && sec->id < htab->sec_info_arr_size)
14387 relocation += htab->sec_info[sec->id].toc_off;
14388 else
14389 unresolved_reloc = TRUE;
14390 goto dodyn;
14391
14392 /* TOC16 relocs. We want the offset relative to the TOC base,
14393 which is the address of the start of the TOC plus 0x8000.
14394 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14395 in this order. */
14396 case R_PPC64_TOC16:
14397 case R_PPC64_TOC16_LO:
14398 case R_PPC64_TOC16_HI:
14399 case R_PPC64_TOC16_DS:
14400 case R_PPC64_TOC16_LO_DS:
14401 case R_PPC64_TOC16_HA:
14402 addend -= TOCstart + htab->sec_info[input_section->id].toc_off;
14403 break;
14404
14405 /* Relocate against the beginning of the section. */
14406 case R_PPC64_SECTOFF:
14407 case R_PPC64_SECTOFF_LO:
14408 case R_PPC64_SECTOFF_HI:
14409 case R_PPC64_SECTOFF_DS:
14410 case R_PPC64_SECTOFF_LO_DS:
14411 case R_PPC64_SECTOFF_HA:
14412 if (sec != NULL)
14413 addend -= sec->output_section->vma;
14414 break;
14415
14416 case R_PPC64_REL16:
14417 case R_PPC64_REL16_LO:
14418 case R_PPC64_REL16_HI:
14419 case R_PPC64_REL16_HA:
14420 break;
14421
14422 case R_PPC64_REL14:
14423 case R_PPC64_REL14_BRNTAKEN:
14424 case R_PPC64_REL14_BRTAKEN:
14425 case R_PPC64_REL24:
14426 break;
14427
14428 case R_PPC64_TPREL16:
14429 case R_PPC64_TPREL16_LO:
14430 case R_PPC64_TPREL16_HI:
14431 case R_PPC64_TPREL16_HA:
14432 case R_PPC64_TPREL16_DS:
14433 case R_PPC64_TPREL16_LO_DS:
14434 case R_PPC64_TPREL16_HIGH:
14435 case R_PPC64_TPREL16_HIGHA:
14436 case R_PPC64_TPREL16_HIGHER:
14437 case R_PPC64_TPREL16_HIGHERA:
14438 case R_PPC64_TPREL16_HIGHEST:
14439 case R_PPC64_TPREL16_HIGHESTA:
14440 if (h != NULL
14441 && h->elf.root.type == bfd_link_hash_undefweak
14442 && h->elf.dynindx == -1)
14443 {
14444 /* Make this relocation against an undefined weak symbol
14445 resolve to zero. This is really just a tweak, since
14446 code using weak externs ought to check that they are
14447 defined before using them. */
14448 bfd_byte *p = contents + rel->r_offset - d_offset;
14449
14450 insn = bfd_get_32 (output_bfd, p);
14451 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14452 if (insn != 0)
14453 bfd_put_32 (output_bfd, insn, p);
14454 break;
14455 }
14456 if (htab->elf.tls_sec != NULL)
14457 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14458 if (bfd_link_pic (info))
14459 /* The TPREL16 relocs shouldn't really be used in shared
14460 libs as they will result in DT_TEXTREL being set, but
14461 support them anyway. */
14462 goto dodyn;
14463 break;
14464
14465 case R_PPC64_DTPREL16:
14466 case R_PPC64_DTPREL16_LO:
14467 case R_PPC64_DTPREL16_HI:
14468 case R_PPC64_DTPREL16_HA:
14469 case R_PPC64_DTPREL16_DS:
14470 case R_PPC64_DTPREL16_LO_DS:
14471 case R_PPC64_DTPREL16_HIGH:
14472 case R_PPC64_DTPREL16_HIGHA:
14473 case R_PPC64_DTPREL16_HIGHER:
14474 case R_PPC64_DTPREL16_HIGHERA:
14475 case R_PPC64_DTPREL16_HIGHEST:
14476 case R_PPC64_DTPREL16_HIGHESTA:
14477 if (htab->elf.tls_sec != NULL)
14478 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14479 break;
14480
14481 case R_PPC64_ADDR64_LOCAL:
14482 addend += PPC64_LOCAL_ENTRY_OFFSET (h != NULL
14483 ? h->elf.other
14484 : sym->st_other);
14485 break;
14486
14487 case R_PPC64_DTPMOD64:
14488 relocation = 1;
14489 addend = 0;
14490 goto dodyn;
14491
14492 case R_PPC64_TPREL64:
14493 if (htab->elf.tls_sec != NULL)
14494 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14495 goto dodyn;
14496
14497 case R_PPC64_DTPREL64:
14498 if (htab->elf.tls_sec != NULL)
14499 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14500 /* Fall thru */
14501
14502 /* Relocations that may need to be propagated if this is a
14503 dynamic object. */
14504 case R_PPC64_REL30:
14505 case R_PPC64_REL32:
14506 case R_PPC64_REL64:
14507 case R_PPC64_ADDR14:
14508 case R_PPC64_ADDR14_BRNTAKEN:
14509 case R_PPC64_ADDR14_BRTAKEN:
14510 case R_PPC64_ADDR16:
14511 case R_PPC64_ADDR16_DS:
14512 case R_PPC64_ADDR16_HA:
14513 case R_PPC64_ADDR16_HI:
14514 case R_PPC64_ADDR16_HIGH:
14515 case R_PPC64_ADDR16_HIGHA:
14516 case R_PPC64_ADDR16_HIGHER:
14517 case R_PPC64_ADDR16_HIGHERA:
14518 case R_PPC64_ADDR16_HIGHEST:
14519 case R_PPC64_ADDR16_HIGHESTA:
14520 case R_PPC64_ADDR16_LO:
14521 case R_PPC64_ADDR16_LO_DS:
14522 case R_PPC64_ADDR24:
14523 case R_PPC64_ADDR32:
14524 case R_PPC64_ADDR64:
14525 case R_PPC64_UADDR16:
14526 case R_PPC64_UADDR32:
14527 case R_PPC64_UADDR64:
14528 dodyn:
14529 if ((input_section->flags & SEC_ALLOC) == 0)
14530 break;
14531
14532 if (NO_OPD_RELOCS && is_opd)
14533 break;
14534
14535 if ((bfd_link_pic (info)
14536 && (h == NULL
14537 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14538 || h->elf.root.type != bfd_link_hash_undefweak)
14539 && (must_be_dyn_reloc (info, r_type)
14540 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
14541 || (ELIMINATE_COPY_RELOCS
14542 && !bfd_link_pic (info)
14543 && h != NULL
14544 && h->elf.dynindx != -1
14545 && !h->elf.non_got_ref
14546 && !h->elf.def_regular)
14547 || (!bfd_link_pic (info)
14548 && (h != NULL
14549 ? h->elf.type == STT_GNU_IFUNC
14550 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
14551 {
14552 bfd_boolean skip, relocate;
14553 asection *sreloc;
14554 bfd_vma out_off;
14555
14556 /* When generating a dynamic object, these relocations
14557 are copied into the output file to be resolved at run
14558 time. */
14559
14560 skip = FALSE;
14561 relocate = FALSE;
14562
14563 out_off = _bfd_elf_section_offset (output_bfd, info,
14564 input_section, rel->r_offset);
14565 if (out_off == (bfd_vma) -1)
14566 skip = TRUE;
14567 else if (out_off == (bfd_vma) -2)
14568 skip = TRUE, relocate = TRUE;
14569 out_off += (input_section->output_section->vma
14570 + input_section->output_offset);
14571 outrel.r_offset = out_off;
14572 outrel.r_addend = rel->r_addend;
14573
14574 /* Optimize unaligned reloc use. */
14575 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14576 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14577 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14578 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14579 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14580 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14581 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14582 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14583 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14584
14585 if (skip)
14586 memset (&outrel, 0, sizeof outrel);
14587 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14588 && !is_opd
14589 && r_type != R_PPC64_TOC)
14590 {
14591 BFD_ASSERT (h->elf.dynindx != -1);
14592 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14593 }
14594 else
14595 {
14596 /* This symbol is local, or marked to become local,
14597 or this is an opd section reloc which must point
14598 at a local function. */
14599 outrel.r_addend += relocation;
14600 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14601 {
14602 if (is_opd && h != NULL)
14603 {
14604 /* Lie about opd entries. This case occurs
14605 when building shared libraries and we
14606 reference a function in another shared
14607 lib. The same thing happens for a weak
14608 definition in an application that's
14609 overridden by a strong definition in a
14610 shared lib. (I believe this is a generic
14611 bug in binutils handling of weak syms.)
14612 In these cases we won't use the opd
14613 entry in this lib. */
14614 unresolved_reloc = FALSE;
14615 }
14616 if (!is_opd
14617 && r_type == R_PPC64_ADDR64
14618 && (h != NULL
14619 ? h->elf.type == STT_GNU_IFUNC
14620 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14621 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14622 else
14623 {
14624 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14625
14626 /* We need to relocate .opd contents for ld.so.
14627 Prelink also wants simple and consistent rules
14628 for relocs. This make all RELATIVE relocs have
14629 *r_offset equal to r_addend. */
14630 relocate = TRUE;
14631 }
14632 }
14633 else
14634 {
14635 long indx = 0;
14636
14637 if (h != NULL
14638 ? h->elf.type == STT_GNU_IFUNC
14639 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14640 {
14641 info->callbacks->einfo
14642 (_("%P: %H: %s for indirect "
14643 "function `%T' unsupported\n"),
14644 input_bfd, input_section, rel->r_offset,
14645 ppc64_elf_howto_table[r_type]->name,
14646 sym_name);
14647 ret = FALSE;
14648 }
14649 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14650 ;
14651 else if (sec == NULL || sec->owner == NULL)
14652 {
14653 bfd_set_error (bfd_error_bad_value);
14654 return FALSE;
14655 }
14656 else
14657 {
14658 asection *osec;
14659
14660 osec = sec->output_section;
14661 indx = elf_section_data (osec)->dynindx;
14662
14663 if (indx == 0)
14664 {
14665 if ((osec->flags & SEC_READONLY) == 0
14666 && htab->elf.data_index_section != NULL)
14667 osec = htab->elf.data_index_section;
14668 else
14669 osec = htab->elf.text_index_section;
14670 indx = elf_section_data (osec)->dynindx;
14671 }
14672 BFD_ASSERT (indx != 0);
14673
14674 /* We are turning this relocation into one
14675 against a section symbol, so subtract out
14676 the output section's address but not the
14677 offset of the input section in the output
14678 section. */
14679 outrel.r_addend -= osec->vma;
14680 }
14681
14682 outrel.r_info = ELF64_R_INFO (indx, r_type);
14683 }
14684 }
14685
14686 sreloc = elf_section_data (input_section)->sreloc;
14687 if (h != NULL
14688 ? h->elf.type == STT_GNU_IFUNC
14689 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14690 sreloc = htab->elf.irelplt;
14691 if (sreloc == NULL)
14692 abort ();
14693
14694 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14695 >= sreloc->size)
14696 abort ();
14697 loc = sreloc->contents;
14698 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14699 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14700
14701 /* If this reloc is against an external symbol, it will
14702 be computed at runtime, so there's no need to do
14703 anything now. However, for the sake of prelink ensure
14704 that the section contents are a known value. */
14705 if (! relocate)
14706 {
14707 unresolved_reloc = FALSE;
14708 /* The value chosen here is quite arbitrary as ld.so
14709 ignores section contents except for the special
14710 case of .opd where the contents might be accessed
14711 before relocation. Choose zero, as that won't
14712 cause reloc overflow. */
14713 relocation = 0;
14714 addend = 0;
14715 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14716 to improve backward compatibility with older
14717 versions of ld. */
14718 if (r_type == R_PPC64_ADDR64)
14719 addend = outrel.r_addend;
14720 /* Adjust pc_relative relocs to have zero in *r_offset. */
14721 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14722 addend = (input_section->output_section->vma
14723 + input_section->output_offset
14724 + rel->r_offset);
14725 }
14726 }
14727 break;
14728
14729 case R_PPC64_COPY:
14730 case R_PPC64_GLOB_DAT:
14731 case R_PPC64_JMP_SLOT:
14732 case R_PPC64_JMP_IREL:
14733 case R_PPC64_RELATIVE:
14734 /* We shouldn't ever see these dynamic relocs in relocatable
14735 files. */
14736 /* Fall through. */
14737
14738 case R_PPC64_PLTGOT16:
14739 case R_PPC64_PLTGOT16_DS:
14740 case R_PPC64_PLTGOT16_HA:
14741 case R_PPC64_PLTGOT16_HI:
14742 case R_PPC64_PLTGOT16_LO:
14743 case R_PPC64_PLTGOT16_LO_DS:
14744 case R_PPC64_PLTREL32:
14745 case R_PPC64_PLTREL64:
14746 /* These ones haven't been implemented yet. */
14747
14748 info->callbacks->einfo
14749 (_("%P: %B: %s is not supported for `%T'\n"),
14750 input_bfd,
14751 ppc64_elf_howto_table[r_type]->name, sym_name);
14752
14753 bfd_set_error (bfd_error_invalid_operation);
14754 ret = FALSE;
14755 continue;
14756 }
14757
14758 /* Multi-instruction sequences that access the TOC can be
14759 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14760 to nop; addi rb,r2,x; */
14761 switch (r_type)
14762 {
14763 default:
14764 break;
14765
14766 case R_PPC64_GOT_TLSLD16_HI:
14767 case R_PPC64_GOT_TLSGD16_HI:
14768 case R_PPC64_GOT_TPREL16_HI:
14769 case R_PPC64_GOT_DTPREL16_HI:
14770 case R_PPC64_GOT16_HI:
14771 case R_PPC64_TOC16_HI:
14772 /* These relocs would only be useful if building up an
14773 offset to later add to r2, perhaps in an indexed
14774 addressing mode instruction. Don't try to optimize.
14775 Unfortunately, the possibility of someone building up an
14776 offset like this or even with the HA relocs, means that
14777 we need to check the high insn when optimizing the low
14778 insn. */
14779 break;
14780
14781 case R_PPC64_GOT_TLSLD16_HA:
14782 case R_PPC64_GOT_TLSGD16_HA:
14783 case R_PPC64_GOT_TPREL16_HA:
14784 case R_PPC64_GOT_DTPREL16_HA:
14785 case R_PPC64_GOT16_HA:
14786 case R_PPC64_TOC16_HA:
14787 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14788 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14789 {
14790 bfd_byte *p = contents + (rel->r_offset & ~3);
14791 bfd_put_32 (input_bfd, NOP, p);
14792 }
14793 break;
14794
14795 case R_PPC64_GOT_TLSLD16_LO:
14796 case R_PPC64_GOT_TLSGD16_LO:
14797 case R_PPC64_GOT_TPREL16_LO_DS:
14798 case R_PPC64_GOT_DTPREL16_LO_DS:
14799 case R_PPC64_GOT16_LO:
14800 case R_PPC64_GOT16_LO_DS:
14801 case R_PPC64_TOC16_LO:
14802 case R_PPC64_TOC16_LO_DS:
14803 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14804 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14805 {
14806 bfd_byte *p = contents + (rel->r_offset & ~3);
14807 insn = bfd_get_32 (input_bfd, p);
14808 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14809 {
14810 /* Transform addic to addi when we change reg. */
14811 insn &= ~((0x3f << 26) | (0x1f << 16));
14812 insn |= (14u << 26) | (2 << 16);
14813 }
14814 else
14815 {
14816 insn &= ~(0x1f << 16);
14817 insn |= 2 << 16;
14818 }
14819 bfd_put_32 (input_bfd, insn, p);
14820 }
14821 break;
14822 }
14823
14824 /* Do any further special processing. */
14825 howto = ppc64_elf_howto_table[(int) r_type];
14826 switch (r_type)
14827 {
14828 default:
14829 break;
14830
14831 case R_PPC64_REL16_HA:
14832 case R_PPC64_ADDR16_HA:
14833 case R_PPC64_ADDR16_HIGHA:
14834 case R_PPC64_ADDR16_HIGHERA:
14835 case R_PPC64_ADDR16_HIGHESTA:
14836 case R_PPC64_TOC16_HA:
14837 case R_PPC64_SECTOFF_HA:
14838 case R_PPC64_TPREL16_HA:
14839 case R_PPC64_TPREL16_HIGHA:
14840 case R_PPC64_TPREL16_HIGHERA:
14841 case R_PPC64_TPREL16_HIGHESTA:
14842 case R_PPC64_DTPREL16_HA:
14843 case R_PPC64_DTPREL16_HIGHA:
14844 case R_PPC64_DTPREL16_HIGHERA:
14845 case R_PPC64_DTPREL16_HIGHESTA:
14846 /* It's just possible that this symbol is a weak symbol
14847 that's not actually defined anywhere. In that case,
14848 'sec' would be NULL, and we should leave the symbol
14849 alone (it will be set to zero elsewhere in the link). */
14850 if (sec == NULL)
14851 break;
14852 /* Fall thru */
14853
14854 case R_PPC64_GOT16_HA:
14855 case R_PPC64_PLTGOT16_HA:
14856 case R_PPC64_PLT16_HA:
14857 case R_PPC64_GOT_TLSGD16_HA:
14858 case R_PPC64_GOT_TLSLD16_HA:
14859 case R_PPC64_GOT_TPREL16_HA:
14860 case R_PPC64_GOT_DTPREL16_HA:
14861 /* Add 0x10000 if sign bit in 0:15 is set.
14862 Bits 0:15 are not used. */
14863 addend += 0x8000;
14864 break;
14865
14866 case R_PPC64_ADDR16_DS:
14867 case R_PPC64_ADDR16_LO_DS:
14868 case R_PPC64_GOT16_DS:
14869 case R_PPC64_GOT16_LO_DS:
14870 case R_PPC64_PLT16_LO_DS:
14871 case R_PPC64_SECTOFF_DS:
14872 case R_PPC64_SECTOFF_LO_DS:
14873 case R_PPC64_TOC16_DS:
14874 case R_PPC64_TOC16_LO_DS:
14875 case R_PPC64_PLTGOT16_DS:
14876 case R_PPC64_PLTGOT16_LO_DS:
14877 case R_PPC64_GOT_TPREL16_DS:
14878 case R_PPC64_GOT_TPREL16_LO_DS:
14879 case R_PPC64_GOT_DTPREL16_DS:
14880 case R_PPC64_GOT_DTPREL16_LO_DS:
14881 case R_PPC64_TPREL16_DS:
14882 case R_PPC64_TPREL16_LO_DS:
14883 case R_PPC64_DTPREL16_DS:
14884 case R_PPC64_DTPREL16_LO_DS:
14885 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14886 mask = 3;
14887 /* If this reloc is against an lq insn, then the value must be
14888 a multiple of 16. This is somewhat of a hack, but the
14889 "correct" way to do this by defining _DQ forms of all the
14890 _DS relocs bloats all reloc switches in this file. It
14891 doesn't seem to make much sense to use any of these relocs
14892 in data, so testing the insn should be safe. */
14893 if ((insn & (0x3f << 26)) == (56u << 26))
14894 mask = 15;
14895 if (((relocation + addend) & mask) != 0)
14896 {
14897 info->callbacks->einfo
14898 (_("%P: %H: error: %s not a multiple of %u\n"),
14899 input_bfd, input_section, rel->r_offset,
14900 howto->name,
14901 mask + 1);
14902 bfd_set_error (bfd_error_bad_value);
14903 ret = FALSE;
14904 continue;
14905 }
14906 break;
14907 }
14908
14909 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14910 because such sections are not SEC_ALLOC and thus ld.so will
14911 not process them. */
14912 if (unresolved_reloc
14913 && !((input_section->flags & SEC_DEBUGGING) != 0
14914 && h->elf.def_dynamic)
14915 && _bfd_elf_section_offset (output_bfd, info, input_section,
14916 rel->r_offset) != (bfd_vma) -1)
14917 {
14918 info->callbacks->einfo
14919 (_("%P: %H: unresolvable %s against `%T'\n"),
14920 input_bfd, input_section, rel->r_offset,
14921 howto->name,
14922 h->elf.root.root.string);
14923 ret = FALSE;
14924 }
14925
14926 /* 16-bit fields in insns mostly have signed values, but a
14927 few insns have 16-bit unsigned values. Really, we should
14928 have different reloc types. */
14929 if (howto->complain_on_overflow != complain_overflow_dont
14930 && howto->dst_mask == 0xffff
14931 && (input_section->flags & SEC_CODE) != 0)
14932 {
14933 enum complain_overflow complain = complain_overflow_signed;
14934
14935 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14936 if ((insn & (0x3f << 26)) == 10u << 26 /* cmpli */)
14937 complain = complain_overflow_bitfield;
14938 else if (howto->rightshift == 0
14939 ? ((insn & (0x3f << 26)) == 28u << 26 /* andi */
14940 || (insn & (0x3f << 26)) == 24u << 26 /* ori */
14941 || (insn & (0x3f << 26)) == 26u << 26 /* xori */)
14942 : ((insn & (0x3f << 26)) == 29u << 26 /* andis */
14943 || (insn & (0x3f << 26)) == 25u << 26 /* oris */
14944 || (insn & (0x3f << 26)) == 27u << 26 /* xoris */))
14945 complain = complain_overflow_unsigned;
14946 if (howto->complain_on_overflow != complain)
14947 {
14948 alt_howto = *howto;
14949 alt_howto.complain_on_overflow = complain;
14950 howto = &alt_howto;
14951 }
14952 }
14953
14954 r = _bfd_final_link_relocate (howto, input_bfd, input_section, contents,
14955 rel->r_offset, relocation, addend);
14956
14957 if (r != bfd_reloc_ok)
14958 {
14959 char *more_info = NULL;
14960 const char *reloc_name = howto->name;
14961
14962 if (reloc_dest != DEST_NORMAL)
14963 {
14964 more_info = bfd_malloc (strlen (reloc_name) + 8);
14965 if (more_info != NULL)
14966 {
14967 strcpy (more_info, reloc_name);
14968 strcat (more_info, (reloc_dest == DEST_OPD
14969 ? " (OPD)" : " (stub)"));
14970 reloc_name = more_info;
14971 }
14972 }
14973
14974 if (r == bfd_reloc_overflow)
14975 {
14976 /* On code like "if (foo) foo();" don't report overflow
14977 on a branch to zero when foo is undefined. */
14978 if (!warned
14979 && (reloc_dest == DEST_STUB
14980 || !(h != NULL
14981 && (h->elf.root.type == bfd_link_hash_undefweak
14982 || h->elf.root.type == bfd_link_hash_undefined)
14983 && is_branch_reloc (r_type))))
14984 {
14985 if (!((*info->callbacks->reloc_overflow)
14986 (info, &h->elf.root, sym_name,
14987 reloc_name, orig_rel.r_addend,
14988 input_bfd, input_section, rel->r_offset)))
14989 return FALSE;
14990 }
14991 }
14992 else
14993 {
14994 info->callbacks->einfo
14995 (_("%P: %H: %s against `%T': error %d\n"),
14996 input_bfd, input_section, rel->r_offset,
14997 reloc_name, sym_name, (int) r);
14998 ret = FALSE;
14999 }
15000 if (more_info != NULL)
15001 free (more_info);
15002 }
15003 }
15004
15005 /* If we're emitting relocations, then shortly after this function
15006 returns, reloc offsets and addends for this section will be
15007 adjusted. Worse, reloc symbol indices will be for the output
15008 file rather than the input. Save a copy of the relocs for
15009 opd_entry_value. */
15010 if (is_opd && (info->emitrelocations || bfd_link_relocatable (info)))
15011 {
15012 bfd_size_type amt;
15013 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
15014 rel = bfd_alloc (input_bfd, amt);
15015 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
15016 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
15017 if (rel == NULL)
15018 return FALSE;
15019 memcpy (rel, relocs, amt);
15020 }
15021 return ret;
15022 }
15023
15024 /* Adjust the value of any local symbols in opd sections. */
15025
15026 static int
15027 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
15028 const char *name ATTRIBUTE_UNUSED,
15029 Elf_Internal_Sym *elfsym,
15030 asection *input_sec,
15031 struct elf_link_hash_entry *h)
15032 {
15033 struct _opd_sec_data *opd;
15034 long adjust;
15035 bfd_vma value;
15036
15037 if (h != NULL)
15038 return 1;
15039
15040 opd = get_opd_info (input_sec);
15041 if (opd == NULL || opd->adjust == NULL)
15042 return 1;
15043
15044 value = elfsym->st_value - input_sec->output_offset;
15045 if (!bfd_link_relocatable (info))
15046 value -= input_sec->output_section->vma;
15047
15048 adjust = opd->adjust[OPD_NDX (value)];
15049 if (adjust == -1)
15050 return 2;
15051
15052 elfsym->st_value += adjust;
15053 return 1;
15054 }
15055
15056 /* Finish up dynamic symbol handling. We set the contents of various
15057 dynamic sections here. */
15058
15059 static bfd_boolean
15060 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
15061 struct bfd_link_info *info,
15062 struct elf_link_hash_entry *h,
15063 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
15064 {
15065 struct ppc_link_hash_table *htab;
15066 struct plt_entry *ent;
15067 Elf_Internal_Rela rela;
15068 bfd_byte *loc;
15069
15070 htab = ppc_hash_table (info);
15071 if (htab == NULL)
15072 return FALSE;
15073
15074 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
15075 if (ent->plt.offset != (bfd_vma) -1)
15076 {
15077 /* This symbol has an entry in the procedure linkage
15078 table. Set it up. */
15079 if (!htab->elf.dynamic_sections_created
15080 || h->dynindx == -1)
15081 {
15082 BFD_ASSERT (h->type == STT_GNU_IFUNC
15083 && h->def_regular
15084 && (h->root.type == bfd_link_hash_defined
15085 || h->root.type == bfd_link_hash_defweak));
15086 rela.r_offset = (htab->elf.iplt->output_section->vma
15087 + htab->elf.iplt->output_offset
15088 + ent->plt.offset);
15089 if (htab->opd_abi)
15090 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
15091 else
15092 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
15093 rela.r_addend = (h->root.u.def.value
15094 + h->root.u.def.section->output_offset
15095 + h->root.u.def.section->output_section->vma
15096 + ent->addend);
15097 loc = (htab->elf.irelplt->contents
15098 + (htab->elf.irelplt->reloc_count++
15099 * sizeof (Elf64_External_Rela)));
15100 }
15101 else
15102 {
15103 rela.r_offset = (htab->elf.splt->output_section->vma
15104 + htab->elf.splt->output_offset
15105 + ent->plt.offset);
15106 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
15107 rela.r_addend = ent->addend;
15108 loc = (htab->elf.srelplt->contents
15109 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
15110 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
15111 }
15112 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15113
15114 if (!htab->opd_abi)
15115 {
15116 if (!h->def_regular)
15117 {
15118 /* Mark the symbol as undefined, rather than as
15119 defined in glink. Leave the value if there were
15120 any relocations where pointer equality matters
15121 (this is a clue for the dynamic linker, to make
15122 function pointer comparisons work between an
15123 application and shared library), otherwise set it
15124 to zero. */
15125 sym->st_shndx = SHN_UNDEF;
15126 if (!h->pointer_equality_needed)
15127 sym->st_value = 0;
15128 else if (!h->ref_regular_nonweak)
15129 {
15130 /* This breaks function pointer comparisons, but
15131 that is better than breaking tests for a NULL
15132 function pointer. */
15133 sym->st_value = 0;
15134 }
15135 }
15136 }
15137 }
15138
15139 if (h->needs_copy)
15140 {
15141 /* This symbol needs a copy reloc. Set it up. */
15142
15143 if (h->dynindx == -1
15144 || (h->root.type != bfd_link_hash_defined
15145 && h->root.type != bfd_link_hash_defweak)
15146 || htab->relbss == NULL)
15147 abort ();
15148
15149 rela.r_offset = (h->root.u.def.value
15150 + h->root.u.def.section->output_section->vma
15151 + h->root.u.def.section->output_offset);
15152 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
15153 rela.r_addend = 0;
15154 loc = htab->relbss->contents;
15155 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
15156 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
15157 }
15158
15159 return TRUE;
15160 }
15161
15162 /* Used to decide how to sort relocs in an optimal manner for the
15163 dynamic linker, before writing them out. */
15164
15165 static enum elf_reloc_type_class
15166 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
15167 const asection *rel_sec,
15168 const Elf_Internal_Rela *rela)
15169 {
15170 enum elf_ppc64_reloc_type r_type;
15171 struct ppc_link_hash_table *htab = ppc_hash_table (info);
15172
15173 if (rel_sec == htab->elf.irelplt)
15174 return reloc_class_ifunc;
15175
15176 r_type = ELF64_R_TYPE (rela->r_info);
15177 switch (r_type)
15178 {
15179 case R_PPC64_RELATIVE:
15180 return reloc_class_relative;
15181 case R_PPC64_JMP_SLOT:
15182 return reloc_class_plt;
15183 case R_PPC64_COPY:
15184 return reloc_class_copy;
15185 default:
15186 return reloc_class_normal;
15187 }
15188 }
15189
15190 /* Finish up the dynamic sections. */
15191
15192 static bfd_boolean
15193 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
15194 struct bfd_link_info *info)
15195 {
15196 struct ppc_link_hash_table *htab;
15197 bfd *dynobj;
15198 asection *sdyn;
15199
15200 htab = ppc_hash_table (info);
15201 if (htab == NULL)
15202 return FALSE;
15203
15204 dynobj = htab->elf.dynobj;
15205 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
15206
15207 if (htab->elf.dynamic_sections_created)
15208 {
15209 Elf64_External_Dyn *dyncon, *dynconend;
15210
15211 if (sdyn == NULL || htab->elf.sgot == NULL)
15212 abort ();
15213
15214 dyncon = (Elf64_External_Dyn *) sdyn->contents;
15215 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
15216 for (; dyncon < dynconend; dyncon++)
15217 {
15218 Elf_Internal_Dyn dyn;
15219 asection *s;
15220
15221 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
15222
15223 switch (dyn.d_tag)
15224 {
15225 default:
15226 continue;
15227
15228 case DT_PPC64_GLINK:
15229 s = htab->glink;
15230 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15231 /* We stupidly defined DT_PPC64_GLINK to be the start
15232 of glink rather than the first entry point, which is
15233 what ld.so needs, and now have a bigger stub to
15234 support automatic multiple TOCs. */
15235 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
15236 break;
15237
15238 case DT_PPC64_OPD:
15239 s = bfd_get_section_by_name (output_bfd, ".opd");
15240 if (s == NULL)
15241 continue;
15242 dyn.d_un.d_ptr = s->vma;
15243 break;
15244
15245 case DT_PPC64_OPT:
15246 if (htab->do_multi_toc && htab->multi_toc_needed)
15247 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
15248 break;
15249
15250 case DT_PPC64_OPDSZ:
15251 s = bfd_get_section_by_name (output_bfd, ".opd");
15252 if (s == NULL)
15253 continue;
15254 dyn.d_un.d_val = s->size;
15255 break;
15256
15257 case DT_PLTGOT:
15258 s = htab->elf.splt;
15259 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15260 break;
15261
15262 case DT_JMPREL:
15263 s = htab->elf.srelplt;
15264 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
15265 break;
15266
15267 case DT_PLTRELSZ:
15268 dyn.d_un.d_val = htab->elf.srelplt->size;
15269 break;
15270
15271 case DT_RELASZ:
15272 /* Don't count procedure linkage table relocs in the
15273 overall reloc count. */
15274 s = htab->elf.srelplt;
15275 if (s == NULL)
15276 continue;
15277 dyn.d_un.d_val -= s->size;
15278 break;
15279
15280 case DT_RELA:
15281 /* We may not be using the standard ELF linker script.
15282 If .rela.plt is the first .rela section, we adjust
15283 DT_RELA to not include it. */
15284 s = htab->elf.srelplt;
15285 if (s == NULL)
15286 continue;
15287 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
15288 continue;
15289 dyn.d_un.d_ptr += s->size;
15290 break;
15291 }
15292
15293 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
15294 }
15295 }
15296
15297 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
15298 {
15299 /* Fill in the first entry in the global offset table.
15300 We use it to hold the link-time TOCbase. */
15301 bfd_put_64 (output_bfd,
15302 elf_gp (output_bfd) + TOC_BASE_OFF,
15303 htab->elf.sgot->contents);
15304
15305 /* Set .got entry size. */
15306 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
15307 }
15308
15309 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
15310 {
15311 /* Set .plt entry size. */
15312 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
15313 = PLT_ENTRY_SIZE (htab);
15314 }
15315
15316 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
15317 brlt ourselves if emitrelocations. */
15318 if (htab->brlt != NULL
15319 && htab->brlt->reloc_count != 0
15320 && !_bfd_elf_link_output_relocs (output_bfd,
15321 htab->brlt,
15322 elf_section_data (htab->brlt)->rela.hdr,
15323 elf_section_data (htab->brlt)->relocs,
15324 NULL))
15325 return FALSE;
15326
15327 if (htab->glink != NULL
15328 && htab->glink->reloc_count != 0
15329 && !_bfd_elf_link_output_relocs (output_bfd,
15330 htab->glink,
15331 elf_section_data (htab->glink)->rela.hdr,
15332 elf_section_data (htab->glink)->relocs,
15333 NULL))
15334 return FALSE;
15335
15336 if (htab->glink_eh_frame != NULL
15337 && htab->glink_eh_frame->size != 0)
15338 {
15339 bfd_vma val;
15340 bfd_byte *p;
15341 asection *stub_sec;
15342
15343 p = htab->glink_eh_frame->contents + sizeof (glink_eh_frame_cie);
15344 for (stub_sec = htab->params->stub_bfd->sections;
15345 stub_sec != NULL;
15346 stub_sec = stub_sec->next)
15347 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
15348 {
15349 /* FDE length. */
15350 p += 4;
15351 /* CIE pointer. */
15352 p += 4;
15353 /* Offset to stub section. */
15354 val = (stub_sec->output_section->vma
15355 + stub_sec->output_offset);
15356 val -= (htab->glink_eh_frame->output_section->vma
15357 + htab->glink_eh_frame->output_offset
15358 + (p - htab->glink_eh_frame->contents));
15359 if (val + 0x80000000 > 0xffffffff)
15360 {
15361 info->callbacks->einfo
15362 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15363 stub_sec->name);
15364 return FALSE;
15365 }
15366 bfd_put_32 (dynobj, val, p);
15367 p += 4;
15368 /* stub section size. */
15369 p += 4;
15370 /* Augmentation. */
15371 p += 1;
15372 /* Pad. */
15373 p += 7;
15374 }
15375 if (htab->glink != NULL && htab->glink->size != 0)
15376 {
15377 /* FDE length. */
15378 p += 4;
15379 /* CIE pointer. */
15380 p += 4;
15381 /* Offset to .glink. */
15382 val = (htab->glink->output_section->vma
15383 + htab->glink->output_offset
15384 + 8);
15385 val -= (htab->glink_eh_frame->output_section->vma
15386 + htab->glink_eh_frame->output_offset
15387 + (p - htab->glink_eh_frame->contents));
15388 if (val + 0x80000000 > 0xffffffff)
15389 {
15390 info->callbacks->einfo
15391 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
15392 htab->glink->name);
15393 return FALSE;
15394 }
15395 bfd_put_32 (dynobj, val, p);
15396 p += 4;
15397 /* .glink size. */
15398 p += 4;
15399 /* Augmentation. */
15400 p += 1;
15401 /* Ops. */
15402 p += 7;
15403 }
15404
15405 if (htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
15406 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
15407 htab->glink_eh_frame,
15408 htab->glink_eh_frame->contents))
15409 return FALSE;
15410 }
15411
15412 /* We need to handle writing out multiple GOT sections ourselves,
15413 since we didn't add them to DYNOBJ. We know dynobj is the first
15414 bfd. */
15415 while ((dynobj = dynobj->link.next) != NULL)
15416 {
15417 asection *s;
15418
15419 if (!is_ppc64_elf (dynobj))
15420 continue;
15421
15422 s = ppc64_elf_tdata (dynobj)->got;
15423 if (s != NULL
15424 && s->size != 0
15425 && s->output_section != bfd_abs_section_ptr
15426 && !bfd_set_section_contents (output_bfd, s->output_section,
15427 s->contents, s->output_offset,
15428 s->size))
15429 return FALSE;
15430 s = ppc64_elf_tdata (dynobj)->relgot;
15431 if (s != NULL
15432 && s->size != 0
15433 && s->output_section != bfd_abs_section_ptr
15434 && !bfd_set_section_contents (output_bfd, s->output_section,
15435 s->contents, s->output_offset,
15436 s->size))
15437 return FALSE;
15438 }
15439
15440 return TRUE;
15441 }
15442
15443 #include "elf64-target.h"
15444
15445 /* FreeBSD support */
15446
15447 #undef TARGET_LITTLE_SYM
15448 #undef TARGET_LITTLE_NAME
15449
15450 #undef TARGET_BIG_SYM
15451 #define TARGET_BIG_SYM powerpc_elf64_fbsd_vec
15452 #undef TARGET_BIG_NAME
15453 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15454
15455 #undef ELF_OSABI
15456 #define ELF_OSABI ELFOSABI_FREEBSD
15457
15458 #undef elf64_bed
15459 #define elf64_bed elf64_powerpc_fbsd_bed
15460
15461 #include "elf64-target.h"
15462