Add Doxygen support to GDB
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008,
3 2009, 2010, 2011, 2012 Free Software Foundation, Inc.
4 Written by Linus Nordberg, Swox AB <info@swox.com>,
5 based on elf32-ppc.c by Ian Lance Taylor.
6 Largely rewritten by Alan Modra.
7
8 This file is part of BFD, the Binary File Descriptor library.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License along
21 with this program; if not, write to the Free Software Foundation, Inc.,
22 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23
24
25 /* The 64-bit PowerPC ELF ABI may be found at
26 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
27 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
28
29 #include "sysdep.h"
30 #include <stdarg.h>
31 #include "bfd.h"
32 #include "bfdlink.h"
33 #include "libbfd.h"
34 #include "elf-bfd.h"
35 #include "elf/ppc64.h"
36 #include "elf64-ppc.h"
37 #include "dwarf2.h"
38
39 static bfd_reloc_status_type ppc64_elf_ha_reloc
40 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
41 static bfd_reloc_status_type ppc64_elf_branch_reloc
42 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
43 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
44 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
45 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
46 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
47 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
48 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
49 static bfd_reloc_status_type ppc64_elf_toc_reloc
50 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
51 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
52 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
53 static bfd_reloc_status_type ppc64_elf_toc64_reloc
54 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
55 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_vma opd_entry_value
58 (asection *, bfd_vma, asection **, bfd_vma *, bfd_boolean);
59
60 #define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
61 #define TARGET_LITTLE_NAME "elf64-powerpcle"
62 #define TARGET_BIG_SYM bfd_elf64_powerpc_vec
63 #define TARGET_BIG_NAME "elf64-powerpc"
64 #define ELF_ARCH bfd_arch_powerpc
65 #define ELF_TARGET_ID PPC64_ELF_DATA
66 #define ELF_MACHINE_CODE EM_PPC64
67 #define ELF_MAXPAGESIZE 0x10000
68 #define ELF_COMMONPAGESIZE 0x1000
69 #define elf_info_to_howto ppc64_elf_info_to_howto
70
71 #define elf_backend_want_got_sym 0
72 #define elf_backend_want_plt_sym 0
73 #define elf_backend_plt_alignment 3
74 #define elf_backend_plt_not_loaded 1
75 #define elf_backend_got_header_size 8
76 #define elf_backend_can_gc_sections 1
77 #define elf_backend_can_refcount 1
78 #define elf_backend_rela_normal 1
79 #define elf_backend_default_execstack 0
80
81 #define bfd_elf64_mkobject ppc64_elf_mkobject
82 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
83 #define bfd_elf64_bfd_reloc_name_lookup ppc64_elf_reloc_name_lookup
84 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
85 #define bfd_elf64_bfd_print_private_bfd_data ppc64_elf_print_private_bfd_data
86 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
87 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
88 #define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
89 #define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
90 #define bfd_elf64_bfd_link_just_syms ppc64_elf_link_just_syms
91
92 #define elf_backend_object_p ppc64_elf_object_p
93 #define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
94 #define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
95 #define elf_backend_write_core_note ppc64_elf_write_core_note
96 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
97 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
98 #define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
99 #define elf_backend_check_directives ppc64_elf_process_dot_syms
100 #define elf_backend_notice_as_needed ppc64_elf_notice_as_needed
101 #define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
102 #define elf_backend_check_relocs ppc64_elf_check_relocs
103 #define elf_backend_gc_keep ppc64_elf_gc_keep
104 #define elf_backend_gc_mark_dynamic_ref ppc64_elf_gc_mark_dynamic_ref
105 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
106 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
107 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
108 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
109 #define elf_backend_maybe_function_sym ppc64_elf_maybe_function_sym
110 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
111 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
112 #define elf_backend_hash_symbol ppc64_elf_hash_symbol
113 #define elf_backend_init_index_section _bfd_elf_init_2_index_sections
114 #define elf_backend_action_discarded ppc64_elf_action_discarded
115 #define elf_backend_relocate_section ppc64_elf_relocate_section
116 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
117 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
118 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
119 #define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
120 #define elf_backend_special_sections ppc64_elf_special_sections
121 #define elf_backend_merge_symbol_attribute ppc64_elf_merge_symbol_attribute
122
123 /* The name of the dynamic interpreter. This is put in the .interp
124 section. */
125 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
126
127 /* The size in bytes of an entry in the procedure linkage table. */
128 #define PLT_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 8)
129
130 /* The initial size of the plt reserved for the dynamic linker. */
131 #define PLT_INITIAL_ENTRY_SIZE(htab) (htab->opd_abi ? 24 : 16)
132
133 /* Offsets to some stack save slots. */
134 #define STK_LR 16
135 #define STK_TOC(htab) (htab->opd_abi ? 40 : 24)
136 /* This one is dodgy. ELFv2 does not have a linker word, so use the
137 CR save slot. Used only by optimised __tls_get_addr call stub,
138 relying on __tls_get_addr_opt not saving CR.. */
139 #define STK_LINKER(htab) (htab->opd_abi ? 32 : 8)
140
141 /* TOC base pointers offset from start of TOC. */
142 #define TOC_BASE_OFF 0x8000
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_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
178 #define LD_R12_0R12 0xe98c0000 /* ld %r12,xxx@l(%r12) */
179
180 /* glink call stub instructions. We enter with the index in R0. */
181 #define GLINK_CALL_STUB_SIZE (16*4)
182 /* 0: */
183 /* .quad plt0-1f */
184 /* __glink: */
185 #define MFLR_R12 0x7d8802a6 /* mflr %12 */
186 #define BCL_20_31 0x429f0005 /* bcl 20,31,1f */
187 /* 1: */
188 #define MFLR_R11 0x7d6802a6 /* mflr %11 */
189 /* ld %2,(0b-1b)(%11) */
190 #define MTLR_R12 0x7d8803a6 /* mtlr %12 */
191 #define ADD_R11_R2_R11 0x7d625a14 /* add %11,%2,%11 */
192 /* ld %12,0(%11) */
193 /* ld %2,8(%11) */
194 /* mtctr %12 */
195 /* ld %11,16(%11) */
196 /* bctr */
197 #define MFLR_R0 0x7c0802a6 /* mflr %r0 */
198 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
199 #define SUB_R12_R12_R11 0x7d8b6050 /* subf %r12,%r11,%r12 */
200 #define ADDI_R0_R12 0x380c0000 /* addi %r0,%r12,0 */
201 #define SRDI_R0_R0_2 0x7800f082 /* rldicl %r0,%r0,62,2 */
202
203 /* Pad with this. */
204 #define NOP 0x60000000
205
206 /* Some other nops. */
207 #define CROR_151515 0x4def7b82
208 #define CROR_313131 0x4ffffb82
209
210 /* .glink entries for the first 32k functions are two instructions. */
211 #define LI_R0_0 0x38000000 /* li %r0,0 */
212 #define B_DOT 0x48000000 /* b . */
213
214 /* After that, we need two instructions to load the index, followed by
215 a branch. */
216 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
217 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
218
219 /* Instructions used by the save and restore reg functions. */
220 #define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
221 #define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
222 #define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
223 #define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
224 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
225 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
226 #define LI_R12_0 0x39800000 /* li %r12,0 */
227 #define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
228 #define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
229 #define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
230 #define BLR 0x4e800020 /* blr */
231
232 /* Since .opd is an array of descriptors and each entry will end up
233 with identical R_PPC64_RELATIVE relocs, there is really no need to
234 propagate .opd relocs; The dynamic linker should be taught to
235 relocate .opd without reloc entries. */
236 #ifndef NO_OPD_RELOCS
237 #define NO_OPD_RELOCS 0
238 #endif
239 \f
240 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
241
242 /* Relocation HOWTO's. */
243 static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
244
245 static reloc_howto_type ppc64_elf_howto_raw[] = {
246 /* This reloc does nothing. */
247 HOWTO (R_PPC64_NONE, /* type */
248 0, /* rightshift */
249 2, /* size (0 = byte, 1 = short, 2 = long) */
250 32, /* bitsize */
251 FALSE, /* pc_relative */
252 0, /* bitpos */
253 complain_overflow_dont, /* complain_on_overflow */
254 bfd_elf_generic_reloc, /* special_function */
255 "R_PPC64_NONE", /* name */
256 FALSE, /* partial_inplace */
257 0, /* src_mask */
258 0, /* dst_mask */
259 FALSE), /* pcrel_offset */
260
261 /* A standard 32 bit relocation. */
262 HOWTO (R_PPC64_ADDR32, /* type */
263 0, /* rightshift */
264 2, /* size (0 = byte, 1 = short, 2 = long) */
265 32, /* bitsize */
266 FALSE, /* pc_relative */
267 0, /* bitpos */
268 complain_overflow_bitfield, /* complain_on_overflow */
269 bfd_elf_generic_reloc, /* special_function */
270 "R_PPC64_ADDR32", /* name */
271 FALSE, /* partial_inplace */
272 0, /* src_mask */
273 0xffffffff, /* dst_mask */
274 FALSE), /* pcrel_offset */
275
276 /* An absolute 26 bit branch; the lower two bits must be zero.
277 FIXME: we don't check that, we just clear them. */
278 HOWTO (R_PPC64_ADDR24, /* type */
279 0, /* rightshift */
280 2, /* size (0 = byte, 1 = short, 2 = long) */
281 26, /* bitsize */
282 FALSE, /* pc_relative */
283 0, /* bitpos */
284 complain_overflow_bitfield, /* complain_on_overflow */
285 bfd_elf_generic_reloc, /* special_function */
286 "R_PPC64_ADDR24", /* name */
287 FALSE, /* partial_inplace */
288 0, /* src_mask */
289 0x03fffffc, /* dst_mask */
290 FALSE), /* pcrel_offset */
291
292 /* A standard 16 bit relocation. */
293 HOWTO (R_PPC64_ADDR16, /* type */
294 0, /* rightshift */
295 1, /* size (0 = byte, 1 = short, 2 = long) */
296 16, /* bitsize */
297 FALSE, /* pc_relative */
298 0, /* bitpos */
299 complain_overflow_bitfield, /* complain_on_overflow */
300 bfd_elf_generic_reloc, /* special_function */
301 "R_PPC64_ADDR16", /* name */
302 FALSE, /* partial_inplace */
303 0, /* src_mask */
304 0xffff, /* dst_mask */
305 FALSE), /* pcrel_offset */
306
307 /* A 16 bit relocation without overflow. */
308 HOWTO (R_PPC64_ADDR16_LO, /* type */
309 0, /* rightshift */
310 1, /* size (0 = byte, 1 = short, 2 = long) */
311 16, /* bitsize */
312 FALSE, /* pc_relative */
313 0, /* bitpos */
314 complain_overflow_dont,/* complain_on_overflow */
315 bfd_elf_generic_reloc, /* special_function */
316 "R_PPC64_ADDR16_LO", /* name */
317 FALSE, /* partial_inplace */
318 0, /* src_mask */
319 0xffff, /* dst_mask */
320 FALSE), /* pcrel_offset */
321
322 /* Bits 16-31 of an address. */
323 HOWTO (R_PPC64_ADDR16_HI, /* type */
324 16, /* rightshift */
325 1, /* size (0 = byte, 1 = short, 2 = long) */
326 16, /* bitsize */
327 FALSE, /* pc_relative */
328 0, /* bitpos */
329 complain_overflow_signed, /* complain_on_overflow */
330 bfd_elf_generic_reloc, /* special_function */
331 "R_PPC64_ADDR16_HI", /* name */
332 FALSE, /* partial_inplace */
333 0, /* src_mask */
334 0xffff, /* dst_mask */
335 FALSE), /* pcrel_offset */
336
337 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
338 bits, treated as a signed number, is negative. */
339 HOWTO (R_PPC64_ADDR16_HA, /* type */
340 16, /* rightshift */
341 1, /* size (0 = byte, 1 = short, 2 = long) */
342 16, /* bitsize */
343 FALSE, /* pc_relative */
344 0, /* bitpos */
345 complain_overflow_signed, /* complain_on_overflow */
346 ppc64_elf_ha_reloc, /* special_function */
347 "R_PPC64_ADDR16_HA", /* name */
348 FALSE, /* partial_inplace */
349 0, /* src_mask */
350 0xffff, /* dst_mask */
351 FALSE), /* pcrel_offset */
352
353 /* An absolute 16 bit branch; the lower two bits must be zero.
354 FIXME: we don't check that, we just clear them. */
355 HOWTO (R_PPC64_ADDR14, /* type */
356 0, /* rightshift */
357 2, /* size (0 = byte, 1 = short, 2 = long) */
358 16, /* bitsize */
359 FALSE, /* pc_relative */
360 0, /* bitpos */
361 complain_overflow_bitfield, /* complain_on_overflow */
362 ppc64_elf_branch_reloc, /* special_function */
363 "R_PPC64_ADDR14", /* name */
364 FALSE, /* partial_inplace */
365 0, /* src_mask */
366 0x0000fffc, /* dst_mask */
367 FALSE), /* pcrel_offset */
368
369 /* An absolute 16 bit branch, for which bit 10 should be set to
370 indicate that the branch is expected to be taken. The lower two
371 bits must be zero. */
372 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
373 0, /* rightshift */
374 2, /* size (0 = byte, 1 = short, 2 = long) */
375 16, /* bitsize */
376 FALSE, /* pc_relative */
377 0, /* bitpos */
378 complain_overflow_bitfield, /* complain_on_overflow */
379 ppc64_elf_brtaken_reloc, /* special_function */
380 "R_PPC64_ADDR14_BRTAKEN",/* name */
381 FALSE, /* partial_inplace */
382 0, /* src_mask */
383 0x0000fffc, /* dst_mask */
384 FALSE), /* pcrel_offset */
385
386 /* An absolute 16 bit branch, for which bit 10 should be set to
387 indicate that the branch is not expected to be taken. The lower
388 two bits must be zero. */
389 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
390 0, /* rightshift */
391 2, /* size (0 = byte, 1 = short, 2 = long) */
392 16, /* bitsize */
393 FALSE, /* pc_relative */
394 0, /* bitpos */
395 complain_overflow_bitfield, /* complain_on_overflow */
396 ppc64_elf_brtaken_reloc, /* special_function */
397 "R_PPC64_ADDR14_BRNTAKEN",/* name */
398 FALSE, /* partial_inplace */
399 0, /* src_mask */
400 0x0000fffc, /* dst_mask */
401 FALSE), /* pcrel_offset */
402
403 /* A relative 26 bit branch; the lower two bits must be zero. */
404 HOWTO (R_PPC64_REL24, /* type */
405 0, /* rightshift */
406 2, /* size (0 = byte, 1 = short, 2 = long) */
407 26, /* bitsize */
408 TRUE, /* pc_relative */
409 0, /* bitpos */
410 complain_overflow_signed, /* complain_on_overflow */
411 ppc64_elf_branch_reloc, /* special_function */
412 "R_PPC64_REL24", /* name */
413 FALSE, /* partial_inplace */
414 0, /* src_mask */
415 0x03fffffc, /* dst_mask */
416 TRUE), /* pcrel_offset */
417
418 /* A relative 16 bit branch; the lower two bits must be zero. */
419 HOWTO (R_PPC64_REL14, /* type */
420 0, /* rightshift */
421 2, /* size (0 = byte, 1 = short, 2 = long) */
422 16, /* bitsize */
423 TRUE, /* pc_relative */
424 0, /* bitpos */
425 complain_overflow_signed, /* complain_on_overflow */
426 ppc64_elf_branch_reloc, /* special_function */
427 "R_PPC64_REL14", /* name */
428 FALSE, /* partial_inplace */
429 0, /* src_mask */
430 0x0000fffc, /* dst_mask */
431 TRUE), /* pcrel_offset */
432
433 /* A relative 16 bit branch. Bit 10 should be set to indicate that
434 the branch is expected to be taken. The lower two bits must be
435 zero. */
436 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
437 0, /* rightshift */
438 2, /* size (0 = byte, 1 = short, 2 = long) */
439 16, /* bitsize */
440 TRUE, /* pc_relative */
441 0, /* bitpos */
442 complain_overflow_signed, /* complain_on_overflow */
443 ppc64_elf_brtaken_reloc, /* special_function */
444 "R_PPC64_REL14_BRTAKEN", /* name */
445 FALSE, /* partial_inplace */
446 0, /* src_mask */
447 0x0000fffc, /* dst_mask */
448 TRUE), /* pcrel_offset */
449
450 /* A relative 16 bit branch. Bit 10 should be set to indicate that
451 the branch is not expected to be taken. The lower two bits must
452 be zero. */
453 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
454 0, /* rightshift */
455 2, /* size (0 = byte, 1 = short, 2 = long) */
456 16, /* bitsize */
457 TRUE, /* pc_relative */
458 0, /* bitpos */
459 complain_overflow_signed, /* complain_on_overflow */
460 ppc64_elf_brtaken_reloc, /* special_function */
461 "R_PPC64_REL14_BRNTAKEN",/* name */
462 FALSE, /* partial_inplace */
463 0, /* src_mask */
464 0x0000fffc, /* dst_mask */
465 TRUE), /* pcrel_offset */
466
467 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
468 symbol. */
469 HOWTO (R_PPC64_GOT16, /* type */
470 0, /* rightshift */
471 1, /* size (0 = byte, 1 = short, 2 = long) */
472 16, /* bitsize */
473 FALSE, /* pc_relative */
474 0, /* bitpos */
475 complain_overflow_signed, /* complain_on_overflow */
476 ppc64_elf_unhandled_reloc, /* special_function */
477 "R_PPC64_GOT16", /* name */
478 FALSE, /* partial_inplace */
479 0, /* src_mask */
480 0xffff, /* dst_mask */
481 FALSE), /* pcrel_offset */
482
483 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
484 the symbol. */
485 HOWTO (R_PPC64_GOT16_LO, /* type */
486 0, /* rightshift */
487 1, /* size (0 = byte, 1 = short, 2 = long) */
488 16, /* bitsize */
489 FALSE, /* pc_relative */
490 0, /* bitpos */
491 complain_overflow_dont, /* complain_on_overflow */
492 ppc64_elf_unhandled_reloc, /* special_function */
493 "R_PPC64_GOT16_LO", /* name */
494 FALSE, /* partial_inplace */
495 0, /* src_mask */
496 0xffff, /* dst_mask */
497 FALSE), /* pcrel_offset */
498
499 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
500 the symbol. */
501 HOWTO (R_PPC64_GOT16_HI, /* type */
502 16, /* rightshift */
503 1, /* size (0 = byte, 1 = short, 2 = long) */
504 16, /* bitsize */
505 FALSE, /* pc_relative */
506 0, /* bitpos */
507 complain_overflow_signed,/* complain_on_overflow */
508 ppc64_elf_unhandled_reloc, /* special_function */
509 "R_PPC64_GOT16_HI", /* name */
510 FALSE, /* partial_inplace */
511 0, /* src_mask */
512 0xffff, /* dst_mask */
513 FALSE), /* pcrel_offset */
514
515 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
516 the symbol. */
517 HOWTO (R_PPC64_GOT16_HA, /* type */
518 16, /* rightshift */
519 1, /* size (0 = byte, 1 = short, 2 = long) */
520 16, /* bitsize */
521 FALSE, /* pc_relative */
522 0, /* bitpos */
523 complain_overflow_signed,/* complain_on_overflow */
524 ppc64_elf_unhandled_reloc, /* special_function */
525 "R_PPC64_GOT16_HA", /* name */
526 FALSE, /* partial_inplace */
527 0, /* src_mask */
528 0xffff, /* dst_mask */
529 FALSE), /* pcrel_offset */
530
531 /* This is used only by the dynamic linker. The symbol should exist
532 both in the object being run and in some shared library. The
533 dynamic linker copies the data addressed by the symbol from the
534 shared library into the object, because the object being
535 run has to have the data at some particular address. */
536 HOWTO (R_PPC64_COPY, /* type */
537 0, /* rightshift */
538 0, /* this one is variable size */
539 0, /* bitsize */
540 FALSE, /* pc_relative */
541 0, /* bitpos */
542 complain_overflow_dont, /* complain_on_overflow */
543 ppc64_elf_unhandled_reloc, /* special_function */
544 "R_PPC64_COPY", /* name */
545 FALSE, /* partial_inplace */
546 0, /* src_mask */
547 0, /* dst_mask */
548 FALSE), /* pcrel_offset */
549
550 /* Like R_PPC64_ADDR64, but used when setting global offset table
551 entries. */
552 HOWTO (R_PPC64_GLOB_DAT, /* type */
553 0, /* rightshift */
554 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
555 64, /* bitsize */
556 FALSE, /* pc_relative */
557 0, /* bitpos */
558 complain_overflow_dont, /* complain_on_overflow */
559 ppc64_elf_unhandled_reloc, /* special_function */
560 "R_PPC64_GLOB_DAT", /* name */
561 FALSE, /* partial_inplace */
562 0, /* src_mask */
563 ONES (64), /* dst_mask */
564 FALSE), /* pcrel_offset */
565
566 /* Created by the link editor. Marks a procedure linkage table
567 entry for a symbol. */
568 HOWTO (R_PPC64_JMP_SLOT, /* type */
569 0, /* rightshift */
570 0, /* size (0 = byte, 1 = short, 2 = long) */
571 0, /* bitsize */
572 FALSE, /* pc_relative */
573 0, /* bitpos */
574 complain_overflow_dont, /* complain_on_overflow */
575 ppc64_elf_unhandled_reloc, /* special_function */
576 "R_PPC64_JMP_SLOT", /* name */
577 FALSE, /* partial_inplace */
578 0, /* src_mask */
579 0, /* dst_mask */
580 FALSE), /* pcrel_offset */
581
582 /* Used only by the dynamic linker. When the object is run, this
583 doubleword64 is set to the load address of the object, plus the
584 addend. */
585 HOWTO (R_PPC64_RELATIVE, /* type */
586 0, /* rightshift */
587 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
588 64, /* bitsize */
589 FALSE, /* pc_relative */
590 0, /* bitpos */
591 complain_overflow_dont, /* complain_on_overflow */
592 bfd_elf_generic_reloc, /* special_function */
593 "R_PPC64_RELATIVE", /* name */
594 FALSE, /* partial_inplace */
595 0, /* src_mask */
596 ONES (64), /* dst_mask */
597 FALSE), /* pcrel_offset */
598
599 /* Like R_PPC64_ADDR32, but may be unaligned. */
600 HOWTO (R_PPC64_UADDR32, /* type */
601 0, /* rightshift */
602 2, /* size (0 = byte, 1 = short, 2 = long) */
603 32, /* bitsize */
604 FALSE, /* pc_relative */
605 0, /* bitpos */
606 complain_overflow_bitfield, /* complain_on_overflow */
607 bfd_elf_generic_reloc, /* special_function */
608 "R_PPC64_UADDR32", /* name */
609 FALSE, /* partial_inplace */
610 0, /* src_mask */
611 0xffffffff, /* dst_mask */
612 FALSE), /* pcrel_offset */
613
614 /* Like R_PPC64_ADDR16, but may be unaligned. */
615 HOWTO (R_PPC64_UADDR16, /* type */
616 0, /* rightshift */
617 1, /* size (0 = byte, 1 = short, 2 = long) */
618 16, /* bitsize */
619 FALSE, /* pc_relative */
620 0, /* bitpos */
621 complain_overflow_bitfield, /* complain_on_overflow */
622 bfd_elf_generic_reloc, /* special_function */
623 "R_PPC64_UADDR16", /* name */
624 FALSE, /* partial_inplace */
625 0, /* src_mask */
626 0xffff, /* dst_mask */
627 FALSE), /* pcrel_offset */
628
629 /* 32-bit PC relative. */
630 HOWTO (R_PPC64_REL32, /* type */
631 0, /* rightshift */
632 2, /* size (0 = byte, 1 = short, 2 = long) */
633 32, /* bitsize */
634 TRUE, /* pc_relative */
635 0, /* bitpos */
636 /* FIXME: Verify. Was complain_overflow_bitfield. */
637 complain_overflow_signed, /* complain_on_overflow */
638 bfd_elf_generic_reloc, /* special_function */
639 "R_PPC64_REL32", /* name */
640 FALSE, /* partial_inplace */
641 0, /* src_mask */
642 0xffffffff, /* dst_mask */
643 TRUE), /* pcrel_offset */
644
645 /* 32-bit relocation to the symbol's procedure linkage table. */
646 HOWTO (R_PPC64_PLT32, /* type */
647 0, /* rightshift */
648 2, /* size (0 = byte, 1 = short, 2 = long) */
649 32, /* bitsize */
650 FALSE, /* pc_relative */
651 0, /* bitpos */
652 complain_overflow_bitfield, /* complain_on_overflow */
653 ppc64_elf_unhandled_reloc, /* special_function */
654 "R_PPC64_PLT32", /* name */
655 FALSE, /* partial_inplace */
656 0, /* src_mask */
657 0xffffffff, /* dst_mask */
658 FALSE), /* pcrel_offset */
659
660 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
661 FIXME: R_PPC64_PLTREL32 not supported. */
662 HOWTO (R_PPC64_PLTREL32, /* type */
663 0, /* rightshift */
664 2, /* size (0 = byte, 1 = short, 2 = long) */
665 32, /* bitsize */
666 TRUE, /* pc_relative */
667 0, /* bitpos */
668 complain_overflow_signed, /* complain_on_overflow */
669 bfd_elf_generic_reloc, /* special_function */
670 "R_PPC64_PLTREL32", /* name */
671 FALSE, /* partial_inplace */
672 0, /* src_mask */
673 0xffffffff, /* dst_mask */
674 TRUE), /* pcrel_offset */
675
676 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
677 the symbol. */
678 HOWTO (R_PPC64_PLT16_LO, /* type */
679 0, /* rightshift */
680 1, /* size (0 = byte, 1 = short, 2 = long) */
681 16, /* bitsize */
682 FALSE, /* pc_relative */
683 0, /* bitpos */
684 complain_overflow_dont, /* complain_on_overflow */
685 ppc64_elf_unhandled_reloc, /* special_function */
686 "R_PPC64_PLT16_LO", /* name */
687 FALSE, /* partial_inplace */
688 0, /* src_mask */
689 0xffff, /* dst_mask */
690 FALSE), /* pcrel_offset */
691
692 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
693 the symbol. */
694 HOWTO (R_PPC64_PLT16_HI, /* type */
695 16, /* rightshift */
696 1, /* size (0 = byte, 1 = short, 2 = long) */
697 16, /* bitsize */
698 FALSE, /* pc_relative */
699 0, /* bitpos */
700 complain_overflow_signed, /* complain_on_overflow */
701 ppc64_elf_unhandled_reloc, /* special_function */
702 "R_PPC64_PLT16_HI", /* name */
703 FALSE, /* partial_inplace */
704 0, /* src_mask */
705 0xffff, /* dst_mask */
706 FALSE), /* pcrel_offset */
707
708 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
709 the symbol. */
710 HOWTO (R_PPC64_PLT16_HA, /* type */
711 16, /* rightshift */
712 1, /* size (0 = byte, 1 = short, 2 = long) */
713 16, /* bitsize */
714 FALSE, /* pc_relative */
715 0, /* bitpos */
716 complain_overflow_signed, /* complain_on_overflow */
717 ppc64_elf_unhandled_reloc, /* special_function */
718 "R_PPC64_PLT16_HA", /* name */
719 FALSE, /* partial_inplace */
720 0, /* src_mask */
721 0xffff, /* dst_mask */
722 FALSE), /* pcrel_offset */
723
724 /* 16-bit section relative relocation. */
725 HOWTO (R_PPC64_SECTOFF, /* type */
726 0, /* rightshift */
727 1, /* size (0 = byte, 1 = short, 2 = long) */
728 16, /* bitsize */
729 FALSE, /* pc_relative */
730 0, /* bitpos */
731 complain_overflow_bitfield, /* complain_on_overflow */
732 ppc64_elf_sectoff_reloc, /* special_function */
733 "R_PPC64_SECTOFF", /* name */
734 FALSE, /* partial_inplace */
735 0, /* src_mask */
736 0xffff, /* dst_mask */
737 FALSE), /* pcrel_offset */
738
739 /* Like R_PPC64_SECTOFF, but no overflow warning. */
740 HOWTO (R_PPC64_SECTOFF_LO, /* type */
741 0, /* rightshift */
742 1, /* size (0 = byte, 1 = short, 2 = long) */
743 16, /* bitsize */
744 FALSE, /* pc_relative */
745 0, /* bitpos */
746 complain_overflow_dont, /* complain_on_overflow */
747 ppc64_elf_sectoff_reloc, /* special_function */
748 "R_PPC64_SECTOFF_LO", /* name */
749 FALSE, /* partial_inplace */
750 0, /* src_mask */
751 0xffff, /* dst_mask */
752 FALSE), /* pcrel_offset */
753
754 /* 16-bit upper half section relative relocation. */
755 HOWTO (R_PPC64_SECTOFF_HI, /* type */
756 16, /* rightshift */
757 1, /* size (0 = byte, 1 = short, 2 = long) */
758 16, /* bitsize */
759 FALSE, /* pc_relative */
760 0, /* bitpos */
761 complain_overflow_signed, /* complain_on_overflow */
762 ppc64_elf_sectoff_reloc, /* special_function */
763 "R_PPC64_SECTOFF_HI", /* name */
764 FALSE, /* partial_inplace */
765 0, /* src_mask */
766 0xffff, /* dst_mask */
767 FALSE), /* pcrel_offset */
768
769 /* 16-bit upper half adjusted section relative relocation. */
770 HOWTO (R_PPC64_SECTOFF_HA, /* type */
771 16, /* rightshift */
772 1, /* size (0 = byte, 1 = short, 2 = long) */
773 16, /* bitsize */
774 FALSE, /* pc_relative */
775 0, /* bitpos */
776 complain_overflow_signed, /* complain_on_overflow */
777 ppc64_elf_sectoff_ha_reloc, /* special_function */
778 "R_PPC64_SECTOFF_HA", /* name */
779 FALSE, /* partial_inplace */
780 0, /* src_mask */
781 0xffff, /* dst_mask */
782 FALSE), /* pcrel_offset */
783
784 /* Like R_PPC64_REL24 without touching the two least significant bits. */
785 HOWTO (R_PPC64_REL30, /* type */
786 2, /* rightshift */
787 2, /* size (0 = byte, 1 = short, 2 = long) */
788 30, /* bitsize */
789 TRUE, /* pc_relative */
790 0, /* bitpos */
791 complain_overflow_dont, /* complain_on_overflow */
792 bfd_elf_generic_reloc, /* special_function */
793 "R_PPC64_REL30", /* name */
794 FALSE, /* partial_inplace */
795 0, /* src_mask */
796 0xfffffffc, /* dst_mask */
797 TRUE), /* pcrel_offset */
798
799 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
800
801 /* A standard 64-bit relocation. */
802 HOWTO (R_PPC64_ADDR64, /* type */
803 0, /* rightshift */
804 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
805 64, /* bitsize */
806 FALSE, /* pc_relative */
807 0, /* bitpos */
808 complain_overflow_dont, /* complain_on_overflow */
809 bfd_elf_generic_reloc, /* special_function */
810 "R_PPC64_ADDR64", /* name */
811 FALSE, /* partial_inplace */
812 0, /* src_mask */
813 ONES (64), /* dst_mask */
814 FALSE), /* pcrel_offset */
815
816 /* The bits 32-47 of an address. */
817 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
818 32, /* rightshift */
819 1, /* size (0 = byte, 1 = short, 2 = long) */
820 16, /* bitsize */
821 FALSE, /* pc_relative */
822 0, /* bitpos */
823 complain_overflow_dont, /* complain_on_overflow */
824 bfd_elf_generic_reloc, /* special_function */
825 "R_PPC64_ADDR16_HIGHER", /* name */
826 FALSE, /* partial_inplace */
827 0, /* src_mask */
828 0xffff, /* dst_mask */
829 FALSE), /* pcrel_offset */
830
831 /* The bits 32-47 of an address, plus 1 if the contents of the low
832 16 bits, treated as a signed number, is negative. */
833 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
834 32, /* rightshift */
835 1, /* size (0 = byte, 1 = short, 2 = long) */
836 16, /* bitsize */
837 FALSE, /* pc_relative */
838 0, /* bitpos */
839 complain_overflow_dont, /* complain_on_overflow */
840 ppc64_elf_ha_reloc, /* special_function */
841 "R_PPC64_ADDR16_HIGHERA", /* name */
842 FALSE, /* partial_inplace */
843 0, /* src_mask */
844 0xffff, /* dst_mask */
845 FALSE), /* pcrel_offset */
846
847 /* The bits 48-63 of an address. */
848 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
849 48, /* rightshift */
850 1, /* size (0 = byte, 1 = short, 2 = long) */
851 16, /* bitsize */
852 FALSE, /* pc_relative */
853 0, /* bitpos */
854 complain_overflow_dont, /* complain_on_overflow */
855 bfd_elf_generic_reloc, /* special_function */
856 "R_PPC64_ADDR16_HIGHEST", /* name */
857 FALSE, /* partial_inplace */
858 0, /* src_mask */
859 0xffff, /* dst_mask */
860 FALSE), /* pcrel_offset */
861
862 /* The bits 48-63 of an address, plus 1 if the contents of the low
863 16 bits, treated as a signed number, is negative. */
864 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
865 48, /* rightshift */
866 1, /* size (0 = byte, 1 = short, 2 = long) */
867 16, /* bitsize */
868 FALSE, /* pc_relative */
869 0, /* bitpos */
870 complain_overflow_dont, /* complain_on_overflow */
871 ppc64_elf_ha_reloc, /* special_function */
872 "R_PPC64_ADDR16_HIGHESTA", /* name */
873 FALSE, /* partial_inplace */
874 0, /* src_mask */
875 0xffff, /* dst_mask */
876 FALSE), /* pcrel_offset */
877
878 /* Like ADDR64, but may be unaligned. */
879 HOWTO (R_PPC64_UADDR64, /* type */
880 0, /* rightshift */
881 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
882 64, /* bitsize */
883 FALSE, /* pc_relative */
884 0, /* bitpos */
885 complain_overflow_dont, /* complain_on_overflow */
886 bfd_elf_generic_reloc, /* special_function */
887 "R_PPC64_UADDR64", /* name */
888 FALSE, /* partial_inplace */
889 0, /* src_mask */
890 ONES (64), /* dst_mask */
891 FALSE), /* pcrel_offset */
892
893 /* 64-bit relative relocation. */
894 HOWTO (R_PPC64_REL64, /* type */
895 0, /* rightshift */
896 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
897 64, /* bitsize */
898 TRUE, /* pc_relative */
899 0, /* bitpos */
900 complain_overflow_dont, /* complain_on_overflow */
901 bfd_elf_generic_reloc, /* special_function */
902 "R_PPC64_REL64", /* name */
903 FALSE, /* partial_inplace */
904 0, /* src_mask */
905 ONES (64), /* dst_mask */
906 TRUE), /* pcrel_offset */
907
908 /* 64-bit relocation to the symbol's procedure linkage table. */
909 HOWTO (R_PPC64_PLT64, /* type */
910 0, /* rightshift */
911 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
912 64, /* bitsize */
913 FALSE, /* pc_relative */
914 0, /* bitpos */
915 complain_overflow_dont, /* complain_on_overflow */
916 ppc64_elf_unhandled_reloc, /* special_function */
917 "R_PPC64_PLT64", /* name */
918 FALSE, /* partial_inplace */
919 0, /* src_mask */
920 ONES (64), /* dst_mask */
921 FALSE), /* pcrel_offset */
922
923 /* 64-bit PC relative relocation to the symbol's procedure linkage
924 table. */
925 /* FIXME: R_PPC64_PLTREL64 not supported. */
926 HOWTO (R_PPC64_PLTREL64, /* type */
927 0, /* rightshift */
928 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
929 64, /* bitsize */
930 TRUE, /* pc_relative */
931 0, /* bitpos */
932 complain_overflow_dont, /* complain_on_overflow */
933 ppc64_elf_unhandled_reloc, /* special_function */
934 "R_PPC64_PLTREL64", /* name */
935 FALSE, /* partial_inplace */
936 0, /* src_mask */
937 ONES (64), /* dst_mask */
938 TRUE), /* pcrel_offset */
939
940 /* 16 bit TOC-relative relocation. */
941
942 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
943 HOWTO (R_PPC64_TOC16, /* type */
944 0, /* rightshift */
945 1, /* size (0 = byte, 1 = short, 2 = long) */
946 16, /* bitsize */
947 FALSE, /* pc_relative */
948 0, /* bitpos */
949 complain_overflow_signed, /* complain_on_overflow */
950 ppc64_elf_toc_reloc, /* special_function */
951 "R_PPC64_TOC16", /* name */
952 FALSE, /* partial_inplace */
953 0, /* src_mask */
954 0xffff, /* dst_mask */
955 FALSE), /* pcrel_offset */
956
957 /* 16 bit TOC-relative relocation without overflow. */
958
959 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
960 HOWTO (R_PPC64_TOC16_LO, /* 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_dont, /* complain_on_overflow */
967 ppc64_elf_toc_reloc, /* special_function */
968 "R_PPC64_TOC16_LO", /* name */
969 FALSE, /* partial_inplace */
970 0, /* src_mask */
971 0xffff, /* dst_mask */
972 FALSE), /* pcrel_offset */
973
974 /* 16 bit TOC-relative relocation, high 16 bits. */
975
976 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
977 HOWTO (R_PPC64_TOC16_HI, /* type */
978 16, /* rightshift */
979 1, /* size (0 = byte, 1 = short, 2 = long) */
980 16, /* bitsize */
981 FALSE, /* pc_relative */
982 0, /* bitpos */
983 complain_overflow_signed, /* complain_on_overflow */
984 ppc64_elf_toc_reloc, /* special_function */
985 "R_PPC64_TOC16_HI", /* 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, plus 1 if the
992 contents of the low 16 bits, treated as a signed number, is
993 negative. */
994
995 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
996 HOWTO (R_PPC64_TOC16_HA, /* type */
997 16, /* rightshift */
998 1, /* size (0 = byte, 1 = short, 2 = long) */
999 16, /* bitsize */
1000 FALSE, /* pc_relative */
1001 0, /* bitpos */
1002 complain_overflow_signed, /* complain_on_overflow */
1003 ppc64_elf_toc_ha_reloc, /* special_function */
1004 "R_PPC64_TOC16_HA", /* name */
1005 FALSE, /* partial_inplace */
1006 0, /* src_mask */
1007 0xffff, /* dst_mask */
1008 FALSE), /* pcrel_offset */
1009
1010 /* 64-bit relocation; insert value of TOC base (.TOC.). */
1011
1012 /* R_PPC64_TOC 51 doubleword64 .TOC. */
1013 HOWTO (R_PPC64_TOC, /* type */
1014 0, /* rightshift */
1015 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1016 64, /* bitsize */
1017 FALSE, /* pc_relative */
1018 0, /* bitpos */
1019 complain_overflow_bitfield, /* complain_on_overflow */
1020 ppc64_elf_toc64_reloc, /* special_function */
1021 "R_PPC64_TOC", /* name */
1022 FALSE, /* partial_inplace */
1023 0, /* src_mask */
1024 ONES (64), /* dst_mask */
1025 FALSE), /* pcrel_offset */
1026
1027 /* Like R_PPC64_GOT16, but also informs the link editor that the
1028 value to relocate may (!) refer to a PLT entry which the link
1029 editor (a) may replace with the symbol value. If the link editor
1030 is unable to fully resolve the symbol, it may (b) create a PLT
1031 entry and store the address to the new PLT entry in the GOT.
1032 This permits lazy resolution of function symbols at run time.
1033 The link editor may also skip all of this and just (c) emit a
1034 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
1035 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
1036 HOWTO (R_PPC64_PLTGOT16, /* type */
1037 0, /* rightshift */
1038 1, /* size (0 = byte, 1 = short, 2 = long) */
1039 16, /* bitsize */
1040 FALSE, /* pc_relative */
1041 0, /* bitpos */
1042 complain_overflow_signed, /* complain_on_overflow */
1043 ppc64_elf_unhandled_reloc, /* special_function */
1044 "R_PPC64_PLTGOT16", /* name */
1045 FALSE, /* partial_inplace */
1046 0, /* src_mask */
1047 0xffff, /* dst_mask */
1048 FALSE), /* pcrel_offset */
1049
1050 /* Like R_PPC64_PLTGOT16, but without overflow. */
1051 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1052 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1053 0, /* rightshift */
1054 1, /* size (0 = byte, 1 = short, 2 = long) */
1055 16, /* bitsize */
1056 FALSE, /* pc_relative */
1057 0, /* bitpos */
1058 complain_overflow_dont, /* complain_on_overflow */
1059 ppc64_elf_unhandled_reloc, /* special_function */
1060 "R_PPC64_PLTGOT16_LO", /* name */
1061 FALSE, /* partial_inplace */
1062 0, /* src_mask */
1063 0xffff, /* dst_mask */
1064 FALSE), /* pcrel_offset */
1065
1066 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1067 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1068 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1069 16, /* rightshift */
1070 1, /* size (0 = byte, 1 = short, 2 = long) */
1071 16, /* bitsize */
1072 FALSE, /* pc_relative */
1073 0, /* bitpos */
1074 complain_overflow_signed, /* complain_on_overflow */
1075 ppc64_elf_unhandled_reloc, /* special_function */
1076 "R_PPC64_PLTGOT16_HI", /* name */
1077 FALSE, /* partial_inplace */
1078 0, /* src_mask */
1079 0xffff, /* dst_mask */
1080 FALSE), /* pcrel_offset */
1081
1082 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1083 1 if the contents of the low 16 bits, treated as a signed number,
1084 is negative. */
1085 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1086 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1087 16, /* rightshift */
1088 1, /* size (0 = byte, 1 = short, 2 = long) */
1089 16, /* bitsize */
1090 FALSE, /* pc_relative */
1091 0, /* bitpos */
1092 complain_overflow_signed, /* complain_on_overflow */
1093 ppc64_elf_unhandled_reloc, /* special_function */
1094 "R_PPC64_PLTGOT16_HA", /* name */
1095 FALSE, /* partial_inplace */
1096 0, /* src_mask */
1097 0xffff, /* dst_mask */
1098 FALSE), /* pcrel_offset */
1099
1100 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1101 HOWTO (R_PPC64_ADDR16_DS, /* type */
1102 0, /* rightshift */
1103 1, /* size (0 = byte, 1 = short, 2 = long) */
1104 16, /* bitsize */
1105 FALSE, /* pc_relative */
1106 0, /* bitpos */
1107 complain_overflow_bitfield, /* complain_on_overflow */
1108 bfd_elf_generic_reloc, /* special_function */
1109 "R_PPC64_ADDR16_DS", /* name */
1110 FALSE, /* partial_inplace */
1111 0, /* src_mask */
1112 0xfffc, /* dst_mask */
1113 FALSE), /* pcrel_offset */
1114
1115 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1116 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1117 0, /* rightshift */
1118 1, /* size (0 = byte, 1 = short, 2 = long) */
1119 16, /* bitsize */
1120 FALSE, /* pc_relative */
1121 0, /* bitpos */
1122 complain_overflow_dont,/* complain_on_overflow */
1123 bfd_elf_generic_reloc, /* special_function */
1124 "R_PPC64_ADDR16_LO_DS",/* name */
1125 FALSE, /* partial_inplace */
1126 0, /* src_mask */
1127 0xfffc, /* dst_mask */
1128 FALSE), /* pcrel_offset */
1129
1130 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1131 HOWTO (R_PPC64_GOT16_DS, /* type */
1132 0, /* rightshift */
1133 1, /* size (0 = byte, 1 = short, 2 = long) */
1134 16, /* bitsize */
1135 FALSE, /* pc_relative */
1136 0, /* bitpos */
1137 complain_overflow_signed, /* complain_on_overflow */
1138 ppc64_elf_unhandled_reloc, /* special_function */
1139 "R_PPC64_GOT16_DS", /* name */
1140 FALSE, /* partial_inplace */
1141 0, /* src_mask */
1142 0xfffc, /* dst_mask */
1143 FALSE), /* pcrel_offset */
1144
1145 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1146 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1147 0, /* rightshift */
1148 1, /* size (0 = byte, 1 = short, 2 = long) */
1149 16, /* bitsize */
1150 FALSE, /* pc_relative */
1151 0, /* bitpos */
1152 complain_overflow_dont, /* complain_on_overflow */
1153 ppc64_elf_unhandled_reloc, /* special_function */
1154 "R_PPC64_GOT16_LO_DS", /* name */
1155 FALSE, /* partial_inplace */
1156 0, /* src_mask */
1157 0xfffc, /* dst_mask */
1158 FALSE), /* pcrel_offset */
1159
1160 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1161 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1162 0, /* rightshift */
1163 1, /* size (0 = byte, 1 = short, 2 = long) */
1164 16, /* bitsize */
1165 FALSE, /* pc_relative */
1166 0, /* bitpos */
1167 complain_overflow_dont, /* complain_on_overflow */
1168 ppc64_elf_unhandled_reloc, /* special_function */
1169 "R_PPC64_PLT16_LO_DS", /* name */
1170 FALSE, /* partial_inplace */
1171 0, /* src_mask */
1172 0xfffc, /* dst_mask */
1173 FALSE), /* pcrel_offset */
1174
1175 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1176 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1177 0, /* rightshift */
1178 1, /* size (0 = byte, 1 = short, 2 = long) */
1179 16, /* bitsize */
1180 FALSE, /* pc_relative */
1181 0, /* bitpos */
1182 complain_overflow_bitfield, /* complain_on_overflow */
1183 ppc64_elf_sectoff_reloc, /* special_function */
1184 "R_PPC64_SECTOFF_DS", /* name */
1185 FALSE, /* partial_inplace */
1186 0, /* src_mask */
1187 0xfffc, /* dst_mask */
1188 FALSE), /* pcrel_offset */
1189
1190 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1191 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1192 0, /* rightshift */
1193 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 16, /* bitsize */
1195 FALSE, /* pc_relative */
1196 0, /* bitpos */
1197 complain_overflow_dont, /* complain_on_overflow */
1198 ppc64_elf_sectoff_reloc, /* special_function */
1199 "R_PPC64_SECTOFF_LO_DS",/* name */
1200 FALSE, /* partial_inplace */
1201 0, /* src_mask */
1202 0xfffc, /* dst_mask */
1203 FALSE), /* pcrel_offset */
1204
1205 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1206 HOWTO (R_PPC64_TOC16_DS, /* type */
1207 0, /* rightshift */
1208 1, /* size (0 = byte, 1 = short, 2 = long) */
1209 16, /* bitsize */
1210 FALSE, /* pc_relative */
1211 0, /* bitpos */
1212 complain_overflow_signed, /* complain_on_overflow */
1213 ppc64_elf_toc_reloc, /* special_function */
1214 "R_PPC64_TOC16_DS", /* name */
1215 FALSE, /* partial_inplace */
1216 0, /* src_mask */
1217 0xfffc, /* dst_mask */
1218 FALSE), /* pcrel_offset */
1219
1220 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1221 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1222 0, /* rightshift */
1223 1, /* size (0 = byte, 1 = short, 2 = long) */
1224 16, /* bitsize */
1225 FALSE, /* pc_relative */
1226 0, /* bitpos */
1227 complain_overflow_dont, /* complain_on_overflow */
1228 ppc64_elf_toc_reloc, /* special_function */
1229 "R_PPC64_TOC16_LO_DS", /* name */
1230 FALSE, /* partial_inplace */
1231 0, /* src_mask */
1232 0xfffc, /* dst_mask */
1233 FALSE), /* pcrel_offset */
1234
1235 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1236 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1237 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1238 0, /* rightshift */
1239 1, /* size (0 = byte, 1 = short, 2 = long) */
1240 16, /* bitsize */
1241 FALSE, /* pc_relative */
1242 0, /* bitpos */
1243 complain_overflow_signed, /* complain_on_overflow */
1244 ppc64_elf_unhandled_reloc, /* special_function */
1245 "R_PPC64_PLTGOT16_DS", /* name */
1246 FALSE, /* partial_inplace */
1247 0, /* src_mask */
1248 0xfffc, /* dst_mask */
1249 FALSE), /* pcrel_offset */
1250
1251 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1252 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1253 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1254 0, /* rightshift */
1255 1, /* size (0 = byte, 1 = short, 2 = long) */
1256 16, /* bitsize */
1257 FALSE, /* pc_relative */
1258 0, /* bitpos */
1259 complain_overflow_dont, /* complain_on_overflow */
1260 ppc64_elf_unhandled_reloc, /* special_function */
1261 "R_PPC64_PLTGOT16_LO_DS",/* name */
1262 FALSE, /* partial_inplace */
1263 0, /* src_mask */
1264 0xfffc, /* dst_mask */
1265 FALSE), /* pcrel_offset */
1266
1267 /* Marker relocs for TLS. */
1268 HOWTO (R_PPC64_TLS,
1269 0, /* rightshift */
1270 2, /* size (0 = byte, 1 = short, 2 = long) */
1271 32, /* bitsize */
1272 FALSE, /* pc_relative */
1273 0, /* bitpos */
1274 complain_overflow_dont, /* complain_on_overflow */
1275 bfd_elf_generic_reloc, /* special_function */
1276 "R_PPC64_TLS", /* name */
1277 FALSE, /* partial_inplace */
1278 0, /* src_mask */
1279 0, /* dst_mask */
1280 FALSE), /* pcrel_offset */
1281
1282 HOWTO (R_PPC64_TLSGD,
1283 0, /* rightshift */
1284 2, /* size (0 = byte, 1 = short, 2 = long) */
1285 32, /* bitsize */
1286 FALSE, /* pc_relative */
1287 0, /* bitpos */
1288 complain_overflow_dont, /* complain_on_overflow */
1289 bfd_elf_generic_reloc, /* special_function */
1290 "R_PPC64_TLSGD", /* name */
1291 FALSE, /* partial_inplace */
1292 0, /* src_mask */
1293 0, /* dst_mask */
1294 FALSE), /* pcrel_offset */
1295
1296 HOWTO (R_PPC64_TLSLD,
1297 0, /* rightshift */
1298 2, /* size (0 = byte, 1 = short, 2 = long) */
1299 32, /* bitsize */
1300 FALSE, /* pc_relative */
1301 0, /* bitpos */
1302 complain_overflow_dont, /* complain_on_overflow */
1303 bfd_elf_generic_reloc, /* special_function */
1304 "R_PPC64_TLSLD", /* name */
1305 FALSE, /* partial_inplace */
1306 0, /* src_mask */
1307 0, /* dst_mask */
1308 FALSE), /* pcrel_offset */
1309
1310 HOWTO (R_PPC64_TOCSAVE,
1311 0, /* rightshift */
1312 2, /* size (0 = byte, 1 = short, 2 = long) */
1313 32, /* bitsize */
1314 FALSE, /* pc_relative */
1315 0, /* bitpos */
1316 complain_overflow_dont, /* complain_on_overflow */
1317 bfd_elf_generic_reloc, /* special_function */
1318 "R_PPC64_TOCSAVE", /* name */
1319 FALSE, /* partial_inplace */
1320 0, /* src_mask */
1321 0, /* dst_mask */
1322 FALSE), /* pcrel_offset */
1323
1324 /* Computes the load module index of the load module that contains the
1325 definition of its TLS sym. */
1326 HOWTO (R_PPC64_DTPMOD64,
1327 0, /* rightshift */
1328 4, /* size (0 = byte, 1 = short, 2 = long) */
1329 64, /* bitsize */
1330 FALSE, /* pc_relative */
1331 0, /* bitpos */
1332 complain_overflow_dont, /* complain_on_overflow */
1333 ppc64_elf_unhandled_reloc, /* special_function */
1334 "R_PPC64_DTPMOD64", /* name */
1335 FALSE, /* partial_inplace */
1336 0, /* src_mask */
1337 ONES (64), /* dst_mask */
1338 FALSE), /* pcrel_offset */
1339
1340 /* Computes a dtv-relative displacement, the difference between the value
1341 of sym+add and the base address of the thread-local storage block that
1342 contains the definition of sym, minus 0x8000. */
1343 HOWTO (R_PPC64_DTPREL64,
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_DTPREL64", /* name */
1352 FALSE, /* partial_inplace */
1353 0, /* src_mask */
1354 ONES (64), /* dst_mask */
1355 FALSE), /* pcrel_offset */
1356
1357 /* A 16 bit dtprel reloc. */
1358 HOWTO (R_PPC64_DTPREL16,
1359 0, /* rightshift */
1360 1, /* size (0 = byte, 1 = short, 2 = long) */
1361 16, /* bitsize */
1362 FALSE, /* pc_relative */
1363 0, /* bitpos */
1364 complain_overflow_signed, /* complain_on_overflow */
1365 ppc64_elf_unhandled_reloc, /* special_function */
1366 "R_PPC64_DTPREL16", /* name */
1367 FALSE, /* partial_inplace */
1368 0, /* src_mask */
1369 0xffff, /* dst_mask */
1370 FALSE), /* pcrel_offset */
1371
1372 /* Like DTPREL16, but no overflow. */
1373 HOWTO (R_PPC64_DTPREL16_LO,
1374 0, /* rightshift */
1375 1, /* size (0 = byte, 1 = short, 2 = long) */
1376 16, /* bitsize */
1377 FALSE, /* pc_relative */
1378 0, /* bitpos */
1379 complain_overflow_dont, /* complain_on_overflow */
1380 ppc64_elf_unhandled_reloc, /* special_function */
1381 "R_PPC64_DTPREL16_LO", /* name */
1382 FALSE, /* partial_inplace */
1383 0, /* src_mask */
1384 0xffff, /* dst_mask */
1385 FALSE), /* pcrel_offset */
1386
1387 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1388 HOWTO (R_PPC64_DTPREL16_HI,
1389 16, /* rightshift */
1390 1, /* size (0 = byte, 1 = short, 2 = long) */
1391 16, /* bitsize */
1392 FALSE, /* pc_relative */
1393 0, /* bitpos */
1394 complain_overflow_signed, /* complain_on_overflow */
1395 ppc64_elf_unhandled_reloc, /* special_function */
1396 "R_PPC64_DTPREL16_HI", /* name */
1397 FALSE, /* partial_inplace */
1398 0, /* src_mask */
1399 0xffff, /* dst_mask */
1400 FALSE), /* pcrel_offset */
1401
1402 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1403 HOWTO (R_PPC64_DTPREL16_HA,
1404 16, /* rightshift */
1405 1, /* size (0 = byte, 1 = short, 2 = long) */
1406 16, /* bitsize */
1407 FALSE, /* pc_relative */
1408 0, /* bitpos */
1409 complain_overflow_signed, /* complain_on_overflow */
1410 ppc64_elf_unhandled_reloc, /* special_function */
1411 "R_PPC64_DTPREL16_HA", /* name */
1412 FALSE, /* partial_inplace */
1413 0, /* src_mask */
1414 0xffff, /* dst_mask */
1415 FALSE), /* pcrel_offset */
1416
1417 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1418 HOWTO (R_PPC64_DTPREL16_HIGHER,
1419 32, /* rightshift */
1420 1, /* size (0 = byte, 1 = short, 2 = long) */
1421 16, /* bitsize */
1422 FALSE, /* pc_relative */
1423 0, /* bitpos */
1424 complain_overflow_dont, /* complain_on_overflow */
1425 ppc64_elf_unhandled_reloc, /* special_function */
1426 "R_PPC64_DTPREL16_HIGHER", /* name */
1427 FALSE, /* partial_inplace */
1428 0, /* src_mask */
1429 0xffff, /* dst_mask */
1430 FALSE), /* pcrel_offset */
1431
1432 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1433 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1434 32, /* rightshift */
1435 1, /* size (0 = byte, 1 = short, 2 = long) */
1436 16, /* bitsize */
1437 FALSE, /* pc_relative */
1438 0, /* bitpos */
1439 complain_overflow_dont, /* complain_on_overflow */
1440 ppc64_elf_unhandled_reloc, /* special_function */
1441 "R_PPC64_DTPREL16_HIGHERA", /* name */
1442 FALSE, /* partial_inplace */
1443 0, /* src_mask */
1444 0xffff, /* dst_mask */
1445 FALSE), /* pcrel_offset */
1446
1447 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1448 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1449 48, /* rightshift */
1450 1, /* size (0 = byte, 1 = short, 2 = long) */
1451 16, /* bitsize */
1452 FALSE, /* pc_relative */
1453 0, /* bitpos */
1454 complain_overflow_dont, /* complain_on_overflow */
1455 ppc64_elf_unhandled_reloc, /* special_function */
1456 "R_PPC64_DTPREL16_HIGHEST", /* name */
1457 FALSE, /* partial_inplace */
1458 0, /* src_mask */
1459 0xffff, /* dst_mask */
1460 FALSE), /* pcrel_offset */
1461
1462 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1463 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1464 48, /* rightshift */
1465 1, /* size (0 = byte, 1 = short, 2 = long) */
1466 16, /* bitsize */
1467 FALSE, /* pc_relative */
1468 0, /* bitpos */
1469 complain_overflow_dont, /* complain_on_overflow */
1470 ppc64_elf_unhandled_reloc, /* special_function */
1471 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1472 FALSE, /* partial_inplace */
1473 0, /* src_mask */
1474 0xffff, /* dst_mask */
1475 FALSE), /* pcrel_offset */
1476
1477 /* Like DTPREL16, but for insns with a DS field. */
1478 HOWTO (R_PPC64_DTPREL16_DS,
1479 0, /* rightshift */
1480 1, /* size (0 = byte, 1 = short, 2 = long) */
1481 16, /* bitsize */
1482 FALSE, /* pc_relative */
1483 0, /* bitpos */
1484 complain_overflow_signed, /* complain_on_overflow */
1485 ppc64_elf_unhandled_reloc, /* special_function */
1486 "R_PPC64_DTPREL16_DS", /* name */
1487 FALSE, /* partial_inplace */
1488 0, /* src_mask */
1489 0xfffc, /* dst_mask */
1490 FALSE), /* pcrel_offset */
1491
1492 /* Like DTPREL16_DS, but no overflow. */
1493 HOWTO (R_PPC64_DTPREL16_LO_DS,
1494 0, /* rightshift */
1495 1, /* size (0 = byte, 1 = short, 2 = long) */
1496 16, /* bitsize */
1497 FALSE, /* pc_relative */
1498 0, /* bitpos */
1499 complain_overflow_dont, /* complain_on_overflow */
1500 ppc64_elf_unhandled_reloc, /* special_function */
1501 "R_PPC64_DTPREL16_LO_DS", /* name */
1502 FALSE, /* partial_inplace */
1503 0, /* src_mask */
1504 0xfffc, /* dst_mask */
1505 FALSE), /* pcrel_offset */
1506
1507 /* Computes a tp-relative displacement, the difference between the value of
1508 sym+add and the value of the thread pointer (r13). */
1509 HOWTO (R_PPC64_TPREL64,
1510 0, /* rightshift */
1511 4, /* size (0 = byte, 1 = short, 2 = long) */
1512 64, /* bitsize */
1513 FALSE, /* pc_relative */
1514 0, /* bitpos */
1515 complain_overflow_dont, /* complain_on_overflow */
1516 ppc64_elf_unhandled_reloc, /* special_function */
1517 "R_PPC64_TPREL64", /* name */
1518 FALSE, /* partial_inplace */
1519 0, /* src_mask */
1520 ONES (64), /* dst_mask */
1521 FALSE), /* pcrel_offset */
1522
1523 /* A 16 bit tprel reloc. */
1524 HOWTO (R_PPC64_TPREL16,
1525 0, /* rightshift */
1526 1, /* size (0 = byte, 1 = short, 2 = long) */
1527 16, /* bitsize */
1528 FALSE, /* pc_relative */
1529 0, /* bitpos */
1530 complain_overflow_signed, /* complain_on_overflow */
1531 ppc64_elf_unhandled_reloc, /* special_function */
1532 "R_PPC64_TPREL16", /* name */
1533 FALSE, /* partial_inplace */
1534 0, /* src_mask */
1535 0xffff, /* dst_mask */
1536 FALSE), /* pcrel_offset */
1537
1538 /* Like TPREL16, but no overflow. */
1539 HOWTO (R_PPC64_TPREL16_LO,
1540 0, /* rightshift */
1541 1, /* size (0 = byte, 1 = short, 2 = long) */
1542 16, /* bitsize */
1543 FALSE, /* pc_relative */
1544 0, /* bitpos */
1545 complain_overflow_dont, /* complain_on_overflow */
1546 ppc64_elf_unhandled_reloc, /* special_function */
1547 "R_PPC64_TPREL16_LO", /* name */
1548 FALSE, /* partial_inplace */
1549 0, /* src_mask */
1550 0xffff, /* dst_mask */
1551 FALSE), /* pcrel_offset */
1552
1553 /* Like TPREL16_LO, but next higher group of 16 bits. */
1554 HOWTO (R_PPC64_TPREL16_HI,
1555 16, /* rightshift */
1556 1, /* size (0 = byte, 1 = short, 2 = long) */
1557 16, /* bitsize */
1558 FALSE, /* pc_relative */
1559 0, /* bitpos */
1560 complain_overflow_signed, /* complain_on_overflow */
1561 ppc64_elf_unhandled_reloc, /* special_function */
1562 "R_PPC64_TPREL16_HI", /* name */
1563 FALSE, /* partial_inplace */
1564 0, /* src_mask */
1565 0xffff, /* dst_mask */
1566 FALSE), /* pcrel_offset */
1567
1568 /* Like TPREL16_HI, but adjust for low 16 bits. */
1569 HOWTO (R_PPC64_TPREL16_HA,
1570 16, /* rightshift */
1571 1, /* size (0 = byte, 1 = short, 2 = long) */
1572 16, /* bitsize */
1573 FALSE, /* pc_relative */
1574 0, /* bitpos */
1575 complain_overflow_signed, /* complain_on_overflow */
1576 ppc64_elf_unhandled_reloc, /* special_function */
1577 "R_PPC64_TPREL16_HA", /* name */
1578 FALSE, /* partial_inplace */
1579 0, /* src_mask */
1580 0xffff, /* dst_mask */
1581 FALSE), /* pcrel_offset */
1582
1583 /* Like TPREL16_HI, but next higher group of 16 bits. */
1584 HOWTO (R_PPC64_TPREL16_HIGHER,
1585 32, /* rightshift */
1586 1, /* size (0 = byte, 1 = short, 2 = long) */
1587 16, /* bitsize */
1588 FALSE, /* pc_relative */
1589 0, /* bitpos */
1590 complain_overflow_dont, /* complain_on_overflow */
1591 ppc64_elf_unhandled_reloc, /* special_function */
1592 "R_PPC64_TPREL16_HIGHER", /* name */
1593 FALSE, /* partial_inplace */
1594 0, /* src_mask */
1595 0xffff, /* dst_mask */
1596 FALSE), /* pcrel_offset */
1597
1598 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1599 HOWTO (R_PPC64_TPREL16_HIGHERA,
1600 32, /* rightshift */
1601 1, /* size (0 = byte, 1 = short, 2 = long) */
1602 16, /* bitsize */
1603 FALSE, /* pc_relative */
1604 0, /* bitpos */
1605 complain_overflow_dont, /* complain_on_overflow */
1606 ppc64_elf_unhandled_reloc, /* special_function */
1607 "R_PPC64_TPREL16_HIGHERA", /* name */
1608 FALSE, /* partial_inplace */
1609 0, /* src_mask */
1610 0xffff, /* dst_mask */
1611 FALSE), /* pcrel_offset */
1612
1613 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1614 HOWTO (R_PPC64_TPREL16_HIGHEST,
1615 48, /* rightshift */
1616 1, /* size (0 = byte, 1 = short, 2 = long) */
1617 16, /* bitsize */
1618 FALSE, /* pc_relative */
1619 0, /* bitpos */
1620 complain_overflow_dont, /* complain_on_overflow */
1621 ppc64_elf_unhandled_reloc, /* special_function */
1622 "R_PPC64_TPREL16_HIGHEST", /* name */
1623 FALSE, /* partial_inplace */
1624 0, /* src_mask */
1625 0xffff, /* dst_mask */
1626 FALSE), /* pcrel_offset */
1627
1628 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1629 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1630 48, /* rightshift */
1631 1, /* size (0 = byte, 1 = short, 2 = long) */
1632 16, /* bitsize */
1633 FALSE, /* pc_relative */
1634 0, /* bitpos */
1635 complain_overflow_dont, /* complain_on_overflow */
1636 ppc64_elf_unhandled_reloc, /* special_function */
1637 "R_PPC64_TPREL16_HIGHESTA", /* name */
1638 FALSE, /* partial_inplace */
1639 0, /* src_mask */
1640 0xffff, /* dst_mask */
1641 FALSE), /* pcrel_offset */
1642
1643 /* Like TPREL16, but for insns with a DS field. */
1644 HOWTO (R_PPC64_TPREL16_DS,
1645 0, /* rightshift */
1646 1, /* size (0 = byte, 1 = short, 2 = long) */
1647 16, /* bitsize */
1648 FALSE, /* pc_relative */
1649 0, /* bitpos */
1650 complain_overflow_signed, /* complain_on_overflow */
1651 ppc64_elf_unhandled_reloc, /* special_function */
1652 "R_PPC64_TPREL16_DS", /* name */
1653 FALSE, /* partial_inplace */
1654 0, /* src_mask */
1655 0xfffc, /* dst_mask */
1656 FALSE), /* pcrel_offset */
1657
1658 /* Like TPREL16_DS, but no overflow. */
1659 HOWTO (R_PPC64_TPREL16_LO_DS,
1660 0, /* rightshift */
1661 1, /* size (0 = byte, 1 = short, 2 = long) */
1662 16, /* bitsize */
1663 FALSE, /* pc_relative */
1664 0, /* bitpos */
1665 complain_overflow_dont, /* complain_on_overflow */
1666 ppc64_elf_unhandled_reloc, /* special_function */
1667 "R_PPC64_TPREL16_LO_DS", /* name */
1668 FALSE, /* partial_inplace */
1669 0, /* src_mask */
1670 0xfffc, /* dst_mask */
1671 FALSE), /* pcrel_offset */
1672
1673 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1674 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1675 to the first entry relative to the TOC base (r2). */
1676 HOWTO (R_PPC64_GOT_TLSGD16,
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_signed, /* complain_on_overflow */
1683 ppc64_elf_unhandled_reloc, /* special_function */
1684 "R_PPC64_GOT_TLSGD16", /* name */
1685 FALSE, /* partial_inplace */
1686 0, /* src_mask */
1687 0xffff, /* dst_mask */
1688 FALSE), /* pcrel_offset */
1689
1690 /* Like GOT_TLSGD16, but no overflow. */
1691 HOWTO (R_PPC64_GOT_TLSGD16_LO,
1692 0, /* rightshift */
1693 1, /* size (0 = byte, 1 = short, 2 = long) */
1694 16, /* bitsize */
1695 FALSE, /* pc_relative */
1696 0, /* bitpos */
1697 complain_overflow_dont, /* complain_on_overflow */
1698 ppc64_elf_unhandled_reloc, /* special_function */
1699 "R_PPC64_GOT_TLSGD16_LO", /* name */
1700 FALSE, /* partial_inplace */
1701 0, /* src_mask */
1702 0xffff, /* dst_mask */
1703 FALSE), /* pcrel_offset */
1704
1705 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1706 HOWTO (R_PPC64_GOT_TLSGD16_HI,
1707 16, /* rightshift */
1708 1, /* size (0 = byte, 1 = short, 2 = long) */
1709 16, /* bitsize */
1710 FALSE, /* pc_relative */
1711 0, /* bitpos */
1712 complain_overflow_signed, /* complain_on_overflow */
1713 ppc64_elf_unhandled_reloc, /* special_function */
1714 "R_PPC64_GOT_TLSGD16_HI", /* name */
1715 FALSE, /* partial_inplace */
1716 0, /* src_mask */
1717 0xffff, /* dst_mask */
1718 FALSE), /* pcrel_offset */
1719
1720 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1721 HOWTO (R_PPC64_GOT_TLSGD16_HA,
1722 16, /* rightshift */
1723 1, /* size (0 = byte, 1 = short, 2 = long) */
1724 16, /* bitsize */
1725 FALSE, /* pc_relative */
1726 0, /* bitpos */
1727 complain_overflow_signed, /* complain_on_overflow */
1728 ppc64_elf_unhandled_reloc, /* special_function */
1729 "R_PPC64_GOT_TLSGD16_HA", /* name */
1730 FALSE, /* partial_inplace */
1731 0, /* src_mask */
1732 0xffff, /* dst_mask */
1733 FALSE), /* pcrel_offset */
1734
1735 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1736 with values (sym+add)@dtpmod and zero, and computes the offset to the
1737 first entry relative to the TOC base (r2). */
1738 HOWTO (R_PPC64_GOT_TLSLD16,
1739 0, /* 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_TLSLD16", /* name */
1747 FALSE, /* partial_inplace */
1748 0, /* src_mask */
1749 0xffff, /* dst_mask */
1750 FALSE), /* pcrel_offset */
1751
1752 /* Like GOT_TLSLD16, but no overflow. */
1753 HOWTO (R_PPC64_GOT_TLSLD16_LO,
1754 0, /* rightshift */
1755 1, /* size (0 = byte, 1 = short, 2 = long) */
1756 16, /* bitsize */
1757 FALSE, /* pc_relative */
1758 0, /* bitpos */
1759 complain_overflow_dont, /* complain_on_overflow */
1760 ppc64_elf_unhandled_reloc, /* special_function */
1761 "R_PPC64_GOT_TLSLD16_LO", /* name */
1762 FALSE, /* partial_inplace */
1763 0, /* src_mask */
1764 0xffff, /* dst_mask */
1765 FALSE), /* pcrel_offset */
1766
1767 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1768 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1769 16, /* rightshift */
1770 1, /* size (0 = byte, 1 = short, 2 = long) */
1771 16, /* bitsize */
1772 FALSE, /* pc_relative */
1773 0, /* bitpos */
1774 complain_overflow_signed, /* complain_on_overflow */
1775 ppc64_elf_unhandled_reloc, /* special_function */
1776 "R_PPC64_GOT_TLSLD16_HI", /* name */
1777 FALSE, /* partial_inplace */
1778 0, /* src_mask */
1779 0xffff, /* dst_mask */
1780 FALSE), /* pcrel_offset */
1781
1782 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1783 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1784 16, /* rightshift */
1785 1, /* size (0 = byte, 1 = short, 2 = long) */
1786 16, /* bitsize */
1787 FALSE, /* pc_relative */
1788 0, /* bitpos */
1789 complain_overflow_signed, /* complain_on_overflow */
1790 ppc64_elf_unhandled_reloc, /* special_function */
1791 "R_PPC64_GOT_TLSLD16_HA", /* name */
1792 FALSE, /* partial_inplace */
1793 0, /* src_mask */
1794 0xffff, /* dst_mask */
1795 FALSE), /* pcrel_offset */
1796
1797 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1798 the offset to the entry relative to the TOC base (r2). */
1799 HOWTO (R_PPC64_GOT_DTPREL16_DS,
1800 0, /* rightshift */
1801 1, /* size (0 = byte, 1 = short, 2 = long) */
1802 16, /* bitsize */
1803 FALSE, /* pc_relative */
1804 0, /* bitpos */
1805 complain_overflow_signed, /* complain_on_overflow */
1806 ppc64_elf_unhandled_reloc, /* special_function */
1807 "R_PPC64_GOT_DTPREL16_DS", /* name */
1808 FALSE, /* partial_inplace */
1809 0, /* src_mask */
1810 0xfffc, /* dst_mask */
1811 FALSE), /* pcrel_offset */
1812
1813 /* Like GOT_DTPREL16_DS, but no overflow. */
1814 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
1815 0, /* rightshift */
1816 1, /* size (0 = byte, 1 = short, 2 = long) */
1817 16, /* bitsize */
1818 FALSE, /* pc_relative */
1819 0, /* bitpos */
1820 complain_overflow_dont, /* complain_on_overflow */
1821 ppc64_elf_unhandled_reloc, /* special_function */
1822 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1823 FALSE, /* partial_inplace */
1824 0, /* src_mask */
1825 0xfffc, /* dst_mask */
1826 FALSE), /* pcrel_offset */
1827
1828 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1829 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1830 16, /* rightshift */
1831 1, /* size (0 = byte, 1 = short, 2 = long) */
1832 16, /* bitsize */
1833 FALSE, /* pc_relative */
1834 0, /* bitpos */
1835 complain_overflow_signed, /* complain_on_overflow */
1836 ppc64_elf_unhandled_reloc, /* special_function */
1837 "R_PPC64_GOT_DTPREL16_HI", /* name */
1838 FALSE, /* partial_inplace */
1839 0, /* src_mask */
1840 0xffff, /* dst_mask */
1841 FALSE), /* pcrel_offset */
1842
1843 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1844 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1845 16, /* rightshift */
1846 1, /* size (0 = byte, 1 = short, 2 = long) */
1847 16, /* bitsize */
1848 FALSE, /* pc_relative */
1849 0, /* bitpos */
1850 complain_overflow_signed, /* complain_on_overflow */
1851 ppc64_elf_unhandled_reloc, /* special_function */
1852 "R_PPC64_GOT_DTPREL16_HA", /* name */
1853 FALSE, /* partial_inplace */
1854 0, /* src_mask */
1855 0xffff, /* dst_mask */
1856 FALSE), /* pcrel_offset */
1857
1858 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1859 offset to the entry relative to the TOC base (r2). */
1860 HOWTO (R_PPC64_GOT_TPREL16_DS,
1861 0, /* rightshift */
1862 1, /* size (0 = byte, 1 = short, 2 = long) */
1863 16, /* bitsize */
1864 FALSE, /* pc_relative */
1865 0, /* bitpos */
1866 complain_overflow_signed, /* complain_on_overflow */
1867 ppc64_elf_unhandled_reloc, /* special_function */
1868 "R_PPC64_GOT_TPREL16_DS", /* name */
1869 FALSE, /* partial_inplace */
1870 0, /* src_mask */
1871 0xfffc, /* dst_mask */
1872 FALSE), /* pcrel_offset */
1873
1874 /* Like GOT_TPREL16_DS, but no overflow. */
1875 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
1876 0, /* rightshift */
1877 1, /* size (0 = byte, 1 = short, 2 = long) */
1878 16, /* bitsize */
1879 FALSE, /* pc_relative */
1880 0, /* bitpos */
1881 complain_overflow_dont, /* complain_on_overflow */
1882 ppc64_elf_unhandled_reloc, /* special_function */
1883 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1884 FALSE, /* partial_inplace */
1885 0, /* src_mask */
1886 0xfffc, /* dst_mask */
1887 FALSE), /* pcrel_offset */
1888
1889 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1890 HOWTO (R_PPC64_GOT_TPREL16_HI,
1891 16, /* rightshift */
1892 1, /* size (0 = byte, 1 = short, 2 = long) */
1893 16, /* bitsize */
1894 FALSE, /* pc_relative */
1895 0, /* bitpos */
1896 complain_overflow_signed, /* complain_on_overflow */
1897 ppc64_elf_unhandled_reloc, /* special_function */
1898 "R_PPC64_GOT_TPREL16_HI", /* name */
1899 FALSE, /* partial_inplace */
1900 0, /* src_mask */
1901 0xffff, /* dst_mask */
1902 FALSE), /* pcrel_offset */
1903
1904 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1905 HOWTO (R_PPC64_GOT_TPREL16_HA,
1906 16, /* rightshift */
1907 1, /* size (0 = byte, 1 = short, 2 = long) */
1908 16, /* bitsize */
1909 FALSE, /* pc_relative */
1910 0, /* bitpos */
1911 complain_overflow_signed, /* complain_on_overflow */
1912 ppc64_elf_unhandled_reloc, /* special_function */
1913 "R_PPC64_GOT_TPREL16_HA", /* name */
1914 FALSE, /* partial_inplace */
1915 0, /* src_mask */
1916 0xffff, /* dst_mask */
1917 FALSE), /* pcrel_offset */
1918
1919 HOWTO (R_PPC64_JMP_IREL, /* type */
1920 0, /* rightshift */
1921 0, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1922 0, /* bitsize */
1923 FALSE, /* pc_relative */
1924 0, /* bitpos */
1925 complain_overflow_dont, /* complain_on_overflow */
1926 ppc64_elf_unhandled_reloc, /* special_function */
1927 "R_PPC64_JMP_IREL", /* name */
1928 FALSE, /* partial_inplace */
1929 0, /* src_mask */
1930 0, /* dst_mask */
1931 FALSE), /* pcrel_offset */
1932
1933 HOWTO (R_PPC64_IRELATIVE, /* type */
1934 0, /* rightshift */
1935 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
1936 64, /* bitsize */
1937 FALSE, /* pc_relative */
1938 0, /* bitpos */
1939 complain_overflow_dont, /* complain_on_overflow */
1940 bfd_elf_generic_reloc, /* special_function */
1941 "R_PPC64_IRELATIVE", /* name */
1942 FALSE, /* partial_inplace */
1943 0, /* src_mask */
1944 ONES (64), /* dst_mask */
1945 FALSE), /* pcrel_offset */
1946
1947 /* A 16 bit relative relocation. */
1948 HOWTO (R_PPC64_REL16, /* type */
1949 0, /* rightshift */
1950 1, /* size (0 = byte, 1 = short, 2 = long) */
1951 16, /* bitsize */
1952 TRUE, /* pc_relative */
1953 0, /* bitpos */
1954 complain_overflow_bitfield, /* complain_on_overflow */
1955 bfd_elf_generic_reloc, /* special_function */
1956 "R_PPC64_REL16", /* name */
1957 FALSE, /* partial_inplace */
1958 0, /* src_mask */
1959 0xffff, /* dst_mask */
1960 TRUE), /* pcrel_offset */
1961
1962 /* A 16 bit relative relocation without overflow. */
1963 HOWTO (R_PPC64_REL16_LO, /* type */
1964 0, /* rightshift */
1965 1, /* size (0 = byte, 1 = short, 2 = long) */
1966 16, /* bitsize */
1967 TRUE, /* pc_relative */
1968 0, /* bitpos */
1969 complain_overflow_dont,/* complain_on_overflow */
1970 bfd_elf_generic_reloc, /* special_function */
1971 "R_PPC64_REL16_LO", /* name */
1972 FALSE, /* partial_inplace */
1973 0, /* src_mask */
1974 0xffff, /* dst_mask */
1975 TRUE), /* pcrel_offset */
1976
1977 /* The high order 16 bits of a relative address. */
1978 HOWTO (R_PPC64_REL16_HI, /* type */
1979 16, /* rightshift */
1980 1, /* size (0 = byte, 1 = short, 2 = long) */
1981 16, /* bitsize */
1982 TRUE, /* pc_relative */
1983 0, /* bitpos */
1984 complain_overflow_signed, /* complain_on_overflow */
1985 bfd_elf_generic_reloc, /* special_function */
1986 "R_PPC64_REL16_HI", /* name */
1987 FALSE, /* partial_inplace */
1988 0, /* src_mask */
1989 0xffff, /* dst_mask */
1990 TRUE), /* pcrel_offset */
1991
1992 /* The high order 16 bits of a relative address, plus 1 if the contents of
1993 the low 16 bits, treated as a signed number, is negative. */
1994 HOWTO (R_PPC64_REL16_HA, /* type */
1995 16, /* rightshift */
1996 1, /* size (0 = byte, 1 = short, 2 = long) */
1997 16, /* bitsize */
1998 TRUE, /* pc_relative */
1999 0, /* bitpos */
2000 complain_overflow_signed, /* complain_on_overflow */
2001 ppc64_elf_ha_reloc, /* special_function */
2002 "R_PPC64_REL16_HA", /* name */
2003 FALSE, /* partial_inplace */
2004 0, /* src_mask */
2005 0xffff, /* dst_mask */
2006 TRUE), /* pcrel_offset */
2007
2008 /* Like R_PPC64_ADDR16_HI, but no overflow. */
2009 HOWTO (R_PPC64_ADDR16_HIGH, /* type */
2010 16, /* rightshift */
2011 1, /* size (0 = byte, 1 = short, 2 = long) */
2012 16, /* bitsize */
2013 FALSE, /* pc_relative */
2014 0, /* bitpos */
2015 complain_overflow_dont, /* complain_on_overflow */
2016 bfd_elf_generic_reloc, /* special_function */
2017 "R_PPC64_ADDR16_HIGH", /* name */
2018 FALSE, /* partial_inplace */
2019 0, /* src_mask */
2020 0xffff, /* dst_mask */
2021 FALSE), /* pcrel_offset */
2022
2023 /* Like R_PPC64_ADDR16_HA, but no overflow. */
2024 HOWTO (R_PPC64_ADDR16_HIGHA, /* type */
2025 16, /* rightshift */
2026 1, /* size (0 = byte, 1 = short, 2 = long) */
2027 16, /* bitsize */
2028 FALSE, /* pc_relative */
2029 0, /* bitpos */
2030 complain_overflow_dont, /* complain_on_overflow */
2031 ppc64_elf_ha_reloc, /* special_function */
2032 "R_PPC64_ADDR16_HIGHA", /* name */
2033 FALSE, /* partial_inplace */
2034 0, /* src_mask */
2035 0xffff, /* dst_mask */
2036 FALSE), /* pcrel_offset */
2037
2038 /* Like R_PPC64_DTPREL16_HI, but no overflow. */
2039 HOWTO (R_PPC64_DTPREL16_HIGH,
2040 16, /* rightshift */
2041 1, /* size (0 = byte, 1 = short, 2 = long) */
2042 16, /* bitsize */
2043 FALSE, /* pc_relative */
2044 0, /* bitpos */
2045 complain_overflow_dont, /* complain_on_overflow */
2046 ppc64_elf_unhandled_reloc, /* special_function */
2047 "R_PPC64_DTPREL16_HIGH", /* name */
2048 FALSE, /* partial_inplace */
2049 0, /* src_mask */
2050 0xffff, /* dst_mask */
2051 FALSE), /* pcrel_offset */
2052
2053 /* Like R_PPC64_DTPREL16_HA, but no overflow. */
2054 HOWTO (R_PPC64_DTPREL16_HIGHA,
2055 16, /* rightshift */
2056 1, /* size (0 = byte, 1 = short, 2 = long) */
2057 16, /* bitsize */
2058 FALSE, /* pc_relative */
2059 0, /* bitpos */
2060 complain_overflow_dont, /* complain_on_overflow */
2061 ppc64_elf_unhandled_reloc, /* special_function */
2062 "R_PPC64_DTPREL16_HIGHA", /* name */
2063 FALSE, /* partial_inplace */
2064 0, /* src_mask */
2065 0xffff, /* dst_mask */
2066 FALSE), /* pcrel_offset */
2067
2068 /* Like R_PPC64_TPREL16_HI, but no overflow. */
2069 HOWTO (R_PPC64_TPREL16_HIGH,
2070 16, /* rightshift */
2071 1, /* size (0 = byte, 1 = short, 2 = long) */
2072 16, /* bitsize */
2073 FALSE, /* pc_relative */
2074 0, /* bitpos */
2075 complain_overflow_dont, /* complain_on_overflow */
2076 ppc64_elf_unhandled_reloc, /* special_function */
2077 "R_PPC64_TPREL16_HIGH", /* name */
2078 FALSE, /* partial_inplace */
2079 0, /* src_mask */
2080 0xffff, /* dst_mask */
2081 FALSE), /* pcrel_offset */
2082
2083 /* Like R_PPC64_TPREL16_HA, but no overflow. */
2084 HOWTO (R_PPC64_TPREL16_HIGHA,
2085 16, /* rightshift */
2086 1, /* size (0 = byte, 1 = short, 2 = long) */
2087 16, /* bitsize */
2088 FALSE, /* pc_relative */
2089 0, /* bitpos */
2090 complain_overflow_dont, /* complain_on_overflow */
2091 ppc64_elf_unhandled_reloc, /* special_function */
2092 "R_PPC64_TPREL16_HIGHA", /* name */
2093 FALSE, /* partial_inplace */
2094 0, /* src_mask */
2095 0xffff, /* dst_mask */
2096 FALSE), /* pcrel_offset */
2097
2098 /* GNU extension to record C++ vtable hierarchy. */
2099 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
2100 0, /* rightshift */
2101 0, /* size (0 = byte, 1 = short, 2 = long) */
2102 0, /* bitsize */
2103 FALSE, /* pc_relative */
2104 0, /* bitpos */
2105 complain_overflow_dont, /* complain_on_overflow */
2106 NULL, /* special_function */
2107 "R_PPC64_GNU_VTINHERIT", /* name */
2108 FALSE, /* partial_inplace */
2109 0, /* src_mask */
2110 0, /* dst_mask */
2111 FALSE), /* pcrel_offset */
2112
2113 /* GNU extension to record C++ vtable member usage. */
2114 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
2115 0, /* rightshift */
2116 0, /* size (0 = byte, 1 = short, 2 = long) */
2117 0, /* bitsize */
2118 FALSE, /* pc_relative */
2119 0, /* bitpos */
2120 complain_overflow_dont, /* complain_on_overflow */
2121 NULL, /* special_function */
2122 "R_PPC64_GNU_VTENTRY", /* name */
2123 FALSE, /* partial_inplace */
2124 0, /* src_mask */
2125 0, /* dst_mask */
2126 FALSE), /* pcrel_offset */
2127 };
2128
2129 \f
2130 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
2131 be done. */
2132
2133 static void
2134 ppc_howto_init (void)
2135 {
2136 unsigned int i, type;
2137
2138 for (i = 0;
2139 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2140 i++)
2141 {
2142 type = ppc64_elf_howto_raw[i].type;
2143 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2144 / sizeof (ppc64_elf_howto_table[0])));
2145 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
2146 }
2147 }
2148
2149 static reloc_howto_type *
2150 ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2151 bfd_reloc_code_real_type code)
2152 {
2153 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
2154
2155 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2156 /* Initialize howto table if needed. */
2157 ppc_howto_init ();
2158
2159 switch (code)
2160 {
2161 default:
2162 return NULL;
2163
2164 case BFD_RELOC_NONE: r = R_PPC64_NONE;
2165 break;
2166 case BFD_RELOC_32: r = R_PPC64_ADDR32;
2167 break;
2168 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
2169 break;
2170 case BFD_RELOC_16: r = R_PPC64_ADDR16;
2171 break;
2172 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
2173 break;
2174 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
2175 break;
2176 case BFD_RELOC_PPC64_ADDR16_HIGH: r = R_PPC64_ADDR16_HIGH;
2177 break;
2178 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
2179 break;
2180 case BFD_RELOC_PPC64_ADDR16_HIGHA: r = R_PPC64_ADDR16_HIGHA;
2181 break;
2182 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
2183 break;
2184 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
2185 break;
2186 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
2187 break;
2188 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
2189 break;
2190 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
2191 break;
2192 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
2193 break;
2194 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
2195 break;
2196 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
2197 break;
2198 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
2199 break;
2200 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
2201 break;
2202 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
2203 break;
2204 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
2205 break;
2206 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
2207 break;
2208 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
2209 break;
2210 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
2211 break;
2212 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
2213 break;
2214 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
2215 break;
2216 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
2217 break;
2218 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
2219 break;
2220 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
2221 break;
2222 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
2223 break;
2224 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
2225 break;
2226 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
2227 break;
2228 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
2229 break;
2230 case BFD_RELOC_64: r = R_PPC64_ADDR64;
2231 break;
2232 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
2233 break;
2234 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
2235 break;
2236 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
2237 break;
2238 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
2239 break;
2240 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
2241 break;
2242 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
2243 break;
2244 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
2245 break;
2246 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
2247 break;
2248 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
2249 break;
2250 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
2251 break;
2252 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
2253 break;
2254 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
2255 break;
2256 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
2257 break;
2258 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
2259 break;
2260 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
2261 break;
2262 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
2263 break;
2264 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
2265 break;
2266 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
2267 break;
2268 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
2269 break;
2270 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
2271 break;
2272 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
2273 break;
2274 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
2275 break;
2276 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
2277 break;
2278 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
2279 break;
2280 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
2281 break;
2282 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
2283 break;
2284 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
2285 break;
2286 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
2287 break;
2288 case BFD_RELOC_PPC_TLSGD: r = R_PPC64_TLSGD;
2289 break;
2290 case BFD_RELOC_PPC_TLSLD: r = R_PPC64_TLSLD;
2291 break;
2292 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
2293 break;
2294 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
2295 break;
2296 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
2297 break;
2298 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
2299 break;
2300 case BFD_RELOC_PPC64_TPREL16_HIGH: r = R_PPC64_TPREL16_HIGH;
2301 break;
2302 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
2303 break;
2304 case BFD_RELOC_PPC64_TPREL16_HIGHA: r = R_PPC64_TPREL16_HIGHA;
2305 break;
2306 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
2307 break;
2308 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2309 break;
2310 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2311 break;
2312 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2313 break;
2314 case BFD_RELOC_PPC64_DTPREL16_HIGH: r = R_PPC64_DTPREL16_HIGH;
2315 break;
2316 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2317 break;
2318 case BFD_RELOC_PPC64_DTPREL16_HIGHA: r = R_PPC64_DTPREL16_HIGHA;
2319 break;
2320 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2321 break;
2322 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2323 break;
2324 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2325 break;
2326 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2327 break;
2328 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2329 break;
2330 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2331 break;
2332 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2333 break;
2334 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2335 break;
2336 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2337 break;
2338 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2339 break;
2340 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2341 break;
2342 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2343 break;
2344 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2345 break;
2346 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2347 break;
2348 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2349 break;
2350 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2351 break;
2352 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2353 break;
2354 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2355 break;
2356 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2357 break;
2358 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2359 break;
2360 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2361 break;
2362 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2363 break;
2364 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2365 break;
2366 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2367 break;
2368 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2369 break;
2370 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2371 break;
2372 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2373 break;
2374 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2375 break;
2376 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2377 break;
2378 case BFD_RELOC_16_PCREL: r = R_PPC64_REL16;
2379 break;
2380 case BFD_RELOC_LO16_PCREL: r = R_PPC64_REL16_LO;
2381 break;
2382 case BFD_RELOC_HI16_PCREL: r = R_PPC64_REL16_HI;
2383 break;
2384 case BFD_RELOC_HI16_S_PCREL: r = R_PPC64_REL16_HA;
2385 break;
2386 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2387 break;
2388 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
2389 break;
2390 }
2391
2392 return ppc64_elf_howto_table[r];
2393 };
2394
2395 static reloc_howto_type *
2396 ppc64_elf_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2397 const char *r_name)
2398 {
2399 unsigned int i;
2400
2401 for (i = 0;
2402 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
2403 i++)
2404 if (ppc64_elf_howto_raw[i].name != NULL
2405 && strcasecmp (ppc64_elf_howto_raw[i].name, r_name) == 0)
2406 return &ppc64_elf_howto_raw[i];
2407
2408 return NULL;
2409 }
2410
2411 /* Set the howto pointer for a PowerPC ELF reloc. */
2412
2413 static void
2414 ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2415 Elf_Internal_Rela *dst)
2416 {
2417 unsigned int type;
2418
2419 /* Initialize howto table if needed. */
2420 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
2421 ppc_howto_init ();
2422
2423 type = ELF64_R_TYPE (dst->r_info);
2424 if (type >= (sizeof (ppc64_elf_howto_table)
2425 / sizeof (ppc64_elf_howto_table[0])))
2426 {
2427 (*_bfd_error_handler) (_("%B: invalid relocation type %d"),
2428 abfd, (int) type);
2429 type = R_PPC64_NONE;
2430 }
2431 cache_ptr->howto = ppc64_elf_howto_table[type];
2432 }
2433
2434 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2435
2436 static bfd_reloc_status_type
2437 ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2438 void *data, asection *input_section,
2439 bfd *output_bfd, char **error_message)
2440 {
2441 /* If this is a relocatable link (output_bfd test tells us), just
2442 call the generic function. Any adjustment will be done at final
2443 link time. */
2444 if (output_bfd != NULL)
2445 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2446 input_section, output_bfd, error_message);
2447
2448 /* Adjust the addend for sign extension of the low 16 bits.
2449 We won't actually be using the low 16 bits, so trashing them
2450 doesn't matter. */
2451 reloc_entry->addend += 0x8000;
2452 return bfd_reloc_continue;
2453 }
2454
2455 static bfd_reloc_status_type
2456 ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2457 void *data, asection *input_section,
2458 bfd *output_bfd, char **error_message)
2459 {
2460 if (output_bfd != NULL)
2461 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2462 input_section, output_bfd, error_message);
2463
2464 if (strcmp (symbol->section->name, ".opd") == 0
2465 && (symbol->section->owner->flags & DYNAMIC) == 0)
2466 {
2467 bfd_vma dest = opd_entry_value (symbol->section,
2468 symbol->value + reloc_entry->addend,
2469 NULL, NULL, FALSE);
2470 if (dest != (bfd_vma) -1)
2471 reloc_entry->addend = dest - (symbol->value
2472 + symbol->section->output_section->vma
2473 + symbol->section->output_offset);
2474 }
2475 return bfd_reloc_continue;
2476 }
2477
2478 static bfd_reloc_status_type
2479 ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2480 void *data, asection *input_section,
2481 bfd *output_bfd, char **error_message)
2482 {
2483 long insn;
2484 enum elf_ppc64_reloc_type r_type;
2485 bfd_size_type octets;
2486 /* Assume 'at' branch hints. */
2487 bfd_boolean is_isa_v2 = TRUE;
2488
2489 /* If this is a relocatable link (output_bfd test tells us), just
2490 call the generic function. Any adjustment will be done at final
2491 link time. */
2492 if (output_bfd != NULL)
2493 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2494 input_section, output_bfd, error_message);
2495
2496 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2497 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2498 insn &= ~(0x01 << 21);
2499 r_type = reloc_entry->howto->type;
2500 if (r_type == R_PPC64_ADDR14_BRTAKEN
2501 || r_type == R_PPC64_REL14_BRTAKEN)
2502 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2503
2504 if (is_isa_v2)
2505 {
2506 /* Set 'a' bit. This is 0b00010 in BO field for branch
2507 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2508 for branch on CTR insns (BO == 1a00t or 1a01t). */
2509 if ((insn & (0x14 << 21)) == (0x04 << 21))
2510 insn |= 0x02 << 21;
2511 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2512 insn |= 0x08 << 21;
2513 else
2514 goto out;
2515 }
2516 else
2517 {
2518 bfd_vma target = 0;
2519 bfd_vma from;
2520
2521 if (!bfd_is_com_section (symbol->section))
2522 target = symbol->value;
2523 target += symbol->section->output_section->vma;
2524 target += symbol->section->output_offset;
2525 target += reloc_entry->addend;
2526
2527 from = (reloc_entry->address
2528 + input_section->output_offset
2529 + input_section->output_section->vma);
2530
2531 /* Invert 'y' bit if not the default. */
2532 if ((bfd_signed_vma) (target - from) < 0)
2533 insn ^= 0x01 << 21;
2534 }
2535 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2536 out:
2537 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2538 input_section, output_bfd, error_message);
2539 }
2540
2541 static bfd_reloc_status_type
2542 ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2543 void *data, asection *input_section,
2544 bfd *output_bfd, char **error_message)
2545 {
2546 /* If this is a relocatable link (output_bfd test tells us), just
2547 call the generic function. Any adjustment will be done at final
2548 link time. */
2549 if (output_bfd != NULL)
2550 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2551 input_section, output_bfd, error_message);
2552
2553 /* Subtract the symbol section base address. */
2554 reloc_entry->addend -= symbol->section->output_section->vma;
2555 return bfd_reloc_continue;
2556 }
2557
2558 static bfd_reloc_status_type
2559 ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2560 void *data, asection *input_section,
2561 bfd *output_bfd, char **error_message)
2562 {
2563 /* If this is a relocatable link (output_bfd test tells us), just
2564 call the generic function. Any adjustment will be done at final
2565 link time. */
2566 if (output_bfd != NULL)
2567 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2568 input_section, output_bfd, error_message);
2569
2570 /* Subtract the symbol section base address. */
2571 reloc_entry->addend -= symbol->section->output_section->vma;
2572
2573 /* Adjust the addend for sign extension of the low 16 bits. */
2574 reloc_entry->addend += 0x8000;
2575 return bfd_reloc_continue;
2576 }
2577
2578 static bfd_reloc_status_type
2579 ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2580 void *data, asection *input_section,
2581 bfd *output_bfd, char **error_message)
2582 {
2583 bfd_vma TOCstart;
2584
2585 /* If this is a relocatable link (output_bfd test tells us), just
2586 call the generic function. Any adjustment will be done at final
2587 link time. */
2588 if (output_bfd != NULL)
2589 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2590 input_section, output_bfd, error_message);
2591
2592 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2593 if (TOCstart == 0)
2594 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2595
2596 /* Subtract the TOC base address. */
2597 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2598 return bfd_reloc_continue;
2599 }
2600
2601 static bfd_reloc_status_type
2602 ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2603 void *data, asection *input_section,
2604 bfd *output_bfd, char **error_message)
2605 {
2606 bfd_vma TOCstart;
2607
2608 /* If this is a relocatable link (output_bfd test tells us), just
2609 call the generic function. Any adjustment will be done at final
2610 link time. */
2611 if (output_bfd != NULL)
2612 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2613 input_section, output_bfd, error_message);
2614
2615 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2616 if (TOCstart == 0)
2617 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2618
2619 /* Subtract the TOC base address. */
2620 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2621
2622 /* Adjust the addend for sign extension of the low 16 bits. */
2623 reloc_entry->addend += 0x8000;
2624 return bfd_reloc_continue;
2625 }
2626
2627 static bfd_reloc_status_type
2628 ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2629 void *data, asection *input_section,
2630 bfd *output_bfd, char **error_message)
2631 {
2632 bfd_vma TOCstart;
2633 bfd_size_type octets;
2634
2635 /* If this is a relocatable link (output_bfd test tells us), just
2636 call the generic function. Any adjustment will be done at final
2637 link time. */
2638 if (output_bfd != NULL)
2639 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2640 input_section, output_bfd, error_message);
2641
2642 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2643 if (TOCstart == 0)
2644 TOCstart = ppc64_elf_set_toc (NULL, input_section->output_section->owner);
2645
2646 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2647 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2648 return bfd_reloc_ok;
2649 }
2650
2651 static bfd_reloc_status_type
2652 ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2653 void *data, asection *input_section,
2654 bfd *output_bfd, char **error_message)
2655 {
2656 /* If this is a relocatable link (output_bfd test tells us), just
2657 call the generic function. Any adjustment will be done at final
2658 link time. */
2659 if (output_bfd != NULL)
2660 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2661 input_section, output_bfd, error_message);
2662
2663 if (error_message != NULL)
2664 {
2665 static char buf[60];
2666 sprintf (buf, "generic linker can't handle %s",
2667 reloc_entry->howto->name);
2668 *error_message = buf;
2669 }
2670 return bfd_reloc_dangerous;
2671 }
2672
2673 /* Track GOT entries needed for a given symbol. We might need more
2674 than one got entry per symbol. */
2675 struct got_entry
2676 {
2677 struct got_entry *next;
2678
2679 /* The symbol addend that we'll be placing in the GOT. */
2680 bfd_vma addend;
2681
2682 /* Unlike other ELF targets, we use separate GOT entries for the same
2683 symbol referenced from different input files. This is to support
2684 automatic multiple TOC/GOT sections, where the TOC base can vary
2685 from one input file to another. After partitioning into TOC groups
2686 we merge entries within the group.
2687
2688 Point to the BFD owning this GOT entry. */
2689 bfd *owner;
2690
2691 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2692 TLS_TPREL or TLS_DTPREL for tls entries. */
2693 unsigned char tls_type;
2694
2695 /* Non-zero if got.ent points to real entry. */
2696 unsigned char is_indirect;
2697
2698 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2699 union
2700 {
2701 bfd_signed_vma refcount;
2702 bfd_vma offset;
2703 struct got_entry *ent;
2704 } got;
2705 };
2706
2707 /* The same for PLT. */
2708 struct plt_entry
2709 {
2710 struct plt_entry *next;
2711
2712 bfd_vma addend;
2713
2714 union
2715 {
2716 bfd_signed_vma refcount;
2717 bfd_vma offset;
2718 } plt;
2719 };
2720
2721 struct ppc64_elf_obj_tdata
2722 {
2723 struct elf_obj_tdata elf;
2724
2725 /* Shortcuts to dynamic linker sections. */
2726 asection *got;
2727 asection *relgot;
2728
2729 /* Used during garbage collection. We attach global symbols defined
2730 on removed .opd entries to this section so that the sym is removed. */
2731 asection *deleted_section;
2732
2733 /* TLS local dynamic got entry handling. Support for multiple GOT
2734 sections means we potentially need one of these for each input bfd. */
2735 struct got_entry tlsld_got;
2736
2737 union {
2738 /* A copy of relocs before they are modified for --emit-relocs. */
2739 Elf_Internal_Rela *relocs;
2740
2741 /* Section contents. */
2742 bfd_byte *contents;
2743 } opd;
2744
2745 /* Nonzero if this bfd has small toc/got relocs, ie. that expect
2746 the reloc to be in the range -32768 to 32767. */
2747 unsigned int has_small_toc_reloc : 1;
2748
2749 /* Set if toc/got ha relocs detected not using r2, or lo reloc
2750 instruction not one we handle. */
2751 unsigned int unexpected_toc_insn : 1;
2752 };
2753
2754 #define ppc64_elf_tdata(bfd) \
2755 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2756
2757 #define ppc64_tlsld_got(bfd) \
2758 (&ppc64_elf_tdata (bfd)->tlsld_got)
2759
2760 #define is_ppc64_elf(bfd) \
2761 (bfd_get_flavour (bfd) == bfd_target_elf_flavour \
2762 && elf_object_id (bfd) == PPC64_ELF_DATA)
2763
2764 /* Override the generic function because we store some extras. */
2765
2766 static bfd_boolean
2767 ppc64_elf_mkobject (bfd *abfd)
2768 {
2769 return bfd_elf_allocate_object (abfd, sizeof (struct ppc64_elf_obj_tdata),
2770 PPC64_ELF_DATA);
2771 }
2772
2773 /* Fix bad default arch selected for a 64 bit input bfd when the
2774 default is 32 bit. */
2775
2776 static bfd_boolean
2777 ppc64_elf_object_p (bfd *abfd)
2778 {
2779 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2780 {
2781 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2782
2783 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2784 {
2785 /* Relies on arch after 32 bit default being 64 bit default. */
2786 abfd->arch_info = abfd->arch_info->next;
2787 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2788 }
2789 }
2790 return TRUE;
2791 }
2792
2793 /* Support for core dump NOTE sections. */
2794
2795 static bfd_boolean
2796 ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2797 {
2798 size_t offset, size;
2799
2800 if (note->descsz != 504)
2801 return FALSE;
2802
2803 /* pr_cursig */
2804 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
2805
2806 /* pr_pid */
2807 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
2808
2809 /* pr_reg */
2810 offset = 112;
2811 size = 384;
2812
2813 /* Make a ".reg/999" section. */
2814 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2815 size, note->descpos + offset);
2816 }
2817
2818 static bfd_boolean
2819 ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2820 {
2821 if (note->descsz != 136)
2822 return FALSE;
2823
2824 elf_tdata (abfd)->core->pid
2825 = bfd_get_32 (abfd, note->descdata + 24);
2826 elf_tdata (abfd)->core->program
2827 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2828 elf_tdata (abfd)->core->command
2829 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2830
2831 return TRUE;
2832 }
2833
2834 static char *
2835 ppc64_elf_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
2836 ...)
2837 {
2838 switch (note_type)
2839 {
2840 default:
2841 return NULL;
2842
2843 case NT_PRPSINFO:
2844 {
2845 char data[136];
2846 va_list ap;
2847
2848 va_start (ap, note_type);
2849 memset (data, 0, sizeof (data));
2850 strncpy (data + 40, va_arg (ap, const char *), 16);
2851 strncpy (data + 56, va_arg (ap, const char *), 80);
2852 va_end (ap);
2853 return elfcore_write_note (abfd, buf, bufsiz,
2854 "CORE", note_type, data, sizeof (data));
2855 }
2856
2857 case NT_PRSTATUS:
2858 {
2859 char data[504];
2860 va_list ap;
2861 long pid;
2862 int cursig;
2863 const void *greg;
2864
2865 va_start (ap, note_type);
2866 memset (data, 0, 112);
2867 pid = va_arg (ap, long);
2868 bfd_put_32 (abfd, pid, data + 32);
2869 cursig = va_arg (ap, int);
2870 bfd_put_16 (abfd, cursig, data + 12);
2871 greg = va_arg (ap, const void *);
2872 memcpy (data + 112, greg, 384);
2873 memset (data + 496, 0, 8);
2874 va_end (ap);
2875 return elfcore_write_note (abfd, buf, bufsiz,
2876 "CORE", note_type, data, sizeof (data));
2877 }
2878 }
2879 }
2880
2881 /* Add extra PPC sections. */
2882
2883 static const struct bfd_elf_special_section ppc64_elf_special_sections[]=
2884 {
2885 { STRING_COMMA_LEN (".plt"), 0, SHT_NOBITS, 0 },
2886 { STRING_COMMA_LEN (".sbss"), -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2887 { STRING_COMMA_LEN (".sdata"), -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2888 { STRING_COMMA_LEN (".toc"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2889 { STRING_COMMA_LEN (".toc1"), 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2890 { STRING_COMMA_LEN (".tocbss"), 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2891 { NULL, 0, 0, 0, 0 }
2892 };
2893
2894 enum _ppc64_sec_type {
2895 sec_normal = 0,
2896 sec_opd = 1,
2897 sec_toc = 2
2898 };
2899
2900 struct _ppc64_elf_section_data
2901 {
2902 struct bfd_elf_section_data elf;
2903
2904 union
2905 {
2906 /* An array with one entry for each opd function descriptor. */
2907 struct _opd_sec_data
2908 {
2909 /* Points to the function code section for local opd entries. */
2910 asection **func_sec;
2911
2912 /* After editing .opd, adjust references to opd local syms. */
2913 long *adjust;
2914 } opd;
2915
2916 /* An array for toc sections, indexed by offset/8. */
2917 struct _toc_sec_data
2918 {
2919 /* Specifies the relocation symbol index used at a given toc offset. */
2920 unsigned *symndx;
2921
2922 /* And the relocation addend. */
2923 bfd_vma *add;
2924 } toc;
2925 } u;
2926
2927 enum _ppc64_sec_type sec_type:2;
2928
2929 /* Flag set when small branches are detected. Used to
2930 select suitable defaults for the stub group size. */
2931 unsigned int has_14bit_branch:1;
2932 };
2933
2934 #define ppc64_elf_section_data(sec) \
2935 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2936
2937 static bfd_boolean
2938 ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
2939 {
2940 if (!sec->used_by_bfd)
2941 {
2942 struct _ppc64_elf_section_data *sdata;
2943 bfd_size_type amt = sizeof (*sdata);
2944
2945 sdata = bfd_zalloc (abfd, amt);
2946 if (sdata == NULL)
2947 return FALSE;
2948 sec->used_by_bfd = sdata;
2949 }
2950
2951 return _bfd_elf_new_section_hook (abfd, sec);
2952 }
2953
2954 static struct _opd_sec_data *
2955 get_opd_info (asection * sec)
2956 {
2957 if (sec != NULL
2958 && ppc64_elf_section_data (sec) != NULL
2959 && ppc64_elf_section_data (sec)->sec_type == sec_opd)
2960 return &ppc64_elf_section_data (sec)->u.opd;
2961 return NULL;
2962 }
2963
2964 static inline int
2965 abiversion (bfd *abfd)
2966 {
2967 return elf_elfheader (abfd)->e_flags & EF_PPC64_ABI;
2968 }
2969
2970 static inline void
2971 set_abiversion (bfd *abfd, int ver)
2972 {
2973 elf_elfheader (abfd)->e_flags &= ~EF_PPC64_ABI;
2974 elf_elfheader (abfd)->e_flags |= ver & EF_PPC64_ABI;
2975 }
2976 \f
2977 /* Parameters for the qsort hook. */
2978 static bfd_boolean synthetic_relocatable;
2979
2980 /* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
2981
2982 static int
2983 compare_symbols (const void *ap, const void *bp)
2984 {
2985 const asymbol *a = * (const asymbol **) ap;
2986 const asymbol *b = * (const asymbol **) bp;
2987
2988 /* Section symbols first. */
2989 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
2990 return -1;
2991 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
2992 return 1;
2993
2994 /* then .opd symbols. */
2995 if (strcmp (a->section->name, ".opd") == 0
2996 && strcmp (b->section->name, ".opd") != 0)
2997 return -1;
2998 if (strcmp (a->section->name, ".opd") != 0
2999 && strcmp (b->section->name, ".opd") == 0)
3000 return 1;
3001
3002 /* then other code symbols. */
3003 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3004 == (SEC_CODE | SEC_ALLOC)
3005 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3006 != (SEC_CODE | SEC_ALLOC))
3007 return -1;
3008
3009 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3010 != (SEC_CODE | SEC_ALLOC)
3011 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3012 == (SEC_CODE | SEC_ALLOC))
3013 return 1;
3014
3015 if (synthetic_relocatable)
3016 {
3017 if (a->section->id < b->section->id)
3018 return -1;
3019
3020 if (a->section->id > b->section->id)
3021 return 1;
3022 }
3023
3024 if (a->value + a->section->vma < b->value + b->section->vma)
3025 return -1;
3026
3027 if (a->value + a->section->vma > b->value + b->section->vma)
3028 return 1;
3029
3030 /* For syms with the same value, prefer strong dynamic global function
3031 syms over other syms. */
3032 if ((a->flags & BSF_GLOBAL) != 0 && (b->flags & BSF_GLOBAL) == 0)
3033 return -1;
3034
3035 if ((a->flags & BSF_GLOBAL) == 0 && (b->flags & BSF_GLOBAL) != 0)
3036 return 1;
3037
3038 if ((a->flags & BSF_FUNCTION) != 0 && (b->flags & BSF_FUNCTION) == 0)
3039 return -1;
3040
3041 if ((a->flags & BSF_FUNCTION) == 0 && (b->flags & BSF_FUNCTION) != 0)
3042 return 1;
3043
3044 if ((a->flags & BSF_WEAK) == 0 && (b->flags & BSF_WEAK) != 0)
3045 return -1;
3046
3047 if ((a->flags & BSF_WEAK) != 0 && (b->flags & BSF_WEAK) == 0)
3048 return 1;
3049
3050 if ((a->flags & BSF_DYNAMIC) != 0 && (b->flags & BSF_DYNAMIC) == 0)
3051 return -1;
3052
3053 if ((a->flags & BSF_DYNAMIC) == 0 && (b->flags & BSF_DYNAMIC) != 0)
3054 return 1;
3055
3056 return 0;
3057 }
3058
3059 /* Search SYMS for a symbol of the given VALUE. */
3060
3061 static asymbol *
3062 sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
3063 {
3064 long mid;
3065
3066 if (id == -1)
3067 {
3068 while (lo < hi)
3069 {
3070 mid = (lo + hi) >> 1;
3071 if (syms[mid]->value + syms[mid]->section->vma < value)
3072 lo = mid + 1;
3073 else if (syms[mid]->value + syms[mid]->section->vma > value)
3074 hi = mid;
3075 else
3076 return syms[mid];
3077 }
3078 }
3079 else
3080 {
3081 while (lo < hi)
3082 {
3083 mid = (lo + hi) >> 1;
3084 if (syms[mid]->section->id < id)
3085 lo = mid + 1;
3086 else if (syms[mid]->section->id > id)
3087 hi = mid;
3088 else if (syms[mid]->value < value)
3089 lo = mid + 1;
3090 else if (syms[mid]->value > value)
3091 hi = mid;
3092 else
3093 return syms[mid];
3094 }
3095 }
3096 return NULL;
3097 }
3098
3099 static bfd_boolean
3100 section_covers_vma (bfd *abfd ATTRIBUTE_UNUSED, asection *section, void *ptr)
3101 {
3102 bfd_vma vma = *(bfd_vma *) ptr;
3103 return ((section->flags & SEC_ALLOC) != 0
3104 && section->vma <= vma
3105 && vma < section->vma + section->size);
3106 }
3107
3108 /* Create synthetic symbols, effectively restoring "dot-symbol" function
3109 entry syms. Also generate @plt symbols for the glink branch table. */
3110
3111 static long
3112 ppc64_elf_get_synthetic_symtab (bfd *abfd,
3113 long static_count, asymbol **static_syms,
3114 long dyn_count, asymbol **dyn_syms,
3115 asymbol **ret)
3116 {
3117 asymbol *s;
3118 long i;
3119 long count;
3120 char *names;
3121 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
3122 asection *opd = NULL;
3123 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
3124 asymbol **syms;
3125 int abi = abiversion (abfd);
3126
3127 *ret = NULL;
3128
3129 if (abi < 2)
3130 {
3131 opd = bfd_get_section_by_name (abfd, ".opd");
3132 if (opd == NULL && abi == 1)
3133 return 0;
3134 }
3135
3136 symcount = static_count;
3137 if (!relocatable)
3138 symcount += dyn_count;
3139 if (symcount == 0)
3140 return 0;
3141
3142 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
3143 if (syms == NULL)
3144 return -1;
3145
3146 if (!relocatable && static_count != 0 && dyn_count != 0)
3147 {
3148 /* Use both symbol tables. */
3149 memcpy (syms, static_syms, static_count * sizeof (*syms));
3150 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
3151 }
3152 else if (!relocatable && static_count == 0)
3153 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
3154 else
3155 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
3156
3157 synthetic_relocatable = relocatable;
3158 qsort (syms, symcount, sizeof (*syms), compare_symbols);
3159
3160 if (!relocatable && symcount > 1)
3161 {
3162 long j;
3163 /* Trim duplicate syms, since we may have merged the normal and
3164 dynamic symbols. Actually, we only care about syms that have
3165 different values, so trim any with the same value. */
3166 for (i = 1, j = 1; i < symcount; ++i)
3167 if (syms[i - 1]->value + syms[i - 1]->section->vma
3168 != syms[i]->value + syms[i]->section->vma)
3169 syms[j++] = syms[i];
3170 symcount = j;
3171 }
3172
3173 i = 0;
3174 if (strcmp (syms[i]->section->name, ".opd") == 0)
3175 ++i;
3176 codesecsym = i;
3177
3178 for (; i < symcount; ++i)
3179 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3180 != (SEC_CODE | SEC_ALLOC))
3181 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
3182 break;
3183 codesecsymend = i;
3184
3185 for (; i < symcount; ++i)
3186 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
3187 break;
3188 secsymend = i;
3189
3190 for (; i < symcount; ++i)
3191 if (strcmp (syms[i]->section->name, ".opd") != 0)
3192 break;
3193 opdsymend = i;
3194
3195 for (; i < symcount; ++i)
3196 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
3197 != (SEC_CODE | SEC_ALLOC))
3198 break;
3199 symcount = i;
3200
3201 count = 0;
3202
3203 if (relocatable)
3204 {
3205 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3206 arelent *r;
3207 size_t size;
3208 long relcount;
3209
3210 if (opdsymend == secsymend)
3211 goto done;
3212
3213 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3214 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
3215 if (relcount == 0)
3216 goto done;
3217
3218 if (!(*slurp_relocs) (abfd, opd, static_syms, FALSE))
3219 {
3220 count = -1;
3221 goto done;
3222 }
3223
3224 size = 0;
3225 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3226 {
3227 asymbol *sym;
3228
3229 while (r < opd->relocation + relcount
3230 && r->address < syms[i]->value + opd->vma)
3231 ++r;
3232
3233 if (r == opd->relocation + relcount)
3234 break;
3235
3236 if (r->address != syms[i]->value + opd->vma)
3237 continue;
3238
3239 if (r->howto->type != R_PPC64_ADDR64)
3240 continue;
3241
3242 sym = *r->sym_ptr_ptr;
3243 if (!sym_exists_at (syms, opdsymend, symcount,
3244 sym->section->id, sym->value + r->addend))
3245 {
3246 ++count;
3247 size += sizeof (asymbol);
3248 size += strlen (syms[i]->name) + 2;
3249 }
3250 }
3251
3252 s = *ret = bfd_malloc (size);
3253 if (s == NULL)
3254 {
3255 count = -1;
3256 goto done;
3257 }
3258
3259 names = (char *) (s + count);
3260
3261 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
3262 {
3263 asymbol *sym;
3264
3265 while (r < opd->relocation + relcount
3266 && r->address < syms[i]->value + opd->vma)
3267 ++r;
3268
3269 if (r == opd->relocation + relcount)
3270 break;
3271
3272 if (r->address != syms[i]->value + opd->vma)
3273 continue;
3274
3275 if (r->howto->type != R_PPC64_ADDR64)
3276 continue;
3277
3278 sym = *r->sym_ptr_ptr;
3279 if (!sym_exists_at (syms, opdsymend, symcount,
3280 sym->section->id, sym->value + r->addend))
3281 {
3282 size_t len;
3283
3284 *s = *syms[i];
3285 s->flags |= BSF_SYNTHETIC;
3286 s->section = sym->section;
3287 s->value = sym->value + r->addend;
3288 s->name = names;
3289 *names++ = '.';
3290 len = strlen (syms[i]->name);
3291 memcpy (names, syms[i]->name, len + 1);
3292 names += len + 1;
3293 /* Have udata.p point back to the original symbol this
3294 synthetic symbol was derived from. */
3295 s->udata.p = syms[i];
3296 s++;
3297 }
3298 }
3299 }
3300 else
3301 {
3302 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3303 bfd_byte *contents = NULL;
3304 size_t size;
3305 long plt_count = 0;
3306 bfd_vma glink_vma = 0, resolv_vma = 0;
3307 asection *dynamic, *glink = NULL, *relplt = NULL;
3308 arelent *p;
3309
3310 if (opd != NULL && !bfd_malloc_and_get_section (abfd, opd, &contents))
3311 {
3312 free_contents_and_exit:
3313 if (contents)
3314 free (contents);
3315 count = -1;
3316 goto done;
3317 }
3318
3319 size = 0;
3320 for (i = secsymend; i < opdsymend; ++i)
3321 {
3322 bfd_vma ent;
3323
3324 /* Ignore bogus symbols. */
3325 if (syms[i]->value > opd->size - 8)
3326 continue;
3327
3328 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3329 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3330 {
3331 ++count;
3332 size += sizeof (asymbol);
3333 size += strlen (syms[i]->name) + 2;
3334 }
3335 }
3336
3337 /* Get start of .glink stubs from DT_PPC64_GLINK. */
3338 if (dyn_count != 0
3339 && (dynamic = bfd_get_section_by_name (abfd, ".dynamic")) != NULL)
3340 {
3341 bfd_byte *dynbuf, *extdyn, *extdynend;
3342 size_t extdynsize;
3343 void (*swap_dyn_in) (bfd *, const void *, Elf_Internal_Dyn *);
3344
3345 if (!bfd_malloc_and_get_section (abfd, dynamic, &dynbuf))
3346 goto free_contents_and_exit;
3347
3348 extdynsize = get_elf_backend_data (abfd)->s->sizeof_dyn;
3349 swap_dyn_in = get_elf_backend_data (abfd)->s->swap_dyn_in;
3350
3351 extdyn = dynbuf;
3352 extdynend = extdyn + dynamic->size;
3353 for (; extdyn < extdynend; extdyn += extdynsize)
3354 {
3355 Elf_Internal_Dyn dyn;
3356 (*swap_dyn_in) (abfd, extdyn, &dyn);
3357
3358 if (dyn.d_tag == DT_NULL)
3359 break;
3360
3361 if (dyn.d_tag == DT_PPC64_GLINK)
3362 {
3363 /* The first glink stub starts at offset 32; see
3364 comment in ppc64_elf_finish_dynamic_sections. */
3365 glink_vma = dyn.d_un.d_val + GLINK_CALL_STUB_SIZE - 8 * 4;
3366 /* The .glink section usually does not survive the final
3367 link; search for the section (usually .text) where the
3368 glink stubs now reside. */
3369 glink = bfd_sections_find_if (abfd, section_covers_vma,
3370 &glink_vma);
3371 break;
3372 }
3373 }
3374
3375 free (dynbuf);
3376 }
3377
3378 if (glink != NULL)
3379 {
3380 /* Determine __glink trampoline by reading the relative branch
3381 from the first glink stub. */
3382 bfd_byte buf[4];
3383 unsigned int off = 0;
3384
3385 while (bfd_get_section_contents (abfd, glink, buf,
3386 glink_vma + off - glink->vma, 4))
3387 {
3388 unsigned int insn = bfd_get_32 (abfd, buf);
3389 insn ^= B_DOT;
3390 if ((insn & ~0x3fffffc) == 0)
3391 {
3392 resolv_vma = glink_vma + off + (insn ^ 0x2000000) - 0x2000000;
3393 break;
3394 }
3395 off += 4;
3396 if (off > 4)
3397 break;
3398 }
3399
3400 if (resolv_vma)
3401 size += sizeof (asymbol) + sizeof ("__glink_PLTresolve");
3402
3403 relplt = bfd_get_section_by_name (abfd, ".rela.plt");
3404 if (relplt != NULL)
3405 {
3406 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3407 if (! (*slurp_relocs) (abfd, relplt, dyn_syms, TRUE))
3408 goto free_contents_and_exit;
3409
3410 plt_count = relplt->size / sizeof (Elf64_External_Rela);
3411 size += plt_count * sizeof (asymbol);
3412
3413 p = relplt->relocation;
3414 for (i = 0; i < plt_count; i++, p++)
3415 {
3416 size += strlen ((*p->sym_ptr_ptr)->name) + sizeof ("@plt");
3417 if (p->addend != 0)
3418 size += sizeof ("+0x") - 1 + 16;
3419 }
3420 }
3421 }
3422
3423 s = *ret = bfd_malloc (size);
3424 if (s == NULL)
3425 goto free_contents_and_exit;
3426
3427 names = (char *) (s + count + plt_count + (resolv_vma != 0));
3428
3429 for (i = secsymend; i < opdsymend; ++i)
3430 {
3431 bfd_vma ent;
3432
3433 if (syms[i]->value > opd->size - 8)
3434 continue;
3435
3436 ent = bfd_get_64 (abfd, contents + syms[i]->value);
3437 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
3438 {
3439 long lo, hi;
3440 size_t len;
3441 asection *sec = abfd->sections;
3442
3443 *s = *syms[i];
3444 lo = codesecsym;
3445 hi = codesecsymend;
3446 while (lo < hi)
3447 {
3448 long mid = (lo + hi) >> 1;
3449 if (syms[mid]->section->vma < ent)
3450 lo = mid + 1;
3451 else if (syms[mid]->section->vma > ent)
3452 hi = mid;
3453 else
3454 {
3455 sec = syms[mid]->section;
3456 break;
3457 }
3458 }
3459
3460 if (lo >= hi && lo > codesecsym)
3461 sec = syms[lo - 1]->section;
3462
3463 for (; sec != NULL; sec = sec->next)
3464 {
3465 if (sec->vma > ent)
3466 break;
3467 /* SEC_LOAD may not be set if SEC is from a separate debug
3468 info file. */
3469 if ((sec->flags & SEC_ALLOC) == 0)
3470 break;
3471 if ((sec->flags & SEC_CODE) != 0)
3472 s->section = sec;
3473 }
3474 s->flags |= BSF_SYNTHETIC;
3475 s->value = ent - s->section->vma;
3476 s->name = names;
3477 *names++ = '.';
3478 len = strlen (syms[i]->name);
3479 memcpy (names, syms[i]->name, len + 1);
3480 names += len + 1;
3481 /* Have udata.p point back to the original symbol this
3482 synthetic symbol was derived from. */
3483 s->udata.p = syms[i];
3484 s++;
3485 }
3486 }
3487 free (contents);
3488
3489 if (glink != NULL && relplt != NULL)
3490 {
3491 if (resolv_vma)
3492 {
3493 /* Add a symbol for the main glink trampoline. */
3494 memset (s, 0, sizeof *s);
3495 s->the_bfd = abfd;
3496 s->flags = BSF_GLOBAL | BSF_SYNTHETIC;
3497 s->section = glink;
3498 s->value = resolv_vma - glink->vma;
3499 s->name = names;
3500 memcpy (names, "__glink_PLTresolve", sizeof ("__glink_PLTresolve"));
3501 names += sizeof ("__glink_PLTresolve");
3502 s++;
3503 count++;
3504 }
3505
3506 /* FIXME: It would be very much nicer to put sym@plt on the
3507 stub rather than on the glink branch table entry. The
3508 objdump disassembler would then use a sensible symbol
3509 name on plt calls. The difficulty in doing so is
3510 a) finding the stubs, and,
3511 b) matching stubs against plt entries, and,
3512 c) there can be multiple stubs for a given plt entry.
3513
3514 Solving (a) could be done by code scanning, but older
3515 ppc64 binaries used different stubs to current code.
3516 (b) is the tricky one since you need to known the toc
3517 pointer for at least one function that uses a pic stub to
3518 be able to calculate the plt address referenced.
3519 (c) means gdb would need to set multiple breakpoints (or
3520 find the glink branch itself) when setting breakpoints
3521 for pending shared library loads. */
3522 p = relplt->relocation;
3523 for (i = 0; i < plt_count; i++, p++)
3524 {
3525 size_t len;
3526
3527 *s = **p->sym_ptr_ptr;
3528 /* Undefined syms won't have BSF_LOCAL or BSF_GLOBAL set. Since
3529 we are defining a symbol, ensure one of them is set. */
3530 if ((s->flags & BSF_LOCAL) == 0)
3531 s->flags |= BSF_GLOBAL;
3532 s->flags |= BSF_SYNTHETIC;
3533 s->section = glink;
3534 s->value = glink_vma - glink->vma;
3535 s->name = names;
3536 s->udata.p = NULL;
3537 len = strlen ((*p->sym_ptr_ptr)->name);
3538 memcpy (names, (*p->sym_ptr_ptr)->name, len);
3539 names += len;
3540 if (p->addend != 0)
3541 {
3542 memcpy (names, "+0x", sizeof ("+0x") - 1);
3543 names += sizeof ("+0x") - 1;
3544 bfd_sprintf_vma (abfd, names, p->addend);
3545 names += strlen (names);
3546 }
3547 memcpy (names, "@plt", sizeof ("@plt"));
3548 names += sizeof ("@plt");
3549 s++;
3550 if (abi < 2)
3551 {
3552 glink_vma += 8;
3553 if (i >= 0x8000)
3554 glink_vma += 4;
3555 }
3556 else
3557 glink_vma += 4;
3558 }
3559 count += plt_count;
3560 }
3561 }
3562
3563 done:
3564 free (syms);
3565 return count;
3566 }
3567 \f
3568 /* The following functions are specific to the ELF linker, while
3569 functions above are used generally. Those named ppc64_elf_* are
3570 called by the main ELF linker code. They appear in this file more
3571 or less in the order in which they are called. eg.
3572 ppc64_elf_check_relocs is called early in the link process,
3573 ppc64_elf_finish_dynamic_sections is one of the last functions
3574 called.
3575
3576 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
3577 functions have both a function code symbol and a function descriptor
3578 symbol. A call to foo in a relocatable object file looks like:
3579
3580 . .text
3581 . x:
3582 . bl .foo
3583 . nop
3584
3585 The function definition in another object file might be:
3586
3587 . .section .opd
3588 . foo: .quad .foo
3589 . .quad .TOC.@tocbase
3590 . .quad 0
3591 .
3592 . .text
3593 . .foo: blr
3594
3595 When the linker resolves the call during a static link, the branch
3596 unsurprisingly just goes to .foo and the .opd information is unused.
3597 If the function definition is in a shared library, things are a little
3598 different: The call goes via a plt call stub, the opd information gets
3599 copied to the plt, and the linker patches the nop.
3600
3601 . x:
3602 . bl .foo_stub
3603 . ld 2,40(1)
3604 .
3605 .
3606 . .foo_stub:
3607 . std 2,40(1) # in practice, the call stub
3608 . addis 11,2,Lfoo@toc@ha # is slightly optimized, but
3609 . addi 11,11,Lfoo@toc@l # this is the general idea
3610 . ld 12,0(11)
3611 . ld 2,8(11)
3612 . mtctr 12
3613 . ld 11,16(11)
3614 . bctr
3615 .
3616 . .section .plt
3617 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
3618
3619 The "reloc ()" notation is supposed to indicate that the linker emits
3620 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
3621 copying.
3622
3623 What are the difficulties here? Well, firstly, the relocations
3624 examined by the linker in check_relocs are against the function code
3625 sym .foo, while the dynamic relocation in the plt is emitted against
3626 the function descriptor symbol, foo. Somewhere along the line, we need
3627 to carefully copy dynamic link information from one symbol to the other.
3628 Secondly, the generic part of the elf linker will make .foo a dynamic
3629 symbol as is normal for most other backends. We need foo dynamic
3630 instead, at least for an application final link. However, when
3631 creating a shared library containing foo, we need to have both symbols
3632 dynamic so that references to .foo are satisfied during the early
3633 stages of linking. Otherwise the linker might decide to pull in a
3634 definition from some other object, eg. a static library.
3635
3636 Update: As of August 2004, we support a new convention. Function
3637 calls may use the function descriptor symbol, ie. "bl foo". This
3638 behaves exactly as "bl .foo". */
3639
3640 /* Of those relocs that might be copied as dynamic relocs, this function
3641 selects those that must be copied when linking a shared library,
3642 even when the symbol is local. */
3643
3644 static int
3645 must_be_dyn_reloc (struct bfd_link_info *info,
3646 enum elf_ppc64_reloc_type r_type)
3647 {
3648 switch (r_type)
3649 {
3650 default:
3651 return 1;
3652
3653 case R_PPC64_REL32:
3654 case R_PPC64_REL64:
3655 case R_PPC64_REL30:
3656 return 0;
3657
3658 case R_PPC64_TPREL16:
3659 case R_PPC64_TPREL16_LO:
3660 case R_PPC64_TPREL16_HI:
3661 case R_PPC64_TPREL16_HA:
3662 case R_PPC64_TPREL16_DS:
3663 case R_PPC64_TPREL16_LO_DS:
3664 case R_PPC64_TPREL16_HIGH:
3665 case R_PPC64_TPREL16_HIGHA:
3666 case R_PPC64_TPREL16_HIGHER:
3667 case R_PPC64_TPREL16_HIGHERA:
3668 case R_PPC64_TPREL16_HIGHEST:
3669 case R_PPC64_TPREL16_HIGHESTA:
3670 case R_PPC64_TPREL64:
3671 return !info->executable;
3672 }
3673 }
3674
3675 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3676 copying dynamic variables from a shared lib into an app's dynbss
3677 section, and instead use a dynamic relocation to point into the
3678 shared lib. With code that gcc generates, it's vital that this be
3679 enabled; In the PowerPC64 ABI, the address of a function is actually
3680 the address of a function descriptor, which resides in the .opd
3681 section. gcc uses the descriptor directly rather than going via the
3682 GOT as some other ABI's do, which means that initialized function
3683 pointers must reference the descriptor. Thus, a function pointer
3684 initialized to the address of a function in a shared library will
3685 either require a copy reloc, or a dynamic reloc. Using a copy reloc
3686 redefines the function descriptor symbol to point to the copy. This
3687 presents a problem as a plt entry for that function is also
3688 initialized from the function descriptor symbol and the copy reloc
3689 may not be initialized first. */
3690 #define ELIMINATE_COPY_RELOCS 1
3691
3692 /* Section name for stubs is the associated section name plus this
3693 string. */
3694 #define STUB_SUFFIX ".stub"
3695
3696 /* Linker stubs.
3697 ppc_stub_long_branch:
3698 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3699 destination, but a 24 bit branch in a stub section will reach.
3700 . b dest
3701
3702 ppc_stub_plt_branch:
3703 Similar to the above, but a 24 bit branch in the stub section won't
3704 reach its destination.
3705 . addis %r11,%r2,xxx@toc@ha
3706 . ld %r12,xxx@toc@l(%r11)
3707 . mtctr %r12
3708 . bctr
3709
3710 ppc_stub_plt_call:
3711 Used to call a function in a shared library. If it so happens that
3712 the plt entry referenced crosses a 64k boundary, then an extra
3713 "addi %r11,%r11,xxx@toc@l" will be inserted before the "mtctr".
3714 . std %r2,40(%r1)
3715 . addis %r11,%r2,xxx@toc@ha
3716 . ld %r12,xxx+0@toc@l(%r11)
3717 . mtctr %r12
3718 . ld %r2,xxx+8@toc@l(%r11)
3719 . ld %r11,xxx+16@toc@l(%r11)
3720 . bctr
3721
3722 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3723 code to adjust the value and save r2 to support multiple toc sections.
3724 A ppc_stub_long_branch with an r2 offset looks like:
3725 . std %r2,40(%r1)
3726 . addis %r2,%r2,off@ha
3727 . addi %r2,%r2,off@l
3728 . b dest
3729
3730 A ppc_stub_plt_branch with an r2 offset looks like:
3731 . std %r2,40(%r1)
3732 . addis %r11,%r2,xxx@toc@ha
3733 . ld %r12,xxx@toc@l(%r11)
3734 . addis %r2,%r2,off@ha
3735 . addi %r2,%r2,off@l
3736 . mtctr %r12
3737 . bctr
3738
3739 In cases where the "addis" instruction would add zero, the "addis" is
3740 omitted and following instructions modified slightly in some cases.
3741 */
3742
3743 enum ppc_stub_type {
3744 ppc_stub_none,
3745 ppc_stub_long_branch,
3746 ppc_stub_long_branch_r2off,
3747 ppc_stub_plt_branch,
3748 ppc_stub_plt_branch_r2off,
3749 ppc_stub_plt_call,
3750 ppc_stub_plt_call_r2save
3751 };
3752
3753 struct ppc_stub_hash_entry {
3754
3755 /* Base hash table entry structure. */
3756 struct bfd_hash_entry root;
3757
3758 enum ppc_stub_type stub_type;
3759
3760 /* The stub section. */
3761 asection *stub_sec;
3762
3763 /* Offset within stub_sec of the beginning of this stub. */
3764 bfd_vma stub_offset;
3765
3766 /* Given the symbol's value and its section we can determine its final
3767 value when building the stubs (so the stub knows where to jump. */
3768 bfd_vma target_value;
3769 asection *target_section;
3770
3771 /* The symbol table entry, if any, that this was derived from. */
3772 struct ppc_link_hash_entry *h;
3773 struct plt_entry *plt_ent;
3774
3775 /* Where this stub is being called from, or, in the case of combined
3776 stub sections, the first input section in the group. */
3777 asection *id_sec;
3778
3779 /* Symbol st_other. */
3780 unsigned char other;
3781 };
3782
3783 struct ppc_branch_hash_entry {
3784
3785 /* Base hash table entry structure. */
3786 struct bfd_hash_entry root;
3787
3788 /* Offset within branch lookup table. */
3789 unsigned int offset;
3790
3791 /* Generation marker. */
3792 unsigned int iter;
3793 };
3794
3795 /* Used to track dynamic relocations for local symbols. */
3796 struct ppc_dyn_relocs
3797 {
3798 struct ppc_dyn_relocs *next;
3799
3800 /* The input section of the reloc. */
3801 asection *sec;
3802
3803 /* Total number of relocs copied for the input section. */
3804 unsigned int count : 31;
3805
3806 /* Whether this entry is for STT_GNU_IFUNC symbols. */
3807 unsigned int ifunc : 1;
3808 };
3809
3810 struct ppc_link_hash_entry
3811 {
3812 struct elf_link_hash_entry elf;
3813
3814 union {
3815 /* A pointer to the most recently used stub hash entry against this
3816 symbol. */
3817 struct ppc_stub_hash_entry *stub_cache;
3818
3819 /* A pointer to the next symbol starting with a '.' */
3820 struct ppc_link_hash_entry *next_dot_sym;
3821 } u;
3822
3823 /* Track dynamic relocs copied for this symbol. */
3824 struct elf_dyn_relocs *dyn_relocs;
3825
3826 /* Link between function code and descriptor symbols. */
3827 struct ppc_link_hash_entry *oh;
3828
3829 /* Flag function code and descriptor symbols. */
3830 unsigned int is_func:1;
3831 unsigned int is_func_descriptor:1;
3832 unsigned int fake:1;
3833
3834 /* Whether global opd/toc sym has been adjusted or not.
3835 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3836 should be set for all globals defined in any opd/toc section. */
3837 unsigned int adjust_done:1;
3838
3839 /* Set if we twiddled this symbol to weak at some stage. */
3840 unsigned int was_undefined:1;
3841
3842 /* Contexts in which symbol is used in the GOT (or TOC).
3843 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3844 corresponding relocs are encountered during check_relocs.
3845 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3846 indicate the corresponding GOT entry type is not needed.
3847 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3848 a TPREL one. We use a separate flag rather than setting TPREL
3849 just for convenience in distinguishing the two cases. */
3850 #define TLS_GD 1 /* GD reloc. */
3851 #define TLS_LD 2 /* LD reloc. */
3852 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
3853 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3854 #define TLS_TLS 16 /* Any TLS reloc. */
3855 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3856 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3857 #define PLT_IFUNC 128 /* STT_GNU_IFUNC. */
3858 unsigned char tls_mask;
3859 };
3860
3861 /* ppc64 ELF linker hash table. */
3862
3863 struct ppc_link_hash_table
3864 {
3865 struct elf_link_hash_table elf;
3866
3867 /* The stub hash table. */
3868 struct bfd_hash_table stub_hash_table;
3869
3870 /* Another hash table for plt_branch stubs. */
3871 struct bfd_hash_table branch_hash_table;
3872
3873 /* Hash table for function prologue tocsave. */
3874 htab_t tocsave_htab;
3875
3876 /* Linker stub bfd. */
3877 bfd *stub_bfd;
3878
3879 /* Linker call-backs. */
3880 asection * (*add_stub_section) (const char *, asection *);
3881 void (*layout_sections_again) (void);
3882
3883 /* Array to keep track of which stub sections have been created, and
3884 information on stub grouping. */
3885 struct map_stub {
3886 /* This is the section to which stubs in the group will be attached. */
3887 asection *link_sec;
3888 /* The stub section. */
3889 asection *stub_sec;
3890 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3891 bfd_vma toc_off;
3892 } *stub_group;
3893
3894 /* Temp used when calculating TOC pointers. */
3895 bfd_vma toc_curr;
3896 bfd *toc_bfd;
3897 asection *toc_first_sec;
3898
3899 /* Highest input section id. */
3900 int top_id;
3901
3902 /* Highest output section index. */
3903 int top_index;
3904
3905 /* Used when adding symbols. */
3906 struct ppc_link_hash_entry *dot_syms;
3907
3908 /* List of input sections for each output section. */
3909 asection **input_list;
3910
3911 /* Shortcuts to get to dynamic linker sections. */
3912 asection *dynbss;
3913 asection *relbss;
3914 asection *glink;
3915 asection *sfpr;
3916 asection *brlt;
3917 asection *relbrlt;
3918 asection *glink_eh_frame;
3919
3920 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3921 struct ppc_link_hash_entry *tls_get_addr;
3922 struct ppc_link_hash_entry *tls_get_addr_fd;
3923
3924 /* The size of reliplt used by got entry relocs. */
3925 bfd_size_type got_reli_size;
3926
3927 /* Statistics. */
3928 unsigned long stub_count[ppc_stub_plt_call_r2save];
3929
3930 /* Number of stubs against global syms. */
3931 unsigned long stub_globals;
3932
3933 /* Alignment of PLT call stubs. */
3934 unsigned int plt_stub_align:4;
3935
3936 /* Set if we're linking code with function descriptors. */
3937 unsigned int opd_abi:1;
3938
3939 /* Set if PLT call stubs should load r11. */
3940 unsigned int plt_static_chain:1;
3941
3942 /* Set if PLT call stubs need a read-read barrier. */
3943 unsigned int plt_thread_safe:1;
3944
3945 /* Set if we should emit symbols for stubs. */
3946 unsigned int emit_stub_syms:1;
3947
3948 /* Set if __tls_get_addr optimization should not be done. */
3949 unsigned int no_tls_get_addr_opt:1;
3950
3951 /* Support for multiple toc sections. */
3952 unsigned int do_multi_toc:1;
3953 unsigned int multi_toc_needed:1;
3954 unsigned int second_toc_pass:1;
3955 unsigned int do_toc_opt:1;
3956
3957 /* Set on error. */
3958 unsigned int stub_error:1;
3959
3960 /* Temp used by ppc64_elf_process_dot_syms. */
3961 unsigned int twiddled_syms:1;
3962
3963 /* Incremented every time we size stubs. */
3964 unsigned int stub_iteration;
3965
3966 /* Small local sym cache. */
3967 struct sym_cache sym_cache;
3968 };
3969
3970 /* Rename some of the generic section flags to better document how they
3971 are used here. */
3972
3973 /* Nonzero if this section has TLS related relocations. */
3974 #define has_tls_reloc sec_flg0
3975
3976 /* Nonzero if this section has a call to __tls_get_addr. */
3977 #define has_tls_get_addr_call sec_flg1
3978
3979 /* Nonzero if this section has any toc or got relocs. */
3980 #define has_toc_reloc sec_flg2
3981
3982 /* Nonzero if this section has a call to another section that uses
3983 the toc or got. */
3984 #define makes_toc_func_call sec_flg3
3985
3986 /* Recursion protection when determining above flag. */
3987 #define call_check_in_progress sec_flg4
3988 #define call_check_done sec_flg5
3989
3990 /* Get the ppc64 ELF linker hash table from a link_info structure. */
3991
3992 #define ppc_hash_table(p) \
3993 (elf_hash_table_id ((struct elf_link_hash_table *) ((p)->hash)) \
3994 == PPC64_ELF_DATA ? ((struct ppc_link_hash_table *) ((p)->hash)) : NULL)
3995
3996 #define ppc_stub_hash_lookup(table, string, create, copy) \
3997 ((struct ppc_stub_hash_entry *) \
3998 bfd_hash_lookup ((table), (string), (create), (copy)))
3999
4000 #define ppc_branch_hash_lookup(table, string, create, copy) \
4001 ((struct ppc_branch_hash_entry *) \
4002 bfd_hash_lookup ((table), (string), (create), (copy)))
4003
4004 /* Create an entry in the stub hash table. */
4005
4006 static struct bfd_hash_entry *
4007 stub_hash_newfunc (struct bfd_hash_entry *entry,
4008 struct bfd_hash_table *table,
4009 const char *string)
4010 {
4011 /* Allocate the structure if it has not already been allocated by a
4012 subclass. */
4013 if (entry == NULL)
4014 {
4015 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
4016 if (entry == NULL)
4017 return entry;
4018 }
4019
4020 /* Call the allocation method of the superclass. */
4021 entry = bfd_hash_newfunc (entry, table, string);
4022 if (entry != NULL)
4023 {
4024 struct ppc_stub_hash_entry *eh;
4025
4026 /* Initialize the local fields. */
4027 eh = (struct ppc_stub_hash_entry *) entry;
4028 eh->stub_type = ppc_stub_none;
4029 eh->stub_sec = NULL;
4030 eh->stub_offset = 0;
4031 eh->target_value = 0;
4032 eh->target_section = NULL;
4033 eh->h = NULL;
4034 eh->plt_ent = NULL;
4035 eh->id_sec = NULL;
4036 eh->other = 0;
4037 }
4038
4039 return entry;
4040 }
4041
4042 /* Create an entry in the branch hash table. */
4043
4044 static struct bfd_hash_entry *
4045 branch_hash_newfunc (struct bfd_hash_entry *entry,
4046 struct bfd_hash_table *table,
4047 const char *string)
4048 {
4049 /* Allocate the structure if it has not already been allocated by a
4050 subclass. */
4051 if (entry == NULL)
4052 {
4053 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
4054 if (entry == NULL)
4055 return entry;
4056 }
4057
4058 /* Call the allocation method of the superclass. */
4059 entry = bfd_hash_newfunc (entry, table, string);
4060 if (entry != NULL)
4061 {
4062 struct ppc_branch_hash_entry *eh;
4063
4064 /* Initialize the local fields. */
4065 eh = (struct ppc_branch_hash_entry *) entry;
4066 eh->offset = 0;
4067 eh->iter = 0;
4068 }
4069
4070 return entry;
4071 }
4072
4073 /* Create an entry in a ppc64 ELF linker hash table. */
4074
4075 static struct bfd_hash_entry *
4076 link_hash_newfunc (struct bfd_hash_entry *entry,
4077 struct bfd_hash_table *table,
4078 const char *string)
4079 {
4080 /* Allocate the structure if it has not already been allocated by a
4081 subclass. */
4082 if (entry == NULL)
4083 {
4084 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
4085 if (entry == NULL)
4086 return entry;
4087 }
4088
4089 /* Call the allocation method of the superclass. */
4090 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
4091 if (entry != NULL)
4092 {
4093 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
4094
4095 memset (&eh->u.stub_cache, 0,
4096 (sizeof (struct ppc_link_hash_entry)
4097 - offsetof (struct ppc_link_hash_entry, u.stub_cache)));
4098
4099 /* When making function calls, old ABI code references function entry
4100 points (dot symbols), while new ABI code references the function
4101 descriptor symbol. We need to make any combination of reference and
4102 definition work together, without breaking archive linking.
4103
4104 For a defined function "foo" and an undefined call to "bar":
4105 An old object defines "foo" and ".foo", references ".bar" (possibly
4106 "bar" too).
4107 A new object defines "foo" and references "bar".
4108
4109 A new object thus has no problem with its undefined symbols being
4110 satisfied by definitions in an old object. On the other hand, the
4111 old object won't have ".bar" satisfied by a new object.
4112
4113 Keep a list of newly added dot-symbols. */
4114
4115 if (string[0] == '.')
4116 {
4117 struct ppc_link_hash_table *htab;
4118
4119 htab = (struct ppc_link_hash_table *) table;
4120 eh->u.next_dot_sym = htab->dot_syms;
4121 htab->dot_syms = eh;
4122 }
4123 }
4124
4125 return entry;
4126 }
4127
4128 struct tocsave_entry {
4129 asection *sec;
4130 bfd_vma offset;
4131 };
4132
4133 static hashval_t
4134 tocsave_htab_hash (const void *p)
4135 {
4136 const struct tocsave_entry *e = (const struct tocsave_entry *) p;
4137 return ((bfd_vma)(intptr_t) e->sec ^ e->offset) >> 3;
4138 }
4139
4140 static int
4141 tocsave_htab_eq (const void *p1, const void *p2)
4142 {
4143 const struct tocsave_entry *e1 = (const struct tocsave_entry *) p1;
4144 const struct tocsave_entry *e2 = (const struct tocsave_entry *) p2;
4145 return e1->sec == e2->sec && e1->offset == e2->offset;
4146 }
4147
4148 /* Create a ppc64 ELF linker hash table. */
4149
4150 static struct bfd_link_hash_table *
4151 ppc64_elf_link_hash_table_create (bfd *abfd)
4152 {
4153 struct ppc_link_hash_table *htab;
4154 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
4155
4156 htab = bfd_zmalloc (amt);
4157 if (htab == NULL)
4158 return NULL;
4159
4160 if (!_bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc,
4161 sizeof (struct ppc_link_hash_entry),
4162 PPC64_ELF_DATA))
4163 {
4164 free (htab);
4165 return NULL;
4166 }
4167
4168 /* Init the stub hash table too. */
4169 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc,
4170 sizeof (struct ppc_stub_hash_entry)))
4171 {
4172 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4173 return NULL;
4174 }
4175
4176 /* And the branch hash table. */
4177 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc,
4178 sizeof (struct ppc_branch_hash_entry)))
4179 {
4180 bfd_hash_table_free (&htab->stub_hash_table);
4181 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4182 return NULL;
4183 }
4184
4185 htab->tocsave_htab = htab_try_create (1024,
4186 tocsave_htab_hash,
4187 tocsave_htab_eq,
4188 NULL);
4189 if (htab->tocsave_htab == NULL)
4190 {
4191 bfd_hash_table_free (&htab->branch_hash_table);
4192 bfd_hash_table_free (&htab->stub_hash_table);
4193 _bfd_elf_link_hash_table_free ((struct bfd_link_hash_table *) htab);
4194 return NULL;
4195 }
4196
4197 /* Initializing two fields of the union is just cosmetic. We really
4198 only care about glist, but when compiled on a 32-bit host the
4199 bfd_vma fields are larger. Setting the bfd_vma to zero makes
4200 debugger inspection of these fields look nicer. */
4201 htab->elf.init_got_refcount.refcount = 0;
4202 htab->elf.init_got_refcount.glist = NULL;
4203 htab->elf.init_plt_refcount.refcount = 0;
4204 htab->elf.init_plt_refcount.glist = NULL;
4205 htab->elf.init_got_offset.offset = 0;
4206 htab->elf.init_got_offset.glist = NULL;
4207 htab->elf.init_plt_offset.offset = 0;
4208 htab->elf.init_plt_offset.glist = NULL;
4209
4210 return &htab->elf.root;
4211 }
4212
4213 /* Free the derived linker hash table. */
4214
4215 static void
4216 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
4217 {
4218 struct ppc_link_hash_table *htab = (struct ppc_link_hash_table *) hash;
4219
4220 bfd_hash_table_free (&htab->stub_hash_table);
4221 bfd_hash_table_free (&htab->branch_hash_table);
4222 if (htab->tocsave_htab)
4223 htab_delete (htab->tocsave_htab);
4224 _bfd_elf_link_hash_table_free (hash);
4225 }
4226
4227 /* Create sections for linker generated code. */
4228
4229 static bfd_boolean
4230 create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
4231 {
4232 struct ppc_link_hash_table *htab;
4233 flagword flags;
4234
4235 htab = ppc_hash_table (info);
4236
4237 /* Create .sfpr for code to save and restore fp regs. */
4238 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
4239 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4240 htab->sfpr = bfd_make_section_anyway_with_flags (dynobj, ".sfpr",
4241 flags);
4242 if (htab->sfpr == NULL
4243 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
4244 return FALSE;
4245
4246 /* Create .glink for lazy dynamic linking support. */
4247 htab->glink = bfd_make_section_anyway_with_flags (dynobj, ".glink",
4248 flags);
4249 if (htab->glink == NULL
4250 || ! bfd_set_section_alignment (dynobj, htab->glink, 3))
4251 return FALSE;
4252
4253 if (!info->no_ld_generated_unwind_info)
4254 {
4255 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY | SEC_HAS_CONTENTS
4256 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4257 htab->glink_eh_frame = bfd_make_section_anyway_with_flags (dynobj,
4258 ".eh_frame",
4259 flags);
4260 if (htab->glink_eh_frame == NULL
4261 || !bfd_set_section_alignment (dynobj, htab->glink_eh_frame, 2))
4262 return FALSE;
4263 }
4264
4265 flags = SEC_ALLOC | SEC_LINKER_CREATED;
4266 htab->elf.iplt = bfd_make_section_anyway_with_flags (dynobj, ".iplt", flags);
4267 if (htab->elf.iplt == NULL
4268 || ! bfd_set_section_alignment (dynobj, htab->elf.iplt, 3))
4269 return FALSE;
4270
4271 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4272 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4273 htab->elf.irelplt
4274 = bfd_make_section_anyway_with_flags (dynobj, ".rela.iplt", flags);
4275 if (htab->elf.irelplt == NULL
4276 || ! bfd_set_section_alignment (dynobj, htab->elf.irelplt, 3))
4277 return FALSE;
4278
4279 /* Create branch lookup table for plt_branch stubs. */
4280 flags = (SEC_ALLOC | SEC_LOAD
4281 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4282 htab->brlt = bfd_make_section_anyway_with_flags (dynobj, ".branch_lt",
4283 flags);
4284 if (htab->brlt == NULL
4285 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
4286 return FALSE;
4287
4288 if (!info->shared)
4289 return TRUE;
4290
4291 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
4292 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4293 htab->relbrlt = bfd_make_section_anyway_with_flags (dynobj,
4294 ".rela.branch_lt",
4295 flags);
4296 if (htab->relbrlt == NULL
4297 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
4298 return FALSE;
4299
4300 return TRUE;
4301 }
4302
4303 /* Satisfy the ELF linker by filling in some fields in our fake bfd. */
4304
4305 bfd_boolean
4306 ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
4307 {
4308 struct ppc_link_hash_table *htab;
4309
4310 elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
4311
4312 /* Always hook our dynamic sections into the first bfd, which is the
4313 linker created stub bfd. This ensures that the GOT header is at
4314 the start of the output TOC section. */
4315 htab = ppc_hash_table (info);
4316 if (htab == NULL)
4317 return FALSE;
4318 htab->stub_bfd = abfd;
4319 htab->elf.dynobj = abfd;
4320
4321 if (info->relocatable)
4322 return TRUE;
4323
4324 return create_linkage_sections (htab->elf.dynobj, info);
4325 }
4326
4327 /* Build a name for an entry in the stub hash table. */
4328
4329 static char *
4330 ppc_stub_name (const asection *input_section,
4331 const asection *sym_sec,
4332 const struct ppc_link_hash_entry *h,
4333 const Elf_Internal_Rela *rel)
4334 {
4335 char *stub_name;
4336 ssize_t len;
4337
4338 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
4339 offsets from a sym as a branch target? In fact, we could
4340 probably assume the addend is always zero. */
4341 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
4342
4343 if (h)
4344 {
4345 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
4346 stub_name = bfd_malloc (len);
4347 if (stub_name == NULL)
4348 return stub_name;
4349
4350 len = sprintf (stub_name, "%08x.%s+%x",
4351 input_section->id & 0xffffffff,
4352 h->elf.root.root.string,
4353 (int) rel->r_addend & 0xffffffff);
4354 }
4355 else
4356 {
4357 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
4358 stub_name = bfd_malloc (len);
4359 if (stub_name == NULL)
4360 return stub_name;
4361
4362 len = sprintf (stub_name, "%08x.%x:%x+%x",
4363 input_section->id & 0xffffffff,
4364 sym_sec->id & 0xffffffff,
4365 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
4366 (int) rel->r_addend & 0xffffffff);
4367 }
4368 if (len > 2 && stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
4369 stub_name[len - 2] = 0;
4370 return stub_name;
4371 }
4372
4373 /* Look up an entry in the stub hash. Stub entries are cached because
4374 creating the stub name takes a bit of time. */
4375
4376 static struct ppc_stub_hash_entry *
4377 ppc_get_stub_entry (const asection *input_section,
4378 const asection *sym_sec,
4379 struct ppc_link_hash_entry *h,
4380 const Elf_Internal_Rela *rel,
4381 struct ppc_link_hash_table *htab)
4382 {
4383 struct ppc_stub_hash_entry *stub_entry;
4384 const asection *id_sec;
4385
4386 /* If this input section is part of a group of sections sharing one
4387 stub section, then use the id of the first section in the group.
4388 Stub names need to include a section id, as there may well be
4389 more than one stub used to reach say, printf, and we need to
4390 distinguish between them. */
4391 id_sec = htab->stub_group[input_section->id].link_sec;
4392
4393 if (h != NULL && h->u.stub_cache != NULL
4394 && h->u.stub_cache->h == h
4395 && h->u.stub_cache->id_sec == id_sec)
4396 {
4397 stub_entry = h->u.stub_cache;
4398 }
4399 else
4400 {
4401 char *stub_name;
4402
4403 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
4404 if (stub_name == NULL)
4405 return NULL;
4406
4407 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
4408 stub_name, FALSE, FALSE);
4409 if (h != NULL)
4410 h->u.stub_cache = stub_entry;
4411
4412 free (stub_name);
4413 }
4414
4415 return stub_entry;
4416 }
4417
4418 /* Add a new stub entry to the stub hash. Not all fields of the new
4419 stub entry are initialised. */
4420
4421 static struct ppc_stub_hash_entry *
4422 ppc_add_stub (const char *stub_name,
4423 asection *section,
4424 struct bfd_link_info *info)
4425 {
4426 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4427 asection *link_sec;
4428 asection *stub_sec;
4429 struct ppc_stub_hash_entry *stub_entry;
4430
4431 link_sec = htab->stub_group[section->id].link_sec;
4432 stub_sec = htab->stub_group[section->id].stub_sec;
4433 if (stub_sec == NULL)
4434 {
4435 stub_sec = htab->stub_group[link_sec->id].stub_sec;
4436 if (stub_sec == NULL)
4437 {
4438 size_t namelen;
4439 bfd_size_type len;
4440 char *s_name;
4441
4442 namelen = strlen (link_sec->name);
4443 len = namelen + sizeof (STUB_SUFFIX);
4444 s_name = bfd_alloc (htab->stub_bfd, len);
4445 if (s_name == NULL)
4446 return NULL;
4447
4448 memcpy (s_name, link_sec->name, namelen);
4449 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
4450 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
4451 if (stub_sec == NULL)
4452 return NULL;
4453 htab->stub_group[link_sec->id].stub_sec = stub_sec;
4454 }
4455 htab->stub_group[section->id].stub_sec = stub_sec;
4456 }
4457
4458 /* Enter this entry into the linker stub hash table. */
4459 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
4460 TRUE, FALSE);
4461 if (stub_entry == NULL)
4462 {
4463 info->callbacks->einfo (_("%P: %B: cannot create stub entry %s\n"),
4464 section->owner, stub_name);
4465 return NULL;
4466 }
4467
4468 stub_entry->stub_sec = stub_sec;
4469 stub_entry->stub_offset = 0;
4470 stub_entry->id_sec = link_sec;
4471 return stub_entry;
4472 }
4473
4474 /* Create .got and .rela.got sections in ABFD, and .got in dynobj if
4475 not already done. */
4476
4477 static bfd_boolean
4478 create_got_section (bfd *abfd, struct bfd_link_info *info)
4479 {
4480 asection *got, *relgot;
4481 flagword flags;
4482 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4483
4484 if (!is_ppc64_elf (abfd))
4485 return FALSE;
4486 if (htab == NULL)
4487 return FALSE;
4488
4489 if (!htab->elf.sgot
4490 && !_bfd_elf_create_got_section (htab->elf.dynobj, info))
4491 return FALSE;
4492
4493 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
4494 | SEC_LINKER_CREATED);
4495
4496 got = bfd_make_section_anyway_with_flags (abfd, ".got", flags);
4497 if (!got
4498 || !bfd_set_section_alignment (abfd, got, 3))
4499 return FALSE;
4500
4501 relgot = bfd_make_section_anyway_with_flags (abfd, ".rela.got",
4502 flags | SEC_READONLY);
4503 if (!relgot
4504 || ! bfd_set_section_alignment (abfd, relgot, 3))
4505 return FALSE;
4506
4507 ppc64_elf_tdata (abfd)->got = got;
4508 ppc64_elf_tdata (abfd)->relgot = relgot;
4509 return TRUE;
4510 }
4511
4512 /* Create the dynamic sections, and set up shortcuts. */
4513
4514 static bfd_boolean
4515 ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
4516 {
4517 struct ppc_link_hash_table *htab;
4518
4519 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
4520 return FALSE;
4521
4522 htab = ppc_hash_table (info);
4523 if (htab == NULL)
4524 return FALSE;
4525
4526 htab->dynbss = bfd_get_linker_section (dynobj, ".dynbss");
4527 if (!info->shared)
4528 htab->relbss = bfd_get_linker_section (dynobj, ".rela.bss");
4529
4530 if (!htab->elf.sgot || !htab->elf.splt || !htab->elf.srelplt || !htab->dynbss
4531 || (!info->shared && !htab->relbss))
4532 abort ();
4533
4534 return TRUE;
4535 }
4536
4537 /* Follow indirect and warning symbol links. */
4538
4539 static inline struct bfd_link_hash_entry *
4540 follow_link (struct bfd_link_hash_entry *h)
4541 {
4542 while (h->type == bfd_link_hash_indirect
4543 || h->type == bfd_link_hash_warning)
4544 h = h->u.i.link;
4545 return h;
4546 }
4547
4548 static inline struct elf_link_hash_entry *
4549 elf_follow_link (struct elf_link_hash_entry *h)
4550 {
4551 return (struct elf_link_hash_entry *) follow_link (&h->root);
4552 }
4553
4554 static inline struct ppc_link_hash_entry *
4555 ppc_follow_link (struct ppc_link_hash_entry *h)
4556 {
4557 return (struct ppc_link_hash_entry *) follow_link (&h->elf.root);
4558 }
4559
4560 /* Merge PLT info on FROM with that on TO. */
4561
4562 static void
4563 move_plt_plist (struct ppc_link_hash_entry *from,
4564 struct ppc_link_hash_entry *to)
4565 {
4566 if (from->elf.plt.plist != NULL)
4567 {
4568 if (to->elf.plt.plist != NULL)
4569 {
4570 struct plt_entry **entp;
4571 struct plt_entry *ent;
4572
4573 for (entp = &from->elf.plt.plist; (ent = *entp) != NULL; )
4574 {
4575 struct plt_entry *dent;
4576
4577 for (dent = to->elf.plt.plist; dent != NULL; dent = dent->next)
4578 if (dent->addend == ent->addend)
4579 {
4580 dent->plt.refcount += ent->plt.refcount;
4581 *entp = ent->next;
4582 break;
4583 }
4584 if (dent == NULL)
4585 entp = &ent->next;
4586 }
4587 *entp = to->elf.plt.plist;
4588 }
4589
4590 to->elf.plt.plist = from->elf.plt.plist;
4591 from->elf.plt.plist = NULL;
4592 }
4593 }
4594
4595 /* Copy the extra info we tack onto an elf_link_hash_entry. */
4596
4597 static void
4598 ppc64_elf_copy_indirect_symbol (struct bfd_link_info *info,
4599 struct elf_link_hash_entry *dir,
4600 struct elf_link_hash_entry *ind)
4601 {
4602 struct ppc_link_hash_entry *edir, *eind;
4603
4604 edir = (struct ppc_link_hash_entry *) dir;
4605 eind = (struct ppc_link_hash_entry *) ind;
4606
4607 edir->is_func |= eind->is_func;
4608 edir->is_func_descriptor |= eind->is_func_descriptor;
4609 edir->tls_mask |= eind->tls_mask;
4610 if (eind->oh != NULL)
4611 edir->oh = ppc_follow_link (eind->oh);
4612
4613 /* If called to transfer flags for a weakdef during processing
4614 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
4615 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
4616 if (!(ELIMINATE_COPY_RELOCS
4617 && eind->elf.root.type != bfd_link_hash_indirect
4618 && edir->elf.dynamic_adjusted))
4619 edir->elf.non_got_ref |= eind->elf.non_got_ref;
4620
4621 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
4622 edir->elf.ref_regular |= eind->elf.ref_regular;
4623 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
4624 edir->elf.needs_plt |= eind->elf.needs_plt;
4625 edir->elf.pointer_equality_needed |= eind->elf.pointer_equality_needed;
4626
4627 /* Copy over any dynamic relocs we may have on the indirect sym. */
4628 if (eind->dyn_relocs != NULL)
4629 {
4630 if (edir->dyn_relocs != NULL)
4631 {
4632 struct elf_dyn_relocs **pp;
4633 struct elf_dyn_relocs *p;
4634
4635 /* Add reloc counts against the indirect sym to the direct sym
4636 list. Merge any entries against the same section. */
4637 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
4638 {
4639 struct elf_dyn_relocs *q;
4640
4641 for (q = edir->dyn_relocs; q != NULL; q = q->next)
4642 if (q->sec == p->sec)
4643 {
4644 q->pc_count += p->pc_count;
4645 q->count += p->count;
4646 *pp = p->next;
4647 break;
4648 }
4649 if (q == NULL)
4650 pp = &p->next;
4651 }
4652 *pp = edir->dyn_relocs;
4653 }
4654
4655 edir->dyn_relocs = eind->dyn_relocs;
4656 eind->dyn_relocs = NULL;
4657 }
4658
4659 /* If we were called to copy over info for a weak sym, that's all.
4660 You might think dyn_relocs need not be copied over; After all,
4661 both syms will be dynamic or both non-dynamic so we're just
4662 moving reloc accounting around. However, ELIMINATE_COPY_RELOCS
4663 code in ppc64_elf_adjust_dynamic_symbol needs to check for
4664 dyn_relocs in read-only sections, and it does so on what is the
4665 DIR sym here. */
4666 if (eind->elf.root.type != bfd_link_hash_indirect)
4667 return;
4668
4669 /* Copy over got entries that we may have already seen to the
4670 symbol which just became indirect. */
4671 if (eind->elf.got.glist != NULL)
4672 {
4673 if (edir->elf.got.glist != NULL)
4674 {
4675 struct got_entry **entp;
4676 struct got_entry *ent;
4677
4678 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
4679 {
4680 struct got_entry *dent;
4681
4682 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
4683 if (dent->addend == ent->addend
4684 && dent->owner == ent->owner
4685 && dent->tls_type == ent->tls_type)
4686 {
4687 dent->got.refcount += ent->got.refcount;
4688 *entp = ent->next;
4689 break;
4690 }
4691 if (dent == NULL)
4692 entp = &ent->next;
4693 }
4694 *entp = edir->elf.got.glist;
4695 }
4696
4697 edir->elf.got.glist = eind->elf.got.glist;
4698 eind->elf.got.glist = NULL;
4699 }
4700
4701 /* And plt entries. */
4702 move_plt_plist (eind, edir);
4703
4704 if (eind->elf.dynindx != -1)
4705 {
4706 if (edir->elf.dynindx != -1)
4707 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
4708 edir->elf.dynstr_index);
4709 edir->elf.dynindx = eind->elf.dynindx;
4710 edir->elf.dynstr_index = eind->elf.dynstr_index;
4711 eind->elf.dynindx = -1;
4712 eind->elf.dynstr_index = 0;
4713 }
4714 }
4715
4716 /* Find the function descriptor hash entry from the given function code
4717 hash entry FH. Link the entries via their OH fields. */
4718
4719 static struct ppc_link_hash_entry *
4720 lookup_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
4721 {
4722 struct ppc_link_hash_entry *fdh = fh->oh;
4723
4724 if (fdh == NULL)
4725 {
4726 const char *fd_name = fh->elf.root.root.string + 1;
4727
4728 fdh = (struct ppc_link_hash_entry *)
4729 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
4730 if (fdh == NULL)
4731 return fdh;
4732
4733 fdh->is_func_descriptor = 1;
4734 fdh->oh = fh;
4735 fh->is_func = 1;
4736 fh->oh = fdh;
4737 }
4738
4739 return ppc_follow_link (fdh);
4740 }
4741
4742 /* Make a fake function descriptor sym for the code sym FH. */
4743
4744 static struct ppc_link_hash_entry *
4745 make_fdh (struct bfd_link_info *info,
4746 struct ppc_link_hash_entry *fh)
4747 {
4748 bfd *abfd;
4749 asymbol *newsym;
4750 struct bfd_link_hash_entry *bh;
4751 struct ppc_link_hash_entry *fdh;
4752
4753 abfd = fh->elf.root.u.undef.abfd;
4754 newsym = bfd_make_empty_symbol (abfd);
4755 newsym->name = fh->elf.root.root.string + 1;
4756 newsym->section = bfd_und_section_ptr;
4757 newsym->value = 0;
4758 newsym->flags = BSF_WEAK;
4759
4760 bh = NULL;
4761 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
4762 newsym->flags, newsym->section,
4763 newsym->value, NULL, FALSE, FALSE,
4764 &bh))
4765 return NULL;
4766
4767 fdh = (struct ppc_link_hash_entry *) bh;
4768 fdh->elf.non_elf = 0;
4769 fdh->fake = 1;
4770 fdh->is_func_descriptor = 1;
4771 fdh->oh = fh;
4772 fh->is_func = 1;
4773 fh->oh = fdh;
4774 return fdh;
4775 }
4776
4777 /* Fix function descriptor symbols defined in .opd sections to be
4778 function type. */
4779
4780 static bfd_boolean
4781 ppc64_elf_add_symbol_hook (bfd *ibfd,
4782 struct bfd_link_info *info,
4783 Elf_Internal_Sym *isym,
4784 const char **name,
4785 flagword *flags ATTRIBUTE_UNUSED,
4786 asection **sec,
4787 bfd_vma *value ATTRIBUTE_UNUSED)
4788 {
4789 if ((ibfd->flags & DYNAMIC) == 0
4790 && ELF_ST_BIND (isym->st_info) == STB_GNU_UNIQUE)
4791 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4792
4793 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
4794 {
4795 if ((ibfd->flags & DYNAMIC) == 0)
4796 elf_tdata (info->output_bfd)->has_gnu_symbols = TRUE;
4797 }
4798 else if (ELF_ST_TYPE (isym->st_info) == STT_FUNC)
4799 ;
4800 else if (*sec != NULL
4801 && strcmp ((*sec)->name, ".opd") == 0)
4802 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4803
4804 if ((STO_PPC64_LOCAL_MASK & isym->st_other) != 0)
4805 {
4806 if (abiversion (ibfd) == 0)
4807 set_abiversion (ibfd, 2);
4808 else if (abiversion (ibfd) == 1)
4809 {
4810 info->callbacks->einfo (_("%P: symbol '%s' has invalid st_other"
4811 " for ABI version 1\n"), name);
4812 bfd_set_error (bfd_error_bad_value);
4813 return FALSE;
4814 }
4815 }
4816
4817 return TRUE;
4818 }
4819
4820 /* Merge non-visibility st_other attributes: local entry point. */
4821
4822 static void
4823 ppc64_elf_merge_symbol_attribute (struct elf_link_hash_entry *h,
4824 const Elf_Internal_Sym *isym,
4825 bfd_boolean definition,
4826 bfd_boolean dynamic)
4827 {
4828 if (definition && !dynamic)
4829 h->other = ((isym->st_other & ~ELF_ST_VISIBILITY (-1))
4830 | ELF_ST_VISIBILITY (h->other));
4831 }
4832
4833 /* This function makes an old ABI object reference to ".bar" cause the
4834 inclusion of a new ABI object archive that defines "bar".
4835 NAME is a symbol defined in an archive. Return a symbol in the hash
4836 table that might be satisfied by the archive symbols. */
4837
4838 static struct elf_link_hash_entry *
4839 ppc64_elf_archive_symbol_lookup (bfd *abfd,
4840 struct bfd_link_info *info,
4841 const char *name)
4842 {
4843 struct elf_link_hash_entry *h;
4844 char *dot_name;
4845 size_t len;
4846
4847 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
4848 if (h != NULL
4849 /* Don't return this sym if it is a fake function descriptor
4850 created by add_symbol_adjust. */
4851 && !(h->root.type == bfd_link_hash_undefweak
4852 && ((struct ppc_link_hash_entry *) h)->fake))
4853 return h;
4854
4855 if (name[0] == '.')
4856 return h;
4857
4858 len = strlen (name);
4859 dot_name = bfd_alloc (abfd, len + 2);
4860 if (dot_name == NULL)
4861 return (struct elf_link_hash_entry *) 0 - 1;
4862 dot_name[0] = '.';
4863 memcpy (dot_name + 1, name, len + 1);
4864 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4865 bfd_release (abfd, dot_name);
4866 return h;
4867 }
4868
4869 /* This function satisfies all old ABI object references to ".bar" if a
4870 new ABI object defines "bar". Well, at least, undefined dot symbols
4871 are made weak. This stops later archive searches from including an
4872 object if we already have a function descriptor definition. It also
4873 prevents the linker complaining about undefined symbols.
4874 We also check and correct mismatched symbol visibility here. The
4875 most restrictive visibility of the function descriptor and the
4876 function entry symbol is used. */
4877
4878 static bfd_boolean
4879 add_symbol_adjust (struct ppc_link_hash_entry *eh, struct bfd_link_info *info)
4880 {
4881 struct ppc_link_hash_table *htab;
4882 struct ppc_link_hash_entry *fdh;
4883
4884 if (eh->elf.root.type == bfd_link_hash_indirect)
4885 return TRUE;
4886
4887 if (eh->elf.root.type == bfd_link_hash_warning)
4888 eh = (struct ppc_link_hash_entry *) eh->elf.root.u.i.link;
4889
4890 if (eh->elf.root.root.string[0] != '.')
4891 abort ();
4892
4893 htab = ppc_hash_table (info);
4894 if (htab == NULL)
4895 return FALSE;
4896
4897 fdh = lookup_fdh (eh, htab);
4898 if (fdh == NULL)
4899 {
4900 if (!info->relocatable
4901 && (eh->elf.root.type == bfd_link_hash_undefined
4902 || eh->elf.root.type == bfd_link_hash_undefweak)
4903 && eh->elf.ref_regular)
4904 {
4905 /* Make an undefweak function descriptor sym, which is enough to
4906 pull in an --as-needed shared lib, but won't cause link
4907 errors. Archives are handled elsewhere. */
4908 fdh = make_fdh (info, eh);
4909 if (fdh == NULL)
4910 return FALSE;
4911 fdh->elf.ref_regular = 1;
4912 }
4913 }
4914 else
4915 {
4916 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4917 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4918 if (entry_vis < descr_vis)
4919 fdh->elf.other += entry_vis - descr_vis;
4920 else if (entry_vis > descr_vis)
4921 eh->elf.other += descr_vis - entry_vis;
4922
4923 if ((fdh->elf.root.type == bfd_link_hash_defined
4924 || fdh->elf.root.type == bfd_link_hash_defweak)
4925 && eh->elf.root.type == bfd_link_hash_undefined)
4926 {
4927 eh->elf.root.type = bfd_link_hash_undefweak;
4928 eh->was_undefined = 1;
4929 htab->twiddled_syms = 1;
4930 }
4931 }
4932
4933 return TRUE;
4934 }
4935
4936 /* Process list of dot-symbols we made in link_hash_newfunc. */
4937
4938 static bfd_boolean
4939 ppc64_elf_process_dot_syms (bfd *ibfd, struct bfd_link_info *info)
4940 {
4941 struct ppc_link_hash_table *htab;
4942 struct ppc_link_hash_entry **p, *eh;
4943
4944 if (!is_ppc64_elf (info->output_bfd))
4945 return TRUE;
4946 htab = ppc_hash_table (info);
4947 if (htab == NULL)
4948 return FALSE;
4949
4950 if (is_ppc64_elf (ibfd))
4951 {
4952 p = &htab->dot_syms;
4953 while ((eh = *p) != NULL)
4954 {
4955 *p = NULL;
4956 if (&eh->elf == htab->elf.hgot)
4957 ;
4958 else if (htab->elf.hgot == NULL
4959 && strcmp (eh->elf.root.root.string, ".TOC.") == 0)
4960 htab->elf.hgot = &eh->elf;
4961 else if (!add_symbol_adjust (eh, info))
4962 return FALSE;
4963 p = &eh->u.next_dot_sym;
4964 }
4965 }
4966
4967 /* Clear the list for non-ppc64 input files. */
4968 p = &htab->dot_syms;
4969 while ((eh = *p) != NULL)
4970 {
4971 *p = NULL;
4972 p = &eh->u.next_dot_sym;
4973 }
4974
4975 /* We need to fix the undefs list for any syms we have twiddled to
4976 undef_weak. */
4977 if (htab->twiddled_syms)
4978 {
4979 bfd_link_repair_undef_list (&htab->elf.root);
4980 htab->twiddled_syms = 0;
4981 }
4982 return TRUE;
4983 }
4984
4985 /* Undo hash table changes when an --as-needed input file is determined
4986 not to be needed. */
4987
4988 static bfd_boolean
4989 ppc64_elf_notice_as_needed (bfd *ibfd,
4990 struct bfd_link_info *info,
4991 enum notice_asneeded_action act)
4992 {
4993 if (act == notice_not_needed)
4994 {
4995 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4996
4997 if (htab == NULL)
4998 return FALSE;
4999
5000 htab->dot_syms = NULL;
5001 }
5002 return _bfd_elf_notice_as_needed (ibfd, info, act);
5003 }
5004
5005 /* If --just-symbols against a final linked binary, then assume we need
5006 toc adjusting stubs when calling functions defined there. */
5007
5008 static void
5009 ppc64_elf_link_just_syms (asection *sec, struct bfd_link_info *info)
5010 {
5011 if ((sec->flags & SEC_CODE) != 0
5012 && (sec->owner->flags & (EXEC_P | DYNAMIC)) != 0
5013 && is_ppc64_elf (sec->owner))
5014 {
5015 if (abiversion (sec->owner) >= 2
5016 || bfd_get_section_by_name (sec->owner, ".opd") != NULL)
5017 sec->has_toc_reloc = 1;
5018 }
5019 _bfd_elf_link_just_syms (sec, info);
5020 }
5021
5022 static struct plt_entry **
5023 update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
5024 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
5025 {
5026 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
5027 struct plt_entry **local_plt;
5028 unsigned char *local_got_tls_masks;
5029
5030 if (local_got_ents == NULL)
5031 {
5032 bfd_size_type size = symtab_hdr->sh_info;
5033
5034 size *= (sizeof (*local_got_ents)
5035 + sizeof (*local_plt)
5036 + sizeof (*local_got_tls_masks));
5037 local_got_ents = bfd_zalloc (abfd, size);
5038 if (local_got_ents == NULL)
5039 return NULL;
5040 elf_local_got_ents (abfd) = local_got_ents;
5041 }
5042
5043 if ((tls_type & (PLT_IFUNC | TLS_EXPLICIT)) == 0)
5044 {
5045 struct got_entry *ent;
5046
5047 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
5048 if (ent->addend == r_addend
5049 && ent->owner == abfd
5050 && ent->tls_type == tls_type)
5051 break;
5052 if (ent == NULL)
5053 {
5054 bfd_size_type amt = sizeof (*ent);
5055 ent = bfd_alloc (abfd, amt);
5056 if (ent == NULL)
5057 return FALSE;
5058 ent->next = local_got_ents[r_symndx];
5059 ent->addend = r_addend;
5060 ent->owner = abfd;
5061 ent->tls_type = tls_type;
5062 ent->is_indirect = FALSE;
5063 ent->got.refcount = 0;
5064 local_got_ents[r_symndx] = ent;
5065 }
5066 ent->got.refcount += 1;
5067 }
5068
5069 local_plt = (struct plt_entry **) (local_got_ents + symtab_hdr->sh_info);
5070 local_got_tls_masks = (unsigned char *) (local_plt + symtab_hdr->sh_info);
5071 local_got_tls_masks[r_symndx] |= tls_type;
5072
5073 return local_plt + r_symndx;
5074 }
5075
5076 static bfd_boolean
5077 update_plt_info (bfd *abfd, struct plt_entry **plist, bfd_vma addend)
5078 {
5079 struct plt_entry *ent;
5080
5081 for (ent = *plist; ent != NULL; ent = ent->next)
5082 if (ent->addend == addend)
5083 break;
5084 if (ent == NULL)
5085 {
5086 bfd_size_type amt = sizeof (*ent);
5087 ent = bfd_alloc (abfd, amt);
5088 if (ent == NULL)
5089 return FALSE;
5090 ent->next = *plist;
5091 ent->addend = addend;
5092 ent->plt.refcount = 0;
5093 *plist = ent;
5094 }
5095 ent->plt.refcount += 1;
5096 return TRUE;
5097 }
5098
5099 static bfd_boolean
5100 is_branch_reloc (enum elf_ppc64_reloc_type r_type)
5101 {
5102 return (r_type == R_PPC64_REL24
5103 || r_type == R_PPC64_REL14
5104 || r_type == R_PPC64_REL14_BRTAKEN
5105 || r_type == R_PPC64_REL14_BRNTAKEN
5106 || r_type == R_PPC64_ADDR24
5107 || r_type == R_PPC64_ADDR14
5108 || r_type == R_PPC64_ADDR14_BRTAKEN
5109 || r_type == R_PPC64_ADDR14_BRNTAKEN);
5110 }
5111
5112 /* Look through the relocs for a section during the first phase, and
5113 calculate needed space in the global offset table, procedure
5114 linkage table, and dynamic reloc sections. */
5115
5116 static bfd_boolean
5117 ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
5118 asection *sec, const Elf_Internal_Rela *relocs)
5119 {
5120 struct ppc_link_hash_table *htab;
5121 Elf_Internal_Shdr *symtab_hdr;
5122 struct elf_link_hash_entry **sym_hashes;
5123 const Elf_Internal_Rela *rel;
5124 const Elf_Internal_Rela *rel_end;
5125 asection *sreloc;
5126 asection **opd_sym_map;
5127 struct elf_link_hash_entry *tga, *dottga;
5128
5129 if (info->relocatable)
5130 return TRUE;
5131
5132 /* Don't do anything special with non-loaded, non-alloced sections.
5133 In particular, any relocs in such sections should not affect GOT
5134 and PLT reference counting (ie. we don't allow them to create GOT
5135 or PLT entries), there's no possibility or desire to optimize TLS
5136 relocs, and there's not much point in propagating relocs to shared
5137 libs that the dynamic linker won't relocate. */
5138 if ((sec->flags & SEC_ALLOC) == 0)
5139 return TRUE;
5140
5141 BFD_ASSERT (is_ppc64_elf (abfd));
5142
5143 htab = ppc_hash_table (info);
5144 if (htab == NULL)
5145 return FALSE;
5146
5147 tga = elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
5148 FALSE, FALSE, TRUE);
5149 dottga = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
5150 FALSE, FALSE, TRUE);
5151 symtab_hdr = &elf_symtab_hdr (abfd);
5152 sym_hashes = elf_sym_hashes (abfd);
5153 sreloc = NULL;
5154 opd_sym_map = NULL;
5155 if (strcmp (sec->name, ".opd") == 0)
5156 {
5157 /* Garbage collection needs some extra help with .opd sections.
5158 We don't want to necessarily keep everything referenced by
5159 relocs in .opd, as that would keep all functions. Instead,
5160 if we reference an .opd symbol (a function descriptor), we
5161 want to keep the function code symbol's section. This is
5162 easy for global symbols, but for local syms we need to keep
5163 information about the associated function section. */
5164 bfd_size_type amt;
5165
5166 if (abiversion (abfd) == 0)
5167 set_abiversion (abfd, 1);
5168 else if (abiversion (abfd) == 2)
5169 {
5170 info->callbacks->einfo (_("%P: .opd not allowed in ABI version %d\n"),
5171 abiversion (abfd));
5172 bfd_set_error (bfd_error_bad_value);
5173 return FALSE;
5174 }
5175 amt = sec->size * sizeof (*opd_sym_map) / 8;
5176 opd_sym_map = bfd_zalloc (abfd, amt);
5177 if (opd_sym_map == NULL)
5178 return FALSE;
5179 ppc64_elf_section_data (sec)->u.opd.func_sec = opd_sym_map;
5180 BFD_ASSERT (ppc64_elf_section_data (sec)->sec_type == sec_normal);
5181 ppc64_elf_section_data (sec)->sec_type = sec_opd;
5182 }
5183
5184 rel_end = relocs + sec->reloc_count;
5185 for (rel = relocs; rel < rel_end; rel++)
5186 {
5187 unsigned long r_symndx;
5188 struct elf_link_hash_entry *h;
5189 enum elf_ppc64_reloc_type r_type;
5190 int tls_type;
5191 struct _ppc64_elf_section_data *ppc64_sec;
5192 struct plt_entry **ifunc;
5193
5194 r_symndx = ELF64_R_SYM (rel->r_info);
5195 if (r_symndx < symtab_hdr->sh_info)
5196 h = NULL;
5197 else
5198 {
5199 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5200 h = elf_follow_link (h);
5201
5202 /* PR15323, ref flags aren't set for references in the same
5203 object. */
5204 h->root.non_ir_ref = 1;
5205
5206 if (h == htab->elf.hgot)
5207 sec->has_toc_reloc = 1;
5208 }
5209
5210 tls_type = 0;
5211 ifunc = NULL;
5212 if (h != NULL)
5213 {
5214 if (h->type == STT_GNU_IFUNC)
5215 {
5216 h->needs_plt = 1;
5217 ifunc = &h->plt.plist;
5218 }
5219 }
5220 else
5221 {
5222 Elf_Internal_Sym *isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5223 abfd, r_symndx);
5224 if (isym == NULL)
5225 return FALSE;
5226
5227 if (ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC)
5228 {
5229 ifunc = update_local_sym_info (abfd, symtab_hdr, r_symndx,
5230 rel->r_addend, PLT_IFUNC);
5231 if (ifunc == NULL)
5232 return FALSE;
5233 }
5234 }
5235 r_type = ELF64_R_TYPE (rel->r_info);
5236 if (is_branch_reloc (r_type))
5237 {
5238 if (h != NULL && (h == tga || h == dottga))
5239 {
5240 if (rel != relocs
5241 && (ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSGD
5242 || ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_TLSLD))
5243 /* We have a new-style __tls_get_addr call with a marker
5244 reloc. */
5245 ;
5246 else
5247 /* Mark this section as having an old-style call. */
5248 sec->has_tls_get_addr_call = 1;
5249 }
5250
5251 /* STT_GNU_IFUNC symbols must have a PLT entry. */
5252 if (ifunc != NULL
5253 && !update_plt_info (abfd, ifunc, rel->r_addend))
5254 return FALSE;
5255 }
5256
5257 switch (r_type)
5258 {
5259 case R_PPC64_TLSGD:
5260 case R_PPC64_TLSLD:
5261 /* These special tls relocs tie a call to __tls_get_addr with
5262 its parameter symbol. */
5263 break;
5264
5265 case R_PPC64_GOT_TLSLD16:
5266 case R_PPC64_GOT_TLSLD16_LO:
5267 case R_PPC64_GOT_TLSLD16_HI:
5268 case R_PPC64_GOT_TLSLD16_HA:
5269 tls_type = TLS_TLS | TLS_LD;
5270 goto dogottls;
5271
5272 case R_PPC64_GOT_TLSGD16:
5273 case R_PPC64_GOT_TLSGD16_LO:
5274 case R_PPC64_GOT_TLSGD16_HI:
5275 case R_PPC64_GOT_TLSGD16_HA:
5276 tls_type = TLS_TLS | TLS_GD;
5277 goto dogottls;
5278
5279 case R_PPC64_GOT_TPREL16_DS:
5280 case R_PPC64_GOT_TPREL16_LO_DS:
5281 case R_PPC64_GOT_TPREL16_HI:
5282 case R_PPC64_GOT_TPREL16_HA:
5283 if (!info->executable)
5284 info->flags |= DF_STATIC_TLS;
5285 tls_type = TLS_TLS | TLS_TPREL;
5286 goto dogottls;
5287
5288 case R_PPC64_GOT_DTPREL16_DS:
5289 case R_PPC64_GOT_DTPREL16_LO_DS:
5290 case R_PPC64_GOT_DTPREL16_HI:
5291 case R_PPC64_GOT_DTPREL16_HA:
5292 tls_type = TLS_TLS | TLS_DTPREL;
5293 dogottls:
5294 sec->has_tls_reloc = 1;
5295 /* Fall thru */
5296
5297 case R_PPC64_GOT16:
5298 case R_PPC64_GOT16_DS:
5299 case R_PPC64_GOT16_HA:
5300 case R_PPC64_GOT16_HI:
5301 case R_PPC64_GOT16_LO:
5302 case R_PPC64_GOT16_LO_DS:
5303 /* This symbol requires a global offset table entry. */
5304 sec->has_toc_reloc = 1;
5305 if (r_type == R_PPC64_GOT_TLSLD16
5306 || r_type == R_PPC64_GOT_TLSGD16
5307 || r_type == R_PPC64_GOT_TPREL16_DS
5308 || r_type == R_PPC64_GOT_DTPREL16_DS
5309 || r_type == R_PPC64_GOT16
5310 || r_type == R_PPC64_GOT16_DS)
5311 {
5312 htab->do_multi_toc = 1;
5313 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5314 }
5315
5316 if (ppc64_elf_tdata (abfd)->got == NULL
5317 && !create_got_section (abfd, info))
5318 return FALSE;
5319
5320 if (h != NULL)
5321 {
5322 struct ppc_link_hash_entry *eh;
5323 struct got_entry *ent;
5324
5325 eh = (struct ppc_link_hash_entry *) h;
5326 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
5327 if (ent->addend == rel->r_addend
5328 && ent->owner == abfd
5329 && ent->tls_type == tls_type)
5330 break;
5331 if (ent == NULL)
5332 {
5333 bfd_size_type amt = sizeof (*ent);
5334 ent = bfd_alloc (abfd, amt);
5335 if (ent == NULL)
5336 return FALSE;
5337 ent->next = eh->elf.got.glist;
5338 ent->addend = rel->r_addend;
5339 ent->owner = abfd;
5340 ent->tls_type = tls_type;
5341 ent->is_indirect = FALSE;
5342 ent->got.refcount = 0;
5343 eh->elf.got.glist = ent;
5344 }
5345 ent->got.refcount += 1;
5346 eh->tls_mask |= tls_type;
5347 }
5348 else
5349 /* This is a global offset table entry for a local symbol. */
5350 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5351 rel->r_addend, tls_type))
5352 return FALSE;
5353
5354 /* We may also need a plt entry if the symbol turns out to be
5355 an ifunc. */
5356 if (h != NULL && !info->shared && abiversion (abfd) == 2)
5357 {
5358 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5359 return FALSE;
5360 }
5361 break;
5362
5363 case R_PPC64_PLT16_HA:
5364 case R_PPC64_PLT16_HI:
5365 case R_PPC64_PLT16_LO:
5366 case R_PPC64_PLT32:
5367 case R_PPC64_PLT64:
5368 /* This symbol requires a procedure linkage table entry. We
5369 actually build the entry in adjust_dynamic_symbol,
5370 because this might be a case of linking PIC code without
5371 linking in any dynamic objects, in which case we don't
5372 need to generate a procedure linkage table after all. */
5373 if (h == NULL)
5374 {
5375 /* It does not make sense to have a procedure linkage
5376 table entry for a local symbol. */
5377 bfd_set_error (bfd_error_bad_value);
5378 return FALSE;
5379 }
5380 else
5381 {
5382 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5383 return FALSE;
5384 h->needs_plt = 1;
5385 if (h->root.root.string[0] == '.'
5386 && h->root.root.string[1] != '\0')
5387 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5388 }
5389 break;
5390
5391 /* The following relocations don't need to propagate the
5392 relocation if linking a shared object since they are
5393 section relative. */
5394 case R_PPC64_SECTOFF:
5395 case R_PPC64_SECTOFF_LO:
5396 case R_PPC64_SECTOFF_HI:
5397 case R_PPC64_SECTOFF_HA:
5398 case R_PPC64_SECTOFF_DS:
5399 case R_PPC64_SECTOFF_LO_DS:
5400 case R_PPC64_DTPREL16:
5401 case R_PPC64_DTPREL16_LO:
5402 case R_PPC64_DTPREL16_HI:
5403 case R_PPC64_DTPREL16_HA:
5404 case R_PPC64_DTPREL16_DS:
5405 case R_PPC64_DTPREL16_LO_DS:
5406 case R_PPC64_DTPREL16_HIGH:
5407 case R_PPC64_DTPREL16_HIGHA:
5408 case R_PPC64_DTPREL16_HIGHER:
5409 case R_PPC64_DTPREL16_HIGHERA:
5410 case R_PPC64_DTPREL16_HIGHEST:
5411 case R_PPC64_DTPREL16_HIGHESTA:
5412 break;
5413
5414 /* Nor do these. */
5415 case R_PPC64_REL16:
5416 case R_PPC64_REL16_LO:
5417 case R_PPC64_REL16_HI:
5418 case R_PPC64_REL16_HA:
5419 break;
5420
5421 case R_PPC64_TOC16:
5422 case R_PPC64_TOC16_DS:
5423 htab->do_multi_toc = 1;
5424 ppc64_elf_tdata (abfd)->has_small_toc_reloc = 1;
5425 case R_PPC64_TOC16_LO:
5426 case R_PPC64_TOC16_HI:
5427 case R_PPC64_TOC16_HA:
5428 case R_PPC64_TOC16_LO_DS:
5429 sec->has_toc_reloc = 1;
5430 break;
5431
5432 /* This relocation describes the C++ object vtable hierarchy.
5433 Reconstruct it for later use during GC. */
5434 case R_PPC64_GNU_VTINHERIT:
5435 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
5436 return FALSE;
5437 break;
5438
5439 /* This relocation describes which C++ vtable entries are actually
5440 used. Record for later use during GC. */
5441 case R_PPC64_GNU_VTENTRY:
5442 BFD_ASSERT (h != NULL);
5443 if (h != NULL
5444 && !bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
5445 return FALSE;
5446 break;
5447
5448 case R_PPC64_REL14:
5449 case R_PPC64_REL14_BRTAKEN:
5450 case R_PPC64_REL14_BRNTAKEN:
5451 {
5452 asection *dest = NULL;
5453
5454 /* Heuristic: If jumping outside our section, chances are
5455 we are going to need a stub. */
5456 if (h != NULL)
5457 {
5458 /* If the sym is weak it may be overridden later, so
5459 don't assume we know where a weak sym lives. */
5460 if (h->root.type == bfd_link_hash_defined)
5461 dest = h->root.u.def.section;
5462 }
5463 else
5464 {
5465 Elf_Internal_Sym *isym;
5466
5467 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5468 abfd, r_symndx);
5469 if (isym == NULL)
5470 return FALSE;
5471
5472 dest = bfd_section_from_elf_index (abfd, isym->st_shndx);
5473 }
5474
5475 if (dest != sec)
5476 ppc64_elf_section_data (sec)->has_14bit_branch = 1;
5477 }
5478 /* Fall through. */
5479
5480 case R_PPC64_REL24:
5481 if (h != NULL && ifunc == NULL)
5482 {
5483 /* We may need a .plt entry if the function this reloc
5484 refers to is in a shared lib. */
5485 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5486 return FALSE;
5487 h->needs_plt = 1;
5488 if (h->root.root.string[0] == '.'
5489 && h->root.root.string[1] != '\0')
5490 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5491 if (h == tga || h == dottga)
5492 sec->has_tls_reloc = 1;
5493 }
5494 break;
5495
5496 case R_PPC64_TPREL64:
5497 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
5498 if (!info->executable)
5499 info->flags |= DF_STATIC_TLS;
5500 goto dotlstoc;
5501
5502 case R_PPC64_DTPMOD64:
5503 if (rel + 1 < rel_end
5504 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
5505 && rel[1].r_offset == rel->r_offset + 8)
5506 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
5507 else
5508 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
5509 goto dotlstoc;
5510
5511 case R_PPC64_DTPREL64:
5512 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
5513 if (rel != relocs
5514 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
5515 && rel[-1].r_offset == rel->r_offset - 8)
5516 /* This is the second reloc of a dtpmod, dtprel pair.
5517 Don't mark with TLS_DTPREL. */
5518 goto dodyn;
5519
5520 dotlstoc:
5521 sec->has_tls_reloc = 1;
5522 if (h != NULL)
5523 {
5524 struct ppc_link_hash_entry *eh;
5525 eh = (struct ppc_link_hash_entry *) h;
5526 eh->tls_mask |= tls_type;
5527 }
5528 else
5529 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
5530 rel->r_addend, tls_type))
5531 return FALSE;
5532
5533 ppc64_sec = ppc64_elf_section_data (sec);
5534 if (ppc64_sec->sec_type != sec_toc)
5535 {
5536 bfd_size_type amt;
5537
5538 /* One extra to simplify get_tls_mask. */
5539 amt = sec->size * sizeof (unsigned) / 8 + sizeof (unsigned);
5540 ppc64_sec->u.toc.symndx = bfd_zalloc (abfd, amt);
5541 if (ppc64_sec->u.toc.symndx == NULL)
5542 return FALSE;
5543 amt = sec->size * sizeof (bfd_vma) / 8;
5544 ppc64_sec->u.toc.add = bfd_zalloc (abfd, amt);
5545 if (ppc64_sec->u.toc.add == NULL)
5546 return FALSE;
5547 BFD_ASSERT (ppc64_sec->sec_type == sec_normal);
5548 ppc64_sec->sec_type = sec_toc;
5549 }
5550 BFD_ASSERT (rel->r_offset % 8 == 0);
5551 ppc64_sec->u.toc.symndx[rel->r_offset / 8] = r_symndx;
5552 ppc64_sec->u.toc.add[rel->r_offset / 8] = rel->r_addend;
5553
5554 /* Mark the second slot of a GD or LD entry.
5555 -1 to indicate GD and -2 to indicate LD. */
5556 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
5557 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -1;
5558 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
5559 ppc64_sec->u.toc.symndx[rel->r_offset / 8 + 1] = -2;
5560 goto dodyn;
5561
5562 case R_PPC64_TPREL16:
5563 case R_PPC64_TPREL16_LO:
5564 case R_PPC64_TPREL16_HI:
5565 case R_PPC64_TPREL16_HA:
5566 case R_PPC64_TPREL16_DS:
5567 case R_PPC64_TPREL16_LO_DS:
5568 case R_PPC64_TPREL16_HIGH:
5569 case R_PPC64_TPREL16_HIGHA:
5570 case R_PPC64_TPREL16_HIGHER:
5571 case R_PPC64_TPREL16_HIGHERA:
5572 case R_PPC64_TPREL16_HIGHEST:
5573 case R_PPC64_TPREL16_HIGHESTA:
5574 if (info->shared)
5575 {
5576 if (!info->executable)
5577 info->flags |= DF_STATIC_TLS;
5578 goto dodyn;
5579 }
5580 break;
5581
5582 case R_PPC64_ADDR64:
5583 if (opd_sym_map != NULL
5584 && rel + 1 < rel_end
5585 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
5586 {
5587 if (h != NULL)
5588 {
5589 if (h->root.root.string[0] == '.'
5590 && h->root.root.string[1] != 0
5591 && lookup_fdh ((struct ppc_link_hash_entry *) h, htab))
5592 ;
5593 else
5594 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5595 }
5596 else
5597 {
5598 asection *s;
5599 Elf_Internal_Sym *isym;
5600
5601 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5602 abfd, r_symndx);
5603 if (isym == NULL)
5604 return FALSE;
5605
5606 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5607 if (s != NULL && s != sec)
5608 opd_sym_map[rel->r_offset / 8] = s;
5609 }
5610 }
5611 /* Fall through. */
5612
5613 case R_PPC64_ADDR16:
5614 case R_PPC64_ADDR16_DS:
5615 case R_PPC64_ADDR16_HA:
5616 case R_PPC64_ADDR16_HI:
5617 case R_PPC64_ADDR16_HIGH:
5618 case R_PPC64_ADDR16_HIGHA:
5619 case R_PPC64_ADDR16_HIGHER:
5620 case R_PPC64_ADDR16_HIGHERA:
5621 case R_PPC64_ADDR16_HIGHEST:
5622 case R_PPC64_ADDR16_HIGHESTA:
5623 case R_PPC64_ADDR16_LO:
5624 case R_PPC64_ADDR16_LO_DS:
5625 if (h != NULL && !info->shared && abiversion (abfd) == 2
5626 && rel->r_addend == 0)
5627 {
5628 /* We may need a .plt entry if this reloc refers to a
5629 function in a shared lib. */
5630 if (!update_plt_info (abfd, &h->plt.plist, rel->r_addend))
5631 return FALSE;
5632 h->pointer_equality_needed = 1;
5633 }
5634 /* Fall through. */
5635
5636 case R_PPC64_REL30:
5637 case R_PPC64_REL32:
5638 case R_PPC64_REL64:
5639 case R_PPC64_ADDR14:
5640 case R_PPC64_ADDR14_BRNTAKEN:
5641 case R_PPC64_ADDR14_BRTAKEN:
5642 case R_PPC64_ADDR24:
5643 case R_PPC64_ADDR32:
5644 case R_PPC64_UADDR16:
5645 case R_PPC64_UADDR32:
5646 case R_PPC64_UADDR64:
5647 case R_PPC64_TOC:
5648 if (h != NULL && !info->shared)
5649 /* We may need a copy reloc. */
5650 h->non_got_ref = 1;
5651
5652 /* Don't propagate .opd relocs. */
5653 if (NO_OPD_RELOCS && opd_sym_map != NULL)
5654 break;
5655
5656 /* If we are creating a shared library, and this is a reloc
5657 against a global symbol, or a non PC relative reloc
5658 against a local symbol, then we need to copy the reloc
5659 into the shared library. However, if we are linking with
5660 -Bsymbolic, we do not need to copy a reloc against a
5661 global symbol which is defined in an object we are
5662 including in the link (i.e., DEF_REGULAR is set). At
5663 this point we have not seen all the input files, so it is
5664 possible that DEF_REGULAR is not set now but will be set
5665 later (it is never cleared). In case of a weak definition,
5666 DEF_REGULAR may be cleared later by a strong definition in
5667 a shared library. We account for that possibility below by
5668 storing information in the dyn_relocs field of the hash
5669 table entry. A similar situation occurs when creating
5670 shared libraries and symbol visibility changes render the
5671 symbol local.
5672
5673 If on the other hand, we are creating an executable, we
5674 may need to keep relocations for symbols satisfied by a
5675 dynamic library if we manage to avoid copy relocs for the
5676 symbol. */
5677 dodyn:
5678 if ((info->shared
5679 && (must_be_dyn_reloc (info, r_type)
5680 || (h != NULL
5681 && (!SYMBOLIC_BIND (info, h)
5682 || h->root.type == bfd_link_hash_defweak
5683 || !h->def_regular))))
5684 || (ELIMINATE_COPY_RELOCS
5685 && !info->shared
5686 && h != NULL
5687 && (h->root.type == bfd_link_hash_defweak
5688 || !h->def_regular))
5689 || (!info->shared
5690 && ifunc != NULL))
5691 {
5692 /* We must copy these reloc types into the output file.
5693 Create a reloc section in dynobj and make room for
5694 this reloc. */
5695 if (sreloc == NULL)
5696 {
5697 sreloc = _bfd_elf_make_dynamic_reloc_section
5698 (sec, htab->elf.dynobj, 3, abfd, /*rela?*/ TRUE);
5699
5700 if (sreloc == NULL)
5701 return FALSE;
5702 }
5703
5704 /* If this is a global symbol, we count the number of
5705 relocations we need for this symbol. */
5706 if (h != NULL)
5707 {
5708 struct elf_dyn_relocs *p;
5709 struct elf_dyn_relocs **head;
5710
5711 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
5712 p = *head;
5713 if (p == NULL || p->sec != sec)
5714 {
5715 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5716 if (p == NULL)
5717 return FALSE;
5718 p->next = *head;
5719 *head = p;
5720 p->sec = sec;
5721 p->count = 0;
5722 p->pc_count = 0;
5723 }
5724 p->count += 1;
5725 if (!must_be_dyn_reloc (info, r_type))
5726 p->pc_count += 1;
5727 }
5728 else
5729 {
5730 /* Track dynamic relocs needed for local syms too.
5731 We really need local syms available to do this
5732 easily. Oh well. */
5733 struct ppc_dyn_relocs *p;
5734 struct ppc_dyn_relocs **head;
5735 bfd_boolean is_ifunc;
5736 asection *s;
5737 void *vpp;
5738 Elf_Internal_Sym *isym;
5739
5740 isym = bfd_sym_from_r_symndx (&htab->sym_cache,
5741 abfd, r_symndx);
5742 if (isym == NULL)
5743 return FALSE;
5744
5745 s = bfd_section_from_elf_index (abfd, isym->st_shndx);
5746 if (s == NULL)
5747 s = sec;
5748
5749 vpp = &elf_section_data (s)->local_dynrel;
5750 head = (struct ppc_dyn_relocs **) vpp;
5751 is_ifunc = ELF_ST_TYPE (isym->st_info) == STT_GNU_IFUNC;
5752 p = *head;
5753 if (p != NULL && p->sec == sec && p->ifunc != is_ifunc)
5754 p = p->next;
5755 if (p == NULL || p->sec != sec || p->ifunc != is_ifunc)
5756 {
5757 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
5758 if (p == NULL)
5759 return FALSE;
5760 p->next = *head;
5761 *head = p;
5762 p->sec = sec;
5763 p->ifunc = is_ifunc;
5764 p->count = 0;
5765 }
5766 p->count += 1;
5767 }
5768 }
5769 break;
5770
5771 default:
5772 break;
5773 }
5774 }
5775
5776 return TRUE;
5777 }
5778
5779 /* Merge backend specific data from an object file to the output
5780 object file when linking. */
5781
5782 static bfd_boolean
5783 ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5784 {
5785 unsigned long iflags, oflags;
5786
5787 if ((ibfd->flags & BFD_LINKER_CREATED) != 0)
5788 return TRUE;
5789
5790 if (!is_ppc64_elf (ibfd) || !is_ppc64_elf (obfd))
5791 return TRUE;
5792
5793 if (!_bfd_generic_verify_endian_match (ibfd, obfd))
5794 return FALSE;
5795
5796 iflags = elf_elfheader (ibfd)->e_flags;
5797 oflags = elf_elfheader (obfd)->e_flags;
5798
5799 if (!elf_flags_init (obfd) || oflags == 0)
5800 {
5801 elf_flags_init (obfd) = TRUE;
5802 elf_elfheader (obfd)->e_flags = iflags;
5803 }
5804 else if (iflags == oflags || iflags == 0)
5805 ;
5806 else if (iflags & ~EF_PPC64_ABI)
5807 {
5808 (*_bfd_error_handler)
5809 (_("%B uses unknown e_flags 0x%lx"), ibfd, iflags);
5810 bfd_set_error (bfd_error_bad_value);
5811 return FALSE;
5812 }
5813 else
5814 {
5815 (*_bfd_error_handler)
5816 (_("%B: ABI version %ld is not compatible with ABI version %ld output"),
5817 ibfd, iflags, oflags);
5818 bfd_set_error (bfd_error_bad_value);
5819 return FALSE;
5820 }
5821
5822 /* Merge Tag_compatibility attributes and any common GNU ones. */
5823 _bfd_elf_merge_object_attributes (ibfd, obfd);
5824
5825 return TRUE;
5826 }
5827
5828 static bfd_boolean
5829 ppc64_elf_print_private_bfd_data (bfd *abfd, void *ptr)
5830 {
5831 /* Print normal ELF private data. */
5832 _bfd_elf_print_private_bfd_data (abfd, ptr);
5833
5834 if (elf_elfheader (abfd)->e_flags != 0)
5835 {
5836 FILE *file = ptr;
5837
5838 /* xgettext:c-format */
5839 fprintf (file, _("private flags = 0x%lx:"),
5840 elf_elfheader (abfd)->e_flags);
5841
5842 if ((elf_elfheader (abfd)->e_flags & EF_PPC64_ABI) != 0)
5843 fprintf (file, _(" [abiv%ld]"),
5844 elf_elfheader (abfd)->e_flags & EF_PPC64_ABI);
5845 fputc ('\n', file);
5846 }
5847
5848 return TRUE;
5849 }
5850
5851 /* OFFSET in OPD_SEC specifies a function descriptor. Return the address
5852 of the code entry point, and its section. */
5853
5854 static bfd_vma
5855 opd_entry_value (asection *opd_sec,
5856 bfd_vma offset,
5857 asection **code_sec,
5858 bfd_vma *code_off,
5859 bfd_boolean in_code_sec)
5860 {
5861 bfd *opd_bfd = opd_sec->owner;
5862 Elf_Internal_Rela *relocs;
5863 Elf_Internal_Rela *lo, *hi, *look;
5864 bfd_vma val;
5865
5866 /* No relocs implies we are linking a --just-symbols object, or looking
5867 at a final linked executable with addr2line or somesuch. */
5868 if (opd_sec->reloc_count == 0)
5869 {
5870 bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
5871
5872 if (contents == NULL)
5873 {
5874 if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
5875 return (bfd_vma) -1;
5876 ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
5877 }
5878
5879 val = bfd_get_64 (opd_bfd, contents + offset);
5880 if (code_sec != NULL)
5881 {
5882 asection *sec, *likely = NULL;
5883
5884 if (in_code_sec)
5885 {
5886 sec = *code_sec;
5887 if (sec->vma <= val
5888 && val < sec->vma + sec->size)
5889 likely = sec;
5890 else
5891 val = -1;
5892 }
5893 else
5894 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
5895 if (sec->vma <= val
5896 && (sec->flags & SEC_LOAD) != 0
5897 && (sec->flags & SEC_ALLOC) != 0)
5898 likely = sec;
5899 if (likely != NULL)
5900 {
5901 *code_sec = likely;
5902 if (code_off != NULL)
5903 *code_off = val - likely->vma;
5904 }
5905 }
5906 return val;
5907 }
5908
5909 BFD_ASSERT (is_ppc64_elf (opd_bfd));
5910
5911 relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
5912 if (relocs == NULL)
5913 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
5914
5915 /* Go find the opd reloc at the sym address. */
5916 lo = relocs;
5917 BFD_ASSERT (lo != NULL);
5918 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
5919 val = (bfd_vma) -1;
5920 while (lo < hi)
5921 {
5922 look = lo + (hi - lo) / 2;
5923 if (look->r_offset < offset)
5924 lo = look + 1;
5925 else if (look->r_offset > offset)
5926 hi = look;
5927 else
5928 {
5929 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (opd_bfd);
5930
5931 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
5932 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
5933 {
5934 unsigned long symndx = ELF64_R_SYM (look->r_info);
5935 asection *sec;
5936
5937 if (symndx < symtab_hdr->sh_info
5938 || elf_sym_hashes (opd_bfd) == NULL)
5939 {
5940 Elf_Internal_Sym *sym;
5941
5942 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
5943 if (sym == NULL)
5944 {
5945 size_t symcnt = symtab_hdr->sh_info;
5946 if (elf_sym_hashes (opd_bfd) == NULL)
5947 symcnt = symtab_hdr->sh_size / symtab_hdr->sh_entsize;
5948 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, symcnt,
5949 0, NULL, NULL, NULL);
5950 if (sym == NULL)
5951 break;
5952 symtab_hdr->contents = (bfd_byte *) sym;
5953 }
5954
5955 sym += symndx;
5956 val = sym->st_value;
5957 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5958 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
5959 }
5960 else
5961 {
5962 struct elf_link_hash_entry **sym_hashes;
5963 struct elf_link_hash_entry *rh;
5964
5965 sym_hashes = elf_sym_hashes (opd_bfd);
5966 rh = sym_hashes[symndx - symtab_hdr->sh_info];
5967 if (rh != NULL)
5968 {
5969 rh = elf_follow_link (rh);
5970 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
5971 || rh->root.type == bfd_link_hash_defweak);
5972 val = rh->root.u.def.value;
5973 sec = rh->root.u.def.section;
5974 }
5975 else
5976 {
5977 /* Handle the odd case where we can be called
5978 during bfd_elf_link_add_symbols before the
5979 symbol hashes have been fully populated. */
5980 Elf_Internal_Sym *sym;
5981
5982 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr, 1,
5983 symndx, NULL, NULL, NULL);
5984 if (sym == NULL)
5985 break;
5986
5987 val = sym->st_value;
5988 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
5989 free (sym);
5990 }
5991 }
5992 val += look->r_addend;
5993 if (code_off != NULL)
5994 *code_off = val;
5995 if (code_sec != NULL)
5996 {
5997 if (in_code_sec && *code_sec != sec)
5998 return -1;
5999 else
6000 *code_sec = sec;
6001 }
6002 if (sec != NULL && sec->output_section != NULL)
6003 val += sec->output_section->vma + sec->output_offset;
6004 }
6005 break;
6006 }
6007 }
6008
6009 return val;
6010 }
6011
6012 /* If the ELF symbol SYM might be a function in SEC, return the
6013 function size and set *CODE_OFF to the function's entry point,
6014 otherwise return zero. */
6015
6016 static bfd_size_type
6017 ppc64_elf_maybe_function_sym (const asymbol *sym, asection *sec,
6018 bfd_vma *code_off)
6019 {
6020 bfd_size_type size;
6021
6022 if ((sym->flags & (BSF_SECTION_SYM | BSF_FILE | BSF_OBJECT
6023 | BSF_THREAD_LOCAL | BSF_RELC | BSF_SRELC)) != 0)
6024 return 0;
6025
6026 size = 0;
6027 if (!(sym->flags & BSF_SYNTHETIC))
6028 size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
6029
6030 if (strcmp (sym->section->name, ".opd") == 0)
6031 {
6032 if (opd_entry_value (sym->section, sym->value,
6033 &sec, code_off, TRUE) == (bfd_vma) -1)
6034 return 0;
6035 /* An old ABI binary with dot-syms has a size of 24 on the .opd
6036 symbol. This size has nothing to do with the code size of the
6037 function, which is what we're supposed to return, but the
6038 code size isn't available without looking up the dot-sym.
6039 However, doing that would be a waste of time particularly
6040 since elf_find_function will look at the dot-sym anyway.
6041 Now, elf_find_function will keep the largest size of any
6042 function sym found at the code address of interest, so return
6043 1 here to avoid it incorrectly caching a larger function size
6044 for a small function. This does mean we return the wrong
6045 size for a new-ABI function of size 24, but all that does is
6046 disable caching for such functions. */
6047 if (size == 24)
6048 size = 1;
6049 }
6050 else
6051 {
6052 if (sym->section != sec)
6053 return 0;
6054 *code_off = sym->value;
6055 }
6056 if (size == 0)
6057 size = 1;
6058 return size;
6059 }
6060
6061 /* Return true if symbol is defined in a regular object file. */
6062
6063 static bfd_boolean
6064 is_static_defined (struct elf_link_hash_entry *h)
6065 {
6066 return ((h->root.type == bfd_link_hash_defined
6067 || h->root.type == bfd_link_hash_defweak)
6068 && h->root.u.def.section != NULL
6069 && h->root.u.def.section->output_section != NULL);
6070 }
6071
6072 /* If FDH is a function descriptor symbol, return the associated code
6073 entry symbol if it is defined. Return NULL otherwise. */
6074
6075 static struct ppc_link_hash_entry *
6076 defined_code_entry (struct ppc_link_hash_entry *fdh)
6077 {
6078 if (fdh->is_func_descriptor)
6079 {
6080 struct ppc_link_hash_entry *fh = ppc_follow_link (fdh->oh);
6081 if (fh->elf.root.type == bfd_link_hash_defined
6082 || fh->elf.root.type == bfd_link_hash_defweak)
6083 return fh;
6084 }
6085 return NULL;
6086 }
6087
6088 /* If FH is a function code entry symbol, return the associated
6089 function descriptor symbol if it is defined. Return NULL otherwise. */
6090
6091 static struct ppc_link_hash_entry *
6092 defined_func_desc (struct ppc_link_hash_entry *fh)
6093 {
6094 if (fh->oh != NULL
6095 && fh->oh->is_func_descriptor)
6096 {
6097 struct ppc_link_hash_entry *fdh = ppc_follow_link (fh->oh);
6098 if (fdh->elf.root.type == bfd_link_hash_defined
6099 || fdh->elf.root.type == bfd_link_hash_defweak)
6100 return fdh;
6101 }
6102 return NULL;
6103 }
6104
6105 /* Mark all our entry sym sections, both opd and code section. */
6106
6107 static void
6108 ppc64_elf_gc_keep (struct bfd_link_info *info)
6109 {
6110 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6111 struct bfd_sym_chain *sym;
6112
6113 if (htab == NULL)
6114 return;
6115
6116 for (sym = info->gc_sym_list; sym != NULL; sym = sym->next)
6117 {
6118 struct ppc_link_hash_entry *eh, *fh;
6119 asection *sec;
6120
6121 eh = (struct ppc_link_hash_entry *)
6122 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, TRUE);
6123 if (eh == NULL)
6124 continue;
6125 if (eh->elf.root.type != bfd_link_hash_defined
6126 && eh->elf.root.type != bfd_link_hash_defweak)
6127 continue;
6128
6129 fh = defined_code_entry (eh);
6130 if (fh != NULL)
6131 {
6132 sec = fh->elf.root.u.def.section;
6133 sec->flags |= SEC_KEEP;
6134 }
6135 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6136 && opd_entry_value (eh->elf.root.u.def.section,
6137 eh->elf.root.u.def.value,
6138 &sec, NULL, FALSE) != (bfd_vma) -1)
6139 sec->flags |= SEC_KEEP;
6140
6141 sec = eh->elf.root.u.def.section;
6142 sec->flags |= SEC_KEEP;
6143 }
6144 }
6145
6146 /* Mark sections containing dynamically referenced symbols. When
6147 building shared libraries, we must assume that any visible symbol is
6148 referenced. */
6149
6150 static bfd_boolean
6151 ppc64_elf_gc_mark_dynamic_ref (struct elf_link_hash_entry *h, void *inf)
6152 {
6153 struct bfd_link_info *info = (struct bfd_link_info *) inf;
6154 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
6155 struct ppc_link_hash_entry *fdh;
6156
6157 /* Dynamic linking info is on the func descriptor sym. */
6158 fdh = defined_func_desc (eh);
6159 if (fdh != NULL)
6160 eh = fdh;
6161
6162 if ((eh->elf.root.type == bfd_link_hash_defined
6163 || eh->elf.root.type == bfd_link_hash_defweak)
6164 && (eh->elf.ref_dynamic
6165 || (!info->executable
6166 && eh->elf.def_regular
6167 && ELF_ST_VISIBILITY (eh->elf.other) != STV_INTERNAL
6168 && ELF_ST_VISIBILITY (eh->elf.other) != STV_HIDDEN
6169 && (strchr (eh->elf.root.root.string, ELF_VER_CHR) != NULL
6170 || !bfd_hide_sym_by_version (info->version_info,
6171 eh->elf.root.root.string)))))
6172 {
6173 asection *code_sec;
6174 struct ppc_link_hash_entry *fh;
6175
6176 eh->elf.root.u.def.section->flags |= SEC_KEEP;
6177
6178 /* Function descriptor syms cause the associated
6179 function code sym section to be marked. */
6180 fh = defined_code_entry (eh);
6181 if (fh != NULL)
6182 {
6183 code_sec = fh->elf.root.u.def.section;
6184 code_sec->flags |= SEC_KEEP;
6185 }
6186 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6187 && opd_entry_value (eh->elf.root.u.def.section,
6188 eh->elf.root.u.def.value,
6189 &code_sec, NULL, FALSE) != (bfd_vma) -1)
6190 code_sec->flags |= SEC_KEEP;
6191 }
6192
6193 return TRUE;
6194 }
6195
6196 /* Return the section that should be marked against GC for a given
6197 relocation. */
6198
6199 static asection *
6200 ppc64_elf_gc_mark_hook (asection *sec,
6201 struct bfd_link_info *info,
6202 Elf_Internal_Rela *rel,
6203 struct elf_link_hash_entry *h,
6204 Elf_Internal_Sym *sym)
6205 {
6206 asection *rsec;
6207
6208 /* Syms return NULL if we're marking .opd, so we avoid marking all
6209 function sections, as all functions are referenced in .opd. */
6210 rsec = NULL;
6211 if (get_opd_info (sec) != NULL)
6212 return rsec;
6213
6214 if (h != NULL)
6215 {
6216 enum elf_ppc64_reloc_type r_type;
6217 struct ppc_link_hash_entry *eh, *fh, *fdh;
6218
6219 r_type = ELF64_R_TYPE (rel->r_info);
6220 switch (r_type)
6221 {
6222 case R_PPC64_GNU_VTINHERIT:
6223 case R_PPC64_GNU_VTENTRY:
6224 break;
6225
6226 default:
6227 switch (h->root.type)
6228 {
6229 case bfd_link_hash_defined:
6230 case bfd_link_hash_defweak:
6231 eh = (struct ppc_link_hash_entry *) h;
6232 fdh = defined_func_desc (eh);
6233 if (fdh != NULL)
6234 eh = fdh;
6235
6236 /* Function descriptor syms cause the associated
6237 function code sym section to be marked. */
6238 fh = defined_code_entry (eh);
6239 if (fh != NULL)
6240 {
6241 /* They also mark their opd section. */
6242 eh->elf.root.u.def.section->gc_mark = 1;
6243
6244 rsec = fh->elf.root.u.def.section;
6245 }
6246 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
6247 && opd_entry_value (eh->elf.root.u.def.section,
6248 eh->elf.root.u.def.value,
6249 &rsec, NULL, FALSE) != (bfd_vma) -1)
6250 eh->elf.root.u.def.section->gc_mark = 1;
6251 else
6252 rsec = h->root.u.def.section;
6253 break;
6254
6255 case bfd_link_hash_common:
6256 rsec = h->root.u.c.p->section;
6257 break;
6258
6259 default:
6260 return _bfd_elf_gc_mark_hook (sec, info, rel, h, sym);
6261 }
6262 }
6263 }
6264 else
6265 {
6266 struct _opd_sec_data *opd;
6267
6268 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
6269 opd = get_opd_info (rsec);
6270 if (opd != NULL && opd->func_sec != NULL)
6271 {
6272 rsec->gc_mark = 1;
6273
6274 rsec = opd->func_sec[(sym->st_value + rel->r_addend) / 8];
6275 }
6276 }
6277
6278 return rsec;
6279 }
6280
6281 /* Update the .got, .plt. and dynamic reloc reference counts for the
6282 section being removed. */
6283
6284 static bfd_boolean
6285 ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
6286 asection *sec, const Elf_Internal_Rela *relocs)
6287 {
6288 struct ppc_link_hash_table *htab;
6289 Elf_Internal_Shdr *symtab_hdr;
6290 struct elf_link_hash_entry **sym_hashes;
6291 struct got_entry **local_got_ents;
6292 const Elf_Internal_Rela *rel, *relend;
6293
6294 if (info->relocatable)
6295 return TRUE;
6296
6297 if ((sec->flags & SEC_ALLOC) == 0)
6298 return TRUE;
6299
6300 elf_section_data (sec)->local_dynrel = NULL;
6301
6302 htab = ppc_hash_table (info);
6303 if (htab == NULL)
6304 return FALSE;
6305
6306 symtab_hdr = &elf_symtab_hdr (abfd);
6307 sym_hashes = elf_sym_hashes (abfd);
6308 local_got_ents = elf_local_got_ents (abfd);
6309
6310 relend = relocs + sec->reloc_count;
6311 for (rel = relocs; rel < relend; rel++)
6312 {
6313 unsigned long r_symndx;
6314 enum elf_ppc64_reloc_type r_type;
6315 struct elf_link_hash_entry *h = NULL;
6316 unsigned char tls_type = 0;
6317
6318 r_symndx = ELF64_R_SYM (rel->r_info);
6319 r_type = ELF64_R_TYPE (rel->r_info);
6320 if (r_symndx >= symtab_hdr->sh_info)
6321 {
6322 struct ppc_link_hash_entry *eh;
6323 struct elf_dyn_relocs **pp;
6324 struct elf_dyn_relocs *p;
6325
6326 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
6327 h = elf_follow_link (h);
6328 eh = (struct ppc_link_hash_entry *) h;
6329
6330 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
6331 if (p->sec == sec)
6332 {
6333 /* Everything must go for SEC. */
6334 *pp = p->next;
6335 break;
6336 }
6337 }
6338
6339 if (is_branch_reloc (r_type))
6340 {
6341 struct plt_entry **ifunc = NULL;
6342 if (h != NULL)
6343 {
6344 if (h->type == STT_GNU_IFUNC)
6345 ifunc = &h->plt.plist;
6346 }
6347 else if (local_got_ents != NULL)
6348 {
6349 struct plt_entry **local_plt = (struct plt_entry **)
6350 (local_got_ents + symtab_hdr->sh_info);
6351 unsigned char *local_got_tls_masks = (unsigned char *)
6352 (local_plt + symtab_hdr->sh_info);
6353 if ((local_got_tls_masks[r_symndx] & PLT_IFUNC) != 0)
6354 ifunc = local_plt + r_symndx;
6355 }
6356 if (ifunc != NULL)
6357 {
6358 struct plt_entry *ent;
6359
6360 for (ent = *ifunc; ent != NULL; ent = ent->next)
6361 if (ent->addend == rel->r_addend)
6362 break;
6363 if (ent == NULL)
6364 abort ();
6365 if (ent->plt.refcount > 0)
6366 ent->plt.refcount -= 1;
6367 continue;
6368 }
6369 }
6370
6371 switch (r_type)
6372 {
6373 case R_PPC64_GOT_TLSLD16:
6374 case R_PPC64_GOT_TLSLD16_LO:
6375 case R_PPC64_GOT_TLSLD16_HI:
6376 case R_PPC64_GOT_TLSLD16_HA:
6377 tls_type = TLS_TLS | TLS_LD;
6378 goto dogot;
6379
6380 case R_PPC64_GOT_TLSGD16:
6381 case R_PPC64_GOT_TLSGD16_LO:
6382 case R_PPC64_GOT_TLSGD16_HI:
6383 case R_PPC64_GOT_TLSGD16_HA:
6384 tls_type = TLS_TLS | TLS_GD;
6385 goto dogot;
6386
6387 case R_PPC64_GOT_TPREL16_DS:
6388 case R_PPC64_GOT_TPREL16_LO_DS:
6389 case R_PPC64_GOT_TPREL16_HI:
6390 case R_PPC64_GOT_TPREL16_HA:
6391 tls_type = TLS_TLS | TLS_TPREL;
6392 goto dogot;
6393
6394 case R_PPC64_GOT_DTPREL16_DS:
6395 case R_PPC64_GOT_DTPREL16_LO_DS:
6396 case R_PPC64_GOT_DTPREL16_HI:
6397 case R_PPC64_GOT_DTPREL16_HA:
6398 tls_type = TLS_TLS | TLS_DTPREL;
6399 goto dogot;
6400
6401 case R_PPC64_GOT16:
6402 case R_PPC64_GOT16_DS:
6403 case R_PPC64_GOT16_HA:
6404 case R_PPC64_GOT16_HI:
6405 case R_PPC64_GOT16_LO:
6406 case R_PPC64_GOT16_LO_DS:
6407 dogot:
6408 {
6409 struct got_entry *ent;
6410
6411 if (h != NULL)
6412 ent = h->got.glist;
6413 else
6414 ent = local_got_ents[r_symndx];
6415
6416 for (; ent != NULL; ent = ent->next)
6417 if (ent->addend == rel->r_addend
6418 && ent->owner == abfd
6419 && ent->tls_type == tls_type)
6420 break;
6421 if (ent == NULL)
6422 abort ();
6423 if (ent->got.refcount > 0)
6424 ent->got.refcount -= 1;
6425 }
6426 break;
6427
6428 case R_PPC64_PLT16_HA:
6429 case R_PPC64_PLT16_HI:
6430 case R_PPC64_PLT16_LO:
6431 case R_PPC64_PLT32:
6432 case R_PPC64_PLT64:
6433 case R_PPC64_REL14:
6434 case R_PPC64_REL14_BRNTAKEN:
6435 case R_PPC64_REL14_BRTAKEN:
6436 case R_PPC64_REL24:
6437 if (h != NULL)
6438 {
6439 struct plt_entry *ent;
6440
6441 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6442 if (ent->addend == rel->r_addend)
6443 break;
6444 if (ent != NULL && ent->plt.refcount > 0)
6445 ent->plt.refcount -= 1;
6446 }
6447 break;
6448
6449 default:
6450 break;
6451 }
6452 }
6453 return TRUE;
6454 }
6455
6456 /* The maximum size of .sfpr. */
6457 #define SFPR_MAX (218*4)
6458
6459 struct sfpr_def_parms
6460 {
6461 const char name[12];
6462 unsigned char lo, hi;
6463 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
6464 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
6465 };
6466
6467 /* Auto-generate _save*, _rest* functions in .sfpr. */
6468
6469 static bfd_boolean
6470 sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
6471 {
6472 struct ppc_link_hash_table *htab = ppc_hash_table (info);
6473 unsigned int i;
6474 size_t len = strlen (parm->name);
6475 bfd_boolean writing = FALSE;
6476 char sym[16];
6477
6478 if (htab == NULL)
6479 return FALSE;
6480
6481 memcpy (sym, parm->name, len);
6482 sym[len + 2] = 0;
6483
6484 for (i = parm->lo; i <= parm->hi; i++)
6485 {
6486 struct elf_link_hash_entry *h;
6487
6488 sym[len + 0] = i / 10 + '0';
6489 sym[len + 1] = i % 10 + '0';
6490 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
6491 if (h != NULL
6492 && !h->def_regular)
6493 {
6494 h->root.type = bfd_link_hash_defined;
6495 h->root.u.def.section = htab->sfpr;
6496 h->root.u.def.value = htab->sfpr->size;
6497 h->type = STT_FUNC;
6498 h->def_regular = 1;
6499 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
6500 writing = TRUE;
6501 if (htab->sfpr->contents == NULL)
6502 {
6503 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
6504 if (htab->sfpr->contents == NULL)
6505 return FALSE;
6506 }
6507 }
6508 if (writing)
6509 {
6510 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
6511 if (i != parm->hi)
6512 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
6513 else
6514 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
6515 htab->sfpr->size = p - htab->sfpr->contents;
6516 }
6517 }
6518
6519 return TRUE;
6520 }
6521
6522 static bfd_byte *
6523 savegpr0 (bfd *abfd, bfd_byte *p, int r)
6524 {
6525 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6526 return p + 4;
6527 }
6528
6529 static bfd_byte *
6530 savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
6531 {
6532 p = savegpr0 (abfd, p, r);
6533 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6534 p = p + 4;
6535 bfd_put_32 (abfd, BLR, p);
6536 return p + 4;
6537 }
6538
6539 static bfd_byte *
6540 restgpr0 (bfd *abfd, bfd_byte *p, int r)
6541 {
6542 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6543 return p + 4;
6544 }
6545
6546 static bfd_byte *
6547 restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
6548 {
6549 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6550 p = p + 4;
6551 p = restgpr0 (abfd, p, r);
6552 bfd_put_32 (abfd, MTLR_R0, p);
6553 p = p + 4;
6554 if (r == 29)
6555 {
6556 p = restgpr0 (abfd, p, 30);
6557 p = restgpr0 (abfd, p, 31);
6558 }
6559 bfd_put_32 (abfd, BLR, p);
6560 return p + 4;
6561 }
6562
6563 static bfd_byte *
6564 savegpr1 (bfd *abfd, bfd_byte *p, int r)
6565 {
6566 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6567 return p + 4;
6568 }
6569
6570 static bfd_byte *
6571 savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
6572 {
6573 p = savegpr1 (abfd, p, r);
6574 bfd_put_32 (abfd, BLR, p);
6575 return p + 4;
6576 }
6577
6578 static bfd_byte *
6579 restgpr1 (bfd *abfd, bfd_byte *p, int r)
6580 {
6581 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6582 return p + 4;
6583 }
6584
6585 static bfd_byte *
6586 restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
6587 {
6588 p = restgpr1 (abfd, p, r);
6589 bfd_put_32 (abfd, BLR, p);
6590 return p + 4;
6591 }
6592
6593 static bfd_byte *
6594 savefpr (bfd *abfd, bfd_byte *p, int r)
6595 {
6596 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6597 return p + 4;
6598 }
6599
6600 static bfd_byte *
6601 savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
6602 {
6603 p = savefpr (abfd, p, r);
6604 bfd_put_32 (abfd, STD_R0_0R1 + STK_LR, p);
6605 p = p + 4;
6606 bfd_put_32 (abfd, BLR, p);
6607 return p + 4;
6608 }
6609
6610 static bfd_byte *
6611 restfpr (bfd *abfd, bfd_byte *p, int r)
6612 {
6613 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
6614 return p + 4;
6615 }
6616
6617 static bfd_byte *
6618 restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
6619 {
6620 bfd_put_32 (abfd, LD_R0_0R1 + STK_LR, p);
6621 p = p + 4;
6622 p = restfpr (abfd, p, r);
6623 bfd_put_32 (abfd, MTLR_R0, p);
6624 p = p + 4;
6625 if (r == 29)
6626 {
6627 p = restfpr (abfd, p, 30);
6628 p = restfpr (abfd, p, 31);
6629 }
6630 bfd_put_32 (abfd, BLR, p);
6631 return p + 4;
6632 }
6633
6634 static bfd_byte *
6635 savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
6636 {
6637 p = savefpr (abfd, p, r);
6638 bfd_put_32 (abfd, BLR, p);
6639 return p + 4;
6640 }
6641
6642 static bfd_byte *
6643 restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
6644 {
6645 p = restfpr (abfd, p, r);
6646 bfd_put_32 (abfd, BLR, p);
6647 return p + 4;
6648 }
6649
6650 static bfd_byte *
6651 savevr (bfd *abfd, bfd_byte *p, int r)
6652 {
6653 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6654 p = p + 4;
6655 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
6656 return p + 4;
6657 }
6658
6659 static bfd_byte *
6660 savevr_tail (bfd *abfd, bfd_byte *p, int r)
6661 {
6662 p = savevr (abfd, p, r);
6663 bfd_put_32 (abfd, BLR, p);
6664 return p + 4;
6665 }
6666
6667 static bfd_byte *
6668 restvr (bfd *abfd, bfd_byte *p, int r)
6669 {
6670 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
6671 p = p + 4;
6672 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
6673 return p + 4;
6674 }
6675
6676 static bfd_byte *
6677 restvr_tail (bfd *abfd, bfd_byte *p, int r)
6678 {
6679 p = restvr (abfd, p, r);
6680 bfd_put_32 (abfd, BLR, p);
6681 return p + 4;
6682 }
6683
6684 /* Called via elf_link_hash_traverse to transfer dynamic linking
6685 information on function code symbol entries to their corresponding
6686 function descriptor symbol entries. */
6687
6688 static bfd_boolean
6689 func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
6690 {
6691 struct bfd_link_info *info;
6692 struct ppc_link_hash_table *htab;
6693 struct plt_entry *ent;
6694 struct ppc_link_hash_entry *fh;
6695 struct ppc_link_hash_entry *fdh;
6696 bfd_boolean force_local;
6697
6698 fh = (struct ppc_link_hash_entry *) h;
6699 if (fh->elf.root.type == bfd_link_hash_indirect)
6700 return TRUE;
6701
6702 info = inf;
6703 htab = ppc_hash_table (info);
6704 if (htab == NULL)
6705 return FALSE;
6706
6707 /* Resolve undefined references to dot-symbols as the value
6708 in the function descriptor, if we have one in a regular object.
6709 This is to satisfy cases like ".quad .foo". Calls to functions
6710 in dynamic objects are handled elsewhere. */
6711 if (fh->elf.root.type == bfd_link_hash_undefweak
6712 && fh->was_undefined
6713 && (fdh = defined_func_desc (fh)) != NULL
6714 && get_opd_info (fdh->elf.root.u.def.section) != NULL
6715 && opd_entry_value (fdh->elf.root.u.def.section,
6716 fdh->elf.root.u.def.value,
6717 &fh->elf.root.u.def.section,
6718 &fh->elf.root.u.def.value, FALSE) != (bfd_vma) -1)
6719 {
6720 fh->elf.root.type = fdh->elf.root.type;
6721 fh->elf.forced_local = 1;
6722 fh->elf.def_regular = fdh->elf.def_regular;
6723 fh->elf.def_dynamic = fdh->elf.def_dynamic;
6724 }
6725
6726 /* If this is a function code symbol, transfer dynamic linking
6727 information to the function descriptor symbol. */
6728 if (!fh->is_func)
6729 return TRUE;
6730
6731 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
6732 if (ent->plt.refcount > 0)
6733 break;
6734 if (ent == NULL
6735 || fh->elf.root.root.string[0] != '.'
6736 || fh->elf.root.root.string[1] == '\0')
6737 return TRUE;
6738
6739 /* Find the corresponding function descriptor symbol. Create it
6740 as undefined if necessary. */
6741
6742 fdh = lookup_fdh (fh, htab);
6743 if (fdh == NULL
6744 && !info->executable
6745 && (fh->elf.root.type == bfd_link_hash_undefined
6746 || fh->elf.root.type == bfd_link_hash_undefweak))
6747 {
6748 fdh = make_fdh (info, fh);
6749 if (fdh == NULL)
6750 return FALSE;
6751 }
6752
6753 /* Fake function descriptors are made undefweak. If the function
6754 code symbol is strong undefined, make the fake sym the same.
6755 If the function code symbol is defined, then force the fake
6756 descriptor local; We can't support overriding of symbols in a
6757 shared library on a fake descriptor. */
6758
6759 if (fdh != NULL
6760 && fdh->fake
6761 && fdh->elf.root.type == bfd_link_hash_undefweak)
6762 {
6763 if (fh->elf.root.type == bfd_link_hash_undefined)
6764 {
6765 fdh->elf.root.type = bfd_link_hash_undefined;
6766 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
6767 }
6768 else if (fh->elf.root.type == bfd_link_hash_defined
6769 || fh->elf.root.type == bfd_link_hash_defweak)
6770 {
6771 _bfd_elf_link_hash_hide_symbol (info, &fdh->elf, TRUE);
6772 }
6773 }
6774
6775 if (fdh != NULL
6776 && !fdh->elf.forced_local
6777 && (!info->executable
6778 || fdh->elf.def_dynamic
6779 || fdh->elf.ref_dynamic
6780 || (fdh->elf.root.type == bfd_link_hash_undefweak
6781 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
6782 {
6783 if (fdh->elf.dynindx == -1)
6784 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
6785 return FALSE;
6786 fdh->elf.ref_regular |= fh->elf.ref_regular;
6787 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
6788 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
6789 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
6790 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
6791 {
6792 move_plt_plist (fh, fdh);
6793 fdh->elf.needs_plt = 1;
6794 }
6795 fdh->is_func_descriptor = 1;
6796 fdh->oh = fh;
6797 fh->oh = fdh;
6798 }
6799
6800 /* Now that the info is on the function descriptor, clear the
6801 function code sym info. Any function code syms for which we
6802 don't have a definition in a regular file, we force local.
6803 This prevents a shared library from exporting syms that have
6804 been imported from another library. Function code syms that
6805 are really in the library we must leave global to prevent the
6806 linker dragging in a definition from a static library. */
6807 force_local = (!fh->elf.def_regular
6808 || fdh == NULL
6809 || !fdh->elf.def_regular
6810 || fdh->elf.forced_local);
6811 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
6812
6813 return TRUE;
6814 }
6815
6816 /* Called near the start of bfd_elf_size_dynamic_sections. We use
6817 this hook to a) provide some gcc support functions, and b) transfer
6818 dynamic linking information gathered so far on function code symbol
6819 entries, to their corresponding function descriptor symbol entries. */
6820
6821 static bfd_boolean
6822 ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
6823 struct bfd_link_info *info)
6824 {
6825 struct ppc_link_hash_table *htab;
6826 unsigned int i;
6827 static const struct sfpr_def_parms funcs[] =
6828 {
6829 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
6830 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
6831 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
6832 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
6833 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
6834 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
6835 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
6836 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
6837 { "._savef", 14, 31, savefpr, savefpr1_tail },
6838 { "._restf", 14, 31, restfpr, restfpr1_tail },
6839 { "_savevr_", 20, 31, savevr, savevr_tail },
6840 { "_restvr_", 20, 31, restvr, restvr_tail }
6841 };
6842
6843 htab = ppc_hash_table (info);
6844 if (htab == NULL)
6845 return FALSE;
6846
6847 if (!info->relocatable
6848 && htab->elf.hgot != NULL)
6849 {
6850 _bfd_elf_link_hash_hide_symbol (info, htab->elf.hgot, TRUE);
6851 /* Make .TOC. defined so as to prevent it being made dynamic.
6852 The wrong value here is fixed later in ppc64_elf_set_toc. */
6853 htab->elf.hgot->type = STT_OBJECT;
6854 htab->elf.hgot->root.type = bfd_link_hash_defined;
6855 htab->elf.hgot->root.u.def.value = 0;
6856 htab->elf.hgot->root.u.def.section = bfd_abs_section_ptr;
6857 htab->elf.hgot->def_regular = 1;
6858 htab->elf.hgot->other = ((htab->elf.hgot->other & ~ELF_ST_VISIBILITY (-1))
6859 | STV_HIDDEN);
6860 }
6861
6862 if (htab->sfpr == NULL)
6863 /* We don't have any relocs. */
6864 return TRUE;
6865
6866 /* Provide any missing _save* and _rest* functions. */
6867 htab->sfpr->size = 0;
6868 if (!info->relocatable)
6869 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
6870 if (!sfpr_define (info, &funcs[i]))
6871 return FALSE;
6872
6873 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
6874
6875 if (htab->sfpr->size == 0)
6876 htab->sfpr->flags |= SEC_EXCLUDE;
6877
6878 return TRUE;
6879 }
6880
6881 /* Return true if we have dynamic relocs that apply to read-only sections. */
6882
6883 static bfd_boolean
6884 readonly_dynrelocs (struct elf_link_hash_entry *h)
6885 {
6886 struct ppc_link_hash_entry *eh;
6887 struct elf_dyn_relocs *p;
6888
6889 eh = (struct ppc_link_hash_entry *) h;
6890 for (p = eh->dyn_relocs; p != NULL; p = p->next)
6891 {
6892 asection *s = p->sec->output_section;
6893
6894 if (s != NULL && (s->flags & SEC_READONLY) != 0)
6895 return TRUE;
6896 }
6897 return FALSE;
6898 }
6899
6900 /* Adjust a symbol defined by a dynamic object and referenced by a
6901 regular object. The current definition is in some section of the
6902 dynamic object, but we're not including those sections. We have to
6903 change the definition to something the rest of the link can
6904 understand. */
6905
6906 static bfd_boolean
6907 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
6908 struct elf_link_hash_entry *h)
6909 {
6910 struct ppc_link_hash_table *htab;
6911 asection *s;
6912
6913 htab = ppc_hash_table (info);
6914 if (htab == NULL)
6915 return FALSE;
6916
6917 /* Deal with function syms. */
6918 if (h->type == STT_FUNC
6919 || h->type == STT_GNU_IFUNC
6920 || h->needs_plt)
6921 {
6922 /* Clear procedure linkage table information for any symbol that
6923 won't need a .plt entry. */
6924 struct plt_entry *ent;
6925 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
6926 if (ent->plt.refcount > 0)
6927 break;
6928 if (ent == NULL
6929 || (h->type != STT_GNU_IFUNC
6930 && (SYMBOL_CALLS_LOCAL (info, h)
6931 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
6932 && h->root.type == bfd_link_hash_undefweak))))
6933 {
6934 h->plt.plist = NULL;
6935 h->needs_plt = 0;
6936 }
6937 else if (abiversion (info->output_bfd) == 2)
6938 {
6939 /* After adjust_dynamic_symbol, non_got_ref set in the
6940 non-shared case means that we have allocated space in
6941 .dynbss for the symbol and thus dyn_relocs for this
6942 symbol should be discarded.
6943 If we get here we know we are making a PLT entry for this
6944 symbol, and in an executable we'd normally resolve
6945 relocations against this symbol to the PLT entry. Allow
6946 dynamic relocs if the reference is weak, and the dynamic
6947 relocs will not cause text relocation. */
6948 if (!h->ref_regular_nonweak
6949 && h->non_got_ref
6950 && h->type != STT_GNU_IFUNC
6951 && !readonly_dynrelocs (h))
6952 h->non_got_ref = 0;
6953
6954 /* If making a plt entry, then we don't need copy relocs. */
6955 return TRUE;
6956 }
6957 }
6958 else
6959 h->plt.plist = NULL;
6960
6961 /* If this is a weak symbol, and there is a real definition, the
6962 processor independent code will have arranged for us to see the
6963 real definition first, and we can just use the same value. */
6964 if (h->u.weakdef != NULL)
6965 {
6966 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
6967 || h->u.weakdef->root.type == bfd_link_hash_defweak);
6968 h->root.u.def.section = h->u.weakdef->root.u.def.section;
6969 h->root.u.def.value = h->u.weakdef->root.u.def.value;
6970 if (ELIMINATE_COPY_RELOCS)
6971 h->non_got_ref = h->u.weakdef->non_got_ref;
6972 return TRUE;
6973 }
6974
6975 /* If we are creating a shared library, we must presume that the
6976 only references to the symbol are via the global offset table.
6977 For such cases we need not do anything here; the relocations will
6978 be handled correctly by relocate_section. */
6979 if (info->shared)
6980 return TRUE;
6981
6982 /* If there are no references to this symbol that do not use the
6983 GOT, we don't need to generate a copy reloc. */
6984 if (!h->non_got_ref)
6985 return TRUE;
6986
6987 /* Don't generate a copy reloc for symbols defined in the executable. */
6988 if (!h->def_dynamic || !h->ref_regular || h->def_regular)
6989 return TRUE;
6990
6991 /* If we didn't find any dynamic relocs in read-only sections, then
6992 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
6993 if (ELIMINATE_COPY_RELOCS && !readonly_dynrelocs (h))
6994 {
6995 h->non_got_ref = 0;
6996 return TRUE;
6997 }
6998
6999 if (h->plt.plist != NULL)
7000 {
7001 /* We should never get here, but unfortunately there are versions
7002 of gcc out there that improperly (for this ABI) put initialized
7003 function pointers, vtable refs and suchlike in read-only
7004 sections. Allow them to proceed, but warn that this might
7005 break at runtime. */
7006 info->callbacks->einfo
7007 (_("%P: copy reloc against `%T' requires lazy plt linking; "
7008 "avoid setting LD_BIND_NOW=1 or upgrade gcc\n"),
7009 h->root.root.string);
7010 }
7011
7012 /* This is a reference to a symbol defined by a dynamic object which
7013 is not a function. */
7014
7015 /* We must allocate the symbol in our .dynbss section, which will
7016 become part of the .bss section of the executable. There will be
7017 an entry for this symbol in the .dynsym section. The dynamic
7018 object will contain position independent code, so all references
7019 from the dynamic object to this symbol will go through the global
7020 offset table. The dynamic linker will use the .dynsym entry to
7021 determine the address it must put in the global offset table, so
7022 both the dynamic object and the regular object will refer to the
7023 same memory location for the variable. */
7024
7025 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
7026 to copy the initial value out of the dynamic object and into the
7027 runtime process image. We need to remember the offset into the
7028 .rela.bss section we are going to use. */
7029 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0 && h->size != 0)
7030 {
7031 htab->relbss->size += sizeof (Elf64_External_Rela);
7032 h->needs_copy = 1;
7033 }
7034
7035 s = htab->dynbss;
7036
7037 return _bfd_elf_adjust_dynamic_copy (h, s);
7038 }
7039
7040 /* If given a function descriptor symbol, hide both the function code
7041 sym and the descriptor. */
7042 static void
7043 ppc64_elf_hide_symbol (struct bfd_link_info *info,
7044 struct elf_link_hash_entry *h,
7045 bfd_boolean force_local)
7046 {
7047 struct ppc_link_hash_entry *eh;
7048 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
7049
7050 eh = (struct ppc_link_hash_entry *) h;
7051 if (eh->is_func_descriptor)
7052 {
7053 struct ppc_link_hash_entry *fh = eh->oh;
7054
7055 if (fh == NULL)
7056 {
7057 const char *p, *q;
7058 struct ppc_link_hash_table *htab;
7059 char save;
7060
7061 /* We aren't supposed to use alloca in BFD because on
7062 systems which do not have alloca the version in libiberty
7063 calls xmalloc, which might cause the program to crash
7064 when it runs out of memory. This function doesn't have a
7065 return status, so there's no way to gracefully return an
7066 error. So cheat. We know that string[-1] can be safely
7067 accessed; It's either a string in an ELF string table,
7068 or allocated in an objalloc structure. */
7069
7070 p = eh->elf.root.root.string - 1;
7071 save = *p;
7072 *(char *) p = '.';
7073 htab = ppc_hash_table (info);
7074 if (htab == NULL)
7075 return;
7076
7077 fh = (struct ppc_link_hash_entry *)
7078 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7079 *(char *) p = save;
7080
7081 /* Unfortunately, if it so happens that the string we were
7082 looking for was allocated immediately before this string,
7083 then we overwrote the string terminator. That's the only
7084 reason the lookup should fail. */
7085 if (fh == NULL)
7086 {
7087 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
7088 while (q >= eh->elf.root.root.string && *q == *p)
7089 --q, --p;
7090 if (q < eh->elf.root.root.string && *p == '.')
7091 fh = (struct ppc_link_hash_entry *)
7092 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
7093 }
7094 if (fh != NULL)
7095 {
7096 eh->oh = fh;
7097 fh->oh = eh;
7098 }
7099 }
7100 if (fh != NULL)
7101 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
7102 }
7103 }
7104
7105 static bfd_boolean
7106 get_sym_h (struct elf_link_hash_entry **hp,
7107 Elf_Internal_Sym **symp,
7108 asection **symsecp,
7109 unsigned char **tls_maskp,
7110 Elf_Internal_Sym **locsymsp,
7111 unsigned long r_symndx,
7112 bfd *ibfd)
7113 {
7114 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
7115
7116 if (r_symndx >= symtab_hdr->sh_info)
7117 {
7118 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
7119 struct elf_link_hash_entry *h;
7120
7121 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
7122 h = elf_follow_link (h);
7123
7124 if (hp != NULL)
7125 *hp = h;
7126
7127 if (symp != NULL)
7128 *symp = NULL;
7129
7130 if (symsecp != NULL)
7131 {
7132 asection *symsec = NULL;
7133 if (h->root.type == bfd_link_hash_defined
7134 || h->root.type == bfd_link_hash_defweak)
7135 symsec = h->root.u.def.section;
7136 *symsecp = symsec;
7137 }
7138
7139 if (tls_maskp != NULL)
7140 {
7141 struct ppc_link_hash_entry *eh;
7142
7143 eh = (struct ppc_link_hash_entry *) h;
7144 *tls_maskp = &eh->tls_mask;
7145 }
7146 }
7147 else
7148 {
7149 Elf_Internal_Sym *sym;
7150 Elf_Internal_Sym *locsyms = *locsymsp;
7151
7152 if (locsyms == NULL)
7153 {
7154 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
7155 if (locsyms == NULL)
7156 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
7157 symtab_hdr->sh_info,
7158 0, NULL, NULL, NULL);
7159 if (locsyms == NULL)
7160 return FALSE;
7161 *locsymsp = locsyms;
7162 }
7163 sym = locsyms + r_symndx;
7164
7165 if (hp != NULL)
7166 *hp = NULL;
7167
7168 if (symp != NULL)
7169 *symp = sym;
7170
7171 if (symsecp != NULL)
7172 *symsecp = bfd_section_from_elf_index (ibfd, sym->st_shndx);
7173
7174 if (tls_maskp != NULL)
7175 {
7176 struct got_entry **lgot_ents;
7177 unsigned char *tls_mask;
7178
7179 tls_mask = NULL;
7180 lgot_ents = elf_local_got_ents (ibfd);
7181 if (lgot_ents != NULL)
7182 {
7183 struct plt_entry **local_plt = (struct plt_entry **)
7184 (lgot_ents + symtab_hdr->sh_info);
7185 unsigned char *lgot_masks = (unsigned char *)
7186 (local_plt + symtab_hdr->sh_info);
7187 tls_mask = &lgot_masks[r_symndx];
7188 }
7189 *tls_maskp = tls_mask;
7190 }
7191 }
7192 return TRUE;
7193 }
7194
7195 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
7196 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
7197 type suitable for optimization, and 1 otherwise. */
7198
7199 static int
7200 get_tls_mask (unsigned char **tls_maskp,
7201 unsigned long *toc_symndx,
7202 bfd_vma *toc_addend,
7203 Elf_Internal_Sym **locsymsp,
7204 const Elf_Internal_Rela *rel,
7205 bfd *ibfd)
7206 {
7207 unsigned long r_symndx;
7208 int next_r;
7209 struct elf_link_hash_entry *h;
7210 Elf_Internal_Sym *sym;
7211 asection *sec;
7212 bfd_vma off;
7213
7214 r_symndx = ELF64_R_SYM (rel->r_info);
7215 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7216 return 0;
7217
7218 if ((*tls_maskp != NULL && **tls_maskp != 0)
7219 || sec == NULL
7220 || ppc64_elf_section_data (sec) == NULL
7221 || ppc64_elf_section_data (sec)->sec_type != sec_toc)
7222 return 1;
7223
7224 /* Look inside a TOC section too. */
7225 if (h != NULL)
7226 {
7227 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
7228 off = h->root.u.def.value;
7229 }
7230 else
7231 off = sym->st_value;
7232 off += rel->r_addend;
7233 BFD_ASSERT (off % 8 == 0);
7234 r_symndx = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8];
7235 next_r = ppc64_elf_section_data (sec)->u.toc.symndx[off / 8 + 1];
7236 if (toc_symndx != NULL)
7237 *toc_symndx = r_symndx;
7238 if (toc_addend != NULL)
7239 *toc_addend = ppc64_elf_section_data (sec)->u.toc.add[off / 8];
7240 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
7241 return 0;
7242 if ((h == NULL || is_static_defined (h))
7243 && (next_r == -1 || next_r == -2))
7244 return 1 - next_r;
7245 return 1;
7246 }
7247
7248 /* Find (or create) an entry in the tocsave hash table. */
7249
7250 static struct tocsave_entry *
7251 tocsave_find (struct ppc_link_hash_table *htab,
7252 enum insert_option insert,
7253 Elf_Internal_Sym **local_syms,
7254 const Elf_Internal_Rela *irela,
7255 bfd *ibfd)
7256 {
7257 unsigned long r_indx;
7258 struct elf_link_hash_entry *h;
7259 Elf_Internal_Sym *sym;
7260 struct tocsave_entry ent, *p;
7261 hashval_t hash;
7262 struct tocsave_entry **slot;
7263
7264 r_indx = ELF64_R_SYM (irela->r_info);
7265 if (!get_sym_h (&h, &sym, &ent.sec, NULL, local_syms, r_indx, ibfd))
7266 return NULL;
7267 if (ent.sec == NULL || ent.sec->output_section == NULL)
7268 {
7269 (*_bfd_error_handler)
7270 (_("%B: undefined symbol on R_PPC64_TOCSAVE relocation"));
7271 return NULL;
7272 }
7273
7274 if (h != NULL)
7275 ent.offset = h->root.u.def.value;
7276 else
7277 ent.offset = sym->st_value;
7278 ent.offset += irela->r_addend;
7279
7280 hash = tocsave_htab_hash (&ent);
7281 slot = ((struct tocsave_entry **)
7282 htab_find_slot_with_hash (htab->tocsave_htab, &ent, hash, insert));
7283 if (slot == NULL)
7284 return NULL;
7285
7286 if (*slot == NULL)
7287 {
7288 p = (struct tocsave_entry *) bfd_alloc (ibfd, sizeof (*p));
7289 if (p == NULL)
7290 return NULL;
7291 *p = ent;
7292 *slot = p;
7293 }
7294 return *slot;
7295 }
7296
7297 /* Adjust all global syms defined in opd sections. In gcc generated
7298 code for the old ABI, these will already have been done. */
7299
7300 static bfd_boolean
7301 adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
7302 {
7303 struct ppc_link_hash_entry *eh;
7304 asection *sym_sec;
7305 struct _opd_sec_data *opd;
7306
7307 if (h->root.type == bfd_link_hash_indirect)
7308 return TRUE;
7309
7310 if (h->root.type != bfd_link_hash_defined
7311 && h->root.type != bfd_link_hash_defweak)
7312 return TRUE;
7313
7314 eh = (struct ppc_link_hash_entry *) h;
7315 if (eh->adjust_done)
7316 return TRUE;
7317
7318 sym_sec = eh->elf.root.u.def.section;
7319 opd = get_opd_info (sym_sec);
7320 if (opd != NULL && opd->adjust != NULL)
7321 {
7322 long adjust = opd->adjust[eh->elf.root.u.def.value / 8];
7323 if (adjust == -1)
7324 {
7325 /* This entry has been deleted. */
7326 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
7327 if (dsec == NULL)
7328 {
7329 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
7330 if (discarded_section (dsec))
7331 {
7332 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
7333 break;
7334 }
7335 }
7336 eh->elf.root.u.def.value = 0;
7337 eh->elf.root.u.def.section = dsec;
7338 }
7339 else
7340 eh->elf.root.u.def.value += adjust;
7341 eh->adjust_done = 1;
7342 }
7343 return TRUE;
7344 }
7345
7346 /* Handles decrementing dynamic reloc counts for the reloc specified by
7347 R_INFO in section SEC. If LOCAL_SYMS is NULL, then H and SYM
7348 have already been determined. */
7349
7350 static bfd_boolean
7351 dec_dynrel_count (bfd_vma r_info,
7352 asection *sec,
7353 struct bfd_link_info *info,
7354 Elf_Internal_Sym **local_syms,
7355 struct elf_link_hash_entry *h,
7356 Elf_Internal_Sym *sym)
7357 {
7358 enum elf_ppc64_reloc_type r_type;
7359 asection *sym_sec = NULL;
7360
7361 /* Can this reloc be dynamic? This switch, and later tests here
7362 should be kept in sync with the code in check_relocs. */
7363 r_type = ELF64_R_TYPE (r_info);
7364 switch (r_type)
7365 {
7366 default:
7367 return TRUE;
7368
7369 case R_PPC64_TPREL16:
7370 case R_PPC64_TPREL16_LO:
7371 case R_PPC64_TPREL16_HI:
7372 case R_PPC64_TPREL16_HA:
7373 case R_PPC64_TPREL16_DS:
7374 case R_PPC64_TPREL16_LO_DS:
7375 case R_PPC64_TPREL16_HIGH:
7376 case R_PPC64_TPREL16_HIGHA:
7377 case R_PPC64_TPREL16_HIGHER:
7378 case R_PPC64_TPREL16_HIGHERA:
7379 case R_PPC64_TPREL16_HIGHEST:
7380 case R_PPC64_TPREL16_HIGHESTA:
7381 if (!info->shared)
7382 return TRUE;
7383
7384 case R_PPC64_TPREL64:
7385 case R_PPC64_DTPMOD64:
7386 case R_PPC64_DTPREL64:
7387 case R_PPC64_ADDR64:
7388 case R_PPC64_REL30:
7389 case R_PPC64_REL32:
7390 case R_PPC64_REL64:
7391 case R_PPC64_ADDR14:
7392 case R_PPC64_ADDR14_BRNTAKEN:
7393 case R_PPC64_ADDR14_BRTAKEN:
7394 case R_PPC64_ADDR16:
7395 case R_PPC64_ADDR16_DS:
7396 case R_PPC64_ADDR16_HA:
7397 case R_PPC64_ADDR16_HI:
7398 case R_PPC64_ADDR16_HIGH:
7399 case R_PPC64_ADDR16_HIGHA:
7400 case R_PPC64_ADDR16_HIGHER:
7401 case R_PPC64_ADDR16_HIGHERA:
7402 case R_PPC64_ADDR16_HIGHEST:
7403 case R_PPC64_ADDR16_HIGHESTA:
7404 case R_PPC64_ADDR16_LO:
7405 case R_PPC64_ADDR16_LO_DS:
7406 case R_PPC64_ADDR24:
7407 case R_PPC64_ADDR32:
7408 case R_PPC64_UADDR16:
7409 case R_PPC64_UADDR32:
7410 case R_PPC64_UADDR64:
7411 case R_PPC64_TOC:
7412 break;
7413 }
7414
7415 if (local_syms != NULL)
7416 {
7417 unsigned long r_symndx;
7418 bfd *ibfd = sec->owner;
7419
7420 r_symndx = ELF64_R_SYM (r_info);
7421 if (!get_sym_h (&h, &sym, &sym_sec, NULL, local_syms, r_symndx, ibfd))
7422 return FALSE;
7423 }
7424
7425 if ((info->shared
7426 && (must_be_dyn_reloc (info, r_type)
7427 || (h != NULL
7428 && (!SYMBOLIC_BIND (info, h)
7429 || h->root.type == bfd_link_hash_defweak
7430 || !h->def_regular))))
7431 || (ELIMINATE_COPY_RELOCS
7432 && !info->shared
7433 && h != NULL
7434 && (h->root.type == bfd_link_hash_defweak
7435 || !h->def_regular)))
7436 ;
7437 else
7438 return TRUE;
7439
7440 if (h != NULL)
7441 {
7442 struct elf_dyn_relocs *p;
7443 struct elf_dyn_relocs **pp;
7444 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
7445
7446 /* elf_gc_sweep may have already removed all dyn relocs associated
7447 with local syms for a given section. Also, symbol flags are
7448 changed by elf_gc_sweep_symbol, confusing the test above. Don't
7449 report a dynreloc miscount. */
7450 if (*pp == NULL && info->gc_sections)
7451 return TRUE;
7452
7453 while ((p = *pp) != NULL)
7454 {
7455 if (p->sec == sec)
7456 {
7457 if (!must_be_dyn_reloc (info, r_type))
7458 p->pc_count -= 1;
7459 p->count -= 1;
7460 if (p->count == 0)
7461 *pp = p->next;
7462 return TRUE;
7463 }
7464 pp = &p->next;
7465 }
7466 }
7467 else
7468 {
7469 struct ppc_dyn_relocs *p;
7470 struct ppc_dyn_relocs **pp;
7471 void *vpp;
7472 bfd_boolean is_ifunc;
7473
7474 if (local_syms == NULL)
7475 sym_sec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
7476 if (sym_sec == NULL)
7477 sym_sec = sec;
7478
7479 vpp = &elf_section_data (sym_sec)->local_dynrel;
7480 pp = (struct ppc_dyn_relocs **) vpp;
7481
7482 if (*pp == NULL && info->gc_sections)
7483 return TRUE;
7484
7485 is_ifunc = ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC;
7486 while ((p = *pp) != NULL)
7487 {
7488 if (p->sec == sec && p->ifunc == is_ifunc)
7489 {
7490 p->count -= 1;
7491 if (p->count == 0)
7492 *pp = p->next;
7493 return TRUE;
7494 }
7495 pp = &p->next;
7496 }
7497 }
7498
7499 info->callbacks->einfo (_("%P: dynreloc miscount for %B, section %A\n"),
7500 sec->owner, sec);
7501 bfd_set_error (bfd_error_bad_value);
7502 return FALSE;
7503 }
7504
7505 /* Remove unused Official Procedure Descriptor entries. Currently we
7506 only remove those associated with functions in discarded link-once
7507 sections, or weakly defined functions that have been overridden. It
7508 would be possible to remove many more entries for statically linked
7509 applications. */
7510
7511 bfd_boolean
7512 ppc64_elf_edit_opd (struct bfd_link_info *info, bfd_boolean non_overlapping)
7513 {
7514 bfd *ibfd;
7515 bfd_boolean some_edited = FALSE;
7516 asection *need_pad = NULL;
7517
7518 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7519 {
7520 asection *sec;
7521 Elf_Internal_Rela *relstart, *rel, *relend;
7522 Elf_Internal_Shdr *symtab_hdr;
7523 Elf_Internal_Sym *local_syms;
7524 bfd_vma offset;
7525 struct _opd_sec_data *opd;
7526 bfd_boolean need_edit, add_aux_fields;
7527 bfd_size_type cnt_16b = 0;
7528
7529 if (!is_ppc64_elf (ibfd))
7530 continue;
7531
7532 sec = bfd_get_section_by_name (ibfd, ".opd");
7533 if (sec == NULL || sec->size == 0)
7534 continue;
7535
7536 if (sec->sec_info_type == SEC_INFO_TYPE_JUST_SYMS)
7537 continue;
7538
7539 if (sec->output_section == bfd_abs_section_ptr)
7540 continue;
7541
7542 /* Look through the section relocs. */
7543 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
7544 continue;
7545
7546 local_syms = NULL;
7547 symtab_hdr = &elf_symtab_hdr (ibfd);
7548
7549 /* Read the relocations. */
7550 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7551 info->keep_memory);
7552 if (relstart == NULL)
7553 return FALSE;
7554
7555 /* First run through the relocs to check they are sane, and to
7556 determine whether we need to edit this opd section. */
7557 need_edit = FALSE;
7558 need_pad = sec;
7559 offset = 0;
7560 relend = relstart + sec->reloc_count;
7561 for (rel = relstart; rel < relend; )
7562 {
7563 enum elf_ppc64_reloc_type r_type;
7564 unsigned long r_symndx;
7565 asection *sym_sec;
7566 struct elf_link_hash_entry *h;
7567 Elf_Internal_Sym *sym;
7568
7569 /* .opd contains a regular array of 16 or 24 byte entries. We're
7570 only interested in the reloc pointing to a function entry
7571 point. */
7572 if (rel->r_offset != offset
7573 || rel + 1 >= relend
7574 || (rel + 1)->r_offset != offset + 8)
7575 {
7576 /* If someone messes with .opd alignment then after a
7577 "ld -r" we might have padding in the middle of .opd.
7578 Also, there's nothing to prevent someone putting
7579 something silly in .opd with the assembler. No .opd
7580 optimization for them! */
7581 broken_opd:
7582 (*_bfd_error_handler)
7583 (_("%B: .opd is not a regular array of opd entries"), ibfd);
7584 need_edit = FALSE;
7585 break;
7586 }
7587
7588 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
7589 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
7590 {
7591 (*_bfd_error_handler)
7592 (_("%B: unexpected reloc type %u in .opd section"),
7593 ibfd, r_type);
7594 need_edit = FALSE;
7595 break;
7596 }
7597
7598 r_symndx = ELF64_R_SYM (rel->r_info);
7599 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7600 r_symndx, ibfd))
7601 goto error_ret;
7602
7603 if (sym_sec == NULL || sym_sec->owner == NULL)
7604 {
7605 const char *sym_name;
7606 if (h != NULL)
7607 sym_name = h->root.root.string;
7608 else
7609 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym,
7610 sym_sec);
7611
7612 (*_bfd_error_handler)
7613 (_("%B: undefined sym `%s' in .opd section"),
7614 ibfd, sym_name);
7615 need_edit = FALSE;
7616 break;
7617 }
7618
7619 /* opd entries are always for functions defined in the
7620 current input bfd. If the symbol isn't defined in the
7621 input bfd, then we won't be using the function in this
7622 bfd; It must be defined in a linkonce section in another
7623 bfd, or is weak. It's also possible that we are
7624 discarding the function due to a linker script /DISCARD/,
7625 which we test for via the output_section. */
7626 if (sym_sec->owner != ibfd
7627 || sym_sec->output_section == bfd_abs_section_ptr)
7628 need_edit = TRUE;
7629
7630 rel += 2;
7631 if (rel == relend
7632 || (rel + 1 == relend && rel->r_offset == offset + 16))
7633 {
7634 if (sec->size == offset + 24)
7635 {
7636 need_pad = NULL;
7637 break;
7638 }
7639 if (rel == relend && sec->size == offset + 16)
7640 {
7641 cnt_16b++;
7642 break;
7643 }
7644 goto broken_opd;
7645 }
7646
7647 if (rel->r_offset == offset + 24)
7648 offset += 24;
7649 else if (rel->r_offset != offset + 16)
7650 goto broken_opd;
7651 else if (rel + 1 < relend
7652 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
7653 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
7654 {
7655 offset += 16;
7656 cnt_16b++;
7657 }
7658 else if (rel + 2 < relend
7659 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
7660 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
7661 {
7662 offset += 24;
7663 rel += 1;
7664 }
7665 else
7666 goto broken_opd;
7667 }
7668
7669 add_aux_fields = non_overlapping && cnt_16b > 0;
7670
7671 if (need_edit || add_aux_fields)
7672 {
7673 Elf_Internal_Rela *write_rel;
7674 Elf_Internal_Shdr *rel_hdr;
7675 bfd_byte *rptr, *wptr;
7676 bfd_byte *new_contents;
7677 bfd_boolean skip;
7678 long opd_ent_size;
7679 bfd_size_type amt;
7680
7681 new_contents = NULL;
7682 amt = sec->size * sizeof (long) / 8;
7683 opd = &ppc64_elf_section_data (sec)->u.opd;
7684 opd->adjust = bfd_zalloc (sec->owner, amt);
7685 if (opd->adjust == NULL)
7686 return FALSE;
7687 ppc64_elf_section_data (sec)->sec_type = sec_opd;
7688
7689 /* This seems a waste of time as input .opd sections are all
7690 zeros as generated by gcc, but I suppose there's no reason
7691 this will always be so. We might start putting something in
7692 the third word of .opd entries. */
7693 if ((sec->flags & SEC_IN_MEMORY) == 0)
7694 {
7695 bfd_byte *loc;
7696 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
7697 {
7698 if (loc != NULL)
7699 free (loc);
7700 error_ret:
7701 if (local_syms != NULL
7702 && symtab_hdr->contents != (unsigned char *) local_syms)
7703 free (local_syms);
7704 if (elf_section_data (sec)->relocs != relstart)
7705 free (relstart);
7706 return FALSE;
7707 }
7708 sec->contents = loc;
7709 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7710 }
7711
7712 elf_section_data (sec)->relocs = relstart;
7713
7714 new_contents = sec->contents;
7715 if (add_aux_fields)
7716 {
7717 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
7718 if (new_contents == NULL)
7719 return FALSE;
7720 need_pad = FALSE;
7721 }
7722 wptr = new_contents;
7723 rptr = sec->contents;
7724
7725 write_rel = relstart;
7726 skip = FALSE;
7727 offset = 0;
7728 opd_ent_size = 0;
7729 for (rel = relstart; rel < relend; rel++)
7730 {
7731 unsigned long r_symndx;
7732 asection *sym_sec;
7733 struct elf_link_hash_entry *h;
7734 Elf_Internal_Sym *sym;
7735
7736 r_symndx = ELF64_R_SYM (rel->r_info);
7737 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7738 r_symndx, ibfd))
7739 goto error_ret;
7740
7741 if (rel->r_offset == offset)
7742 {
7743 struct ppc_link_hash_entry *fdh = NULL;
7744
7745 /* See if the .opd entry is full 24 byte or
7746 16 byte (with fd_aux entry overlapped with next
7747 fd_func). */
7748 opd_ent_size = 24;
7749 if ((rel + 2 == relend && sec->size == offset + 16)
7750 || (rel + 3 < relend
7751 && rel[2].r_offset == offset + 16
7752 && rel[3].r_offset == offset + 24
7753 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
7754 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
7755 opd_ent_size = 16;
7756
7757 if (h != NULL
7758 && h->root.root.string[0] == '.')
7759 {
7760 struct ppc_link_hash_table *htab;
7761
7762 htab = ppc_hash_table (info);
7763 if (htab != NULL)
7764 fdh = lookup_fdh ((struct ppc_link_hash_entry *) h,
7765 htab);
7766 if (fdh != NULL
7767 && fdh->elf.root.type != bfd_link_hash_defined
7768 && fdh->elf.root.type != bfd_link_hash_defweak)
7769 fdh = NULL;
7770 }
7771
7772 skip = (sym_sec->owner != ibfd
7773 || sym_sec->output_section == bfd_abs_section_ptr);
7774 if (skip)
7775 {
7776 if (fdh != NULL && sym_sec->owner == ibfd)
7777 {
7778 /* Arrange for the function descriptor sym
7779 to be dropped. */
7780 fdh->elf.root.u.def.value = 0;
7781 fdh->elf.root.u.def.section = sym_sec;
7782 }
7783 opd->adjust[rel->r_offset / 8] = -1;
7784 }
7785 else
7786 {
7787 /* We'll be keeping this opd entry. */
7788
7789 if (fdh != NULL)
7790 {
7791 /* Redefine the function descriptor symbol to
7792 this location in the opd section. It is
7793 necessary to update the value here rather
7794 than using an array of adjustments as we do
7795 for local symbols, because various places
7796 in the generic ELF code use the value
7797 stored in u.def.value. */
7798 fdh->elf.root.u.def.value = wptr - new_contents;
7799 fdh->adjust_done = 1;
7800 }
7801
7802 /* Local syms are a bit tricky. We could
7803 tweak them as they can be cached, but
7804 we'd need to look through the local syms
7805 for the function descriptor sym which we
7806 don't have at the moment. So keep an
7807 array of adjustments. */
7808 opd->adjust[rel->r_offset / 8]
7809 = (wptr - new_contents) - (rptr - sec->contents);
7810
7811 if (wptr != rptr)
7812 memcpy (wptr, rptr, opd_ent_size);
7813 wptr += opd_ent_size;
7814 if (add_aux_fields && opd_ent_size == 16)
7815 {
7816 memset (wptr, '\0', 8);
7817 wptr += 8;
7818 }
7819 }
7820 rptr += opd_ent_size;
7821 offset += opd_ent_size;
7822 }
7823
7824 if (skip)
7825 {
7826 if (!NO_OPD_RELOCS
7827 && !info->relocatable
7828 && !dec_dynrel_count (rel->r_info, sec, info,
7829 NULL, h, sym))
7830 goto error_ret;
7831 }
7832 else
7833 {
7834 /* We need to adjust any reloc offsets to point to the
7835 new opd entries. While we're at it, we may as well
7836 remove redundant relocs. */
7837 rel->r_offset += opd->adjust[(offset - opd_ent_size) / 8];
7838 if (write_rel != rel)
7839 memcpy (write_rel, rel, sizeof (*rel));
7840 ++write_rel;
7841 }
7842 }
7843
7844 sec->size = wptr - new_contents;
7845 sec->reloc_count = write_rel - relstart;
7846 if (add_aux_fields)
7847 {
7848 free (sec->contents);
7849 sec->contents = new_contents;
7850 }
7851
7852 /* Fudge the header size too, as this is used later in
7853 elf_bfd_final_link if we are emitting relocs. */
7854 rel_hdr = _bfd_elf_single_rel_hdr (sec);
7855 rel_hdr->sh_size = sec->reloc_count * rel_hdr->sh_entsize;
7856 some_edited = TRUE;
7857 }
7858 else if (elf_section_data (sec)->relocs != relstart)
7859 free (relstart);
7860
7861 if (local_syms != NULL
7862 && symtab_hdr->contents != (unsigned char *) local_syms)
7863 {
7864 if (!info->keep_memory)
7865 free (local_syms);
7866 else
7867 symtab_hdr->contents = (unsigned char *) local_syms;
7868 }
7869 }
7870
7871 if (some_edited)
7872 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
7873
7874 /* If we are doing a final link and the last .opd entry is just 16 byte
7875 long, add a 8 byte padding after it. */
7876 if (need_pad != NULL && !info->relocatable)
7877 {
7878 bfd_byte *p;
7879
7880 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
7881 {
7882 BFD_ASSERT (need_pad->size > 0);
7883
7884 p = bfd_malloc (need_pad->size + 8);
7885 if (p == NULL)
7886 return FALSE;
7887
7888 if (! bfd_get_section_contents (need_pad->owner, need_pad,
7889 p, 0, need_pad->size))
7890 return FALSE;
7891
7892 need_pad->contents = p;
7893 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
7894 }
7895 else
7896 {
7897 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
7898 if (p == NULL)
7899 return FALSE;
7900
7901 need_pad->contents = p;
7902 }
7903
7904 memset (need_pad->contents + need_pad->size, 0, 8);
7905 need_pad->size += 8;
7906 }
7907
7908 return TRUE;
7909 }
7910
7911 /* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
7912
7913 asection *
7914 ppc64_elf_tls_setup (struct bfd_link_info *info,
7915 int no_tls_get_addr_opt,
7916 int *no_multi_toc)
7917 {
7918 struct ppc_link_hash_table *htab;
7919
7920 htab = ppc_hash_table (info);
7921 if (htab == NULL)
7922 return NULL;
7923
7924 if (abiversion (info->output_bfd) == 1)
7925 htab->opd_abi = 1;
7926
7927 if (*no_multi_toc)
7928 htab->do_multi_toc = 0;
7929 else if (!htab->do_multi_toc)
7930 *no_multi_toc = 1;
7931
7932 htab->tls_get_addr = ((struct ppc_link_hash_entry *)
7933 elf_link_hash_lookup (&htab->elf, ".__tls_get_addr",
7934 FALSE, FALSE, TRUE));
7935 /* Move dynamic linking info to the function descriptor sym. */
7936 if (htab->tls_get_addr != NULL)
7937 func_desc_adjust (&htab->tls_get_addr->elf, info);
7938 htab->tls_get_addr_fd = ((struct ppc_link_hash_entry *)
7939 elf_link_hash_lookup (&htab->elf, "__tls_get_addr",
7940 FALSE, FALSE, TRUE));
7941 if (!no_tls_get_addr_opt)
7942 {
7943 struct elf_link_hash_entry *opt, *opt_fd, *tga, *tga_fd;
7944
7945 opt = elf_link_hash_lookup (&htab->elf, ".__tls_get_addr_opt",
7946 FALSE, FALSE, TRUE);
7947 if (opt != NULL)
7948 func_desc_adjust (opt, info);
7949 opt_fd = elf_link_hash_lookup (&htab->elf, "__tls_get_addr_opt",
7950 FALSE, FALSE, TRUE);
7951 if (opt_fd != NULL
7952 && (opt_fd->root.type == bfd_link_hash_defined
7953 || opt_fd->root.type == bfd_link_hash_defweak))
7954 {
7955 /* If glibc supports an optimized __tls_get_addr call stub,
7956 signalled by the presence of __tls_get_addr_opt, and we'll
7957 be calling __tls_get_addr via a plt call stub, then
7958 make __tls_get_addr point to __tls_get_addr_opt. */
7959 tga_fd = &htab->tls_get_addr_fd->elf;
7960 if (htab->elf.dynamic_sections_created
7961 && tga_fd != NULL
7962 && (tga_fd->type == STT_FUNC
7963 || tga_fd->needs_plt)
7964 && !(SYMBOL_CALLS_LOCAL (info, tga_fd)
7965 || (ELF_ST_VISIBILITY (tga_fd->other) != STV_DEFAULT
7966 && tga_fd->root.type == bfd_link_hash_undefweak)))
7967 {
7968 struct plt_entry *ent;
7969
7970 for (ent = tga_fd->plt.plist; ent != NULL; ent = ent->next)
7971 if (ent->plt.refcount > 0)
7972 break;
7973 if (ent != NULL)
7974 {
7975 tga_fd->root.type = bfd_link_hash_indirect;
7976 tga_fd->root.u.i.link = &opt_fd->root;
7977 ppc64_elf_copy_indirect_symbol (info, opt_fd, tga_fd);
7978 if (opt_fd->dynindx != -1)
7979 {
7980 /* Use __tls_get_addr_opt in dynamic relocations. */
7981 opt_fd->dynindx = -1;
7982 _bfd_elf_strtab_delref (elf_hash_table (info)->dynstr,
7983 opt_fd->dynstr_index);
7984 if (!bfd_elf_link_record_dynamic_symbol (info, opt_fd))
7985 return NULL;
7986 }
7987 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) opt_fd;
7988 tga = &htab->tls_get_addr->elf;
7989 if (opt != NULL && tga != NULL)
7990 {
7991 tga->root.type = bfd_link_hash_indirect;
7992 tga->root.u.i.link = &opt->root;
7993 ppc64_elf_copy_indirect_symbol (info, opt, tga);
7994 _bfd_elf_link_hash_hide_symbol (info, opt,
7995 tga->forced_local);
7996 htab->tls_get_addr = (struct ppc_link_hash_entry *) opt;
7997 }
7998 htab->tls_get_addr_fd->oh = htab->tls_get_addr;
7999 htab->tls_get_addr_fd->is_func_descriptor = 1;
8000 if (htab->tls_get_addr != NULL)
8001 {
8002 htab->tls_get_addr->oh = htab->tls_get_addr_fd;
8003 htab->tls_get_addr->is_func = 1;
8004 }
8005 }
8006 }
8007 }
8008 else
8009 no_tls_get_addr_opt = TRUE;
8010 }
8011 htab->no_tls_get_addr_opt = no_tls_get_addr_opt;
8012 return _bfd_elf_tls_setup (info->output_bfd, info);
8013 }
8014
8015 /* Return TRUE iff REL is a branch reloc with a global symbol matching
8016 HASH1 or HASH2. */
8017
8018 static bfd_boolean
8019 branch_reloc_hash_match (const bfd *ibfd,
8020 const Elf_Internal_Rela *rel,
8021 const struct ppc_link_hash_entry *hash1,
8022 const struct ppc_link_hash_entry *hash2)
8023 {
8024 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (ibfd);
8025 enum elf_ppc64_reloc_type r_type = ELF64_R_TYPE (rel->r_info);
8026 unsigned int r_symndx = ELF64_R_SYM (rel->r_info);
8027
8028 if (r_symndx >= symtab_hdr->sh_info && is_branch_reloc (r_type))
8029 {
8030 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
8031 struct elf_link_hash_entry *h;
8032
8033 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
8034 h = elf_follow_link (h);
8035 if (h == &hash1->elf || h == &hash2->elf)
8036 return TRUE;
8037 }
8038 return FALSE;
8039 }
8040
8041 /* Run through all the TLS relocs looking for optimization
8042 opportunities. The linker has been hacked (see ppc64elf.em) to do
8043 a preliminary section layout so that we know the TLS segment
8044 offsets. We can't optimize earlier because some optimizations need
8045 to know the tp offset, and we need to optimize before allocating
8046 dynamic relocations. */
8047
8048 bfd_boolean
8049 ppc64_elf_tls_optimize (struct bfd_link_info *info)
8050 {
8051 bfd *ibfd;
8052 asection *sec;
8053 struct ppc_link_hash_table *htab;
8054 unsigned char *toc_ref;
8055 int pass;
8056
8057 if (info->relocatable || !info->executable)
8058 return TRUE;
8059
8060 htab = ppc_hash_table (info);
8061 if (htab == NULL)
8062 return FALSE;
8063
8064 /* Make two passes over the relocs. On the first pass, mark toc
8065 entries involved with tls relocs, and check that tls relocs
8066 involved in setting up a tls_get_addr call are indeed followed by
8067 such a call. If they are not, we can't do any tls optimization.
8068 On the second pass twiddle tls_mask flags to notify
8069 relocate_section that optimization can be done, and adjust got
8070 and plt refcounts. */
8071 toc_ref = NULL;
8072 for (pass = 0; pass < 2; ++pass)
8073 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8074 {
8075 Elf_Internal_Sym *locsyms = NULL;
8076 asection *toc = bfd_get_section_by_name (ibfd, ".toc");
8077
8078 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8079 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
8080 {
8081 Elf_Internal_Rela *relstart, *rel, *relend;
8082 bfd_boolean found_tls_get_addr_arg = 0;
8083
8084 /* Read the relocations. */
8085 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8086 info->keep_memory);
8087 if (relstart == NULL)
8088 {
8089 free (toc_ref);
8090 return FALSE;
8091 }
8092
8093 relend = relstart + sec->reloc_count;
8094 for (rel = relstart; rel < relend; rel++)
8095 {
8096 enum elf_ppc64_reloc_type r_type;
8097 unsigned long r_symndx;
8098 struct elf_link_hash_entry *h;
8099 Elf_Internal_Sym *sym;
8100 asection *sym_sec;
8101 unsigned char *tls_mask;
8102 unsigned char tls_set, tls_clear, tls_type = 0;
8103 bfd_vma value;
8104 bfd_boolean ok_tprel, is_local;
8105 long toc_ref_index = 0;
8106 int expecting_tls_get_addr = 0;
8107 bfd_boolean ret = FALSE;
8108
8109 r_symndx = ELF64_R_SYM (rel->r_info);
8110 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
8111 r_symndx, ibfd))
8112 {
8113 err_free_rel:
8114 if (elf_section_data (sec)->relocs != relstart)
8115 free (relstart);
8116 if (toc_ref != NULL)
8117 free (toc_ref);
8118 if (locsyms != NULL
8119 && (elf_symtab_hdr (ibfd).contents
8120 != (unsigned char *) locsyms))
8121 free (locsyms);
8122 return ret;
8123 }
8124
8125 if (h != NULL)
8126 {
8127 if (h->root.type == bfd_link_hash_defined
8128 || h->root.type == bfd_link_hash_defweak)
8129 value = h->root.u.def.value;
8130 else if (h->root.type == bfd_link_hash_undefweak)
8131 value = 0;
8132 else
8133 {
8134 found_tls_get_addr_arg = 0;
8135 continue;
8136 }
8137 }
8138 else
8139 /* Symbols referenced by TLS relocs must be of type
8140 STT_TLS. So no need for .opd local sym adjust. */
8141 value = sym->st_value;
8142
8143 ok_tprel = FALSE;
8144 is_local = FALSE;
8145 if (h == NULL
8146 || !h->def_dynamic)
8147 {
8148 is_local = TRUE;
8149 if (h != NULL
8150 && h->root.type == bfd_link_hash_undefweak)
8151 ok_tprel = TRUE;
8152 else
8153 {
8154 value += sym_sec->output_offset;
8155 value += sym_sec->output_section->vma;
8156 value -= htab->elf.tls_sec->vma;
8157 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
8158 < (bfd_vma) 1 << 32);
8159 }
8160 }
8161
8162 r_type = ELF64_R_TYPE (rel->r_info);
8163 /* If this section has old-style __tls_get_addr calls
8164 without marker relocs, then check that each
8165 __tls_get_addr call reloc is preceded by a reloc
8166 that conceivably belongs to the __tls_get_addr arg
8167 setup insn. If we don't find matching arg setup
8168 relocs, don't do any tls optimization. */
8169 if (pass == 0
8170 && sec->has_tls_get_addr_call
8171 && h != NULL
8172 && (h == &htab->tls_get_addr->elf
8173 || h == &htab->tls_get_addr_fd->elf)
8174 && !found_tls_get_addr_arg
8175 && is_branch_reloc (r_type))
8176 {
8177 info->callbacks->minfo (_("%H __tls_get_addr lost arg, "
8178 "TLS optimization disabled\n"),
8179 ibfd, sec, rel->r_offset);
8180 ret = TRUE;
8181 goto err_free_rel;
8182 }
8183
8184 found_tls_get_addr_arg = 0;
8185 switch (r_type)
8186 {
8187 case R_PPC64_GOT_TLSLD16:
8188 case R_PPC64_GOT_TLSLD16_LO:
8189 expecting_tls_get_addr = 1;
8190 found_tls_get_addr_arg = 1;
8191 /* Fall thru */
8192
8193 case R_PPC64_GOT_TLSLD16_HI:
8194 case R_PPC64_GOT_TLSLD16_HA:
8195 /* These relocs should never be against a symbol
8196 defined in a shared lib. Leave them alone if
8197 that turns out to be the case. */
8198 if (!is_local)
8199 continue;
8200
8201 /* LD -> LE */
8202 tls_set = 0;
8203 tls_clear = TLS_LD;
8204 tls_type = TLS_TLS | TLS_LD;
8205 break;
8206
8207 case R_PPC64_GOT_TLSGD16:
8208 case R_PPC64_GOT_TLSGD16_LO:
8209 expecting_tls_get_addr = 1;
8210 found_tls_get_addr_arg = 1;
8211 /* Fall thru */
8212
8213 case R_PPC64_GOT_TLSGD16_HI:
8214 case R_PPC64_GOT_TLSGD16_HA:
8215 if (ok_tprel)
8216 /* GD -> LE */
8217 tls_set = 0;
8218 else
8219 /* GD -> IE */
8220 tls_set = TLS_TLS | TLS_TPRELGD;
8221 tls_clear = TLS_GD;
8222 tls_type = TLS_TLS | TLS_GD;
8223 break;
8224
8225 case R_PPC64_GOT_TPREL16_DS:
8226 case R_PPC64_GOT_TPREL16_LO_DS:
8227 case R_PPC64_GOT_TPREL16_HI:
8228 case R_PPC64_GOT_TPREL16_HA:
8229 if (ok_tprel)
8230 {
8231 /* IE -> LE */
8232 tls_set = 0;
8233 tls_clear = TLS_TPREL;
8234 tls_type = TLS_TLS | TLS_TPREL;
8235 break;
8236 }
8237 continue;
8238
8239 case R_PPC64_TLSGD:
8240 case R_PPC64_TLSLD:
8241 found_tls_get_addr_arg = 1;
8242 /* Fall thru */
8243
8244 case R_PPC64_TLS:
8245 case R_PPC64_TOC16:
8246 case R_PPC64_TOC16_LO:
8247 if (sym_sec == NULL || sym_sec != toc)
8248 continue;
8249
8250 /* Mark this toc entry as referenced by a TLS
8251 code sequence. We can do that now in the
8252 case of R_PPC64_TLS, and after checking for
8253 tls_get_addr for the TOC16 relocs. */
8254 if (toc_ref == NULL)
8255 toc_ref = bfd_zmalloc (toc->output_section->rawsize / 8);
8256 if (toc_ref == NULL)
8257 goto err_free_rel;
8258
8259 if (h != NULL)
8260 value = h->root.u.def.value;
8261 else
8262 value = sym->st_value;
8263 value += rel->r_addend;
8264 BFD_ASSERT (value < toc->size && value % 8 == 0);
8265 toc_ref_index = (value + toc->output_offset) / 8;
8266 if (r_type == R_PPC64_TLS
8267 || r_type == R_PPC64_TLSGD
8268 || r_type == R_PPC64_TLSLD)
8269 {
8270 toc_ref[toc_ref_index] = 1;
8271 continue;
8272 }
8273
8274 if (pass != 0 && toc_ref[toc_ref_index] == 0)
8275 continue;
8276
8277 tls_set = 0;
8278 tls_clear = 0;
8279 expecting_tls_get_addr = 2;
8280 break;
8281
8282 case R_PPC64_TPREL64:
8283 if (pass == 0
8284 || sec != toc
8285 || toc_ref == NULL
8286 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8287 continue;
8288 if (ok_tprel)
8289 {
8290 /* IE -> LE */
8291 tls_set = TLS_EXPLICIT;
8292 tls_clear = TLS_TPREL;
8293 break;
8294 }
8295 continue;
8296
8297 case R_PPC64_DTPMOD64:
8298 if (pass == 0
8299 || sec != toc
8300 || toc_ref == NULL
8301 || !toc_ref[(rel->r_offset + toc->output_offset) / 8])
8302 continue;
8303 if (rel + 1 < relend
8304 && (rel[1].r_info
8305 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
8306 && rel[1].r_offset == rel->r_offset + 8)
8307 {
8308 if (ok_tprel)
8309 /* GD -> LE */
8310 tls_set = TLS_EXPLICIT | TLS_GD;
8311 else
8312 /* GD -> IE */
8313 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
8314 tls_clear = TLS_GD;
8315 }
8316 else
8317 {
8318 if (!is_local)
8319 continue;
8320
8321 /* LD -> LE */
8322 tls_set = TLS_EXPLICIT;
8323 tls_clear = TLS_LD;
8324 }
8325 break;
8326
8327 default:
8328 continue;
8329 }
8330
8331 if (pass == 0)
8332 {
8333 if (!expecting_tls_get_addr
8334 || !sec->has_tls_get_addr_call)
8335 continue;
8336
8337 if (rel + 1 < relend
8338 && branch_reloc_hash_match (ibfd, rel + 1,
8339 htab->tls_get_addr,
8340 htab->tls_get_addr_fd))
8341 {
8342 if (expecting_tls_get_addr == 2)
8343 {
8344 /* Check for toc tls entries. */
8345 unsigned char *toc_tls;
8346 int retval;
8347
8348 retval = get_tls_mask (&toc_tls, NULL, NULL,
8349 &locsyms,
8350 rel, ibfd);
8351 if (retval == 0)
8352 goto err_free_rel;
8353 if (toc_tls != NULL)
8354 {
8355 if ((*toc_tls & (TLS_GD | TLS_LD)) != 0)
8356 found_tls_get_addr_arg = 1;
8357 if (retval > 1)
8358 toc_ref[toc_ref_index] = 1;
8359 }
8360 }
8361 continue;
8362 }
8363
8364 if (expecting_tls_get_addr != 1)
8365 continue;
8366
8367 /* Uh oh, we didn't find the expected call. We
8368 could just mark this symbol to exclude it
8369 from tls optimization but it's safer to skip
8370 the entire optimization. */
8371 info->callbacks->minfo (_("%H arg lost __tls_get_addr, "
8372 "TLS optimization disabled\n"),
8373 ibfd, sec, rel->r_offset);
8374 ret = TRUE;
8375 goto err_free_rel;
8376 }
8377
8378 if (expecting_tls_get_addr && htab->tls_get_addr != NULL)
8379 {
8380 struct plt_entry *ent;
8381 for (ent = htab->tls_get_addr->elf.plt.plist;
8382 ent != NULL;
8383 ent = ent->next)
8384 if (ent->addend == 0)
8385 {
8386 if (ent->plt.refcount > 0)
8387 {
8388 ent->plt.refcount -= 1;
8389 expecting_tls_get_addr = 0;
8390 }
8391 break;
8392 }
8393 }
8394
8395 if (expecting_tls_get_addr && htab->tls_get_addr_fd != NULL)
8396 {
8397 struct plt_entry *ent;
8398 for (ent = htab->tls_get_addr_fd->elf.plt.plist;
8399 ent != NULL;
8400 ent = ent->next)
8401 if (ent->addend == 0)
8402 {
8403 if (ent->plt.refcount > 0)
8404 ent->plt.refcount -= 1;
8405 break;
8406 }
8407 }
8408
8409 if (tls_clear == 0)
8410 continue;
8411
8412 if ((tls_set & TLS_EXPLICIT) == 0)
8413 {
8414 struct got_entry *ent;
8415
8416 /* Adjust got entry for this reloc. */
8417 if (h != NULL)
8418 ent = h->got.glist;
8419 else
8420 ent = elf_local_got_ents (ibfd)[r_symndx];
8421
8422 for (; ent != NULL; ent = ent->next)
8423 if (ent->addend == rel->r_addend
8424 && ent->owner == ibfd
8425 && ent->tls_type == tls_type)
8426 break;
8427 if (ent == NULL)
8428 abort ();
8429
8430 if (tls_set == 0)
8431 {
8432 /* We managed to get rid of a got entry. */
8433 if (ent->got.refcount > 0)
8434 ent->got.refcount -= 1;
8435 }
8436 }
8437 else
8438 {
8439 /* If we got rid of a DTPMOD/DTPREL reloc pair then
8440 we'll lose one or two dyn relocs. */
8441 if (!dec_dynrel_count (rel->r_info, sec, info,
8442 NULL, h, sym))
8443 return FALSE;
8444
8445 if (tls_set == (TLS_EXPLICIT | TLS_GD))
8446 {
8447 if (!dec_dynrel_count ((rel + 1)->r_info, sec, info,
8448 NULL, h, sym))
8449 return FALSE;
8450 }
8451 }
8452
8453 *tls_mask |= tls_set;
8454 *tls_mask &= ~tls_clear;
8455 }
8456
8457 if (elf_section_data (sec)->relocs != relstart)
8458 free (relstart);
8459 }
8460
8461 if (locsyms != NULL
8462 && (elf_symtab_hdr (ibfd).contents != (unsigned char *) locsyms))
8463 {
8464 if (!info->keep_memory)
8465 free (locsyms);
8466 else
8467 elf_symtab_hdr (ibfd).contents = (unsigned char *) locsyms;
8468 }
8469 }
8470
8471 if (toc_ref != NULL)
8472 free (toc_ref);
8473 return TRUE;
8474 }
8475
8476 /* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
8477 the values of any global symbols in a toc section that has been
8478 edited. Globals in toc sections should be a rarity, so this function
8479 sets a flag if any are found in toc sections other than the one just
8480 edited, so that futher hash table traversals can be avoided. */
8481
8482 struct adjust_toc_info
8483 {
8484 asection *toc;
8485 unsigned long *skip;
8486 bfd_boolean global_toc_syms;
8487 };
8488
8489 enum toc_skip_enum { ref_from_discarded = 1, can_optimize = 2 };
8490
8491 static bfd_boolean
8492 adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
8493 {
8494 struct ppc_link_hash_entry *eh;
8495 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
8496 unsigned long i;
8497
8498 if (h->root.type != bfd_link_hash_defined
8499 && h->root.type != bfd_link_hash_defweak)
8500 return TRUE;
8501
8502 eh = (struct ppc_link_hash_entry *) h;
8503 if (eh->adjust_done)
8504 return TRUE;
8505
8506 if (eh->elf.root.u.def.section == toc_inf->toc)
8507 {
8508 if (eh->elf.root.u.def.value > toc_inf->toc->rawsize)
8509 i = toc_inf->toc->rawsize >> 3;
8510 else
8511 i = eh->elf.root.u.def.value >> 3;
8512
8513 if ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0)
8514 {
8515 (*_bfd_error_handler)
8516 (_("%s defined on removed toc entry"), eh->elf.root.root.string);
8517 do
8518 ++i;
8519 while ((toc_inf->skip[i] & (ref_from_discarded | can_optimize)) != 0);
8520 eh->elf.root.u.def.value = (bfd_vma) i << 3;
8521 }
8522
8523 eh->elf.root.u.def.value -= toc_inf->skip[i];
8524 eh->adjust_done = 1;
8525 }
8526 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
8527 toc_inf->global_toc_syms = TRUE;
8528
8529 return TRUE;
8530 }
8531
8532 /* Return TRUE iff INSN is one we expect on a _LO variety toc/got reloc. */
8533
8534 static bfd_boolean
8535 ok_lo_toc_insn (unsigned int insn)
8536 {
8537 return ((insn & (0x3f << 26)) == 14u << 26 /* addi */
8538 || (insn & (0x3f << 26)) == 32u << 26 /* lwz */
8539 || (insn & (0x3f << 26)) == 34u << 26 /* lbz */
8540 || (insn & (0x3f << 26)) == 36u << 26 /* stw */
8541 || (insn & (0x3f << 26)) == 38u << 26 /* stb */
8542 || (insn & (0x3f << 26)) == 40u << 26 /* lhz */
8543 || (insn & (0x3f << 26)) == 42u << 26 /* lha */
8544 || (insn & (0x3f << 26)) == 44u << 26 /* sth */
8545 || (insn & (0x3f << 26)) == 46u << 26 /* lmw */
8546 || (insn & (0x3f << 26)) == 47u << 26 /* stmw */
8547 || (insn & (0x3f << 26)) == 48u << 26 /* lfs */
8548 || (insn & (0x3f << 26)) == 50u << 26 /* lfd */
8549 || (insn & (0x3f << 26)) == 52u << 26 /* stfs */
8550 || (insn & (0x3f << 26)) == 54u << 26 /* stfd */
8551 || ((insn & (0x3f << 26)) == 58u << 26 /* lwa,ld,lmd */
8552 && (insn & 3) != 1)
8553 || ((insn & (0x3f << 26)) == 62u << 26 /* std, stmd */
8554 && ((insn & 3) == 0 || (insn & 3) == 3))
8555 || (insn & (0x3f << 26)) == 12u << 26 /* addic */);
8556 }
8557
8558 /* Examine all relocs referencing .toc sections in order to remove
8559 unused .toc entries. */
8560
8561 bfd_boolean
8562 ppc64_elf_edit_toc (struct bfd_link_info *info)
8563 {
8564 bfd *ibfd;
8565 struct adjust_toc_info toc_inf;
8566 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8567
8568 htab->do_toc_opt = 1;
8569 toc_inf.global_toc_syms = TRUE;
8570 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
8571 {
8572 asection *toc, *sec;
8573 Elf_Internal_Shdr *symtab_hdr;
8574 Elf_Internal_Sym *local_syms;
8575 Elf_Internal_Rela *relstart, *rel, *toc_relocs;
8576 unsigned long *skip, *drop;
8577 unsigned char *used;
8578 unsigned char *keep, last, some_unused;
8579
8580 if (!is_ppc64_elf (ibfd))
8581 continue;
8582
8583 toc = bfd_get_section_by_name (ibfd, ".toc");
8584 if (toc == NULL
8585 || toc->size == 0
8586 || toc->sec_info_type == SEC_INFO_TYPE_JUST_SYMS
8587 || discarded_section (toc))
8588 continue;
8589
8590 toc_relocs = NULL;
8591 local_syms = NULL;
8592 symtab_hdr = &elf_symtab_hdr (ibfd);
8593
8594 /* Look at sections dropped from the final link. */
8595 skip = NULL;
8596 relstart = NULL;
8597 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
8598 {
8599 if (sec->reloc_count == 0
8600 || !discarded_section (sec)
8601 || get_opd_info (sec)
8602 || (sec->flags & SEC_ALLOC) == 0
8603 || (sec->flags & SEC_DEBUGGING) != 0)
8604 continue;
8605
8606 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
8607 if (relstart == NULL)
8608 goto error_ret;
8609
8610 /* Run through the relocs to see which toc entries might be
8611 unused. */
8612 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8613 {
8614 enum elf_ppc64_reloc_type r_type;
8615 unsigned long r_symndx;
8616 asection *sym_sec;
8617 struct elf_link_hash_entry *h;
8618 Elf_Internal_Sym *sym;
8619 bfd_vma val;
8620
8621 r_type = ELF64_R_TYPE (rel->r_info);
8622 switch (r_type)
8623 {
8624 default:
8625 continue;
8626
8627 case R_PPC64_TOC16:
8628 case R_PPC64_TOC16_LO:
8629 case R_PPC64_TOC16_HI:
8630 case R_PPC64_TOC16_HA:
8631 case R_PPC64_TOC16_DS:
8632 case R_PPC64_TOC16_LO_DS:
8633 break;
8634 }
8635
8636 r_symndx = ELF64_R_SYM (rel->r_info);
8637 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8638 r_symndx, ibfd))
8639 goto error_ret;
8640
8641 if (sym_sec != toc)
8642 continue;
8643
8644 if (h != NULL)
8645 val = h->root.u.def.value;
8646 else
8647 val = sym->st_value;
8648 val += rel->r_addend;
8649
8650 if (val >= toc->size)
8651 continue;
8652
8653 /* Anything in the toc ought to be aligned to 8 bytes.
8654 If not, don't mark as unused. */
8655 if (val & 7)
8656 continue;
8657
8658 if (skip == NULL)
8659 {
8660 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8661 if (skip == NULL)
8662 goto error_ret;
8663 }
8664
8665 skip[val >> 3] = ref_from_discarded;
8666 }
8667
8668 if (elf_section_data (sec)->relocs != relstart)
8669 free (relstart);
8670 }
8671
8672 /* For largetoc loads of address constants, we can convert
8673 . addis rx,2,addr@got@ha
8674 . ld ry,addr@got@l(rx)
8675 to
8676 . addis rx,2,addr@toc@ha
8677 . addi ry,rx,addr@toc@l
8678 when addr is within 2G of the toc pointer. This then means
8679 that the word storing "addr" in the toc is no longer needed. */
8680
8681 if (!ppc64_elf_tdata (ibfd)->has_small_toc_reloc
8682 && toc->output_section->rawsize < (bfd_vma) 1 << 31
8683 && toc->reloc_count != 0)
8684 {
8685 /* Read toc relocs. */
8686 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
8687 info->keep_memory);
8688 if (toc_relocs == NULL)
8689 goto error_ret;
8690
8691 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
8692 {
8693 enum elf_ppc64_reloc_type r_type;
8694 unsigned long r_symndx;
8695 asection *sym_sec;
8696 struct elf_link_hash_entry *h;
8697 Elf_Internal_Sym *sym;
8698 bfd_vma val, addr;
8699
8700 r_type = ELF64_R_TYPE (rel->r_info);
8701 if (r_type != R_PPC64_ADDR64)
8702 continue;
8703
8704 r_symndx = ELF64_R_SYM (rel->r_info);
8705 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8706 r_symndx, ibfd))
8707 goto error_ret;
8708
8709 if (sym_sec == NULL
8710 || discarded_section (sym_sec))
8711 continue;
8712
8713 if (!SYMBOL_REFERENCES_LOCAL (info, h))
8714 continue;
8715
8716 if (h != NULL)
8717 {
8718 if (h->type == STT_GNU_IFUNC)
8719 continue;
8720 val = h->root.u.def.value;
8721 }
8722 else
8723 {
8724 if (ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
8725 continue;
8726 val = sym->st_value;
8727 }
8728 val += rel->r_addend;
8729 val += sym_sec->output_section->vma + sym_sec->output_offset;
8730
8731 /* We don't yet know the exact toc pointer value, but we
8732 know it will be somewhere in the toc section. Don't
8733 optimize if the difference from any possible toc
8734 pointer is outside [ff..f80008000, 7fff7fff]. */
8735 addr = toc->output_section->vma + TOC_BASE_OFF;
8736 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8737 continue;
8738
8739 addr = toc->output_section->vma + toc->output_section->rawsize;
8740 if (val - addr + (bfd_vma) 0x80008000 >= (bfd_vma) 1 << 32)
8741 continue;
8742
8743 if (skip == NULL)
8744 {
8745 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 15) / 8);
8746 if (skip == NULL)
8747 goto error_ret;
8748 }
8749
8750 skip[rel->r_offset >> 3]
8751 |= can_optimize | ((rel - toc_relocs) << 2);
8752 }
8753 }
8754
8755 if (skip == NULL)
8756 continue;
8757
8758 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
8759 if (used == NULL)
8760 {
8761 error_ret:
8762 if (local_syms != NULL
8763 && symtab_hdr->contents != (unsigned char *) local_syms)
8764 free (local_syms);
8765 if (sec != NULL
8766 && relstart != NULL
8767 && elf_section_data (sec)->relocs != relstart)
8768 free (relstart);
8769 if (toc_relocs != NULL
8770 && elf_section_data (toc)->relocs != toc_relocs)
8771 free (toc_relocs);
8772 if (skip != NULL)
8773 free (skip);
8774 return FALSE;
8775 }
8776
8777 /* Now check all kept sections that might reference the toc.
8778 Check the toc itself last. */
8779 for (sec = (ibfd->sections == toc && toc->next ? toc->next
8780 : ibfd->sections);
8781 sec != NULL;
8782 sec = (sec == toc ? NULL
8783 : sec->next == NULL ? toc
8784 : sec->next == toc && toc->next ? toc->next
8785 : sec->next))
8786 {
8787 int repeat;
8788
8789 if (sec->reloc_count == 0
8790 || discarded_section (sec)
8791 || get_opd_info (sec)
8792 || (sec->flags & SEC_ALLOC) == 0
8793 || (sec->flags & SEC_DEBUGGING) != 0)
8794 continue;
8795
8796 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
8797 info->keep_memory);
8798 if (relstart == NULL)
8799 {
8800 free (used);
8801 goto error_ret;
8802 }
8803
8804 /* Mark toc entries referenced as used. */
8805 do
8806 {
8807 repeat = 0;
8808 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
8809 {
8810 enum elf_ppc64_reloc_type r_type;
8811 unsigned long r_symndx;
8812 asection *sym_sec;
8813 struct elf_link_hash_entry *h;
8814 Elf_Internal_Sym *sym;
8815 bfd_vma val;
8816 enum {no_check, check_lo, check_ha} insn_check;
8817
8818 r_type = ELF64_R_TYPE (rel->r_info);
8819 switch (r_type)
8820 {
8821 default:
8822 insn_check = no_check;
8823 break;
8824
8825 case R_PPC64_GOT_TLSLD16_HA:
8826 case R_PPC64_GOT_TLSGD16_HA:
8827 case R_PPC64_GOT_TPREL16_HA:
8828 case R_PPC64_GOT_DTPREL16_HA:
8829 case R_PPC64_GOT16_HA:
8830 case R_PPC64_TOC16_HA:
8831 insn_check = check_ha;
8832 break;
8833
8834 case R_PPC64_GOT_TLSLD16_LO:
8835 case R_PPC64_GOT_TLSGD16_LO:
8836 case R_PPC64_GOT_TPREL16_LO_DS:
8837 case R_PPC64_GOT_DTPREL16_LO_DS:
8838 case R_PPC64_GOT16_LO:
8839 case R_PPC64_GOT16_LO_DS:
8840 case R_PPC64_TOC16_LO:
8841 case R_PPC64_TOC16_LO_DS:
8842 insn_check = check_lo;
8843 break;
8844 }
8845
8846 if (insn_check != no_check)
8847 {
8848 bfd_vma off = rel->r_offset & ~3;
8849 unsigned char buf[4];
8850 unsigned int insn;
8851
8852 if (!bfd_get_section_contents (ibfd, sec, buf, off, 4))
8853 {
8854 free (used);
8855 goto error_ret;
8856 }
8857 insn = bfd_get_32 (ibfd, buf);
8858 if (insn_check == check_lo
8859 ? !ok_lo_toc_insn (insn)
8860 : ((insn & ((0x3f << 26) | 0x1f << 16))
8861 != ((15u << 26) | (2 << 16)) /* addis rt,2,imm */))
8862 {
8863 char str[12];
8864
8865 ppc64_elf_tdata (ibfd)->unexpected_toc_insn = 1;
8866 sprintf (str, "%#08x", insn);
8867 info->callbacks->einfo
8868 (_("%P: %H: toc optimization is not supported for"
8869 " %s instruction.\n"),
8870 ibfd, sec, rel->r_offset & ~3, str);
8871 }
8872 }
8873
8874 switch (r_type)
8875 {
8876 case R_PPC64_TOC16:
8877 case R_PPC64_TOC16_LO:
8878 case R_PPC64_TOC16_HI:
8879 case R_PPC64_TOC16_HA:
8880 case R_PPC64_TOC16_DS:
8881 case R_PPC64_TOC16_LO_DS:
8882 /* In case we're taking addresses of toc entries. */
8883 case R_PPC64_ADDR64:
8884 break;
8885
8886 default:
8887 continue;
8888 }
8889
8890 r_symndx = ELF64_R_SYM (rel->r_info);
8891 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8892 r_symndx, ibfd))
8893 {
8894 free (used);
8895 goto error_ret;
8896 }
8897
8898 if (sym_sec != toc)
8899 continue;
8900
8901 if (h != NULL)
8902 val = h->root.u.def.value;
8903 else
8904 val = sym->st_value;
8905 val += rel->r_addend;
8906
8907 if (val >= toc->size)
8908 continue;
8909
8910 if ((skip[val >> 3] & can_optimize) != 0)
8911 {
8912 bfd_vma off;
8913 unsigned char opc;
8914
8915 switch (r_type)
8916 {
8917 case R_PPC64_TOC16_HA:
8918 break;
8919
8920 case R_PPC64_TOC16_LO_DS:
8921 off = rel->r_offset;
8922 off += (bfd_big_endian (ibfd) ? -2 : 3);
8923 if (!bfd_get_section_contents (ibfd, sec, &opc,
8924 off, 1))
8925 {
8926 free (used);
8927 goto error_ret;
8928 }
8929 if ((opc & (0x3f << 2)) == (58u << 2))
8930 break;
8931 /* Fall thru */
8932
8933 default:
8934 /* Wrong sort of reloc, or not a ld. We may
8935 as well clear ref_from_discarded too. */
8936 skip[val >> 3] = 0;
8937 }
8938 }
8939
8940 if (sec != toc)
8941 used[val >> 3] = 1;
8942 /* For the toc section, we only mark as used if this
8943 entry itself isn't unused. */
8944 else if ((used[rel->r_offset >> 3]
8945 || !(skip[rel->r_offset >> 3] & ref_from_discarded))
8946 && !used[val >> 3])
8947 {
8948 /* Do all the relocs again, to catch reference
8949 chains. */
8950 repeat = 1;
8951 used[val >> 3] = 1;
8952 }
8953 }
8954 }
8955 while (repeat);
8956
8957 if (elf_section_data (sec)->relocs != relstart)
8958 free (relstart);
8959 }
8960
8961 /* Merge the used and skip arrays. Assume that TOC
8962 doublewords not appearing as either used or unused belong
8963 to to an entry more than one doubleword in size. */
8964 for (drop = skip, keep = used, last = 0, some_unused = 0;
8965 drop < skip + (toc->size + 7) / 8;
8966 ++drop, ++keep)
8967 {
8968 if (*keep)
8969 {
8970 *drop &= ~ref_from_discarded;
8971 if ((*drop & can_optimize) != 0)
8972 some_unused = 1;
8973 last = 0;
8974 }
8975 else if ((*drop & ref_from_discarded) != 0)
8976 {
8977 some_unused = 1;
8978 last = ref_from_discarded;
8979 }
8980 else
8981 *drop = last;
8982 }
8983
8984 free (used);
8985
8986 if (some_unused)
8987 {
8988 bfd_byte *contents, *src;
8989 unsigned long off;
8990 Elf_Internal_Sym *sym;
8991 bfd_boolean local_toc_syms = FALSE;
8992
8993 /* Shuffle the toc contents, and at the same time convert the
8994 skip array from booleans into offsets. */
8995 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
8996 goto error_ret;
8997
8998 elf_section_data (toc)->this_hdr.contents = contents;
8999
9000 for (src = contents, off = 0, drop = skip;
9001 src < contents + toc->size;
9002 src += 8, ++drop)
9003 {
9004 if ((*drop & (can_optimize | ref_from_discarded)) != 0)
9005 off += 8;
9006 else if (off != 0)
9007 {
9008 *drop = off;
9009 memcpy (src - off, src, 8);
9010 }
9011 }
9012 *drop = off;
9013 toc->rawsize = toc->size;
9014 toc->size = src - contents - off;
9015
9016 /* Adjust addends for relocs against the toc section sym,
9017 and optimize any accesses we can. */
9018 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
9019 {
9020 if (sec->reloc_count == 0
9021 || discarded_section (sec))
9022 continue;
9023
9024 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
9025 info->keep_memory);
9026 if (relstart == NULL)
9027 goto error_ret;
9028
9029 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
9030 {
9031 enum elf_ppc64_reloc_type r_type;
9032 unsigned long r_symndx;
9033 asection *sym_sec;
9034 struct elf_link_hash_entry *h;
9035 bfd_vma val;
9036
9037 r_type = ELF64_R_TYPE (rel->r_info);
9038 switch (r_type)
9039 {
9040 default:
9041 continue;
9042
9043 case R_PPC64_TOC16:
9044 case R_PPC64_TOC16_LO:
9045 case R_PPC64_TOC16_HI:
9046 case R_PPC64_TOC16_HA:
9047 case R_PPC64_TOC16_DS:
9048 case R_PPC64_TOC16_LO_DS:
9049 case R_PPC64_ADDR64:
9050 break;
9051 }
9052
9053 r_symndx = ELF64_R_SYM (rel->r_info);
9054 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
9055 r_symndx, ibfd))
9056 goto error_ret;
9057
9058 if (sym_sec != toc)
9059 continue;
9060
9061 if (h != NULL)
9062 val = h->root.u.def.value;
9063 else
9064 {
9065 val = sym->st_value;
9066 if (val != 0)
9067 local_toc_syms = TRUE;
9068 }
9069
9070 val += rel->r_addend;
9071
9072 if (val > toc->rawsize)
9073 val = toc->rawsize;
9074 else if ((skip[val >> 3] & ref_from_discarded) != 0)
9075 continue;
9076 else if ((skip[val >> 3] & can_optimize) != 0)
9077 {
9078 Elf_Internal_Rela *tocrel
9079 = toc_relocs + (skip[val >> 3] >> 2);
9080 unsigned long tsym = ELF64_R_SYM (tocrel->r_info);
9081
9082 switch (r_type)
9083 {
9084 case R_PPC64_TOC16_HA:
9085 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_TOC16_HA);
9086 break;
9087
9088 case R_PPC64_TOC16_LO_DS:
9089 rel->r_info = ELF64_R_INFO (tsym, R_PPC64_LO_DS_OPT);
9090 break;
9091
9092 default:
9093 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
9094 ppc_howto_init ();
9095 info->callbacks->einfo
9096 (_("%P: %H: %s references "
9097 "optimized away TOC entry\n"),
9098 ibfd, sec, rel->r_offset,
9099 ppc64_elf_howto_table[r_type]->name);
9100 bfd_set_error (bfd_error_bad_value);
9101 goto error_ret;
9102 }
9103 rel->r_addend = tocrel->r_addend;
9104 elf_section_data (sec)->relocs = relstart;
9105 continue;
9106 }
9107
9108 if (h != NULL || sym->st_value != 0)
9109 continue;
9110
9111 rel->r_addend -= skip[val >> 3];
9112 elf_section_data (sec)->relocs = relstart;
9113 }
9114
9115 if (elf_section_data (sec)->relocs != relstart)
9116 free (relstart);
9117 }
9118
9119 /* We shouldn't have local or global symbols defined in the TOC,
9120 but handle them anyway. */
9121 if (local_syms != NULL)
9122 for (sym = local_syms;
9123 sym < local_syms + symtab_hdr->sh_info;
9124 ++sym)
9125 if (sym->st_value != 0
9126 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
9127 {
9128 unsigned long i;
9129
9130 if (sym->st_value > toc->rawsize)
9131 i = toc->rawsize >> 3;
9132 else
9133 i = sym->st_value >> 3;
9134
9135 if ((skip[i] & (ref_from_discarded | can_optimize)) != 0)
9136 {
9137 if (local_toc_syms)
9138 (*_bfd_error_handler)
9139 (_("%s defined on removed toc entry"),
9140 bfd_elf_sym_name (ibfd, symtab_hdr, sym, NULL));
9141 do
9142 ++i;
9143 while ((skip[i] & (ref_from_discarded | can_optimize)));
9144 sym->st_value = (bfd_vma) i << 3;
9145 }
9146
9147 sym->st_value -= skip[i];
9148 symtab_hdr->contents = (unsigned char *) local_syms;
9149 }
9150
9151 /* Adjust any global syms defined in this toc input section. */
9152 if (toc_inf.global_toc_syms)
9153 {
9154 toc_inf.toc = toc;
9155 toc_inf.skip = skip;
9156 toc_inf.global_toc_syms = FALSE;
9157 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
9158 &toc_inf);
9159 }
9160
9161 if (toc->reloc_count != 0)
9162 {
9163 Elf_Internal_Shdr *rel_hdr;
9164 Elf_Internal_Rela *wrel;
9165 bfd_size_type sz;
9166
9167 /* Remove unused toc relocs, and adjust those we keep. */
9168 if (toc_relocs == NULL)
9169 toc_relocs = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL,
9170 info->keep_memory);
9171 if (toc_relocs == NULL)
9172 goto error_ret;
9173
9174 wrel = toc_relocs;
9175 for (rel = toc_relocs; rel < toc_relocs + toc->reloc_count; ++rel)
9176 if ((skip[rel->r_offset >> 3]
9177 & (ref_from_discarded | can_optimize)) == 0)
9178 {
9179 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
9180 wrel->r_info = rel->r_info;
9181 wrel->r_addend = rel->r_addend;
9182 ++wrel;
9183 }
9184 else if (!dec_dynrel_count (rel->r_info, toc, info,
9185 &local_syms, NULL, NULL))
9186 goto error_ret;
9187
9188 elf_section_data (toc)->relocs = toc_relocs;
9189 toc->reloc_count = wrel - toc_relocs;
9190 rel_hdr = _bfd_elf_single_rel_hdr (toc);
9191 sz = rel_hdr->sh_entsize;
9192 rel_hdr->sh_size = toc->reloc_count * sz;
9193 }
9194 }
9195 else if (toc_relocs != NULL
9196 && elf_section_data (toc)->relocs != toc_relocs)
9197 free (toc_relocs);
9198
9199 if (local_syms != NULL
9200 && symtab_hdr->contents != (unsigned char *) local_syms)
9201 {
9202 if (!info->keep_memory)
9203 free (local_syms);
9204 else
9205 symtab_hdr->contents = (unsigned char *) local_syms;
9206 }
9207 free (skip);
9208 }
9209
9210 return TRUE;
9211 }
9212
9213 /* Return true iff input section I references the TOC using
9214 instructions limited to +/-32k offsets. */
9215
9216 bfd_boolean
9217 ppc64_elf_has_small_toc_reloc (asection *i)
9218 {
9219 return (is_ppc64_elf (i->owner)
9220 && ppc64_elf_tdata (i->owner)->has_small_toc_reloc);
9221 }
9222
9223 /* Allocate space for one GOT entry. */
9224
9225 static void
9226 allocate_got (struct elf_link_hash_entry *h,
9227 struct bfd_link_info *info,
9228 struct got_entry *gent)
9229 {
9230 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9231 bfd_boolean dyn;
9232 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) h;
9233 int entsize = (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)
9234 ? 16 : 8);
9235 int rentsize = (gent->tls_type & eh->tls_mask & TLS_GD
9236 ? 2 : 1) * sizeof (Elf64_External_Rela);
9237 asection *got = ppc64_elf_tdata (gent->owner)->got;
9238
9239 gent->got.offset = got->size;
9240 got->size += entsize;
9241
9242 dyn = htab->elf.dynamic_sections_created;
9243 if (h->type == STT_GNU_IFUNC)
9244 {
9245 htab->elf.irelplt->size += rentsize;
9246 htab->got_reli_size += rentsize;
9247 }
9248 else if ((info->shared
9249 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
9250 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
9251 || h->root.type != bfd_link_hash_undefweak))
9252 {
9253 asection *relgot = ppc64_elf_tdata (gent->owner)->relgot;
9254 relgot->size += rentsize;
9255 }
9256 }
9257
9258 /* This function merges got entries in the same toc group. */
9259
9260 static void
9261 merge_got_entries (struct got_entry **pent)
9262 {
9263 struct got_entry *ent, *ent2;
9264
9265 for (ent = *pent; ent != NULL; ent = ent->next)
9266 if (!ent->is_indirect)
9267 for (ent2 = ent->next; ent2 != NULL; ent2 = ent2->next)
9268 if (!ent2->is_indirect
9269 && ent2->addend == ent->addend
9270 && ent2->tls_type == ent->tls_type
9271 && elf_gp (ent2->owner) == elf_gp (ent->owner))
9272 {
9273 ent2->is_indirect = TRUE;
9274 ent2->got.ent = ent;
9275 }
9276 }
9277
9278 /* Allocate space in .plt, .got and associated reloc sections for
9279 dynamic relocs. */
9280
9281 static bfd_boolean
9282 allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
9283 {
9284 struct bfd_link_info *info;
9285 struct ppc_link_hash_table *htab;
9286 asection *s;
9287 struct ppc_link_hash_entry *eh;
9288 struct elf_dyn_relocs *p;
9289 struct got_entry **pgent, *gent;
9290
9291 if (h->root.type == bfd_link_hash_indirect)
9292 return TRUE;
9293
9294 info = (struct bfd_link_info *) inf;
9295 htab = ppc_hash_table (info);
9296 if (htab == NULL)
9297 return FALSE;
9298
9299 if ((htab->elf.dynamic_sections_created
9300 && h->dynindx != -1
9301 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
9302 || h->type == STT_GNU_IFUNC)
9303 {
9304 struct plt_entry *pent;
9305 bfd_boolean doneone = FALSE;
9306 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9307 if (pent->plt.refcount > 0)
9308 {
9309 if (!htab->elf.dynamic_sections_created
9310 || h->dynindx == -1)
9311 {
9312 s = htab->elf.iplt;
9313 pent->plt.offset = s->size;
9314 s->size += PLT_ENTRY_SIZE (htab);
9315 s = htab->elf.irelplt;
9316 }
9317 else
9318 {
9319 /* If this is the first .plt entry, make room for the special
9320 first entry. */
9321 s = htab->elf.splt;
9322 if (s->size == 0)
9323 s->size += PLT_INITIAL_ENTRY_SIZE (htab);
9324
9325 pent->plt.offset = s->size;
9326
9327 /* Make room for this entry. */
9328 s->size += PLT_ENTRY_SIZE (htab);
9329
9330 /* Make room for the .glink code. */
9331 s = htab->glink;
9332 if (s->size == 0)
9333 s->size += GLINK_CALL_STUB_SIZE;
9334 if (htab->opd_abi)
9335 {
9336 /* We need bigger stubs past index 32767. */
9337 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
9338 s->size += 4;
9339 s->size += 2*4;
9340 }
9341 else
9342 s->size += 4;
9343
9344 /* We also need to make an entry in the .rela.plt section. */
9345 s = htab->elf.srelplt;
9346 }
9347 s->size += sizeof (Elf64_External_Rela);
9348 doneone = TRUE;
9349 }
9350 else
9351 pent->plt.offset = (bfd_vma) -1;
9352 if (!doneone)
9353 {
9354 h->plt.plist = NULL;
9355 h->needs_plt = 0;
9356 }
9357 }
9358 else
9359 {
9360 h->plt.plist = NULL;
9361 h->needs_plt = 0;
9362 }
9363
9364 eh = (struct ppc_link_hash_entry *) h;
9365 /* Run through the TLS GD got entries first if we're changing them
9366 to TPREL. */
9367 if ((eh->tls_mask & TLS_TPRELGD) != 0)
9368 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9369 if (gent->got.refcount > 0
9370 && (gent->tls_type & TLS_GD) != 0)
9371 {
9372 /* This was a GD entry that has been converted to TPREL. If
9373 there happens to be a TPREL entry we can use that one. */
9374 struct got_entry *ent;
9375 for (ent = h->got.glist; ent != NULL; ent = ent->next)
9376 if (ent->got.refcount > 0
9377 && (ent->tls_type & TLS_TPREL) != 0
9378 && ent->addend == gent->addend
9379 && ent->owner == gent->owner)
9380 {
9381 gent->got.refcount = 0;
9382 break;
9383 }
9384
9385 /* If not, then we'll be using our own TPREL entry. */
9386 if (gent->got.refcount != 0)
9387 gent->tls_type = TLS_TLS | TLS_TPREL;
9388 }
9389
9390 /* Remove any list entry that won't generate a word in the GOT before
9391 we call merge_got_entries. Otherwise we risk merging to empty
9392 entries. */
9393 pgent = &h->got.glist;
9394 while ((gent = *pgent) != NULL)
9395 if (gent->got.refcount > 0)
9396 {
9397 if ((gent->tls_type & TLS_LD) != 0
9398 && !h->def_dynamic)
9399 {
9400 ppc64_tlsld_got (gent->owner)->got.refcount += 1;
9401 *pgent = gent->next;
9402 }
9403 else
9404 pgent = &gent->next;
9405 }
9406 else
9407 *pgent = gent->next;
9408
9409 if (!htab->do_multi_toc)
9410 merge_got_entries (&h->got.glist);
9411
9412 for (gent = h->got.glist; gent != NULL; gent = gent->next)
9413 if (!gent->is_indirect)
9414 {
9415 /* Make sure this symbol is output as a dynamic symbol.
9416 Undefined weak syms won't yet be marked as dynamic,
9417 nor will all TLS symbols. */
9418 if (h->dynindx == -1
9419 && !h->forced_local
9420 && h->type != STT_GNU_IFUNC
9421 && htab->elf.dynamic_sections_created)
9422 {
9423 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9424 return FALSE;
9425 }
9426
9427 if (!is_ppc64_elf (gent->owner))
9428 abort ();
9429
9430 allocate_got (h, info, gent);
9431 }
9432
9433 if (eh->dyn_relocs == NULL
9434 || (!htab->elf.dynamic_sections_created
9435 && h->type != STT_GNU_IFUNC))
9436 return TRUE;
9437
9438 /* In the shared -Bsymbolic case, discard space allocated for
9439 dynamic pc-relative relocs against symbols which turn out to be
9440 defined in regular objects. For the normal shared case, discard
9441 space for relocs that have become local due to symbol visibility
9442 changes. */
9443
9444 if (info->shared)
9445 {
9446 /* Relocs that use pc_count are those that appear on a call insn,
9447 or certain REL relocs (see must_be_dyn_reloc) that can be
9448 generated via assembly. We want calls to protected symbols to
9449 resolve directly to the function rather than going via the plt.
9450 If people want function pointer comparisons to work as expected
9451 then they should avoid writing weird assembly. */
9452 if (SYMBOL_CALLS_LOCAL (info, h))
9453 {
9454 struct elf_dyn_relocs **pp;
9455
9456 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
9457 {
9458 p->count -= p->pc_count;
9459 p->pc_count = 0;
9460 if (p->count == 0)
9461 *pp = p->next;
9462 else
9463 pp = &p->next;
9464 }
9465 }
9466
9467 /* Also discard relocs on undefined weak syms with non-default
9468 visibility. */
9469 if (eh->dyn_relocs != NULL
9470 && h->root.type == bfd_link_hash_undefweak)
9471 {
9472 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
9473 eh->dyn_relocs = NULL;
9474
9475 /* Make sure this symbol is output as a dynamic symbol.
9476 Undefined weak syms won't yet be marked as dynamic. */
9477 else if (h->dynindx == -1
9478 && !h->forced_local)
9479 {
9480 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9481 return FALSE;
9482 }
9483 }
9484 }
9485 else if (h->type == STT_GNU_IFUNC)
9486 {
9487 if (!h->non_got_ref)
9488 eh->dyn_relocs = NULL;
9489 }
9490 else if (ELIMINATE_COPY_RELOCS)
9491 {
9492 /* For the non-shared case, discard space for relocs against
9493 symbols which turn out to need copy relocs or are not
9494 dynamic. */
9495
9496 if (!h->non_got_ref
9497 && !h->def_regular)
9498 {
9499 /* Make sure this symbol is output as a dynamic symbol.
9500 Undefined weak syms won't yet be marked as dynamic. */
9501 if (h->dynindx == -1
9502 && !h->forced_local)
9503 {
9504 if (! bfd_elf_link_record_dynamic_symbol (info, h))
9505 return FALSE;
9506 }
9507
9508 /* If that succeeded, we know we'll be keeping all the
9509 relocs. */
9510 if (h->dynindx != -1)
9511 goto keep;
9512 }
9513
9514 eh->dyn_relocs = NULL;
9515
9516 keep: ;
9517 }
9518
9519 /* Finally, allocate space. */
9520 for (p = eh->dyn_relocs; p != NULL; p = p->next)
9521 {
9522 asection *sreloc = elf_section_data (p->sec)->sreloc;
9523 if (eh->elf.type == STT_GNU_IFUNC)
9524 sreloc = htab->elf.irelplt;
9525 sreloc->size += p->count * sizeof (Elf64_External_Rela);
9526 }
9527
9528 return TRUE;
9529 }
9530
9531 /* Called via elf_link_hash_traverse from ppc64_elf_size_dynamic_sections
9532 to set up space for global entry stubs. These are put in glink,
9533 after the branch table. */
9534
9535 static bfd_boolean
9536 size_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
9537 {
9538 struct bfd_link_info *info;
9539 struct ppc_link_hash_table *htab;
9540 struct plt_entry *pent;
9541 asection *s;
9542
9543 if (h->root.type == bfd_link_hash_indirect)
9544 return TRUE;
9545
9546 if (!h->pointer_equality_needed)
9547 return TRUE;
9548
9549 if (h->def_regular)
9550 return TRUE;
9551
9552 info = inf;
9553 htab = ppc_hash_table (info);
9554 if (htab == NULL)
9555 return FALSE;
9556
9557 s = htab->glink;
9558 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
9559 if (pent->plt.offset != (bfd_vma) -1
9560 && pent->addend == 0)
9561 {
9562 /* For ELFv2, if this symbol is not defined in a regular file
9563 and we are not generating a shared library or pie, then we
9564 need to define the symbol in the executable on a call stub.
9565 This is to avoid text relocations. */
9566 s->size = (s->size + 15) & -16;
9567 h->root.u.def.section = s;
9568 h->root.u.def.value = s->size;
9569 s->size += 16;
9570 break;
9571 }
9572 return TRUE;
9573 }
9574
9575 /* Set DF_TEXTREL if we find any dynamic relocs that apply to
9576 read-only sections. */
9577
9578 static bfd_boolean
9579 maybe_set_textrel (struct elf_link_hash_entry *h, void *info)
9580 {
9581 if (h->root.type == bfd_link_hash_indirect)
9582 return TRUE;
9583
9584 if (readonly_dynrelocs (h))
9585 {
9586 ((struct bfd_link_info *) info)->flags |= DF_TEXTREL;
9587
9588 /* Not an error, just cut short the traversal. */
9589 return FALSE;
9590 }
9591 return TRUE;
9592 }
9593
9594 /* Set the sizes of the dynamic sections. */
9595
9596 static bfd_boolean
9597 ppc64_elf_size_dynamic_sections (bfd *output_bfd,
9598 struct bfd_link_info *info)
9599 {
9600 struct ppc_link_hash_table *htab;
9601 bfd *dynobj;
9602 asection *s;
9603 bfd_boolean relocs;
9604 bfd *ibfd;
9605 struct got_entry *first_tlsld;
9606
9607 htab = ppc_hash_table (info);
9608 if (htab == NULL)
9609 return FALSE;
9610
9611 dynobj = htab->elf.dynobj;
9612 if (dynobj == NULL)
9613 abort ();
9614
9615 if (htab->elf.dynamic_sections_created)
9616 {
9617 /* Set the contents of the .interp section to the interpreter. */
9618 if (info->executable)
9619 {
9620 s = bfd_get_linker_section (dynobj, ".interp");
9621 if (s == NULL)
9622 abort ();
9623 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
9624 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
9625 }
9626 }
9627
9628 /* Set up .got offsets for local syms, and space for local dynamic
9629 relocs. */
9630 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9631 {
9632 struct got_entry **lgot_ents;
9633 struct got_entry **end_lgot_ents;
9634 struct plt_entry **local_plt;
9635 struct plt_entry **end_local_plt;
9636 unsigned char *lgot_masks;
9637 bfd_size_type locsymcount;
9638 Elf_Internal_Shdr *symtab_hdr;
9639
9640 if (!is_ppc64_elf (ibfd))
9641 continue;
9642
9643 for (s = ibfd->sections; s != NULL; s = s->next)
9644 {
9645 struct ppc_dyn_relocs *p;
9646
9647 for (p = elf_section_data (s)->local_dynrel; p != NULL; p = p->next)
9648 {
9649 if (!bfd_is_abs_section (p->sec)
9650 && bfd_is_abs_section (p->sec->output_section))
9651 {
9652 /* Input section has been discarded, either because
9653 it is a copy of a linkonce section or due to
9654 linker script /DISCARD/, so we'll be discarding
9655 the relocs too. */
9656 }
9657 else if (p->count != 0)
9658 {
9659 asection *srel = elf_section_data (p->sec)->sreloc;
9660 if (p->ifunc)
9661 srel = htab->elf.irelplt;
9662 srel->size += p->count * sizeof (Elf64_External_Rela);
9663 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
9664 info->flags |= DF_TEXTREL;
9665 }
9666 }
9667 }
9668
9669 lgot_ents = elf_local_got_ents (ibfd);
9670 if (!lgot_ents)
9671 continue;
9672
9673 symtab_hdr = &elf_symtab_hdr (ibfd);
9674 locsymcount = symtab_hdr->sh_info;
9675 end_lgot_ents = lgot_ents + locsymcount;
9676 local_plt = (struct plt_entry **) end_lgot_ents;
9677 end_local_plt = local_plt + locsymcount;
9678 lgot_masks = (unsigned char *) end_local_plt;
9679 s = ppc64_elf_tdata (ibfd)->got;
9680 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
9681 {
9682 struct got_entry **pent, *ent;
9683
9684 pent = lgot_ents;
9685 while ((ent = *pent) != NULL)
9686 if (ent->got.refcount > 0)
9687 {
9688 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
9689 {
9690 ppc64_tlsld_got (ibfd)->got.refcount += 1;
9691 *pent = ent->next;
9692 }
9693 else
9694 {
9695 unsigned int ent_size = 8;
9696 unsigned int rel_size = sizeof (Elf64_External_Rela);
9697
9698 ent->got.offset = s->size;
9699 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
9700 {
9701 ent_size *= 2;
9702 rel_size *= 2;
9703 }
9704 s->size += ent_size;
9705 if ((*lgot_masks & PLT_IFUNC) != 0)
9706 {
9707 htab->elf.irelplt->size += rel_size;
9708 htab->got_reli_size += rel_size;
9709 }
9710 else if (info->shared)
9711 {
9712 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9713 srel->size += rel_size;
9714 }
9715 pent = &ent->next;
9716 }
9717 }
9718 else
9719 *pent = ent->next;
9720 }
9721
9722 /* Allocate space for calls to local STT_GNU_IFUNC syms in .iplt. */
9723 for (; local_plt < end_local_plt; ++local_plt)
9724 {
9725 struct plt_entry *ent;
9726
9727 for (ent = *local_plt; ent != NULL; ent = ent->next)
9728 if (ent->plt.refcount > 0)
9729 {
9730 s = htab->elf.iplt;
9731 ent->plt.offset = s->size;
9732 s->size += PLT_ENTRY_SIZE (htab);
9733
9734 htab->elf.irelplt->size += sizeof (Elf64_External_Rela);
9735 }
9736 else
9737 ent->plt.offset = (bfd_vma) -1;
9738 }
9739 }
9740
9741 /* Allocate global sym .plt and .got entries, and space for global
9742 sym dynamic relocs. */
9743 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
9744 /* Stash the end of glink branch table. */
9745 if (htab->glink != NULL)
9746 htab->glink->rawsize = htab->glink->size;
9747
9748 if (!htab->opd_abi && !info->shared)
9749 elf_link_hash_traverse (&htab->elf, size_global_entry_stubs, info);
9750
9751 first_tlsld = NULL;
9752 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9753 {
9754 struct got_entry *ent;
9755
9756 if (!is_ppc64_elf (ibfd))
9757 continue;
9758
9759 ent = ppc64_tlsld_got (ibfd);
9760 if (ent->got.refcount > 0)
9761 {
9762 if (!htab->do_multi_toc && first_tlsld != NULL)
9763 {
9764 ent->is_indirect = TRUE;
9765 ent->got.ent = first_tlsld;
9766 }
9767 else
9768 {
9769 if (first_tlsld == NULL)
9770 first_tlsld = ent;
9771 s = ppc64_elf_tdata (ibfd)->got;
9772 ent->got.offset = s->size;
9773 ent->owner = ibfd;
9774 s->size += 16;
9775 if (info->shared)
9776 {
9777 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
9778 srel->size += sizeof (Elf64_External_Rela);
9779 }
9780 }
9781 }
9782 else
9783 ent->got.offset = (bfd_vma) -1;
9784 }
9785
9786 /* We now have determined the sizes of the various dynamic sections.
9787 Allocate memory for them. */
9788 relocs = FALSE;
9789 for (s = dynobj->sections; s != NULL; s = s->next)
9790 {
9791 if ((s->flags & SEC_LINKER_CREATED) == 0)
9792 continue;
9793
9794 if (s == htab->brlt || s == htab->relbrlt)
9795 /* These haven't been allocated yet; don't strip. */
9796 continue;
9797 else if (s == htab->elf.sgot
9798 || s == htab->elf.splt
9799 || s == htab->elf.iplt
9800 || s == htab->glink
9801 || s == htab->dynbss)
9802 {
9803 /* Strip this section if we don't need it; see the
9804 comment below. */
9805 }
9806 else if (s == htab->glink_eh_frame)
9807 {
9808 if (!bfd_is_abs_section (s->output_section))
9809 /* Not sized yet. */
9810 continue;
9811 }
9812 else if (CONST_STRNEQ (s->name, ".rela"))
9813 {
9814 if (s->size != 0)
9815 {
9816 if (s != htab->elf.srelplt)
9817 relocs = TRUE;
9818
9819 /* We use the reloc_count field as a counter if we need
9820 to copy relocs into the output file. */
9821 s->reloc_count = 0;
9822 }
9823 }
9824 else
9825 {
9826 /* It's not one of our sections, so don't allocate space. */
9827 continue;
9828 }
9829
9830 if (s->size == 0)
9831 {
9832 /* If we don't need this section, strip it from the
9833 output file. This is mostly to handle .rela.bss and
9834 .rela.plt. We must create both sections in
9835 create_dynamic_sections, because they must be created
9836 before the linker maps input sections to output
9837 sections. The linker does that before
9838 adjust_dynamic_symbol is called, and it is that
9839 function which decides whether anything needs to go
9840 into these sections. */
9841 s->flags |= SEC_EXCLUDE;
9842 continue;
9843 }
9844
9845 if ((s->flags & SEC_HAS_CONTENTS) == 0)
9846 continue;
9847
9848 /* Allocate memory for the section contents. We use bfd_zalloc
9849 here in case unused entries are not reclaimed before the
9850 section's contents are written out. This should not happen,
9851 but this way if it does we get a R_PPC64_NONE reloc in .rela
9852 sections instead of garbage.
9853 We also rely on the section contents being zero when writing
9854 the GOT. */
9855 s->contents = bfd_zalloc (dynobj, s->size);
9856 if (s->contents == NULL)
9857 return FALSE;
9858 }
9859
9860 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
9861 {
9862 if (!is_ppc64_elf (ibfd))
9863 continue;
9864
9865 s = ppc64_elf_tdata (ibfd)->got;
9866 if (s != NULL && s != htab->elf.sgot)
9867 {
9868 if (s->size == 0)
9869 s->flags |= SEC_EXCLUDE;
9870 else
9871 {
9872 s->contents = bfd_zalloc (ibfd, s->size);
9873 if (s->contents == NULL)
9874 return FALSE;
9875 }
9876 }
9877 s = ppc64_elf_tdata (ibfd)->relgot;
9878 if (s != NULL)
9879 {
9880 if (s->size == 0)
9881 s->flags |= SEC_EXCLUDE;
9882 else
9883 {
9884 s->contents = bfd_zalloc (ibfd, s->size);
9885 if (s->contents == NULL)
9886 return FALSE;
9887 relocs = TRUE;
9888 s->reloc_count = 0;
9889 }
9890 }
9891 }
9892
9893 if (htab->elf.dynamic_sections_created)
9894 {
9895 bfd_boolean tls_opt;
9896
9897 /* Add some entries to the .dynamic section. We fill in the
9898 values later, in ppc64_elf_finish_dynamic_sections, but we
9899 must add the entries now so that we get the correct size for
9900 the .dynamic section. The DT_DEBUG entry is filled in by the
9901 dynamic linker and used by the debugger. */
9902 #define add_dynamic_entry(TAG, VAL) \
9903 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
9904
9905 if (info->executable)
9906 {
9907 if (!add_dynamic_entry (DT_DEBUG, 0))
9908 return FALSE;
9909 }
9910
9911 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
9912 {
9913 if (!add_dynamic_entry (DT_PLTGOT, 0)
9914 || !add_dynamic_entry (DT_PLTRELSZ, 0)
9915 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
9916 || !add_dynamic_entry (DT_JMPREL, 0)
9917 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
9918 return FALSE;
9919 }
9920
9921 if (NO_OPD_RELOCS && abiversion (output_bfd) <= 1)
9922 {
9923 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
9924 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
9925 return FALSE;
9926 }
9927
9928 tls_opt = (!htab->no_tls_get_addr_opt
9929 && htab->tls_get_addr_fd != NULL
9930 && htab->tls_get_addr_fd->elf.plt.plist != NULL);
9931 if (tls_opt || !htab->opd_abi)
9932 {
9933 if (!add_dynamic_entry (DT_PPC64_OPT, tls_opt ? PPC64_OPT_TLS : 0))
9934 return FALSE;
9935 }
9936
9937 if (relocs)
9938 {
9939 if (!add_dynamic_entry (DT_RELA, 0)
9940 || !add_dynamic_entry (DT_RELASZ, 0)
9941 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
9942 return FALSE;
9943
9944 /* If any dynamic relocs apply to a read-only section,
9945 then we need a DT_TEXTREL entry. */
9946 if ((info->flags & DF_TEXTREL) == 0)
9947 elf_link_hash_traverse (&htab->elf, maybe_set_textrel, info);
9948
9949 if ((info->flags & DF_TEXTREL) != 0)
9950 {
9951 if (!add_dynamic_entry (DT_TEXTREL, 0))
9952 return FALSE;
9953 }
9954 }
9955 }
9956 #undef add_dynamic_entry
9957
9958 return TRUE;
9959 }
9960
9961 /* Return TRUE if symbol should be hashed in the `.gnu.hash' section. */
9962
9963 static bfd_boolean
9964 ppc64_elf_hash_symbol (struct elf_link_hash_entry *h)
9965 {
9966 if (h->plt.plist != NULL
9967 && !h->def_regular
9968 && !h->pointer_equality_needed)
9969 return FALSE;
9970
9971 return _bfd_elf_hash_symbol (h);
9972 }
9973
9974 /* Determine the type of stub needed, if any, for a call. */
9975
9976 static inline enum ppc_stub_type
9977 ppc_type_of_stub (asection *input_sec,
9978 const Elf_Internal_Rela *rel,
9979 struct ppc_link_hash_entry **hash,
9980 struct plt_entry **plt_ent,
9981 bfd_vma destination,
9982 unsigned long local_off)
9983 {
9984 struct ppc_link_hash_entry *h = *hash;
9985 bfd_vma location;
9986 bfd_vma branch_offset;
9987 bfd_vma max_branch_offset;
9988 enum elf_ppc64_reloc_type r_type;
9989
9990 if (h != NULL)
9991 {
9992 struct plt_entry *ent;
9993 struct ppc_link_hash_entry *fdh = h;
9994 if (h->oh != NULL
9995 && h->oh->is_func_descriptor)
9996 {
9997 fdh = ppc_follow_link (h->oh);
9998 *hash = fdh;
9999 }
10000
10001 for (ent = fdh->elf.plt.plist; ent != NULL; ent = ent->next)
10002 if (ent->addend == rel->r_addend
10003 && ent->plt.offset != (bfd_vma) -1)
10004 {
10005 *plt_ent = ent;
10006 return ppc_stub_plt_call;
10007 }
10008
10009 /* Here, we know we don't have a plt entry. If we don't have a
10010 either a defined function descriptor or a defined entry symbol
10011 in a regular object file, then it is pointless trying to make
10012 any other type of stub. */
10013 if (!is_static_defined (&fdh->elf)
10014 && !is_static_defined (&h->elf))
10015 return ppc_stub_none;
10016 }
10017 else if (elf_local_got_ents (input_sec->owner) != NULL)
10018 {
10019 Elf_Internal_Shdr *symtab_hdr = &elf_symtab_hdr (input_sec->owner);
10020 struct plt_entry **local_plt = (struct plt_entry **)
10021 elf_local_got_ents (input_sec->owner) + symtab_hdr->sh_info;
10022 unsigned long r_symndx = ELF64_R_SYM (rel->r_info);
10023
10024 if (local_plt[r_symndx] != NULL)
10025 {
10026 struct plt_entry *ent;
10027
10028 for (ent = local_plt[r_symndx]; ent != NULL; ent = ent->next)
10029 if (ent->addend == rel->r_addend
10030 && ent->plt.offset != (bfd_vma) -1)
10031 {
10032 *plt_ent = ent;
10033 return ppc_stub_plt_call;
10034 }
10035 }
10036 }
10037
10038 /* Determine where the call point is. */
10039 location = (input_sec->output_offset
10040 + input_sec->output_section->vma
10041 + rel->r_offset);
10042
10043 branch_offset = destination - location;
10044 r_type = ELF64_R_TYPE (rel->r_info);
10045
10046 /* Determine if a long branch stub is needed. */
10047 max_branch_offset = 1 << 25;
10048 if (r_type != R_PPC64_REL24)
10049 max_branch_offset = 1 << 15;
10050
10051 if (branch_offset + max_branch_offset >= 2 * max_branch_offset - local_off)
10052 /* We need a stub. Figure out whether a long_branch or plt_branch
10053 is needed later. */
10054 return ppc_stub_long_branch;
10055
10056 return ppc_stub_none;
10057 }
10058
10059 /* With power7 weakly ordered memory model, it is possible for ld.so
10060 to update a plt entry in one thread and have another thread see a
10061 stale zero toc entry. To avoid this we need some sort of acquire
10062 barrier in the call stub. One solution is to make the load of the
10063 toc word seem to appear to depend on the load of the function entry
10064 word. Another solution is to test for r2 being zero, and branch to
10065 the appropriate glink entry if so.
10066
10067 . fake dep barrier compare
10068 . ld 12,xxx(2) ld 12,xxx(2)
10069 . mtctr 12 mtctr 12
10070 . xor 11,12,12 ld 2,xxx+8(2)
10071 . add 2,2,11 cmpldi 2,0
10072 . ld 2,xxx+8(2) bnectr+
10073 . bctr b <glink_entry>
10074
10075 The solution involving the compare turns out to be faster, so
10076 that's what we use unless the branch won't reach. */
10077
10078 #define ALWAYS_USE_FAKE_DEP 0
10079 #define ALWAYS_EMIT_R2SAVE 0
10080
10081 #define PPC_LO(v) ((v) & 0xffff)
10082 #define PPC_HI(v) (((v) >> 16) & 0xffff)
10083 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
10084
10085 static inline unsigned int
10086 plt_stub_size (struct ppc_link_hash_table *htab,
10087 struct ppc_stub_hash_entry *stub_entry,
10088 bfd_vma off)
10089 {
10090 unsigned size = 12;
10091
10092 if (ALWAYS_EMIT_R2SAVE
10093 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10094 size += 4;
10095 if (PPC_HA (off) != 0)
10096 size += 4;
10097 if (htab->opd_abi)
10098 {
10099 size += 4;
10100 if (htab->plt_static_chain)
10101 size += 4;
10102 if (htab->plt_thread_safe)
10103 size += 8;
10104 if (PPC_HA (off + 8 + 8 * htab->plt_static_chain) != PPC_HA (off))
10105 size += 4;
10106 }
10107 if (stub_entry->h != NULL
10108 && (stub_entry->h == htab->tls_get_addr_fd
10109 || stub_entry->h == htab->tls_get_addr)
10110 && !htab->no_tls_get_addr_opt)
10111 size += 13 * 4;
10112 return size;
10113 }
10114
10115 /* If this stub would cross fewer 2**plt_stub_align boundaries if we align,
10116 then return the padding needed to do so. */
10117 static inline unsigned int
10118 plt_stub_pad (struct ppc_link_hash_table *htab,
10119 struct ppc_stub_hash_entry *stub_entry,
10120 bfd_vma plt_off)
10121 {
10122 int stub_align = 1 << htab->plt_stub_align;
10123 unsigned stub_size = plt_stub_size (htab, stub_entry, plt_off);
10124 bfd_vma stub_off = stub_entry->stub_sec->size;
10125
10126 if (((stub_off + stub_size - 1) & -stub_align) - (stub_off & -stub_align)
10127 > (stub_size & -stub_align))
10128 return stub_align - (stub_off & (stub_align - 1));
10129 return 0;
10130 }
10131
10132 /* Build a .plt call stub. */
10133
10134 static inline bfd_byte *
10135 build_plt_stub (struct ppc_link_hash_table *htab,
10136 struct ppc_stub_hash_entry *stub_entry,
10137 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10138 {
10139 bfd *obfd = htab->stub_bfd;
10140 bfd_boolean plt_load_toc = htab->opd_abi;
10141 bfd_boolean plt_static_chain = htab->plt_static_chain;
10142 bfd_boolean plt_thread_safe = htab->plt_thread_safe;
10143 bfd_boolean use_fake_dep = plt_thread_safe;
10144 bfd_vma cmp_branch_off = 0;
10145
10146 if (!ALWAYS_USE_FAKE_DEP
10147 && plt_load_toc
10148 && plt_thread_safe
10149 && !(stub_entry->h != NULL
10150 && (stub_entry->h == htab->tls_get_addr_fd
10151 || stub_entry->h == htab->tls_get_addr)
10152 && !htab->no_tls_get_addr_opt))
10153 {
10154 bfd_vma pltoff = stub_entry->plt_ent->plt.offset & ~1;
10155 bfd_vma pltindex = ((pltoff - PLT_INITIAL_ENTRY_SIZE (htab))
10156 / PLT_ENTRY_SIZE (htab));
10157 bfd_vma glinkoff = GLINK_CALL_STUB_SIZE + pltindex * 8;
10158 bfd_vma to, from;
10159
10160 if (pltindex > 32768)
10161 glinkoff += (pltindex - 32768) * 4;
10162 to = (glinkoff
10163 + htab->glink->output_offset
10164 + htab->glink->output_section->vma);
10165 from = (p - stub_entry->stub_sec->contents
10166 + 4 * (ALWAYS_EMIT_R2SAVE
10167 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10168 + 4 * (PPC_HA (offset) != 0)
10169 + 4 * (PPC_HA (offset + 8 + 8 * plt_static_chain)
10170 != PPC_HA (offset))
10171 + 4 * (plt_static_chain != 0)
10172 + 20
10173 + stub_entry->stub_sec->output_offset
10174 + stub_entry->stub_sec->output_section->vma);
10175 cmp_branch_off = to - from;
10176 use_fake_dep = cmp_branch_off + (1 << 25) >= (1 << 26);
10177 }
10178
10179 if (PPC_HA (offset) != 0)
10180 {
10181 if (r != NULL)
10182 {
10183 if (ALWAYS_EMIT_R2SAVE
10184 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10185 r[0].r_offset += 4;
10186 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10187 r[1].r_offset = r[0].r_offset + 4;
10188 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10189 r[1].r_addend = r[0].r_addend;
10190 if (plt_load_toc)
10191 {
10192 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10193 {
10194 r[2].r_offset = r[1].r_offset + 4;
10195 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO);
10196 r[2].r_addend = r[0].r_addend;
10197 }
10198 else
10199 {
10200 r[2].r_offset = r[1].r_offset + 8 + 8 * use_fake_dep;
10201 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10202 r[2].r_addend = r[0].r_addend + 8;
10203 if (plt_static_chain)
10204 {
10205 r[3].r_offset = r[2].r_offset + 4;
10206 r[3].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10207 r[3].r_addend = r[0].r_addend + 16;
10208 }
10209 }
10210 }
10211 }
10212 if (ALWAYS_EMIT_R2SAVE
10213 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10214 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10215 bfd_put_32 (obfd, ADDIS_R11_R2 | PPC_HA (offset), p), p += 4;
10216 bfd_put_32 (obfd, LD_R12_0R11 | PPC_LO (offset), p), p += 4;
10217 if (plt_load_toc
10218 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10219 {
10220 bfd_put_32 (obfd, ADDI_R11_R11 | PPC_LO (offset), p), p += 4;
10221 offset = 0;
10222 }
10223 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10224 if (plt_load_toc)
10225 {
10226 if (use_fake_dep)
10227 {
10228 bfd_put_32 (obfd, XOR_R2_R12_R12, p), p += 4;
10229 bfd_put_32 (obfd, ADD_R11_R11_R2, p), p += 4;
10230 }
10231 bfd_put_32 (obfd, LD_R2_0R11 | PPC_LO (offset + 8), p), p += 4;
10232 if (plt_static_chain)
10233 bfd_put_32 (obfd, LD_R11_0R11 | PPC_LO (offset + 16), p), p += 4;
10234 }
10235 }
10236 else
10237 {
10238 if (r != NULL)
10239 {
10240 if (ALWAYS_EMIT_R2SAVE
10241 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10242 r[0].r_offset += 4;
10243 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10244 if (plt_load_toc)
10245 {
10246 if (PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10247 {
10248 r[1].r_offset = r[0].r_offset + 4;
10249 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16);
10250 r[1].r_addend = r[0].r_addend;
10251 }
10252 else
10253 {
10254 r[1].r_offset = r[0].r_offset + 8 + 8 * use_fake_dep;
10255 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10256 r[1].r_addend = r[0].r_addend + 8 + 8 * plt_static_chain;
10257 if (plt_static_chain)
10258 {
10259 r[2].r_offset = r[1].r_offset + 4;
10260 r[2].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10261 r[2].r_addend = r[0].r_addend + 8;
10262 }
10263 }
10264 }
10265 }
10266 if (ALWAYS_EMIT_R2SAVE
10267 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10268 bfd_put_32 (obfd, STD_R2_0R1 + STK_TOC (htab), p), p += 4;
10269 bfd_put_32 (obfd, LD_R12_0R2 | PPC_LO (offset), p), p += 4;
10270 if (plt_load_toc
10271 && PPC_HA (offset + 8 + 8 * plt_static_chain) != PPC_HA (offset))
10272 {
10273 bfd_put_32 (obfd, ADDI_R2_R2 | PPC_LO (offset), p), p += 4;
10274 offset = 0;
10275 }
10276 bfd_put_32 (obfd, MTCTR_R12, p), p += 4;
10277 if (plt_load_toc)
10278 {
10279 if (use_fake_dep)
10280 {
10281 bfd_put_32 (obfd, XOR_R11_R12_R12, p), p += 4;
10282 bfd_put_32 (obfd, ADD_R2_R2_R11, p), p += 4;
10283 }
10284 if (plt_static_chain)
10285 bfd_put_32 (obfd, LD_R11_0R2 | PPC_LO (offset + 16), p), p += 4;
10286 bfd_put_32 (obfd, LD_R2_0R2 | PPC_LO (offset + 8), p), p += 4;
10287 }
10288 }
10289 if (plt_load_toc && plt_thread_safe && !use_fake_dep)
10290 {
10291 bfd_put_32 (obfd, CMPLDI_R2_0, p), p += 4;
10292 bfd_put_32 (obfd, BNECTR_P4, p), p += 4;
10293 bfd_put_32 (obfd, B_DOT | (cmp_branch_off & 0x3fffffc), p), p += 4;
10294 }
10295 else
10296 bfd_put_32 (obfd, BCTR, p), p += 4;
10297 return p;
10298 }
10299
10300 /* Build a special .plt call stub for __tls_get_addr. */
10301
10302 #define LD_R11_0R3 0xe9630000
10303 #define LD_R12_0R3 0xe9830000
10304 #define MR_R0_R3 0x7c601b78
10305 #define CMPDI_R11_0 0x2c2b0000
10306 #define ADD_R3_R12_R13 0x7c6c6a14
10307 #define BEQLR 0x4d820020
10308 #define MR_R3_R0 0x7c030378
10309 #define STD_R11_0R1 0xf9610000
10310 #define BCTRL 0x4e800421
10311 #define LD_R11_0R1 0xe9610000
10312 #define MTLR_R11 0x7d6803a6
10313
10314 static inline bfd_byte *
10315 build_tls_get_addr_stub (struct ppc_link_hash_table *htab,
10316 struct ppc_stub_hash_entry *stub_entry,
10317 bfd_byte *p, bfd_vma offset, Elf_Internal_Rela *r)
10318 {
10319 bfd *obfd = htab->stub_bfd;
10320
10321 bfd_put_32 (obfd, LD_R11_0R3 + 0, p), p += 4;
10322 bfd_put_32 (obfd, LD_R12_0R3 + 8, p), p += 4;
10323 bfd_put_32 (obfd, MR_R0_R3, p), p += 4;
10324 bfd_put_32 (obfd, CMPDI_R11_0, p), p += 4;
10325 bfd_put_32 (obfd, ADD_R3_R12_R13, p), p += 4;
10326 bfd_put_32 (obfd, BEQLR, p), p += 4;
10327 bfd_put_32 (obfd, MR_R3_R0, p), p += 4;
10328 bfd_put_32 (obfd, MFLR_R11, p), p += 4;
10329 bfd_put_32 (obfd, STD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10330
10331 if (r != NULL)
10332 r[0].r_offset += 9 * 4;
10333 p = build_plt_stub (htab, stub_entry, p, offset, r);
10334 bfd_put_32 (obfd, BCTRL, p - 4);
10335
10336 bfd_put_32 (obfd, LD_R11_0R1 + STK_LINKER (htab), p), p += 4;
10337 bfd_put_32 (obfd, LD_R2_0R1 + STK_TOC (htab), p), p += 4;
10338 bfd_put_32 (obfd, MTLR_R11, p), p += 4;
10339 bfd_put_32 (obfd, BLR, p), p += 4;
10340
10341 return p;
10342 }
10343
10344 static Elf_Internal_Rela *
10345 get_relocs (asection *sec, int count)
10346 {
10347 Elf_Internal_Rela *relocs;
10348 struct bfd_elf_section_data *elfsec_data;
10349
10350 elfsec_data = elf_section_data (sec);
10351 relocs = elfsec_data->relocs;
10352 if (relocs == NULL)
10353 {
10354 bfd_size_type relsize;
10355 relsize = sec->reloc_count * sizeof (*relocs);
10356 relocs = bfd_alloc (sec->owner, relsize);
10357 if (relocs == NULL)
10358 return NULL;
10359 elfsec_data->relocs = relocs;
10360 elfsec_data->rela.hdr = bfd_zalloc (sec->owner,
10361 sizeof (Elf_Internal_Shdr));
10362 if (elfsec_data->rela.hdr == NULL)
10363 return NULL;
10364 elfsec_data->rela.hdr->sh_size = (sec->reloc_count
10365 * sizeof (Elf64_External_Rela));
10366 elfsec_data->rela.hdr->sh_entsize = sizeof (Elf64_External_Rela);
10367 sec->reloc_count = 0;
10368 }
10369 relocs += sec->reloc_count;
10370 sec->reloc_count += count;
10371 return relocs;
10372 }
10373
10374 static bfd_vma
10375 get_r2off (struct bfd_link_info *info,
10376 struct ppc_stub_hash_entry *stub_entry)
10377 {
10378 struct ppc_link_hash_table *htab = ppc_hash_table (info);
10379 bfd_vma r2off = htab->stub_group[stub_entry->target_section->id].toc_off;
10380
10381 if (r2off == 0)
10382 {
10383 /* Support linking -R objects. Get the toc pointer from the
10384 opd entry. */
10385 char buf[8];
10386 if (!htab->opd_abi)
10387 return r2off;
10388 asection *opd = stub_entry->h->elf.root.u.def.section;
10389 bfd_vma opd_off = stub_entry->h->elf.root.u.def.value;
10390
10391 if (strcmp (opd->name, ".opd") != 0
10392 || opd->reloc_count != 0)
10393 {
10394 info->callbacks->einfo (_("%P: cannot find opd entry toc for `%T'\n"),
10395 stub_entry->h->elf.root.root.string);
10396 bfd_set_error (bfd_error_bad_value);
10397 return 0;
10398 }
10399 if (!bfd_get_section_contents (opd->owner, opd, buf, opd_off + 8, 8))
10400 return 0;
10401 r2off = bfd_get_64 (opd->owner, buf);
10402 r2off -= elf_gp (info->output_bfd);
10403 }
10404 r2off -= htab->stub_group[stub_entry->id_sec->id].toc_off;
10405 return r2off;
10406 }
10407
10408 static bfd_boolean
10409 ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10410 {
10411 struct ppc_stub_hash_entry *stub_entry;
10412 struct ppc_branch_hash_entry *br_entry;
10413 struct bfd_link_info *info;
10414 struct ppc_link_hash_table *htab;
10415 bfd_byte *loc;
10416 bfd_byte *p;
10417 bfd_vma dest, off;
10418 int size;
10419 Elf_Internal_Rela *r;
10420 asection *plt;
10421
10422 /* Massage our args to the form they really have. */
10423 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10424 info = in_arg;
10425
10426 htab = ppc_hash_table (info);
10427 if (htab == NULL)
10428 return FALSE;
10429
10430 /* Make a note of the offset within the stubs for this entry. */
10431 stub_entry->stub_offset = stub_entry->stub_sec->size;
10432 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
10433
10434 htab->stub_count[stub_entry->stub_type - 1] += 1;
10435 switch (stub_entry->stub_type)
10436 {
10437 case ppc_stub_long_branch:
10438 case ppc_stub_long_branch_r2off:
10439 /* Branches are relative. This is where we are going to. */
10440 dest = (stub_entry->target_value
10441 + stub_entry->target_section->output_offset
10442 + stub_entry->target_section->output_section->vma);
10443 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10444 off = dest;
10445
10446 /* And this is where we are coming from. */
10447 off -= (stub_entry->stub_offset
10448 + stub_entry->stub_sec->output_offset
10449 + stub_entry->stub_sec->output_section->vma);
10450
10451 size = 4;
10452 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10453 {
10454 bfd_vma r2off = get_r2off (info, stub_entry);
10455
10456 if (r2off == 0)
10457 {
10458 htab->stub_error = TRUE;
10459 return FALSE;
10460 }
10461 bfd_put_32 (htab->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10462 loc += 4;
10463 size = 12;
10464 if (PPC_HA (r2off) != 0)
10465 {
10466 size = 16;
10467 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10468 loc += 4;
10469 }
10470 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10471 loc += 4;
10472 off -= size - 4;
10473 }
10474 bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
10475
10476 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
10477 {
10478 info->callbacks->einfo
10479 (_("%P: long branch stub `%s' offset overflow\n"),
10480 stub_entry->root.string);
10481 htab->stub_error = TRUE;
10482 return FALSE;
10483 }
10484
10485 if (info->emitrelocations)
10486 {
10487 r = get_relocs (stub_entry->stub_sec, 1);
10488 if (r == NULL)
10489 return FALSE;
10490 r->r_offset = loc - stub_entry->stub_sec->contents;
10491 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
10492 r->r_addend = dest;
10493 if (stub_entry->h != NULL)
10494 {
10495 struct elf_link_hash_entry **hashes;
10496 unsigned long symndx;
10497 struct ppc_link_hash_entry *h;
10498
10499 hashes = elf_sym_hashes (htab->stub_bfd);
10500 if (hashes == NULL)
10501 {
10502 bfd_size_type hsize;
10503
10504 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
10505 hashes = bfd_zalloc (htab->stub_bfd, hsize);
10506 if (hashes == NULL)
10507 return FALSE;
10508 elf_sym_hashes (htab->stub_bfd) = hashes;
10509 htab->stub_globals = 1;
10510 }
10511 symndx = htab->stub_globals++;
10512 h = stub_entry->h;
10513 hashes[symndx] = &h->elf;
10514 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
10515 if (h->oh != NULL && h->oh->is_func)
10516 h = ppc_follow_link (h->oh);
10517 if (h->elf.root.u.def.section != stub_entry->target_section)
10518 /* H is an opd symbol. The addend must be zero. */
10519 r->r_addend = 0;
10520 else
10521 {
10522 off = (h->elf.root.u.def.value
10523 + h->elf.root.u.def.section->output_offset
10524 + h->elf.root.u.def.section->output_section->vma);
10525 r->r_addend -= off;
10526 }
10527 }
10528 }
10529 break;
10530
10531 case ppc_stub_plt_branch:
10532 case ppc_stub_plt_branch_r2off:
10533 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10534 stub_entry->root.string + 9,
10535 FALSE, FALSE);
10536 if (br_entry == NULL)
10537 {
10538 info->callbacks->einfo (_("%P: can't find branch stub `%s'\n"),
10539 stub_entry->root.string);
10540 htab->stub_error = TRUE;
10541 return FALSE;
10542 }
10543
10544 dest = (stub_entry->target_value
10545 + stub_entry->target_section->output_offset
10546 + stub_entry->target_section->output_section->vma);
10547 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10548 dest += PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10549
10550 bfd_put_64 (htab->brlt->owner, dest,
10551 htab->brlt->contents + br_entry->offset);
10552
10553 if (br_entry->iter == htab->stub_iteration)
10554 {
10555 br_entry->iter = 0;
10556
10557 if (htab->relbrlt != NULL)
10558 {
10559 /* Create a reloc for the branch lookup table entry. */
10560 Elf_Internal_Rela rela;
10561 bfd_byte *rl;
10562
10563 rela.r_offset = (br_entry->offset
10564 + htab->brlt->output_offset
10565 + htab->brlt->output_section->vma);
10566 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10567 rela.r_addend = dest;
10568
10569 rl = htab->relbrlt->contents;
10570 rl += (htab->relbrlt->reloc_count++
10571 * sizeof (Elf64_External_Rela));
10572 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
10573 }
10574 else if (info->emitrelocations)
10575 {
10576 r = get_relocs (htab->brlt, 1);
10577 if (r == NULL)
10578 return FALSE;
10579 /* brlt, being SEC_LINKER_CREATED does not go through the
10580 normal reloc processing. Symbols and offsets are not
10581 translated from input file to output file form, so
10582 set up the offset per the output file. */
10583 r->r_offset = (br_entry->offset
10584 + htab->brlt->output_offset
10585 + htab->brlt->output_section->vma);
10586 r->r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
10587 r->r_addend = dest;
10588 }
10589 }
10590
10591 dest = (br_entry->offset
10592 + htab->brlt->output_offset
10593 + htab->brlt->output_section->vma);
10594
10595 off = (dest
10596 - elf_gp (htab->brlt->output_section->owner)
10597 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10598
10599 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10600 {
10601 info->callbacks->einfo
10602 (_("%P: linkage table error against `%T'\n"),
10603 stub_entry->root.string);
10604 bfd_set_error (bfd_error_bad_value);
10605 htab->stub_error = TRUE;
10606 return FALSE;
10607 }
10608
10609 if (info->emitrelocations)
10610 {
10611 r = get_relocs (stub_entry->stub_sec, 1 + (PPC_HA (off) != 0));
10612 if (r == NULL)
10613 return FALSE;
10614 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10615 if (bfd_big_endian (info->output_bfd))
10616 r[0].r_offset += 2;
10617 if (stub_entry->stub_type == ppc_stub_plt_branch_r2off)
10618 r[0].r_offset += 4;
10619 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_DS);
10620 r[0].r_addend = dest;
10621 if (PPC_HA (off) != 0)
10622 {
10623 r[0].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_HA);
10624 r[1].r_offset = r[0].r_offset + 4;
10625 r[1].r_info = ELF64_R_INFO (0, R_PPC64_TOC16_LO_DS);
10626 r[1].r_addend = r[0].r_addend;
10627 }
10628 }
10629
10630 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10631 {
10632 if (PPC_HA (off) != 0)
10633 {
10634 size = 16;
10635 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
10636 loc += 4;
10637 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
10638 }
10639 else
10640 {
10641 size = 12;
10642 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10643 }
10644 }
10645 else
10646 {
10647 bfd_vma r2off = get_r2off (info, stub_entry);
10648
10649 if (r2off == 0 && htab->opd_abi)
10650 {
10651 htab->stub_error = TRUE;
10652 return FALSE;
10653 }
10654
10655 bfd_put_32 (htab->stub_bfd, STD_R2_0R1 + STK_TOC (htab), loc);
10656 loc += 4;
10657 size = 16;
10658 if (PPC_HA (off) != 0)
10659 {
10660 size += 4;
10661 bfd_put_32 (htab->stub_bfd, ADDIS_R11_R2 | PPC_HA (off), loc);
10662 loc += 4;
10663 bfd_put_32 (htab->stub_bfd, LD_R12_0R11 | PPC_LO (off), loc);
10664 }
10665 else
10666 bfd_put_32 (htab->stub_bfd, LD_R12_0R2 | PPC_LO (off), loc);
10667
10668 if (PPC_HA (r2off) != 0)
10669 {
10670 size += 4;
10671 loc += 4;
10672 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
10673 }
10674 if (PPC_LO (r2off) != 0)
10675 {
10676 size += 4;
10677 loc += 4;
10678 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
10679 }
10680 }
10681 loc += 4;
10682 bfd_put_32 (htab->stub_bfd, MTCTR_R12, loc);
10683 loc += 4;
10684 bfd_put_32 (htab->stub_bfd, BCTR, loc);
10685 break;
10686
10687 case ppc_stub_plt_call:
10688 case ppc_stub_plt_call_r2save:
10689 if (stub_entry->h != NULL
10690 && stub_entry->h->is_func_descriptor
10691 && stub_entry->h->oh != NULL)
10692 {
10693 struct ppc_link_hash_entry *fh = ppc_follow_link (stub_entry->h->oh);
10694
10695 /* If the old-ABI "dot-symbol" is undefined make it weak so
10696 we don't get a link error from RELOC_FOR_GLOBAL_SYMBOL.
10697 FIXME: We used to define the symbol on one of the call
10698 stubs instead, which is why we test symbol section id
10699 against htab->top_id in various places. Likely all
10700 these checks could now disappear. */
10701 if (fh->elf.root.type == bfd_link_hash_undefined)
10702 fh->elf.root.type = bfd_link_hash_undefweak;
10703 /* Stop undo_symbol_twiddle changing it back to undefined. */
10704 fh->was_undefined = 0;
10705 }
10706
10707 /* Now build the stub. */
10708 dest = stub_entry->plt_ent->plt.offset & ~1;
10709 if (dest >= (bfd_vma) -2)
10710 abort ();
10711
10712 plt = htab->elf.splt;
10713 if (!htab->elf.dynamic_sections_created
10714 || stub_entry->h == NULL
10715 || stub_entry->h->elf.dynindx == -1)
10716 plt = htab->elf.iplt;
10717
10718 dest += plt->output_offset + plt->output_section->vma;
10719
10720 if (stub_entry->h == NULL
10721 && (stub_entry->plt_ent->plt.offset & 1) == 0)
10722 {
10723 Elf_Internal_Rela rela;
10724 bfd_byte *rl;
10725
10726 rela.r_offset = dest;
10727 if (htab->opd_abi)
10728 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
10729 else
10730 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
10731 rela.r_addend = (stub_entry->target_value
10732 + stub_entry->target_section->output_offset
10733 + stub_entry->target_section->output_section->vma);
10734
10735 rl = (htab->elf.irelplt->contents
10736 + (htab->elf.irelplt->reloc_count++
10737 * sizeof (Elf64_External_Rela)));
10738 bfd_elf64_swap_reloca_out (info->output_bfd, &rela, rl);
10739 stub_entry->plt_ent->plt.offset |= 1;
10740 }
10741
10742 off = (dest
10743 - elf_gp (plt->output_section->owner)
10744 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10745
10746 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
10747 {
10748 info->callbacks->einfo
10749 (_("%P: linkage table error against `%T'\n"),
10750 stub_entry->h != NULL
10751 ? stub_entry->h->elf.root.root.string
10752 : "<local sym>");
10753 bfd_set_error (bfd_error_bad_value);
10754 htab->stub_error = TRUE;
10755 return FALSE;
10756 }
10757
10758 if (htab->plt_stub_align != 0)
10759 {
10760 unsigned pad = plt_stub_pad (htab, stub_entry, off);
10761
10762 stub_entry->stub_sec->size += pad;
10763 stub_entry->stub_offset = stub_entry->stub_sec->size;
10764 loc += pad;
10765 }
10766
10767 r = NULL;
10768 if (info->emitrelocations)
10769 {
10770 r = get_relocs (stub_entry->stub_sec,
10771 ((PPC_HA (off) != 0)
10772 + (htab->opd_abi
10773 ? 2 + (htab->plt_static_chain
10774 && PPC_HA (off + 16) == PPC_HA (off))
10775 : 1)));
10776 if (r == NULL)
10777 return FALSE;
10778 r[0].r_offset = loc - stub_entry->stub_sec->contents;
10779 if (bfd_big_endian (info->output_bfd))
10780 r[0].r_offset += 2;
10781 r[0].r_addend = dest;
10782 }
10783 if (stub_entry->h != NULL
10784 && (stub_entry->h == htab->tls_get_addr_fd
10785 || stub_entry->h == htab->tls_get_addr)
10786 && !htab->no_tls_get_addr_opt)
10787 p = build_tls_get_addr_stub (htab, stub_entry, loc, off, r);
10788 else
10789 p = build_plt_stub (htab, stub_entry, loc, off, r);
10790 size = p - loc;
10791 break;
10792
10793 default:
10794 BFD_FAIL ();
10795 return FALSE;
10796 }
10797
10798 stub_entry->stub_sec->size += size;
10799
10800 if (htab->emit_stub_syms)
10801 {
10802 struct elf_link_hash_entry *h;
10803 size_t len1, len2;
10804 char *name;
10805 const char *const stub_str[] = { "long_branch",
10806 "long_branch_r2off",
10807 "plt_branch",
10808 "plt_branch_r2off",
10809 "plt_call",
10810 "plt_call" };
10811
10812 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
10813 len2 = strlen (stub_entry->root.string);
10814 name = bfd_malloc (len1 + len2 + 2);
10815 if (name == NULL)
10816 return FALSE;
10817 memcpy (name, stub_entry->root.string, 9);
10818 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
10819 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
10820 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
10821 if (h == NULL)
10822 return FALSE;
10823 if (h->root.type == bfd_link_hash_new)
10824 {
10825 h->root.type = bfd_link_hash_defined;
10826 h->root.u.def.section = stub_entry->stub_sec;
10827 h->root.u.def.value = stub_entry->stub_offset;
10828 h->ref_regular = 1;
10829 h->def_regular = 1;
10830 h->ref_regular_nonweak = 1;
10831 h->forced_local = 1;
10832 h->non_elf = 0;
10833 }
10834 }
10835
10836 return TRUE;
10837 }
10838
10839 /* As above, but don't actually build the stub. Just bump offset so
10840 we know stub section sizes, and select plt_branch stubs where
10841 long_branch stubs won't do. */
10842
10843 static bfd_boolean
10844 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
10845 {
10846 struct ppc_stub_hash_entry *stub_entry;
10847 struct bfd_link_info *info;
10848 struct ppc_link_hash_table *htab;
10849 bfd_vma off;
10850 int size;
10851
10852 /* Massage our args to the form they really have. */
10853 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
10854 info = in_arg;
10855
10856 htab = ppc_hash_table (info);
10857 if (htab == NULL)
10858 return FALSE;
10859
10860 if (stub_entry->stub_type == ppc_stub_plt_call
10861 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
10862 {
10863 asection *plt;
10864 off = stub_entry->plt_ent->plt.offset & ~(bfd_vma) 1;
10865 if (off >= (bfd_vma) -2)
10866 abort ();
10867 plt = htab->elf.splt;
10868 if (!htab->elf.dynamic_sections_created
10869 || stub_entry->h == NULL
10870 || stub_entry->h->elf.dynindx == -1)
10871 plt = htab->elf.iplt;
10872 off += (plt->output_offset
10873 + plt->output_section->vma
10874 - elf_gp (plt->output_section->owner)
10875 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10876
10877 size = plt_stub_size (htab, stub_entry, off);
10878 if (htab->plt_stub_align)
10879 size += plt_stub_pad (htab, stub_entry, off);
10880 if (info->emitrelocations)
10881 {
10882 stub_entry->stub_sec->reloc_count
10883 += ((PPC_HA (off) != 0)
10884 + (htab->opd_abi
10885 ? 2 + (htab->plt_static_chain
10886 && PPC_HA (off + 16) == PPC_HA (off))
10887 : 1));
10888 stub_entry->stub_sec->flags |= SEC_RELOC;
10889 }
10890 }
10891 else
10892 {
10893 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
10894 variants. */
10895 bfd_vma r2off = 0;
10896 bfd_vma local_off = 0;
10897
10898 off = (stub_entry->target_value
10899 + stub_entry->target_section->output_offset
10900 + stub_entry->target_section->output_section->vma);
10901 off -= (stub_entry->stub_sec->size
10902 + stub_entry->stub_sec->output_offset
10903 + stub_entry->stub_sec->output_section->vma);
10904
10905 /* Reset the stub type from the plt variant in case we now
10906 can reach with a shorter stub. */
10907 if (stub_entry->stub_type >= ppc_stub_plt_branch)
10908 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
10909
10910 size = 4;
10911 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
10912 {
10913 r2off = get_r2off (info, stub_entry);
10914 if (r2off == 0 && htab->opd_abi)
10915 {
10916 htab->stub_error = TRUE;
10917 return FALSE;
10918 }
10919 size = 12;
10920 if (PPC_HA (r2off) != 0)
10921 size = 16;
10922 off -= size - 4;
10923 }
10924
10925 local_off = PPC64_LOCAL_ENTRY_OFFSET (stub_entry->other);
10926
10927 /* If the branch offset if too big, use a ppc_stub_plt_branch.
10928 Do the same for -R objects without function descriptors. */
10929 if (off + (1 << 25) >= (bfd_vma) (1 << 26) - local_off
10930 || (stub_entry->stub_type == ppc_stub_long_branch_r2off
10931 && r2off == 0))
10932 {
10933 struct ppc_branch_hash_entry *br_entry;
10934
10935 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
10936 stub_entry->root.string + 9,
10937 TRUE, FALSE);
10938 if (br_entry == NULL)
10939 {
10940 info->callbacks->einfo (_("%P: can't build branch stub `%s'\n"),
10941 stub_entry->root.string);
10942 htab->stub_error = TRUE;
10943 return FALSE;
10944 }
10945
10946 if (br_entry->iter != htab->stub_iteration)
10947 {
10948 br_entry->iter = htab->stub_iteration;
10949 br_entry->offset = htab->brlt->size;
10950 htab->brlt->size += 8;
10951
10952 if (htab->relbrlt != NULL)
10953 htab->relbrlt->size += sizeof (Elf64_External_Rela);
10954 else if (info->emitrelocations)
10955 {
10956 htab->brlt->reloc_count += 1;
10957 htab->brlt->flags |= SEC_RELOC;
10958 }
10959 }
10960
10961 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
10962 off = (br_entry->offset
10963 + htab->brlt->output_offset
10964 + htab->brlt->output_section->vma
10965 - elf_gp (htab->brlt->output_section->owner)
10966 - htab->stub_group[stub_entry->id_sec->id].toc_off);
10967
10968 if (info->emitrelocations)
10969 {
10970 stub_entry->stub_sec->reloc_count += 1 + (PPC_HA (off) != 0);
10971 stub_entry->stub_sec->flags |= SEC_RELOC;
10972 }
10973
10974 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
10975 {
10976 size = 12;
10977 if (PPC_HA (off) != 0)
10978 size = 16;
10979 }
10980 else
10981 {
10982 size = 16;
10983 if (PPC_HA (off) != 0)
10984 size += 4;
10985
10986 if (PPC_HA (r2off) != 0)
10987 size += 4;
10988 if (PPC_LO (r2off) != 0)
10989 size += 4;
10990 }
10991 }
10992 else if (info->emitrelocations)
10993 {
10994 stub_entry->stub_sec->reloc_count += 1;
10995 stub_entry->stub_sec->flags |= SEC_RELOC;
10996 }
10997 }
10998
10999 stub_entry->stub_sec->size += size;
11000 return TRUE;
11001 }
11002
11003 /* Set up various things so that we can make a list of input sections
11004 for each output section included in the link. Returns -1 on error,
11005 0 when no stubs will be needed, and 1 on success. */
11006
11007 int
11008 ppc64_elf_setup_section_lists
11009 (struct bfd_link_info *info,
11010 asection *(*add_stub_section) (const char *, asection *),
11011 void (*layout_sections_again) (void))
11012 {
11013 bfd *input_bfd;
11014 int top_id, top_index, id;
11015 asection *section;
11016 asection **input_list;
11017 bfd_size_type amt;
11018 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11019
11020 if (htab == NULL)
11021 return -1;
11022 /* Stash our params away. */
11023 htab->add_stub_section = add_stub_section;
11024 htab->layout_sections_again = layout_sections_again;
11025
11026 /* Find the top input section id. */
11027 for (input_bfd = info->input_bfds, top_id = 3;
11028 input_bfd != NULL;
11029 input_bfd = input_bfd->link_next)
11030 {
11031 for (section = input_bfd->sections;
11032 section != NULL;
11033 section = section->next)
11034 {
11035 if (top_id < section->id)
11036 top_id = section->id;
11037 }
11038 }
11039
11040 htab->top_id = top_id;
11041 amt = sizeof (struct map_stub) * (top_id + 1);
11042 htab->stub_group = bfd_zmalloc (amt);
11043 if (htab->stub_group == NULL)
11044 return -1;
11045
11046 /* Set toc_off for com, und, abs and ind sections. */
11047 for (id = 0; id < 3; id++)
11048 htab->stub_group[id].toc_off = TOC_BASE_OFF;
11049
11050 /* We can't use output_bfd->section_count here to find the top output
11051 section index as some sections may have been removed, and
11052 strip_excluded_output_sections doesn't renumber the indices. */
11053 for (section = info->output_bfd->sections, top_index = 0;
11054 section != NULL;
11055 section = section->next)
11056 {
11057 if (top_index < section->index)
11058 top_index = section->index;
11059 }
11060
11061 htab->top_index = top_index;
11062 amt = sizeof (asection *) * (top_index + 1);
11063 input_list = bfd_zmalloc (amt);
11064 htab->input_list = input_list;
11065 if (input_list == NULL)
11066 return -1;
11067
11068 return 1;
11069 }
11070
11071 /* Set up for first pass at multitoc partitioning. */
11072
11073 void
11074 ppc64_elf_start_multitoc_partition (struct bfd_link_info *info)
11075 {
11076 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11077
11078 htab->toc_curr = ppc64_elf_set_toc (info, info->output_bfd);
11079 htab->toc_bfd = NULL;
11080 htab->toc_first_sec = NULL;
11081 }
11082
11083 /* The linker repeatedly calls this function for each TOC input section
11084 and linker generated GOT section. Group input bfds such that the toc
11085 within a group is less than 64k in size. */
11086
11087 bfd_boolean
11088 ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
11089 {
11090 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11091 bfd_vma addr, off, limit;
11092
11093 if (htab == NULL)
11094 return FALSE;
11095
11096 if (!htab->second_toc_pass)
11097 {
11098 /* Keep track of the first .toc or .got section for this input bfd. */
11099 bfd_boolean new_bfd = htab->toc_bfd != isec->owner;
11100
11101 if (new_bfd)
11102 {
11103 htab->toc_bfd = isec->owner;
11104 htab->toc_first_sec = isec;
11105 }
11106
11107 addr = isec->output_offset + isec->output_section->vma;
11108 off = addr - htab->toc_curr;
11109 limit = 0x80008000;
11110 if (ppc64_elf_tdata (isec->owner)->has_small_toc_reloc)
11111 limit = 0x10000;
11112 if (off + isec->size > limit)
11113 {
11114 addr = (htab->toc_first_sec->output_offset
11115 + htab->toc_first_sec->output_section->vma);
11116 htab->toc_curr = addr;
11117 }
11118
11119 /* toc_curr is the base address of this toc group. Set elf_gp
11120 for the input section to be the offset relative to the
11121 output toc base plus 0x8000. Making the input elf_gp an
11122 offset allows us to move the toc as a whole without
11123 recalculating input elf_gp. */
11124 off = htab->toc_curr - elf_gp (isec->output_section->owner);
11125 off += TOC_BASE_OFF;
11126
11127 /* Die if someone uses a linker script that doesn't keep input
11128 file .toc and .got together. */
11129 if (new_bfd
11130 && elf_gp (isec->owner) != 0
11131 && elf_gp (isec->owner) != off)
11132 return FALSE;
11133
11134 elf_gp (isec->owner) = off;
11135 return TRUE;
11136 }
11137
11138 /* During the second pass toc_first_sec points to the start of
11139 a toc group, and toc_curr is used to track the old elf_gp.
11140 We use toc_bfd to ensure we only look at each bfd once. */
11141 if (htab->toc_bfd == isec->owner)
11142 return TRUE;
11143 htab->toc_bfd = isec->owner;
11144
11145 if (htab->toc_first_sec == NULL
11146 || htab->toc_curr != elf_gp (isec->owner))
11147 {
11148 htab->toc_curr = elf_gp (isec->owner);
11149 htab->toc_first_sec = isec;
11150 }
11151 addr = (htab->toc_first_sec->output_offset
11152 + htab->toc_first_sec->output_section->vma);
11153 off = addr - elf_gp (isec->output_section->owner) + TOC_BASE_OFF;
11154 elf_gp (isec->owner) = off;
11155
11156 return TRUE;
11157 }
11158
11159 /* Called via elf_link_hash_traverse to merge GOT entries for global
11160 symbol H. */
11161
11162 static bfd_boolean
11163 merge_global_got (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
11164 {
11165 if (h->root.type == bfd_link_hash_indirect)
11166 return TRUE;
11167
11168 merge_got_entries (&h->got.glist);
11169
11170 return TRUE;
11171 }
11172
11173 /* Called via elf_link_hash_traverse to allocate GOT entries for global
11174 symbol H. */
11175
11176 static bfd_boolean
11177 reallocate_got (struct elf_link_hash_entry *h, void *inf)
11178 {
11179 struct got_entry *gent;
11180
11181 if (h->root.type == bfd_link_hash_indirect)
11182 return TRUE;
11183
11184 for (gent = h->got.glist; gent != NULL; gent = gent->next)
11185 if (!gent->is_indirect)
11186 allocate_got (h, (struct bfd_link_info *) inf, gent);
11187 return TRUE;
11188 }
11189
11190 /* Called on the first multitoc pass after the last call to
11191 ppc64_elf_next_toc_section. This function removes duplicate GOT
11192 entries. */
11193
11194 bfd_boolean
11195 ppc64_elf_layout_multitoc (struct bfd_link_info *info)
11196 {
11197 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11198 struct bfd *ibfd, *ibfd2;
11199 bfd_boolean done_something;
11200
11201 htab->multi_toc_needed = htab->toc_curr != elf_gp (info->output_bfd);
11202
11203 if (!htab->do_multi_toc)
11204 return FALSE;
11205
11206 /* Merge global sym got entries within a toc group. */
11207 elf_link_hash_traverse (&htab->elf, merge_global_got, info);
11208
11209 /* And tlsld_got. */
11210 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11211 {
11212 struct got_entry *ent, *ent2;
11213
11214 if (!is_ppc64_elf (ibfd))
11215 continue;
11216
11217 ent = ppc64_tlsld_got (ibfd);
11218 if (!ent->is_indirect
11219 && ent->got.offset != (bfd_vma) -1)
11220 {
11221 for (ibfd2 = ibfd->link_next; ibfd2 != NULL; ibfd2 = ibfd2->link_next)
11222 {
11223 if (!is_ppc64_elf (ibfd2))
11224 continue;
11225
11226 ent2 = ppc64_tlsld_got (ibfd2);
11227 if (!ent2->is_indirect
11228 && ent2->got.offset != (bfd_vma) -1
11229 && elf_gp (ibfd2) == elf_gp (ibfd))
11230 {
11231 ent2->is_indirect = TRUE;
11232 ent2->got.ent = ent;
11233 }
11234 }
11235 }
11236 }
11237
11238 /* Zap sizes of got sections. */
11239 htab->elf.irelplt->rawsize = htab->elf.irelplt->size;
11240 htab->elf.irelplt->size -= htab->got_reli_size;
11241 htab->got_reli_size = 0;
11242
11243 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11244 {
11245 asection *got, *relgot;
11246
11247 if (!is_ppc64_elf (ibfd))
11248 continue;
11249
11250 got = ppc64_elf_tdata (ibfd)->got;
11251 if (got != NULL)
11252 {
11253 got->rawsize = got->size;
11254 got->size = 0;
11255 relgot = ppc64_elf_tdata (ibfd)->relgot;
11256 relgot->rawsize = relgot->size;
11257 relgot->size = 0;
11258 }
11259 }
11260
11261 /* Now reallocate the got, local syms first. We don't need to
11262 allocate section contents again since we never increase size. */
11263 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11264 {
11265 struct got_entry **lgot_ents;
11266 struct got_entry **end_lgot_ents;
11267 struct plt_entry **local_plt;
11268 struct plt_entry **end_local_plt;
11269 unsigned char *lgot_masks;
11270 bfd_size_type locsymcount;
11271 Elf_Internal_Shdr *symtab_hdr;
11272 asection *s;
11273
11274 if (!is_ppc64_elf (ibfd))
11275 continue;
11276
11277 lgot_ents = elf_local_got_ents (ibfd);
11278 if (!lgot_ents)
11279 continue;
11280
11281 symtab_hdr = &elf_symtab_hdr (ibfd);
11282 locsymcount = symtab_hdr->sh_info;
11283 end_lgot_ents = lgot_ents + locsymcount;
11284 local_plt = (struct plt_entry **) end_lgot_ents;
11285 end_local_plt = local_plt + locsymcount;
11286 lgot_masks = (unsigned char *) end_local_plt;
11287 s = ppc64_elf_tdata (ibfd)->got;
11288 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
11289 {
11290 struct got_entry *ent;
11291
11292 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
11293 {
11294 unsigned int ent_size = 8;
11295 unsigned int rel_size = sizeof (Elf64_External_Rela);
11296
11297 ent->got.offset = s->size;
11298 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
11299 {
11300 ent_size *= 2;
11301 rel_size *= 2;
11302 }
11303 s->size += ent_size;
11304 if ((*lgot_masks & PLT_IFUNC) != 0)
11305 {
11306 htab->elf.irelplt->size += rel_size;
11307 htab->got_reli_size += rel_size;
11308 }
11309 else if (info->shared)
11310 {
11311 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11312 srel->size += rel_size;
11313 }
11314 }
11315 }
11316 }
11317
11318 elf_link_hash_traverse (&htab->elf, reallocate_got, info);
11319
11320 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11321 {
11322 struct got_entry *ent;
11323
11324 if (!is_ppc64_elf (ibfd))
11325 continue;
11326
11327 ent = ppc64_tlsld_got (ibfd);
11328 if (!ent->is_indirect
11329 && ent->got.offset != (bfd_vma) -1)
11330 {
11331 asection *s = ppc64_elf_tdata (ibfd)->got;
11332 ent->got.offset = s->size;
11333 s->size += 16;
11334 if (info->shared)
11335 {
11336 asection *srel = ppc64_elf_tdata (ibfd)->relgot;
11337 srel->size += sizeof (Elf64_External_Rela);
11338 }
11339 }
11340 }
11341
11342 done_something = htab->elf.irelplt->rawsize != htab->elf.irelplt->size;
11343 if (!done_something)
11344 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
11345 {
11346 asection *got;
11347
11348 if (!is_ppc64_elf (ibfd))
11349 continue;
11350
11351 got = ppc64_elf_tdata (ibfd)->got;
11352 if (got != NULL)
11353 {
11354 done_something = got->rawsize != got->size;
11355 if (done_something)
11356 break;
11357 }
11358 }
11359
11360 if (done_something)
11361 (*htab->layout_sections_again) ();
11362
11363 /* Set up for second pass over toc sections to recalculate elf_gp
11364 on input sections. */
11365 htab->toc_bfd = NULL;
11366 htab->toc_first_sec = NULL;
11367 htab->second_toc_pass = TRUE;
11368 return done_something;
11369 }
11370
11371 /* Called after second pass of multitoc partitioning. */
11372
11373 void
11374 ppc64_elf_finish_multitoc_partition (struct bfd_link_info *info)
11375 {
11376 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11377
11378 /* After the second pass, toc_curr tracks the TOC offset used
11379 for code sections below in ppc64_elf_next_input_section. */
11380 htab->toc_curr = TOC_BASE_OFF;
11381 }
11382
11383 /* No toc references were found in ISEC. If the code in ISEC makes no
11384 calls, then there's no need to use toc adjusting stubs when branching
11385 into ISEC. Actually, indirect calls from ISEC are OK as they will
11386 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
11387 needed, and 2 if a cyclical call-graph was found but no other reason
11388 for a stub was detected. If called from the top level, a return of
11389 2 means the same as a return of 0. */
11390
11391 static int
11392 toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
11393 {
11394 int ret;
11395
11396 /* Mark this section as checked. */
11397 isec->call_check_done = 1;
11398
11399 /* We know none of our code bearing sections will need toc stubs. */
11400 if ((isec->flags & SEC_LINKER_CREATED) != 0)
11401 return 0;
11402
11403 if (isec->size == 0)
11404 return 0;
11405
11406 if (isec->output_section == NULL)
11407 return 0;
11408
11409 ret = 0;
11410 if (isec->reloc_count != 0)
11411 {
11412 Elf_Internal_Rela *relstart, *rel;
11413 Elf_Internal_Sym *local_syms;
11414 struct ppc_link_hash_table *htab;
11415
11416 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
11417 info->keep_memory);
11418 if (relstart == NULL)
11419 return -1;
11420
11421 /* Look for branches to outside of this section. */
11422 local_syms = NULL;
11423 htab = ppc_hash_table (info);
11424 if (htab == NULL)
11425 return -1;
11426
11427 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
11428 {
11429 enum elf_ppc64_reloc_type r_type;
11430 unsigned long r_symndx;
11431 struct elf_link_hash_entry *h;
11432 struct ppc_link_hash_entry *eh;
11433 Elf_Internal_Sym *sym;
11434 asection *sym_sec;
11435 struct _opd_sec_data *opd;
11436 bfd_vma sym_value;
11437 bfd_vma dest;
11438
11439 r_type = ELF64_R_TYPE (rel->r_info);
11440 if (r_type != R_PPC64_REL24
11441 && r_type != R_PPC64_REL14
11442 && r_type != R_PPC64_REL14_BRTAKEN
11443 && r_type != R_PPC64_REL14_BRNTAKEN)
11444 continue;
11445
11446 r_symndx = ELF64_R_SYM (rel->r_info);
11447 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
11448 isec->owner))
11449 {
11450 ret = -1;
11451 break;
11452 }
11453
11454 /* Calls to dynamic lib functions go through a plt call stub
11455 that uses r2. */
11456 eh = (struct ppc_link_hash_entry *) h;
11457 if (eh != NULL
11458 && (eh->elf.plt.plist != NULL
11459 || (eh->oh != NULL
11460 && ppc_follow_link (eh->oh)->elf.plt.plist != NULL)))
11461 {
11462 ret = 1;
11463 break;
11464 }
11465
11466 if (sym_sec == NULL)
11467 /* Ignore other undefined symbols. */
11468 continue;
11469
11470 /* Assume branches to other sections not included in the
11471 link need stubs too, to cover -R and absolute syms. */
11472 if (sym_sec->output_section == NULL)
11473 {
11474 ret = 1;
11475 break;
11476 }
11477
11478 if (h == NULL)
11479 sym_value = sym->st_value;
11480 else
11481 {
11482 if (h->root.type != bfd_link_hash_defined
11483 && h->root.type != bfd_link_hash_defweak)
11484 abort ();
11485 sym_value = h->root.u.def.value;
11486 }
11487 sym_value += rel->r_addend;
11488
11489 /* If this branch reloc uses an opd sym, find the code section. */
11490 opd = get_opd_info (sym_sec);
11491 if (opd != NULL)
11492 {
11493 if (h == NULL && opd->adjust != NULL)
11494 {
11495 long adjust;
11496
11497 adjust = opd->adjust[sym->st_value / 8];
11498 if (adjust == -1)
11499 /* Assume deleted functions won't ever be called. */
11500 continue;
11501 sym_value += adjust;
11502 }
11503
11504 dest = opd_entry_value (sym_sec, sym_value,
11505 &sym_sec, NULL, FALSE);
11506 if (dest == (bfd_vma) -1)
11507 continue;
11508 }
11509 else
11510 dest = (sym_value
11511 + sym_sec->output_offset
11512 + sym_sec->output_section->vma);
11513
11514 /* Ignore branch to self. */
11515 if (sym_sec == isec)
11516 continue;
11517
11518 /* If the called function uses the toc, we need a stub. */
11519 if (sym_sec->has_toc_reloc
11520 || sym_sec->makes_toc_func_call)
11521 {
11522 ret = 1;
11523 break;
11524 }
11525
11526 /* Assume any branch that needs a long branch stub might in fact
11527 need a plt_branch stub. A plt_branch stub uses r2. */
11528 else if (dest - (isec->output_offset
11529 + isec->output_section->vma
11530 + rel->r_offset) + (1 << 25)
11531 >= (2u << 25) - PPC64_LOCAL_ENTRY_OFFSET (h
11532 ? h->other
11533 : sym->st_other))
11534 {
11535 ret = 1;
11536 break;
11537 }
11538
11539 /* If calling back to a section in the process of being
11540 tested, we can't say for sure that no toc adjusting stubs
11541 are needed, so don't return zero. */
11542 else if (sym_sec->call_check_in_progress)
11543 ret = 2;
11544
11545 /* Branches to another section that itself doesn't have any TOC
11546 references are OK. Recursively call ourselves to check. */
11547 else if (!sym_sec->call_check_done)
11548 {
11549 int recur;
11550
11551 /* Mark current section as indeterminate, so that other
11552 sections that call back to current won't be marked as
11553 known. */
11554 isec->call_check_in_progress = 1;
11555 recur = toc_adjusting_stub_needed (info, sym_sec);
11556 isec->call_check_in_progress = 0;
11557
11558 if (recur != 0)
11559 {
11560 ret = recur;
11561 if (recur != 2)
11562 break;
11563 }
11564 }
11565 }
11566
11567 if (local_syms != NULL
11568 && (elf_symtab_hdr (isec->owner).contents
11569 != (unsigned char *) local_syms))
11570 free (local_syms);
11571 if (elf_section_data (isec)->relocs != relstart)
11572 free (relstart);
11573 }
11574
11575 if ((ret & 1) == 0
11576 && isec->map_head.s != NULL
11577 && (strcmp (isec->output_section->name, ".init") == 0
11578 || strcmp (isec->output_section->name, ".fini") == 0))
11579 {
11580 if (isec->map_head.s->has_toc_reloc
11581 || isec->map_head.s->makes_toc_func_call)
11582 ret = 1;
11583 else if (!isec->map_head.s->call_check_done)
11584 {
11585 int recur;
11586 isec->call_check_in_progress = 1;
11587 recur = toc_adjusting_stub_needed (info, isec->map_head.s);
11588 isec->call_check_in_progress = 0;
11589 if (recur != 0)
11590 ret = recur;
11591 }
11592 }
11593
11594 if (ret == 1)
11595 isec->makes_toc_func_call = 1;
11596
11597 return ret;
11598 }
11599
11600 /* The linker repeatedly calls this function for each input section,
11601 in the order that input sections are linked into output sections.
11602 Build lists of input sections to determine groupings between which
11603 we may insert linker stubs. */
11604
11605 bfd_boolean
11606 ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
11607 {
11608 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11609
11610 if (htab == NULL)
11611 return FALSE;
11612
11613 if ((isec->output_section->flags & SEC_CODE) != 0
11614 && isec->output_section->index <= htab->top_index)
11615 {
11616 asection **list = htab->input_list + isec->output_section->index;
11617 /* Steal the link_sec pointer for our list. */
11618 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
11619 /* This happens to make the list in reverse order,
11620 which is what we want. */
11621 PREV_SEC (isec) = *list;
11622 *list = isec;
11623 }
11624
11625 if (htab->multi_toc_needed)
11626 {
11627 /* Analyse sections that aren't already flagged as needing a
11628 valid toc pointer. Exclude .fixup for the linux kernel.
11629 .fixup contains branches, but only back to the function that
11630 hit an exception. */
11631 if (!(isec->has_toc_reloc
11632 || (isec->flags & SEC_CODE) == 0
11633 || strcmp (isec->name, ".fixup") == 0
11634 || isec->call_check_done))
11635 {
11636 if (toc_adjusting_stub_needed (info, isec) < 0)
11637 return FALSE;
11638 }
11639 /* Make all sections use the TOC assigned for this object file.
11640 This will be wrong for pasted sections; We fix that in
11641 check_pasted_section(). */
11642 if (elf_gp (isec->owner) != 0)
11643 htab->toc_curr = elf_gp (isec->owner);
11644 }
11645
11646 htab->stub_group[isec->id].toc_off = htab->toc_curr;
11647 return TRUE;
11648 }
11649
11650 /* Check that all .init and .fini sections use the same toc, if they
11651 have toc relocs. */
11652
11653 static bfd_boolean
11654 check_pasted_section (struct bfd_link_info *info, const char *name)
11655 {
11656 asection *o = bfd_get_section_by_name (info->output_bfd, name);
11657
11658 if (o != NULL)
11659 {
11660 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11661 bfd_vma toc_off = 0;
11662 asection *i;
11663
11664 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11665 if (i->has_toc_reloc)
11666 {
11667 if (toc_off == 0)
11668 toc_off = htab->stub_group[i->id].toc_off;
11669 else if (toc_off != htab->stub_group[i->id].toc_off)
11670 return FALSE;
11671 }
11672
11673 if (toc_off == 0)
11674 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11675 if (i->makes_toc_func_call)
11676 {
11677 toc_off = htab->stub_group[i->id].toc_off;
11678 break;
11679 }
11680
11681 /* Make sure the whole pasted function uses the same toc offset. */
11682 if (toc_off != 0)
11683 for (i = o->map_head.s; i != NULL; i = i->map_head.s)
11684 htab->stub_group[i->id].toc_off = toc_off;
11685 }
11686 return TRUE;
11687 }
11688
11689 bfd_boolean
11690 ppc64_elf_check_init_fini (struct bfd_link_info *info)
11691 {
11692 return (check_pasted_section (info, ".init")
11693 & check_pasted_section (info, ".fini"));
11694 }
11695
11696 /* See whether we can group stub sections together. Grouping stub
11697 sections may result in fewer stubs. More importantly, we need to
11698 put all .init* and .fini* stubs at the beginning of the .init or
11699 .fini output sections respectively, because glibc splits the
11700 _init and _fini functions into multiple parts. Putting a stub in
11701 the middle of a function is not a good idea. */
11702
11703 static void
11704 group_sections (struct ppc_link_hash_table *htab,
11705 bfd_size_type stub_group_size,
11706 bfd_boolean stubs_always_before_branch)
11707 {
11708 asection **list;
11709 bfd_size_type stub14_group_size;
11710 bfd_boolean suppress_size_errors;
11711
11712 suppress_size_errors = FALSE;
11713 stub14_group_size = stub_group_size;
11714 if (stub_group_size == 1)
11715 {
11716 /* Default values. */
11717 if (stubs_always_before_branch)
11718 {
11719 stub_group_size = 0x1e00000;
11720 stub14_group_size = 0x7800;
11721 }
11722 else
11723 {
11724 stub_group_size = 0x1c00000;
11725 stub14_group_size = 0x7000;
11726 }
11727 suppress_size_errors = TRUE;
11728 }
11729
11730 list = htab->input_list + htab->top_index;
11731 do
11732 {
11733 asection *tail = *list;
11734 while (tail != NULL)
11735 {
11736 asection *curr;
11737 asection *prev;
11738 bfd_size_type total;
11739 bfd_boolean big_sec;
11740 bfd_vma curr_toc;
11741
11742 curr = tail;
11743 total = tail->size;
11744 big_sec = total > (ppc64_elf_section_data (tail) != NULL
11745 && ppc64_elf_section_data (tail)->has_14bit_branch
11746 ? stub14_group_size : stub_group_size);
11747 if (big_sec && !suppress_size_errors)
11748 (*_bfd_error_handler) (_("%B section %A exceeds stub group size"),
11749 tail->owner, tail);
11750 curr_toc = htab->stub_group[tail->id].toc_off;
11751
11752 while ((prev = PREV_SEC (curr)) != NULL
11753 && ((total += curr->output_offset - prev->output_offset)
11754 < (ppc64_elf_section_data (prev) != NULL
11755 && ppc64_elf_section_data (prev)->has_14bit_branch
11756 ? stub14_group_size : stub_group_size))
11757 && htab->stub_group[prev->id].toc_off == curr_toc)
11758 curr = prev;
11759
11760 /* OK, the size from the start of CURR to the end is less
11761 than stub_group_size and thus can be handled by one stub
11762 section. (or the tail section is itself larger than
11763 stub_group_size, in which case we may be toast.) We
11764 should really be keeping track of the total size of stubs
11765 added here, as stubs contribute to the final output
11766 section size. That's a little tricky, and this way will
11767 only break if stubs added make the total size more than
11768 2^25, ie. for the default stub_group_size, if stubs total
11769 more than 2097152 bytes, or nearly 75000 plt call stubs. */
11770 do
11771 {
11772 prev = PREV_SEC (tail);
11773 /* Set up this stub group. */
11774 htab->stub_group[tail->id].link_sec = curr;
11775 }
11776 while (tail != curr && (tail = prev) != NULL);
11777
11778 /* But wait, there's more! Input sections up to stub_group_size
11779 bytes before the stub section can be handled by it too.
11780 Don't do this if we have a really large section after the
11781 stubs, as adding more stubs increases the chance that
11782 branches may not reach into the stub section. */
11783 if (!stubs_always_before_branch && !big_sec)
11784 {
11785 total = 0;
11786 while (prev != NULL
11787 && ((total += tail->output_offset - prev->output_offset)
11788 < (ppc64_elf_section_data (prev) != NULL
11789 && ppc64_elf_section_data (prev)->has_14bit_branch
11790 ? stub14_group_size : stub_group_size))
11791 && htab->stub_group[prev->id].toc_off == curr_toc)
11792 {
11793 tail = prev;
11794 prev = PREV_SEC (tail);
11795 htab->stub_group[tail->id].link_sec = curr;
11796 }
11797 }
11798 tail = prev;
11799 }
11800 }
11801 while (list-- != htab->input_list);
11802 free (htab->input_list);
11803 #undef PREV_SEC
11804 }
11805
11806 static const unsigned char glink_eh_frame_cie[] =
11807 {
11808 0, 0, 0, 16, /* length. */
11809 0, 0, 0, 0, /* id. */
11810 1, /* CIE version. */
11811 'z', 'R', 0, /* Augmentation string. */
11812 4, /* Code alignment. */
11813 0x78, /* Data alignment. */
11814 65, /* RA reg. */
11815 1, /* Augmentation size. */
11816 DW_EH_PE_pcrel | DW_EH_PE_sdata4, /* FDE encoding. */
11817 DW_CFA_def_cfa, 1, 0 /* def_cfa: r1 offset 0. */
11818 };
11819
11820 /* Stripping output sections is normally done before dynamic section
11821 symbols have been allocated. This function is called later, and
11822 handles cases like htab->brlt which is mapped to its own output
11823 section. */
11824
11825 static void
11826 maybe_strip_output (struct bfd_link_info *info, asection *isec)
11827 {
11828 if (isec->size == 0
11829 && isec->output_section->size == 0
11830 && !(isec->output_section->flags & SEC_KEEP)
11831 && !bfd_section_removed_from_list (info->output_bfd,
11832 isec->output_section)
11833 && elf_section_data (isec->output_section)->dynindx == 0)
11834 {
11835 isec->output_section->flags |= SEC_EXCLUDE;
11836 bfd_section_list_remove (info->output_bfd, isec->output_section);
11837 info->output_bfd->section_count--;
11838 }
11839 }
11840
11841 /* Determine and set the size of the stub section for a final link.
11842
11843 The basic idea here is to examine all the relocations looking for
11844 PC-relative calls to a target that is unreachable with a "bl"
11845 instruction. */
11846
11847 bfd_boolean
11848 ppc64_elf_size_stubs (struct bfd_link_info *info, bfd_signed_vma group_size,
11849 bfd_boolean plt_static_chain, int plt_thread_safe,
11850 int plt_stub_align)
11851 {
11852 bfd_size_type stub_group_size;
11853 bfd_boolean stubs_always_before_branch;
11854 struct ppc_link_hash_table *htab = ppc_hash_table (info);
11855
11856 if (htab == NULL)
11857 return FALSE;
11858
11859 htab->plt_static_chain = plt_static_chain;
11860 htab->plt_stub_align = plt_stub_align;
11861 if (plt_thread_safe == -1 && !info->executable)
11862 plt_thread_safe = 1;
11863 if (!htab->opd_abi)
11864 plt_thread_safe = 0;
11865 else if (plt_thread_safe == -1)
11866 {
11867 static const char *const thread_starter[] =
11868 {
11869 "pthread_create",
11870 /* libstdc++ */
11871 "_ZNSt6thread15_M_start_threadESt10shared_ptrINS_10_Impl_baseEE",
11872 /* librt */
11873 "aio_init", "aio_read", "aio_write", "aio_fsync", "lio_listio",
11874 "mq_notify", "create_timer",
11875 /* libanl */
11876 "getaddrinfo_a",
11877 /* libgomp */
11878 "GOMP_parallel_start",
11879 "GOMP_parallel_loop_static_start",
11880 "GOMP_parallel_loop_dynamic_start",
11881 "GOMP_parallel_loop_guided_start",
11882 "GOMP_parallel_loop_runtime_start",
11883 "GOMP_parallel_sections_start",
11884 };
11885 unsigned i;
11886
11887 for (i = 0; i < sizeof (thread_starter)/ sizeof (thread_starter[0]); i++)
11888 {
11889 struct elf_link_hash_entry *h;
11890 h = elf_link_hash_lookup (&htab->elf, thread_starter[i],
11891 FALSE, FALSE, TRUE);
11892 plt_thread_safe = h != NULL && h->ref_regular;
11893 if (plt_thread_safe)
11894 break;
11895 }
11896 }
11897 htab->plt_thread_safe = plt_thread_safe;
11898 stubs_always_before_branch = group_size < 0;
11899 if (group_size < 0)
11900 stub_group_size = -group_size;
11901 else
11902 stub_group_size = group_size;
11903
11904 group_sections (htab, stub_group_size, stubs_always_before_branch);
11905
11906 while (1)
11907 {
11908 bfd *input_bfd;
11909 unsigned int bfd_indx;
11910 asection *stub_sec;
11911
11912 htab->stub_iteration += 1;
11913
11914 for (input_bfd = info->input_bfds, bfd_indx = 0;
11915 input_bfd != NULL;
11916 input_bfd = input_bfd->link_next, bfd_indx++)
11917 {
11918 Elf_Internal_Shdr *symtab_hdr;
11919 asection *section;
11920 Elf_Internal_Sym *local_syms = NULL;
11921
11922 if (!is_ppc64_elf (input_bfd))
11923 continue;
11924
11925 /* We'll need the symbol table in a second. */
11926 symtab_hdr = &elf_symtab_hdr (input_bfd);
11927 if (symtab_hdr->sh_info == 0)
11928 continue;
11929
11930 /* Walk over each section attached to the input bfd. */
11931 for (section = input_bfd->sections;
11932 section != NULL;
11933 section = section->next)
11934 {
11935 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
11936
11937 /* If there aren't any relocs, then there's nothing more
11938 to do. */
11939 if ((section->flags & SEC_RELOC) == 0
11940 || (section->flags & SEC_ALLOC) == 0
11941 || (section->flags & SEC_LOAD) == 0
11942 || (section->flags & SEC_CODE) == 0
11943 || section->reloc_count == 0)
11944 continue;
11945
11946 /* If this section is a link-once section that will be
11947 discarded, then don't create any stubs. */
11948 if (section->output_section == NULL
11949 || section->output_section->owner != info->output_bfd)
11950 continue;
11951
11952 /* Get the relocs. */
11953 internal_relocs
11954 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
11955 info->keep_memory);
11956 if (internal_relocs == NULL)
11957 goto error_ret_free_local;
11958
11959 /* Now examine each relocation. */
11960 irela = internal_relocs;
11961 irelaend = irela + section->reloc_count;
11962 for (; irela < irelaend; irela++)
11963 {
11964 enum elf_ppc64_reloc_type r_type;
11965 unsigned int r_indx;
11966 enum ppc_stub_type stub_type;
11967 struct ppc_stub_hash_entry *stub_entry;
11968 asection *sym_sec, *code_sec;
11969 bfd_vma sym_value, code_value;
11970 bfd_vma destination;
11971 unsigned long local_off;
11972 bfd_boolean ok_dest;
11973 struct ppc_link_hash_entry *hash;
11974 struct ppc_link_hash_entry *fdh;
11975 struct elf_link_hash_entry *h;
11976 Elf_Internal_Sym *sym;
11977 char *stub_name;
11978 const asection *id_sec;
11979 struct _opd_sec_data *opd;
11980 struct plt_entry *plt_ent;
11981
11982 r_type = ELF64_R_TYPE (irela->r_info);
11983 r_indx = ELF64_R_SYM (irela->r_info);
11984
11985 if (r_type >= R_PPC64_max)
11986 {
11987 bfd_set_error (bfd_error_bad_value);
11988 goto error_ret_free_internal;
11989 }
11990
11991 /* Only look for stubs on branch instructions. */
11992 if (r_type != R_PPC64_REL24
11993 && r_type != R_PPC64_REL14
11994 && r_type != R_PPC64_REL14_BRTAKEN
11995 && r_type != R_PPC64_REL14_BRNTAKEN)
11996 continue;
11997
11998 /* Now determine the call target, its name, value,
11999 section. */
12000 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
12001 r_indx, input_bfd))
12002 goto error_ret_free_internal;
12003 hash = (struct ppc_link_hash_entry *) h;
12004
12005 ok_dest = FALSE;
12006 fdh = NULL;
12007 sym_value = 0;
12008 if (hash == NULL)
12009 {
12010 sym_value = sym->st_value;
12011 ok_dest = TRUE;
12012 }
12013 else if (hash->elf.root.type == bfd_link_hash_defined
12014 || hash->elf.root.type == bfd_link_hash_defweak)
12015 {
12016 sym_value = hash->elf.root.u.def.value;
12017 if (sym_sec->output_section != NULL)
12018 ok_dest = TRUE;
12019 }
12020 else if (hash->elf.root.type == bfd_link_hash_undefweak
12021 || hash->elf.root.type == bfd_link_hash_undefined)
12022 {
12023 /* Recognise an old ABI func code entry sym, and
12024 use the func descriptor sym instead if it is
12025 defined. */
12026 if (hash->elf.root.root.string[0] == '.'
12027 && (fdh = lookup_fdh (hash, htab)) != NULL)
12028 {
12029 if (fdh->elf.root.type == bfd_link_hash_defined
12030 || fdh->elf.root.type == bfd_link_hash_defweak)
12031 {
12032 sym_sec = fdh->elf.root.u.def.section;
12033 sym_value = fdh->elf.root.u.def.value;
12034 if (sym_sec->output_section != NULL)
12035 ok_dest = TRUE;
12036 }
12037 else
12038 fdh = NULL;
12039 }
12040 }
12041 else
12042 {
12043 bfd_set_error (bfd_error_bad_value);
12044 goto error_ret_free_internal;
12045 }
12046
12047 destination = 0;
12048 local_off = 0;
12049 if (ok_dest)
12050 {
12051 sym_value += irela->r_addend;
12052 destination = (sym_value
12053 + sym_sec->output_offset
12054 + sym_sec->output_section->vma);
12055 local_off = PPC64_LOCAL_ENTRY_OFFSET (hash
12056 ? hash->elf.other
12057 : sym->st_other);
12058 }
12059
12060 code_sec = sym_sec;
12061 code_value = sym_value;
12062 opd = get_opd_info (sym_sec);
12063 if (opd != NULL)
12064 {
12065 bfd_vma dest;
12066
12067 if (hash == NULL && opd->adjust != NULL)
12068 {
12069 long adjust = opd->adjust[sym_value / 8];
12070 if (adjust == -1)
12071 continue;
12072 code_value += adjust;
12073 sym_value += adjust;
12074 }
12075 dest = opd_entry_value (sym_sec, sym_value,
12076 &code_sec, &code_value, FALSE);
12077 if (dest != (bfd_vma) -1)
12078 {
12079 destination = dest;
12080 if (fdh != NULL)
12081 {
12082 /* Fixup old ABI sym to point at code
12083 entry. */
12084 hash->elf.root.type = bfd_link_hash_defweak;
12085 hash->elf.root.u.def.section = code_sec;
12086 hash->elf.root.u.def.value = code_value;
12087 }
12088 }
12089 }
12090
12091 /* Determine what (if any) linker stub is needed. */
12092 plt_ent = NULL;
12093 stub_type = ppc_type_of_stub (section, irela, &hash,
12094 &plt_ent, destination,
12095 local_off);
12096
12097 if (stub_type != ppc_stub_plt_call)
12098 {
12099 /* Check whether we need a TOC adjusting stub.
12100 Since the linker pastes together pieces from
12101 different object files when creating the
12102 _init and _fini functions, it may be that a
12103 call to what looks like a local sym is in
12104 fact a call needing a TOC adjustment. */
12105 if (code_sec != NULL
12106 && code_sec->output_section != NULL
12107 && (htab->stub_group[code_sec->id].toc_off
12108 != htab->stub_group[section->id].toc_off)
12109 && (code_sec->has_toc_reloc
12110 || code_sec->makes_toc_func_call))
12111 stub_type = ppc_stub_long_branch_r2off;
12112 }
12113
12114 if (stub_type == ppc_stub_none)
12115 continue;
12116
12117 /* __tls_get_addr calls might be eliminated. */
12118 if (stub_type != ppc_stub_plt_call
12119 && hash != NULL
12120 && (hash == htab->tls_get_addr
12121 || hash == htab->tls_get_addr_fd)
12122 && section->has_tls_reloc
12123 && irela != internal_relocs)
12124 {
12125 /* Get tls info. */
12126 unsigned char *tls_mask;
12127
12128 if (!get_tls_mask (&tls_mask, NULL, NULL, &local_syms,
12129 irela - 1, input_bfd))
12130 goto error_ret_free_internal;
12131 if (*tls_mask != 0)
12132 continue;
12133 }
12134
12135 if (stub_type == ppc_stub_plt_call
12136 && irela + 1 < irelaend
12137 && irela[1].r_offset == irela->r_offset + 4
12138 && ELF64_R_TYPE (irela[1].r_info) == R_PPC64_TOCSAVE)
12139 {
12140 if (!tocsave_find (htab, INSERT,
12141 &local_syms, irela + 1, input_bfd))
12142 goto error_ret_free_internal;
12143 }
12144 else if (stub_type == ppc_stub_plt_call)
12145 stub_type = ppc_stub_plt_call_r2save;
12146
12147 /* Support for grouping stub sections. */
12148 id_sec = htab->stub_group[section->id].link_sec;
12149
12150 /* Get the name of this stub. */
12151 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
12152 if (!stub_name)
12153 goto error_ret_free_internal;
12154
12155 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
12156 stub_name, FALSE, FALSE);
12157 if (stub_entry != NULL)
12158 {
12159 /* The proper stub has already been created. */
12160 free (stub_name);
12161 if (stub_type == ppc_stub_plt_call_r2save)
12162 stub_entry->stub_type = stub_type;
12163 continue;
12164 }
12165
12166 stub_entry = ppc_add_stub (stub_name, section, info);
12167 if (stub_entry == NULL)
12168 {
12169 free (stub_name);
12170 error_ret_free_internal:
12171 if (elf_section_data (section)->relocs == NULL)
12172 free (internal_relocs);
12173 error_ret_free_local:
12174 if (local_syms != NULL
12175 && (symtab_hdr->contents
12176 != (unsigned char *) local_syms))
12177 free (local_syms);
12178 return FALSE;
12179 }
12180
12181 stub_entry->stub_type = stub_type;
12182 if (stub_type != ppc_stub_plt_call
12183 && stub_type != ppc_stub_plt_call_r2save)
12184 {
12185 stub_entry->target_value = code_value;
12186 stub_entry->target_section = code_sec;
12187 }
12188 else
12189 {
12190 stub_entry->target_value = sym_value;
12191 stub_entry->target_section = sym_sec;
12192 }
12193 stub_entry->h = hash;
12194 stub_entry->plt_ent = plt_ent;
12195 stub_entry->other = hash ? hash->elf.other : sym->st_other;
12196
12197 if (stub_entry->h != NULL)
12198 htab->stub_globals += 1;
12199 }
12200
12201 /* We're done with the internal relocs, free them. */
12202 if (elf_section_data (section)->relocs != internal_relocs)
12203 free (internal_relocs);
12204 }
12205
12206 if (local_syms != NULL
12207 && symtab_hdr->contents != (unsigned char *) local_syms)
12208 {
12209 if (!info->keep_memory)
12210 free (local_syms);
12211 else
12212 symtab_hdr->contents = (unsigned char *) local_syms;
12213 }
12214 }
12215
12216 /* We may have added some stubs. Find out the new size of the
12217 stub sections. */
12218 for (stub_sec = htab->stub_bfd->sections;
12219 stub_sec != NULL;
12220 stub_sec = stub_sec->next)
12221 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12222 {
12223 stub_sec->rawsize = stub_sec->size;
12224 stub_sec->size = 0;
12225 stub_sec->reloc_count = 0;
12226 stub_sec->flags &= ~SEC_RELOC;
12227 }
12228
12229 htab->brlt->size = 0;
12230 htab->brlt->reloc_count = 0;
12231 htab->brlt->flags &= ~SEC_RELOC;
12232 if (htab->relbrlt != NULL)
12233 htab->relbrlt->size = 0;
12234
12235 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
12236
12237 if (info->emitrelocations
12238 && htab->glink != NULL && htab->glink->size != 0)
12239 {
12240 htab->glink->reloc_count = 1;
12241 htab->glink->flags |= SEC_RELOC;
12242 }
12243
12244 if (htab->glink_eh_frame != NULL
12245 && !bfd_is_abs_section (htab->glink_eh_frame->output_section)
12246 && htab->glink_eh_frame->output_section->size != 0)
12247 {
12248 size_t size = 0, align;
12249
12250 for (stub_sec = htab->stub_bfd->sections;
12251 stub_sec != NULL;
12252 stub_sec = stub_sec->next)
12253 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12254 size += 20;
12255 if (htab->glink != NULL && htab->glink->size != 0)
12256 size += 24;
12257 if (size != 0)
12258 size += sizeof (glink_eh_frame_cie);
12259 align = 1;
12260 align <<= htab->glink_eh_frame->output_section->alignment_power;
12261 align -= 1;
12262 size = (size + align) & ~align;
12263 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12264 htab->glink_eh_frame->size = size;
12265 }
12266
12267 if (htab->plt_stub_align != 0)
12268 for (stub_sec = htab->stub_bfd->sections;
12269 stub_sec != NULL;
12270 stub_sec = stub_sec->next)
12271 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12272 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12273 & (-1 << htab->plt_stub_align));
12274
12275 for (stub_sec = htab->stub_bfd->sections;
12276 stub_sec != NULL;
12277 stub_sec = stub_sec->next)
12278 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12279 && stub_sec->rawsize != stub_sec->size)
12280 break;
12281
12282 /* Exit from this loop when no stubs have been added, and no stubs
12283 have changed size. */
12284 if (stub_sec == NULL
12285 && (htab->glink_eh_frame == NULL
12286 || htab->glink_eh_frame->rawsize == htab->glink_eh_frame->size))
12287 break;
12288
12289 /* Ask the linker to do its stuff. */
12290 (*htab->layout_sections_again) ();
12291 }
12292
12293 maybe_strip_output (info, htab->brlt);
12294 if (htab->glink_eh_frame != NULL)
12295 maybe_strip_output (info, htab->glink_eh_frame);
12296
12297 return TRUE;
12298 }
12299
12300 /* Called after we have determined section placement. If sections
12301 move, we'll be called again. Provide a value for TOCstart. */
12302
12303 bfd_vma
12304 ppc64_elf_set_toc (struct bfd_link_info *info, bfd *obfd)
12305 {
12306 asection *s;
12307 bfd_vma TOCstart;
12308
12309 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
12310 order. The TOC starts where the first of these sections starts. */
12311 s = bfd_get_section_by_name (obfd, ".got");
12312 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12313 s = bfd_get_section_by_name (obfd, ".toc");
12314 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12315 s = bfd_get_section_by_name (obfd, ".tocbss");
12316 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12317 s = bfd_get_section_by_name (obfd, ".plt");
12318 if (s == NULL || (s->flags & SEC_EXCLUDE) != 0)
12319 {
12320 /* This may happen for
12321 o references to TOC base (SYM@toc / TOC[tc0]) without a
12322 .toc directive
12323 o bad linker script
12324 o --gc-sections and empty TOC sections
12325
12326 FIXME: Warn user? */
12327
12328 /* Look for a likely section. We probably won't even be
12329 using TOCstart. */
12330 for (s = obfd->sections; s != NULL; s = s->next)
12331 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY
12332 | SEC_EXCLUDE))
12333 == (SEC_ALLOC | SEC_SMALL_DATA))
12334 break;
12335 if (s == NULL)
12336 for (s = obfd->sections; s != NULL; s = s->next)
12337 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_EXCLUDE))
12338 == (SEC_ALLOC | SEC_SMALL_DATA))
12339 break;
12340 if (s == NULL)
12341 for (s = obfd->sections; s != NULL; s = s->next)
12342 if ((s->flags & (SEC_ALLOC | SEC_READONLY | SEC_EXCLUDE))
12343 == SEC_ALLOC)
12344 break;
12345 if (s == NULL)
12346 for (s = obfd->sections; s != NULL; s = s->next)
12347 if ((s->flags & (SEC_ALLOC | SEC_EXCLUDE)) == SEC_ALLOC)
12348 break;
12349 }
12350
12351 TOCstart = 0;
12352 if (s != NULL)
12353 TOCstart = s->output_section->vma + s->output_offset;
12354
12355 _bfd_set_gp_value (obfd, TOCstart);
12356
12357 if (info != NULL && s != NULL && is_ppc64_elf (obfd))
12358 {
12359 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12360
12361 if (htab != NULL
12362 && htab->elf.hgot != NULL)
12363 {
12364 htab->elf.hgot->root.u.def.value = TOC_BASE_OFF;
12365 htab->elf.hgot->root.u.def.section = s;
12366 }
12367 }
12368 return TOCstart;
12369 }
12370
12371 /* Called via elf_link_hash_traverse from ppc64_elf_build_stubs to
12372 write out any global entry stubs. */
12373
12374 static bfd_boolean
12375 build_global_entry_stubs (struct elf_link_hash_entry *h, void *inf)
12376 {
12377 struct bfd_link_info *info;
12378 struct ppc_link_hash_table *htab;
12379 struct plt_entry *pent;
12380 asection *s;
12381
12382 if (h->root.type == bfd_link_hash_indirect)
12383 return TRUE;
12384
12385 if (!h->pointer_equality_needed)
12386 return TRUE;
12387
12388 if (h->def_regular)
12389 return TRUE;
12390
12391 info = inf;
12392 htab = ppc_hash_table (info);
12393 if (htab == NULL)
12394 return FALSE;
12395
12396 s = htab->glink;
12397 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
12398 if (pent->plt.offset != (bfd_vma) -1
12399 && pent->addend == 0)
12400 {
12401 bfd_byte *p;
12402 asection *plt;
12403 bfd_vma off;
12404
12405 p = s->contents + h->root.u.def.value;
12406 plt = htab->elf.splt;
12407 if (!htab->elf.dynamic_sections_created
12408 || h->dynindx == -1)
12409 plt = htab->elf.iplt;
12410 off = pent->plt.offset + plt->output_offset + plt->output_section->vma;
12411 off -= h->root.u.def.value + s->output_offset + s->output_section->vma;
12412
12413 if (off + 0x80008000 > 0xffffffff || (off & 3) != 0)
12414 {
12415 info->callbacks->einfo
12416 (_("%P: linkage table error against `%T'\n"),
12417 h->root.root.string);
12418 bfd_set_error (bfd_error_bad_value);
12419 htab->stub_error = TRUE;
12420 }
12421
12422 if (PPC_HA (off) != 0)
12423 {
12424 bfd_put_32 (s->owner, ADDIS_R12_R12 | PPC_HA (off), p);
12425 p += 4;
12426 }
12427 bfd_put_32 (s->owner, LD_R12_0R12 | PPC_LO (off), p);
12428 p += 4;
12429 bfd_put_32 (s->owner, MTCTR_R12, p);
12430 p += 4;
12431 bfd_put_32 (s->owner, BCTR, p);
12432 break;
12433 }
12434 return TRUE;
12435 }
12436
12437 /* Build all the stubs associated with the current output file.
12438 The stubs are kept in a hash table attached to the main linker
12439 hash table. This function is called via gldelf64ppc_finish. */
12440
12441 bfd_boolean
12442 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
12443 struct bfd_link_info *info,
12444 char **stats)
12445 {
12446 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12447 asection *stub_sec;
12448 bfd_byte *p;
12449 int stub_sec_count = 0;
12450
12451 if (htab == NULL)
12452 return FALSE;
12453
12454 htab->emit_stub_syms = emit_stub_syms;
12455
12456 /* Allocate memory to hold the linker stubs. */
12457 for (stub_sec = htab->stub_bfd->sections;
12458 stub_sec != NULL;
12459 stub_sec = stub_sec->next)
12460 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
12461 && stub_sec->size != 0)
12462 {
12463 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
12464 if (stub_sec->contents == NULL)
12465 return FALSE;
12466 /* We want to check that built size is the same as calculated
12467 size. rawsize is a convenient location to use. */
12468 stub_sec->rawsize = stub_sec->size;
12469 stub_sec->size = 0;
12470 }
12471
12472 if (htab->glink != NULL && htab->glink->size != 0)
12473 {
12474 unsigned int indx;
12475 bfd_vma plt0;
12476
12477 /* Build the .glink plt call stub. */
12478 if (htab->emit_stub_syms)
12479 {
12480 struct elf_link_hash_entry *h;
12481 h = elf_link_hash_lookup (&htab->elf, "__glink_PLTresolve",
12482 TRUE, FALSE, FALSE);
12483 if (h == NULL)
12484 return FALSE;
12485 if (h->root.type == bfd_link_hash_new)
12486 {
12487 h->root.type = bfd_link_hash_defined;
12488 h->root.u.def.section = htab->glink;
12489 h->root.u.def.value = 8;
12490 h->ref_regular = 1;
12491 h->def_regular = 1;
12492 h->ref_regular_nonweak = 1;
12493 h->forced_local = 1;
12494 h->non_elf = 0;
12495 }
12496 }
12497 plt0 = (htab->elf.splt->output_section->vma
12498 + htab->elf.splt->output_offset
12499 - 16);
12500 if (info->emitrelocations)
12501 {
12502 Elf_Internal_Rela *r = get_relocs (htab->glink, 1);
12503 if (r == NULL)
12504 return FALSE;
12505 r->r_offset = (htab->glink->output_offset
12506 + htab->glink->output_section->vma);
12507 r->r_info = ELF64_R_INFO (0, R_PPC64_REL64);
12508 r->r_addend = plt0;
12509 }
12510 p = htab->glink->contents;
12511 plt0 -= htab->glink->output_section->vma + htab->glink->output_offset;
12512 bfd_put_64 (htab->glink->owner, plt0, p);
12513 p += 8;
12514 if (htab->opd_abi)
12515 {
12516 bfd_put_32 (htab->glink->owner, MFLR_R12, p);
12517 p += 4;
12518 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12519 p += 4;
12520 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12521 p += 4;
12522 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12523 p += 4;
12524 bfd_put_32 (htab->glink->owner, MTLR_R12, p);
12525 p += 4;
12526 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12527 p += 4;
12528 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12529 p += 4;
12530 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | 8, p);
12531 p += 4;
12532 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12533 p += 4;
12534 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 16, p);
12535 p += 4;
12536 }
12537 else
12538 {
12539 bfd_put_32 (htab->glink->owner, MFLR_R0, p);
12540 p += 4;
12541 bfd_put_32 (htab->glink->owner, BCL_20_31, p);
12542 p += 4;
12543 bfd_put_32 (htab->glink->owner, MFLR_R11, p);
12544 p += 4;
12545 bfd_put_32 (htab->glink->owner, LD_R2_0R11 | (-16 & 0xfffc), p);
12546 p += 4;
12547 bfd_put_32 (htab->glink->owner, MTLR_R0, p);
12548 p += 4;
12549 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
12550 p += 4;
12551 bfd_put_32 (htab->glink->owner, ADD_R11_R2_R11, p);
12552 p += 4;
12553 bfd_put_32 (htab->glink->owner, ADDI_R0_R12 | (-48 & 0xffff), p);
12554 p += 4;
12555 bfd_put_32 (htab->glink->owner, LD_R12_0R11, p);
12556 p += 4;
12557 bfd_put_32 (htab->glink->owner, SRDI_R0_R0_2, p);
12558 p += 4;
12559 bfd_put_32 (htab->glink->owner, MTCTR_R12, p);
12560 p += 4;
12561 bfd_put_32 (htab->glink->owner, LD_R11_0R11 | 8, p);
12562 p += 4;
12563 }
12564 bfd_put_32 (htab->glink->owner, BCTR, p);
12565 p += 4;
12566 while (p - htab->glink->contents < GLINK_CALL_STUB_SIZE)
12567 {
12568 bfd_put_32 (htab->glink->owner, NOP, p);
12569 p += 4;
12570 }
12571
12572 /* Build the .glink lazy link call stubs. */
12573 indx = 0;
12574 while (p < htab->glink->contents + htab->glink->rawsize)
12575 {
12576 if (htab->opd_abi)
12577 {
12578 if (indx < 0x8000)
12579 {
12580 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
12581 p += 4;
12582 }
12583 else
12584 {
12585 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
12586 p += 4;
12587 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx),
12588 p);
12589 p += 4;
12590 }
12591 }
12592 bfd_put_32 (htab->glink->owner,
12593 B_DOT | ((htab->glink->contents - p + 8) & 0x3fffffc), p);
12594 indx++;
12595 p += 4;
12596 }
12597
12598 /* Build .glink global entry stubs. */
12599 if (htab->glink->size > htab->glink->rawsize)
12600 elf_link_hash_traverse (&htab->elf, build_global_entry_stubs, info);
12601 }
12602
12603 if (htab->brlt->size != 0)
12604 {
12605 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
12606 htab->brlt->size);
12607 if (htab->brlt->contents == NULL)
12608 return FALSE;
12609 }
12610 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
12611 {
12612 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
12613 htab->relbrlt->size);
12614 if (htab->relbrlt->contents == NULL)
12615 return FALSE;
12616 }
12617
12618 if (htab->glink_eh_frame != NULL
12619 && htab->glink_eh_frame->size != 0)
12620 {
12621 bfd_vma val;
12622 bfd_byte *last_fde;
12623 size_t last_fde_len, size, align, pad;
12624
12625 p = bfd_zalloc (htab->glink_eh_frame->owner, htab->glink_eh_frame->size);
12626 if (p == NULL)
12627 return FALSE;
12628 htab->glink_eh_frame->contents = p;
12629 last_fde = p;
12630
12631 htab->glink_eh_frame->rawsize = htab->glink_eh_frame->size;
12632
12633 memcpy (p, glink_eh_frame_cie, sizeof (glink_eh_frame_cie));
12634 /* CIE length (rewrite in case little-endian). */
12635 last_fde_len = sizeof (glink_eh_frame_cie) - 4;
12636 bfd_put_32 (htab->elf.dynobj, last_fde_len, p);
12637 p += sizeof (glink_eh_frame_cie);
12638
12639 for (stub_sec = htab->stub_bfd->sections;
12640 stub_sec != NULL;
12641 stub_sec = stub_sec->next)
12642 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12643 {
12644 last_fde = p;
12645 last_fde_len = 16;
12646 /* FDE length. */
12647 bfd_put_32 (htab->elf.dynobj, 16, p);
12648 p += 4;
12649 /* CIE pointer. */
12650 val = p - htab->glink_eh_frame->contents;
12651 bfd_put_32 (htab->elf.dynobj, val, p);
12652 p += 4;
12653 /* Offset to stub section. */
12654 val = (stub_sec->output_section->vma
12655 + stub_sec->output_offset);
12656 val -= (htab->glink_eh_frame->output_section->vma
12657 + htab->glink_eh_frame->output_offset);
12658 val -= p - htab->glink_eh_frame->contents;
12659 if (val + 0x80000000 > 0xffffffff)
12660 {
12661 info->callbacks->einfo
12662 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12663 stub_sec->name);
12664 return FALSE;
12665 }
12666 bfd_put_32 (htab->elf.dynobj, val, p);
12667 p += 4;
12668 /* stub section size. */
12669 bfd_put_32 (htab->elf.dynobj, stub_sec->rawsize, p);
12670 p += 4;
12671 /* Augmentation. */
12672 p += 1;
12673 /* Pad. */
12674 p += 3;
12675 }
12676 if (htab->glink != NULL && htab->glink->size != 0)
12677 {
12678 last_fde = p;
12679 last_fde_len = 20;
12680 /* FDE length. */
12681 bfd_put_32 (htab->elf.dynobj, 20, p);
12682 p += 4;
12683 /* CIE pointer. */
12684 val = p - htab->glink_eh_frame->contents;
12685 bfd_put_32 (htab->elf.dynobj, val, p);
12686 p += 4;
12687 /* Offset to .glink. */
12688 val = (htab->glink->output_section->vma
12689 + htab->glink->output_offset
12690 + 8);
12691 val -= (htab->glink_eh_frame->output_section->vma
12692 + htab->glink_eh_frame->output_offset);
12693 val -= p - htab->glink_eh_frame->contents;
12694 if (val + 0x80000000 > 0xffffffff)
12695 {
12696 info->callbacks->einfo
12697 (_("%P: %s offset too large for .eh_frame sdata4 encoding"),
12698 htab->glink->name);
12699 return FALSE;
12700 }
12701 bfd_put_32 (htab->elf.dynobj, val, p);
12702 p += 4;
12703 /* .glink size. */
12704 bfd_put_32 (htab->elf.dynobj, htab->glink->size - 8, p);
12705 p += 4;
12706 /* Augmentation. */
12707 p += 1;
12708
12709 *p++ = DW_CFA_advance_loc + 1;
12710 *p++ = DW_CFA_register;
12711 *p++ = 65;
12712 *p++ = 12;
12713 *p++ = DW_CFA_advance_loc + 4;
12714 *p++ = DW_CFA_restore_extended;
12715 *p++ = 65;
12716 }
12717 /* Subsume any padding into the last FDE if user .eh_frame
12718 sections are aligned more than glink_eh_frame. Otherwise any
12719 zero padding will be seen as a terminator. */
12720 size = p - htab->glink_eh_frame->contents;
12721 align = 1;
12722 align <<= htab->glink_eh_frame->output_section->alignment_power;
12723 align -= 1;
12724 pad = ((size + align) & ~align) - size;
12725 htab->glink_eh_frame->size = size + pad;
12726 bfd_put_32 (htab->elf.dynobj, last_fde_len + pad, last_fde);
12727 }
12728
12729 /* Build the stubs as directed by the stub hash table. */
12730 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
12731
12732 if (htab->relbrlt != NULL)
12733 htab->relbrlt->reloc_count = 0;
12734
12735 if (htab->plt_stub_align != 0)
12736 for (stub_sec = htab->stub_bfd->sections;
12737 stub_sec != NULL;
12738 stub_sec = stub_sec->next)
12739 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12740 stub_sec->size = ((stub_sec->size + (1 << htab->plt_stub_align) - 1)
12741 & (-1 << htab->plt_stub_align));
12742
12743 for (stub_sec = htab->stub_bfd->sections;
12744 stub_sec != NULL;
12745 stub_sec = stub_sec->next)
12746 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
12747 {
12748 stub_sec_count += 1;
12749 if (stub_sec->rawsize != stub_sec->size)
12750 break;
12751 }
12752
12753 if (stub_sec != NULL
12754 || (htab->glink_eh_frame != NULL
12755 && htab->glink_eh_frame->rawsize != htab->glink_eh_frame->size))
12756 {
12757 htab->stub_error = TRUE;
12758 info->callbacks->einfo (_("%P: stubs don't match calculated size\n"));
12759 }
12760
12761 if (htab->stub_error)
12762 return FALSE;
12763
12764 if (stats != NULL)
12765 {
12766 *stats = bfd_malloc (500);
12767 if (*stats == NULL)
12768 return FALSE;
12769
12770 sprintf (*stats, _("linker stubs in %u group%s\n"
12771 " branch %lu\n"
12772 " toc adjust %lu\n"
12773 " long branch %lu\n"
12774 " long toc adj %lu\n"
12775 " plt call %lu\n"
12776 " plt call toc %lu"),
12777 stub_sec_count,
12778 stub_sec_count == 1 ? "" : "s",
12779 htab->stub_count[ppc_stub_long_branch - 1],
12780 htab->stub_count[ppc_stub_long_branch_r2off - 1],
12781 htab->stub_count[ppc_stub_plt_branch - 1],
12782 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
12783 htab->stub_count[ppc_stub_plt_call - 1],
12784 htab->stub_count[ppc_stub_plt_call_r2save - 1]);
12785 }
12786 return TRUE;
12787 }
12788
12789 /* This function undoes the changes made by add_symbol_adjust. */
12790
12791 static bfd_boolean
12792 undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
12793 {
12794 struct ppc_link_hash_entry *eh;
12795
12796 if (h->root.type == bfd_link_hash_indirect)
12797 return TRUE;
12798
12799 eh = (struct ppc_link_hash_entry *) h;
12800 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
12801 return TRUE;
12802
12803 eh->elf.root.type = bfd_link_hash_undefined;
12804 return TRUE;
12805 }
12806
12807 void
12808 ppc64_elf_restore_symbols (struct bfd_link_info *info)
12809 {
12810 struct ppc_link_hash_table *htab = ppc_hash_table (info);
12811
12812 if (htab != NULL)
12813 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
12814 }
12815
12816 /* What to do when ld finds relocations against symbols defined in
12817 discarded sections. */
12818
12819 static unsigned int
12820 ppc64_elf_action_discarded (asection *sec)
12821 {
12822 if (strcmp (".opd", sec->name) == 0)
12823 return 0;
12824
12825 if (strcmp (".toc", sec->name) == 0)
12826 return 0;
12827
12828 if (strcmp (".toc1", sec->name) == 0)
12829 return 0;
12830
12831 return _bfd_elf_default_action_discarded (sec);
12832 }
12833
12834 /* The RELOCATE_SECTION function is called by the ELF backend linker
12835 to handle the relocations for a section.
12836
12837 The relocs are always passed as Rela structures; if the section
12838 actually uses Rel structures, the r_addend field will always be
12839 zero.
12840
12841 This function is responsible for adjust the section contents as
12842 necessary, and (if using Rela relocs and generating a
12843 relocatable output file) adjusting the reloc addend as
12844 necessary.
12845
12846 This function does not have to worry about setting the reloc
12847 address or the reloc symbol index.
12848
12849 LOCAL_SYMS is a pointer to the swapped in local symbols.
12850
12851 LOCAL_SECTIONS is an array giving the section in the input file
12852 corresponding to the st_shndx field of each local symbol.
12853
12854 The global hash table entry for the global symbols can be found
12855 via elf_sym_hashes (input_bfd).
12856
12857 When generating relocatable output, this function must handle
12858 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
12859 going to be the section symbol corresponding to the output
12860 section, which means that the addend must be adjusted
12861 accordingly. */
12862
12863 static bfd_boolean
12864 ppc64_elf_relocate_section (bfd *output_bfd,
12865 struct bfd_link_info *info,
12866 bfd *input_bfd,
12867 asection *input_section,
12868 bfd_byte *contents,
12869 Elf_Internal_Rela *relocs,
12870 Elf_Internal_Sym *local_syms,
12871 asection **local_sections)
12872 {
12873 struct ppc_link_hash_table *htab;
12874 Elf_Internal_Shdr *symtab_hdr;
12875 struct elf_link_hash_entry **sym_hashes;
12876 Elf_Internal_Rela *rel;
12877 Elf_Internal_Rela *relend;
12878 Elf_Internal_Rela outrel;
12879 bfd_byte *loc;
12880 struct got_entry **local_got_ents;
12881 bfd_vma TOCstart;
12882 bfd_boolean ret = TRUE;
12883 bfd_boolean is_opd;
12884 /* Assume 'at' branch hints. */
12885 bfd_boolean is_isa_v2 = TRUE;
12886 bfd_vma d_offset = (bfd_big_endian (output_bfd) ? 2 : 0);
12887
12888 /* Initialize howto table if needed. */
12889 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
12890 ppc_howto_init ();
12891
12892 htab = ppc_hash_table (info);
12893 if (htab == NULL)
12894 return FALSE;
12895
12896 /* Don't relocate stub sections. */
12897 if (input_section->owner == htab->stub_bfd)
12898 return TRUE;
12899
12900 BFD_ASSERT (is_ppc64_elf (input_bfd));
12901
12902 local_got_ents = elf_local_got_ents (input_bfd);
12903 TOCstart = elf_gp (output_bfd);
12904 symtab_hdr = &elf_symtab_hdr (input_bfd);
12905 sym_hashes = elf_sym_hashes (input_bfd);
12906 is_opd = ppc64_elf_section_data (input_section)->sec_type == sec_opd;
12907
12908 rel = relocs;
12909 relend = relocs + input_section->reloc_count;
12910 for (; rel < relend; rel++)
12911 {
12912 enum elf_ppc64_reloc_type r_type;
12913 bfd_vma addend;
12914 bfd_reloc_status_type r;
12915 Elf_Internal_Sym *sym;
12916 asection *sec;
12917 struct elf_link_hash_entry *h_elf;
12918 struct ppc_link_hash_entry *h;
12919 struct ppc_link_hash_entry *fdh;
12920 const char *sym_name;
12921 unsigned long r_symndx, toc_symndx;
12922 bfd_vma toc_addend;
12923 unsigned char tls_mask, tls_gd, tls_type;
12924 unsigned char sym_type;
12925 bfd_vma relocation;
12926 bfd_boolean unresolved_reloc;
12927 bfd_boolean warned;
12928 enum { DEST_NORMAL, DEST_OPD, DEST_STUB } reloc_dest;
12929 unsigned int insn;
12930 unsigned int mask;
12931 struct ppc_stub_hash_entry *stub_entry;
12932 bfd_vma max_br_offset;
12933 bfd_vma from;
12934 const Elf_Internal_Rela orig_rel = *rel;
12935
12936 r_type = ELF64_R_TYPE (rel->r_info);
12937 r_symndx = ELF64_R_SYM (rel->r_info);
12938
12939 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
12940 symbol of the previous ADDR64 reloc. The symbol gives us the
12941 proper TOC base to use. */
12942 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
12943 && rel != relocs
12944 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
12945 && is_opd)
12946 r_symndx = ELF64_R_SYM (rel[-1].r_info);
12947
12948 sym = NULL;
12949 sec = NULL;
12950 h_elf = NULL;
12951 sym_name = NULL;
12952 unresolved_reloc = FALSE;
12953 warned = FALSE;
12954
12955 if (r_symndx < symtab_hdr->sh_info)
12956 {
12957 /* It's a local symbol. */
12958 struct _opd_sec_data *opd;
12959
12960 sym = local_syms + r_symndx;
12961 sec = local_sections[r_symndx];
12962 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym, sec);
12963 sym_type = ELF64_ST_TYPE (sym->st_info);
12964 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
12965 opd = get_opd_info (sec);
12966 if (opd != NULL && opd->adjust != NULL)
12967 {
12968 long adjust = opd->adjust[(sym->st_value + rel->r_addend) / 8];
12969 if (adjust == -1)
12970 relocation = 0;
12971 else
12972 {
12973 /* If this is a relocation against the opd section sym
12974 and we have edited .opd, adjust the reloc addend so
12975 that ld -r and ld --emit-relocs output is correct.
12976 If it is a reloc against some other .opd symbol,
12977 then the symbol value will be adjusted later. */
12978 if (ELF_ST_TYPE (sym->st_info) == STT_SECTION)
12979 rel->r_addend += adjust;
12980 else
12981 relocation += adjust;
12982 }
12983 }
12984 }
12985 else
12986 {
12987 bfd_boolean ignored;
12988
12989 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
12990 r_symndx, symtab_hdr, sym_hashes,
12991 h_elf, sec, relocation,
12992 unresolved_reloc, warned, ignored);
12993 sym_name = h_elf->root.root.string;
12994 sym_type = h_elf->type;
12995 if (sec != NULL
12996 && sec->owner == output_bfd
12997 && strcmp (sec->name, ".opd") == 0)
12998 {
12999 /* This is a symbol defined in a linker script. All
13000 such are defined in output sections, even those
13001 defined by simple assignment from a symbol defined in
13002 an input section. Transfer the symbol to an
13003 appropriate input .opd section, so that a branch to
13004 this symbol will be mapped to the location specified
13005 by the opd entry. */
13006 struct bfd_link_order *lo;
13007 for (lo = sec->map_head.link_order; lo != NULL; lo = lo->next)
13008 if (lo->type == bfd_indirect_link_order)
13009 {
13010 asection *isec = lo->u.indirect.section;
13011 if (h_elf->root.u.def.value >= isec->output_offset
13012 && h_elf->root.u.def.value < (isec->output_offset
13013 + isec->size))
13014 {
13015 h_elf->root.u.def.value -= isec->output_offset;
13016 h_elf->root.u.def.section = isec;
13017 sec = isec;
13018 break;
13019 }
13020 }
13021 }
13022 }
13023 h = (struct ppc_link_hash_entry *) h_elf;
13024
13025 if (sec != NULL && discarded_section (sec))
13026 RELOC_AGAINST_DISCARDED_SECTION (info, input_bfd, input_section,
13027 rel, 1, relend,
13028 ppc64_elf_howto_table[r_type], 0,
13029 contents);
13030
13031 if (info->relocatable)
13032 continue;
13033
13034 if (h != NULL && &h->elf == htab->elf.hgot)
13035 {
13036 relocation = (TOCstart
13037 + htab->stub_group[input_section->id].toc_off);
13038 sec = bfd_abs_section_ptr;
13039 unresolved_reloc = FALSE;
13040 }
13041
13042 /* TLS optimizations. Replace instruction sequences and relocs
13043 based on information we collected in tls_optimize. We edit
13044 RELOCS so that --emit-relocs will output something sensible
13045 for the final instruction stream. */
13046 tls_mask = 0;
13047 tls_gd = 0;
13048 toc_symndx = 0;
13049 if (h != NULL)
13050 tls_mask = h->tls_mask;
13051 else if (local_got_ents != NULL)
13052 {
13053 struct plt_entry **local_plt = (struct plt_entry **)
13054 (local_got_ents + symtab_hdr->sh_info);
13055 unsigned char *lgot_masks = (unsigned char *)
13056 (local_plt + symtab_hdr->sh_info);
13057 tls_mask = lgot_masks[r_symndx];
13058 }
13059 if (tls_mask == 0
13060 && (r_type == R_PPC64_TLS
13061 || r_type == R_PPC64_TLSGD
13062 || r_type == R_PPC64_TLSLD))
13063 {
13064 /* Check for toc tls entries. */
13065 unsigned char *toc_tls;
13066
13067 if (!get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13068 &local_syms, rel, input_bfd))
13069 return FALSE;
13070
13071 if (toc_tls)
13072 tls_mask = *toc_tls;
13073 }
13074
13075 /* Check that tls relocs are used with tls syms, and non-tls
13076 relocs are used with non-tls syms. */
13077 if (r_symndx != STN_UNDEF
13078 && r_type != R_PPC64_NONE
13079 && (h == NULL
13080 || h->elf.root.type == bfd_link_hash_defined
13081 || h->elf.root.type == bfd_link_hash_defweak)
13082 && (IS_PPC64_TLS_RELOC (r_type)
13083 != (sym_type == STT_TLS
13084 || (sym_type == STT_SECTION
13085 && (sec->flags & SEC_THREAD_LOCAL) != 0))))
13086 {
13087 if (tls_mask != 0
13088 && (r_type == R_PPC64_TLS
13089 || r_type == R_PPC64_TLSGD
13090 || r_type == R_PPC64_TLSLD))
13091 /* R_PPC64_TLS is OK against a symbol in the TOC. */
13092 ;
13093 else
13094 info->callbacks->einfo
13095 (!IS_PPC64_TLS_RELOC (r_type)
13096 ? _("%P: %H: %s used with TLS symbol `%T'\n")
13097 : _("%P: %H: %s used with non-TLS symbol `%T'\n"),
13098 input_bfd, input_section, rel->r_offset,
13099 ppc64_elf_howto_table[r_type]->name,
13100 sym_name);
13101 }
13102
13103 /* Ensure reloc mapping code below stays sane. */
13104 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
13105 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
13106 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
13107 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
13108 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
13109 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
13110 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
13111 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
13112 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
13113 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
13114 abort ();
13115
13116 switch (r_type)
13117 {
13118 default:
13119 break;
13120
13121 case R_PPC64_LO_DS_OPT:
13122 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13123 if ((insn & (0x3f << 26)) != 58u << 26)
13124 abort ();
13125 insn += (14u << 26) - (58u << 26);
13126 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13127 r_type = R_PPC64_TOC16_LO;
13128 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13129 break;
13130
13131 case R_PPC64_TOC16:
13132 case R_PPC64_TOC16_LO:
13133 case R_PPC64_TOC16_DS:
13134 case R_PPC64_TOC16_LO_DS:
13135 {
13136 /* Check for toc tls entries. */
13137 unsigned char *toc_tls;
13138 int retval;
13139
13140 retval = get_tls_mask (&toc_tls, &toc_symndx, &toc_addend,
13141 &local_syms, rel, input_bfd);
13142 if (retval == 0)
13143 return FALSE;
13144
13145 if (toc_tls)
13146 {
13147 tls_mask = *toc_tls;
13148 if (r_type == R_PPC64_TOC16_DS
13149 || r_type == R_PPC64_TOC16_LO_DS)
13150 {
13151 if (tls_mask != 0
13152 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
13153 goto toctprel;
13154 }
13155 else
13156 {
13157 /* If we found a GD reloc pair, then we might be
13158 doing a GD->IE transition. */
13159 if (retval == 2)
13160 {
13161 tls_gd = TLS_TPRELGD;
13162 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13163 goto tls_ldgd_opt;
13164 }
13165 else if (retval == 3)
13166 {
13167 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13168 goto tls_ldgd_opt;
13169 }
13170 }
13171 }
13172 }
13173 break;
13174
13175 case R_PPC64_GOT_TPREL16_HI:
13176 case R_PPC64_GOT_TPREL16_HA:
13177 if (tls_mask != 0
13178 && (tls_mask & TLS_TPREL) == 0)
13179 {
13180 rel->r_offset -= d_offset;
13181 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13182 r_type = R_PPC64_NONE;
13183 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13184 }
13185 break;
13186
13187 case R_PPC64_GOT_TPREL16_DS:
13188 case R_PPC64_GOT_TPREL16_LO_DS:
13189 if (tls_mask != 0
13190 && (tls_mask & TLS_TPREL) == 0)
13191 {
13192 toctprel:
13193 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - d_offset);
13194 insn &= 31 << 21;
13195 insn |= 0x3c0d0000; /* addis 0,13,0 */
13196 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - d_offset);
13197 r_type = R_PPC64_TPREL16_HA;
13198 if (toc_symndx != 0)
13199 {
13200 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13201 rel->r_addend = toc_addend;
13202 /* We changed the symbol. Start over in order to
13203 get h, sym, sec etc. right. */
13204 rel--;
13205 continue;
13206 }
13207 else
13208 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13209 }
13210 break;
13211
13212 case R_PPC64_TLS:
13213 if (tls_mask != 0
13214 && (tls_mask & TLS_TPREL) == 0)
13215 {
13216 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
13217 insn = _bfd_elf_ppc_at_tls_transform (insn, 13);
13218 if (insn == 0)
13219 abort ();
13220 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13221 /* Was PPC64_TLS which sits on insn boundary, now
13222 PPC64_TPREL16_LO which is at low-order half-word. */
13223 rel->r_offset += d_offset;
13224 r_type = R_PPC64_TPREL16_LO;
13225 if (toc_symndx != 0)
13226 {
13227 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
13228 rel->r_addend = toc_addend;
13229 /* We changed the symbol. Start over in order to
13230 get h, sym, sec etc. right. */
13231 rel--;
13232 continue;
13233 }
13234 else
13235 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13236 }
13237 break;
13238
13239 case R_PPC64_GOT_TLSGD16_HI:
13240 case R_PPC64_GOT_TLSGD16_HA:
13241 tls_gd = TLS_TPRELGD;
13242 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13243 goto tls_gdld_hi;
13244 break;
13245
13246 case R_PPC64_GOT_TLSLD16_HI:
13247 case R_PPC64_GOT_TLSLD16_HA:
13248 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13249 {
13250 tls_gdld_hi:
13251 if ((tls_mask & tls_gd) != 0)
13252 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13253 + R_PPC64_GOT_TPREL16_DS);
13254 else
13255 {
13256 rel->r_offset -= d_offset;
13257 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13258 r_type = R_PPC64_NONE;
13259 }
13260 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13261 }
13262 break;
13263
13264 case R_PPC64_GOT_TLSGD16:
13265 case R_PPC64_GOT_TLSGD16_LO:
13266 tls_gd = TLS_TPRELGD;
13267 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13268 goto tls_ldgd_opt;
13269 break;
13270
13271 case R_PPC64_GOT_TLSLD16:
13272 case R_PPC64_GOT_TLSLD16_LO:
13273 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13274 {
13275 unsigned int insn1, insn2, insn3;
13276 bfd_vma offset;
13277
13278 tls_ldgd_opt:
13279 offset = (bfd_vma) -1;
13280 /* If not using the newer R_PPC64_TLSGD/LD to mark
13281 __tls_get_addr calls, we must trust that the call
13282 stays with its arg setup insns, ie. that the next
13283 reloc is the __tls_get_addr call associated with
13284 the current reloc. Edit both insns. */
13285 if (input_section->has_tls_get_addr_call
13286 && rel + 1 < relend
13287 && branch_reloc_hash_match (input_bfd, rel + 1,
13288 htab->tls_get_addr,
13289 htab->tls_get_addr_fd))
13290 offset = rel[1].r_offset;
13291 if ((tls_mask & tls_gd) != 0)
13292 {
13293 /* IE */
13294 insn1 = bfd_get_32 (output_bfd,
13295 contents + rel->r_offset - d_offset);
13296 insn1 &= (1 << 26) - (1 << 2);
13297 insn1 |= 58 << 26; /* ld */
13298 insn2 = 0x7c636a14; /* add 3,3,13 */
13299 if (offset != (bfd_vma) -1)
13300 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13301 if ((tls_mask & TLS_EXPLICIT) == 0)
13302 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
13303 + R_PPC64_GOT_TPREL16_DS);
13304 else
13305 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
13306 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13307 }
13308 else
13309 {
13310 /* LE */
13311 insn1 = 0x3c6d0000; /* addis 3,13,0 */
13312 insn2 = 0x38630000; /* addi 3,3,0 */
13313 if (tls_gd == 0)
13314 {
13315 /* Was an LD reloc. */
13316 if (toc_symndx)
13317 sec = local_sections[toc_symndx];
13318 for (r_symndx = 0;
13319 r_symndx < symtab_hdr->sh_info;
13320 r_symndx++)
13321 if (local_sections[r_symndx] == sec)
13322 break;
13323 if (r_symndx >= symtab_hdr->sh_info)
13324 r_symndx = STN_UNDEF;
13325 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13326 if (r_symndx != STN_UNDEF)
13327 rel->r_addend -= (local_syms[r_symndx].st_value
13328 + sec->output_offset
13329 + sec->output_section->vma);
13330 }
13331 else if (toc_symndx != 0)
13332 {
13333 r_symndx = toc_symndx;
13334 rel->r_addend = toc_addend;
13335 }
13336 r_type = R_PPC64_TPREL16_HA;
13337 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13338 if (offset != (bfd_vma) -1)
13339 {
13340 rel[1].r_info = ELF64_R_INFO (r_symndx,
13341 R_PPC64_TPREL16_LO);
13342 rel[1].r_offset = offset + d_offset;
13343 rel[1].r_addend = rel->r_addend;
13344 }
13345 }
13346 bfd_put_32 (output_bfd, insn1,
13347 contents + rel->r_offset - d_offset);
13348 if (offset != (bfd_vma) -1)
13349 {
13350 insn3 = bfd_get_32 (output_bfd,
13351 contents + offset + 4);
13352 if (insn3 == NOP
13353 || insn3 == CROR_151515 || insn3 == CROR_313131)
13354 {
13355 rel[1].r_offset += 4;
13356 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13357 insn2 = NOP;
13358 }
13359 bfd_put_32 (output_bfd, insn2, contents + offset);
13360 }
13361 if ((tls_mask & tls_gd) == 0
13362 && (tls_gd == 0 || toc_symndx != 0))
13363 {
13364 /* We changed the symbol. Start over in order
13365 to get h, sym, sec etc. right. */
13366 rel--;
13367 continue;
13368 }
13369 }
13370 break;
13371
13372 case R_PPC64_TLSGD:
13373 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
13374 {
13375 unsigned int insn2, insn3;
13376 bfd_vma offset = rel->r_offset;
13377
13378 if ((tls_mask & TLS_TPRELGD) != 0)
13379 {
13380 /* IE */
13381 r_type = R_PPC64_NONE;
13382 insn2 = 0x7c636a14; /* add 3,3,13 */
13383 }
13384 else
13385 {
13386 /* LE */
13387 if (toc_symndx != 0)
13388 {
13389 r_symndx = toc_symndx;
13390 rel->r_addend = toc_addend;
13391 }
13392 r_type = R_PPC64_TPREL16_LO;
13393 rel->r_offset = offset + d_offset;
13394 insn2 = 0x38630000; /* addi 3,3,0 */
13395 }
13396 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13397 /* Zap the reloc on the _tls_get_addr call too. */
13398 BFD_ASSERT (offset == rel[1].r_offset);
13399 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13400 insn3 = bfd_get_32 (output_bfd,
13401 contents + offset + 4);
13402 if (insn3 == NOP
13403 || insn3 == CROR_151515 || insn3 == CROR_313131)
13404 {
13405 rel->r_offset += 4;
13406 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13407 insn2 = NOP;
13408 }
13409 bfd_put_32 (output_bfd, insn2, contents + offset);
13410 if ((tls_mask & TLS_TPRELGD) == 0 && toc_symndx != 0)
13411 {
13412 rel--;
13413 continue;
13414 }
13415 }
13416 break;
13417
13418 case R_PPC64_TLSLD:
13419 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
13420 {
13421 unsigned int insn2, insn3;
13422 bfd_vma offset = rel->r_offset;
13423
13424 if (toc_symndx)
13425 sec = local_sections[toc_symndx];
13426 for (r_symndx = 0;
13427 r_symndx < symtab_hdr->sh_info;
13428 r_symndx++)
13429 if (local_sections[r_symndx] == sec)
13430 break;
13431 if (r_symndx >= symtab_hdr->sh_info)
13432 r_symndx = STN_UNDEF;
13433 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
13434 if (r_symndx != STN_UNDEF)
13435 rel->r_addend -= (local_syms[r_symndx].st_value
13436 + sec->output_offset
13437 + sec->output_section->vma);
13438
13439 r_type = R_PPC64_TPREL16_LO;
13440 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13441 rel->r_offset = offset + d_offset;
13442 /* Zap the reloc on the _tls_get_addr call too. */
13443 BFD_ASSERT (offset == rel[1].r_offset);
13444 rel[1].r_info = ELF64_R_INFO (STN_UNDEF, R_PPC64_NONE);
13445 insn2 = 0x38630000; /* addi 3,3,0 */
13446 insn3 = bfd_get_32 (output_bfd,
13447 contents + offset + 4);
13448 if (insn3 == NOP
13449 || insn3 == CROR_151515 || insn3 == CROR_313131)
13450 {
13451 rel->r_offset += 4;
13452 bfd_put_32 (output_bfd, insn2, contents + offset + 4);
13453 insn2 = NOP;
13454 }
13455 bfd_put_32 (output_bfd, insn2, contents + offset);
13456 rel--;
13457 continue;
13458 }
13459 break;
13460
13461 case R_PPC64_DTPMOD64:
13462 if (rel + 1 < relend
13463 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
13464 && rel[1].r_offset == rel->r_offset + 8)
13465 {
13466 if ((tls_mask & TLS_GD) == 0)
13467 {
13468 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
13469 if ((tls_mask & TLS_TPRELGD) != 0)
13470 r_type = R_PPC64_TPREL64;
13471 else
13472 {
13473 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13474 r_type = R_PPC64_NONE;
13475 }
13476 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13477 }
13478 }
13479 else
13480 {
13481 if ((tls_mask & TLS_LD) == 0)
13482 {
13483 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
13484 r_type = R_PPC64_NONE;
13485 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13486 }
13487 }
13488 break;
13489
13490 case R_PPC64_TPREL64:
13491 if ((tls_mask & TLS_TPREL) == 0)
13492 {
13493 r_type = R_PPC64_NONE;
13494 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13495 }
13496 break;
13497
13498 case R_PPC64_REL16_HA:
13499 /* If we are generating a non-PIC executable, edit
13500 . 0: addis 2,12,.TOC.-0b@ha
13501 . addi 2,2,.TOC.-0b@l
13502 used by ELFv2 global entry points to set up r2, to
13503 . lis 2,.TOC.@ha
13504 . addi 2,2,.TOC.@l
13505 if .TOC. is in range. */
13506 if (!info->shared
13507 && h != NULL && &h->elf == htab->elf.hgot
13508 && rel + 1 < relend
13509 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_REL16_LO)
13510 && rel[1].r_offset == rel->r_offset + 4
13511 && rel[1].r_addend == rel->r_addend + 4
13512 && relocation + 0x80008000 <= 0xffffffff)
13513 {
13514 unsigned int insn1, insn2;
13515 bfd_vma offset = rel->r_offset - d_offset;
13516 insn1 = bfd_get_32 (output_bfd, contents + offset);
13517 insn2 = bfd_get_32 (output_bfd, contents + offset + 4);
13518 if ((insn1 & 0xffff0000) == 0x3c4c0000 /* addis 2,12 */
13519 && (insn2 & 0xffff0000) == 0x38420000 /* addi 2,2 */)
13520 {
13521 r_type = R_PPC64_ADDR16_HA;
13522 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
13523 rel->r_addend -= d_offset;
13524 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_ADDR16_LO);
13525 rel[1].r_addend -= d_offset + 4;
13526 bfd_put_32 (output_bfd, 0x3c400000, contents + offset);
13527 }
13528 }
13529 break;
13530 }
13531
13532 /* Handle other relocations that tweak non-addend part of insn. */
13533 insn = 0;
13534 max_br_offset = 1 << 25;
13535 addend = rel->r_addend;
13536 reloc_dest = DEST_NORMAL;
13537 switch (r_type)
13538 {
13539 default:
13540 break;
13541
13542 case R_PPC64_TOCSAVE:
13543 if (relocation + addend == (rel->r_offset
13544 + input_section->output_offset
13545 + input_section->output_section->vma)
13546 && tocsave_find (htab, NO_INSERT,
13547 &local_syms, rel, input_bfd))
13548 {
13549 insn = bfd_get_32 (input_bfd, contents + rel->r_offset);
13550 if (insn == NOP
13551 || insn == CROR_151515 || insn == CROR_313131)
13552 bfd_put_32 (input_bfd,
13553 STD_R2_0R1 + STK_TOC (htab),
13554 contents + rel->r_offset);
13555 }
13556 break;
13557
13558 /* Branch taken prediction relocations. */
13559 case R_PPC64_ADDR14_BRTAKEN:
13560 case R_PPC64_REL14_BRTAKEN:
13561 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
13562 /* Fall thru. */
13563
13564 /* Branch not taken prediction relocations. */
13565 case R_PPC64_ADDR14_BRNTAKEN:
13566 case R_PPC64_REL14_BRNTAKEN:
13567 insn |= bfd_get_32 (output_bfd,
13568 contents + rel->r_offset) & ~(0x01 << 21);
13569 /* Fall thru. */
13570
13571 case R_PPC64_REL14:
13572 max_br_offset = 1 << 15;
13573 /* Fall thru. */
13574
13575 case R_PPC64_REL24:
13576 /* Calls to functions with a different TOC, such as calls to
13577 shared objects, need to alter the TOC pointer. This is
13578 done using a linkage stub. A REL24 branching to these
13579 linkage stubs needs to be followed by a nop, as the nop
13580 will be replaced with an instruction to restore the TOC
13581 base pointer. */
13582 fdh = h;
13583 if (h != NULL
13584 && h->oh != NULL
13585 && h->oh->is_func_descriptor)
13586 fdh = ppc_follow_link (h->oh);
13587 stub_entry = ppc_get_stub_entry (input_section, sec, fdh, &orig_rel,
13588 htab);
13589 if (stub_entry != NULL
13590 && (stub_entry->stub_type == ppc_stub_plt_call
13591 || stub_entry->stub_type == ppc_stub_plt_call_r2save
13592 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
13593 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
13594 {
13595 bfd_boolean can_plt_call = FALSE;
13596
13597 /* All of these stubs will modify r2, so there must be a
13598 branch and link followed by a nop. The nop is
13599 replaced by an insn to restore r2. */
13600 if (rel->r_offset + 8 <= input_section->size)
13601 {
13602 unsigned long br;
13603
13604 br = bfd_get_32 (input_bfd,
13605 contents + rel->r_offset);
13606 if ((br & 1) != 0)
13607 {
13608 unsigned long nop;
13609
13610 nop = bfd_get_32 (input_bfd,
13611 contents + rel->r_offset + 4);
13612 if (nop == NOP
13613 || nop == CROR_151515 || nop == CROR_313131)
13614 {
13615 if (h != NULL
13616 && (h == htab->tls_get_addr_fd
13617 || h == htab->tls_get_addr)
13618 && !htab->no_tls_get_addr_opt)
13619 {
13620 /* Special stub used, leave nop alone. */
13621 }
13622 else
13623 bfd_put_32 (input_bfd,
13624 LD_R2_0R1 + STK_TOC (htab),
13625 contents + rel->r_offset + 4);
13626 can_plt_call = TRUE;
13627 }
13628 }
13629 }
13630
13631 if (!can_plt_call && h != NULL)
13632 {
13633 const char *name = h->elf.root.root.string;
13634
13635 if (*name == '.')
13636 ++name;
13637
13638 if (strncmp (name, "__libc_start_main", 17) == 0
13639 && (name[17] == 0 || name[17] == '@'))
13640 {
13641 /* Allow crt1 branch to go via a toc adjusting
13642 stub. Other calls that never return could do
13643 the same, if we could detect such. */
13644 can_plt_call = TRUE;
13645 }
13646 }
13647
13648 if (!can_plt_call)
13649 {
13650 /* g++ as of 20130507 emits self-calls without a
13651 following nop. This is arguably wrong since we
13652 have conflicting information. On the one hand a
13653 global symbol and on the other a local call
13654 sequence, but don't error for this special case.
13655 It isn't possible to cheaply verify we have
13656 exactly such a call. Allow all calls to the same
13657 section. */
13658 asection *code_sec = sec;
13659
13660 if (get_opd_info (sec) != NULL)
13661 {
13662 bfd_vma off = (relocation + addend
13663 - sec->output_section->vma
13664 - sec->output_offset);
13665
13666 opd_entry_value (sec, off, &code_sec, NULL, FALSE);
13667 }
13668 if (code_sec == input_section)
13669 can_plt_call = TRUE;
13670 }
13671
13672 if (!can_plt_call)
13673 {
13674 info->callbacks->einfo
13675 (_("%P: %H: call to `%T' lacks nop, can't restore toc; "
13676 "recompile with -fPIC\n"),
13677 input_bfd, input_section, rel->r_offset, sym_name);
13678
13679 bfd_set_error (bfd_error_bad_value);
13680 ret = FALSE;
13681 }
13682
13683 if (can_plt_call
13684 && (stub_entry->stub_type == ppc_stub_plt_call
13685 || stub_entry->stub_type == ppc_stub_plt_call_r2save))
13686 unresolved_reloc = FALSE;
13687 }
13688
13689 if ((stub_entry == NULL
13690 || stub_entry->stub_type == ppc_stub_long_branch
13691 || stub_entry->stub_type == ppc_stub_plt_branch)
13692 && get_opd_info (sec) != NULL)
13693 {
13694 /* The branch destination is the value of the opd entry. */
13695 bfd_vma off = (relocation + addend
13696 - sec->output_section->vma
13697 - sec->output_offset);
13698 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL, FALSE);
13699 if (dest != (bfd_vma) -1)
13700 {
13701 relocation = dest;
13702 addend = 0;
13703 reloc_dest = DEST_OPD;
13704 }
13705 }
13706
13707 /* If the branch is out of reach we ought to have a long
13708 branch stub. */
13709 from = (rel->r_offset
13710 + input_section->output_offset
13711 + input_section->output_section->vma);
13712
13713 relocation += PPC64_LOCAL_ENTRY_OFFSET (fdh
13714 ? fdh->elf.other
13715 : sym->st_other);
13716
13717 if (stub_entry != NULL
13718 && (stub_entry->stub_type == ppc_stub_long_branch
13719 || stub_entry->stub_type == ppc_stub_plt_branch)
13720 && (r_type == R_PPC64_ADDR14_BRTAKEN
13721 || r_type == R_PPC64_ADDR14_BRNTAKEN
13722 || (relocation + addend - from + max_br_offset
13723 < 2 * max_br_offset)))
13724 /* Don't use the stub if this branch is in range. */
13725 stub_entry = NULL;
13726
13727 if (stub_entry != NULL)
13728 {
13729 /* Munge up the value and addend so that we call the stub
13730 rather than the procedure directly. */
13731 relocation = (stub_entry->stub_offset
13732 + stub_entry->stub_sec->output_offset
13733 + stub_entry->stub_sec->output_section->vma);
13734 addend = 0;
13735 reloc_dest = DEST_STUB;
13736
13737 if ((stub_entry->stub_type == ppc_stub_plt_call
13738 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13739 && (ALWAYS_EMIT_R2SAVE
13740 || stub_entry->stub_type == ppc_stub_plt_call_r2save)
13741 && rel + 1 < relend
13742 && rel[1].r_offset == rel->r_offset + 4
13743 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOCSAVE)
13744 relocation += 4;
13745 }
13746
13747 if (insn != 0)
13748 {
13749 if (is_isa_v2)
13750 {
13751 /* Set 'a' bit. This is 0b00010 in BO field for branch
13752 on CR(BI) insns (BO == 001at or 011at), and 0b01000
13753 for branch on CTR insns (BO == 1a00t or 1a01t). */
13754 if ((insn & (0x14 << 21)) == (0x04 << 21))
13755 insn |= 0x02 << 21;
13756 else if ((insn & (0x14 << 21)) == (0x10 << 21))
13757 insn |= 0x08 << 21;
13758 else
13759 break;
13760 }
13761 else
13762 {
13763 /* Invert 'y' bit if not the default. */
13764 if ((bfd_signed_vma) (relocation + addend - from) < 0)
13765 insn ^= 0x01 << 21;
13766 }
13767
13768 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
13769 }
13770
13771 /* NOP out calls to undefined weak functions.
13772 We can thus call a weak function without first
13773 checking whether the function is defined. */
13774 else if (h != NULL
13775 && h->elf.root.type == bfd_link_hash_undefweak
13776 && h->elf.dynindx == -1
13777 && r_type == R_PPC64_REL24
13778 && relocation == 0
13779 && addend == 0)
13780 {
13781 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
13782 continue;
13783 }
13784 break;
13785 }
13786
13787 /* Set `addend'. */
13788 tls_type = 0;
13789 switch (r_type)
13790 {
13791 default:
13792 info->callbacks->einfo
13793 (_("%P: %B: unknown relocation type %d for `%T'\n"),
13794 input_bfd, (int) r_type, sym_name);
13795
13796 bfd_set_error (bfd_error_bad_value);
13797 ret = FALSE;
13798 continue;
13799
13800 case R_PPC64_NONE:
13801 case R_PPC64_TLS:
13802 case R_PPC64_TLSGD:
13803 case R_PPC64_TLSLD:
13804 case R_PPC64_TOCSAVE:
13805 case R_PPC64_GNU_VTINHERIT:
13806 case R_PPC64_GNU_VTENTRY:
13807 continue;
13808
13809 /* GOT16 relocations. Like an ADDR16 using the symbol's
13810 address in the GOT as relocation value instead of the
13811 symbol's value itself. Also, create a GOT entry for the
13812 symbol and put the symbol value there. */
13813 case R_PPC64_GOT_TLSGD16:
13814 case R_PPC64_GOT_TLSGD16_LO:
13815 case R_PPC64_GOT_TLSGD16_HI:
13816 case R_PPC64_GOT_TLSGD16_HA:
13817 tls_type = TLS_TLS | TLS_GD;
13818 goto dogot;
13819
13820 case R_PPC64_GOT_TLSLD16:
13821 case R_PPC64_GOT_TLSLD16_LO:
13822 case R_PPC64_GOT_TLSLD16_HI:
13823 case R_PPC64_GOT_TLSLD16_HA:
13824 tls_type = TLS_TLS | TLS_LD;
13825 goto dogot;
13826
13827 case R_PPC64_GOT_TPREL16_DS:
13828 case R_PPC64_GOT_TPREL16_LO_DS:
13829 case R_PPC64_GOT_TPREL16_HI:
13830 case R_PPC64_GOT_TPREL16_HA:
13831 tls_type = TLS_TLS | TLS_TPREL;
13832 goto dogot;
13833
13834 case R_PPC64_GOT_DTPREL16_DS:
13835 case R_PPC64_GOT_DTPREL16_LO_DS:
13836 case R_PPC64_GOT_DTPREL16_HI:
13837 case R_PPC64_GOT_DTPREL16_HA:
13838 tls_type = TLS_TLS | TLS_DTPREL;
13839 goto dogot;
13840
13841 case R_PPC64_GOT16:
13842 case R_PPC64_GOT16_LO:
13843 case R_PPC64_GOT16_HI:
13844 case R_PPC64_GOT16_HA:
13845 case R_PPC64_GOT16_DS:
13846 case R_PPC64_GOT16_LO_DS:
13847 dogot:
13848 {
13849 /* Relocation is to the entry for this symbol in the global
13850 offset table. */
13851 asection *got;
13852 bfd_vma *offp;
13853 bfd_vma off;
13854 unsigned long indx = 0;
13855 struct got_entry *ent;
13856
13857 if (tls_type == (TLS_TLS | TLS_LD)
13858 && (h == NULL
13859 || !h->elf.def_dynamic))
13860 ent = ppc64_tlsld_got (input_bfd);
13861 else
13862 {
13863
13864 if (h != NULL)
13865 {
13866 bfd_boolean dyn = htab->elf.dynamic_sections_created;
13867 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
13868 &h->elf)
13869 || (info->shared
13870 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
13871 /* This is actually a static link, or it is a
13872 -Bsymbolic link and the symbol is defined
13873 locally, or the symbol was forced to be local
13874 because of a version file. */
13875 ;
13876 else
13877 {
13878 BFD_ASSERT (h->elf.dynindx != -1);
13879 indx = h->elf.dynindx;
13880 unresolved_reloc = FALSE;
13881 }
13882 ent = h->elf.got.glist;
13883 }
13884 else
13885 {
13886 if (local_got_ents == NULL)
13887 abort ();
13888 ent = local_got_ents[r_symndx];
13889 }
13890
13891 for (; ent != NULL; ent = ent->next)
13892 if (ent->addend == orig_rel.r_addend
13893 && ent->owner == input_bfd
13894 && ent->tls_type == tls_type)
13895 break;
13896 }
13897
13898 if (ent == NULL)
13899 abort ();
13900 if (ent->is_indirect)
13901 ent = ent->got.ent;
13902 offp = &ent->got.offset;
13903 got = ppc64_elf_tdata (ent->owner)->got;
13904 if (got == NULL)
13905 abort ();
13906
13907 /* The offset must always be a multiple of 8. We use the
13908 least significant bit to record whether we have already
13909 processed this entry. */
13910 off = *offp;
13911 if ((off & 1) != 0)
13912 off &= ~1;
13913 else
13914 {
13915 /* Generate relocs for the dynamic linker, except in
13916 the case of TLSLD where we'll use one entry per
13917 module. */
13918 asection *relgot;
13919 bfd_boolean ifunc;
13920
13921 *offp = off | 1;
13922 relgot = NULL;
13923 ifunc = (h != NULL
13924 ? h->elf.type == STT_GNU_IFUNC
13925 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC);
13926 if (ifunc)
13927 relgot = htab->elf.irelplt;
13928 else if ((info->shared || indx != 0)
13929 && (h == NULL
13930 || (tls_type == (TLS_TLS | TLS_LD)
13931 && !h->elf.def_dynamic)
13932 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
13933 || h->elf.root.type != bfd_link_hash_undefweak))
13934 relgot = ppc64_elf_tdata (ent->owner)->relgot;
13935 if (relgot != NULL)
13936 {
13937 outrel.r_offset = (got->output_section->vma
13938 + got->output_offset
13939 + off);
13940 outrel.r_addend = addend;
13941 if (tls_type & (TLS_LD | TLS_GD))
13942 {
13943 outrel.r_addend = 0;
13944 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
13945 if (tls_type == (TLS_TLS | TLS_GD))
13946 {
13947 loc = relgot->contents;
13948 loc += (relgot->reloc_count++
13949 * sizeof (Elf64_External_Rela));
13950 bfd_elf64_swap_reloca_out (output_bfd,
13951 &outrel, loc);
13952 outrel.r_offset += 8;
13953 outrel.r_addend = addend;
13954 outrel.r_info
13955 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13956 }
13957 }
13958 else if (tls_type == (TLS_TLS | TLS_DTPREL))
13959 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
13960 else if (tls_type == (TLS_TLS | TLS_TPREL))
13961 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
13962 else if (indx != 0)
13963 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
13964 else
13965 {
13966 if (ifunc)
13967 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
13968 else
13969 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
13970
13971 /* Write the .got section contents for the sake
13972 of prelink. */
13973 loc = got->contents + off;
13974 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
13975 loc);
13976 }
13977
13978 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
13979 {
13980 outrel.r_addend += relocation;
13981 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
13982 outrel.r_addend -= htab->elf.tls_sec->vma;
13983 }
13984 loc = relgot->contents;
13985 loc += (relgot->reloc_count++
13986 * sizeof (Elf64_External_Rela));
13987 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
13988 }
13989
13990 /* Init the .got section contents here if we're not
13991 emitting a reloc. */
13992 else
13993 {
13994 relocation += addend;
13995 if (tls_type == (TLS_TLS | TLS_LD))
13996 relocation = 1;
13997 else if (tls_type != 0)
13998 {
13999 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
14000 if (tls_type == (TLS_TLS | TLS_TPREL))
14001 relocation += DTP_OFFSET - TP_OFFSET;
14002
14003 if (tls_type == (TLS_TLS | TLS_GD))
14004 {
14005 bfd_put_64 (output_bfd, relocation,
14006 got->contents + off + 8);
14007 relocation = 1;
14008 }
14009 }
14010
14011 bfd_put_64 (output_bfd, relocation,
14012 got->contents + off);
14013 }
14014 }
14015
14016 if (off >= (bfd_vma) -2)
14017 abort ();
14018
14019 relocation = got->output_section->vma + got->output_offset + off;
14020 addend = -(TOCstart + htab->stub_group[input_section->id].toc_off);
14021 }
14022 break;
14023
14024 case R_PPC64_PLT16_HA:
14025 case R_PPC64_PLT16_HI:
14026 case R_PPC64_PLT16_LO:
14027 case R_PPC64_PLT32:
14028 case R_PPC64_PLT64:
14029 /* Relocation is to the entry for this symbol in the
14030 procedure linkage table. */
14031
14032 /* Resolve a PLT reloc against a local symbol directly,
14033 without using the procedure linkage table. */
14034 if (h == NULL)
14035 break;
14036
14037 /* It's possible that we didn't make a PLT entry for this
14038 symbol. This happens when statically linking PIC code,
14039 or when using -Bsymbolic. Go find a match if there is a
14040 PLT entry. */
14041 if (htab->elf.splt != NULL)
14042 {
14043 struct plt_entry *ent;
14044 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
14045 if (ent->plt.offset != (bfd_vma) -1
14046 && ent->addend == orig_rel.r_addend)
14047 {
14048 relocation = (htab->elf.splt->output_section->vma
14049 + htab->elf.splt->output_offset
14050 + ent->plt.offset);
14051 unresolved_reloc = FALSE;
14052 break;
14053 }
14054 }
14055 break;
14056
14057 case R_PPC64_TOC:
14058 /* Relocation value is TOC base. */
14059 relocation = TOCstart;
14060 if (r_symndx == STN_UNDEF)
14061 relocation += htab->stub_group[input_section->id].toc_off;
14062 else if (unresolved_reloc)
14063 ;
14064 else if (sec != NULL && sec->id <= htab->top_id)
14065 relocation += htab->stub_group[sec->id].toc_off;
14066 else
14067 unresolved_reloc = TRUE;
14068 goto dodyn;
14069
14070 /* TOC16 relocs. We want the offset relative to the TOC base,
14071 which is the address of the start of the TOC plus 0x8000.
14072 The TOC consists of sections .got, .toc, .tocbss, and .plt,
14073 in this order. */
14074 case R_PPC64_TOC16:
14075 case R_PPC64_TOC16_LO:
14076 case R_PPC64_TOC16_HI:
14077 case R_PPC64_TOC16_DS:
14078 case R_PPC64_TOC16_LO_DS:
14079 case R_PPC64_TOC16_HA:
14080 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
14081 break;
14082
14083 /* Relocate against the beginning of the section. */
14084 case R_PPC64_SECTOFF:
14085 case R_PPC64_SECTOFF_LO:
14086 case R_PPC64_SECTOFF_HI:
14087 case R_PPC64_SECTOFF_DS:
14088 case R_PPC64_SECTOFF_LO_DS:
14089 case R_PPC64_SECTOFF_HA:
14090 if (sec != NULL)
14091 addend -= sec->output_section->vma;
14092 break;
14093
14094 case R_PPC64_REL16:
14095 case R_PPC64_REL16_LO:
14096 case R_PPC64_REL16_HI:
14097 case R_PPC64_REL16_HA:
14098 break;
14099
14100 case R_PPC64_REL14:
14101 case R_PPC64_REL14_BRNTAKEN:
14102 case R_PPC64_REL14_BRTAKEN:
14103 case R_PPC64_REL24:
14104 break;
14105
14106 case R_PPC64_TPREL16:
14107 case R_PPC64_TPREL16_LO:
14108 case R_PPC64_TPREL16_HI:
14109 case R_PPC64_TPREL16_HA:
14110 case R_PPC64_TPREL16_DS:
14111 case R_PPC64_TPREL16_LO_DS:
14112 case R_PPC64_TPREL16_HIGH:
14113 case R_PPC64_TPREL16_HIGHA:
14114 case R_PPC64_TPREL16_HIGHER:
14115 case R_PPC64_TPREL16_HIGHERA:
14116 case R_PPC64_TPREL16_HIGHEST:
14117 case R_PPC64_TPREL16_HIGHESTA:
14118 if (h != NULL
14119 && h->elf.root.type == bfd_link_hash_undefweak
14120 && h->elf.dynindx == -1)
14121 {
14122 /* Make this relocation against an undefined weak symbol
14123 resolve to zero. This is really just a tweak, since
14124 code using weak externs ought to check that they are
14125 defined before using them. */
14126 bfd_byte *p = contents + rel->r_offset - d_offset;
14127
14128 insn = bfd_get_32 (output_bfd, p);
14129 insn = _bfd_elf_ppc_at_tprel_transform (insn, 13);
14130 if (insn != 0)
14131 bfd_put_32 (output_bfd, insn, p);
14132 break;
14133 }
14134 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14135 if (info->shared)
14136 /* The TPREL16 relocs shouldn't really be used in shared
14137 libs as they will result in DT_TEXTREL being set, but
14138 support them anyway. */
14139 goto dodyn;
14140 break;
14141
14142 case R_PPC64_DTPREL16:
14143 case R_PPC64_DTPREL16_LO:
14144 case R_PPC64_DTPREL16_HI:
14145 case R_PPC64_DTPREL16_HA:
14146 case R_PPC64_DTPREL16_DS:
14147 case R_PPC64_DTPREL16_LO_DS:
14148 case R_PPC64_DTPREL16_HIGH:
14149 case R_PPC64_DTPREL16_HIGHA:
14150 case R_PPC64_DTPREL16_HIGHER:
14151 case R_PPC64_DTPREL16_HIGHERA:
14152 case R_PPC64_DTPREL16_HIGHEST:
14153 case R_PPC64_DTPREL16_HIGHESTA:
14154 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14155 break;
14156
14157 case R_PPC64_DTPMOD64:
14158 relocation = 1;
14159 addend = 0;
14160 goto dodyn;
14161
14162 case R_PPC64_TPREL64:
14163 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
14164 goto dodyn;
14165
14166 case R_PPC64_DTPREL64:
14167 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
14168 /* Fall thru */
14169
14170 /* Relocations that may need to be propagated if this is a
14171 dynamic object. */
14172 case R_PPC64_REL30:
14173 case R_PPC64_REL32:
14174 case R_PPC64_REL64:
14175 case R_PPC64_ADDR14:
14176 case R_PPC64_ADDR14_BRNTAKEN:
14177 case R_PPC64_ADDR14_BRTAKEN:
14178 case R_PPC64_ADDR16:
14179 case R_PPC64_ADDR16_DS:
14180 case R_PPC64_ADDR16_HA:
14181 case R_PPC64_ADDR16_HI:
14182 case R_PPC64_ADDR16_HIGH:
14183 case R_PPC64_ADDR16_HIGHA:
14184 case R_PPC64_ADDR16_HIGHER:
14185 case R_PPC64_ADDR16_HIGHERA:
14186 case R_PPC64_ADDR16_HIGHEST:
14187 case R_PPC64_ADDR16_HIGHESTA:
14188 case R_PPC64_ADDR16_LO:
14189 case R_PPC64_ADDR16_LO_DS:
14190 case R_PPC64_ADDR24:
14191 case R_PPC64_ADDR32:
14192 case R_PPC64_ADDR64:
14193 case R_PPC64_UADDR16:
14194 case R_PPC64_UADDR32:
14195 case R_PPC64_UADDR64:
14196 dodyn:
14197 if ((input_section->flags & SEC_ALLOC) == 0)
14198 break;
14199
14200 if (NO_OPD_RELOCS && is_opd)
14201 break;
14202
14203 if ((info->shared
14204 && (h == NULL
14205 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
14206 || h->elf.root.type != bfd_link_hash_undefweak)
14207 && (must_be_dyn_reloc (info, r_type)
14208 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
14209 || (ELIMINATE_COPY_RELOCS
14210 && !info->shared
14211 && h != NULL
14212 && h->elf.dynindx != -1
14213 && !h->elf.non_got_ref
14214 && !h->elf.def_regular)
14215 || (!info->shared
14216 && (h != NULL
14217 ? h->elf.type == STT_GNU_IFUNC
14218 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)))
14219 {
14220 bfd_boolean skip, relocate;
14221 asection *sreloc;
14222 bfd_vma out_off;
14223
14224 /* When generating a dynamic object, these relocations
14225 are copied into the output file to be resolved at run
14226 time. */
14227
14228 skip = FALSE;
14229 relocate = FALSE;
14230
14231 out_off = _bfd_elf_section_offset (output_bfd, info,
14232 input_section, rel->r_offset);
14233 if (out_off == (bfd_vma) -1)
14234 skip = TRUE;
14235 else if (out_off == (bfd_vma) -2)
14236 skip = TRUE, relocate = TRUE;
14237 out_off += (input_section->output_section->vma
14238 + input_section->output_offset);
14239 outrel.r_offset = out_off;
14240 outrel.r_addend = rel->r_addend;
14241
14242 /* Optimize unaligned reloc use. */
14243 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
14244 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
14245 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
14246 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
14247 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
14248 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
14249 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
14250 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
14251 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
14252
14253 if (skip)
14254 memset (&outrel, 0, sizeof outrel);
14255 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
14256 && !is_opd
14257 && r_type != R_PPC64_TOC)
14258 {
14259 BFD_ASSERT (h->elf.dynindx != -1);
14260 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
14261 }
14262 else
14263 {
14264 /* This symbol is local, or marked to become local,
14265 or this is an opd section reloc which must point
14266 at a local function. */
14267 outrel.r_addend += relocation;
14268 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
14269 {
14270 if (is_opd && h != NULL)
14271 {
14272 /* Lie about opd entries. This case occurs
14273 when building shared libraries and we
14274 reference a function in another shared
14275 lib. The same thing happens for a weak
14276 definition in an application that's
14277 overridden by a strong definition in a
14278 shared lib. (I believe this is a generic
14279 bug in binutils handling of weak syms.)
14280 In these cases we won't use the opd
14281 entry in this lib. */
14282 unresolved_reloc = FALSE;
14283 }
14284 if (!is_opd
14285 && r_type == R_PPC64_ADDR64
14286 && (h != NULL
14287 ? h->elf.type == STT_GNU_IFUNC
14288 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC))
14289 outrel.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14290 else
14291 {
14292 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
14293
14294 /* We need to relocate .opd contents for ld.so.
14295 Prelink also wants simple and consistent rules
14296 for relocs. This make all RELATIVE relocs have
14297 *r_offset equal to r_addend. */
14298 relocate = TRUE;
14299 }
14300 }
14301 else
14302 {
14303 long indx = 0;
14304
14305 if (h != NULL
14306 ? h->elf.type == STT_GNU_IFUNC
14307 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14308 {
14309 info->callbacks->einfo
14310 (_("%P: %H: %s for indirect "
14311 "function `%T' unsupported\n"),
14312 input_bfd, input_section, rel->r_offset,
14313 ppc64_elf_howto_table[r_type]->name,
14314 sym_name);
14315 ret = FALSE;
14316 }
14317 else if (r_symndx == STN_UNDEF || bfd_is_abs_section (sec))
14318 ;
14319 else if (sec == NULL || sec->owner == NULL)
14320 {
14321 bfd_set_error (bfd_error_bad_value);
14322 return FALSE;
14323 }
14324 else
14325 {
14326 asection *osec;
14327
14328 osec = sec->output_section;
14329 indx = elf_section_data (osec)->dynindx;
14330
14331 if (indx == 0)
14332 {
14333 if ((osec->flags & SEC_READONLY) == 0
14334 && htab->elf.data_index_section != NULL)
14335 osec = htab->elf.data_index_section;
14336 else
14337 osec = htab->elf.text_index_section;
14338 indx = elf_section_data (osec)->dynindx;
14339 }
14340 BFD_ASSERT (indx != 0);
14341
14342 /* We are turning this relocation into one
14343 against a section symbol, so subtract out
14344 the output section's address but not the
14345 offset of the input section in the output
14346 section. */
14347 outrel.r_addend -= osec->vma;
14348 }
14349
14350 outrel.r_info = ELF64_R_INFO (indx, r_type);
14351 }
14352 }
14353
14354 sreloc = elf_section_data (input_section)->sreloc;
14355 if (h != NULL
14356 ? h->elf.type == STT_GNU_IFUNC
14357 : ELF_ST_TYPE (sym->st_info) == STT_GNU_IFUNC)
14358 sreloc = htab->elf.irelplt;
14359 if (sreloc == NULL)
14360 abort ();
14361
14362 if (sreloc->reloc_count * sizeof (Elf64_External_Rela)
14363 >= sreloc->size)
14364 abort ();
14365 loc = sreloc->contents;
14366 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
14367 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
14368
14369 /* If this reloc is against an external symbol, it will
14370 be computed at runtime, so there's no need to do
14371 anything now. However, for the sake of prelink ensure
14372 that the section contents are a known value. */
14373 if (! relocate)
14374 {
14375 unresolved_reloc = FALSE;
14376 /* The value chosen here is quite arbitrary as ld.so
14377 ignores section contents except for the special
14378 case of .opd where the contents might be accessed
14379 before relocation. Choose zero, as that won't
14380 cause reloc overflow. */
14381 relocation = 0;
14382 addend = 0;
14383 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
14384 to improve backward compatibility with older
14385 versions of ld. */
14386 if (r_type == R_PPC64_ADDR64)
14387 addend = outrel.r_addend;
14388 /* Adjust pc_relative relocs to have zero in *r_offset. */
14389 else if (ppc64_elf_howto_table[r_type]->pc_relative)
14390 addend = (input_section->output_section->vma
14391 + input_section->output_offset
14392 + rel->r_offset);
14393 }
14394 }
14395 break;
14396
14397 case R_PPC64_COPY:
14398 case R_PPC64_GLOB_DAT:
14399 case R_PPC64_JMP_SLOT:
14400 case R_PPC64_JMP_IREL:
14401 case R_PPC64_RELATIVE:
14402 /* We shouldn't ever see these dynamic relocs in relocatable
14403 files. */
14404 /* Fall through. */
14405
14406 case R_PPC64_PLTGOT16:
14407 case R_PPC64_PLTGOT16_DS:
14408 case R_PPC64_PLTGOT16_HA:
14409 case R_PPC64_PLTGOT16_HI:
14410 case R_PPC64_PLTGOT16_LO:
14411 case R_PPC64_PLTGOT16_LO_DS:
14412 case R_PPC64_PLTREL32:
14413 case R_PPC64_PLTREL64:
14414 /* These ones haven't been implemented yet. */
14415
14416 info->callbacks->einfo
14417 (_("%P: %B: %s is not supported for `%T'\n"),
14418 input_bfd,
14419 ppc64_elf_howto_table[r_type]->name, sym_name);
14420
14421 bfd_set_error (bfd_error_invalid_operation);
14422 ret = FALSE;
14423 continue;
14424 }
14425
14426 /* Multi-instruction sequences that access the TOC can be
14427 optimized, eg. addis ra,r2,0; addi rb,ra,x;
14428 to nop; addi rb,r2,x; */
14429 switch (r_type)
14430 {
14431 default:
14432 break;
14433
14434 case R_PPC64_GOT_TLSLD16_HI:
14435 case R_PPC64_GOT_TLSGD16_HI:
14436 case R_PPC64_GOT_TPREL16_HI:
14437 case R_PPC64_GOT_DTPREL16_HI:
14438 case R_PPC64_GOT16_HI:
14439 case R_PPC64_TOC16_HI:
14440 /* These relocs would only be useful if building up an
14441 offset to later add to r2, perhaps in an indexed
14442 addressing mode instruction. Don't try to optimize.
14443 Unfortunately, the possibility of someone building up an
14444 offset like this or even with the HA relocs, means that
14445 we need to check the high insn when optimizing the low
14446 insn. */
14447 break;
14448
14449 case R_PPC64_GOT_TLSLD16_HA:
14450 case R_PPC64_GOT_TLSGD16_HA:
14451 case R_PPC64_GOT_TPREL16_HA:
14452 case R_PPC64_GOT_DTPREL16_HA:
14453 case R_PPC64_GOT16_HA:
14454 case R_PPC64_TOC16_HA:
14455 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14456 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14457 {
14458 bfd_byte *p = contents + (rel->r_offset & ~3);
14459 bfd_put_32 (input_bfd, NOP, p);
14460 }
14461 break;
14462
14463 case R_PPC64_GOT_TLSLD16_LO:
14464 case R_PPC64_GOT_TLSGD16_LO:
14465 case R_PPC64_GOT_TPREL16_LO_DS:
14466 case R_PPC64_GOT_DTPREL16_LO_DS:
14467 case R_PPC64_GOT16_LO:
14468 case R_PPC64_GOT16_LO_DS:
14469 case R_PPC64_TOC16_LO:
14470 case R_PPC64_TOC16_LO_DS:
14471 if (htab->do_toc_opt && relocation + addend + 0x8000 < 0x10000
14472 && !ppc64_elf_tdata (input_bfd)->unexpected_toc_insn)
14473 {
14474 bfd_byte *p = contents + (rel->r_offset & ~3);
14475 insn = bfd_get_32 (input_bfd, p);
14476 if ((insn & (0x3f << 26)) == 12u << 26 /* addic */)
14477 {
14478 /* Transform addic to addi when we change reg. */
14479 insn &= ~((0x3f << 26) | (0x1f << 16));
14480 insn |= (14u << 26) | (2 << 16);
14481 }
14482 else
14483 {
14484 insn &= ~(0x1f << 16);
14485 insn |= 2 << 16;
14486 }
14487 bfd_put_32 (input_bfd, insn, p);
14488 }
14489 break;
14490 }
14491
14492 /* Do any further special processing. */
14493 switch (r_type)
14494 {
14495 default:
14496 break;
14497
14498 case R_PPC64_REL16_HA:
14499 case R_PPC64_ADDR16_HA:
14500 case R_PPC64_ADDR16_HIGHA:
14501 case R_PPC64_ADDR16_HIGHERA:
14502 case R_PPC64_ADDR16_HIGHESTA:
14503 case R_PPC64_TOC16_HA:
14504 case R_PPC64_SECTOFF_HA:
14505 case R_PPC64_TPREL16_HA:
14506 case R_PPC64_TPREL16_HIGHA:
14507 case R_PPC64_TPREL16_HIGHERA:
14508 case R_PPC64_TPREL16_HIGHESTA:
14509 case R_PPC64_DTPREL16_HA:
14510 case R_PPC64_DTPREL16_HIGHA:
14511 case R_PPC64_DTPREL16_HIGHERA:
14512 case R_PPC64_DTPREL16_HIGHESTA:
14513 /* It's just possible that this symbol is a weak symbol
14514 that's not actually defined anywhere. In that case,
14515 'sec' would be NULL, and we should leave the symbol
14516 alone (it will be set to zero elsewhere in the link). */
14517 if (sec == NULL)
14518 break;
14519 /* Fall thru */
14520
14521 case R_PPC64_GOT16_HA:
14522 case R_PPC64_PLTGOT16_HA:
14523 case R_PPC64_PLT16_HA:
14524 case R_PPC64_GOT_TLSGD16_HA:
14525 case R_PPC64_GOT_TLSLD16_HA:
14526 case R_PPC64_GOT_TPREL16_HA:
14527 case R_PPC64_GOT_DTPREL16_HA:
14528 /* Add 0x10000 if sign bit in 0:15 is set.
14529 Bits 0:15 are not used. */
14530 addend += 0x8000;
14531 break;
14532
14533 case R_PPC64_ADDR16_DS:
14534 case R_PPC64_ADDR16_LO_DS:
14535 case R_PPC64_GOT16_DS:
14536 case R_PPC64_GOT16_LO_DS:
14537 case R_PPC64_PLT16_LO_DS:
14538 case R_PPC64_SECTOFF_DS:
14539 case R_PPC64_SECTOFF_LO_DS:
14540 case R_PPC64_TOC16_DS:
14541 case R_PPC64_TOC16_LO_DS:
14542 case R_PPC64_PLTGOT16_DS:
14543 case R_PPC64_PLTGOT16_LO_DS:
14544 case R_PPC64_GOT_TPREL16_DS:
14545 case R_PPC64_GOT_TPREL16_LO_DS:
14546 case R_PPC64_GOT_DTPREL16_DS:
14547 case R_PPC64_GOT_DTPREL16_LO_DS:
14548 case R_PPC64_TPREL16_DS:
14549 case R_PPC64_TPREL16_LO_DS:
14550 case R_PPC64_DTPREL16_DS:
14551 case R_PPC64_DTPREL16_LO_DS:
14552 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
14553 mask = 3;
14554 /* If this reloc is against an lq insn, then the value must be
14555 a multiple of 16. This is somewhat of a hack, but the
14556 "correct" way to do this by defining _DQ forms of all the
14557 _DS relocs bloats all reloc switches in this file. It
14558 doesn't seem to make much sense to use any of these relocs
14559 in data, so testing the insn should be safe. */
14560 if ((insn & (0x3f << 26)) == (56u << 26))
14561 mask = 15;
14562 if (((relocation + addend) & mask) != 0)
14563 {
14564 info->callbacks->einfo
14565 (_("%P: %H: error: %s not a multiple of %u\n"),
14566 input_bfd, input_section, rel->r_offset,
14567 ppc64_elf_howto_table[r_type]->name,
14568 mask + 1);
14569 bfd_set_error (bfd_error_bad_value);
14570 ret = FALSE;
14571 continue;
14572 }
14573 break;
14574 }
14575
14576 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
14577 because such sections are not SEC_ALLOC and thus ld.so will
14578 not process them. */
14579 if (unresolved_reloc
14580 && !((input_section->flags & SEC_DEBUGGING) != 0
14581 && h->elf.def_dynamic)
14582 && _bfd_elf_section_offset (output_bfd, info, input_section,
14583 rel->r_offset) != (bfd_vma) -1)
14584 {
14585 info->callbacks->einfo
14586 (_("%P: %H: unresolvable %s against `%T'\n"),
14587 input_bfd, input_section, rel->r_offset,
14588 ppc64_elf_howto_table[(int) r_type]->name,
14589 h->elf.root.root.string);
14590 ret = FALSE;
14591 }
14592
14593 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
14594 input_bfd,
14595 input_section,
14596 contents,
14597 rel->r_offset,
14598 relocation,
14599 addend);
14600
14601 if (r != bfd_reloc_ok)
14602 {
14603 char *more_info = NULL;
14604 const char *reloc_name = ppc64_elf_howto_table[r_type]->name;
14605
14606 if (reloc_dest != DEST_NORMAL)
14607 {
14608 more_info = bfd_malloc (strlen (reloc_name) + 8);
14609 if (more_info != NULL)
14610 {
14611 strcpy (more_info, reloc_name);
14612 strcat (more_info, (reloc_dest == DEST_OPD
14613 ? " (OPD)" : " (stub)"));
14614 reloc_name = more_info;
14615 }
14616 }
14617
14618 if (r == bfd_reloc_overflow)
14619 {
14620 if (warned)
14621 continue;
14622 if (h != NULL
14623 && h->elf.root.type == bfd_link_hash_undefweak
14624 && ppc64_elf_howto_table[r_type]->pc_relative)
14625 {
14626 /* Assume this is a call protected by other code that
14627 detects the symbol is undefined. If this is the case,
14628 we can safely ignore the overflow. If not, the
14629 program is hosed anyway, and a little warning isn't
14630 going to help. */
14631
14632 continue;
14633 }
14634
14635 if (!((*info->callbacks->reloc_overflow)
14636 (info, &h->elf.root, sym_name,
14637 reloc_name, orig_rel.r_addend,
14638 input_bfd, input_section, rel->r_offset)))
14639 return FALSE;
14640 }
14641 else
14642 {
14643 info->callbacks->einfo
14644 (_("%P: %H: %s against `%T': error %d\n"),
14645 input_bfd, input_section, rel->r_offset,
14646 reloc_name, sym_name, (int) r);
14647 ret = FALSE;
14648 }
14649 if (more_info != NULL)
14650 free (more_info);
14651 }
14652 }
14653
14654 /* If we're emitting relocations, then shortly after this function
14655 returns, reloc offsets and addends for this section will be
14656 adjusted. Worse, reloc symbol indices will be for the output
14657 file rather than the input. Save a copy of the relocs for
14658 opd_entry_value. */
14659 if (is_opd && (info->emitrelocations || info->relocatable))
14660 {
14661 bfd_size_type amt;
14662 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
14663 rel = bfd_alloc (input_bfd, amt);
14664 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
14665 ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
14666 if (rel == NULL)
14667 return FALSE;
14668 memcpy (rel, relocs, amt);
14669 }
14670 return ret;
14671 }
14672
14673 /* Adjust the value of any local symbols in opd sections. */
14674
14675 static int
14676 ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
14677 const char *name ATTRIBUTE_UNUSED,
14678 Elf_Internal_Sym *elfsym,
14679 asection *input_sec,
14680 struct elf_link_hash_entry *h)
14681 {
14682 struct _opd_sec_data *opd;
14683 long adjust;
14684 bfd_vma value;
14685
14686 if (h != NULL)
14687 return 1;
14688
14689 opd = get_opd_info (input_sec);
14690 if (opd == NULL || opd->adjust == NULL)
14691 return 1;
14692
14693 value = elfsym->st_value - input_sec->output_offset;
14694 if (!info->relocatable)
14695 value -= input_sec->output_section->vma;
14696
14697 adjust = opd->adjust[value / 8];
14698 if (adjust == -1)
14699 return 2;
14700
14701 elfsym->st_value += adjust;
14702 return 1;
14703 }
14704
14705 /* Finish up dynamic symbol handling. We set the contents of various
14706 dynamic sections here. */
14707
14708 static bfd_boolean
14709 ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
14710 struct bfd_link_info *info,
14711 struct elf_link_hash_entry *h,
14712 Elf_Internal_Sym *sym ATTRIBUTE_UNUSED)
14713 {
14714 struct ppc_link_hash_table *htab;
14715 struct plt_entry *ent;
14716 Elf_Internal_Rela rela;
14717 bfd_byte *loc;
14718
14719 htab = ppc_hash_table (info);
14720 if (htab == NULL)
14721 return FALSE;
14722
14723 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
14724 if (ent->plt.offset != (bfd_vma) -1)
14725 {
14726 /* This symbol has an entry in the procedure linkage
14727 table. Set it up. */
14728 if (!htab->elf.dynamic_sections_created
14729 || h->dynindx == -1)
14730 {
14731 BFD_ASSERT (h->type == STT_GNU_IFUNC
14732 && h->def_regular
14733 && (h->root.type == bfd_link_hash_defined
14734 || h->root.type == bfd_link_hash_defweak));
14735 rela.r_offset = (htab->elf.iplt->output_section->vma
14736 + htab->elf.iplt->output_offset
14737 + ent->plt.offset);
14738 if (htab->opd_abi)
14739 rela.r_info = ELF64_R_INFO (0, R_PPC64_JMP_IREL);
14740 else
14741 rela.r_info = ELF64_R_INFO (0, R_PPC64_IRELATIVE);
14742 rela.r_addend = (h->root.u.def.value
14743 + h->root.u.def.section->output_offset
14744 + h->root.u.def.section->output_section->vma
14745 + ent->addend);
14746 loc = (htab->elf.irelplt->contents
14747 + (htab->elf.irelplt->reloc_count++
14748 * sizeof (Elf64_External_Rela)));
14749 }
14750 else
14751 {
14752 rela.r_offset = (htab->elf.splt->output_section->vma
14753 + htab->elf.splt->output_offset
14754 + ent->plt.offset);
14755 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
14756 rela.r_addend = ent->addend;
14757 loc = (htab->elf.srelplt->contents
14758 + ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE (htab))
14759 / PLT_ENTRY_SIZE (htab) * sizeof (Elf64_External_Rela)));
14760 }
14761 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14762
14763 if (!htab->opd_abi)
14764 {
14765 if (!h->def_regular)
14766 {
14767 /* Mark the symbol as undefined, rather than as
14768 defined in glink. Leave the value if there were
14769 any relocations where pointer equality matters
14770 (this is a clue for the dynamic linker, to make
14771 function pointer comparisons work between an
14772 application and shared library), otherwise set it
14773 to zero. */
14774 sym->st_shndx = SHN_UNDEF;
14775 if (!h->pointer_equality_needed)
14776 sym->st_value = 0;
14777 else if (!h->ref_regular_nonweak)
14778 {
14779 /* This breaks function pointer comparisons, but
14780 that is better than breaking tests for a NULL
14781 function pointer. */
14782 sym->st_value = 0;
14783 }
14784 }
14785 }
14786 }
14787
14788 if (h->needs_copy)
14789 {
14790 /* This symbol needs a copy reloc. Set it up. */
14791
14792 if (h->dynindx == -1
14793 || (h->root.type != bfd_link_hash_defined
14794 && h->root.type != bfd_link_hash_defweak)
14795 || htab->relbss == NULL)
14796 abort ();
14797
14798 rela.r_offset = (h->root.u.def.value
14799 + h->root.u.def.section->output_section->vma
14800 + h->root.u.def.section->output_offset);
14801 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
14802 rela.r_addend = 0;
14803 loc = htab->relbss->contents;
14804 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
14805 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
14806 }
14807
14808 return TRUE;
14809 }
14810
14811 /* Used to decide how to sort relocs in an optimal manner for the
14812 dynamic linker, before writing them out. */
14813
14814 static enum elf_reloc_type_class
14815 ppc64_elf_reloc_type_class (const struct bfd_link_info *info,
14816 const asection *rel_sec,
14817 const Elf_Internal_Rela *rela)
14818 {
14819 enum elf_ppc64_reloc_type r_type;
14820 struct ppc_link_hash_table *htab = ppc_hash_table (info);
14821
14822 if (rel_sec == htab->elf.irelplt)
14823 return reloc_class_ifunc;
14824
14825 r_type = ELF64_R_TYPE (rela->r_info);
14826 switch (r_type)
14827 {
14828 case R_PPC64_RELATIVE:
14829 return reloc_class_relative;
14830 case R_PPC64_JMP_SLOT:
14831 return reloc_class_plt;
14832 case R_PPC64_COPY:
14833 return reloc_class_copy;
14834 default:
14835 return reloc_class_normal;
14836 }
14837 }
14838
14839 /* Finish up the dynamic sections. */
14840
14841 static bfd_boolean
14842 ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
14843 struct bfd_link_info *info)
14844 {
14845 struct ppc_link_hash_table *htab;
14846 bfd *dynobj;
14847 asection *sdyn;
14848
14849 htab = ppc_hash_table (info);
14850 if (htab == NULL)
14851 return FALSE;
14852
14853 dynobj = htab->elf.dynobj;
14854 sdyn = bfd_get_linker_section (dynobj, ".dynamic");
14855
14856 if (htab->elf.dynamic_sections_created)
14857 {
14858 Elf64_External_Dyn *dyncon, *dynconend;
14859
14860 if (sdyn == NULL || htab->elf.sgot == NULL)
14861 abort ();
14862
14863 dyncon = (Elf64_External_Dyn *) sdyn->contents;
14864 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
14865 for (; dyncon < dynconend; dyncon++)
14866 {
14867 Elf_Internal_Dyn dyn;
14868 asection *s;
14869
14870 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
14871
14872 switch (dyn.d_tag)
14873 {
14874 default:
14875 continue;
14876
14877 case DT_PPC64_GLINK:
14878 s = htab->glink;
14879 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14880 /* We stupidly defined DT_PPC64_GLINK to be the start
14881 of glink rather than the first entry point, which is
14882 what ld.so needs, and now have a bigger stub to
14883 support automatic multiple TOCs. */
14884 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 8 * 4;
14885 break;
14886
14887 case DT_PPC64_OPD:
14888 s = bfd_get_section_by_name (output_bfd, ".opd");
14889 if (s == NULL)
14890 continue;
14891 dyn.d_un.d_ptr = s->vma;
14892 break;
14893
14894 case DT_PPC64_OPT:
14895 if (htab->do_multi_toc && htab->multi_toc_needed)
14896 dyn.d_un.d_val |= PPC64_OPT_MULTI_TOC;
14897 break;
14898
14899 case DT_PPC64_OPDSZ:
14900 s = bfd_get_section_by_name (output_bfd, ".opd");
14901 if (s == NULL)
14902 continue;
14903 dyn.d_un.d_val = s->size;
14904 break;
14905
14906 case DT_PLTGOT:
14907 s = htab->elf.splt;
14908 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14909 break;
14910
14911 case DT_JMPREL:
14912 s = htab->elf.srelplt;
14913 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
14914 break;
14915
14916 case DT_PLTRELSZ:
14917 dyn.d_un.d_val = htab->elf.srelplt->size;
14918 break;
14919
14920 case DT_RELASZ:
14921 /* Don't count procedure linkage table relocs in the
14922 overall reloc count. */
14923 s = htab->elf.srelplt;
14924 if (s == NULL)
14925 continue;
14926 dyn.d_un.d_val -= s->size;
14927 break;
14928
14929 case DT_RELA:
14930 /* We may not be using the standard ELF linker script.
14931 If .rela.plt is the first .rela section, we adjust
14932 DT_RELA to not include it. */
14933 s = htab->elf.srelplt;
14934 if (s == NULL)
14935 continue;
14936 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
14937 continue;
14938 dyn.d_un.d_ptr += s->size;
14939 break;
14940 }
14941
14942 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
14943 }
14944 }
14945
14946 if (htab->elf.sgot != NULL && htab->elf.sgot->size != 0)
14947 {
14948 /* Fill in the first entry in the global offset table.
14949 We use it to hold the link-time TOCbase. */
14950 bfd_put_64 (output_bfd,
14951 elf_gp (output_bfd) + TOC_BASE_OFF,
14952 htab->elf.sgot->contents);
14953
14954 /* Set .got entry size. */
14955 elf_section_data (htab->elf.sgot->output_section)->this_hdr.sh_entsize = 8;
14956 }
14957
14958 if (htab->elf.splt != NULL && htab->elf.splt->size != 0)
14959 {
14960 /* Set .plt entry size. */
14961 elf_section_data (htab->elf.splt->output_section)->this_hdr.sh_entsize
14962 = PLT_ENTRY_SIZE (htab);
14963 }
14964
14965 /* brlt is SEC_LINKER_CREATED, so we need to write out relocs for
14966 brlt ourselves if emitrelocations. */
14967 if (htab->brlt != NULL
14968 && htab->brlt->reloc_count != 0
14969 && !_bfd_elf_link_output_relocs (output_bfd,
14970 htab->brlt,
14971 elf_section_data (htab->brlt)->rela.hdr,
14972 elf_section_data (htab->brlt)->relocs,
14973 NULL))
14974 return FALSE;
14975
14976 if (htab->glink != NULL
14977 && htab->glink->reloc_count != 0
14978 && !_bfd_elf_link_output_relocs (output_bfd,
14979 htab->glink,
14980 elf_section_data (htab->glink)->rela.hdr,
14981 elf_section_data (htab->glink)->relocs,
14982 NULL))
14983 return FALSE;
14984
14985
14986 if (htab->glink_eh_frame != NULL
14987 && htab->glink_eh_frame->sec_info_type == SEC_INFO_TYPE_EH_FRAME
14988 && !_bfd_elf_write_section_eh_frame (output_bfd, info,
14989 htab->glink_eh_frame,
14990 htab->glink_eh_frame->contents))
14991 return FALSE;
14992
14993 /* We need to handle writing out multiple GOT sections ourselves,
14994 since we didn't add them to DYNOBJ. We know dynobj is the first
14995 bfd. */
14996 while ((dynobj = dynobj->link_next) != NULL)
14997 {
14998 asection *s;
14999
15000 if (!is_ppc64_elf (dynobj))
15001 continue;
15002
15003 s = ppc64_elf_tdata (dynobj)->got;
15004 if (s != NULL
15005 && s->size != 0
15006 && s->output_section != bfd_abs_section_ptr
15007 && !bfd_set_section_contents (output_bfd, s->output_section,
15008 s->contents, s->output_offset,
15009 s->size))
15010 return FALSE;
15011 s = ppc64_elf_tdata (dynobj)->relgot;
15012 if (s != NULL
15013 && s->size != 0
15014 && s->output_section != bfd_abs_section_ptr
15015 && !bfd_set_section_contents (output_bfd, s->output_section,
15016 s->contents, s->output_offset,
15017 s->size))
15018 return FALSE;
15019 }
15020
15021 return TRUE;
15022 }
15023
15024 #include "elf64-target.h"
15025
15026 /* FreeBSD support */
15027
15028 #undef TARGET_LITTLE_SYM
15029 #undef TARGET_LITTLE_NAME
15030
15031 #undef TARGET_BIG_SYM
15032 #define TARGET_BIG_SYM bfd_elf64_powerpc_freebsd_vec
15033 #undef TARGET_BIG_NAME
15034 #define TARGET_BIG_NAME "elf64-powerpc-freebsd"
15035
15036 #undef ELF_OSABI
15037 #define ELF_OSABI ELFOSABI_FREEBSD
15038
15039 #undef elf64_bed
15040 #define elf64_bed elf64_powerpc_fbsd_bed
15041
15042 #include "elf64-target.h"
15043
This page took 0.438156 seconds and 4 git commands to generate.