1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License along
19 with this program; if not, write to the Free Software Foundation, Inc.,
20 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* The 64-bit PowerPC ELF ABI may be found at
23 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
24 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
31 #include "elf/ppc64.h"
32 #include "elf64-ppc.h"
34 static bfd_reloc_status_type ppc64_elf_ha_reloc
35 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
36 static bfd_reloc_status_type ppc64_elf_brtaken_reloc
37 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
38 static bfd_reloc_status_type ppc64_elf_sectoff_reloc
39 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
40 static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
41 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
42 static bfd_reloc_status_type ppc64_elf_toc_reloc
43 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
44 static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
45 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
46 static bfd_reloc_status_type ppc64_elf_toc64_reloc
47 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
48 static bfd_reloc_status_type ppc64_elf_unhandled_reloc
49 (bfd
*, arelent
*, asymbol
*, void *, asection
*, bfd
*, char **);
52 #define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
53 #define TARGET_LITTLE_NAME "elf64-powerpcle"
54 #define TARGET_BIG_SYM bfd_elf64_powerpc_vec
55 #define TARGET_BIG_NAME "elf64-powerpc"
56 #define ELF_ARCH bfd_arch_powerpc
57 #define ELF_MACHINE_CODE EM_PPC64
58 #define ELF_MAXPAGESIZE 0x10000
59 #define elf_info_to_howto ppc64_elf_info_to_howto
61 #define elf_backend_want_got_sym 0
62 #define elf_backend_want_plt_sym 0
63 #define elf_backend_plt_alignment 3
64 #define elf_backend_plt_not_loaded 1
65 #define elf_backend_got_symbol_offset 0
66 #define elf_backend_got_header_size 8
67 #define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
68 #define elf_backend_can_gc_sections 1
69 #define elf_backend_can_refcount 1
70 #define elf_backend_rela_normal 1
72 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
73 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
74 #define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
75 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
76 #define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
78 #define elf_backend_object_p ppc64_elf_object_p
79 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
80 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
81 #define elf_backend_check_relocs ppc64_elf_check_relocs
82 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
83 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
84 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
85 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
86 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
87 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
88 #define elf_backend_relocate_section ppc64_elf_relocate_section
89 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
90 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
91 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
93 /* The name of the dynamic interpreter. This is put in the .interp
95 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
97 /* The size in bytes of an entry in the procedure linkage table. */
98 #define PLT_ENTRY_SIZE 24
100 /* The initial size of the plt reserved for the dynamic linker. */
101 #define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
103 /* TOC base pointers offset from start of TOC. */
104 #define TOC_BASE_OFF 0x8000
106 /* Offset of tp and dtp pointers from start of TLS block. */
107 #define TP_OFFSET 0x7000
108 #define DTP_OFFSET 0x8000
110 /* .plt call stub instructions. The normal stub is like this, but
111 sometimes the .plt entry crosses a 64k boundary and we need to
112 insert an addis to adjust r12. */
113 #define PLT_CALL_STUB_SIZE (7*4)
114 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
115 #define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
116 #define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */
117 #define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */
118 #define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */
119 /* ld %r11,xxx+16@l(%r12) */
120 #define BCTR 0x4e800420 /* bctr */
123 #define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
124 #define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
126 #define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
128 /* glink call stub instructions. We enter with the index in R0, and the
129 address of glink entry in CTR. From that, we can calculate PLT0. */
130 #define GLINK_CALL_STUB_SIZE (16*4)
131 #define MFCTR_R12 0x7d8902a6 /* mfctr %r12 */
132 #define SLDI_R11_R0_3 0x780b1f24 /* sldi %r11,%r0,3 */
133 #define ADDIC_R2_R0_32K 0x34408000 /* addic. %r2,%r0,-32768 */
134 #define SUB_R12_R12_R11 0x7d8b6050 /* sub %r12,%r12,%r11 */
135 #define SRADI_R2_R2_63 0x7c42fe76 /* sradi %r2,%r2,63 */
136 #define SLDI_R11_R0_2 0x780b1764 /* sldi %r11,%r0,2 */
137 #define AND_R2_R2_R11 0x7c425838 /* and %r2,%r2,%r11 */
138 /* sub %r12,%r12,%r11 */
139 #define ADD_R12_R12_R2 0x7d8c1214 /* add %r12,%r12,%r2 */
140 #define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
141 /* ld %r11,xxx@l(%r12) */
142 #define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,xxx@l */
145 /* ld %r11,16(%r12) */
149 #define NOP 0x60000000
151 /* Some other nops. */
152 #define CROR_151515 0x4def7b82
153 #define CROR_313131 0x4ffffb82
155 /* .glink entries for the first 32k functions are two instructions. */
156 #define LI_R0_0 0x38000000 /* li %r0,0 */
157 #define B_DOT 0x48000000 /* b . */
159 /* After that, we need two instructions to load the index, followed by
161 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
162 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
164 /* Instructions to save and restore floating point regs. */
165 #define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
166 #define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
167 #define BLR 0x4e800020 /* blr */
169 /* Since .opd is an array of descriptors and each entry will end up
170 with identical R_PPC64_RELATIVE relocs, there is really no need to
171 propagate .opd relocs; The dynamic linker should be taught to
172 relocate .opd without reloc entries. */
173 #ifndef NO_OPD_RELOCS
174 #define NO_OPD_RELOCS 0
177 #define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
179 /* Relocation HOWTO's. */
180 static reloc_howto_type
*ppc64_elf_howto_table
[(int) R_PPC64_max
];
182 static reloc_howto_type ppc64_elf_howto_raw
[] = {
183 /* This reloc does nothing. */
184 HOWTO (R_PPC64_NONE
, /* type */
186 2, /* size (0 = byte, 1 = short, 2 = long) */
188 FALSE
, /* pc_relative */
190 complain_overflow_dont
, /* complain_on_overflow */
191 bfd_elf_generic_reloc
, /* special_function */
192 "R_PPC64_NONE", /* name */
193 FALSE
, /* partial_inplace */
196 FALSE
), /* pcrel_offset */
198 /* A standard 32 bit relocation. */
199 HOWTO (R_PPC64_ADDR32
, /* type */
201 2, /* size (0 = byte, 1 = short, 2 = long) */
203 FALSE
, /* pc_relative */
205 complain_overflow_bitfield
, /* complain_on_overflow */
206 bfd_elf_generic_reloc
, /* special_function */
207 "R_PPC64_ADDR32", /* name */
208 FALSE
, /* partial_inplace */
210 0xffffffff, /* dst_mask */
211 FALSE
), /* pcrel_offset */
213 /* An absolute 26 bit branch; the lower two bits must be zero.
214 FIXME: we don't check that, we just clear them. */
215 HOWTO (R_PPC64_ADDR24
, /* type */
217 2, /* size (0 = byte, 1 = short, 2 = long) */
219 FALSE
, /* pc_relative */
221 complain_overflow_bitfield
, /* complain_on_overflow */
222 bfd_elf_generic_reloc
, /* special_function */
223 "R_PPC64_ADDR24", /* name */
224 FALSE
, /* partial_inplace */
226 0x03fffffc, /* dst_mask */
227 FALSE
), /* pcrel_offset */
229 /* A standard 16 bit relocation. */
230 HOWTO (R_PPC64_ADDR16
, /* type */
232 1, /* size (0 = byte, 1 = short, 2 = long) */
234 FALSE
, /* pc_relative */
236 complain_overflow_bitfield
, /* complain_on_overflow */
237 bfd_elf_generic_reloc
, /* special_function */
238 "R_PPC64_ADDR16", /* name */
239 FALSE
, /* partial_inplace */
241 0xffff, /* dst_mask */
242 FALSE
), /* pcrel_offset */
244 /* A 16 bit relocation without overflow. */
245 HOWTO (R_PPC64_ADDR16_LO
, /* type */
247 1, /* size (0 = byte, 1 = short, 2 = long) */
249 FALSE
, /* pc_relative */
251 complain_overflow_dont
,/* complain_on_overflow */
252 bfd_elf_generic_reloc
, /* special_function */
253 "R_PPC64_ADDR16_LO", /* name */
254 FALSE
, /* partial_inplace */
256 0xffff, /* dst_mask */
257 FALSE
), /* pcrel_offset */
259 /* Bits 16-31 of an address. */
260 HOWTO (R_PPC64_ADDR16_HI
, /* type */
262 1, /* size (0 = byte, 1 = short, 2 = long) */
264 FALSE
, /* pc_relative */
266 complain_overflow_dont
, /* complain_on_overflow */
267 bfd_elf_generic_reloc
, /* special_function */
268 "R_PPC64_ADDR16_HI", /* name */
269 FALSE
, /* partial_inplace */
271 0xffff, /* dst_mask */
272 FALSE
), /* pcrel_offset */
274 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
275 bits, treated as a signed number, is negative. */
276 HOWTO (R_PPC64_ADDR16_HA
, /* type */
278 1, /* size (0 = byte, 1 = short, 2 = long) */
280 FALSE
, /* pc_relative */
282 complain_overflow_dont
, /* complain_on_overflow */
283 ppc64_elf_ha_reloc
, /* special_function */
284 "R_PPC64_ADDR16_HA", /* name */
285 FALSE
, /* partial_inplace */
287 0xffff, /* dst_mask */
288 FALSE
), /* pcrel_offset */
290 /* An absolute 16 bit branch; the lower two bits must be zero.
291 FIXME: we don't check that, we just clear them. */
292 HOWTO (R_PPC64_ADDR14
, /* type */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
296 FALSE
, /* pc_relative */
298 complain_overflow_bitfield
, /* complain_on_overflow */
299 bfd_elf_generic_reloc
, /* special_function */
300 "R_PPC64_ADDR14", /* name */
301 FALSE
, /* partial_inplace */
303 0x0000fffc, /* dst_mask */
304 FALSE
), /* pcrel_offset */
306 /* An absolute 16 bit branch, for which bit 10 should be set to
307 indicate that the branch is expected to be taken. The lower two
308 bits must be zero. */
309 HOWTO (R_PPC64_ADDR14_BRTAKEN
, /* type */
311 2, /* size (0 = byte, 1 = short, 2 = long) */
313 FALSE
, /* pc_relative */
315 complain_overflow_bitfield
, /* complain_on_overflow */
316 ppc64_elf_brtaken_reloc
, /* special_function */
317 "R_PPC64_ADDR14_BRTAKEN",/* name */
318 FALSE
, /* partial_inplace */
320 0x0000fffc, /* dst_mask */
321 FALSE
), /* pcrel_offset */
323 /* An absolute 16 bit branch, for which bit 10 should be set to
324 indicate that the branch is not expected to be taken. The lower
325 two bits must be zero. */
326 HOWTO (R_PPC64_ADDR14_BRNTAKEN
, /* type */
328 2, /* size (0 = byte, 1 = short, 2 = long) */
330 FALSE
, /* pc_relative */
332 complain_overflow_bitfield
, /* complain_on_overflow */
333 ppc64_elf_brtaken_reloc
, /* special_function */
334 "R_PPC64_ADDR14_BRNTAKEN",/* name */
335 FALSE
, /* partial_inplace */
337 0x0000fffc, /* dst_mask */
338 FALSE
), /* pcrel_offset */
340 /* A relative 26 bit branch; the lower two bits must be zero. */
341 HOWTO (R_PPC64_REL24
, /* type */
343 2, /* size (0 = byte, 1 = short, 2 = long) */
345 TRUE
, /* pc_relative */
347 complain_overflow_signed
, /* complain_on_overflow */
348 bfd_elf_generic_reloc
, /* special_function */
349 "R_PPC64_REL24", /* name */
350 FALSE
, /* partial_inplace */
352 0x03fffffc, /* dst_mask */
353 TRUE
), /* pcrel_offset */
355 /* A relative 16 bit branch; the lower two bits must be zero. */
356 HOWTO (R_PPC64_REL14
, /* type */
358 2, /* size (0 = byte, 1 = short, 2 = long) */
360 TRUE
, /* pc_relative */
362 complain_overflow_signed
, /* complain_on_overflow */
363 bfd_elf_generic_reloc
, /* special_function */
364 "R_PPC64_REL14", /* name */
365 FALSE
, /* partial_inplace */
367 0x0000fffc, /* dst_mask */
368 TRUE
), /* pcrel_offset */
370 /* A relative 16 bit branch. Bit 10 should be set to indicate that
371 the branch is expected to be taken. The lower two bits must be
373 HOWTO (R_PPC64_REL14_BRTAKEN
, /* type */
375 2, /* size (0 = byte, 1 = short, 2 = long) */
377 TRUE
, /* pc_relative */
379 complain_overflow_signed
, /* complain_on_overflow */
380 ppc64_elf_brtaken_reloc
, /* special_function */
381 "R_PPC64_REL14_BRTAKEN", /* name */
382 FALSE
, /* partial_inplace */
384 0x0000fffc, /* dst_mask */
385 TRUE
), /* pcrel_offset */
387 /* A relative 16 bit branch. Bit 10 should be set to indicate that
388 the branch is not expected to be taken. The lower two bits must
390 HOWTO (R_PPC64_REL14_BRNTAKEN
, /* type */
392 2, /* size (0 = byte, 1 = short, 2 = long) */
394 TRUE
, /* pc_relative */
396 complain_overflow_signed
, /* complain_on_overflow */
397 ppc64_elf_brtaken_reloc
, /* special_function */
398 "R_PPC64_REL14_BRNTAKEN",/* name */
399 FALSE
, /* partial_inplace */
401 0x0000fffc, /* dst_mask */
402 TRUE
), /* pcrel_offset */
404 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
406 HOWTO (R_PPC64_GOT16
, /* type */
408 1, /* size (0 = byte, 1 = short, 2 = long) */
410 FALSE
, /* pc_relative */
412 complain_overflow_signed
, /* complain_on_overflow */
413 ppc64_elf_unhandled_reloc
, /* special_function */
414 "R_PPC64_GOT16", /* name */
415 FALSE
, /* partial_inplace */
417 0xffff, /* dst_mask */
418 FALSE
), /* pcrel_offset */
420 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
422 HOWTO (R_PPC64_GOT16_LO
, /* type */
424 1, /* size (0 = byte, 1 = short, 2 = long) */
426 FALSE
, /* pc_relative */
428 complain_overflow_dont
, /* complain_on_overflow */
429 ppc64_elf_unhandled_reloc
, /* special_function */
430 "R_PPC64_GOT16_LO", /* name */
431 FALSE
, /* partial_inplace */
433 0xffff, /* dst_mask */
434 FALSE
), /* pcrel_offset */
436 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
438 HOWTO (R_PPC64_GOT16_HI
, /* type */
440 1, /* size (0 = byte, 1 = short, 2 = long) */
442 FALSE
, /* pc_relative */
444 complain_overflow_dont
,/* complain_on_overflow */
445 ppc64_elf_unhandled_reloc
, /* special_function */
446 "R_PPC64_GOT16_HI", /* name */
447 FALSE
, /* partial_inplace */
449 0xffff, /* dst_mask */
450 FALSE
), /* pcrel_offset */
452 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
454 HOWTO (R_PPC64_GOT16_HA
, /* type */
456 1, /* size (0 = byte, 1 = short, 2 = long) */
458 FALSE
, /* pc_relative */
460 complain_overflow_dont
,/* complain_on_overflow */
461 ppc64_elf_unhandled_reloc
, /* special_function */
462 "R_PPC64_GOT16_HA", /* name */
463 FALSE
, /* partial_inplace */
465 0xffff, /* dst_mask */
466 FALSE
), /* pcrel_offset */
468 /* This is used only by the dynamic linker. The symbol should exist
469 both in the object being run and in some shared library. The
470 dynamic linker copies the data addressed by the symbol from the
471 shared library into the object, because the object being
472 run has to have the data at some particular address. */
473 HOWTO (R_PPC64_COPY
, /* type */
475 0, /* this one is variable size */
477 FALSE
, /* pc_relative */
479 complain_overflow_dont
, /* complain_on_overflow */
480 ppc64_elf_unhandled_reloc
, /* special_function */
481 "R_PPC64_COPY", /* name */
482 FALSE
, /* partial_inplace */
485 FALSE
), /* pcrel_offset */
487 /* Like R_PPC64_ADDR64, but used when setting global offset table
489 HOWTO (R_PPC64_GLOB_DAT
, /* type */
491 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
493 FALSE
, /* pc_relative */
495 complain_overflow_dont
, /* complain_on_overflow */
496 ppc64_elf_unhandled_reloc
, /* special_function */
497 "R_PPC64_GLOB_DAT", /* name */
498 FALSE
, /* partial_inplace */
500 ONES (64), /* dst_mask */
501 FALSE
), /* pcrel_offset */
503 /* Created by the link editor. Marks a procedure linkage table
504 entry for a symbol. */
505 HOWTO (R_PPC64_JMP_SLOT
, /* type */
507 0, /* size (0 = byte, 1 = short, 2 = long) */
509 FALSE
, /* pc_relative */
511 complain_overflow_dont
, /* complain_on_overflow */
512 ppc64_elf_unhandled_reloc
, /* special_function */
513 "R_PPC64_JMP_SLOT", /* name */
514 FALSE
, /* partial_inplace */
517 FALSE
), /* pcrel_offset */
519 /* Used only by the dynamic linker. When the object is run, this
520 doubleword64 is set to the load address of the object, plus the
522 HOWTO (R_PPC64_RELATIVE
, /* type */
524 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
526 FALSE
, /* pc_relative */
528 complain_overflow_dont
, /* complain_on_overflow */
529 bfd_elf_generic_reloc
, /* special_function */
530 "R_PPC64_RELATIVE", /* name */
531 FALSE
, /* partial_inplace */
533 ONES (64), /* dst_mask */
534 FALSE
), /* pcrel_offset */
536 /* Like R_PPC64_ADDR32, but may be unaligned. */
537 HOWTO (R_PPC64_UADDR32
, /* type */
539 2, /* size (0 = byte, 1 = short, 2 = long) */
541 FALSE
, /* pc_relative */
543 complain_overflow_bitfield
, /* complain_on_overflow */
544 bfd_elf_generic_reloc
, /* special_function */
545 "R_PPC64_UADDR32", /* name */
546 FALSE
, /* partial_inplace */
548 0xffffffff, /* dst_mask */
549 FALSE
), /* pcrel_offset */
551 /* Like R_PPC64_ADDR16, but may be unaligned. */
552 HOWTO (R_PPC64_UADDR16
, /* type */
554 1, /* size (0 = byte, 1 = short, 2 = long) */
556 FALSE
, /* pc_relative */
558 complain_overflow_bitfield
, /* complain_on_overflow */
559 bfd_elf_generic_reloc
, /* special_function */
560 "R_PPC64_UADDR16", /* name */
561 FALSE
, /* partial_inplace */
563 0xffff, /* dst_mask */
564 FALSE
), /* pcrel_offset */
566 /* 32-bit PC relative. */
567 HOWTO (R_PPC64_REL32
, /* type */
569 2, /* size (0 = byte, 1 = short, 2 = long) */
571 TRUE
, /* pc_relative */
573 /* FIXME: Verify. Was complain_overflow_bitfield. */
574 complain_overflow_signed
, /* complain_on_overflow */
575 bfd_elf_generic_reloc
, /* special_function */
576 "R_PPC64_REL32", /* name */
577 FALSE
, /* partial_inplace */
579 0xffffffff, /* dst_mask */
580 TRUE
), /* pcrel_offset */
582 /* 32-bit relocation to the symbol's procedure linkage table. */
583 HOWTO (R_PPC64_PLT32
, /* type */
585 2, /* size (0 = byte, 1 = short, 2 = long) */
587 FALSE
, /* pc_relative */
589 complain_overflow_bitfield
, /* complain_on_overflow */
590 ppc64_elf_unhandled_reloc
, /* special_function */
591 "R_PPC64_PLT32", /* name */
592 FALSE
, /* partial_inplace */
594 0xffffffff, /* dst_mask */
595 FALSE
), /* pcrel_offset */
597 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
598 FIXME: R_PPC64_PLTREL32 not supported. */
599 HOWTO (R_PPC64_PLTREL32
, /* type */
601 2, /* size (0 = byte, 1 = short, 2 = long) */
603 TRUE
, /* pc_relative */
605 complain_overflow_signed
, /* complain_on_overflow */
606 bfd_elf_generic_reloc
, /* special_function */
607 "R_PPC64_PLTREL32", /* name */
608 FALSE
, /* partial_inplace */
610 0xffffffff, /* dst_mask */
611 TRUE
), /* pcrel_offset */
613 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
615 HOWTO (R_PPC64_PLT16_LO
, /* type */
617 1, /* size (0 = byte, 1 = short, 2 = long) */
619 FALSE
, /* pc_relative */
621 complain_overflow_dont
, /* complain_on_overflow */
622 ppc64_elf_unhandled_reloc
, /* special_function */
623 "R_PPC64_PLT16_LO", /* name */
624 FALSE
, /* partial_inplace */
626 0xffff, /* dst_mask */
627 FALSE
), /* pcrel_offset */
629 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
631 HOWTO (R_PPC64_PLT16_HI
, /* type */
633 1, /* size (0 = byte, 1 = short, 2 = long) */
635 FALSE
, /* pc_relative */
637 complain_overflow_dont
, /* complain_on_overflow */
638 ppc64_elf_unhandled_reloc
, /* special_function */
639 "R_PPC64_PLT16_HI", /* name */
640 FALSE
, /* partial_inplace */
642 0xffff, /* dst_mask */
643 FALSE
), /* pcrel_offset */
645 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
647 HOWTO (R_PPC64_PLT16_HA
, /* type */
649 1, /* size (0 = byte, 1 = short, 2 = long) */
651 FALSE
, /* pc_relative */
653 complain_overflow_dont
, /* complain_on_overflow */
654 ppc64_elf_unhandled_reloc
, /* special_function */
655 "R_PPC64_PLT16_HA", /* name */
656 FALSE
, /* partial_inplace */
658 0xffff, /* dst_mask */
659 FALSE
), /* pcrel_offset */
661 /* 16-bit section relative relocation. */
662 HOWTO (R_PPC64_SECTOFF
, /* type */
664 1, /* size (0 = byte, 1 = short, 2 = long) */
666 FALSE
, /* pc_relative */
668 complain_overflow_bitfield
, /* complain_on_overflow */
669 ppc64_elf_sectoff_reloc
, /* special_function */
670 "R_PPC64_SECTOFF", /* name */
671 FALSE
, /* partial_inplace */
673 0xffff, /* dst_mask */
674 FALSE
), /* pcrel_offset */
676 /* Like R_PPC64_SECTOFF, but no overflow warning. */
677 HOWTO (R_PPC64_SECTOFF_LO
, /* type */
679 1, /* size (0 = byte, 1 = short, 2 = long) */
681 FALSE
, /* pc_relative */
683 complain_overflow_dont
, /* complain_on_overflow */
684 ppc64_elf_sectoff_reloc
, /* special_function */
685 "R_PPC64_SECTOFF_LO", /* name */
686 FALSE
, /* partial_inplace */
688 0xffff, /* dst_mask */
689 FALSE
), /* pcrel_offset */
691 /* 16-bit upper half section relative relocation. */
692 HOWTO (R_PPC64_SECTOFF_HI
, /* type */
694 1, /* size (0 = byte, 1 = short, 2 = long) */
696 FALSE
, /* pc_relative */
698 complain_overflow_dont
, /* complain_on_overflow */
699 ppc64_elf_sectoff_reloc
, /* special_function */
700 "R_PPC64_SECTOFF_HI", /* name */
701 FALSE
, /* partial_inplace */
703 0xffff, /* dst_mask */
704 FALSE
), /* pcrel_offset */
706 /* 16-bit upper half adjusted section relative relocation. */
707 HOWTO (R_PPC64_SECTOFF_HA
, /* type */
709 1, /* size (0 = byte, 1 = short, 2 = long) */
711 FALSE
, /* pc_relative */
713 complain_overflow_dont
, /* complain_on_overflow */
714 ppc64_elf_sectoff_ha_reloc
, /* special_function */
715 "R_PPC64_SECTOFF_HA", /* name */
716 FALSE
, /* partial_inplace */
718 0xffff, /* dst_mask */
719 FALSE
), /* pcrel_offset */
721 /* Like R_PPC64_REL24 without touching the two least significant bits. */
722 HOWTO (R_PPC64_REL30
, /* type */
724 2, /* size (0 = byte, 1 = short, 2 = long) */
726 TRUE
, /* pc_relative */
728 complain_overflow_dont
, /* complain_on_overflow */
729 bfd_elf_generic_reloc
, /* special_function */
730 "R_PPC64_REL30", /* name */
731 FALSE
, /* partial_inplace */
733 0xfffffffc, /* dst_mask */
734 TRUE
), /* pcrel_offset */
736 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
738 /* A standard 64-bit relocation. */
739 HOWTO (R_PPC64_ADDR64
, /* type */
741 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
743 FALSE
, /* pc_relative */
745 complain_overflow_dont
, /* complain_on_overflow */
746 bfd_elf_generic_reloc
, /* special_function */
747 "R_PPC64_ADDR64", /* name */
748 FALSE
, /* partial_inplace */
750 ONES (64), /* dst_mask */
751 FALSE
), /* pcrel_offset */
753 /* The bits 32-47 of an address. */
754 HOWTO (R_PPC64_ADDR16_HIGHER
, /* type */
756 1, /* size (0 = byte, 1 = short, 2 = long) */
758 FALSE
, /* pc_relative */
760 complain_overflow_dont
, /* complain_on_overflow */
761 bfd_elf_generic_reloc
, /* special_function */
762 "R_PPC64_ADDR16_HIGHER", /* name */
763 FALSE
, /* partial_inplace */
765 0xffff, /* dst_mask */
766 FALSE
), /* pcrel_offset */
768 /* The bits 32-47 of an address, plus 1 if the contents of the low
769 16 bits, treated as a signed number, is negative. */
770 HOWTO (R_PPC64_ADDR16_HIGHERA
, /* type */
772 1, /* size (0 = byte, 1 = short, 2 = long) */
774 FALSE
, /* pc_relative */
776 complain_overflow_dont
, /* complain_on_overflow */
777 ppc64_elf_ha_reloc
, /* special_function */
778 "R_PPC64_ADDR16_HIGHERA", /* name */
779 FALSE
, /* partial_inplace */
781 0xffff, /* dst_mask */
782 FALSE
), /* pcrel_offset */
784 /* The bits 48-63 of an address. */
785 HOWTO (R_PPC64_ADDR16_HIGHEST
,/* type */
787 1, /* size (0 = byte, 1 = short, 2 = long) */
789 FALSE
, /* pc_relative */
791 complain_overflow_dont
, /* complain_on_overflow */
792 bfd_elf_generic_reloc
, /* special_function */
793 "R_PPC64_ADDR16_HIGHEST", /* name */
794 FALSE
, /* partial_inplace */
796 0xffff, /* dst_mask */
797 FALSE
), /* pcrel_offset */
799 /* The bits 48-63 of an address, plus 1 if the contents of the low
800 16 bits, treated as a signed number, is negative. */
801 HOWTO (R_PPC64_ADDR16_HIGHESTA
,/* type */
803 1, /* size (0 = byte, 1 = short, 2 = long) */
805 FALSE
, /* pc_relative */
807 complain_overflow_dont
, /* complain_on_overflow */
808 ppc64_elf_ha_reloc
, /* special_function */
809 "R_PPC64_ADDR16_HIGHESTA", /* name */
810 FALSE
, /* partial_inplace */
812 0xffff, /* dst_mask */
813 FALSE
), /* pcrel_offset */
815 /* Like ADDR64, but may be unaligned. */
816 HOWTO (R_PPC64_UADDR64
, /* type */
818 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
820 FALSE
, /* pc_relative */
822 complain_overflow_dont
, /* complain_on_overflow */
823 bfd_elf_generic_reloc
, /* special_function */
824 "R_PPC64_UADDR64", /* name */
825 FALSE
, /* partial_inplace */
827 ONES (64), /* dst_mask */
828 FALSE
), /* pcrel_offset */
830 /* 64-bit relative relocation. */
831 HOWTO (R_PPC64_REL64
, /* type */
833 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
835 TRUE
, /* pc_relative */
837 complain_overflow_dont
, /* complain_on_overflow */
838 bfd_elf_generic_reloc
, /* special_function */
839 "R_PPC64_REL64", /* name */
840 FALSE
, /* partial_inplace */
842 ONES (64), /* dst_mask */
843 TRUE
), /* pcrel_offset */
845 /* 64-bit relocation to the symbol's procedure linkage table. */
846 HOWTO (R_PPC64_PLT64
, /* type */
848 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
850 FALSE
, /* pc_relative */
852 complain_overflow_dont
, /* complain_on_overflow */
853 ppc64_elf_unhandled_reloc
, /* special_function */
854 "R_PPC64_PLT64", /* name */
855 FALSE
, /* partial_inplace */
857 ONES (64), /* dst_mask */
858 FALSE
), /* pcrel_offset */
860 /* 64-bit PC relative relocation to the symbol's procedure linkage
862 /* FIXME: R_PPC64_PLTREL64 not supported. */
863 HOWTO (R_PPC64_PLTREL64
, /* type */
865 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
867 TRUE
, /* pc_relative */
869 complain_overflow_dont
, /* complain_on_overflow */
870 ppc64_elf_unhandled_reloc
, /* special_function */
871 "R_PPC64_PLTREL64", /* name */
872 FALSE
, /* partial_inplace */
874 ONES (64), /* dst_mask */
875 TRUE
), /* pcrel_offset */
877 /* 16 bit TOC-relative relocation. */
879 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
880 HOWTO (R_PPC64_TOC16
, /* type */
882 1, /* size (0 = byte, 1 = short, 2 = long) */
884 FALSE
, /* pc_relative */
886 complain_overflow_signed
, /* complain_on_overflow */
887 ppc64_elf_toc_reloc
, /* special_function */
888 "R_PPC64_TOC16", /* name */
889 FALSE
, /* partial_inplace */
891 0xffff, /* dst_mask */
892 FALSE
), /* pcrel_offset */
894 /* 16 bit TOC-relative relocation without overflow. */
896 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
897 HOWTO (R_PPC64_TOC16_LO
, /* type */
899 1, /* size (0 = byte, 1 = short, 2 = long) */
901 FALSE
, /* pc_relative */
903 complain_overflow_dont
, /* complain_on_overflow */
904 ppc64_elf_toc_reloc
, /* special_function */
905 "R_PPC64_TOC16_LO", /* name */
906 FALSE
, /* partial_inplace */
908 0xffff, /* dst_mask */
909 FALSE
), /* pcrel_offset */
911 /* 16 bit TOC-relative relocation, high 16 bits. */
913 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
914 HOWTO (R_PPC64_TOC16_HI
, /* type */
916 1, /* size (0 = byte, 1 = short, 2 = long) */
918 FALSE
, /* pc_relative */
920 complain_overflow_dont
, /* complain_on_overflow */
921 ppc64_elf_toc_reloc
, /* special_function */
922 "R_PPC64_TOC16_HI", /* name */
923 FALSE
, /* partial_inplace */
925 0xffff, /* dst_mask */
926 FALSE
), /* pcrel_offset */
928 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
929 contents of the low 16 bits, treated as a signed number, is
932 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
933 HOWTO (R_PPC64_TOC16_HA
, /* type */
935 1, /* size (0 = byte, 1 = short, 2 = long) */
937 FALSE
, /* pc_relative */
939 complain_overflow_dont
, /* complain_on_overflow */
940 ppc64_elf_toc_ha_reloc
, /* special_function */
941 "R_PPC64_TOC16_HA", /* name */
942 FALSE
, /* partial_inplace */
944 0xffff, /* dst_mask */
945 FALSE
), /* pcrel_offset */
947 /* 64-bit relocation; insert value of TOC base (.TOC.). */
949 /* R_PPC64_TOC 51 doubleword64 .TOC. */
950 HOWTO (R_PPC64_TOC
, /* type */
952 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
954 FALSE
, /* pc_relative */
956 complain_overflow_bitfield
, /* complain_on_overflow */
957 ppc64_elf_toc64_reloc
, /* special_function */
958 "R_PPC64_TOC", /* name */
959 FALSE
, /* partial_inplace */
961 ONES (64), /* dst_mask */
962 FALSE
), /* pcrel_offset */
964 /* Like R_PPC64_GOT16, but also informs the link editor that the
965 value to relocate may (!) refer to a PLT entry which the link
966 editor (a) may replace with the symbol value. If the link editor
967 is unable to fully resolve the symbol, it may (b) create a PLT
968 entry and store the address to the new PLT entry in the GOT.
969 This permits lazy resolution of function symbols at run time.
970 The link editor may also skip all of this and just (c) emit a
971 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
972 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
973 HOWTO (R_PPC64_PLTGOT16
, /* type */
975 1, /* size (0 = byte, 1 = short, 2 = long) */
977 FALSE
, /* pc_relative */
979 complain_overflow_signed
, /* complain_on_overflow */
980 ppc64_elf_unhandled_reloc
, /* special_function */
981 "R_PPC64_PLTGOT16", /* name */
982 FALSE
, /* partial_inplace */
984 0xffff, /* dst_mask */
985 FALSE
), /* pcrel_offset */
987 /* Like R_PPC64_PLTGOT16, but without overflow. */
988 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
989 HOWTO (R_PPC64_PLTGOT16_LO
, /* type */
991 1, /* size (0 = byte, 1 = short, 2 = long) */
993 FALSE
, /* pc_relative */
995 complain_overflow_dont
, /* complain_on_overflow */
996 ppc64_elf_unhandled_reloc
, /* special_function */
997 "R_PPC64_PLTGOT16_LO", /* name */
998 FALSE
, /* partial_inplace */
1000 0xffff, /* dst_mask */
1001 FALSE
), /* pcrel_offset */
1003 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1004 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1005 HOWTO (R_PPC64_PLTGOT16_HI
, /* type */
1006 16, /* rightshift */
1007 1, /* size (0 = byte, 1 = short, 2 = long) */
1009 FALSE
, /* pc_relative */
1011 complain_overflow_dont
, /* complain_on_overflow */
1012 ppc64_elf_unhandled_reloc
, /* special_function */
1013 "R_PPC64_PLTGOT16_HI", /* name */
1014 FALSE
, /* partial_inplace */
1016 0xffff, /* dst_mask */
1017 FALSE
), /* pcrel_offset */
1019 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1020 1 if the contents of the low 16 bits, treated as a signed number,
1022 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1023 HOWTO (R_PPC64_PLTGOT16_HA
, /* type */
1024 16, /* rightshift */
1025 1, /* size (0 = byte, 1 = short, 2 = long) */
1027 FALSE
, /* pc_relative */
1029 complain_overflow_dont
,/* complain_on_overflow */
1030 ppc64_elf_unhandled_reloc
, /* special_function */
1031 "R_PPC64_PLTGOT16_HA", /* name */
1032 FALSE
, /* partial_inplace */
1034 0xffff, /* dst_mask */
1035 FALSE
), /* pcrel_offset */
1037 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1038 HOWTO (R_PPC64_ADDR16_DS
, /* type */
1040 1, /* size (0 = byte, 1 = short, 2 = long) */
1042 FALSE
, /* pc_relative */
1044 complain_overflow_bitfield
, /* complain_on_overflow */
1045 bfd_elf_generic_reloc
, /* special_function */
1046 "R_PPC64_ADDR16_DS", /* name */
1047 FALSE
, /* partial_inplace */
1049 0xfffc, /* dst_mask */
1050 FALSE
), /* pcrel_offset */
1052 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1053 HOWTO (R_PPC64_ADDR16_LO_DS
, /* type */
1055 1, /* size (0 = byte, 1 = short, 2 = long) */
1057 FALSE
, /* pc_relative */
1059 complain_overflow_dont
,/* complain_on_overflow */
1060 bfd_elf_generic_reloc
, /* special_function */
1061 "R_PPC64_ADDR16_LO_DS",/* name */
1062 FALSE
, /* partial_inplace */
1064 0xfffc, /* dst_mask */
1065 FALSE
), /* pcrel_offset */
1067 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1068 HOWTO (R_PPC64_GOT16_DS
, /* type */
1070 1, /* size (0 = byte, 1 = short, 2 = long) */
1072 FALSE
, /* pc_relative */
1074 complain_overflow_signed
, /* complain_on_overflow */
1075 ppc64_elf_unhandled_reloc
, /* special_function */
1076 "R_PPC64_GOT16_DS", /* name */
1077 FALSE
, /* partial_inplace */
1079 0xfffc, /* dst_mask */
1080 FALSE
), /* pcrel_offset */
1082 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1083 HOWTO (R_PPC64_GOT16_LO_DS
, /* type */
1085 1, /* size (0 = byte, 1 = short, 2 = long) */
1087 FALSE
, /* pc_relative */
1089 complain_overflow_dont
, /* complain_on_overflow */
1090 ppc64_elf_unhandled_reloc
, /* special_function */
1091 "R_PPC64_GOT16_LO_DS", /* name */
1092 FALSE
, /* partial_inplace */
1094 0xfffc, /* dst_mask */
1095 FALSE
), /* pcrel_offset */
1097 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1098 HOWTO (R_PPC64_PLT16_LO_DS
, /* type */
1100 1, /* size (0 = byte, 1 = short, 2 = long) */
1102 FALSE
, /* pc_relative */
1104 complain_overflow_dont
, /* complain_on_overflow */
1105 ppc64_elf_unhandled_reloc
, /* special_function */
1106 "R_PPC64_PLT16_LO_DS", /* name */
1107 FALSE
, /* partial_inplace */
1109 0xfffc, /* dst_mask */
1110 FALSE
), /* pcrel_offset */
1112 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1113 HOWTO (R_PPC64_SECTOFF_DS
, /* type */
1115 1, /* size (0 = byte, 1 = short, 2 = long) */
1117 FALSE
, /* pc_relative */
1119 complain_overflow_bitfield
, /* complain_on_overflow */
1120 ppc64_elf_sectoff_reloc
, /* special_function */
1121 "R_PPC64_SECTOFF_DS", /* name */
1122 FALSE
, /* partial_inplace */
1124 0xfffc, /* dst_mask */
1125 FALSE
), /* pcrel_offset */
1127 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1128 HOWTO (R_PPC64_SECTOFF_LO_DS
, /* type */
1130 1, /* size (0 = byte, 1 = short, 2 = long) */
1132 FALSE
, /* pc_relative */
1134 complain_overflow_dont
, /* complain_on_overflow */
1135 ppc64_elf_sectoff_reloc
, /* special_function */
1136 "R_PPC64_SECTOFF_LO_DS",/* name */
1137 FALSE
, /* partial_inplace */
1139 0xfffc, /* dst_mask */
1140 FALSE
), /* pcrel_offset */
1142 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1143 HOWTO (R_PPC64_TOC16_DS
, /* type */
1145 1, /* size (0 = byte, 1 = short, 2 = long) */
1147 FALSE
, /* pc_relative */
1149 complain_overflow_signed
, /* complain_on_overflow */
1150 ppc64_elf_toc_reloc
, /* special_function */
1151 "R_PPC64_TOC16_DS", /* name */
1152 FALSE
, /* partial_inplace */
1154 0xfffc, /* dst_mask */
1155 FALSE
), /* pcrel_offset */
1157 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1158 HOWTO (R_PPC64_TOC16_LO_DS
, /* type */
1160 1, /* size (0 = byte, 1 = short, 2 = long) */
1162 FALSE
, /* pc_relative */
1164 complain_overflow_dont
, /* complain_on_overflow */
1165 ppc64_elf_toc_reloc
, /* special_function */
1166 "R_PPC64_TOC16_LO_DS", /* name */
1167 FALSE
, /* partial_inplace */
1169 0xfffc, /* dst_mask */
1170 FALSE
), /* pcrel_offset */
1172 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1173 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1174 HOWTO (R_PPC64_PLTGOT16_DS
, /* type */
1176 1, /* size (0 = byte, 1 = short, 2 = long) */
1178 FALSE
, /* pc_relative */
1180 complain_overflow_signed
, /* complain_on_overflow */
1181 ppc64_elf_unhandled_reloc
, /* special_function */
1182 "R_PPC64_PLTGOT16_DS", /* name */
1183 FALSE
, /* partial_inplace */
1185 0xfffc, /* dst_mask */
1186 FALSE
), /* pcrel_offset */
1188 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1189 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1190 HOWTO (R_PPC64_PLTGOT16_LO_DS
,/* type */
1192 1, /* size (0 = byte, 1 = short, 2 = long) */
1194 FALSE
, /* pc_relative */
1196 complain_overflow_dont
, /* complain_on_overflow */
1197 ppc64_elf_unhandled_reloc
, /* special_function */
1198 "R_PPC64_PLTGOT16_LO_DS",/* name */
1199 FALSE
, /* partial_inplace */
1201 0xfffc, /* dst_mask */
1202 FALSE
), /* pcrel_offset */
1204 /* Marker reloc for TLS. */
1207 2, /* size (0 = byte, 1 = short, 2 = long) */
1209 FALSE
, /* pc_relative */
1211 complain_overflow_dont
, /* complain_on_overflow */
1212 bfd_elf_generic_reloc
, /* special_function */
1213 "R_PPC64_TLS", /* name */
1214 FALSE
, /* partial_inplace */
1217 FALSE
), /* pcrel_offset */
1219 /* Computes the load module index of the load module that contains the
1220 definition of its TLS sym. */
1221 HOWTO (R_PPC64_DTPMOD64
,
1223 4, /* size (0 = byte, 1 = short, 2 = long) */
1225 FALSE
, /* pc_relative */
1227 complain_overflow_dont
, /* complain_on_overflow */
1228 ppc64_elf_unhandled_reloc
, /* special_function */
1229 "R_PPC64_DTPMOD64", /* name */
1230 FALSE
, /* partial_inplace */
1232 ONES (64), /* dst_mask */
1233 FALSE
), /* pcrel_offset */
1235 /* Computes a dtv-relative displacement, the difference between the value
1236 of sym+add and the base address of the thread-local storage block that
1237 contains the definition of sym, minus 0x8000. */
1238 HOWTO (R_PPC64_DTPREL64
,
1240 4, /* size (0 = byte, 1 = short, 2 = long) */
1242 FALSE
, /* pc_relative */
1244 complain_overflow_dont
, /* complain_on_overflow */
1245 ppc64_elf_unhandled_reloc
, /* special_function */
1246 "R_PPC64_DTPREL64", /* name */
1247 FALSE
, /* partial_inplace */
1249 ONES (64), /* dst_mask */
1250 FALSE
), /* pcrel_offset */
1252 /* A 16 bit dtprel reloc. */
1253 HOWTO (R_PPC64_DTPREL16
,
1255 1, /* size (0 = byte, 1 = short, 2 = long) */
1257 FALSE
, /* pc_relative */
1259 complain_overflow_signed
, /* complain_on_overflow */
1260 ppc64_elf_unhandled_reloc
, /* special_function */
1261 "R_PPC64_DTPREL16", /* name */
1262 FALSE
, /* partial_inplace */
1264 0xffff, /* dst_mask */
1265 FALSE
), /* pcrel_offset */
1267 /* Like DTPREL16, but no overflow. */
1268 HOWTO (R_PPC64_DTPREL16_LO
,
1270 1, /* size (0 = byte, 1 = short, 2 = long) */
1272 FALSE
, /* pc_relative */
1274 complain_overflow_dont
, /* complain_on_overflow */
1275 ppc64_elf_unhandled_reloc
, /* special_function */
1276 "R_PPC64_DTPREL16_LO", /* name */
1277 FALSE
, /* partial_inplace */
1279 0xffff, /* dst_mask */
1280 FALSE
), /* pcrel_offset */
1282 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1283 HOWTO (R_PPC64_DTPREL16_HI
,
1284 16, /* rightshift */
1285 1, /* size (0 = byte, 1 = short, 2 = long) */
1287 FALSE
, /* pc_relative */
1289 complain_overflow_dont
, /* complain_on_overflow */
1290 ppc64_elf_unhandled_reloc
, /* special_function */
1291 "R_PPC64_DTPREL16_HI", /* name */
1292 FALSE
, /* partial_inplace */
1294 0xffff, /* dst_mask */
1295 FALSE
), /* pcrel_offset */
1297 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1298 HOWTO (R_PPC64_DTPREL16_HA
,
1299 16, /* rightshift */
1300 1, /* size (0 = byte, 1 = short, 2 = long) */
1302 FALSE
, /* pc_relative */
1304 complain_overflow_dont
, /* complain_on_overflow */
1305 ppc64_elf_unhandled_reloc
, /* special_function */
1306 "R_PPC64_DTPREL16_HA", /* name */
1307 FALSE
, /* partial_inplace */
1309 0xffff, /* dst_mask */
1310 FALSE
), /* pcrel_offset */
1312 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1313 HOWTO (R_PPC64_DTPREL16_HIGHER
,
1314 32, /* rightshift */
1315 1, /* size (0 = byte, 1 = short, 2 = long) */
1317 FALSE
, /* pc_relative */
1319 complain_overflow_dont
, /* complain_on_overflow */
1320 ppc64_elf_unhandled_reloc
, /* special_function */
1321 "R_PPC64_DTPREL16_HIGHER", /* name */
1322 FALSE
, /* partial_inplace */
1324 0xffff, /* dst_mask */
1325 FALSE
), /* pcrel_offset */
1327 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1328 HOWTO (R_PPC64_DTPREL16_HIGHERA
,
1329 32, /* rightshift */
1330 1, /* size (0 = byte, 1 = short, 2 = long) */
1332 FALSE
, /* pc_relative */
1334 complain_overflow_dont
, /* complain_on_overflow */
1335 ppc64_elf_unhandled_reloc
, /* special_function */
1336 "R_PPC64_DTPREL16_HIGHERA", /* name */
1337 FALSE
, /* partial_inplace */
1339 0xffff, /* dst_mask */
1340 FALSE
), /* pcrel_offset */
1342 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1343 HOWTO (R_PPC64_DTPREL16_HIGHEST
,
1344 48, /* rightshift */
1345 1, /* size (0 = byte, 1 = short, 2 = long) */
1347 FALSE
, /* pc_relative */
1349 complain_overflow_dont
, /* complain_on_overflow */
1350 ppc64_elf_unhandled_reloc
, /* special_function */
1351 "R_PPC64_DTPREL16_HIGHEST", /* name */
1352 FALSE
, /* partial_inplace */
1354 0xffff, /* dst_mask */
1355 FALSE
), /* pcrel_offset */
1357 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1358 HOWTO (R_PPC64_DTPREL16_HIGHESTA
,
1359 48, /* rightshift */
1360 1, /* size (0 = byte, 1 = short, 2 = long) */
1362 FALSE
, /* pc_relative */
1364 complain_overflow_dont
, /* complain_on_overflow */
1365 ppc64_elf_unhandled_reloc
, /* special_function */
1366 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1367 FALSE
, /* partial_inplace */
1369 0xffff, /* dst_mask */
1370 FALSE
), /* pcrel_offset */
1372 /* Like DTPREL16, but for insns with a DS field. */
1373 HOWTO (R_PPC64_DTPREL16_DS
,
1375 1, /* size (0 = byte, 1 = short, 2 = long) */
1377 FALSE
, /* pc_relative */
1379 complain_overflow_signed
, /* complain_on_overflow */
1380 ppc64_elf_unhandled_reloc
, /* special_function */
1381 "R_PPC64_DTPREL16_DS", /* name */
1382 FALSE
, /* partial_inplace */
1384 0xfffc, /* dst_mask */
1385 FALSE
), /* pcrel_offset */
1387 /* Like DTPREL16_DS, but no overflow. */
1388 HOWTO (R_PPC64_DTPREL16_LO_DS
,
1390 1, /* size (0 = byte, 1 = short, 2 = long) */
1392 FALSE
, /* pc_relative */
1394 complain_overflow_dont
, /* complain_on_overflow */
1395 ppc64_elf_unhandled_reloc
, /* special_function */
1396 "R_PPC64_DTPREL16_LO_DS", /* name */
1397 FALSE
, /* partial_inplace */
1399 0xfffc, /* dst_mask */
1400 FALSE
), /* pcrel_offset */
1402 /* Computes a tp-relative displacement, the difference between the value of
1403 sym+add and the value of the thread pointer (r13). */
1404 HOWTO (R_PPC64_TPREL64
,
1406 4, /* size (0 = byte, 1 = short, 2 = long) */
1408 FALSE
, /* pc_relative */
1410 complain_overflow_dont
, /* complain_on_overflow */
1411 ppc64_elf_unhandled_reloc
, /* special_function */
1412 "R_PPC64_TPREL64", /* name */
1413 FALSE
, /* partial_inplace */
1415 ONES (64), /* dst_mask */
1416 FALSE
), /* pcrel_offset */
1418 /* A 16 bit tprel reloc. */
1419 HOWTO (R_PPC64_TPREL16
,
1421 1, /* size (0 = byte, 1 = short, 2 = long) */
1423 FALSE
, /* pc_relative */
1425 complain_overflow_signed
, /* complain_on_overflow */
1426 ppc64_elf_unhandled_reloc
, /* special_function */
1427 "R_PPC64_TPREL16", /* name */
1428 FALSE
, /* partial_inplace */
1430 0xffff, /* dst_mask */
1431 FALSE
), /* pcrel_offset */
1433 /* Like TPREL16, but no overflow. */
1434 HOWTO (R_PPC64_TPREL16_LO
,
1436 1, /* size (0 = byte, 1 = short, 2 = long) */
1438 FALSE
, /* pc_relative */
1440 complain_overflow_dont
, /* complain_on_overflow */
1441 ppc64_elf_unhandled_reloc
, /* special_function */
1442 "R_PPC64_TPREL16_LO", /* name */
1443 FALSE
, /* partial_inplace */
1445 0xffff, /* dst_mask */
1446 FALSE
), /* pcrel_offset */
1448 /* Like TPREL16_LO, but next higher group of 16 bits. */
1449 HOWTO (R_PPC64_TPREL16_HI
,
1450 16, /* rightshift */
1451 1, /* size (0 = byte, 1 = short, 2 = long) */
1453 FALSE
, /* pc_relative */
1455 complain_overflow_dont
, /* complain_on_overflow */
1456 ppc64_elf_unhandled_reloc
, /* special_function */
1457 "R_PPC64_TPREL16_HI", /* name */
1458 FALSE
, /* partial_inplace */
1460 0xffff, /* dst_mask */
1461 FALSE
), /* pcrel_offset */
1463 /* Like TPREL16_HI, but adjust for low 16 bits. */
1464 HOWTO (R_PPC64_TPREL16_HA
,
1465 16, /* rightshift */
1466 1, /* size (0 = byte, 1 = short, 2 = long) */
1468 FALSE
, /* pc_relative */
1470 complain_overflow_dont
, /* complain_on_overflow */
1471 ppc64_elf_unhandled_reloc
, /* special_function */
1472 "R_PPC64_TPREL16_HA", /* name */
1473 FALSE
, /* partial_inplace */
1475 0xffff, /* dst_mask */
1476 FALSE
), /* pcrel_offset */
1478 /* Like TPREL16_HI, but next higher group of 16 bits. */
1479 HOWTO (R_PPC64_TPREL16_HIGHER
,
1480 32, /* rightshift */
1481 1, /* size (0 = byte, 1 = short, 2 = long) */
1483 FALSE
, /* pc_relative */
1485 complain_overflow_dont
, /* complain_on_overflow */
1486 ppc64_elf_unhandled_reloc
, /* special_function */
1487 "R_PPC64_TPREL16_HIGHER", /* name */
1488 FALSE
, /* partial_inplace */
1490 0xffff, /* dst_mask */
1491 FALSE
), /* pcrel_offset */
1493 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1494 HOWTO (R_PPC64_TPREL16_HIGHERA
,
1495 32, /* rightshift */
1496 1, /* size (0 = byte, 1 = short, 2 = long) */
1498 FALSE
, /* pc_relative */
1500 complain_overflow_dont
, /* complain_on_overflow */
1501 ppc64_elf_unhandled_reloc
, /* special_function */
1502 "R_PPC64_TPREL16_HIGHERA", /* name */
1503 FALSE
, /* partial_inplace */
1505 0xffff, /* dst_mask */
1506 FALSE
), /* pcrel_offset */
1508 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1509 HOWTO (R_PPC64_TPREL16_HIGHEST
,
1510 48, /* rightshift */
1511 1, /* size (0 = byte, 1 = short, 2 = long) */
1513 FALSE
, /* pc_relative */
1515 complain_overflow_dont
, /* complain_on_overflow */
1516 ppc64_elf_unhandled_reloc
, /* special_function */
1517 "R_PPC64_TPREL16_HIGHEST", /* name */
1518 FALSE
, /* partial_inplace */
1520 0xffff, /* dst_mask */
1521 FALSE
), /* pcrel_offset */
1523 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1524 HOWTO (R_PPC64_TPREL16_HIGHESTA
,
1525 48, /* rightshift */
1526 1, /* size (0 = byte, 1 = short, 2 = long) */
1528 FALSE
, /* pc_relative */
1530 complain_overflow_dont
, /* complain_on_overflow */
1531 ppc64_elf_unhandled_reloc
, /* special_function */
1532 "R_PPC64_TPREL16_HIGHESTA", /* name */
1533 FALSE
, /* partial_inplace */
1535 0xffff, /* dst_mask */
1536 FALSE
), /* pcrel_offset */
1538 /* Like TPREL16, but for insns with a DS field. */
1539 HOWTO (R_PPC64_TPREL16_DS
,
1541 1, /* size (0 = byte, 1 = short, 2 = long) */
1543 FALSE
, /* pc_relative */
1545 complain_overflow_signed
, /* complain_on_overflow */
1546 ppc64_elf_unhandled_reloc
, /* special_function */
1547 "R_PPC64_TPREL16_DS", /* name */
1548 FALSE
, /* partial_inplace */
1550 0xfffc, /* dst_mask */
1551 FALSE
), /* pcrel_offset */
1553 /* Like TPREL16_DS, but no overflow. */
1554 HOWTO (R_PPC64_TPREL16_LO_DS
,
1556 1, /* size (0 = byte, 1 = short, 2 = long) */
1558 FALSE
, /* pc_relative */
1560 complain_overflow_dont
, /* complain_on_overflow */
1561 ppc64_elf_unhandled_reloc
, /* special_function */
1562 "R_PPC64_TPREL16_LO_DS", /* name */
1563 FALSE
, /* partial_inplace */
1565 0xfffc, /* dst_mask */
1566 FALSE
), /* pcrel_offset */
1568 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1569 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1570 to the first entry relative to the TOC base (r2). */
1571 HOWTO (R_PPC64_GOT_TLSGD16
,
1573 1, /* size (0 = byte, 1 = short, 2 = long) */
1575 FALSE
, /* pc_relative */
1577 complain_overflow_signed
, /* complain_on_overflow */
1578 ppc64_elf_unhandled_reloc
, /* special_function */
1579 "R_PPC64_GOT_TLSGD16", /* name */
1580 FALSE
, /* partial_inplace */
1582 0xffff, /* dst_mask */
1583 FALSE
), /* pcrel_offset */
1585 /* Like GOT_TLSGD16, but no overflow. */
1586 HOWTO (R_PPC64_GOT_TLSGD16_LO
,
1588 1, /* size (0 = byte, 1 = short, 2 = long) */
1590 FALSE
, /* pc_relative */
1592 complain_overflow_dont
, /* complain_on_overflow */
1593 ppc64_elf_unhandled_reloc
, /* special_function */
1594 "R_PPC64_GOT_TLSGD16_LO", /* name */
1595 FALSE
, /* partial_inplace */
1597 0xffff, /* dst_mask */
1598 FALSE
), /* pcrel_offset */
1600 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1601 HOWTO (R_PPC64_GOT_TLSGD16_HI
,
1602 16, /* rightshift */
1603 1, /* size (0 = byte, 1 = short, 2 = long) */
1605 FALSE
, /* pc_relative */
1607 complain_overflow_dont
, /* complain_on_overflow */
1608 ppc64_elf_unhandled_reloc
, /* special_function */
1609 "R_PPC64_GOT_TLSGD16_HI", /* name */
1610 FALSE
, /* partial_inplace */
1612 0xffff, /* dst_mask */
1613 FALSE
), /* pcrel_offset */
1615 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1616 HOWTO (R_PPC64_GOT_TLSGD16_HA
,
1617 16, /* rightshift */
1618 1, /* size (0 = byte, 1 = short, 2 = long) */
1620 FALSE
, /* pc_relative */
1622 complain_overflow_dont
, /* complain_on_overflow */
1623 ppc64_elf_unhandled_reloc
, /* special_function */
1624 "R_PPC64_GOT_TLSGD16_HA", /* name */
1625 FALSE
, /* partial_inplace */
1627 0xffff, /* dst_mask */
1628 FALSE
), /* pcrel_offset */
1630 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1631 with values (sym+add)@dtpmod and zero, and computes the offset to the
1632 first entry relative to the TOC base (r2). */
1633 HOWTO (R_PPC64_GOT_TLSLD16
,
1635 1, /* size (0 = byte, 1 = short, 2 = long) */
1637 FALSE
, /* pc_relative */
1639 complain_overflow_signed
, /* complain_on_overflow */
1640 ppc64_elf_unhandled_reloc
, /* special_function */
1641 "R_PPC64_GOT_TLSLD16", /* name */
1642 FALSE
, /* partial_inplace */
1644 0xffff, /* dst_mask */
1645 FALSE
), /* pcrel_offset */
1647 /* Like GOT_TLSLD16, but no overflow. */
1648 HOWTO (R_PPC64_GOT_TLSLD16_LO
,
1650 1, /* size (0 = byte, 1 = short, 2 = long) */
1652 FALSE
, /* pc_relative */
1654 complain_overflow_dont
, /* complain_on_overflow */
1655 ppc64_elf_unhandled_reloc
, /* special_function */
1656 "R_PPC64_GOT_TLSLD16_LO", /* name */
1657 FALSE
, /* partial_inplace */
1659 0xffff, /* dst_mask */
1660 FALSE
), /* pcrel_offset */
1662 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1663 HOWTO (R_PPC64_GOT_TLSLD16_HI
,
1664 16, /* rightshift */
1665 1, /* size (0 = byte, 1 = short, 2 = long) */
1667 FALSE
, /* pc_relative */
1669 complain_overflow_dont
, /* complain_on_overflow */
1670 ppc64_elf_unhandled_reloc
, /* special_function */
1671 "R_PPC64_GOT_TLSLD16_HI", /* name */
1672 FALSE
, /* partial_inplace */
1674 0xffff, /* dst_mask */
1675 FALSE
), /* pcrel_offset */
1677 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1678 HOWTO (R_PPC64_GOT_TLSLD16_HA
,
1679 16, /* rightshift */
1680 1, /* size (0 = byte, 1 = short, 2 = long) */
1682 FALSE
, /* pc_relative */
1684 complain_overflow_dont
, /* complain_on_overflow */
1685 ppc64_elf_unhandled_reloc
, /* special_function */
1686 "R_PPC64_GOT_TLSLD16_HA", /* name */
1687 FALSE
, /* partial_inplace */
1689 0xffff, /* dst_mask */
1690 FALSE
), /* pcrel_offset */
1692 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1693 the offset to the entry relative to the TOC base (r2). */
1694 HOWTO (R_PPC64_GOT_DTPREL16_DS
,
1696 1, /* size (0 = byte, 1 = short, 2 = long) */
1698 FALSE
, /* pc_relative */
1700 complain_overflow_signed
, /* complain_on_overflow */
1701 ppc64_elf_unhandled_reloc
, /* special_function */
1702 "R_PPC64_GOT_DTPREL16_DS", /* name */
1703 FALSE
, /* partial_inplace */
1705 0xfffc, /* dst_mask */
1706 FALSE
), /* pcrel_offset */
1708 /* Like GOT_DTPREL16_DS, but no overflow. */
1709 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS
,
1711 1, /* size (0 = byte, 1 = short, 2 = long) */
1713 FALSE
, /* pc_relative */
1715 complain_overflow_dont
, /* complain_on_overflow */
1716 ppc64_elf_unhandled_reloc
, /* special_function */
1717 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
1718 FALSE
, /* partial_inplace */
1720 0xfffc, /* dst_mask */
1721 FALSE
), /* pcrel_offset */
1723 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1724 HOWTO (R_PPC64_GOT_DTPREL16_HI
,
1725 16, /* rightshift */
1726 1, /* size (0 = byte, 1 = short, 2 = long) */
1728 FALSE
, /* pc_relative */
1730 complain_overflow_dont
, /* complain_on_overflow */
1731 ppc64_elf_unhandled_reloc
, /* special_function */
1732 "R_PPC64_GOT_DTPREL16_HI", /* name */
1733 FALSE
, /* partial_inplace */
1735 0xffff, /* dst_mask */
1736 FALSE
), /* pcrel_offset */
1738 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1739 HOWTO (R_PPC64_GOT_DTPREL16_HA
,
1740 16, /* rightshift */
1741 1, /* size (0 = byte, 1 = short, 2 = long) */
1743 FALSE
, /* pc_relative */
1745 complain_overflow_dont
, /* complain_on_overflow */
1746 ppc64_elf_unhandled_reloc
, /* special_function */
1747 "R_PPC64_GOT_DTPREL16_HA", /* name */
1748 FALSE
, /* partial_inplace */
1750 0xffff, /* dst_mask */
1751 FALSE
), /* pcrel_offset */
1753 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1754 offset to the entry relative to the TOC base (r2). */
1755 HOWTO (R_PPC64_GOT_TPREL16_DS
,
1757 1, /* size (0 = byte, 1 = short, 2 = long) */
1759 FALSE
, /* pc_relative */
1761 complain_overflow_signed
, /* complain_on_overflow */
1762 ppc64_elf_unhandled_reloc
, /* special_function */
1763 "R_PPC64_GOT_TPREL16_DS", /* name */
1764 FALSE
, /* partial_inplace */
1766 0xfffc, /* dst_mask */
1767 FALSE
), /* pcrel_offset */
1769 /* Like GOT_TPREL16_DS, but no overflow. */
1770 HOWTO (R_PPC64_GOT_TPREL16_LO_DS
,
1772 1, /* size (0 = byte, 1 = short, 2 = long) */
1774 FALSE
, /* pc_relative */
1776 complain_overflow_dont
, /* complain_on_overflow */
1777 ppc64_elf_unhandled_reloc
, /* special_function */
1778 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
1779 FALSE
, /* partial_inplace */
1781 0xfffc, /* dst_mask */
1782 FALSE
), /* pcrel_offset */
1784 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1785 HOWTO (R_PPC64_GOT_TPREL16_HI
,
1786 16, /* rightshift */
1787 1, /* size (0 = byte, 1 = short, 2 = long) */
1789 FALSE
, /* pc_relative */
1791 complain_overflow_dont
, /* complain_on_overflow */
1792 ppc64_elf_unhandled_reloc
, /* special_function */
1793 "R_PPC64_GOT_TPREL16_HI", /* name */
1794 FALSE
, /* partial_inplace */
1796 0xffff, /* dst_mask */
1797 FALSE
), /* pcrel_offset */
1799 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1800 HOWTO (R_PPC64_GOT_TPREL16_HA
,
1801 16, /* rightshift */
1802 1, /* size (0 = byte, 1 = short, 2 = long) */
1804 FALSE
, /* pc_relative */
1806 complain_overflow_dont
, /* complain_on_overflow */
1807 ppc64_elf_unhandled_reloc
, /* special_function */
1808 "R_PPC64_GOT_TPREL16_HA", /* name */
1809 FALSE
, /* partial_inplace */
1811 0xffff, /* dst_mask */
1812 FALSE
), /* pcrel_offset */
1814 /* GNU extension to record C++ vtable hierarchy. */
1815 HOWTO (R_PPC64_GNU_VTINHERIT
, /* type */
1817 0, /* size (0 = byte, 1 = short, 2 = long) */
1819 FALSE
, /* pc_relative */
1821 complain_overflow_dont
, /* complain_on_overflow */
1822 NULL
, /* special_function */
1823 "R_PPC64_GNU_VTINHERIT", /* name */
1824 FALSE
, /* partial_inplace */
1827 FALSE
), /* pcrel_offset */
1829 /* GNU extension to record C++ vtable member usage. */
1830 HOWTO (R_PPC64_GNU_VTENTRY
, /* type */
1832 0, /* size (0 = byte, 1 = short, 2 = long) */
1834 FALSE
, /* pc_relative */
1836 complain_overflow_dont
, /* complain_on_overflow */
1837 NULL
, /* special_function */
1838 "R_PPC64_GNU_VTENTRY", /* name */
1839 FALSE
, /* partial_inplace */
1842 FALSE
), /* pcrel_offset */
1846 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
1850 ppc_howto_init (void)
1852 unsigned int i
, type
;
1855 i
< sizeof (ppc64_elf_howto_raw
) / sizeof (ppc64_elf_howto_raw
[0]);
1858 type
= ppc64_elf_howto_raw
[i
].type
;
1859 BFD_ASSERT (type
< (sizeof (ppc64_elf_howto_table
)
1860 / sizeof (ppc64_elf_howto_table
[0])));
1861 ppc64_elf_howto_table
[type
] = &ppc64_elf_howto_raw
[i
];
1865 static reloc_howto_type
*
1866 ppc64_elf_reloc_type_lookup (bfd
*abfd ATTRIBUTE_UNUSED
,
1867 bfd_reloc_code_real_type code
)
1869 enum elf_ppc64_reloc_type r
= R_PPC64_NONE
;
1871 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
1872 /* Initialize howto table if needed. */
1880 case BFD_RELOC_NONE
: r
= R_PPC64_NONE
;
1882 case BFD_RELOC_32
: r
= R_PPC64_ADDR32
;
1884 case BFD_RELOC_PPC_BA26
: r
= R_PPC64_ADDR24
;
1886 case BFD_RELOC_16
: r
= R_PPC64_ADDR16
;
1888 case BFD_RELOC_LO16
: r
= R_PPC64_ADDR16_LO
;
1890 case BFD_RELOC_HI16
: r
= R_PPC64_ADDR16_HI
;
1892 case BFD_RELOC_HI16_S
: r
= R_PPC64_ADDR16_HA
;
1894 case BFD_RELOC_PPC_BA16
: r
= R_PPC64_ADDR14
;
1896 case BFD_RELOC_PPC_BA16_BRTAKEN
: r
= R_PPC64_ADDR14_BRTAKEN
;
1898 case BFD_RELOC_PPC_BA16_BRNTAKEN
: r
= R_PPC64_ADDR14_BRNTAKEN
;
1900 case BFD_RELOC_PPC_B26
: r
= R_PPC64_REL24
;
1902 case BFD_RELOC_PPC_B16
: r
= R_PPC64_REL14
;
1904 case BFD_RELOC_PPC_B16_BRTAKEN
: r
= R_PPC64_REL14_BRTAKEN
;
1906 case BFD_RELOC_PPC_B16_BRNTAKEN
: r
= R_PPC64_REL14_BRNTAKEN
;
1908 case BFD_RELOC_16_GOTOFF
: r
= R_PPC64_GOT16
;
1910 case BFD_RELOC_LO16_GOTOFF
: r
= R_PPC64_GOT16_LO
;
1912 case BFD_RELOC_HI16_GOTOFF
: r
= R_PPC64_GOT16_HI
;
1914 case BFD_RELOC_HI16_S_GOTOFF
: r
= R_PPC64_GOT16_HA
;
1916 case BFD_RELOC_PPC_COPY
: r
= R_PPC64_COPY
;
1918 case BFD_RELOC_PPC_GLOB_DAT
: r
= R_PPC64_GLOB_DAT
;
1920 case BFD_RELOC_32_PCREL
: r
= R_PPC64_REL32
;
1922 case BFD_RELOC_32_PLTOFF
: r
= R_PPC64_PLT32
;
1924 case BFD_RELOC_32_PLT_PCREL
: r
= R_PPC64_PLTREL32
;
1926 case BFD_RELOC_LO16_PLTOFF
: r
= R_PPC64_PLT16_LO
;
1928 case BFD_RELOC_HI16_PLTOFF
: r
= R_PPC64_PLT16_HI
;
1930 case BFD_RELOC_HI16_S_PLTOFF
: r
= R_PPC64_PLT16_HA
;
1932 case BFD_RELOC_16_BASEREL
: r
= R_PPC64_SECTOFF
;
1934 case BFD_RELOC_LO16_BASEREL
: r
= R_PPC64_SECTOFF_LO
;
1936 case BFD_RELOC_HI16_BASEREL
: r
= R_PPC64_SECTOFF_HI
;
1938 case BFD_RELOC_HI16_S_BASEREL
: r
= R_PPC64_SECTOFF_HA
;
1940 case BFD_RELOC_CTOR
: r
= R_PPC64_ADDR64
;
1942 case BFD_RELOC_64
: r
= R_PPC64_ADDR64
;
1944 case BFD_RELOC_PPC64_HIGHER
: r
= R_PPC64_ADDR16_HIGHER
;
1946 case BFD_RELOC_PPC64_HIGHER_S
: r
= R_PPC64_ADDR16_HIGHERA
;
1948 case BFD_RELOC_PPC64_HIGHEST
: r
= R_PPC64_ADDR16_HIGHEST
;
1950 case BFD_RELOC_PPC64_HIGHEST_S
: r
= R_PPC64_ADDR16_HIGHESTA
;
1952 case BFD_RELOC_64_PCREL
: r
= R_PPC64_REL64
;
1954 case BFD_RELOC_64_PLTOFF
: r
= R_PPC64_PLT64
;
1956 case BFD_RELOC_64_PLT_PCREL
: r
= R_PPC64_PLTREL64
;
1958 case BFD_RELOC_PPC_TOC16
: r
= R_PPC64_TOC16
;
1960 case BFD_RELOC_PPC64_TOC16_LO
: r
= R_PPC64_TOC16_LO
;
1962 case BFD_RELOC_PPC64_TOC16_HI
: r
= R_PPC64_TOC16_HI
;
1964 case BFD_RELOC_PPC64_TOC16_HA
: r
= R_PPC64_TOC16_HA
;
1966 case BFD_RELOC_PPC64_TOC
: r
= R_PPC64_TOC
;
1968 case BFD_RELOC_PPC64_PLTGOT16
: r
= R_PPC64_PLTGOT16
;
1970 case BFD_RELOC_PPC64_PLTGOT16_LO
: r
= R_PPC64_PLTGOT16_LO
;
1972 case BFD_RELOC_PPC64_PLTGOT16_HI
: r
= R_PPC64_PLTGOT16_HI
;
1974 case BFD_RELOC_PPC64_PLTGOT16_HA
: r
= R_PPC64_PLTGOT16_HA
;
1976 case BFD_RELOC_PPC64_ADDR16_DS
: r
= R_PPC64_ADDR16_DS
;
1978 case BFD_RELOC_PPC64_ADDR16_LO_DS
: r
= R_PPC64_ADDR16_LO_DS
;
1980 case BFD_RELOC_PPC64_GOT16_DS
: r
= R_PPC64_GOT16_DS
;
1982 case BFD_RELOC_PPC64_GOT16_LO_DS
: r
= R_PPC64_GOT16_LO_DS
;
1984 case BFD_RELOC_PPC64_PLT16_LO_DS
: r
= R_PPC64_PLT16_LO_DS
;
1986 case BFD_RELOC_PPC64_SECTOFF_DS
: r
= R_PPC64_SECTOFF_DS
;
1988 case BFD_RELOC_PPC64_SECTOFF_LO_DS
: r
= R_PPC64_SECTOFF_LO_DS
;
1990 case BFD_RELOC_PPC64_TOC16_DS
: r
= R_PPC64_TOC16_DS
;
1992 case BFD_RELOC_PPC64_TOC16_LO_DS
: r
= R_PPC64_TOC16_LO_DS
;
1994 case BFD_RELOC_PPC64_PLTGOT16_DS
: r
= R_PPC64_PLTGOT16_DS
;
1996 case BFD_RELOC_PPC64_PLTGOT16_LO_DS
: r
= R_PPC64_PLTGOT16_LO_DS
;
1998 case BFD_RELOC_PPC_TLS
: r
= R_PPC64_TLS
;
2000 case BFD_RELOC_PPC_DTPMOD
: r
= R_PPC64_DTPMOD64
;
2002 case BFD_RELOC_PPC_TPREL16
: r
= R_PPC64_TPREL16
;
2004 case BFD_RELOC_PPC_TPREL16_LO
: r
= R_PPC64_TPREL16_LO
;
2006 case BFD_RELOC_PPC_TPREL16_HI
: r
= R_PPC64_TPREL16_HI
;
2008 case BFD_RELOC_PPC_TPREL16_HA
: r
= R_PPC64_TPREL16_HA
;
2010 case BFD_RELOC_PPC_TPREL
: r
= R_PPC64_TPREL64
;
2012 case BFD_RELOC_PPC_DTPREL16
: r
= R_PPC64_DTPREL16
;
2014 case BFD_RELOC_PPC_DTPREL16_LO
: r
= R_PPC64_DTPREL16_LO
;
2016 case BFD_RELOC_PPC_DTPREL16_HI
: r
= R_PPC64_DTPREL16_HI
;
2018 case BFD_RELOC_PPC_DTPREL16_HA
: r
= R_PPC64_DTPREL16_HA
;
2020 case BFD_RELOC_PPC_DTPREL
: r
= R_PPC64_DTPREL64
;
2022 case BFD_RELOC_PPC_GOT_TLSGD16
: r
= R_PPC64_GOT_TLSGD16
;
2024 case BFD_RELOC_PPC_GOT_TLSGD16_LO
: r
= R_PPC64_GOT_TLSGD16_LO
;
2026 case BFD_RELOC_PPC_GOT_TLSGD16_HI
: r
= R_PPC64_GOT_TLSGD16_HI
;
2028 case BFD_RELOC_PPC_GOT_TLSGD16_HA
: r
= R_PPC64_GOT_TLSGD16_HA
;
2030 case BFD_RELOC_PPC_GOT_TLSLD16
: r
= R_PPC64_GOT_TLSLD16
;
2032 case BFD_RELOC_PPC_GOT_TLSLD16_LO
: r
= R_PPC64_GOT_TLSLD16_LO
;
2034 case BFD_RELOC_PPC_GOT_TLSLD16_HI
: r
= R_PPC64_GOT_TLSLD16_HI
;
2036 case BFD_RELOC_PPC_GOT_TLSLD16_HA
: r
= R_PPC64_GOT_TLSLD16_HA
;
2038 case BFD_RELOC_PPC_GOT_TPREL16
: r
= R_PPC64_GOT_TPREL16_DS
;
2040 case BFD_RELOC_PPC_GOT_TPREL16_LO
: r
= R_PPC64_GOT_TPREL16_LO_DS
;
2042 case BFD_RELOC_PPC_GOT_TPREL16_HI
: r
= R_PPC64_GOT_TPREL16_HI
;
2044 case BFD_RELOC_PPC_GOT_TPREL16_HA
: r
= R_PPC64_GOT_TPREL16_HA
;
2046 case BFD_RELOC_PPC_GOT_DTPREL16
: r
= R_PPC64_GOT_DTPREL16_DS
;
2048 case BFD_RELOC_PPC_GOT_DTPREL16_LO
: r
= R_PPC64_GOT_DTPREL16_LO_DS
;
2050 case BFD_RELOC_PPC_GOT_DTPREL16_HI
: r
= R_PPC64_GOT_DTPREL16_HI
;
2052 case BFD_RELOC_PPC_GOT_DTPREL16_HA
: r
= R_PPC64_GOT_DTPREL16_HA
;
2054 case BFD_RELOC_PPC64_TPREL16_DS
: r
= R_PPC64_TPREL16_DS
;
2056 case BFD_RELOC_PPC64_TPREL16_LO_DS
: r
= R_PPC64_TPREL16_LO_DS
;
2058 case BFD_RELOC_PPC64_TPREL16_HIGHER
: r
= R_PPC64_TPREL16_HIGHER
;
2060 case BFD_RELOC_PPC64_TPREL16_HIGHERA
: r
= R_PPC64_TPREL16_HIGHERA
;
2062 case BFD_RELOC_PPC64_TPREL16_HIGHEST
: r
= R_PPC64_TPREL16_HIGHEST
;
2064 case BFD_RELOC_PPC64_TPREL16_HIGHESTA
: r
= R_PPC64_TPREL16_HIGHESTA
;
2066 case BFD_RELOC_PPC64_DTPREL16_DS
: r
= R_PPC64_DTPREL16_DS
;
2068 case BFD_RELOC_PPC64_DTPREL16_LO_DS
: r
= R_PPC64_DTPREL16_LO_DS
;
2070 case BFD_RELOC_PPC64_DTPREL16_HIGHER
: r
= R_PPC64_DTPREL16_HIGHER
;
2072 case BFD_RELOC_PPC64_DTPREL16_HIGHERA
: r
= R_PPC64_DTPREL16_HIGHERA
;
2074 case BFD_RELOC_PPC64_DTPREL16_HIGHEST
: r
= R_PPC64_DTPREL16_HIGHEST
;
2076 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA
: r
= R_PPC64_DTPREL16_HIGHESTA
;
2078 case BFD_RELOC_VTABLE_INHERIT
: r
= R_PPC64_GNU_VTINHERIT
;
2080 case BFD_RELOC_VTABLE_ENTRY
: r
= R_PPC64_GNU_VTENTRY
;
2084 return ppc64_elf_howto_table
[r
];
2087 /* Set the howto pointer for a PowerPC ELF reloc. */
2090 ppc64_elf_info_to_howto (bfd
*abfd ATTRIBUTE_UNUSED
, arelent
*cache_ptr
,
2091 Elf_Internal_Rela
*dst
)
2095 /* Initialize howto table if needed. */
2096 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
2099 type
= ELF64_R_TYPE (dst
->r_info
);
2100 BFD_ASSERT (type
< (sizeof (ppc64_elf_howto_table
)
2101 / sizeof (ppc64_elf_howto_table
[0])));
2102 cache_ptr
->howto
= ppc64_elf_howto_table
[type
];
2105 /* Handle the R_PPC64_ADDR16_HA and similar relocs. */
2107 static bfd_reloc_status_type
2108 ppc64_elf_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2109 void *data
, asection
*input_section
,
2110 bfd
*output_bfd
, char **error_message
)
2112 /* If this is a relocatable link (output_bfd test tells us), just
2113 call the generic function. Any adjustment will be done at final
2115 if (output_bfd
!= NULL
)
2116 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2117 input_section
, output_bfd
, error_message
);
2119 /* Adjust the addend for sign extension of the low 16 bits.
2120 We won't actually be using the low 16 bits, so trashing them
2122 reloc_entry
->addend
+= 0x8000;
2123 return bfd_reloc_continue
;
2126 static bfd_reloc_status_type
2127 ppc64_elf_brtaken_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2128 void *data
, asection
*input_section
,
2129 bfd
*output_bfd
, char **error_message
)
2132 enum elf_ppc64_reloc_type r_type
;
2133 bfd_size_type octets
;
2134 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
2135 bfd_boolean is_power4
= FALSE
;
2137 /* If this is a relocatable link (output_bfd test tells us), just
2138 call the generic function. Any adjustment will be done at final
2140 if (output_bfd
!= NULL
)
2141 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2142 input_section
, output_bfd
, error_message
);
2144 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
2145 insn
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ octets
);
2146 insn
&= ~(0x01 << 21);
2147 r_type
= reloc_entry
->howto
->type
;
2148 if (r_type
== R_PPC64_ADDR14_BRTAKEN
2149 || r_type
== R_PPC64_REL14_BRTAKEN
)
2150 insn
|= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
2154 /* Set 'a' bit. This is 0b00010 in BO field for branch
2155 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2156 for branch on CTR insns (BO == 1a00t or 1a01t). */
2157 if ((insn
& (0x14 << 21)) == (0x04 << 21))
2159 else if ((insn
& (0x14 << 21)) == (0x10 << 21))
2162 return bfd_reloc_continue
;
2169 if (!bfd_is_com_section (symbol
->section
))
2170 target
= symbol
->value
;
2171 target
+= symbol
->section
->output_section
->vma
;
2172 target
+= symbol
->section
->output_offset
;
2173 target
+= reloc_entry
->addend
;
2175 from
= (reloc_entry
->address
2176 + input_section
->output_offset
2177 + input_section
->output_section
->vma
);
2179 /* Invert 'y' bit if not the default. */
2180 if ((bfd_signed_vma
) (target
- from
) < 0)
2183 bfd_put_32 (abfd
, insn
, (bfd_byte
*) data
+ octets
);
2184 return bfd_reloc_continue
;
2187 static bfd_reloc_status_type
2188 ppc64_elf_sectoff_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2189 void *data
, asection
*input_section
,
2190 bfd
*output_bfd
, char **error_message
)
2192 /* If this is a relocatable link (output_bfd test tells us), just
2193 call the generic function. Any adjustment will be done at final
2195 if (output_bfd
!= NULL
)
2196 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2197 input_section
, output_bfd
, error_message
);
2199 /* Subtract the symbol section base address. */
2200 reloc_entry
->addend
-= symbol
->section
->output_section
->vma
;
2201 return bfd_reloc_continue
;
2204 static bfd_reloc_status_type
2205 ppc64_elf_sectoff_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2206 void *data
, asection
*input_section
,
2207 bfd
*output_bfd
, char **error_message
)
2209 /* If this is a relocatable link (output_bfd test tells us), just
2210 call the generic function. Any adjustment will be done at final
2212 if (output_bfd
!= NULL
)
2213 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2214 input_section
, output_bfd
, error_message
);
2216 /* Subtract the symbol section base address. */
2217 reloc_entry
->addend
-= symbol
->section
->output_section
->vma
;
2219 /* Adjust the addend for sign extension of the low 16 bits. */
2220 reloc_entry
->addend
+= 0x8000;
2221 return bfd_reloc_continue
;
2224 static bfd_reloc_status_type
2225 ppc64_elf_toc_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2226 void *data
, asection
*input_section
,
2227 bfd
*output_bfd
, char **error_message
)
2231 /* If this is a relocatable link (output_bfd test tells us), just
2232 call the generic function. Any adjustment will be done at final
2234 if (output_bfd
!= NULL
)
2235 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2236 input_section
, output_bfd
, error_message
);
2238 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2240 TOCstart
= ppc64_elf_toc (input_section
->output_section
->owner
);
2242 /* Subtract the TOC base address. */
2243 reloc_entry
->addend
-= TOCstart
+ TOC_BASE_OFF
;
2244 return bfd_reloc_continue
;
2247 static bfd_reloc_status_type
2248 ppc64_elf_toc_ha_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2249 void *data
, asection
*input_section
,
2250 bfd
*output_bfd
, char **error_message
)
2254 /* If this is a relocatable link (output_bfd test tells us), just
2255 call the generic function. Any adjustment will be done at final
2257 if (output_bfd
!= NULL
)
2258 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2259 input_section
, output_bfd
, error_message
);
2261 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2263 TOCstart
= ppc64_elf_toc (input_section
->output_section
->owner
);
2265 /* Subtract the TOC base address. */
2266 reloc_entry
->addend
-= TOCstart
+ TOC_BASE_OFF
;
2268 /* Adjust the addend for sign extension of the low 16 bits. */
2269 reloc_entry
->addend
+= 0x8000;
2270 return bfd_reloc_continue
;
2273 static bfd_reloc_status_type
2274 ppc64_elf_toc64_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2275 void *data
, asection
*input_section
,
2276 bfd
*output_bfd
, char **error_message
)
2279 bfd_size_type octets
;
2281 /* If this is a relocatable link (output_bfd test tells us), just
2282 call the generic function. Any adjustment will be done at final
2284 if (output_bfd
!= NULL
)
2285 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2286 input_section
, output_bfd
, error_message
);
2288 TOCstart
= _bfd_get_gp_value (input_section
->output_section
->owner
);
2290 TOCstart
= ppc64_elf_toc (input_section
->output_section
->owner
);
2292 octets
= reloc_entry
->address
* bfd_octets_per_byte (abfd
);
2293 bfd_put_64 (abfd
, TOCstart
+ TOC_BASE_OFF
, (bfd_byte
*) data
+ octets
);
2294 return bfd_reloc_ok
;
2297 static bfd_reloc_status_type
2298 ppc64_elf_unhandled_reloc (bfd
*abfd
, arelent
*reloc_entry
, asymbol
*symbol
,
2299 void *data
, asection
*input_section
,
2300 bfd
*output_bfd
, char **error_message
)
2302 /* If this is a relocatable link (output_bfd test tells us), just
2303 call the generic function. Any adjustment will be done at final
2305 if (output_bfd
!= NULL
)
2306 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
2307 input_section
, output_bfd
, error_message
);
2309 if (error_message
!= NULL
)
2311 static char buf
[60];
2312 sprintf (buf
, "generic linker can't handle %s",
2313 reloc_entry
->howto
->name
);
2314 *error_message
= buf
;
2316 return bfd_reloc_dangerous
;
2319 /* Fix bad default arch selected for a 64 bit input bfd when the
2320 default is 32 bit. */
2323 ppc64_elf_object_p (bfd
*abfd
)
2325 if (abfd
->arch_info
->the_default
&& abfd
->arch_info
->bits_per_word
== 32)
2327 Elf_Internal_Ehdr
*i_ehdr
= elf_elfheader (abfd
);
2329 if (i_ehdr
->e_ident
[EI_CLASS
] == ELFCLASS64
)
2331 /* Relies on arch after 32 bit default being 64 bit default. */
2332 abfd
->arch_info
= abfd
->arch_info
->next
;
2333 BFD_ASSERT (abfd
->arch_info
->bits_per_word
== 64);
2339 /* Merge backend specific data from an object file to the output
2340 object file when linking. */
2343 ppc64_elf_merge_private_bfd_data (bfd
*ibfd
, bfd
*obfd
)
2345 /* Check if we have the same endianess. */
2346 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
2347 && ibfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
2348 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
2352 if (bfd_big_endian (ibfd
))
2353 msg
= _("%s: compiled for a big endian system "
2354 "and target is little endian");
2356 msg
= _("%s: compiled for a little endian system "
2357 "and target is big endian");
2359 (*_bfd_error_handler
) (msg
, bfd_archive_filename (ibfd
));
2361 bfd_set_error (bfd_error_wrong_format
);
2368 struct _ppc64_elf_section_data
2370 struct bfd_elf_section_data elf
;
2372 /* An array with one entry for each opd function descriptor. */
2375 /* Points to the function code section for local opd entries. */
2376 asection
**func_sec
;
2377 /* After editing .opd, adjust references to opd local syms. */
2381 /* An array for toc sections, indexed by offset/8.
2382 Specifies the relocation symbol index used at a given toc offset. */
2386 #define ppc64_elf_section_data(sec) \
2387 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
2390 ppc64_elf_new_section_hook (bfd
*abfd
, asection
*sec
)
2392 struct _ppc64_elf_section_data
*sdata
;
2393 bfd_size_type amt
= sizeof (*sdata
);
2395 sdata
= bfd_zalloc (abfd
, amt
);
2398 sec
->used_by_bfd
= sdata
;
2400 return _bfd_elf_new_section_hook (abfd
, sec
);
2403 /* The following functions are specific to the ELF linker, while
2404 functions above are used generally. Those named ppc64_elf_* are
2405 called by the main ELF linker code. They appear in this file more
2406 or less in the order in which they are called. eg.
2407 ppc64_elf_check_relocs is called early in the link process,
2408 ppc64_elf_finish_dynamic_sections is one of the last functions
2411 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2412 functions have both a function code symbol and a function descriptor
2413 symbol. A call to foo in a relocatable object file looks like:
2420 The function definition in another object file might be:
2424 . .quad .TOC.@tocbase
2430 When the linker resolves the call during a static link, the branch
2431 unsurprisingly just goes to .foo and the .opd information is unused.
2432 If the function definition is in a shared library, things are a little
2433 different: The call goes via a plt call stub, the opd information gets
2434 copied to the plt, and the linker patches the nop.
2442 . addis 12,2,Lfoo@toc@ha # in practice, the call stub
2443 . addi 12,12,Lfoo@toc@l # is slightly optimized, but
2444 . std 2,40(1) # this is the general idea
2452 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2454 The "reloc ()" notation is supposed to indicate that the linker emits
2455 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2458 What are the difficulties here? Well, firstly, the relocations
2459 examined by the linker in check_relocs are against the function code
2460 sym .foo, while the dynamic relocation in the plt is emitted against
2461 the function descriptor symbol, foo. Somewhere along the line, we need
2462 to carefully copy dynamic link information from one symbol to the other.
2463 Secondly, the generic part of the elf linker will make .foo a dynamic
2464 symbol as is normal for most other backends. We need foo dynamic
2465 instead, at least for an application final link. However, when
2466 creating a shared library containing foo, we need to have both symbols
2467 dynamic so that references to .foo are satisfied during the early
2468 stages of linking. Otherwise the linker might decide to pull in a
2469 definition from some other object, eg. a static library. */
2471 /* The linker needs to keep track of the number of relocs that it
2472 decides to copy as dynamic relocs in check_relocs for each symbol.
2473 This is so that it can later discard them if they are found to be
2474 unnecessary. We store the information in a field extending the
2475 regular ELF linker hash table. */
2477 struct ppc_dyn_relocs
2479 struct ppc_dyn_relocs
*next
;
2481 /* The input section of the reloc. */
2484 /* Total number of relocs copied for the input section. */
2485 bfd_size_type count
;
2487 /* Number of pc-relative relocs copied for the input section. */
2488 bfd_size_type pc_count
;
2491 /* Track GOT entries needed for a given symbol. We might need more
2492 than one got entry per symbol. */
2495 struct got_entry
*next
;
2497 /* The symbol addend that we'll be placing in the GOT. */
2500 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
2503 bfd_signed_vma refcount
;
2507 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
2508 TLS_TPREL or TLS_DTPREL for tls entries. */
2512 /* The same for PLT. */
2515 struct plt_entry
*next
;
2521 bfd_signed_vma refcount
;
2526 /* Of those relocs that might be copied as dynamic relocs, this macro
2527 selects those that must be copied when linking a shared library,
2528 even when the symbol is local. */
2530 #define MUST_BE_DYN_RELOC(RTYPE) \
2531 ((RTYPE) != R_PPC64_REL32 \
2532 && (RTYPE) != R_PPC64_REL64 \
2533 && (RTYPE) != R_PPC64_REL30)
2535 /* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
2536 copying dynamic variables from a shared lib into an app's dynbss
2537 section, and instead use a dynamic relocation to point into the
2539 #define ELIMINATE_COPY_RELOCS 1
2541 /* Section name for stubs is the associated section name plus this
2543 #define STUB_SUFFIX ".stub"
2546 ppc_stub_long_branch:
2547 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
2548 destination, but a 24 bit branch in a stub section will reach.
2551 ppc_stub_plt_branch:
2552 Similar to the above, but a 24 bit branch in the stub section won't
2553 reach its destination.
2554 . addis %r12,%r2,xxx@toc@ha
2555 . ld %r11,xxx@toc@l(%r12)
2560 Used to call a function in a shared library.
2561 . addis %r12,%r2,xxx@toc@ha
2563 . ld %r11,xxx+0@toc@l(%r12)
2564 . ld %r2,xxx+8@toc@l(%r12)
2566 . ld %r11,xxx+16@toc@l(%r12)
2569 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
2570 code to adjust the value and save r2 to support multiple toc sections.
2571 A ppc_stub_long_branch with an r2 offset looks like:
2573 . addis %r2,%r2,off@ha
2574 . addi %r2,%r2,off@l
2577 A ppc_stub_plt_branch with an r2 offset looks like:
2579 . addis %r12,%r2,xxx@toc@ha
2580 . ld %r11,xxx@toc@l(%r12)
2581 . addis %r2,%r2,off@ha
2582 . addi %r2,%r2,off@l
2587 enum ppc_stub_type
{
2589 ppc_stub_long_branch
,
2590 ppc_stub_long_branch_r2off
,
2591 ppc_stub_plt_branch
,
2592 ppc_stub_plt_branch_r2off
,
2596 struct ppc_stub_hash_entry
{
2598 /* Base hash table entry structure. */
2599 struct bfd_hash_entry root
;
2601 enum ppc_stub_type stub_type
;
2603 /* The stub section. */
2606 /* Offset within stub_sec of the beginning of this stub. */
2607 bfd_vma stub_offset
;
2609 /* Given the symbol's value and its section we can determine its final
2610 value when building the stubs (so the stub knows where to jump. */
2611 bfd_vma target_value
;
2612 asection
*target_section
;
2614 /* The symbol table entry, if any, that this was derived from. */
2615 struct ppc_link_hash_entry
*h
;
2617 /* And the reloc addend that this was derived from. */
2620 /* Where this stub is being called from, or, in the case of combined
2621 stub sections, the first input section in the group. */
2625 struct ppc_branch_hash_entry
{
2627 /* Base hash table entry structure. */
2628 struct bfd_hash_entry root
;
2630 /* Offset within .branch_lt. */
2631 unsigned int offset
;
2633 /* Generation marker. */
2637 struct ppc_link_hash_entry
2639 struct elf_link_hash_entry elf
;
2641 /* A pointer to the most recently used stub hash entry against this
2643 struct ppc_stub_hash_entry
*stub_cache
;
2645 /* Track dynamic relocs copied for this symbol. */
2646 struct ppc_dyn_relocs
*dyn_relocs
;
2648 /* Link between function code and descriptor symbols. */
2649 struct elf_link_hash_entry
*oh
;
2651 /* Flag function code and descriptor symbols. */
2652 unsigned int is_func
:1;
2653 unsigned int is_func_descriptor
:1;
2654 unsigned int is_entry
:1;
2656 /* Contexts in which symbol is used in the GOT (or TOC).
2657 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
2658 corresponding relocs are encountered during check_relocs.
2659 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
2660 indicate the corresponding GOT entry type is not needed.
2661 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
2662 a TPREL one. We use a separate flag rather than setting TPREL
2663 just for convenience in distinguishing the two cases. */
2664 #define TLS_GD 1 /* GD reloc. */
2665 #define TLS_LD 2 /* LD reloc. */
2666 #define TLS_TPREL 4 /* TPREL reloc, => IE. */
2667 #define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
2668 #define TLS_TLS 16 /* Any TLS reloc. */
2669 #define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
2670 #define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
2674 /* ppc64 ELF linker hash table. */
2676 struct ppc_link_hash_table
2678 struct elf_link_hash_table elf
;
2680 /* The stub hash table. */
2681 struct bfd_hash_table stub_hash_table
;
2683 /* Another hash table for plt_branch stubs. */
2684 struct bfd_hash_table branch_hash_table
;
2686 /* Linker stub bfd. */
2689 /* Linker call-backs. */
2690 asection
* (*add_stub_section
) (const char *, asection
*);
2691 void (*layout_sections_again
) (void);
2693 /* Array to keep track of which stub sections have been created, and
2694 information on stub grouping. */
2696 /* This is the section to which stubs in the group will be attached. */
2698 /* The stub section. */
2700 /* Along with elf_gp, specifies the TOC pointer used in this group. */
2704 /* Support for multiple toc sections. */
2705 unsigned int no_multi_toc
;
2706 unsigned int multi_toc_needed
;
2708 /* Temp used when calculating TOC pointers. */
2711 /* Highest input section id. */
2714 /* Highest output section index. */
2717 /* List of input sections for each output section. */
2718 asection
**input_list
;
2720 /* Short-cuts to get to dynamic linker sections. */
2732 /* Short-cut to first output tls section. */
2735 /* Shortcut to .__tls_get_addr. */
2736 struct elf_link_hash_entry
*tls_get_addr
;
2738 /* TLS local dynamic got entry handling. */
2740 bfd_signed_vma refcount
;
2745 unsigned long stub_count
[ppc_stub_plt_call
];
2747 /* Set if we should emit symbols for stubs. */
2748 unsigned int emit_stub_syms
;
2751 unsigned int stub_error
;
2753 /* Flag set when small branches are detected. Used to
2754 select suitable defaults for the stub group size. */
2755 unsigned int has_14bit_branch
;
2757 /* Set if we detect a reference undefined weak symbol. */
2758 unsigned int have_undefweak
;
2760 /* Incremented every time we size stubs. */
2761 unsigned int stub_iteration
;
2763 /* Small local sym to section mapping cache. */
2764 struct sym_sec_cache sym_sec
;
2767 /* Get the ppc64 ELF linker hash table from a link_info structure. */
2769 #define ppc_hash_table(p) \
2770 ((struct ppc_link_hash_table *) ((p)->hash))
2772 #define ppc_stub_hash_lookup(table, string, create, copy) \
2773 ((struct ppc_stub_hash_entry *) \
2774 bfd_hash_lookup ((table), (string), (create), (copy)))
2776 #define ppc_branch_hash_lookup(table, string, create, copy) \
2777 ((struct ppc_branch_hash_entry *) \
2778 bfd_hash_lookup ((table), (string), (create), (copy)))
2780 /* Create an entry in the stub hash table. */
2782 static struct bfd_hash_entry
*
2783 stub_hash_newfunc (struct bfd_hash_entry
*entry
,
2784 struct bfd_hash_table
*table
,
2787 /* Allocate the structure if it has not already been allocated by a
2791 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_stub_hash_entry
));
2796 /* Call the allocation method of the superclass. */
2797 entry
= bfd_hash_newfunc (entry
, table
, string
);
2800 struct ppc_stub_hash_entry
*eh
;
2802 /* Initialize the local fields. */
2803 eh
= (struct ppc_stub_hash_entry
*) entry
;
2804 eh
->stub_type
= ppc_stub_none
;
2805 eh
->stub_sec
= NULL
;
2806 eh
->stub_offset
= 0;
2807 eh
->target_value
= 0;
2808 eh
->target_section
= NULL
;
2816 /* Create an entry in the branch hash table. */
2818 static struct bfd_hash_entry
*
2819 branch_hash_newfunc (struct bfd_hash_entry
*entry
,
2820 struct bfd_hash_table
*table
,
2823 /* Allocate the structure if it has not already been allocated by a
2827 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_branch_hash_entry
));
2832 /* Call the allocation method of the superclass. */
2833 entry
= bfd_hash_newfunc (entry
, table
, string
);
2836 struct ppc_branch_hash_entry
*eh
;
2838 /* Initialize the local fields. */
2839 eh
= (struct ppc_branch_hash_entry
*) entry
;
2847 /* Create an entry in a ppc64 ELF linker hash table. */
2849 static struct bfd_hash_entry
*
2850 link_hash_newfunc (struct bfd_hash_entry
*entry
,
2851 struct bfd_hash_table
*table
,
2854 /* Allocate the structure if it has not already been allocated by a
2858 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_link_hash_entry
));
2863 /* Call the allocation method of the superclass. */
2864 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
2867 struct ppc_link_hash_entry
*eh
= (struct ppc_link_hash_entry
*) entry
;
2869 eh
->stub_cache
= NULL
;
2870 eh
->dyn_relocs
= NULL
;
2873 eh
->is_func_descriptor
= 0;
2881 /* Create a ppc64 ELF linker hash table. */
2883 static struct bfd_link_hash_table
*
2884 ppc64_elf_link_hash_table_create (bfd
*abfd
)
2886 struct ppc_link_hash_table
*htab
;
2887 bfd_size_type amt
= sizeof (struct ppc_link_hash_table
);
2889 htab
= bfd_zmalloc (amt
);
2893 if (! _bfd_elf_link_hash_table_init (&htab
->elf
, abfd
, link_hash_newfunc
))
2899 /* Init the stub hash table too. */
2900 if (!bfd_hash_table_init (&htab
->stub_hash_table
, stub_hash_newfunc
))
2903 /* And the branch hash table. */
2904 if (!bfd_hash_table_init (&htab
->branch_hash_table
, branch_hash_newfunc
))
2907 /* Initializing two fields of the union is just cosmetic. We really
2908 only care about glist, but when compiled on a 32-bit host the
2909 bfd_vma fields are larger. Setting the bfd_vma to zero makes
2910 debugger inspection of these fields look nicer. */
2911 htab
->elf
.init_refcount
.refcount
= 0;
2912 htab
->elf
.init_refcount
.glist
= NULL
;
2913 htab
->elf
.init_offset
.offset
= 0;
2914 htab
->elf
.init_offset
.glist
= NULL
;
2916 return &htab
->elf
.root
;
2919 /* Free the derived linker hash table. */
2922 ppc64_elf_link_hash_table_free (struct bfd_link_hash_table
*hash
)
2924 struct ppc_link_hash_table
*ret
= (struct ppc_link_hash_table
*) hash
;
2926 bfd_hash_table_free (&ret
->stub_hash_table
);
2927 bfd_hash_table_free (&ret
->branch_hash_table
);
2928 _bfd_generic_link_hash_table_free (hash
);
2931 /* Build a name for an entry in the stub hash table. */
2934 ppc_stub_name (const asection
*input_section
,
2935 const asection
*sym_sec
,
2936 const struct ppc_link_hash_entry
*h
,
2937 const Elf_Internal_Rela
*rel
)
2942 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
2943 offsets from a sym as a branch target? In fact, we could
2944 probably assume the addend is always zero. */
2945 BFD_ASSERT (((int) rel
->r_addend
& 0xffffffff) == rel
->r_addend
);
2949 len
= 8 + 1 + strlen (h
->elf
.root
.root
.string
) + 1 + 8 + 1;
2950 stub_name
= bfd_malloc (len
);
2951 if (stub_name
!= NULL
)
2953 sprintf (stub_name
, "%08x_%s+%x",
2954 input_section
->id
& 0xffffffff,
2955 h
->elf
.root
.root
.string
,
2956 (int) rel
->r_addend
& 0xffffffff);
2961 len
= 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
2962 stub_name
= bfd_malloc (len
);
2963 if (stub_name
!= NULL
)
2965 sprintf (stub_name
, "%08x_%x:%x+%x",
2966 input_section
->id
& 0xffffffff,
2967 sym_sec
->id
& 0xffffffff,
2968 (int) ELF64_R_SYM (rel
->r_info
) & 0xffffffff,
2969 (int) rel
->r_addend
& 0xffffffff);
2975 /* Look up an entry in the stub hash. Stub entries are cached because
2976 creating the stub name takes a bit of time. */
2978 static struct ppc_stub_hash_entry
*
2979 ppc_get_stub_entry (const asection
*input_section
,
2980 const asection
*sym_sec
,
2981 struct elf_link_hash_entry
*hash
,
2982 const Elf_Internal_Rela
*rel
,
2983 struct ppc_link_hash_table
*htab
)
2985 struct ppc_stub_hash_entry
*stub_entry
;
2986 struct ppc_link_hash_entry
*h
= (struct ppc_link_hash_entry
*) hash
;
2987 const asection
*id_sec
;
2989 /* If this input section is part of a group of sections sharing one
2990 stub section, then use the id of the first section in the group.
2991 Stub names need to include a section id, as there may well be
2992 more than one stub used to reach say, printf, and we need to
2993 distinguish between them. */
2994 id_sec
= htab
->stub_group
[input_section
->id
].link_sec
;
2996 if (h
!= NULL
&& h
->stub_cache
!= NULL
2997 && h
->stub_cache
->h
== h
2998 && h
->stub_cache
->id_sec
== id_sec
)
3000 stub_entry
= h
->stub_cache
;
3006 stub_name
= ppc_stub_name (id_sec
, sym_sec
, h
, rel
);
3007 if (stub_name
== NULL
)
3010 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
,
3011 stub_name
, FALSE
, FALSE
);
3013 h
->stub_cache
= stub_entry
;
3021 /* Add a new stub entry to the stub hash. Not all fields of the new
3022 stub entry are initialised. */
3024 static struct ppc_stub_hash_entry
*
3025 ppc_add_stub (const char *stub_name
,
3027 struct ppc_link_hash_table
*htab
)
3031 struct ppc_stub_hash_entry
*stub_entry
;
3033 link_sec
= htab
->stub_group
[section
->id
].link_sec
;
3034 stub_sec
= htab
->stub_group
[section
->id
].stub_sec
;
3035 if (stub_sec
== NULL
)
3037 stub_sec
= htab
->stub_group
[link_sec
->id
].stub_sec
;
3038 if (stub_sec
== NULL
)
3044 namelen
= strlen (link_sec
->name
);
3045 len
= namelen
+ sizeof (STUB_SUFFIX
);
3046 s_name
= bfd_alloc (htab
->stub_bfd
, len
);
3050 memcpy (s_name
, link_sec
->name
, namelen
);
3051 memcpy (s_name
+ namelen
, STUB_SUFFIX
, sizeof (STUB_SUFFIX
));
3052 stub_sec
= (*htab
->add_stub_section
) (s_name
, link_sec
);
3053 if (stub_sec
== NULL
)
3055 htab
->stub_group
[link_sec
->id
].stub_sec
= stub_sec
;
3057 htab
->stub_group
[section
->id
].stub_sec
= stub_sec
;
3060 /* Enter this entry into the linker stub hash table. */
3061 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
, stub_name
,
3063 if (stub_entry
== NULL
)
3065 (*_bfd_error_handler
) (_("%s: cannot create stub entry %s"),
3066 bfd_archive_filename (section
->owner
),
3071 stub_entry
->stub_sec
= stub_sec
;
3072 stub_entry
->stub_offset
= 0;
3073 stub_entry
->id_sec
= link_sec
;
3077 /* Create sections for linker generated code. */
3080 create_linkage_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
3082 struct ppc_link_hash_table
*htab
;
3085 htab
= ppc_hash_table (info
);
3087 /* Create .sfpr for code to save and restore fp regs. */
3088 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
3089 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
3090 htab
->sfpr
= bfd_make_section_anyway (dynobj
, ".sfpr");
3091 if (htab
->sfpr
== NULL
3092 || ! bfd_set_section_flags (dynobj
, htab
->sfpr
, flags
)
3093 || ! bfd_set_section_alignment (dynobj
, htab
->sfpr
, 2))
3096 /* Create .glink for lazy dynamic linking support. */
3097 htab
->glink
= bfd_make_section_anyway (dynobj
, ".glink");
3098 if (htab
->glink
== NULL
3099 || ! bfd_set_section_flags (dynobj
, htab
->glink
, flags
)
3100 || ! bfd_set_section_alignment (dynobj
, htab
->glink
, 2))
3103 /* Create .branch_lt for plt_branch stubs. */
3104 flags
= (SEC_ALLOC
| SEC_LOAD
3105 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
3106 htab
->brlt
= bfd_make_section_anyway (dynobj
, ".branch_lt");
3107 if (htab
->brlt
== NULL
3108 || ! bfd_set_section_flags (dynobj
, htab
->brlt
, flags
)
3109 || ! bfd_set_section_alignment (dynobj
, htab
->brlt
, 3))
3114 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_READONLY
3115 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
3116 htab
->relbrlt
= bfd_make_section_anyway (dynobj
, ".rela.branch_lt");
3118 || ! bfd_set_section_flags (dynobj
, htab
->relbrlt
, flags
)
3119 || ! bfd_set_section_alignment (dynobj
, htab
->relbrlt
, 3))
3125 /* Create .got and .rela.got sections in DYNOBJ, and set up
3126 shortcuts to them in our hash table. */
3129 create_got_section (bfd
*dynobj
, struct bfd_link_info
*info
)
3131 struct ppc_link_hash_table
*htab
;
3133 if (! _bfd_elf_create_got_section (dynobj
, info
))
3136 htab
= ppc_hash_table (info
);
3137 htab
->got
= bfd_get_section_by_name (dynobj
, ".got");
3141 htab
->relgot
= bfd_make_section (dynobj
, ".rela.got");
3143 || ! bfd_set_section_flags (dynobj
, htab
->relgot
,
3144 (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
3145 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
3147 || ! bfd_set_section_alignment (dynobj
, htab
->relgot
, 3))
3152 /* Create the dynamic sections, and set up shortcuts. */
3155 ppc64_elf_create_dynamic_sections (bfd
*dynobj
, struct bfd_link_info
*info
)
3157 struct ppc_link_hash_table
*htab
;
3159 htab
= ppc_hash_table (info
);
3160 if (!htab
->got
&& !create_got_section (dynobj
, info
))
3163 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
3166 htab
->plt
= bfd_get_section_by_name (dynobj
, ".plt");
3167 htab
->relplt
= bfd_get_section_by_name (dynobj
, ".rela.plt");
3168 htab
->dynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
3170 htab
->relbss
= bfd_get_section_by_name (dynobj
, ".rela.bss");
3172 if (!htab
->plt
|| !htab
->relplt
|| !htab
->dynbss
3173 || (!info
->shared
&& !htab
->relbss
))
3179 /* Copy the extra info we tack onto an elf_link_hash_entry. */
3182 ppc64_elf_copy_indirect_symbol (struct elf_backend_data
*bed ATTRIBUTE_UNUSED
,
3183 struct elf_link_hash_entry
*dir
,
3184 struct elf_link_hash_entry
*ind
)
3186 struct ppc_link_hash_entry
*edir
, *eind
;
3189 edir
= (struct ppc_link_hash_entry
*) dir
;
3190 eind
= (struct ppc_link_hash_entry
*) ind
;
3192 /* Copy over any dynamic relocs we may have on the indirect sym. */
3193 if (eind
->dyn_relocs
!= NULL
)
3195 if (edir
->dyn_relocs
!= NULL
)
3197 struct ppc_dyn_relocs
**pp
;
3198 struct ppc_dyn_relocs
*p
;
3200 if (eind
->elf
.root
.type
== bfd_link_hash_indirect
)
3203 /* Add reloc counts against the weak sym to the strong sym
3204 list. Merge any entries against the same section. */
3205 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
3207 struct ppc_dyn_relocs
*q
;
3209 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
3210 if (q
->sec
== p
->sec
)
3212 q
->pc_count
+= p
->pc_count
;
3213 q
->count
+= p
->count
;
3220 *pp
= edir
->dyn_relocs
;
3223 edir
->dyn_relocs
= eind
->dyn_relocs
;
3224 eind
->dyn_relocs
= NULL
;
3227 edir
->is_func
|= eind
->is_func
;
3228 edir
->is_func_descriptor
|= eind
->is_func_descriptor
;
3229 edir
->is_entry
|= eind
->is_entry
;
3230 edir
->tls_mask
|= eind
->tls_mask
;
3232 mask
= (ELF_LINK_HASH_REF_DYNAMIC
| ELF_LINK_HASH_REF_REGULAR
3233 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
| ELF_LINK_NON_GOT_REF
);
3234 /* If called to transfer flags for a weakdef during processing
3235 of elf_adjust_dynamic_symbol, don't copy ELF_LINK_NON_GOT_REF.
3236 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
3237 if (ELIMINATE_COPY_RELOCS
3238 && eind
->elf
.root
.type
!= bfd_link_hash_indirect
3239 && (edir
->elf
.elf_link_hash_flags
& ELF_LINK_HASH_DYNAMIC_ADJUSTED
) != 0)
3240 mask
&= ~ELF_LINK_NON_GOT_REF
;
3242 edir
->elf
.elf_link_hash_flags
|= eind
->elf
.elf_link_hash_flags
& mask
;
3244 /* If we were called to copy over info for a weak sym, that's all. */
3245 if (eind
->elf
.root
.type
!= bfd_link_hash_indirect
)
3248 /* Copy over got entries that we may have already seen to the
3249 symbol which just became indirect. */
3250 if (eind
->elf
.got
.glist
!= NULL
)
3252 if (edir
->elf
.got
.glist
!= NULL
)
3254 struct got_entry
**entp
;
3255 struct got_entry
*ent
;
3257 for (entp
= &eind
->elf
.got
.glist
; (ent
= *entp
) != NULL
; )
3259 struct got_entry
*dent
;
3261 for (dent
= edir
->elf
.got
.glist
; dent
!= NULL
; dent
= dent
->next
)
3262 if (dent
->addend
== ent
->addend
3263 && dent
->tls_type
== ent
->tls_type
)
3265 dent
->got
.refcount
+= ent
->got
.refcount
;
3272 *entp
= edir
->elf
.got
.glist
;
3275 edir
->elf
.got
.glist
= eind
->elf
.got
.glist
;
3276 eind
->elf
.got
.glist
= NULL
;
3279 /* And plt entries. */
3280 if (eind
->elf
.plt
.plist
!= NULL
)
3282 if (edir
->elf
.plt
.plist
!= NULL
)
3284 struct plt_entry
**entp
;
3285 struct plt_entry
*ent
;
3287 for (entp
= &eind
->elf
.plt
.plist
; (ent
= *entp
) != NULL
; )
3289 struct plt_entry
*dent
;
3291 for (dent
= edir
->elf
.plt
.plist
; dent
!= NULL
; dent
= dent
->next
)
3292 if (dent
->addend
== ent
->addend
)
3294 dent
->plt
.refcount
+= ent
->plt
.refcount
;
3301 *entp
= edir
->elf
.plt
.plist
;
3304 edir
->elf
.plt
.plist
= eind
->elf
.plt
.plist
;
3305 eind
->elf
.plt
.plist
= NULL
;
3308 if (edir
->elf
.dynindx
== -1)
3310 edir
->elf
.dynindx
= eind
->elf
.dynindx
;
3311 edir
->elf
.dynstr_index
= eind
->elf
.dynstr_index
;
3312 eind
->elf
.dynindx
= -1;
3313 eind
->elf
.dynstr_index
= 0;
3316 BFD_ASSERT (eind
->elf
.dynindx
== -1);
3319 /* Set a flag, used by ppc64_elf_gc_mark_hook, on the entry symbol and
3320 symbols undefined on the command-line. */
3323 ppc64_elf_mark_entry_syms (struct bfd_link_info
*info
)
3325 struct ppc_link_hash_table
*htab
;
3326 struct bfd_sym_chain
*sym
;
3328 htab
= ppc_hash_table (info
);
3329 for (sym
= info
->gc_sym_list
; sym
; sym
= sym
->next
)
3331 struct elf_link_hash_entry
*h
;
3333 h
= elf_link_hash_lookup (&htab
->elf
, sym
->name
, FALSE
, FALSE
, FALSE
);
3335 ((struct ppc_link_hash_entry
*) h
)->is_entry
= 1;
3341 update_local_sym_info (bfd
*abfd
, Elf_Internal_Shdr
*symtab_hdr
,
3342 unsigned long r_symndx
, bfd_vma r_addend
, int tls_type
)
3344 struct got_entry
**local_got_ents
= elf_local_got_ents (abfd
);
3345 char *local_got_tls_masks
;
3347 if (local_got_ents
== NULL
)
3349 bfd_size_type size
= symtab_hdr
->sh_info
;
3351 size
*= sizeof (*local_got_ents
) + sizeof (*local_got_tls_masks
);
3352 local_got_ents
= bfd_zalloc (abfd
, size
);
3353 if (local_got_ents
== NULL
)
3355 elf_local_got_ents (abfd
) = local_got_ents
;
3358 if ((tls_type
& TLS_EXPLICIT
) == 0)
3360 struct got_entry
*ent
;
3362 for (ent
= local_got_ents
[r_symndx
]; ent
!= NULL
; ent
= ent
->next
)
3363 if (ent
->addend
== r_addend
&& ent
->tls_type
== tls_type
)
3367 bfd_size_type amt
= sizeof (*ent
);
3368 ent
= bfd_alloc (abfd
, amt
);
3371 ent
->next
= local_got_ents
[r_symndx
];
3372 ent
->addend
= r_addend
;
3373 ent
->tls_type
= tls_type
;
3374 ent
->got
.refcount
= 0;
3375 local_got_ents
[r_symndx
] = ent
;
3377 ent
->got
.refcount
+= 1;
3380 local_got_tls_masks
= (char *) (local_got_ents
+ symtab_hdr
->sh_info
);
3381 local_got_tls_masks
[r_symndx
] |= tls_type
;
3386 update_plt_info (bfd
*abfd
, struct ppc_link_hash_entry
*eh
, bfd_vma addend
)
3388 struct plt_entry
*ent
;
3390 for (ent
= eh
->elf
.plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
3391 if (ent
->addend
== addend
)
3395 bfd_size_type amt
= sizeof (*ent
);
3396 ent
= bfd_alloc (abfd
, amt
);
3399 ent
->next
= eh
->elf
.plt
.plist
;
3400 ent
->addend
= addend
;
3401 ent
->plt
.refcount
= 0;
3402 eh
->elf
.plt
.plist
= ent
;
3404 ent
->plt
.refcount
+= 1;
3405 eh
->elf
.elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
3410 /* Look through the relocs for a section during the first phase, and
3411 calculate needed space in the global offset table, procedure
3412 linkage table, and dynamic reloc sections. */
3415 ppc64_elf_check_relocs (bfd
*abfd
, struct bfd_link_info
*info
,
3416 asection
*sec
, const Elf_Internal_Rela
*relocs
)
3418 struct ppc_link_hash_table
*htab
;
3419 Elf_Internal_Shdr
*symtab_hdr
;
3420 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
3421 const Elf_Internal_Rela
*rel
;
3422 const Elf_Internal_Rela
*rel_end
;
3424 asection
**opd_sym_map
;
3426 if (info
->relocatable
)
3429 htab
= ppc_hash_table (info
);
3430 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
3432 sym_hashes
= elf_sym_hashes (abfd
);
3433 sym_hashes_end
= (sym_hashes
3434 + symtab_hdr
->sh_size
/ sizeof (Elf64_External_Sym
)
3435 - symtab_hdr
->sh_info
);
3439 if (strcmp (bfd_get_section_name (abfd
, sec
), ".opd") == 0)
3441 /* Garbage collection needs some extra help with .opd sections.
3442 We don't want to necessarily keep everything referenced by
3443 relocs in .opd, as that would keep all functions. Instead,
3444 if we reference an .opd symbol (a function descriptor), we
3445 want to keep the function code symbol's section. This is
3446 easy for global symbols, but for local syms we need to keep
3447 information about the associated function section. Later, if
3448 edit_opd deletes entries, we'll use this array to adjust
3449 local syms in .opd. */
3451 asection
*func_section
;
3456 amt
= sec
->_raw_size
* sizeof (union opd_info
) / 24;
3457 opd_sym_map
= bfd_zalloc (abfd
, amt
);
3458 if (opd_sym_map
== NULL
)
3460 ppc64_elf_section_data (sec
)->opd
.func_sec
= opd_sym_map
;
3463 if (htab
->elf
.dynobj
== NULL
)
3464 htab
->elf
.dynobj
= abfd
;
3465 if (htab
->sfpr
== NULL
3466 && !create_linkage_sections (htab
->elf
.dynobj
, info
))
3469 rel_end
= relocs
+ sec
->reloc_count
;
3470 for (rel
= relocs
; rel
< rel_end
; rel
++)
3472 unsigned long r_symndx
;
3473 struct elf_link_hash_entry
*h
;
3474 enum elf_ppc64_reloc_type r_type
;
3477 r_symndx
= ELF64_R_SYM (rel
->r_info
);
3478 if (r_symndx
< symtab_hdr
->sh_info
)
3481 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3483 r_type
= ELF64_R_TYPE (rel
->r_info
);
3486 case R_PPC64_GOT_TLSLD16
:
3487 case R_PPC64_GOT_TLSLD16_LO
:
3488 case R_PPC64_GOT_TLSLD16_HI
:
3489 case R_PPC64_GOT_TLSLD16_HA
:
3490 htab
->tlsld_got
.refcount
+= 1;
3491 tls_type
= TLS_TLS
| TLS_LD
;
3494 case R_PPC64_GOT_TLSGD16
:
3495 case R_PPC64_GOT_TLSGD16_LO
:
3496 case R_PPC64_GOT_TLSGD16_HI
:
3497 case R_PPC64_GOT_TLSGD16_HA
:
3498 tls_type
= TLS_TLS
| TLS_GD
;
3501 case R_PPC64_GOT_TPREL16_DS
:
3502 case R_PPC64_GOT_TPREL16_LO_DS
:
3503 case R_PPC64_GOT_TPREL16_HI
:
3504 case R_PPC64_GOT_TPREL16_HA
:
3506 info
->flags
|= DF_STATIC_TLS
;
3507 tls_type
= TLS_TLS
| TLS_TPREL
;
3510 case R_PPC64_GOT_DTPREL16_DS
:
3511 case R_PPC64_GOT_DTPREL16_LO_DS
:
3512 case R_PPC64_GOT_DTPREL16_HI
:
3513 case R_PPC64_GOT_DTPREL16_HA
:
3514 tls_type
= TLS_TLS
| TLS_DTPREL
;
3516 sec
->has_tls_reloc
= 1;
3520 case R_PPC64_GOT16_DS
:
3521 case R_PPC64_GOT16_HA
:
3522 case R_PPC64_GOT16_HI
:
3523 case R_PPC64_GOT16_LO
:
3524 case R_PPC64_GOT16_LO_DS
:
3525 /* This symbol requires a global offset table entry. */
3526 sec
->has_gp_reloc
= 1;
3527 if (htab
->got
== NULL
3528 && !create_got_section (htab
->elf
.dynobj
, info
))
3533 struct ppc_link_hash_entry
*eh
;
3534 struct got_entry
*ent
;
3536 eh
= (struct ppc_link_hash_entry
*) h
;
3537 for (ent
= eh
->elf
.got
.glist
; ent
!= NULL
; ent
= ent
->next
)
3538 if (ent
->addend
== rel
->r_addend
3539 && ent
->tls_type
== tls_type
)
3543 bfd_size_type amt
= sizeof (*ent
);
3544 ent
= bfd_alloc (abfd
, amt
);
3547 ent
->next
= eh
->elf
.got
.glist
;
3548 ent
->addend
= rel
->r_addend
;
3549 ent
->tls_type
= tls_type
;
3550 ent
->got
.refcount
= 0;
3551 eh
->elf
.got
.glist
= ent
;
3553 ent
->got
.refcount
+= 1;
3554 eh
->tls_mask
|= tls_type
;
3557 /* This is a global offset table entry for a local symbol. */
3558 if (!update_local_sym_info (abfd
, symtab_hdr
, r_symndx
,
3559 rel
->r_addend
, tls_type
))
3563 case R_PPC64_PLT16_HA
:
3564 case R_PPC64_PLT16_HI
:
3565 case R_PPC64_PLT16_LO
:
3568 /* This symbol requires a procedure linkage table entry. We
3569 actually build the entry in adjust_dynamic_symbol,
3570 because this might be a case of linking PIC code without
3571 linking in any dynamic objects, in which case we don't
3572 need to generate a procedure linkage table after all. */
3575 /* It does not make sense to have a procedure linkage
3576 table entry for a local symbol. */
3577 bfd_set_error (bfd_error_bad_value
);
3581 if (!update_plt_info (abfd
, (struct ppc_link_hash_entry
*) h
,
3586 /* The following relocations don't need to propagate the
3587 relocation if linking a shared object since they are
3588 section relative. */
3589 case R_PPC64_SECTOFF
:
3590 case R_PPC64_SECTOFF_LO
:
3591 case R_PPC64_SECTOFF_HI
:
3592 case R_PPC64_SECTOFF_HA
:
3593 case R_PPC64_SECTOFF_DS
:
3594 case R_PPC64_SECTOFF_LO_DS
:
3595 case R_PPC64_DTPREL16
:
3596 case R_PPC64_DTPREL16_LO
:
3597 case R_PPC64_DTPREL16_HI
:
3598 case R_PPC64_DTPREL16_HA
:
3599 case R_PPC64_DTPREL16_DS
:
3600 case R_PPC64_DTPREL16_LO_DS
:
3601 case R_PPC64_DTPREL16_HIGHER
:
3602 case R_PPC64_DTPREL16_HIGHERA
:
3603 case R_PPC64_DTPREL16_HIGHEST
:
3604 case R_PPC64_DTPREL16_HIGHESTA
:
3609 case R_PPC64_TOC16_LO
:
3610 case R_PPC64_TOC16_HI
:
3611 case R_PPC64_TOC16_HA
:
3612 case R_PPC64_TOC16_DS
:
3613 case R_PPC64_TOC16_LO_DS
:
3614 sec
->has_gp_reloc
= 1;
3617 /* This relocation describes the C++ object vtable hierarchy.
3618 Reconstruct it for later use during GC. */
3619 case R_PPC64_GNU_VTINHERIT
:
3620 if (!_bfd_elf64_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
3624 /* This relocation describes which C++ vtable entries are actually
3625 used. Record for later use during GC. */
3626 case R_PPC64_GNU_VTENTRY
:
3627 if (!_bfd_elf64_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
3632 case R_PPC64_REL14_BRTAKEN
:
3633 case R_PPC64_REL14_BRNTAKEN
:
3634 htab
->has_14bit_branch
= 1;
3639 && h
->root
.root
.string
[0] == '.'
3640 && h
->root
.root
.string
[1] != 0)
3642 /* We may need a .plt entry if the function this reloc
3643 refers to is in a shared lib. */
3644 if (!update_plt_info (abfd
, (struct ppc_link_hash_entry
*) h
,
3647 if (h
== htab
->tls_get_addr
)
3648 sec
->has_tls_reloc
= 1;
3649 else if ((strncmp (h
->root
.root
.string
, ".__tls_get_addr", 15)
3651 && (h
->root
.root
.string
[15] == 0
3652 || h
->root
.root
.string
[15] == '@'))
3654 htab
->tls_get_addr
= h
;
3655 sec
->has_tls_reloc
= 1;
3660 case R_PPC64_TPREL64
:
3661 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_TPREL
;
3663 info
->flags
|= DF_STATIC_TLS
;
3666 case R_PPC64_DTPMOD64
:
3667 if (rel
+ 1 < rel_end
3668 && rel
[1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
)
3669 && rel
[1].r_offset
== rel
->r_offset
+ 8)
3670 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_GD
;
3672 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_LD
;
3675 case R_PPC64_DTPREL64
:
3676 tls_type
= TLS_EXPLICIT
| TLS_TLS
| TLS_DTPREL
;
3678 && rel
[-1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPMOD64
)
3679 && rel
[-1].r_offset
== rel
->r_offset
- 8)
3680 /* This is the second reloc of a dtpmod, dtprel pair.
3681 Don't mark with TLS_DTPREL. */
3685 sec
->has_tls_reloc
= 1;
3688 struct ppc_link_hash_entry
*eh
;
3689 eh
= (struct ppc_link_hash_entry
*) h
;
3690 eh
->tls_mask
|= tls_type
;
3693 if (!update_local_sym_info (abfd
, symtab_hdr
, r_symndx
,
3694 rel
->r_addend
, tls_type
))
3697 if (ppc64_elf_section_data (sec
)->t_symndx
== NULL
)
3699 /* One extra to simplify get_tls_mask. */
3700 bfd_size_type amt
= sec
->_raw_size
* sizeof (unsigned) / 8 + 1;
3701 ppc64_elf_section_data (sec
)->t_symndx
= bfd_zalloc (abfd
, amt
);
3702 if (ppc64_elf_section_data (sec
)->t_symndx
== NULL
)
3705 BFD_ASSERT (rel
->r_offset
% 8 == 0);
3706 ppc64_elf_section_data (sec
)->t_symndx
[rel
->r_offset
/ 8] = r_symndx
;
3708 /* Mark the second slot of a GD or LD entry.
3709 -1 to indicate GD and -2 to indicate LD. */
3710 if (tls_type
== (TLS_EXPLICIT
| TLS_TLS
| TLS_GD
))
3711 ppc64_elf_section_data (sec
)->t_symndx
[rel
->r_offset
/ 8 + 1] = -1;
3712 else if (tls_type
== (TLS_EXPLICIT
| TLS_TLS
| TLS_LD
))
3713 ppc64_elf_section_data (sec
)->t_symndx
[rel
->r_offset
/ 8 + 1] = -2;
3716 case R_PPC64_TPREL16
:
3717 case R_PPC64_TPREL16_LO
:
3718 case R_PPC64_TPREL16_HI
:
3719 case R_PPC64_TPREL16_HA
:
3720 case R_PPC64_TPREL16_DS
:
3721 case R_PPC64_TPREL16_LO_DS
:
3722 case R_PPC64_TPREL16_HIGHER
:
3723 case R_PPC64_TPREL16_HIGHERA
:
3724 case R_PPC64_TPREL16_HIGHEST
:
3725 case R_PPC64_TPREL16_HIGHESTA
:
3728 info
->flags
|= DF_STATIC_TLS
;
3733 case R_PPC64_ADDR64
:
3734 if (opd_sym_map
!= NULL
3736 && h
->root
.root
.string
[0] == '.'
3737 && h
->root
.root
.string
[1] != 0)
3739 struct elf_link_hash_entry
*fdh
;
3741 fdh
= elf_link_hash_lookup (&htab
->elf
, h
->root
.root
.string
+ 1,
3742 FALSE
, FALSE
, FALSE
);
3745 ((struct ppc_link_hash_entry
*) fdh
)->is_func_descriptor
= 1;
3746 ((struct ppc_link_hash_entry
*) fdh
)->oh
= h
;
3747 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
3748 ((struct ppc_link_hash_entry
*) h
)->oh
= fdh
;
3751 if (opd_sym_map
!= NULL
3753 && rel
+ 1 < rel_end
3754 && ELF64_R_TYPE ((rel
+ 1)->r_info
) == R_PPC64_TOC
)
3758 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
, sec
,
3763 opd_sym_map
[rel
->r_offset
/ 24] = s
;
3770 case R_PPC64_ADDR14
:
3771 case R_PPC64_ADDR14_BRNTAKEN
:
3772 case R_PPC64_ADDR14_BRTAKEN
:
3773 case R_PPC64_ADDR16
:
3774 case R_PPC64_ADDR16_DS
:
3775 case R_PPC64_ADDR16_HA
:
3776 case R_PPC64_ADDR16_HI
:
3777 case R_PPC64_ADDR16_HIGHER
:
3778 case R_PPC64_ADDR16_HIGHERA
:
3779 case R_PPC64_ADDR16_HIGHEST
:
3780 case R_PPC64_ADDR16_HIGHESTA
:
3781 case R_PPC64_ADDR16_LO
:
3782 case R_PPC64_ADDR16_LO_DS
:
3783 case R_PPC64_ADDR24
:
3784 case R_PPC64_ADDR32
:
3785 case R_PPC64_UADDR16
:
3786 case R_PPC64_UADDR32
:
3787 case R_PPC64_UADDR64
:
3789 if (h
!= NULL
&& !info
->shared
)
3790 /* We may need a copy reloc. */
3791 h
->elf_link_hash_flags
|= ELF_LINK_NON_GOT_REF
;
3793 /* Don't propagate .opd relocs. */
3794 if (NO_OPD_RELOCS
&& opd_sym_map
!= NULL
)
3797 /* Don't propagate relocs that the dynamic linker won't relocate. */
3798 if ((sec
->flags
& SEC_ALLOC
) == 0)
3801 /* If we are creating a shared library, and this is a reloc
3802 against a global symbol, or a non PC relative reloc
3803 against a local symbol, then we need to copy the reloc
3804 into the shared library. However, if we are linking with
3805 -Bsymbolic, we do not need to copy a reloc against a
3806 global symbol which is defined in an object we are
3807 including in the link (i.e., DEF_REGULAR is set). At
3808 this point we have not seen all the input files, so it is
3809 possible that DEF_REGULAR is not set now but will be set
3810 later (it is never cleared). In case of a weak definition,
3811 DEF_REGULAR may be cleared later by a strong definition in
3812 a shared library. We account for that possibility below by
3813 storing information in the dyn_relocs field of the hash
3814 table entry. A similar situation occurs when creating
3815 shared libraries and symbol visibility changes render the
3818 If on the other hand, we are creating an executable, we
3819 may need to keep relocations for symbols satisfied by a
3820 dynamic library if we manage to avoid copy relocs for the
3824 && (MUST_BE_DYN_RELOC (r_type
)
3826 && (! info
->symbolic
3827 || h
->root
.type
== bfd_link_hash_defweak
3828 || (h
->elf_link_hash_flags
3829 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
3830 || (ELIMINATE_COPY_RELOCS
3833 && (h
->root
.type
== bfd_link_hash_defweak
3834 || (h
->elf_link_hash_flags
3835 & ELF_LINK_HASH_DEF_REGULAR
) == 0)))
3837 struct ppc_dyn_relocs
*p
;
3838 struct ppc_dyn_relocs
**head
;
3840 /* We must copy these reloc types into the output file.
3841 Create a reloc section in dynobj and make room for
3848 name
= (bfd_elf_string_from_elf_section
3850 elf_elfheader (abfd
)->e_shstrndx
,
3851 elf_section_data (sec
)->rel_hdr
.sh_name
));
3855 if (strncmp (name
, ".rela", 5) != 0
3856 || strcmp (bfd_get_section_name (abfd
, sec
),
3859 (*_bfd_error_handler
)
3860 (_("%s: bad relocation section name `%s\'"),
3861 bfd_archive_filename (abfd
), name
);
3862 bfd_set_error (bfd_error_bad_value
);
3865 dynobj
= htab
->elf
.dynobj
;
3866 sreloc
= bfd_get_section_by_name (dynobj
, name
);
3871 sreloc
= bfd_make_section (dynobj
, name
);
3872 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
3873 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
3874 if ((sec
->flags
& SEC_ALLOC
) != 0)
3875 flags
|= SEC_ALLOC
| SEC_LOAD
;
3877 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
3878 || ! bfd_set_section_alignment (dynobj
, sreloc
, 3))
3881 elf_section_data (sec
)->sreloc
= sreloc
;
3884 /* If this is a global symbol, we count the number of
3885 relocations we need for this symbol. */
3888 head
= &((struct ppc_link_hash_entry
*) h
)->dyn_relocs
;
3892 /* Track dynamic relocs needed for local syms too.
3893 We really need local syms available to do this
3897 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
3902 head
= ((struct ppc_dyn_relocs
**)
3903 &elf_section_data (s
)->local_dynrel
);
3907 if (p
== NULL
|| p
->sec
!= sec
)
3909 p
= bfd_alloc (htab
->elf
.dynobj
, sizeof *p
);
3920 if (!MUST_BE_DYN_RELOC (r_type
))
3933 /* Return the section that should be marked against GC for a given
3937 ppc64_elf_gc_mark_hook (asection
*sec
,
3938 struct bfd_link_info
*info ATTRIBUTE_UNUSED
,
3939 Elf_Internal_Rela
*rel
,
3940 struct elf_link_hash_entry
*h
,
3941 Elf_Internal_Sym
*sym
)
3943 asection
*rsec
= NULL
;
3947 enum elf_ppc64_reloc_type r_type
;
3948 struct ppc_link_hash_entry
*fdh
;
3950 r_type
= ELF64_R_TYPE (rel
->r_info
);
3953 case R_PPC64_GNU_VTINHERIT
:
3954 case R_PPC64_GNU_VTENTRY
:
3958 switch (h
->root
.type
)
3960 case bfd_link_hash_defined
:
3961 case bfd_link_hash_defweak
:
3962 fdh
= (struct ppc_link_hash_entry
*) h
;
3964 /* Function descriptor syms cause the associated
3965 function code sym section to be marked. */
3966 if (fdh
->is_func_descriptor
)
3967 rsec
= fdh
->oh
->root
.u
.def
.section
;
3969 /* Function entry syms return NULL if they are in .opd
3970 and are not ._start (or others undefined on the ld
3971 command line). Thus we avoid marking all function
3972 sections, as all functions are referenced in .opd. */
3973 else if ((fdh
->oh
!= NULL
3974 && ((struct ppc_link_hash_entry
*) fdh
->oh
)->is_entry
)
3975 || ppc64_elf_section_data (sec
)->opd
.func_sec
== NULL
)
3976 rsec
= h
->root
.u
.def
.section
;
3979 case bfd_link_hash_common
:
3980 rsec
= h
->root
.u
.c
.p
->section
;
3990 asection
**opd_sym_section
;
3992 rsec
= bfd_section_from_elf_index (sec
->owner
, sym
->st_shndx
);
3993 opd_sym_section
= ppc64_elf_section_data (rsec
)->opd
.func_sec
;
3994 if (opd_sym_section
!= NULL
)
3995 rsec
= opd_sym_section
[sym
->st_value
/ 24];
3996 else if (ppc64_elf_section_data (sec
)->opd
.func_sec
!= NULL
)
4003 /* Update the .got, .plt. and dynamic reloc reference counts for the
4004 section being removed. */
4007 ppc64_elf_gc_sweep_hook (bfd
*abfd
, struct bfd_link_info
*info
,
4008 asection
*sec
, const Elf_Internal_Rela
*relocs
)
4010 struct ppc_link_hash_table
*htab
;
4011 Elf_Internal_Shdr
*symtab_hdr
;
4012 struct elf_link_hash_entry
**sym_hashes
;
4013 struct got_entry
**local_got_ents
;
4014 const Elf_Internal_Rela
*rel
, *relend
;
4016 elf_section_data (sec
)->local_dynrel
= NULL
;
4018 htab
= ppc_hash_table (info
);
4019 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
4020 sym_hashes
= elf_sym_hashes (abfd
);
4021 local_got_ents
= elf_local_got_ents (abfd
);
4023 relend
= relocs
+ sec
->reloc_count
;
4024 for (rel
= relocs
; rel
< relend
; rel
++)
4026 unsigned long r_symndx
;
4027 enum elf_ppc64_reloc_type r_type
;
4028 struct elf_link_hash_entry
*h
= NULL
;
4031 r_symndx
= ELF64_R_SYM (rel
->r_info
);
4032 r_type
= ELF64_R_TYPE (rel
->r_info
);
4033 if (r_symndx
>= symtab_hdr
->sh_info
)
4035 struct ppc_link_hash_entry
*eh
;
4036 struct ppc_dyn_relocs
**pp
;
4037 struct ppc_dyn_relocs
*p
;
4039 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4040 eh
= (struct ppc_link_hash_entry
*) h
;
4042 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
4045 /* Everything must go for SEC. */
4053 case R_PPC64_GOT_TLSLD16
:
4054 case R_PPC64_GOT_TLSLD16_LO
:
4055 case R_PPC64_GOT_TLSLD16_HI
:
4056 case R_PPC64_GOT_TLSLD16_HA
:
4057 htab
->tlsld_got
.refcount
-= 1;
4058 tls_type
= TLS_TLS
| TLS_LD
;
4061 case R_PPC64_GOT_TLSGD16
:
4062 case R_PPC64_GOT_TLSGD16_LO
:
4063 case R_PPC64_GOT_TLSGD16_HI
:
4064 case R_PPC64_GOT_TLSGD16_HA
:
4065 tls_type
= TLS_TLS
| TLS_GD
;
4068 case R_PPC64_GOT_TPREL16_DS
:
4069 case R_PPC64_GOT_TPREL16_LO_DS
:
4070 case R_PPC64_GOT_TPREL16_HI
:
4071 case R_PPC64_GOT_TPREL16_HA
:
4072 tls_type
= TLS_TLS
| TLS_TPREL
;
4075 case R_PPC64_GOT_DTPREL16_DS
:
4076 case R_PPC64_GOT_DTPREL16_LO_DS
:
4077 case R_PPC64_GOT_DTPREL16_HI
:
4078 case R_PPC64_GOT_DTPREL16_HA
:
4079 tls_type
= TLS_TLS
| TLS_DTPREL
;
4083 case R_PPC64_GOT16_DS
:
4084 case R_PPC64_GOT16_HA
:
4085 case R_PPC64_GOT16_HI
:
4086 case R_PPC64_GOT16_LO
:
4087 case R_PPC64_GOT16_LO_DS
:
4090 struct got_entry
*ent
;
4095 ent
= local_got_ents
[r_symndx
];
4097 for (; ent
!= NULL
; ent
= ent
->next
)
4098 if (ent
->addend
== rel
->r_addend
4099 && ent
->tls_type
== tls_type
)
4103 if (ent
->got
.refcount
> 0)
4104 ent
->got
.refcount
-= 1;
4108 case R_PPC64_PLT16_HA
:
4109 case R_PPC64_PLT16_HI
:
4110 case R_PPC64_PLT16_LO
:
4114 case R_PPC64_REL14_BRNTAKEN
:
4115 case R_PPC64_REL14_BRTAKEN
:
4119 struct plt_entry
*ent
;
4121 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
4122 if (ent
->addend
== rel
->r_addend
)
4126 if (ent
->plt
.refcount
> 0)
4127 ent
->plt
.refcount
-= 1;
4138 /* Called via elf_link_hash_traverse to transfer dynamic linking
4139 information on function code symbol entries to their corresponding
4140 function descriptor symbol entries. */
4142 func_desc_adjust (struct elf_link_hash_entry
*h
, void *inf
)
4144 struct bfd_link_info
*info
;
4145 struct ppc_link_hash_table
*htab
;
4146 struct plt_entry
*ent
;
4148 if (h
->root
.type
== bfd_link_hash_indirect
)
4151 if (h
->root
.type
== bfd_link_hash_warning
)
4152 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4155 htab
= ppc_hash_table (info
);
4157 /* If this is a function code symbol, transfer dynamic linking
4158 information to the function descriptor symbol. */
4159 if (!((struct ppc_link_hash_entry
*) h
)->is_func
)
4162 if (h
->root
.type
== bfd_link_hash_undefweak
4163 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_REGULAR
))
4164 htab
->have_undefweak
= TRUE
;
4166 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
4167 if (ent
->plt
.refcount
> 0)
4170 && h
->root
.root
.string
[0] == '.'
4171 && h
->root
.root
.string
[1] != '\0')
4173 struct elf_link_hash_entry
*fdh
= ((struct ppc_link_hash_entry
*) h
)->oh
;
4174 bfd_boolean force_local
;
4176 /* Find the corresponding function descriptor symbol. Create it
4177 as undefined if necessary. */
4180 fdh
= elf_link_hash_lookup (&htab
->elf
, h
->root
.root
.string
+ 1,
4181 FALSE
, FALSE
, TRUE
);
4185 && (h
->root
.type
== bfd_link_hash_undefined
4186 || h
->root
.type
== bfd_link_hash_undefweak
))
4190 struct bfd_link_hash_entry
*bh
;
4192 abfd
= h
->root
.u
.undef
.abfd
;
4193 newsym
= bfd_make_empty_symbol (abfd
);
4194 newsym
->name
= h
->root
.root
.string
+ 1;
4195 newsym
->section
= bfd_und_section_ptr
;
4197 newsym
->flags
= BSF_OBJECT
;
4198 if (h
->root
.type
== bfd_link_hash_undefweak
)
4199 newsym
->flags
|= BSF_WEAK
;
4202 if ( !(_bfd_generic_link_add_one_symbol
4203 (info
, abfd
, newsym
->name
, newsym
->flags
,
4204 newsym
->section
, newsym
->value
, NULL
, FALSE
, FALSE
, &bh
)))
4208 fdh
= (struct elf_link_hash_entry
*) bh
;
4209 fdh
->elf_link_hash_flags
&= ~ELF_LINK_NON_ELF
;
4213 && (fdh
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0
4215 || (fdh
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
4216 || (fdh
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) != 0))
4218 if (fdh
->dynindx
== -1)
4219 if (! bfd_elf64_link_record_dynamic_symbol (info
, fdh
))
4221 fdh
->elf_link_hash_flags
|= (h
->elf_link_hash_flags
4222 & (ELF_LINK_HASH_REF_REGULAR
4223 | ELF_LINK_HASH_REF_DYNAMIC
4224 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
4225 | ELF_LINK_NON_GOT_REF
));
4226 if (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
4228 fdh
->plt
.plist
= h
->plt
.plist
;
4229 fdh
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
4231 ((struct ppc_link_hash_entry
*) fdh
)->is_func_descriptor
= 1;
4232 ((struct ppc_link_hash_entry
*) fdh
)->oh
= h
;
4233 ((struct ppc_link_hash_entry
*) h
)->oh
= fdh
;
4236 /* Now that the info is on the function descriptor, clear the
4237 function code sym info. Any function code syms for which we
4238 don't have a definition in a regular file, we force local.
4239 This prevents a shared library from exporting syms that have
4240 been imported from another library. Function code syms that
4241 are really in the library we must leave global to prevent the
4242 linker dragging in a definition from a static library. */
4243 force_local
= (info
->shared
4244 && ((h
->elf_link_hash_flags
4245 & ELF_LINK_HASH_DEF_REGULAR
) == 0
4247 || (fdh
->elf_link_hash_flags
4248 & ELF_LINK_HASH_DEF_REGULAR
) == 0
4249 || (fdh
->elf_link_hash_flags
4250 & ELF_LINK_FORCED_LOCAL
) != 0));
4251 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
4257 #define MIN_SAVE_FPR 14
4258 #define MAX_SAVE_FPR 31
4260 /* Called near the start of bfd_elf_size_dynamic_sections. We use
4261 this hook to a) provide some gcc support functions, and b) transfer
4262 dynamic linking information gathered so far on function code symbol
4263 entries, to their corresponding function descriptor symbol entries. */
4265 ppc64_elf_func_desc_adjust (bfd
*obfd ATTRIBUTE_UNUSED
,
4266 struct bfd_link_info
*info
)
4268 struct ppc_link_hash_table
*htab
;
4269 unsigned int lowest_savef
= MAX_SAVE_FPR
+ 2;
4270 unsigned int lowest_restf
= MAX_SAVE_FPR
+ 2;
4272 struct elf_link_hash_entry
*h
;
4276 htab
= ppc_hash_table (info
);
4278 if (htab
->sfpr
== NULL
)
4279 /* We don't have any relocs. */
4282 /* First provide any missing ._savef* and ._restf* functions. */
4283 memcpy (sym
, "._savef14", 10);
4284 for (i
= MIN_SAVE_FPR
; i
<= MAX_SAVE_FPR
; i
++)
4286 sym
[7] = i
/ 10 + '0';
4287 sym
[8] = i
% 10 + '0';
4288 h
= elf_link_hash_lookup (&htab
->elf
, sym
, FALSE
, FALSE
, TRUE
);
4290 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4292 if (lowest_savef
> i
)
4294 h
->root
.type
= bfd_link_hash_defined
;
4295 h
->root
.u
.def
.section
= htab
->sfpr
;
4296 h
->root
.u
.def
.value
= (i
- lowest_savef
) * 4;
4298 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
4299 _bfd_elf_link_hash_hide_symbol (info
, h
, TRUE
);
4303 memcpy (sym
, "._restf14", 10);
4304 for (i
= MIN_SAVE_FPR
; i
<= MAX_SAVE_FPR
; i
++)
4306 sym
[7] = i
/ 10 + '0';
4307 sym
[8] = i
% 10 + '0';
4308 h
= elf_link_hash_lookup (&htab
->elf
, sym
, FALSE
, FALSE
, TRUE
);
4310 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
4312 if (lowest_restf
> i
)
4314 h
->root
.type
= bfd_link_hash_defined
;
4315 h
->root
.u
.def
.section
= htab
->sfpr
;
4316 h
->root
.u
.def
.value
= ((MAX_SAVE_FPR
+ 2 - lowest_savef
) * 4
4317 + (i
- lowest_restf
) * 4);
4319 h
->elf_link_hash_flags
|= ELF_LINK_HASH_DEF_REGULAR
;
4320 _bfd_elf_link_hash_hide_symbol (info
, h
, TRUE
);
4324 elf_link_hash_traverse (&htab
->elf
, func_desc_adjust
, info
);
4326 htab
->sfpr
->_raw_size
= ((MAX_SAVE_FPR
+ 2 - lowest_savef
) * 4
4327 + (MAX_SAVE_FPR
+ 2 - lowest_restf
) * 4);
4329 if (htab
->sfpr
->_raw_size
== 0)
4331 if (!htab
->have_undefweak
)
4333 _bfd_strip_section_from_output (info
, htab
->sfpr
);
4337 htab
->sfpr
->_raw_size
= 4;
4340 p
= bfd_alloc (htab
->elf
.dynobj
, htab
->sfpr
->_raw_size
);
4343 htab
->sfpr
->contents
= p
;
4345 for (i
= lowest_savef
; i
<= MAX_SAVE_FPR
; i
++)
4347 unsigned int fpr
= i
<< 21;
4348 unsigned int stackoff
= (1 << 16) - (MAX_SAVE_FPR
+ 1 - i
) * 8;
4349 bfd_put_32 (htab
->elf
.dynobj
, STFD_FR0_0R1
+ fpr
+ stackoff
, p
);
4352 if (lowest_savef
<= MAX_SAVE_FPR
)
4354 bfd_put_32 (htab
->elf
.dynobj
, BLR
, p
);
4358 for (i
= lowest_restf
; i
<= MAX_SAVE_FPR
; i
++)
4360 unsigned int fpr
= i
<< 21;
4361 unsigned int stackoff
= (1 << 16) - (MAX_SAVE_FPR
+ 1 - i
) * 8;
4362 bfd_put_32 (htab
->elf
.dynobj
, LFD_FR0_0R1
+ fpr
+ stackoff
, p
);
4365 if (lowest_restf
<= MAX_SAVE_FPR
4366 || htab
->sfpr
->_raw_size
== 4)
4368 bfd_put_32 (htab
->elf
.dynobj
, BLR
, p
);
4374 /* Adjust a symbol defined by a dynamic object and referenced by a
4375 regular object. The current definition is in some section of the
4376 dynamic object, but we're not including those sections. We have to
4377 change the definition to something the rest of the link can
4381 ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info
*info
,
4382 struct elf_link_hash_entry
*h
)
4384 struct ppc_link_hash_table
*htab
;
4386 unsigned int power_of_two
;
4388 htab
= ppc_hash_table (info
);
4390 /* Deal with function syms. */
4391 if (h
->type
== STT_FUNC
4392 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
4394 /* Clear procedure linkage table information for any symbol that
4395 won't need a .plt entry. */
4396 struct plt_entry
*ent
;
4397 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
4398 if (ent
->plt
.refcount
> 0)
4400 if (!((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
4402 || SYMBOL_CALLS_LOCAL (info
, h
)
4403 || (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
4404 && h
->root
.type
== bfd_link_hash_undefweak
))
4406 h
->plt
.plist
= NULL
;
4407 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
4411 h
->plt
.plist
= NULL
;
4413 /* If this is a weak symbol, and there is a real definition, the
4414 processor independent code will have arranged for us to see the
4415 real definition first, and we can just use the same value. */
4416 if (h
->weakdef
!= NULL
)
4418 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
4419 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
4420 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
4421 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
4422 if (ELIMINATE_COPY_RELOCS
)
4423 h
->elf_link_hash_flags
4424 = ((h
->elf_link_hash_flags
& ~ELF_LINK_NON_GOT_REF
)
4425 | (h
->weakdef
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
));
4429 /* This is a reference to a symbol defined by a dynamic object which
4430 is not a function. */
4432 /* If we are creating a shared library, we must presume that the
4433 only references to the symbol are via the global offset table.
4434 For such cases we need not do anything here; the relocations will
4435 be handled correctly by relocate_section. */
4439 /* If there are no references to this symbol that do not use the
4440 GOT, we don't need to generate a copy reloc. */
4441 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0)
4444 if (ELIMINATE_COPY_RELOCS
)
4446 struct ppc_link_hash_entry
* eh
;
4447 struct ppc_dyn_relocs
*p
;
4449 eh
= (struct ppc_link_hash_entry
*) h
;
4450 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
4452 s
= p
->sec
->output_section
;
4453 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
4457 /* If we didn't find any dynamic relocs in read-only sections, then
4458 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
4461 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
4466 /* We must allocate the symbol in our .dynbss section, which will
4467 become part of the .bss section of the executable. There will be
4468 an entry for this symbol in the .dynsym section. The dynamic
4469 object will contain position independent code, so all references
4470 from the dynamic object to this symbol will go through the global
4471 offset table. The dynamic linker will use the .dynsym entry to
4472 determine the address it must put in the global offset table, so
4473 both the dynamic object and the regular object will refer to the
4474 same memory location for the variable. */
4476 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
4477 to copy the initial value out of the dynamic object and into the
4478 runtime process image. We need to remember the offset into the
4479 .rela.bss section we are going to use. */
4480 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
4482 htab
->relbss
->_raw_size
+= sizeof (Elf64_External_Rela
);
4483 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
4486 /* We need to figure out the alignment required for this symbol. I
4487 have no idea how ELF linkers handle this. */
4488 power_of_two
= bfd_log2 (h
->size
);
4489 if (power_of_two
> 4)
4492 /* Apply the required alignment. */
4494 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
, (bfd_size_type
) (1 << power_of_two
));
4495 if (power_of_two
> bfd_get_section_alignment (htab
->elf
.dynobj
, s
))
4497 if (! bfd_set_section_alignment (htab
->elf
.dynobj
, s
, power_of_two
))
4501 /* Define the symbol as being at this point in the section. */
4502 h
->root
.u
.def
.section
= s
;
4503 h
->root
.u
.def
.value
= s
->_raw_size
;
4505 /* Increment the section size to make room for the symbol. */
4506 s
->_raw_size
+= h
->size
;
4511 /* If given a function descriptor symbol, hide both the function code
4512 sym and the descriptor. */
4514 ppc64_elf_hide_symbol (struct bfd_link_info
*info
,
4515 struct elf_link_hash_entry
*h
,
4516 bfd_boolean force_local
)
4518 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
4520 if (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
)
4522 struct elf_link_hash_entry
*fh
= ((struct ppc_link_hash_entry
*) h
)->oh
;
4527 struct ppc_link_hash_table
*htab
;
4530 /* We aren't supposed to use alloca in BFD because on
4531 systems which do not have alloca the version in libiberty
4532 calls xmalloc, which might cause the program to crash
4533 when it runs out of memory. This function doesn't have a
4534 return status, so there's no way to gracefully return an
4535 error. So cheat. We know that string[-1] can be safely
4536 dereferenced; It's either a string in an ELF string
4537 table, or allocated in an objalloc structure. */
4539 p
= h
->root
.root
.string
- 1;
4542 htab
= ppc_hash_table (info
);
4543 fh
= elf_link_hash_lookup (&htab
->elf
, p
, FALSE
, FALSE
, FALSE
);
4546 /* Unfortunately, if it so happens that the string we were
4547 looking for was allocated immediately before this string,
4548 then we overwrote the string terminator. That's the only
4549 reason the lookup should fail. */
4552 q
= h
->root
.root
.string
+ strlen (h
->root
.root
.string
);
4553 while (q
>= h
->root
.root
.string
&& *q
== *p
)
4555 if (q
< h
->root
.root
.string
&& *p
== '.')
4556 fh
= elf_link_hash_lookup (&htab
->elf
, p
, FALSE
, FALSE
, FALSE
);
4560 ((struct ppc_link_hash_entry
*) h
)->oh
= fh
;
4561 ((struct ppc_link_hash_entry
*) fh
)->oh
= h
;
4565 _bfd_elf_link_hash_hide_symbol (info
, fh
, force_local
);
4570 get_sym_h (struct elf_link_hash_entry
**hp
, Elf_Internal_Sym
**symp
,
4571 asection
**symsecp
, char **tls_maskp
, Elf_Internal_Sym
**locsymsp
,
4572 unsigned long r_symndx
, bfd
*ibfd
)
4574 Elf_Internal_Shdr
*symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4576 if (r_symndx
>= symtab_hdr
->sh_info
)
4578 struct elf_link_hash_entry
**sym_hashes
= elf_sym_hashes (ibfd
);
4579 struct elf_link_hash_entry
*h
;
4581 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
4582 while (h
->root
.type
== bfd_link_hash_indirect
4583 || h
->root
.type
== bfd_link_hash_warning
)
4584 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
4592 if (symsecp
!= NULL
)
4594 asection
*symsec
= NULL
;
4595 if (h
->root
.type
== bfd_link_hash_defined
4596 || h
->root
.type
== bfd_link_hash_defweak
)
4597 symsec
= h
->root
.u
.def
.section
;
4601 if (tls_maskp
!= NULL
)
4603 struct ppc_link_hash_entry
*eh
;
4605 eh
= (struct ppc_link_hash_entry
*) h
;
4606 *tls_maskp
= &eh
->tls_mask
;
4611 Elf_Internal_Sym
*sym
;
4612 Elf_Internal_Sym
*locsyms
= *locsymsp
;
4614 if (locsyms
== NULL
)
4616 locsyms
= (Elf_Internal_Sym
*) symtab_hdr
->contents
;
4617 if (locsyms
== NULL
)
4618 locsyms
= bfd_elf_get_elf_syms (ibfd
, symtab_hdr
,
4619 symtab_hdr
->sh_info
,
4620 0, NULL
, NULL
, NULL
);
4621 if (locsyms
== NULL
)
4623 *locsymsp
= locsyms
;
4625 sym
= locsyms
+ r_symndx
;
4633 if (symsecp
!= NULL
)
4635 asection
*symsec
= NULL
;
4636 if ((sym
->st_shndx
!= SHN_UNDEF
4637 && sym
->st_shndx
< SHN_LORESERVE
)
4638 || sym
->st_shndx
> SHN_HIRESERVE
)
4639 symsec
= bfd_section_from_elf_index (ibfd
, sym
->st_shndx
);
4643 if (tls_maskp
!= NULL
)
4645 struct got_entry
**lgot_ents
;
4649 lgot_ents
= elf_local_got_ents (ibfd
);
4650 if (lgot_ents
!= NULL
)
4652 char *lgot_masks
= (char *) (lgot_ents
+ symtab_hdr
->sh_info
);
4653 tls_mask
= &lgot_masks
[r_symndx
];
4655 *tls_maskp
= tls_mask
;
4661 /* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
4662 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
4663 type suitable for optimization, and 1 otherwise. */
4666 get_tls_mask (char **tls_maskp
, Elf_Internal_Sym
**locsymsp
,
4667 const Elf_Internal_Rela
*rel
, bfd
*ibfd
)
4669 unsigned long r_symndx
;
4670 unsigned int next_r
;
4671 struct elf_link_hash_entry
*h
;
4672 Elf_Internal_Sym
*sym
;
4676 r_symndx
= ELF64_R_SYM (rel
->r_info
);
4677 if (!get_sym_h (&h
, &sym
, &sec
, tls_maskp
, locsymsp
, r_symndx
, ibfd
))
4680 if ((*tls_maskp
!= NULL
&& **tls_maskp
!= 0)
4682 || ppc64_elf_section_data (sec
)->t_symndx
== NULL
)
4685 /* Look inside a TOC section too. */
4688 BFD_ASSERT (h
->root
.type
== bfd_link_hash_defined
);
4689 off
= h
->root
.u
.def
.value
;
4692 off
= sym
->st_value
;
4693 off
+= rel
->r_addend
;
4694 BFD_ASSERT (off
% 8 == 0);
4695 r_symndx
= ppc64_elf_section_data (sec
)->t_symndx
[off
/ 8];
4696 next_r
= ppc64_elf_section_data (sec
)->t_symndx
[off
/ 8 + 1];
4697 if (!get_sym_h (&h
, &sym
, &sec
, tls_maskp
, locsymsp
, r_symndx
, ibfd
))
4700 || h
->root
.type
== bfd_link_hash_defined
4701 || h
->root
.type
== bfd_link_hash_defweak
)
4703 if (next_r
== (unsigned) -1)
4705 if (next_r
== (unsigned) -2
4707 || !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
)))
4714 ppc64_elf_edit_opd (bfd
*obfd
, struct bfd_link_info
*info
)
4718 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
4721 Elf_Internal_Rela
*relstart
, *rel
, *relend
;
4722 Elf_Internal_Shdr
*symtab_hdr
;
4723 Elf_Internal_Sym
*local_syms
;
4724 struct elf_link_hash_entry
**sym_hashes
;
4728 bfd_boolean need_edit
;
4730 sec
= bfd_get_section_by_name (ibfd
, ".opd");
4734 amt
= sec
->_raw_size
* sizeof (long) / 24;
4735 adjust
= ppc64_elf_section_data (sec
)->opd
.adjust
;
4738 /* Must be a ld -r link. ie. check_relocs hasn't been
4740 adjust
= bfd_zalloc (obfd
, amt
);
4741 ppc64_elf_section_data (sec
)->opd
.adjust
= adjust
;
4743 memset (adjust
, 0, amt
);
4745 if (sec
->output_section
== bfd_abs_section_ptr
)
4748 /* Look through the section relocs. */
4749 if ((sec
->flags
& SEC_RELOC
) == 0 || sec
->reloc_count
== 0)
4753 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
4754 sym_hashes
= elf_sym_hashes (ibfd
);
4756 /* Read the relocations. */
4757 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
4759 if (relstart
== NULL
)
4762 /* First run through the relocs to check they are sane, and to
4763 determine whether we need to edit this opd section. */
4766 relend
= relstart
+ sec
->reloc_count
;
4767 for (rel
= relstart
; rel
< relend
; rel
++)
4769 enum elf_ppc64_reloc_type r_type
;
4770 unsigned long r_symndx
;
4772 struct elf_link_hash_entry
*h
;
4773 Elf_Internal_Sym
*sym
;
4775 /* .opd contains a regular array of 24 byte entries. We're
4776 only interested in the reloc pointing to a function entry
4778 r_type
= ELF64_R_TYPE (rel
->r_info
);
4779 if (r_type
== R_PPC64_TOC
)
4782 if (r_type
!= R_PPC64_ADDR64
)
4784 (*_bfd_error_handler
)
4785 (_("%s: unexpected reloc type %u in .opd section"),
4786 bfd_archive_filename (ibfd
), r_type
);
4791 if (rel
+ 1 >= relend
)
4793 r_type
= ELF64_R_TYPE ((rel
+ 1)->r_info
);
4794 if (r_type
!= R_PPC64_TOC
)
4797 if (rel
->r_offset
!= offset
)
4799 /* If someone messes with .opd alignment then after a
4800 "ld -r" we might have padding in the middle of .opd.
4801 Also, there's nothing to prevent someone putting
4802 something silly in .opd with the assembler. No .opd
4803 optimization for them! */
4804 (*_bfd_error_handler
)
4805 (_("%s: .opd is not a regular array of opd entries"),
4806 bfd_archive_filename (ibfd
));
4811 r_symndx
= ELF64_R_SYM (rel
->r_info
);
4812 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
4814 goto error_free_rel
;
4816 if (sym_sec
== NULL
|| sym_sec
->owner
== NULL
)
4818 const char *sym_name
;
4820 sym_name
= h
->root
.root
.string
;
4822 sym_name
= bfd_elf_local_sym_name (ibfd
, sym
);
4824 (*_bfd_error_handler
)
4825 (_("%s: undefined sym `%s' in .opd section"),
4826 bfd_archive_filename (ibfd
),
4832 /* opd entries are always for functions defined in the
4833 current input bfd. If the symbol isn't defined in the
4834 input bfd, then we won't be using the function in this
4835 bfd; It must be defined in a linkonce section in another
4836 bfd, or is weak. It's also possible that we are
4837 discarding the function due to a linker script /DISCARD/,
4838 which we test for via the output_section. */
4839 if (sym_sec
->owner
!= ibfd
4840 || sym_sec
->output_section
== bfd_abs_section_ptr
)
4848 Elf_Internal_Rela
*write_rel
;
4849 bfd_byte
*rptr
, *wptr
;
4852 /* This seems a waste of time as input .opd sections are all
4853 zeros as generated by gcc, but I suppose there's no reason
4854 this will always be so. We might start putting something in
4855 the third word of .opd entries. */
4856 if ((sec
->flags
& SEC_IN_MEMORY
) == 0)
4858 bfd_byte
*loc
= bfd_alloc (ibfd
, sec
->_raw_size
);
4860 || !bfd_get_section_contents (ibfd
, sec
, loc
, 0,
4863 if (local_syms
!= NULL
4864 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
4867 if (elf_section_data (sec
)->relocs
!= relstart
)
4871 sec
->contents
= loc
;
4872 sec
->flags
|= (SEC_IN_MEMORY
| SEC_HAS_CONTENTS
);
4875 elf_section_data (sec
)->relocs
= relstart
;
4877 wptr
= sec
->contents
;
4878 rptr
= sec
->contents
;
4879 write_rel
= relstart
;
4882 for (rel
= relstart
; rel
< relend
; rel
++)
4884 if (rel
->r_offset
== offset
)
4886 unsigned long r_symndx
;
4888 struct elf_link_hash_entry
*h
;
4889 Elf_Internal_Sym
*sym
;
4891 r_symndx
= ELF64_R_SYM (rel
->r_info
);
4892 get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
4895 skip
= (sym_sec
->owner
!= ibfd
4896 || sym_sec
->output_section
== bfd_abs_section_ptr
);
4899 if (h
!= NULL
&& sym_sec
->owner
== ibfd
)
4901 /* Arrange for the function descriptor sym
4903 struct ppc_link_hash_entry
*fdh
;
4904 struct ppc_link_hash_entry
*fh
;
4906 fh
= (struct ppc_link_hash_entry
*) h
;
4907 fdh
= (struct ppc_link_hash_entry
*) fh
->oh
;
4910 const char *fd_name
;
4911 struct ppc_link_hash_table
*htab
;
4913 fd_name
= h
->root
.root
.string
+ 1;
4914 htab
= ppc_hash_table (info
);
4915 fdh
= (struct ppc_link_hash_entry
*)
4916 elf_link_hash_lookup (&htab
->elf
, fd_name
,
4917 FALSE
, FALSE
, FALSE
);
4918 fdh
->is_func_descriptor
= 1;
4924 fdh
->elf
.root
.u
.def
.value
= 0;
4925 fdh
->elf
.root
.u
.def
.section
= sym_sec
;
4930 /* We'll be keeping this opd entry. */
4934 /* Redefine the function descriptor symbol
4935 to this location in the opd section.
4936 We've checked above that opd relocs are
4938 struct ppc_link_hash_entry
*fdh
;
4939 struct ppc_link_hash_entry
*fh
;
4941 fh
= (struct ppc_link_hash_entry
*) h
;
4942 fdh
= (struct ppc_link_hash_entry
*) fh
->oh
;
4945 const char *fd_name
;
4946 struct ppc_link_hash_table
*htab
;
4948 fd_name
= h
->root
.root
.string
+ 1;
4949 htab
= ppc_hash_table (info
);
4950 fdh
= (struct ppc_link_hash_entry
*)
4951 elf_link_hash_lookup (&htab
->elf
, fd_name
,
4952 FALSE
, FALSE
, FALSE
);
4953 fdh
->is_func_descriptor
= 1;
4959 fdh
->elf
.root
.u
.def
.value
= wptr
- sec
->contents
;
4963 /* Local syms are a bit tricky. We could
4964 tweak them as they can be cached, but
4965 we'd need to look through the local syms
4966 for the function descriptor sym which we
4967 don't have at the moment. So keep an
4968 array of adjustments. */
4969 adjust
[rel
->r_offset
/ 24] = wptr
- rptr
;
4973 memcpy (wptr
, rptr
, 24);
4980 /* We need to adjust any reloc offsets to point to the
4981 new opd entries. While we're at it, we may as well
4982 remove redundant relocs. */
4985 rel
->r_offset
+= wptr
- rptr
;
4986 if (write_rel
!= rel
)
4987 memcpy (write_rel
, rel
, sizeof (*rel
));
4992 sec
->_cooked_size
= wptr
- sec
->contents
;
4993 sec
->reloc_count
= write_rel
- relstart
;
4994 /* Fudge the size too, as this is used later in
4995 elf_bfd_final_link if we are emitting relocs. */
4996 elf_section_data (sec
)->rel_hdr
.sh_size
4997 = sec
->reloc_count
* elf_section_data (sec
)->rel_hdr
.sh_entsize
;
4998 BFD_ASSERT (elf_section_data (sec
)->rel_hdr2
== NULL
);
5000 else if (elf_section_data (sec
)->relocs
!= relstart
)
5003 if (local_syms
!= NULL
5004 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
5006 if (!info
->keep_memory
)
5009 symtab_hdr
->contents
= (unsigned char *) local_syms
;
5016 /* Set htab->tls_sec. */
5019 ppc64_elf_tls_setup (bfd
*obfd
, struct bfd_link_info
*info
)
5022 struct ppc_link_hash_table
*htab
;
5024 for (tls
= obfd
->sections
; tls
!= NULL
; tls
= tls
->next
)
5025 if ((tls
->flags
& (SEC_THREAD_LOCAL
| SEC_LOAD
))
5026 == (SEC_THREAD_LOCAL
| SEC_LOAD
))
5029 htab
= ppc_hash_table (info
);
5030 htab
->tls_sec
= tls
;
5032 if (htab
->tls_get_addr
!= NULL
)
5034 struct elf_link_hash_entry
*h
= htab
->tls_get_addr
;
5036 while (h
->root
.type
== bfd_link_hash_indirect
5037 || h
->root
.type
== bfd_link_hash_warning
)
5038 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5040 htab
->tls_get_addr
= h
;
5046 /* Run through all the TLS relocs looking for optimization
5047 opportunities. The linker has been hacked (see ppc64elf.em) to do
5048 a preliminary section layout so that we know the TLS segment
5049 offsets. We can't optimize earlier because some optimizations need
5050 to know the tp offset, and we need to optimize before allocating
5051 dynamic relocations. */
5054 ppc64_elf_tls_optimize (bfd
*obfd ATTRIBUTE_UNUSED
, struct bfd_link_info
*info
)
5058 struct ppc_link_hash_table
*htab
;
5060 if (info
->relocatable
|| info
->shared
)
5063 htab
= ppc_hash_table (info
);
5064 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
5066 Elf_Internal_Sym
*locsyms
= NULL
;
5068 for (sec
= ibfd
->sections
; sec
!= NULL
; sec
= sec
->next
)
5069 if (sec
->has_tls_reloc
&& !bfd_is_abs_section (sec
->output_section
))
5071 Elf_Internal_Rela
*relstart
, *rel
, *relend
;
5072 int expecting_tls_get_addr
;
5074 /* Read the relocations. */
5075 relstart
= _bfd_elf_link_read_relocs (ibfd
, sec
, NULL
, NULL
,
5077 if (relstart
== NULL
)
5080 expecting_tls_get_addr
= 0;
5081 relend
= relstart
+ sec
->reloc_count
;
5082 for (rel
= relstart
; rel
< relend
; rel
++)
5084 enum elf_ppc64_reloc_type r_type
;
5085 unsigned long r_symndx
;
5086 struct elf_link_hash_entry
*h
;
5087 Elf_Internal_Sym
*sym
;
5090 char tls_set
, tls_clear
, tls_type
= 0;
5092 bfd_boolean ok_tprel
, is_local
;
5094 r_symndx
= ELF64_R_SYM (rel
->r_info
);
5095 if (!get_sym_h (&h
, &sym
, &sym_sec
, &tls_mask
, &locsyms
,
5099 if (elf_section_data (sec
)->relocs
!= relstart
)
5102 && (elf_tdata (ibfd
)->symtab_hdr
.contents
5103 != (unsigned char *) locsyms
))
5110 if (h
->root
.type
!= bfd_link_hash_defined
5111 && h
->root
.type
!= bfd_link_hash_defweak
)
5113 value
= h
->root
.u
.def
.value
;
5116 value
= sym
->st_value
;
5121 || !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
))
5124 value
+= sym_sec
->output_offset
;
5125 value
+= sym_sec
->output_section
->vma
;
5126 value
-= htab
->tls_sec
->vma
;
5127 ok_tprel
= (value
+ TP_OFFSET
+ ((bfd_vma
) 1 << 31)
5128 < (bfd_vma
) 1 << 32);
5131 r_type
= ELF64_R_TYPE (rel
->r_info
);
5134 case R_PPC64_GOT_TLSLD16
:
5135 case R_PPC64_GOT_TLSLD16_LO
:
5136 case R_PPC64_GOT_TLSLD16_HI
:
5137 case R_PPC64_GOT_TLSLD16_HA
:
5138 /* These relocs should never be against a symbol
5139 defined in a shared lib. Leave them alone if
5140 that turns out to be the case. */
5141 htab
->tlsld_got
.refcount
-= 1;
5148 tls_type
= TLS_TLS
| TLS_LD
;
5149 expecting_tls_get_addr
= 1;
5152 case R_PPC64_GOT_TLSGD16
:
5153 case R_PPC64_GOT_TLSGD16_LO
:
5154 case R_PPC64_GOT_TLSGD16_HI
:
5155 case R_PPC64_GOT_TLSGD16_HA
:
5161 tls_set
= TLS_TLS
| TLS_TPRELGD
;
5163 tls_type
= TLS_TLS
| TLS_GD
;
5164 expecting_tls_get_addr
= 1;
5167 case R_PPC64_GOT_TPREL16_DS
:
5168 case R_PPC64_GOT_TPREL16_LO_DS
:
5169 case R_PPC64_GOT_TPREL16_HI
:
5170 case R_PPC64_GOT_TPREL16_HA
:
5171 expecting_tls_get_addr
= 0;
5176 tls_clear
= TLS_TPREL
;
5177 tls_type
= TLS_TLS
| TLS_TPREL
;
5184 case R_PPC64_REL14_BRTAKEN
:
5185 case R_PPC64_REL14_BRNTAKEN
:
5188 && h
== htab
->tls_get_addr
)
5190 if (!expecting_tls_get_addr
5192 && ((ELF64_R_TYPE (rel
[-1].r_info
)
5194 || (ELF64_R_TYPE (rel
[-1].r_info
)
5195 == R_PPC64_TOC16_LO
)))
5197 /* Check for toc tls entries. */
5201 retval
= get_tls_mask (&toc_tls
, &locsyms
,
5205 if (toc_tls
!= NULL
)
5206 expecting_tls_get_addr
= retval
> 1;
5209 if (expecting_tls_get_addr
)
5211 struct plt_entry
*ent
;
5212 for (ent
= h
->plt
.plist
; ent
; ent
= ent
->next
)
5213 if (ent
->addend
== 0)
5215 if (ent
->plt
.refcount
> 0)
5216 ent
->plt
.refcount
-= 1;
5221 expecting_tls_get_addr
= 0;
5224 case R_PPC64_TPREL64
:
5225 expecting_tls_get_addr
= 0;
5229 tls_set
= TLS_EXPLICIT
;
5230 tls_clear
= TLS_TPREL
;
5236 case R_PPC64_DTPMOD64
:
5237 expecting_tls_get_addr
= 0;
5238 if (rel
+ 1 < relend
5240 == ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
))
5241 && rel
[1].r_offset
== rel
->r_offset
+ 8)
5245 tls_set
= TLS_EXPLICIT
| TLS_GD
;
5248 tls_set
= TLS_EXPLICIT
| TLS_GD
| TLS_TPRELGD
;
5257 tls_set
= TLS_EXPLICIT
;
5263 expecting_tls_get_addr
= 0;
5267 if ((tls_set
& TLS_EXPLICIT
) == 0)
5269 struct got_entry
*ent
;
5271 /* Adjust got entry for this reloc. */
5275 ent
= elf_local_got_ents (ibfd
)[r_symndx
];
5277 for (; ent
!= NULL
; ent
= ent
->next
)
5278 if (ent
->addend
== rel
->r_addend
5279 && ent
->tls_type
== tls_type
)
5286 /* We managed to get rid of a got entry. */
5287 if (ent
->got
.refcount
> 0)
5288 ent
->got
.refcount
-= 1;
5293 struct ppc_link_hash_entry
* eh
;
5294 struct ppc_dyn_relocs
**pp
;
5295 struct ppc_dyn_relocs
*p
;
5297 /* Adjust dynamic relocs. */
5298 eh
= (struct ppc_link_hash_entry
*) h
;
5299 for (pp
= &eh
->dyn_relocs
;
5304 /* If we got rid of a DTPMOD/DTPREL reloc
5305 pair then we'll lose one or two dyn
5307 if (tls_set
== (TLS_EXPLICIT
| TLS_GD
))
5316 *tls_mask
|= tls_set
;
5317 *tls_mask
&= ~tls_clear
;
5320 if (elf_section_data (sec
)->relocs
!= relstart
)
5325 && (elf_tdata (ibfd
)->symtab_hdr
.contents
5326 != (unsigned char *) locsyms
))
5328 if (!info
->keep_memory
)
5331 elf_tdata (ibfd
)->symtab_hdr
.contents
= (unsigned char *) locsyms
;
5337 /* This is the condition under which ppc64_elf_finish_dynamic_symbol
5338 will be called from elflink.h. If elflink.h doesn't call our
5339 finish_dynamic_symbol routine, we'll need to do something about
5340 initializing any .plt and .got entries in ppc64_elf_relocate_section. */
5341 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, SHARED, H) \
5344 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
5345 && ((H)->dynindx != -1 \
5346 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
5348 /* Allocate space in .plt, .got and associated reloc sections for
5352 allocate_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
5354 struct bfd_link_info
*info
;
5355 struct ppc_link_hash_table
*htab
;
5357 struct ppc_link_hash_entry
*eh
;
5358 struct ppc_dyn_relocs
*p
;
5359 struct got_entry
*gent
;
5361 if (h
->root
.type
== bfd_link_hash_indirect
)
5364 if (h
->root
.type
== bfd_link_hash_warning
)
5365 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5367 info
= (struct bfd_link_info
*) inf
;
5368 htab
= ppc_hash_table (info
);
5370 if (htab
->elf
.dynamic_sections_created
5372 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
->shared
, h
))
5374 struct plt_entry
*pent
;
5375 bfd_boolean doneone
= FALSE
;
5376 for (pent
= h
->plt
.plist
; pent
!= NULL
; pent
= pent
->next
)
5377 if (pent
->plt
.refcount
> 0)
5379 BFD_ASSERT (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
);
5381 /* If this is the first .plt entry, make room for the special
5384 if (s
->_raw_size
== 0)
5385 s
->_raw_size
+= PLT_INITIAL_ENTRY_SIZE
;
5387 pent
->plt
.offset
= s
->_raw_size
;
5389 /* Make room for this entry. */
5390 s
->_raw_size
+= PLT_ENTRY_SIZE
;
5392 /* Make room for the .glink code. */
5394 if (s
->_raw_size
== 0)
5395 s
->_raw_size
+= GLINK_CALL_STUB_SIZE
;
5396 /* We need bigger stubs past index 32767. */
5397 if (s
->_raw_size
>= GLINK_CALL_STUB_SIZE
+ 32768*2*4)
5399 s
->_raw_size
+= 2*4;
5401 /* We also need to make an entry in the .rela.plt section. */
5403 s
->_raw_size
+= sizeof (Elf64_External_Rela
);
5407 pent
->plt
.offset
= (bfd_vma
) -1;
5410 h
->plt
.plist
= NULL
;
5411 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
5416 h
->plt
.plist
= NULL
;
5417 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
5420 eh
= (struct ppc_link_hash_entry
*) h
;
5421 /* Run through the TLS GD got entries first if we're changing them
5423 if ((eh
->tls_mask
& TLS_TPRELGD
) != 0)
5424 for (gent
= h
->got
.glist
; gent
!= NULL
; gent
= gent
->next
)
5425 if (gent
->got
.refcount
> 0
5426 && (gent
->tls_type
& TLS_GD
) != 0)
5428 /* This was a GD entry that has been converted to TPREL. If
5429 there happens to be a TPREL entry we can use that one. */
5430 struct got_entry
*ent
;
5431 for (ent
= h
->got
.glist
; ent
!= NULL
; ent
= ent
->next
)
5432 if (ent
->got
.refcount
> 0
5433 && (ent
->tls_type
& TLS_TPREL
) != 0
5434 && ent
->addend
== gent
->addend
)
5436 gent
->got
.refcount
= 0;
5440 /* If not, then we'll be using our own TPREL entry. */
5441 if (gent
->got
.refcount
!= 0)
5442 gent
->tls_type
= TLS_TLS
| TLS_TPREL
;
5445 for (gent
= h
->got
.glist
; gent
!= NULL
; gent
= gent
->next
)
5446 if (gent
->got
.refcount
> 0)
5450 /* Make sure this symbol is output as a dynamic symbol.
5451 Undefined weak syms won't yet be marked as dynamic,
5452 nor will all TLS symbols. */
5453 if (h
->dynindx
== -1
5454 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
5456 if (! bfd_elf64_link_record_dynamic_symbol (info
, h
))
5460 if ((gent
->tls_type
& TLS_LD
) != 0
5461 && !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
))
5463 gent
->got
.offset
= htab
->tlsld_got
.offset
;
5468 gent
->got
.offset
= s
->_raw_size
;
5470 += (gent
->tls_type
& eh
->tls_mask
& (TLS_GD
| TLS_LD
)) ? 16 : 8;
5471 dyn
= htab
->elf
.dynamic_sections_created
;
5473 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, 0, h
))
5474 && (ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
5475 || h
->root
.type
!= bfd_link_hash_undefweak
))
5476 htab
->relgot
->_raw_size
5477 += (gent
->tls_type
& eh
->tls_mask
& TLS_GD
5478 ? 2 * sizeof (Elf64_External_Rela
)
5479 : sizeof (Elf64_External_Rela
));
5482 gent
->got
.offset
= (bfd_vma
) -1;
5484 if (eh
->dyn_relocs
== NULL
)
5487 /* In the shared -Bsymbolic case, discard space allocated for
5488 dynamic pc-relative relocs against symbols which turn out to be
5489 defined in regular objects. For the normal shared case, discard
5490 space for relocs that have become local due to symbol visibility
5495 /* Relocs that use pc_count are those that appear on a call insn,
5496 or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
5497 generated via assembly. We want calls to protected symbols to
5498 resolve directly to the function rather than going via the plt.
5499 If people want function pointer comparisons to work as expected
5500 then they should avoid writing weird assembly. */
5501 if (SYMBOL_CALLS_LOCAL (info
, h
))
5503 struct ppc_dyn_relocs
**pp
;
5505 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
5507 p
->count
-= p
->pc_count
;
5516 /* Also discard relocs on undefined weak syms with non-default
5518 if (ELF_ST_VISIBILITY (h
->other
) != STV_DEFAULT
5519 && h
->root
.type
== bfd_link_hash_undefweak
)
5520 eh
->dyn_relocs
= NULL
;
5522 else if (ELIMINATE_COPY_RELOCS
)
5524 /* For the non-shared case, discard space for relocs against
5525 symbols which turn out to need copy relocs or are not
5528 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
5529 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
5530 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
5532 /* Make sure this symbol is output as a dynamic symbol.
5533 Undefined weak syms won't yet be marked as dynamic. */
5534 if (h
->dynindx
== -1
5535 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
5537 if (! bfd_elf64_link_record_dynamic_symbol (info
, h
))
5541 /* If that succeeded, we know we'll be keeping all the
5543 if (h
->dynindx
!= -1)
5547 eh
->dyn_relocs
= NULL
;
5552 /* Finally, allocate space. */
5553 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
5555 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
5556 sreloc
->_raw_size
+= p
->count
* sizeof (Elf64_External_Rela
);
5562 /* Find any dynamic relocs that apply to read-only sections. */
5565 readonly_dynrelocs (struct elf_link_hash_entry
*h
, void *inf
)
5567 struct ppc_link_hash_entry
*eh
;
5568 struct ppc_dyn_relocs
*p
;
5570 if (h
->root
.type
== bfd_link_hash_warning
)
5571 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
5573 eh
= (struct ppc_link_hash_entry
*) h
;
5574 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
5576 asection
*s
= p
->sec
->output_section
;
5578 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
5580 struct bfd_link_info
*info
= inf
;
5582 info
->flags
|= DF_TEXTREL
;
5584 /* Not an error, just cut short the traversal. */
5591 /* Set the sizes of the dynamic sections. */
5594 ppc64_elf_size_dynamic_sections (bfd
*output_bfd ATTRIBUTE_UNUSED
,
5595 struct bfd_link_info
*info
)
5597 struct ppc_link_hash_table
*htab
;
5603 htab
= ppc_hash_table (info
);
5604 dynobj
= htab
->elf
.dynobj
;
5608 if (htab
->elf
.dynamic_sections_created
)
5610 /* Set the contents of the .interp section to the interpreter. */
5611 if (info
->executable
)
5613 s
= bfd_get_section_by_name (dynobj
, ".interp");
5616 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
5617 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
5621 if (htab
->tlsld_got
.refcount
> 0)
5623 htab
->tlsld_got
.offset
= htab
->got
->_raw_size
;
5624 htab
->got
->_raw_size
+= 16;
5626 htab
->relgot
->_raw_size
+= sizeof (Elf64_External_Rela
);
5629 htab
->tlsld_got
.offset
= (bfd_vma
) -1;
5631 /* Set up .got offsets for local syms, and space for local dynamic
5633 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
5635 struct got_entry
**lgot_ents
;
5636 struct got_entry
**end_lgot_ents
;
5638 bfd_size_type locsymcount
;
5639 Elf_Internal_Shdr
*symtab_hdr
;
5642 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
5645 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
5647 struct ppc_dyn_relocs
*p
;
5649 for (p
= *((struct ppc_dyn_relocs
**)
5650 &elf_section_data (s
)->local_dynrel
);
5654 if (!bfd_is_abs_section (p
->sec
)
5655 && bfd_is_abs_section (p
->sec
->output_section
))
5657 /* Input section has been discarded, either because
5658 it is a copy of a linkonce section or due to
5659 linker script /DISCARD/, so we'll be discarding
5662 else if (p
->count
!= 0)
5664 srel
= elf_section_data (p
->sec
)->sreloc
;
5665 srel
->_raw_size
+= p
->count
* sizeof (Elf64_External_Rela
);
5666 if ((p
->sec
->output_section
->flags
& SEC_READONLY
) != 0)
5667 info
->flags
|= DF_TEXTREL
;
5672 lgot_ents
= elf_local_got_ents (ibfd
);
5676 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
5677 locsymcount
= symtab_hdr
->sh_info
;
5678 end_lgot_ents
= lgot_ents
+ locsymcount
;
5679 lgot_masks
= (char *) end_lgot_ents
;
5681 srel
= htab
->relgot
;
5682 for (; lgot_ents
< end_lgot_ents
; ++lgot_ents
, ++lgot_masks
)
5684 struct got_entry
*ent
;
5686 for (ent
= *lgot_ents
; ent
!= NULL
; ent
= ent
->next
)
5687 if (ent
->got
.refcount
> 0)
5689 if ((ent
->tls_type
& *lgot_masks
& TLS_LD
) != 0)
5691 if (htab
->tlsld_got
.offset
== (bfd_vma
) -1)
5693 htab
->tlsld_got
.offset
= s
->_raw_size
;
5696 srel
->_raw_size
+= sizeof (Elf64_External_Rela
);
5698 ent
->got
.offset
= htab
->tlsld_got
.offset
;
5702 ent
->got
.offset
= s
->_raw_size
;
5703 if ((ent
->tls_type
& *lgot_masks
& TLS_GD
) != 0)
5707 srel
->_raw_size
+= 2 * sizeof (Elf64_External_Rela
);
5713 srel
->_raw_size
+= sizeof (Elf64_External_Rela
);
5718 ent
->got
.offset
= (bfd_vma
) -1;
5722 /* Allocate global sym .plt and .got entries, and space for global
5723 sym dynamic relocs. */
5724 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, info
);
5726 /* We now have determined the sizes of the various dynamic sections.
5727 Allocate memory for them. */
5729 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
5731 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
5734 /* Reset _cooked_size since prelim layout will set it wrongly,
5735 and a non-zero _cooked_size sticks. */
5736 s
->_cooked_size
= 0;
5738 if (s
== htab
->brlt
|| s
== htab
->relbrlt
)
5739 /* These haven't been allocated yet; don't strip. */
5741 else if (s
== htab
->got
)
5743 /* Automatic multiple tocs aren't possible if we are using the
5744 GOT. The GOT is accessed via r2, so we can't adjust r2.
5745 FIXME: There's no reason why we couldn't lay out multiple
5747 if (s
->_raw_size
> elf_backend_got_header_size
)
5748 htab
->no_multi_toc
= 1;
5750 else if (s
== htab
->plt
5751 || s
== htab
->glink
)
5753 /* Strip this section if we don't need it; see the
5756 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
5758 if (s
->_raw_size
== 0)
5760 /* If we don't need this section, strip it from the
5761 output file. This is mostly to handle .rela.bss and
5762 .rela.plt. We must create both sections in
5763 create_dynamic_sections, because they must be created
5764 before the linker maps input sections to output
5765 sections. The linker does that before
5766 adjust_dynamic_symbol is called, and it is that
5767 function which decides whether anything needs to go
5768 into these sections. */
5772 if (s
!= htab
->relplt
)
5775 /* We use the reloc_count field as a counter if we need
5776 to copy relocs into the output file. */
5782 /* It's not one of our sections, so don't allocate space. */
5786 if (s
->_raw_size
== 0)
5788 _bfd_strip_section_from_output (info
, s
);
5792 /* .plt is in the bss section. We don't initialise it. */
5793 if ((s
->flags
& SEC_LOAD
) == 0)
5796 /* Allocate memory for the section contents. We use bfd_zalloc
5797 here in case unused entries are not reclaimed before the
5798 section's contents are written out. This should not happen,
5799 but this way if it does we get a R_PPC64_NONE reloc in .rela
5800 sections instead of garbage.
5801 We also rely on the section contents being zero when writing
5803 s
->contents
= bfd_zalloc (dynobj
, s
->_raw_size
);
5804 if (s
->contents
== NULL
)
5808 if (htab
->elf
.dynamic_sections_created
)
5810 /* Add some entries to the .dynamic section. We fill in the
5811 values later, in ppc64_elf_finish_dynamic_sections, but we
5812 must add the entries now so that we get the correct size for
5813 the .dynamic section. The DT_DEBUG entry is filled in by the
5814 dynamic linker and used by the debugger. */
5815 #define add_dynamic_entry(TAG, VAL) \
5816 bfd_elf64_add_dynamic_entry (info, (TAG), (VAL))
5818 if (info
->executable
)
5820 if (!add_dynamic_entry (DT_DEBUG
, 0))
5824 if (htab
->plt
!= NULL
&& htab
->plt
->_raw_size
!= 0)
5826 if (!add_dynamic_entry (DT_PLTGOT
, 0)
5827 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
5828 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
5829 || !add_dynamic_entry (DT_JMPREL
, 0)
5830 || !add_dynamic_entry (DT_PPC64_GLINK
, 0))
5836 if (!add_dynamic_entry (DT_PPC64_OPD
, 0)
5837 || !add_dynamic_entry (DT_PPC64_OPDSZ
, 0))
5843 if (!add_dynamic_entry (DT_RELA
, 0)
5844 || !add_dynamic_entry (DT_RELASZ
, 0)
5845 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
5848 /* If any dynamic relocs apply to a read-only section,
5849 then we need a DT_TEXTREL entry. */
5850 if ((info
->flags
& DF_TEXTREL
) == 0)
5851 elf_link_hash_traverse (&htab
->elf
, readonly_dynrelocs
, info
);
5853 if ((info
->flags
& DF_TEXTREL
) != 0)
5855 if (!add_dynamic_entry (DT_TEXTREL
, 0))
5860 #undef add_dynamic_entry
5865 /* Determine the type of stub needed, if any, for a call. */
5867 static inline enum ppc_stub_type
5868 ppc_type_of_stub (asection
*input_sec
,
5869 const Elf_Internal_Rela
*rel
,
5870 struct ppc_link_hash_entry
**hash
,
5871 bfd_vma destination
)
5873 struct ppc_link_hash_entry
*h
= *hash
;
5875 bfd_vma branch_offset
;
5876 bfd_vma max_branch_offset
;
5877 enum elf_ppc64_reloc_type r_type
;
5882 && h
->oh
->dynindx
!= -1)
5884 struct plt_entry
*ent
;
5885 for (ent
= h
->oh
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
5886 if (ent
->addend
== rel
->r_addend
5887 && ent
->plt
.offset
!= (bfd_vma
) -1)
5889 *hash
= (struct ppc_link_hash_entry
*) h
->oh
;
5890 return ppc_stub_plt_call
;
5894 if (h
->elf
.root
.type
!= bfd_link_hash_defined
5895 && h
->elf
.root
.type
!= bfd_link_hash_defweak
)
5896 return ppc_stub_none
;
5899 /* Determine where the call point is. */
5900 location
= (input_sec
->output_offset
5901 + input_sec
->output_section
->vma
5904 branch_offset
= destination
- location
;
5905 r_type
= ELF64_R_TYPE (rel
->r_info
);
5907 /* Determine if a long branch stub is needed. */
5908 max_branch_offset
= 1 << 25;
5909 if (r_type
!= R_PPC64_REL24
)
5910 max_branch_offset
= 1 << 15;
5912 if (branch_offset
+ max_branch_offset
>= 2 * max_branch_offset
)
5913 /* We need a stub. Figure out whether a long_branch or plt_branch
5915 return ppc_stub_long_branch
;
5917 return ppc_stub_none
;
5920 /* Build a .plt call stub. */
5922 static inline bfd_byte
*
5923 build_plt_stub (bfd
*obfd
, bfd_byte
*p
, int offset
)
5925 #define PPC_LO(v) ((v) & 0xffff)
5926 #define PPC_HI(v) (((v) >> 16) & 0xffff)
5927 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
5929 bfd_put_32 (obfd
, ADDIS_R12_R2
| PPC_HA (offset
), p
), p
+= 4;
5930 bfd_put_32 (obfd
, STD_R2_40R1
, p
), p
+= 4;
5931 bfd_put_32 (obfd
, LD_R11_0R12
| PPC_LO (offset
), p
), p
+= 4;
5932 if (PPC_HA (offset
+ 8) != PPC_HA (offset
))
5933 bfd_put_32 (obfd
, ADDIS_R12_R12
| 1, p
), p
+= 4;
5935 bfd_put_32 (obfd
, LD_R2_0R12
| PPC_LO (offset
), p
), p
+= 4;
5936 if (PPC_HA (offset
+ 8) != PPC_HA (offset
))
5937 bfd_put_32 (obfd
, ADDIS_R12_R12
| 1, p
), p
+= 4;
5939 bfd_put_32 (obfd
, MTCTR_R11
, p
), p
+= 4;
5940 bfd_put_32 (obfd
, LD_R11_0R12
| PPC_LO (offset
), p
), p
+= 4;
5941 bfd_put_32 (obfd
, BCTR
, p
), p
+= 4;
5946 ppc_build_one_stub (struct bfd_hash_entry
*gen_entry
, void *in_arg
)
5948 struct ppc_stub_hash_entry
*stub_entry
;
5949 struct ppc_branch_hash_entry
*br_entry
;
5950 struct bfd_link_info
*info
;
5951 struct ppc_link_hash_table
*htab
;
5957 struct plt_entry
*ent
;
5961 /* Massage our args to the form they really have. */
5962 stub_entry
= (struct ppc_stub_hash_entry
*) gen_entry
;
5965 htab
= ppc_hash_table (info
);
5966 stub_sec
= stub_entry
->stub_sec
;
5968 /* Make a note of the offset within the stubs for this entry. */
5969 stub_entry
->stub_offset
= stub_sec
->_cooked_size
;
5970 loc
= stub_sec
->contents
+ stub_entry
->stub_offset
;
5972 if (htab
->emit_stub_syms
)
5974 struct elf_link_hash_entry
*h
;
5975 h
= elf_link_hash_lookup (&htab
->elf
, stub_entry
->root
.string
,
5976 TRUE
, FALSE
, FALSE
);
5979 h
->root
.type
= bfd_link_hash_defined
;
5980 h
->root
.u
.def
.section
= stub_entry
->stub_sec
;
5981 h
->root
.u
.def
.value
= stub_entry
->stub_offset
;
5982 h
->elf_link_hash_flags
= (ELF_LINK_HASH_REF_REGULAR
5983 | ELF_LINK_HASH_DEF_REGULAR
5984 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
5985 | ELF_LINK_FORCED_LOCAL
);
5988 stub_bfd
= stub_sec
->owner
;
5990 htab
->stub_count
[stub_entry
->stub_type
- 1] += 1;
5991 switch (stub_entry
->stub_type
)
5993 case ppc_stub_long_branch
:
5994 case ppc_stub_long_branch_r2off
:
5995 /* Branches are relative. This is where we are going to. */
5996 off
= (stub_entry
->target_value
5997 + stub_entry
->target_section
->output_offset
5998 + stub_entry
->target_section
->output_section
->vma
);
6000 /* And this is where we are coming from. */
6001 off
-= (stub_entry
->stub_offset
6002 + stub_sec
->output_offset
6003 + stub_sec
->output_section
->vma
);
6005 if (stub_entry
->stub_type
!= ppc_stub_long_branch_r2off
)
6011 r2off
= (htab
->stub_group
[stub_entry
->target_section
->id
].toc_off
6012 - htab
->stub_group
[stub_entry
->id_sec
->id
].toc_off
);
6013 bfd_put_32 (stub_bfd
, STD_R2_40R1
, loc
);
6015 bfd_put_32 (stub_bfd
, ADDIS_R2_R2
| PPC_HA (r2off
), loc
);
6017 bfd_put_32 (stub_bfd
, ADDI_R2_R2
| PPC_LO (r2off
), loc
);
6022 bfd_put_32 (stub_bfd
, B_DOT
| (off
& 0x3fffffc), loc
);
6024 BFD_ASSERT (off
+ (1 << 25) < (bfd_vma
) (1 << 26));
6027 case ppc_stub_plt_branch
:
6028 case ppc_stub_plt_branch_r2off
:
6029 br_entry
= ppc_branch_hash_lookup (&htab
->branch_hash_table
,
6030 stub_entry
->root
.string
+ 9,
6032 if (br_entry
== NULL
)
6034 (*_bfd_error_handler
) (_("can't find branch stub `%s'"),
6035 stub_entry
->root
.string
+ 9);
6036 htab
->stub_error
= TRUE
;
6040 off
= (stub_entry
->target_value
6041 + stub_entry
->target_section
->output_offset
6042 + stub_entry
->target_section
->output_section
->vma
);
6044 bfd_put_64 (htab
->brlt
->owner
, off
,
6045 htab
->brlt
->contents
+ br_entry
->offset
);
6049 /* Create a reloc for the branch lookup table entry. */
6050 Elf_Internal_Rela rela
;
6053 rela
.r_offset
= (br_entry
->offset
6054 + htab
->brlt
->output_offset
6055 + htab
->brlt
->output_section
->vma
);
6056 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
6057 rela
.r_addend
= off
;
6059 rl
= htab
->relbrlt
->contents
;
6060 rl
+= htab
->relbrlt
->reloc_count
++ * sizeof (Elf64_External_Rela
);
6061 bfd_elf64_swap_reloca_out (htab
->relbrlt
->owner
, &rela
, rl
);
6064 off
= (br_entry
->offset
6065 + htab
->brlt
->output_offset
6066 + htab
->brlt
->output_section
->vma
6067 - elf_gp (htab
->brlt
->output_section
->owner
)
6068 - htab
->stub_group
[stub_entry
->id_sec
->id
].toc_off
);
6070 if (off
+ 0x80008000 > 0xffffffff || (off
& 7) != 0)
6072 (*_bfd_error_handler
)
6073 (_("linkage table error against `%s'"),
6074 stub_entry
->root
.string
);
6075 bfd_set_error (bfd_error_bad_value
);
6076 htab
->stub_error
= TRUE
;
6081 if (stub_entry
->stub_type
!= ppc_stub_plt_branch_r2off
)
6083 bfd_put_32 (stub_bfd
, ADDIS_R12_R2
| PPC_HA (indx
), loc
);
6085 bfd_put_32 (stub_bfd
, LD_R11_0R12
| PPC_LO (indx
), loc
);
6092 r2off
= (htab
->stub_group
[stub_entry
->target_section
->id
].toc_off
6093 - htab
->stub_group
[stub_entry
->id_sec
->id
].toc_off
);
6094 bfd_put_32 (stub_bfd
, STD_R2_40R1
, loc
);
6096 bfd_put_32 (stub_bfd
, ADDIS_R12_R2
| PPC_HA (indx
), loc
);
6098 bfd_put_32 (stub_bfd
, LD_R11_0R12
| PPC_LO (indx
), loc
);
6100 bfd_put_32 (stub_bfd
, ADDIS_R2_R2
| PPC_HA (r2off
), loc
);
6102 bfd_put_32 (stub_bfd
, ADDI_R2_R2
| PPC_LO (r2off
), loc
);
6106 bfd_put_32 (stub_bfd
, MTCTR_R11
, loc
);
6108 bfd_put_32 (stub_bfd
, BCTR
, loc
);
6111 case ppc_stub_plt_call
:
6112 /* Do the best we can for shared libraries built without
6113 exporting ".foo" for each "foo". This can happen when symbol
6114 versioning scripts strip all bar a subset of symbols. */
6115 if (stub_entry
->h
->oh
->root
.type
!= bfd_link_hash_defined
6116 && stub_entry
->h
->oh
->root
.type
!= bfd_link_hash_defweak
)
6118 /* Point the symbol at the stub. There may be multiple stubs,
6119 we don't really care; The main thing is to make this sym
6120 defined somewhere. Maybe defining the symbol in the stub
6121 section is a silly idea. If we didn't do this, htab->top_id
6123 stub_entry
->h
->oh
->root
.type
= bfd_link_hash_defined
;
6124 stub_entry
->h
->oh
->root
.u
.def
.section
= stub_entry
->stub_sec
;
6125 stub_entry
->h
->oh
->root
.u
.def
.value
= stub_entry
->stub_offset
;
6128 /* Now build the stub. */
6130 for (ent
= stub_entry
->h
->elf
.plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
6131 if (ent
->addend
== stub_entry
->addend
)
6133 off
= ent
->plt
.offset
;
6136 if (off
>= (bfd_vma
) -2)
6139 off
&= ~ (bfd_vma
) 1;
6140 off
+= (htab
->plt
->output_offset
6141 + htab
->plt
->output_section
->vma
6142 - elf_gp (htab
->plt
->output_section
->owner
)
6143 - htab
->stub_group
[stub_entry
->id_sec
->id
].toc_off
);
6145 if (off
+ 0x80008000 > 0xffffffff || (off
& 7) != 0)
6147 (*_bfd_error_handler
)
6148 (_("linkage table error against `%s'"),
6149 stub_entry
->h
->elf
.root
.root
.string
);
6150 bfd_set_error (bfd_error_bad_value
);
6151 htab
->stub_error
= TRUE
;
6155 p
= build_plt_stub (stub_bfd
, loc
, off
);
6164 stub_sec
->_cooked_size
+= size
;
6168 /* As above, but don't actually build the stub. Just bump offset so
6169 we know stub section sizes, and select plt_branch stubs where
6170 long_branch stubs won't do. */
6173 ppc_size_one_stub (struct bfd_hash_entry
*gen_entry
, void *in_arg
)
6175 struct ppc_stub_hash_entry
*stub_entry
;
6176 struct ppc_link_hash_table
*htab
;
6180 /* Massage our args to the form they really have. */
6181 stub_entry
= (struct ppc_stub_hash_entry
*) gen_entry
;
6184 if (stub_entry
->stub_type
== ppc_stub_plt_call
)
6186 struct plt_entry
*ent
;
6188 for (ent
= stub_entry
->h
->elf
.plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
6189 if (ent
->addend
== stub_entry
->addend
)
6191 off
= ent
->plt
.offset
& ~(bfd_vma
) 1;
6194 if (off
>= (bfd_vma
) -2)
6196 off
+= (htab
->plt
->output_offset
6197 + htab
->plt
->output_section
->vma
6198 - elf_gp (htab
->plt
->output_section
->owner
)
6199 - htab
->stub_group
[stub_entry
->id_sec
->id
].toc_off
);
6201 size
= PLT_CALL_STUB_SIZE
;
6202 if (PPC_HA (off
+ 16) != PPC_HA (off
))
6207 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
6209 off
= (stub_entry
->target_value
6210 + stub_entry
->target_section
->output_offset
6211 + stub_entry
->target_section
->output_section
->vma
);
6212 off
-= (stub_entry
->stub_sec
->_raw_size
6213 + stub_entry
->stub_sec
->output_offset
6214 + stub_entry
->stub_sec
->output_section
->vma
);
6216 /* Reset the stub type from the plt variant in case we now
6217 can reach with a shorter stub. */
6218 if (stub_entry
->stub_type
>= ppc_stub_plt_branch
)
6219 stub_entry
->stub_type
+= ppc_stub_long_branch
- ppc_stub_plt_branch
;
6222 if (stub_entry
->stub_type
== ppc_stub_long_branch_r2off
)
6228 /* If the branch offset if too big, use a ppc_stub_plt_branch. */
6229 if (off
+ (1 << 25) >= (bfd_vma
) (1 << 26))
6231 struct ppc_branch_hash_entry
*br_entry
;
6233 br_entry
= ppc_branch_hash_lookup (&htab
->branch_hash_table
,
6234 stub_entry
->root
.string
+ 9,
6236 if (br_entry
== NULL
)
6238 (*_bfd_error_handler
) (_("can't build branch stub `%s'"),
6239 stub_entry
->root
.string
+ 9);
6240 htab
->stub_error
= TRUE
;
6244 if (br_entry
->iter
!= htab
->stub_iteration
)
6246 br_entry
->iter
= htab
->stub_iteration
;
6247 br_entry
->offset
= htab
->brlt
->_raw_size
;
6248 htab
->brlt
->_raw_size
+= 8;
6251 stub_entry
->stub_type
+= ppc_stub_plt_branch
- ppc_stub_long_branch
;
6253 if (stub_entry
->stub_type
!= ppc_stub_plt_branch
)
6258 stub_entry
->stub_sec
->_raw_size
+= size
;
6262 /* Set up various things so that we can make a list of input sections
6263 for each output section included in the link. Returns -1 on error,
6264 0 when no stubs will be needed, and 1 on success. */
6267 ppc64_elf_setup_section_lists (bfd
*output_bfd
, struct bfd_link_info
*info
)
6270 int top_id
, top_index
, id
;
6272 asection
**input_list
;
6274 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6276 if (htab
->brlt
== NULL
)
6279 /* Find the top input section id. */
6280 for (input_bfd
= info
->input_bfds
, top_id
= 3;
6282 input_bfd
= input_bfd
->link_next
)
6284 for (section
= input_bfd
->sections
;
6286 section
= section
->next
)
6288 if (top_id
< section
->id
)
6289 top_id
= section
->id
;
6293 htab
->top_id
= top_id
;
6294 amt
= sizeof (struct map_stub
) * (top_id
+ 1);
6295 htab
->stub_group
= bfd_zmalloc (amt
);
6296 if (htab
->stub_group
== NULL
)
6299 /* Set toc_off for com, und, abs and ind sections. */
6300 for (id
= 0; id
< 3; id
++)
6301 htab
->stub_group
[id
].toc_off
= TOC_BASE_OFF
;
6303 elf_gp (output_bfd
) = htab
->toc_curr
= ppc64_elf_toc (output_bfd
);
6305 /* We can't use output_bfd->section_count here to find the top output
6306 section index as some sections may have been removed, and
6307 _bfd_strip_section_from_output doesn't renumber the indices. */
6308 for (section
= output_bfd
->sections
, top_index
= 0;
6310 section
= section
->next
)
6312 if (top_index
< section
->index
)
6313 top_index
= section
->index
;
6316 htab
->top_index
= top_index
;
6317 amt
= sizeof (asection
*) * (top_index
+ 1);
6318 input_list
= bfd_zmalloc (amt
);
6319 htab
->input_list
= input_list
;
6320 if (input_list
== NULL
)
6326 /* The linker repeatedly calls this function for each toc input
6327 section. Group input bfds such that the toc within a group
6328 is less than 64k in size. Will break with cute linker scripts
6329 that play games with dot in the output toc section. */
6332 ppc64_elf_next_toc_section (struct bfd_link_info
*info
, asection
*isec
)
6334 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6336 if (!htab
->no_multi_toc
)
6338 bfd_vma addr
= isec
->output_offset
+ isec
->output_section
->vma
;
6339 bfd_vma off
= addr
- htab
->toc_curr
;
6340 if (off
+ isec
->_raw_size
> 0x10000)
6342 htab
->toc_curr
= addr
;
6343 htab
->multi_toc_needed
= 1;
6345 elf_gp (isec
->owner
) = (htab
->toc_curr
6346 - elf_gp (isec
->output_section
->owner
)
6351 /* Called after the last call to the above function. */
6354 ppc64_elf_reinit_toc (bfd
*output_bfd ATTRIBUTE_UNUSED
,
6355 struct bfd_link_info
*info
)
6357 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6359 /* toc_curr tracks the TOC offset used for code sections below in
6360 ppc64_elf_next_input_section. Start off at 0x8000. */
6361 htab
->toc_curr
= TOC_BASE_OFF
;
6364 /* No toc references were found in ISEC. If the code in ISEC makes no
6365 calls, then there's no need to use toc adjusting stubs when branching
6366 into ISEC. Actually, indirect calls from ISEC are OK as they will
6370 toc_adjusting_stub_needed (struct bfd_link_info
*info
, asection
*isec
)
6377 /* We know none of our code bearing sections will need toc stubs. */
6378 if ((isec
->flags
& SEC_LINKER_CREATED
) != 0)
6381 /* Hack for linux kernel. .fixup contains branches, but only back to
6382 the function that hit an exception. */
6383 branch_ok
= strcmp (isec
->name
, ".fixup") == 0;
6385 contents
= elf_section_data (isec
)->this_hdr
.contents
;
6386 if (contents
== NULL
)
6388 contents
= bfd_malloc (isec
->_raw_size
);
6389 if (contents
== NULL
)
6391 if (! bfd_get_section_contents (isec
->owner
, isec
, contents
,
6392 (file_ptr
) 0, isec
->_raw_size
))
6397 if (info
->keep_memory
)
6398 elf_section_data (isec
)->this_hdr
.contents
= contents
;
6401 /* Code scan, because we don't necessarily have relocs on calls to
6402 static functions. */
6404 for (i
= 0; i
< isec
->_raw_size
; i
+= 4)
6406 unsigned long insn
= bfd_get_32 (isec
->owner
, contents
+ i
);
6407 /* Is this a branch? */
6408 if ((insn
& (0x3f << 26)) == (18 << 26)
6409 /* If branch and link, it's a function call. */
6411 /* Sibling calls use a plain branch. I don't know a way
6412 of deciding whether a branch is really a sibling call. */
6420 if (elf_section_data (isec
)->this_hdr
.contents
!= contents
)
6425 /* The linker repeatedly calls this function for each input section,
6426 in the order that input sections are linked into output sections.
6427 Build lists of input sections to determine groupings between which
6428 we may insert linker stubs. */
6431 ppc64_elf_next_input_section (struct bfd_link_info
*info
, asection
*isec
)
6433 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6436 if ((isec
->output_section
->flags
& SEC_CODE
) != 0
6437 && isec
->output_section
->index
<= htab
->top_index
)
6439 asection
**list
= htab
->input_list
+ isec
->output_section
->index
;
6440 /* Steal the link_sec pointer for our list. */
6441 #define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
6442 /* This happens to make the list in reverse order,
6443 which is what we want. */
6444 PREV_SEC (isec
) = *list
;
6448 /* If a code section has a function that uses the TOC then we need
6449 to use the right TOC (obviously). Also, make sure that .opd gets
6450 the correct TOC value. */
6451 if (isec
->has_gp_reloc
|| (isec
->flags
& SEC_CODE
) == 0)
6453 if (elf_gp (isec
->owner
) != 0)
6454 htab
->toc_curr
= elf_gp (isec
->owner
);
6456 else if ((ret
= toc_adjusting_stub_needed (info
, isec
)) < 0)
6459 isec
->has_gp_reloc
= ret
;
6461 /* Functions that don't use the TOC can belong in any TOC group.
6462 Use the last TOC base. This happens to make _init and _fini
6464 htab
->stub_group
[isec
->id
].toc_off
= htab
->toc_curr
;
6468 /* See whether we can group stub sections together. Grouping stub
6469 sections may result in fewer stubs. More importantly, we need to
6470 put all .init* and .fini* stubs at the beginning of the .init or
6471 .fini output sections respectively, because glibc splits the
6472 _init and _fini functions into multiple parts. Putting a stub in
6473 the middle of a function is not a good idea. */
6476 group_sections (struct ppc_link_hash_table
*htab
,
6477 bfd_size_type stub_group_size
,
6478 bfd_boolean stubs_always_before_branch
)
6480 asection
**list
= htab
->input_list
+ htab
->top_index
;
6483 asection
*tail
= *list
;
6484 while (tail
!= NULL
)
6488 bfd_size_type total
;
6489 bfd_boolean big_sec
;
6493 if (tail
->_cooked_size
)
6494 total
= tail
->_cooked_size
;
6496 total
= tail
->_raw_size
;
6497 big_sec
= total
>= stub_group_size
;
6498 curr_toc
= htab
->stub_group
[tail
->id
].toc_off
;
6500 while ((prev
= PREV_SEC (curr
)) != NULL
6501 && ((total
+= curr
->output_offset
- prev
->output_offset
)
6503 && htab
->stub_group
[prev
->id
].toc_off
== curr_toc
)
6506 /* OK, the size from the start of CURR to the end is less
6507 than stub_group_size and thus can be handled by one stub
6508 section. (or the tail section is itself larger than
6509 stub_group_size, in which case we may be toast.) We
6510 should really be keeping track of the total size of stubs
6511 added here, as stubs contribute to the final output
6512 section size. That's a little tricky, and this way will
6513 only break if stubs added make the total size more than
6514 2^25, ie. for the default stub_group_size, if stubs total
6515 more than 2097152 bytes, or nearly 75000 plt call stubs. */
6518 prev
= PREV_SEC (tail
);
6519 /* Set up this stub group. */
6520 htab
->stub_group
[tail
->id
].link_sec
= curr
;
6522 while (tail
!= curr
&& (tail
= prev
) != NULL
);
6524 /* But wait, there's more! Input sections up to stub_group_size
6525 bytes before the stub section can be handled by it too.
6526 Don't do this if we have a really large section after the
6527 stubs, as adding more stubs increases the chance that
6528 branches may not reach into the stub section. */
6529 if (!stubs_always_before_branch
&& !big_sec
)
6533 && ((total
+= tail
->output_offset
- prev
->output_offset
)
6535 && htab
->stub_group
[prev
->id
].toc_off
== curr_toc
)
6538 prev
= PREV_SEC (tail
);
6539 htab
->stub_group
[tail
->id
].link_sec
= curr
;
6545 while (list
-- != htab
->input_list
);
6546 free (htab
->input_list
);
6550 /* Determine and set the size of the stub section for a final link.
6552 The basic idea here is to examine all the relocations looking for
6553 PC-relative calls to a target that is unreachable with a "bl"
6557 ppc64_elf_size_stubs (bfd
*output_bfd
,
6559 struct bfd_link_info
*info
,
6560 bfd_signed_vma group_size
,
6561 asection
*(*add_stub_section
) (const char *, asection
*),
6562 void (*layout_sections_again
) (void))
6564 bfd_size_type stub_group_size
;
6565 bfd_boolean stubs_always_before_branch
;
6566 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6568 /* Stash our params away. */
6569 htab
->stub_bfd
= stub_bfd
;
6570 htab
->add_stub_section
= add_stub_section
;
6571 htab
->layout_sections_again
= layout_sections_again
;
6572 stubs_always_before_branch
= group_size
< 0;
6574 stub_group_size
= -group_size
;
6576 stub_group_size
= group_size
;
6577 if (stub_group_size
== 1)
6579 /* Default values. */
6580 if (stubs_always_before_branch
)
6582 stub_group_size
= 0x1e00000;
6583 if (htab
->has_14bit_branch
)
6584 stub_group_size
= 0x7800;
6588 stub_group_size
= 0x1c00000;
6589 if (htab
->has_14bit_branch
)
6590 stub_group_size
= 0x7000;
6594 group_sections (htab
, stub_group_size
, stubs_always_before_branch
);
6599 unsigned int bfd_indx
;
6601 bfd_boolean stub_changed
;
6603 htab
->stub_iteration
+= 1;
6604 stub_changed
= FALSE
;
6606 for (input_bfd
= info
->input_bfds
, bfd_indx
= 0;
6608 input_bfd
= input_bfd
->link_next
, bfd_indx
++)
6610 Elf_Internal_Shdr
*symtab_hdr
;
6612 Elf_Internal_Sym
*local_syms
= NULL
;
6614 /* We'll need the symbol table in a second. */
6615 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
6616 if (symtab_hdr
->sh_info
== 0)
6619 /* Walk over each section attached to the input bfd. */
6620 for (section
= input_bfd
->sections
;
6622 section
= section
->next
)
6624 Elf_Internal_Rela
*internal_relocs
, *irelaend
, *irela
;
6626 /* If there aren't any relocs, then there's nothing more
6628 if ((section
->flags
& SEC_RELOC
) == 0
6629 || section
->reloc_count
== 0)
6632 /* If this section is a link-once section that will be
6633 discarded, then don't create any stubs. */
6634 if (section
->output_section
== NULL
6635 || section
->output_section
->owner
!= output_bfd
)
6638 /* Get the relocs. */
6640 = _bfd_elf_link_read_relocs (input_bfd
, section
, NULL
, NULL
,
6642 if (internal_relocs
== NULL
)
6643 goto error_ret_free_local
;
6645 /* Now examine each relocation. */
6646 irela
= internal_relocs
;
6647 irelaend
= irela
+ section
->reloc_count
;
6648 for (; irela
< irelaend
; irela
++)
6650 enum elf_ppc64_reloc_type r_type
;
6651 unsigned int r_indx
;
6652 enum ppc_stub_type stub_type
;
6653 struct ppc_stub_hash_entry
*stub_entry
;
6656 bfd_vma destination
;
6657 struct ppc_link_hash_entry
*hash
;
6658 struct elf_link_hash_entry
*h
;
6659 Elf_Internal_Sym
*sym
;
6661 const asection
*id_sec
;
6663 r_type
= ELF64_R_TYPE (irela
->r_info
);
6664 r_indx
= ELF64_R_SYM (irela
->r_info
);
6666 if (r_type
>= R_PPC64_max
)
6668 bfd_set_error (bfd_error_bad_value
);
6669 goto error_ret_free_internal
;
6672 /* Only look for stubs on branch instructions. */
6673 if (r_type
!= R_PPC64_REL24
6674 && r_type
!= R_PPC64_REL14
6675 && r_type
!= R_PPC64_REL14_BRTAKEN
6676 && r_type
!= R_PPC64_REL14_BRNTAKEN
)
6679 /* Now determine the call target, its name, value,
6682 if (!get_sym_h (&h
, &sym
, &sym_sec
, NULL
, &local_syms
,
6684 goto error_ret_free_internal
;
6685 hash
= (struct ppc_link_hash_entry
*) h
;
6689 /* It's a local symbol. */
6690 sym_value
= sym
->st_value
;
6691 destination
= (sym_value
+ irela
->r_addend
6692 + sym_sec
->output_offset
6693 + sym_sec
->output_section
->vma
);
6697 /* It's an external symbol. */
6699 if (hash
->elf
.root
.type
== bfd_link_hash_defined
6700 || hash
->elf
.root
.type
== bfd_link_hash_defweak
)
6702 sym_value
= hash
->elf
.root
.u
.def
.value
;
6703 if (sym_sec
->output_section
!= NULL
)
6704 destination
= (sym_value
+ irela
->r_addend
6705 + sym_sec
->output_offset
6706 + sym_sec
->output_section
->vma
);
6708 else if (hash
->elf
.root
.type
== bfd_link_hash_undefweak
)
6710 else if (hash
->elf
.root
.type
== bfd_link_hash_undefined
)
6714 bfd_set_error (bfd_error_bad_value
);
6715 goto error_ret_free_internal
;
6719 /* Determine what (if any) linker stub is needed. */
6720 stub_type
= ppc_type_of_stub (section
, irela
, &hash
,
6723 if (stub_type
!= ppc_stub_plt_call
)
6725 /* Check whether we need a TOC adjusting stub.
6726 Since the linker pastes together pieces from
6727 different object files when creating the
6728 _init and _fini functions, it may be that a
6729 call to what looks like a local sym is in
6730 fact a call needing a TOC adjustment. */
6732 && sym_sec
->output_section
!= NULL
6733 && (htab
->stub_group
[sym_sec
->id
].toc_off
6734 != htab
->stub_group
[section
->id
].toc_off
)
6735 && sym_sec
->has_gp_reloc
6736 && section
->has_gp_reloc
)
6737 stub_type
= ppc_stub_long_branch_r2off
;
6740 if (stub_type
== ppc_stub_none
)
6743 /* __tls_get_addr calls might be eliminated. */
6744 if (stub_type
!= ppc_stub_plt_call
6746 && &hash
->elf
== htab
->tls_get_addr
6747 && section
->has_tls_reloc
6748 && irela
!= internal_relocs
)
6753 if (!get_tls_mask (&tls_mask
, &local_syms
,
6754 irela
- 1, input_bfd
))
6755 goto error_ret_free_internal
;
6760 /* Support for grouping stub sections. */
6761 id_sec
= htab
->stub_group
[section
->id
].link_sec
;
6763 /* Get the name of this stub. */
6764 stub_name
= ppc_stub_name (id_sec
, sym_sec
, hash
, irela
);
6766 goto error_ret_free_internal
;
6768 stub_entry
= ppc_stub_hash_lookup (&htab
->stub_hash_table
,
6769 stub_name
, FALSE
, FALSE
);
6770 if (stub_entry
!= NULL
)
6772 /* The proper stub has already been created. */
6777 stub_entry
= ppc_add_stub (stub_name
, section
, htab
);
6778 if (stub_entry
== NULL
)
6781 error_ret_free_internal
:
6782 if (elf_section_data (section
)->relocs
== NULL
)
6783 free (internal_relocs
);
6784 error_ret_free_local
:
6785 if (local_syms
!= NULL
6786 && (symtab_hdr
->contents
6787 != (unsigned char *) local_syms
))
6792 stub_entry
->stub_type
= stub_type
;
6793 stub_entry
->target_value
= sym_value
;
6794 stub_entry
->target_section
= sym_sec
;
6795 stub_entry
->h
= hash
;
6796 stub_entry
->addend
= irela
->r_addend
;
6797 stub_changed
= TRUE
;
6800 /* We're done with the internal relocs, free them. */
6801 if (elf_section_data (section
)->relocs
!= internal_relocs
)
6802 free (internal_relocs
);
6805 if (local_syms
!= NULL
6806 && symtab_hdr
->contents
!= (unsigned char *) local_syms
)
6808 if (!info
->keep_memory
)
6811 symtab_hdr
->contents
= (unsigned char *) local_syms
;
6818 /* OK, we've added some stubs. Find out the new size of the
6820 for (stub_sec
= htab
->stub_bfd
->sections
;
6822 stub_sec
= stub_sec
->next
)
6824 stub_sec
->_raw_size
= 0;
6825 stub_sec
->_cooked_size
= 0;
6827 htab
->brlt
->_raw_size
= 0;
6828 htab
->brlt
->_cooked_size
= 0;
6830 bfd_hash_traverse (&htab
->stub_hash_table
, ppc_size_one_stub
, htab
);
6832 /* Ask the linker to do its stuff. */
6833 (*htab
->layout_sections_again
) ();
6836 /* It would be nice to strip .branch_lt from the output if the
6837 section is empty, but it's too late. If we strip sections here,
6838 the dynamic symbol table is corrupted since the section symbol
6839 for the stripped section isn't written. */
6844 /* Called after we have determined section placement. If sections
6845 move, we'll be called again. Provide a value for TOCstart. */
6848 ppc64_elf_toc (bfd
*obfd
)
6853 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
6854 order. The TOC starts where the first of these sections starts. */
6855 s
= bfd_get_section_by_name (obfd
, ".got");
6857 s
= bfd_get_section_by_name (obfd
, ".toc");
6859 s
= bfd_get_section_by_name (obfd
, ".tocbss");
6861 s
= bfd_get_section_by_name (obfd
, ".plt");
6864 /* This may happen for
6865 o references to TOC base (SYM@toc / TOC[tc0]) without a
6868 o --gc-sections and empty TOC sections
6870 FIXME: Warn user? */
6872 /* Look for a likely section. We probably won't even be
6874 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
6875 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
| SEC_READONLY
))
6876 == (SEC_ALLOC
| SEC_SMALL_DATA
))
6879 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
6880 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
))
6881 == (SEC_ALLOC
| SEC_SMALL_DATA
))
6884 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
6885 if ((s
->flags
& (SEC_ALLOC
| SEC_READONLY
)) == SEC_ALLOC
)
6888 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
6889 if ((s
->flags
& SEC_ALLOC
) == SEC_ALLOC
)
6895 TOCstart
= s
->output_section
->vma
+ s
->output_offset
;
6900 /* Build all the stubs associated with the current output file.
6901 The stubs are kept in a hash table attached to the main linker
6902 hash table. This function is called via gldelf64ppc_finish. */
6905 ppc64_elf_build_stubs (bfd_boolean emit_stub_syms
,
6906 struct bfd_link_info
*info
,
6909 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
6913 htab
->emit_stub_syms
= emit_stub_syms
;
6914 for (stub_sec
= htab
->stub_bfd
->sections
;
6916 stub_sec
= stub_sec
->next
)
6920 /* Allocate memory to hold the linker stubs. */
6921 size
= stub_sec
->_raw_size
;
6924 stub_sec
->contents
= bfd_zalloc (htab
->stub_bfd
, size
);
6925 if (stub_sec
->contents
== NULL
)
6928 stub_sec
->_cooked_size
= 0;
6931 if (htab
->plt
!= NULL
)
6936 /* Build the .glink plt call stub. */
6937 plt0
= (htab
->plt
->output_section
->vma
6938 + htab
->plt
->output_offset
6939 - (htab
->glink
->output_section
->vma
6940 + htab
->glink
->output_offset
6941 + GLINK_CALL_STUB_SIZE
));
6942 if (plt0
+ 0x80008000 > 0xffffffff)
6944 (*_bfd_error_handler
) (_(".glink and .plt too far apart"));
6945 bfd_set_error (bfd_error_bad_value
);
6949 p
= htab
->glink
->contents
;
6950 bfd_put_32 (htab
->glink
->owner
, MFCTR_R12
, p
);
6952 bfd_put_32 (htab
->glink
->owner
, SLDI_R11_R0_3
, p
);
6954 bfd_put_32 (htab
->glink
->owner
, ADDIC_R2_R0_32K
, p
);
6956 bfd_put_32 (htab
->glink
->owner
, SUB_R12_R12_R11
, p
);
6958 bfd_put_32 (htab
->glink
->owner
, SRADI_R2_R2_63
, p
);
6960 bfd_put_32 (htab
->glink
->owner
, SLDI_R11_R0_2
, p
);
6962 bfd_put_32 (htab
->glink
->owner
, AND_R2_R2_R11
, p
);
6964 bfd_put_32 (htab
->glink
->owner
, SUB_R12_R12_R11
, p
);
6966 bfd_put_32 (htab
->glink
->owner
, ADD_R12_R12_R2
, p
);
6968 bfd_put_32 (htab
->glink
->owner
, ADDIS_R12_R12
| PPC_HA (plt0
), p
);
6970 bfd_put_32 (htab
->glink
->owner
, LD_R11_0R12
| PPC_LO (plt0
), p
);
6972 bfd_put_32 (htab
->glink
->owner
, ADDI_R12_R12
| PPC_LO (plt0
), p
);
6974 bfd_put_32 (htab
->glink
->owner
, LD_R2_0R12
| 8, p
);
6976 bfd_put_32 (htab
->glink
->owner
, MTCTR_R11
, p
);
6978 bfd_put_32 (htab
->glink
->owner
, LD_R11_0R12
| 16, p
);
6980 bfd_put_32 (htab
->glink
->owner
, BCTR
, p
);
6983 /* Build the .glink lazy link call stubs. */
6985 while (p
< htab
->glink
->contents
+ htab
->glink
->_raw_size
)
6989 bfd_put_32 (htab
->glink
->owner
, LI_R0_0
| indx
, p
);
6994 bfd_put_32 (htab
->glink
->owner
, LIS_R0_0
| PPC_HI (indx
), p
);
6996 bfd_put_32 (htab
->glink
->owner
, ORI_R0_R0_0
| PPC_LO (indx
), p
);
6999 bfd_put_32 (htab
->glink
->owner
,
7000 B_DOT
| ((htab
->glink
->contents
- p
) & 0x3fffffc), p
);
7004 htab
->glink
->_cooked_size
= p
- htab
->glink
->contents
;
7007 if (htab
->brlt
->_raw_size
!= 0)
7009 htab
->brlt
->contents
= bfd_zalloc (htab
->brlt
->owner
,
7010 htab
->brlt
->_raw_size
);
7011 if (htab
->brlt
->contents
== NULL
)
7015 /* Build the stubs as directed by the stub hash table. */
7016 bfd_hash_traverse (&htab
->stub_hash_table
, ppc_build_one_stub
, info
);
7018 for (stub_sec
= htab
->stub_bfd
->sections
;
7020 stub_sec
= stub_sec
->next
)
7022 if (stub_sec
->_raw_size
!= stub_sec
->_cooked_size
)
7026 if (stub_sec
!= NULL
7027 || htab
->glink
->_raw_size
!= htab
->glink
->_cooked_size
)
7029 htab
->stub_error
= TRUE
;
7030 (*_bfd_error_handler
) (_("stubs don't match calculated size"));
7033 if (htab
->stub_error
)
7038 *stats
= bfd_malloc (500);
7042 sprintf (*stats
, _("linker stubs in %u groups\n"
7045 " long branch %lu\n"
7046 " long toc adj %lu\n"
7048 htab
->stub_bfd
->section_count
,
7049 htab
->stub_count
[ppc_stub_long_branch
- 1],
7050 htab
->stub_count
[ppc_stub_long_branch_r2off
- 1],
7051 htab
->stub_count
[ppc_stub_plt_branch
- 1],
7052 htab
->stub_count
[ppc_stub_plt_branch_r2off
- 1],
7053 htab
->stub_count
[ppc_stub_plt_call
- 1]);
7058 /* The RELOCATE_SECTION function is called by the ELF backend linker
7059 to handle the relocations for a section.
7061 The relocs are always passed as Rela structures; if the section
7062 actually uses Rel structures, the r_addend field will always be
7065 This function is responsible for adjust the section contents as
7066 necessary, and (if using Rela relocs and generating a
7067 relocatable output file) adjusting the reloc addend as
7070 This function does not have to worry about setting the reloc
7071 address or the reloc symbol index.
7073 LOCAL_SYMS is a pointer to the swapped in local symbols.
7075 LOCAL_SECTIONS is an array giving the section in the input file
7076 corresponding to the st_shndx field of each local symbol.
7078 The global hash table entry for the global symbols can be found
7079 via elf_sym_hashes (input_bfd).
7081 When generating relocatable output, this function must handle
7082 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
7083 going to be the section symbol corresponding to the output
7084 section, which means that the addend must be adjusted
7088 ppc64_elf_relocate_section (bfd
*output_bfd
,
7089 struct bfd_link_info
*info
,
7091 asection
*input_section
,
7093 Elf_Internal_Rela
*relocs
,
7094 Elf_Internal_Sym
*local_syms
,
7095 asection
**local_sections
)
7097 struct ppc_link_hash_table
*htab
;
7098 Elf_Internal_Shdr
*symtab_hdr
;
7099 struct elf_link_hash_entry
**sym_hashes
;
7100 Elf_Internal_Rela
*rel
;
7101 Elf_Internal_Rela
*relend
;
7102 Elf_Internal_Rela outrel
;
7104 struct got_entry
**local_got_ents
;
7106 bfd_boolean ret
= TRUE
;
7108 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
7109 bfd_boolean is_power4
= FALSE
;
7111 if (info
->relocatable
)
7114 /* Initialize howto table if needed. */
7115 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
7118 htab
= ppc_hash_table (info
);
7119 local_got_ents
= elf_local_got_ents (input_bfd
);
7120 TOCstart
= elf_gp (output_bfd
);
7121 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
7122 sym_hashes
= elf_sym_hashes (input_bfd
);
7123 is_opd
= ppc64_elf_section_data (input_section
)->opd
.adjust
!= NULL
;
7126 relend
= relocs
+ input_section
->reloc_count
;
7127 for (; rel
< relend
; rel
++)
7129 enum elf_ppc64_reloc_type r_type
;
7131 bfd_reloc_status_type r
;
7132 Elf_Internal_Sym
*sym
;
7134 struct elf_link_hash_entry
*h
;
7135 struct elf_link_hash_entry
*fdh
;
7136 const char *sym_name
;
7137 unsigned long r_symndx
;
7138 char tls_mask
, tls_gd
, tls_type
;
7140 bfd_boolean unresolved_reloc
;
7143 struct ppc_stub_hash_entry
*stub_entry
;
7144 bfd_vma max_br_offset
;
7147 r_type
= ELF64_R_TYPE (rel
->r_info
);
7148 r_symndx
= ELF64_R_SYM (rel
->r_info
);
7153 unresolved_reloc
= FALSE
;
7156 if (r_symndx
< symtab_hdr
->sh_info
)
7158 /* It's a local symbol. */
7159 sym
= local_syms
+ r_symndx
;
7160 sec
= local_sections
[r_symndx
];
7161 sym_name
= bfd_elf_local_sym_name (input_bfd
, sym
);
7162 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, sec
, rel
);
7163 if (elf_section_data (sec
) != NULL
)
7165 long *opd_sym_adjust
;
7167 opd_sym_adjust
= ppc64_elf_section_data (sec
)->opd
.adjust
;
7168 if (opd_sym_adjust
!= NULL
&& sym
->st_value
% 24 == 0)
7169 relocation
+= opd_sym_adjust
[sym
->st_value
/ 24];
7174 /* It's a global symbol. */
7175 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
7176 while (h
->root
.type
== bfd_link_hash_indirect
7177 || h
->root
.type
== bfd_link_hash_warning
)
7178 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
7179 sym_name
= h
->root
.root
.string
;
7181 if (h
->root
.type
== bfd_link_hash_defined
7182 || h
->root
.type
== bfd_link_hash_defweak
)
7184 sec
= h
->root
.u
.def
.section
;
7185 if (sec
->output_section
== NULL
)
7186 /* Set a flag that will be cleared later if we find a
7187 relocation value for this symbol. output_section
7188 is typically NULL for symbols satisfied by a shared
7190 unresolved_reloc
= TRUE
;
7192 relocation
= (h
->root
.u
.def
.value
7193 + sec
->output_section
->vma
7194 + sec
->output_offset
);
7196 else if (h
->root
.type
== bfd_link_hash_undefweak
)
7198 else if (info
->shared
7199 && !info
->no_undefined
7200 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
7204 if (! ((*info
->callbacks
->undefined_symbol
)
7205 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
7206 rel
->r_offset
, (!info
->shared
7207 || info
->no_undefined
7208 || ELF_ST_VISIBILITY (h
->other
)))))
7214 /* TLS optimizations. Replace instruction sequences and relocs
7215 based on information we collected in tls_optimize. We edit
7216 RELOCS so that --emit-relocs will output something sensible
7217 for the final instruction stream. */
7220 if (IS_PPC64_TLS_RELOC (r_type
))
7223 tls_mask
= ((struct ppc_link_hash_entry
*) h
)->tls_mask
;
7224 else if (local_got_ents
!= NULL
)
7227 lgot_masks
= (char *) (local_got_ents
+ symtab_hdr
->sh_info
);
7228 tls_mask
= lgot_masks
[r_symndx
];
7232 /* Ensure reloc mapping code below stays sane. */
7233 if (R_PPC64_TOC16_LO_DS
!= R_PPC64_TOC16_DS
+ 1
7234 || R_PPC64_TOC16_LO
!= R_PPC64_TOC16
+ 1
7235 || (R_PPC64_GOT_TLSLD16
& 3) != (R_PPC64_GOT_TLSGD16
& 3)
7236 || (R_PPC64_GOT_TLSLD16_LO
& 3) != (R_PPC64_GOT_TLSGD16_LO
& 3)
7237 || (R_PPC64_GOT_TLSLD16_HI
& 3) != (R_PPC64_GOT_TLSGD16_HI
& 3)
7238 || (R_PPC64_GOT_TLSLD16_HA
& 3) != (R_PPC64_GOT_TLSGD16_HA
& 3)
7239 || (R_PPC64_GOT_TLSLD16
& 3) != (R_PPC64_GOT_TPREL16_DS
& 3)
7240 || (R_PPC64_GOT_TLSLD16_LO
& 3) != (R_PPC64_GOT_TPREL16_LO_DS
& 3)
7241 || (R_PPC64_GOT_TLSLD16_HI
& 3) != (R_PPC64_GOT_TPREL16_HI
& 3)
7242 || (R_PPC64_GOT_TLSLD16_HA
& 3) != (R_PPC64_GOT_TPREL16_HA
& 3))
7250 case R_PPC64_TOC16_LO
:
7251 case R_PPC64_TOC16_DS
:
7252 case R_PPC64_TOC16_LO_DS
:
7254 /* Check for toc tls entries. */
7258 retval
= get_tls_mask (&toc_tls
, &local_syms
, rel
, input_bfd
);
7264 tls_mask
= *toc_tls
;
7265 if (r_type
== R_PPC64_TOC16_DS
7266 || r_type
== R_PPC64_TOC16_LO_DS
)
7269 && (tls_mask
& (TLS_DTPREL
| TLS_TPREL
)) == 0)
7274 /* If we found a GD reloc pair, then we might be
7275 doing a GD->IE transition. */
7278 tls_gd
= TLS_TPRELGD
;
7279 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
7280 goto tls_get_addr_check
;
7282 else if (retval
== 3)
7284 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
7285 goto tls_get_addr_check
;
7292 case R_PPC64_GOT_TPREL16_DS
:
7293 case R_PPC64_GOT_TPREL16_LO_DS
:
7295 && (tls_mask
& TLS_TPREL
) == 0)
7299 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
- 2);
7301 insn
|= 0x3c0d0000; /* addis 0,13,0 */
7302 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
- 2);
7303 r_type
= R_PPC64_TPREL16_HA
;
7304 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7311 /* Check for toc tls entries. */
7314 if (!get_tls_mask (&toc_tls
, &local_syms
, rel
, input_bfd
))
7318 tls_mask
= *toc_tls
;
7321 && (tls_mask
& TLS_TPREL
) == 0)
7324 insn
= bfd_get_32 (output_bfd
, contents
+ rel
->r_offset
);
7325 if ((insn
& ((0x3f << 26) | (31 << 11)))
7326 == ((31 << 26) | (13 << 11)))
7327 rtra
= insn
& ((1 << 26) - (1 << 16));
7328 else if ((insn
& ((0x3f << 26) | (31 << 16)))
7329 == ((31 << 26) | (13 << 16)))
7330 rtra
= (insn
& (31 << 21)) | ((insn
& (31 << 11)) << 5);
7333 if ((insn
& ((1 << 11) - (1 << 1))) == 266 << 1)
7336 else if ((insn
& (31 << 1)) == 23 << 1
7337 && ((insn
& (31 << 6)) < 14 << 6
7338 || ((insn
& (31 << 6)) >= 16 << 6
7339 && (insn
& (31 << 6)) < 24 << 6)))
7340 /* load and store indexed -> dform. */
7341 insn
= (32 | ((insn
>> 6) & 31)) << 26;
7342 else if ((insn
& (31 << 1)) == 21 << 1
7343 && (insn
& (0x1a << 6)) == 0)
7344 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */
7345 insn
= (((58 | ((insn
>> 6) & 4)) << 26)
7346 | ((insn
>> 6) & 1));
7347 else if ((insn
& (31 << 1)) == 21 << 1
7348 && (insn
& ((1 << 11) - (1 << 1))) == 341 << 1)
7350 insn
= (58 << 26) | 2;
7354 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
7355 r_type
= R_PPC64_TPREL16_LO
;
7356 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7357 /* Was PPC64_TLS which sits on insn boundary, now
7358 PPC64_TPREL16_LO which is at insn+2. */
7363 case R_PPC64_GOT_TLSGD16_HI
:
7364 case R_PPC64_GOT_TLSGD16_HA
:
7365 tls_gd
= TLS_TPRELGD
;
7366 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
7370 case R_PPC64_GOT_TLSLD16_HI
:
7371 case R_PPC64_GOT_TLSLD16_HA
:
7372 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
7375 if ((tls_mask
& tls_gd
) != 0)
7376 r_type
= (((r_type
- (R_PPC64_GOT_TLSGD16
& 3)) & 3)
7377 + R_PPC64_GOT_TPREL16_DS
);
7380 bfd_put_32 (output_bfd
, NOP
, contents
+ rel
->r_offset
);
7382 r_type
= R_PPC64_NONE
;
7384 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7388 case R_PPC64_GOT_TLSGD16
:
7389 case R_PPC64_GOT_TLSGD16_LO
:
7390 tls_gd
= TLS_TPRELGD
;
7391 if (tls_mask
!= 0 && (tls_mask
& TLS_GD
) == 0)
7392 goto tls_get_addr_check
;
7395 case R_PPC64_GOT_TLSLD16
:
7396 case R_PPC64_GOT_TLSLD16_LO
:
7397 if (tls_mask
!= 0 && (tls_mask
& TLS_LD
) == 0)
7400 if (rel
+ 1 < relend
)
7402 enum elf_ppc64_reloc_type r_type2
;
7403 unsigned long r_symndx2
;
7404 struct elf_link_hash_entry
*h2
;
7405 bfd_vma insn1
, insn2
, insn3
;
7408 /* The next instruction should be a call to
7409 __tls_get_addr. Peek at the reloc to be sure. */
7410 r_type2
= ELF64_R_TYPE (rel
[1].r_info
);
7411 r_symndx2
= ELF64_R_SYM (rel
[1].r_info
);
7412 if (r_symndx2
< symtab_hdr
->sh_info
7413 || (r_type2
!= R_PPC64_REL14
7414 && r_type2
!= R_PPC64_REL14_BRTAKEN
7415 && r_type2
!= R_PPC64_REL14_BRNTAKEN
7416 && r_type2
!= R_PPC64_REL24
))
7419 h2
= sym_hashes
[r_symndx2
- symtab_hdr
->sh_info
];
7420 while (h2
->root
.type
== bfd_link_hash_indirect
7421 || h2
->root
.type
== bfd_link_hash_warning
)
7422 h2
= (struct elf_link_hash_entry
*) h2
->root
.u
.i
.link
;
7423 if (h2
== NULL
|| h2
!= htab
->tls_get_addr
)
7426 /* OK, it checks out. Replace the call. */
7427 offset
= rel
[1].r_offset
;
7428 insn1
= bfd_get_32 (output_bfd
,
7429 contents
+ rel
->r_offset
- 2);
7430 insn3
= bfd_get_32 (output_bfd
,
7431 contents
+ offset
+ 4);
7432 if ((tls_mask
& tls_gd
) != 0)
7435 insn1
&= (1 << 26) - (1 << 2);
7436 insn1
|= 58 << 26; /* ld */
7437 insn2
= 0x7c636a14; /* add 3,3,13 */
7438 rel
[1].r_info
= ELF64_R_INFO (r_symndx2
, R_PPC64_NONE
);
7439 if ((tls_mask
& TLS_EXPLICIT
) == 0)
7440 r_type
= (((r_type
- (R_PPC64_GOT_TLSGD16
& 3)) & 3)
7441 + R_PPC64_GOT_TPREL16_DS
);
7443 r_type
+= R_PPC64_TOC16_DS
- R_PPC64_TOC16
;
7444 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7449 insn1
= 0x3c6d0000; /* addis 3,13,0 */
7450 insn2
= 0x38630000; /* addi 3,3,0 */
7453 /* Was an LD reloc. */
7455 rel
->r_addend
= htab
->tls_sec
->vma
+ DTP_OFFSET
;
7456 rel
[1].r_addend
= htab
->tls_sec
->vma
+ DTP_OFFSET
;
7458 r_type
= R_PPC64_TPREL16_HA
;
7459 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7460 rel
[1].r_info
= ELF64_R_INFO (r_symndx
,
7461 R_PPC64_TPREL16_LO
);
7462 rel
[1].r_offset
+= 2;
7465 || insn3
== CROR_151515
|| insn3
== CROR_313131
)
7469 rel
[1].r_offset
+= 4;
7471 bfd_put_32 (output_bfd
, insn1
, contents
+ rel
->r_offset
- 2);
7472 bfd_put_32 (output_bfd
, insn2
, contents
+ offset
);
7473 bfd_put_32 (output_bfd
, insn3
, contents
+ offset
+ 4);
7476 /* We changed the symbol on an LD reloc. Start over
7477 in order to get h, sym, sec etc. right. */
7485 case R_PPC64_DTPMOD64
:
7486 if (rel
+ 1 < relend
7487 && rel
[1].r_info
== ELF64_R_INFO (r_symndx
, R_PPC64_DTPREL64
)
7488 && rel
[1].r_offset
== rel
->r_offset
+ 8)
7490 if ((tls_mask
& TLS_GD
) == 0)
7492 rel
[1].r_info
= ELF64_R_INFO (r_symndx
, R_PPC64_NONE
);
7493 if ((tls_mask
& TLS_TPRELGD
) != 0)
7494 r_type
= R_PPC64_TPREL64
;
7497 bfd_put_64 (output_bfd
, 1, contents
+ rel
->r_offset
);
7498 r_type
= R_PPC64_NONE
;
7500 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7505 if ((tls_mask
& TLS_LD
) == 0)
7507 bfd_put_64 (output_bfd
, 1, contents
+ rel
->r_offset
);
7508 r_type
= R_PPC64_NONE
;
7509 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7514 case R_PPC64_TPREL64
:
7515 if ((tls_mask
& TLS_TPREL
) == 0)
7517 r_type
= R_PPC64_NONE
;
7518 rel
->r_info
= ELF64_R_INFO (r_symndx
, r_type
);
7523 /* Handle other relocations that tweak non-addend part of insn. */
7530 /* Branch taken prediction relocations. */
7531 case R_PPC64_ADDR14_BRTAKEN
:
7532 case R_PPC64_REL14_BRTAKEN
:
7533 insn
= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
7536 /* Branch not taken prediction relocations. */
7537 case R_PPC64_ADDR14_BRNTAKEN
:
7538 case R_PPC64_REL14_BRNTAKEN
:
7539 insn
|= bfd_get_32 (output_bfd
,
7540 contents
+ rel
->r_offset
) & ~(0x01 << 21);
7543 /* Set 'a' bit. This is 0b00010 in BO field for branch
7544 on CR(BI) insns (BO == 001at or 011at), and 0b01000
7545 for branch on CTR insns (BO == 1a00t or 1a01t). */
7546 if ((insn
& (0x14 << 21)) == (0x04 << 21))
7548 else if ((insn
& (0x14 << 21)) == (0x10 << 21))
7555 from
= (rel
->r_offset
7556 + input_section
->output_offset
7557 + input_section
->output_section
->vma
);
7559 /* Invert 'y' bit if not the default. */
7560 if ((bfd_signed_vma
) (relocation
+ rel
->r_addend
- from
) < 0)
7564 bfd_put_32 (output_bfd
, insn
, contents
+ rel
->r_offset
);
7568 /* Calls to functions with a different TOC, such as calls to
7569 shared objects, need to alter the TOC pointer. This is
7570 done using a linkage stub. A REL24 branching to these
7571 linkage stubs needs to be followed by a nop, as the nop
7572 will be replaced with an instruction to restore the TOC
7575 && (fdh
= ((struct ppc_link_hash_entry
*) h
)->oh
) != NULL
7576 && fdh
->plt
.plist
!= NULL
)
7577 || ((fdh
= h
, sec
) != NULL
7578 && sec
->output_section
!= NULL
7579 && (htab
->stub_group
[sec
->id
].toc_off
7580 != htab
->stub_group
[input_section
->id
].toc_off
)))
7581 && (stub_entry
= ppc_get_stub_entry (input_section
, sec
, fdh
,
7583 && (stub_entry
->stub_type
== ppc_stub_plt_call
7584 || stub_entry
->stub_type
== ppc_stub_plt_branch_r2off
7585 || stub_entry
->stub_type
== ppc_stub_long_branch_r2off
))
7587 bfd_boolean can_plt_call
= 0;
7589 if (rel
->r_offset
+ 8 <= input_section
->_cooked_size
)
7591 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
+ 4);
7593 || insn
== CROR_151515
|| insn
== CROR_313131
)
7595 bfd_put_32 (input_bfd
, LD_R2_40R1
,
7596 contents
+ rel
->r_offset
+ 4);
7603 if (stub_entry
->stub_type
== ppc_stub_plt_call
)
7605 /* If this is a plain branch rather than a branch
7606 and link, don't require a nop. */
7607 insn
= bfd_get_32 (input_bfd
, contents
+ rel
->r_offset
);
7608 if ((insn
& 1) == 0)
7613 if (strcmp (input_section
->output_section
->name
,
7615 || strcmp (input_section
->output_section
->name
,
7617 (*_bfd_error_handler
)
7618 (_("%s(%s+0x%lx): automatic multiple TOCs "
7619 "not supported using your crt files; "
7620 "recompile with -mminimal-toc or upgrade gcc"),
7621 bfd_archive_filename (input_bfd
),
7622 input_section
->name
,
7623 (long) rel
->r_offset
);
7625 (*_bfd_error_handler
)
7626 (_("%s(%s+0x%lx): sibling call optimization to `%s' "
7627 "does not allow automatic multiple TOCs; "
7628 "recompile with -mminimal-toc or "
7629 "-fno-optimize-sibling-calls, "
7630 "or make `%s' extern"),
7631 bfd_archive_filename (input_bfd
),
7632 input_section
->name
,
7633 (long) rel
->r_offset
,
7636 bfd_set_error (bfd_error_bad_value
);
7643 relocation
= (stub_entry
->stub_offset
7644 + stub_entry
->stub_sec
->output_offset
7645 + stub_entry
->stub_sec
->output_section
->vma
);
7646 if (stub_entry
->stub_type
== ppc_stub_plt_call
)
7647 unresolved_reloc
= FALSE
;
7652 && h
->root
.type
== bfd_link_hash_undefweak
7654 && rel
->r_addend
== 0)
7656 /* Tweak calls to undefined weak functions to point at a
7657 blr. We can thus call a weak function without first
7658 checking whether the function is defined. We have a
7659 blr at the end of .sfpr. */
7660 BFD_ASSERT (htab
->sfpr
->_raw_size
!= 0);
7661 relocation
= (htab
->sfpr
->_raw_size
- 4
7662 + htab
->sfpr
->output_offset
7663 + htab
->sfpr
->output_section
->vma
);
7664 from
= (rel
->r_offset
7665 + input_section
->output_offset
7666 + input_section
->output_section
->vma
);
7668 /* But let's not be silly about it. If the blr isn't in
7669 reach, just go to the next instruction. */
7670 if (relocation
- from
+ (1 << 25) >= (1 << 26)
7671 || htab
->sfpr
->_raw_size
== 0)
7672 relocation
= from
+ 4;
7679 addend
= rel
->r_addend
;
7683 (*_bfd_error_handler
)
7684 (_("%s: unknown relocation type %d for symbol %s"),
7685 bfd_archive_filename (input_bfd
), (int) r_type
, sym_name
);
7687 bfd_set_error (bfd_error_bad_value
);
7693 case R_PPC64_GNU_VTINHERIT
:
7694 case R_PPC64_GNU_VTENTRY
:
7697 /* GOT16 relocations. Like an ADDR16 using the symbol's
7698 address in the GOT as relocation value instead of the
7699 symbol's value itself. Also, create a GOT entry for the
7700 symbol and put the symbol value there. */
7701 case R_PPC64_GOT_TLSGD16
:
7702 case R_PPC64_GOT_TLSGD16_LO
:
7703 case R_PPC64_GOT_TLSGD16_HI
:
7704 case R_PPC64_GOT_TLSGD16_HA
:
7705 tls_type
= TLS_TLS
| TLS_GD
;
7708 case R_PPC64_GOT_TLSLD16
:
7709 case R_PPC64_GOT_TLSLD16_LO
:
7710 case R_PPC64_GOT_TLSLD16_HI
:
7711 case R_PPC64_GOT_TLSLD16_HA
:
7712 tls_type
= TLS_TLS
| TLS_LD
;
7715 case R_PPC64_GOT_TPREL16_DS
:
7716 case R_PPC64_GOT_TPREL16_LO_DS
:
7717 case R_PPC64_GOT_TPREL16_HI
:
7718 case R_PPC64_GOT_TPREL16_HA
:
7719 tls_type
= TLS_TLS
| TLS_TPREL
;
7722 case R_PPC64_GOT_DTPREL16_DS
:
7723 case R_PPC64_GOT_DTPREL16_LO_DS
:
7724 case R_PPC64_GOT_DTPREL16_HI
:
7725 case R_PPC64_GOT_DTPREL16_HA
:
7726 tls_type
= TLS_TLS
| TLS_DTPREL
;
7730 case R_PPC64_GOT16_LO
:
7731 case R_PPC64_GOT16_HI
:
7732 case R_PPC64_GOT16_HA
:
7733 case R_PPC64_GOT16_DS
:
7734 case R_PPC64_GOT16_LO_DS
:
7737 /* Relocation is to the entry for this symbol in the global
7741 unsigned long indx
= 0;
7743 if (htab
->got
== NULL
)
7746 if (tls_type
== (TLS_TLS
| TLS_LD
)
7748 || !(h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
)))
7749 offp
= &htab
->tlsld_got
.offset
;
7752 struct got_entry
*ent
;
7756 bfd_boolean dyn
= htab
->elf
.dynamic_sections_created
;
7757 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
->shared
, h
)
7759 && SYMBOL_REFERENCES_LOCAL (info
, h
)))
7760 /* This is actually a static link, or it is a
7761 -Bsymbolic link and the symbol is defined
7762 locally, or the symbol was forced to be local
7763 because of a version file. */
7768 unresolved_reloc
= FALSE
;
7774 if (local_got_ents
== NULL
)
7776 ent
= local_got_ents
[r_symndx
];
7779 for (; ent
!= NULL
; ent
= ent
->next
)
7780 if (ent
->addend
== rel
->r_addend
7781 && ent
->tls_type
== tls_type
)
7785 offp
= &ent
->got
.offset
;
7788 /* The offset must always be a multiple of 8. We use the
7789 least significant bit to record whether we have already
7790 processed this entry. */
7796 /* Generate relocs for the dynamic linker, except in
7797 the case of TLSLD where we'll use one entry per
7800 if ((info
->shared
|| indx
!= 0)
7802 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
7803 || h
->root
.type
!= bfd_link_hash_undefweak
))
7805 outrel
.r_offset
= (htab
->got
->output_section
->vma
7806 + htab
->got
->output_offset
7808 outrel
.r_addend
= rel
->r_addend
;
7809 if (tls_type
& (TLS_LD
| TLS_GD
))
7811 outrel
.r_addend
= 0;
7812 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_DTPMOD64
);
7813 if (tls_type
== (TLS_TLS
| TLS_GD
))
7815 loc
= htab
->relgot
->contents
;
7816 loc
+= (htab
->relgot
->reloc_count
++
7817 * sizeof (Elf64_External_Rela
));
7818 bfd_elf64_swap_reloca_out (output_bfd
,
7820 outrel
.r_offset
+= 8;
7821 outrel
.r_addend
= rel
->r_addend
;
7823 = ELF64_R_INFO (indx
, R_PPC64_DTPREL64
);
7826 else if (tls_type
== (TLS_TLS
| TLS_DTPREL
))
7827 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_DTPREL64
);
7828 else if (tls_type
== (TLS_TLS
| TLS_TPREL
))
7829 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_TPREL64
);
7832 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_RELATIVE
);
7834 /* Write the .got section contents for the sake
7836 loc
= htab
->got
->contents
+ off
;
7837 bfd_put_64 (output_bfd
, outrel
.r_addend
+ relocation
,
7841 outrel
.r_info
= ELF64_R_INFO (indx
, R_PPC64_GLOB_DAT
);
7843 if (indx
== 0 && tls_type
!= (TLS_TLS
| TLS_LD
))
7845 outrel
.r_addend
+= relocation
;
7846 if (tls_type
& (TLS_GD
| TLS_DTPREL
| TLS_TPREL
))
7847 outrel
.r_addend
-= htab
->tls_sec
->vma
;
7849 loc
= htab
->relgot
->contents
;
7850 loc
+= (htab
->relgot
->reloc_count
++
7851 * sizeof (Elf64_External_Rela
));
7852 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
7855 /* Init the .got section contents here if we're not
7856 emitting a reloc. */
7859 relocation
+= rel
->r_addend
;
7860 if (tls_type
== (TLS_TLS
| TLS_LD
))
7862 else if (tls_type
!= 0)
7864 relocation
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
7865 if (tls_type
== (TLS_TLS
| TLS_TPREL
))
7866 relocation
+= DTP_OFFSET
- TP_OFFSET
;
7868 if (tls_type
== (TLS_TLS
| TLS_GD
))
7870 bfd_put_64 (output_bfd
, relocation
,
7871 htab
->got
->contents
+ off
+ 8);
7876 bfd_put_64 (output_bfd
, relocation
,
7877 htab
->got
->contents
+ off
);
7881 if (off
>= (bfd_vma
) -2)
7884 relocation
= htab
->got
->output_offset
+ off
;
7886 /* TOC base (r2) is TOC start plus 0x8000. */
7887 addend
= - TOC_BASE_OFF
;
7891 case R_PPC64_PLT16_HA
:
7892 case R_PPC64_PLT16_HI
:
7893 case R_PPC64_PLT16_LO
:
7896 /* Relocation is to the entry for this symbol in the
7897 procedure linkage table. */
7899 /* Resolve a PLT reloc against a local symbol directly,
7900 without using the procedure linkage table. */
7904 /* It's possible that we didn't make a PLT entry for this
7905 symbol. This happens when statically linking PIC code,
7906 or when using -Bsymbolic. Go find a match if there is a
7908 if (htab
->plt
!= NULL
)
7910 struct plt_entry
*ent
;
7911 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
7912 if (ent
->addend
== rel
->r_addend
7913 && ent
->plt
.offset
!= (bfd_vma
) -1)
7915 relocation
= (htab
->plt
->output_section
->vma
7916 + htab
->plt
->output_offset
7918 unresolved_reloc
= FALSE
;
7924 /* Relocation value is TOC base. */
7925 relocation
= TOCstart
;
7927 relocation
+= htab
->stub_group
[input_section
->id
].toc_off
;
7928 else if (sec
!= NULL
&& !unresolved_reloc
)
7929 relocation
+= htab
->stub_group
[sec
->id
].toc_off
;
7931 unresolved_reloc
= TRUE
;
7934 /* TOC16 relocs. We want the offset relative to the TOC base,
7935 which is the address of the start of the TOC plus 0x8000.
7936 The TOC consists of sections .got, .toc, .tocbss, and .plt,
7939 case R_PPC64_TOC16_LO
:
7940 case R_PPC64_TOC16_HI
:
7941 case R_PPC64_TOC16_DS
:
7942 case R_PPC64_TOC16_LO_DS
:
7943 case R_PPC64_TOC16_HA
:
7944 addend
-= TOCstart
+ htab
->stub_group
[input_section
->id
].toc_off
;
7947 /* Relocate against the beginning of the section. */
7948 case R_PPC64_SECTOFF
:
7949 case R_PPC64_SECTOFF_LO
:
7950 case R_PPC64_SECTOFF_HI
:
7951 case R_PPC64_SECTOFF_DS
:
7952 case R_PPC64_SECTOFF_LO_DS
:
7953 case R_PPC64_SECTOFF_HA
:
7955 addend
-= sec
->output_section
->vma
;
7959 case R_PPC64_REL14_BRNTAKEN
:
7960 case R_PPC64_REL14_BRTAKEN
:
7964 case R_PPC64_TPREL16
:
7965 case R_PPC64_TPREL16_LO
:
7966 case R_PPC64_TPREL16_HI
:
7967 case R_PPC64_TPREL16_HA
:
7968 case R_PPC64_TPREL16_DS
:
7969 case R_PPC64_TPREL16_LO_DS
:
7970 case R_PPC64_TPREL16_HIGHER
:
7971 case R_PPC64_TPREL16_HIGHERA
:
7972 case R_PPC64_TPREL16_HIGHEST
:
7973 case R_PPC64_TPREL16_HIGHESTA
:
7974 addend
-= htab
->tls_sec
->vma
+ TP_OFFSET
;
7976 /* The TPREL16 relocs shouldn't really be used in shared
7977 libs as they will result in DT_TEXTREL being set, but
7978 support them anyway. */
7982 case R_PPC64_DTPREL16
:
7983 case R_PPC64_DTPREL16_LO
:
7984 case R_PPC64_DTPREL16_HI
:
7985 case R_PPC64_DTPREL16_HA
:
7986 case R_PPC64_DTPREL16_DS
:
7987 case R_PPC64_DTPREL16_LO_DS
:
7988 case R_PPC64_DTPREL16_HIGHER
:
7989 case R_PPC64_DTPREL16_HIGHERA
:
7990 case R_PPC64_DTPREL16_HIGHEST
:
7991 case R_PPC64_DTPREL16_HIGHESTA
:
7992 addend
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
7995 case R_PPC64_DTPMOD64
:
8000 case R_PPC64_TPREL64
:
8001 addend
-= htab
->tls_sec
->vma
+ TP_OFFSET
;
8004 case R_PPC64_DTPREL64
:
8005 addend
-= htab
->tls_sec
->vma
+ DTP_OFFSET
;
8008 /* Relocations that may need to be propagated if this is a
8013 case R_PPC64_ADDR14
:
8014 case R_PPC64_ADDR14_BRNTAKEN
:
8015 case R_PPC64_ADDR14_BRTAKEN
:
8016 case R_PPC64_ADDR16
:
8017 case R_PPC64_ADDR16_DS
:
8018 case R_PPC64_ADDR16_HA
:
8019 case R_PPC64_ADDR16_HI
:
8020 case R_PPC64_ADDR16_HIGHER
:
8021 case R_PPC64_ADDR16_HIGHERA
:
8022 case R_PPC64_ADDR16_HIGHEST
:
8023 case R_PPC64_ADDR16_HIGHESTA
:
8024 case R_PPC64_ADDR16_LO
:
8025 case R_PPC64_ADDR16_LO_DS
:
8026 case R_PPC64_ADDR24
:
8027 case R_PPC64_ADDR32
:
8028 case R_PPC64_ADDR64
:
8029 case R_PPC64_UADDR16
:
8030 case R_PPC64_UADDR32
:
8031 case R_PPC64_UADDR64
:
8032 /* r_symndx will be zero only for relocs against symbols
8033 from removed linkonce sections, or sections discarded by
8041 if ((input_section
->flags
& SEC_ALLOC
) == 0)
8044 if (NO_OPD_RELOCS
&& is_opd
)
8049 || ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
8050 || h
->root
.type
!= bfd_link_hash_undefweak
)
8051 && (MUST_BE_DYN_RELOC (r_type
)
8053 && !SYMBOL_CALLS_LOCAL (info
, h
))))
8054 || (ELIMINATE_COPY_RELOCS
8058 && (h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
8059 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
8060 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0))
8062 Elf_Internal_Rela outrel
;
8063 bfd_boolean skip
, relocate
;
8068 /* When generating a dynamic object, these relocations
8069 are copied into the output file to be resolved at run
8075 out_off
= _bfd_elf_section_offset (output_bfd
, info
,
8076 input_section
, rel
->r_offset
);
8077 if (out_off
== (bfd_vma
) -1)
8079 else if (out_off
== (bfd_vma
) -2)
8080 skip
= TRUE
, relocate
= TRUE
;
8081 out_off
+= (input_section
->output_section
->vma
8082 + input_section
->output_offset
);
8083 outrel
.r_offset
= out_off
;
8084 outrel
.r_addend
= rel
->r_addend
;
8086 /* Optimize unaligned reloc use. */
8087 if ((r_type
== R_PPC64_ADDR64
&& (out_off
& 7) != 0)
8088 || (r_type
== R_PPC64_UADDR64
&& (out_off
& 7) == 0))
8089 r_type
^= R_PPC64_ADDR64
^ R_PPC64_UADDR64
;
8090 else if ((r_type
== R_PPC64_ADDR32
&& (out_off
& 3) != 0)
8091 || (r_type
== R_PPC64_UADDR32
&& (out_off
& 3) == 0))
8092 r_type
^= R_PPC64_ADDR32
^ R_PPC64_UADDR32
;
8093 else if ((r_type
== R_PPC64_ADDR16
&& (out_off
& 1) != 0)
8094 || (r_type
== R_PPC64_UADDR16
&& (out_off
& 1) == 0))
8095 r_type
^= R_PPC64_ADDR16
^ R_PPC64_UADDR16
;
8098 memset (&outrel
, 0, sizeof outrel
);
8100 && !SYMBOL_REFERENCES_LOCAL (info
, h
)
8102 && r_type
!= R_PPC64_TOC
)
8103 outrel
.r_info
= ELF64_R_INFO (h
->dynindx
, r_type
);
8106 /* This symbol is local, or marked to become local,
8107 or this is an opd section reloc which must point
8108 at a local function. */
8109 outrel
.r_addend
+= relocation
;
8110 if (r_type
== R_PPC64_ADDR64
|| r_type
== R_PPC64_TOC
)
8112 if (is_opd
&& h
!= NULL
)
8114 /* Lie about opd entries. This case occurs
8115 when building shared libraries and we
8116 reference a function in another shared
8117 lib. The same thing happens for a weak
8118 definition in an application that's
8119 overridden by a strong definition in a
8120 shared lib. (I believe this is a generic
8121 bug in binutils handling of weak syms.)
8122 In these cases we won't use the opd
8123 entry in this lib. */
8124 unresolved_reloc
= FALSE
;
8126 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
8128 /* We need to relocate .opd contents for ld.so.
8129 Prelink also wants simple and consistent rules
8130 for relocs. This make all RELATIVE relocs have
8131 *r_offset equal to r_addend. */
8138 if (bfd_is_abs_section (sec
))
8140 else if (sec
== NULL
|| sec
->owner
== NULL
)
8142 bfd_set_error (bfd_error_bad_value
);
8149 osec
= sec
->output_section
;
8150 indx
= elf_section_data (osec
)->dynindx
;
8152 /* We are turning this relocation into one
8153 against a section symbol, so subtract out
8154 the output section's address but not the
8155 offset of the input section in the output
8157 outrel
.r_addend
-= osec
->vma
;
8160 outrel
.r_info
= ELF64_R_INFO (indx
, r_type
);
8164 sreloc
= elf_section_data (input_section
)->sreloc
;
8168 loc
= sreloc
->contents
;
8169 loc
+= sreloc
->reloc_count
++ * sizeof (Elf64_External_Rela
);
8170 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
8172 /* If this reloc is against an external symbol, it will
8173 be computed at runtime, so there's no need to do
8174 anything now. However, for the sake of prelink ensure
8175 that the section contents are a known value. */
8178 unresolved_reloc
= FALSE
;
8179 /* The value chosen here is quite arbitrary as ld.so
8180 ignores section contents except for the special
8181 case of .opd where the contents might be accessed
8182 before relocation. Choose zero, as that won't
8183 cause reloc overflow. */
8186 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
8187 to improve backward compatibility with older
8189 if (r_type
== R_PPC64_ADDR64
)
8190 addend
= outrel
.r_addend
;
8191 /* Adjust pc_relative relocs to have zero in *r_offset. */
8192 else if (ppc64_elf_howto_table
[r_type
]->pc_relative
)
8193 addend
= (input_section
->output_section
->vma
8194 + input_section
->output_offset
8201 case R_PPC64_GLOB_DAT
:
8202 case R_PPC64_JMP_SLOT
:
8203 case R_PPC64_RELATIVE
:
8204 /* We shouldn't ever see these dynamic relocs in relocatable
8208 case R_PPC64_PLTGOT16
:
8209 case R_PPC64_PLTGOT16_DS
:
8210 case R_PPC64_PLTGOT16_HA
:
8211 case R_PPC64_PLTGOT16_HI
:
8212 case R_PPC64_PLTGOT16_LO
:
8213 case R_PPC64_PLTGOT16_LO_DS
:
8214 case R_PPC64_PLTREL32
:
8215 case R_PPC64_PLTREL64
:
8216 /* These ones haven't been implemented yet. */
8218 (*_bfd_error_handler
)
8219 (_("%s: relocation %s is not supported for symbol %s."),
8220 bfd_archive_filename (input_bfd
),
8221 ppc64_elf_howto_table
[r_type
]->name
, sym_name
);
8223 bfd_set_error (bfd_error_invalid_operation
);
8228 /* Do any further special processing. */
8234 case R_PPC64_ADDR16_HA
:
8235 case R_PPC64_ADDR16_HIGHERA
:
8236 case R_PPC64_ADDR16_HIGHESTA
:
8237 case R_PPC64_GOT16_HA
:
8238 case R_PPC64_PLTGOT16_HA
:
8239 case R_PPC64_PLT16_HA
:
8240 case R_PPC64_TOC16_HA
:
8241 case R_PPC64_SECTOFF_HA
:
8242 case R_PPC64_TPREL16_HA
:
8243 case R_PPC64_DTPREL16_HA
:
8244 case R_PPC64_GOT_TLSGD16_HA
:
8245 case R_PPC64_GOT_TLSLD16_HA
:
8246 case R_PPC64_GOT_TPREL16_HA
:
8247 case R_PPC64_GOT_DTPREL16_HA
:
8248 case R_PPC64_TPREL16_HIGHER
:
8249 case R_PPC64_TPREL16_HIGHERA
:
8250 case R_PPC64_TPREL16_HIGHEST
:
8251 case R_PPC64_TPREL16_HIGHESTA
:
8252 case R_PPC64_DTPREL16_HIGHER
:
8253 case R_PPC64_DTPREL16_HIGHERA
:
8254 case R_PPC64_DTPREL16_HIGHEST
:
8255 case R_PPC64_DTPREL16_HIGHESTA
:
8256 /* It's just possible that this symbol is a weak symbol
8257 that's not actually defined anywhere. In that case,
8258 'sec' would be NULL, and we should leave the symbol
8259 alone (it will be set to zero elsewhere in the link). */
8261 /* Add 0x10000 if sign bit in 0:15 is set.
8262 Bits 0:15 are not used. */
8266 case R_PPC64_ADDR16_DS
:
8267 case R_PPC64_ADDR16_LO_DS
:
8268 case R_PPC64_GOT16_DS
:
8269 case R_PPC64_GOT16_LO_DS
:
8270 case R_PPC64_PLT16_LO_DS
:
8271 case R_PPC64_SECTOFF_DS
:
8272 case R_PPC64_SECTOFF_LO_DS
:
8273 case R_PPC64_TOC16_DS
:
8274 case R_PPC64_TOC16_LO_DS
:
8275 case R_PPC64_PLTGOT16_DS
:
8276 case R_PPC64_PLTGOT16_LO_DS
:
8277 case R_PPC64_GOT_TPREL16_DS
:
8278 case R_PPC64_GOT_TPREL16_LO_DS
:
8279 case R_PPC64_GOT_DTPREL16_DS
:
8280 case R_PPC64_GOT_DTPREL16_LO_DS
:
8281 case R_PPC64_TPREL16_DS
:
8282 case R_PPC64_TPREL16_LO_DS
:
8283 case R_PPC64_DTPREL16_DS
:
8284 case R_PPC64_DTPREL16_LO_DS
:
8285 insn
= bfd_get_32 (input_bfd
, contents
+ (rel
->r_offset
& ~3));
8287 /* If this reloc is against an lq insn, then the value must be
8288 a multiple of 16. This is somewhat of a hack, but the
8289 "correct" way to do this by defining _DQ forms of all the
8290 _DS relocs bloats all reloc switches in this file. It
8291 doesn't seem to make much sense to use any of these relocs
8292 in data, so testing the insn should be safe. */
8293 if ((insn
& (0x3f << 26)) == (56 << 26))
8295 if (((relocation
+ addend
) & mask
) != 0)
8297 (*_bfd_error_handler
)
8298 (_("%s: error: relocation %s not a multiple of %d"),
8299 bfd_archive_filename (input_bfd
),
8300 ppc64_elf_howto_table
[r_type
]->name
,
8302 bfd_set_error (bfd_error_bad_value
);
8309 case R_PPC64_REL14_BRNTAKEN
:
8310 case R_PPC64_REL14_BRTAKEN
:
8311 max_br_offset
= 1 << 15;
8315 max_br_offset
= 1 << 25;
8318 /* If the branch is out of reach or the TOC register needs
8319 adjusting, then redirect the call to the local stub for
8321 from
= (rel
->r_offset
8322 + input_section
->output_offset
8323 + input_section
->output_section
->vma
);
8324 if ((relocation
+ addend
- from
+ max_br_offset
>= 2 * max_br_offset
8326 && sec
->output_section
!= NULL
8327 && sec
->id
<= htab
->top_id
8328 && (htab
->stub_group
[sec
->id
].toc_off
8329 != htab
->stub_group
[input_section
->id
].toc_off
)))
8330 && (stub_entry
= ppc_get_stub_entry (input_section
, sec
, h
,
8331 rel
, htab
)) != NULL
)
8333 /* Munge up the value and addend so that we call the stub
8334 rather than the procedure directly. */
8335 relocation
= (stub_entry
->stub_offset
8336 + stub_entry
->stub_sec
->output_offset
8337 + stub_entry
->stub_sec
->output_section
->vma
);
8343 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
8344 because such sections are not SEC_ALLOC and thus ld.so will
8345 not process them. */
8346 if (unresolved_reloc
8347 && !((input_section
->flags
& SEC_DEBUGGING
) != 0
8348 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0))
8350 (*_bfd_error_handler
)
8351 (_("%s(%s+0x%lx): unresolvable %s relocation against symbol `%s'"),
8352 bfd_archive_filename (input_bfd
),
8353 bfd_get_section_name (input_bfd
, input_section
),
8354 (long) rel
->r_offset
,
8355 ppc64_elf_howto_table
[(int) r_type
]->name
,
8356 h
->root
.root
.string
);
8360 r
= _bfd_final_link_relocate (ppc64_elf_howto_table
[(int) r_type
],
8368 if (r
!= bfd_reloc_ok
)
8370 if (sym_name
== NULL
)
8371 sym_name
= "(null)";
8372 if (r
== bfd_reloc_overflow
)
8377 && h
->root
.type
== bfd_link_hash_undefweak
8378 && ppc64_elf_howto_table
[r_type
]->pc_relative
)
8380 /* Assume this is a call protected by other code that
8381 detects the symbol is undefined. If this is the case,
8382 we can safely ignore the overflow. If not, the
8383 program is hosed anyway, and a little warning isn't
8389 if (!((*info
->callbacks
->reloc_overflow
)
8390 (info
, sym_name
, ppc64_elf_howto_table
[r_type
]->name
,
8391 rel
->r_addend
, input_bfd
, input_section
, rel
->r_offset
)))
8396 (*_bfd_error_handler
)
8397 (_("%s(%s+0x%lx): %s reloc against `%s': error %d"),
8398 bfd_archive_filename (input_bfd
),
8399 bfd_get_section_name (input_bfd
, input_section
),
8400 (long) rel
->r_offset
,
8401 ppc64_elf_howto_table
[r_type
]->name
,
8412 /* Finish up dynamic symbol handling. We set the contents of various
8413 dynamic sections here. */
8416 ppc64_elf_finish_dynamic_symbol (bfd
*output_bfd
,
8417 struct bfd_link_info
*info
,
8418 struct elf_link_hash_entry
*h
,
8419 Elf_Internal_Sym
*sym
)
8421 struct ppc_link_hash_table
*htab
;
8424 htab
= ppc_hash_table (info
);
8425 dynobj
= htab
->elf
.dynobj
;
8427 if (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
)
8429 struct plt_entry
*ent
;
8430 Elf_Internal_Rela rela
;
8433 for (ent
= h
->plt
.plist
; ent
!= NULL
; ent
= ent
->next
)
8434 if (ent
->plt
.offset
!= (bfd_vma
) -1)
8436 /* This symbol has an entry in the procedure linkage
8437 table. Set it up. */
8439 if (htab
->plt
== NULL
8440 || htab
->relplt
== NULL
8441 || htab
->glink
== NULL
)
8444 /* Create a JMP_SLOT reloc to inform the dynamic linker to
8445 fill in the PLT entry. */
8446 rela
.r_offset
= (htab
->plt
->output_section
->vma
8447 + htab
->plt
->output_offset
8449 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_JMP_SLOT
);
8450 rela
.r_addend
= ent
->addend
;
8452 loc
= htab
->relplt
->contents
;
8453 loc
+= ((ent
->plt
.offset
- PLT_INITIAL_ENTRY_SIZE
) / PLT_ENTRY_SIZE
8454 * sizeof (Elf64_External_Rela
));
8455 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
8459 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
8461 Elf_Internal_Rela rela
;
8464 /* This symbol needs a copy reloc. Set it up. */
8466 if (h
->dynindx
== -1
8467 || (h
->root
.type
!= bfd_link_hash_defined
8468 && h
->root
.type
!= bfd_link_hash_defweak
)
8469 || htab
->relbss
== NULL
)
8472 rela
.r_offset
= (h
->root
.u
.def
.value
8473 + h
->root
.u
.def
.section
->output_section
->vma
8474 + h
->root
.u
.def
.section
->output_offset
);
8475 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_COPY
);
8477 loc
= htab
->relbss
->contents
;
8478 loc
+= htab
->relbss
->reloc_count
++ * sizeof (Elf64_External_Rela
);
8479 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
8482 /* Mark some specially defined symbols as absolute. */
8483 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0)
8484 sym
->st_shndx
= SHN_ABS
;
8489 /* Used to decide how to sort relocs in an optimal manner for the
8490 dynamic linker, before writing them out. */
8492 static enum elf_reloc_type_class
8493 ppc64_elf_reloc_type_class (const Elf_Internal_Rela
*rela
)
8495 enum elf_ppc64_reloc_type r_type
;
8497 r_type
= ELF64_R_TYPE (rela
->r_info
);
8500 case R_PPC64_RELATIVE
:
8501 return reloc_class_relative
;
8502 case R_PPC64_JMP_SLOT
:
8503 return reloc_class_plt
;
8505 return reloc_class_copy
;
8507 return reloc_class_normal
;
8511 /* Finish up the dynamic sections. */
8514 ppc64_elf_finish_dynamic_sections (bfd
*output_bfd
,
8515 struct bfd_link_info
*info
)
8517 struct ppc_link_hash_table
*htab
;
8521 htab
= ppc_hash_table (info
);
8522 dynobj
= htab
->elf
.dynobj
;
8523 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
8525 if (htab
->elf
.dynamic_sections_created
)
8527 Elf64_External_Dyn
*dyncon
, *dynconend
;
8529 if (sdyn
== NULL
|| htab
->got
== NULL
)
8532 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
8533 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
8534 for (; dyncon
< dynconend
; dyncon
++)
8536 Elf_Internal_Dyn dyn
;
8539 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
8546 case DT_PPC64_GLINK
:
8548 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
8549 /* We stupidly defined DT_PPC64_GLINK to be the start
8550 of glink rather than the first entry point, which is
8551 what ld.so needs, and now have a bigger stub to
8552 support automatic multiple TOCs. */
8553 dyn
.d_un
.d_ptr
+= GLINK_CALL_STUB_SIZE
- 32;
8557 s
= bfd_get_section_by_name (output_bfd
, ".opd");
8560 dyn
.d_un
.d_ptr
= s
->vma
;
8563 case DT_PPC64_OPDSZ
:
8564 s
= bfd_get_section_by_name (output_bfd
, ".opd");
8567 dyn
.d_un
.d_val
= s
->_raw_size
;
8572 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
8577 dyn
.d_un
.d_ptr
= s
->output_section
->vma
+ s
->output_offset
;
8581 dyn
.d_un
.d_val
= htab
->relplt
->_raw_size
;
8585 /* Don't count procedure linkage table relocs in the
8586 overall reloc count. */
8590 dyn
.d_un
.d_val
-= s
->_raw_size
;
8594 /* We may not be using the standard ELF linker script.
8595 If .rela.plt is the first .rela section, we adjust
8596 DT_RELA to not include it. */
8600 if (dyn
.d_un
.d_ptr
!= s
->output_section
->vma
+ s
->output_offset
)
8602 dyn
.d_un
.d_ptr
+= s
->_raw_size
;
8606 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
8610 if (htab
->got
!= NULL
&& htab
->got
->_raw_size
!= 0)
8612 /* Fill in the first entry in the global offset table.
8613 We use it to hold the link-time TOCbase. */
8614 bfd_put_64 (output_bfd
,
8615 elf_gp (output_bfd
) + TOC_BASE_OFF
,
8616 htab
->got
->contents
);
8618 /* Set .got entry size. */
8619 elf_section_data (htab
->got
->output_section
)->this_hdr
.sh_entsize
= 8;
8622 if (htab
->plt
!= NULL
&& htab
->plt
->_raw_size
!= 0)
8624 /* Set .plt entry size. */
8625 elf_section_data (htab
->plt
->output_section
)->this_hdr
.sh_entsize
8632 #include "elf64-target.h"