2005-02-06 H.J. Lu <hongjiu.lu@intel.com>
[deliverable/binutils-gdb.git] / bfd / elf64-ppc.c
CommitLineData
5bd4f169 1/* PowerPC64-specific support for 64-bit ELF.
3eb128b2 2 Copyright 1999, 2000, 2001, 2002, 2003, 2004, 2005
b2a8e766 3 Free Software Foundation, Inc.
5bd4f169
AM
4 Written by Linus Nordberg, Swox AB <info@swox.com>,
5 based on elf32-ppc.c by Ian Lance Taylor.
d37c89e5 6 Largely rewritten by Alan Modra <amodra@bigpond.net.au>
5bd4f169 7
ae9a127f 8 This file is part of BFD, the Binary File Descriptor library.
5bd4f169 9
ae9a127f
NC
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
5bd4f169 14
ae9a127f
NC
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
5bd4f169 19
4ce794b7
AM
20 You should have received a copy of the GNU General Public License along
21 with this program; if not, write to the Free Software Foundation, Inc.,
22 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
5bd4f169 23
4ce794b7
AM
24/* The 64-bit PowerPC ELF ABI may be found at
25 http://www.linuxbase.org/spec/ELF/ppc64/PPC-elf64abi.txt, and
26 http://www.linuxbase.org/spec/ELF/ppc64/spec/book1.html */
5bd4f169
AM
27
28#include "bfd.h"
29#include "sysdep.h"
30#include "bfdlink.h"
31#include "libbfd.h"
32#include "elf-bfd.h"
04c9666a 33#include "elf/ppc64.h"
5d1634d7 34#include "elf64-ppc.h"
5bd4f169 35
805fc799 36static bfd_reloc_status_type ppc64_elf_ha_reloc
4ce794b7 37 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
38static bfd_reloc_status_type ppc64_elf_branch_reloc
39 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 40static bfd_reloc_status_type ppc64_elf_brtaken_reloc
4ce794b7 41 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 42static bfd_reloc_status_type ppc64_elf_sectoff_reloc
4ce794b7 43 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 44static bfd_reloc_status_type ppc64_elf_sectoff_ha_reloc
4ce794b7 45 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 46static bfd_reloc_status_type ppc64_elf_toc_reloc
4ce794b7 47 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 48static bfd_reloc_status_type ppc64_elf_toc_ha_reloc
4ce794b7 49 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 50static bfd_reloc_status_type ppc64_elf_toc64_reloc
4ce794b7 51 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
805fc799 52static bfd_reloc_status_type ppc64_elf_unhandled_reloc
4ce794b7 53 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
2441e016
AM
54static bfd_vma opd_entry_value
55 (asection *, bfd_vma, asection **, bfd_vma *);
5bd4f169 56
ad8e1ba5
AM
57#define TARGET_LITTLE_SYM bfd_elf64_powerpcle_vec
58#define TARGET_LITTLE_NAME "elf64-powerpcle"
59#define TARGET_BIG_SYM bfd_elf64_powerpc_vec
60#define TARGET_BIG_NAME "elf64-powerpc"
61#define ELF_ARCH bfd_arch_powerpc
62#define ELF_MACHINE_CODE EM_PPC64
63#define ELF_MAXPAGESIZE 0x10000
64#define elf_info_to_howto ppc64_elf_info_to_howto
65
66#define elf_backend_want_got_sym 0
67#define elf_backend_want_plt_sym 0
68#define elf_backend_plt_alignment 3
69#define elf_backend_plt_not_loaded 1
70#define elf_backend_got_symbol_offset 0
71#define elf_backend_got_header_size 8
ad8e1ba5
AM
72#define elf_backend_can_gc_sections 1
73#define elf_backend_can_refcount 1
74#define elf_backend_rela_normal 1
75
e717da7e 76#define bfd_elf64_mkobject ppc64_elf_mkobject
ad8e1ba5
AM
77#define bfd_elf64_bfd_reloc_type_lookup ppc64_elf_reloc_type_lookup
78#define bfd_elf64_bfd_merge_private_bfd_data ppc64_elf_merge_private_bfd_data
79#define bfd_elf64_new_section_hook ppc64_elf_new_section_hook
80#define bfd_elf64_bfd_link_hash_table_create ppc64_elf_link_hash_table_create
81#define bfd_elf64_bfd_link_hash_table_free ppc64_elf_link_hash_table_free
90e3cdf2 82#define bfd_elf64_get_synthetic_symtab ppc64_elf_get_synthetic_symtab
ad8e1ba5
AM
83
84#define elf_backend_object_p ppc64_elf_object_p
d37c89e5
AM
85#define elf_backend_grok_prstatus ppc64_elf_grok_prstatus
86#define elf_backend_grok_psinfo ppc64_elf_grok_psinfo
ad8e1ba5
AM
87#define elf_backend_create_dynamic_sections ppc64_elf_create_dynamic_sections
88#define elf_backend_copy_indirect_symbol ppc64_elf_copy_indirect_symbol
555cd476 89#define elf_backend_add_symbol_hook ppc64_elf_add_symbol_hook
8387904d
AM
90#define elf_backend_check_directives ppc64_elf_check_directives
91#define elf_backend_archive_symbol_lookup ppc64_elf_archive_symbol_lookup
ad8e1ba5
AM
92#define elf_backend_check_relocs ppc64_elf_check_relocs
93#define elf_backend_gc_mark_hook ppc64_elf_gc_mark_hook
94#define elf_backend_gc_sweep_hook ppc64_elf_gc_sweep_hook
95#define elf_backend_adjust_dynamic_symbol ppc64_elf_adjust_dynamic_symbol
96#define elf_backend_hide_symbol ppc64_elf_hide_symbol
97#define elf_backend_always_size_sections ppc64_elf_func_desc_adjust
98#define elf_backend_size_dynamic_sections ppc64_elf_size_dynamic_sections
99#define elf_backend_relocate_section ppc64_elf_relocate_section
100#define elf_backend_finish_dynamic_symbol ppc64_elf_finish_dynamic_symbol
101#define elf_backend_reloc_type_class ppc64_elf_reloc_type_class
102#define elf_backend_finish_dynamic_sections ppc64_elf_finish_dynamic_sections
754021d0 103#define elf_backend_link_output_symbol_hook ppc64_elf_output_symbol_hook
2f89ff8d 104#define elf_backend_special_sections ppc64_elf_special_sections
ad8e1ba5 105
5bd4f169
AM
106/* The name of the dynamic interpreter. This is put in the .interp
107 section. */
108#define ELF_DYNAMIC_INTERPRETER "/usr/lib/ld.so.1"
109
110/* The size in bytes of an entry in the procedure linkage table. */
111#define PLT_ENTRY_SIZE 24
112
113/* The initial size of the plt reserved for the dynamic linker. */
5d1634d7 114#define PLT_INITIAL_ENTRY_SIZE PLT_ENTRY_SIZE
5bd4f169
AM
115
116/* TOC base pointers offset from start of TOC. */
411e1bfb
AM
117#define TOC_BASE_OFF 0x8000
118
119/* Offset of tp and dtp pointers from start of TLS block. */
120#define TP_OFFSET 0x7000
121#define DTP_OFFSET 0x8000
5bd4f169 122
ad8e1ba5
AM
123/* .plt call stub instructions. The normal stub is like this, but
124 sometimes the .plt entry crosses a 64k boundary and we need to
125 insert an addis to adjust r12. */
126#define PLT_CALL_STUB_SIZE (7*4)
5d1634d7
AM
127#define ADDIS_R12_R2 0x3d820000 /* addis %r12,%r2,xxx@ha */
128#define STD_R2_40R1 0xf8410028 /* std %r2,40(%r1) */
129#define LD_R11_0R12 0xe96c0000 /* ld %r11,xxx+0@l(%r12) */
130#define LD_R2_0R12 0xe84c0000 /* ld %r2,xxx+8@l(%r12) */
131#define MTCTR_R11 0x7d6903a6 /* mtctr %r11 */
132 /* ld %r11,xxx+16@l(%r12) */
133#define BCTR 0x4e800420 /* bctr */
134
5d1634d7 135
ad8e1ba5
AM
136#define ADDIS_R2_R2 0x3c420000 /* addis %r2,%r2,off@ha */
137#define ADDI_R2_R2 0x38420000 /* addi %r2,%r2,off@l */
138
139#define LD_R2_40R1 0xe8410028 /* ld %r2,40(%r1) */
140
141/* glink call stub instructions. We enter with the index in R0, and the
142 address of glink entry in CTR. From that, we can calculate PLT0. */
143#define GLINK_CALL_STUB_SIZE (16*4)
144#define MFCTR_R12 0x7d8902a6 /* mfctr %r12 */
145#define SLDI_R11_R0_3 0x780b1f24 /* sldi %r11,%r0,3 */
146#define ADDIC_R2_R0_32K 0x34408000 /* addic. %r2,%r0,-32768 */
147#define SUB_R12_R12_R11 0x7d8b6050 /* sub %r12,%r12,%r11 */
148#define SRADI_R2_R2_63 0x7c42fe76 /* sradi %r2,%r2,63 */
149#define SLDI_R11_R0_2 0x780b1764 /* sldi %r11,%r0,2 */
150#define AND_R2_R2_R11 0x7c425838 /* and %r2,%r2,%r11 */
151 /* sub %r12,%r12,%r11 */
152#define ADD_R12_R12_R2 0x7d8c1214 /* add %r12,%r12,%r2 */
153#define ADDIS_R12_R12 0x3d8c0000 /* addis %r12,%r12,xxx@ha */
154 /* ld %r11,xxx@l(%r12) */
155#define ADDI_R12_R12 0x398c0000 /* addi %r12,%r12,xxx@l */
156 /* ld %r2,8(%r12) */
157 /* mtctr %r11 */
158 /* ld %r11,16(%r12) */
159 /* bctr */
5d1634d7
AM
160
161/* Pad with this. */
162#define NOP 0x60000000
163
721956f4
AM
164/* Some other nops. */
165#define CROR_151515 0x4def7b82
166#define CROR_313131 0x4ffffb82
167
cedb70c5 168/* .glink entries for the first 32k functions are two instructions. */
5d1634d7
AM
169#define LI_R0_0 0x38000000 /* li %r0,0 */
170#define B_DOT 0x48000000 /* b . */
171
172/* After that, we need two instructions to load the index, followed by
173 a branch. */
174#define LIS_R0_0 0x3c000000 /* lis %r0,0 */
10ed1bba 175#define ORI_R0_R0_0 0x60000000 /* ori %r0,%r0,0 */
41bd81ab 176
deb0e272
AM
177/* Instructions used by the save and restore reg functions. */
178#define STD_R0_0R1 0xf8010000 /* std %r0,0(%r1) */
179#define STD_R0_0R12 0xf80c0000 /* std %r0,0(%r12) */
180#define LD_R0_0R1 0xe8010000 /* ld %r0,0(%r1) */
181#define LD_R0_0R12 0xe80c0000 /* ld %r0,0(%r12) */
82bd7b59
AM
182#define STFD_FR0_0R1 0xd8010000 /* stfd %fr0,0(%r1) */
183#define LFD_FR0_0R1 0xc8010000 /* lfd %fr0,0(%r1) */
deb0e272
AM
184#define LI_R12_0 0x39800000 /* li %r12,0 */
185#define STVX_VR0_R12_R0 0x7c0c01ce /* stvx %v0,%r12,%r0 */
186#define LVX_VR0_R12_R0 0x7c0c00ce /* lvx %v0,%r12,%r0 */
187#define MTLR_R0 0x7c0803a6 /* mtlr %r0 */
82bd7b59
AM
188#define BLR 0x4e800020 /* blr */
189
41bd81ab
AM
190/* Since .opd is an array of descriptors and each entry will end up
191 with identical R_PPC64_RELATIVE relocs, there is really no need to
192 propagate .opd relocs; The dynamic linker should be taught to
1e2f5b6e 193 relocate .opd without reloc entries. */
41bd81ab
AM
194#ifndef NO_OPD_RELOCS
195#define NO_OPD_RELOCS 0
196#endif
5bd4f169 197\f
f5e87a1d 198#define ONES(n) (((bfd_vma) 1 << ((n) - 1) << 1) - 1)
b34976b6 199
5bd4f169 200/* Relocation HOWTO's. */
04c9666a 201static reloc_howto_type *ppc64_elf_howto_table[(int) R_PPC64_max];
5bd4f169
AM
202
203static reloc_howto_type ppc64_elf_howto_raw[] = {
204 /* This reloc does nothing. */
205 HOWTO (R_PPC64_NONE, /* type */
206 0, /* rightshift */
411e1bfb
AM
207 2, /* size (0 = byte, 1 = short, 2 = long) */
208 32, /* bitsize */
b34976b6 209 FALSE, /* pc_relative */
5bd4f169 210 0, /* bitpos */
f5e87a1d 211 complain_overflow_dont, /* complain_on_overflow */
5bd4f169
AM
212 bfd_elf_generic_reloc, /* special_function */
213 "R_PPC64_NONE", /* name */
b34976b6 214 FALSE, /* partial_inplace */
d006db6c 215 0, /* src_mask */
5bd4f169 216 0, /* dst_mask */
b34976b6 217 FALSE), /* pcrel_offset */
5bd4f169
AM
218
219 /* A standard 32 bit relocation. */
220 HOWTO (R_PPC64_ADDR32, /* type */
221 0, /* rightshift */
222 2, /* size (0 = byte, 1 = short, 2 = long) */
223 32, /* bitsize */
b34976b6 224 FALSE, /* pc_relative */
5bd4f169
AM
225 0, /* bitpos */
226 complain_overflow_bitfield, /* complain_on_overflow */
227 bfd_elf_generic_reloc, /* special_function */
228 "R_PPC64_ADDR32", /* name */
b34976b6 229 FALSE, /* partial_inplace */
5bd4f169
AM
230 0, /* src_mask */
231 0xffffffff, /* dst_mask */
b34976b6 232 FALSE), /* pcrel_offset */
5bd4f169
AM
233
234 /* An absolute 26 bit branch; the lower two bits must be zero.
235 FIXME: we don't check that, we just clear them. */
236 HOWTO (R_PPC64_ADDR24, /* type */
237 0, /* rightshift */
238 2, /* size (0 = byte, 1 = short, 2 = long) */
239 26, /* bitsize */
b34976b6 240 FALSE, /* pc_relative */
5bd4f169
AM
241 0, /* bitpos */
242 complain_overflow_bitfield, /* complain_on_overflow */
243 bfd_elf_generic_reloc, /* special_function */
244 "R_PPC64_ADDR24", /* name */
b34976b6 245 FALSE, /* partial_inplace */
d006db6c 246 0, /* src_mask */
f5e87a1d 247 0x03fffffc, /* dst_mask */
b34976b6 248 FALSE), /* pcrel_offset */
5bd4f169
AM
249
250 /* A standard 16 bit relocation. */
251 HOWTO (R_PPC64_ADDR16, /* type */
252 0, /* rightshift */
253 1, /* size (0 = byte, 1 = short, 2 = long) */
254 16, /* bitsize */
b34976b6 255 FALSE, /* pc_relative */
5bd4f169
AM
256 0, /* bitpos */
257 complain_overflow_bitfield, /* complain_on_overflow */
258 bfd_elf_generic_reloc, /* special_function */
259 "R_PPC64_ADDR16", /* name */
b34976b6 260 FALSE, /* partial_inplace */
5bd4f169
AM
261 0, /* src_mask */
262 0xffff, /* dst_mask */
b34976b6 263 FALSE), /* pcrel_offset */
5bd4f169
AM
264
265 /* A 16 bit relocation without overflow. */
266 HOWTO (R_PPC64_ADDR16_LO, /* type */
267 0, /* rightshift */
268 1, /* size (0 = byte, 1 = short, 2 = long) */
269 16, /* bitsize */
b34976b6 270 FALSE, /* pc_relative */
5bd4f169
AM
271 0, /* bitpos */
272 complain_overflow_dont,/* complain_on_overflow */
273 bfd_elf_generic_reloc, /* special_function */
274 "R_PPC64_ADDR16_LO", /* name */
b34976b6 275 FALSE, /* partial_inplace */
5bd4f169
AM
276 0, /* src_mask */
277 0xffff, /* dst_mask */
b34976b6 278 FALSE), /* pcrel_offset */
5bd4f169
AM
279
280 /* Bits 16-31 of an address. */
281 HOWTO (R_PPC64_ADDR16_HI, /* type */
282 16, /* rightshift */
283 1, /* size (0 = byte, 1 = short, 2 = long) */
284 16, /* bitsize */
b34976b6 285 FALSE, /* pc_relative */
5bd4f169
AM
286 0, /* bitpos */
287 complain_overflow_dont, /* complain_on_overflow */
288 bfd_elf_generic_reloc, /* special_function */
289 "R_PPC64_ADDR16_HI", /* name */
b34976b6 290 FALSE, /* partial_inplace */
5bd4f169
AM
291 0, /* src_mask */
292 0xffff, /* dst_mask */
b34976b6 293 FALSE), /* pcrel_offset */
5bd4f169
AM
294
295 /* Bits 16-31 of an address, plus 1 if the contents of the low 16
296 bits, treated as a signed number, is negative. */
297 HOWTO (R_PPC64_ADDR16_HA, /* type */
298 16, /* rightshift */
299 1, /* size (0 = byte, 1 = short, 2 = long) */
300 16, /* bitsize */
b34976b6 301 FALSE, /* pc_relative */
5bd4f169
AM
302 0, /* bitpos */
303 complain_overflow_dont, /* complain_on_overflow */
805fc799 304 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 305 "R_PPC64_ADDR16_HA", /* name */
b34976b6 306 FALSE, /* partial_inplace */
5bd4f169
AM
307 0, /* src_mask */
308 0xffff, /* dst_mask */
b34976b6 309 FALSE), /* pcrel_offset */
5bd4f169
AM
310
311 /* An absolute 16 bit branch; the lower two bits must be zero.
312 FIXME: we don't check that, we just clear them. */
313 HOWTO (R_PPC64_ADDR14, /* type */
314 0, /* rightshift */
315 2, /* size (0 = byte, 1 = short, 2 = long) */
316 16, /* bitsize */
b34976b6 317 FALSE, /* pc_relative */
5bd4f169
AM
318 0, /* bitpos */
319 complain_overflow_bitfield, /* complain_on_overflow */
2441e016 320 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 321 "R_PPC64_ADDR14", /* name */
b34976b6 322 FALSE, /* partial_inplace */
d006db6c 323 0, /* src_mask */
f5e87a1d 324 0x0000fffc, /* dst_mask */
b34976b6 325 FALSE), /* pcrel_offset */
5bd4f169
AM
326
327 /* An absolute 16 bit branch, for which bit 10 should be set to
328 indicate that the branch is expected to be taken. The lower two
329 bits must be zero. */
330 HOWTO (R_PPC64_ADDR14_BRTAKEN, /* type */
331 0, /* rightshift */
332 2, /* size (0 = byte, 1 = short, 2 = long) */
333 16, /* bitsize */
b34976b6 334 FALSE, /* pc_relative */
5bd4f169
AM
335 0, /* bitpos */
336 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 337 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 338 "R_PPC64_ADDR14_BRTAKEN",/* name */
b34976b6 339 FALSE, /* partial_inplace */
d006db6c 340 0, /* src_mask */
f5e87a1d 341 0x0000fffc, /* dst_mask */
b34976b6 342 FALSE), /* pcrel_offset */
5bd4f169
AM
343
344 /* An absolute 16 bit branch, for which bit 10 should be set to
345 indicate that the branch is not expected to be taken. The lower
346 two bits must be zero. */
347 HOWTO (R_PPC64_ADDR14_BRNTAKEN, /* type */
348 0, /* rightshift */
349 2, /* size (0 = byte, 1 = short, 2 = long) */
350 16, /* bitsize */
b34976b6 351 FALSE, /* pc_relative */
5bd4f169
AM
352 0, /* bitpos */
353 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 354 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 355 "R_PPC64_ADDR14_BRNTAKEN",/* name */
b34976b6 356 FALSE, /* partial_inplace */
d006db6c 357 0, /* src_mask */
f5e87a1d 358 0x0000fffc, /* dst_mask */
b34976b6 359 FALSE), /* pcrel_offset */
5bd4f169
AM
360
361 /* A relative 26 bit branch; the lower two bits must be zero. */
362 HOWTO (R_PPC64_REL24, /* type */
363 0, /* rightshift */
364 2, /* size (0 = byte, 1 = short, 2 = long) */
365 26, /* bitsize */
b34976b6 366 TRUE, /* pc_relative */
5bd4f169
AM
367 0, /* bitpos */
368 complain_overflow_signed, /* complain_on_overflow */
2441e016 369 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 370 "R_PPC64_REL24", /* name */
b34976b6 371 FALSE, /* partial_inplace */
d006db6c 372 0, /* src_mask */
f5e87a1d 373 0x03fffffc, /* dst_mask */
b34976b6 374 TRUE), /* pcrel_offset */
5bd4f169
AM
375
376 /* A relative 16 bit branch; the lower two bits must be zero. */
377 HOWTO (R_PPC64_REL14, /* type */
378 0, /* rightshift */
379 2, /* size (0 = byte, 1 = short, 2 = long) */
380 16, /* bitsize */
b34976b6 381 TRUE, /* pc_relative */
5bd4f169
AM
382 0, /* bitpos */
383 complain_overflow_signed, /* complain_on_overflow */
2441e016 384 ppc64_elf_branch_reloc, /* special_function */
5bd4f169 385 "R_PPC64_REL14", /* name */
b34976b6 386 FALSE, /* partial_inplace */
d006db6c 387 0, /* src_mask */
f5e87a1d 388 0x0000fffc, /* dst_mask */
b34976b6 389 TRUE), /* pcrel_offset */
5bd4f169
AM
390
391 /* A relative 16 bit branch. Bit 10 should be set to indicate that
392 the branch is expected to be taken. The lower two bits must be
393 zero. */
394 HOWTO (R_PPC64_REL14_BRTAKEN, /* type */
395 0, /* rightshift */
396 2, /* size (0 = byte, 1 = short, 2 = long) */
397 16, /* bitsize */
b34976b6 398 TRUE, /* pc_relative */
5bd4f169
AM
399 0, /* bitpos */
400 complain_overflow_signed, /* complain_on_overflow */
805fc799 401 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 402 "R_PPC64_REL14_BRTAKEN", /* name */
b34976b6 403 FALSE, /* partial_inplace */
d006db6c 404 0, /* src_mask */
f5e87a1d 405 0x0000fffc, /* dst_mask */
b34976b6 406 TRUE), /* pcrel_offset */
5bd4f169
AM
407
408 /* A relative 16 bit branch. Bit 10 should be set to indicate that
409 the branch is not expected to be taken. The lower two bits must
410 be zero. */
411 HOWTO (R_PPC64_REL14_BRNTAKEN, /* type */
412 0, /* rightshift */
413 2, /* size (0 = byte, 1 = short, 2 = long) */
414 16, /* bitsize */
b34976b6 415 TRUE, /* pc_relative */
5bd4f169
AM
416 0, /* bitpos */
417 complain_overflow_signed, /* complain_on_overflow */
805fc799 418 ppc64_elf_brtaken_reloc, /* special_function */
5bd4f169 419 "R_PPC64_REL14_BRNTAKEN",/* name */
b34976b6 420 FALSE, /* partial_inplace */
d006db6c 421 0, /* src_mask */
f5e87a1d 422 0x0000fffc, /* dst_mask */
b34976b6 423 TRUE), /* pcrel_offset */
5bd4f169
AM
424
425 /* Like R_PPC64_ADDR16, but referring to the GOT table entry for the
426 symbol. */
427 HOWTO (R_PPC64_GOT16, /* type */
428 0, /* rightshift */
429 1, /* size (0 = byte, 1 = short, 2 = long) */
430 16, /* bitsize */
b34976b6 431 FALSE, /* pc_relative */
5bd4f169
AM
432 0, /* bitpos */
433 complain_overflow_signed, /* complain_on_overflow */
805fc799 434 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 435 "R_PPC64_GOT16", /* name */
b34976b6 436 FALSE, /* partial_inplace */
5bd4f169
AM
437 0, /* src_mask */
438 0xffff, /* dst_mask */
b34976b6 439 FALSE), /* pcrel_offset */
5bd4f169
AM
440
441 /* Like R_PPC64_ADDR16_LO, but referring to the GOT table entry for
442 the symbol. */
443 HOWTO (R_PPC64_GOT16_LO, /* type */
444 0, /* rightshift */
445 1, /* size (0 = byte, 1 = short, 2 = long) */
446 16, /* bitsize */
b34976b6 447 FALSE, /* pc_relative */
5bd4f169
AM
448 0, /* bitpos */
449 complain_overflow_dont, /* complain_on_overflow */
805fc799 450 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 451 "R_PPC64_GOT16_LO", /* name */
b34976b6 452 FALSE, /* partial_inplace */
5bd4f169
AM
453 0, /* src_mask */
454 0xffff, /* dst_mask */
b34976b6 455 FALSE), /* pcrel_offset */
5bd4f169
AM
456
457 /* Like R_PPC64_ADDR16_HI, but referring to the GOT table entry for
458 the symbol. */
459 HOWTO (R_PPC64_GOT16_HI, /* type */
460 16, /* rightshift */
461 1, /* size (0 = byte, 1 = short, 2 = long) */
462 16, /* bitsize */
b34976b6 463 FALSE, /* pc_relative */
5bd4f169
AM
464 0, /* bitpos */
465 complain_overflow_dont,/* complain_on_overflow */
805fc799 466 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 467 "R_PPC64_GOT16_HI", /* name */
b34976b6 468 FALSE, /* partial_inplace */
5bd4f169
AM
469 0, /* src_mask */
470 0xffff, /* dst_mask */
b34976b6 471 FALSE), /* pcrel_offset */
5bd4f169
AM
472
473 /* Like R_PPC64_ADDR16_HA, but referring to the GOT table entry for
474 the symbol. */
475 HOWTO (R_PPC64_GOT16_HA, /* type */
476 16, /* rightshift */
477 1, /* size (0 = byte, 1 = short, 2 = long) */
478 16, /* bitsize */
b34976b6 479 FALSE, /* pc_relative */
5bd4f169
AM
480 0, /* bitpos */
481 complain_overflow_dont,/* complain_on_overflow */
805fc799 482 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 483 "R_PPC64_GOT16_HA", /* name */
b34976b6 484 FALSE, /* partial_inplace */
5bd4f169
AM
485 0, /* src_mask */
486 0xffff, /* dst_mask */
b34976b6 487 FALSE), /* pcrel_offset */
5bd4f169
AM
488
489 /* This is used only by the dynamic linker. The symbol should exist
490 both in the object being run and in some shared library. The
491 dynamic linker copies the data addressed by the symbol from the
492 shared library into the object, because the object being
493 run has to have the data at some particular address. */
494 HOWTO (R_PPC64_COPY, /* type */
495 0, /* rightshift */
f5e87a1d
AM
496 0, /* this one is variable size */
497 0, /* bitsize */
b34976b6 498 FALSE, /* pc_relative */
5bd4f169 499 0, /* bitpos */
f5e87a1d
AM
500 complain_overflow_dont, /* complain_on_overflow */
501 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 502 "R_PPC64_COPY", /* name */
b34976b6 503 FALSE, /* partial_inplace */
5bd4f169
AM
504 0, /* src_mask */
505 0, /* dst_mask */
b34976b6 506 FALSE), /* pcrel_offset */
5bd4f169
AM
507
508 /* Like R_PPC64_ADDR64, but used when setting global offset table
509 entries. */
510 HOWTO (R_PPC64_GLOB_DAT, /* type */
511 0, /* rightshift */
512 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
513 64, /* bitsize */
b34976b6 514 FALSE, /* pc_relative */
5bd4f169
AM
515 0, /* bitpos */
516 complain_overflow_dont, /* complain_on_overflow */
805fc799 517 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 518 "R_PPC64_GLOB_DAT", /* name */
b34976b6 519 FALSE, /* partial_inplace */
5bd4f169 520 0, /* src_mask */
f5e87a1d 521 ONES (64), /* dst_mask */
b34976b6 522 FALSE), /* pcrel_offset */
5bd4f169
AM
523
524 /* Created by the link editor. Marks a procedure linkage table
525 entry for a symbol. */
526 HOWTO (R_PPC64_JMP_SLOT, /* type */
527 0, /* rightshift */
528 0, /* size (0 = byte, 1 = short, 2 = long) */
529 0, /* bitsize */
b34976b6 530 FALSE, /* pc_relative */
5bd4f169
AM
531 0, /* bitpos */
532 complain_overflow_dont, /* complain_on_overflow */
805fc799 533 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 534 "R_PPC64_JMP_SLOT", /* name */
b34976b6 535 FALSE, /* partial_inplace */
5bd4f169
AM
536 0, /* src_mask */
537 0, /* dst_mask */
b34976b6 538 FALSE), /* pcrel_offset */
5bd4f169
AM
539
540 /* Used only by the dynamic linker. When the object is run, this
541 doubleword64 is set to the load address of the object, plus the
542 addend. */
543 HOWTO (R_PPC64_RELATIVE, /* type */
544 0, /* rightshift */
545 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
546 64, /* bitsize */
b34976b6 547 FALSE, /* pc_relative */
5bd4f169
AM
548 0, /* bitpos */
549 complain_overflow_dont, /* complain_on_overflow */
550 bfd_elf_generic_reloc, /* special_function */
551 "R_PPC64_RELATIVE", /* name */
b34976b6 552 FALSE, /* partial_inplace */
5bd4f169 553 0, /* src_mask */
f5e87a1d 554 ONES (64), /* dst_mask */
b34976b6 555 FALSE), /* pcrel_offset */
5bd4f169
AM
556
557 /* Like R_PPC64_ADDR32, but may be unaligned. */
558 HOWTO (R_PPC64_UADDR32, /* type */
559 0, /* rightshift */
560 2, /* size (0 = byte, 1 = short, 2 = long) */
561 32, /* bitsize */
b34976b6 562 FALSE, /* pc_relative */
5bd4f169
AM
563 0, /* bitpos */
564 complain_overflow_bitfield, /* complain_on_overflow */
565 bfd_elf_generic_reloc, /* special_function */
566 "R_PPC64_UADDR32", /* name */
b34976b6 567 FALSE, /* partial_inplace */
5bd4f169
AM
568 0, /* src_mask */
569 0xffffffff, /* dst_mask */
b34976b6 570 FALSE), /* pcrel_offset */
5bd4f169
AM
571
572 /* Like R_PPC64_ADDR16, but may be unaligned. */
573 HOWTO (R_PPC64_UADDR16, /* type */
574 0, /* rightshift */
575 1, /* size (0 = byte, 1 = short, 2 = long) */
576 16, /* bitsize */
b34976b6 577 FALSE, /* pc_relative */
5bd4f169
AM
578 0, /* bitpos */
579 complain_overflow_bitfield, /* complain_on_overflow */
580 bfd_elf_generic_reloc, /* special_function */
581 "R_PPC64_UADDR16", /* name */
b34976b6 582 FALSE, /* partial_inplace */
5bd4f169
AM
583 0, /* src_mask */
584 0xffff, /* dst_mask */
b34976b6 585 FALSE), /* pcrel_offset */
5bd4f169
AM
586
587 /* 32-bit PC relative. */
588 HOWTO (R_PPC64_REL32, /* type */
589 0, /* rightshift */
590 2, /* size (0 = byte, 1 = short, 2 = long) */
591 32, /* bitsize */
b34976b6 592 TRUE, /* pc_relative */
5bd4f169 593 0, /* bitpos */
cedb70c5 594 /* FIXME: Verify. Was complain_overflow_bitfield. */
5bd4f169
AM
595 complain_overflow_signed, /* complain_on_overflow */
596 bfd_elf_generic_reloc, /* special_function */
597 "R_PPC64_REL32", /* name */
b34976b6 598 FALSE, /* partial_inplace */
5bd4f169
AM
599 0, /* src_mask */
600 0xffffffff, /* dst_mask */
b34976b6 601 TRUE), /* pcrel_offset */
5bd4f169 602
10ed1bba 603 /* 32-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
604 HOWTO (R_PPC64_PLT32, /* type */
605 0, /* rightshift */
606 2, /* size (0 = byte, 1 = short, 2 = long) */
607 32, /* bitsize */
b34976b6 608 FALSE, /* pc_relative */
5bd4f169
AM
609 0, /* bitpos */
610 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 611 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 612 "R_PPC64_PLT32", /* name */
b34976b6 613 FALSE, /* partial_inplace */
5bd4f169 614 0, /* src_mask */
f5e87a1d 615 0xffffffff, /* dst_mask */
b34976b6 616 FALSE), /* pcrel_offset */
5bd4f169
AM
617
618 /* 32-bit PC relative relocation to the symbol's procedure linkage table.
619 FIXME: R_PPC64_PLTREL32 not supported. */
620 HOWTO (R_PPC64_PLTREL32, /* type */
621 0, /* rightshift */
622 2, /* size (0 = byte, 1 = short, 2 = long) */
623 32, /* bitsize */
b34976b6 624 TRUE, /* pc_relative */
5bd4f169
AM
625 0, /* bitpos */
626 complain_overflow_signed, /* complain_on_overflow */
627 bfd_elf_generic_reloc, /* special_function */
628 "R_PPC64_PLTREL32", /* name */
b34976b6 629 FALSE, /* partial_inplace */
5bd4f169 630 0, /* src_mask */
f5e87a1d 631 0xffffffff, /* dst_mask */
b34976b6 632 TRUE), /* pcrel_offset */
5bd4f169
AM
633
634 /* Like R_PPC64_ADDR16_LO, but referring to the PLT table entry for
635 the symbol. */
636 HOWTO (R_PPC64_PLT16_LO, /* type */
637 0, /* rightshift */
638 1, /* size (0 = byte, 1 = short, 2 = long) */
639 16, /* bitsize */
b34976b6 640 FALSE, /* pc_relative */
5bd4f169
AM
641 0, /* bitpos */
642 complain_overflow_dont, /* complain_on_overflow */
805fc799 643 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 644 "R_PPC64_PLT16_LO", /* name */
b34976b6 645 FALSE, /* partial_inplace */
5bd4f169
AM
646 0, /* src_mask */
647 0xffff, /* dst_mask */
b34976b6 648 FALSE), /* pcrel_offset */
5bd4f169
AM
649
650 /* Like R_PPC64_ADDR16_HI, but referring to the PLT table entry for
651 the symbol. */
652 HOWTO (R_PPC64_PLT16_HI, /* type */
653 16, /* rightshift */
654 1, /* size (0 = byte, 1 = short, 2 = long) */
655 16, /* bitsize */
b34976b6 656 FALSE, /* pc_relative */
5bd4f169
AM
657 0, /* bitpos */
658 complain_overflow_dont, /* complain_on_overflow */
805fc799 659 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 660 "R_PPC64_PLT16_HI", /* name */
b34976b6 661 FALSE, /* partial_inplace */
5bd4f169
AM
662 0, /* src_mask */
663 0xffff, /* dst_mask */
b34976b6 664 FALSE), /* pcrel_offset */
5bd4f169
AM
665
666 /* Like R_PPC64_ADDR16_HA, but referring to the PLT table entry for
667 the symbol. */
668 HOWTO (R_PPC64_PLT16_HA, /* type */
669 16, /* rightshift */
670 1, /* size (0 = byte, 1 = short, 2 = long) */
671 16, /* bitsize */
b34976b6 672 FALSE, /* pc_relative */
5bd4f169
AM
673 0, /* bitpos */
674 complain_overflow_dont, /* complain_on_overflow */
805fc799 675 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 676 "R_PPC64_PLT16_HA", /* name */
b34976b6 677 FALSE, /* partial_inplace */
5bd4f169
AM
678 0, /* src_mask */
679 0xffff, /* dst_mask */
b34976b6 680 FALSE), /* pcrel_offset */
5bd4f169 681
c061c2d8 682 /* 16-bit section relative relocation. */
5bd4f169
AM
683 HOWTO (R_PPC64_SECTOFF, /* type */
684 0, /* rightshift */
c061c2d8
AM
685 1, /* size (0 = byte, 1 = short, 2 = long) */
686 16, /* bitsize */
b34976b6 687 FALSE, /* pc_relative */
5bd4f169
AM
688 0, /* bitpos */
689 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 690 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 691 "R_PPC64_SECTOFF", /* name */
b34976b6 692 FALSE, /* partial_inplace */
5bd4f169 693 0, /* src_mask */
c061c2d8 694 0xffff, /* dst_mask */
b34976b6 695 FALSE), /* pcrel_offset */
5bd4f169 696
c061c2d8 697 /* Like R_PPC64_SECTOFF, but no overflow warning. */
5bd4f169
AM
698 HOWTO (R_PPC64_SECTOFF_LO, /* type */
699 0, /* rightshift */
700 1, /* size (0 = byte, 1 = short, 2 = long) */
701 16, /* bitsize */
b34976b6 702 FALSE, /* pc_relative */
5bd4f169
AM
703 0, /* bitpos */
704 complain_overflow_dont, /* complain_on_overflow */
805fc799 705 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 706 "R_PPC64_SECTOFF_LO", /* name */
b34976b6 707 FALSE, /* partial_inplace */
5bd4f169
AM
708 0, /* src_mask */
709 0xffff, /* dst_mask */
b34976b6 710 FALSE), /* pcrel_offset */
5bd4f169
AM
711
712 /* 16-bit upper half section relative relocation. */
713 HOWTO (R_PPC64_SECTOFF_HI, /* type */
714 16, /* rightshift */
715 1, /* size (0 = byte, 1 = short, 2 = long) */
716 16, /* bitsize */
b34976b6 717 FALSE, /* pc_relative */
5bd4f169
AM
718 0, /* bitpos */
719 complain_overflow_dont, /* complain_on_overflow */
805fc799 720 ppc64_elf_sectoff_reloc, /* special_function */
5bd4f169 721 "R_PPC64_SECTOFF_HI", /* name */
b34976b6 722 FALSE, /* partial_inplace */
5bd4f169
AM
723 0, /* src_mask */
724 0xffff, /* dst_mask */
b34976b6 725 FALSE), /* pcrel_offset */
5bd4f169
AM
726
727 /* 16-bit upper half adjusted section relative relocation. */
728 HOWTO (R_PPC64_SECTOFF_HA, /* type */
729 16, /* rightshift */
730 1, /* size (0 = byte, 1 = short, 2 = long) */
731 16, /* bitsize */
b34976b6 732 FALSE, /* pc_relative */
5bd4f169
AM
733 0, /* bitpos */
734 complain_overflow_dont, /* complain_on_overflow */
805fc799 735 ppc64_elf_sectoff_ha_reloc, /* special_function */
5bd4f169 736 "R_PPC64_SECTOFF_HA", /* name */
b34976b6 737 FALSE, /* partial_inplace */
5bd4f169
AM
738 0, /* src_mask */
739 0xffff, /* dst_mask */
b34976b6 740 FALSE), /* pcrel_offset */
5bd4f169 741
04c9666a
AM
742 /* Like R_PPC64_REL24 without touching the two least significant bits. */
743 HOWTO (R_PPC64_REL30, /* type */
5bd4f169
AM
744 2, /* rightshift */
745 2, /* size (0 = byte, 1 = short, 2 = long) */
746 30, /* bitsize */
b34976b6 747 TRUE, /* pc_relative */
5bd4f169
AM
748 0, /* bitpos */
749 complain_overflow_dont, /* complain_on_overflow */
750 bfd_elf_generic_reloc, /* special_function */
04c9666a 751 "R_PPC64_REL30", /* name */
b34976b6 752 FALSE, /* partial_inplace */
d006db6c 753 0, /* src_mask */
5bd4f169 754 0xfffffffc, /* dst_mask */
b34976b6 755 TRUE), /* pcrel_offset */
5bd4f169
AM
756
757 /* Relocs in the 64-bit PowerPC ELF ABI, not in the 32-bit ABI. */
758
759 /* A standard 64-bit relocation. */
760 HOWTO (R_PPC64_ADDR64, /* type */
761 0, /* rightshift */
762 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
763 64, /* bitsize */
b34976b6 764 FALSE, /* pc_relative */
5bd4f169
AM
765 0, /* bitpos */
766 complain_overflow_dont, /* complain_on_overflow */
767 bfd_elf_generic_reloc, /* special_function */
768 "R_PPC64_ADDR64", /* name */
b34976b6 769 FALSE, /* partial_inplace */
5bd4f169 770 0, /* src_mask */
f5e87a1d 771 ONES (64), /* dst_mask */
b34976b6 772 FALSE), /* pcrel_offset */
5bd4f169
AM
773
774 /* The bits 32-47 of an address. */
775 HOWTO (R_PPC64_ADDR16_HIGHER, /* type */
776 32, /* rightshift */
777 1, /* size (0 = byte, 1 = short, 2 = long) */
778 16, /* bitsize */
b34976b6 779 FALSE, /* pc_relative */
5bd4f169
AM
780 0, /* bitpos */
781 complain_overflow_dont, /* complain_on_overflow */
782 bfd_elf_generic_reloc, /* special_function */
783 "R_PPC64_ADDR16_HIGHER", /* name */
b34976b6 784 FALSE, /* partial_inplace */
5bd4f169
AM
785 0, /* src_mask */
786 0xffff, /* dst_mask */
b34976b6 787 FALSE), /* pcrel_offset */
5bd4f169
AM
788
789 /* The bits 32-47 of an address, plus 1 if the contents of the low
790 16 bits, treated as a signed number, is negative. */
791 HOWTO (R_PPC64_ADDR16_HIGHERA, /* type */
792 32, /* rightshift */
793 1, /* size (0 = byte, 1 = short, 2 = long) */
794 16, /* bitsize */
b34976b6 795 FALSE, /* pc_relative */
5bd4f169
AM
796 0, /* bitpos */
797 complain_overflow_dont, /* complain_on_overflow */
805fc799 798 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 799 "R_PPC64_ADDR16_HIGHERA", /* name */
b34976b6 800 FALSE, /* partial_inplace */
5bd4f169
AM
801 0, /* src_mask */
802 0xffff, /* dst_mask */
b34976b6 803 FALSE), /* pcrel_offset */
5bd4f169
AM
804
805 /* The bits 48-63 of an address. */
806 HOWTO (R_PPC64_ADDR16_HIGHEST,/* type */
807 48, /* rightshift */
808 1, /* size (0 = byte, 1 = short, 2 = long) */
809 16, /* bitsize */
b34976b6 810 FALSE, /* pc_relative */
5bd4f169
AM
811 0, /* bitpos */
812 complain_overflow_dont, /* complain_on_overflow */
813 bfd_elf_generic_reloc, /* special_function */
814 "R_PPC64_ADDR16_HIGHEST", /* name */
b34976b6 815 FALSE, /* partial_inplace */
5bd4f169
AM
816 0, /* src_mask */
817 0xffff, /* dst_mask */
b34976b6 818 FALSE), /* pcrel_offset */
5bd4f169
AM
819
820 /* The bits 48-63 of an address, plus 1 if the contents of the low
821 16 bits, treated as a signed number, is negative. */
822 HOWTO (R_PPC64_ADDR16_HIGHESTA,/* type */
823 48, /* rightshift */
824 1, /* size (0 = byte, 1 = short, 2 = long) */
825 16, /* bitsize */
b34976b6 826 FALSE, /* pc_relative */
5bd4f169
AM
827 0, /* bitpos */
828 complain_overflow_dont, /* complain_on_overflow */
805fc799 829 ppc64_elf_ha_reloc, /* special_function */
5bd4f169 830 "R_PPC64_ADDR16_HIGHESTA", /* name */
b34976b6 831 FALSE, /* partial_inplace */
5bd4f169
AM
832 0, /* src_mask */
833 0xffff, /* dst_mask */
b34976b6 834 FALSE), /* pcrel_offset */
5bd4f169
AM
835
836 /* Like ADDR64, but may be unaligned. */
837 HOWTO (R_PPC64_UADDR64, /* type */
838 0, /* rightshift */
839 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
840 64, /* bitsize */
b34976b6 841 FALSE, /* pc_relative */
5bd4f169
AM
842 0, /* bitpos */
843 complain_overflow_dont, /* complain_on_overflow */
844 bfd_elf_generic_reloc, /* special_function */
845 "R_PPC64_UADDR64", /* name */
b34976b6 846 FALSE, /* partial_inplace */
5bd4f169 847 0, /* src_mask */
f5e87a1d 848 ONES (64), /* dst_mask */
b34976b6 849 FALSE), /* pcrel_offset */
5bd4f169
AM
850
851 /* 64-bit relative relocation. */
852 HOWTO (R_PPC64_REL64, /* type */
853 0, /* rightshift */
854 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
855 64, /* bitsize */
b34976b6 856 TRUE, /* pc_relative */
5bd4f169
AM
857 0, /* bitpos */
858 complain_overflow_dont, /* complain_on_overflow */
859 bfd_elf_generic_reloc, /* special_function */
860 "R_PPC64_REL64", /* name */
b34976b6 861 FALSE, /* partial_inplace */
5bd4f169 862 0, /* src_mask */
f5e87a1d 863 ONES (64), /* dst_mask */
b34976b6 864 TRUE), /* pcrel_offset */
5bd4f169 865
cedb70c5 866 /* 64-bit relocation to the symbol's procedure linkage table. */
5bd4f169
AM
867 HOWTO (R_PPC64_PLT64, /* type */
868 0, /* rightshift */
869 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
870 64, /* bitsize */
b34976b6 871 FALSE, /* pc_relative */
5bd4f169
AM
872 0, /* bitpos */
873 complain_overflow_dont, /* complain_on_overflow */
805fc799 874 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 875 "R_PPC64_PLT64", /* name */
b34976b6 876 FALSE, /* partial_inplace */
5bd4f169 877 0, /* src_mask */
f5e87a1d 878 ONES (64), /* dst_mask */
b34976b6 879 FALSE), /* pcrel_offset */
5bd4f169
AM
880
881 /* 64-bit PC relative relocation to the symbol's procedure linkage
882 table. */
883 /* FIXME: R_PPC64_PLTREL64 not supported. */
884 HOWTO (R_PPC64_PLTREL64, /* type */
885 0, /* rightshift */
886 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
887 64, /* bitsize */
b34976b6 888 TRUE, /* pc_relative */
5bd4f169
AM
889 0, /* bitpos */
890 complain_overflow_dont, /* complain_on_overflow */
805fc799 891 ppc64_elf_unhandled_reloc, /* special_function */
5bd4f169 892 "R_PPC64_PLTREL64", /* name */
b34976b6 893 FALSE, /* partial_inplace */
5bd4f169 894 0, /* src_mask */
f5e87a1d 895 ONES (64), /* dst_mask */
b34976b6 896 TRUE), /* pcrel_offset */
5bd4f169
AM
897
898 /* 16 bit TOC-relative relocation. */
899
900 /* R_PPC64_TOC16 47 half16* S + A - .TOC. */
901 HOWTO (R_PPC64_TOC16, /* type */
902 0, /* rightshift */
903 1, /* size (0 = byte, 1 = short, 2 = long) */
904 16, /* bitsize */
b34976b6 905 FALSE, /* pc_relative */
5bd4f169
AM
906 0, /* bitpos */
907 complain_overflow_signed, /* complain_on_overflow */
805fc799 908 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 909 "R_PPC64_TOC16", /* name */
b34976b6 910 FALSE, /* partial_inplace */
5bd4f169
AM
911 0, /* src_mask */
912 0xffff, /* dst_mask */
b34976b6 913 FALSE), /* pcrel_offset */
5bd4f169
AM
914
915 /* 16 bit TOC-relative relocation without overflow. */
916
917 /* R_PPC64_TOC16_LO 48 half16 #lo (S + A - .TOC.) */
918 HOWTO (R_PPC64_TOC16_LO, /* type */
919 0, /* rightshift */
920 1, /* size (0 = byte, 1 = short, 2 = long) */
921 16, /* bitsize */
b34976b6 922 FALSE, /* pc_relative */
5bd4f169
AM
923 0, /* bitpos */
924 complain_overflow_dont, /* complain_on_overflow */
805fc799 925 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 926 "R_PPC64_TOC16_LO", /* name */
b34976b6 927 FALSE, /* partial_inplace */
5bd4f169
AM
928 0, /* src_mask */
929 0xffff, /* dst_mask */
b34976b6 930 FALSE), /* pcrel_offset */
5bd4f169
AM
931
932 /* 16 bit TOC-relative relocation, high 16 bits. */
933
934 /* R_PPC64_TOC16_HI 49 half16 #hi (S + A - .TOC.) */
935 HOWTO (R_PPC64_TOC16_HI, /* type */
936 16, /* rightshift */
937 1, /* size (0 = byte, 1 = short, 2 = long) */
938 16, /* bitsize */
b34976b6 939 FALSE, /* pc_relative */
5bd4f169
AM
940 0, /* bitpos */
941 complain_overflow_dont, /* complain_on_overflow */
805fc799 942 ppc64_elf_toc_reloc, /* special_function */
5bd4f169 943 "R_PPC64_TOC16_HI", /* name */
b34976b6 944 FALSE, /* partial_inplace */
5bd4f169
AM
945 0, /* src_mask */
946 0xffff, /* dst_mask */
b34976b6 947 FALSE), /* pcrel_offset */
5bd4f169
AM
948
949 /* 16 bit TOC-relative relocation, high 16 bits, plus 1 if the
950 contents of the low 16 bits, treated as a signed number, is
951 negative. */
952
953 /* R_PPC64_TOC16_HA 50 half16 #ha (S + A - .TOC.) */
954 HOWTO (R_PPC64_TOC16_HA, /* type */
955 16, /* rightshift */
956 1, /* size (0 = byte, 1 = short, 2 = long) */
957 16, /* bitsize */
b34976b6 958 FALSE, /* pc_relative */
5bd4f169
AM
959 0, /* bitpos */
960 complain_overflow_dont, /* complain_on_overflow */
805fc799 961 ppc64_elf_toc_ha_reloc, /* special_function */
5bd4f169 962 "R_PPC64_TOC16_HA", /* name */
b34976b6 963 FALSE, /* partial_inplace */
5bd4f169
AM
964 0, /* src_mask */
965 0xffff, /* dst_mask */
b34976b6 966 FALSE), /* pcrel_offset */
5bd4f169
AM
967
968 /* 64-bit relocation; insert value of TOC base (.TOC.). */
969
970 /* R_PPC64_TOC 51 doubleword64 .TOC. */
971 HOWTO (R_PPC64_TOC, /* type */
972 0, /* rightshift */
973 4, /* size (0=byte, 1=short, 2=long, 4=64 bits) */
974 64, /* bitsize */
b34976b6 975 FALSE, /* pc_relative */
5bd4f169
AM
976 0, /* bitpos */
977 complain_overflow_bitfield, /* complain_on_overflow */
805fc799 978 ppc64_elf_toc64_reloc, /* special_function */
5bd4f169 979 "R_PPC64_TOC", /* name */
b34976b6 980 FALSE, /* partial_inplace */
5bd4f169 981 0, /* src_mask */
f5e87a1d 982 ONES (64), /* dst_mask */
b34976b6 983 FALSE), /* pcrel_offset */
5bd4f169
AM
984
985 /* Like R_PPC64_GOT16, but also informs the link editor that the
986 value to relocate may (!) refer to a PLT entry which the link
987 editor (a) may replace with the symbol value. If the link editor
988 is unable to fully resolve the symbol, it may (b) create a PLT
989 entry and store the address to the new PLT entry in the GOT.
990 This permits lazy resolution of function symbols at run time.
991 The link editor may also skip all of this and just (c) emit a
992 R_PPC64_GLOB_DAT to tie the symbol to the GOT entry. */
993 /* FIXME: R_PPC64_PLTGOT16 not implemented. */
994 HOWTO (R_PPC64_PLTGOT16, /* type */
995 0, /* rightshift */
996 1, /* size (0 = byte, 1 = short, 2 = long) */
997 16, /* bitsize */
b34976b6 998 FALSE, /* pc_relative */
5bd4f169
AM
999 0, /* bitpos */
1000 complain_overflow_signed, /* complain_on_overflow */
805fc799 1001 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb
AM
1002 "R_PPC64_PLTGOT16", /* name */
1003 FALSE, /* partial_inplace */
1004 0, /* src_mask */
1005 0xffff, /* dst_mask */
1006 FALSE), /* pcrel_offset */
1007
1008 /* Like R_PPC64_PLTGOT16, but without overflow. */
1009 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1010 HOWTO (R_PPC64_PLTGOT16_LO, /* type */
1011 0, /* rightshift */
1012 1, /* size (0 = byte, 1 = short, 2 = long) */
1013 16, /* bitsize */
1014 FALSE, /* pc_relative */
1015 0, /* bitpos */
1016 complain_overflow_dont, /* complain_on_overflow */
1017 ppc64_elf_unhandled_reloc, /* special_function */
1018 "R_PPC64_PLTGOT16_LO", /* name */
1019 FALSE, /* partial_inplace */
1020 0, /* src_mask */
1021 0xffff, /* dst_mask */
1022 FALSE), /* pcrel_offset */
1023
1024 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address. */
1025 /* FIXME: R_PPC64_PLTGOT16_HI not implemented. */
1026 HOWTO (R_PPC64_PLTGOT16_HI, /* type */
1027 16, /* rightshift */
1028 1, /* size (0 = byte, 1 = short, 2 = long) */
1029 16, /* bitsize */
1030 FALSE, /* pc_relative */
1031 0, /* bitpos */
1032 complain_overflow_dont, /* complain_on_overflow */
1033 ppc64_elf_unhandled_reloc, /* special_function */
1034 "R_PPC64_PLTGOT16_HI", /* name */
1035 FALSE, /* partial_inplace */
1036 0, /* src_mask */
1037 0xffff, /* dst_mask */
1038 FALSE), /* pcrel_offset */
1039
1040 /* Like R_PPC64_PLT_GOT16, but using bits 16-31 of the address, plus
1041 1 if the contents of the low 16 bits, treated as a signed number,
1042 is negative. */
1043 /* FIXME: R_PPC64_PLTGOT16_HA not implemented. */
1044 HOWTO (R_PPC64_PLTGOT16_HA, /* type */
1045 16, /* rightshift */
1046 1, /* size (0 = byte, 1 = short, 2 = long) */
1047 16, /* bitsize */
1048 FALSE, /* pc_relative */
1049 0, /* bitpos */
1050 complain_overflow_dont,/* complain_on_overflow */
1051 ppc64_elf_unhandled_reloc, /* special_function */
1052 "R_PPC64_PLTGOT16_HA", /* name */
1053 FALSE, /* partial_inplace */
1054 0, /* src_mask */
1055 0xffff, /* dst_mask */
1056 FALSE), /* pcrel_offset */
1057
1058 /* Like R_PPC64_ADDR16, but for instructions with a DS field. */
1059 HOWTO (R_PPC64_ADDR16_DS, /* type */
1060 0, /* rightshift */
1061 1, /* size (0 = byte, 1 = short, 2 = long) */
1062 16, /* bitsize */
1063 FALSE, /* pc_relative */
1064 0, /* bitpos */
1065 complain_overflow_bitfield, /* complain_on_overflow */
1066 bfd_elf_generic_reloc, /* special_function */
1067 "R_PPC64_ADDR16_DS", /* name */
1068 FALSE, /* partial_inplace */
1069 0, /* src_mask */
1070 0xfffc, /* dst_mask */
1071 FALSE), /* pcrel_offset */
1072
1073 /* Like R_PPC64_ADDR16_LO, but for instructions with a DS field. */
1074 HOWTO (R_PPC64_ADDR16_LO_DS, /* type */
1075 0, /* rightshift */
1076 1, /* size (0 = byte, 1 = short, 2 = long) */
1077 16, /* bitsize */
1078 FALSE, /* pc_relative */
1079 0, /* bitpos */
1080 complain_overflow_dont,/* complain_on_overflow */
1081 bfd_elf_generic_reloc, /* special_function */
1082 "R_PPC64_ADDR16_LO_DS",/* name */
1083 FALSE, /* partial_inplace */
1084 0, /* src_mask */
1085 0xfffc, /* dst_mask */
1086 FALSE), /* pcrel_offset */
1087
1088 /* Like R_PPC64_GOT16, but for instructions with a DS field. */
1089 HOWTO (R_PPC64_GOT16_DS, /* type */
1090 0, /* rightshift */
1091 1, /* size (0 = byte, 1 = short, 2 = long) */
1092 16, /* bitsize */
1093 FALSE, /* pc_relative */
1094 0, /* bitpos */
1095 complain_overflow_signed, /* complain_on_overflow */
1096 ppc64_elf_unhandled_reloc, /* special_function */
1097 "R_PPC64_GOT16_DS", /* name */
1098 FALSE, /* partial_inplace */
1099 0, /* src_mask */
1100 0xfffc, /* dst_mask */
1101 FALSE), /* pcrel_offset */
1102
1103 /* Like R_PPC64_GOT16_LO, but for instructions with a DS field. */
1104 HOWTO (R_PPC64_GOT16_LO_DS, /* type */
1105 0, /* rightshift */
1106 1, /* size (0 = byte, 1 = short, 2 = long) */
1107 16, /* bitsize */
1108 FALSE, /* pc_relative */
1109 0, /* bitpos */
1110 complain_overflow_dont, /* complain_on_overflow */
1111 ppc64_elf_unhandled_reloc, /* special_function */
1112 "R_PPC64_GOT16_LO_DS", /* name */
1113 FALSE, /* partial_inplace */
1114 0, /* src_mask */
1115 0xfffc, /* dst_mask */
1116 FALSE), /* pcrel_offset */
1117
1118 /* Like R_PPC64_PLT16_LO, but for instructions with a DS field. */
1119 HOWTO (R_PPC64_PLT16_LO_DS, /* type */
1120 0, /* rightshift */
1121 1, /* size (0 = byte, 1 = short, 2 = long) */
1122 16, /* bitsize */
1123 FALSE, /* pc_relative */
1124 0, /* bitpos */
1125 complain_overflow_dont, /* complain_on_overflow */
1126 ppc64_elf_unhandled_reloc, /* special_function */
1127 "R_PPC64_PLT16_LO_DS", /* name */
1128 FALSE, /* partial_inplace */
1129 0, /* src_mask */
1130 0xfffc, /* dst_mask */
1131 FALSE), /* pcrel_offset */
1132
1133 /* Like R_PPC64_SECTOFF, but for instructions with a DS field. */
1134 HOWTO (R_PPC64_SECTOFF_DS, /* type */
1135 0, /* rightshift */
1136 1, /* size (0 = byte, 1 = short, 2 = long) */
1137 16, /* bitsize */
1138 FALSE, /* pc_relative */
1139 0, /* bitpos */
1140 complain_overflow_bitfield, /* complain_on_overflow */
1141 ppc64_elf_sectoff_reloc, /* special_function */
1142 "R_PPC64_SECTOFF_DS", /* name */
1143 FALSE, /* partial_inplace */
1144 0, /* src_mask */
1145 0xfffc, /* dst_mask */
1146 FALSE), /* pcrel_offset */
1147
1148 /* Like R_PPC64_SECTOFF_LO, but for instructions with a DS field. */
1149 HOWTO (R_PPC64_SECTOFF_LO_DS, /* type */
1150 0, /* rightshift */
1151 1, /* size (0 = byte, 1 = short, 2 = long) */
1152 16, /* bitsize */
1153 FALSE, /* pc_relative */
1154 0, /* bitpos */
1155 complain_overflow_dont, /* complain_on_overflow */
1156 ppc64_elf_sectoff_reloc, /* special_function */
1157 "R_PPC64_SECTOFF_LO_DS",/* name */
1158 FALSE, /* partial_inplace */
1159 0, /* src_mask */
1160 0xfffc, /* dst_mask */
1161 FALSE), /* pcrel_offset */
1162
1163 /* Like R_PPC64_TOC16, but for instructions with a DS field. */
1164 HOWTO (R_PPC64_TOC16_DS, /* type */
1165 0, /* rightshift */
1166 1, /* size (0 = byte, 1 = short, 2 = long) */
1167 16, /* bitsize */
1168 FALSE, /* pc_relative */
1169 0, /* bitpos */
1170 complain_overflow_signed, /* complain_on_overflow */
1171 ppc64_elf_toc_reloc, /* special_function */
1172 "R_PPC64_TOC16_DS", /* name */
1173 FALSE, /* partial_inplace */
1174 0, /* src_mask */
1175 0xfffc, /* dst_mask */
1176 FALSE), /* pcrel_offset */
1177
1178 /* Like R_PPC64_TOC16_LO, but for instructions with a DS field. */
1179 HOWTO (R_PPC64_TOC16_LO_DS, /* type */
1180 0, /* rightshift */
1181 1, /* size (0 = byte, 1 = short, 2 = long) */
1182 16, /* bitsize */
1183 FALSE, /* pc_relative */
1184 0, /* bitpos */
1185 complain_overflow_dont, /* complain_on_overflow */
1186 ppc64_elf_toc_reloc, /* special_function */
1187 "R_PPC64_TOC16_LO_DS", /* name */
1188 FALSE, /* partial_inplace */
1189 0, /* src_mask */
1190 0xfffc, /* dst_mask */
1191 FALSE), /* pcrel_offset */
1192
1193 /* Like R_PPC64_PLTGOT16, but for instructions with a DS field. */
1194 /* FIXME: R_PPC64_PLTGOT16_DS not implemented. */
1195 HOWTO (R_PPC64_PLTGOT16_DS, /* type */
1196 0, /* rightshift */
1197 1, /* size (0 = byte, 1 = short, 2 = long) */
1198 16, /* bitsize */
1199 FALSE, /* pc_relative */
1200 0, /* bitpos */
1201 complain_overflow_signed, /* complain_on_overflow */
1202 ppc64_elf_unhandled_reloc, /* special_function */
1203 "R_PPC64_PLTGOT16_DS", /* name */
1204 FALSE, /* partial_inplace */
1205 0, /* src_mask */
1206 0xfffc, /* dst_mask */
1207 FALSE), /* pcrel_offset */
1208
1209 /* Like R_PPC64_PLTGOT16_LO, but for instructions with a DS field. */
1210 /* FIXME: R_PPC64_PLTGOT16_LO not implemented. */
1211 HOWTO (R_PPC64_PLTGOT16_LO_DS,/* type */
1212 0, /* rightshift */
1213 1, /* size (0 = byte, 1 = short, 2 = long) */
1214 16, /* bitsize */
1215 FALSE, /* pc_relative */
1216 0, /* bitpos */
1217 complain_overflow_dont, /* complain_on_overflow */
1218 ppc64_elf_unhandled_reloc, /* special_function */
1219 "R_PPC64_PLTGOT16_LO_DS",/* name */
1220 FALSE, /* partial_inplace */
1221 0, /* src_mask */
1222 0xfffc, /* dst_mask */
1223 FALSE), /* pcrel_offset */
1224
1225 /* Marker reloc for TLS. */
1226 HOWTO (R_PPC64_TLS,
1227 0, /* rightshift */
1228 2, /* size (0 = byte, 1 = short, 2 = long) */
1229 32, /* bitsize */
1230 FALSE, /* pc_relative */
1231 0, /* bitpos */
1232 complain_overflow_dont, /* complain_on_overflow */
1233 bfd_elf_generic_reloc, /* special_function */
1234 "R_PPC64_TLS", /* name */
1235 FALSE, /* partial_inplace */
1236 0, /* src_mask */
1237 0, /* dst_mask */
1238 FALSE), /* pcrel_offset */
1239
1240 /* Computes the load module index of the load module that contains the
1241 definition of its TLS sym. */
1242 HOWTO (R_PPC64_DTPMOD64,
1243 0, /* rightshift */
1244 4, /* size (0 = byte, 1 = short, 2 = long) */
1245 64, /* bitsize */
1246 FALSE, /* pc_relative */
1247 0, /* bitpos */
1248 complain_overflow_dont, /* complain_on_overflow */
1249 ppc64_elf_unhandled_reloc, /* special_function */
1250 "R_PPC64_DTPMOD64", /* name */
1251 FALSE, /* partial_inplace */
1252 0, /* src_mask */
1253 ONES (64), /* dst_mask */
1254 FALSE), /* pcrel_offset */
1255
1256 /* Computes a dtv-relative displacement, the difference between the value
1257 of sym+add and the base address of the thread-local storage block that
1258 contains the definition of sym, minus 0x8000. */
1259 HOWTO (R_PPC64_DTPREL64,
1260 0, /* rightshift */
1261 4, /* size (0 = byte, 1 = short, 2 = long) */
1262 64, /* bitsize */
1263 FALSE, /* pc_relative */
1264 0, /* bitpos */
1265 complain_overflow_dont, /* complain_on_overflow */
1266 ppc64_elf_unhandled_reloc, /* special_function */
1267 "R_PPC64_DTPREL64", /* name */
1268 FALSE, /* partial_inplace */
1269 0, /* src_mask */
1270 ONES (64), /* dst_mask */
1271 FALSE), /* pcrel_offset */
1272
1273 /* A 16 bit dtprel reloc. */
1274 HOWTO (R_PPC64_DTPREL16,
1275 0, /* rightshift */
1276 1, /* size (0 = byte, 1 = short, 2 = long) */
1277 16, /* bitsize */
1278 FALSE, /* pc_relative */
1279 0, /* bitpos */
1280 complain_overflow_signed, /* complain_on_overflow */
1281 ppc64_elf_unhandled_reloc, /* special_function */
1282 "R_PPC64_DTPREL16", /* name */
1283 FALSE, /* partial_inplace */
1284 0, /* src_mask */
1285 0xffff, /* dst_mask */
1286 FALSE), /* pcrel_offset */
1287
1288 /* Like DTPREL16, but no overflow. */
1289 HOWTO (R_PPC64_DTPREL16_LO,
1290 0, /* rightshift */
1291 1, /* size (0 = byte, 1 = short, 2 = long) */
1292 16, /* bitsize */
1293 FALSE, /* pc_relative */
1294 0, /* bitpos */
1295 complain_overflow_dont, /* complain_on_overflow */
1296 ppc64_elf_unhandled_reloc, /* special_function */
1297 "R_PPC64_DTPREL16_LO", /* name */
1298 FALSE, /* partial_inplace */
1299 0, /* src_mask */
1300 0xffff, /* dst_mask */
1301 FALSE), /* pcrel_offset */
1302
1303 /* Like DTPREL16_LO, but next higher group of 16 bits. */
1304 HOWTO (R_PPC64_DTPREL16_HI,
1305 16, /* rightshift */
1306 1, /* size (0 = byte, 1 = short, 2 = long) */
1307 16, /* bitsize */
1308 FALSE, /* pc_relative */
1309 0, /* bitpos */
1310 complain_overflow_dont, /* complain_on_overflow */
1311 ppc64_elf_unhandled_reloc, /* special_function */
1312 "R_PPC64_DTPREL16_HI", /* name */
1313 FALSE, /* partial_inplace */
1314 0, /* src_mask */
1315 0xffff, /* dst_mask */
1316 FALSE), /* pcrel_offset */
1317
1318 /* Like DTPREL16_HI, but adjust for low 16 bits. */
1319 HOWTO (R_PPC64_DTPREL16_HA,
1320 16, /* rightshift */
1321 1, /* size (0 = byte, 1 = short, 2 = long) */
1322 16, /* bitsize */
1323 FALSE, /* pc_relative */
1324 0, /* bitpos */
1325 complain_overflow_dont, /* complain_on_overflow */
1326 ppc64_elf_unhandled_reloc, /* special_function */
1327 "R_PPC64_DTPREL16_HA", /* name */
1328 FALSE, /* partial_inplace */
1329 0, /* src_mask */
1330 0xffff, /* dst_mask */
1331 FALSE), /* pcrel_offset */
1332
1333 /* Like DTPREL16_HI, but next higher group of 16 bits. */
1334 HOWTO (R_PPC64_DTPREL16_HIGHER,
1335 32, /* rightshift */
1336 1, /* size (0 = byte, 1 = short, 2 = long) */
1337 16, /* bitsize */
1338 FALSE, /* pc_relative */
1339 0, /* bitpos */
1340 complain_overflow_dont, /* complain_on_overflow */
1341 ppc64_elf_unhandled_reloc, /* special_function */
1342 "R_PPC64_DTPREL16_HIGHER", /* name */
1343 FALSE, /* partial_inplace */
1344 0, /* src_mask */
1345 0xffff, /* dst_mask */
1346 FALSE), /* pcrel_offset */
1347
1348 /* Like DTPREL16_HIGHER, but adjust for low 16 bits. */
1349 HOWTO (R_PPC64_DTPREL16_HIGHERA,
1350 32, /* rightshift */
1351 1, /* size (0 = byte, 1 = short, 2 = long) */
1352 16, /* bitsize */
1353 FALSE, /* pc_relative */
1354 0, /* bitpos */
1355 complain_overflow_dont, /* complain_on_overflow */
1356 ppc64_elf_unhandled_reloc, /* special_function */
1357 "R_PPC64_DTPREL16_HIGHERA", /* name */
1358 FALSE, /* partial_inplace */
1359 0, /* src_mask */
1360 0xffff, /* dst_mask */
1361 FALSE), /* pcrel_offset */
1362
1363 /* Like DTPREL16_HIGHER, but next higher group of 16 bits. */
1364 HOWTO (R_PPC64_DTPREL16_HIGHEST,
1365 48, /* rightshift */
1366 1, /* size (0 = byte, 1 = short, 2 = long) */
1367 16, /* bitsize */
1368 FALSE, /* pc_relative */
1369 0, /* bitpos */
1370 complain_overflow_dont, /* complain_on_overflow */
1371 ppc64_elf_unhandled_reloc, /* special_function */
1372 "R_PPC64_DTPREL16_HIGHEST", /* name */
1373 FALSE, /* partial_inplace */
1374 0, /* src_mask */
1375 0xffff, /* dst_mask */
1376 FALSE), /* pcrel_offset */
1377
1378 /* Like DTPREL16_HIGHEST, but adjust for low 16 bits. */
1379 HOWTO (R_PPC64_DTPREL16_HIGHESTA,
1380 48, /* rightshift */
1381 1, /* size (0 = byte, 1 = short, 2 = long) */
1382 16, /* bitsize */
1383 FALSE, /* pc_relative */
1384 0, /* bitpos */
1385 complain_overflow_dont, /* complain_on_overflow */
1386 ppc64_elf_unhandled_reloc, /* special_function */
1387 "R_PPC64_DTPREL16_HIGHESTA", /* name */
1388 FALSE, /* partial_inplace */
1389 0, /* src_mask */
1390 0xffff, /* dst_mask */
1391 FALSE), /* pcrel_offset */
1392
1393 /* Like DTPREL16, but for insns with a DS field. */
1394 HOWTO (R_PPC64_DTPREL16_DS,
1395 0, /* rightshift */
1396 1, /* size (0 = byte, 1 = short, 2 = long) */
1397 16, /* bitsize */
1398 FALSE, /* pc_relative */
1399 0, /* bitpos */
1400 complain_overflow_signed, /* complain_on_overflow */
1401 ppc64_elf_unhandled_reloc, /* special_function */
1402 "R_PPC64_DTPREL16_DS", /* name */
1403 FALSE, /* partial_inplace */
1404 0, /* src_mask */
1405 0xfffc, /* dst_mask */
1406 FALSE), /* pcrel_offset */
1407
1408 /* Like DTPREL16_DS, but no overflow. */
1409 HOWTO (R_PPC64_DTPREL16_LO_DS,
1410 0, /* rightshift */
1411 1, /* size (0 = byte, 1 = short, 2 = long) */
1412 16, /* bitsize */
1413 FALSE, /* pc_relative */
1414 0, /* bitpos */
1415 complain_overflow_dont, /* complain_on_overflow */
1416 ppc64_elf_unhandled_reloc, /* special_function */
1417 "R_PPC64_DTPREL16_LO_DS", /* name */
1418 FALSE, /* partial_inplace */
1419 0, /* src_mask */
1420 0xfffc, /* dst_mask */
1421 FALSE), /* pcrel_offset */
1422
1423 /* Computes a tp-relative displacement, the difference between the value of
1424 sym+add and the value of the thread pointer (r13). */
1425 HOWTO (R_PPC64_TPREL64,
1426 0, /* rightshift */
1427 4, /* size (0 = byte, 1 = short, 2 = long) */
1428 64, /* bitsize */
1429 FALSE, /* pc_relative */
1430 0, /* bitpos */
1431 complain_overflow_dont, /* complain_on_overflow */
1432 ppc64_elf_unhandled_reloc, /* special_function */
1433 "R_PPC64_TPREL64", /* name */
1434 FALSE, /* partial_inplace */
1435 0, /* src_mask */
1436 ONES (64), /* dst_mask */
1437 FALSE), /* pcrel_offset */
1438
1439 /* A 16 bit tprel reloc. */
1440 HOWTO (R_PPC64_TPREL16,
1441 0, /* rightshift */
1442 1, /* size (0 = byte, 1 = short, 2 = long) */
1443 16, /* bitsize */
1444 FALSE, /* pc_relative */
1445 0, /* bitpos */
1446 complain_overflow_signed, /* complain_on_overflow */
1447 ppc64_elf_unhandled_reloc, /* special_function */
1448 "R_PPC64_TPREL16", /* name */
1449 FALSE, /* partial_inplace */
1450 0, /* src_mask */
1451 0xffff, /* dst_mask */
1452 FALSE), /* pcrel_offset */
1453
1454 /* Like TPREL16, but no overflow. */
1455 HOWTO (R_PPC64_TPREL16_LO,
1456 0, /* rightshift */
1457 1, /* size (0 = byte, 1 = short, 2 = long) */
1458 16, /* bitsize */
1459 FALSE, /* pc_relative */
1460 0, /* bitpos */
1461 complain_overflow_dont, /* complain_on_overflow */
1462 ppc64_elf_unhandled_reloc, /* special_function */
1463 "R_PPC64_TPREL16_LO", /* name */
1464 FALSE, /* partial_inplace */
1465 0, /* src_mask */
1466 0xffff, /* dst_mask */
1467 FALSE), /* pcrel_offset */
1468
1469 /* Like TPREL16_LO, but next higher group of 16 bits. */
1470 HOWTO (R_PPC64_TPREL16_HI,
1471 16, /* rightshift */
1472 1, /* size (0 = byte, 1 = short, 2 = long) */
1473 16, /* bitsize */
1474 FALSE, /* pc_relative */
1475 0, /* bitpos */
1476 complain_overflow_dont, /* complain_on_overflow */
1477 ppc64_elf_unhandled_reloc, /* special_function */
1478 "R_PPC64_TPREL16_HI", /* name */
1479 FALSE, /* partial_inplace */
1480 0, /* src_mask */
1481 0xffff, /* dst_mask */
1482 FALSE), /* pcrel_offset */
1483
1484 /* Like TPREL16_HI, but adjust for low 16 bits. */
1485 HOWTO (R_PPC64_TPREL16_HA,
1486 16, /* rightshift */
1487 1, /* size (0 = byte, 1 = short, 2 = long) */
1488 16, /* bitsize */
1489 FALSE, /* pc_relative */
1490 0, /* bitpos */
1491 complain_overflow_dont, /* complain_on_overflow */
1492 ppc64_elf_unhandled_reloc, /* special_function */
1493 "R_PPC64_TPREL16_HA", /* name */
1494 FALSE, /* partial_inplace */
1495 0, /* src_mask */
1496 0xffff, /* dst_mask */
1497 FALSE), /* pcrel_offset */
1498
1499 /* Like TPREL16_HI, but next higher group of 16 bits. */
1500 HOWTO (R_PPC64_TPREL16_HIGHER,
1501 32, /* rightshift */
1502 1, /* size (0 = byte, 1 = short, 2 = long) */
1503 16, /* bitsize */
1504 FALSE, /* pc_relative */
1505 0, /* bitpos */
1506 complain_overflow_dont, /* complain_on_overflow */
1507 ppc64_elf_unhandled_reloc, /* special_function */
1508 "R_PPC64_TPREL16_HIGHER", /* name */
1509 FALSE, /* partial_inplace */
1510 0, /* src_mask */
1511 0xffff, /* dst_mask */
1512 FALSE), /* pcrel_offset */
1513
1514 /* Like TPREL16_HIGHER, but adjust for low 16 bits. */
1515 HOWTO (R_PPC64_TPREL16_HIGHERA,
1516 32, /* rightshift */
1517 1, /* size (0 = byte, 1 = short, 2 = long) */
1518 16, /* bitsize */
1519 FALSE, /* pc_relative */
1520 0, /* bitpos */
1521 complain_overflow_dont, /* complain_on_overflow */
1522 ppc64_elf_unhandled_reloc, /* special_function */
1523 "R_PPC64_TPREL16_HIGHERA", /* name */
1524 FALSE, /* partial_inplace */
1525 0, /* src_mask */
1526 0xffff, /* dst_mask */
1527 FALSE), /* pcrel_offset */
1528
1529 /* Like TPREL16_HIGHER, but next higher group of 16 bits. */
1530 HOWTO (R_PPC64_TPREL16_HIGHEST,
1531 48, /* rightshift */
1532 1, /* size (0 = byte, 1 = short, 2 = long) */
1533 16, /* bitsize */
1534 FALSE, /* pc_relative */
1535 0, /* bitpos */
1536 complain_overflow_dont, /* complain_on_overflow */
1537 ppc64_elf_unhandled_reloc, /* special_function */
1538 "R_PPC64_TPREL16_HIGHEST", /* name */
1539 FALSE, /* partial_inplace */
1540 0, /* src_mask */
1541 0xffff, /* dst_mask */
1542 FALSE), /* pcrel_offset */
1543
1544 /* Like TPREL16_HIGHEST, but adjust for low 16 bits. */
1545 HOWTO (R_PPC64_TPREL16_HIGHESTA,
1546 48, /* rightshift */
1547 1, /* size (0 = byte, 1 = short, 2 = long) */
1548 16, /* bitsize */
1549 FALSE, /* pc_relative */
1550 0, /* bitpos */
1551 complain_overflow_dont, /* complain_on_overflow */
1552 ppc64_elf_unhandled_reloc, /* special_function */
1553 "R_PPC64_TPREL16_HIGHESTA", /* name */
1554 FALSE, /* partial_inplace */
1555 0, /* src_mask */
1556 0xffff, /* dst_mask */
1557 FALSE), /* pcrel_offset */
1558
1559 /* Like TPREL16, but for insns with a DS field. */
1560 HOWTO (R_PPC64_TPREL16_DS,
1561 0, /* rightshift */
1562 1, /* size (0 = byte, 1 = short, 2 = long) */
1563 16, /* bitsize */
1564 FALSE, /* pc_relative */
1565 0, /* bitpos */
1566 complain_overflow_signed, /* complain_on_overflow */
1567 ppc64_elf_unhandled_reloc, /* special_function */
1568 "R_PPC64_TPREL16_DS", /* name */
1569 FALSE, /* partial_inplace */
1570 0, /* src_mask */
1571 0xfffc, /* dst_mask */
1572 FALSE), /* pcrel_offset */
1573
1574 /* Like TPREL16_DS, but no overflow. */
1575 HOWTO (R_PPC64_TPREL16_LO_DS,
1576 0, /* rightshift */
1577 1, /* size (0 = byte, 1 = short, 2 = long) */
1578 16, /* bitsize */
1579 FALSE, /* pc_relative */
1580 0, /* bitpos */
1581 complain_overflow_dont, /* complain_on_overflow */
1582 ppc64_elf_unhandled_reloc, /* special_function */
1583 "R_PPC64_TPREL16_LO_DS", /* name */
1584 FALSE, /* partial_inplace */
1585 0, /* src_mask */
1586 0xfffc, /* dst_mask */
1587 FALSE), /* pcrel_offset */
1588
1589 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1590 with values (sym+add)@dtpmod and (sym+add)@dtprel, and computes the offset
1591 to the first entry relative to the TOC base (r2). */
1592 HOWTO (R_PPC64_GOT_TLSGD16,
1593 0, /* rightshift */
1594 1, /* size (0 = byte, 1 = short, 2 = long) */
1595 16, /* bitsize */
1596 FALSE, /* pc_relative */
1597 0, /* bitpos */
1598 complain_overflow_signed, /* complain_on_overflow */
1599 ppc64_elf_unhandled_reloc, /* special_function */
1600 "R_PPC64_GOT_TLSGD16", /* name */
b34976b6 1601 FALSE, /* partial_inplace */
5bd4f169
AM
1602 0, /* src_mask */
1603 0xffff, /* dst_mask */
b34976b6 1604 FALSE), /* pcrel_offset */
5bd4f169 1605
411e1bfb
AM
1606 /* Like GOT_TLSGD16, but no overflow. */
1607 HOWTO (R_PPC64_GOT_TLSGD16_LO,
5bd4f169
AM
1608 0, /* rightshift */
1609 1, /* size (0 = byte, 1 = short, 2 = long) */
1610 16, /* bitsize */
b34976b6 1611 FALSE, /* pc_relative */
5bd4f169
AM
1612 0, /* bitpos */
1613 complain_overflow_dont, /* complain_on_overflow */
805fc799 1614 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1615 "R_PPC64_GOT_TLSGD16_LO", /* name */
b34976b6 1616 FALSE, /* partial_inplace */
5bd4f169
AM
1617 0, /* src_mask */
1618 0xffff, /* dst_mask */
b34976b6 1619 FALSE), /* pcrel_offset */
5bd4f169 1620
411e1bfb
AM
1621 /* Like GOT_TLSGD16_LO, but next higher group of 16 bits. */
1622 HOWTO (R_PPC64_GOT_TLSGD16_HI,
5bd4f169
AM
1623 16, /* rightshift */
1624 1, /* size (0 = byte, 1 = short, 2 = long) */
1625 16, /* bitsize */
b34976b6 1626 FALSE, /* pc_relative */
5bd4f169
AM
1627 0, /* bitpos */
1628 complain_overflow_dont, /* complain_on_overflow */
805fc799 1629 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1630 "R_PPC64_GOT_TLSGD16_HI", /* name */
b34976b6 1631 FALSE, /* partial_inplace */
5bd4f169
AM
1632 0, /* src_mask */
1633 0xffff, /* dst_mask */
b34976b6 1634 FALSE), /* pcrel_offset */
5bd4f169 1635
411e1bfb
AM
1636 /* Like GOT_TLSGD16_HI, but adjust for low 16 bits. */
1637 HOWTO (R_PPC64_GOT_TLSGD16_HA,
5bd4f169
AM
1638 16, /* rightshift */
1639 1, /* size (0 = byte, 1 = short, 2 = long) */
1640 16, /* bitsize */
b34976b6 1641 FALSE, /* pc_relative */
5bd4f169 1642 0, /* bitpos */
411e1bfb 1643 complain_overflow_dont, /* complain_on_overflow */
805fc799 1644 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1645 "R_PPC64_GOT_TLSGD16_HA", /* name */
b34976b6 1646 FALSE, /* partial_inplace */
5bd4f169
AM
1647 0, /* src_mask */
1648 0xffff, /* dst_mask */
b34976b6 1649 FALSE), /* pcrel_offset */
5bd4f169 1650
411e1bfb
AM
1651 /* Allocates two contiguous entries in the GOT to hold a tls_index structure,
1652 with values (sym+add)@dtpmod and zero, and computes the offset to the
1653 first entry relative to the TOC base (r2). */
1654 HOWTO (R_PPC64_GOT_TLSLD16,
5bd4f169
AM
1655 0, /* rightshift */
1656 1, /* size (0 = byte, 1 = short, 2 = long) */
1657 16, /* bitsize */
b34976b6 1658 FALSE, /* pc_relative */
5bd4f169 1659 0, /* bitpos */
411e1bfb
AM
1660 complain_overflow_signed, /* complain_on_overflow */
1661 ppc64_elf_unhandled_reloc, /* special_function */
1662 "R_PPC64_GOT_TLSLD16", /* name */
b34976b6 1663 FALSE, /* partial_inplace */
d006db6c 1664 0, /* src_mask */
411e1bfb 1665 0xffff, /* dst_mask */
b34976b6 1666 FALSE), /* pcrel_offset */
5bd4f169 1667
411e1bfb
AM
1668 /* Like GOT_TLSLD16, but no overflow. */
1669 HOWTO (R_PPC64_GOT_TLSLD16_LO,
5bd4f169
AM
1670 0, /* rightshift */
1671 1, /* size (0 = byte, 1 = short, 2 = long) */
1672 16, /* bitsize */
b34976b6 1673 FALSE, /* pc_relative */
5bd4f169 1674 0, /* bitpos */
411e1bfb
AM
1675 complain_overflow_dont, /* complain_on_overflow */
1676 ppc64_elf_unhandled_reloc, /* special_function */
1677 "R_PPC64_GOT_TLSLD16_LO", /* name */
b34976b6 1678 FALSE, /* partial_inplace */
d006db6c 1679 0, /* src_mask */
411e1bfb 1680 0xffff, /* dst_mask */
b34976b6 1681 FALSE), /* pcrel_offset */
5bd4f169 1682
411e1bfb
AM
1683 /* Like GOT_TLSLD16_LO, but next higher group of 16 bits. */
1684 HOWTO (R_PPC64_GOT_TLSLD16_HI,
1685 16, /* rightshift */
5bd4f169
AM
1686 1, /* size (0 = byte, 1 = short, 2 = long) */
1687 16, /* bitsize */
b34976b6 1688 FALSE, /* pc_relative */
5bd4f169 1689 0, /* bitpos */
411e1bfb 1690 complain_overflow_dont, /* complain_on_overflow */
805fc799 1691 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1692 "R_PPC64_GOT_TLSLD16_HI", /* name */
b34976b6 1693 FALSE, /* partial_inplace */
d006db6c 1694 0, /* src_mask */
411e1bfb 1695 0xffff, /* dst_mask */
b34976b6 1696 FALSE), /* pcrel_offset */
5bd4f169 1697
411e1bfb
AM
1698 /* Like GOT_TLSLD16_HI, but adjust for low 16 bits. */
1699 HOWTO (R_PPC64_GOT_TLSLD16_HA,
1700 16, /* rightshift */
5bd4f169
AM
1701 1, /* size (0 = byte, 1 = short, 2 = long) */
1702 16, /* bitsize */
b34976b6 1703 FALSE, /* pc_relative */
5bd4f169
AM
1704 0, /* bitpos */
1705 complain_overflow_dont, /* complain_on_overflow */
805fc799 1706 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1707 "R_PPC64_GOT_TLSLD16_HA", /* name */
b34976b6 1708 FALSE, /* partial_inplace */
d006db6c 1709 0, /* src_mask */
411e1bfb 1710 0xffff, /* dst_mask */
b34976b6 1711 FALSE), /* pcrel_offset */
5bd4f169 1712
411e1bfb
AM
1713 /* Allocates an entry in the GOT with value (sym+add)@dtprel, and computes
1714 the offset to the entry relative to the TOC base (r2). */
1715 HOWTO (R_PPC64_GOT_DTPREL16_DS,
5bd4f169
AM
1716 0, /* rightshift */
1717 1, /* size (0 = byte, 1 = short, 2 = long) */
1718 16, /* bitsize */
b34976b6 1719 FALSE, /* pc_relative */
5bd4f169 1720 0, /* bitpos */
411e1bfb 1721 complain_overflow_signed, /* complain_on_overflow */
805fc799 1722 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1723 "R_PPC64_GOT_DTPREL16_DS", /* name */
b34976b6 1724 FALSE, /* partial_inplace */
d006db6c 1725 0, /* src_mask */
5bd4f169 1726 0xfffc, /* dst_mask */
b34976b6 1727 FALSE), /* pcrel_offset */
5bd4f169 1728
411e1bfb
AM
1729 /* Like GOT_DTPREL16_DS, but no overflow. */
1730 HOWTO (R_PPC64_GOT_DTPREL16_LO_DS,
5bd4f169 1731 0, /* rightshift */
c061c2d8
AM
1732 1, /* size (0 = byte, 1 = short, 2 = long) */
1733 16, /* bitsize */
b34976b6 1734 FALSE, /* pc_relative */
5bd4f169 1735 0, /* bitpos */
411e1bfb
AM
1736 complain_overflow_dont, /* complain_on_overflow */
1737 ppc64_elf_unhandled_reloc, /* special_function */
1738 "R_PPC64_GOT_DTPREL16_LO_DS", /* name */
b34976b6 1739 FALSE, /* partial_inplace */
d006db6c 1740 0, /* src_mask */
c061c2d8 1741 0xfffc, /* dst_mask */
b34976b6 1742 FALSE), /* pcrel_offset */
5bd4f169 1743
411e1bfb
AM
1744 /* Like GOT_DTPREL16_LO_DS, but next higher group of 16 bits. */
1745 HOWTO (R_PPC64_GOT_DTPREL16_HI,
1746 16, /* rightshift */
5bd4f169
AM
1747 1, /* size (0 = byte, 1 = short, 2 = long) */
1748 16, /* bitsize */
b34976b6 1749 FALSE, /* pc_relative */
5bd4f169
AM
1750 0, /* bitpos */
1751 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1752 ppc64_elf_unhandled_reloc, /* special_function */
1753 "R_PPC64_GOT_DTPREL16_HI", /* name */
b34976b6 1754 FALSE, /* partial_inplace */
d006db6c 1755 0, /* src_mask */
411e1bfb 1756 0xffff, /* dst_mask */
b34976b6 1757 FALSE), /* pcrel_offset */
5bd4f169 1758
411e1bfb
AM
1759 /* Like GOT_DTPREL16_HI, but adjust for low 16 bits. */
1760 HOWTO (R_PPC64_GOT_DTPREL16_HA,
1761 16, /* rightshift */
1762 1, /* size (0 = byte, 1 = short, 2 = long) */
1763 16, /* bitsize */
1764 FALSE, /* pc_relative */
1765 0, /* bitpos */
1766 complain_overflow_dont, /* complain_on_overflow */
1767 ppc64_elf_unhandled_reloc, /* special_function */
1768 "R_PPC64_GOT_DTPREL16_HA", /* name */
1769 FALSE, /* partial_inplace */
1770 0, /* src_mask */
1771 0xffff, /* dst_mask */
1772 FALSE), /* pcrel_offset */
1773
1774 /* Allocates an entry in the GOT with value (sym+add)@tprel, and computes the
1775 offset to the entry relative to the TOC base (r2). */
1776 HOWTO (R_PPC64_GOT_TPREL16_DS,
5bd4f169
AM
1777 0, /* rightshift */
1778 1, /* size (0 = byte, 1 = short, 2 = long) */
1779 16, /* bitsize */
b34976b6 1780 FALSE, /* pc_relative */
5bd4f169
AM
1781 0, /* bitpos */
1782 complain_overflow_signed, /* complain_on_overflow */
411e1bfb
AM
1783 ppc64_elf_unhandled_reloc, /* special_function */
1784 "R_PPC64_GOT_TPREL16_DS", /* name */
b34976b6 1785 FALSE, /* partial_inplace */
d006db6c 1786 0, /* src_mask */
ad8e1ba5 1787 0xfffc, /* dst_mask */
b34976b6 1788 FALSE), /* pcrel_offset */
5bd4f169 1789
411e1bfb
AM
1790 /* Like GOT_TPREL16_DS, but no overflow. */
1791 HOWTO (R_PPC64_GOT_TPREL16_LO_DS,
5bd4f169
AM
1792 0, /* rightshift */
1793 1, /* size (0 = byte, 1 = short, 2 = long) */
1794 16, /* bitsize */
b34976b6 1795 FALSE, /* pc_relative */
5bd4f169
AM
1796 0, /* bitpos */
1797 complain_overflow_dont, /* complain_on_overflow */
411e1bfb
AM
1798 ppc64_elf_unhandled_reloc, /* special_function */
1799 "R_PPC64_GOT_TPREL16_LO_DS", /* name */
b34976b6 1800 FALSE, /* partial_inplace */
d006db6c 1801 0, /* src_mask */
ad8e1ba5 1802 0xfffc, /* dst_mask */
b34976b6 1803 FALSE), /* pcrel_offset */
5bd4f169 1804
411e1bfb
AM
1805 /* Like GOT_TPREL16_LO_DS, but next higher group of 16 bits. */
1806 HOWTO (R_PPC64_GOT_TPREL16_HI,
1807 16, /* rightshift */
5bd4f169
AM
1808 1, /* size (0 = byte, 1 = short, 2 = long) */
1809 16, /* bitsize */
b34976b6 1810 FALSE, /* pc_relative */
5bd4f169 1811 0, /* bitpos */
411e1bfb 1812 complain_overflow_dont, /* complain_on_overflow */
805fc799 1813 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1814 "R_PPC64_GOT_TPREL16_HI", /* name */
b34976b6 1815 FALSE, /* partial_inplace */
d006db6c 1816 0, /* src_mask */
411e1bfb 1817 0xffff, /* dst_mask */
b34976b6 1818 FALSE), /* pcrel_offset */
5bd4f169 1819
411e1bfb
AM
1820 /* Like GOT_TPREL16_HI, but adjust for low 16 bits. */
1821 HOWTO (R_PPC64_GOT_TPREL16_HA,
1822 16, /* rightshift */
5bd4f169
AM
1823 1, /* size (0 = byte, 1 = short, 2 = long) */
1824 16, /* bitsize */
b34976b6 1825 FALSE, /* pc_relative */
5bd4f169
AM
1826 0, /* bitpos */
1827 complain_overflow_dont, /* complain_on_overflow */
805fc799 1828 ppc64_elf_unhandled_reloc, /* special_function */
411e1bfb 1829 "R_PPC64_GOT_TPREL16_HA", /* name */
b34976b6 1830 FALSE, /* partial_inplace */
d006db6c 1831 0, /* src_mask */
411e1bfb 1832 0xffff, /* dst_mask */
b34976b6 1833 FALSE), /* pcrel_offset */
5bd4f169
AM
1834
1835 /* GNU extension to record C++ vtable hierarchy. */
1836 HOWTO (R_PPC64_GNU_VTINHERIT, /* type */
1837 0, /* rightshift */
1838 0, /* size (0 = byte, 1 = short, 2 = long) */
1839 0, /* bitsize */
b34976b6 1840 FALSE, /* pc_relative */
5bd4f169
AM
1841 0, /* bitpos */
1842 complain_overflow_dont, /* complain_on_overflow */
1843 NULL, /* special_function */
1844 "R_PPC64_GNU_VTINHERIT", /* name */
b34976b6 1845 FALSE, /* partial_inplace */
5bd4f169
AM
1846 0, /* src_mask */
1847 0, /* dst_mask */
b34976b6 1848 FALSE), /* pcrel_offset */
5bd4f169
AM
1849
1850 /* GNU extension to record C++ vtable member usage. */
1851 HOWTO (R_PPC64_GNU_VTENTRY, /* type */
1852 0, /* rightshift */
1853 0, /* size (0 = byte, 1 = short, 2 = long) */
1854 0, /* bitsize */
b34976b6 1855 FALSE, /* pc_relative */
5bd4f169
AM
1856 0, /* bitpos */
1857 complain_overflow_dont, /* complain_on_overflow */
1858 NULL, /* special_function */
1859 "R_PPC64_GNU_VTENTRY", /* name */
b34976b6 1860 FALSE, /* partial_inplace */
5bd4f169
AM
1861 0, /* src_mask */
1862 0, /* dst_mask */
b34976b6 1863 FALSE), /* pcrel_offset */
5bd4f169
AM
1864};
1865
1866\f
1867/* Initialize the ppc64_elf_howto_table, so that linear accesses can
1868 be done. */
1869
1870static void
4ce794b7 1871ppc_howto_init (void)
5bd4f169
AM
1872{
1873 unsigned int i, type;
1874
1875 for (i = 0;
1876 i < sizeof (ppc64_elf_howto_raw) / sizeof (ppc64_elf_howto_raw[0]);
1877 i++)
1878 {
1879 type = ppc64_elf_howto_raw[i].type;
1880 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
1881 / sizeof (ppc64_elf_howto_table[0])));
1882 ppc64_elf_howto_table[type] = &ppc64_elf_howto_raw[i];
1883 }
1884}
1885
1886static reloc_howto_type *
4ce794b7
AM
1887ppc64_elf_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
1888 bfd_reloc_code_real_type code)
5bd4f169 1889{
411e1bfb 1890 enum elf_ppc64_reloc_type r = R_PPC64_NONE;
5bd4f169
AM
1891
1892 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
1893 /* Initialize howto table if needed. */
1894 ppc_howto_init ();
1895
4ce794b7 1896 switch (code)
5bd4f169
AM
1897 {
1898 default:
4ce794b7 1899 return NULL;
5bd4f169 1900
411e1bfb
AM
1901 case BFD_RELOC_NONE: r = R_PPC64_NONE;
1902 break;
1903 case BFD_RELOC_32: r = R_PPC64_ADDR32;
1904 break;
1905 case BFD_RELOC_PPC_BA26: r = R_PPC64_ADDR24;
1906 break;
1907 case BFD_RELOC_16: r = R_PPC64_ADDR16;
1908 break;
1909 case BFD_RELOC_LO16: r = R_PPC64_ADDR16_LO;
1910 break;
1911 case BFD_RELOC_HI16: r = R_PPC64_ADDR16_HI;
1912 break;
1913 case BFD_RELOC_HI16_S: r = R_PPC64_ADDR16_HA;
5bd4f169 1914 break;
411e1bfb 1915 case BFD_RELOC_PPC_BA16: r = R_PPC64_ADDR14;
5bd4f169 1916 break;
411e1bfb 1917 case BFD_RELOC_PPC_BA16_BRTAKEN: r = R_PPC64_ADDR14_BRTAKEN;
5bd4f169 1918 break;
411e1bfb 1919 case BFD_RELOC_PPC_BA16_BRNTAKEN: r = R_PPC64_ADDR14_BRNTAKEN;
5bd4f169 1920 break;
411e1bfb 1921 case BFD_RELOC_PPC_B26: r = R_PPC64_REL24;
5bd4f169 1922 break;
411e1bfb 1923 case BFD_RELOC_PPC_B16: r = R_PPC64_REL14;
5bd4f169 1924 break;
411e1bfb 1925 case BFD_RELOC_PPC_B16_BRTAKEN: r = R_PPC64_REL14_BRTAKEN;
5bd4f169 1926 break;
411e1bfb 1927 case BFD_RELOC_PPC_B16_BRNTAKEN: r = R_PPC64_REL14_BRNTAKEN;
5bd4f169 1928 break;
411e1bfb 1929 case BFD_RELOC_16_GOTOFF: r = R_PPC64_GOT16;
5bd4f169 1930 break;
411e1bfb 1931 case BFD_RELOC_LO16_GOTOFF: r = R_PPC64_GOT16_LO;
5bd4f169 1932 break;
411e1bfb 1933 case BFD_RELOC_HI16_GOTOFF: r = R_PPC64_GOT16_HI;
5bd4f169 1934 break;
411e1bfb 1935 case BFD_RELOC_HI16_S_GOTOFF: r = R_PPC64_GOT16_HA;
5bd4f169 1936 break;
411e1bfb 1937 case BFD_RELOC_PPC_COPY: r = R_PPC64_COPY;
5bd4f169 1938 break;
411e1bfb 1939 case BFD_RELOC_PPC_GLOB_DAT: r = R_PPC64_GLOB_DAT;
5bd4f169 1940 break;
411e1bfb 1941 case BFD_RELOC_32_PCREL: r = R_PPC64_REL32;
5bd4f169 1942 break;
411e1bfb 1943 case BFD_RELOC_32_PLTOFF: r = R_PPC64_PLT32;
5bd4f169 1944 break;
411e1bfb 1945 case BFD_RELOC_32_PLT_PCREL: r = R_PPC64_PLTREL32;
5bd4f169 1946 break;
411e1bfb 1947 case BFD_RELOC_LO16_PLTOFF: r = R_PPC64_PLT16_LO;
5bd4f169 1948 break;
411e1bfb 1949 case BFD_RELOC_HI16_PLTOFF: r = R_PPC64_PLT16_HI;
5bd4f169 1950 break;
411e1bfb 1951 case BFD_RELOC_HI16_S_PLTOFF: r = R_PPC64_PLT16_HA;
5bd4f169 1952 break;
411e1bfb 1953 case BFD_RELOC_16_BASEREL: r = R_PPC64_SECTOFF;
5bd4f169 1954 break;
411e1bfb 1955 case BFD_RELOC_LO16_BASEREL: r = R_PPC64_SECTOFF_LO;
5bd4f169 1956 break;
411e1bfb 1957 case BFD_RELOC_HI16_BASEREL: r = R_PPC64_SECTOFF_HI;
5bd4f169 1958 break;
411e1bfb 1959 case BFD_RELOC_HI16_S_BASEREL: r = R_PPC64_SECTOFF_HA;
5bd4f169 1960 break;
411e1bfb 1961 case BFD_RELOC_CTOR: r = R_PPC64_ADDR64;
5bd4f169 1962 break;
411e1bfb 1963 case BFD_RELOC_64: r = R_PPC64_ADDR64;
5bd4f169 1964 break;
411e1bfb 1965 case BFD_RELOC_PPC64_HIGHER: r = R_PPC64_ADDR16_HIGHER;
5bd4f169 1966 break;
411e1bfb 1967 case BFD_RELOC_PPC64_HIGHER_S: r = R_PPC64_ADDR16_HIGHERA;
5bd4f169 1968 break;
411e1bfb 1969 case BFD_RELOC_PPC64_HIGHEST: r = R_PPC64_ADDR16_HIGHEST;
5bd4f169 1970 break;
411e1bfb 1971 case BFD_RELOC_PPC64_HIGHEST_S: r = R_PPC64_ADDR16_HIGHESTA;
5bd4f169 1972 break;
411e1bfb 1973 case BFD_RELOC_64_PCREL: r = R_PPC64_REL64;
5bd4f169 1974 break;
411e1bfb 1975 case BFD_RELOC_64_PLTOFF: r = R_PPC64_PLT64;
5bd4f169 1976 break;
411e1bfb 1977 case BFD_RELOC_64_PLT_PCREL: r = R_PPC64_PLTREL64;
5bd4f169 1978 break;
411e1bfb 1979 case BFD_RELOC_PPC_TOC16: r = R_PPC64_TOC16;
5bd4f169 1980 break;
411e1bfb 1981 case BFD_RELOC_PPC64_TOC16_LO: r = R_PPC64_TOC16_LO;
5bd4f169 1982 break;
411e1bfb 1983 case BFD_RELOC_PPC64_TOC16_HI: r = R_PPC64_TOC16_HI;
5bd4f169 1984 break;
411e1bfb 1985 case BFD_RELOC_PPC64_TOC16_HA: r = R_PPC64_TOC16_HA;
5bd4f169 1986 break;
411e1bfb 1987 case BFD_RELOC_PPC64_TOC: r = R_PPC64_TOC;
5bd4f169 1988 break;
411e1bfb 1989 case BFD_RELOC_PPC64_PLTGOT16: r = R_PPC64_PLTGOT16;
5bd4f169 1990 break;
411e1bfb 1991 case BFD_RELOC_PPC64_PLTGOT16_LO: r = R_PPC64_PLTGOT16_LO;
5bd4f169 1992 break;
411e1bfb 1993 case BFD_RELOC_PPC64_PLTGOT16_HI: r = R_PPC64_PLTGOT16_HI;
5bd4f169 1994 break;
411e1bfb 1995 case BFD_RELOC_PPC64_PLTGOT16_HA: r = R_PPC64_PLTGOT16_HA;
5bd4f169 1996 break;
411e1bfb 1997 case BFD_RELOC_PPC64_ADDR16_DS: r = R_PPC64_ADDR16_DS;
5bd4f169 1998 break;
411e1bfb 1999 case BFD_RELOC_PPC64_ADDR16_LO_DS: r = R_PPC64_ADDR16_LO_DS;
5bd4f169 2000 break;
411e1bfb 2001 case BFD_RELOC_PPC64_GOT16_DS: r = R_PPC64_GOT16_DS;
5bd4f169 2002 break;
411e1bfb 2003 case BFD_RELOC_PPC64_GOT16_LO_DS: r = R_PPC64_GOT16_LO_DS;
5bd4f169 2004 break;
411e1bfb 2005 case BFD_RELOC_PPC64_PLT16_LO_DS: r = R_PPC64_PLT16_LO_DS;
5bd4f169 2006 break;
411e1bfb 2007 case BFD_RELOC_PPC64_SECTOFF_DS: r = R_PPC64_SECTOFF_DS;
5bd4f169 2008 break;
411e1bfb 2009 case BFD_RELOC_PPC64_SECTOFF_LO_DS: r = R_PPC64_SECTOFF_LO_DS;
5bd4f169 2010 break;
411e1bfb 2011 case BFD_RELOC_PPC64_TOC16_DS: r = R_PPC64_TOC16_DS;
5bd4f169 2012 break;
411e1bfb 2013 case BFD_RELOC_PPC64_TOC16_LO_DS: r = R_PPC64_TOC16_LO_DS;
5bd4f169 2014 break;
411e1bfb 2015 case BFD_RELOC_PPC64_PLTGOT16_DS: r = R_PPC64_PLTGOT16_DS;
5bd4f169 2016 break;
411e1bfb 2017 case BFD_RELOC_PPC64_PLTGOT16_LO_DS: r = R_PPC64_PLTGOT16_LO_DS;
5bd4f169 2018 break;
411e1bfb 2019 case BFD_RELOC_PPC_TLS: r = R_PPC64_TLS;
5bd4f169 2020 break;
411e1bfb 2021 case BFD_RELOC_PPC_DTPMOD: r = R_PPC64_DTPMOD64;
5bd4f169 2022 break;
411e1bfb 2023 case BFD_RELOC_PPC_TPREL16: r = R_PPC64_TPREL16;
5bd4f169 2024 break;
411e1bfb 2025 case BFD_RELOC_PPC_TPREL16_LO: r = R_PPC64_TPREL16_LO;
5bd4f169 2026 break;
411e1bfb 2027 case BFD_RELOC_PPC_TPREL16_HI: r = R_PPC64_TPREL16_HI;
5bd4f169 2028 break;
411e1bfb 2029 case BFD_RELOC_PPC_TPREL16_HA: r = R_PPC64_TPREL16_HA;
5bd4f169 2030 break;
411e1bfb 2031 case BFD_RELOC_PPC_TPREL: r = R_PPC64_TPREL64;
5bd4f169 2032 break;
411e1bfb
AM
2033 case BFD_RELOC_PPC_DTPREL16: r = R_PPC64_DTPREL16;
2034 break;
2035 case BFD_RELOC_PPC_DTPREL16_LO: r = R_PPC64_DTPREL16_LO;
2036 break;
2037 case BFD_RELOC_PPC_DTPREL16_HI: r = R_PPC64_DTPREL16_HI;
2038 break;
2039 case BFD_RELOC_PPC_DTPREL16_HA: r = R_PPC64_DTPREL16_HA;
2040 break;
2041 case BFD_RELOC_PPC_DTPREL: r = R_PPC64_DTPREL64;
2042 break;
2043 case BFD_RELOC_PPC_GOT_TLSGD16: r = R_PPC64_GOT_TLSGD16;
2044 break;
2045 case BFD_RELOC_PPC_GOT_TLSGD16_LO: r = R_PPC64_GOT_TLSGD16_LO;
2046 break;
2047 case BFD_RELOC_PPC_GOT_TLSGD16_HI: r = R_PPC64_GOT_TLSGD16_HI;
2048 break;
2049 case BFD_RELOC_PPC_GOT_TLSGD16_HA: r = R_PPC64_GOT_TLSGD16_HA;
2050 break;
2051 case BFD_RELOC_PPC_GOT_TLSLD16: r = R_PPC64_GOT_TLSLD16;
2052 break;
2053 case BFD_RELOC_PPC_GOT_TLSLD16_LO: r = R_PPC64_GOT_TLSLD16_LO;
2054 break;
2055 case BFD_RELOC_PPC_GOT_TLSLD16_HI: r = R_PPC64_GOT_TLSLD16_HI;
2056 break;
2057 case BFD_RELOC_PPC_GOT_TLSLD16_HA: r = R_PPC64_GOT_TLSLD16_HA;
2058 break;
2059 case BFD_RELOC_PPC_GOT_TPREL16: r = R_PPC64_GOT_TPREL16_DS;
2060 break;
2061 case BFD_RELOC_PPC_GOT_TPREL16_LO: r = R_PPC64_GOT_TPREL16_LO_DS;
2062 break;
2063 case BFD_RELOC_PPC_GOT_TPREL16_HI: r = R_PPC64_GOT_TPREL16_HI;
2064 break;
2065 case BFD_RELOC_PPC_GOT_TPREL16_HA: r = R_PPC64_GOT_TPREL16_HA;
2066 break;
2067 case BFD_RELOC_PPC_GOT_DTPREL16: r = R_PPC64_GOT_DTPREL16_DS;
2068 break;
2069 case BFD_RELOC_PPC_GOT_DTPREL16_LO: r = R_PPC64_GOT_DTPREL16_LO_DS;
2070 break;
2071 case BFD_RELOC_PPC_GOT_DTPREL16_HI: r = R_PPC64_GOT_DTPREL16_HI;
2072 break;
2073 case BFD_RELOC_PPC_GOT_DTPREL16_HA: r = R_PPC64_GOT_DTPREL16_HA;
2074 break;
2075 case BFD_RELOC_PPC64_TPREL16_DS: r = R_PPC64_TPREL16_DS;
2076 break;
2077 case BFD_RELOC_PPC64_TPREL16_LO_DS: r = R_PPC64_TPREL16_LO_DS;
2078 break;
2079 case BFD_RELOC_PPC64_TPREL16_HIGHER: r = R_PPC64_TPREL16_HIGHER;
2080 break;
2081 case BFD_RELOC_PPC64_TPREL16_HIGHERA: r = R_PPC64_TPREL16_HIGHERA;
2082 break;
2083 case BFD_RELOC_PPC64_TPREL16_HIGHEST: r = R_PPC64_TPREL16_HIGHEST;
2084 break;
2085 case BFD_RELOC_PPC64_TPREL16_HIGHESTA: r = R_PPC64_TPREL16_HIGHESTA;
2086 break;
2087 case BFD_RELOC_PPC64_DTPREL16_DS: r = R_PPC64_DTPREL16_DS;
2088 break;
2089 case BFD_RELOC_PPC64_DTPREL16_LO_DS: r = R_PPC64_DTPREL16_LO_DS;
2090 break;
2091 case BFD_RELOC_PPC64_DTPREL16_HIGHER: r = R_PPC64_DTPREL16_HIGHER;
2092 break;
2093 case BFD_RELOC_PPC64_DTPREL16_HIGHERA: r = R_PPC64_DTPREL16_HIGHERA;
2094 break;
2095 case BFD_RELOC_PPC64_DTPREL16_HIGHEST: r = R_PPC64_DTPREL16_HIGHEST;
2096 break;
2097 case BFD_RELOC_PPC64_DTPREL16_HIGHESTA: r = R_PPC64_DTPREL16_HIGHESTA;
2098 break;
2099 case BFD_RELOC_VTABLE_INHERIT: r = R_PPC64_GNU_VTINHERIT;
2100 break;
2101 case BFD_RELOC_VTABLE_ENTRY: r = R_PPC64_GNU_VTENTRY;
5bd4f169
AM
2102 break;
2103 }
2104
4ce794b7 2105 return ppc64_elf_howto_table[r];
5bd4f169
AM
2106};
2107
2108/* Set the howto pointer for a PowerPC ELF reloc. */
2109
2110static void
4ce794b7
AM
2111ppc64_elf_info_to_howto (bfd *abfd ATTRIBUTE_UNUSED, arelent *cache_ptr,
2112 Elf_Internal_Rela *dst)
5bd4f169 2113{
65f38f15
AM
2114 unsigned int type;
2115
ef60b7ff 2116 /* Initialize howto table if needed. */
5bd4f169 2117 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
2118 ppc_howto_init ();
2119
65f38f15
AM
2120 type = ELF64_R_TYPE (dst->r_info);
2121 BFD_ASSERT (type < (sizeof (ppc64_elf_howto_table)
2122 / sizeof (ppc64_elf_howto_table[0])));
2123 cache_ptr->howto = ppc64_elf_howto_table[type];
5bd4f169
AM
2124}
2125
04c9666a 2126/* Handle the R_PPC64_ADDR16_HA and similar relocs. */
5bd4f169
AM
2127
2128static bfd_reloc_status_type
4ce794b7
AM
2129ppc64_elf_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2130 void *data, asection *input_section,
2131 bfd *output_bfd, char **error_message)
5bd4f169 2132{
805fc799
AM
2133 /* If this is a relocatable link (output_bfd test tells us), just
2134 call the generic function. Any adjustment will be done at final
2135 link time. */
2136 if (output_bfd != NULL)
cedb70c5 2137 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2138 input_section, output_bfd, error_message);
2139
2140 /* Adjust the addend for sign extension of the low 16 bits.
2141 We won't actually be using the low 16 bits, so trashing them
2142 doesn't matter. */
2143 reloc_entry->addend += 0x8000;
2144 return bfd_reloc_continue;
2145}
5bd4f169 2146
2441e016
AM
2147static bfd_reloc_status_type
2148ppc64_elf_branch_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2149 void *data, asection *input_section,
2150 bfd *output_bfd, char **error_message)
2151{
2152 if (output_bfd != NULL)
2153 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2154 input_section, output_bfd, error_message);
2155
699733f6
AM
2156 if (strcmp (symbol->section->name, ".opd") == 0
2157 && (symbol->section->owner->flags & DYNAMIC) == 0)
2441e016
AM
2158 {
2159 bfd_vma dest = opd_entry_value (symbol->section,
2160 symbol->value + reloc_entry->addend,
2161 NULL, NULL);
2162 if (dest != (bfd_vma) -1)
2163 reloc_entry->addend = dest - (symbol->value
2164 + symbol->section->output_section->vma
2165 + symbol->section->output_offset);
2166 }
2167 return bfd_reloc_continue;
2168}
2169
805fc799 2170static bfd_reloc_status_type
4ce794b7
AM
2171ppc64_elf_brtaken_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2172 void *data, asection *input_section,
2173 bfd *output_bfd, char **error_message)
805fc799
AM
2174{
2175 long insn;
04c9666a 2176 enum elf_ppc64_reloc_type r_type;
805fc799
AM
2177 bfd_size_type octets;
2178 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
b34976b6 2179 bfd_boolean is_power4 = FALSE;
805fc799
AM
2180
2181 /* If this is a relocatable link (output_bfd test tells us), just
2182 call the generic function. Any adjustment will be done at final
2183 link time. */
5bd4f169 2184 if (output_bfd != NULL)
cedb70c5 2185 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2186 input_section, output_bfd, error_message);
2187
2188 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2189 insn = bfd_get_32 (abfd, (bfd_byte *) data + octets);
2190 insn &= ~(0x01 << 21);
4ce794b7 2191 r_type = reloc_entry->howto->type;
805fc799
AM
2192 if (r_type == R_PPC64_ADDR14_BRTAKEN
2193 || r_type == R_PPC64_REL14_BRTAKEN)
cedb70c5 2194 insn |= 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
805fc799
AM
2195
2196 if (is_power4)
5bd4f169 2197 {
805fc799
AM
2198 /* Set 'a' bit. This is 0b00010 in BO field for branch
2199 on CR(BI) insns (BO == 001at or 011at), and 0b01000
2200 for branch on CTR insns (BO == 1a00t or 1a01t). */
2201 if ((insn & (0x14 << 21)) == (0x04 << 21))
2202 insn |= 0x02 << 21;
2203 else if ((insn & (0x14 << 21)) == (0x10 << 21))
2204 insn |= 0x08 << 21;
2205 else
2441e016 2206 goto out;
5bd4f169 2207 }
805fc799
AM
2208 else
2209 {
2210 bfd_vma target = 0;
2211 bfd_vma from;
5bd4f169 2212
805fc799
AM
2213 if (!bfd_is_com_section (symbol->section))
2214 target = symbol->value;
2215 target += symbol->section->output_section->vma;
2216 target += symbol->section->output_offset;
2217 target += reloc_entry->addend;
5bd4f169 2218
805fc799
AM
2219 from = (reloc_entry->address
2220 + input_section->output_offset
2221 + input_section->output_section->vma);
5bd4f169 2222
805fc799
AM
2223 /* Invert 'y' bit if not the default. */
2224 if ((bfd_signed_vma) (target - from) < 0)
2225 insn ^= 0x01 << 21;
2226 }
4ce794b7 2227 bfd_put_32 (abfd, insn, (bfd_byte *) data + octets);
2441e016
AM
2228 out:
2229 return ppc64_elf_branch_reloc (abfd, reloc_entry, symbol, data,
2230 input_section, output_bfd, error_message);
805fc799 2231}
5bd4f169 2232
805fc799 2233static bfd_reloc_status_type
4ce794b7
AM
2234ppc64_elf_sectoff_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2235 void *data, asection *input_section,
2236 bfd *output_bfd, char **error_message)
805fc799
AM
2237{
2238 /* If this is a relocatable link (output_bfd test tells us), just
2239 call the generic function. Any adjustment will be done at final
2240 link time. */
2241 if (output_bfd != NULL)
cedb70c5 2242 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799 2243 input_section, output_bfd, error_message);
5bd4f169 2244
805fc799
AM
2245 /* Subtract the symbol section base address. */
2246 reloc_entry->addend -= symbol->section->output_section->vma;
5bd4f169
AM
2247 return bfd_reloc_continue;
2248}
2249
805fc799 2250static bfd_reloc_status_type
4ce794b7
AM
2251ppc64_elf_sectoff_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2252 void *data, asection *input_section,
2253 bfd *output_bfd, char **error_message)
805fc799
AM
2254{
2255 /* If this is a relocatable link (output_bfd test tells us), just
2256 call the generic function. Any adjustment will be done at final
2257 link time. */
2258 if (output_bfd != NULL)
cedb70c5 2259 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2260 input_section, output_bfd, error_message);
2261
2262 /* Subtract the symbol section base address. */
2263 reloc_entry->addend -= symbol->section->output_section->vma;
2264
2265 /* Adjust the addend for sign extension of the low 16 bits. */
2266 reloc_entry->addend += 0x8000;
2267 return bfd_reloc_continue;
2268}
2269
2270static bfd_reloc_status_type
4ce794b7
AM
2271ppc64_elf_toc_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2272 void *data, asection *input_section,
2273 bfd *output_bfd, char **error_message)
805fc799
AM
2274{
2275 bfd_vma TOCstart;
2276
2277 /* If this is a relocatable link (output_bfd test tells us), just
2278 call the generic function. Any adjustment will be done at final
2279 link time. */
2280 if (output_bfd != NULL)
cedb70c5 2281 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2282 input_section, output_bfd, error_message);
2283
2284 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2285 if (TOCstart == 0)
2286 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2287
2288 /* Subtract the TOC base address. */
2289 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2290 return bfd_reloc_continue;
2291}
2292
2293static bfd_reloc_status_type
4ce794b7
AM
2294ppc64_elf_toc_ha_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2295 void *data, asection *input_section,
2296 bfd *output_bfd, char **error_message)
805fc799
AM
2297{
2298 bfd_vma TOCstart;
2299
2300 /* If this is a relocatable link (output_bfd test tells us), just
2301 call the generic function. Any adjustment will be done at final
2302 link time. */
2303 if (output_bfd != NULL)
cedb70c5 2304 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2305 input_section, output_bfd, error_message);
2306
2307 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2308 if (TOCstart == 0)
2309 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2310
2311 /* Subtract the TOC base address. */
2312 reloc_entry->addend -= TOCstart + TOC_BASE_OFF;
2313
2314 /* Adjust the addend for sign extension of the low 16 bits. */
2315 reloc_entry->addend += 0x8000;
2316 return bfd_reloc_continue;
2317}
2318
2319static bfd_reloc_status_type
4ce794b7
AM
2320ppc64_elf_toc64_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2321 void *data, asection *input_section,
2322 bfd *output_bfd, char **error_message)
805fc799
AM
2323{
2324 bfd_vma TOCstart;
2325 bfd_size_type octets;
2326
2327 /* If this is a relocatable link (output_bfd test tells us), just
2328 call the generic function. Any adjustment will be done at final
2329 link time. */
2330 if (output_bfd != NULL)
cedb70c5 2331 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2332 input_section, output_bfd, error_message);
2333
2334 TOCstart = _bfd_get_gp_value (input_section->output_section->owner);
2335 if (TOCstart == 0)
2336 TOCstart = ppc64_elf_toc (input_section->output_section->owner);
2337
2338 octets = reloc_entry->address * bfd_octets_per_byte (abfd);
2339 bfd_put_64 (abfd, TOCstart + TOC_BASE_OFF, (bfd_byte *) data + octets);
2340 return bfd_reloc_ok;
2341}
2342
2343static bfd_reloc_status_type
4ce794b7
AM
2344ppc64_elf_unhandled_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2345 void *data, asection *input_section,
2346 bfd *output_bfd, char **error_message)
805fc799
AM
2347{
2348 /* If this is a relocatable link (output_bfd test tells us), just
2349 call the generic function. Any adjustment will be done at final
2350 link time. */
2351 if (output_bfd != NULL)
cedb70c5 2352 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
805fc799
AM
2353 input_section, output_bfd, error_message);
2354
2355 if (error_message != NULL)
2356 {
2357 static char buf[60];
2358 sprintf (buf, "generic linker can't handle %s",
2359 reloc_entry->howto->name);
2360 *error_message = buf;
2361 }
2362 return bfd_reloc_dangerous;
2363}
2364
e717da7e
AM
2365struct ppc64_elf_obj_tdata
2366{
2367 struct elf_obj_tdata elf;
2368
2369 /* Shortcuts to dynamic linker sections. */
2370 asection *got;
2371 asection *relgot;
2372
81688140
AM
2373 /* Used during garbage collection. We attach global symbols defined
2374 on removed .opd entries to this section so that the sym is removed. */
2375 asection *deleted_section;
2376
e717da7e
AM
2377 /* TLS local dynamic got entry handling. Suppose for multiple GOT
2378 sections means we potentially need one of these for each input bfd. */
2379 union {
2380 bfd_signed_vma refcount;
2381 bfd_vma offset;
2382 } tlsld_got;
8860955f
AM
2383
2384 /* A copy of relocs before they are modified for --emit-relocs. */
2385 Elf_Internal_Rela *opd_relocs;
e717da7e
AM
2386};
2387
2388#define ppc64_elf_tdata(bfd) \
2389 ((struct ppc64_elf_obj_tdata *) (bfd)->tdata.any)
2390
2391#define ppc64_tlsld_got(bfd) \
2392 (&ppc64_elf_tdata (bfd)->tlsld_got)
2393
2394/* Override the generic function because we store some extras. */
2395
2396static bfd_boolean
2397ppc64_elf_mkobject (bfd *abfd)
2398{
2399 bfd_size_type amt = sizeof (struct ppc64_elf_obj_tdata);
2400 abfd->tdata.any = bfd_zalloc (abfd, amt);
2401 if (abfd->tdata.any == NULL)
2402 return FALSE;
2403 return TRUE;
2404}
2405
ee75fd95
AM
2406/* Return 1 if target is one of ours. */
2407
7b53ace3 2408static bfd_boolean
ee75fd95 2409is_ppc64_elf_target (const struct bfd_target *targ)
7b53ace3
AM
2410{
2411 extern const bfd_target bfd_elf64_powerpc_vec;
2412 extern const bfd_target bfd_elf64_powerpcle_vec;
2413
2414 return targ == &bfd_elf64_powerpc_vec || targ == &bfd_elf64_powerpcle_vec;
2415}
2416
feee612b
AM
2417/* Fix bad default arch selected for a 64 bit input bfd when the
2418 default is 32 bit. */
2419
b34976b6 2420static bfd_boolean
4ce794b7 2421ppc64_elf_object_p (bfd *abfd)
feee612b
AM
2422{
2423 if (abfd->arch_info->the_default && abfd->arch_info->bits_per_word == 32)
2424 {
2425 Elf_Internal_Ehdr *i_ehdr = elf_elfheader (abfd);
2426
2427 if (i_ehdr->e_ident[EI_CLASS] == ELFCLASS64)
2428 {
2429 /* Relies on arch after 32 bit default being 64 bit default. */
2430 abfd->arch_info = abfd->arch_info->next;
2431 BFD_ASSERT (abfd->arch_info->bits_per_word == 64);
2432 }
2433 }
b34976b6 2434 return TRUE;
feee612b
AM
2435}
2436
d37c89e5
AM
2437/* Support for core dump NOTE sections. */
2438
2439static bfd_boolean
2440ppc64_elf_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2441{
eea6121a 2442 size_t offset, size;
d37c89e5
AM
2443
2444 if (note->descsz != 504)
2445 return FALSE;
2446
2447 /* pr_cursig */
2448 elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2449
2450 /* pr_pid */
2451 elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2452
2453 /* pr_reg */
2454 offset = 112;
eea6121a 2455 size = 384;
d37c89e5
AM
2456
2457 /* Make a ".reg/999" section. */
2458 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
eea6121a 2459 size, note->descpos + offset);
d37c89e5
AM
2460}
2461
2462static bfd_boolean
2463ppc64_elf_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2464{
2465 if (note->descsz != 136)
2466 return FALSE;
2467
2468 elf_tdata (abfd)->core_program
2469 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2470 elf_tdata (abfd)->core_command
2471 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2472
2473 return TRUE;
2474}
2475
5bd4f169
AM
2476/* Merge backend specific data from an object file to the output
2477 object file when linking. */
2f6d9989 2478
b34976b6 2479static bfd_boolean
4ce794b7 2480ppc64_elf_merge_private_bfd_data (bfd *ibfd, bfd *obfd)
5bd4f169 2481{
5bd4f169
AM
2482 /* Check if we have the same endianess. */
2483 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
87e226ce 2484 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
5bd4f169
AM
2485 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
2486 {
2487 const char *msg;
2488
2489 if (bfd_big_endian (ibfd))
d003868e 2490 msg = _("%B: compiled for a big endian system "
4ce794b7 2491 "and target is little endian");
5bd4f169 2492 else
d003868e 2493 msg = _("%B: compiled for a little endian system "
4ce794b7 2494 "and target is big endian");
5bd4f169 2495
d003868e 2496 (*_bfd_error_handler) (msg, ibfd);
5bd4f169
AM
2497
2498 bfd_set_error (bfd_error_wrong_format);
b34976b6 2499 return FALSE;
5bd4f169
AM
2500 }
2501
b34976b6 2502 return TRUE;
5bd4f169 2503}
f0abc2a1 2504
5d35169e
AM
2505/* Add extra PPC sections. */
2506
2507static struct bfd_elf_special_section const ppc64_elf_special_sections[]=
2508{
7dcb9820
AM
2509 { ".sdata", 6, -2, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2510 { ".sbss", 5, -2, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2511 { ".plt", 4, 0, SHT_NOBITS, 0 },
2512 { ".toc", 4, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2513 { ".toc1", 5, 0, SHT_PROGBITS, SHF_ALLOC + SHF_WRITE },
2514 { ".tocbss", 7, 0, SHT_NOBITS, SHF_ALLOC + SHF_WRITE },
2515 { NULL, 0, 0, 0, 0 }
5d35169e
AM
2516};
2517
f0abc2a1
AM
2518struct _ppc64_elf_section_data
2519{
2520 struct bfd_elf_section_data elf;
411e1bfb
AM
2521
2522 /* An array with one entry for each opd function descriptor. */
f0abc2a1
AM
2523 union
2524 {
411e1bfb 2525 /* Points to the function code section for local opd entries. */
f0abc2a1 2526 asection **func_sec;
411e1bfb 2527 /* After editing .opd, adjust references to opd local syms. */
f0abc2a1
AM
2528 long *adjust;
2529 } opd;
411e1bfb
AM
2530
2531 /* An array for toc sections, indexed by offset/8.
2532 Specifies the relocation symbol index used at a given toc offset. */
2533 unsigned *t_symndx;
f0abc2a1
AM
2534};
2535
2536#define ppc64_elf_section_data(sec) \
411e1bfb 2537 ((struct _ppc64_elf_section_data *) elf_section_data (sec))
f0abc2a1
AM
2538
2539static bfd_boolean
4ce794b7 2540ppc64_elf_new_section_hook (bfd *abfd, asection *sec)
f0abc2a1
AM
2541{
2542 struct _ppc64_elf_section_data *sdata;
2543 bfd_size_type amt = sizeof (*sdata);
2544
4ce794b7 2545 sdata = bfd_zalloc (abfd, amt);
f0abc2a1
AM
2546 if (sdata == NULL)
2547 return FALSE;
4ce794b7 2548 sec->used_by_bfd = sdata;
f0abc2a1
AM
2549
2550 return _bfd_elf_new_section_hook (abfd, sec);
2551}
4025353c
AM
2552
2553static void *
2554get_opd_info (asection * sec)
2555{
2556 if (sec != NULL
2557 && ppc64_elf_section_data (sec) != NULL
2558 && ppc64_elf_section_data (sec)->opd.adjust != NULL)
2559 return ppc64_elf_section_data (sec)->opd.adjust;
2560 return NULL;
2561}
90e3cdf2
JJ
2562\f
2563/* Parameters for the qsort hook. */
2564static asection *synthetic_opd;
2565static bfd_boolean synthetic_relocatable;
2566
699733f6 2567/* qsort comparison function for ppc64_elf_get_synthetic_symtab. */
90e3cdf2
JJ
2568
2569static int
2570compare_symbols (const void *ap, const void *bp)
2571{
2572 const asymbol *a = * (const asymbol **) ap;
2573 const asymbol *b = * (const asymbol **) bp;
2574
699733f6
AM
2575 /* Section symbols first. */
2576 if ((a->flags & BSF_SECTION_SYM) && !(b->flags & BSF_SECTION_SYM))
90e3cdf2 2577 return -1;
699733f6 2578 if (!(a->flags & BSF_SECTION_SYM) && (b->flags & BSF_SECTION_SYM))
90e3cdf2
JJ
2579 return 1;
2580
699733f6 2581 /* then .opd symbols. */
90e3cdf2
JJ
2582 if (a->section == synthetic_opd && b->section != synthetic_opd)
2583 return -1;
2584 if (a->section != synthetic_opd && b->section == synthetic_opd)
2585 return 1;
2586
699733f6 2587 /* then other code symbols. */
90e3cdf2
JJ
2588 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2589 == (SEC_CODE | SEC_ALLOC)
2590 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2591 != (SEC_CODE | SEC_ALLOC))
2592 return -1;
2593
2594 if ((a->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2595 != (SEC_CODE | SEC_ALLOC)
2596 && (b->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2597 == (SEC_CODE | SEC_ALLOC))
2598 return 1;
2599
2600 if (synthetic_relocatable)
2601 {
2602 if (a->section->id < b->section->id)
2603 return -1;
2604
2605 if (a->section->id > b->section->id)
2606 return 1;
2607 }
2608
2609 if (a->value + a->section->vma < b->value + b->section->vma)
2610 return -1;
2611
2612 if (a->value + a->section->vma > b->value + b->section->vma)
2613 return 1;
2614
2615 return 0;
2616}
2617
699733f6 2618/* Search SYMS for a symbol of the given VALUE. */
90e3cdf2 2619
699733f6
AM
2620static asymbol *
2621sym_exists_at (asymbol **syms, long lo, long hi, int id, bfd_vma value)
90e3cdf2 2622{
699733f6 2623 long mid;
90e3cdf2 2624
699733f6
AM
2625 if (id == -1)
2626 {
2627 while (lo < hi)
2628 {
2629 mid = (lo + hi) >> 1;
2630 if (syms[mid]->value + syms[mid]->section->vma < value)
2631 lo = mid + 1;
2632 else if (syms[mid]->value + syms[mid]->section->vma > value)
2633 hi = mid;
2634 else
2635 return syms[mid];
2636 }
2637 }
2638 else
2639 {
2640 while (lo < hi)
2641 {
2642 mid = (lo + hi) >> 1;
2643 if (syms[mid]->section->id < id)
2644 lo = mid + 1;
2645 else if (syms[mid]->section->id > id)
2646 hi = mid;
2647 else if (syms[mid]->value < value)
2648 lo = mid + 1;
2649 else if (syms[mid]->value > value)
2650 hi = mid;
2651 else
2652 return syms[mid];
2653 }
2654 }
2655 return NULL;
90e3cdf2
JJ
2656}
2657
699733f6
AM
2658/* Create synthetic symbols, effectively restoring "dot-symbol" function
2659 entry syms. */
90e3cdf2
JJ
2660
2661static long
a7535cf3
AM
2662ppc64_elf_get_synthetic_symtab (bfd *abfd,
2663 long static_count, asymbol **static_syms,
2664 long dyn_count, asymbol **dyn_syms,
c9727e01 2665 asymbol **ret)
90e3cdf2
JJ
2666{
2667 asymbol *s;
699733f6
AM
2668 long i;
2669 long count;
90e3cdf2 2670 char *names;
a7535cf3 2671 long symcount, codesecsym, codesecsymend, secsymend, opdsymend;
699733f6 2672 asection *opd;
90e3cdf2 2673 bfd_boolean relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
a7535cf3 2674 asymbol **syms;
90e3cdf2
JJ
2675
2676 *ret = NULL;
2677
2678 opd = bfd_get_section_by_name (abfd, ".opd");
2679 if (opd == NULL)
2680 return 0;
2681
a7535cf3 2682 symcount = static_count;
c9727e01 2683 if (!relocatable)
a7535cf3 2684 symcount += dyn_count;
90e3cdf2 2685 if (symcount == 0)
c9727e01 2686 return 0;
90e3cdf2 2687
a7535cf3
AM
2688 syms = bfd_malloc ((symcount + 1) * sizeof (*syms));
2689 if (syms == NULL)
2690 return 0;
2691
2692 if (!relocatable && static_count != 0 && dyn_count != 0)
2693 {
2694 /* Use both symbol tables. */
2695 memcpy (syms, static_syms, static_count * sizeof (*syms));
2696 memcpy (syms + static_count, dyn_syms, (dyn_count + 1) * sizeof (*syms));
2697 }
2698 else if (!relocatable && static_count == 0)
2699 memcpy (syms, dyn_syms, (symcount + 1) * sizeof (*syms));
2700 else
2701 memcpy (syms, static_syms, (symcount + 1) * sizeof (*syms));
2702
90e3cdf2
JJ
2703 synthetic_opd = opd;
2704 synthetic_relocatable = relocatable;
595da8c5 2705 qsort (syms, symcount, sizeof (*syms), compare_symbols);
90e3cdf2 2706
c9727e01
AM
2707 if (!relocatable && symcount > 1)
2708 {
2709 long j;
2710 /* Trim duplicate syms, since we may have merged the normal and
2711 dynamic symbols. Actually, we only care about syms that have
2712 different values, so trim any with the same value. */
2713 for (i = 1, j = 1; i < symcount; ++i)
2714 if (syms[i - 1]->value + syms[i - 1]->section->vma
2715 != syms[i]->value + syms[i]->section->vma)
2716 syms[j++] = syms[i];
2717 symcount = j;
2718 }
2719
699733f6
AM
2720 i = 0;
2721 if (syms[i]->section == opd)
2722 ++i;
2723 codesecsym = i;
90e3cdf2 2724
699733f6
AM
2725 for (; i < symcount; ++i)
2726 if (((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2727 != (SEC_CODE | SEC_ALLOC))
2728 || (syms[i]->flags & BSF_SECTION_SYM) == 0)
2729 break;
2730 codesecsymend = i;
90e3cdf2 2731
699733f6
AM
2732 for (; i < symcount; ++i)
2733 if ((syms[i]->flags & BSF_SECTION_SYM) == 0)
2734 break;
2735 secsymend = i;
90e3cdf2 2736
699733f6
AM
2737 for (; i < symcount; ++i)
2738 if (syms[i]->section != opd)
2739 break;
2740 opdsymend = i;
90e3cdf2 2741
699733f6
AM
2742 for (; i < symcount; ++i)
2743 if ((syms[i]->section->flags & (SEC_CODE | SEC_ALLOC | SEC_THREAD_LOCAL))
2744 != (SEC_CODE | SEC_ALLOC))
2745 break;
2746 symcount = i;
2747
c9727e01 2748 count = 0;
699733f6 2749 if (opdsymend == secsymend)
c9727e01 2750 goto done;
90e3cdf2 2751
699733f6 2752 if (relocatable)
90e3cdf2 2753 {
699733f6
AM
2754 bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2755 arelent *r;
2756 size_t size;
2757 long relcount;
90e3cdf2 2758
699733f6 2759 slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
90e3cdf2
JJ
2760 relcount = (opd->flags & SEC_RELOC) ? opd->reloc_count : 0;
2761
2762 if (! relcount
595da8c5 2763 || ! (*slurp_relocs) (abfd, opd, static_syms, FALSE))
c9727e01 2764 goto done;
90e3cdf2 2765
699733f6 2766 size = 0;
595da8c5 2767 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
699733f6
AM
2768 {
2769 asymbol *sym;
90e3cdf2 2770
595da8c5 2771 while (r < opd->relocation + relcount
699733f6
AM
2772 && r->address < syms[i]->value + opd->vma)
2773 ++r;
90e3cdf2 2774
595da8c5 2775 if (r == opd->relocation + relcount)
699733f6 2776 break;
90e3cdf2 2777
699733f6
AM
2778 if (r->address != syms[i]->value + opd->vma)
2779 continue;
90e3cdf2 2780
699733f6
AM
2781 if (r->howto->type != R_PPC64_ADDR64)
2782 continue;
90e3cdf2 2783
699733f6
AM
2784 sym = *r->sym_ptr_ptr;
2785 if (!sym_exists_at (syms, opdsymend, symcount,
2786 sym->section->id, sym->value + r->addend))
2787 {
2788 ++count;
2789 size += sizeof (asymbol);
2790 size += strlen (syms[i]->name) + 2;
2791 }
2792 }
90e3cdf2 2793
699733f6
AM
2794 s = *ret = bfd_malloc (size);
2795 if (s == NULL)
2796 {
c9727e01
AM
2797 count = 0;
2798 goto done;
699733f6 2799 }
90e3cdf2 2800
699733f6 2801 names = (char *) (s + count);
90e3cdf2 2802
595da8c5 2803 for (i = secsymend, r = opd->relocation; i < opdsymend; ++i)
90e3cdf2 2804 {
699733f6 2805 asymbol *sym;
90e3cdf2 2806
595da8c5 2807 while (r < opd->relocation + relcount
699733f6
AM
2808 && r->address < syms[i]->value + opd->vma)
2809 ++r;
90e3cdf2 2810
595da8c5 2811 if (r == opd->relocation + relcount)
699733f6
AM
2812 break;
2813
2814 if (r->address != syms[i]->value + opd->vma)
2815 continue;
2816
2817 if (r->howto->type != R_PPC64_ADDR64)
2818 continue;
90e3cdf2 2819
699733f6
AM
2820 sym = *r->sym_ptr_ptr;
2821 if (!sym_exists_at (syms, opdsymend, symcount,
2822 sym->section->id, sym->value + r->addend))
2823 {
2824 size_t len;
2825
2826 *s = *syms[i];
2827 s->section = sym->section;
2828 s->value = sym->value + r->addend;
2829 s->name = names;
2830 *names++ = '.';
2831 len = strlen (syms[i]->name);
2832 memcpy (names, syms[i]->name, len + 1);
2833 names += len + 1;
2834 s++;
2835 }
2836 }
2837 }
2838 else
90e3cdf2 2839 {
699733f6
AM
2840 bfd_byte *contents;
2841 size_t size;
90e3cdf2 2842
699733f6
AM
2843 if (!bfd_malloc_and_get_section (abfd, opd, &contents))
2844 {
2845 if (contents)
c9727e01
AM
2846 {
2847 free_contents_and_exit:
2848 free (contents);
2849 }
2850 goto done;
699733f6 2851 }
90e3cdf2 2852
699733f6
AM
2853 size = 0;
2854 for (i = secsymend; i < opdsymend; ++i)
2855 {
2856 bfd_vma ent;
90e3cdf2 2857
699733f6
AM
2858 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2859 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
2860 {
2861 ++count;
2862 size += sizeof (asymbol);
2863 size += strlen (syms[i]->name) + 2;
2864 }
2865 }
90e3cdf2 2866
699733f6
AM
2867 s = *ret = bfd_malloc (size);
2868 if (s == NULL)
2869 {
c9727e01
AM
2870 count = 0;
2871 goto free_contents_and_exit;
699733f6 2872 }
90e3cdf2 2873
699733f6 2874 names = (char *) (s + count);
90e3cdf2 2875
699733f6 2876 for (i = secsymend; i < opdsymend; ++i)
90e3cdf2 2877 {
699733f6 2878 bfd_vma ent;
90e3cdf2 2879
699733f6
AM
2880 ent = bfd_get_64 (abfd, contents + syms[i]->value);
2881 if (!sym_exists_at (syms, opdsymend, symcount, -1, ent))
90e3cdf2 2882 {
c9727e01 2883 long lo, hi;
699733f6 2884 size_t len;
c9727e01 2885 asection *sec = abfd->sections;
90e3cdf2 2886
699733f6
AM
2887 *s = *syms[i];
2888 lo = codesecsym;
2889 hi = codesecsymend;
2890 while (lo < hi)
2891 {
c9727e01 2892 long mid = (lo + hi) >> 1;
699733f6
AM
2893 if (syms[mid]->section->vma < ent)
2894 lo = mid + 1;
2895 else if (syms[mid]->section->vma > ent)
2896 hi = mid;
2897 else
c9727e01
AM
2898 {
2899 sec = syms[mid]->section;
2900 break;
2901 }
699733f6
AM
2902 }
2903
c9727e01 2904 if (lo >= hi && lo > codesecsym)
699733f6 2905 sec = syms[lo - 1]->section;
699733f6
AM
2906
2907 for (; sec != NULL; sec = sec->next)
2908 {
2909 if (sec->vma > ent)
2910 break;
2911 if ((sec->flags & SEC_ALLOC) == 0
2912 || (sec->flags & SEC_LOAD) == 0)
2913 break;
2914 if ((sec->flags & SEC_CODE) != 0)
2915 s->section = sec;
2916 }
2917 s->value = ent - s->section->vma;
2918 s->name = names;
2919 *names++ = '.';
2920 len = strlen (syms[i]->name);
2921 memcpy (names, syms[i]->name, len + 1);
2922 names += len + 1;
2923 s++;
90e3cdf2 2924 }
90e3cdf2 2925 }
699733f6 2926 free (contents);
90e3cdf2
JJ
2927 }
2928
c9727e01 2929 done:
a7535cf3 2930 free (syms);
90e3cdf2
JJ
2931 return count;
2932}
5bd4f169 2933\f
65f38f15
AM
2934/* The following functions are specific to the ELF linker, while
2935 functions above are used generally. Those named ppc64_elf_* are
2936 called by the main ELF linker code. They appear in this file more
2937 or less in the order in which they are called. eg.
2938 ppc64_elf_check_relocs is called early in the link process,
2939 ppc64_elf_finish_dynamic_sections is one of the last functions
e86ce104
AM
2940 called.
2941
2942 PowerPC64-ELF uses a similar scheme to PowerPC64-XCOFF in that
2943 functions have both a function code symbol and a function descriptor
2944 symbol. A call to foo in a relocatable object file looks like:
2945
2946 . .text
2947 . x:
2948 . bl .foo
2949 . nop
2950
2951 The function definition in another object file might be:
2952
2953 . .section .opd
2954 . foo: .quad .foo
2955 . .quad .TOC.@tocbase
2956 . .quad 0
2957 .
2958 . .text
2959 . .foo: blr
2960
2961 When the linker resolves the call during a static link, the branch
2962 unsurprisingly just goes to .foo and the .opd information is unused.
2963 If the function definition is in a shared library, things are a little
2964 different: The call goes via a plt call stub, the opd information gets
2965 copied to the plt, and the linker patches the nop.
2966
2967 . x:
2968 . bl .foo_stub
2969 . ld 2,40(1)
2970 .
2971 .
2972 . .foo_stub:
2973 . addis 12,2,Lfoo@toc@ha # in practice, the call stub
411e1bfb 2974 . addi 12,12,Lfoo@toc@l # is slightly optimized, but
e86ce104
AM
2975 . std 2,40(1) # this is the general idea
2976 . ld 11,0(12)
2977 . ld 2,8(12)
2978 . mtctr 11
2979 . ld 11,16(12)
2980 . bctr
2981 .
2982 . .section .plt
2983 . Lfoo: reloc (R_PPC64_JMP_SLOT, foo)
2984
2985 The "reloc ()" notation is supposed to indicate that the linker emits
2986 an R_PPC64_JMP_SLOT reloc against foo. The dynamic linker does the opd
2987 copying.
2988
2989 What are the difficulties here? Well, firstly, the relocations
2990 examined by the linker in check_relocs are against the function code
2991 sym .foo, while the dynamic relocation in the plt is emitted against
2992 the function descriptor symbol, foo. Somewhere along the line, we need
2993 to carefully copy dynamic link information from one symbol to the other.
2994 Secondly, the generic part of the elf linker will make .foo a dynamic
2995 symbol as is normal for most other backends. We need foo dynamic
2996 instead, at least for an application final link. However, when
2997 creating a shared library containing foo, we need to have both symbols
2998 dynamic so that references to .foo are satisfied during the early
2999 stages of linking. Otherwise the linker might decide to pull in a
8387904d
AM
3000 definition from some other object, eg. a static library.
3001
3002 Update: As of August 2004, we support a new convention. Function
3003 calls may use the function descriptor symbol, ie. "bl foo". This
3004 behaves exactly as "bl .foo". */
65f38f15
AM
3005
3006/* The linker needs to keep track of the number of relocs that it
3007 decides to copy as dynamic relocs in check_relocs for each symbol.
3008 This is so that it can later discard them if they are found to be
3009 unnecessary. We store the information in a field extending the
3010 regular ELF linker hash table. */
3011
3012struct ppc_dyn_relocs
3013{
3014 struct ppc_dyn_relocs *next;
3015
3016 /* The input section of the reloc. */
3017 asection *sec;
3018
3019 /* Total number of relocs copied for the input section. */
3020 bfd_size_type count;
3021
3022 /* Number of pc-relative relocs copied for the input section. */
3023 bfd_size_type pc_count;
3024};
3025
411e1bfb
AM
3026/* Track GOT entries needed for a given symbol. We might need more
3027 than one got entry per symbol. */
3028struct got_entry
3029{
3030 struct got_entry *next;
3031
e7b938ca 3032 /* The symbol addend that we'll be placing in the GOT. */
411e1bfb
AM
3033 bfd_vma addend;
3034
e717da7e
AM
3035 /* Unlike other ELF targets, we use separate GOT entries for the same
3036 symbol referenced from different input files. This is to support
3037 automatic multiple TOC/GOT sections, where the TOC base can vary
3038 from one input file to another.
3039
3040 Point to the BFD owning this GOT entry. */
3041 bfd *owner;
3042
3043 /* Zero for non-tls entries, or TLS_TLS and one of TLS_GD, TLS_LD,
3044 TLS_TPREL or TLS_DTPREL for tls entries. */
3045 char tls_type;
3046
e7b938ca 3047 /* Reference count until size_dynamic_sections, GOT offset thereafter. */
411e1bfb
AM
3048 union
3049 {
3050 bfd_signed_vma refcount;
3051 bfd_vma offset;
3052 } got;
411e1bfb
AM
3053};
3054
3055/* The same for PLT. */
3056struct plt_entry
3057{
3058 struct plt_entry *next;
3059
3060 bfd_vma addend;
3061
3062 union
3063 {
3064 bfd_signed_vma refcount;
3065 bfd_vma offset;
3066 } plt;
3067};
3068
65f38f15 3069/* Of those relocs that might be copied as dynamic relocs, this macro
58ac9f71
AM
3070 selects those that must be copied when linking a shared library,
3071 even when the symbol is local. */
65f38f15 3072
411e1bfb 3073#define MUST_BE_DYN_RELOC(RTYPE) \
805fc799
AM
3074 ((RTYPE) != R_PPC64_REL32 \
3075 && (RTYPE) != R_PPC64_REL64 \
04c9666a 3076 && (RTYPE) != R_PPC64_REL30)
65f38f15 3077
f4656909
AM
3078/* If ELIMINATE_COPY_RELOCS is non-zero, the linker will try to avoid
3079 copying dynamic variables from a shared lib into an app's dynbss
3080 section, and instead use a dynamic relocation to point into the
5d35169e
AM
3081 shared lib. With code that gcc generates, it's vital that this be
3082 enabled; In the PowerPC64 ABI, the address of a function is actually
3083 the address of a function descriptor, which resides in the .opd
3084 section. gcc uses the descriptor directly rather than going via the
3085 GOT as some other ABI's do, which means that initialized function
3086 pointers must reference the descriptor. Thus, a function pointer
3087 initialized to the address of a function in a shared library will
3088 either require a copy reloc, or a dynamic reloc. Using a copy reloc
4cc11e76 3089 redefines the function descriptor symbol to point to the copy. This
5d35169e
AM
3090 presents a problem as a plt entry for that function is also
3091 initialized from the function descriptor symbol and the copy reloc
3092 may not be initialized first. */
a23b6845 3093#define ELIMINATE_COPY_RELOCS 1
f4656909 3094
721956f4
AM
3095/* Section name for stubs is the associated section name plus this
3096 string. */
3097#define STUB_SUFFIX ".stub"
3098
3099/* Linker stubs.
3100 ppc_stub_long_branch:
3101 Used when a 14 bit branch (or even a 24 bit branch) can't reach its
3102 destination, but a 24 bit branch in a stub section will reach.
3103 . b dest
3104
3105 ppc_stub_plt_branch:
3106 Similar to the above, but a 24 bit branch in the stub section won't
3107 reach its destination.
87e226ce
AM
3108 . addis %r12,%r2,xxx@toc@ha
3109 . ld %r11,xxx@toc@l(%r12)
721956f4
AM
3110 . mtctr %r11
3111 . bctr
3112
3113 ppc_stub_plt_call:
2c66dc6c
AM
3114 Used to call a function in a shared library. If it so happens that
3115 the plt entry referenced crosses a 64k boundary, then an extra
3116 "addis %r12,%r12,1" will be inserted before the load at xxx+8 or
3117 xxx+16 as appropriate.
87e226ce 3118 . addis %r12,%r2,xxx@toc@ha
721956f4 3119 . std %r2,40(%r1)
87e226ce
AM
3120 . ld %r11,xxx+0@toc@l(%r12)
3121 . ld %r2,xxx+8@toc@l(%r12)
721956f4 3122 . mtctr %r11
87e226ce 3123 . ld %r11,xxx+16@toc@l(%r12)
721956f4 3124 . bctr
ad8e1ba5
AM
3125
3126 ppc_stub_long_branch and ppc_stub_plt_branch may also have additional
3127 code to adjust the value and save r2 to support multiple toc sections.
3128 A ppc_stub_long_branch with an r2 offset looks like:
3129 . std %r2,40(%r1)
3130 . addis %r2,%r2,off@ha
3131 . addi %r2,%r2,off@l
3132 . b dest
3133
3134 A ppc_stub_plt_branch with an r2 offset looks like:
3135 . std %r2,40(%r1)
3136 . addis %r12,%r2,xxx@toc@ha
3137 . ld %r11,xxx@toc@l(%r12)
3138 . addis %r2,%r2,off@ha
3139 . addi %r2,%r2,off@l
3140 . mtctr %r11
3141 . bctr
721956f4
AM
3142*/
3143
3144enum ppc_stub_type {
3145 ppc_stub_none,
3146 ppc_stub_long_branch,
ad8e1ba5 3147 ppc_stub_long_branch_r2off,
721956f4 3148 ppc_stub_plt_branch,
ad8e1ba5 3149 ppc_stub_plt_branch_r2off,
721956f4
AM
3150 ppc_stub_plt_call
3151};
3152
3153struct ppc_stub_hash_entry {
3154
3155 /* Base hash table entry structure. */
3156 struct bfd_hash_entry root;
3157
ad8e1ba5
AM
3158 enum ppc_stub_type stub_type;
3159
721956f4
AM
3160 /* The stub section. */
3161 asection *stub_sec;
3162
3163 /* Offset within stub_sec of the beginning of this stub. */
3164 bfd_vma stub_offset;
3165
3166 /* Given the symbol's value and its section we can determine its final
3167 value when building the stubs (so the stub knows where to jump. */
3168 bfd_vma target_value;
3169 asection *target_section;
3170
721956f4
AM
3171 /* The symbol table entry, if any, that this was derived from. */
3172 struct ppc_link_hash_entry *h;
3173
411e1bfb
AM
3174 /* And the reloc addend that this was derived from. */
3175 bfd_vma addend;
3176
721956f4
AM
3177 /* Where this stub is being called from, or, in the case of combined
3178 stub sections, the first input section in the group. */
3179 asection *id_sec;
3180};
3181
3182struct ppc_branch_hash_entry {
3183
3184 /* Base hash table entry structure. */
3185 struct bfd_hash_entry root;
3186
3187 /* Offset within .branch_lt. */
3188 unsigned int offset;
3189
3190 /* Generation marker. */
3191 unsigned int iter;
3192};
65f38f15
AM
3193
3194struct ppc_link_hash_entry
3195{
3196 struct elf_link_hash_entry elf;
3197
721956f4
AM
3198 /* A pointer to the most recently used stub hash entry against this
3199 symbol. */
3200 struct ppc_stub_hash_entry *stub_cache;
3201
65f38f15
AM
3202 /* Track dynamic relocs copied for this symbol. */
3203 struct ppc_dyn_relocs *dyn_relocs;
e86ce104 3204
721956f4 3205 /* Link between function code and descriptor symbols. */
34814b9f 3206 struct ppc_link_hash_entry *oh;
721956f4 3207
e86ce104
AM
3208 /* Flag function code and descriptor symbols. */
3209 unsigned int is_func:1;
3210 unsigned int is_func_descriptor:1;
908b32fc 3211 unsigned int fake:1;
411e1bfb 3212
c5614fa4
AM
3213 /* Whether global opd/toc sym has been adjusted or not.
3214 After ppc64_elf_edit_opd/ppc64_elf_edit_toc has run, this flag
3215 should be set for all globals defined in any opd/toc section. */
754021d0
AM
3216 unsigned int adjust_done:1;
3217
99877b66
AM
3218 /* Set if we twiddled this symbol to weak at some stage. */
3219 unsigned int was_undefined:1;
3220
411e1bfb 3221 /* Contexts in which symbol is used in the GOT (or TOC).
e7b938ca
AM
3222 TLS_GD .. TLS_EXPLICIT bits are or'd into the mask as the
3223 corresponding relocs are encountered during check_relocs.
3224 tls_optimize clears TLS_GD .. TLS_TPREL when optimizing to
3225 indicate the corresponding GOT entry type is not needed.
3226 tls_optimize may also set TLS_TPRELGD when a GD reloc turns into
3227 a TPREL one. We use a separate flag rather than setting TPREL
3228 just for convenience in distinguishing the two cases. */
3229#define TLS_GD 1 /* GD reloc. */
3230#define TLS_LD 2 /* LD reloc. */
3231#define TLS_TPREL 4 /* TPREL reloc, => IE. */
3232#define TLS_DTPREL 8 /* DTPREL reloc, => LD. */
3233#define TLS_TLS 16 /* Any TLS reloc. */
3234#define TLS_EXPLICIT 32 /* Marks TOC section TLS relocs. */
3235#define TLS_TPRELGD 64 /* TPREL reloc resulting from GD->IE. */
3236 char tls_mask;
65f38f15
AM
3237};
3238
3239/* ppc64 ELF linker hash table. */
3240
3241struct ppc_link_hash_table
3242{
3243 struct elf_link_hash_table elf;
3244
721956f4
AM
3245 /* The stub hash table. */
3246 struct bfd_hash_table stub_hash_table;
3247
3248 /* Another hash table for plt_branch stubs. */
3249 struct bfd_hash_table branch_hash_table;
3250
3251 /* Linker stub bfd. */
3252 bfd *stub_bfd;
3253
3254 /* Linker call-backs. */
4ce794b7
AM
3255 asection * (*add_stub_section) (const char *, asection *);
3256 void (*layout_sections_again) (void);
721956f4
AM
3257
3258 /* Array to keep track of which stub sections have been created, and
3259 information on stub grouping. */
3260 struct map_stub {
3261 /* This is the section to which stubs in the group will be attached. */
3262 asection *link_sec;
3263 /* The stub section. */
3264 asection *stub_sec;
ad8e1ba5
AM
3265 /* Along with elf_gp, specifies the TOC pointer used in this group. */
3266 bfd_vma toc_off;
721956f4
AM
3267 } *stub_group;
3268
ad8e1ba5
AM
3269 /* Temp used when calculating TOC pointers. */
3270 bfd_vma toc_curr;
3271
8f3bab57
AM
3272 /* Highest input section id. */
3273 int top_id;
3274
734b6cf9
AM
3275 /* Highest output section index. */
3276 int top_index;
3277
3278 /* List of input sections for each output section. */
3279 asection **input_list;
721956f4 3280
65f38f15 3281 /* Short-cuts to get to dynamic linker sections. */
4ce794b7 3282 asection *got;
4ce794b7
AM
3283 asection *plt;
3284 asection *relplt;
3285 asection *dynbss;
3286 asection *relbss;
3287 asection *glink;
82bd7b59 3288 asection *sfpr;
4ce794b7
AM
3289 asection *brlt;
3290 asection *relbrlt;
ec338859 3291
8387904d
AM
3292 /* Shortcut to .__tls_get_addr and __tls_get_addr. */
3293 struct ppc_link_hash_entry *tls_get_addr;
3294 struct ppc_link_hash_entry *tls_get_addr_fd;
411e1bfb 3295
9b5ecbd0
AM
3296 /* Statistics. */
3297 unsigned long stub_count[ppc_stub_plt_call];
3298
ee75fd95
AM
3299 /* Number of stubs against global syms. */
3300 unsigned long stub_globals;
3301
ad8e1ba5 3302 /* Set if we should emit symbols for stubs. */
99877b66 3303 unsigned int emit_stub_syms:1;
ad8e1ba5 3304
4c52953f
AM
3305 /* Support for multiple toc sections. */
3306 unsigned int no_multi_toc:1;
3307 unsigned int multi_toc_needed:1;
3308
5d1634d7 3309 /* Set on error. */
99877b66 3310 unsigned int stub_error:1;
721956f4
AM
3311
3312 /* Flag set when small branches are detected. Used to
3313 select suitable defaults for the stub group size. */
99877b66
AM
3314 unsigned int has_14bit_branch:1;
3315
3316 /* Temp used by ppc64_elf_check_directives. */
3317 unsigned int twiddled_syms:1;
721956f4
AM
3318
3319 /* Incremented every time we size stubs. */
3320 unsigned int stub_iteration;
5d1634d7 3321
ec338859
AM
3322 /* Small local sym to section mapping cache. */
3323 struct sym_sec_cache sym_sec;
65f38f15
AM
3324};
3325
4c52953f
AM
3326/* Rename some of the generic section flags to better document how they
3327 are used here. */
3328#define has_toc_reloc has_gp_reloc
3329#define makes_toc_func_call need_finalize_relax
3330#define call_check_in_progress reloc_done
3331
65f38f15
AM
3332/* Get the ppc64 ELF linker hash table from a link_info structure. */
3333
3334#define ppc_hash_table(p) \
3335 ((struct ppc_link_hash_table *) ((p)->hash))
3336
721956f4
AM
3337#define ppc_stub_hash_lookup(table, string, create, copy) \
3338 ((struct ppc_stub_hash_entry *) \
3339 bfd_hash_lookup ((table), (string), (create), (copy)))
3340
3341#define ppc_branch_hash_lookup(table, string, create, copy) \
3342 ((struct ppc_branch_hash_entry *) \
3343 bfd_hash_lookup ((table), (string), (create), (copy)))
3344
3345/* Create an entry in the stub hash table. */
3346
3347static struct bfd_hash_entry *
4ce794b7
AM
3348stub_hash_newfunc (struct bfd_hash_entry *entry,
3349 struct bfd_hash_table *table,
3350 const char *string)
721956f4
AM
3351{
3352 /* Allocate the structure if it has not already been allocated by a
3353 subclass. */
3354 if (entry == NULL)
3355 {
3356 entry = bfd_hash_allocate (table, sizeof (struct ppc_stub_hash_entry));
3357 if (entry == NULL)
3358 return entry;
3359 }
3360
3361 /* Call the allocation method of the superclass. */
3362 entry = bfd_hash_newfunc (entry, table, string);
3363 if (entry != NULL)
3364 {
3365 struct ppc_stub_hash_entry *eh;
3366
3367 /* Initialize the local fields. */
3368 eh = (struct ppc_stub_hash_entry *) entry;
ad8e1ba5 3369 eh->stub_type = ppc_stub_none;
721956f4
AM
3370 eh->stub_sec = NULL;
3371 eh->stub_offset = 0;
3372 eh->target_value = 0;
3373 eh->target_section = NULL;
721956f4
AM
3374 eh->h = NULL;
3375 eh->id_sec = NULL;
3376 }
3377
3378 return entry;
3379}
3380
3381/* Create an entry in the branch hash table. */
3382
3383static struct bfd_hash_entry *
4ce794b7
AM
3384branch_hash_newfunc (struct bfd_hash_entry *entry,
3385 struct bfd_hash_table *table,
3386 const char *string)
721956f4
AM
3387{
3388 /* Allocate the structure if it has not already been allocated by a
3389 subclass. */
3390 if (entry == NULL)
3391 {
3392 entry = bfd_hash_allocate (table, sizeof (struct ppc_branch_hash_entry));
3393 if (entry == NULL)
3394 return entry;
3395 }
3396
3397 /* Call the allocation method of the superclass. */
3398 entry = bfd_hash_newfunc (entry, table, string);
3399 if (entry != NULL)
3400 {
3401 struct ppc_branch_hash_entry *eh;
3402
3403 /* Initialize the local fields. */
3404 eh = (struct ppc_branch_hash_entry *) entry;
3405 eh->offset = 0;
3406 eh->iter = 0;
3407 }
3408
3409 return entry;
3410}
3411
65f38f15
AM
3412/* Create an entry in a ppc64 ELF linker hash table. */
3413
3414static struct bfd_hash_entry *
4ce794b7
AM
3415link_hash_newfunc (struct bfd_hash_entry *entry,
3416 struct bfd_hash_table *table,
3417 const char *string)
65f38f15
AM
3418{
3419 /* Allocate the structure if it has not already been allocated by a
3420 subclass. */
3421 if (entry == NULL)
3422 {
3423 entry = bfd_hash_allocate (table, sizeof (struct ppc_link_hash_entry));
3424 if (entry == NULL)
3425 return entry;
3426 }
3427
3428 /* Call the allocation method of the superclass. */
3429 entry = _bfd_elf_link_hash_newfunc (entry, table, string);
3430 if (entry != NULL)
3431 {
3432 struct ppc_link_hash_entry *eh = (struct ppc_link_hash_entry *) entry;
3433
908b32fc
AM
3434 memset (&eh->stub_cache, 0,
3435 (sizeof (struct ppc_link_hash_entry)
3436 - offsetof (struct ppc_link_hash_entry, stub_cache)));
65f38f15
AM
3437 }
3438
3439 return entry;
3440}
3441
3442/* Create a ppc64 ELF linker hash table. */
3443
3444static struct bfd_link_hash_table *
4ce794b7 3445ppc64_elf_link_hash_table_create (bfd *abfd)
65f38f15
AM
3446{
3447 struct ppc_link_hash_table *htab;
3448 bfd_size_type amt = sizeof (struct ppc_link_hash_table);
3449
4ce794b7 3450 htab = bfd_zmalloc (amt);
65f38f15
AM
3451 if (htab == NULL)
3452 return NULL;
3453
3454 if (! _bfd_elf_link_hash_table_init (&htab->elf, abfd, link_hash_newfunc))
3455 {
e2d34d7d 3456 free (htab);
65f38f15
AM
3457 return NULL;
3458 }
3459
721956f4
AM
3460 /* Init the stub hash table too. */
3461 if (!bfd_hash_table_init (&htab->stub_hash_table, stub_hash_newfunc))
3462 return NULL;
3463
3464 /* And the branch hash table. */
3465 if (!bfd_hash_table_init (&htab->branch_hash_table, branch_hash_newfunc))
3466 return NULL;
3467
3254fd24
AM
3468 /* Initializing two fields of the union is just cosmetic. We really
3469 only care about glist, but when compiled on a 32-bit host the
3470 bfd_vma fields are larger. Setting the bfd_vma to zero makes
3471 debugger inspection of these fields look nicer. */
3472 htab->elf.init_refcount.refcount = 0;
3473 htab->elf.init_refcount.glist = NULL;
3474 htab->elf.init_offset.offset = 0;
3475 htab->elf.init_offset.glist = NULL;
3476
65f38f15
AM
3477 return &htab->elf.root;
3478}
3479
721956f4
AM
3480/* Free the derived linker hash table. */
3481
3482static void
4ce794b7 3483ppc64_elf_link_hash_table_free (struct bfd_link_hash_table *hash)
721956f4
AM
3484{
3485 struct ppc_link_hash_table *ret = (struct ppc_link_hash_table *) hash;
3486
3487 bfd_hash_table_free (&ret->stub_hash_table);
3488 bfd_hash_table_free (&ret->branch_hash_table);
3489 _bfd_generic_link_hash_table_free (hash);
3490}
3491
e717da7e
AM
3492/* Satisfy the ELF linker by filling in some fields in our fake bfd. */
3493
3494void
3495ppc64_elf_init_stub_bfd (bfd *abfd, struct bfd_link_info *info)
3496{
3497 struct ppc_link_hash_table *htab;
3498
3499 elf_elfheader (abfd)->e_ident[EI_CLASS] = ELFCLASS64;
3500
3501/* Always hook our dynamic sections into the first bfd, which is the
3502 linker created stub bfd. This ensures that the GOT header is at
3503 the start of the output TOC section. */
3504 htab = ppc_hash_table (info);
3505 htab->stub_bfd = abfd;
3506 htab->elf.dynobj = abfd;
3507}
3508
721956f4
AM
3509/* Build a name for an entry in the stub hash table. */
3510
3511static char *
4ce794b7
AM
3512ppc_stub_name (const asection *input_section,
3513 const asection *sym_sec,
3514 const struct ppc_link_hash_entry *h,
3515 const Elf_Internal_Rela *rel)
721956f4
AM
3516{
3517 char *stub_name;
3518 bfd_size_type len;
3519
3520 /* rel->r_addend is actually 64 bit, but who uses more than +/- 2^31
3521 offsets from a sym as a branch target? In fact, we could
3522 probably assume the addend is always zero. */
3523 BFD_ASSERT (((int) rel->r_addend & 0xffffffff) == rel->r_addend);
3524
3525 if (h)
3526 {
3527 len = 8 + 1 + strlen (h->elf.root.root.string) + 1 + 8 + 1;
3528 stub_name = bfd_malloc (len);
3529 if (stub_name != NULL)
3530 {
97b639ba 3531 sprintf (stub_name, "%08x.%s+%x",
721956f4
AM
3532 input_section->id & 0xffffffff,
3533 h->elf.root.root.string,
3534 (int) rel->r_addend & 0xffffffff);
3535 }
3536 }
3537 else
3538 {
ad8e1ba5 3539 len = 8 + 1 + 8 + 1 + 8 + 1 + 8 + 1;
721956f4
AM
3540 stub_name = bfd_malloc (len);
3541 if (stub_name != NULL)
3542 {
97b639ba 3543 sprintf (stub_name, "%08x.%x:%x+%x",
721956f4
AM
3544 input_section->id & 0xffffffff,
3545 sym_sec->id & 0xffffffff,
3546 (int) ELF64_R_SYM (rel->r_info) & 0xffffffff,
3547 (int) rel->r_addend & 0xffffffff);
3548 }
3549 }
ee75fd95
AM
3550 if (stub_name[len - 2] == '+' && stub_name[len - 1] == '0')
3551 stub_name[len - 2] = 0;
721956f4
AM
3552 return stub_name;
3553}
3554
3555/* Look up an entry in the stub hash. Stub entries are cached because
3556 creating the stub name takes a bit of time. */
3557
3558static struct ppc_stub_hash_entry *
4ce794b7
AM
3559ppc_get_stub_entry (const asection *input_section,
3560 const asection *sym_sec,
039b3fef 3561 struct ppc_link_hash_entry *h,
4ce794b7
AM
3562 const Elf_Internal_Rela *rel,
3563 struct ppc_link_hash_table *htab)
721956f4
AM
3564{
3565 struct ppc_stub_hash_entry *stub_entry;
721956f4
AM
3566 const asection *id_sec;
3567
3568 /* If this input section is part of a group of sections sharing one
3569 stub section, then use the id of the first section in the group.
3570 Stub names need to include a section id, as there may well be
3571 more than one stub used to reach say, printf, and we need to
3572 distinguish between them. */
3573 id_sec = htab->stub_group[input_section->id].link_sec;
3574
3575 if (h != NULL && h->stub_cache != NULL
3576 && h->stub_cache->h == h
3577 && h->stub_cache->id_sec == id_sec)
3578 {
3579 stub_entry = h->stub_cache;
3580 }
3581 else
3582 {
3583 char *stub_name;
3584
3585 stub_name = ppc_stub_name (id_sec, sym_sec, h, rel);
3586 if (stub_name == NULL)
3587 return NULL;
3588
3589 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 3590 stub_name, FALSE, FALSE);
721956f4
AM
3591 if (h != NULL)
3592 h->stub_cache = stub_entry;
3593
3594 free (stub_name);
3595 }
3596
3597 return stub_entry;
3598}
3599
3600/* Add a new stub entry to the stub hash. Not all fields of the new
3601 stub entry are initialised. */
3602
3603static struct ppc_stub_hash_entry *
4ce794b7
AM
3604ppc_add_stub (const char *stub_name,
3605 asection *section,
3606 struct ppc_link_hash_table *htab)
721956f4
AM
3607{
3608 asection *link_sec;
3609 asection *stub_sec;
3610 struct ppc_stub_hash_entry *stub_entry;
3611
3612 link_sec = htab->stub_group[section->id].link_sec;
3613 stub_sec = htab->stub_group[section->id].stub_sec;
3614 if (stub_sec == NULL)
3615 {
3616 stub_sec = htab->stub_group[link_sec->id].stub_sec;
3617 if (stub_sec == NULL)
3618 {
d4c88bbb 3619 size_t namelen;
721956f4
AM
3620 bfd_size_type len;
3621 char *s_name;
3622
d4c88bbb
AM
3623 namelen = strlen (link_sec->name);
3624 len = namelen + sizeof (STUB_SUFFIX);
721956f4
AM
3625 s_name = bfd_alloc (htab->stub_bfd, len);
3626 if (s_name == NULL)
3627 return NULL;
3628
d4c88bbb
AM
3629 memcpy (s_name, link_sec->name, namelen);
3630 memcpy (s_name + namelen, STUB_SUFFIX, sizeof (STUB_SUFFIX));
721956f4
AM
3631 stub_sec = (*htab->add_stub_section) (s_name, link_sec);
3632 if (stub_sec == NULL)
3633 return NULL;
3634 htab->stub_group[link_sec->id].stub_sec = stub_sec;
3635 }
3636 htab->stub_group[section->id].stub_sec = stub_sec;
3637 }
3638
3639 /* Enter this entry into the linker stub hash table. */
3640 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table, stub_name,
b34976b6 3641 TRUE, FALSE);
721956f4
AM
3642 if (stub_entry == NULL)
3643 {
d003868e
AM
3644 (*_bfd_error_handler) (_("%B: cannot create stub entry %s"),
3645 section->owner, stub_name);
721956f4
AM
3646 return NULL;
3647 }
3648
3649 stub_entry->stub_sec = stub_sec;
3650 stub_entry->stub_offset = 0;
3651 stub_entry->id_sec = link_sec;
3652 return stub_entry;
3653}
3654
82bd7b59
AM
3655/* Create sections for linker generated code. */
3656
b34976b6 3657static bfd_boolean
4ce794b7 3658create_linkage_sections (bfd *dynobj, struct bfd_link_info *info)
82bd7b59
AM
3659{
3660 struct ppc_link_hash_table *htab;
3661 flagword flags;
3662
3663 htab = ppc_hash_table (info);
3664
3665 /* Create .sfpr for code to save and restore fp regs. */
3666 flags = (SEC_ALLOC | SEC_LOAD | SEC_CODE | SEC_READONLY
3667 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
721956f4 3668 htab->sfpr = bfd_make_section_anyway (dynobj, ".sfpr");
82bd7b59
AM
3669 if (htab->sfpr == NULL
3670 || ! bfd_set_section_flags (dynobj, htab->sfpr, flags)
3671 || ! bfd_set_section_alignment (dynobj, htab->sfpr, 2))
b34976b6 3672 return FALSE;
82bd7b59 3673
721956f4 3674 /* Create .glink for lazy dynamic linking support. */
4ce794b7
AM
3675 htab->glink = bfd_make_section_anyway (dynobj, ".glink");
3676 if (htab->glink == NULL
3677 || ! bfd_set_section_flags (dynobj, htab->glink, flags)
3678 || ! bfd_set_section_alignment (dynobj, htab->glink, 2))
b34976b6 3679 return FALSE;
82bd7b59 3680
721956f4
AM
3681 /* Create .branch_lt for plt_branch stubs. */
3682 flags = (SEC_ALLOC | SEC_LOAD
3683 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4ce794b7
AM
3684 htab->brlt = bfd_make_section_anyway (dynobj, ".branch_lt");
3685 if (htab->brlt == NULL
3686 || ! bfd_set_section_flags (dynobj, htab->brlt, flags)
3687 || ! bfd_set_section_alignment (dynobj, htab->brlt, 3))
b34976b6 3688 return FALSE;
721956f4 3689
ee75fd95 3690 if (info->shared || info->emitrelocations)
721956f4
AM
3691 {
3692 flags = (SEC_ALLOC | SEC_LOAD | SEC_READONLY
3693 | SEC_HAS_CONTENTS | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4ce794b7
AM
3694 htab->relbrlt = bfd_make_section_anyway (dynobj, ".rela.branch_lt");
3695 if (!htab->relbrlt
3696 || ! bfd_set_section_flags (dynobj, htab->relbrlt, flags)
3697 || ! bfd_set_section_alignment (dynobj, htab->relbrlt, 3))
b34976b6 3698 return FALSE;
721956f4 3699 }
b34976b6 3700 return TRUE;
82bd7b59
AM
3701}
3702
e717da7e
AM
3703/* Create .got and .rela.got sections in ABFD, and .got in dynobj if
3704 not already done. */
65f38f15 3705
b34976b6 3706static bfd_boolean
e717da7e 3707create_got_section (bfd *abfd, struct bfd_link_info *info)
65f38f15 3708{
e717da7e
AM
3709 asection *got, *relgot;
3710 flagword flags;
3711 struct ppc_link_hash_table *htab = ppc_hash_table (info);
65f38f15 3712
4ce794b7 3713 if (!htab->got)
e717da7e
AM
3714 {
3715 if (! _bfd_elf_create_got_section (htab->elf.dynobj, info))
3716 return FALSE;
3717
3718 htab->got = bfd_get_section_by_name (htab->elf.dynobj, ".got");
3719 if (!htab->got)
3720 abort ();
3721 }
3722
3723 flags = (SEC_ALLOC | SEC_LOAD | SEC_HAS_CONTENTS | SEC_IN_MEMORY
3724 | SEC_LINKER_CREATED);
3725
3726 got = bfd_make_section (abfd, ".got");
3727 if (!got
3728 || !bfd_set_section_flags (abfd, got, flags)
3729 || !bfd_set_section_alignment (abfd, got, 3))
3730 return FALSE;
65f38f15 3731
e717da7e
AM
3732 relgot = bfd_make_section (abfd, ".rela.got");
3733 if (!relgot
3734 || ! bfd_set_section_flags (abfd, relgot, flags | SEC_READONLY)
3735 || ! bfd_set_section_alignment (abfd, relgot, 3))
b34976b6 3736 return FALSE;
e717da7e
AM
3737
3738 ppc64_elf_tdata (abfd)->got = got;
3739 ppc64_elf_tdata (abfd)->relgot = relgot;
b34976b6 3740 return TRUE;
65f38f15 3741}
5bd4f169 3742
82bd7b59 3743/* Create the dynamic sections, and set up shortcuts. */
5bd4f169 3744
b34976b6 3745static bfd_boolean
4ce794b7 3746ppc64_elf_create_dynamic_sections (bfd *dynobj, struct bfd_link_info *info)
5bd4f169 3747{
65f38f15 3748 struct ppc_link_hash_table *htab;
5bd4f169 3749
65f38f15 3750 if (!_bfd_elf_create_dynamic_sections (dynobj, info))
b34976b6 3751 return FALSE;
65f38f15 3752
e717da7e
AM
3753 htab = ppc_hash_table (info);
3754 if (!htab->got)
3755 htab->got = bfd_get_section_by_name (dynobj, ".got");
4ce794b7
AM
3756 htab->plt = bfd_get_section_by_name (dynobj, ".plt");
3757 htab->relplt = bfd_get_section_by_name (dynobj, ".rela.plt");
3758 htab->dynbss = bfd_get_section_by_name (dynobj, ".dynbss");
65f38f15 3759 if (!info->shared)
4ce794b7 3760 htab->relbss = bfd_get_section_by_name (dynobj, ".rela.bss");
65f38f15 3761
e717da7e 3762 if (!htab->got || !htab->plt || !htab->relplt || !htab->dynbss
4ce794b7 3763 || (!info->shared && !htab->relbss))
65f38f15
AM
3764 abort ();
3765
b34976b6 3766 return TRUE;
5bd4f169
AM
3767}
3768
65f38f15
AM
3769/* Copy the extra info we tack onto an elf_link_hash_entry. */
3770
3771static void
9c5bfbb7
AM
3772ppc64_elf_copy_indirect_symbol
3773 (const struct elf_backend_data *bed ATTRIBUTE_UNUSED,
3774 struct elf_link_hash_entry *dir,
3775 struct elf_link_hash_entry *ind)
65f38f15
AM
3776{
3777 struct ppc_link_hash_entry *edir, *eind;
3778
3779 edir = (struct ppc_link_hash_entry *) dir;
3780 eind = (struct ppc_link_hash_entry *) ind;
3781
411e1bfb 3782 /* Copy over any dynamic relocs we may have on the indirect sym. */
bbd7ec4a 3783 if (eind->dyn_relocs != NULL)
65f38f15 3784 {
bbd7ec4a
AM
3785 if (edir->dyn_relocs != NULL)
3786 {
3787 struct ppc_dyn_relocs **pp;
3788 struct ppc_dyn_relocs *p;
3789
411e1bfb 3790 if (eind->elf.root.type == bfd_link_hash_indirect)
bbd7ec4a
AM
3791 abort ();
3792
3793 /* Add reloc counts against the weak sym to the strong sym
3794 list. Merge any entries against the same section. */
3795 for (pp = &eind->dyn_relocs; (p = *pp) != NULL; )
3796 {
3797 struct ppc_dyn_relocs *q;
3798
3799 for (q = edir->dyn_relocs; q != NULL; q = q->next)
3800 if (q->sec == p->sec)
3801 {
3802 q->pc_count += p->pc_count;
3803 q->count += p->count;
3804 *pp = p->next;
3805 break;
3806 }
3807 if (q == NULL)
3808 pp = &p->next;
3809 }
3810 *pp = edir->dyn_relocs;
3811 }
3812
65f38f15
AM
3813 edir->dyn_relocs = eind->dyn_relocs;
3814 eind->dyn_relocs = NULL;
3815 }
65f38f15 3816
6349e628
AM
3817 edir->is_func |= eind->is_func;
3818 edir->is_func_descriptor |= eind->is_func_descriptor;
58ac9f71 3819 edir->tls_mask |= eind->tls_mask;
6349e628 3820
81848ca0 3821 /* If called to transfer flags for a weakdef during processing
f5385ebf 3822 of elf_adjust_dynamic_symbol, don't copy NON_GOT_REF.
81848ca0 3823 We clear it ourselves for ELIMINATE_COPY_RELOCS. */
f5385ebf
AM
3824 if (!(ELIMINATE_COPY_RELOCS
3825 && eind->elf.root.type != bfd_link_hash_indirect
3826 && edir->elf.dynamic_adjusted))
3827 edir->elf.non_got_ref |= eind->elf.non_got_ref;
81848ca0 3828
f5385ebf
AM
3829 edir->elf.ref_dynamic |= eind->elf.ref_dynamic;
3830 edir->elf.ref_regular |= eind->elf.ref_regular;
3831 edir->elf.ref_regular_nonweak |= eind->elf.ref_regular_nonweak;
3832 edir->elf.needs_plt |= eind->elf.needs_plt;
6349e628
AM
3833
3834 /* If we were called to copy over info for a weak sym, that's all. */
3835 if (eind->elf.root.type != bfd_link_hash_indirect)
3836 return;
3837
81848ca0
AM
3838 /* Copy over got entries that we may have already seen to the
3839 symbol which just became indirect. */
411e1bfb
AM
3840 if (eind->elf.got.glist != NULL)
3841 {
3842 if (edir->elf.got.glist != NULL)
3843 {
3844 struct got_entry **entp;
3845 struct got_entry *ent;
3846
3847 for (entp = &eind->elf.got.glist; (ent = *entp) != NULL; )
3848 {
3849 struct got_entry *dent;
3850
3851 for (dent = edir->elf.got.glist; dent != NULL; dent = dent->next)
3852 if (dent->addend == ent->addend
e717da7e 3853 && dent->owner == ent->owner
411e1bfb
AM
3854 && dent->tls_type == ent->tls_type)
3855 {
3856 dent->got.refcount += ent->got.refcount;
3857 *entp = ent->next;
3858 break;
3859 }
3860 if (dent == NULL)
3861 entp = &ent->next;
3862 }
3863 *entp = edir->elf.got.glist;
3864 }
3865
3866 edir->elf.got.glist = eind->elf.got.glist;
3867 eind->elf.got.glist = NULL;
3868 }
3869
3870 /* And plt entries. */
3871 if (eind->elf.plt.plist != NULL)
3872 {
3873 if (edir->elf.plt.plist != NULL)
3874 {
3875 struct plt_entry **entp;
3876 struct plt_entry *ent;
3877
3878 for (entp = &eind->elf.plt.plist; (ent = *entp) != NULL; )
3879 {
3880 struct plt_entry *dent;
3881
3882 for (dent = edir->elf.plt.plist; dent != NULL; dent = dent->next)
3883 if (dent->addend == ent->addend)
3884 {
3885 dent->plt.refcount += ent->plt.refcount;
3886 *entp = ent->next;
3887 break;
3888 }
3889 if (dent == NULL)
3890 entp = &ent->next;
3891 }
3892 *entp = edir->elf.plt.plist;
3893 }
3894
3895 edir->elf.plt.plist = eind->elf.plt.plist;
3896 eind->elf.plt.plist = NULL;
3897 }
3898
411e1bfb
AM
3899 if (edir->elf.dynindx == -1)
3900 {
3901 edir->elf.dynindx = eind->elf.dynindx;
3902 edir->elf.dynstr_index = eind->elf.dynstr_index;
3903 eind->elf.dynindx = -1;
3904 eind->elf.dynstr_index = 0;
3905 }
3906 else
3907 BFD_ASSERT (eind->elf.dynindx == -1);
3908}
3909
8387904d
AM
3910/* Find the function descriptor hash entry from the given function code
3911 hash entry FH. Link the entries via their OH fields. */
3912
3913static struct ppc_link_hash_entry *
3914get_fdh (struct ppc_link_hash_entry *fh, struct ppc_link_hash_table *htab)
3915{
3916 struct ppc_link_hash_entry *fdh = fh->oh;
3917
3918 if (fdh == NULL)
3919 {
3920 const char *fd_name = fh->elf.root.root.string + 1;
3921
3922 fdh = (struct ppc_link_hash_entry *)
3923 elf_link_hash_lookup (&htab->elf, fd_name, FALSE, FALSE, FALSE);
3924 if (fdh != NULL)
3925 {
3926 fdh->is_func_descriptor = 1;
3927 fdh->oh = fh;
3928 fh->is_func = 1;
3929 fh->oh = fdh;
3930 }
3931 }
3932
3933 return fdh;
3934}
3935
bb700d78
AM
3936/* Make a fake function descriptor sym for the code sym FH. */
3937
3938static struct ppc_link_hash_entry *
3939make_fdh (struct bfd_link_info *info,
908b32fc 3940 struct ppc_link_hash_entry *fh)
bb700d78
AM
3941{
3942 bfd *abfd;
3943 asymbol *newsym;
3944 struct bfd_link_hash_entry *bh;
3945 struct ppc_link_hash_entry *fdh;
3946
3947 abfd = fh->elf.root.u.undef.abfd;
3948 newsym = bfd_make_empty_symbol (abfd);
3949 newsym->name = fh->elf.root.root.string + 1;
3950 newsym->section = bfd_und_section_ptr;
3951 newsym->value = 0;
908b32fc 3952 newsym->flags = BSF_WEAK;
bb700d78
AM
3953
3954 bh = NULL;
3955 if (!_bfd_generic_link_add_one_symbol (info, abfd, newsym->name,
3956 newsym->flags, newsym->section,
3957 newsym->value, NULL, FALSE, FALSE,
3958 &bh))
3959 return NULL;
3960
3961 fdh = (struct ppc_link_hash_entry *) bh;
3962 fdh->elf.non_elf = 0;
908b32fc
AM
3963 fdh->fake = 1;
3964 fdh->is_func_descriptor = 1;
3965 fdh->oh = fh;
3966 fh->is_func = 1;
3967 fh->oh = fdh;
bb700d78
AM
3968 return fdh;
3969}
3970
8387904d
AM
3971/* Hacks to support old ABI code.
3972 When making function calls, old ABI code references function entry
3973 points (dot symbols), while new ABI code references the function
3974 descriptor symbol. We need to make any combination of reference and
3975 definition work together, without breaking archive linking.
3976
3977 For a defined function "foo" and an undefined call to "bar":
3978 An old object defines "foo" and ".foo", references ".bar" (possibly
3979 "bar" too).
3980 A new object defines "foo" and references "bar".
3981
3982 A new object thus has no problem with its undefined symbols being
3983 satisfied by definitions in an old object. On the other hand, the
3984 old object won't have ".bar" satisfied by a new object. */
3985
3986/* Fix function descriptor symbols defined in .opd sections to be
3987 function type. */
555cd476
AM
3988
3989static bfd_boolean
3990ppc64_elf_add_symbol_hook (bfd *ibfd ATTRIBUTE_UNUSED,
3991 struct bfd_link_info *info ATTRIBUTE_UNUSED,
3992 Elf_Internal_Sym *isym,
3993 const char **name ATTRIBUTE_UNUSED,
3994 flagword *flags ATTRIBUTE_UNUSED,
3995 asection **sec,
3996 bfd_vma *value ATTRIBUTE_UNUSED)
3997{
8843416a
AM
3998 if (*sec != NULL
3999 && strcmp (bfd_get_section_name (ibfd, *sec), ".opd") == 0)
555cd476
AM
4000 isym->st_info = ELF_ST_INFO (ELF_ST_BIND (isym->st_info), STT_FUNC);
4001 return TRUE;
4002}
4003
8387904d 4004/* This function makes an old ABI object reference to ".bar" cause the
908b32fc
AM
4005 inclusion of a new ABI object archive that defines "bar".
4006 NAME is a symbol defined in an archive. Return a symbol in the hash
4007 table that might be satisfied by the archive symbols. */
8387904d
AM
4008
4009static struct elf_link_hash_entry *
4010ppc64_elf_archive_symbol_lookup (bfd *abfd,
4011 struct bfd_link_info *info,
4012 const char *name)
4013{
4014 struct elf_link_hash_entry *h;
4015 char *dot_name;
4016 size_t len;
4017
4018 h = _bfd_elf_archive_symbol_lookup (abfd, info, name);
908b32fc
AM
4019 if (h != NULL
4020 /* Don't return this sym if it is a fake function descriptor
4021 created by add_symbol_adjust. */
4022 && !(h->root.type == bfd_link_hash_undefweak
4023 && ((struct ppc_link_hash_entry *) h)->fake))
8387904d
AM
4024 return h;
4025
4026 if (name[0] == '.')
4027 return h;
4028
4029 len = strlen (name);
4030 dot_name = bfd_alloc (abfd, len + 2);
4031 if (dot_name == NULL)
4032 return (struct elf_link_hash_entry *) 0 - 1;
4033 dot_name[0] = '.';
4034 memcpy (dot_name + 1, name, len + 1);
4035 h = _bfd_elf_archive_symbol_lookup (abfd, info, dot_name);
4036 bfd_release (abfd, dot_name);
4037 return h;
4038}
4039
4040/* This function satisfies all old ABI object references to ".bar" if a
99877b66
AM
4041 new ABI object defines "bar". Well, at least, undefined dot symbols
4042 are made weak. This stops later archive searches from including an
4043 object if we already have a function descriptor definition. It also
35b0ce59
AM
4044 prevents the linker complaining about undefined symbols.
4045 We also check and correct mismatched symbol visibility here. The
4046 most restrictive visibility of the function descriptor and the
4047 function entry symbol is used. */
8387904d 4048
bb700d78
AM
4049struct add_symbol_adjust_data
4050{
4051 struct bfd_link_info *info;
4052 bfd_boolean ok;
4053};
4054
8387904d
AM
4055static bfd_boolean
4056add_symbol_adjust (struct elf_link_hash_entry *h, void *inf)
4057{
bb700d78 4058 struct add_symbol_adjust_data *data;
8387904d 4059 struct ppc_link_hash_table *htab;
99877b66 4060 struct ppc_link_hash_entry *eh;
8387904d
AM
4061 struct ppc_link_hash_entry *fdh;
4062
4063 if (h->root.type == bfd_link_hash_indirect)
4064 return TRUE;
4065
4066 if (h->root.type == bfd_link_hash_warning)
4067 h = (struct elf_link_hash_entry *) h->root.u.i.link;
4068
35b0ce59 4069 if (h->root.root.string[0] != '.')
8387904d
AM
4070 return TRUE;
4071
bb700d78
AM
4072 data = inf;
4073 htab = ppc_hash_table (data->info);
99877b66
AM
4074 eh = (struct ppc_link_hash_entry *) h;
4075 fdh = get_fdh (eh, htab);
bb700d78 4076 if (fdh == NULL
c4f68ce3 4077 && !data->info->relocatable
bb700d78
AM
4078 && (eh->elf.root.type == bfd_link_hash_undefined
4079 || eh->elf.root.type == bfd_link_hash_undefweak)
4080 && eh->elf.ref_regular)
4081 {
4082 /* Make an undefweak function descriptor sym, which is enough to
4083 pull in an --as-needed shared lib, but won't cause link
4084 errors. Archives are handled elsewhere. */
908b32fc 4085 fdh = make_fdh (data->info, eh);
bb700d78
AM
4086 if (fdh == NULL)
4087 data->ok = FALSE;
4088 else
4089 fdh->elf.ref_regular = 1;
4090 }
c4f68ce3
AM
4091 else if (fdh != NULL
4092 && (fdh->elf.root.type == bfd_link_hash_defined
4093 || fdh->elf.root.type == bfd_link_hash_defweak))
8387904d 4094 {
35b0ce59
AM
4095 unsigned entry_vis = ELF_ST_VISIBILITY (eh->elf.other) - 1;
4096 unsigned descr_vis = ELF_ST_VISIBILITY (fdh->elf.other) - 1;
4097 if (entry_vis < descr_vis)
4098 fdh->elf.other += entry_vis - descr_vis;
4099 else if (entry_vis > descr_vis)
4100 eh->elf.other += descr_vis - entry_vis;
4101
c4f68ce3 4102 if (eh->elf.root.type == bfd_link_hash_undefined)
35b0ce59
AM
4103 {
4104 eh->elf.root.type = bfd_link_hash_undefweak;
4105 eh->was_undefined = 1;
4106 htab->twiddled_syms = 1;
4107 }
8387904d 4108 }
99877b66 4109
8387904d
AM
4110 return TRUE;
4111}
4112
4113static bfd_boolean
4114ppc64_elf_check_directives (bfd *abfd ATTRIBUTE_UNUSED,
4115 struct bfd_link_info *info)
4116{
99877b66 4117 struct ppc_link_hash_table *htab;
bb700d78 4118 struct add_symbol_adjust_data data;
99877b66
AM
4119
4120 htab = ppc_hash_table (info);
ee75fd95 4121 if (!is_ppc64_elf_target (htab->elf.root.creator))
35b0ce59
AM
4122 return TRUE;
4123
bb700d78
AM
4124 data.info = info;
4125 data.ok = TRUE;
4126 elf_link_hash_traverse (&htab->elf, add_symbol_adjust, &data);
99877b66
AM
4127
4128 /* We need to fix the undefs list for any syms we have twiddled to
4129 undef_weak. */
4130 if (htab->twiddled_syms)
4131 {
77cfaee6 4132 bfd_link_repair_undef_list (&htab->elf.root);
99877b66
AM
4133 htab->twiddled_syms = 0;
4134 }
bb700d78 4135 return data.ok;
8387904d
AM
4136}
4137
411e1bfb 4138static bfd_boolean
4ce794b7
AM
4139update_local_sym_info (bfd *abfd, Elf_Internal_Shdr *symtab_hdr,
4140 unsigned long r_symndx, bfd_vma r_addend, int tls_type)
411e1bfb
AM
4141{
4142 struct got_entry **local_got_ents = elf_local_got_ents (abfd);
e7b938ca 4143 char *local_got_tls_masks;
411e1bfb
AM
4144
4145 if (local_got_ents == NULL)
4146 {
4147 bfd_size_type size = symtab_hdr->sh_info;
4148
e7b938ca 4149 size *= sizeof (*local_got_ents) + sizeof (*local_got_tls_masks);
4ce794b7 4150 local_got_ents = bfd_zalloc (abfd, size);
411e1bfb
AM
4151 if (local_got_ents == NULL)
4152 return FALSE;
4153 elf_local_got_ents (abfd) = local_got_ents;
4154 }
4155
4156 if ((tls_type & TLS_EXPLICIT) == 0)
4157 {
4158 struct got_entry *ent;
4159
4160 for (ent = local_got_ents[r_symndx]; ent != NULL; ent = ent->next)
e717da7e
AM
4161 if (ent->addend == r_addend
4162 && ent->owner == abfd
4163 && ent->tls_type == tls_type)
411e1bfb
AM
4164 break;
4165 if (ent == NULL)
4166 {
4167 bfd_size_type amt = sizeof (*ent);
4ce794b7 4168 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4169 if (ent == NULL)
4170 return FALSE;
4171 ent->next = local_got_ents[r_symndx];
4172 ent->addend = r_addend;
e717da7e 4173 ent->owner = abfd;
411e1bfb
AM
4174 ent->tls_type = tls_type;
4175 ent->got.refcount = 0;
4176 local_got_ents[r_symndx] = ent;
4177 }
4178 ent->got.refcount += 1;
4179 }
4180
e7b938ca
AM
4181 local_got_tls_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
4182 local_got_tls_masks[r_symndx] |= tls_type;
411e1bfb 4183 return TRUE;
65f38f15
AM
4184}
4185
411e1bfb 4186static bfd_boolean
4ce794b7 4187update_plt_info (bfd *abfd, struct ppc_link_hash_entry *eh, bfd_vma addend)
1e2f5b6e 4188{
411e1bfb 4189 struct plt_entry *ent;
1e2f5b6e 4190
411e1bfb
AM
4191 for (ent = eh->elf.plt.plist; ent != NULL; ent = ent->next)
4192 if (ent->addend == addend)
4193 break;
4194 if (ent == NULL)
1e2f5b6e 4195 {
411e1bfb 4196 bfd_size_type amt = sizeof (*ent);
4ce794b7 4197 ent = bfd_alloc (abfd, amt);
411e1bfb
AM
4198 if (ent == NULL)
4199 return FALSE;
4200 ent->next = eh->elf.plt.plist;
4201 ent->addend = addend;
4202 ent->plt.refcount = 0;
4203 eh->elf.plt.plist = ent;
1e2f5b6e 4204 }
411e1bfb 4205 ent->plt.refcount += 1;
f5385ebf 4206 eh->elf.needs_plt = 1;
411e1bfb 4207 eh->is_func = 1;
b34976b6 4208 return TRUE;
1e2f5b6e
AM
4209}
4210
5bd4f169 4211/* Look through the relocs for a section during the first phase, and
65f38f15 4212 calculate needed space in the global offset table, procedure
5d1634d7 4213 linkage table, and dynamic reloc sections. */
5bd4f169 4214
b34976b6 4215static bfd_boolean
4ce794b7
AM
4216ppc64_elf_check_relocs (bfd *abfd, struct bfd_link_info *info,
4217 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 4218{
65f38f15 4219 struct ppc_link_hash_table *htab;
5bd4f169
AM
4220 Elf_Internal_Shdr *symtab_hdr;
4221 struct elf_link_hash_entry **sym_hashes, **sym_hashes_end;
4222 const Elf_Internal_Rela *rel;
4223 const Elf_Internal_Rela *rel_end;
5bd4f169 4224 asection *sreloc;
1e2f5b6e 4225 asection **opd_sym_map;
5bd4f169 4226
1049f94e 4227 if (info->relocatable)
b34976b6 4228 return TRUE;
5bd4f169 4229
680a3378
AM
4230 /* Don't do anything special with non-loaded, non-alloced sections.
4231 In particular, any relocs in such sections should not affect GOT
4232 and PLT reference counting (ie. we don't allow them to create GOT
4233 or PLT entries), there's no possibility or desire to optimize TLS
4234 relocs, and there's not much point in propagating relocs to shared
4235 libs that the dynamic linker won't relocate. */
4236 if ((sec->flags & SEC_ALLOC) == 0)
4237 return TRUE;
4238
65f38f15 4239 htab = ppc_hash_table (info);
5bd4f169 4240 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5bd4f169
AM
4241
4242 sym_hashes = elf_sym_hashes (abfd);
4243 sym_hashes_end = (sym_hashes
1e2f5b6e
AM
4244 + symtab_hdr->sh_size / sizeof (Elf64_External_Sym)
4245 - symtab_hdr->sh_info);
5bd4f169
AM
4246
4247 sreloc = NULL;
1e2f5b6e
AM
4248 opd_sym_map = NULL;
4249 if (strcmp (bfd_get_section_name (abfd, sec), ".opd") == 0)
4250 {
4251 /* Garbage collection needs some extra help with .opd sections.
4252 We don't want to necessarily keep everything referenced by
4253 relocs in .opd, as that would keep all functions. Instead,
4254 if we reference an .opd symbol (a function descriptor), we
4255 want to keep the function code symbol's section. This is
4256 easy for global symbols, but for local syms we need to keep
4257 information about the associated function section. Later, if
4258 edit_opd deletes entries, we'll use this array to adjust
4259 local syms in .opd. */
4260 union opd_info {
4261 asection *func_section;
4262 long entry_adjust;
4263 };
4264 bfd_size_type amt;
4265
3f764659 4266 amt = sec->size * sizeof (union opd_info) / 8;
4ce794b7 4267 opd_sym_map = bfd_zalloc (abfd, amt);
1e2f5b6e 4268 if (opd_sym_map == NULL)
b34976b6 4269 return FALSE;
f0abc2a1 4270 ppc64_elf_section_data (sec)->opd.func_sec = opd_sym_map;
1e2f5b6e 4271 }
5bd4f169 4272
82bd7b59
AM
4273 if (htab->sfpr == NULL
4274 && !create_linkage_sections (htab->elf.dynobj, info))
b34976b6 4275 return FALSE;
82bd7b59 4276
5bd4f169
AM
4277 rel_end = relocs + sec->reloc_count;
4278 for (rel = relocs; rel < rel_end; rel++)
4279 {
4280 unsigned long r_symndx;
4281 struct elf_link_hash_entry *h;
04c9666a 4282 enum elf_ppc64_reloc_type r_type;
411e1bfb 4283 int tls_type = 0;
5bd4f169
AM
4284
4285 r_symndx = ELF64_R_SYM (rel->r_info);
4286 if (r_symndx < symtab_hdr->sh_info)
4287 h = NULL;
4288 else
4289 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
4290
4ce794b7 4291 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 4292 switch (r_type)
5bd4f169 4293 {
411e1bfb
AM
4294 case R_PPC64_GOT_TLSLD16:
4295 case R_PPC64_GOT_TLSLD16_LO:
4296 case R_PPC64_GOT_TLSLD16_HI:
4297 case R_PPC64_GOT_TLSLD16_HA:
e717da7e 4298 ppc64_tlsld_got (abfd)->refcount += 1;
951fd09b 4299 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
4300 goto dogottls;
4301
4302 case R_PPC64_GOT_TLSGD16:
4303 case R_PPC64_GOT_TLSGD16_LO:
4304 case R_PPC64_GOT_TLSGD16_HI:
4305 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 4306 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
4307 goto dogottls;
4308
4309 case R_PPC64_GOT_TPREL16_DS:
4310 case R_PPC64_GOT_TPREL16_LO_DS:
4311 case R_PPC64_GOT_TPREL16_HI:
4312 case R_PPC64_GOT_TPREL16_HA:
4313 if (info->shared)
4314 info->flags |= DF_STATIC_TLS;
4315 tls_type = TLS_TLS | TLS_TPREL;
4316 goto dogottls;
4317
4318 case R_PPC64_GOT_DTPREL16_DS:
4319 case R_PPC64_GOT_DTPREL16_LO_DS:
4320 case R_PPC64_GOT_DTPREL16_HI:
4321 case R_PPC64_GOT_DTPREL16_HA:
4322 tls_type = TLS_TLS | TLS_DTPREL;
4323 dogottls:
4324 sec->has_tls_reloc = 1;
4325 /* Fall thru */
4326
5bd4f169 4327 case R_PPC64_GOT16:
5bd4f169 4328 case R_PPC64_GOT16_DS:
65f38f15
AM
4329 case R_PPC64_GOT16_HA:
4330 case R_PPC64_GOT16_HI:
4331 case R_PPC64_GOT16_LO:
5bd4f169 4332 case R_PPC64_GOT16_LO_DS:
65f38f15 4333 /* This symbol requires a global offset table entry. */
4c52953f 4334 sec->has_toc_reloc = 1;
e717da7e
AM
4335 if (ppc64_elf_tdata (abfd)->got == NULL
4336 && !create_got_section (abfd, info))
b34976b6 4337 return FALSE;
5bd4f169
AM
4338
4339 if (h != NULL)
4340 {
411e1bfb
AM
4341 struct ppc_link_hash_entry *eh;
4342 struct got_entry *ent;
65f38f15 4343
411e1bfb
AM
4344 eh = (struct ppc_link_hash_entry *) h;
4345 for (ent = eh->elf.got.glist; ent != NULL; ent = ent->next)
4346 if (ent->addend == rel->r_addend
e717da7e 4347 && ent->owner == abfd
411e1bfb
AM
4348 && ent->tls_type == tls_type)
4349 break;
4350 if (ent == NULL)
5bd4f169 4351 {
411e1bfb 4352 bfd_size_type amt = sizeof (*ent);
4ce794b7 4353 ent = bfd_alloc (abfd, amt);
411e1bfb 4354 if (ent == NULL)
b34976b6 4355 return FALSE;
411e1bfb
AM
4356 ent->next = eh->elf.got.glist;
4357 ent->addend = rel->r_addend;
e717da7e 4358 ent->owner = abfd;
411e1bfb
AM
4359 ent->tls_type = tls_type;
4360 ent->got.refcount = 0;
4361 eh->elf.got.glist = ent;
5bd4f169 4362 }
411e1bfb 4363 ent->got.refcount += 1;
e7b938ca 4364 eh->tls_mask |= tls_type;
5bd4f169 4365 }
411e1bfb
AM
4366 else
4367 /* This is a global offset table entry for a local symbol. */
4368 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4369 rel->r_addend, tls_type))
4370 return FALSE;
5bd4f169
AM
4371 break;
4372
5bd4f169 4373 case R_PPC64_PLT16_HA:
65f38f15
AM
4374 case R_PPC64_PLT16_HI:
4375 case R_PPC64_PLT16_LO:
4376 case R_PPC64_PLT32:
4377 case R_PPC64_PLT64:
5bd4f169 4378 /* This symbol requires a procedure linkage table entry. We
3fad3c7c
AM
4379 actually build the entry in adjust_dynamic_symbol,
4380 because this might be a case of linking PIC code without
4381 linking in any dynamic objects, in which case we don't
4382 need to generate a procedure linkage table after all. */
5bd4f169
AM
4383 if (h == NULL)
4384 {
4385 /* It does not make sense to have a procedure linkage
3fad3c7c 4386 table entry for a local symbol. */
5bd4f169 4387 bfd_set_error (bfd_error_bad_value);
b34976b6 4388 return FALSE;
5bd4f169 4389 }
411e1bfb
AM
4390 else
4391 if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4392 rel->r_addend))
4393 return FALSE;
5bd4f169
AM
4394 break;
4395
4396 /* The following relocations don't need to propagate the
4397 relocation if linking a shared object since they are
4398 section relative. */
4399 case R_PPC64_SECTOFF:
4400 case R_PPC64_SECTOFF_LO:
4401 case R_PPC64_SECTOFF_HI:
4402 case R_PPC64_SECTOFF_HA:
4403 case R_PPC64_SECTOFF_DS:
4404 case R_PPC64_SECTOFF_LO_DS:
411e1bfb
AM
4405 case R_PPC64_DTPREL16:
4406 case R_PPC64_DTPREL16_LO:
4407 case R_PPC64_DTPREL16_HI:
4408 case R_PPC64_DTPREL16_HA:
4409 case R_PPC64_DTPREL16_DS:
4410 case R_PPC64_DTPREL16_LO_DS:
4411 case R_PPC64_DTPREL16_HIGHER:
4412 case R_PPC64_DTPREL16_HIGHERA:
4413 case R_PPC64_DTPREL16_HIGHEST:
4414 case R_PPC64_DTPREL16_HIGHESTA:
5bd4f169
AM
4415 break;
4416
ad8e1ba5
AM
4417 /* Nor do these. */
4418 case R_PPC64_TOC16:
4419 case R_PPC64_TOC16_LO:
4420 case R_PPC64_TOC16_HI:
4421 case R_PPC64_TOC16_HA:
4422 case R_PPC64_TOC16_DS:
4423 case R_PPC64_TOC16_LO_DS:
4c52953f 4424 sec->has_toc_reloc = 1;
ad8e1ba5
AM
4425 break;
4426
5bd4f169
AM
4427 /* This relocation describes the C++ object vtable hierarchy.
4428 Reconstruct it for later use during GC. */
4429 case R_PPC64_GNU_VTINHERIT:
c152c796 4430 if (!bfd_elf_gc_record_vtinherit (abfd, sec, h, rel->r_offset))
b34976b6 4431 return FALSE;
5bd4f169
AM
4432 break;
4433
4434 /* This relocation describes which C++ vtable entries are actually
4435 used. Record for later use during GC. */
4436 case R_PPC64_GNU_VTENTRY:
c152c796 4437 if (!bfd_elf_gc_record_vtentry (abfd, sec, h, rel->r_addend))
b34976b6 4438 return FALSE;
5bd4f169
AM
4439 break;
4440
721956f4
AM
4441 case R_PPC64_REL14:
4442 case R_PPC64_REL14_BRTAKEN:
4443 case R_PPC64_REL14_BRNTAKEN:
4444 htab->has_14bit_branch = 1;
4445 /* Fall through. */
4446
5d1634d7 4447 case R_PPC64_REL24:
8387904d 4448 if (h != NULL)
5d1634d7
AM
4449 {
4450 /* We may need a .plt entry if the function this reloc
4451 refers to is in a shared lib. */
411e1bfb
AM
4452 if (!update_plt_info (abfd, (struct ppc_link_hash_entry *) h,
4453 rel->r_addend))
4454 return FALSE;
8387904d
AM
4455 if (h == &htab->tls_get_addr->elf
4456 || h == &htab->tls_get_addr_fd->elf)
411e1bfb 4457 sec->has_tls_reloc = 1;
8387904d
AM
4458 else if (htab->tls_get_addr == NULL
4459 && !strncmp (h->root.root.string, ".__tls_get_addr", 15)
a48ebf4d
AM
4460 && (h->root.root.string[15] == 0
4461 || h->root.root.string[15] == '@'))
411e1bfb 4462 {
8387904d
AM
4463 htab->tls_get_addr = (struct ppc_link_hash_entry *) h;
4464 sec->has_tls_reloc = 1;
4465 }
4466 else if (htab->tls_get_addr_fd == NULL
4467 && !strncmp (h->root.root.string, "__tls_get_addr", 14)
4468 && (h->root.root.string[14] == 0
4469 || h->root.root.string[14] == '@'))
4470 {
4471 htab->tls_get_addr_fd = (struct ppc_link_hash_entry *) h;
411e1bfb
AM
4472 sec->has_tls_reloc = 1;
4473 }
4474 }
4475 break;
4476
4477 case R_PPC64_TPREL64:
4478 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_TPREL;
4479 if (info->shared)
4480 info->flags |= DF_STATIC_TLS;
4481 goto dotlstoc;
4482
4483 case R_PPC64_DTPMOD64:
4484 if (rel + 1 < rel_end
4485 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
4486 && rel[1].r_offset == rel->r_offset + 8)
951fd09b 4487 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_GD;
411e1bfb 4488 else
951fd09b 4489 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_LD;
411e1bfb
AM
4490 goto dotlstoc;
4491
4492 case R_PPC64_DTPREL64:
4493 tls_type = TLS_EXPLICIT | TLS_TLS | TLS_DTPREL;
4494 if (rel != relocs
4495 && rel[-1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPMOD64)
4496 && rel[-1].r_offset == rel->r_offset - 8)
4497 /* This is the second reloc of a dtpmod, dtprel pair.
4498 Don't mark with TLS_DTPREL. */
4499 goto dodyn;
4500
4501 dotlstoc:
4502 sec->has_tls_reloc = 1;
4503 if (h != NULL)
4504 {
4505 struct ppc_link_hash_entry *eh;
4506 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 4507 eh->tls_mask |= tls_type;
411e1bfb
AM
4508 }
4509 else
4510 if (!update_local_sym_info (abfd, symtab_hdr, r_symndx,
4511 rel->r_addend, tls_type))
4512 return FALSE;
4513
4514 if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4515 {
e7b938ca 4516 /* One extra to simplify get_tls_mask. */
eea6121a 4517 bfd_size_type amt = sec->size * sizeof (unsigned) / 8 + 1;
4ce794b7 4518 ppc64_elf_section_data (sec)->t_symndx = bfd_zalloc (abfd, amt);
411e1bfb
AM
4519 if (ppc64_elf_section_data (sec)->t_symndx == NULL)
4520 return FALSE;
4521 }
4522 BFD_ASSERT (rel->r_offset % 8 == 0);
4523 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8] = r_symndx;
951fd09b
AM
4524
4525 /* Mark the second slot of a GD or LD entry.
4526 -1 to indicate GD and -2 to indicate LD. */
4527 if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_GD))
4528 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -1;
4529 else if (tls_type == (TLS_EXPLICIT | TLS_TLS | TLS_LD))
4530 ppc64_elf_section_data (sec)->t_symndx[rel->r_offset / 8 + 1] = -2;
411e1bfb
AM
4531 goto dodyn;
4532
4533 case R_PPC64_TPREL16:
4534 case R_PPC64_TPREL16_LO:
4535 case R_PPC64_TPREL16_HI:
4536 case R_PPC64_TPREL16_HA:
4537 case R_PPC64_TPREL16_DS:
4538 case R_PPC64_TPREL16_LO_DS:
4539 case R_PPC64_TPREL16_HIGHER:
4540 case R_PPC64_TPREL16_HIGHERA:
4541 case R_PPC64_TPREL16_HIGHEST:
4542 case R_PPC64_TPREL16_HIGHESTA:
4543 if (info->shared)
4544 {
4545 info->flags |= DF_STATIC_TLS;
4546 goto dodyn;
5d1634d7
AM
4547 }
4548 break;
4549
e86ce104 4550 case R_PPC64_ADDR64:
1e2f5b6e 4551 if (opd_sym_map != NULL
1e2f5b6e 4552 && rel + 1 < rel_end
4ce794b7 4553 && ELF64_R_TYPE ((rel + 1)->r_info) == R_PPC64_TOC)
1e2f5b6e 4554 {
8387904d
AM
4555 if (h != NULL)
4556 {
4557 if (h->root.root.string[0] == '.'
4558 && h->root.root.string[1] != 0
4559 && get_fdh ((struct ppc_link_hash_entry *) h, htab))
4560 ;
4561 else
4562 ((struct ppc_link_hash_entry *) h)->is_func = 1;
4563 }
4564 else
4565 {
4566 asection *s;
1e2f5b6e 4567
8387904d
AM
4568 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
4569 r_symndx);
4570 if (s == NULL)
4571 return FALSE;
4572 else if (s != sec)
3f764659 4573 opd_sym_map[rel->r_offset / 8] = s;
8387904d 4574 }
1e2f5b6e 4575 }
e86ce104
AM
4576 /* Fall through. */
4577
04c9666a 4578 case R_PPC64_REL30:
5bd4f169 4579 case R_PPC64_REL32:
04c9666a 4580 case R_PPC64_REL64:
65f38f15
AM
4581 case R_PPC64_ADDR14:
4582 case R_PPC64_ADDR14_BRNTAKEN:
4583 case R_PPC64_ADDR14_BRTAKEN:
4584 case R_PPC64_ADDR16:
4585 case R_PPC64_ADDR16_DS:
4586 case R_PPC64_ADDR16_HA:
4587 case R_PPC64_ADDR16_HI:
4588 case R_PPC64_ADDR16_HIGHER:
4589 case R_PPC64_ADDR16_HIGHERA:
4590 case R_PPC64_ADDR16_HIGHEST:
4591 case R_PPC64_ADDR16_HIGHESTA:
4592 case R_PPC64_ADDR16_LO:
4593 case R_PPC64_ADDR16_LO_DS:
4594 case R_PPC64_ADDR24:
65f38f15 4595 case R_PPC64_ADDR32:
65f38f15
AM
4596 case R_PPC64_UADDR16:
4597 case R_PPC64_UADDR32:
4598 case R_PPC64_UADDR64:
5bd4f169 4599 case R_PPC64_TOC:
81848ca0
AM
4600 if (h != NULL && !info->shared)
4601 /* We may need a copy reloc. */
f5385ebf 4602 h->non_got_ref = 1;
81848ca0 4603
41bd81ab 4604 /* Don't propagate .opd relocs. */
1e2f5b6e 4605 if (NO_OPD_RELOCS && opd_sym_map != NULL)
e86ce104 4606 break;
e86ce104 4607
65f38f15
AM
4608 /* If we are creating a shared library, and this is a reloc
4609 against a global symbol, or a non PC relative reloc
4610 against a local symbol, then we need to copy the reloc
4611 into the shared library. However, if we are linking with
4612 -Bsymbolic, we do not need to copy a reloc against a
4613 global symbol which is defined in an object we are
4614 including in the link (i.e., DEF_REGULAR is set). At
4615 this point we have not seen all the input files, so it is
4616 possible that DEF_REGULAR is not set now but will be set
4617 later (it is never cleared). In case of a weak definition,
4618 DEF_REGULAR may be cleared later by a strong definition in
4619 a shared library. We account for that possibility below by
f4656909 4620 storing information in the dyn_relocs field of the hash
65f38f15
AM
4621 table entry. A similar situation occurs when creating
4622 shared libraries and symbol visibility changes render the
4623 symbol local.
4624
4625 If on the other hand, we are creating an executable, we
4626 may need to keep relocations for symbols satisfied by a
4627 dynamic library if we manage to avoid copy relocs for the
4628 symbol. */
411e1bfb 4629 dodyn:
65f38f15 4630 if ((info->shared
411e1bfb 4631 && (MUST_BE_DYN_RELOC (r_type)
65f38f15
AM
4632 || (h != NULL
4633 && (! info->symbolic
4634 || h->root.type == bfd_link_hash_defweak
f5385ebf 4635 || !h->def_regular))))
f4656909
AM
4636 || (ELIMINATE_COPY_RELOCS
4637 && !info->shared
65f38f15
AM
4638 && h != NULL
4639 && (h->root.type == bfd_link_hash_defweak
f5385ebf 4640 || !h->def_regular)))
5bd4f169 4641 {
ec338859
AM
4642 struct ppc_dyn_relocs *p;
4643 struct ppc_dyn_relocs **head;
4644
65f38f15
AM
4645 /* We must copy these reloc types into the output file.
4646 Create a reloc section in dynobj and make room for
4647 this reloc. */
5bd4f169
AM
4648 if (sreloc == NULL)
4649 {
4650 const char *name;
65f38f15 4651 bfd *dynobj;
5bd4f169
AM
4652
4653 name = (bfd_elf_string_from_elf_section
4654 (abfd,
4655 elf_elfheader (abfd)->e_shstrndx,
4656 elf_section_data (sec)->rel_hdr.sh_name));
4657 if (name == NULL)
b34976b6 4658 return FALSE;
5bd4f169 4659
65f38f15
AM
4660 if (strncmp (name, ".rela", 5) != 0
4661 || strcmp (bfd_get_section_name (abfd, sec),
4662 name + 5) != 0)
4663 {
4664 (*_bfd_error_handler)
d003868e
AM
4665 (_("%B: bad relocation section name `%s\'"),
4666 abfd, name);
5d1634d7 4667 bfd_set_error (bfd_error_bad_value);
65f38f15
AM
4668 }
4669
65f38f15 4670 dynobj = htab->elf.dynobj;
5bd4f169
AM
4671 sreloc = bfd_get_section_by_name (dynobj, name);
4672 if (sreloc == NULL)
4673 {
4674 flagword flags;
4675
4676 sreloc = bfd_make_section (dynobj, name);
4677 flags = (SEC_HAS_CONTENTS | SEC_READONLY
4678 | SEC_IN_MEMORY | SEC_LINKER_CREATED);
4679 if ((sec->flags & SEC_ALLOC) != 0)
4680 flags |= SEC_ALLOC | SEC_LOAD;
4681 if (sreloc == NULL
4682 || ! bfd_set_section_flags (dynobj, sreloc, flags)
65f38f15 4683 || ! bfd_set_section_alignment (dynobj, sreloc, 3))
b34976b6 4684 return FALSE;
5bd4f169 4685 }
65f38f15 4686 elf_section_data (sec)->sreloc = sreloc;
5bd4f169
AM
4687 }
4688
65f38f15
AM
4689 /* If this is a global symbol, we count the number of
4690 relocations we need for this symbol. */
4691 if (h != NULL)
4692 {
ec338859 4693 head = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
65f38f15
AM
4694 }
4695 else
4696 {
ec338859
AM
4697 /* Track dynamic relocs needed for local syms too.
4698 We really need local syms available to do this
4699 easily. Oh well. */
4700
4701 asection *s;
4702 s = bfd_section_from_r_symndx (abfd, &htab->sym_sec,
4703 sec, r_symndx);
4704 if (s == NULL)
b34976b6 4705 return FALSE;
ec338859
AM
4706
4707 head = ((struct ppc_dyn_relocs **)
4708 &elf_section_data (s)->local_dynrel);
65f38f15 4709 }
ec338859
AM
4710
4711 p = *head;
4712 if (p == NULL || p->sec != sec)
4713 {
4ce794b7 4714 p = bfd_alloc (htab->elf.dynobj, sizeof *p);
ec338859 4715 if (p == NULL)
b34976b6 4716 return FALSE;
ec338859
AM
4717 p->next = *head;
4718 *head = p;
4719 p->sec = sec;
4720 p->count = 0;
4721 p->pc_count = 0;
4722 }
4723
4724 p->count += 1;
411e1bfb 4725 if (!MUST_BE_DYN_RELOC (r_type))
ec338859 4726 p->pc_count += 1;
65f38f15 4727 }
5bd4f169 4728 break;
65f38f15
AM
4729
4730 default:
96e0dda4 4731 break;
5bd4f169
AM
4732 }
4733 }
4734
b34976b6 4735 return TRUE;
5bd4f169
AM
4736}
4737
8387904d
AM
4738/* OFFSET in OPD_SEC specifies a function descriptor. Return the address
4739 of the code entry point, and its section. */
4740
4741static bfd_vma
4742opd_entry_value (asection *opd_sec,
4743 bfd_vma offset,
4744 asection **code_sec,
4745 bfd_vma *code_off)
4746{
4747 bfd *opd_bfd = opd_sec->owner;
8860955f 4748 Elf_Internal_Rela *relocs;
8387904d 4749 Elf_Internal_Rela *lo, *hi, *look;
645ea6a9 4750 bfd_vma val;
8387904d 4751
4b85d634
AM
4752 /* No relocs implies we are linking a --just-symbols object. */
4753 if (opd_sec->reloc_count == 0)
4754 {
4755 bfd_vma val;
4756
4757 if (!bfd_get_section_contents (opd_bfd, opd_sec, &val, offset, 8))
4758 return (bfd_vma) -1;
4759
4760 if (code_sec != NULL)
4761 {
4762 asection *sec, *likely = NULL;
4763 for (sec = opd_bfd->sections; sec != NULL; sec = sec->next)
4764 if (sec->vma <= val
4765 && (sec->flags & SEC_LOAD) != 0
4766 && (sec->flags & SEC_ALLOC) != 0)
4767 likely = sec;
4768 if (likely != NULL)
4769 {
4770 *code_sec = likely;
4771 if (code_off != NULL)
4772 *code_off = val - likely->vma;
4773 }
4774 }
4775 return val;
4776 }
4777
8860955f
AM
4778 relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
4779 if (relocs == NULL)
4780 relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
645ea6a9 4781
8387904d 4782 /* Go find the opd reloc at the sym address. */
8860955f 4783 lo = relocs;
8387904d
AM
4784 BFD_ASSERT (lo != NULL);
4785 hi = lo + opd_sec->reloc_count - 1; /* ignore last reloc */
645ea6a9 4786 val = (bfd_vma) -1;
8387904d
AM
4787 while (lo < hi)
4788 {
4789 look = lo + (hi - lo) / 2;
4790 if (look->r_offset < offset)
4791 lo = look + 1;
4792 else if (look->r_offset > offset)
4793 hi = look;
4794 else
4795 {
4796 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (opd_bfd)->symtab_hdr;
4797 if (ELF64_R_TYPE (look->r_info) == R_PPC64_ADDR64
4798 && ELF64_R_TYPE ((look + 1)->r_info) == R_PPC64_TOC)
4799 {
4800 unsigned long symndx = ELF64_R_SYM (look->r_info);
8387904d
AM
4801 asection *sec;
4802
4803 if (symndx < symtab_hdr->sh_info)
4804 {
4805 Elf_Internal_Sym *sym;
4806
4807 sym = (Elf_Internal_Sym *) symtab_hdr->contents;
4808 if (sym == NULL)
4809 {
4810 sym = bfd_elf_get_elf_syms (opd_bfd, symtab_hdr,
4811 symtab_hdr->sh_info,
4812 0, NULL, NULL, NULL);
4813 if (sym == NULL)
645ea6a9 4814 break;
8387904d
AM
4815 symtab_hdr->contents = (bfd_byte *) sym;
4816 }
4817
4818 sym += symndx;
4819 val = sym->st_value;
4820 sec = NULL;
4821 if ((sym->st_shndx != SHN_UNDEF
4822 && sym->st_shndx < SHN_LORESERVE)
4823 || sym->st_shndx > SHN_HIRESERVE)
4824 sec = bfd_section_from_elf_index (opd_bfd, sym->st_shndx);
4825 BFD_ASSERT ((sec->flags & SEC_MERGE) == 0);
4826 }
4827 else
4828 {
4829 struct elf_link_hash_entry **sym_hashes;
4830 struct elf_link_hash_entry *rh;
4831
4832 sym_hashes = elf_sym_hashes (opd_bfd);
4833 rh = sym_hashes[symndx - symtab_hdr->sh_info];
4834 while (rh->root.type == bfd_link_hash_indirect
4835 || rh->root.type == bfd_link_hash_warning)
4836 rh = ((struct elf_link_hash_entry *) rh->root.u.i.link);
4837 BFD_ASSERT (rh->root.type == bfd_link_hash_defined
4838 || rh->root.type == bfd_link_hash_defweak);
4839 val = rh->root.u.def.value;
4840 sec = rh->root.u.def.section;
4841 }
4842 val += look->r_addend;
4843 if (code_off != NULL)
4844 *code_off = val;
4845 if (code_sec != NULL)
4846 *code_sec = sec;
4847 if (sec != NULL && sec->output_section != NULL)
4848 val += sec->output_section->vma + sec->output_offset;
8387904d
AM
4849 }
4850 break;
4851 }
4852 }
645ea6a9 4853
645ea6a9 4854 return val;
8387904d
AM
4855}
4856
5bd4f169
AM
4857/* Return the section that should be marked against GC for a given
4858 relocation. */
4859
4860static asection *
4ce794b7 4861ppc64_elf_gc_mark_hook (asection *sec,
ccfa59ea 4862 struct bfd_link_info *info,
4ce794b7
AM
4863 Elf_Internal_Rela *rel,
4864 struct elf_link_hash_entry *h,
4865 Elf_Internal_Sym *sym)
5bd4f169 4866{
ccfa59ea
AM
4867 asection *rsec;
4868
4869 /* First mark all our entry sym sections. */
4870 if (info->gc_sym_list != NULL)
4871 {
4872 struct ppc_link_hash_table *htab = ppc_hash_table (info);
4873 struct bfd_sym_chain *sym = info->gc_sym_list;
4874
4875 info->gc_sym_list = NULL;
4876 do
4877 {
4878 struct ppc_link_hash_entry *eh;
4879
4880 eh = (struct ppc_link_hash_entry *)
4881 elf_link_hash_lookup (&htab->elf, sym->name, FALSE, FALSE, FALSE);
4882 if (eh == NULL)
4883 continue;
4884 if (eh->elf.root.type != bfd_link_hash_defined
4885 && eh->elf.root.type != bfd_link_hash_defweak)
4886 continue;
4887
c4f68ce3
AM
4888 if (eh->is_func_descriptor
4889 && (eh->oh->elf.root.type == bfd_link_hash_defined
4890 || eh->oh->elf.root.type == bfd_link_hash_defweak))
ccfa59ea 4891 rsec = eh->oh->elf.root.u.def.section;
8387904d
AM
4892 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4893 && opd_entry_value (eh->elf.root.u.def.section,
4894 eh->elf.root.u.def.value,
4895 &rsec, NULL) != (bfd_vma) -1)
4896 ;
ccfa59ea
AM
4897 else
4898 continue;
4899
4900 if (!rsec->gc_mark)
4901 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4902
4903 rsec = eh->elf.root.u.def.section;
4904 if (!rsec->gc_mark)
4905 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4906
4907 sym = sym->next;
4908 }
4909 while (sym != NULL);
4910 }
4911
4912 /* Syms return NULL if we're marking .opd, so we avoid marking all
4913 function sections, as all functions are referenced in .opd. */
4914 rsec = NULL;
4915 if (get_opd_info (sec) != NULL)
4916 return rsec;
1e2f5b6e 4917
5bd4f169
AM
4918 if (h != NULL)
4919 {
04c9666a 4920 enum elf_ppc64_reloc_type r_type;
ccfa59ea 4921 struct ppc_link_hash_entry *eh;
a33d1f77 4922
4ce794b7 4923 r_type = ELF64_R_TYPE (rel->r_info);
a33d1f77 4924 switch (r_type)
5bd4f169
AM
4925 {
4926 case R_PPC64_GNU_VTINHERIT:
4927 case R_PPC64_GNU_VTENTRY:
4928 break;
4929
4930 default:
4931 switch (h->root.type)
4932 {
4933 case bfd_link_hash_defined:
4934 case bfd_link_hash_defweak:
ccfa59ea 4935 eh = (struct ppc_link_hash_entry *) h;
c4f68ce3
AM
4936 if (eh->oh != NULL
4937 && eh->oh->is_func_descriptor
4938 && (eh->oh->elf.root.type == bfd_link_hash_defined
4939 || eh->oh->elf.root.type == bfd_link_hash_defweak))
ccfa59ea 4940 eh = eh->oh;
1e2f5b6e
AM
4941
4942 /* Function descriptor syms cause the associated
4943 function code sym section to be marked. */
c4f68ce3
AM
4944 if (eh->is_func_descriptor
4945 && (eh->oh->elf.root.type == bfd_link_hash_defined
4946 || eh->oh->elf.root.type == bfd_link_hash_defweak))
ccfa59ea
AM
4947 {
4948 /* They also mark their opd section. */
4949 if (!eh->elf.root.u.def.section->gc_mark)
4950 _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4951 ppc64_elf_gc_mark_hook);
4952
4953 rsec = eh->oh->elf.root.u.def.section;
4954 }
8387904d
AM
4955 else if (get_opd_info (eh->elf.root.u.def.section) != NULL
4956 && opd_entry_value (eh->elf.root.u.def.section,
4957 eh->elf.root.u.def.value,
4958 &rsec, NULL) != (bfd_vma) -1)
4959 {
4960 if (!eh->elf.root.u.def.section->gc_mark)
4961 _bfd_elf_gc_mark (info, eh->elf.root.u.def.section,
4962 ppc64_elf_gc_mark_hook);
4963 }
ccfa59ea 4964 else
1e2f5b6e
AM
4965 rsec = h->root.u.def.section;
4966 break;
5bd4f169
AM
4967
4968 case bfd_link_hash_common:
1e2f5b6e
AM
4969 rsec = h->root.u.c.p->section;
4970 break;
5bd4f169
AM
4971
4972 default:
4973 break;
4974 }
4975 }
4976 }
4977 else
4978 {
1e2f5b6e
AM
4979 asection **opd_sym_section;
4980
4981 rsec = bfd_section_from_elf_index (sec->owner, sym->st_shndx);
ccfa59ea 4982 opd_sym_section = get_opd_info (rsec);
1e2f5b6e 4983 if (opd_sym_section != NULL)
ccfa59ea
AM
4984 {
4985 if (!rsec->gc_mark)
4986 _bfd_elf_gc_mark (info, rsec, ppc64_elf_gc_mark_hook);
4987
3f764659 4988 rsec = opd_sym_section[sym->st_value / 8];
ccfa59ea 4989 }
5bd4f169
AM
4990 }
4991
1e2f5b6e 4992 return rsec;
5bd4f169
AM
4993}
4994
65f38f15
AM
4995/* Update the .got, .plt. and dynamic reloc reference counts for the
4996 section being removed. */
5bd4f169 4997
b34976b6 4998static bfd_boolean
4ce794b7
AM
4999ppc64_elf_gc_sweep_hook (bfd *abfd, struct bfd_link_info *info,
5000 asection *sec, const Elf_Internal_Rela *relocs)
5bd4f169 5001{
411e1bfb 5002 struct ppc_link_hash_table *htab;
5bd4f169
AM
5003 Elf_Internal_Shdr *symtab_hdr;
5004 struct elf_link_hash_entry **sym_hashes;
411e1bfb 5005 struct got_entry **local_got_ents;
5bd4f169 5006 const Elf_Internal_Rela *rel, *relend;
5bd4f169 5007
680a3378
AM
5008 if ((sec->flags & SEC_ALLOC) == 0)
5009 return TRUE;
5010
ec338859
AM
5011 elf_section_data (sec)->local_dynrel = NULL;
5012
411e1bfb 5013 htab = ppc_hash_table (info);
5bd4f169
AM
5014 symtab_hdr = &elf_tdata (abfd)->symtab_hdr;
5015 sym_hashes = elf_sym_hashes (abfd);
411e1bfb 5016 local_got_ents = elf_local_got_ents (abfd);
5bd4f169
AM
5017
5018 relend = relocs + sec->reloc_count;
5019 for (rel = relocs; rel < relend; rel++)
a33d1f77
AM
5020 {
5021 unsigned long r_symndx;
04c9666a 5022 enum elf_ppc64_reloc_type r_type;
58ac9f71 5023 struct elf_link_hash_entry *h = NULL;
411e1bfb 5024 char tls_type = 0;
5bd4f169 5025
a33d1f77 5026 r_symndx = ELF64_R_SYM (rel->r_info);
4ce794b7 5027 r_type = ELF64_R_TYPE (rel->r_info);
58ac9f71
AM
5028 if (r_symndx >= symtab_hdr->sh_info)
5029 {
5030 struct ppc_link_hash_entry *eh;
5031 struct ppc_dyn_relocs **pp;
5032 struct ppc_dyn_relocs *p;
5033
5034 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
3eb128b2
AM
5035 while (h->root.type == bfd_link_hash_indirect
5036 || h->root.type == bfd_link_hash_warning)
5037 h = (struct elf_link_hash_entry *) h->root.u.i.link;
58ac9f71
AM
5038 eh = (struct ppc_link_hash_entry *) h;
5039
5040 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; pp = &p->next)
5041 if (p->sec == sec)
5042 {
5043 /* Everything must go for SEC. */
5044 *pp = p->next;
5045 break;
5046 }
5047 }
5048
a33d1f77
AM
5049 switch (r_type)
5050 {
411e1bfb
AM
5051 case R_PPC64_GOT_TLSLD16:
5052 case R_PPC64_GOT_TLSLD16_LO:
5053 case R_PPC64_GOT_TLSLD16_HI:
5054 case R_PPC64_GOT_TLSLD16_HA:
e717da7e 5055 ppc64_tlsld_got (abfd)->refcount -= 1;
951fd09b 5056 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
5057 goto dogot;
5058
5059 case R_PPC64_GOT_TLSGD16:
5060 case R_PPC64_GOT_TLSGD16_LO:
5061 case R_PPC64_GOT_TLSGD16_HI:
5062 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 5063 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
5064 goto dogot;
5065
5066 case R_PPC64_GOT_TPREL16_DS:
5067 case R_PPC64_GOT_TPREL16_LO_DS:
5068 case R_PPC64_GOT_TPREL16_HI:
5069 case R_PPC64_GOT_TPREL16_HA:
5070 tls_type = TLS_TLS | TLS_TPREL;
5071 goto dogot;
5072
5073 case R_PPC64_GOT_DTPREL16_DS:
5074 case R_PPC64_GOT_DTPREL16_LO_DS:
5075 case R_PPC64_GOT_DTPREL16_HI:
5076 case R_PPC64_GOT_DTPREL16_HA:
5077 tls_type = TLS_TLS | TLS_DTPREL;
5078 goto dogot;
5079
a33d1f77
AM
5080 case R_PPC64_GOT16:
5081 case R_PPC64_GOT16_DS:
5082 case R_PPC64_GOT16_HA:
5083 case R_PPC64_GOT16_HI:
5084 case R_PPC64_GOT16_LO:
5085 case R_PPC64_GOT16_LO_DS:
411e1bfb
AM
5086 dogot:
5087 {
5088 struct got_entry *ent;
5089
58ac9f71
AM
5090 if (h != NULL)
5091 ent = h->got.glist;
411e1bfb
AM
5092 else
5093 ent = local_got_ents[r_symndx];
5094
5095 for (; ent != NULL; ent = ent->next)
5096 if (ent->addend == rel->r_addend
e717da7e 5097 && ent->owner == abfd
411e1bfb
AM
5098 && ent->tls_type == tls_type)
5099 break;
5100 if (ent == NULL)
5101 abort ();
5102 if (ent->got.refcount > 0)
5103 ent->got.refcount -= 1;
5104 }
a33d1f77 5105 break;
65f38f15 5106
a33d1f77
AM
5107 case R_PPC64_PLT16_HA:
5108 case R_PPC64_PLT16_HI:
5109 case R_PPC64_PLT16_LO:
5110 case R_PPC64_PLT32:
5111 case R_PPC64_PLT64:
721956f4
AM
5112 case R_PPC64_REL14:
5113 case R_PPC64_REL14_BRNTAKEN:
5114 case R_PPC64_REL14_BRTAKEN:
5d1634d7 5115 case R_PPC64_REL24:
58ac9f71 5116 if (h != NULL)
5d1634d7 5117 {
411e1bfb
AM
5118 struct plt_entry *ent;
5119
411e1bfb
AM
5120 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5121 if (ent->addend == rel->r_addend)
5122 break;
5123 if (ent == NULL)
5124 abort ();
5125 if (ent->plt.refcount > 0)
5126 ent->plt.refcount -= 1;
5d1634d7 5127 }
e86ce104 5128 break;
5d1634d7 5129
a33d1f77
AM
5130 default:
5131 break;
5132 }
5133 }
b34976b6 5134 return TRUE;
5bd4f169
AM
5135}
5136
deb0e272
AM
5137/* The maximum size of .sfpr. */
5138#define SFPR_MAX (218*4)
5139
5140struct sfpr_def_parms
5141{
699733f6
AM
5142 const char name[12];
5143 unsigned char lo, hi;
deb0e272
AM
5144 bfd_byte * (*write_ent) (bfd *, bfd_byte *, int);
5145 bfd_byte * (*write_tail) (bfd *, bfd_byte *, int);
5146};
5147
5148/* Auto-generate _save*, _rest* functions in .sfpr. */
5149
5150static unsigned int
5151sfpr_define (struct bfd_link_info *info, const struct sfpr_def_parms *parm)
5152{
5153 struct ppc_link_hash_table *htab = ppc_hash_table (info);
5154 unsigned int i;
5155 size_t len = strlen (parm->name);
5156 bfd_boolean writing = FALSE;
699733f6 5157 char sym[16];
deb0e272
AM
5158
5159 memcpy (sym, parm->name, len);
5160 sym[len + 2] = 0;
5161
5162 for (i = parm->lo; i <= parm->hi; i++)
5163 {
5164 struct elf_link_hash_entry *h;
5165
5166 sym[len + 0] = i / 10 + '0';
5167 sym[len + 1] = i % 10 + '0';
5168 h = elf_link_hash_lookup (&htab->elf, sym, FALSE, FALSE, TRUE);
5169 if (h != NULL
f5385ebf 5170 && !h->def_regular)
deb0e272
AM
5171 {
5172 h->root.type = bfd_link_hash_defined;
5173 h->root.u.def.section = htab->sfpr;
5174 h->root.u.def.value = htab->sfpr->size;
5175 h->type = STT_FUNC;
f5385ebf 5176 h->def_regular = 1;
deb0e272
AM
5177 _bfd_elf_link_hash_hide_symbol (info, h, TRUE);
5178 writing = TRUE;
5179 if (htab->sfpr->contents == NULL)
5180 {
5181 htab->sfpr->contents = bfd_alloc (htab->elf.dynobj, SFPR_MAX);
5182 if (htab->sfpr->contents == NULL)
5183 return FALSE;
5184 }
5185 }
5186 if (writing)
5187 {
5188 bfd_byte *p = htab->sfpr->contents + htab->sfpr->size;
5189 if (i != parm->hi)
5190 p = (*parm->write_ent) (htab->elf.dynobj, p, i);
5191 else
5192 p = (*parm->write_tail) (htab->elf.dynobj, p, i);
5193 htab->sfpr->size = p - htab->sfpr->contents;
5194 }
5195 }
5196
5197 return TRUE;
5198}
5199
5200static bfd_byte *
5201savegpr0 (bfd *abfd, bfd_byte *p, int r)
5202{
5203 bfd_put_32 (abfd, STD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5204 return p + 4;
5205}
5206
5207static bfd_byte *
5208savegpr0_tail (bfd *abfd, bfd_byte *p, int r)
5209{
5210 p = savegpr0 (abfd, p, r);
5211 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5212 p = p + 4;
5213 bfd_put_32 (abfd, BLR, p);
5214 return p + 4;
5215}
5216
5217static bfd_byte *
5218restgpr0 (bfd *abfd, bfd_byte *p, int r)
5219{
5220 bfd_put_32 (abfd, LD_R0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5221 return p + 4;
5222}
5223
5224static bfd_byte *
5225restgpr0_tail (bfd *abfd, bfd_byte *p, int r)
5226{
5227 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5228 p = p + 4;
5229 p = restgpr0 (abfd, p, r);
5230 bfd_put_32 (abfd, MTLR_R0, p);
5231 p = p + 4;
5232 if (r == 29)
5233 {
5234 p = restgpr0 (abfd, p, 30);
5235 p = restgpr0 (abfd, p, 31);
5236 }
5237 bfd_put_32 (abfd, BLR, p);
5238 return p + 4;
5239}
5240
5241static bfd_byte *
5242savegpr1 (bfd *abfd, bfd_byte *p, int r)
5243{
5244 bfd_put_32 (abfd, STD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5245 return p + 4;
5246}
5247
5248static bfd_byte *
5249savegpr1_tail (bfd *abfd, bfd_byte *p, int r)
5250{
5251 p = savegpr1 (abfd, p, r);
5252 bfd_put_32 (abfd, BLR, p);
5253 return p + 4;
5254}
5255
5256static bfd_byte *
5257restgpr1 (bfd *abfd, bfd_byte *p, int r)
5258{
5259 bfd_put_32 (abfd, LD_R0_0R12 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5260 return p + 4;
5261}
5262
5263static bfd_byte *
5264restgpr1_tail (bfd *abfd, bfd_byte *p, int r)
5265{
5266 p = restgpr1 (abfd, p, r);
5267 bfd_put_32 (abfd, BLR, p);
5268 return p + 4;
5269}
5270
5271static bfd_byte *
5272savefpr (bfd *abfd, bfd_byte *p, int r)
5273{
5274 bfd_put_32 (abfd, STFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5275 return p + 4;
5276}
5277
5278static bfd_byte *
5279savefpr0_tail (bfd *abfd, bfd_byte *p, int r)
5280{
5281 p = savefpr (abfd, p, r);
5282 bfd_put_32 (abfd, STD_R0_0R1 + 16, p);
5283 p = p + 4;
5284 bfd_put_32 (abfd, BLR, p);
5285 return p + 4;
5286}
5287
5288static bfd_byte *
5289restfpr (bfd *abfd, bfd_byte *p, int r)
5290{
5291 bfd_put_32 (abfd, LFD_FR0_0R1 + (r << 21) + (1 << 16) - (32 - r) * 8, p);
5292 return p + 4;
5293}
5294
5295static bfd_byte *
5296restfpr0_tail (bfd *abfd, bfd_byte *p, int r)
5297{
5298 bfd_put_32 (abfd, LD_R0_0R1 + 16, p);
5299 p = p + 4;
5300 p = restfpr (abfd, p, r);
5301 bfd_put_32 (abfd, MTLR_R0, p);
5302 p = p + 4;
5303 if (r == 29)
5304 {
5305 p = restfpr (abfd, p, 30);
5306 p = restfpr (abfd, p, 31);
5307 }
5308 bfd_put_32 (abfd, BLR, p);
5309 return p + 4;
5310}
5311
5312static bfd_byte *
5313savefpr1_tail (bfd *abfd, bfd_byte *p, int r)
5314{
5315 p = savefpr (abfd, p, r);
5316 bfd_put_32 (abfd, BLR, p);
5317 return p + 4;
5318}
5319
5320static bfd_byte *
5321restfpr1_tail (bfd *abfd, bfd_byte *p, int r)
5322{
5323 p = restfpr (abfd, p, r);
5324 bfd_put_32 (abfd, BLR, p);
5325 return p + 4;
5326}
5327
5328static bfd_byte *
5329savevr (bfd *abfd, bfd_byte *p, int r)
5330{
5331 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5332 p = p + 4;
5333 bfd_put_32 (abfd, STVX_VR0_R12_R0 + (r << 21), p);
5334 return p + 4;
5335}
5336
5337static bfd_byte *
5338savevr_tail (bfd *abfd, bfd_byte *p, int r)
5339{
5340 p = savevr (abfd, p, r);
5341 bfd_put_32 (abfd, BLR, p);
5342 return p + 4;
5343}
5344
5345static bfd_byte *
5346restvr (bfd *abfd, bfd_byte *p, int r)
5347{
5348 bfd_put_32 (abfd, LI_R12_0 + (1 << 16) - (32 - r) * 16, p);
5349 p = p + 4;
5350 bfd_put_32 (abfd, LVX_VR0_R12_R0 + (r << 21), p);
5351 return p + 4;
5352}
5353
5354static bfd_byte *
5355restvr_tail (bfd *abfd, bfd_byte *p, int r)
5356{
5357 p = restvr (abfd, p, r);
5358 bfd_put_32 (abfd, BLR, p);
5359 return p + 4;
5360}
5361
e86ce104
AM
5362/* Called via elf_link_hash_traverse to transfer dynamic linking
5363 information on function code symbol entries to their corresponding
5364 function descriptor symbol entries. */
deb0e272 5365
b34976b6 5366static bfd_boolean
4ce794b7 5367func_desc_adjust (struct elf_link_hash_entry *h, void *inf)
5bd4f169 5368{
e86ce104 5369 struct bfd_link_info *info;
65f38f15 5370 struct ppc_link_hash_table *htab;
411e1bfb 5371 struct plt_entry *ent;
50bc7936
AM
5372 struct ppc_link_hash_entry *fh;
5373 struct ppc_link_hash_entry *fdh;
5374 bfd_boolean force_local;
5bd4f169 5375
50bc7936
AM
5376 fh = (struct ppc_link_hash_entry *) h;
5377 if (fh->elf.root.type == bfd_link_hash_indirect)
b34976b6 5378 return TRUE;
e86ce104 5379
50bc7936
AM
5380 if (fh->elf.root.type == bfd_link_hash_warning)
5381 fh = (struct ppc_link_hash_entry *) fh->elf.root.u.i.link;
e92d460e 5382
4ce794b7 5383 info = inf;
65f38f15 5384 htab = ppc_hash_table (info);
5bd4f169 5385
c09bdfe5
AM
5386 /* Resolve undefined references to dot-symbols as the value
5387 in the function descriptor, if we have one in a regular object.
5388 This is to satisfy cases like ".quad .foo". Calls to functions
5389 in dynamic objects are handled elsewhere. */
5390 if (fh->elf.root.type == bfd_link_hash_undefweak
5391 && fh->was_undefined
5392 && (fh->oh->elf.root.type == bfd_link_hash_defined
5393 || fh->oh->elf.root.type == bfd_link_hash_defweak)
5394 && get_opd_info (fh->oh->elf.root.u.def.section) != NULL
5395 && opd_entry_value (fh->oh->elf.root.u.def.section,
5396 fh->oh->elf.root.u.def.value,
5397 &fh->elf.root.u.def.section,
5398 &fh->elf.root.u.def.value) != (bfd_vma) -1)
5399 {
5400 fh->elf.root.type = fh->oh->elf.root.type;
f5385ebf 5401 fh->elf.forced_local = 1;
c09bdfe5
AM
5402 }
5403
e86ce104
AM
5404 /* If this is a function code symbol, transfer dynamic linking
5405 information to the function descriptor symbol. */
50bc7936 5406 if (!fh->is_func)
b34976b6 5407 return TRUE;
e86ce104 5408
50bc7936 5409 for (ent = fh->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
5410 if (ent->plt.refcount > 0)
5411 break;
50bc7936
AM
5412 if (ent == NULL
5413 || fh->elf.root.root.string[0] != '.'
5414 || fh->elf.root.root.string[1] == '\0')
5415 return TRUE;
5bd4f169 5416
50bc7936
AM
5417 /* Find the corresponding function descriptor symbol. Create it
5418 as undefined if necessary. */
5bd4f169 5419
50bc7936
AM
5420 fdh = get_fdh (fh, htab);
5421 if (fdh != NULL)
5422 while (fdh->elf.root.type == bfd_link_hash_indirect
5423 || fdh->elf.root.type == bfd_link_hash_warning)
5424 fdh = (struct ppc_link_hash_entry *) fdh->elf.root.u.i.link;
5bd4f169 5425
50bc7936
AM
5426 if (fdh == NULL
5427 && info->shared
5428 && (fh->elf.root.type == bfd_link_hash_undefined
5429 || fh->elf.root.type == bfd_link_hash_undefweak))
5430 {
908b32fc 5431 fdh = make_fdh (info, fh);
bb700d78
AM
5432 if (fdh == NULL)
5433 return FALSE;
50bc7936 5434 }
648cca2c 5435
908b32fc
AM
5436 /* Fake function descriptors are made undefweak. If the function
5437 code symbol is strong undefined, make the fake sym the same. */
5438
5439 if (fdh != NULL
5440 && fdh->fake
5441 && fdh->elf.root.type == bfd_link_hash_undefweak
5442 && fh->elf.root.type == bfd_link_hash_undefined)
5443 {
5444 fdh->elf.root.type = bfd_link_hash_undefined;
5445 bfd_link_add_undef (&htab->elf.root, &fdh->elf.root);
5446 }
5447
50bc7936 5448 if (fdh != NULL
f5385ebf 5449 && !fdh->elf.forced_local
50bc7936 5450 && (info->shared
f5385ebf
AM
5451 || fdh->elf.def_dynamic
5452 || fdh->elf.ref_dynamic
50bc7936
AM
5453 || (fdh->elf.root.type == bfd_link_hash_undefweak
5454 && ELF_ST_VISIBILITY (fdh->elf.other) == STV_DEFAULT)))
5455 {
5456 if (fdh->elf.dynindx == -1)
c152c796 5457 if (! bfd_elf_link_record_dynamic_symbol (info, &fdh->elf))
50bc7936 5458 return FALSE;
f5385ebf
AM
5459 fdh->elf.ref_regular |= fh->elf.ref_regular;
5460 fdh->elf.ref_dynamic |= fh->elf.ref_dynamic;
5461 fdh->elf.ref_regular_nonweak |= fh->elf.ref_regular_nonweak;
5462 fdh->elf.non_got_ref |= fh->elf.non_got_ref;
50bc7936 5463 if (ELF_ST_VISIBILITY (fh->elf.other) == STV_DEFAULT)
e86ce104 5464 {
8387904d
AM
5465 struct plt_entry **ep = &fdh->elf.plt.plist;
5466 while (*ep != NULL)
5467 ep = &(*ep)->next;
5468 *ep = fh->elf.plt.plist;
5469 fh->elf.plt.plist = NULL;
f5385ebf 5470 fdh->elf.needs_plt = 1;
e86ce104 5471 }
50bc7936 5472 fdh->is_func_descriptor = 1;
34814b9f
AM
5473 fdh->oh = fh;
5474 fh->oh = fdh;
e86ce104
AM
5475 }
5476
50bc7936
AM
5477 /* Now that the info is on the function descriptor, clear the
5478 function code sym info. Any function code syms for which we
5479 don't have a definition in a regular file, we force local.
5480 This prevents a shared library from exporting syms that have
5481 been imported from another library. Function code syms that
5482 are really in the library we must leave global to prevent the
5483 linker dragging in a definition from a static library. */
5484 force_local
5485 = (info->shared
f5385ebf 5486 && (!fh->elf.def_regular
50bc7936 5487 || fdh == NULL
f5385ebf
AM
5488 || !fdh->elf.def_regular
5489 || fdh->elf.forced_local));
50bc7936
AM
5490 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
5491
b34976b6 5492 return TRUE;
e86ce104 5493}
40b8271b 5494
e86ce104 5495/* Called near the start of bfd_elf_size_dynamic_sections. We use
82bd7b59
AM
5496 this hook to a) provide some gcc support functions, and b) transfer
5497 dynamic linking information gathered so far on function code symbol
5498 entries, to their corresponding function descriptor symbol entries. */
deb0e272 5499
b34976b6 5500static bfd_boolean
4ce794b7
AM
5501ppc64_elf_func_desc_adjust (bfd *obfd ATTRIBUTE_UNUSED,
5502 struct bfd_link_info *info)
e86ce104
AM
5503{
5504 struct ppc_link_hash_table *htab;
82bd7b59 5505 unsigned int i;
deb0e272
AM
5506 const struct sfpr_def_parms funcs[] =
5507 {
5508 { "_savegpr0_", 14, 31, savegpr0, savegpr0_tail },
5509 { "_restgpr0_", 14, 29, restgpr0, restgpr0_tail },
5510 { "_restgpr0_", 30, 31, restgpr0, restgpr0_tail },
5511 { "_savegpr1_", 14, 31, savegpr1, savegpr1_tail },
5512 { "_restgpr1_", 14, 31, restgpr1, restgpr1_tail },
5513 { "_savefpr_", 14, 31, savefpr, savefpr0_tail },
5514 { "_restfpr_", 14, 29, restfpr, restfpr0_tail },
5515 { "_restfpr_", 30, 31, restfpr, restfpr0_tail },
5516 { "._savef", 14, 31, savefpr, savefpr1_tail },
5517 { "._restf", 14, 31, restfpr, restfpr1_tail },
5518 { "_savevr_", 20, 31, savevr, savevr_tail },
5519 { "_restvr_", 20, 31, restvr, restvr_tail }
5520 };
e86ce104
AM
5521
5522 htab = ppc_hash_table (info);
82bd7b59
AM
5523 if (htab->sfpr == NULL)
5524 /* We don't have any relocs. */
b34976b6 5525 return TRUE;
82bd7b59 5526
deb0e272
AM
5527 /* Provide any missing _save* and _rest* functions. */
5528 htab->sfpr->size = 0;
5529 for (i = 0; i < sizeof (funcs) / sizeof (funcs[0]); i++)
5530 if (!sfpr_define (info, &funcs[i]))
5531 return FALSE;
82bd7b59 5532
4ce794b7 5533 elf_link_hash_traverse (&htab->elf, func_desc_adjust, info);
805fc799 5534
eea6121a 5535 if (htab->sfpr->size == 0)
deb0e272 5536 _bfd_strip_section_from_output (info, htab->sfpr);
82bd7b59 5537
b34976b6 5538 return TRUE;
e86ce104
AM
5539}
5540
5541/* Adjust a symbol defined by a dynamic object and referenced by a
5542 regular object. The current definition is in some section of the
5543 dynamic object, but we're not including those sections. We have to
5544 change the definition to something the rest of the link can
5545 understand. */
5546
b34976b6 5547static bfd_boolean
4ce794b7
AM
5548ppc64_elf_adjust_dynamic_symbol (struct bfd_link_info *info,
5549 struct elf_link_hash_entry *h)
e86ce104
AM
5550{
5551 struct ppc_link_hash_table *htab;
e86ce104
AM
5552 asection *s;
5553 unsigned int power_of_two;
5554
5555 htab = ppc_hash_table (info);
5556
5557 /* Deal with function syms. */
5558 if (h->type == STT_FUNC
f5385ebf 5559 || h->needs_plt)
e86ce104
AM
5560 {
5561 /* Clear procedure linkage table information for any symbol that
5562 won't need a .plt entry. */
411e1bfb
AM
5563 struct plt_entry *ent;
5564 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
5565 if (ent->plt.refcount > 0)
5566 break;
8387904d 5567 if (ent == NULL
9c7a29a3
AM
5568 || SYMBOL_CALLS_LOCAL (info, h)
5569 || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
5570 && h->root.type == bfd_link_hash_undefweak))
40b8271b 5571 {
411e1bfb 5572 h->plt.plist = NULL;
f5385ebf 5573 h->needs_plt = 0;
40b8271b 5574 }
5bd4f169 5575 }
bbd7ec4a 5576 else
411e1bfb 5577 h->plt.plist = NULL;
5bd4f169
AM
5578
5579 /* If this is a weak symbol, and there is a real definition, the
5580 processor independent code will have arranged for us to see the
5581 real definition first, and we can just use the same value. */
f6e332e6 5582 if (h->u.weakdef != NULL)
5bd4f169 5583 {
f6e332e6
AM
5584 BFD_ASSERT (h->u.weakdef->root.type == bfd_link_hash_defined
5585 || h->u.weakdef->root.type == bfd_link_hash_defweak);
5586 h->root.u.def.section = h->u.weakdef->root.u.def.section;
5587 h->root.u.def.value = h->u.weakdef->root.u.def.value;
a23b6845 5588 if (ELIMINATE_COPY_RELOCS)
f6e332e6 5589 h->non_got_ref = h->u.weakdef->non_got_ref;
b34976b6 5590 return TRUE;
5bd4f169
AM
5591 }
5592
5bd4f169
AM
5593 /* If we are creating a shared library, we must presume that the
5594 only references to the symbol are via the global offset table.
5595 For such cases we need not do anything here; the relocations will
5596 be handled correctly by relocate_section. */
5597 if (info->shared)
b34976b6 5598 return TRUE;
5bd4f169 5599
65f38f15
AM
5600 /* If there are no references to this symbol that do not use the
5601 GOT, we don't need to generate a copy reloc. */
f5385ebf 5602 if (!h->non_got_ref)
b34976b6 5603 return TRUE;
65f38f15 5604
f4656909 5605 if (ELIMINATE_COPY_RELOCS)
65f38f15 5606 {
f4656909
AM
5607 struct ppc_link_hash_entry * eh;
5608 struct ppc_dyn_relocs *p;
65f38f15 5609
f4656909
AM
5610 eh = (struct ppc_link_hash_entry *) h;
5611 for (p = eh->dyn_relocs; p != NULL; p = p->next)
5612 {
5613 s = p->sec->output_section;
5614 if (s != NULL && (s->flags & SEC_READONLY) != 0)
5615 break;
5616 }
5617
5618 /* If we didn't find any dynamic relocs in read-only sections, then
5619 we'll be keeping the dynamic relocs and avoiding the copy reloc. */
5620 if (p == NULL)
5621 {
f5385ebf 5622 h->non_got_ref = 0;
f4656909
AM
5623 return TRUE;
5624 }
65f38f15
AM
5625 }
5626
5d35169e 5627 if (h->plt.plist != NULL)
97b639ba
AM
5628 {
5629 /* We should never get here, but unfortunately there are versions
5630 of gcc out there that improperly (for this ABI) put initialized
5631 function pointers, vtable refs and suchlike in read-only
5632 sections. Allow them to proceed, but warn that this might
5633 break at runtime. */
5634 (*_bfd_error_handler)
5635 (_("copy reloc against `%s' requires lazy plt linking; "
5636 "avoid setting LD_BIND_NOW=1 or upgrade gcc"),
5637 h->root.root.string);
5638 }
5d35169e
AM
5639
5640 /* This is a reference to a symbol defined by a dynamic object which
5641 is not a function. */
5642
5bd4f169
AM
5643 /* We must allocate the symbol in our .dynbss section, which will
5644 become part of the .bss section of the executable. There will be
5645 an entry for this symbol in the .dynsym section. The dynamic
5646 object will contain position independent code, so all references
5647 from the dynamic object to this symbol will go through the global
5648 offset table. The dynamic linker will use the .dynsym entry to
5649 determine the address it must put in the global offset table, so
5650 both the dynamic object and the regular object will refer to the
5651 same memory location for the variable. */
5bd4f169 5652
04c9666a
AM
5653 /* We must generate a R_PPC64_COPY reloc to tell the dynamic linker
5654 to copy the initial value out of the dynamic object and into the
5bd4f169
AM
5655 runtime process image. We need to remember the offset into the
5656 .rela.bss section we are going to use. */
5657 if ((h->root.u.def.section->flags & SEC_ALLOC) != 0)
5658 {
eea6121a 5659 htab->relbss->size += sizeof (Elf64_External_Rela);
f5385ebf 5660 h->needs_copy = 1;
5bd4f169
AM
5661 }
5662
5663 /* We need to figure out the alignment required for this symbol. I
5664 have no idea how ELF linkers handle this. */
5665 power_of_two = bfd_log2 (h->size);
5666 if (power_of_two > 4)
5667 power_of_two = 4;
5668
5669 /* Apply the required alignment. */
4ce794b7 5670 s = htab->dynbss;
eea6121a 5671 s->size = BFD_ALIGN (s->size, (bfd_size_type) (1 << power_of_two));
65f38f15 5672 if (power_of_two > bfd_get_section_alignment (htab->elf.dynobj, s))
5bd4f169 5673 {
65f38f15 5674 if (! bfd_set_section_alignment (htab->elf.dynobj, s, power_of_two))
b34976b6 5675 return FALSE;
5bd4f169
AM
5676 }
5677
5678 /* Define the symbol as being at this point in the section. */
5679 h->root.u.def.section = s;
eea6121a 5680 h->root.u.def.value = s->size;
5bd4f169
AM
5681
5682 /* Increment the section size to make room for the symbol. */
eea6121a 5683 s->size += h->size;
5bd4f169 5684
b34976b6 5685 return TRUE;
5bd4f169
AM
5686}
5687
e86ce104
AM
5688/* If given a function descriptor symbol, hide both the function code
5689 sym and the descriptor. */
5690static void
4ce794b7
AM
5691ppc64_elf_hide_symbol (struct bfd_link_info *info,
5692 struct elf_link_hash_entry *h,
5693 bfd_boolean force_local)
e86ce104 5694{
34814b9f 5695 struct ppc_link_hash_entry *eh;
e86ce104
AM
5696 _bfd_elf_link_hash_hide_symbol (info, h, force_local);
5697
34814b9f
AM
5698 eh = (struct ppc_link_hash_entry *) h;
5699 if (eh->is_func_descriptor)
e86ce104 5700 {
34814b9f 5701 struct ppc_link_hash_entry *fh = eh->oh;
e86ce104 5702
721956f4 5703 if (fh == NULL)
d1329ca3
AM
5704 {
5705 const char *p, *q;
5706 struct ppc_link_hash_table *htab;
5707 char save;
5708
5709 /* We aren't supposed to use alloca in BFD because on
5710 systems which do not have alloca the version in libiberty
5711 calls xmalloc, which might cause the program to crash
5712 when it runs out of memory. This function doesn't have a
5713 return status, so there's no way to gracefully return an
5714 error. So cheat. We know that string[-1] can be safely
34814b9f
AM
5715 accessed; It's either a string in an ELF string table,
5716 or allocated in an objalloc structure. */
d1329ca3 5717
34814b9f 5718 p = eh->elf.root.root.string - 1;
d1329ca3
AM
5719 save = *p;
5720 *(char *) p = '.';
5721 htab = ppc_hash_table (info);
34814b9f
AM
5722 fh = (struct ppc_link_hash_entry *)
5723 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
5724 *(char *) p = save;
5725
5726 /* Unfortunately, if it so happens that the string we were
5727 looking for was allocated immediately before this string,
5728 then we overwrote the string terminator. That's the only
5729 reason the lookup should fail. */
5730 if (fh == NULL)
5731 {
34814b9f
AM
5732 q = eh->elf.root.root.string + strlen (eh->elf.root.root.string);
5733 while (q >= eh->elf.root.root.string && *q == *p)
d1329ca3 5734 --q, --p;
34814b9f
AM
5735 if (q < eh->elf.root.root.string && *p == '.')
5736 fh = (struct ppc_link_hash_entry *)
5737 elf_link_hash_lookup (&htab->elf, p, FALSE, FALSE, FALSE);
d1329ca3
AM
5738 }
5739 if (fh != NULL)
5740 {
34814b9f
AM
5741 eh->oh = fh;
5742 fh->oh = eh;
d1329ca3
AM
5743 }
5744 }
e86ce104 5745 if (fh != NULL)
34814b9f 5746 _bfd_elf_link_hash_hide_symbol (info, &fh->elf, force_local);
e86ce104
AM
5747 }
5748}
5749
411e1bfb 5750static bfd_boolean
8843416a
AM
5751get_sym_h (struct elf_link_hash_entry **hp,
5752 Elf_Internal_Sym **symp,
5753 asection **symsecp,
5754 char **tls_maskp,
5755 Elf_Internal_Sym **locsymsp,
5756 unsigned long r_symndx,
5757 bfd *ibfd)
411e1bfb
AM
5758{
5759 Elf_Internal_Shdr *symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
5760
5761 if (r_symndx >= symtab_hdr->sh_info)
5762 {
5763 struct elf_link_hash_entry **sym_hashes = elf_sym_hashes (ibfd);
5764 struct elf_link_hash_entry *h;
5765
5766 h = sym_hashes[r_symndx - symtab_hdr->sh_info];
5767 while (h->root.type == bfd_link_hash_indirect
5768 || h->root.type == bfd_link_hash_warning)
5769 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5770
5771 if (hp != NULL)
5772 *hp = h;
5773
5774 if (symp != NULL)
5775 *symp = NULL;
5776
5777 if (symsecp != NULL)
5778 {
5779 asection *symsec = NULL;
5780 if (h->root.type == bfd_link_hash_defined
5781 || h->root.type == bfd_link_hash_defweak)
5782 symsec = h->root.u.def.section;
5783 *symsecp = symsec;
5784 }
5785
e7b938ca 5786 if (tls_maskp != NULL)
411e1bfb
AM
5787 {
5788 struct ppc_link_hash_entry *eh;
5789
5790 eh = (struct ppc_link_hash_entry *) h;
e7b938ca 5791 *tls_maskp = &eh->tls_mask;
411e1bfb
AM
5792 }
5793 }
5794 else
5795 {
5796 Elf_Internal_Sym *sym;
5797 Elf_Internal_Sym *locsyms = *locsymsp;
5798
5799 if (locsyms == NULL)
5800 {
5801 locsyms = (Elf_Internal_Sym *) symtab_hdr->contents;
5802 if (locsyms == NULL)
5803 locsyms = bfd_elf_get_elf_syms (ibfd, symtab_hdr,
5804 symtab_hdr->sh_info,
5805 0, NULL, NULL, NULL);
5806 if (locsyms == NULL)
5807 return FALSE;
5808 *locsymsp = locsyms;
5809 }
5810 sym = locsyms + r_symndx;
5811
5812 if (hp != NULL)
5813 *hp = NULL;
5814
5815 if (symp != NULL)
5816 *symp = sym;
5817
5818 if (symsecp != NULL)
5819 {
5820 asection *symsec = NULL;
5821 if ((sym->st_shndx != SHN_UNDEF
5822 && sym->st_shndx < SHN_LORESERVE)
5823 || sym->st_shndx > SHN_HIRESERVE)
5824 symsec = bfd_section_from_elf_index (ibfd, sym->st_shndx);
5825 *symsecp = symsec;
5826 }
5827
e7b938ca 5828 if (tls_maskp != NULL)
411e1bfb
AM
5829 {
5830 struct got_entry **lgot_ents;
e7b938ca 5831 char *tls_mask;
411e1bfb 5832
e7b938ca 5833 tls_mask = NULL;
411e1bfb
AM
5834 lgot_ents = elf_local_got_ents (ibfd);
5835 if (lgot_ents != NULL)
5836 {
e7b938ca
AM
5837 char *lgot_masks = (char *) (lgot_ents + symtab_hdr->sh_info);
5838 tls_mask = &lgot_masks[r_symndx];
411e1bfb 5839 }
e7b938ca 5840 *tls_maskp = tls_mask;
411e1bfb
AM
5841 }
5842 }
5843 return TRUE;
5844}
5845
e7b938ca 5846/* Returns TLS_MASKP for the given REL symbol. Function return is 0 on
951fd09b 5847 error, 2 on a toc GD type suitable for optimization, 3 on a toc LD
ad8e1ba5 5848 type suitable for optimization, and 1 otherwise. */
951fd09b
AM
5849
5850static int
0d4792f7
AM
5851get_tls_mask (char **tls_maskp, unsigned long *toc_symndx,
5852 Elf_Internal_Sym **locsymsp,
4ce794b7 5853 const Elf_Internal_Rela *rel, bfd *ibfd)
411e1bfb
AM
5854{
5855 unsigned long r_symndx;
0d4792f7 5856 int next_r;
411e1bfb
AM
5857 struct elf_link_hash_entry *h;
5858 Elf_Internal_Sym *sym;
5859 asection *sec;
5860 bfd_vma off;
5861
5862 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 5863 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 5864 return 0;
411e1bfb 5865
e7b938ca 5866 if ((*tls_maskp != NULL && **tls_maskp != 0)
411e1bfb
AM
5867 || sec == NULL
5868 || ppc64_elf_section_data (sec)->t_symndx == NULL)
951fd09b 5869 return 1;
411e1bfb
AM
5870
5871 /* Look inside a TOC section too. */
5872 if (h != NULL)
5873 {
5874 BFD_ASSERT (h->root.type == bfd_link_hash_defined);
5875 off = h->root.u.def.value;
5876 }
5877 else
5878 off = sym->st_value;
5879 off += rel->r_addend;
5880 BFD_ASSERT (off % 8 == 0);
5881 r_symndx = ppc64_elf_section_data (sec)->t_symndx[off / 8];
951fd09b 5882 next_r = ppc64_elf_section_data (sec)->t_symndx[off / 8 + 1];
e7b938ca 5883 if (!get_sym_h (&h, &sym, &sec, tls_maskp, locsymsp, r_symndx, ibfd))
951fd09b 5884 return 0;
0d4792f7
AM
5885 if (toc_symndx != NULL)
5886 *toc_symndx = r_symndx;
5887 if ((h == NULL
5888 || ((h->root.type == bfd_link_hash_defined
5889 || h->root.type == bfd_link_hash_defweak)
f5385ebf 5890 && !h->def_dynamic))
0d4792f7
AM
5891 && (next_r == -1 || next_r == -2))
5892 return 1 - next_r;
951fd09b 5893 return 1;
411e1bfb
AM
5894}
5895
754021d0 5896/* Adjust all global syms defined in opd sections. In gcc generated
8387904d 5897 code for the old ABI, these will already have been done. */
754021d0
AM
5898
5899static bfd_boolean
5900adjust_opd_syms (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
5901{
5902 struct ppc_link_hash_entry *eh;
5903 asection *sym_sec;
5904 long *opd_adjust;
5905
5906 if (h->root.type == bfd_link_hash_indirect)
5907 return TRUE;
5908
5909 if (h->root.type == bfd_link_hash_warning)
5910 h = (struct elf_link_hash_entry *) h->root.u.i.link;
5911
5912 if (h->root.type != bfd_link_hash_defined
5913 && h->root.type != bfd_link_hash_defweak)
5914 return TRUE;
5915
5916 eh = (struct ppc_link_hash_entry *) h;
5917 if (eh->adjust_done)
5918 return TRUE;
5919
5920 sym_sec = eh->elf.root.u.def.section;
4025353c
AM
5921 opd_adjust = get_opd_info (sym_sec);
5922 if (opd_adjust != NULL)
754021d0 5923 {
3f764659 5924 long adjust = opd_adjust[eh->elf.root.u.def.value / 8];
4025353c
AM
5925 if (adjust == -1)
5926 {
5927 /* This entry has been deleted. */
81688140
AM
5928 asection *dsec = ppc64_elf_tdata (sym_sec->owner)->deleted_section;
5929 if (dsec == NULL)
5930 {
5931 for (dsec = sym_sec->owner->sections; dsec; dsec = dsec->next)
5932 if (elf_discarded_section (dsec))
5933 {
5934 ppc64_elf_tdata (sym_sec->owner)->deleted_section = dsec;
5935 break;
5936 }
5937 }
4025353c 5938 eh->elf.root.u.def.value = 0;
81688140 5939 eh->elf.root.u.def.section = dsec;
4025353c
AM
5940 }
5941 else
5942 eh->elf.root.u.def.value += adjust;
754021d0
AM
5943 eh->adjust_done = 1;
5944 }
5945 return TRUE;
5946}
5947
5948/* Remove unused Official Procedure Descriptor entries. Currently we
5949 only remove those associated with functions in discarded link-once
5950 sections, or weakly defined functions that have been overridden. It
5951 would be possible to remove many more entries for statically linked
5952 applications. */
5953
b34976b6 5954bfd_boolean
3f764659
JJ
5955ppc64_elf_edit_opd (bfd *obfd, struct bfd_link_info *info,
5956 bfd_boolean non_overlapping)
1e2f5b6e
AM
5957{
5958 bfd *ibfd;
754021d0 5959 bfd_boolean some_edited = FALSE;
3f764659 5960 asection *need_pad = NULL;
1e2f5b6e 5961
411e1bfb 5962 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
1e2f5b6e
AM
5963 {
5964 asection *sec;
5965 Elf_Internal_Rela *relstart, *rel, *relend;
5966 Elf_Internal_Shdr *symtab_hdr;
6cdc0ccc 5967 Elf_Internal_Sym *local_syms;
1e2f5b6e
AM
5968 struct elf_link_hash_entry **sym_hashes;
5969 bfd_vma offset;
d6fe2dc1 5970 bfd_size_type amt;
4025353c 5971 long *opd_adjust;
3f764659
JJ
5972 bfd_boolean need_edit, add_aux_fields;
5973 bfd_size_type cnt_16b = 0;
1e2f5b6e
AM
5974
5975 sec = bfd_get_section_by_name (ibfd, ".opd");
5976 if (sec == NULL)
5977 continue;
5978
3f764659 5979 amt = sec->size * sizeof (long) / 8;
4025353c
AM
5980 opd_adjust = get_opd_info (sec);
5981 if (opd_adjust == NULL)
d6fe2dc1 5982 {
4b85d634
AM
5983 /* check_relocs hasn't been called. Must be a ld -r link
5984 or --just-symbols object. */
4025353c
AM
5985 opd_adjust = bfd_zalloc (obfd, amt);
5986 ppc64_elf_section_data (sec)->opd.adjust = opd_adjust;
d6fe2dc1 5987 }
4025353c 5988 memset (opd_adjust, 0, amt);
1e2f5b6e 5989
4b85d634
AM
5990 if (sec->sec_info_type == ELF_INFO_TYPE_JUST_SYMS)
5991 continue;
5992
1e2f5b6e
AM
5993 if (sec->output_section == bfd_abs_section_ptr)
5994 continue;
5995
5996 /* Look through the section relocs. */
5997 if ((sec->flags & SEC_RELOC) == 0 || sec->reloc_count == 0)
5998 continue;
5999
6cdc0ccc 6000 local_syms = NULL;
1e2f5b6e
AM
6001 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6002 sym_hashes = elf_sym_hashes (ibfd);
6003
6004 /* Read the relocations. */
4ce794b7 6005 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 6006 info->keep_memory);
1e2f5b6e 6007 if (relstart == NULL)
b34976b6 6008 return FALSE;
1e2f5b6e
AM
6009
6010 /* First run through the relocs to check they are sane, and to
6011 determine whether we need to edit this opd section. */
b34976b6 6012 need_edit = FALSE;
3f764659 6013 need_pad = sec;
1e2f5b6e
AM
6014 offset = 0;
6015 relend = relstart + sec->reloc_count;
50bc7936 6016 for (rel = relstart; rel < relend; )
1e2f5b6e 6017 {
04c9666a 6018 enum elf_ppc64_reloc_type r_type;
1e2f5b6e
AM
6019 unsigned long r_symndx;
6020 asection *sym_sec;
6021 struct elf_link_hash_entry *h;
6022 Elf_Internal_Sym *sym;
6023
3f764659 6024 /* .opd contains a regular array of 16 or 24 byte entries. We're
1e2f5b6e
AM
6025 only interested in the reloc pointing to a function entry
6026 point. */
50bc7936
AM
6027 if (rel->r_offset != offset
6028 || rel + 1 >= relend
6029 || (rel + 1)->r_offset != offset + 8)
1e2f5b6e
AM
6030 {
6031 /* If someone messes with .opd alignment then after a
6032 "ld -r" we might have padding in the middle of .opd.
6033 Also, there's nothing to prevent someone putting
6034 something silly in .opd with the assembler. No .opd
b34976b6 6035 optimization for them! */
3f764659 6036 broken_opd:
1e2f5b6e 6037 (*_bfd_error_handler)
d003868e 6038 (_("%B: .opd is not a regular array of opd entries"), ibfd);
b34976b6 6039 need_edit = FALSE;
1e2f5b6e
AM
6040 break;
6041 }
6042
50bc7936
AM
6043 if ((r_type = ELF64_R_TYPE (rel->r_info)) != R_PPC64_ADDR64
6044 || (r_type = ELF64_R_TYPE ((rel + 1)->r_info)) != R_PPC64_TOC)
6045 {
6046 (*_bfd_error_handler)
d003868e
AM
6047 (_("%B: unexpected reloc type %u in .opd section"),
6048 ibfd, r_type);
50bc7936
AM
6049 need_edit = FALSE;
6050 break;
6051 }
6052
1e2f5b6e 6053 r_symndx = ELF64_R_SYM (rel->r_info);
411e1bfb
AM
6054 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6055 r_symndx, ibfd))
50bc7936 6056 goto error_ret;
1e2f5b6e
AM
6057
6058 if (sym_sec == NULL || sym_sec->owner == NULL)
6059 {
411e1bfb
AM
6060 const char *sym_name;
6061 if (h != NULL)
6062 sym_name = h->root.root.string;
6063 else
be8dd2ca 6064 sym_name = bfd_elf_sym_name (ibfd, symtab_hdr, sym);
411e1bfb 6065
1e2f5b6e 6066 (*_bfd_error_handler)
d003868e
AM
6067 (_("%B: undefined sym `%s' in .opd section"),
6068 ibfd, sym_name);
b34976b6 6069 need_edit = FALSE;
1e2f5b6e
AM
6070 break;
6071 }
6072
51020317
AM
6073 /* opd entries are always for functions defined in the
6074 current input bfd. If the symbol isn't defined in the
6075 input bfd, then we won't be using the function in this
6076 bfd; It must be defined in a linkonce section in another
6077 bfd, or is weak. It's also possible that we are
6078 discarding the function due to a linker script /DISCARD/,
6079 which we test for via the output_section. */
6080 if (sym_sec->owner != ibfd
6081 || sym_sec->output_section == bfd_abs_section_ptr)
b34976b6 6082 need_edit = TRUE;
1e2f5b6e 6083
50bc7936 6084 rel += 2;
3f764659
JJ
6085 if (rel == relend
6086 || (rel + 1 == relend && rel->r_offset == offset + 16))
6087 {
6088 if (sec->size == offset + 24)
6089 {
6090 need_pad = NULL;
6091 break;
6092 }
6093 if (rel == relend && sec->size == offset + 16)
6094 {
6095 cnt_16b++;
6096 break;
6097 }
6098 goto broken_opd;
6099 }
6100
6101 if (rel->r_offset == offset + 24)
6102 offset += 24;
6103 else if (rel->r_offset != offset + 16)
6104 goto broken_opd;
6105 else if (rel + 1 < relend
6106 && ELF64_R_TYPE (rel[0].r_info) == R_PPC64_ADDR64
6107 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_TOC)
6108 {
6109 offset += 16;
6110 cnt_16b++;
6111 }
6112 else if (rel + 2 < relend
6113 && ELF64_R_TYPE (rel[1].r_info) == R_PPC64_ADDR64
6114 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_TOC)
6115 {
6116 offset += 24;
6117 rel += 1;
6118 }
6119 else
6120 goto broken_opd;
1e2f5b6e
AM
6121 }
6122
3f764659
JJ
6123 add_aux_fields = non_overlapping && cnt_16b > 0;
6124
6125 if (need_edit || add_aux_fields)
1e2f5b6e
AM
6126 {
6127 Elf_Internal_Rela *write_rel;
6128 bfd_byte *rptr, *wptr;
3f764659 6129 bfd_byte *new_contents = NULL;
b34976b6 6130 bfd_boolean skip;
3f764659 6131 long opd_ent_size;
1e2f5b6e
AM
6132
6133 /* This seems a waste of time as input .opd sections are all
6134 zeros as generated by gcc, but I suppose there's no reason
6135 this will always be so. We might start putting something in
6136 the third word of .opd entries. */
6137 if ((sec->flags & SEC_IN_MEMORY) == 0)
6138 {
eea6121a
AM
6139 bfd_byte *loc;
6140 if (!bfd_malloc_and_get_section (ibfd, sec, &loc))
6cdc0ccc 6141 {
eea6121a
AM
6142 if (loc != NULL)
6143 free (loc);
50bc7936 6144 error_ret:
6cdc0ccc
AM
6145 if (local_syms != NULL
6146 && symtab_hdr->contents != (unsigned char *) local_syms)
6147 free (local_syms);
6cdc0ccc
AM
6148 if (elf_section_data (sec)->relocs != relstart)
6149 free (relstart);
b34976b6 6150 return FALSE;
6cdc0ccc 6151 }
1e2f5b6e
AM
6152 sec->contents = loc;
6153 sec->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6154 }
6155
6156 elf_section_data (sec)->relocs = relstart;
6157
6158 wptr = sec->contents;
6159 rptr = sec->contents;
3f764659
JJ
6160 new_contents = sec->contents;
6161
6162 if (add_aux_fields)
6163 {
6164 new_contents = bfd_malloc (sec->size + cnt_16b * 8);
6165 if (new_contents == NULL)
6166 return FALSE;
6167 need_pad = FALSE;
6168 wptr = new_contents;
6169 }
6170
1e2f5b6e 6171 write_rel = relstart;
b34976b6 6172 skip = FALSE;
1e2f5b6e 6173 offset = 0;
3f764659 6174 opd_ent_size = 0;
1e2f5b6e
AM
6175 for (rel = relstart; rel < relend; rel++)
6176 {
50bc7936
AM
6177 unsigned long r_symndx;
6178 asection *sym_sec;
6179 struct elf_link_hash_entry *h;
6180 Elf_Internal_Sym *sym;
6181
6182 r_symndx = ELF64_R_SYM (rel->r_info);
6183 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
d37c89e5 6184 r_symndx, ibfd))
50bc7936
AM
6185 goto error_ret;
6186
1e2f5b6e
AM
6187 if (rel->r_offset == offset)
6188 {
50bc7936 6189 struct ppc_link_hash_entry *fdh = NULL;
3f764659
JJ
6190
6191 /* See if the .opd entry is full 24 byte or
6192 16 byte (with fd_aux entry overlapped with next
6193 fd_func). */
6194 opd_ent_size = 24;
6195 if ((rel + 2 == relend && sec->size == offset + 16)
6196 || (rel + 3 < relend
6197 && rel[2].r_offset == offset + 16
6198 && rel[3].r_offset == offset + 24
6199 && ELF64_R_TYPE (rel[2].r_info) == R_PPC64_ADDR64
6200 && ELF64_R_TYPE (rel[3].r_info) == R_PPC64_TOC))
6201 opd_ent_size = 16;
6202
4025353c
AM
6203 if (h != NULL
6204 && h->root.root.string[0] == '.')
c4f68ce3
AM
6205 {
6206 fdh = get_fdh ((struct ppc_link_hash_entry *) h,
6207 ppc_hash_table (info));
6208 if (fdh != NULL
6209 && fdh->elf.root.type != bfd_link_hash_defined
6210 && fdh->elf.root.type != bfd_link_hash_defweak)
6211 fdh = NULL;
6212 }
1e2f5b6e 6213
51020317
AM
6214 skip = (sym_sec->owner != ibfd
6215 || sym_sec->output_section == bfd_abs_section_ptr);
a4aa0fb7
AM
6216 if (skip)
6217 {
4025353c 6218 if (fdh != NULL && sym_sec->owner == ibfd)
a4aa0fb7
AM
6219 {
6220 /* Arrange for the function descriptor sym
6221 to be dropped. */
d6fe2dc1
AM
6222 fdh->elf.root.u.def.value = 0;
6223 fdh->elf.root.u.def.section = sym_sec;
a4aa0fb7 6224 }
3f764659 6225 opd_adjust[rel->r_offset / 8] = -1;
a4aa0fb7
AM
6226 }
6227 else
1e2f5b6e
AM
6228 {
6229 /* We'll be keeping this opd entry. */
6230
4025353c 6231 if (fdh != NULL)
1e2f5b6e 6232 {
754021d0
AM
6233 /* Redefine the function descriptor symbol to
6234 this location in the opd section. It is
6235 necessary to update the value here rather
6236 than using an array of adjustments as we do
6237 for local symbols, because various places
6238 in the generic ELF code use the value
6239 stored in u.def.value. */
3f764659 6240 fdh->elf.root.u.def.value = wptr - new_contents;
754021d0 6241 fdh->adjust_done = 1;
1e2f5b6e 6242 }
754021d0
AM
6243
6244 /* Local syms are a bit tricky. We could
6245 tweak them as they can be cached, but
6246 we'd need to look through the local syms
6247 for the function descriptor sym which we
6248 don't have at the moment. So keep an
6249 array of adjustments. */
3f764659
JJ
6250 opd_adjust[rel->r_offset / 8]
6251 = (wptr - new_contents) - (rptr - sec->contents);
1e2f5b6e
AM
6252
6253 if (wptr != rptr)
3f764659
JJ
6254 memcpy (wptr, rptr, opd_ent_size);
6255 wptr += opd_ent_size;
6256 if (add_aux_fields && opd_ent_size == 16)
6257 {
6258 memset (wptr, '\0', 8);
6259 wptr += 8;
6260 }
1e2f5b6e 6261 }
3f764659
JJ
6262 rptr += opd_ent_size;
6263 offset += opd_ent_size;
1e2f5b6e
AM
6264 }
6265
50bc7936
AM
6266 if (skip)
6267 {
6268 BFD_ASSERT (MUST_BE_DYN_RELOC (ELF64_R_TYPE (rel->r_info)));
6269 if (info->shared)
6270 {
6271 /* We won't be needing dynamic relocs here. */
6272 struct ppc_dyn_relocs **pp;
6273 struct ppc_dyn_relocs *p;
6274
6275 if (h != NULL)
6276 pp = &((struct ppc_link_hash_entry *) h)->dyn_relocs;
6277 else if (sym_sec != NULL)
6278 pp = ((struct ppc_dyn_relocs **)
6279 &elf_section_data (sym_sec)->local_dynrel);
6280 else
6281 pp = ((struct ppc_dyn_relocs **)
6282 &elf_section_data (sec)->local_dynrel);
6283 while ((p = *pp) != NULL)
6284 {
6285 if (p->sec == sec)
6286 {
6287 p->count -= 1;
6288 if (p->count == 0)
d37c89e5 6289 *pp = p->next;
50bc7936
AM
6290 break;
6291 }
6292 pp = &p->next;
6293 }
6294 }
6295 }
6296 else
1e2f5b6e 6297 {
50bc7936
AM
6298 /* We need to adjust any reloc offsets to point to the
6299 new opd entries. While we're at it, we may as well
6300 remove redundant relocs. */
3f764659 6301 rel->r_offset += opd_adjust[(offset - opd_ent_size) / 8];
1e2f5b6e
AM
6302 if (write_rel != rel)
6303 memcpy (write_rel, rel, sizeof (*rel));
6304 ++write_rel;
6305 }
6306 }
6307
3f764659 6308 sec->size = wptr - new_contents;
1e2f5b6e 6309 sec->reloc_count = write_rel - relstart;
3f764659
JJ
6310 if (add_aux_fields)
6311 {
6312 free (sec->contents);
6313 sec->contents = new_contents;
6314 }
6315
cdcf6e38
AM
6316 /* Fudge the size too, as this is used later in
6317 elf_bfd_final_link if we are emitting relocs. */
6318 elf_section_data (sec)->rel_hdr.sh_size
6319 = sec->reloc_count * elf_section_data (sec)->rel_hdr.sh_entsize;
6320 BFD_ASSERT (elf_section_data (sec)->rel_hdr2 == NULL);
754021d0 6321 some_edited = TRUE;
1e2f5b6e 6322 }
6cdc0ccc 6323 else if (elf_section_data (sec)->relocs != relstart)
1e2f5b6e 6324 free (relstart);
6cdc0ccc 6325
411e1bfb
AM
6326 if (local_syms != NULL
6327 && symtab_hdr->contents != (unsigned char *) local_syms)
6328 {
6329 if (!info->keep_memory)
6330 free (local_syms);
6331 else
6332 symtab_hdr->contents = (unsigned char *) local_syms;
6333 }
6334 }
6335
754021d0
AM
6336 if (some_edited)
6337 elf_link_hash_traverse (elf_hash_table (info), adjust_opd_syms, NULL);
6338
3f764659
JJ
6339 /* If we are doing a final link and the last .opd entry is just 16 byte
6340 long, add a 8 byte padding after it. */
6341 if (need_pad != NULL && !info->relocatable)
6342 {
6343 bfd_byte *p;
6344
6345 if ((need_pad->flags & SEC_IN_MEMORY) == 0)
6346 {
6347 BFD_ASSERT (need_pad->size > 0);
6348
6349 p = bfd_malloc (need_pad->size + 8);
6350 if (p == NULL)
6351 return FALSE;
699733f6 6352
3f764659
JJ
6353 if (! bfd_get_section_contents (need_pad->owner, need_pad,
6354 p, 0, need_pad->size))
6355 return FALSE;
6356
6357 need_pad->contents = p;
6358 need_pad->flags |= (SEC_IN_MEMORY | SEC_HAS_CONTENTS);
6359 }
6360 else
6361 {
6362 p = bfd_realloc (need_pad->contents, need_pad->size + 8);
6363 if (p == NULL)
6364 return FALSE;
6365
6366 need_pad->contents = p;
6367 }
6368
6369 memset (need_pad->contents + need_pad->size, 0, 8);
6370 need_pad->size += 8;
6371 }
6372
411e1bfb
AM
6373 return TRUE;
6374}
6375
e1918d23 6376/* Set htab->tls_get_addr and call the generic ELF tls_setup function. */
411e1bfb 6377
e1918d23 6378asection *
4ce794b7 6379ppc64_elf_tls_setup (bfd *obfd, struct bfd_link_info *info)
411e1bfb 6380{
411e1bfb
AM
6381 struct ppc_link_hash_table *htab;
6382
411e1bfb 6383 htab = ppc_hash_table (info);
a48ebf4d
AM
6384 if (htab->tls_get_addr != NULL)
6385 {
8387904d 6386 struct ppc_link_hash_entry *h = htab->tls_get_addr;
a48ebf4d 6387
8387904d
AM
6388 while (h->elf.root.type == bfd_link_hash_indirect
6389 || h->elf.root.type == bfd_link_hash_warning)
6390 h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
a48ebf4d
AM
6391
6392 htab->tls_get_addr = h;
8387904d
AM
6393
6394 if (htab->tls_get_addr_fd == NULL
6395 && h->oh != NULL
c4f68ce3
AM
6396 && h->oh->is_func_descriptor
6397 && (h->oh->elf.root.type == bfd_link_hash_defined
6398 || h->oh->elf.root.type == bfd_link_hash_defweak))
8387904d
AM
6399 htab->tls_get_addr_fd = h->oh;
6400 }
6401
6402 if (htab->tls_get_addr_fd != NULL)
6403 {
6404 struct ppc_link_hash_entry *h = htab->tls_get_addr_fd;
6405
6406 while (h->elf.root.type == bfd_link_hash_indirect
6407 || h->elf.root.type == bfd_link_hash_warning)
6408 h = (struct ppc_link_hash_entry *) h->elf.root.u.i.link;
6409
6410 htab->tls_get_addr_fd = h;
a48ebf4d
AM
6411 }
6412
e1918d23 6413 return _bfd_elf_tls_setup (obfd, info);
951fd09b 6414}
411e1bfb 6415
951fd09b
AM
6416/* Run through all the TLS relocs looking for optimization
6417 opportunities. The linker has been hacked (see ppc64elf.em) to do
6418 a preliminary section layout so that we know the TLS segment
6419 offsets. We can't optimize earlier because some optimizations need
6420 to know the tp offset, and we need to optimize before allocating
6421 dynamic relocations. */
6422
6423bfd_boolean
4ce794b7 6424ppc64_elf_tls_optimize (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
951fd09b
AM
6425{
6426 bfd *ibfd;
6427 asection *sec;
6428 struct ppc_link_hash_table *htab;
6429
1049f94e 6430 if (info->relocatable || info->shared)
411e1bfb
AM
6431 return TRUE;
6432
951fd09b 6433 htab = ppc_hash_table (info);
411e1bfb
AM
6434 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6435 {
6436 Elf_Internal_Sym *locsyms = NULL;
6437
6438 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6439 if (sec->has_tls_reloc && !bfd_is_abs_section (sec->output_section))
6440 {
6441 Elf_Internal_Rela *relstart, *rel, *relend;
6442 int expecting_tls_get_addr;
6443
6444 /* Read the relocations. */
4ce794b7 6445 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
45d6a902 6446 info->keep_memory);
411e1bfb
AM
6447 if (relstart == NULL)
6448 return FALSE;
6449
6450 expecting_tls_get_addr = 0;
6451 relend = relstart + sec->reloc_count;
6452 for (rel = relstart; rel < relend; rel++)
6453 {
6454 enum elf_ppc64_reloc_type r_type;
6455 unsigned long r_symndx;
6456 struct elf_link_hash_entry *h;
6457 Elf_Internal_Sym *sym;
6458 asection *sym_sec;
e7b938ca
AM
6459 char *tls_mask;
6460 char tls_set, tls_clear, tls_type = 0;
411e1bfb 6461 bfd_vma value;
951fd09b 6462 bfd_boolean ok_tprel, is_local;
411e1bfb
AM
6463
6464 r_symndx = ELF64_R_SYM (rel->r_info);
e7b938ca 6465 if (!get_sym_h (&h, &sym, &sym_sec, &tls_mask, &locsyms,
411e1bfb
AM
6466 r_symndx, ibfd))
6467 {
6468 err_free_rel:
6469 if (elf_section_data (sec)->relocs != relstart)
6470 free (relstart);
6471 if (locsyms != NULL
6472 && (elf_tdata (ibfd)->symtab_hdr.contents
6473 != (unsigned char *) locsyms))
6474 free (locsyms);
6475 return FALSE;
6476 }
6477
6478 if (h != NULL)
6479 {
6480 if (h->root.type != bfd_link_hash_defined
6481 && h->root.type != bfd_link_hash_defweak)
6482 continue;
6483 value = h->root.u.def.value;
6484 }
6485 else
4025353c
AM
6486 /* Symbols referenced by TLS relocs must be of type
6487 STT_TLS. So no need for .opd local sym adjust. */
6488 value = sym->st_value;
951fd09b 6489
411e1bfb 6490 ok_tprel = FALSE;
951fd09b
AM
6491 is_local = FALSE;
6492 if (h == NULL
f5385ebf 6493 || !h->def_dynamic)
411e1bfb 6494 {
951fd09b 6495 is_local = TRUE;
411e1bfb
AM
6496 value += sym_sec->output_offset;
6497 value += sym_sec->output_section->vma;
e1918d23 6498 value -= htab->elf.tls_sec->vma;
411e1bfb
AM
6499 ok_tprel = (value + TP_OFFSET + ((bfd_vma) 1 << 31)
6500 < (bfd_vma) 1 << 32);
6501 }
6502
4ce794b7 6503 r_type = ELF64_R_TYPE (rel->r_info);
411e1bfb
AM
6504 switch (r_type)
6505 {
6506 case R_PPC64_GOT_TLSLD16:
6507 case R_PPC64_GOT_TLSLD16_LO:
6508 case R_PPC64_GOT_TLSLD16_HI:
6509 case R_PPC64_GOT_TLSLD16_HA:
951fd09b
AM
6510 /* These relocs should never be against a symbol
6511 defined in a shared lib. Leave them alone if
6512 that turns out to be the case. */
e717da7e 6513 ppc64_tlsld_got (ibfd)->refcount -= 1;
951fd09b
AM
6514 if (!is_local)
6515 continue;
6516
951fd09b
AM
6517 /* LD -> LE */
6518 tls_set = 0;
6519 tls_clear = TLS_LD;
e7b938ca 6520 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
6521 expecting_tls_get_addr = 1;
6522 break;
6523
6524 case R_PPC64_GOT_TLSGD16:
6525 case R_PPC64_GOT_TLSGD16_LO:
6526 case R_PPC64_GOT_TLSGD16_HI:
6527 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 6528 if (ok_tprel)
411e1bfb
AM
6529 /* GD -> LE */
6530 tls_set = 0;
6531 else
6532 /* GD -> IE */
951fd09b
AM
6533 tls_set = TLS_TLS | TLS_TPRELGD;
6534 tls_clear = TLS_GD;
e7b938ca 6535 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
6536 expecting_tls_get_addr = 1;
6537 break;
6538
6539 case R_PPC64_GOT_TPREL16_DS:
6540 case R_PPC64_GOT_TPREL16_LO_DS:
6541 case R_PPC64_GOT_TPREL16_HI:
6542 case R_PPC64_GOT_TPREL16_HA:
6543 expecting_tls_get_addr = 0;
6544 if (ok_tprel)
6545 {
6546 /* IE -> LE */
6547 tls_set = 0;
6548 tls_clear = TLS_TPREL;
e7b938ca 6549 tls_type = TLS_TLS | TLS_TPREL;
411e1bfb
AM
6550 break;
6551 }
6552 else
6553 continue;
6554
6555 case R_PPC64_REL14:
6556 case R_PPC64_REL14_BRTAKEN:
6557 case R_PPC64_REL14_BRNTAKEN:
6558 case R_PPC64_REL24:
6559 if (h != NULL
8387904d
AM
6560 && (h == &htab->tls_get_addr->elf
6561 || h == &htab->tls_get_addr_fd->elf))
411e1bfb
AM
6562 {
6563 if (!expecting_tls_get_addr
6564 && rel != relstart
6565 && ((ELF64_R_TYPE (rel[-1].r_info)
6566 == R_PPC64_TOC16)
6567 || (ELF64_R_TYPE (rel[-1].r_info)
6568 == R_PPC64_TOC16_LO)))
6569 {
6570 /* Check for toc tls entries. */
6571 char *toc_tls;
951fd09b 6572 int retval;
411e1bfb 6573
0d4792f7 6574 retval = get_tls_mask (&toc_tls, NULL, &locsyms,
951fd09b
AM
6575 rel - 1, ibfd);
6576 if (retval == 0)
411e1bfb
AM
6577 goto err_free_rel;
6578 if (toc_tls != NULL)
951fd09b 6579 expecting_tls_get_addr = retval > 1;
411e1bfb
AM
6580 }
6581
6582 if (expecting_tls_get_addr)
6583 {
6584 struct plt_entry *ent;
6585 for (ent = h->plt.plist; ent; ent = ent->next)
6586 if (ent->addend == 0)
6587 {
6588 if (ent->plt.refcount > 0)
6589 ent->plt.refcount -= 1;
6590 break;
6591 }
6592 }
6593 }
6594 expecting_tls_get_addr = 0;
6595 continue;
6596
6597 case R_PPC64_TPREL64:
6598 expecting_tls_get_addr = 0;
6599 if (ok_tprel)
6600 {
6601 /* IE -> LE */
6602 tls_set = TLS_EXPLICIT;
6603 tls_clear = TLS_TPREL;
6604 break;
6605 }
6606 else
6607 continue;
6608
6609 case R_PPC64_DTPMOD64:
6610 expecting_tls_get_addr = 0;
951fd09b
AM
6611 if (rel + 1 < relend
6612 && (rel[1].r_info
6613 == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64))
6614 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 6615 {
951fd09b 6616 if (ok_tprel)
411e1bfb 6617 /* GD -> LE */
951fd09b 6618 tls_set = TLS_EXPLICIT | TLS_GD;
411e1bfb
AM
6619 else
6620 /* GD -> IE */
951fd09b
AM
6621 tls_set = TLS_EXPLICIT | TLS_GD | TLS_TPRELGD;
6622 tls_clear = TLS_GD;
411e1bfb
AM
6623 }
6624 else
6625 {
951fd09b
AM
6626 if (!is_local)
6627 continue;
6628
6629 /* LD -> LE */
6630 tls_set = TLS_EXPLICIT;
6631 tls_clear = TLS_LD;
411e1bfb
AM
6632 }
6633 break;
6634
6635 default:
6636 expecting_tls_get_addr = 0;
6637 continue;
6638 }
6639
6640 if ((tls_set & TLS_EXPLICIT) == 0)
6641 {
6642 struct got_entry *ent;
6643
6644 /* Adjust got entry for this reloc. */
6645 if (h != NULL)
6646 ent = h->got.glist;
6647 else
6648 ent = elf_local_got_ents (ibfd)[r_symndx];
6649
6650 for (; ent != NULL; ent = ent->next)
6651 if (ent->addend == rel->r_addend
e717da7e 6652 && ent->owner == ibfd
e7b938ca 6653 && ent->tls_type == tls_type)
411e1bfb
AM
6654 break;
6655 if (ent == NULL)
6656 abort ();
6657
6658 if (tls_set == 0)
6659 {
6660 /* We managed to get rid of a got entry. */
6661 if (ent->got.refcount > 0)
6662 ent->got.refcount -= 1;
6663 }
411e1bfb
AM
6664 }
6665 else if (h != NULL)
6666 {
6667 struct ppc_link_hash_entry * eh;
6668 struct ppc_dyn_relocs **pp;
6669 struct ppc_dyn_relocs *p;
6670
6671 /* Adjust dynamic relocs. */
6672 eh = (struct ppc_link_hash_entry *) h;
6673 for (pp = &eh->dyn_relocs;
6674 (p = *pp) != NULL;
6675 pp = &p->next)
6676 if (p->sec == sec)
6677 {
6678 /* If we got rid of a DTPMOD/DTPREL reloc
6679 pair then we'll lose one or two dyn
6680 relocs. */
951fd09b 6681 if (tls_set == (TLS_EXPLICIT | TLS_GD))
411e1bfb 6682 p->count -= 1;
951fd09b 6683 p->count -= 1;
411e1bfb
AM
6684 if (p->count == 0)
6685 *pp = p->next;
6686 break;
6687 }
6688 }
6689
e7b938ca
AM
6690 *tls_mask |= tls_set;
6691 *tls_mask &= ~tls_clear;
411e1bfb
AM
6692 }
6693
6694 if (elf_section_data (sec)->relocs != relstart)
6695 free (relstart);
6696 }
6697
6698 if (locsyms != NULL
6699 && (elf_tdata (ibfd)->symtab_hdr.contents
6700 != (unsigned char *) locsyms))
6cdc0ccc
AM
6701 {
6702 if (!info->keep_memory)
411e1bfb 6703 free (locsyms);
6cdc0ccc 6704 else
411e1bfb 6705 elf_tdata (ibfd)->symtab_hdr.contents = (unsigned char *) locsyms;
6cdc0ccc 6706 }
1e2f5b6e 6707 }
b34976b6 6708 return TRUE;
1e2f5b6e 6709}
b34976b6 6710
c5614fa4
AM
6711/* Called via elf_link_hash_traverse from ppc64_elf_edit_toc to adjust
6712 the values of any global symbols in a toc section that has been
6713 edited. Globals in toc sections should be a rarity, so this function
6714 sets a flag if any are found in toc sections other than the one just
6715 edited, so that futher hash table traversals can be avoided. */
6716
6717struct adjust_toc_info
6718{
6719 asection *toc;
6720 unsigned long *skip;
6721 bfd_boolean global_toc_syms;
6722};
6723
6724static bfd_boolean
6725adjust_toc_syms (struct elf_link_hash_entry *h, void *inf)
6726{
6727 struct ppc_link_hash_entry *eh;
6728 struct adjust_toc_info *toc_inf = (struct adjust_toc_info *) inf;
6729
6730 if (h->root.type == bfd_link_hash_indirect)
6731 return TRUE;
6732
6733 if (h->root.type == bfd_link_hash_warning)
6734 h = (struct elf_link_hash_entry *) h->root.u.i.link;
6735
6736 if (h->root.type != bfd_link_hash_defined
6737 && h->root.type != bfd_link_hash_defweak)
6738 return TRUE;
6739
6740 eh = (struct ppc_link_hash_entry *) h;
6741 if (eh->adjust_done)
6742 return TRUE;
6743
6744 if (eh->elf.root.u.def.section == toc_inf->toc)
6745 {
6746 unsigned long skip = toc_inf->skip[eh->elf.root.u.def.value >> 3];
6747 if (skip != (unsigned long) -1)
6748 eh->elf.root.u.def.value -= skip;
6749 else
6750 {
6751 (*_bfd_error_handler)
6752 (_("%s defined in removed toc entry"), eh->elf.root.root.string);
6753 eh->elf.root.u.def.section = &bfd_abs_section;
6754 eh->elf.root.u.def.value = 0;
6755 }
6756 eh->adjust_done = 1;
6757 }
6758 else if (strcmp (eh->elf.root.u.def.section->name, ".toc") == 0)
6759 toc_inf->global_toc_syms = TRUE;
6760
6761 return TRUE;
6762}
6763
6764/* Examine all relocs referencing .toc sections in order to remove
6765 unused .toc entries. */
6766
6767bfd_boolean
6768ppc64_elf_edit_toc (bfd *obfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
6769{
6770 bfd *ibfd;
6771 struct adjust_toc_info toc_inf;
6772
6773 toc_inf.global_toc_syms = TRUE;
6774 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
6775 {
6776 asection *toc, *sec;
6777 Elf_Internal_Shdr *symtab_hdr;
6778 Elf_Internal_Sym *local_syms;
6779 struct elf_link_hash_entry **sym_hashes;
6780 Elf_Internal_Rela *relstart, *rel, *wrel;
6781 unsigned long *skip, *drop;
6782 unsigned char *used;
6783 unsigned char *keep, last, some_unused;
6784
6785 toc = bfd_get_section_by_name (ibfd, ".toc");
6786 if (toc == NULL
6787 || toc->sec_info_type == ELF_INFO_TYPE_JUST_SYMS
6788 || elf_discarded_section (toc))
6789 continue;
6790
6791 local_syms = NULL;
6792 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
6793 sym_hashes = elf_sym_hashes (ibfd);
6794
6795 /* Look at sections dropped from the final link. */
6796 skip = NULL;
6797 relstart = NULL;
6798 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
6799 {
6800 if (sec->reloc_count == 0
6801 || !elf_discarded_section (sec)
6802 || get_opd_info (sec)
6803 || (sec->flags & SEC_ALLOC) == 0
6804 || (sec->flags & SEC_DEBUGGING) != 0)
6805 continue;
6806
6807 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, FALSE);
6808 if (relstart == NULL)
6809 goto error_ret;
6810
6811 /* Run through the relocs to see which toc entries might be
6812 unused. */
6813 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
6814 {
6815 enum elf_ppc64_reloc_type r_type;
6816 unsigned long r_symndx;
6817 asection *sym_sec;
6818 struct elf_link_hash_entry *h;
6819 Elf_Internal_Sym *sym;
6820 bfd_vma val;
6821
6822 r_type = ELF64_R_TYPE (rel->r_info);
6823 switch (r_type)
6824 {
6825 default:
6826 continue;
6827
6828 case R_PPC64_TOC16:
6829 case R_PPC64_TOC16_LO:
6830 case R_PPC64_TOC16_HI:
6831 case R_PPC64_TOC16_HA:
6832 case R_PPC64_TOC16_DS:
6833 case R_PPC64_TOC16_LO_DS:
6834 break;
6835 }
6836
6837 r_symndx = ELF64_R_SYM (rel->r_info);
6838 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6839 r_symndx, ibfd))
6840 goto error_ret;
6841
6842 if (sym_sec != toc)
6843 continue;
6844
6845 if (h != NULL)
6846 val = h->root.u.def.value;
6847 else
6848 val = sym->st_value;
6849 val += rel->r_addend;
6850
6851 if (val >= toc->size)
6852 continue;
6853
6854 /* Anything in the toc ought to be aligned to 8 bytes.
6855 If not, don't mark as unused. */
6856 if (val & 7)
6857 continue;
6858
6859 if (skip == NULL)
6860 {
6861 skip = bfd_zmalloc (sizeof (*skip) * (toc->size + 7) / 8);
6862 if (skip == NULL)
6863 goto error_ret;
6864 }
6865
6866 skip[val >> 3] = 1;
6867 }
6868
6869 if (elf_section_data (sec)->relocs != relstart)
6870 free (relstart);
6871 }
6872
6873 if (skip == NULL)
6874 continue;
6875
6876 used = bfd_zmalloc (sizeof (*used) * (toc->size + 7) / 8);
6877 if (used == NULL)
6878 {
6879 error_ret:
6880 if (local_syms != NULL
6881 && symtab_hdr->contents != (unsigned char *) local_syms)
6882 free (local_syms);
6883 if (sec != NULL
6884 && relstart != NULL
6885 && elf_section_data (sec)->relocs != relstart)
6886 free (relstart);
6887 if (skip != NULL)
6888 free (skip);
6889 return FALSE;
6890 }
6891
6892 /* Now check all kept sections that might reference the toc. */
6893 for (sec = ibfd->sections;
6894 sec != NULL;
6895 /* Check the toc itself last. */
6896 sec = (sec == toc ? NULL
6897 : sec->next == toc && sec->next->next ? sec->next->next
6898 : sec->next == NULL ? toc
6899 : sec->next))
6900 {
6901 int repeat;
6902
6903 if (sec->reloc_count == 0
6904 || elf_discarded_section (sec)
6905 || get_opd_info (sec)
6906 || (sec->flags & SEC_ALLOC) == 0
6907 || (sec->flags & SEC_DEBUGGING) != 0)
6908 continue;
6909
6910 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL, TRUE);
6911 if (relstart == NULL)
6912 goto error_ret;
6913
6914 /* Mark toc entries referenced as used. */
6915 repeat = 0;
6916 do
6917 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
6918 {
6919 enum elf_ppc64_reloc_type r_type;
6920 unsigned long r_symndx;
6921 asection *sym_sec;
6922 struct elf_link_hash_entry *h;
6923 Elf_Internal_Sym *sym;
6924 bfd_vma val;
6925
6926 r_type = ELF64_R_TYPE (rel->r_info);
6927 switch (r_type)
6928 {
6929 case R_PPC64_TOC16:
6930 case R_PPC64_TOC16_LO:
6931 case R_PPC64_TOC16_HI:
6932 case R_PPC64_TOC16_HA:
6933 case R_PPC64_TOC16_DS:
6934 case R_PPC64_TOC16_LO_DS:
6935 /* In case we're taking addresses of toc entries. */
6936 case R_PPC64_ADDR64:
6937 break;
6938
6939 default:
6940 continue;
6941 }
6942
6943 r_symndx = ELF64_R_SYM (rel->r_info);
6944 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
6945 r_symndx, ibfd))
6946 {
6947 free (used);
6948 goto error_ret;
6949 }
6950
6951 if (sym_sec != toc)
6952 continue;
6953
6954 if (h != NULL)
6955 val = h->root.u.def.value;
6956 else
6957 val = sym->st_value;
6958 val += rel->r_addend;
6959
6960 if (val >= toc->size)
6961 continue;
6962
6963 /* For the toc section, we only mark as used if
6964 this entry itself isn't unused. */
6965 if (sec == toc
6966 && !used[val >> 3]
6967 && (used[rel->r_offset >> 3]
6968 || !skip[rel->r_offset >> 3]))
6969 /* Do all the relocs again, to catch reference
6970 chains. */
6971 repeat = 1;
6972
6973 used[val >> 3] = 1;
6974 }
6975 while (repeat);
6976 }
6977
6978 /* Merge the used and skip arrays. Assume that TOC
6979 doublewords not appearing as either used or unused belong
6980 to to an entry more than one doubleword in size. */
6981 for (drop = skip, keep = used, last = 0, some_unused = 0;
6982 drop < skip + (toc->size + 7) / 8;
6983 ++drop, ++keep)
6984 {
6985 if (*keep)
6986 {
6987 *drop = 0;
6988 last = 0;
6989 }
6990 else if (*drop)
6991 {
6992 some_unused = 1;
6993 last = 1;
6994 }
6995 else
6996 *drop = last;
6997 }
6998
6999 free (used);
7000
7001 if (some_unused)
7002 {
7003 bfd_byte *contents, *src;
7004 unsigned long off;
7005
7006 /* Shuffle the toc contents, and at the same time convert the
7007 skip array from booleans into offsets. */
7008 if (!bfd_malloc_and_get_section (ibfd, toc, &contents))
7009 goto error_ret;
7010
7011 elf_section_data (toc)->this_hdr.contents = contents;
7012
7013 for (src = contents, off = 0, drop = skip;
7014 src < contents + toc->size;
7015 src += 8, ++drop)
7016 {
7017 if (*drop)
7018 {
7019 *drop = (unsigned long) -1;
7020 off += 8;
7021 }
7022 else if (off != 0)
7023 {
7024 *drop = off;
7025 memcpy (src - off, src, 8);
7026 }
7027 }
7028 toc->rawsize = toc->size;
7029 toc->size = src - contents - off;
7030
7031 /* Read toc relocs. */
7032 relstart = _bfd_elf_link_read_relocs (ibfd, toc, NULL, NULL, TRUE);
7033 if (relstart == NULL)
7034 goto error_ret;
7035
7036 /* Remove unused toc relocs, and adjust those we keep. */
7037 wrel = relstart;
7038 for (rel = relstart; rel < relstart + toc->reloc_count; ++rel)
7039 if (skip[rel->r_offset >> 3] != (unsigned long) -1)
7040 {
7041 wrel->r_offset = rel->r_offset - skip[rel->r_offset >> 3];
7042 wrel->r_info = rel->r_info;
7043 wrel->r_addend = rel->r_addend;
7044 ++wrel;
7045 }
7046 toc->reloc_count = wrel - relstart;
8860955f
AM
7047 elf_section_data (toc)->rel_hdr.sh_size
7048 = toc->reloc_count * elf_section_data (toc)->rel_hdr.sh_entsize;
7049 BFD_ASSERT (elf_section_data (toc)->rel_hdr2 == NULL);
c5614fa4
AM
7050
7051 /* Adjust addends for relocs against the toc section sym. */
7052 for (sec = ibfd->sections; sec != NULL; sec = sec->next)
7053 {
7054 if (sec->reloc_count == 0
7055 || elf_discarded_section (sec))
7056 continue;
7057
7058 relstart = _bfd_elf_link_read_relocs (ibfd, sec, NULL, NULL,
7059 TRUE);
7060 if (relstart == NULL)
7061 goto error_ret;
7062
7063 for (rel = relstart; rel < relstart + sec->reloc_count; ++rel)
7064 {
7065 enum elf_ppc64_reloc_type r_type;
7066 unsigned long r_symndx;
7067 asection *sym_sec;
7068 struct elf_link_hash_entry *h;
7069 Elf_Internal_Sym *sym;
7070
7071 r_type = ELF64_R_TYPE (rel->r_info);
7072 switch (r_type)
7073 {
7074 default:
7075 continue;
7076
7077 case R_PPC64_TOC16:
7078 case R_PPC64_TOC16_LO:
7079 case R_PPC64_TOC16_HI:
7080 case R_PPC64_TOC16_HA:
7081 case R_PPC64_TOC16_DS:
7082 case R_PPC64_TOC16_LO_DS:
7083 case R_PPC64_ADDR64:
7084 break;
7085 }
7086
7087 r_symndx = ELF64_R_SYM (rel->r_info);
7088 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
7089 r_symndx, ibfd))
7090 goto error_ret;
7091
7092 if (sym_sec != toc || h != NULL || sym->st_value != 0)
7093 continue;
7094
7095 rel->r_addend -= skip[rel->r_addend >> 3];
7096 }
7097 }
7098
7099 /* We shouldn't have local or global symbols defined in the TOC,
7100 but handle them anyway. */
7101 if (local_syms != NULL)
7102 {
7103 Elf_Internal_Sym *sym;
7104
7105 for (sym = local_syms;
7106 sym < local_syms + symtab_hdr->sh_info;
7107 ++sym)
7108 if (sym->st_shndx != SHN_UNDEF
7109 && (sym->st_shndx < SHN_LORESERVE
7110 || sym->st_shndx > SHN_HIRESERVE)
7111 && sym->st_value != 0
7112 && bfd_section_from_elf_index (ibfd, sym->st_shndx) == toc)
7113 {
7114 if (skip[sym->st_value >> 3] != (unsigned long) -1)
7115 sym->st_value -= skip[sym->st_value >> 3];
7116 else
7117 {
7118 (*_bfd_error_handler)
7119 (_("%s defined in removed toc entry"),
be8dd2ca 7120 bfd_elf_sym_name (ibfd, symtab_hdr, sym));
c5614fa4
AM
7121 sym->st_value = 0;
7122 sym->st_shndx = SHN_ABS;
7123 }
7124 symtab_hdr->contents = (unsigned char *) local_syms;
7125 }
7126 }
7127
7128 /* Finally, adjust any global syms defined in the toc. */
7129 if (toc_inf.global_toc_syms)
7130 {
7131 toc_inf.toc = toc;
7132 toc_inf.skip = skip;
7133 toc_inf.global_toc_syms = FALSE;
7134 elf_link_hash_traverse (elf_hash_table (info), adjust_toc_syms,
7135 &toc_inf);
7136 }
7137 }
7138
7139 if (local_syms != NULL
7140 && symtab_hdr->contents != (unsigned char *) local_syms)
7141 {
7142 if (!info->keep_memory)
7143 free (local_syms);
7144 else
7145 symtab_hdr->contents = (unsigned char *) local_syms;
7146 }
7147 free (skip);
7148 }
7149
7150 return TRUE;
7151}
7152
65f38f15
AM
7153/* Allocate space in .plt, .got and associated reloc sections for
7154 dynamic relocs. */
5bd4f169 7155
b34976b6 7156static bfd_boolean
4ce794b7 7157allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
5bd4f169 7158{
65f38f15
AM
7159 struct bfd_link_info *info;
7160 struct ppc_link_hash_table *htab;
5bd4f169 7161 asection *s;
65f38f15
AM
7162 struct ppc_link_hash_entry *eh;
7163 struct ppc_dyn_relocs *p;
411e1bfb 7164 struct got_entry *gent;
5bd4f169 7165
e92d460e 7166 if (h->root.type == bfd_link_hash_indirect)
b34976b6 7167 return TRUE;
5bd4f169 7168
e92d460e
AM
7169 if (h->root.type == bfd_link_hash_warning)
7170 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7171
65f38f15
AM
7172 info = (struct bfd_link_info *) inf;
7173 htab = ppc_hash_table (info);
5bd4f169 7174
65f38f15 7175 if (htab->elf.dynamic_sections_created
411e1bfb 7176 && h->dynindx != -1
9c7a29a3 7177 && WILL_CALL_FINISH_DYNAMIC_SYMBOL (1, info->shared, h))
5bd4f169 7178 {
411e1bfb
AM
7179 struct plt_entry *pent;
7180 bfd_boolean doneone = FALSE;
7181 for (pent = h->plt.plist; pent != NULL; pent = pent->next)
7182 if (pent->plt.refcount > 0)
7183 {
411e1bfb
AM
7184 /* If this is the first .plt entry, make room for the special
7185 first entry. */
4ce794b7 7186 s = htab->plt;
eea6121a
AM
7187 if (s->size == 0)
7188 s->size += PLT_INITIAL_ENTRY_SIZE;
411e1bfb 7189
eea6121a 7190 pent->plt.offset = s->size;
411e1bfb
AM
7191
7192 /* Make room for this entry. */
eea6121a 7193 s->size += PLT_ENTRY_SIZE;
411e1bfb
AM
7194
7195 /* Make room for the .glink code. */
4ce794b7 7196 s = htab->glink;
eea6121a
AM
7197 if (s->size == 0)
7198 s->size += GLINK_CALL_STUB_SIZE;
411e1bfb 7199 /* We need bigger stubs past index 32767. */
eea6121a
AM
7200 if (s->size >= GLINK_CALL_STUB_SIZE + 32768*2*4)
7201 s->size += 4;
7202 s->size += 2*4;
411e1bfb
AM
7203
7204 /* We also need to make an entry in the .rela.plt section. */
4ce794b7 7205 s = htab->relplt;
eea6121a 7206 s->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
7207 doneone = TRUE;
7208 }
7209 else
7210 pent->plt.offset = (bfd_vma) -1;
7211 if (!doneone)
65f38f15 7212 {
411e1bfb 7213 h->plt.plist = NULL;
f5385ebf 7214 h->needs_plt = 0;
65f38f15
AM
7215 }
7216 }
7217 else
7218 {
411e1bfb 7219 h->plt.plist = NULL;
f5385ebf 7220 h->needs_plt = 0;
65f38f15
AM
7221 }
7222
951fd09b
AM
7223 eh = (struct ppc_link_hash_entry *) h;
7224 /* Run through the TLS GD got entries first if we're changing them
7225 to TPREL. */
e7b938ca 7226 if ((eh->tls_mask & TLS_TPRELGD) != 0)
951fd09b
AM
7227 for (gent = h->got.glist; gent != NULL; gent = gent->next)
7228 if (gent->got.refcount > 0
7229 && (gent->tls_type & TLS_GD) != 0)
7230 {
7231 /* This was a GD entry that has been converted to TPREL. If
7232 there happens to be a TPREL entry we can use that one. */
7233 struct got_entry *ent;
7234 for (ent = h->got.glist; ent != NULL; ent = ent->next)
7235 if (ent->got.refcount > 0
7236 && (ent->tls_type & TLS_TPREL) != 0
e717da7e
AM
7237 && ent->addend == gent->addend
7238 && ent->owner == gent->owner)
951fd09b
AM
7239 {
7240 gent->got.refcount = 0;
7241 break;
7242 }
7243
7244 /* If not, then we'll be using our own TPREL entry. */
7245 if (gent->got.refcount != 0)
7246 gent->tls_type = TLS_TLS | TLS_TPREL;
7247 }
7248
411e1bfb
AM
7249 for (gent = h->got.glist; gent != NULL; gent = gent->next)
7250 if (gent->got.refcount > 0)
7251 {
951fd09b
AM
7252 bfd_boolean dyn;
7253
411e1bfb 7254 /* Make sure this symbol is output as a dynamic symbol.
951fd09b
AM
7255 Undefined weak syms won't yet be marked as dynamic,
7256 nor will all TLS symbols. */
411e1bfb 7257 if (h->dynindx == -1
f5385ebf 7258 && !h->forced_local)
411e1bfb 7259 {
c152c796 7260 if (! bfd_elf_link_record_dynamic_symbol (info, h))
411e1bfb
AM
7261 return FALSE;
7262 }
65f38f15 7263
d881513a 7264 if ((gent->tls_type & TLS_LD) != 0
f5385ebf 7265 && !h->def_dynamic)
411e1bfb 7266 {
e717da7e 7267 gent->got.offset = ppc64_tlsld_got (gent->owner)->offset;
951fd09b 7268 continue;
411e1bfb 7269 }
951fd09b 7270
e717da7e 7271 s = ppc64_elf_tdata (gent->owner)->got;
eea6121a
AM
7272 gent->got.offset = s->size;
7273 s->size
d881513a 7274 += (gent->tls_type & eh->tls_mask & (TLS_GD | TLS_LD)) ? 16 : 8;
951fd09b 7275 dyn = htab->elf.dynamic_sections_created;
4e795f50
AM
7276 if ((info->shared
7277 || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))
7278 && (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT
7279 || h->root.type != bfd_link_hash_undefweak))
eea6121a 7280 ppc64_elf_tdata (gent->owner)->relgot->size
e7b938ca 7281 += (gent->tls_type & eh->tls_mask & TLS_GD
951fd09b
AM
7282 ? 2 * sizeof (Elf64_External_Rela)
7283 : sizeof (Elf64_External_Rela));
411e1bfb
AM
7284 }
7285 else
7286 gent->got.offset = (bfd_vma) -1;
65f38f15 7287
65f38f15 7288 if (eh->dyn_relocs == NULL)
b34976b6 7289 return TRUE;
65f38f15
AM
7290
7291 /* In the shared -Bsymbolic case, discard space allocated for
7292 dynamic pc-relative relocs against symbols which turn out to be
7293 defined in regular objects. For the normal shared case, discard
7294 space for relocs that have become local due to symbol visibility
7295 changes. */
7296
7297 if (info->shared)
7298 {
9c7a29a3
AM
7299 /* Relocs that use pc_count are those that appear on a call insn,
7300 or certain REL relocs (see MUST_BE_DYN_RELOC) that can be
7301 generated via assembly. We want calls to protected symbols to
7302 resolve directly to the function rather than going via the plt.
7303 If people want function pointer comparisons to work as expected
7304 then they should avoid writing weird assembly. */
09695f56 7305 if (SYMBOL_CALLS_LOCAL (info, h))
65f38f15
AM
7306 {
7307 struct ppc_dyn_relocs **pp;
7308
7309 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
5bd4f169 7310 {
65f38f15
AM
7311 p->count -= p->pc_count;
7312 p->pc_count = 0;
7313 if (p->count == 0)
7314 *pp = p->next;
7315 else
7316 pp = &p->next;
5bd4f169 7317 }
65f38f15 7318 }
4e795f50
AM
7319
7320 /* Also discard relocs on undefined weak syms with non-default
7321 visibility. */
7322 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT
7323 && h->root.type == bfd_link_hash_undefweak)
7324 eh->dyn_relocs = NULL;
65f38f15 7325 }
f4656909 7326 else if (ELIMINATE_COPY_RELOCS)
65f38f15
AM
7327 {
7328 /* For the non-shared case, discard space for relocs against
7329 symbols which turn out to need copy relocs or are not
7330 dynamic. */
7331
f5385ebf
AM
7332 if (!h->non_got_ref
7333 && h->def_dynamic
7334 && !h->def_regular)
65f38f15
AM
7335 {
7336 /* Make sure this symbol is output as a dynamic symbol.
7337 Undefined weak syms won't yet be marked as dynamic. */
7338 if (h->dynindx == -1
f5385ebf 7339 && !h->forced_local)
65f38f15 7340 {
c152c796 7341 if (! bfd_elf_link_record_dynamic_symbol (info, h))
b34976b6 7342 return FALSE;
65f38f15
AM
7343 }
7344
7345 /* If that succeeded, we know we'll be keeping all the
7346 relocs. */
7347 if (h->dynindx != -1)
7348 goto keep;
7349 }
7350
7351 eh->dyn_relocs = NULL;
7352
ec338859 7353 keep: ;
65f38f15
AM
7354 }
7355
7356 /* Finally, allocate space. */
7357 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7358 {
7359 asection *sreloc = elf_section_data (p->sec)->sreloc;
eea6121a 7360 sreloc->size += p->count * sizeof (Elf64_External_Rela);
65f38f15
AM
7361 }
7362
b34976b6 7363 return TRUE;
65f38f15
AM
7364}
7365
7366/* Find any dynamic relocs that apply to read-only sections. */
7367
b34976b6 7368static bfd_boolean
4ce794b7 7369readonly_dynrelocs (struct elf_link_hash_entry *h, void *inf)
65f38f15
AM
7370{
7371 struct ppc_link_hash_entry *eh;
7372 struct ppc_dyn_relocs *p;
7373
e92d460e
AM
7374 if (h->root.type == bfd_link_hash_warning)
7375 h = (struct elf_link_hash_entry *) h->root.u.i.link;
7376
65f38f15
AM
7377 eh = (struct ppc_link_hash_entry *) h;
7378 for (p = eh->dyn_relocs; p != NULL; p = p->next)
7379 {
7380 asection *s = p->sec->output_section;
7381
7382 if (s != NULL && (s->flags & SEC_READONLY) != 0)
7383 {
4ce794b7 7384 struct bfd_link_info *info = inf;
65f38f15
AM
7385
7386 info->flags |= DF_TEXTREL;
7387
7388 /* Not an error, just cut short the traversal. */
b34976b6 7389 return FALSE;
65f38f15
AM
7390 }
7391 }
b34976b6 7392 return TRUE;
65f38f15
AM
7393}
7394
7395/* Set the sizes of the dynamic sections. */
7396
b34976b6 7397static bfd_boolean
4ce794b7
AM
7398ppc64_elf_size_dynamic_sections (bfd *output_bfd ATTRIBUTE_UNUSED,
7399 struct bfd_link_info *info)
65f38f15
AM
7400{
7401 struct ppc_link_hash_table *htab;
7402 bfd *dynobj;
7403 asection *s;
b34976b6 7404 bfd_boolean relocs;
65f38f15
AM
7405 bfd *ibfd;
7406
7407 htab = ppc_hash_table (info);
7408 dynobj = htab->elf.dynobj;
7409 if (dynobj == NULL)
7410 abort ();
7411
7412 if (htab->elf.dynamic_sections_created)
7413 {
7414 /* Set the contents of the .interp section to the interpreter. */
36af4a4e 7415 if (info->executable)
65f38f15
AM
7416 {
7417 s = bfd_get_section_by_name (dynobj, ".interp");
7418 if (s == NULL)
7419 abort ();
eea6121a 7420 s->size = sizeof ELF_DYNAMIC_INTERPRETER;
65f38f15
AM
7421 s->contents = (unsigned char *) ELF_DYNAMIC_INTERPRETER;
7422 }
7423 }
7424
7425 /* Set up .got offsets for local syms, and space for local dynamic
7426 relocs. */
7427 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7428 {
411e1bfb
AM
7429 struct got_entry **lgot_ents;
7430 struct got_entry **end_lgot_ents;
e7b938ca 7431 char *lgot_masks;
65f38f15
AM
7432 bfd_size_type locsymcount;
7433 Elf_Internal_Shdr *symtab_hdr;
7434 asection *srel;
7435
ee75fd95 7436 if (!is_ppc64_elf_target (ibfd->xvec))
65f38f15
AM
7437 continue;
7438
e717da7e
AM
7439 if (ppc64_tlsld_got (ibfd)->refcount > 0)
7440 {
7441 s = ppc64_elf_tdata (ibfd)->got;
eea6121a
AM
7442 ppc64_tlsld_got (ibfd)->offset = s->size;
7443 s->size += 16;
e717da7e
AM
7444 if (info->shared)
7445 {
7446 srel = ppc64_elf_tdata (ibfd)->relgot;
eea6121a 7447 srel->size += sizeof (Elf64_External_Rela);
e717da7e
AM
7448 }
7449 }
7450 else
7451 ppc64_tlsld_got (ibfd)->offset = (bfd_vma) -1;
7452
65f38f15
AM
7453 for (s = ibfd->sections; s != NULL; s = s->next)
7454 {
ec338859 7455 struct ppc_dyn_relocs *p;
65f38f15 7456
ec338859
AM
7457 for (p = *((struct ppc_dyn_relocs **)
7458 &elf_section_data (s)->local_dynrel);
7459 p != NULL;
7460 p = p->next)
65f38f15 7461 {
ec338859
AM
7462 if (!bfd_is_abs_section (p->sec)
7463 && bfd_is_abs_section (p->sec->output_section))
7464 {
7465 /* Input section has been discarded, either because
7466 it is a copy of a linkonce section or due to
7467 linker script /DISCARD/, so we'll be discarding
7468 the relocs too. */
7469 }
248866a8 7470 else if (p->count != 0)
ec338859
AM
7471 {
7472 srel = elf_section_data (p->sec)->sreloc;
eea6121a 7473 srel->size += p->count * sizeof (Elf64_External_Rela);
248866a8
AM
7474 if ((p->sec->output_section->flags & SEC_READONLY) != 0)
7475 info->flags |= DF_TEXTREL;
ec338859 7476 }
65f38f15
AM
7477 }
7478 }
7479
411e1bfb
AM
7480 lgot_ents = elf_local_got_ents (ibfd);
7481 if (!lgot_ents)
65f38f15
AM
7482 continue;
7483
7484 symtab_hdr = &elf_tdata (ibfd)->symtab_hdr;
7485 locsymcount = symtab_hdr->sh_info;
411e1bfb 7486 end_lgot_ents = lgot_ents + locsymcount;
e7b938ca 7487 lgot_masks = (char *) end_lgot_ents;
e717da7e
AM
7488 s = ppc64_elf_tdata (ibfd)->got;
7489 srel = ppc64_elf_tdata (ibfd)->relgot;
e7b938ca 7490 for (; lgot_ents < end_lgot_ents; ++lgot_ents, ++lgot_masks)
65f38f15 7491 {
411e1bfb
AM
7492 struct got_entry *ent;
7493
7494 for (ent = *lgot_ents; ent != NULL; ent = ent->next)
7495 if (ent->got.refcount > 0)
7496 {
e7b938ca 7497 if ((ent->tls_type & *lgot_masks & TLS_LD) != 0)
411e1bfb 7498 {
e717da7e 7499 if (ppc64_tlsld_got (ibfd)->offset == (bfd_vma) -1)
411e1bfb 7500 {
eea6121a
AM
7501 ppc64_tlsld_got (ibfd)->offset = s->size;
7502 s->size += 16;
411e1bfb 7503 if (info->shared)
eea6121a 7504 srel->size += sizeof (Elf64_External_Rela);
411e1bfb 7505 }
e717da7e 7506 ent->got.offset = ppc64_tlsld_got (ibfd)->offset;
411e1bfb
AM
7507 }
7508 else
7509 {
eea6121a 7510 ent->got.offset = s->size;
e7b938ca 7511 if ((ent->tls_type & *lgot_masks & TLS_GD) != 0)
411e1bfb 7512 {
eea6121a 7513 s->size += 16;
411e1bfb 7514 if (info->shared)
eea6121a 7515 srel->size += 2 * sizeof (Elf64_External_Rela);
411e1bfb
AM
7516 }
7517 else
7518 {
eea6121a 7519 s->size += 8;
411e1bfb 7520 if (info->shared)
eea6121a 7521 srel->size += sizeof (Elf64_External_Rela);
411e1bfb
AM
7522 }
7523 }
7524 }
7525 else
7526 ent->got.offset = (bfd_vma) -1;
65f38f15
AM
7527 }
7528 }
7529
7530 /* Allocate global sym .plt and .got entries, and space for global
7531 sym dynamic relocs. */
4ce794b7 7532 elf_link_hash_traverse (&htab->elf, allocate_dynrelocs, info);
65f38f15
AM
7533
7534 /* We now have determined the sizes of the various dynamic sections.
7535 Allocate memory for them. */
b34976b6 7536 relocs = FALSE;
65f38f15
AM
7537 for (s = dynobj->sections; s != NULL; s = s->next)
7538 {
7539 if ((s->flags & SEC_LINKER_CREATED) == 0)
7540 continue;
7541
4ce794b7 7542 if (s == htab->brlt || s == htab->relbrlt)
721956f4
AM
7543 /* These haven't been allocated yet; don't strip. */
7544 continue;
e717da7e
AM
7545 else if (s == htab->got
7546 || s == htab->plt
4ce794b7 7547 || s == htab->glink)
65f38f15
AM
7548 {
7549 /* Strip this section if we don't need it; see the
7550 comment below. */
5bd4f169 7551 }
65f38f15 7552 else if (strncmp (bfd_get_section_name (dynobj, s), ".rela", 5) == 0)
5bd4f169 7553 {
eea6121a 7554 if (s->size == 0)
5bd4f169
AM
7555 {
7556 /* If we don't need this section, strip it from the
7557 output file. This is mostly to handle .rela.bss and
7558 .rela.plt. We must create both sections in
7559 create_dynamic_sections, because they must be created
7560 before the linker maps input sections to output
7561 sections. The linker does that before
7562 adjust_dynamic_symbol is called, and it is that
7563 function which decides whether anything needs to go
7564 into these sections. */
5bd4f169
AM
7565 }
7566 else
7567 {
4ce794b7 7568 if (s != htab->relplt)
b34976b6 7569 relocs = TRUE;
5bd4f169
AM
7570
7571 /* We use the reloc_count field as a counter if we need
7572 to copy relocs into the output file. */
7573 s->reloc_count = 0;
7574 }
7575 }
65f38f15 7576 else
5bd4f169
AM
7577 {
7578 /* It's not one of our sections, so don't allocate space. */
7579 continue;
7580 }
7581
eea6121a 7582 if (s->size == 0)
5bd4f169
AM
7583 {
7584 _bfd_strip_section_from_output (info, s);
7585 continue;
7586 }
7587
5f333394 7588 /* .plt is in the bss section. We don't initialise it. */
680a3378 7589 if (s == htab->plt)
5f333394
AM
7590 continue;
7591
65f38f15
AM
7592 /* Allocate memory for the section contents. We use bfd_zalloc
7593 here in case unused entries are not reclaimed before the
7594 section's contents are written out. This should not happen,
411e1bfb
AM
7595 but this way if it does we get a R_PPC64_NONE reloc in .rela
7596 sections instead of garbage.
7597 We also rely on the section contents being zero when writing
7598 the GOT. */
eea6121a 7599 s->contents = bfd_zalloc (dynobj, s->size);
65f38f15 7600 if (s->contents == NULL)
b34976b6 7601 return FALSE;
5bd4f169
AM
7602 }
7603
e717da7e
AM
7604 for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link_next)
7605 {
ee75fd95 7606 if (!is_ppc64_elf_target (ibfd->xvec))
7b53ace3
AM
7607 continue;
7608
e717da7e
AM
7609 s = ppc64_elf_tdata (ibfd)->got;
7610 if (s != NULL && s != htab->got)
7611 {
eea6121a 7612 if (s->size == 0)
e717da7e
AM
7613 _bfd_strip_section_from_output (info, s);
7614 else
7615 {
eea6121a 7616 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
7617 if (s->contents == NULL)
7618 return FALSE;
7619 }
7620 }
7621 s = ppc64_elf_tdata (ibfd)->relgot;
7622 if (s != NULL)
7623 {
eea6121a 7624 if (s->size == 0)
e717da7e
AM
7625 _bfd_strip_section_from_output (info, s);
7626 else
7627 {
eea6121a 7628 s->contents = bfd_zalloc (ibfd, s->size);
e717da7e
AM
7629 if (s->contents == NULL)
7630 return FALSE;
7631 relocs = TRUE;
7632 s->reloc_count = 0;
7633 }
7634 }
7635 }
7636
e86ce104 7637 if (htab->elf.dynamic_sections_created)
5bd4f169
AM
7638 {
7639 /* Add some entries to the .dynamic section. We fill in the
7640 values later, in ppc64_elf_finish_dynamic_sections, but we
7641 must add the entries now so that we get the correct size for
7642 the .dynamic section. The DT_DEBUG entry is filled in by the
7643 dynamic linker and used by the debugger. */
dc810e39 7644#define add_dynamic_entry(TAG, VAL) \
5a580b3a 7645 _bfd_elf_add_dynamic_entry (info, TAG, VAL)
dc810e39 7646
36af4a4e 7647 if (info->executable)
5bd4f169 7648 {
dc810e39 7649 if (!add_dynamic_entry (DT_DEBUG, 0))
b34976b6 7650 return FALSE;
5bd4f169
AM
7651 }
7652
eea6121a 7653 if (htab->plt != NULL && htab->plt->size != 0)
5bd4f169 7654 {
dc810e39
AM
7655 if (!add_dynamic_entry (DT_PLTGOT, 0)
7656 || !add_dynamic_entry (DT_PLTRELSZ, 0)
7657 || !add_dynamic_entry (DT_PLTREL, DT_RELA)
5d1634d7
AM
7658 || !add_dynamic_entry (DT_JMPREL, 0)
7659 || !add_dynamic_entry (DT_PPC64_GLINK, 0))
b34976b6 7660 return FALSE;
5bd4f169
AM
7661 }
7662
19397422
AM
7663 if (NO_OPD_RELOCS)
7664 {
7665 if (!add_dynamic_entry (DT_PPC64_OPD, 0)
7666 || !add_dynamic_entry (DT_PPC64_OPDSZ, 0))
b34976b6 7667 return FALSE;
19397422
AM
7668 }
7669
5bd4f169
AM
7670 if (relocs)
7671 {
dc810e39
AM
7672 if (!add_dynamic_entry (DT_RELA, 0)
7673 || !add_dynamic_entry (DT_RELASZ, 0)
7674 || !add_dynamic_entry (DT_RELAENT, sizeof (Elf64_External_Rela)))
b34976b6 7675 return FALSE;
5bd4f169 7676
65f38f15
AM
7677 /* If any dynamic relocs apply to a read-only section,
7678 then we need a DT_TEXTREL entry. */
248866a8 7679 if ((info->flags & DF_TEXTREL) == 0)
4ce794b7 7680 elf_link_hash_traverse (&htab->elf, readonly_dynrelocs, info);
5bd4f169 7681
65f38f15 7682 if ((info->flags & DF_TEXTREL) != 0)
5bd4f169 7683 {
65f38f15 7684 if (!add_dynamic_entry (DT_TEXTREL, 0))
b34976b6 7685 return FALSE;
5bd4f169 7686 }
5bd4f169 7687 }
5bd4f169 7688 }
65f38f15 7689#undef add_dynamic_entry
5bd4f169 7690
b34976b6 7691 return TRUE;
5bd4f169
AM
7692}
7693
721956f4 7694/* Determine the type of stub needed, if any, for a call. */
5bd4f169 7695
4ce794b7
AM
7696static inline enum ppc_stub_type
7697ppc_type_of_stub (asection *input_sec,
7698 const Elf_Internal_Rela *rel,
7699 struct ppc_link_hash_entry **hash,
7700 bfd_vma destination)
5bd4f169 7701{
721956f4
AM
7702 struct ppc_link_hash_entry *h = *hash;
7703 bfd_vma location;
7704 bfd_vma branch_offset;
7705 bfd_vma max_branch_offset;
4ce794b7 7706 enum elf_ppc64_reloc_type r_type;
5bd4f169 7707
721956f4
AM
7708 if (h != NULL)
7709 {
7710 if (h->oh != NULL
8387904d
AM
7711 && h->oh->is_func_descriptor)
7712 h = h->oh;
7713
7714 if (h->elf.dynindx != -1)
5bd4f169 7715 {
411e1bfb 7716 struct plt_entry *ent;
8387904d
AM
7717
7718 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
7719 if (ent->addend == rel->r_addend
7720 && ent->plt.offset != (bfd_vma) -1)
7721 {
8387904d 7722 *hash = h;
411e1bfb
AM
7723 return ppc_stub_plt_call;
7724 }
5bd4f169
AM
7725 }
7726
ee7de3e6
AM
7727 if (!(h->elf.root.type == bfd_link_hash_defined
7728 || h->elf.root.type == bfd_link_hash_defweak)
7729 || h->elf.root.u.def.section->output_section == NULL)
721956f4 7730 return ppc_stub_none;
5d1634d7 7731 }
5d1634d7 7732
721956f4
AM
7733 /* Determine where the call point is. */
7734 location = (input_sec->output_offset
7735 + input_sec->output_section->vma
7736 + rel->r_offset);
5d1634d7 7737
721956f4
AM
7738 branch_offset = destination - location;
7739 r_type = ELF64_R_TYPE (rel->r_info);
5d1634d7 7740
721956f4
AM
7741 /* Determine if a long branch stub is needed. */
7742 max_branch_offset = 1 << 25;
4ce794b7 7743 if (r_type != R_PPC64_REL24)
721956f4 7744 max_branch_offset = 1 << 15;
5d1634d7 7745
721956f4
AM
7746 if (branch_offset + max_branch_offset >= 2 * max_branch_offset)
7747 /* We need a stub. Figure out whether a long_branch or plt_branch
7748 is needed later. */
7749 return ppc_stub_long_branch;
5d1634d7 7750
721956f4 7751 return ppc_stub_none;
5d1634d7
AM
7752}
7753
7754/* Build a .plt call stub. */
7755
4ce794b7
AM
7756static inline bfd_byte *
7757build_plt_stub (bfd *obfd, bfd_byte *p, int offset)
5d1634d7
AM
7758{
7759#define PPC_LO(v) ((v) & 0xffff)
7760#define PPC_HI(v) (((v) >> 16) & 0xffff)
7761#define PPC_HA(v) PPC_HI ((v) + 0x8000)
7762
5d1634d7 7763 bfd_put_32 (obfd, ADDIS_R12_R2 | PPC_HA (offset), p), p += 4;
ad8e1ba5 7764 bfd_put_32 (obfd, STD_R2_40R1, p), p += 4;
5d1634d7
AM
7765 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
7766 if (PPC_HA (offset + 8) != PPC_HA (offset))
ad8e1ba5 7767 bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p), p += 4;
5d1634d7
AM
7768 offset += 8;
7769 bfd_put_32 (obfd, LD_R2_0R12 | PPC_LO (offset), p), p += 4;
7770 if (PPC_HA (offset + 8) != PPC_HA (offset))
ad8e1ba5 7771 bfd_put_32 (obfd, ADDIS_R12_R12 | 1, p), p += 4;
5d1634d7
AM
7772 offset += 8;
7773 bfd_put_32 (obfd, MTCTR_R11, p), p += 4;
7774 bfd_put_32 (obfd, LD_R11_0R12 | PPC_LO (offset), p), p += 4;
7775 bfd_put_32 (obfd, BCTR, p), p += 4;
7776 return p;
7777}
7778
b34976b6 7779static bfd_boolean
4ce794b7 7780ppc_build_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
5d1634d7 7781{
721956f4
AM
7782 struct ppc_stub_hash_entry *stub_entry;
7783 struct ppc_branch_hash_entry *br_entry;
5d1634d7
AM
7784 struct bfd_link_info *info;
7785 struct ppc_link_hash_table *htab;
721956f4
AM
7786 bfd_byte *loc;
7787 bfd_byte *p;
7788 unsigned int indx;
411e1bfb 7789 struct plt_entry *ent;
ee75fd95 7790 bfd_vma dest, off;
721956f4 7791 int size;
5d1634d7 7792
721956f4
AM
7793 /* Massage our args to the form they really have. */
7794 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
4ce794b7 7795 info = in_arg;
5d1634d7 7796
5d1634d7
AM
7797 htab = ppc_hash_table (info);
7798
721956f4 7799 /* Make a note of the offset within the stubs for this entry. */
eea6121a 7800 stub_entry->stub_offset = stub_entry->stub_sec->size;
97b639ba 7801 loc = stub_entry->stub_sec->contents + stub_entry->stub_offset;
721956f4 7802
4ce794b7 7803 htab->stub_count[stub_entry->stub_type - 1] += 1;
721956f4 7804 switch (stub_entry->stub_type)
5d1634d7 7805 {
721956f4 7806 case ppc_stub_long_branch:
ad8e1ba5 7807 case ppc_stub_long_branch_r2off:
721956f4 7808 /* Branches are relative. This is where we are going to. */
ee75fd95
AM
7809 off = dest = (stub_entry->target_value
7810 + stub_entry->target_section->output_offset
7811 + stub_entry->target_section->output_section->vma);
5d1634d7 7812
721956f4
AM
7813 /* And this is where we are coming from. */
7814 off -= (stub_entry->stub_offset
97b639ba
AM
7815 + stub_entry->stub_sec->output_offset
7816 + stub_entry->stub_sec->output_section->vma);
e86ce104 7817
ad8e1ba5
AM
7818 if (stub_entry->stub_type != ppc_stub_long_branch_r2off)
7819 size = 4;
7820 else
7821 {
7822 bfd_vma r2off;
7823
7824 r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7825 - htab->stub_group[stub_entry->id_sec->id].toc_off);
97b639ba 7826 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 7827 loc += 4;
97b639ba 7828 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
ad8e1ba5 7829 loc += 4;
97b639ba 7830 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5
AM
7831 loc += 4;
7832 off -= 12;
7833 size = 16;
7834 }
97b639ba 7835 bfd_put_32 (htab->stub_bfd, B_DOT | (off & 0x3fffffc), loc);
ad8e1ba5
AM
7836
7837 BFD_ASSERT (off + (1 << 25) < (bfd_vma) (1 << 26));
ee75fd95
AM
7838
7839 if (info->emitrelocations)
7840 {
7841 Elf_Internal_Rela *relocs, *r;
7842 struct bfd_elf_section_data *elfsec_data;
7843
7844 elfsec_data = elf_section_data (stub_entry->stub_sec);
7845 relocs = elfsec_data->relocs;
7846 if (relocs == NULL)
7847 {
7848 bfd_size_type relsize;
7849 relsize = stub_entry->stub_sec->reloc_count * sizeof (*relocs);
7850 relocs = bfd_alloc (htab->stub_bfd, relsize);
7851 if (relocs == NULL)
7852 return FALSE;
7853 elfsec_data->relocs = relocs;
7854 elfsec_data->rel_hdr.sh_size = relsize;
7855 elfsec_data->rel_hdr.sh_entsize = 24;
7856 stub_entry->stub_sec->reloc_count = 0;
7857 }
7858 r = relocs + stub_entry->stub_sec->reloc_count;
7859 stub_entry->stub_sec->reloc_count += 1;
7860 r->r_offset = loc - stub_entry->stub_sec->contents;
7861 r->r_info = ELF64_R_INFO (0, R_PPC64_REL24);
7862 r->r_addend = dest;
7863 if (stub_entry->h != NULL)
7864 {
7865 struct elf_link_hash_entry **hashes;
7866 unsigned long symndx;
7867 struct ppc_link_hash_entry *h;
7868
7869 hashes = elf_sym_hashes (htab->stub_bfd);
7870 if (hashes == NULL)
7871 {
7872 bfd_size_type hsize;
7873
7874 hsize = (htab->stub_globals + 1) * sizeof (*hashes);
7875 hashes = bfd_zalloc (htab->stub_bfd, hsize);
7876 if (hashes == NULL)
7877 return FALSE;
7878 elf_sym_hashes (htab->stub_bfd) = hashes;
7879 htab->stub_globals = 1;
7880 }
7881 symndx = htab->stub_globals++;
7882 h = stub_entry->h;
7883 hashes[symndx] = &h->elf;
7884 r->r_info = ELF64_R_INFO (symndx, R_PPC64_REL24);
7885 if (h->oh != NULL && h->oh->is_func)
7886 h = h->oh;
7887 if (h->elf.root.u.def.section != stub_entry->target_section)
7888 /* H is an opd symbol. The addend must be zero. */
7889 r->r_addend = 0;
7890 else
7891 {
7892 off = (h->elf.root.u.def.value
7893 + h->elf.root.u.def.section->output_offset
7894 + h->elf.root.u.def.section->output_section->vma);
7895 r->r_addend -= off;
7896 }
7897 }
7898 }
721956f4 7899 break;
e86ce104 7900
721956f4 7901 case ppc_stub_plt_branch:
ad8e1ba5 7902 case ppc_stub_plt_branch_r2off:
721956f4
AM
7903 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
7904 stub_entry->root.string + 9,
b34976b6 7905 FALSE, FALSE);
721956f4
AM
7906 if (br_entry == NULL)
7907 {
7908 (*_bfd_error_handler) (_("can't find branch stub `%s'"),
7909 stub_entry->root.string + 9);
b34976b6
AM
7910 htab->stub_error = TRUE;
7911 return FALSE;
721956f4
AM
7912 }
7913
7914 off = (stub_entry->target_value
7915 + stub_entry->target_section->output_offset
7916 + stub_entry->target_section->output_section->vma);
7917
4ce794b7
AM
7918 bfd_put_64 (htab->brlt->owner, off,
7919 htab->brlt->contents + br_entry->offset);
721956f4 7920
ee75fd95 7921 if (htab->relbrlt != NULL)
721956f4
AM
7922 {
7923 /* Create a reloc for the branch lookup table entry. */
7924 Elf_Internal_Rela rela;
ad8e1ba5 7925 bfd_byte *rl;
5d1634d7 7926
721956f4 7927 rela.r_offset = (br_entry->offset
4ce794b7
AM
7928 + htab->brlt->output_offset
7929 + htab->brlt->output_section->vma);
721956f4
AM
7930 rela.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
7931 rela.r_addend = off;
7932
4ce794b7
AM
7933 rl = htab->relbrlt->contents;
7934 rl += htab->relbrlt->reloc_count++ * sizeof (Elf64_External_Rela);
7935 bfd_elf64_swap_reloca_out (htab->relbrlt->owner, &rela, rl);
721956f4
AM
7936 }
7937
7938 off = (br_entry->offset
4ce794b7
AM
7939 + htab->brlt->output_offset
7940 + htab->brlt->output_section->vma
7941 - elf_gp (htab->brlt->output_section->owner)
ad8e1ba5 7942 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 7943
ad8e1ba5 7944 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
5d1634d7
AM
7945 {
7946 (*_bfd_error_handler)
e86ce104 7947 (_("linkage table error against `%s'"),
721956f4 7948 stub_entry->root.string);
5d1634d7 7949 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
7950 htab->stub_error = TRUE;
7951 return FALSE;
5d1634d7 7952 }
41bd81ab 7953
721956f4 7954 indx = off;
ad8e1ba5
AM
7955 if (stub_entry->stub_type != ppc_stub_plt_branch_r2off)
7956 {
97b639ba 7957 bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
ad8e1ba5 7958 loc += 4;
97b639ba 7959 bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
ad8e1ba5
AM
7960 size = 16;
7961 }
7962 else
7963 {
7964 bfd_vma r2off;
7965
7966 r2off = (htab->stub_group[stub_entry->target_section->id].toc_off
7967 - htab->stub_group[stub_entry->id_sec->id].toc_off);
97b639ba 7968 bfd_put_32 (htab->stub_bfd, STD_R2_40R1, loc);
ad8e1ba5 7969 loc += 4;
97b639ba 7970 bfd_put_32 (htab->stub_bfd, ADDIS_R12_R2 | PPC_HA (indx), loc);
ad8e1ba5 7971 loc += 4;
97b639ba 7972 bfd_put_32 (htab->stub_bfd, LD_R11_0R12 | PPC_LO (indx), loc);
ad8e1ba5 7973 loc += 4;
97b639ba 7974 bfd_put_32 (htab->stub_bfd, ADDIS_R2_R2 | PPC_HA (r2off), loc);
ad8e1ba5 7975 loc += 4;
97b639ba 7976 bfd_put_32 (htab->stub_bfd, ADDI_R2_R2 | PPC_LO (r2off), loc);
ad8e1ba5
AM
7977 size = 28;
7978 }
7979 loc += 4;
97b639ba 7980 bfd_put_32 (htab->stub_bfd, MTCTR_R11, loc);
ad8e1ba5 7981 loc += 4;
97b639ba 7982 bfd_put_32 (htab->stub_bfd, BCTR, loc);
721956f4 7983 break;
5d1634d7 7984
721956f4 7985 case ppc_stub_plt_call:
c862ae31
AM
7986 /* Do the best we can for shared libraries built without
7987 exporting ".foo" for each "foo". This can happen when symbol
7988 versioning scripts strip all bar a subset of symbols. */
8387904d
AM
7989 if (stub_entry->h->oh != NULL
7990 && stub_entry->h->oh->elf.root.type != bfd_link_hash_defined
34814b9f 7991 && stub_entry->h->oh->elf.root.type != bfd_link_hash_defweak)
c862ae31
AM
7992 {
7993 /* Point the symbol at the stub. There may be multiple stubs,
7994 we don't really care; The main thing is to make this sym
8f3bab57
AM
7995 defined somewhere. Maybe defining the symbol in the stub
7996 section is a silly idea. If we didn't do this, htab->top_id
7997 could disappear. */
34814b9f
AM
7998 stub_entry->h->oh->elf.root.type = bfd_link_hash_defined;
7999 stub_entry->h->oh->elf.root.u.def.section = stub_entry->stub_sec;
8000 stub_entry->h->oh->elf.root.u.def.value = stub_entry->stub_offset;
c862ae31
AM
8001 }
8002
721956f4 8003 /* Now build the stub. */
411e1bfb
AM
8004 off = (bfd_vma) -1;
8005 for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8006 if (ent->addend == stub_entry->addend)
8007 {
8008 off = ent->plt.offset;
8009 break;
8010 }
721956f4
AM
8011 if (off >= (bfd_vma) -2)
8012 abort ();
8013
8014 off &= ~ (bfd_vma) 1;
4ce794b7
AM
8015 off += (htab->plt->output_offset
8016 + htab->plt->output_section->vma
8017 - elf_gp (htab->plt->output_section->owner)
ad8e1ba5 8018 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 8019
ad8e1ba5 8020 if (off + 0x80008000 > 0xffffffff || (off & 7) != 0)
721956f4
AM
8021 {
8022 (*_bfd_error_handler)
8023 (_("linkage table error against `%s'"),
8024 stub_entry->h->elf.root.root.string);
8025 bfd_set_error (bfd_error_bad_value);
b34976b6
AM
8026 htab->stub_error = TRUE;
8027 return FALSE;
721956f4
AM
8028 }
8029
97b639ba 8030 p = build_plt_stub (htab->stub_bfd, loc, off);
721956f4
AM
8031 size = p - loc;
8032 break;
8033
8034 default:
8035 BFD_FAIL ();
b34976b6 8036 return FALSE;
721956f4
AM
8037 }
8038
eea6121a 8039 stub_entry->stub_sec->size += size;
97b639ba 8040
ee75fd95 8041 if (htab->emit_stub_syms)
97b639ba
AM
8042 {
8043 struct elf_link_hash_entry *h;
ee75fd95
AM
8044 size_t len1, len2;
8045 char *name;
8046 const char *const stub_str[] = { "long_branch",
8047 "long_branch_r2off",
8048 "plt_branch",
8049 "plt_branch_r2off",
8050 "plt_call" };
8051
8052 len1 = strlen (stub_str[stub_entry->stub_type - 1]);
8053 len2 = strlen (stub_entry->root.string);
8054 name = bfd_malloc (len1 + len2 + 2);
8055 if (name == NULL)
8056 return FALSE;
8057 memcpy (name, stub_entry->root.string, 9);
8058 memcpy (name + 9, stub_str[stub_entry->stub_type - 1], len1);
8059 memcpy (name + len1 + 9, stub_entry->root.string + 8, len2 - 8 + 1);
8060 h = elf_link_hash_lookup (&htab->elf, name, TRUE, FALSE, FALSE);
97b639ba
AM
8061 if (h == NULL)
8062 return FALSE;
8063 if (h->root.type == bfd_link_hash_new)
8064 {
8065 h->root.type = bfd_link_hash_defined;
8066 h->root.u.def.section = stub_entry->stub_sec;
8067 h->root.u.def.value = stub_entry->stub_offset;
f5385ebf
AM
8068 h->ref_regular = 1;
8069 h->def_regular = 1;
8070 h->ref_regular_nonweak = 1;
8071 h->forced_local = 1;
8072 h->non_elf = 0;
97b639ba
AM
8073 }
8074 }
8075
b34976b6 8076 return TRUE;
721956f4
AM
8077}
8078
8079/* As above, but don't actually build the stub. Just bump offset so
8080 we know stub section sizes, and select plt_branch stubs where
8081 long_branch stubs won't do. */
8082
b34976b6 8083static bfd_boolean
4ce794b7 8084ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
721956f4
AM
8085{
8086 struct ppc_stub_hash_entry *stub_entry;
63bc6f6c 8087 struct bfd_link_info *info;
721956f4
AM
8088 struct ppc_link_hash_table *htab;
8089 bfd_vma off;
8090 int size;
8091
8092 /* Massage our args to the form they really have. */
8093 stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
63bc6f6c
AM
8094 info = in_arg;
8095
8096 htab = ppc_hash_table (info);
721956f4
AM
8097
8098 if (stub_entry->stub_type == ppc_stub_plt_call)
8099 {
411e1bfb 8100 struct plt_entry *ent;
58ac9f71 8101 off = (bfd_vma) -1;
411e1bfb
AM
8102 for (ent = stub_entry->h->elf.plt.plist; ent != NULL; ent = ent->next)
8103 if (ent->addend == stub_entry->addend)
8104 {
8105 off = ent->plt.offset & ~(bfd_vma) 1;
8106 break;
8107 }
58ac9f71 8108 if (off >= (bfd_vma) -2)
411e1bfb 8109 abort ();
4ce794b7
AM
8110 off += (htab->plt->output_offset
8111 + htab->plt->output_section->vma
8112 - elf_gp (htab->plt->output_section->owner)
ad8e1ba5 8113 - htab->stub_group[stub_entry->id_sec->id].toc_off);
721956f4 8114
ad8e1ba5 8115 size = PLT_CALL_STUB_SIZE;
4ce794b7 8116 if (PPC_HA (off + 16) != PPC_HA (off))
721956f4
AM
8117 size += 4;
8118 }
8119 else
8120 {
ad8e1ba5
AM
8121 /* ppc_stub_long_branch or ppc_stub_plt_branch, or their r2off
8122 variants. */
721956f4
AM
8123 off = (stub_entry->target_value
8124 + stub_entry->target_section->output_offset
8125 + stub_entry->target_section->output_section->vma);
eea6121a 8126 off -= (stub_entry->stub_sec->size
721956f4
AM
8127 + stub_entry->stub_sec->output_offset
8128 + stub_entry->stub_sec->output_section->vma);
8129
ad8e1ba5
AM
8130 /* Reset the stub type from the plt variant in case we now
8131 can reach with a shorter stub. */
8132 if (stub_entry->stub_type >= ppc_stub_plt_branch)
8133 stub_entry->stub_type += ppc_stub_long_branch - ppc_stub_plt_branch;
8134
8135 size = 4;
8136 if (stub_entry->stub_type == ppc_stub_long_branch_r2off)
8137 {
8138 off -= 12;
8139 size = 16;
8140 }
8141
8142 /* If the branch offset if too big, use a ppc_stub_plt_branch. */
721956f4
AM
8143 if (off + (1 << 25) >= (bfd_vma) (1 << 26))
8144 {
8145 struct ppc_branch_hash_entry *br_entry;
8146
8147 br_entry = ppc_branch_hash_lookup (&htab->branch_hash_table,
8148 stub_entry->root.string + 9,
b34976b6 8149 TRUE, FALSE);
721956f4
AM
8150 if (br_entry == NULL)
8151 {
8152 (*_bfd_error_handler) (_("can't build branch stub `%s'"),
8153 stub_entry->root.string + 9);
b34976b6
AM
8154 htab->stub_error = TRUE;
8155 return FALSE;
721956f4
AM
8156 }
8157
8158 if (br_entry->iter != htab->stub_iteration)
8159 {
8160 br_entry->iter = htab->stub_iteration;
eea6121a
AM
8161 br_entry->offset = htab->brlt->size;
8162 htab->brlt->size += 8;
63bc6f6c 8163
ee75fd95 8164 if (htab->relbrlt != NULL)
eea6121a 8165 htab->relbrlt->size += sizeof (Elf64_External_Rela);
721956f4 8166 }
ad8e1ba5
AM
8167
8168 stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
721956f4 8169 size = 16;
ad8e1ba5
AM
8170 if (stub_entry->stub_type != ppc_stub_plt_branch)
8171 size = 28;
721956f4 8172 }
ee75fd95
AM
8173
8174 if (info->emitrelocations
8175 && (stub_entry->stub_type == ppc_stub_long_branch
8176 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
8177 stub_entry->stub_sec->reloc_count += 1;
721956f4
AM
8178 }
8179
eea6121a 8180 stub_entry->stub_sec->size += size;
b34976b6 8181 return TRUE;
721956f4
AM
8182}
8183
8184/* Set up various things so that we can make a list of input sections
8185 for each output section included in the link. Returns -1 on error,
cedb70c5 8186 0 when no stubs will be needed, and 1 on success. */
721956f4
AM
8187
8188int
4c52953f
AM
8189ppc64_elf_setup_section_lists (bfd *output_bfd,
8190 struct bfd_link_info *info,
8191 int no_multi_toc)
721956f4
AM
8192{
8193 bfd *input_bfd;
734b6cf9 8194 int top_id, top_index, id;
721956f4 8195 asection *section;
734b6cf9 8196 asection **input_list;
721956f4
AM
8197 bfd_size_type amt;
8198 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8199
4c52953f
AM
8200 htab->no_multi_toc = no_multi_toc;
8201
4ce794b7 8202 if (htab->brlt == NULL)
721956f4
AM
8203 return 0;
8204
1e2f5b6e 8205 /* Find the top input section id. */
3d6f9012 8206 for (input_bfd = info->input_bfds, top_id = 3;
721956f4
AM
8207 input_bfd != NULL;
8208 input_bfd = input_bfd->link_next)
8209 {
721956f4
AM
8210 for (section = input_bfd->sections;
8211 section != NULL;
8212 section = section->next)
8213 {
8214 if (top_id < section->id)
8215 top_id = section->id;
8216 }
8217 }
721956f4 8218
8f3bab57 8219 htab->top_id = top_id;
721956f4 8220 amt = sizeof (struct map_stub) * (top_id + 1);
4ce794b7 8221 htab->stub_group = bfd_zmalloc (amt);
721956f4
AM
8222 if (htab->stub_group == NULL)
8223 return -1;
8224
3d6f9012
AM
8225 /* Set toc_off for com, und, abs and ind sections. */
8226 for (id = 0; id < 3; id++)
8227 htab->stub_group[id].toc_off = TOC_BASE_OFF;
721956f4 8228
3d6f9012 8229 elf_gp (output_bfd) = htab->toc_curr = ppc64_elf_toc (output_bfd);
734b6cf9
AM
8230
8231 /* We can't use output_bfd->section_count here to find the top output
8232 section index as some sections may have been removed, and
8233 _bfd_strip_section_from_output doesn't renumber the indices. */
8234 for (section = output_bfd->sections, top_index = 0;
8235 section != NULL;
8236 section = section->next)
8237 {
8238 if (top_index < section->index)
8239 top_index = section->index;
8240 }
8241
8242 htab->top_index = top_index;
8243 amt = sizeof (asection *) * (top_index + 1);
4ce794b7 8244 input_list = bfd_zmalloc (amt);
734b6cf9
AM
8245 htab->input_list = input_list;
8246 if (input_list == NULL)
8247 return -1;
8248
721956f4
AM
8249 return 1;
8250}
8251
e717da7e
AM
8252/* The linker repeatedly calls this function for each TOC input section
8253 and linker generated GOT section. Group input bfds such that the toc
8254 within a group is less than 64k in size. Will break with cute linker
8255 scripts that play games with dot in the output toc section. */
ad8e1ba5
AM
8256
8257void
4ce794b7 8258ppc64_elf_next_toc_section (struct bfd_link_info *info, asection *isec)
ad8e1ba5
AM
8259{
8260 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8261
4c52953f
AM
8262 if (!htab->no_multi_toc)
8263 {
8264 bfd_vma addr = isec->output_offset + isec->output_section->vma;
8265 bfd_vma off = addr - htab->toc_curr;
8266
8267 if (off + isec->size > 0x10000)
8268 htab->toc_curr = addr;
99877b66 8269
4c52953f
AM
8270 elf_gp (isec->owner) = (htab->toc_curr
8271 - elf_gp (isec->output_section->owner)
8272 + TOC_BASE_OFF);
8273 }
ad8e1ba5
AM
8274}
8275
8276/* Called after the last call to the above function. */
8277
8278void
4c52953f 8279ppc64_elf_reinit_toc (bfd *output_bfd, struct bfd_link_info *info)
ad8e1ba5
AM
8280{
8281 struct ppc_link_hash_table *htab = ppc_hash_table (info);
ad8e1ba5 8282
4c52953f
AM
8283 htab->multi_toc_needed = htab->toc_curr != elf_gp (output_bfd);
8284
ad8e1ba5
AM
8285 /* toc_curr tracks the TOC offset used for code sections below in
8286 ppc64_elf_next_input_section. Start off at 0x8000. */
3d6f9012 8287 htab->toc_curr = TOC_BASE_OFF;
ad8e1ba5
AM
8288}
8289
9b5ecbd0
AM
8290/* No toc references were found in ISEC. If the code in ISEC makes no
8291 calls, then there's no need to use toc adjusting stubs when branching
8292 into ISEC. Actually, indirect calls from ISEC are OK as they will
4c52953f
AM
8293 load r2. Returns -1 on error, 0 for no stub needed, 1 for stub
8294 needed, and 2 if a cyclical call-graph was found but no other reason
8295 for a stub was detected. If called from the top level, a return of
8296 2 means the same as a return of 0. */
9b5ecbd0
AM
8297
8298static int
4ce794b7 8299toc_adjusting_stub_needed (struct bfd_link_info *info, asection *isec)
9b5ecbd0 8300{
4c52953f
AM
8301 Elf_Internal_Rela *relstart, *rel;
8302 Elf_Internal_Sym *local_syms;
9b5ecbd0 8303 int ret;
4c52953f 8304 struct ppc_link_hash_table *htab;
9b5ecbd0 8305
772119ce
AM
8306 /* We know none of our code bearing sections will need toc stubs. */
8307 if ((isec->flags & SEC_LINKER_CREATED) != 0)
8308 return 0;
8309
eea6121a 8310 if (isec->size == 0)
082c50f8
AM
8311 return 0;
8312
4c52953f
AM
8313 if (isec->output_section == NULL)
8314 return 0;
8315
9b5ecbd0
AM
8316 /* Hack for linux kernel. .fixup contains branches, but only back to
8317 the function that hit an exception. */
4c52953f
AM
8318 if (strcmp (isec->name, ".fixup") == 0)
8319 return 0;
9b5ecbd0 8320
4c52953f
AM
8321 if (isec->reloc_count == 0)
8322 return 0;
8323
8324 relstart = _bfd_elf_link_read_relocs (isec->owner, isec, NULL, NULL,
8325 info->keep_memory);
8326 if (relstart == NULL)
8327 return -1;
8328
8329 /* Look for branches to outside of this section. */
8330 local_syms = NULL;
8331 ret = 0;
8332 htab = ppc_hash_table (info);
8333 for (rel = relstart; rel < relstart + isec->reloc_count; ++rel)
9b5ecbd0 8334 {
4c52953f
AM
8335 enum elf_ppc64_reloc_type r_type;
8336 unsigned long r_symndx;
8337 struct elf_link_hash_entry *h;
8338 Elf_Internal_Sym *sym;
8339 asection *sym_sec;
8340 long *opd_adjust;
8341 bfd_vma sym_value;
8342 bfd_vma dest;
8343
8344 r_type = ELF64_R_TYPE (rel->r_info);
8345 if (r_type != R_PPC64_REL24
8346 && r_type != R_PPC64_REL14
8347 && r_type != R_PPC64_REL14_BRTAKEN
8348 && r_type != R_PPC64_REL14_BRNTAKEN)
8349 continue;
8350
8351 r_symndx = ELF64_R_SYM (rel->r_info);
8352 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms, r_symndx,
8353 isec->owner))
9b5ecbd0 8354 {
4c52953f
AM
8355 ret = -1;
8356 break;
9b5ecbd0 8357 }
9b5ecbd0 8358
4c52953f
AM
8359 /* Ignore branches to undefined syms. */
8360 if (sym_sec == NULL)
8361 continue;
8362
8363 /* Calls to dynamic lib functions go through a plt call stub
8364 that uses r2. Assume branches to other sections not included
8365 in the link need stubs too, to cover -R and absolute syms. */
8366 if (sym_sec->output_section == NULL)
8367 {
8368 ret = 1;
8369 break;
8370 }
8371
8372 if (h == NULL)
8373 sym_value = sym->st_value;
8374 else
8375 {
8376 if (h->root.type != bfd_link_hash_defined
8377 && h->root.type != bfd_link_hash_defweak)
8378 abort ();
8379 sym_value = h->root.u.def.value;
8380 }
8381 sym_value += rel->r_addend;
8382
8383 /* If this branch reloc uses an opd sym, find the code section. */
8384 opd_adjust = get_opd_info (sym_sec);
8385 if (opd_adjust != NULL)
8386 {
8387
8388 if (h == NULL)
8389 {
8390 long adjust;
8391
8392 adjust = opd_adjust[sym->st_value / 8];
8393 if (adjust == -1)
8394 /* Assume deleted functions won't ever be called. */
8395 continue;
8396 sym_value += adjust;
8397 }
8398
8399 dest = opd_entry_value (sym_sec, sym_value, &sym_sec, NULL);
8400 if (dest == (bfd_vma) -1)
8401 continue;
8402 }
8403 else
8404 dest = (sym_value
8405 + sym_sec->output_offset
8406 + sym_sec->output_section->vma);
8407
8408 /* Ignore branch to self. */
8409 if (sym_sec == isec)
8410 continue;
8411
8412 /* If the called function uses the toc, we need a stub. */
8413 if (sym_sec->has_toc_reloc
8414 || sym_sec->makes_toc_func_call)
8415 {
8416 ret = 1;
8417 break;
8418 }
8419
8420 /* Assume any branch that needs a long branch stub might in fact
8421 need a plt_branch stub. A plt_branch stub uses r2. */
8422 else if (dest - (isec->output_offset
8423 + isec->output_section->vma
8424 + rel->r_offset) + (1 << 25) >= (2 << 25))
9b5ecbd0
AM
8425 {
8426 ret = 1;
8427 break;
8428 }
4c52953f
AM
8429
8430 /* If calling back to a section in the process of being tested, we
8431 can't say for sure that no toc adjusting stubs are needed, so
8432 don't return zero. */
8433 else if (sym_sec->call_check_in_progress)
8434 ret = 2;
8435
8436 /* Branches to another section that itself doesn't have any TOC
8437 references are OK. Recursively call ourselves to check. */
8438 else if (sym_sec->id <= htab->top_id
8439 && htab->stub_group[sym_sec->id].toc_off == 0)
8440 {
8441 int recur;
8442
8443 /* Mark current section as indeterminate, so that other
8444 sections that call back to current won't be marked as
8445 known. */
8446 isec->call_check_in_progress = 1;
8447 recur = toc_adjusting_stub_needed (info, sym_sec);
8448 isec->call_check_in_progress = 0;
8449
8450 if (recur < 0)
8451 {
8452 /* An error. Exit. */
8453 ret = -1;
8454 break;
8455 }
8456 else if (recur <= 1)
8457 {
8458 /* Known result. Mark as checked and set section flag. */
8459 htab->stub_group[sym_sec->id].toc_off = 1;
8460 if (recur != 0)
8461 {
8462 sym_sec->makes_toc_func_call = 1;
8463 ret = 1;
8464 break;
8465 }
8466 }
8467 else
8468 {
8469 /* Unknown result. Continue checking. */
8470 ret = 2;
8471 }
8472 }
9b5ecbd0
AM
8473 }
8474
4c52953f
AM
8475 if (local_syms != NULL
8476 && (elf_tdata (isec->owner)->symtab_hdr.contents
8477 != (unsigned char *) local_syms))
8478 free (local_syms);
8479 if (elf_section_data (isec)->relocs != relstart)
8480 free (relstart);
8481
9b5ecbd0
AM
8482 return ret;
8483}
8484
721956f4
AM
8485/* The linker repeatedly calls this function for each input section,
8486 in the order that input sections are linked into output sections.
8487 Build lists of input sections to determine groupings between which
8488 we may insert linker stubs. */
8489
9b5ecbd0 8490bfd_boolean
4ce794b7 8491ppc64_elf_next_input_section (struct bfd_link_info *info, asection *isec)
721956f4
AM
8492{
8493 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8494
734b6cf9
AM
8495 if ((isec->output_section->flags & SEC_CODE) != 0
8496 && isec->output_section->index <= htab->top_index)
721956f4 8497 {
734b6cf9 8498 asection **list = htab->input_list + isec->output_section->index;
3d6f9012 8499 /* Steal the link_sec pointer for our list. */
721956f4 8500#define PREV_SEC(sec) (htab->stub_group[(sec)->id].link_sec)
3d6f9012
AM
8501 /* This happens to make the list in reverse order,
8502 which is what we want. */
734b6cf9
AM
8503 PREV_SEC (isec) = *list;
8504 *list = isec;
721956f4 8505 }
ad8e1ba5 8506
4c52953f 8507 if (htab->multi_toc_needed)
9b5ecbd0 8508 {
4c52953f
AM
8509 /* If a code section has a function that uses the TOC then we need
8510 to use the right TOC (obviously). Also, make sure that .opd gets
8511 the correct TOC value for R_PPC64_TOC relocs that don't have or
8512 can't find their function symbol (shouldn't ever happen now). */
8513 if (isec->has_toc_reloc || (isec->flags & SEC_CODE) == 0)
8514 {
8515 if (elf_gp (isec->owner) != 0)
8516 htab->toc_curr = elf_gp (isec->owner);
8517 }
8518 else if (htab->stub_group[isec->id].toc_off == 0)
8519 {
8520 int ret = toc_adjusting_stub_needed (info, isec);
8521 if (ret < 0)
8522 return FALSE;
8523 else
8524 isec->makes_toc_func_call = ret & 1;
8525 }
9b5ecbd0 8526 }
ad8e1ba5
AM
8527
8528 /* Functions that don't use the TOC can belong in any TOC group.
8529 Use the last TOC base. This happens to make _init and _fini
8530 pasting work. */
8531 htab->stub_group[isec->id].toc_off = htab->toc_curr;
9b5ecbd0 8532 return TRUE;
721956f4
AM
8533}
8534
8535/* See whether we can group stub sections together. Grouping stub
8536 sections may result in fewer stubs. More importantly, we need to
8537 put all .init* and .fini* stubs at the beginning of the .init or
8538 .fini output sections respectively, because glibc splits the
8539 _init and _fini functions into multiple parts. Putting a stub in
8540 the middle of a function is not a good idea. */
8541
8542static void
4ce794b7
AM
8543group_sections (struct ppc_link_hash_table *htab,
8544 bfd_size_type stub_group_size,
8545 bfd_boolean stubs_always_before_branch)
721956f4 8546{
734b6cf9
AM
8547 asection **list = htab->input_list + htab->top_index;
8548 do
721956f4 8549 {
734b6cf9
AM
8550 asection *tail = *list;
8551 while (tail != NULL)
721956f4 8552 {
734b6cf9
AM
8553 asection *curr;
8554 asection *prev;
8555 bfd_size_type total;
8556 bfd_boolean big_sec;
8557 bfd_vma curr_toc;
8558
8559 curr = tail;
eea6121a 8560 total = tail->size;
734b6cf9
AM
8561 big_sec = total >= stub_group_size;
8562 curr_toc = htab->stub_group[tail->id].toc_off;
8563
8564 while ((prev = PREV_SEC (curr)) != NULL
8565 && ((total += curr->output_offset - prev->output_offset)
ad8e1ba5
AM
8566 < stub_group_size)
8567 && htab->stub_group[prev->id].toc_off == curr_toc)
734b6cf9
AM
8568 curr = prev;
8569
8570 /* OK, the size from the start of CURR to the end is less
8571 than stub_group_size and thus can be handled by one stub
8572 section. (or the tail section is itself larger than
8573 stub_group_size, in which case we may be toast.) We
8574 should really be keeping track of the total size of stubs
8575 added here, as stubs contribute to the final output
8576 section size. That's a little tricky, and this way will
8577 only break if stubs added make the total size more than
8578 2^25, ie. for the default stub_group_size, if stubs total
8579 more than 2097152 bytes, or nearly 75000 plt call stubs. */
8580 do
721956f4
AM
8581 {
8582 prev = PREV_SEC (tail);
734b6cf9 8583 /* Set up this stub group. */
721956f4
AM
8584 htab->stub_group[tail->id].link_sec = curr;
8585 }
734b6cf9
AM
8586 while (tail != curr && (tail = prev) != NULL);
8587
8588 /* But wait, there's more! Input sections up to stub_group_size
8589 bytes before the stub section can be handled by it too.
8590 Don't do this if we have a really large section after the
8591 stubs, as adding more stubs increases the chance that
8592 branches may not reach into the stub section. */
8593 if (!stubs_always_before_branch && !big_sec)
8594 {
8595 total = 0;
8596 while (prev != NULL
8597 && ((total += tail->output_offset - prev->output_offset)
8598 < stub_group_size)
8599 && htab->stub_group[prev->id].toc_off == curr_toc)
8600 {
8601 tail = prev;
8602 prev = PREV_SEC (tail);
8603 htab->stub_group[tail->id].link_sec = curr;
8604 }
8605 }
8606 tail = prev;
721956f4
AM
8607 }
8608 }
734b6cf9
AM
8609 while (list-- != htab->input_list);
8610 free (htab->input_list);
721956f4
AM
8611#undef PREV_SEC
8612}
8613
721956f4
AM
8614/* Determine and set the size of the stub section for a final link.
8615
8616 The basic idea here is to examine all the relocations looking for
8617 PC-relative calls to a target that is unreachable with a "bl"
8618 instruction. */
8619
b34976b6 8620bfd_boolean
4ce794b7 8621ppc64_elf_size_stubs (bfd *output_bfd,
4ce794b7
AM
8622 struct bfd_link_info *info,
8623 bfd_signed_vma group_size,
8624 asection *(*add_stub_section) (const char *, asection *),
8625 void (*layout_sections_again) (void))
721956f4
AM
8626{
8627 bfd_size_type stub_group_size;
b34976b6 8628 bfd_boolean stubs_always_before_branch;
721956f4
AM
8629 struct ppc_link_hash_table *htab = ppc_hash_table (info);
8630
8631 /* Stash our params away. */
721956f4
AM
8632 htab->add_stub_section = add_stub_section;
8633 htab->layout_sections_again = layout_sections_again;
8634 stubs_always_before_branch = group_size < 0;
8635 if (group_size < 0)
8636 stub_group_size = -group_size;
8637 else
8638 stub_group_size = group_size;
8639 if (stub_group_size == 1)
8640 {
8641 /* Default values. */
58ac9f71
AM
8642 if (stubs_always_before_branch)
8643 {
8644 stub_group_size = 0x1e00000;
8645 if (htab->has_14bit_branch)
8646 stub_group_size = 0x7800;
8647 }
8648 else
8649 {
8650 stub_group_size = 0x1c00000;
8651 if (htab->has_14bit_branch)
8652 stub_group_size = 0x7000;
8653 }
721956f4
AM
8654 }
8655
8656 group_sections (htab, stub_group_size, stubs_always_before_branch);
8657
721956f4
AM
8658 while (1)
8659 {
8660 bfd *input_bfd;
8661 unsigned int bfd_indx;
8662 asection *stub_sec;
b34976b6 8663 bfd_boolean stub_changed;
721956f4
AM
8664
8665 htab->stub_iteration += 1;
b34976b6 8666 stub_changed = FALSE;
721956f4
AM
8667
8668 for (input_bfd = info->input_bfds, bfd_indx = 0;
8669 input_bfd != NULL;
8670 input_bfd = input_bfd->link_next, bfd_indx++)
8671 {
8672 Elf_Internal_Shdr *symtab_hdr;
8673 asection *section;
6cdc0ccc 8674 Elf_Internal_Sym *local_syms = NULL;
721956f4
AM
8675
8676 /* We'll need the symbol table in a second. */
8677 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
8678 if (symtab_hdr->sh_info == 0)
8679 continue;
8680
721956f4
AM
8681 /* Walk over each section attached to the input bfd. */
8682 for (section = input_bfd->sections;
8683 section != NULL;
8684 section = section->next)
8685 {
721956f4 8686 Elf_Internal_Rela *internal_relocs, *irelaend, *irela;
721956f4
AM
8687
8688 /* If there aren't any relocs, then there's nothing more
8689 to do. */
8690 if ((section->flags & SEC_RELOC) == 0
8691 || section->reloc_count == 0)
8692 continue;
8693
8694 /* If this section is a link-once section that will be
8695 discarded, then don't create any stubs. */
8696 if (section->output_section == NULL
8697 || section->output_section->owner != output_bfd)
8698 continue;
8699
1e2f5b6e
AM
8700 /* Get the relocs. */
8701 internal_relocs
4ce794b7 8702 = _bfd_elf_link_read_relocs (input_bfd, section, NULL, NULL,
45d6a902 8703 info->keep_memory);
721956f4 8704 if (internal_relocs == NULL)
1e2f5b6e 8705 goto error_ret_free_local;
721956f4
AM
8706
8707 /* Now examine each relocation. */
8708 irela = internal_relocs;
8709 irelaend = irela + section->reloc_count;
8710 for (; irela < irelaend; irela++)
8711 {
4ce794b7
AM
8712 enum elf_ppc64_reloc_type r_type;
8713 unsigned int r_indx;
721956f4
AM
8714 enum ppc_stub_type stub_type;
8715 struct ppc_stub_hash_entry *stub_entry;
8387904d 8716 asection *sym_sec, *code_sec;
721956f4
AM
8717 bfd_vma sym_value;
8718 bfd_vma destination;
8843416a 8719 bfd_boolean ok_dest;
721956f4 8720 struct ppc_link_hash_entry *hash;
8387904d 8721 struct ppc_link_hash_entry *fdh;
411e1bfb
AM
8722 struct elf_link_hash_entry *h;
8723 Elf_Internal_Sym *sym;
721956f4
AM
8724 char *stub_name;
8725 const asection *id_sec;
8387904d 8726 long *opd_adjust;
721956f4
AM
8727
8728 r_type = ELF64_R_TYPE (irela->r_info);
8729 r_indx = ELF64_R_SYM (irela->r_info);
8730
4ce794b7 8731 if (r_type >= R_PPC64_max)
721956f4
AM
8732 {
8733 bfd_set_error (bfd_error_bad_value);
6cdc0ccc 8734 goto error_ret_free_internal;
721956f4
AM
8735 }
8736
8737 /* Only look for stubs on branch instructions. */
4ce794b7
AM
8738 if (r_type != R_PPC64_REL24
8739 && r_type != R_PPC64_REL14
8740 && r_type != R_PPC64_REL14_BRTAKEN
8741 && r_type != R_PPC64_REL14_BRNTAKEN)
721956f4
AM
8742 continue;
8743
8744 /* Now determine the call target, its name, value,
8745 section. */
411e1bfb
AM
8746 if (!get_sym_h (&h, &sym, &sym_sec, NULL, &local_syms,
8747 r_indx, input_bfd))
8748 goto error_ret_free_internal;
8749 hash = (struct ppc_link_hash_entry *) h;
8750
8843416a 8751 ok_dest = FALSE;
8387904d 8752 fdh = NULL;
411e1bfb 8753 if (hash == NULL)
721956f4 8754 {
411e1bfb 8755 sym_value = sym->st_value;
8843416a 8756 ok_dest = TRUE;
721956f4
AM
8757 }
8758 else
8759 {
411e1bfb 8760 sym_value = 0;
99877b66
AM
8761 /* Recognise an old ABI func code entry sym, and
8762 use the func descriptor sym instead. */
8763 if (hash->elf.root.type == bfd_link_hash_undefweak
8387904d
AM
8764 && hash->elf.root.root.string[0] == '.'
8765 && (fdh = get_fdh (hash, htab)) != NULL)
8766 {
8387904d
AM
8767 if (fdh->elf.root.type == bfd_link_hash_defined
8768 || fdh->elf.root.type == bfd_link_hash_defweak)
8769 {
8770 sym_sec = fdh->elf.root.u.def.section;
8771 sym_value = fdh->elf.root.u.def.value;
8772 if (sym_sec->output_section != NULL)
8773 ok_dest = TRUE;
8774 }
99877b66
AM
8775 else
8776 fdh = NULL;
8387904d
AM
8777 }
8778 else if (hash->elf.root.type == bfd_link_hash_defined
8779 || hash->elf.root.type == bfd_link_hash_defweak)
721956f4 8780 {
721956f4
AM
8781 sym_value = hash->elf.root.u.def.value;
8782 if (sym_sec->output_section != NULL)
8843416a 8783 ok_dest = TRUE;
721956f4
AM
8784 }
8785 else if (hash->elf.root.type == bfd_link_hash_undefweak)
8786 ;
8787 else if (hash->elf.root.type == bfd_link_hash_undefined)
8788 ;
8789 else
8790 {
8791 bfd_set_error (bfd_error_bad_value);
8792 goto error_ret_free_internal;
8793 }
8794 }
8795
8843416a
AM
8796 destination = 0;
8797 if (ok_dest)
8798 {
8799 sym_value += irela->r_addend;
8800 destination = (sym_value
8801 + sym_sec->output_offset
8802 + sym_sec->output_section->vma);
8803 }
8804
8387904d
AM
8805 code_sec = sym_sec;
8806 opd_adjust = get_opd_info (sym_sec);
8807 if (opd_adjust != NULL)
8808 {
8809 bfd_vma dest;
8810
8811 if (hash == NULL)
8812 {
3f764659 8813 long adjust = opd_adjust[sym_value / 8];
8387904d
AM
8814 if (adjust == -1)
8815 continue;
8816 sym_value += adjust;
8817 }
8818 dest = opd_entry_value (sym_sec, sym_value,
8819 &code_sec, &sym_value);
8820 if (dest != (bfd_vma) -1)
8821 {
8822 destination = dest;
8823 if (fdh != NULL)
8824 {
8825 /* Fixup old ABI sym to point at code
8826 entry. */
99877b66 8827 hash->elf.root.type = bfd_link_hash_defweak;
8387904d
AM
8828 hash->elf.root.u.def.section = code_sec;
8829 hash->elf.root.u.def.value = sym_value;
8830 }
8831 }
8832 }
8833
721956f4
AM
8834 /* Determine what (if any) linker stub is needed. */
8835 stub_type = ppc_type_of_stub (section, irela, &hash,
8836 destination);
ad8e1ba5
AM
8837
8838 if (stub_type != ppc_stub_plt_call)
8839 {
8840 /* Check whether we need a TOC adjusting stub.
8841 Since the linker pastes together pieces from
8842 different object files when creating the
8843 _init and _fini functions, it may be that a
8844 call to what looks like a local sym is in
8845 fact a call needing a TOC adjustment. */
8387904d
AM
8846 if (code_sec != NULL
8847 && code_sec->output_section != NULL
8848 && (htab->stub_group[code_sec->id].toc_off
9b5ecbd0 8849 != htab->stub_group[section->id].toc_off)
4c52953f
AM
8850 && (code_sec->has_toc_reloc
8851 || code_sec->makes_toc_func_call))
ad8e1ba5
AM
8852 stub_type = ppc_stub_long_branch_r2off;
8853 }
8854
721956f4
AM
8855 if (stub_type == ppc_stub_none)
8856 continue;
8857
411e1bfb
AM
8858 /* __tls_get_addr calls might be eliminated. */
8859 if (stub_type != ppc_stub_plt_call
8860 && hash != NULL
8387904d
AM
8861 && (hash == htab->tls_get_addr
8862 || hash == htab->tls_get_addr_fd)
411e1bfb
AM
8863 && section->has_tls_reloc
8864 && irela != internal_relocs)
8865 {
8866 /* Get tls info. */
e7b938ca 8867 char *tls_mask;
411e1bfb 8868
0d4792f7 8869 if (!get_tls_mask (&tls_mask, NULL, &local_syms,
411e1bfb
AM
8870 irela - 1, input_bfd))
8871 goto error_ret_free_internal;
e7b938ca 8872 if (*tls_mask != 0)
411e1bfb
AM
8873 continue;
8874 }
8875
721956f4
AM
8876 /* Support for grouping stub sections. */
8877 id_sec = htab->stub_group[section->id].link_sec;
8878
8879 /* Get the name of this stub. */
8880 stub_name = ppc_stub_name (id_sec, sym_sec, hash, irela);
8881 if (!stub_name)
8882 goto error_ret_free_internal;
8883
8884 stub_entry = ppc_stub_hash_lookup (&htab->stub_hash_table,
b34976b6 8885 stub_name, FALSE, FALSE);
721956f4
AM
8886 if (stub_entry != NULL)
8887 {
8888 /* The proper stub has already been created. */
8889 free (stub_name);
8890 continue;
8891 }
8892
8893 stub_entry = ppc_add_stub (stub_name, section, htab);
8894 if (stub_entry == NULL)
8895 {
8896 free (stub_name);
6cdc0ccc
AM
8897 error_ret_free_internal:
8898 if (elf_section_data (section)->relocs == NULL)
8899 free (internal_relocs);
8900 error_ret_free_local:
8901 if (local_syms != NULL
8902 && (symtab_hdr->contents
8903 != (unsigned char *) local_syms))
8904 free (local_syms);
b34976b6 8905 return FALSE;
721956f4
AM
8906 }
8907
ad8e1ba5 8908 stub_entry->stub_type = stub_type;
721956f4 8909 stub_entry->target_value = sym_value;
8387904d 8910 stub_entry->target_section = code_sec;
721956f4 8911 stub_entry->h = hash;
411e1bfb 8912 stub_entry->addend = irela->r_addend;
ee75fd95
AM
8913
8914 if (stub_entry->h != NULL)
8915 htab->stub_globals += 1;
8916
b34976b6 8917 stub_changed = TRUE;
721956f4
AM
8918 }
8919
8920 /* We're done with the internal relocs, free them. */
6cdc0ccc 8921 if (elf_section_data (section)->relocs != internal_relocs)
1e2f5b6e 8922 free (internal_relocs);
721956f4 8923 }
6cdc0ccc
AM
8924
8925 if (local_syms != NULL
8926 && symtab_hdr->contents != (unsigned char *) local_syms)
8927 {
8928 if (!info->keep_memory)
8929 free (local_syms);
8930 else
8931 symtab_hdr->contents = (unsigned char *) local_syms;
8932 }
721956f4
AM
8933 }
8934
8935 if (!stub_changed)
8936 break;
8937
8938 /* OK, we've added some stubs. Find out the new size of the
8939 stub sections. */
8940 for (stub_sec = htab->stub_bfd->sections;
8941 stub_sec != NULL;
8942 stub_sec = stub_sec->next)
e717da7e 8943 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
ee75fd95
AM
8944 {
8945 stub_sec->size = 0;
8946 stub_sec->reloc_count = 0;
8947 }
eea6121a
AM
8948
8949 htab->brlt->size = 0;
ee75fd95 8950 if (htab->relbrlt != NULL)
eea6121a 8951 htab->relbrlt->size = 0;
721956f4 8952
63bc6f6c 8953 bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
721956f4
AM
8954
8955 /* Ask the linker to do its stuff. */
8956 (*htab->layout_sections_again) ();
8957 }
8958
afbe61cf
AM
8959 /* It would be nice to strip .branch_lt from the output if the
8960 section is empty, but it's too late. If we strip sections here,
8961 the dynamic symbol table is corrupted since the section symbol
8962 for the stripped section isn't written. */
721956f4 8963
b34976b6 8964 return TRUE;
721956f4
AM
8965}
8966
8967/* Called after we have determined section placement. If sections
805fc799 8968 move, we'll be called again. Provide a value for TOCstart. */
721956f4 8969
805fc799 8970bfd_vma
4ce794b7 8971ppc64_elf_toc (bfd *obfd)
721956f4 8972{
805fc799
AM
8973 asection *s;
8974 bfd_vma TOCstart;
721956f4 8975
805fc799
AM
8976 /* The TOC consists of sections .got, .toc, .tocbss, .plt in that
8977 order. The TOC starts where the first of these sections starts. */
8978 s = bfd_get_section_by_name (obfd, ".got");
8979 if (s == NULL)
8980 s = bfd_get_section_by_name (obfd, ".toc");
8981 if (s == NULL)
8982 s = bfd_get_section_by_name (obfd, ".tocbss");
8983 if (s == NULL)
8984 s = bfd_get_section_by_name (obfd, ".plt");
8985 if (s == NULL)
8986 {
8987 /* This may happen for
8988 o references to TOC base (SYM@toc / TOC[tc0]) without a
8989 .toc directive
8990 o bad linker script
8991 o --gc-sections and empty TOC sections
8992
8993 FIXME: Warn user? */
8994
8995 /* Look for a likely section. We probably won't even be
8996 using TOCstart. */
8997 for (s = obfd->sections; s != NULL; s = s->next)
8998 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA | SEC_READONLY))
8999 == (SEC_ALLOC | SEC_SMALL_DATA))
9000 break;
721956f4 9001 if (s == NULL)
805fc799
AM
9002 for (s = obfd->sections; s != NULL; s = s->next)
9003 if ((s->flags & (SEC_ALLOC | SEC_SMALL_DATA))
9004 == (SEC_ALLOC | SEC_SMALL_DATA))
9005 break;
721956f4 9006 if (s == NULL)
805fc799
AM
9007 for (s = obfd->sections; s != NULL; s = s->next)
9008 if ((s->flags & (SEC_ALLOC | SEC_READONLY)) == SEC_ALLOC)
9009 break;
721956f4 9010 if (s == NULL)
805fc799
AM
9011 for (s = obfd->sections; s != NULL; s = s->next)
9012 if ((s->flags & SEC_ALLOC) == SEC_ALLOC)
9013 break;
9014 }
721956f4 9015
805fc799
AM
9016 TOCstart = 0;
9017 if (s != NULL)
9018 TOCstart = s->output_section->vma + s->output_offset;
721956f4 9019
805fc799 9020 return TOCstart;
721956f4
AM
9021}
9022
9023/* Build all the stubs associated with the current output file.
9024 The stubs are kept in a hash table attached to the main linker
9025 hash table. This function is called via gldelf64ppc_finish. */
9026
b34976b6 9027bfd_boolean
4ce794b7
AM
9028ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
9029 struct bfd_link_info *info,
9030 char **stats)
5d1634d7
AM
9031{
9032 struct ppc_link_hash_table *htab = ppc_hash_table (info);
721956f4 9033 asection *stub_sec;
5d1634d7 9034 bfd_byte *p;
e717da7e 9035 int stub_sec_count = 0;
5d1634d7 9036
ad8e1ba5 9037 htab->emit_stub_syms = emit_stub_syms;
eea6121a
AM
9038
9039 /* Allocate memory to hold the linker stubs. */
721956f4
AM
9040 for (stub_sec = htab->stub_bfd->sections;
9041 stub_sec != NULL;
9042 stub_sec = stub_sec->next)
eea6121a
AM
9043 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0
9044 && stub_sec->size != 0)
e717da7e 9045 {
eea6121a
AM
9046 stub_sec->contents = bfd_zalloc (htab->stub_bfd, stub_sec->size);
9047 if (stub_sec->contents == NULL)
9048 return FALSE;
9049 /* We want to check that built size is the same as calculated
9050 size. rawsize is a convenient location to use. */
9051 stub_sec->rawsize = stub_sec->size;
9052 stub_sec->size = 0;
e717da7e 9053 }
5d1634d7 9054
4ce794b7 9055 if (htab->plt != NULL)
5d1634d7 9056 {
9f951329 9057 unsigned int indx;
ad8e1ba5 9058 bfd_vma plt0;
9f951329 9059
721956f4 9060 /* Build the .glink plt call stub. */
4ce794b7
AM
9061 plt0 = (htab->plt->output_section->vma
9062 + htab->plt->output_offset
9063 - (htab->glink->output_section->vma
9064 + htab->glink->output_offset
ad8e1ba5
AM
9065 + GLINK_CALL_STUB_SIZE));
9066 if (plt0 + 0x80008000 > 0xffffffff)
721956f4 9067 {
ad8e1ba5
AM
9068 (*_bfd_error_handler) (_(".glink and .plt too far apart"));
9069 bfd_set_error (bfd_error_bad_value);
9070 return FALSE;
721956f4 9071 }
721956f4 9072
97b639ba
AM
9073 if (htab->emit_stub_syms)
9074 {
9075 struct elf_link_hash_entry *h;
9076 h = elf_link_hash_lookup (&htab->elf, "__glink", TRUE, FALSE, FALSE);
9077 if (h == NULL)
9078 return FALSE;
9079 if (h->root.type == bfd_link_hash_new)
9080 {
9081 h->root.type = bfd_link_hash_defined;
9082 h->root.u.def.section = htab->glink;
9083 h->root.u.def.value = 0;
f5385ebf
AM
9084 h->ref_regular = 1;
9085 h->def_regular = 1;
9086 h->ref_regular_nonweak = 1;
9087 h->forced_local = 1;
9088 h->non_elf = 0;
97b639ba
AM
9089 }
9090 }
4ce794b7
AM
9091 p = htab->glink->contents;
9092 bfd_put_32 (htab->glink->owner, MFCTR_R12, p);
ad8e1ba5 9093 p += 4;
4ce794b7 9094 bfd_put_32 (htab->glink->owner, SLDI_R11_R0_3, p);
ad8e1ba5 9095 p += 4;
4ce794b7 9096 bfd_put_32 (htab->glink->owner, ADDIC_R2_R0_32K, p);
ad8e1ba5 9097 p += 4;
4ce794b7 9098 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
ad8e1ba5 9099 p += 4;
4ce794b7 9100 bfd_put_32 (htab->glink->owner, SRADI_R2_R2_63, p);
ad8e1ba5 9101 p += 4;
4ce794b7 9102 bfd_put_32 (htab->glink->owner, SLDI_R11_R0_2, p);
ad8e1ba5 9103 p += 4;
4ce794b7 9104 bfd_put_32 (htab->glink->owner, AND_R2_R2_R11, p);
ad8e1ba5 9105 p += 4;
4ce794b7 9106 bfd_put_32 (htab->glink->owner, SUB_R12_R12_R11, p);
ad8e1ba5 9107 p += 4;
4ce794b7 9108 bfd_put_32 (htab->glink->owner, ADD_R12_R12_R2, p);
ad8e1ba5 9109 p += 4;
4ce794b7 9110 bfd_put_32 (htab->glink->owner, ADDIS_R12_R12 | PPC_HA (plt0), p);
ad8e1ba5 9111 p += 4;
4ce794b7 9112 bfd_put_32 (htab->glink->owner, LD_R11_0R12 | PPC_LO (plt0), p);
ad8e1ba5 9113 p += 4;
4ce794b7 9114 bfd_put_32 (htab->glink->owner, ADDI_R12_R12 | PPC_LO (plt0), p);
ad8e1ba5 9115 p += 4;
4ce794b7 9116 bfd_put_32 (htab->glink->owner, LD_R2_0R12 | 8, p);
ad8e1ba5 9117 p += 4;
4ce794b7 9118 bfd_put_32 (htab->glink->owner, MTCTR_R11, p);
ad8e1ba5 9119 p += 4;
4ce794b7 9120 bfd_put_32 (htab->glink->owner, LD_R11_0R12 | 16, p);
ad8e1ba5 9121 p += 4;
4ce794b7 9122 bfd_put_32 (htab->glink->owner, BCTR, p);
ad8e1ba5
AM
9123 p += 4;
9124
9f951329
AM
9125 /* Build the .glink lazy link call stubs. */
9126 indx = 0;
eea6121a 9127 while (p < htab->glink->contents + htab->glink->size)
9f951329
AM
9128 {
9129 if (indx < 0x8000)
9130 {
4ce794b7 9131 bfd_put_32 (htab->glink->owner, LI_R0_0 | indx, p);
9f951329
AM
9132 p += 4;
9133 }
9134 else
9135 {
4ce794b7 9136 bfd_put_32 (htab->glink->owner, LIS_R0_0 | PPC_HI (indx), p);
9f951329 9137 p += 4;
4ce794b7 9138 bfd_put_32 (htab->glink->owner, ORI_R0_R0_0 | PPC_LO (indx), p);
9f951329
AM
9139 p += 4;
9140 }
4ce794b7
AM
9141 bfd_put_32 (htab->glink->owner,
9142 B_DOT | ((htab->glink->contents - p) & 0x3fffffc), p);
a16d5acb 9143 indx++;
9f951329
AM
9144 p += 4;
9145 }
eea6121a 9146 htab->glink->rawsize = p - htab->glink->contents;
5d1634d7 9147 }
5d1634d7 9148
eea6121a 9149 if (htab->brlt->size != 0)
721956f4 9150 {
4ce794b7 9151 htab->brlt->contents = bfd_zalloc (htab->brlt->owner,
eea6121a 9152 htab->brlt->size);
4ce794b7 9153 if (htab->brlt->contents == NULL)
b34976b6 9154 return FALSE;
721956f4 9155 }
ee75fd95 9156 if (htab->relbrlt != NULL && htab->relbrlt->size != 0)
63bc6f6c
AM
9157 {
9158 htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
eea6121a 9159 htab->relbrlt->size);
63bc6f6c
AM
9160 if (htab->relbrlt->contents == NULL)
9161 return FALSE;
9162 }
5d1634d7 9163
721956f4
AM
9164 /* Build the stubs as directed by the stub hash table. */
9165 bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);
5d1634d7 9166
721956f4
AM
9167 for (stub_sec = htab->stub_bfd->sections;
9168 stub_sec != NULL;
9169 stub_sec = stub_sec->next)
e717da7e
AM
9170 if ((stub_sec->flags & SEC_LINKER_CREATED) == 0)
9171 {
9172 stub_sec_count += 1;
eea6121a 9173 if (stub_sec->rawsize != stub_sec->size)
e717da7e
AM
9174 break;
9175 }
5d1634d7 9176
721956f4 9177 if (stub_sec != NULL
eea6121a 9178 || htab->glink->rawsize != htab->glink->size)
5d1634d7 9179 {
b34976b6 9180 htab->stub_error = TRUE;
721956f4 9181 (*_bfd_error_handler) (_("stubs don't match calculated size"));
5d1634d7 9182 }
721956f4 9183
d2a300cf
AM
9184 if (htab->stub_error)
9185 return FALSE;
9186
9187 if (stats != NULL)
9188 {
9189 *stats = bfd_malloc (500);
9190 if (*stats == NULL)
9191 return FALSE;
9192
ee75fd95 9193 sprintf (*stats, _("linker stubs in %u group%s\n"
d2a300cf
AM
9194 " branch %lu\n"
9195 " toc adjust %lu\n"
9196 " long branch %lu\n"
9197 " long toc adj %lu\n"
9198 " plt call %lu"),
e717da7e 9199 stub_sec_count,
ee75fd95 9200 stub_sec_count == 1 ? "" : "s",
4ce794b7
AM
9201 htab->stub_count[ppc_stub_long_branch - 1],
9202 htab->stub_count[ppc_stub_long_branch_r2off - 1],
9203 htab->stub_count[ppc_stub_plt_branch - 1],
9204 htab->stub_count[ppc_stub_plt_branch_r2off - 1],
9205 htab->stub_count[ppc_stub_plt_call - 1]);
d2a300cf
AM
9206 }
9207 return TRUE;
5bd4f169
AM
9208}
9209
99877b66
AM
9210/* This function undoes the changes made by add_symbol_adjust. */
9211
9212static bfd_boolean
9213undo_symbol_twiddle (struct elf_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
9214{
9215 struct ppc_link_hash_entry *eh;
9216
9217 if (h->root.type == bfd_link_hash_indirect)
9218 return TRUE;
9219
9220 if (h->root.type == bfd_link_hash_warning)
9221 h = (struct elf_link_hash_entry *) h->root.u.i.link;
9222
9223 eh = (struct ppc_link_hash_entry *) h;
9224 if (eh->elf.root.type != bfd_link_hash_undefweak || !eh->was_undefined)
9225 return TRUE;
9226
9227 eh->elf.root.type = bfd_link_hash_undefined;
9228 return TRUE;
9229}
9230
9231void
9232ppc64_elf_restore_symbols (struct bfd_link_info *info)
9233{
9234 struct ppc_link_hash_table *htab = ppc_hash_table (info);
9235 elf_link_hash_traverse (&htab->elf, undo_symbol_twiddle, info);
9236}
9237
5bd4f169
AM
9238/* The RELOCATE_SECTION function is called by the ELF backend linker
9239 to handle the relocations for a section.
9240
9241 The relocs are always passed as Rela structures; if the section
9242 actually uses Rel structures, the r_addend field will always be
9243 zero.
9244
9245 This function is responsible for adjust the section contents as
9246 necessary, and (if using Rela relocs and generating a
1049f94e 9247 relocatable output file) adjusting the reloc addend as
5bd4f169
AM
9248 necessary.
9249
9250 This function does not have to worry about setting the reloc
9251 address or the reloc symbol index.
9252
9253 LOCAL_SYMS is a pointer to the swapped in local symbols.
9254
9255 LOCAL_SECTIONS is an array giving the section in the input file
9256 corresponding to the st_shndx field of each local symbol.
9257
9258 The global hash table entry for the global symbols can be found
9259 via elf_sym_hashes (input_bfd).
9260
1049f94e 9261 When generating relocatable output, this function must handle
5bd4f169
AM
9262 STB_LOCAL/STT_SECTION symbols specially. The output symbol is
9263 going to be the section symbol corresponding to the output
9264 section, which means that the addend must be adjusted
9265 accordingly. */
9266
b34976b6 9267static bfd_boolean
4ce794b7
AM
9268ppc64_elf_relocate_section (bfd *output_bfd,
9269 struct bfd_link_info *info,
9270 bfd *input_bfd,
9271 asection *input_section,
9272 bfd_byte *contents,
9273 Elf_Internal_Rela *relocs,
9274 Elf_Internal_Sym *local_syms,
9275 asection **local_sections)
5bd4f169 9276{
65f38f15 9277 struct ppc_link_hash_table *htab;
5bd4f169
AM
9278 Elf_Internal_Shdr *symtab_hdr;
9279 struct elf_link_hash_entry **sym_hashes;
5bd4f169
AM
9280 Elf_Internal_Rela *rel;
9281 Elf_Internal_Rela *relend;
411e1bfb
AM
9282 Elf_Internal_Rela outrel;
9283 bfd_byte *loc;
411e1bfb 9284 struct got_entry **local_got_ents;
5bd4f169 9285 bfd_vma TOCstart;
b34976b6
AM
9286 bfd_boolean ret = TRUE;
9287 bfd_boolean is_opd;
96e0dda4 9288 /* Disabled until we sort out how ld should choose 'y' vs 'at'. */
b34976b6 9289 bfd_boolean is_power4 = FALSE;
5bd4f169 9290
1049f94e 9291 if (info->relocatable)
b34976b6 9292 return TRUE;
b491616a 9293
65f38f15 9294 /* Initialize howto table if needed. */
5bd4f169 9295 if (!ppc64_elf_howto_table[R_PPC64_ADDR32])
5bd4f169
AM
9296 ppc_howto_init ();
9297
65f38f15 9298 htab = ppc_hash_table (info);
ee75fd95
AM
9299
9300 /* Don't relocate stub sections. */
9301 if (input_section->owner == htab->stub_bfd)
9302 return TRUE;
9303
411e1bfb 9304 local_got_ents = elf_local_got_ents (input_bfd);
5bd4f169 9305 TOCstart = elf_gp (output_bfd);
5bd4f169
AM
9306 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
9307 sym_hashes = elf_sym_hashes (input_bfd);
f0abc2a1 9308 is_opd = ppc64_elf_section_data (input_section)->opd.adjust != NULL;
65f38f15 9309
5bd4f169
AM
9310 rel = relocs;
9311 relend = relocs + input_section->reloc_count;
9312 for (; rel < relend; rel++)
9313 {
04c9666a 9314 enum elf_ppc64_reloc_type r_type;
5bd4f169
AM
9315 bfd_vma addend;
9316 bfd_reloc_status_type r;
9317 Elf_Internal_Sym *sym;
9318 asection *sec;
039b3fef
AM
9319 struct elf_link_hash_entry *h_elf;
9320 struct ppc_link_hash_entry *h;
9321 struct ppc_link_hash_entry *fdh;
5bd4f169 9322 const char *sym_name;
0d4792f7 9323 unsigned long r_symndx, toc_symndx;
951fd09b 9324 char tls_mask, tls_gd, tls_type;
0d4792f7 9325 char sym_type;
5bd4f169 9326 bfd_vma relocation;
b34976b6
AM
9327 bfd_boolean unresolved_reloc;
9328 bfd_boolean warned;
50bc7936 9329 unsigned long insn, mask;
721956f4
AM
9330 struct ppc_stub_hash_entry *stub_entry;
9331 bfd_vma max_br_offset;
9332 bfd_vma from;
5bd4f169 9333
4ce794b7 9334 r_type = ELF64_R_TYPE (rel->r_info);
5bd4f169 9335 r_symndx = ELF64_R_SYM (rel->r_info);
ee87f2da
AM
9336
9337 /* For old style R_PPC64_TOC relocs with a zero symbol, use the
9338 symbol of the previous ADDR64 reloc. The symbol gives us the
9339 proper TOC base to use. */
9340 if (rel->r_info == ELF64_R_INFO (0, R_PPC64_TOC)
9341 && rel != relocs
9342 && ELF64_R_TYPE (rel[-1].r_info) == R_PPC64_ADDR64
9343 && is_opd)
9344 r_symndx = ELF64_R_SYM (rel[-1].r_info);
9345
4ce794b7
AM
9346 sym = NULL;
9347 sec = NULL;
039b3fef 9348 h_elf = NULL;
4ce794b7 9349 sym_name = NULL;
b34976b6
AM
9350 unresolved_reloc = FALSE;
9351 warned = FALSE;
65f38f15 9352
0b13192e 9353 if (r_symndx < symtab_hdr->sh_info)
5bd4f169
AM
9354 {
9355 /* It's a local symbol. */
4025353c
AM
9356 long *opd_adjust;
9357
5bd4f169
AM
9358 sym = local_syms + r_symndx;
9359 sec = local_sections[r_symndx];
be8dd2ca 9360 sym_name = bfd_elf_sym_name (input_bfd, symtab_hdr, sym);
0d4792f7 9361 sym_type = ELF64_ST_TYPE (sym->st_info);
8517fae7 9362 relocation = _bfd_elf_rela_local_sym (output_bfd, sym, &sec, rel);
4025353c
AM
9363 opd_adjust = get_opd_info (sec);
9364 if (opd_adjust != NULL)
1e2f5b6e 9365 {
3f764659 9366 long adjust = opd_adjust[(sym->st_value + rel->r_addend) / 8];
4025353c
AM
9367 if (adjust == -1)
9368 relocation = 0;
9369 else
9370 relocation += adjust;
1e2f5b6e 9371 }
5bd4f169
AM
9372 }
9373 else
9374 {
b2a8e766
AM
9375 RELOC_FOR_GLOBAL_SYMBOL (info, input_bfd, input_section, rel,
9376 r_symndx, symtab_hdr, sym_hashes,
039b3fef 9377 h_elf, sec, relocation,
b2a8e766 9378 unresolved_reloc, warned);
039b3fef
AM
9379 sym_name = h_elf->root.root.string;
9380 sym_type = h_elf->type;
5bd4f169 9381 }
039b3fef 9382 h = (struct ppc_link_hash_entry *) h_elf;
5bd4f169 9383
951fd09b
AM
9384 /* TLS optimizations. Replace instruction sequences and relocs
9385 based on information we collected in tls_optimize. We edit
9386 RELOCS so that --emit-relocs will output something sensible
9387 for the final instruction stream. */
9388 tls_mask = 0;
9389 tls_gd = 0;
0d4792f7 9390 toc_symndx = 0;
d881513a 9391 if (IS_PPC64_TLS_RELOC (r_type))
411e1bfb
AM
9392 {
9393 if (h != NULL)
039b3fef 9394 tls_mask = h->tls_mask;
411e1bfb
AM
9395 else if (local_got_ents != NULL)
9396 {
e7b938ca
AM
9397 char *lgot_masks;
9398 lgot_masks = (char *) (local_got_ents + symtab_hdr->sh_info);
9399 tls_mask = lgot_masks[r_symndx];
411e1bfb 9400 }
0d4792f7
AM
9401 if (tls_mask == 0 && r_type == R_PPC64_TLS)
9402 {
9403 /* Check for toc tls entries. */
9404 char *toc_tls;
9405
9406 if (!get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
9407 rel, input_bfd))
9408 return FALSE;
9409
9410 if (toc_tls)
9411 tls_mask = *toc_tls;
9412 }
9413 }
9414
9415 /* Check that tls relocs are used with tls syms, and non-tls
9416 relocs are used with non-tls syms. */
9417 if (r_symndx != 0
9418 && r_type != R_PPC64_NONE
9419 && (h == NULL
039b3fef
AM
9420 || h->elf.root.type == bfd_link_hash_defined
9421 || h->elf.root.type == bfd_link_hash_defweak)
0d4792f7
AM
9422 && IS_PPC64_TLS_RELOC (r_type) != (sym_type == STT_TLS))
9423 {
9424 if (r_type == R_PPC64_TLS && tls_mask != 0)
9425 /* R_PPC64_TLS is OK against a symbol in the TOC. */
9426 ;
9427 else
9428 (*_bfd_error_handler)
9429 (sym_type == STT_TLS
d003868e
AM
9430 ? _("%B(%A+0x%lx): %s used with TLS symbol %s")
9431 : _("%B(%A+0x%lx): %s used with non-TLS symbol %s"),
9432 input_bfd,
9433 input_section,
0d4792f7
AM
9434 (long) rel->r_offset,
9435 ppc64_elf_howto_table[r_type]->name,
9436 sym_name);
411e1bfb
AM
9437 }
9438
9439 /* Ensure reloc mapping code below stays sane. */
9440 if (R_PPC64_TOC16_LO_DS != R_PPC64_TOC16_DS + 1
9441 || R_PPC64_TOC16_LO != R_PPC64_TOC16 + 1
9442 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TLSGD16 & 3)
9443 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TLSGD16_LO & 3)
9444 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TLSGD16_HI & 3)
9445 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TLSGD16_HA & 3)
9446 || (R_PPC64_GOT_TLSLD16 & 3) != (R_PPC64_GOT_TPREL16_DS & 3)
9447 || (R_PPC64_GOT_TLSLD16_LO & 3) != (R_PPC64_GOT_TPREL16_LO_DS & 3)
9448 || (R_PPC64_GOT_TLSLD16_HI & 3) != (R_PPC64_GOT_TPREL16_HI & 3)
9449 || (R_PPC64_GOT_TLSLD16_HA & 3) != (R_PPC64_GOT_TPREL16_HA & 3))
9450 abort ();
0d4792f7 9451
411e1bfb
AM
9452 switch (r_type)
9453 {
9454 default:
411e1bfb
AM
9455 break;
9456
9457 case R_PPC64_TOC16:
9458 case R_PPC64_TOC16_LO:
9459 case R_PPC64_TOC16_DS:
9460 case R_PPC64_TOC16_LO_DS:
411e1bfb
AM
9461 {
9462 /* Check for toc tls entries. */
9463 char *toc_tls;
951fd09b 9464 int retval;
411e1bfb 9465
0d4792f7
AM
9466 retval = get_tls_mask (&toc_tls, &toc_symndx, &local_syms,
9467 rel, input_bfd);
951fd09b 9468 if (retval == 0)
411e1bfb
AM
9469 return FALSE;
9470
9471 if (toc_tls)
9472 {
951fd09b 9473 tls_mask = *toc_tls;
411e1bfb
AM
9474 if (r_type == R_PPC64_TOC16_DS
9475 || r_type == R_PPC64_TOC16_LO_DS)
81407a69
AM
9476 {
9477 if (tls_mask != 0
9478 && (tls_mask & (TLS_DTPREL | TLS_TPREL)) == 0)
9479 goto toctprel;
9480 }
411e1bfb 9481 else
951fd09b
AM
9482 {
9483 /* If we found a GD reloc pair, then we might be
9484 doing a GD->IE transition. */
9485 if (retval == 2)
9486 {
9487 tls_gd = TLS_TPRELGD;
9488 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9489 goto tls_get_addr_check;
9490 }
9491 else if (retval == 3)
9492 {
9493 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
9494 goto tls_get_addr_check;
9495 }
9496 }
411e1bfb
AM
9497 }
9498 }
9499 break;
9500
9501 case R_PPC64_GOT_TPREL16_DS:
9502 case R_PPC64_GOT_TPREL16_LO_DS:
951fd09b
AM
9503 if (tls_mask != 0
9504 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 9505 {
81407a69 9506 toctprel:
411e1bfb
AM
9507 insn = bfd_get_32 (output_bfd, contents + rel->r_offset - 2);
9508 insn &= 31 << 21;
9509 insn |= 0x3c0d0000; /* addis 0,13,0 */
9510 bfd_put_32 (output_bfd, insn, contents + rel->r_offset - 2);
9511 r_type = R_PPC64_TPREL16_HA;
0d4792f7
AM
9512 if (toc_symndx != 0)
9513 {
9514 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
9515 /* We changed the symbol. Start over in order to
9516 get h, sym, sec etc. right. */
9517 rel--;
9518 continue;
9519 }
9520 else
9521 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
9522 }
9523 break;
9524
9525 case R_PPC64_TLS:
951fd09b
AM
9526 if (tls_mask != 0
9527 && (tls_mask & TLS_TPREL) == 0)
411e1bfb 9528 {
50bc7936 9529 bfd_vma rtra;
411e1bfb 9530 insn = bfd_get_32 (output_bfd, contents + rel->r_offset);
772119ce 9531 if ((insn & ((0x3f << 26) | (31 << 11)))
411e1bfb
AM
9532 == ((31 << 26) | (13 << 11)))
9533 rtra = insn & ((1 << 26) - (1 << 16));
772119ce 9534 else if ((insn & ((0x3f << 26) | (31 << 16)))
411e1bfb
AM
9535 == ((31 << 26) | (13 << 16)))
9536 rtra = (insn & (31 << 21)) | ((insn & (31 << 11)) << 5);
9537 else
9538 abort ();
9539 if ((insn & ((1 << 11) - (1 << 1))) == 266 << 1)
9540 /* add -> addi. */
9541 insn = 14 << 26;
9542 else if ((insn & (31 << 1)) == 23 << 1
9543 && ((insn & (31 << 6)) < 14 << 6
9544 || ((insn & (31 << 6)) >= 16 << 6
9545 && (insn & (31 << 6)) < 24 << 6)))
9546 /* load and store indexed -> dform. */
9547 insn = (32 | ((insn >> 6) & 31)) << 26;
9548 else if ((insn & (31 << 1)) == 21 << 1
9549 && (insn & (0x1a << 6)) == 0)
9550 /* ldx, ldux, stdx, stdux -> ld, ldu, std, stdu. */
9551 insn = (((58 | ((insn >> 6) & 4)) << 26)
9552 | ((insn >> 6) & 1));
9553 else if ((insn & (31 << 1)) == 21 << 1
9554 && (insn & ((1 << 11) - (1 << 1))) == 341 << 1)
9555 /* lwax -> lwa. */
9556 insn = (58 << 26) | 2;
9557 else
9558 abort ();
9559 insn |= rtra;
9560 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
411e1bfb
AM
9561 /* Was PPC64_TLS which sits on insn boundary, now
9562 PPC64_TPREL16_LO which is at insn+2. */
9563 rel->r_offset += 2;
0d4792f7
AM
9564 r_type = R_PPC64_TPREL16_LO;
9565 if (toc_symndx != 0)
9566 {
9567 rel->r_info = ELF64_R_INFO (toc_symndx, r_type);
9568 /* We changed the symbol. Start over in order to
9569 get h, sym, sec etc. right. */
9570 rel--;
9571 continue;
9572 }
9573 else
9574 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
9575 }
9576 break;
9577
411e1bfb
AM
9578 case R_PPC64_GOT_TLSGD16_HI:
9579 case R_PPC64_GOT_TLSGD16_HA:
951fd09b
AM
9580 tls_gd = TLS_TPRELGD;
9581 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9582 goto tls_gdld_hi;
9583 break;
9584
411e1bfb
AM
9585 case R_PPC64_GOT_TLSLD16_HI:
9586 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 9587 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
411e1bfb 9588 {
951fd09b
AM
9589 tls_gdld_hi:
9590 if ((tls_mask & tls_gd) != 0)
9591 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
9592 + R_PPC64_GOT_TPREL16_DS);
9593 else
411e1bfb 9594 {
951fd09b
AM
9595 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9596 rel->r_offset -= 2;
9597 r_type = R_PPC64_NONE;
411e1bfb 9598 }
951fd09b 9599 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
9600 }
9601 break;
9602
951fd09b
AM
9603 case R_PPC64_GOT_TLSGD16:
9604 case R_PPC64_GOT_TLSGD16_LO:
9605 tls_gd = TLS_TPRELGD;
9606 if (tls_mask != 0 && (tls_mask & TLS_GD) == 0)
9607 goto tls_get_addr_check;
9608 break;
411e1bfb 9609
951fd09b
AM
9610 case R_PPC64_GOT_TLSLD16:
9611 case R_PPC64_GOT_TLSLD16_LO:
9612 if (tls_mask != 0 && (tls_mask & TLS_LD) == 0)
9613 {
9614 tls_get_addr_check:
9615 if (rel + 1 < relend)
411e1bfb 9616 {
951fd09b
AM
9617 enum elf_ppc64_reloc_type r_type2;
9618 unsigned long r_symndx2;
9619 struct elf_link_hash_entry *h2;
9620 bfd_vma insn1, insn2, insn3;
9621 bfd_vma offset;
9622
9623 /* The next instruction should be a call to
9624 __tls_get_addr. Peek at the reloc to be sure. */
4ce794b7 9625 r_type2 = ELF64_R_TYPE (rel[1].r_info);
951fd09b
AM
9626 r_symndx2 = ELF64_R_SYM (rel[1].r_info);
9627 if (r_symndx2 < symtab_hdr->sh_info
9628 || (r_type2 != R_PPC64_REL14
9629 && r_type2 != R_PPC64_REL14_BRTAKEN
9630 && r_type2 != R_PPC64_REL14_BRNTAKEN
9631 && r_type2 != R_PPC64_REL24))
9632 break;
9633
9634 h2 = sym_hashes[r_symndx2 - symtab_hdr->sh_info];
9635 while (h2->root.type == bfd_link_hash_indirect
9636 || h2->root.type == bfd_link_hash_warning)
9637 h2 = (struct elf_link_hash_entry *) h2->root.u.i.link;
8387904d
AM
9638 if (h2 == NULL || (h2 != &htab->tls_get_addr->elf
9639 && h2 != &htab->tls_get_addr_fd->elf))
951fd09b
AM
9640 break;
9641
9642 /* OK, it checks out. Replace the call. */
9643 offset = rel[1].r_offset;
9644 insn1 = bfd_get_32 (output_bfd,
9645 contents + rel->r_offset - 2);
9646 insn3 = bfd_get_32 (output_bfd,
9647 contents + offset + 4);
9648 if ((tls_mask & tls_gd) != 0)
411e1bfb 9649 {
951fd09b
AM
9650 /* IE */
9651 insn1 &= (1 << 26) - (1 << 2);
9652 insn1 |= 58 << 26; /* ld */
9653 insn2 = 0x7c636a14; /* add 3,3,13 */
9654 rel[1].r_info = ELF64_R_INFO (r_symndx2, R_PPC64_NONE);
9655 if ((tls_mask & TLS_EXPLICIT) == 0)
9656 r_type = (((r_type - (R_PPC64_GOT_TLSGD16 & 3)) & 3)
9657 + R_PPC64_GOT_TPREL16_DS);
9658 else
9659 r_type += R_PPC64_TOC16_DS - R_PPC64_TOC16;
9660 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb
AM
9661 }
9662 else
951fd09b
AM
9663 {
9664 /* LE */
9665 insn1 = 0x3c6d0000; /* addis 3,13,0 */
9666 insn2 = 0x38630000; /* addi 3,3,0 */
9667 if (tls_gd == 0)
9668 {
9669 /* Was an LD reloc. */
9670 r_symndx = 0;
e1918d23
AM
9671 rel->r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
9672 rel[1].r_addend = htab->elf.tls_sec->vma + DTP_OFFSET;
951fd09b 9673 }
0d4792f7
AM
9674 else if (toc_symndx != 0)
9675 r_symndx = toc_symndx;
951fd09b
AM
9676 r_type = R_PPC64_TPREL16_HA;
9677 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9678 rel[1].r_info = ELF64_R_INFO (r_symndx,
9679 R_PPC64_TPREL16_LO);
9680 rel[1].r_offset += 2;
9681 }
9682 if (insn3 == NOP
9683 || insn3 == CROR_151515 || insn3 == CROR_313131)
9684 {
9685 insn3 = insn2;
9686 insn2 = NOP;
9687 rel[1].r_offset += 4;
9688 }
9689 bfd_put_32 (output_bfd, insn1, contents + rel->r_offset - 2);
9690 bfd_put_32 (output_bfd, insn2, contents + offset);
9691 bfd_put_32 (output_bfd, insn3, contents + offset + 4);
0d4792f7 9692 if (tls_gd == 0 || toc_symndx != 0)
951fd09b 9693 {
0d4792f7
AM
9694 /* We changed the symbol. Start over in order
9695 to get h, sym, sec etc. right. */
951fd09b
AM
9696 rel--;
9697 continue;
9698 }
411e1bfb 9699 }
411e1bfb 9700 }
411e1bfb
AM
9701 break;
9702
9703 case R_PPC64_DTPMOD64:
951fd09b
AM
9704 if (rel + 1 < relend
9705 && rel[1].r_info == ELF64_R_INFO (r_symndx, R_PPC64_DTPREL64)
9706 && rel[1].r_offset == rel->r_offset + 8)
411e1bfb 9707 {
951fd09b
AM
9708 if ((tls_mask & TLS_GD) == 0)
9709 {
9710 rel[1].r_info = ELF64_R_INFO (r_symndx, R_PPC64_NONE);
9711 if ((tls_mask & TLS_TPRELGD) != 0)
9712 r_type = R_PPC64_TPREL64;
9713 else
9714 {
4ce794b7 9715 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
951fd09b
AM
9716 r_type = R_PPC64_NONE;
9717 }
9718 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9719 }
9720 }
9721 else
9722 {
9723 if ((tls_mask & TLS_LD) == 0)
411e1bfb 9724 {
4ce794b7 9725 bfd_put_64 (output_bfd, 1, contents + rel->r_offset);
411e1bfb 9726 r_type = R_PPC64_NONE;
951fd09b 9727 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
411e1bfb 9728 }
411e1bfb
AM
9729 }
9730 break;
9731
9732 case R_PPC64_TPREL64:
951fd09b 9733 if ((tls_mask & TLS_TPREL) == 0)
411e1bfb
AM
9734 {
9735 r_type = R_PPC64_NONE;
9736 rel->r_info = ELF64_R_INFO (r_symndx, r_type);
9737 }
9738 break;
9739 }
9740
9741 /* Handle other relocations that tweak non-addend part of insn. */
86c76c7b 9742 insn = 0;
b25116a9
AM
9743 max_br_offset = 1 << 25;
9744 addend = rel->r_addend;
65f38f15 9745 switch (r_type)
5bd4f169
AM
9746 {
9747 default:
65f38f15 9748 break;
5bd4f169 9749
65f38f15
AM
9750 /* Branch taken prediction relocations. */
9751 case R_PPC64_ADDR14_BRTAKEN:
9752 case R_PPC64_REL14_BRTAKEN:
cedb70c5
KH
9753 insn = 0x01 << 21; /* 'y' or 't' bit, lowest bit of BO field. */
9754 /* Fall thru. */
65f38f15 9755
86c76c7b 9756 /* Branch not taken prediction relocations. */
65f38f15
AM
9757 case R_PPC64_ADDR14_BRNTAKEN:
9758 case R_PPC64_REL14_BRNTAKEN:
411e1bfb
AM
9759 insn |= bfd_get_32 (output_bfd,
9760 contents + rel->r_offset) & ~(0x01 << 21);
b25116a9 9761 /* Fall thru. */
86c76c7b 9762
b25116a9
AM
9763 case R_PPC64_REL14:
9764 max_br_offset = 1 << 15;
9765 /* Fall thru. */
5bd4f169 9766
65f38f15 9767 case R_PPC64_REL24:
ad8e1ba5
AM
9768 /* Calls to functions with a different TOC, such as calls to
9769 shared objects, need to alter the TOC pointer. This is
9770 done using a linkage stub. A REL24 branching to these
9771 linkage stubs needs to be followed by a nop, as the nop
9772 will be replaced with an instruction to restore the TOC
9773 base pointer. */
b25116a9 9774 stub_entry = NULL;
8387904d 9775 fdh = h;
ad8e1ba5 9776 if (((h != NULL
039b3fef
AM
9777 && (((fdh = h->oh) != NULL
9778 && fdh->elf.plt.plist != NULL)
9779 || (fdh = h)->elf.plt.plist != NULL))
8387904d 9780 || (sec != NULL
ad8e1ba5 9781 && sec->output_section != NULL
b25116a9 9782 && sec->id <= htab->top_id
ad8e1ba5
AM
9783 && (htab->stub_group[sec->id].toc_off
9784 != htab->stub_group[input_section->id].toc_off)))
721956f4 9785 && (stub_entry = ppc_get_stub_entry (input_section, sec, fdh,
ad8e1ba5
AM
9786 rel, htab)) != NULL
9787 && (stub_entry->stub_type == ppc_stub_plt_call
9788 || stub_entry->stub_type == ppc_stub_plt_branch_r2off
9789 || stub_entry->stub_type == ppc_stub_long_branch_r2off))
41bd81ab 9790 {
b25116a9 9791 bfd_boolean can_plt_call = FALSE;
721956f4 9792
eea6121a 9793 if (rel->r_offset + 8 <= input_section->size)
41bd81ab 9794 {
b25116a9
AM
9795 unsigned long nop;
9796 nop = bfd_get_32 (input_bfd, contents + rel->r_offset + 4);
9797 if (nop == NOP
9798 || nop == CROR_151515 || nop == CROR_313131)
41bd81ab 9799 {
4ce794b7 9800 bfd_put_32 (input_bfd, LD_R2_40R1,
411e1bfb 9801 contents + rel->r_offset + 4);
b25116a9 9802 can_plt_call = TRUE;
41bd81ab 9803 }
5bd4f169 9804 }
721956f4
AM
9805
9806 if (!can_plt_call)
9807 {
ad8e1ba5
AM
9808 if (stub_entry->stub_type == ppc_stub_plt_call)
9809 {
9810 /* If this is a plain branch rather than a branch
9811 and link, don't require a nop. */
b25116a9
AM
9812 unsigned long br;
9813 br = bfd_get_32 (input_bfd, contents + rel->r_offset);
9814 if ((br & 1) == 0)
9815 can_plt_call = TRUE;
ad8e1ba5 9816 }
6ab189d5 9817 else if (h != NULL
039b3fef 9818 && strcmp (h->elf.root.root.string,
6ab189d5
AM
9819 ".__libc_start_main") == 0)
9820 {
9821 /* Allow crt1 branch to go via a toc adjusting stub. */
b25116a9 9822 can_plt_call = TRUE;
6ab189d5 9823 }
ad8e1ba5
AM
9824 else
9825 {
9826 if (strcmp (input_section->output_section->name,
9827 ".init") == 0
9828 || strcmp (input_section->output_section->name,
9829 ".fini") == 0)
9830 (*_bfd_error_handler)
d003868e 9831 (_("%B(%A+0x%lx): automatic multiple TOCs "
ad8e1ba5
AM
9832 "not supported using your crt files; "
9833 "recompile with -mminimal-toc or upgrade gcc"),
d003868e
AM
9834 input_bfd,
9835 input_section,
ad8e1ba5
AM
9836 (long) rel->r_offset);
9837 else
9838 (*_bfd_error_handler)
d003868e 9839 (_("%B(%A+0x%lx): sibling call optimization to `%s' "
ad8e1ba5
AM
9840 "does not allow automatic multiple TOCs; "
9841 "recompile with -mminimal-toc or "
9842 "-fno-optimize-sibling-calls, "
9843 "or make `%s' extern"),
d003868e
AM
9844 input_bfd,
9845 input_section,
ad8e1ba5
AM
9846 (long) rel->r_offset,
9847 sym_name,
9848 sym_name);
9849 bfd_set_error (bfd_error_bad_value);
9850 ret = FALSE;
9851 }
721956f4
AM
9852 }
9853
b25116a9
AM
9854 if (can_plt_call
9855 && stub_entry->stub_type == ppc_stub_plt_call)
9856 unresolved_reloc = FALSE;
9857 }
9858
8387904d
AM
9859 if (stub_entry == NULL
9860 && get_opd_info (sec) != NULL)
9861 {
9862 /* The branch destination is the value of the opd entry. */
9863 bfd_vma off = (relocation - sec->output_section->vma
9864 - sec->output_offset + rel->r_addend);
9865 bfd_vma dest = opd_entry_value (sec, off, NULL, NULL);
9866 if (dest != (bfd_vma) -1)
9867 {
9868 relocation = dest;
9869 addend = 0;
9870 }
9871 }
9872
b25116a9
AM
9873 /* If the branch is out of reach we ought to have a long
9874 branch stub. */
9875 from = (rel->r_offset
9876 + input_section->output_offset
9877 + input_section->output_section->vma);
9878
9879 if (stub_entry == NULL
9880 && (relocation + rel->r_addend - from + max_br_offset
9881 >= 2 * max_br_offset)
9882 && r_type != R_PPC64_ADDR14_BRTAKEN
9883 && r_type != R_PPC64_ADDR14_BRNTAKEN)
039b3fef
AM
9884 stub_entry = ppc_get_stub_entry (input_section, sec, h, rel,
9885 htab);
b25116a9
AM
9886
9887 if (stub_entry != NULL)
9888 {
9889 /* Munge up the value and addend so that we call the stub
9890 rather than the procedure directly. */
9891 relocation = (stub_entry->stub_offset
9892 + stub_entry->stub_sec->output_offset
9893 + stub_entry->stub_sec->output_section->vma);
9894 addend = 0;
9895 }
9896
9897 if (insn != 0)
9898 {
9899 if (is_power4)
721956f4 9900 {
b25116a9
AM
9901 /* Set 'a' bit. This is 0b00010 in BO field for branch
9902 on CR(BI) insns (BO == 001at or 011at), and 0b01000
9903 for branch on CTR insns (BO == 1a00t or 1a01t). */
9904 if ((insn & (0x14 << 21)) == (0x04 << 21))
9905 insn |= 0x02 << 21;
9906 else if ((insn & (0x14 << 21)) == (0x10 << 21))
9907 insn |= 0x08 << 21;
9908 else
9909 break;
9910 }
9911 else
9912 {
9913 /* Invert 'y' bit if not the default. */
9914 if ((bfd_signed_vma) (relocation + rel->r_addend - from) < 0)
9915 insn ^= 0x01 << 21;
721956f4 9916 }
b25116a9
AM
9917
9918 bfd_put_32 (output_bfd, insn, contents + rel->r_offset);
5bd4f169 9919 }
e86ce104 9920
06da1e8e
AM
9921 /* NOP out calls to undefined weak functions.
9922 We can thus call a weak function without first
9923 checking whether the function is defined. */
b25116a9 9924 else if (h != NULL
039b3fef 9925 && h->elf.root.type == bfd_link_hash_undefweak
b25116a9
AM
9926 && r_type == R_PPC64_REL24
9927 && relocation == 0
9928 && rel->r_addend == 0)
e86ce104 9929 {
06da1e8e
AM
9930 bfd_put_32 (output_bfd, NOP, contents + rel->r_offset);
9931 continue;
e86ce104 9932 }
65f38f15
AM
9933 break;
9934 }
5bd4f169 9935
65f38f15 9936 /* Set `addend'. */
411e1bfb 9937 tls_type = 0;
65f38f15
AM
9938 switch (r_type)
9939 {
9940 default:
9941 (*_bfd_error_handler)
d003868e
AM
9942 (_("%B: unknown relocation type %d for symbol %s"),
9943 input_bfd, (int) r_type, sym_name);
5bd4f169 9944
65f38f15 9945 bfd_set_error (bfd_error_bad_value);
b34976b6 9946 ret = FALSE;
65f38f15 9947 continue;
5bd4f169 9948
65f38f15 9949 case R_PPC64_NONE:
411e1bfb 9950 case R_PPC64_TLS:
04c9666a
AM
9951 case R_PPC64_GNU_VTINHERIT:
9952 case R_PPC64_GNU_VTENTRY:
65f38f15 9953 continue;
5bd4f169
AM
9954
9955 /* GOT16 relocations. Like an ADDR16 using the symbol's
9956 address in the GOT as relocation value instead of the
411e1bfb 9957 symbol's value itself. Also, create a GOT entry for the
5bd4f169 9958 symbol and put the symbol value there. */
411e1bfb
AM
9959 case R_PPC64_GOT_TLSGD16:
9960 case R_PPC64_GOT_TLSGD16_LO:
9961 case R_PPC64_GOT_TLSGD16_HI:
9962 case R_PPC64_GOT_TLSGD16_HA:
951fd09b 9963 tls_type = TLS_TLS | TLS_GD;
411e1bfb
AM
9964 goto dogot;
9965
9966 case R_PPC64_GOT_TLSLD16:
9967 case R_PPC64_GOT_TLSLD16_LO:
9968 case R_PPC64_GOT_TLSLD16_HI:
9969 case R_PPC64_GOT_TLSLD16_HA:
951fd09b 9970 tls_type = TLS_TLS | TLS_LD;
411e1bfb
AM
9971 goto dogot;
9972
9973 case R_PPC64_GOT_TPREL16_DS:
9974 case R_PPC64_GOT_TPREL16_LO_DS:
9975 case R_PPC64_GOT_TPREL16_HI:
9976 case R_PPC64_GOT_TPREL16_HA:
9977 tls_type = TLS_TLS | TLS_TPREL;
9978 goto dogot;
9979
9980 case R_PPC64_GOT_DTPREL16_DS:
9981 case R_PPC64_GOT_DTPREL16_LO_DS:
9982 case R_PPC64_GOT_DTPREL16_HI:
9983 case R_PPC64_GOT_DTPREL16_HA:
9984 tls_type = TLS_TLS | TLS_DTPREL;
9985 goto dogot;
9986
65f38f15
AM
9987 case R_PPC64_GOT16:
9988 case R_PPC64_GOT16_LO:
9989 case R_PPC64_GOT16_HI:
9990 case R_PPC64_GOT16_HA:
9991 case R_PPC64_GOT16_DS:
9992 case R_PPC64_GOT16_LO_DS:
411e1bfb 9993 dogot:
5bd4f169
AM
9994 {
9995 /* Relocation is to the entry for this symbol in the global
9996 offset table. */
e717da7e 9997 asection *got;
d881513a 9998 bfd_vma *offp;
5bd4f169 9999 bfd_vma off;
d881513a 10000 unsigned long indx = 0;
65f38f15 10001
d881513a
AM
10002 if (tls_type == (TLS_TLS | TLS_LD)
10003 && (h == NULL
f5385ebf 10004 || !h->elf.def_dynamic))
e717da7e 10005 offp = &ppc64_tlsld_got (input_bfd)->offset;
411e1bfb 10006 else
5bd4f169 10007 {
d881513a 10008 struct got_entry *ent;
5bd4f169 10009
d881513a
AM
10010 if (h != NULL)
10011 {
10012 bfd_boolean dyn = htab->elf.dynamic_sections_created;
039b3fef
AM
10013 if (!WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, info->shared,
10014 &h->elf)
d881513a 10015 || (info->shared
039b3fef 10016 && SYMBOL_REFERENCES_LOCAL (info, &h->elf)))
d881513a
AM
10017 /* This is actually a static link, or it is a
10018 -Bsymbolic link and the symbol is defined
10019 locally, or the symbol was forced to be local
10020 because of a version file. */
10021 ;
10022 else
10023 {
039b3fef 10024 indx = h->elf.dynindx;
d881513a
AM
10025 unresolved_reloc = FALSE;
10026 }
039b3fef 10027 ent = h->elf.got.glist;
d881513a 10028 }
411e1bfb 10029 else
5bd4f169 10030 {
d881513a
AM
10031 if (local_got_ents == NULL)
10032 abort ();
10033 ent = local_got_ents[r_symndx];
5bd4f169 10034 }
d881513a
AM
10035
10036 for (; ent != NULL; ent = ent->next)
10037 if (ent->addend == rel->r_addend
e717da7e 10038 && ent->owner == input_bfd
d881513a
AM
10039 && ent->tls_type == tls_type)
10040 break;
10041 if (ent == NULL)
10042 abort ();
10043 offp = &ent->got.offset;
5bd4f169 10044 }
411e1bfb 10045
e717da7e
AM
10046 got = ppc64_elf_tdata (input_bfd)->got;
10047 if (got == NULL)
10048 abort ();
10049
411e1bfb
AM
10050 /* The offset must always be a multiple of 8. We use the
10051 least significant bit to record whether we have already
10052 processed this entry. */
d881513a 10053 off = *offp;
411e1bfb
AM
10054 if ((off & 1) != 0)
10055 off &= ~1;
5bd4f169
AM
10056 else
10057 {
411e1bfb
AM
10058 /* Generate relocs for the dynamic linker, except in
10059 the case of TLSLD where we'll use one entry per
10060 module. */
e717da7e
AM
10061 asection *relgot = ppc64_elf_tdata (input_bfd)->relgot;
10062
d881513a 10063 *offp = off | 1;
4e795f50
AM
10064 if ((info->shared || indx != 0)
10065 && (h == NULL
039b3fef
AM
10066 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10067 || h->elf.root.type != bfd_link_hash_undefweak))
5bd4f169 10068 {
e717da7e
AM
10069 outrel.r_offset = (got->output_section->vma
10070 + got->output_offset
411e1bfb 10071 + off);
81407a69 10072 outrel.r_addend = rel->r_addend;
d881513a 10073 if (tls_type & (TLS_LD | TLS_GD))
5bd4f169 10074 {
411e1bfb 10075 outrel.r_addend = 0;
e515b051 10076 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPMOD64);
d881513a
AM
10077 if (tls_type == (TLS_TLS | TLS_GD))
10078 {
e717da7e
AM
10079 loc = relgot->contents;
10080 loc += (relgot->reloc_count++
d881513a
AM
10081 * sizeof (Elf64_External_Rela));
10082 bfd_elf64_swap_reloca_out (output_bfd,
10083 &outrel, loc);
e515b051 10084 outrel.r_offset += 8;
81407a69 10085 outrel.r_addend = rel->r_addend;
d881513a
AM
10086 outrel.r_info
10087 = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
d881513a 10088 }
411e1bfb 10089 }
951fd09b 10090 else if (tls_type == (TLS_TLS | TLS_DTPREL))
411e1bfb 10091 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_DTPREL64);
951fd09b 10092 else if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb
AM
10093 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_TPREL64);
10094 else if (indx == 0)
81407a69
AM
10095 {
10096 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_RELATIVE);
10097
10098 /* Write the .got section contents for the sake
10099 of prelink. */
e717da7e 10100 loc = got->contents + off;
23fbd6fa
JJ
10101 bfd_put_64 (output_bfd, outrel.r_addend + relocation,
10102 loc);
81407a69 10103 }
411e1bfb
AM
10104 else
10105 outrel.r_info = ELF64_R_INFO (indx, R_PPC64_GLOB_DAT);
81407a69
AM
10106
10107 if (indx == 0 && tls_type != (TLS_TLS | TLS_LD))
e515b051
AM
10108 {
10109 outrel.r_addend += relocation;
10110 if (tls_type & (TLS_GD | TLS_DTPREL | TLS_TPREL))
e1918d23 10111 outrel.r_addend -= htab->elf.tls_sec->vma;
e515b051 10112 }
e717da7e
AM
10113 loc = relgot->contents;
10114 loc += (relgot->reloc_count++
411e1bfb
AM
10115 * sizeof (Elf64_External_Rela));
10116 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
10117 }
10118
ad8e1ba5 10119 /* Init the .got section contents here if we're not
81407a69 10120 emitting a reloc. */
d881513a 10121 else
411e1bfb 10122 {
d881513a 10123 relocation += rel->r_addend;
7b609f53
AM
10124 if (tls_type == (TLS_TLS | TLS_LD))
10125 relocation = 1;
10126 else if (tls_type != 0)
411e1bfb 10127 {
e1918d23 10128 relocation -= htab->elf.tls_sec->vma + DTP_OFFSET;
7b609f53 10129 if (tls_type == (TLS_TLS | TLS_TPREL))
411e1bfb 10130 relocation += DTP_OFFSET - TP_OFFSET;
5bd4f169 10131
7b609f53
AM
10132 if (tls_type == (TLS_TLS | TLS_GD))
10133 {
10134 bfd_put_64 (output_bfd, relocation,
e717da7e 10135 got->contents + off + 8);
7b609f53
AM
10136 relocation = 1;
10137 }
411e1bfb 10138 }
7b609f53 10139
411e1bfb 10140 bfd_put_64 (output_bfd, relocation,
e717da7e 10141 got->contents + off);
5bd4f169
AM
10142 }
10143 }
10144
65f38f15
AM
10145 if (off >= (bfd_vma) -2)
10146 abort ();
10147
e717da7e 10148 relocation = got->output_offset + off;
65f38f15 10149
5bd4f169 10150 /* TOC base (r2) is TOC start plus 0x8000. */
e717da7e 10151 addend = -TOC_BASE_OFF;
5bd4f169 10152 }
65f38f15
AM
10153 break;
10154
10155 case R_PPC64_PLT16_HA:
10156 case R_PPC64_PLT16_HI:
10157 case R_PPC64_PLT16_LO:
10158 case R_PPC64_PLT32:
10159 case R_PPC64_PLT64:
10160 /* Relocation is to the entry for this symbol in the
10161 procedure linkage table. */
10162
10163 /* Resolve a PLT reloc against a local symbol directly,
10164 without using the procedure linkage table. */
10165 if (h == NULL)
10166 break;
10167
411e1bfb
AM
10168 /* It's possible that we didn't make a PLT entry for this
10169 symbol. This happens when statically linking PIC code,
10170 or when using -Bsymbolic. Go find a match if there is a
10171 PLT entry. */
4ce794b7 10172 if (htab->plt != NULL)
65f38f15 10173 {
411e1bfb 10174 struct plt_entry *ent;
039b3fef 10175 for (ent = h->elf.plt.plist; ent != NULL; ent = ent->next)
411e1bfb
AM
10176 if (ent->addend == rel->r_addend
10177 && ent->plt.offset != (bfd_vma) -1)
10178 {
4ce794b7
AM
10179 relocation = (htab->plt->output_section->vma
10180 + htab->plt->output_offset
411e1bfb
AM
10181 + ent->plt.offset);
10182 unresolved_reloc = FALSE;
10183 }
65f38f15 10184 }
65f38f15 10185 break;
5bd4f169 10186
0b13192e
AM
10187 case R_PPC64_TOC:
10188 /* Relocation value is TOC base. */
10189 relocation = TOCstart;
10190 if (r_symndx == 0)
10191 relocation += htab->stub_group[input_section->id].toc_off;
8517fae7
AM
10192 else if (unresolved_reloc)
10193 ;
10194 else if (sec != NULL && sec->id <= htab->top_id)
0b13192e
AM
10195 relocation += htab->stub_group[sec->id].toc_off;
10196 else
10197 unresolved_reloc = TRUE;
10198 goto dodyn2;
10199
5bd4f169
AM
10200 /* TOC16 relocs. We want the offset relative to the TOC base,
10201 which is the address of the start of the TOC plus 0x8000.
10202 The TOC consists of sections .got, .toc, .tocbss, and .plt,
10203 in this order. */
65f38f15
AM
10204 case R_PPC64_TOC16:
10205 case R_PPC64_TOC16_LO:
10206 case R_PPC64_TOC16_HI:
10207 case R_PPC64_TOC16_DS:
10208 case R_PPC64_TOC16_LO_DS:
10209 case R_PPC64_TOC16_HA:
ad8e1ba5 10210 addend -= TOCstart + htab->stub_group[input_section->id].toc_off;
5bd4f169
AM
10211 break;
10212
10213 /* Relocate against the beginning of the section. */
65f38f15
AM
10214 case R_PPC64_SECTOFF:
10215 case R_PPC64_SECTOFF_LO:
10216 case R_PPC64_SECTOFF_HI:
10217 case R_PPC64_SECTOFF_DS:
10218 case R_PPC64_SECTOFF_LO_DS:
10219 case R_PPC64_SECTOFF_HA:
4ce794b7 10220 if (sec != NULL)
65f38f15 10221 addend -= sec->output_section->vma;
5bd4f169
AM
10222 break;
10223
721956f4
AM
10224 case R_PPC64_REL14:
10225 case R_PPC64_REL14_BRNTAKEN:
10226 case R_PPC64_REL14_BRTAKEN:
5d1634d7
AM
10227 case R_PPC64_REL24:
10228 break;
10229
411e1bfb
AM
10230 case R_PPC64_TPREL16:
10231 case R_PPC64_TPREL16_LO:
10232 case R_PPC64_TPREL16_HI:
10233 case R_PPC64_TPREL16_HA:
10234 case R_PPC64_TPREL16_DS:
10235 case R_PPC64_TPREL16_LO_DS:
10236 case R_PPC64_TPREL16_HIGHER:
10237 case R_PPC64_TPREL16_HIGHERA:
10238 case R_PPC64_TPREL16_HIGHEST:
10239 case R_PPC64_TPREL16_HIGHESTA:
e1918d23 10240 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
10241 if (info->shared)
10242 /* The TPREL16 relocs shouldn't really be used in shared
10243 libs as they will result in DT_TEXTREL being set, but
10244 support them anyway. */
10245 goto dodyn;
10246 break;
10247
10248 case R_PPC64_DTPREL16:
10249 case R_PPC64_DTPREL16_LO:
10250 case R_PPC64_DTPREL16_HI:
10251 case R_PPC64_DTPREL16_HA:
10252 case R_PPC64_DTPREL16_DS:
10253 case R_PPC64_DTPREL16_LO_DS:
10254 case R_PPC64_DTPREL16_HIGHER:
10255 case R_PPC64_DTPREL16_HIGHERA:
10256 case R_PPC64_DTPREL16_HIGHEST:
10257 case R_PPC64_DTPREL16_HIGHESTA:
e1918d23 10258 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
10259 break;
10260
e515b051
AM
10261 case R_PPC64_DTPMOD64:
10262 relocation = 1;
10263 addend = 0;
10264 goto dodyn;
10265
411e1bfb 10266 case R_PPC64_TPREL64:
e1918d23 10267 addend -= htab->elf.tls_sec->vma + TP_OFFSET;
411e1bfb
AM
10268 goto dodyn;
10269
10270 case R_PPC64_DTPREL64:
e1918d23 10271 addend -= htab->elf.tls_sec->vma + DTP_OFFSET;
411e1bfb
AM
10272 /* Fall thru */
10273
65f38f15
AM
10274 /* Relocations that may need to be propagated if this is a
10275 dynamic object. */
04c9666a 10276 case R_PPC64_REL30:
65f38f15
AM
10277 case R_PPC64_REL32:
10278 case R_PPC64_REL64:
10279 case R_PPC64_ADDR14:
10280 case R_PPC64_ADDR14_BRNTAKEN:
10281 case R_PPC64_ADDR14_BRTAKEN:
10282 case R_PPC64_ADDR16:
10283 case R_PPC64_ADDR16_DS:
10284 case R_PPC64_ADDR16_HA:
10285 case R_PPC64_ADDR16_HI:
10286 case R_PPC64_ADDR16_HIGHER:
10287 case R_PPC64_ADDR16_HIGHERA:
10288 case R_PPC64_ADDR16_HIGHEST:
10289 case R_PPC64_ADDR16_HIGHESTA:
10290 case R_PPC64_ADDR16_LO:
10291 case R_PPC64_ADDR16_LO_DS:
10292 case R_PPC64_ADDR24:
65f38f15
AM
10293 case R_PPC64_ADDR32:
10294 case R_PPC64_ADDR64:
10295 case R_PPC64_UADDR16:
10296 case R_PPC64_UADDR32:
10297 case R_PPC64_UADDR64:
ec338859
AM
10298 /* r_symndx will be zero only for relocs against symbols
10299 from removed linkonce sections, or sections discarded by
10300 a linker script. */
411e1bfb 10301 dodyn:
5d1634d7
AM
10302 if (r_symndx == 0)
10303 break;
10304 /* Fall thru. */
10305
0b13192e 10306 dodyn2:
5d1634d7 10307 if ((input_section->flags & SEC_ALLOC) == 0)
ec338859
AM
10308 break;
10309
41bd81ab
AM
10310 if (NO_OPD_RELOCS && is_opd)
10311 break;
10312
65f38f15 10313 if ((info->shared
4e795f50 10314 && (h == NULL
039b3fef
AM
10315 || ELF_ST_VISIBILITY (h->elf.other) == STV_DEFAULT
10316 || h->elf.root.type != bfd_link_hash_undefweak)
411e1bfb 10317 && (MUST_BE_DYN_RELOC (r_type)
039b3fef 10318 || !SYMBOL_CALLS_LOCAL (info, &h->elf)))
f4656909
AM
10319 || (ELIMINATE_COPY_RELOCS
10320 && !info->shared
65f38f15 10321 && h != NULL
039b3fef 10322 && h->elf.dynindx != -1
f5385ebf
AM
10323 && !h->elf.non_got_ref
10324 && h->elf.def_dynamic
10325 && !h->elf.def_regular))
65f38f15
AM
10326 {
10327 Elf_Internal_Rela outrel;
b34976b6 10328 bfd_boolean skip, relocate;
65f38f15 10329 asection *sreloc;
947216bf 10330 bfd_byte *loc;
1cf1f670 10331 bfd_vma out_off;
65f38f15
AM
10332
10333 /* When generating a dynamic object, these relocations
10334 are copied into the output file to be resolved at run
10335 time. */
10336
b34976b6
AM
10337 skip = FALSE;
10338 relocate = FALSE;
65f38f15 10339
1cf1f670
AM
10340 out_off = _bfd_elf_section_offset (output_bfd, info,
10341 input_section, rel->r_offset);
10342 if (out_off == (bfd_vma) -1)
b34976b6 10343 skip = TRUE;
1cf1f670 10344 else if (out_off == (bfd_vma) -2)
b34976b6 10345 skip = TRUE, relocate = TRUE;
1cf1f670
AM
10346 out_off += (input_section->output_section->vma
10347 + input_section->output_offset);
10348 outrel.r_offset = out_off;
411e1bfb 10349 outrel.r_addend = rel->r_addend;
65f38f15 10350
1cf1f670
AM
10351 /* Optimize unaligned reloc use. */
10352 if ((r_type == R_PPC64_ADDR64 && (out_off & 7) != 0)
10353 || (r_type == R_PPC64_UADDR64 && (out_off & 7) == 0))
10354 r_type ^= R_PPC64_ADDR64 ^ R_PPC64_UADDR64;
10355 else if ((r_type == R_PPC64_ADDR32 && (out_off & 3) != 0)
10356 || (r_type == R_PPC64_UADDR32 && (out_off & 3) == 0))
10357 r_type ^= R_PPC64_ADDR32 ^ R_PPC64_UADDR32;
10358 else if ((r_type == R_PPC64_ADDR16 && (out_off & 1) != 0)
10359 || (r_type == R_PPC64_UADDR16 && (out_off & 1) == 0))
10360 r_type ^= R_PPC64_ADDR16 ^ R_PPC64_UADDR16;
10361
65f38f15 10362 if (skip)
0bb2d96a 10363 memset (&outrel, 0, sizeof outrel);
039b3fef 10364 else if (!SYMBOL_REFERENCES_LOCAL (info, &h->elf)
0b13192e
AM
10365 && !is_opd
10366 && r_type != R_PPC64_TOC)
039b3fef 10367 outrel.r_info = ELF64_R_INFO (h->elf.dynindx, r_type);
65f38f15
AM
10368 else
10369 {
41bd81ab
AM
10370 /* This symbol is local, or marked to become local,
10371 or this is an opd section reloc which must point
10372 at a local function. */
65f38f15 10373 outrel.r_addend += relocation;
e86ce104 10374 if (r_type == R_PPC64_ADDR64 || r_type == R_PPC64_TOC)
65f38f15 10375 {
3fad3c7c 10376 if (is_opd && h != NULL)
afbe61cf
AM
10377 {
10378 /* Lie about opd entries. This case occurs
10379 when building shared libraries and we
10380 reference a function in another shared
3fad3c7c
AM
10381 lib. The same thing happens for a weak
10382 definition in an application that's
10383 overridden by a strong definition in a
10384 shared lib. (I believe this is a generic
10385 bug in binutils handling of weak syms.)
10386 In these cases we won't use the opd
1e2f5b6e 10387 entry in this lib. */
b34976b6 10388 unresolved_reloc = FALSE;
afbe61cf 10389 }
65f38f15 10390 outrel.r_info = ELF64_R_INFO (0, R_PPC64_RELATIVE);
81407a69
AM
10391
10392 /* We need to relocate .opd contents for ld.so.
10393 Prelink also wants simple and consistent rules
10394 for relocs. This make all RELATIVE relocs have
10395 *r_offset equal to r_addend. */
10396 relocate = TRUE;
65f38f15
AM
10397 }
10398 else
10399 {
10400 long indx = 0;
10401
41bd81ab 10402 if (bfd_is_abs_section (sec))
65f38f15
AM
10403 ;
10404 else if (sec == NULL || sec->owner == NULL)
10405 {
10406 bfd_set_error (bfd_error_bad_value);
b34976b6 10407 return FALSE;
65f38f15
AM
10408 }
10409 else
10410 {
10411 asection *osec;
10412
10413 osec = sec->output_section;
10414 indx = elf_section_data (osec)->dynindx;
10415
10416 /* We are turning this relocation into one
10417 against a section symbol, so subtract out
10418 the output section's address but not the
10419 offset of the input section in the output
10420 section. */
10421 outrel.r_addend -= osec->vma;
10422 }
10423
10424 outrel.r_info = ELF64_R_INFO (indx, r_type);
10425 }
10426 }
10427
10428 sreloc = elf_section_data (input_section)->sreloc;
10429 if (sreloc == NULL)
10430 abort ();
10431
947216bf
AM
10432 loc = sreloc->contents;
10433 loc += sreloc->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15
AM
10434 bfd_elf64_swap_reloca_out (output_bfd, &outrel, loc);
10435
10436 /* If this reloc is against an external symbol, it will
10437 be computed at runtime, so there's no need to do
81407a69
AM
10438 anything now. However, for the sake of prelink ensure
10439 that the section contents are a known value. */
65f38f15 10440 if (! relocate)
81407a69
AM
10441 {
10442 unresolved_reloc = FALSE;
10443 /* The value chosen here is quite arbitrary as ld.so
10444 ignores section contents except for the special
10445 case of .opd where the contents might be accessed
10446 before relocation. Choose zero, as that won't
10447 cause reloc overflow. */
10448 relocation = 0;
10449 addend = 0;
10450 /* Use *r_offset == r_addend for R_PPC64_ADDR64 relocs
10451 to improve backward compatibility with older
10452 versions of ld. */
10453 if (r_type == R_PPC64_ADDR64)
10454 addend = outrel.r_addend;
10455 /* Adjust pc_relative relocs to have zero in *r_offset. */
4ce794b7 10456 else if (ppc64_elf_howto_table[r_type]->pc_relative)
000732f7
AM
10457 addend = (input_section->output_section->vma
10458 + input_section->output_offset
10459 + rel->r_offset);
81407a69 10460 }
65f38f15 10461 }
5bd4f169
AM
10462 break;
10463
65f38f15
AM
10464 case R_PPC64_COPY:
10465 case R_PPC64_GLOB_DAT:
10466 case R_PPC64_JMP_SLOT:
10467 case R_PPC64_RELATIVE:
10468 /* We shouldn't ever see these dynamic relocs in relocatable
10469 files. */
ae9a127f 10470 /* Fall through. */
65f38f15
AM
10471
10472 case R_PPC64_PLTGOT16:
10473 case R_PPC64_PLTGOT16_DS:
10474 case R_PPC64_PLTGOT16_HA:
10475 case R_PPC64_PLTGOT16_HI:
10476 case R_PPC64_PLTGOT16_LO:
10477 case R_PPC64_PLTGOT16_LO_DS:
10478 case R_PPC64_PLTREL32:
10479 case R_PPC64_PLTREL64:
10480 /* These ones haven't been implemented yet. */
10481
10482 (*_bfd_error_handler)
d003868e
AM
10483 (_("%B: relocation %s is not supported for symbol %s."),
10484 input_bfd,
4ce794b7 10485 ppc64_elf_howto_table[r_type]->name, sym_name);
5bd4f169
AM
10486
10487 bfd_set_error (bfd_error_invalid_operation);
b34976b6 10488 ret = FALSE;
5bd4f169 10489 continue;
65f38f15 10490 }
5bd4f169 10491
65f38f15
AM
10492 /* Do any further special processing. */
10493 switch (r_type)
10494 {
10495 default:
10496 break;
10497
10498 case R_PPC64_ADDR16_HA:
10499 case R_PPC64_ADDR16_HIGHERA:
10500 case R_PPC64_ADDR16_HIGHESTA:
86bbe32f
AM
10501 case R_PPC64_GOT16_HA:
10502 case R_PPC64_PLTGOT16_HA:
65f38f15
AM
10503 case R_PPC64_PLT16_HA:
10504 case R_PPC64_TOC16_HA:
10505 case R_PPC64_SECTOFF_HA:
411e1bfb
AM
10506 case R_PPC64_TPREL16_HA:
10507 case R_PPC64_DTPREL16_HA:
10508 case R_PPC64_GOT_TLSGD16_HA:
10509 case R_PPC64_GOT_TLSLD16_HA:
10510 case R_PPC64_GOT_TPREL16_HA:
10511 case R_PPC64_GOT_DTPREL16_HA:
10512 case R_PPC64_TPREL16_HIGHER:
10513 case R_PPC64_TPREL16_HIGHERA:
10514 case R_PPC64_TPREL16_HIGHEST:
10515 case R_PPC64_TPREL16_HIGHESTA:
10516 case R_PPC64_DTPREL16_HIGHER:
10517 case R_PPC64_DTPREL16_HIGHERA:
10518 case R_PPC64_DTPREL16_HIGHEST:
10519 case R_PPC64_DTPREL16_HIGHESTA:
65f38f15
AM
10520 /* It's just possible that this symbol is a weak symbol
10521 that's not actually defined anywhere. In that case,
10522 'sec' would be NULL, and we should leave the symbol
10523 alone (it will be set to zero elsewhere in the link). */
10524 if (sec != NULL)
e515b051
AM
10525 /* Add 0x10000 if sign bit in 0:15 is set.
10526 Bits 0:15 are not used. */
10527 addend += 0x8000;
65f38f15
AM
10528 break;
10529
10530 case R_PPC64_ADDR16_DS:
10531 case R_PPC64_ADDR16_LO_DS:
10532 case R_PPC64_GOT16_DS:
10533 case R_PPC64_GOT16_LO_DS:
10534 case R_PPC64_PLT16_LO_DS:
10535 case R_PPC64_SECTOFF_DS:
10536 case R_PPC64_SECTOFF_LO_DS:
10537 case R_PPC64_TOC16_DS:
10538 case R_PPC64_TOC16_LO_DS:
10539 case R_PPC64_PLTGOT16_DS:
10540 case R_PPC64_PLTGOT16_LO_DS:
411e1bfb
AM
10541 case R_PPC64_GOT_TPREL16_DS:
10542 case R_PPC64_GOT_TPREL16_LO_DS:
10543 case R_PPC64_GOT_DTPREL16_DS:
10544 case R_PPC64_GOT_DTPREL16_LO_DS:
10545 case R_PPC64_TPREL16_DS:
10546 case R_PPC64_TPREL16_LO_DS:
10547 case R_PPC64_DTPREL16_DS:
10548 case R_PPC64_DTPREL16_LO_DS:
adadcc0c
AM
10549 insn = bfd_get_32 (input_bfd, contents + (rel->r_offset & ~3));
10550 mask = 3;
10551 /* If this reloc is against an lq insn, then the value must be
10552 a multiple of 16. This is somewhat of a hack, but the
10553 "correct" way to do this by defining _DQ forms of all the
10554 _DS relocs bloats all reloc switches in this file. It
10555 doesn't seem to make much sense to use any of these relocs
10556 in data, so testing the insn should be safe. */
494dac0c 10557 if ((insn & (0x3f << 26)) == (56u << 26))
adadcc0c
AM
10558 mask = 15;
10559 if (((relocation + addend) & mask) != 0)
65f38f15
AM
10560 {
10561 (*_bfd_error_handler)
d003868e
AM
10562 (_("%B: error: relocation %s not a multiple of %d"),
10563 input_bfd,
4ce794b7 10564 ppc64_elf_howto_table[r_type]->name,
adadcc0c 10565 mask + 1);
65f38f15 10566 bfd_set_error (bfd_error_bad_value);
b34976b6 10567 ret = FALSE;
65f38f15
AM
10568 continue;
10569 }
10570 break;
5bd4f169
AM
10571 }
10572
239e1f3a
AM
10573 /* Dynamic relocs are not propagated for SEC_DEBUGGING sections
10574 because such sections are not SEC_ALLOC and thus ld.so will
10575 not process them. */
65f38f15 10576 if (unresolved_reloc
239e1f3a 10577 && !((input_section->flags & SEC_DEBUGGING) != 0
f5385ebf 10578 && h->elf.def_dynamic))
9c07fe7c
AM
10579 {
10580 (*_bfd_error_handler)
d003868e
AM
10581 (_("%B(%A+0x%lx): unresolvable %s relocation against symbol `%s'"),
10582 input_bfd,
10583 input_section,
9c07fe7c 10584 (long) rel->r_offset,
7b609f53 10585 ppc64_elf_howto_table[(int) r_type]->name,
039b3fef 10586 h->elf.root.root.string);
b34976b6 10587 ret = FALSE;
9c07fe7c 10588 }
5bd4f169 10589
65f38f15 10590 r = _bfd_final_link_relocate (ppc64_elf_howto_table[(int) r_type],
5bd4f169
AM
10591 input_bfd,
10592 input_section,
10593 contents,
411e1bfb 10594 rel->r_offset,
5bd4f169
AM
10595 relocation,
10596 addend);
10597
ef60b7ff 10598 if (r != bfd_reloc_ok)
5bd4f169 10599 {
cd27b276
AM
10600 if (sym_name == NULL)
10601 sym_name = "(null)";
10602 if (r == bfd_reloc_overflow)
5bd4f169 10603 {
cd27b276
AM
10604 if (warned)
10605 continue;
10606 if (h != NULL
039b3fef 10607 && h->elf.root.type == bfd_link_hash_undefweak
4ce794b7 10608 && ppc64_elf_howto_table[r_type]->pc_relative)
5bd4f169
AM
10609 {
10610 /* Assume this is a call protected by other code that
10611 detects the symbol is undefined. If this is the case,
10612 we can safely ignore the overflow. If not, the
10613 program is hosed anyway, and a little warning isn't
10614 going to help. */
10615
10616 continue;
10617 }
10618
ef60b7ff 10619 if (!((*info->callbacks->reloc_overflow)
dfeffb9f
L
10620 (info, (h ? &h->elf.root : NULL), sym_name,
10621 ppc64_elf_howto_table[r_type]->name,
411e1bfb 10622 rel->r_addend, input_bfd, input_section, rel->r_offset)))
b34976b6 10623 return FALSE;
ef60b7ff
AM
10624 }
10625 else
10626 {
10627 (*_bfd_error_handler)
d003868e
AM
10628 (_("%B(%A+0x%lx): %s reloc against `%s': error %d"),
10629 input_bfd,
10630 input_section,
7b609f53 10631 (long) rel->r_offset,
4ce794b7 10632 ppc64_elf_howto_table[r_type]->name,
7b609f53
AM
10633 sym_name,
10634 (int) r);
b34976b6 10635 ret = FALSE;
ef60b7ff 10636 }
5bd4f169 10637 }
5bd4f169
AM
10638 }
10639
645ea6a9
AM
10640 /* If we're emitting relocations, then shortly after this function
10641 returns, reloc offsets and addends for this section will be
10642 adjusted. Worse, reloc symbol indices will be for the output
8860955f
AM
10643 file rather than the input. Save a copy of the relocs for
10644 opd_entry_value. */
10645 if (is_opd && info->emitrelocations)
10646 {
10647 bfd_size_type amt;
10648 amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
10649 rel = bfd_alloc (input_bfd, amt);
10650 BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
10651 ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
10652 if (rel == NULL)
10653 return FALSE;
10654 memcpy (rel, relocs, amt);
10655 }
5bd4f169
AM
10656 return ret;
10657}
10658
754021d0
AM
10659/* Adjust the value of any local symbols in opd sections. */
10660
10661static bfd_boolean
10662ppc64_elf_output_symbol_hook (struct bfd_link_info *info,
10663 const char *name ATTRIBUTE_UNUSED,
10664 Elf_Internal_Sym *elfsym,
10665 asection *input_sec,
10666 struct elf_link_hash_entry *h)
10667{
4025353c 10668 long *opd_adjust, adjust;
754021d0
AM
10669 bfd_vma value;
10670
4025353c
AM
10671 if (h != NULL)
10672 return TRUE;
10673
10674 opd_adjust = get_opd_info (input_sec);
10675 if (opd_adjust == NULL)
754021d0
AM
10676 return TRUE;
10677
10678 value = elfsym->st_value - input_sec->output_offset;
10679 if (!info->relocatable)
10680 value -= input_sec->output_section->vma;
10681
3f764659 10682 adjust = opd_adjust[value / 8];
4025353c
AM
10683 if (adjust == -1)
10684 elfsym->st_value = 0;
10685 else
10686 elfsym->st_value += adjust;
754021d0
AM
10687 return TRUE;
10688}
10689
5bd4f169
AM
10690/* Finish up dynamic symbol handling. We set the contents of various
10691 dynamic sections here. */
10692
b34976b6 10693static bfd_boolean
4ce794b7
AM
10694ppc64_elf_finish_dynamic_symbol (bfd *output_bfd,
10695 struct bfd_link_info *info,
10696 struct elf_link_hash_entry *h,
10697 Elf_Internal_Sym *sym)
5bd4f169 10698{
65f38f15 10699 struct ppc_link_hash_table *htab;
5bd4f169 10700 bfd *dynobj;
8387904d
AM
10701 struct plt_entry *ent;
10702 Elf_Internal_Rela rela;
10703 bfd_byte *loc;
5bd4f169 10704
65f38f15
AM
10705 htab = ppc_hash_table (info);
10706 dynobj = htab->elf.dynobj;
5bd4f169 10707
8387904d
AM
10708 for (ent = h->plt.plist; ent != NULL; ent = ent->next)
10709 if (ent->plt.offset != (bfd_vma) -1)
10710 {
10711 /* This symbol has an entry in the procedure linkage
10712 table. Set it up. */
10713
10714 if (htab->plt == NULL
10715 || htab->relplt == NULL
10716 || htab->glink == NULL)
10717 abort ();
10718
10719 /* Create a JMP_SLOT reloc to inform the dynamic linker to
10720 fill in the PLT entry. */
10721 rela.r_offset = (htab->plt->output_section->vma
10722 + htab->plt->output_offset
10723 + ent->plt.offset);
10724 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_JMP_SLOT);
10725 rela.r_addend = ent->addend;
10726
10727 loc = htab->relplt->contents;
10728 loc += ((ent->plt.offset - PLT_INITIAL_ENTRY_SIZE) / PLT_ENTRY_SIZE
10729 * sizeof (Elf64_External_Rela));
10730 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
10731 }
5bd4f169 10732
f5385ebf 10733 if (h->needs_copy)
5bd4f169 10734 {
5bd4f169 10735 Elf_Internal_Rela rela;
947216bf 10736 bfd_byte *loc;
5bd4f169 10737
65f38f15 10738 /* This symbol needs a copy reloc. Set it up. */
5bd4f169 10739
65f38f15
AM
10740 if (h->dynindx == -1
10741 || (h->root.type != bfd_link_hash_defined
10742 && h->root.type != bfd_link_hash_defweak)
4ce794b7 10743 || htab->relbss == NULL)
65f38f15 10744 abort ();
5bd4f169
AM
10745
10746 rela.r_offset = (h->root.u.def.value
10747 + h->root.u.def.section->output_section->vma
10748 + h->root.u.def.section->output_offset);
10749 rela.r_info = ELF64_R_INFO (h->dynindx, R_PPC64_COPY);
10750 rela.r_addend = 0;
4ce794b7
AM
10751 loc = htab->relbss->contents;
10752 loc += htab->relbss->reloc_count++ * sizeof (Elf64_External_Rela);
65f38f15 10753 bfd_elf64_swap_reloca_out (output_bfd, &rela, loc);
5bd4f169
AM
10754 }
10755
5bd4f169
AM
10756 /* Mark some specially defined symbols as absolute. */
10757 if (strcmp (h->root.root.string, "_DYNAMIC") == 0)
10758 sym->st_shndx = SHN_ABS;
10759
b34976b6 10760 return TRUE;
5bd4f169
AM
10761}
10762
65f38f15
AM
10763/* Used to decide how to sort relocs in an optimal manner for the
10764 dynamic linker, before writing them out. */
10765
10766static enum elf_reloc_type_class
4ce794b7 10767ppc64_elf_reloc_type_class (const Elf_Internal_Rela *rela)
65f38f15 10768{
04c9666a 10769 enum elf_ppc64_reloc_type r_type;
a33d1f77 10770
4ce794b7 10771 r_type = ELF64_R_TYPE (rela->r_info);
a33d1f77 10772 switch (r_type)
65f38f15
AM
10773 {
10774 case R_PPC64_RELATIVE:
10775 return reloc_class_relative;
10776 case R_PPC64_JMP_SLOT:
10777 return reloc_class_plt;
10778 case R_PPC64_COPY:
10779 return reloc_class_copy;
10780 default:
10781 return reloc_class_normal;
10782 }
10783}
10784
5bd4f169
AM
10785/* Finish up the dynamic sections. */
10786
b34976b6 10787static bfd_boolean
4ce794b7
AM
10788ppc64_elf_finish_dynamic_sections (bfd *output_bfd,
10789 struct bfd_link_info *info)
5bd4f169 10790{
65f38f15
AM
10791 struct ppc_link_hash_table *htab;
10792 bfd *dynobj;
5bd4f169 10793 asection *sdyn;
5bd4f169 10794
65f38f15
AM
10795 htab = ppc_hash_table (info);
10796 dynobj = htab->elf.dynobj;
5bd4f169
AM
10797 sdyn = bfd_get_section_by_name (dynobj, ".dynamic");
10798
65f38f15 10799 if (htab->elf.dynamic_sections_created)
5bd4f169 10800 {
5bd4f169
AM
10801 Elf64_External_Dyn *dyncon, *dynconend;
10802
4ce794b7 10803 if (sdyn == NULL || htab->got == NULL)
65f38f15 10804 abort ();
5bd4f169
AM
10805
10806 dyncon = (Elf64_External_Dyn *) sdyn->contents;
eea6121a 10807 dynconend = (Elf64_External_Dyn *) (sdyn->contents + sdyn->size);
5bd4f169
AM
10808 for (; dyncon < dynconend; dyncon++)
10809 {
10810 Elf_Internal_Dyn dyn;
19397422 10811 asection *s;
5bd4f169
AM
10812
10813 bfd_elf64_swap_dyn_in (dynobj, dyncon, &dyn);
10814
10815 switch (dyn.d_tag)
10816 {
65f38f15
AM
10817 default:
10818 continue;
5bd4f169 10819
5d1634d7 10820 case DT_PPC64_GLINK:
4ce794b7 10821 s = htab->glink;
6348e046 10822 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
ad8e1ba5
AM
10823 /* We stupidly defined DT_PPC64_GLINK to be the start
10824 of glink rather than the first entry point, which is
10825 what ld.so needs, and now have a bigger stub to
10826 support automatic multiple TOCs. */
10827 dyn.d_un.d_ptr += GLINK_CALL_STUB_SIZE - 32;
5d1634d7
AM
10828 break;
10829
19397422
AM
10830 case DT_PPC64_OPD:
10831 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
10832 if (s == NULL)
10833 continue;
10834 dyn.d_un.d_ptr = s->vma;
19397422
AM
10835 break;
10836
10837 case DT_PPC64_OPDSZ:
10838 s = bfd_get_section_by_name (output_bfd, ".opd");
6348e046
AM
10839 if (s == NULL)
10840 continue;
eea6121a 10841 dyn.d_un.d_val = s->size;
19397422
AM
10842 break;
10843
65f38f15 10844 case DT_PLTGOT:
4ce794b7 10845 s = htab->plt;
6348e046 10846 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15
AM
10847 break;
10848
10849 case DT_JMPREL:
4ce794b7 10850 s = htab->relplt;
6348e046 10851 dyn.d_un.d_ptr = s->output_section->vma + s->output_offset;
65f38f15 10852 break;
5bd4f169 10853
65f38f15 10854 case DT_PLTRELSZ:
eea6121a 10855 dyn.d_un.d_val = htab->relplt->size;
5d1634d7
AM
10856 break;
10857
10858 case DT_RELASZ:
10859 /* Don't count procedure linkage table relocs in the
10860 overall reloc count. */
4ce794b7 10861 s = htab->relplt;
6348e046
AM
10862 if (s == NULL)
10863 continue;
eea6121a 10864 dyn.d_un.d_val -= s->size;
6348e046
AM
10865 break;
10866
10867 case DT_RELA:
10868 /* We may not be using the standard ELF linker script.
10869 If .rela.plt is the first .rela section, we adjust
10870 DT_RELA to not include it. */
4ce794b7 10871 s = htab->relplt;
6348e046
AM
10872 if (s == NULL)
10873 continue;
10874 if (dyn.d_un.d_ptr != s->output_section->vma + s->output_offset)
10875 continue;
eea6121a 10876 dyn.d_un.d_ptr += s->size;
65f38f15 10877 break;
5bd4f169 10878 }
5bd4f169 10879
65f38f15 10880 bfd_elf64_swap_dyn_out (output_bfd, &dyn, dyncon);
5bd4f169 10881 }
5bd4f169
AM
10882 }
10883
eea6121a 10884 if (htab->got != NULL && htab->got->size != 0)
5d1634d7
AM
10885 {
10886 /* Fill in the first entry in the global offset table.
10887 We use it to hold the link-time TOCbase. */
10888 bfd_put_64 (output_bfd,
60ee0d4a 10889 elf_gp (output_bfd) + TOC_BASE_OFF,
4ce794b7 10890 htab->got->contents);
5d1634d7
AM
10891
10892 /* Set .got entry size. */
4ce794b7 10893 elf_section_data (htab->got->output_section)->this_hdr.sh_entsize = 8;
5d1634d7
AM
10894 }
10895
eea6121a 10896 if (htab->plt != NULL && htab->plt->size != 0)
5d1634d7
AM
10897 {
10898 /* Set .plt entry size. */
4ce794b7 10899 elf_section_data (htab->plt->output_section)->this_hdr.sh_entsize
5d1634d7
AM
10900 = PLT_ENTRY_SIZE;
10901 }
10902
e717da7e 10903 /* We need to handle writing out multiple GOT sections ourselves,
7b53ace3
AM
10904 since we didn't add them to DYNOBJ. We know dynobj is the first
10905 bfd. */
e717da7e
AM
10906 while ((dynobj = dynobj->link_next) != NULL)
10907 {
10908 asection *s;
7b53ace3 10909
ee75fd95 10910 if (!is_ppc64_elf_target (dynobj->xvec))
7b53ace3
AM
10911 continue;
10912
e717da7e
AM
10913 s = ppc64_elf_tdata (dynobj)->got;
10914 if (s != NULL
eea6121a 10915 && s->size != 0
e717da7e
AM
10916 && s->output_section != bfd_abs_section_ptr
10917 && !bfd_set_section_contents (output_bfd, s->output_section,
10918 s->contents, s->output_offset,
eea6121a 10919 s->size))
e717da7e
AM
10920 return FALSE;
10921 s = ppc64_elf_tdata (dynobj)->relgot;
10922 if (s != NULL
eea6121a 10923 && s->size != 0
e717da7e
AM
10924 && s->output_section != bfd_abs_section_ptr
10925 && !bfd_set_section_contents (output_bfd, s->output_section,
10926 s->contents, s->output_offset,
eea6121a 10927 s->size))
e717da7e
AM
10928 return FALSE;
10929 }
f6c52c13 10930
b34976b6 10931 return TRUE;
5bd4f169
AM
10932}
10933
5bd4f169 10934#include "elf64-target.h"
This page took 1.465539 seconds and 4 git commands to generate.