* armnbsd-tdep.c (arm_netbsd_aout_in_solib_call_trampoline): New
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
5d1634d7 2 Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
5bd4f169
AM
3 Written by Linus Nordberg, Swox AB <info@swox.com>,
4 based on elf32-ppc.c by Ian Lance Taylor.
5
6This file is part of BFD, the Binary File Descriptor library.
7
8This program is free software; you can redistribute it and/or modify
9it under the terms of the GNU General Public License as published by
10the Free Software Foundation; either version 2 of the License, or
11(at your option) any later version.
12
13This program is distributed in the hope that it will be useful,
14but WITHOUT ANY WARRANTY; without even the implied warranty of
15MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16GNU General Public License for more details.
17
18You should have received a copy of the GNU General Public License
19along with this program; if not, write to the Free Software
20Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
21
22/* This file is based on the 64-bit PowerPC ELF ABI. It is also based
23 on the file elf32-ppc.c. */
24
25#include "bfd.h"
26#include "sysdep.h"
27#include "bfdlink.h"
28#include "libbfd.h"
29#include "elf-bfd.h"
30#include "elf/ppc.h"
5d1634d7 31#include "elf64-ppc.h"
5bd4f169
AM
32
33#define USE_RELA /* we want RELA relocations, not REL. */
34
35
36static void ppc_howto_init
37 PARAMS ((void));
38static reloc_howto_type *ppc64_elf_reloc_type_lookup
39 PARAMS ((bfd *abfd, bfd_reloc_code_real_type code));
40static void ppc64_elf_info_to_howto
41 PARAMS ((bfd *abfd, arelent *cache_ptr, Elf64_Internal_Rela *dst));
42static bfd_reloc_status_type ppc64_elf_addr16_ha_reloc
43 PARAMS ((bfd *, arelent *, asymbol *, PTR, asection *, bfd *, char **));
44static boolean ppc64_elf_set_private_flags
45 PARAMS ((bfd *, flagword));
5bd4f169
AM
46static boolean ppc64_elf_merge_private_bfd_data
47 PARAMS ((bfd *, bfd *));
48static boolean ppc64_elf_section_from_shdr
49 PARAMS ((bfd *, Elf64_Internal_Shdr *, char *));
65f38f15
AM
50static struct bfd_hash_entry *link_hash_newfunc
51 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
52static struct bfd_link_hash_table *ppc64_elf_link_hash_table_create
53 PARAMS ((bfd *));
82bd7b59
AM
54static boolean create_linkage_sections
55 PARAMS ((bfd *, struct bfd_link_info *));
65f38f15
AM
56static boolean create_got_section
57 PARAMS ((bfd *, struct bfd_link_info *));
5bd4f169
AM
58static boolean ppc64_elf_create_dynamic_sections
59 PARAMS ((bfd *, struct bfd_link_info *));
65f38f15
AM
60static void ppc64_elf_copy_indirect_symbol
61 PARAMS ((struct elf_link_hash_entry *, struct elf_link_hash_entry *));
5bd4f169
AM
62static boolean ppc64_elf_check_relocs
63 PARAMS ((bfd *, struct bfd_link_info *, asection *,
64 const Elf_Internal_Rela *));
65static asection * ppc64_elf_gc_mark_hook
66 PARAMS ((bfd *abfd, struct bfd_link_info *info, Elf_Internal_Rela *rel,
67 struct elf_link_hash_entry *h, Elf_Internal_Sym *sym));
68static boolean ppc64_elf_gc_sweep_hook
69 PARAMS ((bfd *abfd, struct bfd_link_info *info, asection *sec,
70 const Elf_Internal_Rela *relocs));
e86ce104
AM
71static boolean func_desc_adjust
72 PARAMS ((struct elf_link_hash_entry *, PTR));
73static boolean ppc64_elf_func_desc_adjust
74 PARAMS ((bfd *, struct bfd_link_info *));
5bd4f169
AM
75static boolean ppc64_elf_adjust_dynamic_symbol
76 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *));
e86ce104
AM
77static void ppc64_elf_hide_symbol
78 PARAMS ((struct bfd_link_info *, struct elf_link_hash_entry *, boolean));
65f38f15
AM
79static boolean allocate_dynrelocs
80 PARAMS ((struct elf_link_hash_entry *, PTR));
81static boolean readonly_dynrelocs
5bd4f169 82 PARAMS ((struct elf_link_hash_entry *, PTR));
65f38f15
AM
83static enum elf_reloc_type_class ppc64_elf_reloc_type_class
84 PARAMS ((const Elf_Internal_Rela *));
5bd4f169
AM
85static boolean ppc64_elf_size_dynamic_sections
86 PARAMS ((bfd *, struct bfd_link_info *));
5d1634d7
AM
87static bfd_byte *build_plt_stub
88 PARAMS ((bfd *, bfd_byte *, int, int));
89static boolean build_one_stub
90 PARAMS ((struct elf_link_hash_entry *, PTR));
5bd4f169
AM
91static boolean ppc64_elf_fake_sections
92 PARAMS ((bfd *, Elf64_Internal_Shdr *, asection *));
93static boolean ppc64_elf_relocate_section
94 PARAMS ((bfd *, struct bfd_link_info *info, bfd *, asection *, bfd_byte *,
95 Elf_Internal_Rela *relocs, Elf_Internal_Sym *local_syms,
96 asection **));
97static boolean ppc64_elf_finish_dynamic_symbol
98 PARAMS ((bfd *, struct bfd_link_info *, struct elf_link_hash_entry *,
99 Elf_Internal_Sym *));
100static boolean ppc64_elf_finish_dynamic_sections
101 PARAMS ((bfd *, struct bfd_link_info *));
102
103
5bd4f169
AM
104/* Mask to set RA in memory instructions. */
105#define RA_REGISTER_MASK 0x001f0000
106
107/* Value to shift register by to insert RA. */
108#define RA_REGISTER_SHIFT 16
109
110/* The name of the dynamic interpreter. This is put in the .interp
111 section. */
112#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
113
114/* The size in bytes of an entry in the procedure linkage table. */
115#define PLT_ENTRY_SIZE 24
116
117/* The initial size of the plt reserved for the dynamic linker. */
5d1634d7 118#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
5bd4f169
AM
119
120/* TOC base pointers offset from start of TOC. */
121#define TOC_BASE_OFF (0x8000)
122
5d1634d7
AM
123/* .plt call stub instructions. */
124#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
125#define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
126#define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */
127#define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */
128#define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */
129 /* ld %r11,xxx+16@l(%r12) */
130#define BCTR 0x4e800420 /* bctr */
131
132/* The normal stub is this size. */
133#define PLT_CALL_STUB_SIZE (7*4)
134
135/* But sometimes the .plt entry crosses a 64k boundary, and we need
136 to adjust the high word with this insn. */
137#define ADDIS_R12_R12_1 0x3d8c0001 /* addis %r12,%r12,1 */
5bd4f169 138
5d1634d7
AM
139/* The .glink fixup call stub is the same as the .plt call stub, but
140 the first instruction restores r2, and the std is omitted. */
141#define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
142
143/* Always allow this much space. */
144#define GLINK_CALL_STUB_SIZE (8*4)
145
146/* Pad with this. */
147#define NOP 0x60000000
148
149/* .glink entries for the first 32k functions are two instructions. */
150#define LI_R0_0 0x38000000 /* li %r0,0 */
151#define B_DOT 0x48000000 /* b . */
152
153/* After that, we need two instructions to load the index, followed by
154 a branch. */
155#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 156#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 157
82bd7b59
AM
158/* Instructions to save and restore floating point regs. */
159#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
160#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
161#define BLR 0x4e800020 /* blr */
162
41bd81ab
AM
163/* Since .opd is an array of descriptors and each entry will end up
164 with identical R_PPC64_RELATIVE relocs, there is really no need to
165 propagate .opd relocs; The dynamic linker should be taught to
19397422
AM
166 relocate .opd without reloc entries. FIXME: .opd should be trimmed
167 of unused values. */
41bd81ab
AM
168#ifndef NO_OPD_RELOCS
169#define NO_OPD_RELOCS 0
170#endif
5bd4f169
AM
171\f
172/* Relocation HOWTO's. */
173static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC_max];
174
175static reloc_howto_type ppc64_elf_howto_raw[] = {
176 /* This reloc does nothing. */
177 HOWTO (R_PPC64_NONE, /* type */
178 0, /* rightshift */
179 2, /* size (0 = byte, 1 = short, 2 = long) */
180 32, /* bitsize */
181 false, /* pc_relative */
182 0, /* bitpos */
183 complain_overflow_bitfield, /* complain_on_overflow */
184 bfd_elf_generic_reloc, /* special_function */
185 "R_PPC64_NONE", /* name */
186 false, /* partial_inplace */
187 0, /* src_mask */
188 0, /* dst_mask */
189 false), /* pcrel_offset */
190
191 /* A standard 32 bit relocation. */
192 HOWTO (R_PPC64_ADDR32, /* type */
193 0, /* rightshift */
194 2, /* size (0 = byte, 1 = short, 2 = long) */
195 32, /* bitsize */
196 false, /* pc_relative */
197 0, /* bitpos */
198 complain_overflow_bitfield, /* complain_on_overflow */
199 bfd_elf_generic_reloc, /* special_function */
200 "R_PPC64_ADDR32", /* name */
201 false, /* partial_inplace */
202 0, /* src_mask */
203 0xffffffff, /* dst_mask */
204 false), /* pcrel_offset */
205
206 /* An absolute 26 bit branch; the lower two bits must be zero.
207 FIXME: we don't check that, we just clear them. */
208 HOWTO (R_PPC64_ADDR24, /* type */
209 0, /* rightshift */
210 2, /* size (0 = byte, 1 = short, 2 = long) */
211 26, /* bitsize */
212 false, /* pc_relative */
213 0, /* bitpos */
214 complain_overflow_bitfield, /* complain_on_overflow */
215 bfd_elf_generic_reloc, /* special_function */
216 "R_PPC64_ADDR24", /* name */
217 false, /* partial_inplace */
218 0, /* src_mask */
219 0x3fffffc, /* dst_mask */
220 false), /* pcrel_offset */
221
222 /* A standard 16 bit relocation. */
223 HOWTO (R_PPC64_ADDR16, /* type */
224 0, /* rightshift */
225 1, /* size (0 = byte, 1 = short, 2 = long) */
226 16, /* bitsize */
227 false, /* pc_relative */
228 0, /* bitpos */
229 complain_overflow_bitfield, /* complain_on_overflow */
230 bfd_elf_generic_reloc, /* special_function */
231 "R_PPC64_ADDR16", /* name */
232 false, /* partial_inplace */
233 0, /* src_mask */
234 0xffff, /* dst_mask */
235 false), /* pcrel_offset */
236
237 /* A 16 bit relocation without overflow. */
238 HOWTO (R_PPC64_ADDR16_LO, /* type */
239 0, /* rightshift */
240 1, /* size (0 = byte, 1 = short, 2 = long) */
241 16, /* bitsize */
242 false, /* pc_relative */
243 0, /* bitpos */
244 complain_overflow_dont,/* complain_on_overflow */
245 bfd_elf_generic_reloc, /* special_function */
246 "R_PPC64_ADDR16_LO", /* name */
247 false, /* partial_inplace */
248 0, /* src_mask */
249 0xffff, /* dst_mask */
250 false), /* pcrel_offset */
251
252 /* Bits 16-31 of an address. */
253 HOWTO (R_PPC64_ADDR16_HI, /* type */
254 16, /* rightshift */
255 1, /* size (0 = byte, 1 = short, 2 = long) */
256 16, /* bitsize */
257 false, /* pc_relative */
258 0, /* bitpos */
259 complain_overflow_dont, /* complain_on_overflow */
260 bfd_elf_generic_reloc, /* special_function */
261 "R_PPC64_ADDR16_HI", /* name */
262 false, /* partial_inplace */
263 0, /* src_mask */
264 0xffff, /* dst_mask */
265 false), /* pcrel_offset */
266
267 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
268 bits, treated as a signed number, is negative. */
269 HOWTO (R_PPC64_ADDR16_HA, /* type */
270 16, /* rightshift */
271 1, /* size (0 = byte, 1 = short, 2 = long) */
272 16, /* bitsize */
273 false, /* pc_relative */
274 0, /* bitpos */
275 complain_overflow_dont, /* complain_on_overflow */
276 ppc64_elf_addr16_ha_reloc, /* special_function */
277 "R_PPC64_ADDR16_HA", /* name */
278 false, /* partial_inplace */
279 0, /* src_mask */
280 0xffff, /* dst_mask */
281 false), /* pcrel_offset */
282
283 /* An absolute 16 bit branch; the lower two bits must be zero.
284 FIXME: we don't check that, we just clear them. */
285 HOWTO (R_PPC64_ADDR14, /* type */
286 0, /* rightshift */
287 2, /* size (0 = byte, 1 = short, 2 = long) */
288 16, /* bitsize */
289 false, /* pc_relative */
290 0, /* bitpos */
291 complain_overflow_bitfield, /* complain_on_overflow */
292 bfd_elf_generic_reloc, /* special_function */
293 "R_PPC64_ADDR14", /* name */
294 false, /* partial_inplace */
295 0, /* src_mask */
296 0xfffc, /* dst_mask */
297 false), /* pcrel_offset */
298
299 /* An absolute 16 bit branch, for which bit 10 should be set to
300 indicate that the branch is expected to be taken. The lower two
301 bits must be zero. */
302 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
303 0, /* rightshift */
304 2, /* size (0 = byte, 1 = short, 2 = long) */
305 16, /* bitsize */
306 false, /* pc_relative */
307 0, /* bitpos */
308 complain_overflow_bitfield, /* complain_on_overflow */
309 bfd_elf_generic_reloc, /* special_function */
310 "R_PPC64_ADDR14_BRTAKEN",/* name */
311 false, /* partial_inplace */
312 0, /* src_mask */
313 0xfffc, /* dst_mask */
314 false), /* pcrel_offset */
315
316 /* An absolute 16 bit branch, for which bit 10 should be set to
317 indicate that the branch is not expected to be taken. The lower
318 two bits must be zero. */
319 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
320 0, /* rightshift */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
322 16, /* bitsize */
323 false, /* pc_relative */
324 0, /* bitpos */
325 complain_overflow_bitfield, /* complain_on_overflow */
326 bfd_elf_generic_reloc, /* special_function */
327 "R_PPC64_ADDR14_BRNTAKEN",/* name */
328 false, /* partial_inplace */
329 0, /* src_mask */
330 0xfffc, /* dst_mask */
331 false), /* pcrel_offset */
332
333 /* A relative 26 bit branch; the lower two bits must be zero. */
334 HOWTO (R_PPC64_REL24, /* type */
335 0, /* rightshift */
336 2, /* size (0 = byte, 1 = short, 2 = long) */
337 26, /* bitsize */
338 true, /* pc_relative */
339 0, /* bitpos */
340 complain_overflow_signed, /* complain_on_overflow */
341 bfd_elf_generic_reloc, /* special_function */
342 "R_PPC64_REL24", /* name */
343 false, /* partial_inplace */
344 0, /* src_mask */
345 0x3fffffc, /* dst_mask */
346 true), /* pcrel_offset */
347
348 /* A relative 16 bit branch; the lower two bits must be zero. */
349 HOWTO (R_PPC64_REL14, /* type */
350 0, /* rightshift */
351 2, /* size (0 = byte, 1 = short, 2 = long) */
352 16, /* bitsize */
353 true, /* pc_relative */
354 0, /* bitpos */
355 complain_overflow_signed, /* complain_on_overflow */
356 bfd_elf_generic_reloc, /* special_function */
357 "R_PPC64_REL14", /* name */
358 false, /* partial_inplace */
359 0, /* src_mask */
360 0xfffc, /* dst_mask */
361 true), /* pcrel_offset */
362
363 /* A relative 16 bit branch. Bit 10 should be set to indicate that
364 the branch is expected to be taken. The lower two bits must be
365 zero. */
366 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
367 0, /* rightshift */
368 2, /* size (0 = byte, 1 = short, 2 = long) */
369 16, /* bitsize */
370 true, /* pc_relative */
371 0, /* bitpos */
372 complain_overflow_signed, /* complain_on_overflow */
373 bfd_elf_generic_reloc, /* special_function */
374 "R_PPC64_REL14_BRTAKEN", /* name */
375 false, /* partial_inplace */
376 0, /* src_mask */
377 0xfffc, /* dst_mask */
378 true), /* pcrel_offset */
379
380 /* A relative 16 bit branch. Bit 10 should be set to indicate that
381 the branch is not expected to be taken. The lower two bits must
382 be zero. */
383 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
384 0, /* rightshift */
385 2, /* size (0 = byte, 1 = short, 2 = long) */
386 16, /* bitsize */
387 true, /* pc_relative */
388 0, /* bitpos */
389 complain_overflow_signed, /* complain_on_overflow */
390 bfd_elf_generic_reloc, /* special_function */
391 "R_PPC64_REL14_BRNTAKEN",/* name */
392 false, /* partial_inplace */
393 0, /* src_mask */
394 0xfffc, /* dst_mask */
395 true), /* pcrel_offset */
396
397 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
398 symbol. */
399 HOWTO (R_PPC64_GOT16, /* type */
400 0, /* rightshift */
401 1, /* size (0 = byte, 1 = short, 2 = long) */
402 16, /* bitsize */
403 false, /* pc_relative */
404 0, /* bitpos */
405 complain_overflow_signed, /* complain_on_overflow */
406 bfd_elf_generic_reloc, /* special_function */
407 "R_PPC64_GOT16", /* name */
408 false, /* partial_inplace */
409 0, /* src_mask */
410 0xffff, /* dst_mask */
411 false), /* pcrel_offset */
412
413 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
414 the symbol. */
415 HOWTO (R_PPC64_GOT16_LO, /* type */
416 0, /* rightshift */
417 1, /* size (0 = byte, 1 = short, 2 = long) */
418 16, /* bitsize */
419 false, /* pc_relative */
420 0, /* bitpos */
421 complain_overflow_dont, /* complain_on_overflow */
422 bfd_elf_generic_reloc, /* special_function */
423 "R_PPC64_GOT16_LO", /* name */
424 false, /* partial_inplace */
425 0, /* src_mask */
426 0xffff, /* dst_mask */
427 false), /* pcrel_offset */
428
429 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
430 the symbol. */
431 HOWTO (R_PPC64_GOT16_HI, /* type */
432 16, /* rightshift */
433 1, /* size (0 = byte, 1 = short, 2 = long) */
434 16, /* bitsize */
435 false, /* pc_relative */
436 0, /* bitpos */
437 complain_overflow_dont,/* complain_on_overflow */
438 bfd_elf_generic_reloc, /* special_function */
439 "R_PPC64_GOT16_HI", /* name */
440 false, /* partial_inplace */
441 0, /* src_mask */
442 0xffff, /* dst_mask */
443 false), /* pcrel_offset */
444
445 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
446 the symbol. */
447 HOWTO (R_PPC64_GOT16_HA, /* type */
448 16, /* rightshift */
449 1, /* size (0 = byte, 1 = short, 2 = long) */
450 16, /* bitsize */
451 false, /* pc_relative */
452 0, /* bitpos */
453 complain_overflow_dont,/* complain_on_overflow */
454 ppc64_elf_addr16_ha_reloc, /* special_function */
455 "R_PPC64_GOT16_HA", /* name */
456 false, /* partial_inplace */
457 0, /* src_mask */
458 0xffff, /* dst_mask */
459 false), /* pcrel_offset */
460
461 /* This is used only by the dynamic linker. The symbol should exist
462 both in the object being run and in some shared library. The
463 dynamic linker copies the data addressed by the symbol from the
464 shared library into the object, because the object being
465 run has to have the data at some particular address. */
466 HOWTO (R_PPC64_COPY, /* type */
467 0, /* rightshift */
468 2, /* size (0 = byte, 1 = short, 2 = long) */
469 32, /* bitsize */
470 false, /* pc_relative */
471 0, /* bitpos */
472 complain_overflow_bitfield, /* complain_on_overflow */
473 bfd_elf_generic_reloc, /* special_function */
474 "R_PPC64_COPY", /* name */
475 false, /* partial_inplace */
476 0, /* src_mask */
477 0, /* dst_mask */
478 false), /* pcrel_offset */
479
480 /* Like R_PPC64_ADDR64, but used when setting global offset table
481 entries. */
482 HOWTO (R_PPC64_GLOB_DAT, /* type */
483 0, /* rightshift */
484 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
485 64, /* bitsize */
486 false, /* pc_relative */
487 0, /* bitpos */
488 complain_overflow_dont, /* complain_on_overflow */
489 bfd_elf_generic_reloc, /* special_function */
490 "R_PPC64_GLOB_DAT", /* name */
491 false, /* partial_inplace */
492 0, /* src_mask */
493 0xffffffffffffffff, /* dst_mask */
494 false), /* pcrel_offset */
495
496 /* Created by the link editor. Marks a procedure linkage table
497 entry for a symbol. */
498 HOWTO (R_PPC64_JMP_SLOT, /* type */
499 0, /* rightshift */
500 0, /* size (0 = byte, 1 = short, 2 = long) */
501 0, /* bitsize */
502 false, /* pc_relative */
503 0, /* bitpos */
504 complain_overflow_dont, /* complain_on_overflow */
505 bfd_elf_generic_reloc, /* special_function */
506 "R_PPC64_JMP_SLOT", /* name */
507 false, /* partial_inplace */
508 0, /* src_mask */
509 0, /* dst_mask */
510 false), /* pcrel_offset */
511
512 /* Used only by the dynamic linker. When the object is run, this
513 doubleword64 is set to the load address of the object, plus the
514 addend. */
515 HOWTO (R_PPC64_RELATIVE, /* type */
516 0, /* rightshift */
517 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
518 64, /* bitsize */
519 false, /* pc_relative */
520 0, /* bitpos */
521 complain_overflow_dont, /* complain_on_overflow */
522 bfd_elf_generic_reloc, /* special_function */
523 "R_PPC64_RELATIVE", /* name */
524 false, /* partial_inplace */
525 0, /* src_mask */
526 0xffffffffffffffff, /* dst_mask */
527 false), /* pcrel_offset */
528
529 /* Like R_PPC64_ADDR32, but may be unaligned. */
530 HOWTO (R_PPC64_UADDR32, /* type */
531 0, /* rightshift */
532 2, /* size (0 = byte, 1 = short, 2 = long) */
533 32, /* bitsize */
534 false, /* pc_relative */
535 0, /* bitpos */
536 complain_overflow_bitfield, /* complain_on_overflow */
537 bfd_elf_generic_reloc, /* special_function */
538 "R_PPC64_UADDR32", /* name */
539 false, /* partial_inplace */
540 0, /* src_mask */
541 0xffffffff, /* dst_mask */
542 false), /* pcrel_offset */
543
544 /* Like R_PPC64_ADDR16, but may be unaligned. */
545 HOWTO (R_PPC64_UADDR16, /* type */
546 0, /* rightshift */
547 1, /* size (0 = byte, 1 = short, 2 = long) */
548 16, /* bitsize */
549 false, /* pc_relative */
550 0, /* bitpos */
551 complain_overflow_bitfield, /* complain_on_overflow */
552 bfd_elf_generic_reloc, /* special_function */
553 "R_PPC64_UADDR16", /* name */
554 false, /* partial_inplace */
555 0, /* src_mask */
556 0xffff, /* dst_mask */
557 false), /* pcrel_offset */
558
559 /* 32-bit PC relative. */
560 HOWTO (R_PPC64_REL32, /* type */
561 0, /* rightshift */
562 2, /* size (0 = byte, 1 = short, 2 = long) */
563 32, /* bitsize */
564 true, /* pc_relative */
565 0, /* bitpos */
566 /* FIXME: Verify. Was complain_overflow_bitfield. */
567 complain_overflow_signed, /* complain_on_overflow */
568 bfd_elf_generic_reloc, /* special_function */
569 "R_PPC64_REL32", /* name */
570 false, /* partial_inplace */
571 0, /* src_mask */
572 0xffffffff, /* dst_mask */
573 true), /* pcrel_offset */
574
10ed1bba 575 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
576 HOWTO (R_PPC64_PLT32, /* type */
577 0, /* rightshift */
578 2, /* size (0 = byte, 1 = short, 2 = long) */
579 32, /* bitsize */
580 false, /* pc_relative */
581 0, /* bitpos */
582 complain_overflow_bitfield, /* complain_on_overflow */
583 bfd_elf_generic_reloc, /* special_function */
584 "R_PPC64_PLT32", /* name */
585 false, /* partial_inplace */
586 0, /* src_mask */
587 0, /* dst_mask */
588 false), /* pcrel_offset */
589
590 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
591 FIXME: R_PPC64_PLTREL32 not supported. */
592 HOWTO (R_PPC64_PLTREL32, /* type */
593 0, /* rightshift */
594 2, /* size (0 = byte, 1 = short, 2 = long) */
595 32, /* bitsize */
596 true, /* pc_relative */
597 0, /* bitpos */
598 complain_overflow_signed, /* complain_on_overflow */
599 bfd_elf_generic_reloc, /* special_function */
600 "R_PPC64_PLTREL32", /* name */
601 false, /* partial_inplace */
602 0, /* src_mask */
603 0, /* dst_mask */
604 true), /* pcrel_offset */
605
606 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
607 the symbol. */
608 HOWTO (R_PPC64_PLT16_LO, /* type */
609 0, /* rightshift */
610 1, /* size (0 = byte, 1 = short, 2 = long) */
611 16, /* bitsize */
612 false, /* pc_relative */
613 0, /* bitpos */
614 complain_overflow_dont, /* complain_on_overflow */
615 bfd_elf_generic_reloc, /* special_function */
616 "R_PPC64_PLT16_LO", /* name */
617 false, /* partial_inplace */
618 0, /* src_mask */
619 0xffff, /* dst_mask */
620 false), /* pcrel_offset */
621
622 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
623 the symbol. */
624 HOWTO (R_PPC64_PLT16_HI, /* type */
625 16, /* rightshift */
626 1, /* size (0 = byte, 1 = short, 2 = long) */
627 16, /* bitsize */
628 false, /* pc_relative */
629 0, /* bitpos */
630 complain_overflow_dont, /* complain_on_overflow */
631 bfd_elf_generic_reloc, /* special_function */
632 "R_PPC64_PLT16_HI", /* name */
633 false, /* partial_inplace */
634 0, /* src_mask */
635 0xffff, /* dst_mask */
636 false), /* pcrel_offset */
637
638 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
639 the symbol. */
640 HOWTO (R_PPC64_PLT16_HA, /* type */
641 16, /* rightshift */
642 1, /* size (0 = byte, 1 = short, 2 = long) */
643 16, /* bitsize */
644 false, /* pc_relative */
645 0, /* bitpos */
646 complain_overflow_dont, /* complain_on_overflow */
647 ppc64_elf_addr16_ha_reloc, /* special_function */
648 "R_PPC64_PLT16_HA", /* name */
649 false, /* partial_inplace */
650 0, /* src_mask */
651 0xffff, /* dst_mask */
652 false), /* pcrel_offset */
653
654 /* 32-bit section relative relocation. */
655 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and
656 dst_mask=0. */
657 HOWTO (R_PPC64_SECTOFF, /* type */
658 0, /* rightshift */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
660 32, /* bitsize */
661 true, /* pc_relative */
662 0, /* bitpos */
663 complain_overflow_bitfield, /* complain_on_overflow */
664 bfd_elf_generic_reloc, /* special_function */
665 "R_PPC64_SECTOFF", /* name */
666 false, /* partial_inplace */
667 0, /* src_mask */
668 0, /* dst_mask */
669 true), /* pcrel_offset */
670
671 /* 16-bit lower half section relative relocation. */
672 HOWTO (R_PPC64_SECTOFF_LO, /* type */
673 0, /* rightshift */
674 1, /* size (0 = byte, 1 = short, 2 = long) */
675 16, /* bitsize */
676 false, /* pc_relative */
677 0, /* bitpos */
678 complain_overflow_dont, /* complain_on_overflow */
679 bfd_elf_generic_reloc, /* special_function */
680 "R_PPC64_SECTOFF_LO", /* name */
681 false, /* partial_inplace */
682 0, /* src_mask */
683 0xffff, /* dst_mask */
684 false), /* pcrel_offset */
685
686 /* 16-bit upper half section relative relocation. */
687 HOWTO (R_PPC64_SECTOFF_HI, /* type */
688 16, /* rightshift */
689 1, /* size (0 = byte, 1 = short, 2 = long) */
690 16, /* bitsize */
691 false, /* pc_relative */
692 0, /* bitpos */
693 complain_overflow_dont, /* complain_on_overflow */
694 bfd_elf_generic_reloc, /* special_function */
695 "R_PPC64_SECTOFF_HI", /* name */
696 false, /* partial_inplace */
697 0, /* src_mask */
698 0xffff, /* dst_mask */
699 false), /* pcrel_offset */
700
701 /* 16-bit upper half adjusted section relative relocation. */
702 HOWTO (R_PPC64_SECTOFF_HA, /* type */
703 16, /* rightshift */
704 1, /* size (0 = byte, 1 = short, 2 = long) */
705 16, /* bitsize */
706 false, /* pc_relative */
707 0, /* bitpos */
708 complain_overflow_dont, /* complain_on_overflow */
709 ppc64_elf_addr16_ha_reloc, /* special_function */
710 "R_PPC64_SECTOFF_HA", /* name */
711 false, /* partial_inplace */
712 0, /* src_mask */
713 0xffff, /* dst_mask */
714 false), /* pcrel_offset */
715
716 /* Like R_PPC64_REL24 without touching the two least significant
717 bits. */
718 /* FIXME: Verify R_PPC64_ADDR30. */
719 HOWTO (R_PPC64_ADDR30, /* type */
720 2, /* rightshift */
721 2, /* size (0 = byte, 1 = short, 2 = long) */
722 30, /* bitsize */
723 true, /* pc_relative */
724 0, /* bitpos */
725 complain_overflow_dont, /* complain_on_overflow */
726 bfd_elf_generic_reloc, /* special_function */
727 "R_PPC64_ADDR30", /* name */
728 false, /* partial_inplace */
729 0, /* src_mask */
730 0xfffffffc, /* dst_mask */
731 true), /* pcrel_offset */
732
733 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
734
735 /* A standard 64-bit relocation. */
736 HOWTO (R_PPC64_ADDR64, /* type */
737 0, /* rightshift */
738 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
739 64, /* bitsize */
740 false, /* pc_relative */
741 0, /* bitpos */
742 complain_overflow_dont, /* complain_on_overflow */
743 bfd_elf_generic_reloc, /* special_function */
744 "R_PPC64_ADDR64", /* name */
745 false, /* partial_inplace */
746 0, /* src_mask */
747 0xffffffffffffffff, /* dst_mask */
748 false), /* pcrel_offset */
749
750 /* The bits 32-47 of an address. */
751 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
752 32, /* rightshift */
753 1, /* size (0 = byte, 1 = short, 2 = long) */
754 16, /* bitsize */
755 false, /* pc_relative */
756 0, /* bitpos */
757 complain_overflow_dont, /* complain_on_overflow */
758 bfd_elf_generic_reloc, /* special_function */
759 "R_PPC64_ADDR16_HIGHER", /* name */
760 false, /* partial_inplace */
761 0, /* src_mask */
762 0xffff, /* dst_mask */
763 false), /* pcrel_offset */
764
765 /* The bits 32-47 of an address, plus 1 if the contents of the low
766 16 bits, treated as a signed number, is negative. */
767 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
768 32, /* rightshift */
769 1, /* size (0 = byte, 1 = short, 2 = long) */
770 16, /* bitsize */
771 false, /* pc_relative */
772 0, /* bitpos */
773 complain_overflow_dont, /* complain_on_overflow */
774 ppc64_elf_addr16_ha_reloc, /* special_function */
775 "R_PPC64_ADDR16_HIGHERA", /* name */
776 false, /* partial_inplace */
777 0, /* src_mask */
778 0xffff, /* dst_mask */
779 false), /* pcrel_offset */
780
781 /* The bits 48-63 of an address. */
782 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
783 48, /* rightshift */
784 1, /* size (0 = byte, 1 = short, 2 = long) */
785 16, /* bitsize */
786 false, /* pc_relative */
787 0, /* bitpos */
788 complain_overflow_dont, /* complain_on_overflow */
789 bfd_elf_generic_reloc, /* special_function */
790 "R_PPC64_ADDR16_HIGHEST", /* name */
791 false, /* partial_inplace */
792 0, /* src_mask */
793 0xffff, /* dst_mask */
794 false), /* pcrel_offset */
795
796 /* The bits 48-63 of an address, plus 1 if the contents of the low
797 16 bits, treated as a signed number, is negative. */
798 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
799 48, /* rightshift */
800 1, /* size (0 = byte, 1 = short, 2 = long) */
801 16, /* bitsize */
802 false, /* pc_relative */
803 0, /* bitpos */
804 complain_overflow_dont, /* complain_on_overflow */
805 ppc64_elf_addr16_ha_reloc, /* special_function */
806 "R_PPC64_ADDR16_HIGHESTA", /* name */
807 false, /* partial_inplace */
808 0, /* src_mask */
809 0xffff, /* dst_mask */
810 false), /* pcrel_offset */
811
812 /* Like ADDR64, but may be unaligned. */
813 HOWTO (R_PPC64_UADDR64, /* type */
814 0, /* rightshift */
815 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
816 64, /* bitsize */
817 false, /* pc_relative */
818 0, /* bitpos */
819 complain_overflow_dont, /* complain_on_overflow */
820 bfd_elf_generic_reloc, /* special_function */
821 "R_PPC64_UADDR64", /* name */
822 false, /* partial_inplace */
823 0, /* src_mask */
824 0xffffffffffffffff, /* dst_mask */
825 false), /* pcrel_offset */
826
827 /* 64-bit relative relocation. */
828 HOWTO (R_PPC64_REL64, /* type */
829 0, /* rightshift */
830 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
831 64, /* bitsize */
832 true, /* pc_relative */
833 0, /* bitpos */
834 complain_overflow_dont, /* complain_on_overflow */
835 bfd_elf_generic_reloc, /* special_function */
836 "R_PPC64_REL64", /* name */
837 false, /* partial_inplace */
838 0, /* src_mask */
839 0xffffffffffffffff, /* dst_mask */
840 true), /* pcrel_offset */
841
842 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
843 HOWTO (R_PPC64_PLT64, /* type */
844 0, /* rightshift */
845 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
846 64, /* bitsize */
847 false, /* pc_relative */
848 0, /* bitpos */
849 complain_overflow_dont, /* complain_on_overflow */
850 bfd_elf_generic_reloc, /* special_function */
851 "R_PPC64_PLT64", /* name */
852 false, /* partial_inplace */
853 0, /* src_mask */
854 0, /* dst_mask */
855 false), /* pcrel_offset */
856
857 /* 64-bit PC relative relocation to the symbol's procedure linkage
858 table. */
859 /* FIXME: R_PPC64_PLTREL64 not supported. */
860 HOWTO (R_PPC64_PLTREL64, /* type */
861 0, /* rightshift */
862 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
863 64, /* bitsize */
864 true, /* pc_relative */
865 0, /* bitpos */
866 complain_overflow_dont, /* complain_on_overflow */
867 bfd_elf_generic_reloc, /* special_function */
868 "R_PPC64_PLTREL64", /* name */
869 false, /* partial_inplace */
870 0, /* src_mask */
871 0, /* dst_mask */
872 true), /* pcrel_offset */
873
874 /* 16 bit TOC-relative relocation. */
875
876 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
877 HOWTO (R_PPC64_TOC16, /* type */
878 0, /* rightshift */
879 1, /* size (0 = byte, 1 = short, 2 = long) */
880 16, /* bitsize */
881 false, /* pc_relative */
882 0, /* bitpos */
883 complain_overflow_signed, /* complain_on_overflow */
884 bfd_elf_generic_reloc, /* special_function */
885 "R_PPC64_TOC16", /* name */
886 false, /* partial_inplace */
887 0, /* src_mask */
888 0xffff, /* dst_mask */
889 false), /* pcrel_offset */
890
891 /* 16 bit TOC-relative relocation without overflow. */
892
893 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
894 HOWTO (R_PPC64_TOC16_LO, /* type */
895 0, /* rightshift */
896 1, /* size (0 = byte, 1 = short, 2 = long) */
897 16, /* bitsize */
898 false, /* pc_relative */
899 0, /* bitpos */
900 complain_overflow_dont, /* complain_on_overflow */
901 bfd_elf_generic_reloc, /* special_function */
902 "R_PPC64_TOC16_LO", /* name */
903 false, /* partial_inplace */
904 0, /* src_mask */
905 0xffff, /* dst_mask */
906 false), /* pcrel_offset */
907
908 /* 16 bit TOC-relative relocation, high 16 bits. */
909
910 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
911 HOWTO (R_PPC64_TOC16_HI, /* type */
912 16, /* rightshift */
913 1, /* size (0 = byte, 1 = short, 2 = long) */
914 16, /* bitsize */
915 false, /* pc_relative */
916 0, /* bitpos */
917 complain_overflow_dont, /* complain_on_overflow */
918 bfd_elf_generic_reloc, /* special_function */
919 "R_PPC64_TOC16_HI", /* name */
920 false, /* partial_inplace */
921 0, /* src_mask */
922 0xffff, /* dst_mask */
923 false), /* pcrel_offset */
924
925 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
926 contents of the low 16 bits, treated as a signed number, is
927 negative. */
928
929 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
930 HOWTO (R_PPC64_TOC16_HA, /* type */
931 16, /* rightshift */
932 1, /* size (0 = byte, 1 = short, 2 = long) */
933 16, /* bitsize */
934 false, /* pc_relative */
935 0, /* bitpos */
936 complain_overflow_dont, /* complain_on_overflow */
937 ppc64_elf_addr16_ha_reloc, /* special_function */
938 "R_PPC64_TOC16_HA", /* name */
939 false, /* partial_inplace */
940 0, /* src_mask */
941 0xffff, /* dst_mask */
942 false), /* pcrel_offset */
943
944 /* 64-bit relocation; insert value of TOC base (.TOC.). */
945
946 /* R_PPC64_TOC 51 doubleword64 .TOC. */
947 HOWTO (R_PPC64_TOC, /* type */
948 0, /* rightshift */
949 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
950 64, /* bitsize */
951 false, /* pc_relative */
952 0, /* bitpos */
953 complain_overflow_bitfield, /* complain_on_overflow */
954 bfd_elf_generic_reloc, /* special_function */
955 "R_PPC64_TOC", /* name */
956 false, /* partial_inplace */
957 0, /* src_mask */
958 0xffffffffffffffff, /* dst_mask */
959 false), /* pcrel_offset */
960
961 /* Like R_PPC64_GOT16, but also informs the link editor that the
962 value to relocate may (!) refer to a PLT entry which the link
963 editor (a) may replace with the symbol value. If the link editor
964 is unable to fully resolve the symbol, it may (b) create a PLT
965 entry and store the address to the new PLT entry in the GOT.
966 This permits lazy resolution of function symbols at run time.
967 The link editor may also skip all of this and just (c) emit a
968 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
969 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
970 HOWTO (R_PPC64_PLTGOT16, /* type */
971 0, /* rightshift */
972 1, /* size (0 = byte, 1 = short, 2 = long) */
973 16, /* bitsize */
974 false, /* pc_relative */
975 0, /* bitpos */
976 complain_overflow_signed, /* complain_on_overflow */
977 bfd_elf_generic_reloc, /* special_function */
978 "R_PPC64_PLTGOT16", /* name */
979 false, /* partial_inplace */
980 0, /* src_mask */
981 0xffff, /* dst_mask */
982 false), /* pcrel_offset */
983
984 /* Like R_PPC64_PLTGOT16, but without overflow. */
985 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
986 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
987 0, /* rightshift */
988 1, /* size (0 = byte, 1 = short, 2 = long) */
989 16, /* bitsize */
990 false, /* pc_relative */
991 0, /* bitpos */
992 complain_overflow_dont, /* complain_on_overflow */
993 bfd_elf_generic_reloc, /* special_function */
994 "R_PPC64_PLTGOT16_LO", /* name */
995 false, /* partial_inplace */
996 0, /* src_mask */
997 0xffff, /* dst_mask */
998 false), /* pcrel_offset */
999
1000 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1001 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1002 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1003 16, /* rightshift */
1004 1, /* size (0 = byte, 1 = short, 2 = long) */
1005 16, /* bitsize */
1006 false, /* pc_relative */
1007 0, /* bitpos */
1008 complain_overflow_dont, /* complain_on_overflow */
1009 bfd_elf_generic_reloc, /* special_function */
1010 "R_PPC64_PLTGOT16_HI", /* name */
1011 false, /* partial_inplace */
1012 0, /* src_mask */
1013 0xffff, /* dst_mask */
1014 false), /* pcrel_offset */
1015
1016 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1017 1 if the contents of the low 16 bits, treated as a signed number,
1018 is negative. */
1019 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1020 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1021 16, /* rightshift */
1022 1, /* size (0 = byte, 1 = short, 2 = long) */
1023 16, /* bitsize */
1024 false, /* pc_relative */
1025 0, /* bitpos */
1026 complain_overflow_dont,/* complain_on_overflow */
1027 ppc64_elf_addr16_ha_reloc, /* special_function */
1028 "R_PPC64_PLTGOT16_HA", /* name */
1029 false, /* partial_inplace */
1030 0, /* src_mask */
1031 0xffff, /* dst_mask */
1032 false), /* pcrel_offset */
1033
1034 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1035 HOWTO (R_PPC64_ADDR16_DS, /* type */
1036 0, /* rightshift */
1037 1, /* size (0 = byte, 1 = short, 2 = long) */
1038 16, /* bitsize */
1039 false, /* pc_relative */
1040 0, /* bitpos */
1041 complain_overflow_bitfield, /* complain_on_overflow */
1042 bfd_elf_generic_reloc, /* special_function */
1043 "R_PPC64_ADDR16_DS", /* name */
1044 false, /* partial_inplace */
1045 0, /* src_mask */
1046 0xfffc, /* dst_mask */
1047 false), /* pcrel_offset */
1048
1049 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1050 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1051 0, /* rightshift */
1052 1, /* size (0 = byte, 1 = short, 2 = long) */
1053 16, /* bitsize */
1054 false, /* pc_relative */
1055 0, /* bitpos */
1056 complain_overflow_dont,/* complain_on_overflow */
1057 bfd_elf_generic_reloc, /* special_function */
1058 "R_PPC64_ADDR16_LO_DS",/* name */
1059 false, /* partial_inplace */
1060 0, /* src_mask */
1061 0xfffc, /* dst_mask */
1062 false), /* pcrel_offset */
1063
1064 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1065 HOWTO (R_PPC64_GOT16_DS, /* type */
1066 0, /* rightshift */
1067 1, /* size (0 = byte, 1 = short, 2 = long) */
1068 16, /* bitsize */
1069 false, /* pc_relative */
1070 0, /* bitpos */
1071 complain_overflow_signed, /* complain_on_overflow */
1072 bfd_elf_generic_reloc, /* special_function */
1073 "R_PPC64_GOT16_DS", /* name */
1074 false, /* partial_inplace */
1075 0, /* src_mask */
1076 0xfffc, /* dst_mask */
1077 false), /* pcrel_offset */
1078
1079 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1080 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1081 0, /* rightshift */
1082 1, /* size (0 = byte, 1 = short, 2 = long) */
1083 16, /* bitsize */
1084 false, /* pc_relative */
1085 0, /* bitpos */
1086 complain_overflow_dont, /* complain_on_overflow */
1087 bfd_elf_generic_reloc, /* special_function */
1088 "R_PPC64_GOT16_LO_DS", /* name */
1089 false, /* partial_inplace */
1090 0, /* src_mask */
1091 0xfffc, /* dst_mask */
1092 false), /* pcrel_offset */
1093
1094 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1095 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1096 0, /* rightshift */
1097 1, /* size (0 = byte, 1 = short, 2 = long) */
1098 16, /* bitsize */
1099 false, /* pc_relative */
1100 0, /* bitpos */
1101 complain_overflow_dont, /* complain_on_overflow */
1102 bfd_elf_generic_reloc, /* special_function */
1103 "R_PPC64_PLT16_LO_DS", /* name */
1104 false, /* partial_inplace */
1105 0, /* src_mask */
1106 0xfffc, /* dst_mask */
1107 false), /* pcrel_offset */
1108
1109 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1110 /* FIXME: Verify R_PPC64_SECTOFF. Seems strange with size=2 and
1111 dst_mask=0. */
1112 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1113 0, /* rightshift */
1114 2, /* size (0 = byte, 1 = short, 2 = long) */
1115 32, /* bitsize */
1116 true, /* pc_relative */
1117 0, /* bitpos */
1118 complain_overflow_bitfield, /* complain_on_overflow */
1119 bfd_elf_generic_reloc, /* special_function */
1120 "R_PPC64_SECTOFF_DS", /* name */
1121 false, /* partial_inplace */
1122 0, /* src_mask */
1123 0, /* dst_mask */
1124 true), /* pcrel_offset */
1125
1126 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1127 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1128 0, /* rightshift */
1129 1, /* size (0 = byte, 1 = short, 2 = long) */
1130 16, /* bitsize */
1131 false, /* pc_relative */
1132 0, /* bitpos */
1133 complain_overflow_dont, /* complain_on_overflow */
1134 bfd_elf_generic_reloc, /* special_function */
1135 "R_PPC64_SECTOFF_LO_DS",/* name */
1136 false, /* partial_inplace */
1137 0, /* src_mask */
1138 0xfffc, /* dst_mask */
1139 false), /* pcrel_offset */
1140
1141 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1142 HOWTO (R_PPC64_TOC16_DS, /* type */
1143 0, /* rightshift */
1144 1, /* size (0 = byte, 1 = short, 2 = long) */
1145 16, /* bitsize */
1146 false, /* pc_relative */
1147 0, /* bitpos */
1148 complain_overflow_signed, /* complain_on_overflow */
1149 bfd_elf_generic_reloc, /* special_function */
1150 "R_PPC64_TOC16_DS", /* name */
1151 false, /* partial_inplace */
1152 0, /* src_mask */
1153 0xfffc, /* dst_mask */
1154 false), /* pcrel_offset */
1155
1156 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1157 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1158 0, /* rightshift */
1159 1, /* size (0 = byte, 1 = short, 2 = long) */
1160 16, /* bitsize */
1161 false, /* pc_relative */
1162 0, /* bitpos */
1163 complain_overflow_dont, /* complain_on_overflow */
1164 bfd_elf_generic_reloc, /* special_function */
1165 "R_PPC64_TOC16_LO_DS", /* name */
1166 false, /* partial_inplace */
1167 0, /* src_mask */
1168 0xfffc, /* dst_mask */
1169 false), /* pcrel_offset */
1170
1171 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1172 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1173 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1174 0, /* rightshift */
1175 1, /* size (0 = byte, 1 = short, 2 = long) */
1176 16, /* bitsize */
1177 false, /* pc_relative */
1178 0, /* bitpos */
1179 complain_overflow_signed, /* complain_on_overflow */
1180 bfd_elf_generic_reloc, /* special_function */
1181 "R_PPC64_PLTGOT16_DS", /* name */
1182 false, /* partial_inplace */
1183 0, /* src_mask */
1184 0xfffc, /* dst_mask */
1185 false), /* pcrel_offset */
1186
1187 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1188 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1189 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1190 0, /* rightshift */
1191 1, /* size (0 = byte, 1 = short, 2 = long) */
1192 16, /* bitsize */
1193 false, /* pc_relative */
1194 0, /* bitpos */
1195 complain_overflow_dont, /* complain_on_overflow */
1196 bfd_elf_generic_reloc, /* special_function */
1197 "R_PPC64_PLTGOT16_LO_DS",/* name */
1198 false, /* partial_inplace */
1199 0, /* src_mask */
1200 0xfffc, /* dst_mask */
1201 false), /* pcrel_offset */
1202
1203 /* GNU extension to record C++ vtable hierarchy. */
1204 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1205 0, /* rightshift */
1206 0, /* size (0 = byte, 1 = short, 2 = long) */
1207 0, /* bitsize */
1208 false, /* pc_relative */
1209 0, /* bitpos */
1210 complain_overflow_dont, /* complain_on_overflow */
1211 NULL, /* special_function */
1212 "R_PPC64_GNU_VTINHERIT", /* name */
1213 false, /* partial_inplace */
1214 0, /* src_mask */
1215 0, /* dst_mask */
1216 false), /* pcrel_offset */
1217
1218 /* GNU extension to record C++ vtable member usage. */
1219 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
1220 0, /* rightshift */
1221 0, /* size (0 = byte, 1 = short, 2 = long) */
1222 0, /* bitsize */
1223 false, /* pc_relative */
1224 0, /* bitpos */
1225 complain_overflow_dont, /* complain_on_overflow */
1226 NULL, /* special_function */
1227 "R_PPC64_GNU_VTENTRY", /* name */
1228 false, /* partial_inplace */
1229 0, /* src_mask */
1230 0, /* dst_mask */
1231 false), /* pcrel_offset */
1232};
1233
1234\f
1235/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1236 be done. */
1237
1238static void
1239ppc_howto_init ()
1240{
1241 unsigned int i, type;
1242
1243 for (i = 0;
1244 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1245 i++)
1246 {
1247 type = ppc64_elf_howto_raw[i].type;
1248 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1249 / sizeof (ppc64_elf_howto_table[0])));
1250 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1251 }
1252}
1253
1254static reloc_howto_type *
1255ppc64_elf_reloc_type_lookup (abfd, code)
1256 bfd *abfd ATTRIBUTE_UNUSED;
1257 bfd_reloc_code_real_type code;
1258{
1259 enum elf_ppc_reloc_type ppc_reloc = R_PPC_NONE;
1260
1261 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1262 /* Initialize howto table if needed. */
1263 ppc_howto_init ();
1264
1265 switch ((int) code)
1266 {
1267 default:
1268 return (reloc_howto_type *) NULL;
1269
1270 case BFD_RELOC_NONE: ppc_reloc = R_PPC64_NONE;
1271 break;
1272 case BFD_RELOC_32: ppc_reloc = R_PPC64_ADDR32;
1273 break;
1274 case BFD_RELOC_PPC_BA26: ppc_reloc = R_PPC64_ADDR24;
1275 break;
1276 case BFD_RELOC_16: ppc_reloc = R_PPC64_ADDR16;
1277 break;
1278 case BFD_RELOC_LO16: ppc_reloc = R_PPC64_ADDR16_LO;
1279 break;
1280 case BFD_RELOC_HI16: ppc_reloc = R_PPC64_ADDR16_HI;
1281 break;
1282 case BFD_RELOC_HI16_S: ppc_reloc = R_PPC64_ADDR16_HA;
1283 break;
1284 case BFD_RELOC_PPC_BA16: ppc_reloc = R_PPC64_ADDR14;
1285 break;
1286 case BFD_RELOC_PPC_BA16_BRTAKEN: ppc_reloc = R_PPC64_ADDR14_BRTAKEN;
1287 break;
1288 case BFD_RELOC_PPC_BA16_BRNTAKEN: ppc_reloc = R_PPC64_ADDR14_BRNTAKEN;
1289 break;
1290 case BFD_RELOC_PPC_B26: ppc_reloc = R_PPC64_REL24;
1291 break;
1292 case BFD_RELOC_PPC_B16: ppc_reloc = R_PPC64_REL14;
1293 break;
1294 case BFD_RELOC_PPC_B16_BRTAKEN: ppc_reloc = R_PPC64_REL14_BRTAKEN;
1295 break;
1296 case BFD_RELOC_PPC_B16_BRNTAKEN: ppc_reloc = R_PPC64_REL14_BRNTAKEN;
1297 break;
1298 case BFD_RELOC_16_GOTOFF: ppc_reloc = R_PPC64_GOT16;
1299 break;
1300 case BFD_RELOC_LO16_GOTOFF: ppc_reloc = R_PPC64_GOT16_LO;
1301 break;
1302 case BFD_RELOC_HI16_GOTOFF: ppc_reloc = R_PPC64_GOT16_HI;
1303 break;
1304 case BFD_RELOC_HI16_S_GOTOFF: ppc_reloc = R_PPC64_GOT16_HA;
1305 break;
1306 case BFD_RELOC_PPC_COPY: ppc_reloc = R_PPC64_COPY;
1307 break;
1308 case BFD_RELOC_PPC_GLOB_DAT: ppc_reloc = R_PPC64_GLOB_DAT;
1309 break;
1310 case BFD_RELOC_32_PCREL: ppc_reloc = R_PPC64_REL32;
1311 break;
1312 case BFD_RELOC_32_PLTOFF: ppc_reloc = R_PPC64_PLT32;
1313 break;
1314 case BFD_RELOC_32_PLT_PCREL: ppc_reloc = R_PPC64_PLTREL32;
1315 break;
1316 case BFD_RELOC_LO16_PLTOFF: ppc_reloc = R_PPC64_PLT16_LO;
1317 break;
1318 case BFD_RELOC_HI16_PLTOFF: ppc_reloc = R_PPC64_PLT16_HI;
1319 break;
1320 case BFD_RELOC_HI16_S_PLTOFF: ppc_reloc = R_PPC64_PLT16_HA;
1321 break;
1322 case BFD_RELOC_32_BASEREL: ppc_reloc = R_PPC64_SECTOFF;
1323 break;
1324 case BFD_RELOC_LO16_BASEREL: ppc_reloc = R_PPC64_SECTOFF_LO;
1325 break;
1326 case BFD_RELOC_HI16_BASEREL: ppc_reloc = R_PPC64_SECTOFF_HI;
1327 break;
1328 case BFD_RELOC_HI16_S_BASEREL: ppc_reloc = R_PPC64_SECTOFF_HA;
1329 break;
10ed1bba 1330 case BFD_RELOC_CTOR: ppc_reloc = R_PPC64_ADDR64;
5bd4f169
AM
1331 break;
1332 case BFD_RELOC_64: ppc_reloc = R_PPC64_ADDR64;
1333 break;
1334 case BFD_RELOC_PPC64_HIGHER: ppc_reloc = R_PPC64_ADDR16_HIGHER;
1335 break;
1336 case BFD_RELOC_PPC64_HIGHER_S: ppc_reloc = R_PPC64_ADDR16_HIGHERA;
1337 break;
1338 case BFD_RELOC_PPC64_HIGHEST: ppc_reloc = R_PPC64_ADDR16_HIGHEST;
1339 break;
1340 case BFD_RELOC_PPC64_HIGHEST_S: ppc_reloc = R_PPC64_ADDR16_HIGHESTA;
1341 break;
1342 case BFD_RELOC_64_PCREL: ppc_reloc = R_PPC64_REL64;
1343 break;
1344 case BFD_RELOC_64_PLTOFF: ppc_reloc = R_PPC64_PLT64;
1345 break;
1346 case BFD_RELOC_64_PLT_PCREL: ppc_reloc = R_PPC64_PLTREL64;
1347 break;
1348 case BFD_RELOC_PPC_TOC16: ppc_reloc = R_PPC64_TOC16;
1349 break;
1350 case BFD_RELOC_PPC64_TOC16_LO: ppc_reloc = R_PPC64_TOC16_LO;
1351 break;
1352 case BFD_RELOC_PPC64_TOC16_HI: ppc_reloc = R_PPC64_TOC16_HI;
1353 break;
1354 case BFD_RELOC_PPC64_TOC16_HA: ppc_reloc = R_PPC64_TOC16_HA;
1355 break;
1356 case BFD_RELOC_PPC64_TOC: ppc_reloc = R_PPC64_TOC;
1357 break;
1358 case BFD_RELOC_PPC64_PLTGOT16: ppc_reloc = R_PPC64_PLTGOT16;
1359 break;
1360 case BFD_RELOC_PPC64_PLTGOT16_LO: ppc_reloc = R_PPC64_PLTGOT16_LO;
1361 break;
1362 case BFD_RELOC_PPC64_PLTGOT16_HI: ppc_reloc = R_PPC64_PLTGOT16_HI;
1363 break;
1364 case BFD_RELOC_PPC64_PLTGOT16_HA: ppc_reloc = R_PPC64_PLTGOT16_HA;
1365 break;
1366 case BFD_RELOC_PPC64_ADDR16_DS: ppc_reloc = R_PPC64_ADDR16_DS;
1367 break;
1368 case BFD_RELOC_PPC64_ADDR16_LO_DS: ppc_reloc = R_PPC64_ADDR16_LO_DS;
1369 break;
1370 case BFD_RELOC_PPC64_GOT16_DS: ppc_reloc = R_PPC64_GOT16_DS;
1371 break;
1372 case BFD_RELOC_PPC64_GOT16_LO_DS: ppc_reloc = R_PPC64_GOT16_LO_DS;
1373 break;
1374 case BFD_RELOC_PPC64_PLT16_LO_DS: ppc_reloc = R_PPC64_PLT16_LO_DS;
1375 break;
1376 case BFD_RELOC_PPC64_SECTOFF_DS: ppc_reloc = R_PPC64_SECTOFF_DS;
1377 break;
1378 case BFD_RELOC_PPC64_SECTOFF_LO_DS: ppc_reloc = R_PPC64_SECTOFF_LO_DS;
1379 break;
1380 case BFD_RELOC_PPC64_TOC16_DS: ppc_reloc = R_PPC64_TOC16_DS;
1381 break;
1382 case BFD_RELOC_PPC64_TOC16_LO_DS: ppc_reloc = R_PPC64_TOC16_LO_DS;
1383 break;
1384 case BFD_RELOC_PPC64_PLTGOT16_DS: ppc_reloc = R_PPC64_PLTGOT16_DS;
1385 break;
1386 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: ppc_reloc = R_PPC64_PLTGOT16_LO_DS;
1387 break;
1388 case BFD_RELOC_VTABLE_INHERIT: ppc_reloc = R_PPC64_GNU_VTINHERIT;
1389 break;
1390 case BFD_RELOC_VTABLE_ENTRY: ppc_reloc = R_PPC64_GNU_VTENTRY;
1391 break;
1392 }
1393
1394 return ppc64_elf_howto_table[(int) ppc_reloc];
1395};
1396
1397/* Set the howto pointer for a PowerPC ELF reloc. */
1398
1399static void
1400ppc64_elf_info_to_howto (abfd, cache_ptr, dst)
1401 bfd *abfd ATTRIBUTE_UNUSED;
1402 arelent *cache_ptr;
1403 Elf64_Internal_Rela *dst;
1404{
65f38f15
AM
1405 unsigned int type;
1406
5bd4f169
AM
1407 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1408 /* Initialize howto table if needed. */
1409 ppc_howto_init ();
1410
65f38f15
AM
1411 type = ELF64_R_TYPE (dst->r_info);
1412 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1413 / sizeof (ppc64_elf_howto_table[0])));
1414 cache_ptr->howto = ppc64_elf_howto_table[type];
5bd4f169
AM
1415}
1416
65f38f15 1417/* Handle the R_PPC_ADDR16_HA and similar relocs. */
5bd4f169
AM
1418
1419static bfd_reloc_status_type
1420ppc64_elf_addr16_ha_reloc (abfd, reloc_entry, symbol, data, input_section,
1421 output_bfd, error_message)
1422 bfd *abfd ATTRIBUTE_UNUSED;
1423 arelent *reloc_entry;
1424 asymbol *symbol;
1425 PTR data ATTRIBUTE_UNUSED;
1426 asection *input_section;
1427 bfd *output_bfd;
1428 char **error_message ATTRIBUTE_UNUSED;
1429{
1430 bfd_vma relocation;
1431
1432 if (output_bfd != NULL)
1433 {
1434 reloc_entry->address += input_section->output_offset;
1435 return bfd_reloc_ok;
1436 }
1437
1438 if (reloc_entry->address > input_section->_cooked_size)
1439 return bfd_reloc_outofrange;
1440
1441 if (bfd_is_com_section (symbol->section))
1442 relocation = 0;
1443 else
1444 relocation = symbol->value;
1445
1446 relocation += symbol->section->output_section->vma;
1447 relocation += symbol->section->output_offset;
1448 relocation += reloc_entry->addend;
1449
1450 reloc_entry->addend += (relocation & 0x8000) << 1;
1451
1452 return bfd_reloc_continue;
1453}
1454
1455/* Function to set whether a module needs the -mrelocatable bit set. */
1456
1457static boolean
1458ppc64_elf_set_private_flags (abfd, flags)
1459 bfd *abfd;
1460 flagword flags;
1461{
1462 BFD_ASSERT (!elf_flags_init (abfd)
1463 || elf_elfheader (abfd)->e_flags == flags);
1464
1465 elf_elfheader (abfd)->e_flags = flags;
1466 elf_flags_init (abfd) = true;
1467 return true;
1468}
1469
5bd4f169
AM
1470/* Merge backend specific data from an object file to the output
1471 object file when linking. */
1472static boolean
1473ppc64_elf_merge_private_bfd_data (ibfd, obfd)
1474 bfd *ibfd;
1475 bfd *obfd;
1476{
1477 flagword old_flags;
1478 flagword new_flags;
1479 boolean error;
1480
1481 /* Check if we have the same endianess. */
1482 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1483 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
1484 {
1485 const char *msg;
1486
1487 if (bfd_big_endian (ibfd))
1488 msg = _("%s: compiled for a big endian system and target is little endian");
1489 else
1490 msg = _("%s: compiled for a little endian system and target is big endian");
1491
8f615d07 1492 (*_bfd_error_handler) (msg, bfd_archive_filename (ibfd));
5bd4f169
AM
1493
1494 bfd_set_error (bfd_error_wrong_format);
1495 return false;
1496 }
1497
1498 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour
1499 || bfd_get_flavour (obfd) != bfd_target_elf_flavour)
1500 return true;
1501
1502 new_flags = elf_elfheader (ibfd)->e_flags;
1503 old_flags = elf_elfheader (obfd)->e_flags;
1504 if (!elf_flags_init (obfd))
1505 {
1506 /* First call, no flags set. */
1507 elf_flags_init (obfd) = true;
1508 elf_elfheader (obfd)->e_flags = new_flags;
1509 }
1510
1511 else if (new_flags == old_flags)
1512 /* Compatible flags are ok. */
1513 ;
1514
1515 else
1516 {
1517 /* Incompatible flags. Warn about -mrelocatable mismatch.
1518 Allow -mrelocatable-lib to be linked with either. */
1519 error = false;
1520 if ((new_flags & EF_PPC_RELOCATABLE) != 0
1521 && (old_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0)
1522 {
1523 error = true;
1524 (*_bfd_error_handler)
1525 (_("%s: compiled with -mrelocatable and linked with modules compiled normally"),
8f615d07 1526 bfd_archive_filename (ibfd));
5bd4f169
AM
1527 }
1528 else if ((new_flags & (EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB)) == 0
1529 && (old_flags & EF_PPC_RELOCATABLE) != 0)
1530 {
1531 error = true;
1532 (*_bfd_error_handler)
1533 (_("%s: compiled normally and linked with modules compiled with -mrelocatable"),
8f615d07 1534 bfd_archive_filename (ibfd));
5bd4f169
AM
1535 }
1536
1537 /* The output is -mrelocatable-lib iff both the input files are. */
1538 if (! (new_flags & EF_PPC_RELOCATABLE_LIB))
1539 elf_elfheader (obfd)->e_flags &= ~EF_PPC_RELOCATABLE_LIB;
1540
1541 /* The output is -mrelocatable iff it can't be -mrelocatable-lib,
1542 but each input file is either -mrelocatable or -mrelocatable-lib. */
1543 if (! (elf_elfheader (obfd)->e_flags & EF_PPC_RELOCATABLE_LIB)
1544 && (new_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE))
1545 && (old_flags & (EF_PPC_RELOCATABLE_LIB | EF_PPC_RELOCATABLE)))
1546 elf_elfheader (obfd)->e_flags |= EF_PPC_RELOCATABLE;
1547
1548 /* Do not warn about eabi vs. V.4 mismatch, just or in the bit
1549 if any module uses it. */
1550 elf_elfheader (obfd)->e_flags |= (new_flags & EF_PPC_EMB);
1551
1552 new_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
1553 old_flags &= ~(EF_PPC_RELOCATABLE | EF_PPC_RELOCATABLE_LIB | EF_PPC_EMB);
1554
1555 /* Warn about any other mismatches. */
1556 if (new_flags != old_flags)
1557 {
1558 error = true;
1559 (*_bfd_error_handler)
1560 (_("%s: uses different e_flags (0x%lx) fields than previous modules (0x%lx)"),
8f615d07 1561 bfd_archive_filename (ibfd), (long) new_flags, (long) old_flags);
5bd4f169
AM
1562 }
1563
1564 if (error)
1565 {
1566 bfd_set_error (bfd_error_bad_value);
1567 return false;
1568 }
1569 }
1570
1571 return true;
1572}
1573
1574/* Handle a PowerPC specific section when reading an object file. This
1575 is called when elfcode.h finds a section with an unknown type. */
1576
1577static boolean
1578ppc64_elf_section_from_shdr (abfd, hdr, name)
1579 bfd *abfd;
1580 Elf64_Internal_Shdr *hdr;
1581 char *name;
1582{
1583 asection *newsect;
1584 flagword flags;
1585
1586 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1587 return false;
1588
1589 newsect = hdr->bfd_section;
1590 flags = bfd_get_section_flags (abfd, newsect);
1591 if (hdr->sh_flags & SHF_EXCLUDE)
1592 flags |= SEC_EXCLUDE;
1593
1594 if (hdr->sh_type == SHT_ORDERED)
1595 flags |= SEC_SORT_ENTRIES;
1596
1597 bfd_set_section_flags (abfd, newsect, flags);
1598 return true;
1599}
1600\f
65f38f15
AM
1601/* The following functions are specific to the ELF linker, while
1602 functions above are used generally. Those named ppc64_elf_* are
1603 called by the main ELF linker code. They appear in this file more
1604 or less in the order in which they are called. eg.
1605 ppc64_elf_check_relocs is called early in the link process,
1606 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
1607 called.
1608
1609 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
1610 functions have both a function code symbol and a function descriptor
1611 symbol. A call to foo in a relocatable object file looks like:
1612
1613 . .text
1614 . x:
1615 . bl .foo
1616 . nop
1617
1618 The function definition in another object file might be:
1619
1620 . .section .opd
1621 . foo: .quad .foo
1622 . .quad .TOC.@tocbase
1623 . .quad 0
1624 .
1625 . .text
1626 . .foo: blr
1627
1628 When the linker resolves the call during a static link, the branch
1629 unsurprisingly just goes to .foo and the .opd information is unused.
1630 If the function definition is in a shared library, things are a little
1631 different: The call goes via a plt call stub, the opd information gets
1632 copied to the plt, and the linker patches the nop.
1633
1634 . x:
1635 . bl .foo_stub
1636 . ld 2,40(1)
1637 .
1638 .
1639 . .foo_stub:
1640 . addis 12,2,Lfoo@toc@ha # in practice, the call stub
1641 . addi 12,12,Lfoo@toc@l # is slightly optimised, but
1642 . std 2,40(1) # this is the general idea
1643 . ld 11,0(12)
1644 . ld 2,8(12)
1645 . mtctr 11
1646 . ld 11,16(12)
1647 . bctr
1648 .
1649 . .section .plt
1650 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
1651
1652 The "reloc ()" notation is supposed to indicate that the linker emits
1653 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
1654 copying.
1655
1656 What are the difficulties here? Well, firstly, the relocations
1657 examined by the linker in check_relocs are against the function code
1658 sym .foo, while the dynamic relocation in the plt is emitted against
1659 the function descriptor symbol, foo. Somewhere along the line, we need
1660 to carefully copy dynamic link information from one symbol to the other.
1661 Secondly, the generic part of the elf linker will make .foo a dynamic
1662 symbol as is normal for most other backends. We need foo dynamic
1663 instead, at least for an application final link. However, when
1664 creating a shared library containing foo, we need to have both symbols
1665 dynamic so that references to .foo are satisfied during the early
1666 stages of linking. Otherwise the linker might decide to pull in a
41bd81ab 1667 definition from some other object, eg. a static library. */
65f38f15
AM
1668
1669/* The linker needs to keep track of the number of relocs that it
1670 decides to copy as dynamic relocs in check_relocs for each symbol.
1671 This is so that it can later discard them if they are found to be
1672 unnecessary. We store the information in a field extending the
1673 regular ELF linker hash table. */
1674
1675struct ppc_dyn_relocs
1676{
1677 struct ppc_dyn_relocs *next;
1678
1679 /* The input section of the reloc. */
1680 asection *sec;
1681
1682 /* Total number of relocs copied for the input section. */
1683 bfd_size_type count;
1684
1685 /* Number of pc-relative relocs copied for the input section. */
1686 bfd_size_type pc_count;
1687};
1688
1689/* Of those relocs that might be copied as dynamic relocs, this macro
1690 selects between relative and absolute types. */
1691
1692#define IS_ABSOLUTE_RELOC(RTYPE) \
1693 ((RTYPE) != R_PPC64_REL14 \
1694 && (RTYPE) != R_PPC64_REL14_BRNTAKEN \
1695 && (RTYPE) != R_PPC64_REL14_BRTAKEN \
1696 && (RTYPE) != R_PPC64_REL24 \
1697 && (RTYPE) != R_PPC64_REL32 \
1698 && (RTYPE) != R_PPC64_REL64)
1699
1700/* ppc64 ELF linker hash entry. */
1701
1702struct ppc_link_hash_entry
1703{
1704 struct elf_link_hash_entry elf;
1705
1706 /* Track dynamic relocs copied for this symbol. */
1707 struct ppc_dyn_relocs *dyn_relocs;
e86ce104
AM
1708
1709 /* Flag function code and descriptor symbols. */
1710 unsigned int is_func:1;
1711 unsigned int is_func_descriptor:1;
65f38f15
AM
1712};
1713
1714/* ppc64 ELF linker hash table. */
1715
1716struct ppc_link_hash_table
1717{
1718 struct elf_link_hash_table elf;
1719
1720 /* Short-cuts to get to dynamic linker sections. */
1721 asection *sgot;
1722 asection *srelgot;
1723 asection *splt;
1724 asection *srelplt;
1725 asection *sdynbss;
1726 asection *srelbss;
5d1634d7 1727 asection *sstub;
65f38f15 1728 asection *sglink;
82bd7b59 1729 asection *sfpr;
ec338859 1730
5d1634d7
AM
1731 /* Set on error. */
1732 int plt_overflow;
1733
ec338859
AM
1734 /* Small local sym to section mapping cache. */
1735 struct sym_sec_cache sym_sec;
65f38f15
AM
1736};
1737
1738/* Get the ppc64 ELF linker hash table from a link_info structure. */
1739
1740#define ppc_hash_table(p) \
1741 ((struct ppc_link_hash_table *) ((p)->hash))
1742
1743/* Create an entry in a ppc64 ELF linker hash table. */
1744
1745static struct bfd_hash_entry *
1746link_hash_newfunc (entry, table, string)
1747 struct bfd_hash_entry *entry;
1748 struct bfd_hash_table *table;
1749 const char *string;
1750{
1751 /* Allocate the structure if it has not already been allocated by a
1752 subclass. */
1753 if (entry == NULL)
1754 {
1755 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
1756 if (entry == NULL)
1757 return entry;
1758 }
1759
1760 /* Call the allocation method of the superclass. */
1761 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
1762 if (entry != NULL)
1763 {
1764 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
1765
1766 eh->dyn_relocs = NULL;
e86ce104
AM
1767 eh->is_func = 0;
1768 eh->is_func_descriptor = 0;
65f38f15
AM
1769 }
1770
1771 return entry;
1772}
1773
1774/* Create a ppc64 ELF linker hash table. */
1775
1776static struct bfd_link_hash_table *
1777ppc64_elf_link_hash_table_create (abfd)
1778 bfd *abfd;
1779{
1780 struct ppc_link_hash_table *htab;
1781 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
1782
1783 htab = (struct ppc_link_hash_table *) bfd_alloc (abfd, amt);
1784 if (htab == NULL)
1785 return NULL;
1786
1787 if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
1788 {
1789 bfd_release (abfd, htab);
1790 return NULL;
1791 }
1792
1793 htab->sgot = NULL;
1794 htab->srelgot = NULL;
1795 htab->splt = NULL;
1796 htab->srelplt = NULL;
1797 htab->sdynbss = NULL;
1798 htab->srelbss = NULL;
5d1634d7 1799 htab->sstub = NULL;
65f38f15 1800 htab->sglink = NULL;
82bd7b59 1801 htab->sfpr = NULL;
5d1634d7 1802 htab->plt_overflow = 0;
ec338859 1803 htab->sym_sec.abfd = NULL;
65f38f15
AM
1804
1805 return &htab->elf.root;
1806}
1807
82bd7b59
AM
1808/* Create sections for linker generated code. */
1809
1810static boolean
1811create_linkage_sections (dynobj, info)
1812 bfd *dynobj;
1813 struct bfd_link_info *info;
1814{
1815 struct ppc_link_hash_table *htab;
1816 flagword flags;
1817
1818 htab = ppc_hash_table (info);
1819
1820 /* Create .sfpr for code to save and restore fp regs. */
1821 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
1822 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
1823 htab->sfpr = bfd_make_section (dynobj, ".sfpr");
1824 if (htab->sfpr == NULL
1825 || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
1826 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
1827 return false;
1828
1829 /* Create .stub and .glink for global linkage functions. */
1830 htab->sstub = bfd_make_section (dynobj, ".stub");
1831 if (htab->sstub == NULL
1832 || ! bfd_set_section_flags (dynobj, htab->sstub, flags)
1833 || ! bfd_set_section_alignment (dynobj, htab->sstub, 2))
1834 return false;
1835 htab->sglink = bfd_make_section (dynobj, ".glink");
1836 if (htab->sglink == NULL
1837 || ! bfd_set_section_flags (dynobj, htab->sglink, flags)
1838 || ! bfd_set_section_alignment (dynobj, htab->sglink, 2))
1839 return false;
1840
1841 return true;
1842}
1843
65f38f15
AM
1844/* Create .got and .rela.got sections in DYNOBJ, and set up
1845 shortcuts to them in our hash table. */
1846
1847static boolean
1848create_got_section (dynobj, info)
1849 bfd *dynobj;
1850 struct bfd_link_info *info;
1851{
1852 struct ppc_link_hash_table *htab;
1853
1854 if (! _bfd_elf_create_got_section (dynobj, info))
1855 return false;
1856
1857 htab = ppc_hash_table (info);
1858 htab->sgot = bfd_get_section_by_name (dynobj, ".got");
1859 if (!htab->sgot)
1860 abort ();
1861
1862 htab->srelgot = bfd_make_section (dynobj, ".rela.got");
1863 if (!htab->srelgot
1864 || ! bfd_set_section_flags (dynobj, htab->srelgot,
1865 (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS
1866 | SEC_IN_MEMORY | SEC_LINKER_CREATED
1867 | SEC_READONLY))
1868 || ! bfd_set_section_alignment (dynobj, htab->srelgot, 3))
1869 return false;
1870 return true;
1871}
5bd4f169 1872
82bd7b59 1873/* Create the dynamic sections, and set up shortcuts. */
5bd4f169
AM
1874
1875static boolean
65f38f15
AM
1876ppc64_elf_create_dynamic_sections (dynobj, info)
1877 bfd *dynobj;
5bd4f169
AM
1878 struct bfd_link_info *info;
1879{
65f38f15 1880 struct ppc_link_hash_table *htab;
5bd4f169 1881
65f38f15
AM
1882 htab = ppc_hash_table (info);
1883 if (!htab->sgot && !create_got_section (dynobj, info))
5bd4f169
AM
1884 return false;
1885
65f38f15 1886 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
5bd4f169 1887 return false;
65f38f15
AM
1888
1889 htab->splt = bfd_get_section_by_name (dynobj, ".plt");
1890 htab->srelplt = bfd_get_section_by_name (dynobj, ".rela.plt");
1891 htab->sdynbss = bfd_get_section_by_name (dynobj, ".dynbss");
1892 if (!info->shared)
1893 htab->srelbss = bfd_get_section_by_name (dynobj, ".rela.bss");
1894
1895 if (!htab->splt || !htab->srelplt || !htab->sdynbss
1896 || (!info->shared && !htab->srelbss))
1897 abort ();
1898
5bd4f169
AM
1899 return true;
1900}
1901
65f38f15
AM
1902/* Copy the extra info we tack onto an elf_link_hash_entry. */
1903
1904static void
1905ppc64_elf_copy_indirect_symbol (dir, ind)
1906 struct elf_link_hash_entry *dir, *ind;
1907{
1908 struct ppc_link_hash_entry *edir, *eind;
1909
1910 edir = (struct ppc_link_hash_entry *) dir;
1911 eind = (struct ppc_link_hash_entry *) ind;
1912
bbd7ec4a 1913 if (eind->dyn_relocs != NULL)
65f38f15 1914 {
bbd7ec4a
AM
1915 if (edir->dyn_relocs != NULL)
1916 {
1917 struct ppc_dyn_relocs **pp;
1918 struct ppc_dyn_relocs *p;
1919
1e370bd2 1920 if (ind->root.type == bfd_link_hash_indirect)
bbd7ec4a
AM
1921 abort ();
1922
1923 /* Add reloc counts against the weak sym to the strong sym
1924 list. Merge any entries against the same section. */
1925 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
1926 {
1927 struct ppc_dyn_relocs *q;
1928
1929 for (q = edir->dyn_relocs; q != NULL; q = q->next)
1930 if (q->sec == p->sec)
1931 {
1932 q->pc_count += p->pc_count;
1933 q->count += p->count;
1934 *pp = p->next;
1935 break;
1936 }
1937 if (q == NULL)
1938 pp = &p->next;
1939 }
1940 *pp = edir->dyn_relocs;
1941 }
1942
65f38f15
AM
1943 edir->dyn_relocs = eind->dyn_relocs;
1944 eind->dyn_relocs = NULL;
1945 }
65f38f15 1946
e86ce104
AM
1947 edir->is_func |= eind->is_func;
1948 edir->is_func_descriptor |= eind->is_func_descriptor;
1949
65f38f15
AM
1950 _bfd_elf_link_hash_copy_indirect (dir, ind);
1951}
1952
5bd4f169 1953/* Look through the relocs for a section during the first phase, and
65f38f15 1954 calculate needed space in the global offset table, procedure
5d1634d7 1955 linkage table, and dynamic reloc sections. */
5bd4f169
AM
1956
1957static boolean
1958ppc64_elf_check_relocs (abfd, info, sec, relocs)
1959 bfd *abfd;
1960 struct bfd_link_info *info;
1961 asection *sec;
1962 const Elf_Internal_Rela *relocs;
1963{
65f38f15 1964 struct ppc_link_hash_table *htab;
5bd4f169
AM
1965 Elf_Internal_Shdr *symtab_hdr;
1966 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
1967 const Elf_Internal_Rela *rel;
1968 const Elf_Internal_Rela *rel_end;
5bd4f169 1969 asection *sreloc;
e86ce104 1970 boolean is_opd;
5bd4f169
AM
1971
1972 if (info->relocateable)
1973 return true;
1974
65f38f15 1975 htab = ppc_hash_table (info);
5bd4f169 1976 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5bd4f169
AM
1977
1978 sym_hashes = elf_sym_hashes (abfd);
1979 sym_hashes_end = (sym_hashes
1980 + symtab_hdr->sh_size / sizeof (Elf64_External_Sym));
1981 if (!elf_bad_symtab (abfd))
1982 sym_hashes_end -= symtab_hdr->sh_info;
1983
1984 sreloc = NULL;
e86ce104 1985 is_opd = strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0;
5bd4f169 1986
82bd7b59
AM
1987 if (htab->elf.dynobj == NULL)
1988 htab->elf.dynobj = abfd;
1989 if (htab->sfpr == NULL
1990 && !create_linkage_sections (htab->elf.dynobj, info))
1991 return false;
1992
5bd4f169
AM
1993 rel_end = relocs + sec->reloc_count;
1994 for (rel = relocs; rel < rel_end; rel++)
1995 {
1996 unsigned long r_symndx;
1997 struct elf_link_hash_entry *h;
a33d1f77 1998 enum elf_ppc_reloc_type r_type;
5bd4f169
AM
1999
2000 r_symndx = ELF64_R_SYM (rel->r_info);
2001 if (r_symndx < symtab_hdr->sh_info)
2002 h = NULL;
2003 else
2004 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2005
a33d1f77
AM
2006 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
2007 switch (r_type)
5bd4f169
AM
2008 {
2009 /* GOT16 relocations */
2010 case R_PPC64_GOT16:
5bd4f169 2011 case R_PPC64_GOT16_DS:
65f38f15
AM
2012 case R_PPC64_GOT16_HA:
2013 case R_PPC64_GOT16_HI:
2014 case R_PPC64_GOT16_LO:
5bd4f169 2015 case R_PPC64_GOT16_LO_DS:
5bd4f169 2016
65f38f15 2017 /* This symbol requires a global offset table entry. */
82bd7b59
AM
2018 if (htab->sgot == NULL
2019 && !create_got_section (htab->elf.dynobj, info))
2020 return false;
5bd4f169
AM
2021
2022 if (h != NULL)
2023 {
65f38f15 2024 h->got.refcount += 1;
5bd4f169
AM
2025 }
2026 else
2027 {
65f38f15
AM
2028 bfd_signed_vma *local_got_refcounts;
2029
5bd4f169 2030 /* This is a global offset table entry for a local symbol. */
65f38f15 2031 local_got_refcounts = elf_local_got_refcounts (abfd);
5bd4f169
AM
2032 if (local_got_refcounts == NULL)
2033 {
dc810e39 2034 bfd_size_type size;
5bd4f169 2035
dc810e39
AM
2036 size = symtab_hdr->sh_info;
2037 size *= sizeof (bfd_signed_vma);
2038 local_got_refcounts = ((bfd_signed_vma *)
65f38f15 2039 bfd_zalloc (abfd, size));
5bd4f169
AM
2040 if (local_got_refcounts == NULL)
2041 return false;
2042 elf_local_got_refcounts (abfd) = local_got_refcounts;
5bd4f169 2043 }
65f38f15 2044 local_got_refcounts[r_symndx] += 1;
5bd4f169
AM
2045 }
2046 break;
2047
5bd4f169 2048 case R_PPC64_PLT16_HA:
65f38f15
AM
2049 case R_PPC64_PLT16_HI:
2050 case R_PPC64_PLT16_LO:
2051 case R_PPC64_PLT32:
2052 case R_PPC64_PLT64:
5bd4f169
AM
2053 /* This symbol requires a procedure linkage table entry. We
2054 actually build the entry in adjust_dynamic_symbol,
2055 because this might be a case of linking PIC code without
2056 linking in any dynamic objects, in which case we don't
2057 need to generate a procedure linkage table after all. */
5bd4f169
AM
2058 if (h == NULL)
2059 {
2060 /* It does not make sense to have a procedure linkage
2061 table entry for a local symbol. */
2062 bfd_set_error (bfd_error_bad_value);
2063 return false;
2064 }
2065
65f38f15
AM
2066 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2067 h->plt.refcount += 1;
e86ce104 2068 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5bd4f169
AM
2069 break;
2070
2071 /* The following relocations don't need to propagate the
2072 relocation if linking a shared object since they are
2073 section relative. */
2074 case R_PPC64_SECTOFF:
2075 case R_PPC64_SECTOFF_LO:
2076 case R_PPC64_SECTOFF_HI:
2077 case R_PPC64_SECTOFF_HA:
2078 case R_PPC64_SECTOFF_DS:
2079 case R_PPC64_SECTOFF_LO_DS:
2080 case R_PPC64_TOC16:
2081 case R_PPC64_TOC16_LO:
2082 case R_PPC64_TOC16_HI:
2083 case R_PPC64_TOC16_HA:
2084 case R_PPC64_TOC16_DS:
2085 case R_PPC64_TOC16_LO_DS:
2086 break;
2087
2088 /* This relocation describes the C++ object vtable hierarchy.
2089 Reconstruct it for later use during GC. */
2090 case R_PPC64_GNU_VTINHERIT:
2091 if (!_bfd_elf64_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
2092 return false;
2093 break;
2094
2095 /* This relocation describes which C++ vtable entries are actually
2096 used. Record for later use during GC. */
2097 case R_PPC64_GNU_VTENTRY:
2098 if (!_bfd_elf64_gc_record_vtentry (abfd, sec, h, rel->r_addend))
2099 return false;
2100 break;
2101
5d1634d7 2102 case R_PPC64_REL24:
e86ce104
AM
2103 if (h != NULL
2104 && h->root.root.string[0] == '.'
2105 && h->root.root.string[1] != 0)
5d1634d7
AM
2106 {
2107 /* We may need a .plt entry if the function this reloc
2108 refers to is in a shared lib. */
2109 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2110 h->plt.refcount += 1;
e86ce104 2111 ((struct ppc_link_hash_entry *) h)->is_func = 1;
5d1634d7
AM
2112 }
2113 break;
2114
e86ce104
AM
2115 case R_PPC64_ADDR64:
2116 if (is_opd
2117 && h != NULL
2118 && h->root.root.string[0] == '.'
2119 && h->root.root.string[1] != 0)
2120 {
2121 struct elf_link_hash_entry *fdh;
2122
2123 fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1,
2124 false, false, false);
2125 if (fdh != NULL)
2126 {
2127 /* Ensure the function descriptor symbol string is
2128 part of the code symbol string. We aren't
2129 changing the name here, just allowing some tricks
2130 in ppc64_elf_hide_symbol. */
2131 fdh->root.root.string = h->root.root.string + 1;
2132 ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1;
2133 ((struct ppc_link_hash_entry *) h)->is_func = 1;
2134 }
2135 }
2136 /* Fall through. */
2137
5bd4f169
AM
2138 case R_PPC64_REL64:
2139 case R_PPC64_REL32:
5bd4f169
AM
2140 case R_PPC64_REL14:
2141 case R_PPC64_REL14_BRTAKEN:
2142 case R_PPC64_REL14_BRNTAKEN:
65f38f15
AM
2143 case R_PPC64_ADDR14:
2144 case R_PPC64_ADDR14_BRNTAKEN:
2145 case R_PPC64_ADDR14_BRTAKEN:
2146 case R_PPC64_ADDR16:
2147 case R_PPC64_ADDR16_DS:
2148 case R_PPC64_ADDR16_HA:
2149 case R_PPC64_ADDR16_HI:
2150 case R_PPC64_ADDR16_HIGHER:
2151 case R_PPC64_ADDR16_HIGHERA:
2152 case R_PPC64_ADDR16_HIGHEST:
2153 case R_PPC64_ADDR16_HIGHESTA:
2154 case R_PPC64_ADDR16_LO:
2155 case R_PPC64_ADDR16_LO_DS:
2156 case R_PPC64_ADDR24:
2157 case R_PPC64_ADDR30:
2158 case R_PPC64_ADDR32:
65f38f15
AM
2159 case R_PPC64_UADDR16:
2160 case R_PPC64_UADDR32:
2161 case R_PPC64_UADDR64:
5bd4f169 2162 case R_PPC64_TOC:
41bd81ab
AM
2163 /* Don't propagate .opd relocs. */
2164 if (NO_OPD_RELOCS && is_opd)
e86ce104 2165 break;
e86ce104 2166
65f38f15
AM
2167 /* If we are creating a shared library, and this is a reloc
2168 against a global symbol, or a non PC relative reloc
2169 against a local symbol, then we need to copy the reloc
2170 into the shared library. However, if we are linking with
2171 -Bsymbolic, we do not need to copy a reloc against a
2172 global symbol which is defined in an object we are
2173 including in the link (i.e., DEF_REGULAR is set). At
2174 this point we have not seen all the input files, so it is
2175 possible that DEF_REGULAR is not set now but will be set
2176 later (it is never cleared). In case of a weak definition,
2177 DEF_REGULAR may be cleared later by a strong definition in
2178 a shared library. We account for that possibility below by
2179 storing information in the relocs_copied field of the hash
2180 table entry. A similar situation occurs when creating
2181 shared libraries and symbol visibility changes render the
2182 symbol local.
2183
2184 If on the other hand, we are creating an executable, we
2185 may need to keep relocations for symbols satisfied by a
2186 dynamic library if we manage to avoid copy relocs for the
2187 symbol. */
2188 if ((info->shared
2189 && (sec->flags & SEC_ALLOC) != 0
a33d1f77 2190 && (IS_ABSOLUTE_RELOC (r_type)
65f38f15
AM
2191 || (h != NULL
2192 && (! info->symbolic
2193 || h->root.type == bfd_link_hash_defweak
2194 || (h->elf_link_hash_flags
2195 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
2196 || (!info->shared
2197 && (sec->flags & SEC_ALLOC) != 0
2198 && h != NULL
2199 && (h->root.type == bfd_link_hash_defweak
2200 || (h->elf_link_hash_flags
2201 & ELF_LINK_HASH_DEF_REGULAR) == 0)))
5bd4f169 2202 {
ec338859
AM
2203 struct ppc_dyn_relocs *p;
2204 struct ppc_dyn_relocs **head;
2205
65f38f15
AM
2206 /* We must copy these reloc types into the output file.
2207 Create a reloc section in dynobj and make room for
2208 this reloc. */
5bd4f169
AM
2209 if (sreloc == NULL)
2210 {
2211 const char *name;
65f38f15 2212 bfd *dynobj;
5bd4f169
AM
2213
2214 name = (bfd_elf_string_from_elf_section
2215 (abfd,
2216 elf_elfheader (abfd)->e_shstrndx,
2217 elf_section_data (sec)->rel_hdr.sh_name));
2218 if (name == NULL)
2219 return false;
2220
65f38f15
AM
2221 if (strncmp (name, ".rela", 5) != 0
2222 || strcmp (bfd_get_section_name (abfd, sec),
2223 name + 5) != 0)
2224 {
2225 (*_bfd_error_handler)
2226 (_("%s: bad relocation section name `%s\'"),
2227 bfd_archive_filename (abfd), name);
5d1634d7 2228 bfd_set_error (bfd_error_bad_value);
65f38f15
AM
2229 }
2230
65f38f15 2231 dynobj = htab->elf.dynobj;
5bd4f169
AM
2232 sreloc = bfd_get_section_by_name (dynobj, name);
2233 if (sreloc == NULL)
2234 {
2235 flagword flags;
2236
2237 sreloc = bfd_make_section (dynobj, name);
2238 flags = (SEC_HAS_CONTENTS | SEC_READONLY
2239 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
2240 if ((sec->flags & SEC_ALLOC) != 0)
2241 flags |= SEC_ALLOC | SEC_LOAD;
2242 if (sreloc == NULL
2243 || ! bfd_set_section_flags (dynobj, sreloc, flags)
65f38f15 2244 || ! bfd_set_section_alignment (dynobj, sreloc, 3))
5bd4f169
AM
2245 return false;
2246 }
65f38f15 2247 elf_section_data (sec)->sreloc = sreloc;
5bd4f169
AM
2248 }
2249
65f38f15
AM
2250 /* If this is a global symbol, we count the number of
2251 relocations we need for this symbol. */
2252 if (h != NULL)
2253 {
ec338859 2254 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
65f38f15
AM
2255 }
2256 else
2257 {
ec338859
AM
2258 /* Track dynamic relocs needed for local syms too.
2259 We really need local syms available to do this
2260 easily. Oh well. */
2261
2262 asection *s;
2263 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
2264 sec, r_symndx);
2265 if (s == NULL)
2266 return false;
2267
2268 head = ((struct ppc_dyn_relocs **)
2269 &elf_section_data (s)->local_dynrel);
65f38f15 2270 }
ec338859
AM
2271
2272 p = *head;
2273 if (p == NULL || p->sec != sec)
2274 {
2275 p = ((struct ppc_dyn_relocs *)
2276 bfd_alloc (htab->elf.dynobj,
2277 (bfd_size_type) sizeof *p));
2278 if (p == NULL)
2279 return false;
2280 p->next = *head;
2281 *head = p;
2282 p->sec = sec;
2283 p->count = 0;
2284 p->pc_count = 0;
2285 }
2286
2287 p->count += 1;
2288 if (!IS_ABSOLUTE_RELOC (r_type))
2289 p->pc_count += 1;
65f38f15 2290 }
5bd4f169 2291 break;
65f38f15
AM
2292
2293 default:
5bd4f169
AM
2294 }
2295 }
2296
2297 return true;
2298}
2299
2300/* Return the section that should be marked against GC for a given
2301 relocation. */
2302
2303static asection *
2304ppc64_elf_gc_mark_hook (abfd, info, rel, h, sym)
2305 bfd *abfd;
2306 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2307 Elf_Internal_Rela *rel;
2308 struct elf_link_hash_entry *h;
2309 Elf_Internal_Sym *sym;
2310{
2311 if (h != NULL)
2312 {
a33d1f77
AM
2313 enum elf_ppc_reloc_type r_type;
2314
2315 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
2316 switch (r_type)
5bd4f169
AM
2317 {
2318 case R_PPC64_GNU_VTINHERIT:
2319 case R_PPC64_GNU_VTENTRY:
2320 break;
2321
2322 default:
2323 switch (h->root.type)
2324 {
2325 case bfd_link_hash_defined:
2326 case bfd_link_hash_defweak:
2327 return h->root.u.def.section;
2328
2329 case bfd_link_hash_common:
2330 return h->root.u.c.p->section;
2331
2332 default:
2333 break;
2334 }
2335 }
2336 }
2337 else
2338 {
9ad5cbcf 2339 return bfd_section_from_elf_index (abfd, sym->st_shndx);
5bd4f169
AM
2340 }
2341
2342 return NULL;
2343}
2344
65f38f15
AM
2345/* Update the .got, .plt. and dynamic reloc reference counts for the
2346 section being removed. */
5bd4f169
AM
2347
2348static boolean
2349ppc64_elf_gc_sweep_hook (abfd, info, sec, relocs)
2350 bfd *abfd;
2351 struct bfd_link_info *info ATTRIBUTE_UNUSED;
2352 asection *sec;
2353 const Elf_Internal_Rela *relocs;
2354{
2355 Elf_Internal_Shdr *symtab_hdr;
2356 struct elf_link_hash_entry **sym_hashes;
2357 bfd_signed_vma *local_got_refcounts;
2358 const Elf_Internal_Rela *rel, *relend;
5bd4f169 2359
ec338859
AM
2360 elf_section_data (sec)->local_dynrel = NULL;
2361
5bd4f169
AM
2362 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
2363 sym_hashes = elf_sym_hashes (abfd);
2364 local_got_refcounts = elf_local_got_refcounts (abfd);
2365
2366 relend = relocs + sec->reloc_count;
2367 for (rel = relocs; rel < relend; rel++)
a33d1f77
AM
2368 {
2369 unsigned long r_symndx;
2370 enum elf_ppc_reloc_type r_type;
2371 struct elf_link_hash_entry *h;
5bd4f169 2372
a33d1f77
AM
2373 r_symndx = ELF64_R_SYM (rel->r_info);
2374 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
2375 switch (r_type)
2376 {
2377 case R_PPC64_GOT16:
2378 case R_PPC64_GOT16_DS:
2379 case R_PPC64_GOT16_HA:
2380 case R_PPC64_GOT16_HI:
2381 case R_PPC64_GOT16_LO:
2382 case R_PPC64_GOT16_LO_DS:
2383 if (r_symndx >= symtab_hdr->sh_info)
2384 {
2385 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2386 if (h->got.refcount > 0)
2387 h->got.refcount--;
2388 }
2389 else
2390 {
2391 if (local_got_refcounts[r_symndx] > 0)
2392 local_got_refcounts[r_symndx]--;
2393 }
2394 break;
65f38f15 2395
a33d1f77
AM
2396 case R_PPC64_PLT16_HA:
2397 case R_PPC64_PLT16_HI:
2398 case R_PPC64_PLT16_LO:
2399 case R_PPC64_PLT32:
2400 case R_PPC64_PLT64:
2401 if (r_symndx >= symtab_hdr->sh_info)
2402 {
2403 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2404 if (h->plt.refcount > 0)
2405 h->plt.refcount--;
2406 }
2407 break;
65f38f15 2408
5d1634d7
AM
2409 case R_PPC64_REL24:
2410 if (r_symndx >= symtab_hdr->sh_info)
2411 {
2412 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2413 if (h->plt.refcount > 0)
2414 h->plt.refcount--;
2415 }
e86ce104 2416 break;
5d1634d7 2417
a33d1f77
AM
2418 case R_PPC64_REL14:
2419 case R_PPC64_REL14_BRNTAKEN:
2420 case R_PPC64_REL14_BRTAKEN:
a33d1f77
AM
2421 case R_PPC64_REL32:
2422 case R_PPC64_REL64:
2423 if (r_symndx >= symtab_hdr->sh_info)
2424 {
2425 struct ppc_link_hash_entry *eh;
2426 struct ppc_dyn_relocs **pp;
2427 struct ppc_dyn_relocs *p;
65f38f15 2428
a33d1f77
AM
2429 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2430 eh = (struct ppc_link_hash_entry *) h;
65f38f15 2431
a33d1f77
AM
2432 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2433 if (p->sec == sec)
2434 {
2435 p->pc_count -= 1;
2436 p->count -= 1;
2437 if (p->count == 0)
2438 *pp = p->next;
2439 break;
2440 }
2441 }
2442 break;
65f38f15 2443
a33d1f77
AM
2444 case R_PPC64_ADDR14:
2445 case R_PPC64_ADDR14_BRNTAKEN:
2446 case R_PPC64_ADDR14_BRTAKEN:
2447 case R_PPC64_ADDR16:
2448 case R_PPC64_ADDR16_DS:
2449 case R_PPC64_ADDR16_HA:
2450 case R_PPC64_ADDR16_HI:
2451 case R_PPC64_ADDR16_HIGHER:
2452 case R_PPC64_ADDR16_HIGHERA:
2453 case R_PPC64_ADDR16_HIGHEST:
2454 case R_PPC64_ADDR16_HIGHESTA:
2455 case R_PPC64_ADDR16_LO:
2456 case R_PPC64_ADDR16_LO_DS:
2457 case R_PPC64_ADDR24:
2458 case R_PPC64_ADDR30:
2459 case R_PPC64_ADDR32:
2460 case R_PPC64_ADDR64:
2461 case R_PPC64_UADDR16:
2462 case R_PPC64_UADDR32:
2463 case R_PPC64_UADDR64:
2464 case R_PPC64_TOC:
2465 if (r_symndx >= symtab_hdr->sh_info)
2466 {
2467 struct ppc_link_hash_entry *eh;
2468 struct ppc_dyn_relocs **pp;
2469 struct ppc_dyn_relocs *p;
65f38f15 2470
a33d1f77
AM
2471 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
2472 eh = (struct ppc_link_hash_entry *) h;
2473
2474 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
2475 if (p->sec == sec)
2476 {
2477 p->count -= 1;
2478 if (p->count == 0)
2479 *pp = p->next;
2480 break;
2481 }
2482 }
2483 break;
5bd4f169 2484
a33d1f77
AM
2485 default:
2486 break;
2487 }
2488 }
5bd4f169
AM
2489 return true;
2490}
2491
e86ce104
AM
2492/* Called via elf_link_hash_traverse to transfer dynamic linking
2493 information on function code symbol entries to their corresponding
2494 function descriptor symbol entries. */
5bd4f169 2495static boolean
e86ce104 2496func_desc_adjust (h, inf)
5bd4f169 2497 struct elf_link_hash_entry *h;
e86ce104 2498 PTR inf;
5bd4f169 2499{
e86ce104 2500 struct bfd_link_info *info;
65f38f15 2501 struct ppc_link_hash_table *htab;
5bd4f169 2502
e86ce104
AM
2503 if (h->root.type == bfd_link_hash_indirect
2504 || h->root.type == bfd_link_hash_warning)
2505 return true;
2506
2507 info = (struct bfd_link_info *) inf;
65f38f15 2508 htab = ppc_hash_table (info);
5bd4f169 2509
e86ce104
AM
2510 /* If this is a function code symbol, transfer dynamic linking
2511 information to the function descriptor symbol. */
2512 if (!((struct ppc_link_hash_entry *) h)->is_func)
2513 return true;
2514
2515 if (h->plt.refcount > 0
2516 && h->root.root.string[0] == '.'
2517 && h->root.root.string[1] != '\0')
5bd4f169 2518 {
65f38f15 2519 struct elf_link_hash_entry *fdh;
e86ce104 2520 boolean force_local;
5bd4f169 2521
648cca2c
AM
2522 /* Find the corresponding function descriptor symbol. Create it
2523 as undefined if necessary. */
5bd4f169 2524
e86ce104
AM
2525 fdh = elf_link_hash_lookup (&htab->elf, h->root.root.string + 1,
2526 false, false, true);
5bd4f169 2527
d926e03d
AM
2528 if (fdh == NULL
2529 && info->shared
2530 && (h->root.type == bfd_link_hash_undefined
2531 || h->root.type == bfd_link_hash_undefweak))
648cca2c
AM
2532 {
2533 bfd *abfd;
2534 asymbol *newsym;
2535
d926e03d 2536 abfd = h->root.u.undef.abfd;
648cca2c
AM
2537 newsym = bfd_make_empty_symbol (abfd);
2538 newsym->name = h->root.root.string + 1;
2539 newsym->section = bfd_und_section_ptr;
2540 newsym->value = 0;
2541 newsym->flags = BSF_OBJECT;
2542 if (h->root.type == bfd_link_hash_undefweak)
2543 newsym->flags |= BSF_WEAK;
2544
2545 if ( !(_bfd_generic_link_add_one_symbol
2546 (info, abfd, newsym->name, newsym->flags,
2547 newsym->section, newsym->value, NULL, false, false,
2548 (struct bfd_link_hash_entry **) &fdh)))
2549 {
2550 return false;
2551 }
d926e03d 2552 fdh->elf_link_hash_flags &= ~ELF_LINK_NON_ELF;
648cca2c
AM
2553 }
2554
e86ce104
AM
2555 if (fdh != NULL
2556 && (fdh->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0
2557 && (info->shared
2558 || (fdh->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2559 || (fdh->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0))
2560 {
2561 if (fdh->dynindx == -1)
2562 if (! bfd_elf64_link_record_dynamic_symbol (info, fdh))
2563 return false;
e86ce104
AM
2564 fdh->elf_link_hash_flags |= (h->elf_link_hash_flags
2565 & (ELF_LINK_HASH_REF_REGULAR
2566 | ELF_LINK_HASH_REF_DYNAMIC
2567 | ELF_LINK_HASH_REF_REGULAR_NONWEAK
2568 | ELF_LINK_NON_GOT_REF));
e1fa50e7
AM
2569 if (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
2570 {
2571 fdh->plt.refcount = h->plt.refcount;
2572 fdh->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_PLT;
2573 }
e86ce104
AM
2574 ((struct ppc_link_hash_entry *) fdh)->is_func_descriptor = 1;
2575 fdh->root.root.string = h->root.root.string + 1;
2576 }
2577
2578 /* Now that the info is on the function descriptor, clear the
2579 function code sym info. Any function code syms for which we
2580 don't have a definition in a regular file, we force local.
2581 This prevents a shared library from exporting syms that have
2582 been imported from another library. Function code syms that
2583 are really in the library we must leave global to prevent the
e1fa50e7 2584 linker dragging in a definition from a static library. */
82bd7b59
AM
2585 force_local = ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
2586 && info->shared);
e86ce104
AM
2587 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
2588 }
2589
2590 return true;
2591}
40b8271b 2592
82bd7b59
AM
2593#define MIN_SAVE_FPR 14
2594#define MAX_SAVE_FPR 31
2595
e86ce104 2596/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
2597 this hook to a) provide some gcc support functions, and b) transfer
2598 dynamic linking information gathered so far on function code symbol
2599 entries, to their corresponding function descriptor symbol entries. */
e86ce104
AM
2600static boolean
2601ppc64_elf_func_desc_adjust (obfd, info)
2602 bfd *obfd ATTRIBUTE_UNUSED;
2603 struct bfd_link_info *info;
2604{
2605 struct ppc_link_hash_table *htab;
82bd7b59
AM
2606 unsigned int lowest_savef = MAX_SAVE_FPR + 2;
2607 unsigned int lowest_restf = MAX_SAVE_FPR + 2;
2608 unsigned int i;
2609 struct elf_link_hash_entry *h;
2610 char sym[10];
e86ce104
AM
2611
2612 htab = ppc_hash_table (info);
82bd7b59
AM
2613
2614 if (htab->sfpr == NULL)
2615 /* We don't have any relocs. */
2616 return true;
2617
2618 /* First provide any missing ._savef* and ._restf* functions. */
2619 memcpy (sym, "._savef14", 10);
2620 for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++)
2621 {
2622 sym[7] = i / 10 + '0';
2623 sym[8] = i % 10 + '0';
2624 h = elf_link_hash_lookup (&htab->elf, sym, false, false, true);
2625 if (h != NULL
2626 && h->root.type == bfd_link_hash_undefined)
2627 {
2628 if (lowest_savef > i)
2629 lowest_savef = i;
2630 h->root.type = bfd_link_hash_defined;
2631 h->root.u.def.section = htab->sfpr;
2632 h->root.u.def.value = (i - lowest_savef) * 4;
2633 h->type = STT_FUNC;
2634 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2635 _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
2636 }
2637 }
2638
2639 memcpy (sym, "._restf14", 10);
2640 for (i = MIN_SAVE_FPR; i <= MAX_SAVE_FPR; i++)
2641 {
2642 sym[7] = i / 10 + '0';
2643 sym[8] = i % 10 + '0';
2644 h = elf_link_hash_lookup (&htab->elf, sym, false, false, true);
2645 if (h != NULL
2646 && h->root.type == bfd_link_hash_undefined)
2647 {
2648 if (lowest_restf > i)
2649 lowest_restf = i;
2650 h->root.type = bfd_link_hash_defined;
2651 h->root.u.def.section = htab->sfpr;
2652 h->root.u.def.value = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4
2653 + (i - lowest_restf) * 4);
2654 h->type = STT_FUNC;
2655 h->elf_link_hash_flags |= ELF_LINK_HASH_DEF_REGULAR;
2656 _bfd_elf_link_hash_hide_symbol (info, h, info->shared);
2657 }
2658 }
2659
2660 htab->sfpr->_raw_size = ((MAX_SAVE_FPR + 2 - lowest_savef) * 4
2661 + (MAX_SAVE_FPR + 2 - lowest_restf) * 4);
2662
2663 if (htab->sfpr->_raw_size == 0)
2664 {
2665 _bfd_strip_section_from_output (info, htab->sfpr);
2666 }
2667 else
2668 {
2669 bfd_byte *p = (bfd_byte *) bfd_alloc (htab->elf.dynobj,
2670 htab->sfpr->_raw_size);
2671 if (p == NULL)
2672 return false;
2673 htab->sfpr->contents = p;
2674
2675 for (i = lowest_savef; i <= MAX_SAVE_FPR; i++)
2676 {
2677 unsigned int fpr = i << 21;
2678 unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8;
2679 bfd_put_32 (htab->elf.dynobj, STFD_FR0_0R1 + fpr + stackoff, p);
2680 p += 4;
2681 }
2682 bfd_put_32 (htab->elf.dynobj, BLR, p);
2683 p += 4;
2684
2685 for (i = lowest_restf; i <= MAX_SAVE_FPR; i++)
2686 {
2687 unsigned int fpr = i << 21;
2688 unsigned int stackoff = (1 << 16) - (MAX_SAVE_FPR + 1 - i) * 8;
2689 bfd_put_32 (htab->elf.dynobj, LFD_FR0_0R1 + fpr + stackoff, p);
2690 p += 4;
2691 }
2692 bfd_put_32 (htab->elf.dynobj, BLR, p);
2693 p += 4;
2694 }
2695
e86ce104
AM
2696 elf_link_hash_traverse (&htab->elf, func_desc_adjust, (PTR) info);
2697 return true;
2698}
2699
2700/* Adjust a symbol defined by a dynamic object and referenced by a
2701 regular object. The current definition is in some section of the
2702 dynamic object, but we're not including those sections. We have to
2703 change the definition to something the rest of the link can
2704 understand. */
2705
2706static boolean
2707ppc64_elf_adjust_dynamic_symbol (info, h)
2708 struct bfd_link_info *info;
2709 struct elf_link_hash_entry *h;
2710{
2711 struct ppc_link_hash_table *htab;
2712 struct ppc_link_hash_entry * eh;
2713 struct ppc_dyn_relocs *p;
2714 asection *s;
2715 unsigned int power_of_two;
2716
2717 htab = ppc_hash_table (info);
2718
2719 /* Deal with function syms. */
2720 if (h->type == STT_FUNC
2721 || (h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_PLT) != 0)
2722 {
2723 /* Clear procedure linkage table information for any symbol that
2724 won't need a .plt entry. */
2725 if (!((struct ppc_link_hash_entry *) h)->is_func_descriptor
2726 || h->plt.refcount <= 0
2727 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2728 || (! info->shared
2729 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) == 0
2730 && (h->elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) == 0))
40b8271b 2731 {
40b8271b
AM
2732 h->plt.offset = (bfd_vma) -1;
2733 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
40b8271b 2734 }
5bd4f169
AM
2735 return true;
2736 }
bbd7ec4a
AM
2737 else
2738 h->plt.offset = (bfd_vma) -1;
5bd4f169
AM
2739
2740 /* If this is a weak symbol, and there is a real definition, the
2741 processor independent code will have arranged for us to see the
2742 real definition first, and we can just use the same value. */
2743 if (h->weakdef != NULL)
2744 {
2745 BFD_ASSERT (h->weakdef->root.type == bfd_link_hash_defined
2746 || h->weakdef->root.type == bfd_link_hash_defweak);
2747 h->root.u.def.section = h->weakdef->root.u.def.section;
2748 h->root.u.def.value = h->weakdef->root.u.def.value;
0a991dfe 2749 return true;
5bd4f169
AM
2750 }
2751
2752 /* This is a reference to a symbol defined by a dynamic object which
2753 is not a function. */
2754
2755 /* If we are creating a shared library, we must presume that the
2756 only references to the symbol are via the global offset table.
2757 For such cases we need not do anything here; the relocations will
2758 be handled correctly by relocate_section. */
2759 if (info->shared)
2760 return true;
2761
65f38f15
AM
2762 /* If there are no references to this symbol that do not use the
2763 GOT, we don't need to generate a copy reloc. */
2764 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0)
2765 return true;
2766
2767 eh = (struct ppc_link_hash_entry *) h;
2768 for (p = eh->dyn_relocs; p != NULL; p = p->next)
2769 {
2770 s = p->sec->output_section;
2771 if (s != NULL && (s->flags & SEC_READONLY) != 0)
2772 break;
2773 }
2774
2775 /* If we didn't find any dynamic relocs in read-only sections, then
5d1634d7 2776 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
65f38f15
AM
2777 if (p == NULL)
2778 {
2779 h->elf_link_hash_flags &= ~ELF_LINK_NON_GOT_REF;
2780 return true;
2781 }
2782
5bd4f169
AM
2783 /* We must allocate the symbol in our .dynbss section, which will
2784 become part of the .bss section of the executable. There will be
2785 an entry for this symbol in the .dynsym section. The dynamic
2786 object will contain position independent code, so all references
2787 from the dynamic object to this symbol will go through the global
2788 offset table. The dynamic linker will use the .dynsym entry to
2789 determine the address it must put in the global offset table, so
2790 both the dynamic object and the regular object will refer to the
2791 same memory location for the variable. */
5bd4f169
AM
2792
2793 /* We must generate a R_PPC_COPY reloc to tell the dynamic linker to
2794 copy the initial value out of the dynamic object and into the
2795 runtime process image. We need to remember the offset into the
2796 .rela.bss section we are going to use. */
2797 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
2798 {
65f38f15 2799 htab->srelbss->_raw_size += sizeof (Elf64_External_Rela);
5bd4f169
AM
2800 h->elf_link_hash_flags |= ELF_LINK_HASH_NEEDS_COPY;
2801 }
2802
2803 /* We need to figure out the alignment required for this symbol. I
2804 have no idea how ELF linkers handle this. */
2805 power_of_two = bfd_log2 (h->size);
2806 if (power_of_two > 4)
2807 power_of_two = 4;
2808
2809 /* Apply the required alignment. */
65f38f15
AM
2810 s = htab->sdynbss;
2811 s->_raw_size = BFD_ALIGN (s->_raw_size, (bfd_size_type) (1 << power_of_two));
2812 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5bd4f169 2813 {
65f38f15 2814 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
5bd4f169
AM
2815 return false;
2816 }
2817
2818 /* Define the symbol as being at this point in the section. */
2819 h->root.u.def.section = s;
2820 h->root.u.def.value = s->_raw_size;
2821
2822 /* Increment the section size to make room for the symbol. */
2823 s->_raw_size += h->size;
2824
2825 return true;
2826}
2827
e86ce104
AM
2828/* If given a function descriptor symbol, hide both the function code
2829 sym and the descriptor. */
2830static void
2831ppc64_elf_hide_symbol (info, h, force_local)
2832 struct bfd_link_info *info;
2833 struct elf_link_hash_entry *h;
2834 boolean force_local;
2835{
2836 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
2837
2838 if (((struct ppc_link_hash_entry *) h)->is_func_descriptor)
2839 {
2840 const char *name;
2841 struct elf_link_hash_entry *fh;
2842 struct ppc_link_hash_table *htab;
2843
2844 name = h->root.root.string - 1;
2845 htab = ppc_hash_table (info);
2846 fh = elf_link_hash_lookup (&htab->elf, name, false, false, false);
2847 if (fh != NULL)
2848 _bfd_elf_link_hash_hide_symbol (info, fh, force_local);
2849 }
2850}
2851
65f38f15
AM
2852/* This is the condition under which ppc64_elf_finish_dynamic_symbol
2853 will be called from elflink.h. If elflink.h doesn't call our
2854 finish_dynamic_symbol routine, we'll need to do something about
2855 initializing any .plt and .got entries in ppc64_elf_relocate_section. */
2856#define WILL_CALL_FINISH_DYNAMIC_SYMBOL(DYN, INFO, H) \
2857 ((DYN) \
2858 && ((INFO)->shared \
2859 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0) \
2860 && ((H)->dynindx != -1 \
2861 || ((H)->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0))
5bd4f169 2862
65f38f15
AM
2863/* Allocate space in .plt, .got and associated reloc sections for
2864 dynamic relocs. */
5bd4f169
AM
2865
2866static boolean
65f38f15
AM
2867allocate_dynrelocs (h, inf)
2868 struct elf_link_hash_entry *h;
2869 PTR inf;
5bd4f169 2870{
65f38f15
AM
2871 struct bfd_link_info *info;
2872 struct ppc_link_hash_table *htab;
5bd4f169 2873 asection *s;
65f38f15
AM
2874 struct ppc_link_hash_entry *eh;
2875 struct ppc_dyn_relocs *p;
5bd4f169 2876
65f38f15
AM
2877 if (h->root.type == bfd_link_hash_indirect
2878 || h->root.type == bfd_link_hash_warning)
2879 return true;
5bd4f169 2880
65f38f15
AM
2881 info = (struct bfd_link_info *) inf;
2882 htab = ppc_hash_table (info);
5bd4f169 2883
65f38f15 2884 if (htab->elf.dynamic_sections_created
e86ce104
AM
2885 && h->plt.refcount > 0
2886 && h->dynindx != -1)
5bd4f169 2887 {
e86ce104 2888 BFD_ASSERT (((struct ppc_link_hash_entry *) h)->is_func_descriptor);
5bd4f169 2889
65f38f15
AM
2890 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info, h))
2891 {
65f38f15
AM
2892 /* If this is the first .plt entry, make room for the special
2893 first entry. */
2894 s = htab->splt;
5bd4f169 2895 if (s->_raw_size == 0)
65f38f15
AM
2896 s->_raw_size += PLT_INITIAL_ENTRY_SIZE;
2897
2898 h->plt.offset = s->_raw_size;
2899
2900 /* Make room for this entry. */
2901 s->_raw_size += PLT_ENTRY_SIZE;
2902
5d1634d7
AM
2903 /* Make room for the .stub and .glink code. */
2904 s = htab->sstub;
2905 s->_raw_size += PLT_CALL_STUB_SIZE;
65f38f15 2906
5d1634d7
AM
2907 s = htab->sglink;
2908 if (s->_raw_size == 0)
2909 s->_raw_size += GLINK_CALL_STUB_SIZE;
2910 /* We need bigger stubs past index 32767. */
2911 if (s->_raw_size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
2912 s->_raw_size += 4;
2913 s->_raw_size += 2*4;
65f38f15
AM
2914
2915 /* We also need to make an entry in the .rela.plt section. */
2916 s = htab->srelplt;
2917 s->_raw_size += sizeof (Elf64_External_Rela);
2918 }
2919 else
2920 {
2921 h->plt.offset = (bfd_vma) -1;
2922 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2923 }
2924 }
2925 else
2926 {
2927 h->plt.offset = (bfd_vma) -1;
2928 h->elf_link_hash_flags &= ~ELF_LINK_HASH_NEEDS_PLT;
2929 }
2930
2931 if (h->got.refcount > 0)
2932 {
2933 boolean dyn;
2934
2935 /* Make sure this symbol is output as a dynamic symbol.
2936 Undefined weak syms won't yet be marked as dynamic. */
2937 if (h->dynindx == -1
2938 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
2939 {
2940 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
2941 return false;
2942 }
2943
2944 s = htab->sgot;
2945 h->got.offset = s->_raw_size;
2946 s->_raw_size += 8;
2947 dyn = htab->elf.dynamic_sections_created;
2948 if (WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h))
2949 htab->srelgot->_raw_size += sizeof (Elf64_External_Rela);
2950 }
2951 else
2952 h->got.offset = (bfd_vma) -1;
2953
2954 eh = (struct ppc_link_hash_entry *) h;
2955 if (eh->dyn_relocs == NULL)
2956 return true;
2957
2958 /* In the shared -Bsymbolic case, discard space allocated for
2959 dynamic pc-relative relocs against symbols which turn out to be
2960 defined in regular objects. For the normal shared case, discard
2961 space for relocs that have become local due to symbol visibility
2962 changes. */
2963
2964 if (info->shared)
2965 {
2966 if ((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) != 0
2967 && ((h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) != 0
2968 || info->symbolic))
2969 {
2970 struct ppc_dyn_relocs **pp;
2971
2972 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5bd4f169 2973 {
65f38f15
AM
2974 p->count -= p->pc_count;
2975 p->pc_count = 0;
2976 if (p->count == 0)
2977 *pp = p->next;
2978 else
2979 pp = &p->next;
5bd4f169 2980 }
65f38f15
AM
2981 }
2982 }
2983 else
2984 {
2985 /* For the non-shared case, discard space for relocs against
2986 symbols which turn out to need copy relocs or are not
2987 dynamic. */
2988
2989 if ((h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
2990 && (((h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
2991 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0)
2992 || (htab->elf.dynamic_sections_created
2993 && (h->root.type == bfd_link_hash_undefweak
2994 || h->root.type == bfd_link_hash_undefined))))
2995 {
2996 /* Make sure this symbol is output as a dynamic symbol.
2997 Undefined weak syms won't yet be marked as dynamic. */
2998 if (h->dynindx == -1
2999 && (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL) == 0)
3000 {
ec338859 3001 if (! bfd_elf64_link_record_dynamic_symbol (info, h))
65f38f15
AM
3002 return false;
3003 }
3004
3005 /* If that succeeded, we know we'll be keeping all the
3006 relocs. */
3007 if (h->dynindx != -1)
3008 goto keep;
3009 }
3010
3011 eh->dyn_relocs = NULL;
3012
ec338859 3013 keep: ;
65f38f15
AM
3014 }
3015
3016 /* Finally, allocate space. */
3017 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3018 {
3019 asection *sreloc = elf_section_data (p->sec)->sreloc;
3020 sreloc->_raw_size += p->count * sizeof (Elf64_External_Rela);
3021 }
3022
3023 return true;
3024}
3025
3026/* Find any dynamic relocs that apply to read-only sections. */
3027
3028static boolean
3029readonly_dynrelocs (h, inf)
3030 struct elf_link_hash_entry *h;
3031 PTR inf;
3032{
3033 struct ppc_link_hash_entry *eh;
3034 struct ppc_dyn_relocs *p;
3035
3036 eh = (struct ppc_link_hash_entry *) h;
3037 for (p = eh->dyn_relocs; p != NULL; p = p->next)
3038 {
3039 asection *s = p->sec->output_section;
3040
3041 if (s != NULL && (s->flags & SEC_READONLY) != 0)
3042 {
3043 struct bfd_link_info *info = (struct bfd_link_info *) inf;
3044
3045 info->flags |= DF_TEXTREL;
3046
3047 /* Not an error, just cut short the traversal. */
3048 return false;
3049 }
3050 }
3051 return true;
3052}
3053
3054/* Set the sizes of the dynamic sections. */
3055
3056static boolean
3057ppc64_elf_size_dynamic_sections (output_bfd, info)
3058 bfd *output_bfd ATTRIBUTE_UNUSED;
3059 struct bfd_link_info *info;
3060{
3061 struct ppc_link_hash_table *htab;
3062 bfd *dynobj;
3063 asection *s;
3064 boolean relocs;
3065 bfd *ibfd;
3066
3067 htab = ppc_hash_table (info);
3068 dynobj = htab->elf.dynobj;
3069 if (dynobj == NULL)
3070 abort ();
3071
3072 if (htab->elf.dynamic_sections_created)
3073 {
3074 /* Set the contents of the .interp section to the interpreter. */
3075 if (! info->shared)
3076 {
3077 s = bfd_get_section_by_name (dynobj, ".interp");
3078 if (s == NULL)
3079 abort ();
3080 s->_raw_size = sizeof ELF_DYNAMIC_INTERPRETER;
3081 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
3082 }
3083 }
3084
3085 /* Set up .got offsets for local syms, and space for local dynamic
3086 relocs. */
3087 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
3088 {
3089 bfd_signed_vma *local_got;
3090 bfd_signed_vma *end_local_got;
3091 bfd_size_type locsymcount;
3092 Elf_Internal_Shdr *symtab_hdr;
3093 asection *srel;
3094
3095 if (bfd_get_flavour (ibfd) != bfd_target_elf_flavour)
3096 continue;
3097
3098 for (s = ibfd->sections; s != NULL; s = s->next)
3099 {
ec338859 3100 struct ppc_dyn_relocs *p;
65f38f15 3101
ec338859
AM
3102 for (p = *((struct ppc_dyn_relocs **)
3103 &elf_section_data (s)->local_dynrel);
3104 p != NULL;
3105 p = p->next)
65f38f15 3106 {
ec338859
AM
3107 if (!bfd_is_abs_section (p->sec)
3108 && bfd_is_abs_section (p->sec->output_section))
3109 {
3110 /* Input section has been discarded, either because
3111 it is a copy of a linkonce section or due to
3112 linker script /DISCARD/, so we'll be discarding
3113 the relocs too. */
3114 }
248866a8 3115 else if (p->count != 0)
ec338859
AM
3116 {
3117 srel = elf_section_data (p->sec)->sreloc;
3118 srel->_raw_size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
3119 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
3120 info->flags |= DF_TEXTREL;
ec338859 3121 }
65f38f15
AM
3122 }
3123 }
3124
3125 local_got = elf_local_got_refcounts (ibfd);
3126 if (!local_got)
3127 continue;
3128
3129 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
3130 locsymcount = symtab_hdr->sh_info;
3131 end_local_got = local_got + locsymcount;
3132 s = htab->sgot;
3133 srel = htab->srelgot;
3134 for (; local_got < end_local_got; ++local_got)
3135 {
3136 if (*local_got > 0)
5bd4f169 3137 {
65f38f15
AM
3138 *local_got = s->_raw_size;
3139 s->_raw_size += 8;
3140 if (info->shared)
3141 srel->_raw_size += sizeof (Elf64_External_Rela);
5bd4f169 3142 }
65f38f15
AM
3143 else
3144 *local_got = (bfd_vma) -1;
3145 }
3146 }
3147
3148 /* Allocate global sym .plt and .got entries, and space for global
3149 sym dynamic relocs. */
3150 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, (PTR) info);
3151
3152 /* We now have determined the sizes of the various dynamic sections.
3153 Allocate memory for them. */
3154 relocs = false;
3155 for (s = dynobj->sections; s != NULL; s = s->next)
3156 {
5d1634d7
AM
3157 bfd_vma size;
3158
65f38f15
AM
3159 if ((s->flags & SEC_LINKER_CREATED) == 0)
3160 continue;
3161
3162 if (s == htab->splt
3163 || s == htab->sgot
5d1634d7 3164 || s == htab->sstub
65f38f15
AM
3165 || s == htab->sglink)
3166 {
3167 /* Strip this section if we don't need it; see the
3168 comment below. */
5bd4f169 3169 }
65f38f15 3170 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
5bd4f169
AM
3171 {
3172 if (s->_raw_size == 0)
3173 {
3174 /* If we don't need this section, strip it from the
3175 output file. This is mostly to handle .rela.bss and
3176 .rela.plt. We must create both sections in
3177 create_dynamic_sections, because they must be created
3178 before the linker maps input sections to output
3179 sections. The linker does that before
3180 adjust_dynamic_symbol is called, and it is that
3181 function which decides whether anything needs to go
3182 into these sections. */
5bd4f169
AM
3183 }
3184 else
3185 {
65f38f15
AM
3186 if (s != htab->srelplt)
3187 relocs = true;
5bd4f169
AM
3188
3189 /* We use the reloc_count field as a counter if we need
3190 to copy relocs into the output file. */
3191 s->reloc_count = 0;
3192 }
3193 }
65f38f15 3194 else
5bd4f169
AM
3195 {
3196 /* It's not one of our sections, so don't allocate space. */
3197 continue;
3198 }
3199
65f38f15 3200 if (s->_raw_size == 0)
5bd4f169
AM
3201 {
3202 _bfd_strip_section_from_output (info, s);
3203 continue;
3204 }
3205
65f38f15
AM
3206 /* Allocate memory for the section contents. We use bfd_zalloc
3207 here in case unused entries are not reclaimed before the
3208 section's contents are written out. This should not happen,
3209 but this way if it does, we get a R_PPC64_NONE reloc instead
3210 of garbage. */
5d1634d7
AM
3211 size = s->_raw_size;
3212 if (s == htab->sstub)
3213 {
3214 /* .stub may grow. Allocate enough for the maximum growth. */
3215 size += (size + 65536 + 65535) / 65536 * 4;
3216 }
3217 s->contents = (bfd_byte *) bfd_zalloc (dynobj, size);
65f38f15 3218 if (s->contents == NULL)
5bd4f169
AM
3219 return false;
3220 }
3221
e86ce104 3222 if (htab->elf.dynamic_sections_created)
5bd4f169
AM
3223 {
3224 /* Add some entries to the .dynamic section. We fill in the
3225 values later, in ppc64_elf_finish_dynamic_sections, but we
3226 must add the entries now so that we get the correct size for
3227 the .dynamic section. The DT_DEBUG entry is filled in by the
3228 dynamic linker and used by the debugger. */
dc810e39
AM
3229#define add_dynamic_entry(TAG, VAL) \
3230 bfd_elf64_add_dynamic_entry (info, (bfd_vma) (TAG), (bfd_vma) (VAL))
3231
3232 if (!info->shared)
5bd4f169 3233 {
dc810e39 3234 if (!add_dynamic_entry (DT_DEBUG, 0))
5bd4f169
AM
3235 return false;
3236 }
3237
65f38f15 3238 if (htab->splt->_raw_size != 0)
5bd4f169 3239 {
dc810e39
AM
3240 if (!add_dynamic_entry (DT_PLTGOT, 0)
3241 || !add_dynamic_entry (DT_PLTRELSZ, 0)
3242 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
3243 || !add_dynamic_entry (DT_JMPREL, 0)
3244 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
5bd4f169
AM
3245 return false;
3246 }
3247
19397422
AM
3248 if (NO_OPD_RELOCS)
3249 {
3250 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
3251 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
3252 return false;
3253 }
3254
5bd4f169
AM
3255 if (relocs)
3256 {
dc810e39
AM
3257 if (!add_dynamic_entry (DT_RELA, 0)
3258 || !add_dynamic_entry (DT_RELASZ, 0)
3259 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
5bd4f169 3260 return false;
5bd4f169 3261
65f38f15
AM
3262 /* If any dynamic relocs apply to a read-only section,
3263 then we need a DT_TEXTREL entry. */
248866a8
AM
3264 if ((info->flags & DF_TEXTREL) == 0)
3265 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs,
3266 (PTR) info);
5bd4f169 3267
65f38f15 3268 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 3269 {
65f38f15
AM
3270 if (!add_dynamic_entry (DT_TEXTREL, 0))
3271 return false;
5bd4f169 3272 }
5bd4f169 3273 }
5bd4f169 3274 }
65f38f15 3275#undef add_dynamic_entry
5bd4f169
AM
3276
3277 return true;
3278}
3279
3280/* Called after we have seen all the input files/sections, but before
3281 final symbol resolution and section placement has been determined.
3282
3283 We use this hook to provide a value for TOCstart, which we store in
5d1634d7 3284 the output bfd elf_gp. */
5bd4f169 3285
5d1634d7
AM
3286boolean
3287ppc64_elf_set_toc (obfd, info)
3288 bfd *obfd;
5bd4f169
AM
3289 struct bfd_link_info *info;
3290{
5d1634d7 3291 if (!info->relocateable)
5bd4f169
AM
3292 {
3293 asection *s;
3294 bfd_vma TOCstart;
3295
5d1634d7 3296 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
5bd4f169 3297 order. The TOC starts where the first of these sections starts. */
5d1634d7 3298 s = bfd_get_section_by_name (obfd, ".got");
5bd4f169 3299 if (s == NULL)
5d1634d7 3300 s = bfd_get_section_by_name (obfd, ".toc");
5bd4f169 3301 if (s == NULL)
5d1634d7 3302 s = bfd_get_section_by_name (obfd, ".tocbss");
5bd4f169 3303 if (s == NULL)
5d1634d7 3304 s = bfd_get_section_by_name (obfd, ".plt");
5bd4f169
AM
3305 if (s == NULL)
3306 {
3307 /* This may happen for
3308 o references to TOC base (SYM@toc / TOC[tc0]) without a
3309 .toc directive
3310 o bad linker script
3311 o --gc-sections and empty TOC sections
3312
3313 FIXME: Warn user? */
3314
3315 /* Look for a likely section. We probably won't even be
3316 using TOCstart. */
5d1634d7 3317 for (s = obfd->sections; s != NULL; s = s->next)
5bd4f169
AM
3318 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
3319 == (SEC_ALLOC | SEC_SMALL_DATA))
3320 break;
3321 if (s == NULL)
5d1634d7 3322 for (s = obfd->sections; s != NULL; s = s->next)
5bd4f169
AM
3323 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
3324 == (SEC_ALLOC | SEC_SMALL_DATA))
3325 break;
3326 if (s == NULL)
5d1634d7 3327 for (s = obfd->sections; s != NULL; s = s->next)
5bd4f169
AM
3328 if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
3329 break;
3330 if (s == NULL)
5d1634d7 3331 for (s = obfd->sections; s != NULL; s = s->next)
5bd4f169
AM
3332 if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
3333 break;
3334 }
3335
3336 TOCstart = 0;
3337 if (s != NULL)
3338 TOCstart = s->output_section->vma + s->output_offset;
3339
5d1634d7
AM
3340 elf_gp (obfd) = TOCstart;
3341 }
3342 return true;
3343}
3344
3345/* PowerPC64 .plt entries are 24 bytes long, which doesn't divide
3346 evenly into 64k. Sometimes with a large enough .plt, we'll need to
3347 use offsets differing in the high 16 bits when accessing a .plt
3348 entry from a .plt call stub. This function adjusts the size of
3349 .stub to accommodate the extra stub instruction needed in such
3350 cases. */
3351
3352boolean
3353ppc64_elf_size_stubs (obfd, info, changed)
3354 bfd *obfd;
3355 struct bfd_link_info *info;
3356 int *changed;
3357{
3358 struct ppc_link_hash_table *htab = ppc_hash_table (info);
3359 bfd_vma plt_offset, next_64k;
3360 long base, num, extra;
3361
3362 /* .plt and .stub should be both present, or both absent. */
3363 if ((htab->splt == NULL || htab->splt->_raw_size == 0)
3364 != (htab->sstub == NULL || htab->sstub->_raw_size == 0))
3365 abort ();
3366
3367 /* If no .plt, then nothing to do. */
3368 if (htab->splt == NULL || htab->splt->_raw_size == 0)
3369 return true;
3370
3371 plt_offset = (htab->splt->output_section->vma
3372 + htab->splt->output_offset
3373 - elf_gp (obfd));
3374 next_64k = (plt_offset + 65535) & -65536;
3375
3376 /* If the .plt doesn't have any entries crossing a 64k boundary,
3377 then there is no need for bigger stubs. */
0ad3a73b 3378 if (plt_offset + htab->splt->_raw_size <= next_64k)
5d1634d7
AM
3379 return true;
3380
3381 /* OK, so we have at least one transition. Since .plt entries are
3382 24 bytes long, we'll strike it lucky every 3*64k, with the 64k
3383 boundary between .plt entries. */
3384 base = next_64k / 65536;
3385 num = (plt_offset + htab->splt->_raw_size - next_64k) / 65536;
3386 extra = (base % 3 + num + 1) * 2 / 3;
3387
3388 /* Allow one extra instruction for each EXTRA. The change in .stub
3389 may change the location of .toc and .plt. .toc and .plt ought to
3390 move as a group, but someone might be playing with eg. .plt
3391 alignment, so don't allow .stub size to decrease. */
3392 if (htab->sstub->_cooked_size < htab->sstub->_raw_size + extra * 4)
3393 {
3394 htab->sstub->_cooked_size = htab->sstub->_raw_size + extra * 4;
3395 *changed = true;
3396 }
3397 return true;
3398}
3399
3400/* Build a .plt call stub. */
3401
3402static bfd_byte *
3403build_plt_stub (obfd, p, offset, glink)
3404 bfd *obfd;
3405 bfd_byte *p;
3406 int offset;
3407 int glink;
3408{
3409#define PPC_LO(v) ((v) & 0xffff)
3410#define PPC_HI(v) (((v) >> 16) & 0xffff)
3411#define PPC_HA(v) PPC_HI ((v) + 0x8000)
3412
3413 if (glink)
3414 bfd_put_32 (obfd, LD_R2_40R1, p), p += 4;
3415 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
3416 if (!glink)
3417 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
3418 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
3419 if (PPC_HA (offset + 8) != PPC_HA (offset))
3420 bfd_put_32 (obfd, ADDIS_R12_R12_1, p), p += 4;
3421 offset += 8;
3422 bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p), p += 4;
3423 if (PPC_HA (offset + 8) != PPC_HA (offset))
3424 bfd_put_32 (obfd, ADDIS_R12_R12_1, p), p += 4;
3425 offset += 8;
3426 bfd_put_32 (obfd, MTCTR_R11, p), p += 4;
3427 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
3428 bfd_put_32 (obfd, BCTR, p), p += 4;
3429 return p;
3430}
3431
3432/* Build the stubs for one function call. */
3433
3434static boolean
3435build_one_stub (h, inf)
3436 struct elf_link_hash_entry *h;
3437 PTR inf;
3438{
3439 struct bfd_link_info *info;
3440 struct ppc_link_hash_table *htab;
3441
3442 if (h->root.type == bfd_link_hash_indirect
3443 || h->root.type == bfd_link_hash_warning)
3444 return true;
3445
3446 info = (struct bfd_link_info *) inf;
3447 htab = ppc_hash_table (info);
3448
3449 if (htab->elf.dynamic_sections_created
41bd81ab
AM
3450 && h->plt.offset != (bfd_vma) -1
3451 && ((struct ppc_link_hash_entry *) h)->is_func_descriptor)
5d1634d7 3452 {
e86ce104 3453 struct elf_link_hash_entry *fh;
5d1634d7
AM
3454 asection *s;
3455 bfd_vma plt_r2;
3456 bfd_byte *p;
3457 unsigned int indx;
3458
e86ce104
AM
3459 fh = elf_link_hash_lookup (&htab->elf, h->root.root.string - 1,
3460 false, false, true);
3461
3462 if (fh == NULL)
3463 abort ();
3464
3465 BFD_ASSERT (((struct ppc_link_hash_entry *) fh)->is_func);
3466
5d1634d7
AM
3467 /* Build the .plt call stub. */
3468 plt_r2 = (htab->splt->output_section->vma
3469 + htab->splt->output_offset
3470 + h->plt.offset
3471 - elf_gp (htab->splt->output_section->owner)
3472 - TOC_BASE_OFF);
3473
e86ce104
AM
3474 if (plt_r2 + 0x80000000 > 0xffffffff
3475 || (plt_r2 & 3) != 0)
5d1634d7
AM
3476 {
3477 (*_bfd_error_handler)
e86ce104 3478 (_("linkage table error against `%s'"),
5d1634d7
AM
3479 h->root.root.string);
3480 bfd_set_error (bfd_error_bad_value);
3481 htab->plt_overflow = true;
3482 return false;
3483 }
41bd81ab
AM
3484
3485 s = htab->sstub;
3486 /* Steal plt.offset to store the stub offset. */
3487 fh->plt.offset = s->_cooked_size;
5d1634d7
AM
3488 p = s->contents + s->_cooked_size;
3489 p = build_plt_stub (s->owner, p, (int) plt_r2, 0);
3490 s->_cooked_size = p - s->contents;
3491
3492 /* Build the .glink lazy link call stub. */
3493 s = htab->sglink;
3494 p = s->contents + s->_cooked_size;
3495 indx = s->reloc_count;
3496 if (indx < 0x8000)
3497 {
3498 bfd_put_32 (s->owner, LI_R0_0 | indx, p);
3499 p += 4;
3500 }
3501 else
3502 {
3503 bfd_put_32 (s->owner, LIS_R0_0 | PPC_HI (indx), p);
3504 p += 4;
3505 bfd_put_32 (s->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
3506 p += 4;
3507 }
3508 bfd_put_32 (s->owner, B_DOT | ((s->contents - p) & 0x3fffffc), p);
3509 p += 4;
3510 s->_cooked_size = p - s->contents;
3511 s->reloc_count += 1;
5bd4f169 3512 }
5d1634d7
AM
3513 return true;
3514}
5bd4f169 3515
5d1634d7
AM
3516boolean
3517ppc64_elf_build_stubs (obfd, info)
3518 bfd *obfd;
3519 struct bfd_link_info *info;
3520{
3521 struct ppc_link_hash_table *htab = ppc_hash_table (info);
3522 bfd_vma old_stub_size;
3523 bfd_vma plt_r2;
3524 bfd_byte *p;
3525
3526 /* If no .plt stubs, then nothing to do. */
3527 if (htab->sstub == NULL || htab->sstub->_raw_size == 0)
3528 return true;
3529
3530 old_stub_size = htab->sstub->_cooked_size;
3531 htab->sstub->_cooked_size = 0;
3532
3533 /* Build the .glink plt call stub. */
3534 plt_r2 = (htab->splt->output_section->vma
3535 + htab->splt->output_offset
3536 - elf_gp (obfd)
3537 - TOC_BASE_OFF);
3538 p = htab->sglink->contents;
3539 p = build_plt_stub (htab->sglink->owner, p, (int) plt_r2, 1);
3540 while (p - htab->sglink->contents < GLINK_CALL_STUB_SIZE)
3541 {
3542 bfd_put_32 (htab->sglink->owner, NOP, p);
3543 p += 4;
3544 }
3545 htab->sglink->_cooked_size = p - htab->sglink->contents;
3546
3547 /* Use reloc_count to count entries. */
3548 htab->sglink->reloc_count = 0;
3549
3550 elf_link_hash_traverse (&htab->elf, build_one_stub, (PTR) info);
3551 htab->sglink->reloc_count = 0;
3552
3553 if (htab->plt_overflow)
3554 return false;
3555
3556 if (old_stub_size != htab->sstub->_cooked_size
3557 || htab->sglink->_raw_size != htab->sglink->_cooked_size)
3558 {
3559 (*_bfd_error_handler)
3560 (_("stub section size doesn't match calculated size"));
3561 bfd_set_error (bfd_error_bad_value);
3562 return false;
3563 }
3564 return true;
5bd4f169
AM
3565}
3566
3567/* Set up any other section flags and such that may be necessary. */
3568
3569static boolean
3570ppc64_elf_fake_sections (abfd, shdr, asect)
3571 bfd *abfd ATTRIBUTE_UNUSED;
3572 Elf64_Internal_Shdr *shdr;
3573 asection *asect;
3574{
3575 if ((asect->flags & SEC_EXCLUDE) != 0)
3576 shdr->sh_flags |= SHF_EXCLUDE;
3577
3578 if ((asect->flags & SEC_SORT_ENTRIES) != 0)
3579 shdr->sh_type = SHT_ORDERED;
3580
3581 return true;
3582}
3583
3584/* The RELOCATE_SECTION function is called by the ELF backend linker
3585 to handle the relocations for a section.
3586
3587 The relocs are always passed as Rela structures; if the section
3588 actually uses Rel structures, the r_addend field will always be
3589 zero.
3590
3591 This function is responsible for adjust the section contents as
3592 necessary, and (if using Rela relocs and generating a
3593 relocateable output file) adjusting the reloc addend as
3594 necessary.
3595
3596 This function does not have to worry about setting the reloc
3597 address or the reloc symbol index.
3598
3599 LOCAL_SYMS is a pointer to the swapped in local symbols.
3600
3601 LOCAL_SECTIONS is an array giving the section in the input file
3602 corresponding to the st_shndx field of each local symbol.
3603
3604 The global hash table entry for the global symbols can be found
3605 via elf_sym_hashes (input_bfd).
3606
3607 When generating relocateable output, this function must handle
3608 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
3609 going to be the section symbol corresponding to the output
3610 section, which means that the addend must be adjusted
3611 accordingly. */
3612
3613static boolean
3614ppc64_elf_relocate_section (output_bfd, info, input_bfd, input_section,
3615 contents, relocs, local_syms, local_sections)
3616 bfd *output_bfd;
3617 struct bfd_link_info *info;
3618 bfd *input_bfd;
3619 asection *input_section;
3620 bfd_byte *contents;
3621 Elf_Internal_Rela *relocs;
3622 Elf_Internal_Sym *local_syms;
3623 asection **local_sections;
3624{
65f38f15 3625 struct ppc_link_hash_table *htab;
5bd4f169
AM
3626 Elf_Internal_Shdr *symtab_hdr;
3627 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
3628 Elf_Internal_Rela *rel;
3629 Elf_Internal_Rela *relend;
5bd4f169
AM
3630 bfd_vma *local_got_offsets;
3631 bfd_vma TOCstart;
3632 boolean ret = true;
41bd81ab 3633 boolean is_opd;
5bd4f169 3634
65f38f15 3635 /* Initialize howto table if needed. */
5bd4f169 3636 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
3637 ppc_howto_init ();
3638
65f38f15 3639 htab = ppc_hash_table (info);
5bd4f169 3640 local_got_offsets = elf_local_got_offsets (input_bfd);
5bd4f169 3641 TOCstart = elf_gp (output_bfd);
5bd4f169
AM
3642 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
3643 sym_hashes = elf_sym_hashes (input_bfd);
41bd81ab 3644 is_opd = strcmp (bfd_get_section_name (abfd, input_section), ".opd") == 0;
65f38f15 3645
5bd4f169
AM
3646 rel = relocs;
3647 relend = relocs + input_section->reloc_count;
3648 for (; rel < relend; rel++)
3649 {
3650 enum elf_ppc_reloc_type r_type;
3651 bfd_vma offset;
3652 bfd_vma addend;
3653 bfd_reloc_status_type r;
3654 Elf_Internal_Sym *sym;
3655 asection *sec;
3656 struct elf_link_hash_entry *h;
3657 const char *sym_name;
5bd4f169
AM
3658 unsigned long r_symndx;
3659 bfd_vma relocation;
65f38f15 3660 boolean unresolved_reloc;
e86ce104 3661 boolean has_nop;
dc810e39 3662 long insn;
5bd4f169
AM
3663
3664 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rel->r_info);
5bd4f169
AM
3665 r_symndx = ELF64_R_SYM (rel->r_info);
3666
3667 if (info->relocateable)
3668 {
3669 /* This is a relocatable link. We don't have to change
3670 anything, unless the reloc is against a section symbol,
3671 in which case we have to adjust according to where the
3672 section symbol winds up in the output section. */
3673 if (r_symndx < symtab_hdr->sh_info)
3674 {
3675 sym = local_syms + r_symndx;
3676 if ((unsigned) ELF_ST_TYPE (sym->st_info) == STT_SECTION)
3677 {
3678 sec = local_sections[r_symndx];
65f38f15 3679 rel->r_addend += sec->output_offset + sym->st_value;
5bd4f169
AM
3680 }
3681 }
5bd4f169
AM
3682 continue;
3683 }
3684
3685 /* This is a final link. */
3686
65f38f15
AM
3687 offset = rel->r_offset;
3688 addend = rel->r_addend;
3689 r = bfd_reloc_other;
3690 sym = (Elf_Internal_Sym *) 0;
3691 sec = (asection *) 0;
3692 h = (struct elf_link_hash_entry *) 0;
3693 sym_name = (const char *) 0;
3694 unresolved_reloc = false;
3695
5bd4f169
AM
3696 if (r_type == R_PPC64_TOC)
3697 {
3698 /* Relocation value is TOC base. Symbol is ignored. */
3699 relocation = TOCstart + TOC_BASE_OFF;
3700 }
3701 else if (r_symndx < symtab_hdr->sh_info)
3702 {
3703 /* It's a local symbol. */
3704 sym = local_syms + r_symndx;
3705 sec = local_sections[r_symndx];
3706 sym_name = "<local symbol>";
3707
f8df10f4
JJ
3708 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, sec, rel);
3709 addend = rel->r_addend;
5bd4f169
AM
3710 }
3711 else
3712 {
3713 /* It's a global symbol. */
3714 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3715 while (h->root.type == bfd_link_hash_indirect
3716 || h->root.type == bfd_link_hash_warning)
3717 h = (struct elf_link_hash_entry *) h->root.u.i.link;
3718 sym_name = h->root.root.string;
65f38f15 3719 relocation = 0;
5bd4f169
AM
3720 if (h->root.type == bfd_link_hash_defined
3721 || h->root.type == bfd_link_hash_defweak)
3722 {
3723 sec = h->root.u.def.section;
65f38f15
AM
3724 if (sec->output_section == NULL)
3725 /* Set a flag that will be cleared later if we find a
3726 relocation value for this symbol. output_section
3727 is typically NULL for symbols satisfied by a shared
3728 library. */
3729 unresolved_reloc = true;
5bd4f169
AM
3730 else
3731 relocation = (h->root.u.def.value
3732 + sec->output_section->vma
3733 + sec->output_offset);
3734 }
3735 else if (h->root.type == bfd_link_hash_undefweak)
65f38f15 3736 ;
671bae9c 3737 else if (info->shared
65f38f15
AM
3738 && (!info->symbolic || info->allow_shlib_undefined)
3739 && !info->no_undefined
3740 && ELF_ST_VISIBILITY (h->other) == STV_DEFAULT)
3741 ;
5bd4f169
AM
3742 else
3743 {
3744 if (! ((*info->callbacks->undefined_symbol)
3745 (info, h->root.root.string, input_bfd, input_section,
65f38f15
AM
3746 offset, (!info->shared
3747 || info->no_undefined
3748 || ELF_ST_VISIBILITY (h->other)))))
5bd4f169 3749 return false;
5bd4f169
AM
3750 }
3751 }
3752
65f38f15 3753 /* First handle relocations that tweak non-addend part of insn. */
86c76c7b 3754 insn = 0;
65f38f15 3755 switch (r_type)
5bd4f169
AM
3756 {
3757 default:
65f38f15 3758 break;
5bd4f169 3759
65f38f15
AM
3760 /* Branch taken prediction relocations. */
3761 case R_PPC64_ADDR14_BRTAKEN:
3762 case R_PPC64_REL14_BRTAKEN:
86c76c7b
AM
3763 insn = 0x01 << 21; /* Set 't' bit, lowest bit of BO field. */
3764 /* Fall thru. */
65f38f15 3765
86c76c7b 3766 /* Branch not taken prediction relocations. */
65f38f15
AM
3767 case R_PPC64_ADDR14_BRNTAKEN:
3768 case R_PPC64_REL14_BRNTAKEN:
86c76c7b
AM
3769 insn |= bfd_get_32 (output_bfd, contents + offset) & ~(0x01 << 21);
3770 /* Set 'a' bit. This is 0b00010 in BO field for branch on CR(BI)
3771 insns (BO == 001at or 011at), and 0b01000 for branch on CTR
3772 insns (BO == 1a00t or 1a01t). */
3773 if ((insn & (0x14 << 21)) == (0x04 << 21))
3774 insn |= 0x02 << 21;
3775 else if ((insn & (0x14 << 21)) == (0x10 << 21))
3776 insn |= 0x08 << 21;
65f38f15 3777 else
86c76c7b
AM
3778 break;
3779
65f38f15
AM
3780 bfd_put_32 (output_bfd, (bfd_vma) insn, contents + offset);
3781 break;
5bd4f169 3782
65f38f15
AM
3783 case R_PPC64_REL24:
3784 case R_PPC64_ADDR24:
5bd4f169 3785 /* An ADDR24 or REL24 branching to a linkage function may be
65f38f15 3786 followed by a nop that we have to replace with a ld in
5bd4f169
AM
3787 order to restore the TOC base pointer. Only calls to
3788 shared objects need to alter the TOC base. These are
3789 recognized by their need for a PLT entry. */
e86ce104 3790 has_nop = 0;
5bd4f169 3791 if (h != NULL
41bd81ab
AM
3792 && h->plt.offset != (bfd_vma) -1
3793 && htab->sstub != NULL)
3794 {
3795 /* plt.offset here is the offset into the stub section. */
3796 relocation = (htab->sstub->output_section->vma
3797 + htab->sstub->output_offset
3798 + h->plt.offset);
3799 unresolved_reloc = false;
3800
5bd4f169
AM
3801 /* Make sure that there really is an instruction after
3802 the branch that we can decode. */
41bd81ab
AM
3803 if (offset + 8 <= input_section->_cooked_size)
3804 {
3805 bfd_byte *pnext;
5bd4f169 3806
41bd81ab
AM
3807 pnext = contents + offset + 4;
3808 insn = bfd_get_32 (input_bfd, pnext);
5bd4f169 3809
41bd81ab
AM
3810 if (insn == 0x60000000 /* nop (ori r0,r0,0) */
3811 || insn == 0x4def7b82 /* cror 15,15,15 */
3812 || insn == 0x4ffffb82) /* cror 31,31,31 */
3813 {
3814 bfd_put_32 (input_bfd,
3815 (bfd_vma) 0xe8410028, /* ld r2,40(r1) */
3816 pnext);
3817 has_nop = 1;
3818 }
5bd4f169
AM
3819 }
3820 }
e86ce104
AM
3821
3822 if (h != NULL
3823 && h->root.type == bfd_link_hash_undefweak
3824 && r_type == R_PPC64_REL24
3825 && addend == 0
3826 && relocation == 0)
3827 {
3828 /* Tweak calls to undefined weak functions to behave as
3829 if the "called" function immediately returns. We can
3830 thus call to a weak function without first checking
3831 whether the function is defined. */
3832 relocation = 4;
3833 if (has_nop)
3834 relocation = 8;
3835 }
65f38f15
AM
3836 break;
3837 }
5bd4f169 3838
65f38f15
AM
3839 /* Set `addend'. */
3840 switch (r_type)
3841 {
3842 default:
3843 (*_bfd_error_handler)
3844 (_("%s: unknown relocation type %d for symbol %s"),
3845 bfd_archive_filename (input_bfd), (int) r_type, sym_name);
5bd4f169 3846
65f38f15
AM
3847 bfd_set_error (bfd_error_bad_value);
3848 ret = false;
3849 continue;
5bd4f169 3850
65f38f15
AM
3851 case R_PPC64_NONE:
3852 case R_PPC_GNU_VTINHERIT:
3853 case R_PPC_GNU_VTENTRY:
3854 continue;
5bd4f169
AM
3855
3856 /* GOT16 relocations. Like an ADDR16 using the symbol's
3857 address in the GOT as relocation value instead of the
3858 symbols value itself. Also, create a GOT entry for the
3859 symbol and put the symbol value there. */
65f38f15
AM
3860 case R_PPC64_GOT16:
3861 case R_PPC64_GOT16_LO:
3862 case R_PPC64_GOT16_HI:
3863 case R_PPC64_GOT16_HA:
3864 case R_PPC64_GOT16_DS:
3865 case R_PPC64_GOT16_LO_DS:
5bd4f169
AM
3866 {
3867 /* Relocation is to the entry for this symbol in the global
3868 offset table. */
3869 bfd_vma off;
65f38f15
AM
3870
3871 if (htab->sgot == NULL)
3872 abort ();
5bd4f169
AM
3873
3874 if (h != NULL)
3875 {
65f38f15 3876 boolean dyn;
5bd4f169 3877
65f38f15
AM
3878 off = h->got.offset;
3879 dyn = htab->elf.dynamic_sections_created;
3880 if (! WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info, h)
5bd4f169 3881 || (info->shared
65f38f15
AM
3882 && (info->symbolic
3883 || h->dynindx == -1
3884 || (h->elf_link_hash_flags
3885 & ELF_LINK_FORCED_LOCAL))
5bd4f169
AM
3886 && (h->elf_link_hash_flags
3887 & ELF_LINK_HASH_DEF_REGULAR)))
3888 {
3889 /* This is actually a static link, or it is a
3890 -Bsymbolic link and the symbol is defined
65f38f15
AM
3891 locally, or the symbol was forced to be local
3892 because of a version file. We must initialize
3893 this entry in the global offset table. Since the
3894 offset must always be a multiple of 8, we use the
3895 least significant bit to record whether we have
5bd4f169
AM
3896 initialized it already.
3897
65f38f15 3898 When doing a dynamic link, we create a .rel.got
5bd4f169
AM
3899 relocation entry to initialize the value. This
3900 is done in the finish_dynamic_symbol routine. */
3901 if ((off & 1) != 0)
3902 off &= ~1;
3903 else
3904 {
3905 bfd_put_64 (output_bfd, relocation,
65f38f15 3906 htab->sgot->contents + off);
5bd4f169
AM
3907 h->got.offset |= 1;
3908 }
3909 }
65f38f15
AM
3910 else
3911 unresolved_reloc = false;
5bd4f169
AM
3912 }
3913 else
3914 {
65f38f15
AM
3915 if (local_got_offsets == NULL)
3916 abort ();
5bd4f169
AM
3917
3918 off = local_got_offsets[r_symndx];
3919
65f38f15 3920 /* The offset must always be a multiple of 8. We use
5bd4f169
AM
3921 the least significant bit to record whether we have
3922 already processed this entry. */
3923 if ((off & 1) != 0)
3924 off &= ~1;
3925 else
3926 {
65f38f15
AM
3927 bfd_put_64 (output_bfd, relocation,
3928 htab->sgot->contents + off);
5bd4f169
AM
3929
3930 if (info->shared)
3931 {
5bd4f169 3932 Elf_Internal_Rela outrel;
65f38f15 3933 Elf64_External_Rela *loc;
5bd4f169
AM
3934
3935 /* We need to generate a R_PPC64_RELATIVE reloc
3936 for the dynamic linker. */
65f38f15
AM
3937 outrel.r_offset = (htab->sgot->output_section->vma
3938 + htab->sgot->output_offset
5bd4f169
AM
3939 + off);
3940 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
3941 outrel.r_addend = relocation;
65f38f15
AM
3942 loc = (Elf64_External_Rela *) htab->srelgot->contents;
3943 loc += htab->srelgot->reloc_count++;
3944 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
5bd4f169
AM
3945 }
3946
3947 local_got_offsets[r_symndx] |= 1;
3948 }
3949 }
3950
65f38f15
AM
3951 if (off >= (bfd_vma) -2)
3952 abort ();
3953
3954 relocation = htab->sgot->output_offset + off;
3955
5bd4f169
AM
3956 /* TOC base (r2) is TOC start plus 0x8000. */
3957 addend -= TOC_BASE_OFF;
5bd4f169 3958 }
65f38f15
AM
3959 break;
3960
3961 case R_PPC64_PLT16_HA:
3962 case R_PPC64_PLT16_HI:
3963 case R_PPC64_PLT16_LO:
3964 case R_PPC64_PLT32:
3965 case R_PPC64_PLT64:
3966 /* Relocation is to the entry for this symbol in the
3967 procedure linkage table. */
3968
3969 /* Resolve a PLT reloc against a local symbol directly,
3970 without using the procedure linkage table. */
3971 if (h == NULL)
3972 break;
3973
3974 if (h->plt.offset == (bfd_vma) -1
3975 || htab->splt == NULL)
3976 {
3977 /* We didn't make a PLT entry for this symbol. This
3978 happens when statically linking PIC code, or when
3979 using -Bsymbolic. */
3980 break;
3981 }
3982
3983 relocation = (htab->splt->output_section->vma
3984 + htab->splt->output_offset
3985 + h->plt.offset);
3986 unresolved_reloc = false;
3987 break;
5bd4f169
AM
3988
3989 /* TOC16 relocs. We want the offset relative to the TOC base,
3990 which is the address of the start of the TOC plus 0x8000.
3991 The TOC consists of sections .got, .toc, .tocbss, and .plt,
3992 in this order. */
65f38f15
AM
3993 case R_PPC64_TOC16:
3994 case R_PPC64_TOC16_LO:
3995 case R_PPC64_TOC16_HI:
3996 case R_PPC64_TOC16_DS:
3997 case R_PPC64_TOC16_LO_DS:
3998 case R_PPC64_TOC16_HA:
5bd4f169 3999 addend -= TOCstart + TOC_BASE_OFF;
5bd4f169
AM
4000 break;
4001
4002 /* Relocate against the beginning of the section. */
65f38f15
AM
4003 case R_PPC64_SECTOFF:
4004 case R_PPC64_SECTOFF_LO:
4005 case R_PPC64_SECTOFF_HI:
4006 case R_PPC64_SECTOFF_DS:
4007 case R_PPC64_SECTOFF_LO_DS:
4008 case R_PPC64_SECTOFF_HA:
4009 if (sec != (asection *) 0)
4010 addend -= sec->output_section->vma;
5bd4f169
AM
4011 break;
4012
5d1634d7
AM
4013 case R_PPC64_REL24:
4014 break;
4015
65f38f15
AM
4016 /* Relocations that may need to be propagated if this is a
4017 dynamic object. */
4018 case R_PPC64_REL14:
4019 case R_PPC64_REL14_BRNTAKEN:
4020 case R_PPC64_REL14_BRTAKEN:
65f38f15
AM
4021 case R_PPC64_REL32:
4022 case R_PPC64_REL64:
4023 case R_PPC64_ADDR14:
4024 case R_PPC64_ADDR14_BRNTAKEN:
4025 case R_PPC64_ADDR14_BRTAKEN:
4026 case R_PPC64_ADDR16:
4027 case R_PPC64_ADDR16_DS:
4028 case R_PPC64_ADDR16_HA:
4029 case R_PPC64_ADDR16_HI:
4030 case R_PPC64_ADDR16_HIGHER:
4031 case R_PPC64_ADDR16_HIGHERA:
4032 case R_PPC64_ADDR16_HIGHEST:
4033 case R_PPC64_ADDR16_HIGHESTA:
4034 case R_PPC64_ADDR16_LO:
4035 case R_PPC64_ADDR16_LO_DS:
4036 case R_PPC64_ADDR24:
4037 case R_PPC64_ADDR30:
4038 case R_PPC64_ADDR32:
4039 case R_PPC64_ADDR64:
4040 case R_PPC64_UADDR16:
4041 case R_PPC64_UADDR32:
4042 case R_PPC64_UADDR64:
ec338859
AM
4043 /* r_symndx will be zero only for relocs against symbols
4044 from removed linkonce sections, or sections discarded by
4045 a linker script. */
5d1634d7
AM
4046 if (r_symndx == 0)
4047 break;
4048 /* Fall thru. */
4049
4050 case R_PPC64_TOC:
4051 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
4052 break;
4053
41bd81ab
AM
4054 if (NO_OPD_RELOCS && is_opd)
4055 break;
4056
65f38f15 4057 if ((info->shared
65f38f15
AM
4058 && (IS_ABSOLUTE_RELOC (r_type)
4059 || (h != NULL
4060 && h->dynindx != -1
4061 && (! info->symbolic
4062 || (h->elf_link_hash_flags
4063 & ELF_LINK_HASH_DEF_REGULAR) == 0))))
4064 || (!info->shared
65f38f15
AM
4065 && h != NULL
4066 && h->dynindx != -1
4067 && (h->elf_link_hash_flags & ELF_LINK_NON_GOT_REF) == 0
4068 && (((h->elf_link_hash_flags
4069 & ELF_LINK_HASH_DEF_DYNAMIC) != 0
4070 && (h->elf_link_hash_flags
4071 & ELF_LINK_HASH_DEF_REGULAR) == 0)
4072 || h->root.type == bfd_link_hash_undefweak
4073 || h->root.type == bfd_link_hash_undefined)))
4074 {
4075 Elf_Internal_Rela outrel;
4076 boolean skip, relocate;
4077 asection *sreloc;
4078 Elf64_External_Rela *loc;
4079
4080 /* When generating a dynamic object, these relocations
4081 are copied into the output file to be resolved at run
4082 time. */
4083
4084 skip = false;
4085
c629eae0
JJ
4086 outrel.r_offset =
4087 _bfd_elf_section_offset (output_bfd, info, input_section,
4088 rel->r_offset);
4089 if (outrel.r_offset == (bfd_vma) -1)
4090 skip = true;
65f38f15
AM
4091
4092 outrel.r_offset += (input_section->output_section->vma
4093 + input_section->output_offset);
4094 outrel.r_addend = addend;
4095
4096 if (skip)
4097 {
4098 relocate = false;
4099 memset (&outrel, 0, sizeof outrel);
4100 }
4101 else if (h != NULL
4102 && h->dynindx != -1
41bd81ab 4103 && !is_opd
65f38f15
AM
4104 && (!IS_ABSOLUTE_RELOC (r_type)
4105 || !info->shared
4106 || !info->symbolic
4107 || (h->elf_link_hash_flags
4108 & ELF_LINK_HASH_DEF_REGULAR) == 0))
4109 {
4110 relocate = false;
4111 outrel.r_info = ELF64_R_INFO (h->dynindx, r_type);
4112 }
4113 else
4114 {
41bd81ab
AM
4115 /* This symbol is local, or marked to become local,
4116 or this is an opd section reloc which must point
4117 at a local function. */
65f38f15
AM
4118 outrel.r_addend += relocation;
4119 relocate = true;
e86ce104 4120 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15
AM
4121 {
4122 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
4123 }
4124 else
4125 {
4126 long indx = 0;
4127
41bd81ab 4128 if (bfd_is_abs_section (sec))
65f38f15
AM
4129 ;
4130 else if (sec == NULL || sec->owner == NULL)
4131 {
4132 bfd_set_error (bfd_error_bad_value);
4133 return false;
4134 }
4135 else
4136 {
4137 asection *osec;
4138
4139 osec = sec->output_section;
4140 indx = elf_section_data (osec)->dynindx;
4141
4142 /* We are turning this relocation into one
4143 against a section symbol, so subtract out
4144 the output section's address but not the
4145 offset of the input section in the output
4146 section. */
4147 outrel.r_addend -= osec->vma;
4148 }
4149
4150 outrel.r_info = ELF64_R_INFO (indx, r_type);
4151 }
4152 }
4153
4154 sreloc = elf_section_data (input_section)->sreloc;
4155 if (sreloc == NULL)
4156 abort ();
4157
4158 loc = (Elf64_External_Rela *) sreloc->contents;
4159 loc += sreloc->reloc_count++;
4160 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
4161
4162 /* If this reloc is against an external symbol, it will
4163 be computed at runtime, so there's no need to do
4164 anything now. */
4165 if (! relocate)
4166 continue;
4167 }
5bd4f169
AM
4168 break;
4169
65f38f15
AM
4170 case R_PPC64_COPY:
4171 case R_PPC64_GLOB_DAT:
4172 case R_PPC64_JMP_SLOT:
4173 case R_PPC64_RELATIVE:
4174 /* We shouldn't ever see these dynamic relocs in relocatable
4175 files. */
4176 /* Fall thru */
4177
4178 case R_PPC64_PLTGOT16:
4179 case R_PPC64_PLTGOT16_DS:
4180 case R_PPC64_PLTGOT16_HA:
4181 case R_PPC64_PLTGOT16_HI:
4182 case R_PPC64_PLTGOT16_LO:
4183 case R_PPC64_PLTGOT16_LO_DS:
4184 case R_PPC64_PLTREL32:
4185 case R_PPC64_PLTREL64:
4186 /* These ones haven't been implemented yet. */
4187
4188 (*_bfd_error_handler)
4189 (_("%s: Relocation %s is not supported for symbol %s."),
4190 bfd_archive_filename (input_bfd),
4191 ppc64_elf_howto_table[(int) r_type]->name, sym_name);
5bd4f169
AM
4192
4193 bfd_set_error (bfd_error_invalid_operation);
4194 ret = false;
4195 continue;
65f38f15 4196 }
5bd4f169 4197
65f38f15
AM
4198 /* Do any further special processing. */
4199 switch (r_type)
4200 {
4201 default:
4202 break;
4203
4204 case R_PPC64_ADDR16_HA:
4205 case R_PPC64_ADDR16_HIGHERA:
4206 case R_PPC64_ADDR16_HIGHESTA:
4207 case R_PPC64_PLT16_HA:
4208 case R_PPC64_TOC16_HA:
4209 case R_PPC64_SECTOFF_HA:
4210 /* It's just possible that this symbol is a weak symbol
4211 that's not actually defined anywhere. In that case,
4212 'sec' would be NULL, and we should leave the symbol
4213 alone (it will be set to zero elsewhere in the link). */
4214 if (sec != NULL)
4215 /* Add 0x10000 if sign bit in 0:15 is set. */
4216 addend += ((relocation + addend) & 0x8000) << 1;
4217 break;
4218
4219 case R_PPC64_ADDR16_DS:
4220 case R_PPC64_ADDR16_LO_DS:
4221 case R_PPC64_GOT16_DS:
4222 case R_PPC64_GOT16_LO_DS:
4223 case R_PPC64_PLT16_LO_DS:
4224 case R_PPC64_SECTOFF_DS:
4225 case R_PPC64_SECTOFF_LO_DS:
4226 case R_PPC64_TOC16_DS:
4227 case R_PPC64_TOC16_LO_DS:
4228 case R_PPC64_PLTGOT16_DS:
4229 case R_PPC64_PLTGOT16_LO_DS:
4230 if (((relocation + addend) & 3) != 0)
4231 {
4232 (*_bfd_error_handler)
4233 (_("%s: error: relocation %s not a multiple of 4"),
4234 bfd_archive_filename (input_bfd),
4235 ppc64_elf_howto_table[(int) r_type]->name);
4236 bfd_set_error (bfd_error_bad_value);
4237 ret = false;
4238 continue;
4239 }
4240 break;
5bd4f169
AM
4241 }
4242
65f38f15
AM
4243 /* FIXME: Why do we allow debugging sections to escape this error?
4244 More importantly, why do we not emit dynamic relocs above in
4245 debugging sections (which are ! SEC_ALLOC)? If we had
4246 emitted the dynamic reloc, we could remove the fudge here. */
4247 if (unresolved_reloc
4248 && !(info->shared
4249 && (input_section->flags & SEC_DEBUGGING) != 0
4250 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0))
4251 (*_bfd_error_handler)
4252 (_("%s(%s+0x%lx): unresolvable relocation against symbol `%s'"),
4253 bfd_archive_filename (input_bfd),
4254 bfd_get_section_name (input_bfd, input_section),
4255 (long) rel->r_offset,
4256 h->root.root.string);
5bd4f169 4257
65f38f15 4258 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
5bd4f169
AM
4259 input_bfd,
4260 input_section,
4261 contents,
4262 offset,
4263 relocation,
4264 addend);
4265
4266 if (r == bfd_reloc_ok)
4267 ;
4268 else if (r == bfd_reloc_overflow)
4269 {
4270 const char *name;
4271
4272 if (h != NULL)
4273 {
4274 if (h->root.type == bfd_link_hash_undefweak
65f38f15 4275 && ppc64_elf_howto_table[(int) r_type]->pc_relative)
5bd4f169
AM
4276 {
4277 /* Assume this is a call protected by other code that
4278 detects the symbol is undefined. If this is the case,
4279 we can safely ignore the overflow. If not, the
4280 program is hosed anyway, and a little warning isn't
4281 going to help. */
4282
4283 continue;
4284 }
4285
4286 name = h->root.root.string;
4287 }
4288 else
4289 {
4290 name = bfd_elf_string_from_elf_section (input_bfd,
4291 symtab_hdr->sh_link,
4292 sym->st_name);
4293 if (name == NULL)
4294 continue;
4295 if (*name == '\0')
4296 name = bfd_section_name (input_bfd, sec);
4297 }
4298
65f38f15
AM
4299 if (! ((*info->callbacks->reloc_overflow)
4300 (info, name, ppc64_elf_howto_table[(int) r_type]->name,
4301 (bfd_vma) 0, input_bfd, input_section, offset)))
5bd4f169
AM
4302 return false;
4303 }
4304 else
4305 ret = false;
4306 }
4307
5bd4f169
AM
4308 return ret;
4309}
4310
4311/* Finish up dynamic symbol handling. We set the contents of various
4312 dynamic sections here. */
4313
4314static boolean
4315ppc64_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
4316 bfd *output_bfd;
4317 struct bfd_link_info *info;
4318 struct elf_link_hash_entry *h;
4319 Elf_Internal_Sym *sym;
4320{
65f38f15 4321 struct ppc_link_hash_table *htab;
5bd4f169
AM
4322 bfd *dynobj;
4323
65f38f15
AM
4324 htab = ppc_hash_table (info);
4325 dynobj = htab->elf.dynobj;
5bd4f169 4326
41bd81ab
AM
4327 if (h->plt.offset != (bfd_vma) -1
4328 && ((struct ppc_link_hash_entry *) h)->is_func_descriptor)
5bd4f169 4329 {
65f38f15
AM
4330 Elf_Internal_Rela rela;
4331 Elf64_External_Rela *loc;
5bd4f169
AM
4332
4333 /* This symbol has an entry in the procedure linkage table. Set
4334 it up. */
4335
5d1634d7 4336 if (htab->splt == NULL
65f38f15 4337 || htab->srelplt == NULL
e86ce104 4338 || htab->sglink == NULL)
65f38f15
AM
4339 abort ();
4340
65f38f15
AM
4341 /* Create a JMP_SLOT reloc to inform the dynamic linker to
4342 fill in the PLT entry. */
5bd4f169 4343
65f38f15
AM
4344 rela.r_offset = (htab->splt->output_section->vma
4345 + htab->splt->output_offset
4346 + h->plt.offset);
e86ce104 4347 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
65f38f15
AM
4348 rela.r_addend = 0;
4349
4350 loc = (Elf64_External_Rela *) htab->srelplt->contents;
4351 loc += (h->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE;
4352 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
4353 }
4354
4355 if (h->got.offset != (bfd_vma) -1)
4356 {
5bd4f169 4357 Elf_Internal_Rela rela;
65f38f15 4358 Elf64_External_Rela *loc;
5bd4f169
AM
4359
4360 /* This symbol has an entry in the global offset table. Set it
4361 up. */
4362
65f38f15
AM
4363 if (htab->sgot == NULL || htab->srelgot == NULL)
4364 abort ();
5bd4f169 4365
65f38f15
AM
4366 rela.r_offset = (htab->sgot->output_section->vma
4367 + htab->sgot->output_offset
dc810e39 4368 + (h->got.offset &~ (bfd_vma) 1));
5bd4f169 4369
65f38f15
AM
4370 /* If this is a static link, or it is a -Bsymbolic link and the
4371 symbol is defined locally or was forced to be local because
4372 of a version file, we just want to emit a RELATIVE reloc.
4373 The entry in the global offset table will already have been
4374 initialized in the relocate_section function. */
5bd4f169 4375 if (info->shared
65f38f15
AM
4376 && (info->symbolic
4377 || h->dynindx == -1
4378 || (h->elf_link_hash_flags & ELF_LINK_FORCED_LOCAL))
5bd4f169
AM
4379 && (h->elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR))
4380 {
65f38f15 4381 BFD_ASSERT((h->got.offset & 1) != 0);
5bd4f169
AM
4382 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
4383 rela.r_addend = (h->root.u.def.value
4384 + h->root.u.def.section->output_section->vma
4385 + h->root.u.def.section->output_offset);
4386 }
4387 else
4388 {
4389 BFD_ASSERT ((h->got.offset & 1) == 0);
65f38f15
AM
4390 bfd_put_64 (output_bfd, (bfd_vma) 0,
4391 htab->sgot->contents + h->got.offset);
5bd4f169
AM
4392 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_GLOB_DAT);
4393 rela.r_addend = 0;
4394 }
4395
65f38f15
AM
4396 loc = (Elf64_External_Rela *) htab->srelgot->contents;
4397 loc += htab->srelgot->reloc_count++;
4398 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
4399 }
4400
4401 if ((h->elf_link_hash_flags & ELF_LINK_HASH_NEEDS_COPY) != 0)
4402 {
5bd4f169 4403 Elf_Internal_Rela rela;
65f38f15 4404 Elf64_External_Rela *loc;
5bd4f169 4405
65f38f15 4406 /* This symbol needs a copy reloc. Set it up. */
5bd4f169 4407
65f38f15
AM
4408 if (h->dynindx == -1
4409 || (h->root.type != bfd_link_hash_defined
4410 && h->root.type != bfd_link_hash_defweak)
4411 || htab->srelbss == NULL)
4412 abort ();
5bd4f169
AM
4413
4414 rela.r_offset = (h->root.u.def.value
4415 + h->root.u.def.section->output_section->vma
4416 + h->root.u.def.section->output_offset);
4417 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
4418 rela.r_addend = 0;
65f38f15
AM
4419 loc = (Elf64_External_Rela *) htab->srelbss->contents;
4420 loc += htab->srelbss->reloc_count++;
4421 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
4422 }
4423
5bd4f169
AM
4424 /* Mark some specially defined symbols as absolute. */
4425 if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
4426 sym->st_shndx = SHN_ABS;
4427
4428 return true;
4429}
4430
65f38f15
AM
4431/* Used to decide how to sort relocs in an optimal manner for the
4432 dynamic linker, before writing them out. */
4433
4434static enum elf_reloc_type_class
4435ppc64_elf_reloc_type_class (rela)
4436 const Elf_Internal_Rela *rela;
4437{
a33d1f77
AM
4438 enum elf_ppc_reloc_type r_type;
4439
4440 r_type = (enum elf_ppc_reloc_type) ELF64_R_TYPE (rela->r_info);
4441 switch (r_type)
65f38f15
AM
4442 {
4443 case R_PPC64_RELATIVE:
4444 return reloc_class_relative;
4445 case R_PPC64_JMP_SLOT:
4446 return reloc_class_plt;
4447 case R_PPC64_COPY:
4448 return reloc_class_copy;
4449 default:
4450 return reloc_class_normal;
4451 }
4452}
4453
5bd4f169
AM
4454/* Finish up the dynamic sections. */
4455
4456static boolean
4457ppc64_elf_finish_dynamic_sections (output_bfd, info)
4458 bfd *output_bfd;
4459 struct bfd_link_info *info;
4460{
65f38f15
AM
4461 struct ppc_link_hash_table *htab;
4462 bfd *dynobj;
5bd4f169 4463 asection *sdyn;
5bd4f169 4464
65f38f15
AM
4465 htab = ppc_hash_table (info);
4466 dynobj = htab->elf.dynobj;
5bd4f169
AM
4467 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
4468
65f38f15 4469 if (htab->elf.dynamic_sections_created)
5bd4f169 4470 {
5bd4f169
AM
4471 Elf64_External_Dyn *dyncon, *dynconend;
4472
65f38f15
AM
4473 if (sdyn == NULL || htab->sgot == NULL)
4474 abort ();
5bd4f169
AM
4475
4476 dyncon = (Elf64_External_Dyn *) sdyn->contents;
4477 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->_raw_size);
4478 for (; dyncon < dynconend; dyncon++)
4479 {
4480 Elf_Internal_Dyn dyn;
19397422 4481 asection *s;
5bd4f169
AM
4482
4483 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
4484
4485 switch (dyn.d_tag)
4486 {
65f38f15
AM
4487 default:
4488 continue;
5bd4f169 4489
5d1634d7
AM
4490 case DT_PPC64_GLINK:
4491 dyn.d_un.d_ptr = (htab->sglink->output_section->vma
4492 + htab->sglink->output_offset);
4493 break;
4494
19397422
AM
4495 case DT_PPC64_OPD:
4496 s = bfd_get_section_by_name (output_bfd, ".opd");
4497 if (s != NULL)
4498 dyn.d_un.d_ptr = s->vma;
4499 break;
4500
4501 case DT_PPC64_OPDSZ:
4502 s = bfd_get_section_by_name (output_bfd, ".opd");
4503 if (s != NULL)
4504 dyn.d_un.d_val = s->_raw_size;
4505 break;
4506
65f38f15 4507 case DT_PLTGOT:
5d1634d7
AM
4508 dyn.d_un.d_ptr = (htab->splt->output_section->vma
4509 + htab->splt->output_offset);
65f38f15
AM
4510 break;
4511
4512 case DT_JMPREL:
5d1634d7
AM
4513 dyn.d_un.d_ptr = (htab->srelplt->output_section->vma
4514 + htab->srelplt->output_offset);
65f38f15 4515 break;
5bd4f169 4516
65f38f15 4517 case DT_PLTRELSZ:
5d1634d7
AM
4518 dyn.d_un.d_val = htab->srelplt->_raw_size;
4519 break;
4520
4521 case DT_RELASZ:
4522 /* Don't count procedure linkage table relocs in the
4523 overall reloc count. */
4524 if (htab->srelplt != NULL)
4525 dyn.d_un.d_val -= htab->srelplt->_raw_size;
65f38f15 4526 break;
5bd4f169 4527 }
5bd4f169 4528
65f38f15 4529 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 4530 }
5bd4f169
AM
4531 }
4532
5d1634d7
AM
4533 if (htab->sgot != NULL && htab->sgot->_raw_size != 0)
4534 {
4535 /* Fill in the first entry in the global offset table.
4536 We use it to hold the link-time TOCbase. */
4537 bfd_put_64 (output_bfd,
60ee0d4a 4538 elf_gp (output_bfd) + TOC_BASE_OFF,
5d1634d7
AM
4539 htab->sgot->contents);
4540
4541 /* Set .got entry size. */
4542 elf_section_data (htab->sgot->output_section)->this_hdr.sh_entsize = 8;
4543 }
4544
4545 if (htab->splt != NULL && htab->splt->_raw_size != 0)
4546 {
4547 /* Set .plt entry size. */
4548 elf_section_data (htab->splt->output_section)->this_hdr.sh_entsize
4549 = PLT_ENTRY_SIZE;
4550 }
4551
5bd4f169
AM
4552 return true;
4553}
4554
4555#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
4556#define TARGET_LITTLE_NAME "elf64-powerpcle"
4557#define TARGET_BIG_SYM bfd_elf64_powerpc_vec
4558#define TARGET_BIG_NAME "elf64-powerpc"
4559#define ELF_ARCH bfd_arch_powerpc
4560#define ELF_MACHINE_CODE EM_PPC64
4561#define ELF_MAXPAGESIZE 0x10000
4562#define elf_info_to_howto ppc64_elf_info_to_howto
4563
4564#ifdef EM_CYGNUS_POWERPC
4565#define ELF_MACHINE_ALT1 EM_CYGNUS_POWERPC
4566#endif
4567
4568#ifdef EM_PPC_OLD
4569#define ELF_MACHINE_ALT2 EM_PPC_OLD
4570#endif
4571
4572#define elf_backend_want_got_sym 0
4573#define elf_backend_want_plt_sym 0
4574#define elf_backend_plt_alignment 3
4575#define elf_backend_plt_not_loaded 1
4576#define elf_backend_got_symbol_offset 0
5d1634d7
AM
4577#define elf_backend_got_header_size 8
4578#define elf_backend_plt_header_size PLT_INITIAL_ENTRY_SIZE
5bd4f169 4579#define elf_backend_can_gc_sections 1
65f38f15 4580#define elf_backend_can_refcount 1
5bd4f169 4581
65f38f15
AM
4582#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
4583#define bfd_elf64_bfd_set_private_flags ppc64_elf_set_private_flags
65f38f15
AM
4584#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
4585#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
65f38f15
AM
4586
4587#define elf_backend_section_from_shdr ppc64_elf_section_from_shdr
4588#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
4589#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
4590#define elf_backend_check_relocs ppc64_elf_check_relocs
4591#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
4592#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
4593#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
e86ce104
AM
4594#define elf_backend_hide_symbol ppc64_elf_hide_symbol
4595#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
65f38f15
AM
4596#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
4597#define elf_backend_fake_sections ppc64_elf_fake_sections
4598#define elf_backend_relocate_section ppc64_elf_relocate_section
4599#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
4600#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
4601#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
5bd4f169
AM
4602
4603#include "elf64-target.h"
This page took 0.383188 seconds and 4 git commands to generate.