1 /* PowerPC64-specific support for 64-bit ELF.
2 Copyright 1999, 2000, 2001, 2002 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
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* This file is based on the 64-bit PowerPC ELF ABI. It is also based
23 on the file elf32-ppc.c. */
31 #include "elf64-ppc.h"
33 #define USE_RELA /* we want RELA relocations, not REL. */
36 static void ppc_howto_init
38 static reloc_howto_type
*ppc64_elf_reloc_type_lookup
39 PARAMS ((bfd
*abfd
, bfd_reloc_code_real_type code
));
40 static void ppc64_elf_info_to_howto
41 PARAMS ((bfd
*abfd
, arelent
*cache_ptr
, Elf64_Internal_Rela
*dst
));
42 static bfd_reloc_status_type ppc64_elf_addr16_ha_reloc
43 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
44 static boolean ppc64_elf_set_private_flags
45 PARAMS ((bfd
*, flagword
));
46 static boolean ppc64_elf_merge_private_bfd_data
47 PARAMS ((bfd
*, bfd
*));
48 static boolean ppc64_elf_section_from_shdr
49 PARAMS ((bfd
*, Elf64_Internal_Shdr
*, char *));
50 static struct bfd_hash_entry
*link_hash_newfunc
51 PARAMS ((struct bfd_hash_entry
*, struct bfd_hash_table
*, const char *));
52 static struct bfd_link_hash_table
*ppc64_elf_link_hash_table_create
54 static boolean create_got_section
55 PARAMS ((bfd
*, struct bfd_link_info
*));
56 static boolean ppc64_elf_create_dynamic_sections
57 PARAMS ((bfd
*, struct bfd_link_info
*));
58 static void ppc64_elf_copy_indirect_symbol
59 PARAMS ((struct elf_link_hash_entry
*, struct elf_link_hash_entry
*));
60 static boolean ppc64_elf_check_relocs
61 PARAMS ((bfd
*, struct bfd_link_info
*, asection
*,
62 const Elf_Internal_Rela
*));
63 static asection
* ppc64_elf_gc_mark_hook
64 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
, Elf_Internal_Rela
*rel
,
65 struct elf_link_hash_entry
*h
, Elf_Internal_Sym
*sym
));
66 static boolean ppc64_elf_gc_sweep_hook
67 PARAMS ((bfd
*abfd
, struct bfd_link_info
*info
, asection
*sec
,
68 const Elf_Internal_Rela
*relocs
));
69 static boolean func_desc_adjust
70 PARAMS ((struct elf_link_hash_entry
*, PTR
));
71 static boolean ppc64_elf_func_desc_adjust
72 PARAMS ((bfd
*, struct bfd_link_info
*));
73 static boolean ppc64_elf_adjust_dynamic_symbol
74 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*));
75 static void ppc64_elf_hide_symbol
76 PARAMS ((struct bfd_link_info
*, struct elf_link_hash_entry
*, boolean
));
77 static boolean allocate_dynrelocs
78 PARAMS ((struct elf_link_hash_entry
*, PTR
));
79 static boolean readonly_dynrelocs
80 PARAMS ((struct elf_link_hash_entry
*, PTR
));
81 static enum elf_reloc_type_class ppc64_elf_reloc_type_class
82 PARAMS ((const Elf_Internal_Rela
*));
83 static boolean ppc64_elf_size_dynamic_sections
84 PARAMS ((bfd
*, struct bfd_link_info
*));
85 static bfd_byte
*build_plt_stub
86 PARAMS ((bfd
*, bfd_byte
*, int, int));
87 static boolean build_one_stub
88 PARAMS ((struct elf_link_hash_entry
*, PTR
));
89 static boolean ppc64_elf_fake_sections
90 PARAMS ((bfd
*, Elf64_Internal_Shdr
*, asection
*));
91 static boolean ppc64_elf_relocate_section
92 PARAMS ((bfd
*, struct bfd_link_info
*info
, bfd
*, asection
*, bfd_byte
*,
93 Elf_Internal_Rela
*relocs
, Elf_Internal_Sym
*local_syms
,
95 static boolean ppc64_elf_finish_dynamic_symbol
96 PARAMS ((bfd
*, struct bfd_link_info
*, struct elf_link_hash_entry
*,
98 static boolean ppc64_elf_finish_dynamic_sections
99 PARAMS ((bfd
*, struct bfd_link_info
*));
102 /* Mask to set RA in memory instructions. */
103 #define RA_REGISTER_MASK 0x001f0000
105 /* Value to shift register by to insert RA. */
106 #define RA_REGISTER_SHIFT 16
108 /* The name of the dynamic interpreter. This is put in the .interp
110 #define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
112 /* The size in bytes of an entry in the procedure linkage table. */
113 #define PLT_ENTRY_SIZE 24
115 /* The initial size of the plt reserved for the dynamic linker. */
116 #define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
118 /* TOC base pointers offset from start of TOC. */
119 #define TOC_BASE_OFF (0x8000)
121 /* .plt call stub instructions. */
122 #define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
123 #define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
124 #define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */
125 #define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */
126 #define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */
127 /* ld %r11,xxx+16@l(%r12) */
128 #define BCTR 0x4e800420 /* bctr */
130 /* The normal stub is this size. */
131 #define PLT_CALL_STUB_SIZE (7*4)
133 /* But sometimes the .plt entry crosses a 64k boundary, and we need
134 to adjust the high word with this insn. */
135 #define ADDIS_R12_R12_1 0x3d8c0001 /* addis %r12,%r12,1 */
137 /* The .glink fixup call stub is the same as the .plt call stub, but
138 the first instruction restores r2, and the std is omitted. */
139 #define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
141 /* Always allow this much space. */
142 #define GLINK_CALL_STUB_SIZE (8*4)
145 #define NOP 0x60000000
147 /* .glink entries for the first 32k functions are two instructions. */
148 #define LI_R0_0 0x38000000 /* li %r0,0 */
149 #define B_DOT 0x48000000 /* b . */
151 /* After that, we need two instructions to load the index, followed by
153 #define LIS_R0_0 0x3c000000 /* lis %r0,0 */
154 #define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
156 /* Relocation HOWTO's. */
157 static reloc_howto_type
*ppc64_elf_howto_table
[(int) R_PPC_max
];
159 static reloc_howto_type ppc64_elf_howto_raw
[] = {
160 /* This reloc does nothing. */
161 HOWTO (R_PPC64_NONE
, /* type */
163 2, /* size (0 = byte, 1 = short, 2 = long) */
165 false, /* pc_relative */
167 complain_overflow_bitfield
, /* complain_on_overflow */
168 bfd_elf_generic_reloc
, /* special_function */
169 "R_PPC64_NONE", /* name */
170 false, /* partial_inplace */
173 false), /* pcrel_offset */
175 /* A standard 32 bit relocation. */
176 HOWTO (R_PPC64_ADDR32
, /* type */
178 2, /* size (0 = byte, 1 = short, 2 = long) */
180 false, /* pc_relative */
182 complain_overflow_bitfield
, /* complain_on_overflow */
183 bfd_elf_generic_reloc
, /* special_function */
184 "R_PPC64_ADDR32", /* name */
185 false, /* partial_inplace */
187 0xffffffff, /* dst_mask */
188 false), /* pcrel_offset */
190 /* An absolute 26 bit branch; the lower two bits must be zero.
191 FIXME: we don't check that, we just clear them. */
192 HOWTO (R_PPC64_ADDR24
, /* type */
194 2, /* size (0 = byte, 1 = short, 2 = long) */
196 false, /* pc_relative */
198 complain_overflow_bitfield
, /* complain_on_overflow */
199 bfd_elf_generic_reloc
, /* special_function */
200 "R_PPC64_ADDR24", /* name */
201 false, /* partial_inplace */
203 0x3fffffc, /* dst_mask */
204 false), /* pcrel_offset */
206 /* A standard 16 bit relocation. */
207 HOWTO (R_PPC64_ADDR16
, /* type */
209 1, /* size (0 = byte, 1 = short, 2 = long) */
211 false, /* pc_relative */
213 complain_overflow_bitfield
, /* complain_on_overflow */
214 bfd_elf_generic_reloc
, /* special_function */
215 "R_PPC64_ADDR16", /* name */
216 false, /* partial_inplace */
218 0xffff, /* dst_mask */
219 false), /* pcrel_offset */
221 /* A 16 bit relocation without overflow. */
222 HOWTO (R_PPC64_ADDR16_LO
, /* type */
224 1, /* size (0 = byte, 1 = short, 2 = long) */
226 false, /* pc_relative */
228 complain_overflow_dont
,/* complain_on_overflow */
229 bfd_elf_generic_reloc
, /* special_function */
230 "R_PPC64_ADDR16_LO", /* name */
231 false, /* partial_inplace */
233 0xffff, /* dst_mask */
234 false), /* pcrel_offset */
236 /* Bits 16-31 of an address. */
237 HOWTO (R_PPC64_ADDR16_HI
, /* type */
239 1, /* size (0 = byte, 1 = short, 2 = long) */
241 false, /* pc_relative */
243 complain_overflow_dont
, /* complain_on_overflow */
244 bfd_elf_generic_reloc
, /* special_function */
245 "R_PPC64_ADDR16_HI", /* name */
246 false, /* partial_inplace */
248 0xffff, /* dst_mask */
249 false), /* pcrel_offset */
251 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
252 bits, treated as a signed number, is negative. */
253 HOWTO (R_PPC64_ADDR16_HA
, /* type */
255 1, /* size (0 = byte, 1 = short, 2 = long) */
257 false, /* pc_relative */
259 complain_overflow_dont
, /* complain_on_overflow */
260 ppc64_elf_addr16_ha_reloc
, /* special_function */
261 "R_PPC64_ADDR16_HA", /* name */
262 false, /* partial_inplace */
264 0xffff, /* dst_mask */
265 false), /* pcrel_offset */
267 /* An absolute 16 bit branch; the lower two bits must be zero.
268 FIXME: we don't check that, we just clear them. */
269 HOWTO (R_PPC64_ADDR14
, /* type */
271 2, /* size (0 = byte, 1 = short, 2 = long) */
273 false, /* pc_relative */
275 complain_overflow_bitfield
, /* complain_on_overflow */
276 bfd_elf_generic_reloc
, /* special_function */
277 "R_PPC64_ADDR14", /* name */
278 false, /* partial_inplace */
280 0xfffc, /* dst_mask */
281 false), /* pcrel_offset */
283 /* An absolute 16 bit branch, for which bit 10 should be set to
284 indicate that the branch is expected to be taken. The lower two
285 bits must be zero. */
286 HOWTO (R_PPC64_ADDR14_BRTAKEN
, /* type */
288 2, /* size (0 = byte, 1 = short, 2 = long) */
290 false, /* pc_relative */
292 complain_overflow_bitfield
, /* complain_on_overflow */
293 bfd_elf_generic_reloc
, /* special_function */
294 "R_PPC64_ADDR14_BRTAKEN",/* name */
295 false, /* partial_inplace */
297 0xfffc, /* dst_mask */
298 false), /* pcrel_offset */
300 /* An absolute 16 bit branch, for which bit 10 should be set to
301 indicate that the branch is not expected to be taken. The lower
302 two bits must be zero. */
303 HOWTO (R_PPC64_ADDR14_BRNTAKEN
, /* type */
305 2, /* size (0 = byte, 1 = short, 2 = long) */
307 false, /* pc_relative */
309 complain_overflow_bitfield
, /* complain_on_overflow */
310 bfd_elf_generic_reloc
, /* special_function */
311 "R_PPC64_ADDR14_BRNTAKEN",/* name */
312 false, /* partial_inplace */
314 0xfffc, /* dst_mask */
315 false), /* pcrel_offset */
317 /* A relative 26 bit branch; the lower two bits must be zero. */
318 HOWTO (R_PPC64_REL24
, /* type */
320 2, /* size (0 = byte, 1 = short, 2 = long) */
322 true, /* pc_relative */
324 complain_overflow_signed
, /* complain_on_overflow */
325 bfd_elf_generic_reloc
, /* special_function */
326 "R_PPC64_REL24", /* name */
327 false, /* partial_inplace */
329 0x3fffffc, /* dst_mask */
330 true), /* pcrel_offset */
332 /* A relative 16 bit branch; the lower two bits must be zero. */
333 HOWTO (R_PPC64_REL14
, /* type */
335 2, /* size (0 = byte, 1 = short, 2 = long) */
337 true, /* pc_relative */
339 complain_overflow_signed
, /* complain_on_overflow */
340 bfd_elf_generic_reloc
, /* special_function */
341 "R_PPC64_REL14", /* name */
342 false, /* partial_inplace */
344 0xfffc, /* dst_mask */
345 true), /* pcrel_offset */
347 /* A relative 16 bit branch. Bit 10 should be set to indicate that
348 the branch is expected to be taken. The lower two bits must be
350 HOWTO (R_PPC64_REL14_BRTAKEN
, /* type */
352 2, /* size (0 = byte, 1 = short, 2 = long) */
354 true, /* pc_relative */
356 complain_overflow_signed
, /* complain_on_overflow */
357 bfd_elf_generic_reloc
, /* special_function */
358 "R_PPC64_REL14_BRTAKEN", /* name */
359 false, /* partial_inplace */
361 0xfffc, /* dst_mask */
362 true), /* pcrel_offset */
364 /* A relative 16 bit branch. Bit 10 should be set to indicate that
365 the branch is not expected to be taken. The lower two bits must
367 HOWTO (R_PPC64_REL14_BRNTAKEN
, /* type */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
371 true, /* pc_relative */
373 complain_overflow_signed
, /* complain_on_overflow */
374 bfd_elf_generic_reloc
, /* special_function */
375 "R_PPC64_REL14_BRNTAKEN",/* name */
376 false, /* partial_inplace */
378 0xfffc, /* dst_mask */
379 true), /* pcrel_offset */
381 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
383 HOWTO (R_PPC64_GOT16
, /* type */
385 1, /* size (0 = byte, 1 = short, 2 = long) */
387 false, /* pc_relative */
389 complain_overflow_signed
, /* complain_on_overflow */
390 bfd_elf_generic_reloc
, /* special_function */
391 "R_PPC64_GOT16", /* name */
392 false, /* partial_inplace */
394 0xffff, /* dst_mask */
395 false), /* pcrel_offset */
397 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
399 HOWTO (R_PPC64_GOT16_LO
, /* type */
401 1, /* size (0 = byte, 1 = short, 2 = long) */
403 false, /* pc_relative */
405 complain_overflow_dont
, /* complain_on_overflow */
406 bfd_elf_generic_reloc
, /* special_function */
407 "R_PPC64_GOT16_LO", /* name */
408 false, /* partial_inplace */
410 0xffff, /* dst_mask */
411 false), /* pcrel_offset */
413 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
415 HOWTO (R_PPC64_GOT16_HI
, /* type */
417 1, /* size (0 = byte, 1 = short, 2 = long) */
419 false, /* pc_relative */
421 complain_overflow_dont
,/* complain_on_overflow */
422 bfd_elf_generic_reloc
, /* special_function */
423 "R_PPC64_GOT16_HI", /* name */
424 false, /* partial_inplace */
426 0xffff, /* dst_mask */
427 false), /* pcrel_offset */
429 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
431 HOWTO (R_PPC64_GOT16_HA
, /* type */
433 1, /* size (0 = byte, 1 = short, 2 = long) */
435 false, /* pc_relative */
437 complain_overflow_dont
,/* complain_on_overflow */
438 ppc64_elf_addr16_ha_reloc
, /* special_function */
439 "R_PPC64_GOT16_HA", /* name */
440 false, /* partial_inplace */
442 0xffff, /* dst_mask */
443 false), /* pcrel_offset */
445 /* This is used only by the dynamic linker. The symbol should exist
446 both in the object being run and in some shared library. The
447 dynamic linker copies the data addressed by the symbol from the
448 shared library into the object, because the object being
449 run has to have the data at some particular address. */
450 HOWTO (R_PPC64_COPY
, /* type */
452 2, /* size (0 = byte, 1 = short, 2 = long) */
454 false, /* pc_relative */
456 complain_overflow_bitfield
, /* complain_on_overflow */
457 bfd_elf_generic_reloc
, /* special_function */
458 "R_PPC64_COPY", /* name */
459 false, /* partial_inplace */
462 false), /* pcrel_offset */
464 /* Like R_PPC64_ADDR64, but used when setting global offset table
466 HOWTO (R_PPC64_GLOB_DAT
, /* type */
468 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
470 false, /* pc_relative */
472 complain_overflow_dont
, /* complain_on_overflow */
473 bfd_elf_generic_reloc
, /* special_function */
474 "R_PPC64_GLOB_DAT", /* name */
475 false, /* partial_inplace */
477 0xffffffffffffffff, /* dst_mask */
478 false), /* pcrel_offset */
480 /* Created by the link editor. Marks a procedure linkage table
481 entry for a symbol. */
482 HOWTO (R_PPC64_JMP_SLOT
, /* type */
484 0, /* size (0 = byte, 1 = short, 2 = long) */
486 false, /* pc_relative */
488 complain_overflow_dont
, /* complain_on_overflow */
489 bfd_elf_generic_reloc
, /* special_function */
490 "R_PPC64_JMP_SLOT", /* name */
491 false, /* partial_inplace */
494 false), /* pcrel_offset */
496 /* Used only by the dynamic linker. When the object is run, this
497 doubleword64 is set to the load address of the object, plus the
499 HOWTO (R_PPC64_RELATIVE
, /* type */
501 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
503 false, /* pc_relative */
505 complain_overflow_dont
, /* complain_on_overflow */
506 bfd_elf_generic_reloc
, /* special_function */
507 "R_PPC64_RELATIVE", /* name */
508 false, /* partial_inplace */
510 0xffffffffffffffff, /* dst_mask */
511 false), /* pcrel_offset */
513 /* Like R_PPC64_ADDR32, but may be unaligned. */
514 HOWTO (R_PPC64_UADDR32
, /* type */
516 2, /* size (0 = byte, 1 = short, 2 = long) */
518 false, /* pc_relative */
520 complain_overflow_bitfield
, /* complain_on_overflow */
521 bfd_elf_generic_reloc
, /* special_function */
522 "R_PPC64_UADDR32", /* name */
523 false, /* partial_inplace */
525 0xffffffff, /* dst_mask */
526 false), /* pcrel_offset */
528 /* Like R_PPC64_ADDR16, but may be unaligned. */
529 HOWTO (R_PPC64_UADDR16
, /* type */
531 1, /* size (0 = byte, 1 = short, 2 = long) */
533 false, /* pc_relative */
535 complain_overflow_bitfield
, /* complain_on_overflow */
536 bfd_elf_generic_reloc
, /* special_function */
537 "R_PPC64_UADDR16", /* name */
538 false, /* partial_inplace */
540 0xffff, /* dst_mask */
541 false), /* pcrel_offset */
543 /* 32-bit PC relative. */
544 HOWTO (R_PPC64_REL32
, /* type */
546 2, /* size (0 = byte, 1 = short, 2 = long) */
548 true, /* pc_relative */
550 /* FIXME: Verify. Was complain_overflow_bitfield. */
551 complain_overflow_signed
, /* complain_on_overflow */
552 bfd_elf_generic_reloc
, /* special_function */
553 "R_PPC64_REL32", /* name */
554 false, /* partial_inplace */
556 0xffffffff, /* dst_mask */
557 true), /* pcrel_offset */
559 /* 32-bit relocation to the symbol's procedure linkage table. */
560 HOWTO (R_PPC64_PLT32
, /* type */
562 2, /* size (0 = byte, 1 = short, 2 = long) */
564 false, /* pc_relative */
566 complain_overflow_bitfield
, /* complain_on_overflow */
567 bfd_elf_generic_reloc
, /* special_function */
568 "R_PPC64_PLT32", /* name */
569 false, /* partial_inplace */
572 false), /* pcrel_offset */
574 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
575 FIXME: R_PPC64_PLTREL32 not supported. */
576 HOWTO (R_PPC64_PLTREL32
, /* type */
578 2, /* size (0 = byte, 1 = short, 2 = long) */
580 true, /* pc_relative */
582 complain_overflow_signed
, /* complain_on_overflow */
583 bfd_elf_generic_reloc
, /* special_function */
584 "R_PPC64_PLTREL32", /* name */
585 false, /* partial_inplace */
588 true), /* pcrel_offset */
590 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
592 HOWTO (R_PPC64_PLT16_LO
, /* type */
594 1, /* size (0 = byte, 1 = short, 2 = long) */
596 false, /* pc_relative */
598 complain_overflow_dont
, /* complain_on_overflow */
599 bfd_elf_generic_reloc
, /* special_function */
600 "R_PPC64_PLT16_LO", /* name */
601 false, /* partial_inplace */
603 0xffff, /* dst_mask */
604 false), /* pcrel_offset */
606 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
608 HOWTO (R_PPC64_PLT16_HI
, /* type */
610 1, /* size (0 = byte, 1 = short, 2 = long) */
612 false, /* pc_relative */
614 complain_overflow_dont
, /* complain_on_overflow */
615 bfd_elf_generic_reloc
, /* special_function */
616 "R_PPC64_PLT16_HI", /* name */
617 false, /* partial_inplace */
619 0xffff, /* dst_mask */
620 false), /* pcrel_offset */
622 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
624 HOWTO (R_PPC64_PLT16_HA
, /* type */
626 1, /* size (0 = byte, 1 = short, 2 = long) */
628 false, /* pc_relative */
630 complain_overflow_dont
, /* complain_on_overflow */
631 ppc64_elf_addr16_ha_reloc
, /* special_function */
632 "R_PPC64_PLT16_HA", /* name */
633 false, /* partial_inplace */
635 0xffff, /* dst_mask */
636 false), /* pcrel_offset */
638 /* 32-bit section relative relocation. */
639 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and
641 HOWTO (R_PPC64_SECTOFF
, /* type */
643 2, /* size (0 = byte, 1 = short, 2 = long) */
645 true, /* pc_relative */
647 complain_overflow_bitfield
, /* complain_on_overflow */
648 bfd_elf_generic_reloc
, /* special_function */
649 "R_PPC64_SECTOFF", /* name */
650 false, /* partial_inplace */
653 true), /* pcrel_offset */
655 /* 16-bit lower half section relative relocation. */
656 HOWTO (R_PPC64_SECTOFF_LO
, /* type */
658 1, /* size (0 = byte, 1 = short, 2 = long) */
660 false, /* pc_relative */
662 complain_overflow_dont
, /* complain_on_overflow */
663 bfd_elf_generic_reloc
, /* special_function */
664 "R_PPC64_SECTOFF_LO", /* name */
665 false, /* partial_inplace */
667 0xffff, /* dst_mask */
668 false), /* pcrel_offset */
670 /* 16-bit upper half section relative relocation. */
671 HOWTO (R_PPC64_SECTOFF_HI
, /* type */
673 1, /* size (0 = byte, 1 = short, 2 = long) */
675 false, /* pc_relative */
677 complain_overflow_dont
, /* complain_on_overflow */
678 bfd_elf_generic_reloc
, /* special_function */
679 "R_PPC64_SECTOFF_HI", /* name */
680 false, /* partial_inplace */
682 0xffff, /* dst_mask */
683 false), /* pcrel_offset */
685 /* 16-bit upper half adjusted section relative relocation. */
686 HOWTO (R_PPC64_SECTOFF_HA
, /* type */
688 1, /* size (0 = byte, 1 = short, 2 = long) */
690 false, /* pc_relative */
692 complain_overflow_dont
, /* complain_on_overflow */
693 ppc64_elf_addr16_ha_reloc
, /* special_function */
694 "R_PPC64_SECTOFF_HA", /* name */
695 false, /* partial_inplace */
697 0xffff, /* dst_mask */
698 false), /* pcrel_offset */
700 /* Like R_PPC64_REL24 without touching the two least significant
702 /* FIXME: Verify R_PPC64_ADDR30. */
703 HOWTO (R_PPC64_ADDR30
, /* type */
705 2, /* size (0 = byte, 1 = short, 2 = long) */
707 true, /* pc_relative */
709 complain_overflow_dont
, /* complain_on_overflow */
710 bfd_elf_generic_reloc
, /* special_function */
711 "R_PPC64_ADDR30", /* name */
712 false, /* partial_inplace */
714 0xfffffffc, /* dst_mask */
715 true), /* pcrel_offset */
717 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
719 /* A standard 64-bit relocation. */
720 HOWTO (R_PPC64_ADDR64
, /* type */
722 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
724 false, /* pc_relative */
726 complain_overflow_dont
, /* complain_on_overflow */
727 bfd_elf_generic_reloc
, /* special_function */
728 "R_PPC64_ADDR64", /* name */
729 false, /* partial_inplace */
731 0xffffffffffffffff, /* dst_mask */
732 false), /* pcrel_offset */
734 /* The bits 32-47 of an address. */
735 HOWTO (R_PPC64_ADDR16_HIGHER
, /* type */
737 1, /* size (0 = byte, 1 = short, 2 = long) */
739 false, /* pc_relative */
741 complain_overflow_dont
, /* complain_on_overflow */
742 bfd_elf_generic_reloc
, /* special_function */
743 "R_PPC64_ADDR16_HIGHER", /* name */
744 false, /* partial_inplace */
746 0xffff, /* dst_mask */
747 false), /* pcrel_offset */
749 /* The bits 32-47 of an address, plus 1 if the contents of the low
750 16 bits, treated as a signed number, is negative. */
751 HOWTO (R_PPC64_ADDR16_HIGHERA
, /* type */
753 1, /* size (0 = byte, 1 = short, 2 = long) */
755 false, /* pc_relative */
757 complain_overflow_dont
, /* complain_on_overflow */
758 ppc64_elf_addr16_ha_reloc
, /* special_function */
759 "R_PPC64_ADDR16_HIGHERA", /* name */
760 false, /* partial_inplace */
762 0xffff, /* dst_mask */
763 false), /* pcrel_offset */
765 /* The bits 48-63 of an address. */
766 HOWTO (R_PPC64_ADDR16_HIGHEST
,/* type */
768 1, /* size (0 = byte, 1 = short, 2 = long) */
770 false, /* pc_relative */
772 complain_overflow_dont
, /* complain_on_overflow */
773 bfd_elf_generic_reloc
, /* special_function */
774 "R_PPC64_ADDR16_HIGHEST", /* name */
775 false, /* partial_inplace */
777 0xffff, /* dst_mask */
778 false), /* pcrel_offset */
780 /* The bits 48-63 of an address, plus 1 if the contents of the low
781 16 bits, treated as a signed number, is negative. */
782 HOWTO (R_PPC64_ADDR16_HIGHESTA
,/* type */
784 1, /* size (0 = byte, 1 = short, 2 = long) */
786 false, /* pc_relative */
788 complain_overflow_dont
, /* complain_on_overflow */
789 ppc64_elf_addr16_ha_reloc
, /* special_function */
790 "R_PPC64_ADDR16_HIGHESTA", /* name */
791 false, /* partial_inplace */
793 0xffff, /* dst_mask */
794 false), /* pcrel_offset */
796 /* Like ADDR64, but may be unaligned. */
797 HOWTO (R_PPC64_UADDR64
, /* type */
799 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
801 false, /* pc_relative */
803 complain_overflow_dont
, /* complain_on_overflow */
804 bfd_elf_generic_reloc
, /* special_function */
805 "R_PPC64_UADDR64", /* name */
806 false, /* partial_inplace */
808 0xffffffffffffffff, /* dst_mask */
809 false), /* pcrel_offset */
811 /* 64-bit relative relocation. */
812 HOWTO (R_PPC64_REL64
, /* type */
814 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
816 true, /* pc_relative */
818 complain_overflow_dont
, /* complain_on_overflow */
819 bfd_elf_generic_reloc
, /* special_function */
820 "R_PPC64_REL64", /* name */
821 false, /* partial_inplace */
823 0xffffffffffffffff, /* dst_mask */
824 true), /* pcrel_offset */
826 /* 64-bit relocation to the symbol's procedure linkage table. */
827 HOWTO (R_PPC64_PLT64
, /* type */
829 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
831 false, /* pc_relative */
833 complain_overflow_dont
, /* complain_on_overflow */
834 bfd_elf_generic_reloc
, /* special_function */
835 "R_PPC64_PLT64", /* name */
836 false, /* partial_inplace */
839 false), /* pcrel_offset */
841 /* 64-bit PC relative relocation to the symbol's procedure linkage
843 /* FIXME: R_PPC64_PLTREL64 not supported. */
844 HOWTO (R_PPC64_PLTREL64
, /* type */
846 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
848 true, /* pc_relative */
850 complain_overflow_dont
, /* complain_on_overflow */
851 bfd_elf_generic_reloc
, /* special_function */
852 "R_PPC64_PLTREL64", /* name */
853 false, /* partial_inplace */
856 true), /* pcrel_offset */
858 /* 16 bit TOC-relative relocation. */
860 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
861 HOWTO (R_PPC64_TOC16
, /* type */
863 1, /* size (0 = byte, 1 = short, 2 = long) */
865 false, /* pc_relative */
867 complain_overflow_signed
, /* complain_on_overflow */
868 bfd_elf_generic_reloc
, /* special_function */
869 "R_PPC64_TOC16", /* name */
870 false, /* partial_inplace */
872 0xffff, /* dst_mask */
873 false), /* pcrel_offset */
875 /* 16 bit TOC-relative relocation without overflow. */
877 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
878 HOWTO (R_PPC64_TOC16_LO
, /* type */
880 1, /* size (0 = byte, 1 = short, 2 = long) */
882 false, /* pc_relative */
884 complain_overflow_dont
, /* complain_on_overflow */
885 bfd_elf_generic_reloc
, /* special_function */
886 "R_PPC64_TOC16_LO", /* name */
887 false, /* partial_inplace */
889 0xffff, /* dst_mask */
890 false), /* pcrel_offset */
892 /* 16 bit TOC-relative relocation, high 16 bits. */
894 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
895 HOWTO (R_PPC64_TOC16_HI
, /* type */
897 1, /* size (0 = byte, 1 = short, 2 = long) */
899 false, /* pc_relative */
901 complain_overflow_dont
, /* complain_on_overflow */
902 bfd_elf_generic_reloc
, /* special_function */
903 "R_PPC64_TOC16_HI", /* name */
904 false, /* partial_inplace */
906 0xffff, /* dst_mask */
907 false), /* pcrel_offset */
909 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
910 contents of the low 16 bits, treated as a signed number, is
913 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
914 HOWTO (R_PPC64_TOC16_HA
, /* type */
916 1, /* size (0 = byte, 1 = short, 2 = long) */
918 false, /* pc_relative */
920 complain_overflow_dont
, /* complain_on_overflow */
921 ppc64_elf_addr16_ha_reloc
, /* special_function */
922 "R_PPC64_TOC16_HA", /* name */
923 false, /* partial_inplace */
925 0xffff, /* dst_mask */
926 false), /* pcrel_offset */
928 /* 64-bit relocation; insert value of TOC base (.TOC.). */
930 /* R_PPC64_TOC 51 doubleword64 .TOC. */
931 HOWTO (R_PPC64_TOC
, /* type */
933 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
935 false, /* pc_relative */
937 complain_overflow_bitfield
, /* complain_on_overflow */
938 bfd_elf_generic_reloc
, /* special_function */
939 "R_PPC64_TOC", /* name */
940 false, /* partial_inplace */
942 0xffffffffffffffff, /* dst_mask */
943 false), /* pcrel_offset */
945 /* Like R_PPC64_GOT16, but also informs the link editor that the
946 value to relocate may (!) refer to a PLT entry which the link
947 editor (a) may replace with the symbol value. If the link editor
948 is unable to fully resolve the symbol, it may (b) create a PLT
949 entry and store the address to the new PLT entry in the GOT.
950 This permits lazy resolution of function symbols at run time.
951 The link editor may also skip all of this and just (c) emit a
952 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
953 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
954 HOWTO (R_PPC64_PLTGOT16
, /* type */
956 1, /* size (0 = byte, 1 = short, 2 = long) */
958 false, /* pc_relative */
960 complain_overflow_signed
, /* complain_on_overflow */
961 bfd_elf_generic_reloc
, /* special_function */
962 "R_PPC64_PLTGOT16", /* name */
963 false, /* partial_inplace */
965 0xffff, /* dst_mask */
966 false), /* pcrel_offset */
968 /* Like R_PPC64_PLTGOT16, but without overflow. */
969 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
970 HOWTO (R_PPC64_PLTGOT16_LO
, /* type */
972 1, /* size (0 = byte, 1 = short, 2 = long) */
974 false, /* pc_relative */
976 complain_overflow_dont
, /* complain_on_overflow */
977 bfd_elf_generic_reloc
, /* special_function */
978 "R_PPC64_PLTGOT16_LO", /* name */
979 false, /* partial_inplace */
981 0xffff, /* dst_mask */
982 false), /* pcrel_offset */
984 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
985 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
986 HOWTO (R_PPC64_PLTGOT16_HI
, /* type */
988 1, /* size (0 = byte, 1 = short, 2 = long) */
990 false, /* pc_relative */
992 complain_overflow_dont
, /* complain_on_overflow */
993 bfd_elf_generic_reloc
, /* special_function */
994 "R_PPC64_PLTGOT16_HI", /* name */
995 false, /* partial_inplace */
997 0xffff, /* dst_mask */
998 false), /* pcrel_offset */
1000 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1001 1 if the contents of the low 16 bits, treated as a signed number,
1003 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1004 HOWTO (R_PPC64_PLTGOT16_HA
, /* type */
1005 16, /* rightshift */
1006 1, /* size (0 = byte, 1 = short, 2 = long) */
1008 false, /* pc_relative */
1010 complain_overflow_dont
,/* complain_on_overflow */
1011 ppc64_elf_addr16_ha_reloc
, /* special_function */
1012 "R_PPC64_PLTGOT16_HA", /* name */
1013 false, /* partial_inplace */
1015 0xffff, /* dst_mask */
1016 false), /* pcrel_offset */
1018 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1019 HOWTO (R_PPC64_ADDR16_DS
, /* type */
1021 1, /* size (0 = byte, 1 = short, 2 = long) */
1023 false, /* pc_relative */
1025 complain_overflow_bitfield
, /* complain_on_overflow */
1026 bfd_elf_generic_reloc
, /* special_function */
1027 "R_PPC64_ADDR16_DS", /* name */
1028 false, /* partial_inplace */
1030 0xfffc, /* dst_mask */
1031 false), /* pcrel_offset */
1033 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1034 HOWTO (R_PPC64_ADDR16_LO_DS
, /* type */
1036 1, /* size (0 = byte, 1 = short, 2 = long) */
1038 false, /* pc_relative */
1040 complain_overflow_dont
,/* complain_on_overflow */
1041 bfd_elf_generic_reloc
, /* special_function */
1042 "R_PPC64_ADDR16_LO_DS",/* name */
1043 false, /* partial_inplace */
1045 0xfffc, /* dst_mask */
1046 false), /* pcrel_offset */
1048 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1049 HOWTO (R_PPC64_GOT16_DS
, /* type */
1051 1, /* size (0 = byte, 1 = short, 2 = long) */
1053 false, /* pc_relative */
1055 complain_overflow_signed
, /* complain_on_overflow */
1056 bfd_elf_generic_reloc
, /* special_function */
1057 "R_PPC64_GOT16_DS", /* name */
1058 false, /* partial_inplace */
1060 0xfffc, /* dst_mask */
1061 false), /* pcrel_offset */
1063 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1064 HOWTO (R_PPC64_GOT16_LO_DS
, /* type */
1066 1, /* size (0 = byte, 1 = short, 2 = long) */
1068 false, /* pc_relative */
1070 complain_overflow_dont
, /* complain_on_overflow */
1071 bfd_elf_generic_reloc
, /* special_function */
1072 "R_PPC64_GOT16_LO_DS", /* name */
1073 false, /* partial_inplace */
1075 0xfffc, /* dst_mask */
1076 false), /* pcrel_offset */
1078 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1079 HOWTO (R_PPC64_PLT16_LO_DS
, /* type */
1081 1, /* size (0 = byte, 1 = short, 2 = long) */
1083 false, /* pc_relative */
1085 complain_overflow_dont
, /* complain_on_overflow */
1086 bfd_elf_generic_reloc
, /* special_function */
1087 "R_PPC64_PLT16_LO_DS", /* name */
1088 false, /* partial_inplace */
1090 0xfffc, /* dst_mask */
1091 false), /* pcrel_offset */
1093 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1094 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and
1096 HOWTO (R_PPC64_SECTOFF_DS
, /* type */
1098 2, /* size (0 = byte, 1 = short, 2 = long) */
1100 true, /* pc_relative */
1102 complain_overflow_bitfield
, /* complain_on_overflow */
1103 bfd_elf_generic_reloc
, /* special_function */
1104 "R_PPC64_SECTOFF_DS", /* name */
1105 false, /* partial_inplace */
1108 true), /* pcrel_offset */
1110 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1111 HOWTO (R_PPC64_SECTOFF_LO_DS
, /* type */
1113 1, /* size (0 = byte, 1 = short, 2 = long) */
1115 false, /* pc_relative */
1117 complain_overflow_dont
, /* complain_on_overflow */
1118 bfd_elf_generic_reloc
, /* special_function */
1119 "R_PPC64_SECTOFF_LO_DS",/* name */
1120 false, /* partial_inplace */
1122 0xfffc, /* dst_mask */
1123 false), /* pcrel_offset */
1125 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1126 HOWTO (R_PPC64_TOC16_DS
, /* type */
1128 1, /* size (0 = byte, 1 = short, 2 = long) */
1130 false, /* pc_relative */
1132 complain_overflow_signed
, /* complain_on_overflow */
1133 bfd_elf_generic_reloc
, /* special_function */
1134 "R_PPC64_TOC16_DS", /* name */
1135 false, /* partial_inplace */
1137 0xfffc, /* dst_mask */
1138 false), /* pcrel_offset */
1140 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1141 HOWTO (R_PPC64_TOC16_LO_DS
, /* type */
1143 1, /* size (0 = byte, 1 = short, 2 = long) */
1145 false, /* pc_relative */
1147 complain_overflow_dont
, /* complain_on_overflow */
1148 bfd_elf_generic_reloc
, /* special_function */
1149 "R_PPC64_TOC16_LO_DS", /* name */
1150 false, /* partial_inplace */
1152 0xfffc, /* dst_mask */
1153 false), /* pcrel_offset */
1155 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1156 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1157 HOWTO (R_PPC64_PLTGOT16_DS
, /* type */
1159 1, /* size (0 = byte, 1 = short, 2 = long) */
1161 false, /* pc_relative */
1163 complain_overflow_signed
, /* complain_on_overflow */
1164 bfd_elf_generic_reloc
, /* special_function */
1165 "R_PPC64_PLTGOT16_DS", /* name */
1166 false, /* partial_inplace */
1168 0xfffc, /* dst_mask */
1169 false), /* pcrel_offset */
1171 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1172 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1173 HOWTO (R_PPC64_PLTGOT16_LO_DS
,/* type */
1175 1, /* size (0 = byte, 1 = short, 2 = long) */
1177 false, /* pc_relative */
1179 complain_overflow_dont
, /* complain_on_overflow */
1180 bfd_elf_generic_reloc
, /* special_function */
1181 "R_PPC64_PLTGOT16_LO_DS",/* name */
1182 false, /* partial_inplace */
1184 0xfffc, /* dst_mask */
1185 false), /* pcrel_offset */
1187 /* GNU extension to record C++ vtable hierarchy. */
1188 HOWTO (R_PPC64_GNU_VTINHERIT
, /* type */
1190 0, /* size (0 = byte, 1 = short, 2 = long) */
1192 false, /* pc_relative */
1194 complain_overflow_dont
, /* complain_on_overflow */
1195 NULL
, /* special_function */
1196 "R_PPC64_GNU_VTINHERIT", /* name */
1197 false, /* partial_inplace */
1200 false), /* pcrel_offset */
1202 /* GNU extension to record C++ vtable member usage. */
1203 HOWTO (R_PPC64_GNU_VTENTRY
, /* type */
1205 0, /* size (0 = byte, 1 = short, 2 = long) */
1207 false, /* pc_relative */
1209 complain_overflow_dont
, /* complain_on_overflow */
1210 NULL
, /* special_function */
1211 "R_PPC64_GNU_VTENTRY", /* name */
1212 false, /* partial_inplace */
1215 false), /* pcrel_offset */
1219 /* Initialize the ppc64_elf_howto_table, so that linear accesses can
1225 unsigned int i
, type
;
1228 i
< sizeof (ppc64_elf_howto_raw
) / sizeof (ppc64_elf_howto_raw
[0]);
1231 type
= ppc64_elf_howto_raw
[i
].type
;
1232 BFD_ASSERT (type
< (sizeof (ppc64_elf_howto_table
)
1233 / sizeof (ppc64_elf_howto_table
[0])));
1234 ppc64_elf_howto_table
[type
] = &ppc64_elf_howto_raw
[i
];
1238 static reloc_howto_type
*
1239 ppc64_elf_reloc_type_lookup (abfd
, code
)
1240 bfd
*abfd ATTRIBUTE_UNUSED
;
1241 bfd_reloc_code_real_type code
;
1243 enum elf_ppc_reloc_type ppc_reloc
= R_PPC_NONE
;
1245 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
1246 /* Initialize howto table if needed. */
1252 return (reloc_howto_type
*) NULL
;
1254 case BFD_RELOC_NONE
: ppc_reloc
= R_PPC64_NONE
;
1256 case BFD_RELOC_32
: ppc_reloc
= R_PPC64_ADDR32
;
1258 case BFD_RELOC_PPC_BA26
: ppc_reloc
= R_PPC64_ADDR24
;
1260 case BFD_RELOC_16
: ppc_reloc
= R_PPC64_ADDR16
;
1262 case BFD_RELOC_LO16
: ppc_reloc
= R_PPC64_ADDR16_LO
;
1264 case BFD_RELOC_HI16
: ppc_reloc
= R_PPC64_ADDR16_HI
;
1266 case BFD_RELOC_HI16_S
: ppc_reloc
= R_PPC64_ADDR16_HA
;
1268 case BFD_RELOC_PPC_BA16
: ppc_reloc
= R_PPC64_ADDR14
;
1270 case BFD_RELOC_PPC_BA16_BRTAKEN
: ppc_reloc
= R_PPC64_ADDR14_BRTAKEN
;
1272 case BFD_RELOC_PPC_BA16_BRNTAKEN
: ppc_reloc
= R_PPC64_ADDR14_BRNTAKEN
;
1274 case BFD_RELOC_PPC_B26
: ppc_reloc
= R_PPC64_REL24
;
1276 case BFD_RELOC_PPC_B16
: ppc_reloc
= R_PPC64_REL14
;
1278 case BFD_RELOC_PPC_B16_BRTAKEN
: ppc_reloc
= R_PPC64_REL14_BRTAKEN
;
1280 case BFD_RELOC_PPC_B16_BRNTAKEN
: ppc_reloc
= R_PPC64_REL14_BRNTAKEN
;
1282 case BFD_RELOC_16_GOTOFF
: ppc_reloc
= R_PPC64_GOT16
;
1284 case BFD_RELOC_LO16_GOTOFF
: ppc_reloc
= R_PPC64_GOT16_LO
;
1286 case BFD_RELOC_HI16_GOTOFF
: ppc_reloc
= R_PPC64_GOT16_HI
;
1288 case BFD_RELOC_HI16_S_GOTOFF
: ppc_reloc
= R_PPC64_GOT16_HA
;
1290 case BFD_RELOC_PPC_COPY
: ppc_reloc
= R_PPC64_COPY
;
1292 case BFD_RELOC_PPC_GLOB_DAT
: ppc_reloc
= R_PPC64_GLOB_DAT
;
1294 case BFD_RELOC_32_PCREL
: ppc_reloc
= R_PPC64_REL32
;
1296 case BFD_RELOC_32_PLTOFF
: ppc_reloc
= R_PPC64_PLT32
;
1298 case BFD_RELOC_32_PLT_PCREL
: ppc_reloc
= R_PPC64_PLTREL32
;
1300 case BFD_RELOC_LO16_PLTOFF
: ppc_reloc
= R_PPC64_PLT16_LO
;
1302 case BFD_RELOC_HI16_PLTOFF
: ppc_reloc
= R_PPC64_PLT16_HI
;
1304 case BFD_RELOC_HI16_S_PLTOFF
: ppc_reloc
= R_PPC64_PLT16_HA
;
1306 case BFD_RELOC_32_BASEREL
: ppc_reloc
= R_PPC64_SECTOFF
;
1308 case BFD_RELOC_LO16_BASEREL
: ppc_reloc
= R_PPC64_SECTOFF_LO
;
1310 case BFD_RELOC_HI16_BASEREL
: ppc_reloc
= R_PPC64_SECTOFF_HI
;
1312 case BFD_RELOC_HI16_S_BASEREL
: ppc_reloc
= R_PPC64_SECTOFF_HA
;
1314 case BFD_RELOC_CTOR
: ppc_reloc
= R_PPC64_ADDR64
;
1316 case BFD_RELOC_64
: ppc_reloc
= R_PPC64_ADDR64
;
1318 case BFD_RELOC_PPC64_HIGHER
: ppc_reloc
= R_PPC64_ADDR16_HIGHER
;
1320 case BFD_RELOC_PPC64_HIGHER_S
: ppc_reloc
= R_PPC64_ADDR16_HIGHERA
;
1322 case BFD_RELOC_PPC64_HIGHEST
: ppc_reloc
= R_PPC64_ADDR16_HIGHEST
;
1324 case BFD_RELOC_PPC64_HIGHEST_S
: ppc_reloc
= R_PPC64_ADDR16_HIGHESTA
;
1326 case BFD_RELOC_64_PCREL
: ppc_reloc
= R_PPC64_REL64
;
1328 case BFD_RELOC_64_PLTOFF
: ppc_reloc
= R_PPC64_PLT64
;
1330 case BFD_RELOC_64_PLT_PCREL
: ppc_reloc
= R_PPC64_PLTREL64
;
1332 case BFD_RELOC_PPC_TOC16
: ppc_reloc
= R_PPC64_TOC16
;
1334 case BFD_RELOC_PPC64_TOC16_LO
: ppc_reloc
= R_PPC64_TOC16_LO
;
1336 case BFD_RELOC_PPC64_TOC16_HI
: ppc_reloc
= R_PPC64_TOC16_HI
;
1338 case BFD_RELOC_PPC64_TOC16_HA
: ppc_reloc
= R_PPC64_TOC16_HA
;
1340 case BFD_RELOC_PPC64_TOC
: ppc_reloc
= R_PPC64_TOC
;
1342 case BFD_RELOC_PPC64_PLTGOT16
: ppc_reloc
= R_PPC64_PLTGOT16
;
1344 case BFD_RELOC_PPC64_PLTGOT16_LO
: ppc_reloc
= R_PPC64_PLTGOT16_LO
;
1346 case BFD_RELOC_PPC64_PLTGOT16_HI
: ppc_reloc
= R_PPC64_PLTGOT16_HI
;
1348 case BFD_RELOC_PPC64_PLTGOT16_HA
: ppc_reloc
= R_PPC64_PLTGOT16_HA
;
1350 case BFD_RELOC_PPC64_ADDR16_DS
: ppc_reloc
= R_PPC64_ADDR16_DS
;
1352 case BFD_RELOC_PPC64_ADDR16_LO_DS
: ppc_reloc
= R_PPC64_ADDR16_LO_DS
;
1354 case BFD_RELOC_PPC64_GOT16_DS
: ppc_reloc
= R_PPC64_GOT16_DS
;
1356 case BFD_RELOC_PPC64_GOT16_LO_DS
: ppc_reloc
= R_PPC64_GOT16_LO_DS
;
1358 case BFD_RELOC_PPC64_PLT16_LO_DS
: ppc_reloc
= R_PPC64_PLT16_LO_DS
;
1360 case BFD_RELOC_PPC64_SECTOFF_DS
: ppc_reloc
= R_PPC64_SECTOFF_DS
;
1362 case BFD_RELOC_PPC64_SECTOFF_LO_DS
: ppc_reloc
= R_PPC64_SECTOFF_LO_DS
;
1364 case BFD_RELOC_PPC64_TOC16_DS
: ppc_reloc
= R_PPC64_TOC16_DS
;
1366 case BFD_RELOC_PPC64_TOC16_LO_DS
: ppc_reloc
= R_PPC64_TOC16_LO_DS
;
1368 case BFD_RELOC_PPC64_PLTGOT16_DS
: ppc_reloc
= R_PPC64_PLTGOT16_DS
;
1370 case BFD_RELOC_PPC64_PLTGOT16_LO_DS
: ppc_reloc
= R_PPC64_PLTGOT16_LO_DS
;
1372 case BFD_RELOC_VTABLE_INHERIT
: ppc_reloc
= R_PPC64_GNU_VTINHERIT
;
1374 case BFD_RELOC_VTABLE_ENTRY
: ppc_reloc
= R_PPC64_GNU_VTENTRY
;
1378 return ppc64_elf_howto_table
[(int) ppc_reloc
];
1381 /* Set the howto pointer for a PowerPC ELF reloc. */
1384 ppc64_elf_info_to_howto (abfd
, cache_ptr
, dst
)
1385 bfd
*abfd ATTRIBUTE_UNUSED
;
1387 Elf64_Internal_Rela
*dst
;
1391 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
1392 /* Initialize howto table if needed. */
1395 type
= ELF64_R_TYPE (dst
->r_info
);
1396 BFD_ASSERT (type
< (sizeof (ppc64_elf_howto_table
)
1397 / sizeof (ppc64_elf_howto_table
[0])));
1398 cache_ptr
->howto
= ppc64_elf_howto_table
[type
];
1401 /* Handle the R_PPC_ADDR16_HA and similar relocs. */
1403 static bfd_reloc_status_type
1404 ppc64_elf_addr16_ha_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1405 output_bfd
, error_message
)
1406 bfd
*abfd ATTRIBUTE_UNUSED
;
1407 arelent
*reloc_entry
;
1409 PTR data ATTRIBUTE_UNUSED
;
1410 asection
*input_section
;
1412 char **error_message ATTRIBUTE_UNUSED
;
1416 if (output_bfd
!= NULL
)
1418 reloc_entry
->address
+= input_section
->output_offset
;
1419 return bfd_reloc_ok
;
1422 if (reloc_entry
->address
> input_section
->_cooked_size
)
1423 return bfd_reloc_outofrange
;
1425 if (bfd_is_com_section (symbol
->section
))
1428 relocation
= symbol
->value
;
1430 relocation
+= symbol
->section
->output_section
->vma
;
1431 relocation
+= symbol
->section
->output_offset
;
1432 relocation
+= reloc_entry
->addend
;
1434 reloc_entry
->addend
+= (relocation
& 0x8000) << 1;
1436 return bfd_reloc_continue
;
1439 /* Function to set whether a module needs the -mrelocatable bit set. */
1442 ppc64_elf_set_private_flags (abfd
, flags
)
1446 BFD_ASSERT (!elf_flags_init (abfd
)
1447 || elf_elfheader (abfd
)->e_flags
== flags
);
1449 elf_elfheader (abfd
)->e_flags
= flags
;
1450 elf_flags_init (abfd
) = true;
1454 /* Merge backend specific data from an object file to the output
1455 object file when linking. */
1457 ppc64_elf_merge_private_bfd_data (ibfd
, obfd
)
1465 /* Check if we have the same endianess. */
1466 if (ibfd
->xvec
->byteorder
!= obfd
->xvec
->byteorder
1467 && obfd
->xvec
->byteorder
!= BFD_ENDIAN_UNKNOWN
)
1471 if (bfd_big_endian (ibfd
))
1472 msg
= _("%s: compiled for a big endian system and target is little endian");
1474 msg
= _("%s: compiled for a little endian system and target is big endian");
1476 (*_bfd_error_handler
) (msg
, bfd_archive_filename (ibfd
));
1478 bfd_set_error (bfd_error_wrong_format
);
1482 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
1483 || bfd_get_flavour (obfd
) != bfd_target_elf_flavour
)
1486 new_flags
= elf_elfheader (ibfd
)->e_flags
;
1487 old_flags
= elf_elfheader (obfd
)->e_flags
;
1488 if (!elf_flags_init (obfd
))
1490 /* First call, no flags set. */
1491 elf_flags_init (obfd
) = true;
1492 elf_elfheader (obfd
)->e_flags
= new_flags
;
1495 else if (new_flags
== old_flags
)
1496 /* Compatible flags are ok. */
1501 /* Incompatible flags. Warn about -mrelocatable mismatch.
1502 Allow -mrelocatable-lib to be linked with either. */
1504 if ((new_flags
& EF_PPC_RELOCATABLE
) != 0
1505 && (old_flags
& (EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
)) == 0)
1508 (*_bfd_error_handler
)
1509 (_("%s: compiled with -mrelocatable and linked with modules compiled normally"),
1510 bfd_archive_filename (ibfd
));
1512 else if ((new_flags
& (EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
)) == 0
1513 && (old_flags
& EF_PPC_RELOCATABLE
) != 0)
1516 (*_bfd_error_handler
)
1517 (_("%s: compiled normally and linked with modules compiled with -mrelocatable"),
1518 bfd_archive_filename (ibfd
));
1521 /* The output is -mrelocatable-lib iff both the input files are. */
1522 if (! (new_flags
& EF_PPC_RELOCATABLE_LIB
))
1523 elf_elfheader (obfd
)->e_flags
&= ~EF_PPC_RELOCATABLE_LIB
;
1525 /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
1526 but each input file is either -mrelocatable or -mrelocatable-lib. */
1527 if (! (elf_elfheader (obfd
)->e_flags
& EF_PPC_RELOCATABLE_LIB
)
1528 && (new_flags
& (EF_PPC_RELOCATABLE_LIB
| EF_PPC_RELOCATABLE
))
1529 && (old_flags
& (EF_PPC_RELOCATABLE_LIB
| EF_PPC_RELOCATABLE
)))
1530 elf_elfheader (obfd
)->e_flags
|= EF_PPC_RELOCATABLE
;
1532 /* Do not warn about eabi vs. V.4 mismatch, just or in the bit
1533 if any module uses it. */
1534 elf_elfheader (obfd
)->e_flags
|= (new_flags
& EF_PPC_EMB
);
1536 new_flags
&= ~(EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
| EF_PPC_EMB
);
1537 old_flags
&= ~(EF_PPC_RELOCATABLE
| EF_PPC_RELOCATABLE_LIB
| EF_PPC_EMB
);
1539 /* Warn about any other mismatches. */
1540 if (new_flags
!= old_flags
)
1543 (*_bfd_error_handler
)
1544 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
1545 bfd_archive_filename (ibfd
), (long) new_flags
, (long) old_flags
);
1550 bfd_set_error (bfd_error_bad_value
);
1558 /* Handle a PowerPC specific section when reading an object file. This
1559 is called when elfcode.h finds a section with an unknown type. */
1562 ppc64_elf_section_from_shdr (abfd
, hdr
, name
)
1564 Elf64_Internal_Shdr
*hdr
;
1570 if (! _bfd_elf_make_section_from_shdr (abfd
, hdr
, name
))
1573 newsect
= hdr
->bfd_section
;
1574 flags
= bfd_get_section_flags (abfd
, newsect
);
1575 if (hdr
->sh_flags
& SHF_EXCLUDE
)
1576 flags
|= SEC_EXCLUDE
;
1578 if (hdr
->sh_type
== SHT_ORDERED
)
1579 flags
|= SEC_SORT_ENTRIES
;
1581 bfd_set_section_flags (abfd
, newsect
, flags
);
1585 /* The following functions are specific to the ELF linker, while
1586 functions above are used generally. Those named ppc64_elf_* are
1587 called by the main ELF linker code. They appear in this file more
1588 or less in the order in which they are called. eg.
1589 ppc64_elf_check_relocs is called early in the link process,
1590 ppc64_elf_finish_dynamic_sections is one of the last functions
1593 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
1594 functions have both a function code symbol and a function descriptor
1595 symbol. A call to foo in a relocatable object file looks like:
1602 The function definition in another object file might be:
1606 . .quad .TOC.@tocbase
1612 When the linker resolves the call during a static link, the branch
1613 unsurprisingly just goes to .foo and the .opd information is unused.
1614 If the function definition is in a shared library, things are a little
1615 different: The call goes via a plt call stub, the opd information gets
1616 copied to the plt, and the linker patches the nop.
1624 . addis 12,2,Lfoo@toc@ha # in practice, the call stub
1625 . addi 12,12,Lfoo@toc@l # is slightly optimised, but
1626 . std 2,40(1) # this is the general idea
1634 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
1636 The "reloc ()" notation is supposed to indicate that the linker emits
1637 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
1640 What are the difficulties here? Well, firstly, the relocations
1641 examined by the linker in check_relocs are against the function code
1642 sym .foo, while the dynamic relocation in the plt is emitted against
1643 the function descriptor symbol, foo. Somewhere along the line, we need
1644 to carefully copy dynamic link information from one symbol to the other.
1645 Secondly, the generic part of the elf linker will make .foo a dynamic
1646 symbol as is normal for most other backends. We need foo dynamic
1647 instead, at least for an application final link. However, when
1648 creating a shared library containing foo, we need to have both symbols
1649 dynamic so that references to .foo are satisfied during the early
1650 stages of linking. Otherwise the linker might decide to pull in a
1651 definition from some other object, eg. a static library. Thirdly, we'd
1652 like to use .foo as the stub symbol to avoid creating another symbol.
1653 We need to make sure that when .foo labels a stub in a shared library,
1654 it isn't exported. */
1656 /* The linker needs to keep track of the number of relocs that it
1657 decides to copy as dynamic relocs in check_relocs for each symbol.
1658 This is so that it can later discard them if they are found to be
1659 unnecessary. We store the information in a field extending the
1660 regular ELF linker hash table. */
1662 struct ppc_dyn_relocs
1664 struct ppc_dyn_relocs
*next
;
1666 /* The input section of the reloc. */
1669 /* Total number of relocs copied for the input section. */
1670 bfd_size_type count
;
1672 /* Number of pc-relative relocs copied for the input section. */
1673 bfd_size_type pc_count
;
1676 /* Of those relocs that might be copied as dynamic relocs, this macro
1677 selects between relative and absolute types. */
1679 #define IS_ABSOLUTE_RELOC(RTYPE) \
1680 ((RTYPE) != R_PPC64_REL14 \
1681 && (RTYPE) != R_PPC64_REL14_BRNTAKEN \
1682 && (RTYPE) != R_PPC64_REL14_BRTAKEN \
1683 && (RTYPE) != R_PPC64_REL24 \
1684 && (RTYPE) != R_PPC64_REL32 \
1685 && (RTYPE) != R_PPC64_REL64)
1687 /* ppc64 ELF linker hash entry. */
1689 struct ppc_link_hash_entry
1691 struct elf_link_hash_entry elf
;
1693 /* Track dynamic relocs copied for this symbol. */
1694 struct ppc_dyn_relocs
*dyn_relocs
;
1696 /* Flag function code and descriptor symbols. */
1697 unsigned int is_func
:1;
1698 unsigned int is_func_descriptor
:1;
1701 /* ppc64 ELF linker hash table. */
1703 struct ppc_link_hash_table
1705 struct elf_link_hash_table elf
;
1707 /* Short-cuts to get to dynamic linker sections. */
1720 /* Small local sym to section mapping cache. */
1721 struct sym_sec_cache sym_sec
;
1724 /* Get the ppc64 ELF linker hash table from a link_info structure. */
1726 #define ppc_hash_table(p) \
1727 ((struct ppc_link_hash_table *) ((p)->hash))
1729 /* Create an entry in a ppc64 ELF linker hash table. */
1731 static struct bfd_hash_entry
*
1732 link_hash_newfunc (entry
, table
, string
)
1733 struct bfd_hash_entry
*entry
;
1734 struct bfd_hash_table
*table
;
1737 /* Allocate the structure if it has not already been allocated by a
1741 entry
= bfd_hash_allocate (table
, sizeof (struct ppc_link_hash_entry
));
1746 /* Call the allocation method of the superclass. */
1747 entry
= _bfd_elf_link_hash_newfunc (entry
, table
, string
);
1750 struct ppc_link_hash_entry
*eh
= (struct ppc_link_hash_entry
*) entry
;
1752 eh
->dyn_relocs
= NULL
;
1754 eh
->is_func_descriptor
= 0;
1760 /* Create a ppc64 ELF linker hash table. */
1762 static struct bfd_link_hash_table
*
1763 ppc64_elf_link_hash_table_create (abfd
)
1766 struct ppc_link_hash_table
*htab
;
1767 bfd_size_type amt
= sizeof (struct ppc_link_hash_table
);
1769 htab
= (struct ppc_link_hash_table
*) bfd_alloc (abfd
, amt
);
1773 if (! _bfd_elf_link_hash_table_init (&htab
->elf
, abfd
, link_hash_newfunc
))
1775 bfd_release (abfd
, htab
);
1780 htab
->srelgot
= NULL
;
1782 htab
->srelplt
= NULL
;
1783 htab
->sdynbss
= NULL
;
1784 htab
->srelbss
= NULL
;
1786 htab
->sglink
= NULL
;
1787 htab
->plt_overflow
= 0;
1788 htab
->sym_sec
.abfd
= NULL
;
1790 return &htab
->elf
.root
;
1793 /* Create .got and .rela.got sections in DYNOBJ, and set up
1794 shortcuts to them in our hash table. */
1797 create_got_section (dynobj
, info
)
1799 struct bfd_link_info
*info
;
1801 struct ppc_link_hash_table
*htab
;
1803 if (! _bfd_elf_create_got_section (dynobj
, info
))
1806 htab
= ppc_hash_table (info
);
1807 htab
->sgot
= bfd_get_section_by_name (dynobj
, ".got");
1811 htab
->srelgot
= bfd_make_section (dynobj
, ".rela.got");
1813 || ! bfd_set_section_flags (dynobj
, htab
->srelgot
,
1814 (SEC_ALLOC
| SEC_LOAD
| SEC_HAS_CONTENTS
1815 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
1817 || ! bfd_set_section_alignment (dynobj
, htab
->srelgot
, 3))
1822 /* Create the .stub and .glink sections as well as the ordinary
1823 dynamic sections. */
1826 ppc64_elf_create_dynamic_sections (dynobj
, info
)
1828 struct bfd_link_info
*info
;
1830 struct ppc_link_hash_table
*htab
;
1833 htab
= ppc_hash_table (info
);
1834 if (!htab
->sgot
&& !create_got_section (dynobj
, info
))
1837 if (!_bfd_elf_create_dynamic_sections (dynobj
, info
))
1840 htab
->splt
= bfd_get_section_by_name (dynobj
, ".plt");
1841 htab
->srelplt
= bfd_get_section_by_name (dynobj
, ".rela.plt");
1842 htab
->sdynbss
= bfd_get_section_by_name (dynobj
, ".dynbss");
1844 htab
->srelbss
= bfd_get_section_by_name (dynobj
, ".rela.bss");
1846 if (!htab
->splt
|| !htab
->srelplt
|| !htab
->sdynbss
1847 || (!info
->shared
&& !htab
->srelbss
))
1850 /* Create .stub and .glink for global linkage functions. */
1851 flags
= (SEC_ALLOC
| SEC_LOAD
| SEC_CODE
| SEC_READONLY
1852 | SEC_HAS_CONTENTS
| SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
1853 htab
->sstub
= bfd_make_section (dynobj
, ".stub");
1854 if (htab
->sstub
== NULL
1855 || ! bfd_set_section_flags (dynobj
, htab
->sstub
, flags
)
1856 || ! bfd_set_section_alignment (dynobj
, htab
->sstub
, 2))
1858 htab
->sglink
= bfd_make_section (dynobj
, ".glink");
1859 if (htab
->sglink
== NULL
1860 || ! bfd_set_section_flags (dynobj
, htab
->sglink
, flags
)
1861 || ! bfd_set_section_alignment (dynobj
, htab
->sglink
, 3))
1867 /* Copy the extra info we tack onto an elf_link_hash_entry. */
1870 ppc64_elf_copy_indirect_symbol (dir
, ind
)
1871 struct elf_link_hash_entry
*dir
, *ind
;
1873 struct ppc_link_hash_entry
*edir
, *eind
;
1875 edir
= (struct ppc_link_hash_entry
*) dir
;
1876 eind
= (struct ppc_link_hash_entry
*) ind
;
1878 if (eind
->dyn_relocs
!= NULL
)
1880 if (edir
->dyn_relocs
!= NULL
)
1882 struct ppc_dyn_relocs
**pp
;
1883 struct ppc_dyn_relocs
*p
;
1885 if (ind
->root
.type
== bfd_link_hash_indirect
)
1888 /* Add reloc counts against the weak sym to the strong sym
1889 list. Merge any entries against the same section. */
1890 for (pp
= &eind
->dyn_relocs
; (p
= *pp
) != NULL
; )
1892 struct ppc_dyn_relocs
*q
;
1894 for (q
= edir
->dyn_relocs
; q
!= NULL
; q
= q
->next
)
1895 if (q
->sec
== p
->sec
)
1897 q
->pc_count
+= p
->pc_count
;
1898 q
->count
+= p
->count
;
1905 *pp
= edir
->dyn_relocs
;
1908 edir
->dyn_relocs
= eind
->dyn_relocs
;
1909 eind
->dyn_relocs
= NULL
;
1912 edir
->is_func
|= eind
->is_func
;
1913 edir
->is_func_descriptor
|= eind
->is_func_descriptor
;
1915 _bfd_elf_link_hash_copy_indirect (dir
, ind
);
1918 /* Look through the relocs for a section during the first phase, and
1919 calculate needed space in the global offset table, procedure
1920 linkage table, and dynamic reloc sections. */
1923 ppc64_elf_check_relocs (abfd
, info
, sec
, relocs
)
1925 struct bfd_link_info
*info
;
1927 const Elf_Internal_Rela
*relocs
;
1929 struct ppc_link_hash_table
*htab
;
1930 Elf_Internal_Shdr
*symtab_hdr
;
1931 struct elf_link_hash_entry
**sym_hashes
, **sym_hashes_end
;
1932 const Elf_Internal_Rela
*rel
;
1933 const Elf_Internal_Rela
*rel_end
;
1937 if (info
->relocateable
)
1940 htab
= ppc_hash_table (info
);
1941 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1943 sym_hashes
= elf_sym_hashes (abfd
);
1944 sym_hashes_end
= (sym_hashes
1945 + symtab_hdr
->sh_size
/ sizeof (Elf64_External_Sym
));
1946 if (!elf_bad_symtab (abfd
))
1947 sym_hashes_end
-= symtab_hdr
->sh_info
;
1950 is_opd
= strcmp (bfd_get_section_name (abfd
, sec
), ".opd") == 0;
1952 rel_end
= relocs
+ sec
->reloc_count
;
1953 for (rel
= relocs
; rel
< rel_end
; rel
++)
1955 unsigned long r_symndx
;
1956 struct elf_link_hash_entry
*h
;
1957 enum elf_ppc_reloc_type r_type
;
1959 r_symndx
= ELF64_R_SYM (rel
->r_info
);
1960 if (r_symndx
< symtab_hdr
->sh_info
)
1963 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
1965 r_type
= (enum elf_ppc_reloc_type
) ELF64_R_TYPE (rel
->r_info
);
1968 /* GOT16 relocations */
1970 case R_PPC64_GOT16_DS
:
1971 case R_PPC64_GOT16_HA
:
1972 case R_PPC64_GOT16_HI
:
1973 case R_PPC64_GOT16_LO
:
1974 case R_PPC64_GOT16_LO_DS
:
1976 /* This symbol requires a global offset table entry. */
1977 if (htab
->sgot
== NULL
)
1979 if (htab
->elf
.dynobj
== NULL
)
1980 htab
->elf
.dynobj
= abfd
;
1981 if (!create_got_section (htab
->elf
.dynobj
, info
))
1987 h
->got
.refcount
+= 1;
1991 bfd_signed_vma
*local_got_refcounts
;
1993 /* This is a global offset table entry for a local symbol. */
1994 local_got_refcounts
= elf_local_got_refcounts (abfd
);
1995 if (local_got_refcounts
== NULL
)
1999 size
= symtab_hdr
->sh_info
;
2000 size
*= sizeof (bfd_signed_vma
);
2001 local_got_refcounts
= ((bfd_signed_vma
*)
2002 bfd_zalloc (abfd
, size
));
2003 if (local_got_refcounts
== NULL
)
2005 elf_local_got_refcounts (abfd
) = local_got_refcounts
;
2007 local_got_refcounts
[r_symndx
] += 1;
2011 case R_PPC64_PLT16_HA
:
2012 case R_PPC64_PLT16_HI
:
2013 case R_PPC64_PLT16_LO
:
2016 /* This symbol requires a procedure linkage table entry. We
2017 actually build the entry in adjust_dynamic_symbol,
2018 because this might be a case of linking PIC code without
2019 linking in any dynamic objects, in which case we don't
2020 need to generate a procedure linkage table after all. */
2023 /* It does not make sense to have a procedure linkage
2024 table entry for a local symbol. */
2025 bfd_set_error (bfd_error_bad_value
);
2029 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
2030 h
->plt
.refcount
+= 1;
2031 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
2034 /* The following relocations don't need to propagate the
2035 relocation if linking a shared object since they are
2036 section relative. */
2037 case R_PPC64_SECTOFF
:
2038 case R_PPC64_SECTOFF_LO
:
2039 case R_PPC64_SECTOFF_HI
:
2040 case R_PPC64_SECTOFF_HA
:
2041 case R_PPC64_SECTOFF_DS
:
2042 case R_PPC64_SECTOFF_LO_DS
:
2044 case R_PPC64_TOC16_LO
:
2045 case R_PPC64_TOC16_HI
:
2046 case R_PPC64_TOC16_HA
:
2047 case R_PPC64_TOC16_DS
:
2048 case R_PPC64_TOC16_LO_DS
:
2051 /* This relocation describes the C++ object vtable hierarchy.
2052 Reconstruct it for later use during GC. */
2053 case R_PPC64_GNU_VTINHERIT
:
2054 if (!_bfd_elf64_gc_record_vtinherit (abfd
, sec
, h
, rel
->r_offset
))
2058 /* This relocation describes which C++ vtable entries are actually
2059 used. Record for later use during GC. */
2060 case R_PPC64_GNU_VTENTRY
:
2061 if (!_bfd_elf64_gc_record_vtentry (abfd
, sec
, h
, rel
->r_addend
))
2067 && h
->root
.root
.string
[0] == '.'
2068 && h
->root
.root
.string
[1] != 0)
2070 /* We may need a .plt entry if the function this reloc
2071 refers to is in a shared lib. */
2072 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
2073 h
->plt
.refcount
+= 1;
2074 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
2078 case R_PPC64_ADDR64
:
2081 && h
->root
.root
.string
[0] == '.'
2082 && h
->root
.root
.string
[1] != 0)
2084 struct elf_link_hash_entry
*fdh
;
2086 fdh
= elf_link_hash_lookup (&htab
->elf
, h
->root
.root
.string
+ 1,
2087 false, false, false);
2090 /* Ensure the function descriptor symbol string is
2091 part of the code symbol string. We aren't
2092 changing the name here, just allowing some tricks
2093 in ppc64_elf_hide_symbol. */
2094 fdh
->root
.root
.string
= h
->root
.root
.string
+ 1;
2095 ((struct ppc_link_hash_entry
*) fdh
)->is_func_descriptor
= 1;
2096 ((struct ppc_link_hash_entry
*) h
)->is_func
= 1;
2104 case R_PPC64_REL14_BRTAKEN
:
2105 case R_PPC64_REL14_BRNTAKEN
:
2106 case R_PPC64_ADDR14
:
2107 case R_PPC64_ADDR14_BRNTAKEN
:
2108 case R_PPC64_ADDR14_BRTAKEN
:
2109 case R_PPC64_ADDR16
:
2110 case R_PPC64_ADDR16_DS
:
2111 case R_PPC64_ADDR16_HA
:
2112 case R_PPC64_ADDR16_HI
:
2113 case R_PPC64_ADDR16_HIGHER
:
2114 case R_PPC64_ADDR16_HIGHERA
:
2115 case R_PPC64_ADDR16_HIGHEST
:
2116 case R_PPC64_ADDR16_HIGHESTA
:
2117 case R_PPC64_ADDR16_LO
:
2118 case R_PPC64_ADDR16_LO_DS
:
2119 case R_PPC64_ADDR24
:
2120 case R_PPC64_ADDR30
:
2121 case R_PPC64_ADDR32
:
2122 case R_PPC64_UADDR16
:
2123 case R_PPC64_UADDR32
:
2124 case R_PPC64_UADDR64
:
2127 /* Don't propagate .opd relocs. */
2132 /* If we are creating a shared library, and this is a reloc
2133 against a global symbol, or a non PC relative reloc
2134 against a local symbol, then we need to copy the reloc
2135 into the shared library. However, if we are linking with
2136 -Bsymbolic, we do not need to copy a reloc against a
2137 global symbol which is defined in an object we are
2138 including in the link (i.e., DEF_REGULAR is set). At
2139 this point we have not seen all the input files, so it is
2140 possible that DEF_REGULAR is not set now but will be set
2141 later (it is never cleared). In case of a weak definition,
2142 DEF_REGULAR may be cleared later by a strong definition in
2143 a shared library. We account for that possibility below by
2144 storing information in the relocs_copied field of the hash
2145 table entry. A similar situation occurs when creating
2146 shared libraries and symbol visibility changes render the
2149 If on the other hand, we are creating an executable, we
2150 may need to keep relocations for symbols satisfied by a
2151 dynamic library if we manage to avoid copy relocs for the
2154 && (sec
->flags
& SEC_ALLOC
) != 0
2155 && (IS_ABSOLUTE_RELOC (r_type
)
2157 && (! info
->symbolic
2158 || h
->root
.type
== bfd_link_hash_defweak
2159 || (h
->elf_link_hash_flags
2160 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
2162 && (sec
->flags
& SEC_ALLOC
) != 0
2164 && (h
->root
.type
== bfd_link_hash_defweak
2165 || (h
->elf_link_hash_flags
2166 & ELF_LINK_HASH_DEF_REGULAR
) == 0)))
2168 struct ppc_dyn_relocs
*p
;
2169 struct ppc_dyn_relocs
**head
;
2171 /* We must copy these reloc types into the output file.
2172 Create a reloc section in dynobj and make room for
2179 name
= (bfd_elf_string_from_elf_section
2181 elf_elfheader (abfd
)->e_shstrndx
,
2182 elf_section_data (sec
)->rel_hdr
.sh_name
));
2186 if (strncmp (name
, ".rela", 5) != 0
2187 || strcmp (bfd_get_section_name (abfd
, sec
),
2190 (*_bfd_error_handler
)
2191 (_("%s: bad relocation section name `%s\'"),
2192 bfd_archive_filename (abfd
), name
);
2193 bfd_set_error (bfd_error_bad_value
);
2196 if (htab
->elf
.dynobj
== NULL
)
2197 htab
->elf
.dynobj
= abfd
;
2199 dynobj
= htab
->elf
.dynobj
;
2200 sreloc
= bfd_get_section_by_name (dynobj
, name
);
2205 sreloc
= bfd_make_section (dynobj
, name
);
2206 flags
= (SEC_HAS_CONTENTS
| SEC_READONLY
2207 | SEC_IN_MEMORY
| SEC_LINKER_CREATED
);
2208 if ((sec
->flags
& SEC_ALLOC
) != 0)
2209 flags
|= SEC_ALLOC
| SEC_LOAD
;
2211 || ! bfd_set_section_flags (dynobj
, sreloc
, flags
)
2212 || ! bfd_set_section_alignment (dynobj
, sreloc
, 3))
2215 elf_section_data (sec
)->sreloc
= sreloc
;
2218 /* If this is a global symbol, we count the number of
2219 relocations we need for this symbol. */
2222 head
= &((struct ppc_link_hash_entry
*) h
)->dyn_relocs
;
2226 /* Track dynamic relocs needed for local syms too.
2227 We really need local syms available to do this
2231 s
= bfd_section_from_r_symndx (abfd
, &htab
->sym_sec
,
2236 head
= ((struct ppc_dyn_relocs
**)
2237 &elf_section_data (s
)->local_dynrel
);
2241 if (p
== NULL
|| p
->sec
!= sec
)
2243 p
= ((struct ppc_dyn_relocs
*)
2244 bfd_alloc (htab
->elf
.dynobj
,
2245 (bfd_size_type
) sizeof *p
));
2256 if (!IS_ABSOLUTE_RELOC (r_type
))
2268 /* Return the section that should be marked against GC for a given
2272 ppc64_elf_gc_mark_hook (abfd
, info
, rel
, h
, sym
)
2274 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2275 Elf_Internal_Rela
*rel
;
2276 struct elf_link_hash_entry
*h
;
2277 Elf_Internal_Sym
*sym
;
2281 enum elf_ppc_reloc_type r_type
;
2283 r_type
= (enum elf_ppc_reloc_type
) ELF64_R_TYPE (rel
->r_info
);
2286 case R_PPC64_GNU_VTINHERIT
:
2287 case R_PPC64_GNU_VTENTRY
:
2291 switch (h
->root
.type
)
2293 case bfd_link_hash_defined
:
2294 case bfd_link_hash_defweak
:
2295 return h
->root
.u
.def
.section
;
2297 case bfd_link_hash_common
:
2298 return h
->root
.u
.c
.p
->section
;
2307 return bfd_section_from_elf_index (abfd
, sym
->st_shndx
);
2313 /* Update the .got, .plt. and dynamic reloc reference counts for the
2314 section being removed. */
2317 ppc64_elf_gc_sweep_hook (abfd
, info
, sec
, relocs
)
2319 struct bfd_link_info
*info ATTRIBUTE_UNUSED
;
2321 const Elf_Internal_Rela
*relocs
;
2323 Elf_Internal_Shdr
*symtab_hdr
;
2324 struct elf_link_hash_entry
**sym_hashes
;
2325 bfd_signed_vma
*local_got_refcounts
;
2326 const Elf_Internal_Rela
*rel
, *relend
;
2328 elf_section_data (sec
)->local_dynrel
= NULL
;
2330 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
2331 sym_hashes
= elf_sym_hashes (abfd
);
2332 local_got_refcounts
= elf_local_got_refcounts (abfd
);
2334 relend
= relocs
+ sec
->reloc_count
;
2335 for (rel
= relocs
; rel
< relend
; rel
++)
2337 unsigned long r_symndx
;
2338 enum elf_ppc_reloc_type r_type
;
2339 struct elf_link_hash_entry
*h
;
2341 r_symndx
= ELF64_R_SYM (rel
->r_info
);
2342 r_type
= (enum elf_ppc_reloc_type
) ELF64_R_TYPE (rel
->r_info
);
2346 case R_PPC64_GOT16_DS
:
2347 case R_PPC64_GOT16_HA
:
2348 case R_PPC64_GOT16_HI
:
2349 case R_PPC64_GOT16_LO
:
2350 case R_PPC64_GOT16_LO_DS
:
2351 if (r_symndx
>= symtab_hdr
->sh_info
)
2353 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2354 if (h
->got
.refcount
> 0)
2359 if (local_got_refcounts
[r_symndx
] > 0)
2360 local_got_refcounts
[r_symndx
]--;
2364 case R_PPC64_PLT16_HA
:
2365 case R_PPC64_PLT16_HI
:
2366 case R_PPC64_PLT16_LO
:
2369 if (r_symndx
>= symtab_hdr
->sh_info
)
2371 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2372 if (h
->plt
.refcount
> 0)
2378 if (r_symndx
>= symtab_hdr
->sh_info
)
2380 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2381 if (h
->plt
.refcount
> 0)
2387 case R_PPC64_REL14_BRNTAKEN
:
2388 case R_PPC64_REL14_BRTAKEN
:
2391 if (r_symndx
>= symtab_hdr
->sh_info
)
2393 struct ppc_link_hash_entry
*eh
;
2394 struct ppc_dyn_relocs
**pp
;
2395 struct ppc_dyn_relocs
*p
;
2397 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2398 eh
= (struct ppc_link_hash_entry
*) h
;
2400 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
2412 case R_PPC64_ADDR14
:
2413 case R_PPC64_ADDR14_BRNTAKEN
:
2414 case R_PPC64_ADDR14_BRTAKEN
:
2415 case R_PPC64_ADDR16
:
2416 case R_PPC64_ADDR16_DS
:
2417 case R_PPC64_ADDR16_HA
:
2418 case R_PPC64_ADDR16_HI
:
2419 case R_PPC64_ADDR16_HIGHER
:
2420 case R_PPC64_ADDR16_HIGHERA
:
2421 case R_PPC64_ADDR16_HIGHEST
:
2422 case R_PPC64_ADDR16_HIGHESTA
:
2423 case R_PPC64_ADDR16_LO
:
2424 case R_PPC64_ADDR16_LO_DS
:
2425 case R_PPC64_ADDR24
:
2426 case R_PPC64_ADDR30
:
2427 case R_PPC64_ADDR32
:
2428 case R_PPC64_ADDR64
:
2429 case R_PPC64_UADDR16
:
2430 case R_PPC64_UADDR32
:
2431 case R_PPC64_UADDR64
:
2433 if (r_symndx
>= symtab_hdr
->sh_info
)
2435 struct ppc_link_hash_entry
*eh
;
2436 struct ppc_dyn_relocs
**pp
;
2437 struct ppc_dyn_relocs
*p
;
2439 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
2440 eh
= (struct ppc_link_hash_entry
*) h
;
2442 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; pp
= &p
->next
)
2460 /* Called via elf_link_hash_traverse to transfer dynamic linking
2461 information on function code symbol entries to their corresponding
2462 function descriptor symbol entries. */
2464 func_desc_adjust (h
, inf
)
2465 struct elf_link_hash_entry
*h
;
2468 struct bfd_link_info
*info
;
2469 struct ppc_link_hash_table
*htab
;
2471 if (h
->root
.type
== bfd_link_hash_indirect
2472 || h
->root
.type
== bfd_link_hash_warning
)
2475 info
= (struct bfd_link_info
*) inf
;
2476 htab
= ppc_hash_table (info
);
2478 /* If this is a function code symbol, transfer dynamic linking
2479 information to the function descriptor symbol. */
2480 if (!((struct ppc_link_hash_entry
*) h
)->is_func
)
2483 if (h
->plt
.refcount
> 0
2484 && h
->root
.root
.string
[0] == '.'
2485 && h
->root
.root
.string
[1] != '\0')
2487 struct elf_link_hash_entry
*fdh
;
2488 boolean force_local
;
2490 /* Find the corresponding function descriptor symbol. Create it
2491 as undefined if necessary. */
2493 fdh
= elf_link_hash_lookup (&htab
->elf
, h
->root
.root
.string
+ 1,
2494 false, false, true);
2496 if (fdh
== NULL
&& info
->shared
)
2501 /* Create it as undefined. */
2502 if (h
->root
.type
== bfd_link_hash_undefined
2503 || h
->root
.type
== bfd_link_hash_undefweak
)
2504 abfd
= h
->root
.u
.undef
.abfd
;
2505 else if (h
->root
.type
== bfd_link_hash_defined
2506 || h
->root
.type
== bfd_link_hash_defweak
)
2507 abfd
= h
->root
.u
.def
.section
->owner
;
2510 newsym
= bfd_make_empty_symbol (abfd
);
2511 newsym
->name
= h
->root
.root
.string
+ 1;
2512 newsym
->section
= bfd_und_section_ptr
;
2514 newsym
->flags
= BSF_OBJECT
;
2515 if (h
->root
.type
== bfd_link_hash_undefweak
)
2516 newsym
->flags
|= BSF_WEAK
;
2518 if ( !(_bfd_generic_link_add_one_symbol
2519 (info
, abfd
, newsym
->name
, newsym
->flags
,
2520 newsym
->section
, newsym
->value
, NULL
, false, false,
2521 (struct bfd_link_hash_entry
**) &fdh
)))
2528 && (fdh
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0
2530 || (fdh
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2531 || (fdh
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) != 0))
2533 if (fdh
->dynindx
== -1)
2534 if (! bfd_elf64_link_record_dynamic_symbol (info
, fdh
))
2536 fdh
->plt
.refcount
= h
->plt
.refcount
;
2537 fdh
->elf_link_hash_flags
|= (h
->elf_link_hash_flags
2538 & (ELF_LINK_HASH_REF_REGULAR
2539 | ELF_LINK_HASH_REF_DYNAMIC
2540 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
2541 | ELF_LINK_NON_GOT_REF
));
2542 fdh
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_PLT
;
2543 ((struct ppc_link_hash_entry
*) fdh
)->is_func_descriptor
= 1;
2544 fdh
->root
.root
.string
= h
->root
.root
.string
+ 1;
2547 /* Now that the info is on the function descriptor, clear the
2548 function code sym info. Any function code syms for which we
2549 don't have a definition in a regular file, we force local.
2550 This prevents a shared library from exporting syms that have
2551 been imported from another library. Function code syms that
2552 are really in the library we must leave global to prevent the
2553 linker dragging a definition in from a static library. */
2554 force_local
= (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0;
2555 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
2561 /* Called near the start of bfd_elf_size_dynamic_sections. We use
2562 this hook to transfer dynamic linking information gathered so far
2563 on function code symbol entries, to their corresponding function
2564 descriptor symbol entries. */
2566 ppc64_elf_func_desc_adjust (obfd
, info
)
2567 bfd
*obfd ATTRIBUTE_UNUSED
;
2568 struct bfd_link_info
*info
;
2570 struct ppc_link_hash_table
*htab
;
2572 htab
= ppc_hash_table (info
);
2573 elf_link_hash_traverse (&htab
->elf
, func_desc_adjust
, (PTR
) info
);
2577 /* Adjust a symbol defined by a dynamic object and referenced by a
2578 regular object. The current definition is in some section of the
2579 dynamic object, but we're not including those sections. We have to
2580 change the definition to something the rest of the link can
2584 ppc64_elf_adjust_dynamic_symbol (info
, h
)
2585 struct bfd_link_info
*info
;
2586 struct elf_link_hash_entry
*h
;
2588 struct ppc_link_hash_table
*htab
;
2589 struct ppc_link_hash_entry
* eh
;
2590 struct ppc_dyn_relocs
*p
;
2592 unsigned int power_of_two
;
2594 htab
= ppc_hash_table (info
);
2596 /* Deal with function syms. */
2597 if (h
->type
== STT_FUNC
2598 || (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0)
2600 /* Clear procedure linkage table information for any symbol that
2601 won't need a .plt entry. */
2602 if (!((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
2603 || h
->plt
.refcount
<= 0
2604 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) != 0
2606 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) == 0
2607 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_REF_DYNAMIC
) == 0))
2609 h
->plt
.offset
= (bfd_vma
) -1;
2610 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2615 h
->plt
.offset
= (bfd_vma
) -1;
2617 /* If this is a weak symbol, and there is a real definition, the
2618 processor independent code will have arranged for us to see the
2619 real definition first, and we can just use the same value. */
2620 if (h
->weakdef
!= NULL
)
2622 BFD_ASSERT (h
->weakdef
->root
.type
== bfd_link_hash_defined
2623 || h
->weakdef
->root
.type
== bfd_link_hash_defweak
);
2624 h
->root
.u
.def
.section
= h
->weakdef
->root
.u
.def
.section
;
2625 h
->root
.u
.def
.value
= h
->weakdef
->root
.u
.def
.value
;
2629 /* This is a reference to a symbol defined by a dynamic object which
2630 is not a function. */
2632 /* If we are creating a shared library, we must presume that the
2633 only references to the symbol are via the global offset table.
2634 For such cases we need not do anything here; the relocations will
2635 be handled correctly by relocate_section. */
2639 /* If there are no references to this symbol that do not use the
2640 GOT, we don't need to generate a copy reloc. */
2641 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0)
2644 eh
= (struct ppc_link_hash_entry
*) h
;
2645 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2647 s
= p
->sec
->output_section
;
2648 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
2652 /* If we didn't find any dynamic relocs in read-only sections, then
2653 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
2656 h
->elf_link_hash_flags
&= ~ELF_LINK_NON_GOT_REF
;
2660 /* We must allocate the symbol in our .dynbss section, which will
2661 become part of the .bss section of the executable. There will be
2662 an entry for this symbol in the .dynsym section. The dynamic
2663 object will contain position independent code, so all references
2664 from the dynamic object to this symbol will go through the global
2665 offset table. The dynamic linker will use the .dynsym entry to
2666 determine the address it must put in the global offset table, so
2667 both the dynamic object and the regular object will refer to the
2668 same memory location for the variable. */
2670 /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2671 copy the initial value out of the dynamic object and into the
2672 runtime process image. We need to remember the offset into the
2673 .rela.bss section we are going to use. */
2674 if ((h
->root
.u
.def
.section
->flags
& SEC_ALLOC
) != 0)
2676 htab
->srelbss
->_raw_size
+= sizeof (Elf64_External_Rela
);
2677 h
->elf_link_hash_flags
|= ELF_LINK_HASH_NEEDS_COPY
;
2680 /* We need to figure out the alignment required for this symbol. I
2681 have no idea how ELF linkers handle this. */
2682 power_of_two
= bfd_log2 (h
->size
);
2683 if (power_of_two
> 4)
2686 /* Apply the required alignment. */
2688 s
->_raw_size
= BFD_ALIGN (s
->_raw_size
, (bfd_size_type
) (1 << power_of_two
));
2689 if (power_of_two
> bfd_get_section_alignment (htab
->elf
.dynobj
, s
))
2691 if (! bfd_set_section_alignment (htab
->elf
.dynobj
, s
, power_of_two
))
2695 /* Define the symbol as being at this point in the section. */
2696 h
->root
.u
.def
.section
= s
;
2697 h
->root
.u
.def
.value
= s
->_raw_size
;
2699 /* Increment the section size to make room for the symbol. */
2700 s
->_raw_size
+= h
->size
;
2705 /* If given a function descriptor symbol, hide both the function code
2706 sym and the descriptor. */
2708 ppc64_elf_hide_symbol (info
, h
, force_local
)
2709 struct bfd_link_info
*info
;
2710 struct elf_link_hash_entry
*h
;
2711 boolean force_local
;
2713 _bfd_elf_link_hash_hide_symbol (info
, h
, force_local
);
2715 if (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
)
2718 struct elf_link_hash_entry
*fh
;
2719 struct ppc_link_hash_table
*htab
;
2721 name
= h
->root
.root
.string
- 1;
2722 htab
= ppc_hash_table (info
);
2723 fh
= elf_link_hash_lookup (&htab
->elf
, name
, false, false, false);
2725 _bfd_elf_link_hash_hide_symbol (info
, fh
, force_local
);
2729 /* This is the condition under which ppc64_elf_finish_dynamic_symbol
2730 will be called from elflink.h. If elflink.h doesn't call our
2731 finish_dynamic_symbol routine, we'll need to do something about
2732 initializing any .plt and .got entries in ppc64_elf_relocate_section. */
2733 #define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
2735 && ((INFO)->shared \
2736 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
2737 && ((H)->dynindx != -1 \
2738 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
2740 /* Allocate space in .plt, .got and associated reloc sections for
2744 allocate_dynrelocs (h
, inf
)
2745 struct elf_link_hash_entry
*h
;
2748 struct bfd_link_info
*info
;
2749 struct ppc_link_hash_table
*htab
;
2751 struct ppc_link_hash_entry
*eh
;
2752 struct ppc_dyn_relocs
*p
;
2754 if (h
->root
.type
== bfd_link_hash_indirect
2755 || h
->root
.type
== bfd_link_hash_warning
)
2758 info
= (struct bfd_link_info
*) inf
;
2759 htab
= ppc_hash_table (info
);
2761 if (htab
->elf
.dynamic_sections_created
2762 && h
->plt
.refcount
> 0
2763 && h
->dynindx
!= -1)
2765 BFD_ASSERT (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
);
2767 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info
, h
))
2769 /* If this is the first .plt entry, make room for the special
2772 if (s
->_raw_size
== 0)
2773 s
->_raw_size
+= PLT_INITIAL_ENTRY_SIZE
;
2775 h
->plt
.offset
= s
->_raw_size
;
2777 /* Make room for this entry. */
2778 s
->_raw_size
+= PLT_ENTRY_SIZE
;
2780 /* Make room for the .stub and .glink code. */
2782 s
->_raw_size
+= PLT_CALL_STUB_SIZE
;
2785 if (s
->_raw_size
== 0)
2786 s
->_raw_size
+= GLINK_CALL_STUB_SIZE
;
2787 /* We need bigger stubs past index 32767. */
2788 if (s
->_raw_size
>= GLINK_CALL_STUB_SIZE
+ 32768*2*4)
2790 s
->_raw_size
+= 2*4;
2792 /* We also need to make an entry in the .rela.plt section. */
2794 s
->_raw_size
+= sizeof (Elf64_External_Rela
);
2798 h
->plt
.offset
= (bfd_vma
) -1;
2799 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2804 h
->plt
.offset
= (bfd_vma
) -1;
2805 h
->elf_link_hash_flags
&= ~ELF_LINK_HASH_NEEDS_PLT
;
2808 if (h
->got
.refcount
> 0)
2812 /* Make sure this symbol is output as a dynamic symbol.
2813 Undefined weak syms won't yet be marked as dynamic. */
2814 if (h
->dynindx
== -1
2815 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
2817 if (! bfd_elf64_link_record_dynamic_symbol (info
, h
))
2822 h
->got
.offset
= s
->_raw_size
;
2824 dyn
= htab
->elf
.dynamic_sections_created
;
2825 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
, h
))
2826 htab
->srelgot
->_raw_size
+= sizeof (Elf64_External_Rela
);
2829 h
->got
.offset
= (bfd_vma
) -1;
2831 eh
= (struct ppc_link_hash_entry
*) h
;
2832 if (eh
->dyn_relocs
== NULL
)
2835 /* In the shared -Bsymbolic case, discard space allocated for
2836 dynamic pc-relative relocs against symbols which turn out to be
2837 defined in regular objects. For the normal shared case, discard
2838 space for relocs that have become local due to symbol visibility
2843 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) != 0
2844 && ((h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) != 0
2847 struct ppc_dyn_relocs
**pp
;
2849 for (pp
= &eh
->dyn_relocs
; (p
= *pp
) != NULL
; )
2851 p
->count
-= p
->pc_count
;
2862 /* For the non-shared case, discard space for relocs against
2863 symbols which turn out to need copy relocs or are not
2866 if ((h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
2867 && (((h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0
2868 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
) == 0)
2869 || (htab
->elf
.dynamic_sections_created
2870 && (h
->root
.type
== bfd_link_hash_undefweak
2871 || h
->root
.type
== bfd_link_hash_undefined
))))
2873 /* Make sure this symbol is output as a dynamic symbol.
2874 Undefined weak syms won't yet be marked as dynamic. */
2875 if (h
->dynindx
== -1
2876 && (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
) == 0)
2878 if (! bfd_elf64_link_record_dynamic_symbol (info
, h
))
2882 /* If that succeeded, we know we'll be keeping all the
2884 if (h
->dynindx
!= -1)
2888 eh
->dyn_relocs
= NULL
;
2893 /* Finally, allocate space. */
2894 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2896 asection
*sreloc
= elf_section_data (p
->sec
)->sreloc
;
2897 sreloc
->_raw_size
+= p
->count
* sizeof (Elf64_External_Rela
);
2903 /* Find any dynamic relocs that apply to read-only sections. */
2906 readonly_dynrelocs (h
, inf
)
2907 struct elf_link_hash_entry
*h
;
2910 struct ppc_link_hash_entry
*eh
;
2911 struct ppc_dyn_relocs
*p
;
2913 eh
= (struct ppc_link_hash_entry
*) h
;
2914 for (p
= eh
->dyn_relocs
; p
!= NULL
; p
= p
->next
)
2916 asection
*s
= p
->sec
->output_section
;
2918 if (s
!= NULL
&& (s
->flags
& SEC_READONLY
) != 0)
2920 struct bfd_link_info
*info
= (struct bfd_link_info
*) inf
;
2922 info
->flags
|= DF_TEXTREL
;
2924 /* Not an error, just cut short the traversal. */
2931 /* Set the sizes of the dynamic sections. */
2934 ppc64_elf_size_dynamic_sections (output_bfd
, info
)
2935 bfd
*output_bfd ATTRIBUTE_UNUSED
;
2936 struct bfd_link_info
*info
;
2938 struct ppc_link_hash_table
*htab
;
2944 htab
= ppc_hash_table (info
);
2945 dynobj
= htab
->elf
.dynobj
;
2949 if (htab
->elf
.dynamic_sections_created
)
2951 /* Set the contents of the .interp section to the interpreter. */
2954 s
= bfd_get_section_by_name (dynobj
, ".interp");
2957 s
->_raw_size
= sizeof ELF_DYNAMIC_INTERPRETER
;
2958 s
->contents
= (unsigned char *) ELF_DYNAMIC_INTERPRETER
;
2962 /* Set up .got offsets for local syms, and space for local dynamic
2964 for (ibfd
= info
->input_bfds
; ibfd
!= NULL
; ibfd
= ibfd
->link_next
)
2966 bfd_signed_vma
*local_got
;
2967 bfd_signed_vma
*end_local_got
;
2968 bfd_size_type locsymcount
;
2969 Elf_Internal_Shdr
*symtab_hdr
;
2972 if (bfd_get_flavour (ibfd
) != bfd_target_elf_flavour
)
2975 for (s
= ibfd
->sections
; s
!= NULL
; s
= s
->next
)
2977 struct ppc_dyn_relocs
*p
;
2979 for (p
= *((struct ppc_dyn_relocs
**)
2980 &elf_section_data (s
)->local_dynrel
);
2984 if (!bfd_is_abs_section (p
->sec
)
2985 && bfd_is_abs_section (p
->sec
->output_section
))
2987 /* Input section has been discarded, either because
2988 it is a copy of a linkonce section or due to
2989 linker script /DISCARD/, so we'll be discarding
2994 srel
= elf_section_data (p
->sec
)->sreloc
;
2995 srel
->_raw_size
+= p
->count
* sizeof (Elf64_External_Rela
);
3000 local_got
= elf_local_got_refcounts (ibfd
);
3004 symtab_hdr
= &elf_tdata (ibfd
)->symtab_hdr
;
3005 locsymcount
= symtab_hdr
->sh_info
;
3006 end_local_got
= local_got
+ locsymcount
;
3008 srel
= htab
->srelgot
;
3009 for (; local_got
< end_local_got
; ++local_got
)
3013 *local_got
= s
->_raw_size
;
3016 srel
->_raw_size
+= sizeof (Elf64_External_Rela
);
3019 *local_got
= (bfd_vma
) -1;
3023 /* Allocate global sym .plt and .got entries, and space for global
3024 sym dynamic relocs. */
3025 elf_link_hash_traverse (&htab
->elf
, allocate_dynrelocs
, (PTR
) info
);
3027 /* We now have determined the sizes of the various dynamic sections.
3028 Allocate memory for them. */
3030 for (s
= dynobj
->sections
; s
!= NULL
; s
= s
->next
)
3034 if ((s
->flags
& SEC_LINKER_CREATED
) == 0)
3040 || s
== htab
->sglink
)
3042 /* Strip this section if we don't need it; see the
3045 else if (strncmp (bfd_get_section_name (dynobj
, s
), ".rela", 5) == 0)
3047 if (s
->_raw_size
== 0)
3049 /* If we don't need this section, strip it from the
3050 output file. This is mostly to handle .rela.bss and
3051 .rela.plt. We must create both sections in
3052 create_dynamic_sections, because they must be created
3053 before the linker maps input sections to output
3054 sections. The linker does that before
3055 adjust_dynamic_symbol is called, and it is that
3056 function which decides whether anything needs to go
3057 into these sections. */
3061 if (s
!= htab
->srelplt
)
3064 /* We use the reloc_count field as a counter if we need
3065 to copy relocs into the output file. */
3071 /* It's not one of our sections, so don't allocate space. */
3075 if (s
->_raw_size
== 0)
3077 _bfd_strip_section_from_output (info
, s
);
3081 /* Allocate memory for the section contents. We use bfd_zalloc
3082 here in case unused entries are not reclaimed before the
3083 section's contents are written out. This should not happen,
3084 but this way if it does, we get a R_PPC64_NONE reloc instead
3086 size
= s
->_raw_size
;
3087 if (s
== htab
->sstub
)
3089 /* .stub may grow. Allocate enough for the maximum growth. */
3090 size
+= (size
+ 65536 + 65535) / 65536 * 4;
3092 s
->contents
= (bfd_byte
*) bfd_zalloc (dynobj
, size
);
3093 if (s
->contents
== NULL
)
3097 if (htab
->elf
.dynamic_sections_created
)
3099 /* Add some entries to the .dynamic section. We fill in the
3100 values later, in ppc64_elf_finish_dynamic_sections, but we
3101 must add the entries now so that we get the correct size for
3102 the .dynamic section. The DT_DEBUG entry is filled in by the
3103 dynamic linker and used by the debugger. */
3104 #define add_dynamic_entry(TAG, VAL) \
3105 bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
3109 if (!add_dynamic_entry (DT_DEBUG
, 0))
3113 if (htab
->splt
->_raw_size
!= 0)
3115 if (!add_dynamic_entry (DT_PLTGOT
, 0)
3116 || !add_dynamic_entry (DT_PLTRELSZ
, 0)
3117 || !add_dynamic_entry (DT_PLTREL
, DT_RELA
)
3118 || !add_dynamic_entry (DT_JMPREL
, 0)
3119 || !add_dynamic_entry (DT_PPC64_GLINK
, 0))
3125 if (!add_dynamic_entry (DT_RELA
, 0)
3126 || !add_dynamic_entry (DT_RELASZ
, 0)
3127 || !add_dynamic_entry (DT_RELAENT
, sizeof (Elf64_External_Rela
)))
3130 /* If any dynamic relocs apply to a read-only section,
3131 then we need a DT_TEXTREL entry. */
3132 elf_link_hash_traverse (&htab
->elf
, readonly_dynrelocs
, (PTR
) info
);
3134 if ((info
->flags
& DF_TEXTREL
) != 0)
3136 if (!add_dynamic_entry (DT_TEXTREL
, 0))
3141 #undef add_dynamic_entry
3146 /* Called after we have seen all the input files/sections, but before
3147 final symbol resolution and section placement has been determined.
3149 We use this hook to provide a value for TOCstart, which we store in
3150 the output bfd elf_gp. */
3153 ppc64_elf_set_toc (obfd
, info
)
3155 struct bfd_link_info
*info
;
3157 if (!info
->relocateable
)
3162 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
3163 order. The TOC starts where the first of these sections starts. */
3164 s
= bfd_get_section_by_name (obfd
, ".got");
3166 s
= bfd_get_section_by_name (obfd
, ".toc");
3168 s
= bfd_get_section_by_name (obfd
, ".tocbss");
3170 s
= bfd_get_section_by_name (obfd
, ".plt");
3173 /* This may happen for
3174 o references to TOC base (SYM@toc / TOC[tc0]) without a
3177 o --gc-sections and empty TOC sections
3179 FIXME: Warn user? */
3181 /* Look for a likely section. We probably won't even be
3183 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
3184 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
| SEC_READONLY
))
3185 == (SEC_ALLOC
| SEC_SMALL_DATA
))
3188 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
3189 if ((s
->flags
& (SEC_ALLOC
| SEC_SMALL_DATA
))
3190 == (SEC_ALLOC
| SEC_SMALL_DATA
))
3193 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
3194 if ((s
->flags
& (SEC_ALLOC
| SEC_READONLY
)) == SEC_ALLOC
)
3197 for (s
= obfd
->sections
; s
!= NULL
; s
= s
->next
)
3198 if ((s
->flags
& SEC_ALLOC
) == SEC_ALLOC
)
3204 TOCstart
= s
->output_section
->vma
+ s
->output_offset
;
3206 elf_gp (obfd
) = TOCstart
;
3211 /* PowerPC64 .plt entries are 24 bytes long, which doesn't divide
3212 evenly into 64k. Sometimes with a large enough .plt, we'll need to
3213 use offsets differing in the high 16 bits when accessing a .plt
3214 entry from a .plt call stub. This function adjusts the size of
3215 .stub to accommodate the extra stub instruction needed in such
3219 ppc64_elf_size_stubs (obfd
, info
, changed
)
3221 struct bfd_link_info
*info
;
3224 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
3225 bfd_vma plt_offset
, next_64k
;
3226 long base
, num
, extra
;
3228 /* .plt and .stub should be both present, or both absent. */
3229 if ((htab
->splt
== NULL
|| htab
->splt
->_raw_size
== 0)
3230 != (htab
->sstub
== NULL
|| htab
->sstub
->_raw_size
== 0))
3233 /* If no .plt, then nothing to do. */
3234 if (htab
->splt
== NULL
|| htab
->splt
->_raw_size
== 0)
3237 plt_offset
= (htab
->splt
->output_section
->vma
3238 + htab
->splt
->output_offset
3240 next_64k
= (plt_offset
+ 65535) & -65536;
3242 /* If the .plt doesn't have any entries crossing a 64k boundary,
3243 then there is no need for bigger stubs. */
3244 if (next_64k
<= plt_offset
+ htab
->splt
->_raw_size
)
3247 /* OK, so we have at least one transition. Since .plt entries are
3248 24 bytes long, we'll strike it lucky every 3*64k, with the 64k
3249 boundary between .plt entries. */
3250 base
= next_64k
/ 65536;
3251 num
= (plt_offset
+ htab
->splt
->_raw_size
- next_64k
) / 65536;
3252 extra
= (base
% 3 + num
+ 1) * 2 / 3;
3254 /* Allow one extra instruction for each EXTRA. The change in .stub
3255 may change the location of .toc and .plt. .toc and .plt ought to
3256 move as a group, but someone might be playing with eg. .plt
3257 alignment, so don't allow .stub size to decrease. */
3258 if (htab
->sstub
->_cooked_size
< htab
->sstub
->_raw_size
+ extra
* 4)
3260 htab
->sstub
->_cooked_size
= htab
->sstub
->_raw_size
+ extra
* 4;
3266 /* Build a .plt call stub. */
3269 build_plt_stub (obfd
, p
, offset
, glink
)
3275 #define PPC_LO(v) ((v) & 0xffff)
3276 #define PPC_HI(v) (((v) >> 16) & 0xffff)
3277 #define PPC_HA(v) PPC_HI ((v) + 0x8000)
3280 bfd_put_32 (obfd
, LD_R2_40R1
, p
), p
+= 4;
3281 bfd_put_32 (obfd
, ADDIS_R12_R2
| PPC_HA (offset
), p
), p
+= 4;
3283 bfd_put_32 (obfd
, STD_R2_40R1
, p
), p
+= 4;
3284 bfd_put_32 (obfd
, LD_R11_0R12
| PPC_LO (offset
), p
), p
+= 4;
3285 if (PPC_HA (offset
+ 8) != PPC_HA (offset
))
3286 bfd_put_32 (obfd
, ADDIS_R12_R12_1
, p
), p
+= 4;
3288 bfd_put_32 (obfd
, LD_R2_0R12
| PPC_LO (offset
), p
), p
+= 4;
3289 if (PPC_HA (offset
+ 8) != PPC_HA (offset
))
3290 bfd_put_32 (obfd
, ADDIS_R12_R12_1
, p
), p
+= 4;
3292 bfd_put_32 (obfd
, MTCTR_R11
, p
), p
+= 4;
3293 bfd_put_32 (obfd
, LD_R11_0R12
| PPC_LO (offset
), p
), p
+= 4;
3294 bfd_put_32 (obfd
, BCTR
, p
), p
+= 4;
3298 /* Build the stubs for one function call. */
3301 build_one_stub (h
, inf
)
3302 struct elf_link_hash_entry
*h
;
3305 struct bfd_link_info
*info
;
3306 struct ppc_link_hash_table
*htab
;
3308 if (h
->root
.type
== bfd_link_hash_indirect
3309 || h
->root
.type
== bfd_link_hash_warning
)
3312 info
= (struct bfd_link_info
*) inf
;
3313 htab
= ppc_hash_table (info
);
3315 if (htab
->elf
.dynamic_sections_created
3316 && h
->plt
.offset
!= (bfd_vma
) -1)
3318 struct elf_link_hash_entry
*fh
;
3324 BFD_ASSERT (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
);
3326 fh
= elf_link_hash_lookup (&htab
->elf
, h
->root
.root
.string
- 1,
3327 false, false, true);
3332 BFD_ASSERT (((struct ppc_link_hash_entry
*) fh
)->is_func
);
3334 /* Point the function at the linkage stub. This works because
3335 the only references to the function code sym are calls.
3336 Function pointer comparisons use the function descriptor. */
3338 fh
->root
.type
= bfd_link_hash_defined
;
3339 fh
->root
.u
.def
.section
= s
;
3340 fh
->root
.u
.def
.value
= s
->_cooked_size
;
3342 /* Build the .plt call stub. */
3343 plt_r2
= (htab
->splt
->output_section
->vma
3344 + htab
->splt
->output_offset
3346 - elf_gp (htab
->splt
->output_section
->owner
)
3349 if (plt_r2
+ 0x80000000 > 0xffffffff
3350 || (plt_r2
& 3) != 0)
3352 (*_bfd_error_handler
)
3353 (_("linkage table error against `%s'"),
3354 h
->root
.root
.string
);
3355 bfd_set_error (bfd_error_bad_value
);
3356 htab
->plt_overflow
= true;
3359 p
= s
->contents
+ s
->_cooked_size
;
3360 p
= build_plt_stub (s
->owner
, p
, (int) plt_r2
, 0);
3361 s
->_cooked_size
= p
- s
->contents
;
3363 /* Build the .glink lazy link call stub. */
3365 p
= s
->contents
+ s
->_cooked_size
;
3366 indx
= s
->reloc_count
;
3369 bfd_put_32 (s
->owner
, LI_R0_0
| indx
, p
);
3374 bfd_put_32 (s
->owner
, LIS_R0_0
| PPC_HI (indx
), p
);
3376 bfd_put_32 (s
->owner
, ORI_R0_R0_0
| PPC_LO (indx
), p
);
3379 bfd_put_32 (s
->owner
, B_DOT
| ((s
->contents
- p
) & 0x3fffffc), p
);
3381 s
->_cooked_size
= p
- s
->contents
;
3382 s
->reloc_count
+= 1;
3388 ppc64_elf_build_stubs (obfd
, info
)
3390 struct bfd_link_info
*info
;
3392 struct ppc_link_hash_table
*htab
= ppc_hash_table (info
);
3393 bfd_vma old_stub_size
;
3397 /* If no .plt stubs, then nothing to do. */
3398 if (htab
->sstub
== NULL
|| htab
->sstub
->_raw_size
== 0)
3401 old_stub_size
= htab
->sstub
->_cooked_size
;
3402 htab
->sstub
->_cooked_size
= 0;
3404 /* Build the .glink plt call stub. */
3405 plt_r2
= (htab
->splt
->output_section
->vma
3406 + htab
->splt
->output_offset
3409 p
= htab
->sglink
->contents
;
3410 p
= build_plt_stub (htab
->sglink
->owner
, p
, (int) plt_r2
, 1);
3411 while (p
- htab
->sglink
->contents
< GLINK_CALL_STUB_SIZE
)
3413 bfd_put_32 (htab
->sglink
->owner
, NOP
, p
);
3416 htab
->sglink
->_cooked_size
= p
- htab
->sglink
->contents
;
3418 /* Use reloc_count to count entries. */
3419 htab
->sglink
->reloc_count
= 0;
3421 elf_link_hash_traverse (&htab
->elf
, build_one_stub
, (PTR
) info
);
3422 htab
->sglink
->reloc_count
= 0;
3424 if (htab
->plt_overflow
)
3427 if (old_stub_size
!= htab
->sstub
->_cooked_size
3428 || htab
->sglink
->_raw_size
!= htab
->sglink
->_cooked_size
)
3430 (*_bfd_error_handler
)
3431 (_("stub section size doesn't match calculated size"));
3432 bfd_set_error (bfd_error_bad_value
);
3438 /* Set up any other section flags and such that may be necessary. */
3441 ppc64_elf_fake_sections (abfd
, shdr
, asect
)
3442 bfd
*abfd ATTRIBUTE_UNUSED
;
3443 Elf64_Internal_Shdr
*shdr
;
3446 if ((asect
->flags
& SEC_EXCLUDE
) != 0)
3447 shdr
->sh_flags
|= SHF_EXCLUDE
;
3449 if ((asect
->flags
& SEC_SORT_ENTRIES
) != 0)
3450 shdr
->sh_type
= SHT_ORDERED
;
3455 /* The RELOCATE_SECTION function is called by the ELF backend linker
3456 to handle the relocations for a section.
3458 The relocs are always passed as Rela structures; if the section
3459 actually uses Rel structures, the r_addend field will always be
3462 This function is responsible for adjust the section contents as
3463 necessary, and (if using Rela relocs and generating a
3464 relocateable output file) adjusting the reloc addend as
3467 This function does not have to worry about setting the reloc
3468 address or the reloc symbol index.
3470 LOCAL_SYMS is a pointer to the swapped in local symbols.
3472 LOCAL_SECTIONS is an array giving the section in the input file
3473 corresponding to the st_shndx field of each local symbol.
3475 The global hash table entry for the global symbols can be found
3476 via elf_sym_hashes (input_bfd).
3478 When generating relocateable output, this function must handle
3479 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
3480 going to be the section symbol corresponding to the output
3481 section, which means that the addend must be adjusted
3485 ppc64_elf_relocate_section (output_bfd
, info
, input_bfd
, input_section
,
3486 contents
, relocs
, local_syms
, local_sections
)
3488 struct bfd_link_info
*info
;
3490 asection
*input_section
;
3492 Elf_Internal_Rela
*relocs
;
3493 Elf_Internal_Sym
*local_syms
;
3494 asection
**local_sections
;
3496 struct ppc_link_hash_table
*htab
;
3497 Elf_Internal_Shdr
*symtab_hdr
;
3498 struct elf_link_hash_entry
**sym_hashes
;
3499 Elf_Internal_Rela
*rel
;
3500 Elf_Internal_Rela
*relend
;
3501 bfd_vma
*local_got_offsets
;
3505 /* Initialize howto table if needed. */
3506 if (!ppc64_elf_howto_table
[R_PPC64_ADDR32
])
3509 htab
= ppc_hash_table (info
);
3510 local_got_offsets
= elf_local_got_offsets (input_bfd
);
3511 TOCstart
= elf_gp (output_bfd
);
3512 symtab_hdr
= &elf_tdata (input_bfd
)->symtab_hdr
;
3513 sym_hashes
= elf_sym_hashes (input_bfd
);
3516 relend
= relocs
+ input_section
->reloc_count
;
3517 for (; rel
< relend
; rel
++)
3519 enum elf_ppc_reloc_type r_type
;
3522 bfd_reloc_status_type r
;
3523 Elf_Internal_Sym
*sym
;
3525 struct elf_link_hash_entry
*h
;
3526 const char *sym_name
;
3527 unsigned long r_symndx
;
3529 boolean unresolved_reloc
;
3533 r_type
= (enum elf_ppc_reloc_type
) ELF64_R_TYPE (rel
->r_info
);
3534 r_symndx
= ELF64_R_SYM (rel
->r_info
);
3536 if (info
->relocateable
)
3538 /* This is a relocatable link. We don't have to change
3539 anything, unless the reloc is against a section symbol,
3540 in which case we have to adjust according to where the
3541 section symbol winds up in the output section. */
3542 if (r_symndx
< symtab_hdr
->sh_info
)
3544 sym
= local_syms
+ r_symndx
;
3545 if ((unsigned) ELF_ST_TYPE (sym
->st_info
) == STT_SECTION
)
3547 sec
= local_sections
[r_symndx
];
3548 rel
->r_addend
+= sec
->output_offset
+ sym
->st_value
;
3554 /* This is a final link. */
3556 offset
= rel
->r_offset
;
3557 addend
= rel
->r_addend
;
3558 r
= bfd_reloc_other
;
3559 sym
= (Elf_Internal_Sym
*) 0;
3560 sec
= (asection
*) 0;
3561 h
= (struct elf_link_hash_entry
*) 0;
3562 sym_name
= (const char *) 0;
3563 unresolved_reloc
= false;
3565 if (r_type
== R_PPC64_TOC
)
3567 /* Relocation value is TOC base. Symbol is ignored. */
3568 relocation
= TOCstart
+ TOC_BASE_OFF
;
3570 else if (r_symndx
< symtab_hdr
->sh_info
)
3572 /* It's a local symbol. */
3573 sym
= local_syms
+ r_symndx
;
3574 sec
= local_sections
[r_symndx
];
3575 sym_name
= "<local symbol>";
3577 relocation
= _bfd_elf_rela_local_sym (output_bfd
, sym
, sec
, rel
);
3578 addend
= rel
->r_addend
;
3582 /* It's a global symbol. */
3583 h
= sym_hashes
[r_symndx
- symtab_hdr
->sh_info
];
3584 while (h
->root
.type
== bfd_link_hash_indirect
3585 || h
->root
.type
== bfd_link_hash_warning
)
3586 h
= (struct elf_link_hash_entry
*) h
->root
.u
.i
.link
;
3587 sym_name
= h
->root
.root
.string
;
3589 if (h
->root
.type
== bfd_link_hash_defined
3590 || h
->root
.type
== bfd_link_hash_defweak
)
3592 sec
= h
->root
.u
.def
.section
;
3593 if (sec
->output_section
== NULL
)
3594 /* Set a flag that will be cleared later if we find a
3595 relocation value for this symbol. output_section
3596 is typically NULL for symbols satisfied by a shared
3598 unresolved_reloc
= true;
3600 relocation
= (h
->root
.u
.def
.value
3601 + sec
->output_section
->vma
3602 + sec
->output_offset
);
3604 else if (h
->root
.type
== bfd_link_hash_undefweak
)
3606 else if (info
->shared
3607 && (!info
->symbolic
|| info
->allow_shlib_undefined
)
3608 && !info
->no_undefined
3609 && ELF_ST_VISIBILITY (h
->other
) == STV_DEFAULT
)
3613 if (! ((*info
->callbacks
->undefined_symbol
)
3614 (info
, h
->root
.root
.string
, input_bfd
, input_section
,
3615 offset
, (!info
->shared
3616 || info
->no_undefined
3617 || ELF_ST_VISIBILITY (h
->other
)))))
3623 /* First handle relocations that tweak non-addend part of insn. */
3630 /* Branch taken prediction relocations. */
3631 case R_PPC64_ADDR14_BRTAKEN
:
3632 case R_PPC64_REL14_BRTAKEN
:
3633 insn
= 0x01 << 21; /* Set 't' bit, lowest bit of BO field. */
3636 /* Branch not taken prediction relocations. */
3637 case R_PPC64_ADDR14_BRNTAKEN
:
3638 case R_PPC64_REL14_BRNTAKEN
:
3639 insn
|= bfd_get_32 (output_bfd
, contents
+ offset
) & ~(0x01 << 21);
3640 /* Set 'a' bit. This is 0b00010 in BO field for branch on CR(BI)
3641 insns (BO == 001at or 011at), and 0b01000 for branch on CTR
3642 insns (BO == 1a00t or 1a01t). */
3643 if ((insn
& (0x14 << 21)) == (0x04 << 21))
3645 else if ((insn
& (0x14 << 21)) == (0x10 << 21))
3650 bfd_put_32 (output_bfd
, (bfd_vma
) insn
, contents
+ offset
);
3654 case R_PPC64_ADDR24
:
3655 /* An ADDR24 or REL24 branching to a linkage function may be
3656 followed by a nop that we have to replace with a ld in
3657 order to restore the TOC base pointer. Only calls to
3658 shared objects need to alter the TOC base. These are
3659 recognized by their need for a PLT entry. */
3662 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_PLT
) != 0
3663 /* Make sure that there really is an instruction after
3664 the branch that we can decode. */
3665 && offset
+ 8 <= input_section
->_cooked_size
)
3669 pnext
= contents
+ offset
+ 4;
3670 insn
= bfd_get_32 (input_bfd
, pnext
);
3672 if (insn
== 0x60000000 /* nop (ori r0,r0,0) */
3673 || insn
== 0x4def7b82 /* cror 15,15,15 */
3674 || insn
== 0x4ffffb82) /* cror 31,31,31 */
3676 bfd_put_32 (input_bfd
,
3677 (bfd_vma
) 0xe8410028, /* ld r2,40(r1) */
3684 && h
->root
.type
== bfd_link_hash_undefweak
3685 && r_type
== R_PPC64_REL24
3689 /* Tweak calls to undefined weak functions to behave as
3690 if the "called" function immediately returns. We can
3691 thus call to a weak function without first checking
3692 whether the function is defined. */
3704 (*_bfd_error_handler
)
3705 (_("%s: unknown relocation type %d for symbol %s"),
3706 bfd_archive_filename (input_bfd
), (int) r_type
, sym_name
);
3708 bfd_set_error (bfd_error_bad_value
);
3713 case R_PPC_GNU_VTINHERIT
:
3714 case R_PPC_GNU_VTENTRY
:
3717 /* GOT16 relocations. Like an ADDR16 using the symbol's
3718 address in the GOT as relocation value instead of the
3719 symbols value itself. Also, create a GOT entry for the
3720 symbol and put the symbol value there. */
3722 case R_PPC64_GOT16_LO
:
3723 case R_PPC64_GOT16_HI
:
3724 case R_PPC64_GOT16_HA
:
3725 case R_PPC64_GOT16_DS
:
3726 case R_PPC64_GOT16_LO_DS
:
3728 /* Relocation is to the entry for this symbol in the global
3732 if (htab
->sgot
== NULL
)
3739 off
= h
->got
.offset
;
3740 dyn
= htab
->elf
.dynamic_sections_created
;
3741 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn
, info
, h
)
3745 || (h
->elf_link_hash_flags
3746 & ELF_LINK_FORCED_LOCAL
))
3747 && (h
->elf_link_hash_flags
3748 & ELF_LINK_HASH_DEF_REGULAR
)))
3750 /* This is actually a static link, or it is a
3751 -Bsymbolic link and the symbol is defined
3752 locally, or the symbol was forced to be local
3753 because of a version file. We must initialize
3754 this entry in the global offset table. Since the
3755 offset must always be a multiple of 8, we use the
3756 least significant bit to record whether we have
3757 initialized it already.
3759 When doing a dynamic link, we create a .rel.got
3760 relocation entry to initialize the value. This
3761 is done in the finish_dynamic_symbol routine. */
3766 bfd_put_64 (output_bfd
, relocation
,
3767 htab
->sgot
->contents
+ off
);
3772 unresolved_reloc
= false;
3776 if (local_got_offsets
== NULL
)
3779 off
= local_got_offsets
[r_symndx
];
3781 /* The offset must always be a multiple of 8. We use
3782 the least significant bit to record whether we have
3783 already processed this entry. */
3788 bfd_put_64 (output_bfd
, relocation
,
3789 htab
->sgot
->contents
+ off
);
3793 Elf_Internal_Rela outrel
;
3794 Elf64_External_Rela
*loc
;
3796 /* We need to generate a R_PPC64_RELATIVE reloc
3797 for the dynamic linker. */
3798 outrel
.r_offset
= (htab
->sgot
->output_section
->vma
3799 + htab
->sgot
->output_offset
3801 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
3802 outrel
.r_addend
= relocation
;
3803 loc
= (Elf64_External_Rela
*) htab
->srelgot
->contents
;
3804 loc
+= htab
->srelgot
->reloc_count
++;
3805 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
3808 local_got_offsets
[r_symndx
] |= 1;
3812 if (off
>= (bfd_vma
) -2)
3815 relocation
= htab
->sgot
->output_offset
+ off
;
3817 /* TOC base (r2) is TOC start plus 0x8000. */
3818 addend
-= TOC_BASE_OFF
;
3822 case R_PPC64_PLT16_HA
:
3823 case R_PPC64_PLT16_HI
:
3824 case R_PPC64_PLT16_LO
:
3827 /* Relocation is to the entry for this symbol in the
3828 procedure linkage table. */
3830 /* Resolve a PLT reloc against a local symbol directly,
3831 without using the procedure linkage table. */
3835 if (h
->plt
.offset
== (bfd_vma
) -1
3836 || htab
->splt
== NULL
)
3838 /* We didn't make a PLT entry for this symbol. This
3839 happens when statically linking PIC code, or when
3840 using -Bsymbolic. */
3844 relocation
= (htab
->splt
->output_section
->vma
3845 + htab
->splt
->output_offset
3847 unresolved_reloc
= false;
3850 /* TOC16 relocs. We want the offset relative to the TOC base,
3851 which is the address of the start of the TOC plus 0x8000.
3852 The TOC consists of sections .got, .toc, .tocbss, and .plt,
3855 case R_PPC64_TOC16_LO
:
3856 case R_PPC64_TOC16_HI
:
3857 case R_PPC64_TOC16_DS
:
3858 case R_PPC64_TOC16_LO_DS
:
3859 case R_PPC64_TOC16_HA
:
3860 addend
-= TOCstart
+ TOC_BASE_OFF
;
3863 /* Relocate against the beginning of the section. */
3864 case R_PPC64_SECTOFF
:
3865 case R_PPC64_SECTOFF_LO
:
3866 case R_PPC64_SECTOFF_HI
:
3867 case R_PPC64_SECTOFF_DS
:
3868 case R_PPC64_SECTOFF_LO_DS
:
3869 case R_PPC64_SECTOFF_HA
:
3870 if (sec
!= (asection
*) 0)
3871 addend
-= sec
->output_section
->vma
;
3877 /* Relocations that may need to be propagated if this is a
3880 case R_PPC64_REL14_BRNTAKEN
:
3881 case R_PPC64_REL14_BRTAKEN
:
3884 case R_PPC64_ADDR14
:
3885 case R_PPC64_ADDR14_BRNTAKEN
:
3886 case R_PPC64_ADDR14_BRTAKEN
:
3887 case R_PPC64_ADDR16
:
3888 case R_PPC64_ADDR16_DS
:
3889 case R_PPC64_ADDR16_HA
:
3890 case R_PPC64_ADDR16_HI
:
3891 case R_PPC64_ADDR16_HIGHER
:
3892 case R_PPC64_ADDR16_HIGHERA
:
3893 case R_PPC64_ADDR16_HIGHEST
:
3894 case R_PPC64_ADDR16_HIGHESTA
:
3895 case R_PPC64_ADDR16_LO
:
3896 case R_PPC64_ADDR16_LO_DS
:
3897 case R_PPC64_ADDR24
:
3898 case R_PPC64_ADDR30
:
3899 case R_PPC64_ADDR32
:
3900 case R_PPC64_ADDR64
:
3901 case R_PPC64_UADDR16
:
3902 case R_PPC64_UADDR32
:
3903 case R_PPC64_UADDR64
:
3904 /* r_symndx will be zero only for relocs against symbols
3905 from removed linkonce sections, or sections discarded by
3912 if ((input_section
->flags
& SEC_ALLOC
) == 0)
3916 && (IS_ABSOLUTE_RELOC (r_type
)
3919 && (! info
->symbolic
3920 || (h
->elf_link_hash_flags
3921 & ELF_LINK_HASH_DEF_REGULAR
) == 0))))
3925 && (h
->elf_link_hash_flags
& ELF_LINK_NON_GOT_REF
) == 0
3926 && (((h
->elf_link_hash_flags
3927 & ELF_LINK_HASH_DEF_DYNAMIC
) != 0
3928 && (h
->elf_link_hash_flags
3929 & ELF_LINK_HASH_DEF_REGULAR
) == 0)
3930 || h
->root
.type
== bfd_link_hash_undefweak
3931 || h
->root
.type
== bfd_link_hash_undefined
)))
3933 Elf_Internal_Rela outrel
;
3934 boolean skip
, relocate
;
3936 Elf64_External_Rela
*loc
;
3939 if (strcmp (bfd_get_section_name (output_bfd
, input_section
),
3944 /* When generating a dynamic object, these relocations
3945 are copied into the output file to be resolved at run
3951 _bfd_elf_section_offset (output_bfd
, info
, input_section
,
3953 if (outrel
.r_offset
== (bfd_vma
) -1)
3956 outrel
.r_offset
+= (input_section
->output_section
->vma
3957 + input_section
->output_offset
);
3958 outrel
.r_addend
= addend
;
3963 memset (&outrel
, 0, sizeof outrel
);
3967 && (!IS_ABSOLUTE_RELOC (r_type
)
3970 || (h
->elf_link_hash_flags
3971 & ELF_LINK_HASH_DEF_REGULAR
) == 0))
3974 outrel
.r_info
= ELF64_R_INFO (h
->dynindx
, r_type
);
3978 /* This symbol is local, or marked to become local. */
3979 outrel
.r_addend
+= relocation
;
3981 if (r_type
== R_PPC64_ADDR64
|| r_type
== R_PPC64_TOC
)
3983 outrel
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
3989 if (r_type
== R_PPC64_TOC
|| bfd_is_abs_section (sec
))
3991 else if (sec
== NULL
|| sec
->owner
== NULL
)
3993 bfd_set_error (bfd_error_bad_value
);
4000 osec
= sec
->output_section
;
4001 indx
= elf_section_data (osec
)->dynindx
;
4003 /* We are turning this relocation into one
4004 against a section symbol, so subtract out
4005 the output section's address but not the
4006 offset of the input section in the output
4008 outrel
.r_addend
-= osec
->vma
;
4011 outrel
.r_info
= ELF64_R_INFO (indx
, r_type
);
4015 sreloc
= elf_section_data (input_section
)->sreloc
;
4019 loc
= (Elf64_External_Rela
*) sreloc
->contents
;
4020 loc
+= sreloc
->reloc_count
++;
4021 bfd_elf64_swap_reloca_out (output_bfd
, &outrel
, loc
);
4023 /* If this reloc is against an external symbol, it will
4024 be computed at runtime, so there's no need to do
4032 case R_PPC64_GLOB_DAT
:
4033 case R_PPC64_JMP_SLOT
:
4034 case R_PPC64_RELATIVE
:
4035 /* We shouldn't ever see these dynamic relocs in relocatable
4039 case R_PPC64_PLTGOT16
:
4040 case R_PPC64_PLTGOT16_DS
:
4041 case R_PPC64_PLTGOT16_HA
:
4042 case R_PPC64_PLTGOT16_HI
:
4043 case R_PPC64_PLTGOT16_LO
:
4044 case R_PPC64_PLTGOT16_LO_DS
:
4045 case R_PPC64_PLTREL32
:
4046 case R_PPC64_PLTREL64
:
4047 /* These ones haven't been implemented yet. */
4049 (*_bfd_error_handler
)
4050 (_("%s: Relocation %s is not supported for symbol %s."),
4051 bfd_archive_filename (input_bfd
),
4052 ppc64_elf_howto_table
[(int) r_type
]->name
, sym_name
);
4054 bfd_set_error (bfd_error_invalid_operation
);
4059 /* Do any further special processing. */
4065 case R_PPC64_ADDR16_HA
:
4066 case R_PPC64_ADDR16_HIGHERA
:
4067 case R_PPC64_ADDR16_HIGHESTA
:
4068 case R_PPC64_PLT16_HA
:
4069 case R_PPC64_TOC16_HA
:
4070 case R_PPC64_SECTOFF_HA
:
4071 /* It's just possible that this symbol is a weak symbol
4072 that's not actually defined anywhere. In that case,
4073 'sec' would be NULL, and we should leave the symbol
4074 alone (it will be set to zero elsewhere in the link). */
4076 /* Add 0x10000 if sign bit in 0:15 is set. */
4077 addend
+= ((relocation
+ addend
) & 0x8000) << 1;
4080 case R_PPC64_ADDR16_DS
:
4081 case R_PPC64_ADDR16_LO_DS
:
4082 case R_PPC64_GOT16_DS
:
4083 case R_PPC64_GOT16_LO_DS
:
4084 case R_PPC64_PLT16_LO_DS
:
4085 case R_PPC64_SECTOFF_DS
:
4086 case R_PPC64_SECTOFF_LO_DS
:
4087 case R_PPC64_TOC16_DS
:
4088 case R_PPC64_TOC16_LO_DS
:
4089 case R_PPC64_PLTGOT16_DS
:
4090 case R_PPC64_PLTGOT16_LO_DS
:
4091 if (((relocation
+ addend
) & 3) != 0)
4093 (*_bfd_error_handler
)
4094 (_("%s: error: relocation %s not a multiple of 4"),
4095 bfd_archive_filename (input_bfd
),
4096 ppc64_elf_howto_table
[(int) r_type
]->name
);
4097 bfd_set_error (bfd_error_bad_value
);
4104 /* FIXME: Why do we allow debugging sections to escape this error?
4105 More importantly, why do we not emit dynamic relocs above in
4106 debugging sections (which are ! SEC_ALLOC)? If we had
4107 emitted the dynamic reloc, we could remove the fudge here. */
4108 if (unresolved_reloc
4110 && (input_section
->flags
& SEC_DEBUGGING
) != 0
4111 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_DYNAMIC
) != 0))
4112 (*_bfd_error_handler
)
4113 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
4114 bfd_archive_filename (input_bfd
),
4115 bfd_get_section_name (input_bfd
, input_section
),
4116 (long) rel
->r_offset
,
4117 h
->root
.root
.string
);
4119 r
= _bfd_final_link_relocate (ppc64_elf_howto_table
[(int) r_type
],
4127 if (r
== bfd_reloc_ok
)
4129 else if (r
== bfd_reloc_overflow
)
4135 if (h
->root
.type
== bfd_link_hash_undefweak
4136 && ppc64_elf_howto_table
[(int) r_type
]->pc_relative
)
4138 /* Assume this is a call protected by other code that
4139 detects the symbol is undefined. If this is the case,
4140 we can safely ignore the overflow. If not, the
4141 program is hosed anyway, and a little warning isn't
4147 name
= h
->root
.root
.string
;
4151 name
= bfd_elf_string_from_elf_section (input_bfd
,
4152 symtab_hdr
->sh_link
,
4157 name
= bfd_section_name (input_bfd
, sec
);
4160 if (! ((*info
->callbacks
->reloc_overflow
)
4161 (info
, name
, ppc64_elf_howto_table
[(int) r_type
]->name
,
4162 (bfd_vma
) 0, input_bfd
, input_section
, offset
)))
4172 /* Finish up dynamic symbol handling. We set the contents of various
4173 dynamic sections here. */
4176 ppc64_elf_finish_dynamic_symbol (output_bfd
, info
, h
, sym
)
4178 struct bfd_link_info
*info
;
4179 struct elf_link_hash_entry
*h
;
4180 Elf_Internal_Sym
*sym
;
4182 struct ppc_link_hash_table
*htab
;
4185 htab
= ppc_hash_table (info
);
4186 dynobj
= htab
->elf
.dynobj
;
4188 if (h
->plt
.offset
!= (bfd_vma
) -1)
4190 Elf_Internal_Rela rela
;
4191 Elf64_External_Rela
*loc
;
4193 /* This symbol has an entry in the procedure linkage table. Set
4196 if (htab
->splt
== NULL
4197 || htab
->srelplt
== NULL
4198 || htab
->sglink
== NULL
)
4201 BFD_ASSERT (((struct ppc_link_hash_entry
*) h
)->is_func_descriptor
);
4203 /* Create a JMP_SLOT reloc to inform the dynamic linker to
4204 fill in the PLT entry. */
4206 rela
.r_offset
= (htab
->splt
->output_section
->vma
4207 + htab
->splt
->output_offset
4209 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_JMP_SLOT
);
4212 loc
= (Elf64_External_Rela
*) htab
->srelplt
->contents
;
4213 loc
+= (h
->plt
.offset
- PLT_INITIAL_ENTRY_SIZE
) / PLT_ENTRY_SIZE
;
4214 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
4217 if (h
->got
.offset
!= (bfd_vma
) -1)
4219 Elf_Internal_Rela rela
;
4220 Elf64_External_Rela
*loc
;
4222 /* This symbol has an entry in the global offset table. Set it
4225 if (htab
->sgot
== NULL
|| htab
->srelgot
== NULL
)
4228 rela
.r_offset
= (htab
->sgot
->output_section
->vma
4229 + htab
->sgot
->output_offset
4230 + (h
->got
.offset
&~ (bfd_vma
) 1));
4232 /* If this is a static link, or it is a -Bsymbolic link and the
4233 symbol is defined locally or was forced to be local because
4234 of a version file, we just want to emit a RELATIVE reloc.
4235 The entry in the global offset table will already have been
4236 initialized in the relocate_section function. */
4240 || (h
->elf_link_hash_flags
& ELF_LINK_FORCED_LOCAL
))
4241 && (h
->elf_link_hash_flags
& ELF_LINK_HASH_DEF_REGULAR
))
4243 BFD_ASSERT((h
->got
.offset
& 1) != 0);
4244 rela
.r_info
= ELF64_R_INFO (0, R_PPC64_RELATIVE
);
4245 rela
.r_addend
= (h
->root
.u
.def
.value
4246 + h
->root
.u
.def
.section
->output_section
->vma
4247 + h
->root
.u
.def
.section
->output_offset
);
4251 BFD_ASSERT ((h
->got
.offset
& 1) == 0);
4252 bfd_put_64 (output_bfd
, (bfd_vma
) 0,
4253 htab
->sgot
->contents
+ h
->got
.offset
);
4254 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_GLOB_DAT
);
4258 loc
= (Elf64_External_Rela
*) htab
->srelgot
->contents
;
4259 loc
+= htab
->srelgot
->reloc_count
++;
4260 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
4263 if ((h
->elf_link_hash_flags
& ELF_LINK_HASH_NEEDS_COPY
) != 0)
4265 Elf_Internal_Rela rela
;
4266 Elf64_External_Rela
*loc
;
4268 /* This symbol needs a copy reloc. Set it up. */
4270 if (h
->dynindx
== -1
4271 || (h
->root
.type
!= bfd_link_hash_defined
4272 && h
->root
.type
!= bfd_link_hash_defweak
)
4273 || htab
->srelbss
== NULL
)
4276 rela
.r_offset
= (h
->root
.u
.def
.value
4277 + h
->root
.u
.def
.section
->output_section
->vma
4278 + h
->root
.u
.def
.section
->output_offset
);
4279 rela
.r_info
= ELF64_R_INFO (h
->dynindx
, R_PPC64_COPY
);
4281 loc
= (Elf64_External_Rela
*) htab
->srelbss
->contents
;
4282 loc
+= htab
->srelbss
->reloc_count
++;
4283 bfd_elf64_swap_reloca_out (output_bfd
, &rela
, loc
);
4286 /* Mark some specially defined symbols as absolute. */
4287 if (strcmp (h
->root
.root
.string
, "_DYNAMIC") == 0)
4288 sym
->st_shndx
= SHN_ABS
;
4293 /* Used to decide how to sort relocs in an optimal manner for the
4294 dynamic linker, before writing them out. */
4296 static enum elf_reloc_type_class
4297 ppc64_elf_reloc_type_class (rela
)
4298 const Elf_Internal_Rela
*rela
;
4300 enum elf_ppc_reloc_type r_type
;
4302 r_type
= (enum elf_ppc_reloc_type
) ELF64_R_TYPE (rela
->r_info
);
4305 case R_PPC64_RELATIVE
:
4306 return reloc_class_relative
;
4307 case R_PPC64_JMP_SLOT
:
4308 return reloc_class_plt
;
4310 return reloc_class_copy
;
4312 return reloc_class_normal
;
4316 /* Finish up the dynamic sections. */
4319 ppc64_elf_finish_dynamic_sections (output_bfd
, info
)
4321 struct bfd_link_info
*info
;
4323 struct ppc_link_hash_table
*htab
;
4327 htab
= ppc_hash_table (info
);
4328 dynobj
= htab
->elf
.dynobj
;
4329 sdyn
= bfd_get_section_by_name (dynobj
, ".dynamic");
4331 if (htab
->elf
.dynamic_sections_created
)
4333 Elf64_External_Dyn
*dyncon
, *dynconend
;
4335 if (sdyn
== NULL
|| htab
->sgot
== NULL
)
4338 dyncon
= (Elf64_External_Dyn
*) sdyn
->contents
;
4339 dynconend
= (Elf64_External_Dyn
*) (sdyn
->contents
+ sdyn
->_raw_size
);
4340 for (; dyncon
< dynconend
; dyncon
++)
4342 Elf_Internal_Dyn dyn
;
4344 bfd_elf64_swap_dyn_in (dynobj
, dyncon
, &dyn
);
4351 case DT_PPC64_GLINK
:
4352 dyn
.d_un
.d_ptr
= (htab
->sglink
->output_section
->vma
4353 + htab
->sglink
->output_offset
);
4357 dyn
.d_un
.d_ptr
= (htab
->splt
->output_section
->vma
4358 + htab
->splt
->output_offset
);
4362 dyn
.d_un
.d_ptr
= (htab
->srelplt
->output_section
->vma
4363 + htab
->srelplt
->output_offset
);
4367 dyn
.d_un
.d_val
= htab
->srelplt
->_raw_size
;
4371 /* Don't count procedure linkage table relocs in the
4372 overall reloc count. */
4373 if (htab
->srelplt
!= NULL
)
4374 dyn
.d_un
.d_val
-= htab
->srelplt
->_raw_size
;
4378 bfd_elf64_swap_dyn_out (output_bfd
, &dyn
, dyncon
);
4382 if (htab
->sgot
!= NULL
&& htab
->sgot
->_raw_size
!= 0)
4384 /* Fill in the first entry in the global offset table.
4385 We use it to hold the link-time TOCbase. */
4386 bfd_put_64 (output_bfd
,
4387 elf_gp (output_bfd
) - TOC_BASE_OFF
,
4388 htab
->sgot
->contents
);
4390 /* Set .got entry size. */
4391 elf_section_data (htab
->sgot
->output_section
)->this_hdr
.sh_entsize
= 8;
4394 if (htab
->splt
!= NULL
&& htab
->splt
->_raw_size
!= 0)
4396 /* Set .plt entry size. */
4397 elf_section_data (htab
->splt
->output_section
)->this_hdr
.sh_entsize
4404 #define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
4405 #define TARGET_LITTLE_NAME "elf64-powerpcle"
4406 #define TARGET_BIG_SYM bfd_elf64_powerpc_vec
4407 #define TARGET_BIG_NAME "elf64-powerpc"
4408 #define ELF_ARCH bfd_arch_powerpc
4409 #define ELF_MACHINE_CODE EM_PPC64
4410 #define ELF_MAXPAGESIZE 0x10000
4411 #define elf_info_to_howto ppc64_elf_info_to_howto
4413 #ifdef EM_CYGNUS_POWERPC
4414 #define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC
4418 #define ELF_MACHINE_ALT2 EM_PPC_OLD
4421 #define elf_backend_want_got_sym 0
4422 #define elf_backend_want_plt_sym 0
4423 #define elf_backend_plt_alignment 3
4424 #define elf_backend_plt_not_loaded 1
4425 #define elf_backend_got_symbol_offset 0
4426 #define elf_backend_got_header_size 8
4427 #define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
4428 #define elf_backend_can_gc_sections 1
4429 #define elf_backend_can_refcount 1
4431 #define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
4432 #define bfd_elf64_bfd_set_private_flags ppc64_elf_set_private_flags
4433 #define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
4434 #define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
4436 #define elf_backend_section_from_shdr ppc64_elf_section_from_shdr
4437 #define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
4438 #define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
4439 #define elf_backend_check_relocs ppc64_elf_check_relocs
4440 #define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
4441 #define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
4442 #define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
4443 #define elf_backend_hide_symbol ppc64_elf_hide_symbol
4444 #define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
4445 #define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
4446 #define elf_backend_fake_sections ppc64_elf_fake_sections
4447 #define elf_backend_relocate_section ppc64_elf_relocate_section
4448 #define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
4449 #define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
4450 #define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
4452 #include "elf64-target.h"